pure-index
Advanced tools
Comparing version 0.0.39 to 0.0.40
@@ -7,6 +7,6 @@ #!/usr/bin/env node | ||
import { | ||
createStatusAPI, | ||
printSet, | ||
printError, | ||
createSpinner | ||
createSpinner, | ||
readJSON | ||
} from '../src/utils/index.js' | ||
@@ -33,2 +33,27 @@ | ||
await baseFlow({ config }) | ||
const { name } = await readJSON('package.json') | ||
const pkg = { name, path: config.entry } | ||
const spinner = createSpinner(`Checking exports from the ${pkg.name} package`) | ||
const result = await baseFlow({ pkg, config, onEmpty: spinner.success }) | ||
if (!result.success) { | ||
spinner.error() | ||
switch (result.error.reason) { | ||
case 'no_exports': | ||
printError(`Nothing is exported from ${pkg.name}. Remove it.`) | ||
break | ||
case 'no_imports': | ||
printError(`Nothing is imported from ${pkg.name}. Remove it.`) | ||
break | ||
case 'unused_exports': | ||
printError(`Unused exports in ${pkg.name} package found`) | ||
printSet(result.error.exports) | ||
} | ||
process.exit(1) | ||
} | ||
spinner.success() | ||
process.exit(0) |
{ | ||
"name": "pure-index", | ||
"type": "module", | ||
"version": "0.0.39", | ||
"version": "0.0.40", | ||
"description": "Utility for monorepos. It helps to find unused exports from packages or get a list of all unique uses of any package", | ||
@@ -6,0 +6,0 @@ "main": "./src/index.js", |
@@ -1,6 +0,4 @@ | ||
import { join } from 'node:path' | ||
import { getExports } from './getExports.js' | ||
import { fileTraversal } from './fileTraversal/index.js' | ||
import { createStatusAPI, readJSON } from './utils/index.js' | ||
import { Result } from './utils/index.js' | ||
@@ -16,35 +14,29 @@ /** | ||
* dir: string | ||
* }, | ||
* } | ||
* pkg: { | ||
* path: string | ||
* } | ||
* }} | ||
* | ||
* @returns {Promise<void>} | ||
*/ | ||
const baseFlow = async ({ config }) => { | ||
const { name } = await readJSON('package.json') | ||
const pkg = { name, path: config.entry } | ||
const statusApi = createStatusAPI({ | ||
title: `Checking exports from the ${pkg.name} package` | ||
}) | ||
const baseFlow = async ({ pkg, config, onEmpty }) => { | ||
const exports = await getExports({ config, pkg }) | ||
const originalExportsSize = exports.size | ||
exports.onEmpty(statusApi.succeed) | ||
if (originalExportsSize === 0) { | ||
statusApi.failed({ | ||
msg: `Nothing is exported from ${pkg.name}. Remove it.` | ||
return new Promise(async resolve => { | ||
// immediate termination | ||
exports.onEmpty(() => { | ||
resolve(Result.Ok({ exports })) | ||
}) | ||
} | ||
await fileTraversal({ config, pkg, cmd: exports.delete.bind(exports) }) | ||
if (originalExportsSize === 0) { | ||
resolve(Result.Err({ reason: 'no_exports' })) | ||
} | ||
if (exports.size === originalExportsSize) { | ||
statusApi.failed({ | ||
msg: `Nothing is imported from ${pkg.name}. Remove it.` | ||
}) | ||
} | ||
await fileTraversal({ config, pkg, cmd: exports.delete.bind(exports) }) | ||
statusApi.failed({ | ||
msg: `Unused exports in ${pkg.name} package found`, | ||
set: exports | ||
if (exports.size === originalExportsSize) { | ||
resolve(Result.Err({ reason: 'no_imports' })) | ||
} | ||
resolve(Result.Err({ exports, reason: 'unused_exports' })) | ||
}) | ||
@@ -51,0 +43,0 @@ } |
@@ -82,2 +82,2 @@ import { join } from 'node:path' | ||
export { getConfig } | ||
export { getConfig, BASE_CONFIG } |
import { baseFlow } from './baseFlow.js' | ||
import { collectUsages } from './collectUsages.js' | ||
import { collectUsages as _collectUsages } from './collectUsages.js' | ||
import { BASE_CONFIG } from './getConfig.js' | ||
@@ -39,7 +40,27 @@ /** | ||
const findUsages = ({ config, list }) => { | ||
// name and list[0].dir are required | ||
/** | ||
* @param {string} name | ||
* | ||
* @param {{ | ||
* babelPlugins: Array<string>, | ||
* batch: number, | ||
* exclude: Set<string>, | ||
* extensions: Array<string>, | ||
* dir: string | ||
* }[]} list | ||
*/ | ||
const collectUsages = async (name, list) => { | ||
const tasks = list.map(x => | ||
collectUsages({ | ||
...config, | ||
...x | ||
_collectUsages({ | ||
config: { | ||
babelPlugins: x.babelPlugins || BASE_CONFIG.babelPlugins, | ||
batch: x.batch || BASE_CONFIG.batch, | ||
exclude: x.exclude | ||
? new Set([...BASE_CONFIG.exclude, ...x.exclude]) | ||
: BASE_CONFIG.exclude, | ||
extensions: x.extensions || BASE_CONFIG.extensions, | ||
dir: x.dir || BASE_CONFIG.dir, | ||
collectUsages: name | ||
} | ||
}) | ||
@@ -50,5 +71,13 @@ ) | ||
console.log(result) | ||
const mergedUsages = result.reduce((acc, x) => { | ||
if (x.success) { | ||
acc = acc.concat([...x.value.usages]) | ||
} | ||
return acc | ||
}, []) | ||
return new Set(mergedUsages) | ||
} | ||
export { find } | ||
export { find, collectUsages } |
import fs from 'node:fs/promises' | ||
import { createSpinner } from 'nanospinner' | ||
import pc from 'picocolors' | ||
@@ -18,32 +17,3 @@ | ||
const createStatusAPI = ({ title }) => { | ||
const spinner = createSpinner(title) | ||
const succeed = (params = {}) => { | ||
const { set } = params | ||
spinner.success() | ||
if (set) { | ||
printSet(set) | ||
} | ||
process.exit(0) | ||
} | ||
const failed = ({ msg, set }) => { | ||
spinner.error() | ||
printError(msg) | ||
if (set) { | ||
printSet(set) | ||
} | ||
process.exit(1) | ||
} | ||
return { succeed, failed } | ||
} | ||
export { readFile, readJSON, createStatusAPI, printSet, printError } | ||
export { readFile, readJSON, printSet, printError } | ||
export { getRepoRoot } from './getRepoRoot.js' | ||
@@ -50,0 +20,0 @@ export { ObservableSet } from './observableSet.js' |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
34150
45
794