pure-index
Advanced tools
Comparing version 1.0.4 to 1.0.5-next.0
@@ -1,2 +0,101 @@ | ||
export { collectUsages } from './collectUsages.js'; | ||
export { findUnusedExports } from './findUnusedExports.js'; | ||
import { ParserConfig } from '@swc/core'; | ||
type Config = { | ||
batch: number; | ||
collectUsages: string | null; | ||
entry: string; | ||
dir: string; | ||
exclude: string[]; | ||
extensions: string[]; | ||
parserConfig: ParserConfig; | ||
}; | ||
type ListItem$1 = { | ||
dir: Config['dir']; | ||
batch?: Config['batch']; | ||
exclude?: string[]; | ||
extensions?: Config['extensions']; | ||
parserConfig?: Config['parserConfig']; | ||
}; | ||
declare const collectUsages: (name: string, list: ListItem$1[]) => Promise<{ | ||
readonly ok: false; | ||
readonly err: { | ||
usages: Set<void>; | ||
}; | ||
} | { | ||
readonly ok: true; | ||
readonly val: { | ||
usages: Set<string>; | ||
}; | ||
}>; | ||
declare class ObservableSet extends Set<string> { | ||
private emptyCallback; | ||
constructor(iterable?: Iterable<string>); | ||
add(value: string): this; | ||
delete(value: string): boolean; | ||
clear(): void; | ||
onEmpty(callback: () => void): void; | ||
private checkSize; | ||
} | ||
declare const Ok: <T>(val: T) => { | ||
readonly ok: true; | ||
readonly val: T; | ||
}; | ||
declare const Err: <E>(err: E) => { | ||
readonly ok: false; | ||
readonly err: E; | ||
}; | ||
type Result<T, E> = ReturnType<typeof Ok<T>> | ReturnType<typeof Err<E>>; | ||
type Pkg = { | ||
name: string; | ||
path: string; | ||
}; | ||
type FindUnusedExports = (_: { | ||
pkg: Pkg; | ||
config: Pick<Config, 'dir' | 'batch' | 'exclude' | 'extensions' | 'parserConfig'>; | ||
}) => Promise<Result<{ | ||
exports: ObservableSet; | ||
}, { | ||
reason: 'no_exports'; | ||
exports: ObservableSet; | ||
} | { | ||
reason: 'no_imports'; | ||
exports: ObservableSet; | ||
} | { | ||
reason: 'unused_exports'; | ||
exports: ObservableSet; | ||
}>>; | ||
declare const findUnusedExports$1: FindUnusedExports; | ||
type TaskResult = Awaited<ReturnType<typeof findUnusedExports$1>>; | ||
type FailedTaks = Extract<TaskResult, { | ||
ok: false; | ||
}>; | ||
type ExtractError<T> = { | ||
ok: false; | ||
err: Extract<Omit<FailedTaks, 'ok'>['err'], { | ||
reason: T; | ||
}>; | ||
}; | ||
type Params = { | ||
entry: string; | ||
location?: string; | ||
}; | ||
type ListItem = { | ||
dir: Config['dir']; | ||
batch?: Config['batch']; | ||
exclude?: Config['exclude']; | ||
extensions?: Config['extensions']; | ||
parserConfig?: Config['parserConfig']; | ||
}; | ||
declare const findUnusedExports: ({ entry, location }: Params, list: ListItem[]) => Promise<{ | ||
readonly ok: true; | ||
readonly val: { | ||
exports: Set<void>; | ||
}; | ||
} | ExtractError<"unused_exports"> | ExtractError<"no_exports"> | ExtractError<"no_imports">>; | ||
export { collectUsages, findUnusedExports }; |
@@ -1,3 +0,76 @@ | ||
/* v8 ignore start */ | ||
export { collectUsages } from './collectUsages.js'; | ||
export { findUnusedExports } from './findUnusedExports.js'; | ||
import { | ||
Err, | ||
ObservableSet, | ||
Ok, | ||
collectUsages, | ||
findUnusedExports, | ||
mergeConfig, | ||
readJSON | ||
} from "../chunk-USJVCAV7.js"; | ||
// src/api/collectUsages.ts | ||
var collectUsages2 = async (name, list) => { | ||
const tasks = list.map( | ||
(x) => collectUsages({ | ||
// @ts-expect-error 123 | ||
config: mergeConfig({ | ||
...x, | ||
collectUsages: name | ||
}) | ||
}) | ||
); | ||
const result = await Promise.all(tasks); | ||
const mergedUsages = result.reduce((acc, x) => { | ||
if (x.ok) { | ||
acc = acc.concat([...x.val.usages]); | ||
} | ||
return acc; | ||
}, []); | ||
return mergedUsages.length === 0 ? Err({ usages: /* @__PURE__ */ new Set() }) : Ok({ usages: new Set(mergedUsages) }); | ||
}; | ||
// src/api/findUnusedExports.ts | ||
import { join } from "node:path"; | ||
var SUCCESS = Ok({ exports: /* @__PURE__ */ new Set() }); | ||
var mergeUnusedExports = (list) => { | ||
const sets = list.reduce( | ||
(acc, res) => { | ||
if (!res.ok) { | ||
acc.push(res.err.exports); | ||
} | ||
return acc; | ||
}, | ||
[] | ||
); | ||
const smallestSet = sets.reduce((acc, set) => set.size < acc.size ? set : acc, sets[0]); | ||
const unused = [...smallestSet].filter((exp) => sets.every((set) => set.has(exp))); | ||
return unused.length === 0 ? SUCCESS : Err({ reason: "unused_exports", exports: new ObservableSet(unused) }); | ||
}; | ||
var findUnusedExports2 = async ({ entry, location = "" }, list) => { | ||
const { name } = await readJSON(join(location, "package.json")); | ||
const pkg = { name, path: join(location, entry) }; | ||
const tasks = list.map( | ||
(x) => findUnusedExports({ | ||
pkg, | ||
config: mergeConfig(x) | ||
}) | ||
); | ||
const result = await Promise.all(tasks); | ||
if (result.some((x) => x.ok)) { | ||
return SUCCESS; | ||
} | ||
const [head] = result; | ||
const noExports = !head.ok && head.err.reason === "no_exports"; | ||
if (noExports) { | ||
return head; | ||
} | ||
const noImports = result.every((x) => !x.ok && x.err.reason === "no_imports"); | ||
if (noImports) { | ||
return head; | ||
} | ||
return mergeUnusedExports(result); | ||
}; | ||
export { | ||
collectUsages2 as collectUsages, | ||
findUnusedExports2 as findUnusedExports | ||
}; |
#!/usr/bin/env node | ||
export {}; |
#!/usr/bin/env node | ||
import { getConfig } from '../getConfig/index.js'; | ||
import { collectUsages } from './collectUsages.js'; | ||
import { findUnusedExports } from './findUnusedExports.js'; | ||
const config = await getConfig(); | ||
import { | ||
collectUsages, | ||
createSpinner, | ||
findUnusedExports, | ||
getConfig, | ||
printError, | ||
printSet, | ||
readJSON | ||
} from "../chunk-USJVCAV7.js"; | ||
// src/bin/collectUsages.ts | ||
var collectUsages2 = async ({ config: config2 }) => { | ||
const pkgName = config2.collectUsages; | ||
const spinner = createSpinner(`Collecting usages of ${pkgName}`); | ||
const result = await collectUsages({ config: config2 }); | ||
if (result.ok) { | ||
spinner.success(); | ||
printSet(result.val.usages); | ||
process.exit(0); | ||
} | ||
spinner.error(); | ||
printError({ | ||
text: `Nothing is used from ${pkgName}. Remove it.` | ||
}); | ||
process.exit(1); | ||
}; | ||
// src/bin/findUnusedExports.ts | ||
var findUnusedExports2 = async ({ config: config2 }) => { | ||
const { name } = await readJSON("package.json"); | ||
const pkg = { name, path: config2.entry }; | ||
const spinner = createSpinner(`Checking exports from the ${pkg.name} package`); | ||
const result = await findUnusedExports({ pkg, config: config2 }); | ||
if (result.ok) { | ||
spinner.success(); | ||
process.exit(0); | ||
} | ||
spinner.error(); | ||
switch (result.err.reason) { | ||
case "no_exports": | ||
printError({ | ||
text: `Nothing is exported from ${pkg.name}. Remove it.` | ||
}); | ||
break; | ||
case "no_imports": | ||
printError({ | ||
text: `Nothing is imported from ${pkg.name}. Remove it.` | ||
}); | ||
break; | ||
case "unused_exports": | ||
printError({ | ||
text: `Unused exports in ${pkg.name} package found`, | ||
set: result.err.exports | ||
}); | ||
} | ||
process.exit(1); | ||
}; | ||
// src/bin/index.ts | ||
var config = await getConfig(); | ||
if (config.collectUsages) { | ||
await collectUsages({ config }); | ||
await collectUsages2({ config }); | ||
} | ||
await findUnusedExports({ config }); | ||
await findUnusedExports2({ config }); |
{ | ||
"name": "pure-index", | ||
"type": "module", | ||
"version": "1.0.4", | ||
"version": "1.0.5-next.0", | ||
"description": "Pure Index is a tool for packages. It helps to clean your packages of unused exports with ease.", | ||
@@ -14,3 +14,3 @@ "main": "./dist/api/index.js", | ||
"scripts": { | ||
"build": "make build", | ||
"build": "tsup-node ./src/bin/index.ts ./src/api/index.ts --format esm", | ||
"prepublishOnly": "make prepublishOnly", | ||
@@ -33,4 +33,6 @@ "test": "vitest" | ||
"effector": "23.1.0", | ||
"esbuild": "0.19.12", | ||
"prettier": "3.2.4", | ||
"tsc-alias": "1.8.8", | ||
"tsup": "^8.0.1", | ||
"typescript": "5.3.3", | ||
@@ -37,0 +39,0 @@ "vite-tsconfig-paths": "4.3.1", |
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
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
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
26341
9
10
577
1
1