@prover-coder-ai/dist-deps-prune 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # dist-deps-prune
2
2
 
3
+ ## 1.0.5
4
+
5
+ ### Patch Changes
6
+
7
+ - chore: automated version bump
8
+
9
+ ## 1.0.4
10
+
11
+ ### Patch Changes
12
+
13
+ - chore: automated version bump
14
+
3
15
  ## 1.0.3
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -34,6 +34,29 @@ npx @prover-coder-ai/dist-deps-prune release --dist ./dist --package ./package.j
34
34
  npx @prover-coder-ai/dist-deps-prune restore --package ./package.json
35
35
  ```
36
36
 
37
+ ## CI/CD (Release workflow)
38
+
39
+ Use the tool during release so only the `dist/`-used dependencies stay in the published package.
40
+ Below is a minimal GitHub Actions snippet that builds, prunes, publishes, and restores automatically:
41
+
42
+ ```yaml
43
+ - name: Build dist
44
+ run: pnpm build
45
+
46
+ - name: Publish with dist-deps-prune (auto restore)
47
+ run: |
48
+ npx @prover-coder-ai/dist-deps-prune release \
49
+ --dist ./dist \
50
+ --package ./package.json \
51
+ --prune-dev true \
52
+ --command "npm publish" \
53
+ --silent
54
+ env:
55
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
56
+ ```
57
+
58
+ If you already run a publish command (e.g., `changeset-publish`), just put it into `--command`.
59
+
37
60
  ## Notes
38
61
 
39
62
  - Supports ESM + CJS static imports in `.js/.mjs/.cjs/.d.ts`.
package/dist/main.js CHANGED
@@ -197,6 +197,49 @@ const resolveConfig = (cli, fileConfig) => {
197
197
  pruneOptional: resolvePruneOptional(cli, fileConfig)
198
198
  };
199
199
  };
200
+ const configError = (message) => ({
201
+ _tag: "ConfigError",
202
+ message
203
+ });
204
+ const fileError = (message) => ({
205
+ _tag: "FileError",
206
+ message
207
+ });
208
+ const distNotFound = (path) => ({
209
+ _tag: "DistNotFound",
210
+ path
211
+ });
212
+ const parseFileError = (file, error) => ({
213
+ _tag: "ParseError",
214
+ file,
215
+ error
216
+ });
217
+ const restoreError = (message) => ({
218
+ _tag: "RestoreError",
219
+ message
220
+ });
221
+ const devDependencyInDist = (packages) => ({
222
+ _tag: "DevDependencyInDist",
223
+ packages,
224
+ message: `dist imports packages from devDependencies: ${packages.join(", ")}
225
+ Move them to dependencies (runtime) or peerDependencies (plugin/host), then retry.`
226
+ });
227
+ const sortStrings = (values) => values.toSorted((left, right) => left.localeCompare(right));
228
+ const listKeys$1 = (map) => map === void 0 ? [] : Object.keys(map);
229
+ const buildRuntimeSet = (pkg) => /* @__PURE__ */ new Set([
230
+ ...listKeys$1(pkg.dependencies),
231
+ ...listKeys$1(pkg.peerDependencies),
232
+ ...listKeys$1(pkg.optionalDependencies)
233
+ ]);
234
+ const listDevDependenciesUsedInDist = (used, pkg) => {
235
+ const devDependencies = pkg.devDependencies;
236
+ if (devDependencies === void 0) {
237
+ return [];
238
+ }
239
+ const runtime = buildRuntimeSet(pkg);
240
+ const hits = Object.keys(devDependencies).filter((name) => used.has(name) && !runtime.has(name));
241
+ return sortStrings(hits);
242
+ };
200
243
  const makePackageJsonError = (message) => ({
201
244
  _tag: "PackageJsonError",
202
245
  message
@@ -418,27 +461,6 @@ const renderJsonReport = (report) => JSON.stringify(
418
461
  null,
419
462
  2
420
463
  );
421
- const configError = (message) => ({
422
- _tag: "ConfigError",
423
- message
424
- });
425
- const fileError = (message) => ({
426
- _tag: "FileError",
427
- message
428
- });
429
- const distNotFound = (path) => ({
430
- _tag: "DistNotFound",
431
- path
432
- });
433
- const parseFileError = (file, error) => ({
434
- _tag: "ParseError",
435
- file,
436
- error
437
- });
438
- const restoreError = (message) => ({
439
- _tag: "RestoreError",
440
- message
441
- });
442
464
  const loadBuiltinModules = Effect.tryPromise({
443
465
  try: () => import("node:module"),
444
466
  catch: (error) => fileError(String(error))
@@ -1025,6 +1047,10 @@ const analyzeProject = (cli) => Effect$1.gen(function* (_) {
1025
1047
  })
1026
1048
  );
1027
1049
  const pkg = yield* _(readPackageJson(cli.packagePath));
1050
+ const usedInDev = listDevDependenciesUsedInDist(scan.used, pkg);
1051
+ if (usedInDev.length > 0) {
1052
+ return yield* _(Effect$1.fail(devDependencyInDist(usedInDev)));
1053
+ }
1028
1054
  const plan = buildPrunePlan(pkg, {
1029
1055
  used: scan.used,
1030
1056
  keep: new Set(resolved.keep),
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sources":["../src/core/cli.ts","../src/core/config.ts","../src/core/package-json.ts","../src/core/prune.ts","../src/core/report.ts","../src/core/errors.ts","../src/shell/builtins.ts","../src/shell/command.ts","../src/shell/config-file.ts","../src/shell/package-json.ts","../src/shell/release.ts","../src/core/glob.ts","../src/core/normalize.ts","../src/core/parse.ts","../src/shell/scan.ts","../src/app/program.ts","../src/app/main.ts"],"sourcesContent":["import { Match } from \"effect\"\nimport * as Either from \"effect/Either\"\n\n// CHANGE: implement deterministic CLI parsing for dist-deps-prune\n// WHY: keep CLI decoding pure and testable at the boundary\n// QUOTE(TZ): \"CLI интерфейс (финальная спецификация)\"\n// REF: req-cli-parse-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀argv: parse(argv) = Right(args) → args.command ∈ Commands\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: unknown flags are rejected\n// COMPLEXITY: O(n) where n = argv length\n\nexport type CliCommand = \"scan\" | \"apply\" | \"release\" | \"restore\"\n\nexport interface CliArgs {\n readonly command: CliCommand\n readonly dist: string\n readonly packagePath: string\n readonly ignorePath: string | undefined\n readonly ignorePathExplicit: boolean\n readonly keep: ReadonlyArray<string>\n readonly json: boolean\n readonly silent: boolean\n readonly strict: boolean\n readonly conservative: boolean\n readonly failOnUnused: boolean\n readonly patterns: ReadonlyArray<string> | undefined\n readonly pruneDev: boolean | undefined\n readonly pruneOptional: boolean | undefined\n readonly write: boolean\n readonly releaseCommand: string | undefined\n}\n\nexport type CliError = { readonly _tag: \"CliError\"; readonly message: string }\n\nconst cliError = (message: string): CliError => ({ _tag: \"CliError\", message })\n\nconst isFlag = (value: string): boolean => value.startsWith(\"-\")\n\nconst splitList = (value: string): ReadonlyArray<string> =>\n value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n\nconst parseBoolean = (value: string): Either.Either<boolean, CliError> => {\n if (value === \"true\" || value === \"1\") {\n return Either.right(true)\n }\n if (value === \"false\" || value === \"0\") {\n return Either.right(false)\n }\n return Either.left(cliError(`Invalid boolean value: ${value}`))\n}\n\nconst parseCommand = (value: string): Either.Either<CliCommand, CliError> =>\n Match.value(value).pipe(\n Match.when(\"scan\", () => Either.right<CliCommand>(\"scan\")),\n Match.when(\"apply\", () => Either.right<CliCommand>(\"apply\")),\n Match.when(\"release\", () => Either.right<CliCommand>(\"release\")),\n Match.when(\"restore\", () => Either.right<CliCommand>(\"restore\")),\n Match.orElse(() => Either.left(cliError(`Unknown command: ${value}`)))\n )\n\nconst defaultArgs = (command: CliCommand): CliArgs => ({\n command,\n dist: \"./dist\",\n packagePath: \"./package.json\",\n ignorePath: undefined,\n ignorePathExplicit: false,\n keep: [],\n json: false,\n silent: false,\n strict: false,\n conservative: false,\n failOnUnused: false,\n patterns: undefined,\n pruneDev: undefined,\n pruneOptional: undefined,\n write: false,\n releaseCommand: undefined\n})\n\nconst readFlagValue = (\n flagName: string,\n inlineValue: string | undefined,\n nextValue: string | undefined\n): Either.Either<string, CliError> => {\n if (inlineValue !== undefined) {\n return Either.right(inlineValue)\n }\n if (nextValue === undefined || isFlag(nextValue)) {\n return Either.left(cliError(`Missing value for --${flagName}`))\n }\n return Either.right(nextValue)\n}\n\nconst setParsedFlag = (\n next: CliArgs,\n consumed: number\n): Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError> => Either.right({ next, consumed })\n\nconst parseValueFlag = (\n flagName: string,\n current: CliArgs,\n inlineValue: string | undefined,\n nextValue: string | undefined,\n update: (args: CliArgs, value: string) => CliArgs\n): Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError> =>\n Either.map(readFlagValue(flagName, inlineValue, nextValue), (value) => ({\n next: update(current, value),\n consumed: inlineValue === undefined ? 2 : 1\n }))\n\nconst parseOptionalBooleanFlag = (\n current: CliArgs,\n inlineValue: string | undefined,\n nextValue: string | undefined,\n update: (args: CliArgs, value: boolean) => CliArgs\n): Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError> => {\n const useNext = inlineValue === undefined && nextValue !== undefined && !isFlag(nextValue)\n const nextValueResolved = inlineValue ?? (useNext ? nextValue : \"true\")\n return Either.map(parseBoolean(nextValueResolved), (value) => ({\n next: update(current, value),\n consumed: useNext ? 2 : 1\n }))\n}\n\ntype FlagParser = (\n current: CliArgs,\n inlineValue: string | undefined,\n nextValue: string | undefined\n) => Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError>\n\nconst flagParsers: Record<string, FlagParser> = {\n json: (current) => setParsedFlag({ ...current, json: true }, 1),\n silent: (current) => setParsedFlag({ ...current, silent: true }, 1),\n strict: (current) => setParsedFlag({ ...current, strict: true }, 1),\n conservative: (current) => setParsedFlag({ ...current, conservative: true }, 1),\n \"fail-on-unused\": (current) => setParsedFlag({ ...current, failOnUnused: true }, 1),\n write: (current, inlineValue, nextValue) =>\n parseOptionalBooleanFlag(current, inlineValue, nextValue, (args, value) => ({\n ...args,\n write: value\n })),\n dist: (current, inlineValue, nextValue) =>\n parseValueFlag(\"dist\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n dist: value\n })),\n package: (current, inlineValue, nextValue) =>\n parseValueFlag(\"package\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n packagePath: value\n })),\n ignore: (current, inlineValue, nextValue) =>\n parseValueFlag(\"ignore\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n ignorePath: value,\n ignorePathExplicit: true\n })),\n keep: (current, inlineValue, nextValue) =>\n parseValueFlag(\"keep\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n keep: splitList(value)\n })),\n patterns: (current, inlineValue, nextValue) =>\n parseValueFlag(\"patterns\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n patterns: splitList(value)\n })),\n \"prune-dev\": (current, inlineValue, nextValue) =>\n parseOptionalBooleanFlag(current, inlineValue, nextValue, (args, value) => ({\n ...args,\n pruneDev: value\n })),\n \"prune-optional\": (current, inlineValue, nextValue) =>\n parseOptionalBooleanFlag(current, inlineValue, nextValue, (args, value) => ({\n ...args,\n pruneOptional: value\n })),\n command: (current, inlineValue, nextValue) =>\n parseValueFlag(\"command\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n releaseCommand: value\n }))\n}\n\nconst parseFlag = (\n raw: string,\n nextValue: string | undefined,\n current: CliArgs\n): Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError> => {\n if (!raw.startsWith(\"--\")) {\n return Either.left(cliError(`Unknown flag: ${raw}`))\n }\n const [name = \"\", inlineValue] = raw.slice(2).split(\"=\", 2)\n const parser = flagParsers[name]\n if (parser === undefined) {\n return Either.left(cliError(`Unknown flag: --${name}`))\n }\n return parser(current, inlineValue === undefined ? undefined : inlineValue, nextValue)\n}\n\ninterface ParsedCommand {\n readonly command: CliCommand\n readonly startIndex: number\n}\n\nconst parseCommandFromArgs = (\n rawArgs: ReadonlyArray<string>\n): Either.Either<ParsedCommand, CliError> => {\n const first = rawArgs[0]\n if (first === undefined || isFlag(first)) {\n return Either.right({ command: \"scan\", startIndex: 0 })\n }\n const commandEither = parseCommand(first)\n if (Either.isLeft(commandEither)) {\n return Either.left(commandEither.left)\n }\n return Either.right({ command: commandEither.right, startIndex: 1 })\n}\n\nconst parseFlags = (\n rawArgs: ReadonlyArray<string>,\n startIndex: number,\n initial: CliArgs\n): Either.Either<CliArgs, CliError> => {\n let args = initial\n let index = startIndex\n while (index < rawArgs.length) {\n const current = rawArgs[index]\n if (current === undefined) {\n return Either.left(cliError(\"Unexpected end of arguments\"))\n }\n if (!isFlag(current)) {\n return Either.left(cliError(`Unexpected positional argument: ${current}`))\n }\n const nextValue = rawArgs[index + 1]\n const parsed = parseFlag(current, nextValue, args)\n if (Either.isLeft(parsed)) {\n return Either.left(parsed.left)\n }\n args = parsed.right.next\n index += parsed.right.consumed\n }\n return Either.right(args)\n}\n\n/**\n * Parse CLI arguments into a typed configuration.\n *\n * @param argv - Raw process.argv array.\n * @returns Either with parsed CliArgs or CliError.\n *\n * @pure true\n * @invariant command defaults to scan when omitted\n * @complexity O(n)\n */\nexport const parseCliArgs = (\n argv: ReadonlyArray<string>\n): Either.Either<CliArgs, CliError> => {\n const rawArgs = argv.slice(2)\n const commandEither = parseCommandFromArgs(rawArgs)\n if (Either.isLeft(commandEither)) {\n return Either.left(commandEither.left)\n }\n const parsed = commandEither.right\n return parseFlags(rawArgs, parsed.startIndex, defaultArgs(parsed.command))\n}\n","import type { CliArgs } from \"./cli.js\"\n\n// CHANGE: define config merging rules and defaults\n// WHY: ensure CLI flags override config file and defaults deterministically\n// QUOTE(TZ): \"Приоритет: CLI-флаги > конфиг > дефолты.\"\n// REF: req-config-merge-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀k: resolve(cli, cfg).k = cli.k ?? cfg.k ?? default(k)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: resolved patterns list is non-empty\n// COMPLEXITY: O(n)/O(1)\n\nexport interface FileConfig {\n readonly keep?: ReadonlyArray<string>\n readonly ignorePatterns?: ReadonlyArray<string>\n readonly pruneDev?: boolean\n readonly pruneOptional?: boolean\n readonly patterns?: ReadonlyArray<string>\n}\n\nexport interface ResolvedConfig {\n readonly patterns: ReadonlyArray<string>\n readonly ignorePatterns: ReadonlyArray<string>\n readonly keep: ReadonlyArray<string>\n readonly pruneDev: boolean\n readonly pruneOptional: boolean\n}\n\nconst unique = (values: ReadonlyArray<string>): ReadonlyArray<string> => {\n const seen = new Set<string>()\n const result: Array<string> = []\n for (const value of values) {\n if (!seen.has(value)) {\n seen.add(value)\n result.push(value)\n }\n }\n return result\n}\n\nexport const defaultPatterns = (distPath: string): ReadonlyArray<string> => [\n `${distPath}/**/*.js`,\n `${distPath}/**/*.mjs`,\n `${distPath}/**/*.cjs`,\n `${distPath}/**/*.d.ts`\n]\n\nconst resolvePatterns = (cli: CliArgs, fileConfig: FileConfig | undefined): ReadonlyArray<string> =>\n cli.patterns ?? fileConfig?.patterns ?? defaultPatterns(cli.dist)\n\nconst resolveIgnorePatterns = (fileConfig: FileConfig | undefined): ReadonlyArray<string> =>\n fileConfig?.ignorePatterns ?? []\n\nconst resolveKeep = (cli: CliArgs, fileConfig: FileConfig | undefined): ReadonlyArray<string> =>\n unique([...(fileConfig?.keep ?? []), ...cli.keep])\n\nconst resolvePruneDev = (cli: CliArgs, fileConfig: FileConfig | undefined): boolean =>\n cli.pruneDev ?? fileConfig?.pruneDev ?? (cli.command === \"release\")\n\nconst resolvePruneOptional = (cli: CliArgs, fileConfig: FileConfig | undefined): boolean =>\n cli.pruneOptional ?? fileConfig?.pruneOptional ?? false\n\n/**\n * Resolve the effective config from CLI flags, file config, and defaults.\n *\n * @param cli - Parsed CLI arguments.\n * @param fileConfig - Optional config loaded from .dist-deps-prune.json.\n * @returns Resolved configuration.\n *\n * @pure true\n * @invariant patterns length ≥ 1\n * @complexity O(n)\n */\nexport const resolveConfig = (\n cli: CliArgs,\n fileConfig: FileConfig | undefined\n): ResolvedConfig => {\n return {\n patterns: resolvePatterns(cli, fileConfig),\n ignorePatterns: resolveIgnorePatterns(fileConfig),\n keep: resolveKeep(cli, fileConfig),\n pruneDev: resolvePruneDev(cli, fileConfig),\n pruneOptional: resolvePruneOptional(cli, fileConfig)\n }\n}\n","import * as Either from \"effect/Either\"\nimport type { Json, JsonObject } from \"./json.js\"\n\n// CHANGE: formalize the PackageJson domain and dependency maps\n// WHY: ensure dependency pruning preserves non-dependency JSON fields safely\n// QUOTE(TZ): \"Сравнивает USED с package.json (dependencies/devDependencies/optional/peer).\"\n// REF: req-package-json-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀k ∈ DepKeys: value(k) ∈ String\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: DependencyMap values are semantic version strings\n// COMPLEXITY: O(1)/O(1)\n\nexport type DependencyMap = Readonly<Record<string, string>>\n\nexport interface PackageJson extends JsonObject {\n readonly dependencies?: DependencyMap\n readonly devDependencies?: DependencyMap\n readonly optionalDependencies?: DependencyMap\n readonly peerDependencies?: DependencyMap\n}\n\ninterface DependencyMaps {\n readonly dependencies?: DependencyMap\n readonly devDependencies?: DependencyMap\n readonly optionalDependencies?: DependencyMap\n readonly peerDependencies?: DependencyMap\n}\n\nexport type PackageJsonError = { readonly _tag: \"PackageJsonError\"; readonly message: string }\n\nconst makePackageJsonError = (message: string): PackageJsonError => ({\n _tag: \"PackageJsonError\",\n message\n})\n\nconst isRecord = (value: Json): value is JsonObject =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst toDependencyMap = (\n fieldName: string,\n value: Json | undefined\n): Either.Either<DependencyMap | undefined, PackageJsonError> => {\n if (value === undefined) {\n const empty: DependencyMap | undefined = undefined\n return Either.right(empty)\n }\n if (!isRecord(value)) {\n return Either.left(makePackageJsonError(`${fieldName} must be an object`))\n }\n const entries = Object.entries(value)\n const result: Record<string, string> = {}\n for (const [key, rawValue] of entries) {\n if (typeof rawValue !== \"string\") {\n return Either.left(makePackageJsonError(`${fieldName}.${key} must be a string`))\n }\n result[key] = rawValue\n }\n return Either.right(result)\n}\n\ntype DependencyField = { readonly key: keyof DependencyMaps; readonly label: string }\n\nconst dependencyFields: ReadonlyArray<DependencyField> = [\n { key: \"dependencies\", label: \"dependencies\" },\n { key: \"devDependencies\", label: \"devDependencies\" },\n { key: \"optionalDependencies\", label: \"optionalDependencies\" },\n { key: \"peerDependencies\", label: \"peerDependencies\" }\n]\n\nconst readDependencyMaps = (value: JsonObject): Either.Either<DependencyMaps, PackageJsonError> => {\n const result: Record<string, DependencyMap> = {}\n for (const field of dependencyFields) {\n const decoded = toDependencyMap(field.label, value[field.key])\n if (Either.isLeft(decoded)) {\n return Either.left(decoded.left)\n }\n if (decoded.right !== undefined) {\n result[field.key] = decoded.right\n }\n }\n return Either.right(result)\n}\n\n/**\n * Decode a JsonObject into a PackageJson with validated dependency maps.\n *\n * @param value - Parsed JSON object representing package.json.\n * @returns PackageJson or a typed PackageJsonError.\n *\n * @pure true\n * @invariant dependency values are strings\n * @complexity O(n) where n = number of dependency entries\n */\nexport const decodePackageJson = (\n value: JsonObject\n): Either.Either<PackageJson, PackageJsonError> => {\n const mapsEither = readDependencyMaps(value)\n if (Either.isLeft(mapsEither)) {\n return Either.left(mapsEither.left)\n }\n const maps = mapsEither.right\n const packageJson: PackageJson = {\n ...value,\n ...maps\n }\n return Either.right(packageJson)\n}\n\nexport const omitDependencyFields = (value: JsonObject): JsonObject => {\n const result: Record<string, Json> = {}\n for (const [key, entry] of Object.entries(value)) {\n if (\n key !== \"dependencies\" &&\n key !== \"devDependencies\" &&\n key !== \"optionalDependencies\" &&\n key !== \"peerDependencies\"\n ) {\n result[key] = entry\n }\n }\n return result\n}\n\nexport const isJsonObject = (value: Json): value is JsonObject =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n","import type { DependencyMap, PackageJson } from \"./package-json.js\"\nimport { omitDependencyFields } from \"./package-json.js\"\nimport type { UnusedByKind } from \"./types.js\"\n\n// CHANGE: implement dependency pruning plan calculation\n// WHY: provide deterministic diff generation and conservative safety mode\n// QUOTE(TZ): \"Удалять из dependencies всё, что отсутствует в USED\"\n// REF: req-prune-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀d ∈ prunable: d ∉ USED ∧ d ∉ KEEP\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: peerDependencies are never removed\n// COMPLEXITY: O(n) where n = total dependencies\n\nexport interface PruneOptions {\n readonly used: ReadonlySet<string>\n readonly keep: ReadonlySet<string>\n readonly pruneDev: boolean\n readonly pruneOptional: boolean\n readonly conservative: boolean\n readonly hasUncertainty: boolean\n}\n\nexport interface PrunePlan {\n readonly unused: UnusedByKind\n readonly prunable: UnusedByKind\n readonly keptByRule: ReadonlyArray<string>\n readonly nextPackageJson: PackageJson\n}\n\nconst emptyUnused: UnusedByKind = {\n dependencies: [],\n devDependencies: [],\n optionalDependencies: [],\n peerDependencies: []\n}\n\nconst listKeys = (map: DependencyMap | undefined): ReadonlyArray<string> => map === undefined ? [] : Object.keys(map)\n\nconst filterMap = (\n map: DependencyMap | undefined,\n remove: ReadonlySet<string>\n): DependencyMap | undefined => {\n if (map === undefined) {\n return undefined\n }\n const entries = Object.entries(map).filter(([name]) => !remove.has(name))\n if (entries.length === 0) {\n return undefined\n }\n const result: Record<string, string> = {}\n for (const [name, version] of entries) {\n result[name] = version\n }\n return result\n}\n\nconst computeUnused = (\n map: DependencyMap | undefined,\n used: ReadonlySet<string>,\n keep: ReadonlySet<string>\n): ReadonlyArray<string> => listKeys(map).filter((name) => !used.has(name) && !keep.has(name))\n\nconst computeUnusedByKind = (pkg: PackageJson, options: PruneOptions): UnusedByKind => ({\n dependencies: computeUnused(pkg.dependencies, options.used, options.keep),\n devDependencies: computeUnused(pkg.devDependencies, options.used, options.keep),\n optionalDependencies: computeUnused(pkg.optionalDependencies, options.used, options.keep),\n peerDependencies: computeUnused(pkg.peerDependencies, options.used, options.keep)\n})\n\nconst computePrunableByKind = (unused: UnusedByKind, options: PruneOptions): UnusedByKind => {\n const hasUncertainty = options.conservative && options.hasUncertainty\n return {\n ...emptyUnused,\n dependencies: hasUncertainty ? [] : unused.dependencies,\n devDependencies: options.pruneDev && !hasUncertainty ? unused.devDependencies : [],\n optionalDependencies: options.pruneOptional && !hasUncertainty ? unused.optionalDependencies : [],\n peerDependencies: []\n }\n}\n\nconst computeKeptByRule = (\n unused: UnusedByKind,\n prunable: UnusedByKind,\n options: PruneOptions\n): ReadonlyArray<string> => {\n const keptExplicit = [...options.keep].filter((name) => !options.used.has(name))\n return [\n ...keptExplicit,\n ...unused.dependencies.filter((name) => !prunable.dependencies.includes(name)),\n ...unused.devDependencies.filter((name) => !prunable.devDependencies.includes(name)),\n ...unused.optionalDependencies.filter((name) => !prunable.optionalDependencies.includes(name)),\n ...unused.peerDependencies\n ]\n}\n\nconst buildNextPackageJson = (pkg: PackageJson, prunable: UnusedByKind): PackageJson => {\n const removeDependencies = new Set(prunable.dependencies)\n const removeDev = new Set(prunable.devDependencies)\n const removeOptional = new Set(prunable.optionalDependencies)\n const nextDependencies = filterMap(pkg.dependencies, removeDependencies)\n const nextDevDependencies = filterMap(pkg.devDependencies, removeDev)\n const nextOptionalDependencies = filterMap(pkg.optionalDependencies, removeOptional)\n const base = omitDependencyFields(pkg)\n return {\n ...base,\n ...(nextDependencies === undefined ? {} : { dependencies: nextDependencies }),\n ...(nextDevDependencies === undefined ? {} : { devDependencies: nextDevDependencies }),\n ...(nextOptionalDependencies === undefined ? {} : { optionalDependencies: nextOptionalDependencies }),\n ...(pkg.peerDependencies === undefined ? {} : { peerDependencies: pkg.peerDependencies })\n }\n}\n\n/**\n * Build the prune plan (analysis + actual removal) for a package.json.\n *\n * @param pkg - Parsed package.json.\n * @param options - Prune options (used set, keep rules, mode flags).\n * @returns PrunePlan with unused, prunable, and next package.json.\n *\n * @pure true\n * @invariant peerDependencies remain unchanged\n * @complexity O(n)\n */\nexport const buildPrunePlan = (pkg: PackageJson, options: PruneOptions): PrunePlan => {\n const unused = computeUnusedByKind(pkg, options)\n const prunable = computePrunableByKind(unused, options)\n const keptByRule = computeKeptByRule(unused, prunable, options)\n const nextPackageJson = buildNextPackageJson(pkg, prunable)\n\n return {\n unused,\n prunable,\n keptByRule,\n nextPackageJson\n }\n}\n","import { Match } from \"effect\"\nimport type { PrunePlan } from \"./prune.js\"\nimport type { Report, ScanOutcome, UnusedByKind, Warning } from \"./types.js\"\n\n// CHANGE: build structured reports and render output formats\n// WHY: keep reporting pure and deterministic across CLI modes\n// QUOTE(TZ): \"Отчёт в stdout (человекочитаемый)\"\n// REF: req-report-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀r: report(r).used is sorted\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: Report.used is unique and sorted\n// COMPLEXITY: O(n log n)\n\nconst compareStrings = (left: string, right: string): number => left.localeCompare(right)\n\nconst mergeSorted = (\n left: ReadonlyArray<string>,\n right: ReadonlyArray<string>\n): ReadonlyArray<string> => {\n if (left.length === 0) {\n return right\n }\n if (right.length === 0) {\n return left\n }\n const leftHead = left[0] ?? \"\"\n const rightHead = right[0] ?? \"\"\n if (compareStrings(leftHead, rightHead) <= 0) {\n return [leftHead, ...mergeSorted(left.slice(1), right)]\n }\n return [rightHead, ...mergeSorted(left, right.slice(1))]\n}\n\nconst mergeSort = (values: ReadonlyArray<string>): ReadonlyArray<string> => {\n if (values.length <= 1) {\n return [...values]\n }\n const mid = Math.floor(values.length / 2)\n const left = mergeSort(values.slice(0, mid))\n const right = mergeSort(values.slice(mid))\n return mergeSorted(left, right)\n}\n\nconst sortUnique = (values: ReadonlyArray<string>): ReadonlyArray<string> => mergeSort([...new Set(values)])\n\nconst sortUnused = (unused: UnusedByKind): UnusedByKind => ({\n dependencies: sortUnique(unused.dependencies),\n devDependencies: sortUnique(unused.devDependencies),\n optionalDependencies: sortUnique(unused.optionalDependencies),\n peerDependencies: sortUnique(unused.peerDependencies)\n})\n\n/**\n * Build a Report object from scan and prune results.\n *\n * @param scan - Scan outcome with used set and warnings.\n * @param plan - Prune plan with unused lists and keptByRule.\n * @returns Report ready for output.\n *\n * @pure true\n * @invariant report.used is sorted and unique\n * @complexity O(n log n)\n */\nexport const buildReport = (scan: ScanOutcome, plan: PrunePlan): Report => ({\n used: sortUnique([...scan.used]),\n unused: sortUnused(plan.unused),\n keptByRule: sortUnique(plan.keptByRule),\n warnings: scan.warnings,\n stats: scan.stats\n})\n\nconst formatWarning = (warning: Warning): string =>\n Match.value(warning).pipe(\n Match.when({ type: \"dynamic-import\" }, (value) => `[dynamic-import] ${value.file}: ${value.expr}`),\n Match.when({ type: \"dynamic-require\" }, (value) => `[dynamic-require] ${value.file}: ${value.expr}`),\n Match.when({ type: \"parse-error\" }, (value) => `[parse-error] ${value.file}: ${value.error}`),\n Match.exhaustive\n )\n\nconst formatList = (title: string, values: ReadonlyArray<string>): ReadonlyArray<string> => {\n if (values.length === 0) {\n return [`${title}: (none)`]\n }\n return [title + \":\", ...values.map((value) => ` - ${value}`)]\n}\n\n/**\n * Render a human-readable report.\n *\n * @param report - Report data.\n * @returns Multi-line string for stdout.\n *\n * @pure true\n * @invariant output lists all required sections\n * @complexity O(n)\n */\nexport const renderHumanReport = (report: Report): string => {\n const lines = [\n ...formatList(\"USED\", report.used),\n ...formatList(\"Unused dependencies\", report.unused.dependencies),\n ...formatList(\"Unused devDependencies\", report.unused.devDependencies),\n ...formatList(\"Unused optionalDependencies\", report.unused.optionalDependencies),\n ...formatList(\"Peer dependencies (reported only)\", report.unused.peerDependencies)\n ]\n const warningLines = report.warnings.length === 0\n ? [\"Warnings: (none)\"]\n : [\n \"Warnings:\",\n ...report.warnings\n .map((warning) => formatWarning(warning))\n .map((line) => ` - ${line}`)\n ]\n const statsLines = [\n `Stats: filesScanned=${report.stats.filesScanned}, importsFound=${report.stats.importsFound}`\n ]\n return [...lines, ...warningLines, ...statsLines].join(\"\\n\")\n}\n\n/**\n * Render report as JSON text.\n *\n * @param report - Report data.\n * @returns JSON string.\n *\n * @pure true\n * @invariant output matches the JSON schema described in the spec\n * @complexity O(n)\n */\nexport const renderJsonReport = (report: Report): string =>\n JSON.stringify(\n {\n used: report.used,\n unused: {\n dependencies: report.unused.dependencies,\n devDependencies: report.unused.devDependencies\n },\n keptByRule: report.keptByRule,\n warnings: report.warnings,\n stats: report.stats\n },\n null,\n 2\n )\n","import type { CliError } from \"./cli.js\"\nimport type { PackageJsonError } from \"./package-json.js\"\n\n// CHANGE: unify error algebra for the CLI tool\n// WHY: provide typed failures for program flow and exit codes\n// QUOTE(TZ): \"Коды возврата: 1 — ошибка выполнения\"\n// REF: req-errors-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀e ∈ AppError: e._tag is stable and exhaustively matchable\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: error tags are unique\n// COMPLEXITY: O(1)/O(1)\n\nexport type ConfigError = { readonly _tag: \"ConfigError\"; readonly message: string }\nexport type FileError = { readonly _tag: \"FileError\"; readonly message: string }\nexport type DistNotFound = { readonly _tag: \"DistNotFound\"; readonly path: string }\nexport type ParseFileError = { readonly _tag: \"ParseError\"; readonly file: string; readonly error: string }\nexport type CommandFailed = {\n readonly _tag: \"CommandFailed\"\n readonly command: string\n readonly exitCode: number\n}\nexport type RestoreError = { readonly _tag: \"RestoreError\"; readonly message: string }\n\nexport type AppError =\n | CliError\n | PackageJsonError\n | ConfigError\n | FileError\n | DistNotFound\n | ParseFileError\n | CommandFailed\n | RestoreError\n\nexport const configError = (message: string): ConfigError => ({\n _tag: \"ConfigError\",\n message\n})\n\nexport const fileError = (message: string): FileError => ({\n _tag: \"FileError\",\n message\n})\n\nexport const distNotFound = (path: string): DistNotFound => ({\n _tag: \"DistNotFound\",\n path\n})\n\nexport const parseFileError = (file: string, error: string): ParseFileError => ({\n _tag: \"ParseError\",\n file,\n error\n})\n\nexport const commandFailed = (command: string, exitCode: number): CommandFailed => ({\n _tag: \"CommandFailed\",\n command,\n exitCode\n})\n\nexport const restoreError = (message: string): RestoreError => ({\n _tag: \"RestoreError\",\n message\n})\n","import * as Effect from \"effect/Effect\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { fileError } from \"../core/errors.js\"\n\n// CHANGE: provide Node builtin module set for filtering\n// WHY: builtins must be excluded from USED dependency detection\n// QUOTE(TZ): \"Node builtins: fs, path, url, node:fs и т.д.\"\n// REF: req-builtins-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀b ∈ builtins: b does not represent an external package\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlySet<string>, AppError, never>\n// INVARIANT: node: prefix is stripped\n// COMPLEXITY: O(n)\n\nexport const loadBuiltinModules: Effect.Effect<ReadonlySet<string>, AppError> = Effect.tryPromise({\n try: () => import(\"node:module\"),\n catch: (error) => fileError(String(error))\n}).pipe(\n Effect.map((module) => {\n const result = new Set<string>()\n for (const name of module.builtinModules) {\n if (name.startsWith(\"node:\")) {\n result.add(name.slice(\"node:\".length))\n } else {\n result.add(name)\n }\n }\n return result\n })\n)\n","import * as Command from \"@effect/platform/Command\"\nimport type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport * as Effect from \"effect/Effect\"\nimport * as Either from \"effect/Either\"\nimport { pipe } from \"effect/Function\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { fileError } from \"../core/errors.js\"\n\n// CHANGE: run external command with Effect CommandExecutor\n// WHY: enable release mode with typed exit code handling\n// QUOTE(TZ): \"Запускает команду из --command\"\n// REF: req-command-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: run(c) = code → code ∈ ℕ\n// PURITY: SHELL\n// EFFECT: Effect<number, AppError, CommandExecutor>\n// INVARIANT: stdout/stderr are inherited\n// COMPLEXITY: O(n)\n\ntype QuoteState = \"\\\"\" | \"'\" | null\n\ninterface ParseStep {\n readonly current: string\n readonly quote: QuoteState\n readonly index: number\n readonly pushToken: boolean\n}\n\nconst consumeQuoted = (\n input: string,\n index: number,\n current: string,\n quote: QuoteState\n): ParseStep => {\n const char = input.charAt(index)\n const nextChar = input.charAt(index + 1)\n if (quote !== null && char === quote) {\n return { current, quote: null, index: index + 1, pushToken: false }\n }\n if (quote === \"\\\"\" && char === \"\\\\\" && nextChar.length > 0) {\n return { current: current + nextChar, quote, index: index + 2, pushToken: false }\n }\n return { current: current + char, quote, index: index + 1, pushToken: false }\n}\n\nconst consumeUnquoted = (input: string, index: number, current: string): ParseStep => {\n const char = input.charAt(index)\n const nextChar = input.charAt(index + 1)\n if (char === \"\\\"\" || char === \"'\") {\n return { current, quote: char, index: index + 1, pushToken: false }\n }\n if (char.trim().length === 0) {\n return { current: \"\", quote: null, index: index + 1, pushToken: current.length > 0 }\n }\n if (char === \"\\\\\" && nextChar.length > 0) {\n return { current: current + nextChar, quote: null, index: index + 2, pushToken: false }\n }\n return { current: current + char, quote: null, index: index + 1, pushToken: false }\n}\n\nconst splitCommandLine = (input: string): Either.Either<Array<string>, AppError> => {\n let result: Array<string> = []\n let current = \"\"\n let quote: QuoteState = null\n let index = 0\n while (index < input.length) {\n const step: ParseStep = quote\n ? consumeQuoted(input, index, current, quote)\n : consumeUnquoted(input, index, current)\n if (step.pushToken) {\n result = [...result, current]\n }\n current = step.current\n quote = step.quote\n index = step.index\n }\n if (quote !== null) {\n return Either.left(fileError(\"Unterminated quote in --command\"))\n }\n if (current.length > 0) {\n result = [...result, current]\n }\n return Either.right(result)\n}\n\nexport const runCommand = (\n commandLine: string,\n cwd: string\n): Effect.Effect<number, AppError, CommandExecutor> =>\n Effect.gen(function*(_) {\n const parts = splitCommandLine(commandLine)\n if (Either.isLeft(parts)) {\n return yield* _(Effect.fail(parts.left))\n }\n if (parts.right.length === 0) {\n return yield* _(Effect.fail(fileError(\"Empty --command\")))\n }\n const [cmd, ...args] = parts.right\n if (cmd === undefined) {\n return yield* _(Effect.fail(fileError(\"Empty --command\")))\n }\n const command = pipe(\n Command.make(cmd, ...args),\n Command.stdin(\"inherit\"),\n Command.stdout(\"inherit\"),\n Command.stderr(\"inherit\"),\n Command.workingDirectory(cwd)\n )\n const exitCode = yield* _(\n Command.exitCode(command).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n return Number(exitCode)\n })\n","import type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { FileSystem } from \"@effect/platform/FileSystem\"\nimport * as S from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport * as Effect from \"effect/Effect\"\nimport { pipe } from \"effect/Function\"\n\nimport type { FileConfig } from \"../core/config.js\"\nimport type { AppError } from \"../core/errors.js\"\nimport { configError, fileError } from \"../core/errors.js\"\n\n// CHANGE: decode .dist-deps-prune.json with schema validation\n// WHY: keep boundary data typed and reject invalid config early\n// QUOTE(TZ): \"поддержать файл .dist-deps-prune.json\"\n// REF: req-config-file-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: decode(c) = Right(cfg) → cfg fields have correct types\n// PURITY: SHELL\n// EFFECT: Effect<FileConfig | undefined, AppError, FileSystem>\n// INVARIANT: missing config yields undefined\n// COMPLEXITY: O(n)\n\nconst RawConfigSchema = S.partial(\n S.Struct({\n keep: S.Array(S.String),\n ignorePatterns: S.Array(S.String),\n pruneDev: S.Boolean,\n pruneOptional: S.Boolean,\n patterns: S.Array(S.String)\n })\n)\n\nconst ConfigSchema = S.parseJson(RawConfigSchema)\n\nconst decodeConfig = (raw: string): Effect.Effect<FileConfig, AppError> =>\n pipe(\n S.decodeUnknown(ConfigSchema)(raw),\n Effect.map((config) => ({\n ...(config.keep === undefined ? {} : { keep: config.keep }),\n ...(config.ignorePatterns === undefined ? {} : { ignorePatterns: config.ignorePatterns }),\n ...(config.pruneDev === undefined ? {} : { pruneDev: config.pruneDev }),\n ...(config.pruneOptional === undefined ? {} : { pruneOptional: config.pruneOptional }),\n ...(config.patterns === undefined ? {} : { patterns: config.patterns })\n })),\n Effect.mapError((error) => configError(TreeFormatter.formatErrorSync(error)))\n )\n\nexport const loadConfigFile = (\n path: string | undefined,\n explicit: boolean\n): Effect.Effect<FileConfig | undefined, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n if (path === undefined) {\n return\n }\n const fs = yield* _(FileSystem)\n const exists = yield* _(\n fs.exists(path).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n if (!exists) {\n if (explicit) {\n return yield* _(Effect.fail(fileError(`Config file not found: ${path}`)))\n }\n return\n }\n const contents = yield* _(\n fs.readFileString(path).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n const decoded = yield* _(decodeConfig(contents))\n return decoded\n })\n","import type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { FileSystem } from \"@effect/platform/FileSystem\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport * as Effect from \"effect/Effect\"\nimport { pipe } from \"effect/Function\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { fileError } from \"../core/errors.js\"\nimport type { Json } from \"../core/json.js\"\nimport { decodePackageJson, isJsonObject } from \"../core/package-json.js\"\nimport type { PackageJson } from \"../core/package-json.js\"\n\n// CHANGE: provide package.json read/write helpers with validation\n// WHY: isolate filesystem IO while keeping typed dependency maps\n// QUOTE(TZ): \"package.json текущего пакета\"\n// REF: req-pkg-io-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: read(p) = Right(pkg) → pkg.dependencies values are strings\n// PURITY: SHELL\n// EFFECT: Effect<PackageJson, AppError, FileSystem>\n// INVARIANT: JSON is validated before use\n// COMPLEXITY: O(n)\n\nconst JsonSchema: Schema.Schema<Json> = Schema.suspend(() =>\n Schema.Union(\n Schema.Null,\n Schema.Boolean,\n Schema.Number,\n Schema.String,\n Schema.Array(JsonSchema),\n Schema.Record({ key: Schema.String, value: JsonSchema })\n )\n)\n\nconst JsonParseSchema = Schema.parseJson(JsonSchema)\n\nconst parseJson = (raw: string): Effect.Effect<Json, AppError> =>\n pipe(\n Schema.decodeUnknown(JsonParseSchema)(raw),\n Effect.mapError((error) => fileError(TreeFormatter.formatErrorSync(error)))\n )\n\nexport const readPackageJsonRaw = (\n path: string\n): Effect.Effect<string, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem)\n return yield* _(\n fs.readFileString(path).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n })\n\nexport const readPackageJson = (\n path: string\n): Effect.Effect<PackageJson, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n const raw = yield* _(readPackageJsonRaw(path))\n const parsed = yield* _(parseJson(raw))\n if (!isJsonObject(parsed)) {\n return yield* _(Effect.fail(fileError(\"package.json must be an object\")))\n }\n const decoded = decodePackageJson(parsed)\n if (decoded._tag === \"Left\") {\n return yield* _(Effect.fail(fileError(decoded.left.message)))\n }\n return decoded.right\n })\n\nexport const writePackageJson = (\n path: string,\n pkg: PackageJson\n): Effect.Effect<void, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem)\n const payload = JSON.stringify(pkg, null, 2) + \"\\n\"\n yield* _(\n fs.writeFileString(path, payload).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { FileSystem } from \"@effect/platform/FileSystem\"\nimport * as Effect from \"effect/Effect\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { fileError, restoreError } from \"../core/errors.js\"\n\n// CHANGE: add backup/restore helpers for release mode\n// WHY: allow pruning without polluting git history and restore package.json\n// QUOTE(TZ): \"делает backup package.json → .package.json.release.bak\"\n// REF: req-release-1\n// SOURCE: n/a\n// FORMAT THEOREM: backup(p); restore(p) → package.json restored byte-for-byte\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem>\n// INVARIANT: backup path is deterministic\n// COMPLEXITY: O(n)\n\ntype FileSystemEffect<A> = Effect.Effect<A, AppError, FileSystemService>\n\nconst mapFileError = (error: PlatformError): AppError => fileError(String(error))\n\nconst mapRestoreError = (error: PlatformError): AppError => restoreError(String(error))\n\nconst withFileSystem = <A>(\n handler: (fs: FileSystemService) => Effect.Effect<A, AppError, FileSystemService>\n): FileSystemEffect<A> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem)\n return yield* _(handler(fs))\n })\n\nconst readFile = (\n fs: FileSystemService,\n path: string,\n onError: (error: PlatformError) => AppError\n): Effect.Effect<string, AppError> => fs.readFileString(path).pipe(Effect.mapError(onError))\n\nconst writeFile = (\n fs: FileSystemService,\n path: string,\n contents: string,\n onError: (error: PlatformError) => AppError\n): Effect.Effect<void, AppError> => fs.writeFileString(path, contents).pipe(Effect.mapError(onError))\n\nconst pathExists = (\n fs: FileSystemService,\n path: string,\n onError: (error: PlatformError) => AppError\n): Effect.Effect<boolean, AppError> => fs.exists(path).pipe(Effect.mapError(onError))\n\nconst copyFile = (\n fs: FileSystemService,\n from: string,\n to: string,\n onError: (error: PlatformError) => AppError\n): Effect.Effect<void, AppError> =>\n Effect.gen(function*(_) {\n const contents = yield* _(readFile(fs, from, onError))\n yield* _(writeFile(fs, to, contents, onError))\n })\n\nconst ensureThenCopy = (\n fs: FileSystemService,\n source: string,\n target: string,\n onError: (error: PlatformError) => AppError,\n missing: AppError\n): Effect.Effect<void, AppError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(pathExists(fs, source, onError))\n if (!exists) {\n return yield* _(Effect.fail(missing))\n }\n yield* _(copyFile(fs, source, target, onError))\n })\n\nexport const backupPackageJson = (\n packagePath: string,\n backupPath: string\n): FileSystemEffect<void> => withFileSystem((fs) => copyFile(fs, packagePath, backupPath, mapFileError))\n\nexport const restorePackageJson = (\n packagePath: string,\n backupPath: string\n): FileSystemEffect<void> =>\n withFileSystem((fs) =>\n ensureThenCopy(\n fs,\n backupPath,\n packagePath,\n mapRestoreError,\n restoreError(`Backup file not found: ${backupPath}`)\n )\n )\n\nexport const ensureBackup = (\n packagePath: string,\n backupPath: string\n): FileSystemEffect<void> =>\n withFileSystem((fs) =>\n ensureThenCopy(\n fs,\n packagePath,\n backupPath,\n mapFileError,\n fileError(`package.json not found: ${packagePath}`)\n )\n )\n","// CHANGE: implement minimal glob matching for dist scanning\n// WHY: avoid extra dependencies while supporting dist/**/*.js style patterns\n// QUOTE(TZ): \"Пользователь может переопределить маски флагом.\"\n// REF: req-glob-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: match(glob, p) ∈ {true,false}\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: '*' never matches path separator '/'\n// COMPLEXITY: O(n) per match\n\nconst normalizeSlashes = (value: string): string => value.replaceAll(\"\\\\\", \"/\")\n\nconst stripDotSlash = (value: string): string => value.startsWith(\"./\") ? value.slice(2) : value\n\nconst escapeRegex = (value: string): string => value.replaceAll(/[.+^${}()|[\\]\\\\]/gu, String.raw`\\$&`)\n\nconst globToRegex = (pattern: string): RegExp => {\n const normalized = stripDotSlash(normalizeSlashes(pattern))\n let regex = \"^\"\n let index = 0\n while (index < normalized.length) {\n const char = normalized.charAt(index)\n const next = normalized.charAt(index + 1)\n if (char === \"*\" && next === \"*\") {\n const after = normalized.charAt(index + 2)\n if (after === \"/\") {\n regex += \"(?:.*/)?\"\n index += 3\n continue\n }\n regex += \".*\"\n index += 2\n continue\n }\n if (char === \"*\") {\n regex += \"[^/]*\"\n index += 1\n continue\n }\n if (char === \"?\") {\n regex += \"[^/]\"\n index += 1\n continue\n }\n regex += escapeRegex(char)\n index += 1\n }\n regex += \"$\"\n return new RegExp(regex, \"u\")\n}\n\n/**\n * Compile glob patterns into regexes.\n *\n * @param patterns - Raw glob patterns.\n * @returns Compiled regular expressions.\n *\n * @pure true\n * @invariant compiled regexes match only whole paths\n * @complexity O(n) where n = total pattern length\n */\nexport const compileGlobs = (patterns: ReadonlyArray<string>): ReadonlyArray<RegExp> =>\n patterns.map((pattern) => globToRegex(pattern))\n\n/**\n * Check if any compiled glob matches the path.\n *\n * @param globs - Compiled regex patterns.\n * @param candidate - Path to test.\n * @returns true if any pattern matches.\n *\n * @pure true\n * @complexity O(k) where k = number of globs\n */\nexport const matchesAnyGlob = (\n globs: ReadonlyArray<RegExp>,\n candidate: string\n): boolean => {\n const normalized = stripDotSlash(normalizeSlashes(candidate))\n for (const glob of globs) {\n if (glob.test(normalized)) {\n return true\n }\n }\n return false\n}\n","import * as Option from \"effect/Option\"\n\n// CHANGE: centralize package specifier normalization rules\n// WHY: ensure consistent USED set across ESM/CJS/d.ts scanning\n// QUOTE(TZ): \"Нормализация имени пакета: lodash/get → lodash; @scope/name/x → @scope/name\"\n// REF: req-normalize-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀s ∈ Specifier: normalize(s) = Some(p) → p is top-level package name\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: returned package name never contains subpath segments\n// COMPLEXITY: O(n)/O(1)\n\nconst isRelativePath = (specifier: string): boolean => specifier.startsWith(\"./\") || specifier.startsWith(\"../\")\n\nconst isAbsolutePath = (specifier: string): boolean => {\n if (specifier.startsWith(\"/\")) {\n return true\n }\n const windowsDrive = /^[a-zA-Z]:[\\\\/]/u\n return windowsDrive.test(specifier)\n}\n\nconst isNonPackageAlias = (specifier: string): boolean =>\n specifier.startsWith(\"#\") || specifier.startsWith(\"data:\") || specifier.startsWith(\"http:\")\n\nconst stripNodeProtocol = (specifier: string): string =>\n specifier.startsWith(\"node:\") ? specifier.slice(\"node:\".length) : specifier\n\nconst optionSome = Option.some\n\nconst getExternalCandidate = (\n specifier: string,\n builtins: ReadonlySet<string>\n): string | undefined => {\n if (specifier.length === 0) {\n return undefined\n }\n if (isRelativePath(specifier) || isAbsolutePath(specifier) || isNonPackageAlias(specifier)) {\n return undefined\n }\n const withoutProtocol = stripNodeProtocol(specifier)\n const firstSegment = withoutProtocol.split(\"/\")[0]\n if (builtins.has(withoutProtocol) || (firstSegment !== undefined && builtins.has(firstSegment))) {\n return undefined\n }\n return withoutProtocol\n}\n\nconst normalizeScoped = (specifier: string): Option.Option<string> => {\n const parts = specifier.split(\"/\")\n const scope = parts[0]\n const name = parts[1]\n if (scope === undefined || name === undefined || scope.length <= 1 || name.length === 0) {\n return Option.none()\n }\n return optionSome(`${scope}/${name}`)\n}\n\nconst normalizeUnscoped = (specifier: string): Option.Option<string> => {\n const parts = specifier.split(\"/\")\n const head = parts[0]\n return head === undefined || head.length === 0 ? Option.none() : optionSome(head)\n}\n\n/**\n * Normalize an import specifier into a top-level package name, if external.\n *\n * @param specifier - Raw import/require specifier.\n * @param builtins - Set of builtin module names (without node: prefix).\n * @returns Option with normalized package name.\n *\n * @pure true\n * @invariant external → not relative/absolute/builtin\n * @complexity O(n)\n */\nexport const normalizePackageName = (\n specifier: string,\n builtins: ReadonlySet<string>\n): Option.Option<string> => {\n const trimmed = specifier.trim()\n const candidate = getExternalCandidate(trimmed, builtins)\n if (candidate === undefined) {\n return Option.none()\n }\n if (candidate.startsWith(\"@\")) {\n return normalizeScoped(candidate)\n }\n return normalizeUnscoped(candidate)\n}\n","import * as Either from \"effect/Either\"\nimport * as ts from \"typescript\"\n\n// CHANGE: parse import specifiers from JS/TS source using TypeScript AST\n// WHY: cover ESM, CJS, and .d.ts import forms with a single parser\n// QUOTE(TZ): \"Учитывает dist/**/*.d.ts\"\n// REF: req-parse-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀s: parse(s) = Right(p) → p.specifiers ⊆ Strings\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: dynamic imports are reported separately\n// COMPLEXITY: O(n) where n = AST size\n\nexport interface ParsedImports {\n readonly staticSpecifiers: ReadonlyArray<string>\n readonly dynamicImports: ReadonlyArray<string>\n readonly dynamicRequires: ReadonlyArray<string>\n}\n\nconst scriptKindFromFile = (fileName: string): ts.ScriptKind => {\n if (fileName.endsWith(\".d.ts\") || fileName.endsWith(\".ts\")) {\n return ts.ScriptKind.TS\n }\n if (fileName.endsWith(\".mjs\")) {\n return ts.ScriptKind.JS\n }\n if (fileName.endsWith(\".cjs\")) {\n return ts.ScriptKind.JS\n }\n return ts.ScriptKind.JS\n}\n\nconst getStringLiteral = (expression: ts.Expression): string | undefined => {\n if (ts.isStringLiteral(expression)) {\n return expression.text\n }\n if (ts.isNoSubstitutionTemplateLiteral(expression)) {\n return expression.text\n }\n return undefined\n}\n\nconst getImportTypeLiteral = (node: ts.ImportTypeNode): string | undefined => {\n const argument = node.argument\n if (ts.isLiteralTypeNode(argument)) {\n const literal = argument.literal\n if (ts.isStringLiteral(literal) || ts.isNoSubstitutionTemplateLiteral(literal)) {\n return literal.text\n }\n }\n return undefined\n}\n\nconst isRequireIdentifier = (expression: ts.Expression): expression is ts.Identifier =>\n ts.isIdentifier(expression) && expression.text === \"require\"\n\nconst isRequireResolve = (expression: ts.Expression): expression is ts.PropertyAccessExpression =>\n ts.isPropertyAccessExpression(expression) &&\n ts.isIdentifier(expression.expression) &&\n expression.expression.text === \"require\" &&\n expression.name.text === \"resolve\"\n\nconst isDynamicImport = (expression: ts.Expression): boolean => expression.kind === ts.SyntaxKind.ImportKeyword\n\nconst collectImportDeclaration = (\n node: ts.ImportDeclaration,\n staticSpecifiers: Array<string>\n): void => {\n if (ts.isStringLiteral(node.moduleSpecifier)) {\n staticSpecifiers.push(node.moduleSpecifier.text)\n }\n}\n\nconst collectExportDeclaration = (\n node: ts.ExportDeclaration,\n staticSpecifiers: Array<string>\n): void => {\n if (node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {\n staticSpecifiers.push(node.moduleSpecifier.text)\n }\n}\n\nconst collectImportType = (\n node: ts.ImportTypeNode,\n staticSpecifiers: Array<string>\n): void => {\n const literal = getImportTypeLiteral(node)\n if (literal !== undefined) {\n staticSpecifiers.push(literal)\n }\n}\n\nconst collectCallExpression = (\n node: ts.CallExpression,\n sourceFile: ts.SourceFile,\n staticSpecifiers: Array<string>,\n dynamicImports: Array<string>,\n dynamicRequires: Array<string>\n): void => {\n if (isDynamicImport(node.expression)) {\n const argument = node.arguments[0]\n const literal = argument ? getStringLiteral(argument) : undefined\n if (literal === undefined) {\n dynamicImports.push(node.getText(sourceFile))\n } else {\n staticSpecifiers.push(literal)\n }\n return\n }\n if (isRequireIdentifier(node.expression) || isRequireResolve(node.expression)) {\n const argument = node.arguments[0]\n const literal = argument ? getStringLiteral(argument) : undefined\n if (literal === undefined) {\n dynamicRequires.push(node.getText(sourceFile))\n } else {\n staticSpecifiers.push(literal)\n }\n }\n}\n\nconst parseSourceFile = (\n source: string,\n fileName: string\n): Either.Either<ts.SourceFile, string> => {\n if (!fileName.endsWith(\".d.ts\")) {\n const diagnostics = ts.transpileModule(source, {\n compilerOptions: { module: ts.ModuleKind.ESNext },\n fileName,\n reportDiagnostics: true\n }).diagnostics ?? []\n const parseDiagnostics = diagnostics.filter(\n (diag: ts.Diagnostic) => diag.category === ts.DiagnosticCategory.Error\n )\n if (parseDiagnostics.length > 0) {\n const message = parseDiagnostics\n .map((diag: ts.Diagnostic) => ts.flattenDiagnosticMessageText(diag.messageText, \"\\n\"))\n .join(\"; \")\n return Either.left(message)\n }\n }\n const sourceFile = ts.createSourceFile(\n fileName,\n source,\n ts.ScriptTarget.ESNext,\n true,\n scriptKindFromFile(fileName)\n )\n return Either.right(sourceFile)\n}\n\nconst collectImports = (sourceFile: ts.SourceFile): ParsedImports => {\n const staticSpecifiers: Array<string> = []\n const dynamicImports: Array<string> = []\n const dynamicRequires: Array<string> = []\n\n const visit = (node: ts.Node): void => {\n if (ts.isImportDeclaration(node)) {\n collectImportDeclaration(node, staticSpecifiers)\n ts.forEachChild(node, visit)\n return\n }\n if (ts.isExportDeclaration(node)) {\n collectExportDeclaration(node, staticSpecifiers)\n ts.forEachChild(node, visit)\n return\n }\n if (ts.isImportTypeNode(node)) {\n collectImportType(node, staticSpecifiers)\n ts.forEachChild(node, visit)\n return\n }\n if (ts.isCallExpression(node)) {\n collectCallExpression(node, sourceFile, staticSpecifiers, dynamicImports, dynamicRequires)\n ts.forEachChild(node, visit)\n return\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n return {\n staticSpecifiers,\n dynamicImports,\n dynamicRequires\n }\n}\n\n/**\n * Parse a source file and extract import specifiers.\n *\n * @param source - File contents.\n * @param fileName - File name (used for ScriptKind and diagnostics).\n * @returns Either with ParsedImports or parse error message.\n *\n * @pure true\n * @invariant all collected specifiers are string literals\n * @complexity O(n)\n */\nexport const parseImportsFromSource = (\n source: string,\n fileName: string\n): Either.Either<ParsedImports, string> => {\n const sourceEither = parseSourceFile(source, fileName)\n if (sourceEither._tag === \"Left\") {\n return Either.left(sourceEither.left)\n }\n return Either.right(collectImports(sourceEither.right))\n}\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { Path } from \"@effect/platform/Path\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { distNotFound, fileError, parseFileError } from \"../core/errors.js\"\nimport { compileGlobs, matchesAnyGlob } from \"../core/glob.js\"\nimport { normalizePackageName } from \"../core/normalize.js\"\nimport { parseImportsFromSource } from \"../core/parse.js\"\nimport type { ScanOutcome, Warning } from \"../core/types.js\"\n\n// CHANGE: implement dist scanning with Effect file system services\n// WHY: isolate IO while producing a deterministic ScanOutcome\n// QUOTE(TZ): \"Анализирует содержимое dist/ и строит множество внешних пакетов USED.\"\n// REF: req-scan-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀f ∈ filesScanned: imports(f) ⊆ USED ∪ warnings\n// PURITY: SHELL\n// EFFECT: Effect<ScanOutcome, AppError, FileSystem | Path>\n// INVARIANT: warnings include parse and dynamic import cases\n// COMPLEXITY: O(n + m) where n = files, m = total AST nodes\n\nexport interface ScanSettings {\n readonly distPath: string\n readonly patterns: ReadonlyArray<string>\n readonly ignorePatterns: ReadonlyArray<string>\n readonly strict: boolean\n readonly builtins: ReadonlySet<string>\n}\n\nconst normalizePath = (value: string): string => value.replaceAll(\"\\\\\", \"/\")\n\nconst matchesPatterns = (\n include: ReadonlyArray<RegExp>,\n ignore: ReadonlyArray<RegExp>,\n candidates: ReadonlyArray<string>\n): boolean => {\n const isIncluded = candidates.some((candidate) => matchesAnyGlob(include, candidate))\n if (!isIncluded) {\n return false\n }\n return !candidates.some((candidate) => matchesAnyGlob(ignore, candidate))\n}\n\nconst scanFile = (\n filePath: string,\n source: string,\n builtins: ReadonlySet<string>\n): {\n readonly used: ReadonlyArray<string>\n readonly warnings: ReadonlyArray<Warning>\n readonly importsFound: number\n} => {\n const parsedEither = parseImportsFromSource(source, filePath)\n if (parsedEither._tag === \"Left\") {\n const warning: Warning = {\n type: \"parse-error\",\n file: filePath,\n error: parsedEither.left\n }\n return { used: [], warnings: [warning], importsFound: 0 }\n }\n const parsed = parsedEither.right\n const warnings: Array<Warning> = []\n for (const expr of parsed.dynamicImports) {\n warnings.push({ type: \"dynamic-import\", file: filePath, expr })\n }\n for (const expr of parsed.dynamicRequires) {\n warnings.push({ type: \"dynamic-require\", file: filePath, expr })\n }\n const used = parsed.staticSpecifiers\n .map((specifier) => normalizePackageName(specifier, builtins))\n .filter((option) => Option.isSome(option))\n .map((option) => option.value)\n return { used, warnings, importsFound: parsed.staticSpecifiers.length }\n}\n\nconst mapFsError = (error: PlatformError): AppError => fileError(String(error))\n\nconst ensureDistExists = (\n fs: FileSystemService,\n distPath: string\n): Effect.Effect<void, AppError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(distPath).pipe(Effect.mapError(mapFsError)))\n if (!exists) {\n return yield* _(Effect.fail(distNotFound(distPath)))\n }\n })\n\nconst readDistEntries = (\n fs: FileSystemService,\n distPath: string\n): Effect.Effect<ReadonlyArray<string>, AppError> =>\n fs.readDirectory(distPath, { recursive: true }).pipe(Effect.mapError(mapFsError))\n\ninterface FilterEntriesInput {\n readonly path: PathService\n readonly cwd: string\n readonly distPath: string\n readonly entries: ReadonlyArray<string>\n readonly include: ReadonlyArray<RegExp>\n readonly ignore: ReadonlyArray<RegExp>\n}\n\nconst filterEntries = (input: FilterEntriesInput): ReadonlyArray<string> => {\n const candidates = input.entries.map((entry) => input.path.join(input.distPath, entry))\n return candidates.filter((absolutePath) => {\n const relativeToCwd = normalizePath(input.path.relative(input.cwd, absolutePath))\n const relativeToDist = normalizePath(input.path.relative(input.distPath, absolutePath))\n const absolute = normalizePath(absolutePath)\n return matchesPatterns(input.include, input.ignore, [absolute, relativeToCwd, relativeToDist])\n })\n}\n\nconst scanFiles = (\n fs: FileSystemService,\n files: ReadonlyArray<string>,\n settings: ScanSettings\n): Effect.Effect<ScanOutcome, AppError> =>\n Effect.gen(function*(_) {\n const initialUsed = new Set<string>()\n const warnings: Array<Warning> = []\n let importsFound = 0\n\n for (const filePath of files) {\n const source = yield* _(fs.readFileString(filePath).pipe(Effect.mapError(mapFsError)))\n const fileResult = scanFile(filePath, source, settings.builtins)\n if (settings.strict && fileResult.warnings.some((warning) => warning.type === \"parse-error\")) {\n const parseWarning = fileResult.warnings.find((warning) => warning.type === \"parse-error\")\n if (parseWarning) {\n return yield* _(Effect.fail(parseFileError(parseWarning.file, parseWarning.error)))\n }\n }\n for (const pkg of fileResult.used) {\n initialUsed.add(pkg)\n }\n for (const warning of fileResult.warnings) {\n warnings.push(warning)\n }\n importsFound += fileResult.importsFound\n }\n\n return {\n used: initialUsed,\n warnings,\n stats: {\n filesScanned: files.length,\n importsFound\n }\n }\n })\n\nexport const scanDist = (\n settings: ScanSettings\n): Effect.Effect<ScanOutcome, AppError, FileSystemService | PathService> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem)\n const path = yield* _(Path)\n\n yield* _(ensureDistExists(fs, settings.distPath))\n const cwd = yield* _(Effect.sync(() => process.cwd()))\n const includeGlobs = compileGlobs(settings.patterns)\n const ignoreGlobs = compileGlobs(settings.ignorePatterns)\n\n const entries = yield* _(readDistEntries(fs, settings.distPath))\n const filtered = filterEntries({\n path,\n cwd,\n distPath: settings.distPath,\n entries,\n include: includeGlobs,\n ignore: ignoreGlobs\n })\n return yield* _(scanFiles(fs, filtered, settings))\n })\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { Path } from \"@effect/platform/Path\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Effect, Match } from \"effect\"\nimport type * as Either from \"effect/Either\"\nimport * as Exit from \"effect/Exit\"\n\nimport type { CliArgs } from \"../core/cli.js\"\nimport { parseCliArgs } from \"../core/cli.js\"\nimport { resolveConfig } from \"../core/config.js\"\nimport type { AppError } from \"../core/errors.js\"\nimport type { PrunePlan } from \"../core/prune.js\"\nimport { buildPrunePlan } from \"../core/prune.js\"\nimport { buildReport, renderHumanReport, renderJsonReport } from \"../core/report.js\"\nimport type { Report } from \"../core/types.js\"\nimport { loadBuiltinModules } from \"../shell/builtins.js\"\nimport { runCommand } from \"../shell/command.js\"\nimport { loadConfigFile } from \"../shell/config-file.js\"\nimport { readPackageJson, writePackageJson } from \"../shell/package-json.js\"\nimport { ensureBackup, restorePackageJson } from \"../shell/release.js\"\nimport { scanDist } from \"../shell/scan.js\"\n\n// CHANGE: orchestrate CLI modes with functional core + imperative shell\n// WHY: enforce single entrypoint with typed errors and deterministic outputs\n// QUOTE(TZ): \"scan/apply/release/restore\"\n// REF: req-program-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀mode: run(mode) returns exitCode ∈ {0,1,2,...}\n// PURITY: SHELL\n// EFFECT: Effect<ProgramResult, AppError, Services>\n// INVARIANT: report emitted at most once\n// COMPLEXITY: O(n)\n\nexport interface ProgramResult {\n readonly report: Report\n readonly exitCode: number\n}\n\ntype ScanEnv = FileSystemService | PathService\ntype ProgramEnv = FileSystemService | PathService | CommandExecutor\n\ninterface AnalyzeResult {\n readonly report: Report\n readonly plan: PrunePlan\n}\n\nconst emptyReport: Report = {\n used: [],\n unused: {\n dependencies: [],\n devDependencies: [],\n optionalDependencies: [],\n peerDependencies: []\n },\n keptByRule: [],\n warnings: [],\n stats: { filesScanned: 0, importsFound: 0 }\n}\n\nconst hasUnused = (report: Report): boolean =>\n report.unused.dependencies.length > 0 || report.unused.devDependencies.length > 0\n\nconst writeStdout = (payload: string): Effect.Effect<void> =>\n Effect.sync(() => {\n process.stdout.write(payload.endsWith(\"\\n\") ? payload : `${payload}\\n`)\n })\n\nconst fromEither = <A, E>(either: Either.Either<A, E>): Effect.Effect<A, E> =>\n either._tag === \"Left\" ? Effect.fail(either.left) : Effect.succeed(either.right)\n\nconst emitReport = (report: Report, json: boolean, silent: boolean): Effect.Effect<void> => {\n if (silent) {\n return Effect.void\n }\n const payload = json ? renderJsonReport(report) : renderHumanReport(report)\n return writeStdout(payload)\n}\n\nconst runReleaseCommand = (\n cli: CliArgs,\n plan: PrunePlan,\n backupPath: string\n): Effect.Effect<number, AppError, FileSystemService | CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(ensureBackup(cli.packagePath, backupPath))\n yield* _(writePackageJson(cli.packagePath, plan.nextPackageJson))\n const cwd = yield* _(Effect.sync(() => process.cwd()))\n const exit = yield* _(Effect.exit(runCommand(cli.releaseCommand ?? \"\", cwd)))\n yield* _(restorePackageJson(cli.packagePath, backupPath))\n return yield* _(\n Exit.matchEffect(exit, {\n onFailure: (cause) => Effect.failCause(cause),\n onSuccess: (value) => Effect.succeed(value)\n })\n )\n })\n\nconst analyzeProject = (\n cli: CliArgs\n): Effect.Effect<AnalyzeResult, AppError, ScanEnv> =>\n Effect.gen(function*(_) {\n const configPath = cli.ignorePath ?? \"./.dist-deps-prune.json\"\n const configFile = yield* _(loadConfigFile(configPath, cli.ignorePathExplicit))\n const resolved = resolveConfig(cli, configFile)\n const builtins = yield* _(loadBuiltinModules)\n const scan = yield* _(\n scanDist({\n distPath: cli.dist,\n patterns: resolved.patterns,\n ignorePatterns: resolved.ignorePatterns,\n strict: cli.strict,\n builtins\n })\n )\n const pkg = yield* _(readPackageJson(cli.packagePath))\n const plan = buildPrunePlan(pkg, {\n used: scan.used,\n keep: new Set(resolved.keep),\n pruneDev: resolved.pruneDev,\n pruneOptional: resolved.pruneOptional,\n conservative: cli.conservative,\n hasUncertainty: scan.warnings.length > 0\n })\n const report = buildReport(scan, plan)\n return { report, plan }\n })\n\nconst handleRestore = (\n cli: CliArgs,\n backupPath: string\n): Effect.Effect<ProgramResult, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n yield* _(restorePackageJson(cli.packagePath, backupPath))\n yield* _(emitReport(emptyReport, cli.json, cli.silent))\n return { report: emptyReport, exitCode: 0 }\n })\n\nconst handleScan = (\n cli: CliArgs\n): Effect.Effect<ProgramResult, AppError, ScanEnv> =>\n Effect.gen(function*(_) {\n const { report } = yield* _(analyzeProject(cli))\n yield* _(emitReport(report, cli.json, cli.silent))\n const exitCode = cli.failOnUnused && hasUnused(report) ? 2 : 0\n return { report, exitCode }\n })\n\nconst handleApply = (\n cli: CliArgs\n): Effect.Effect<ProgramResult, AppError, ScanEnv> =>\n Effect.gen(function*(_) {\n const { plan, report } = yield* _(analyzeProject(cli))\n if (cli.write) {\n yield* _(writePackageJson(cli.packagePath, plan.nextPackageJson))\n }\n yield* _(emitReport(report, cli.json, cli.silent))\n return { report, exitCode: 0 }\n })\n\nconst handleRelease = (\n cli: CliArgs,\n backupPath: string\n): Effect.Effect<ProgramResult, AppError, ProgramEnv> =>\n Effect.gen(function*(_) {\n const { plan, report } = yield* _(analyzeProject(cli))\n if (cli.releaseCommand) {\n const exitCode = yield* _(runReleaseCommand(cli, plan, backupPath))\n yield* _(emitReport(report, cli.json, cli.silent))\n return { report, exitCode }\n }\n yield* _(ensureBackup(cli.packagePath, backupPath))\n yield* _(writePackageJson(cli.packagePath, plan.nextPackageJson))\n yield* _(emitReport(report, cli.json, cli.silent))\n if (!cli.json && !cli.silent) {\n yield* _(\n writeStdout(\n `package.json modified for release. Restore with: dist-deps-prune restore --package ${cli.packagePath}`\n )\n )\n }\n return { report, exitCode: 0 }\n })\n\nconst executeCommand = (\n cli: CliArgs,\n backupPath: string\n): Effect.Effect<ProgramResult, AppError, ProgramEnv> =>\n Match.value(cli.command).pipe(\n Match.when(\"restore\", () => handleRestore(cli, backupPath)),\n Match.when(\"scan\", () => handleScan(cli)),\n Match.when(\"apply\", () => handleApply(cli)),\n Match.when(\"release\", () => handleRelease(cli, backupPath)),\n Match.exhaustive\n )\n\n/**\n * Run CLI program with the provided argv.\n *\n * @param argv - process.argv array.\n * @returns ProgramResult with report and exit code.\n *\n * @pure false\n * @effect FileSystem, Path, CommandExecutor, Console\n * @invariant exitCode is deterministic for fixed inputs\n * @complexity O(n)\n */\nexport const runCli = (\n argv: ReadonlyArray<string>\n): Effect.Effect<\n ProgramResult,\n AppError,\n ProgramEnv\n> =>\n Effect.gen(function*(_) {\n const cli = yield* _(fromEither(parseCliArgs(argv)))\n const path = yield* _(Path)\n const backupPath = path.join(path.dirname(cli.packagePath), \".package.json.release.bak\")\n return yield* _(executeCommand(cli, backupPath))\n })\n","import { NodeContext, NodeRuntime } from \"@effect/platform-node\"\nimport { Effect } from \"effect\"\n\nimport { runCli } from \"./program.js\"\n\n// CHANGE: wire CLI program into Node runtime with proper teardown\n// WHY: execute effects with platform services and typed error handling\n// QUOTE(TZ): \"CLI-тулу\"\n// REF: req-main-1\n// SOURCE: n/a\n// FORMAT THEOREM: runMain(program) terminates with exitCode from ProgramResult\n// PURITY: SHELL\n// EFFECT: Effect<void, never, NodeContext>\n// INVARIANT: non-zero exit codes terminate the process\n// COMPLEXITY: O(1)\n\nconst main = Effect.gen(function*(_) {\n const result = yield* _(runCli(process.argv))\n if (result.exitCode !== 0) {\n yield* _(\n Effect.sync(() => {\n process.exitCode = result.exitCode\n })\n )\n }\n})\n\nNodeRuntime.runMain(Effect.provide(main, NodeContext.layer))\n"],"names":["Schema","Effect"],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sources":["../src/core/cli.ts","../src/core/config.ts","../src/core/errors.ts","../src/core/invariants.ts","../src/core/package-json.ts","../src/core/prune.ts","../src/core/report.ts","../src/shell/builtins.ts","../src/shell/command.ts","../src/shell/config-file.ts","../src/shell/package-json.ts","../src/shell/release.ts","../src/core/glob.ts","../src/core/normalize.ts","../src/core/parse.ts","../src/shell/scan.ts","../src/app/program.ts","../src/app/main.ts"],"sourcesContent":["import { Match } from \"effect\"\nimport * as Either from \"effect/Either\"\n\n// CHANGE: implement deterministic CLI parsing for dist-deps-prune\n// WHY: keep CLI decoding pure and testable at the boundary\n// QUOTE(TZ): \"CLI интерфейс (финальная спецификация)\"\n// REF: req-cli-parse-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀argv: parse(argv) = Right(args) → args.command ∈ Commands\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: unknown flags are rejected\n// COMPLEXITY: O(n) where n = argv length\n\nexport type CliCommand = \"scan\" | \"apply\" | \"release\" | \"restore\"\n\nexport interface CliArgs {\n readonly command: CliCommand\n readonly dist: string\n readonly packagePath: string\n readonly ignorePath: string | undefined\n readonly ignorePathExplicit: boolean\n readonly keep: ReadonlyArray<string>\n readonly json: boolean\n readonly silent: boolean\n readonly strict: boolean\n readonly conservative: boolean\n readonly failOnUnused: boolean\n readonly patterns: ReadonlyArray<string> | undefined\n readonly pruneDev: boolean | undefined\n readonly pruneOptional: boolean | undefined\n readonly write: boolean\n readonly releaseCommand: string | undefined\n}\n\nexport type CliError = { readonly _tag: \"CliError\"; readonly message: string }\n\nconst cliError = (message: string): CliError => ({ _tag: \"CliError\", message })\n\nconst isFlag = (value: string): boolean => value.startsWith(\"-\")\n\nconst splitList = (value: string): ReadonlyArray<string> =>\n value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n\nconst parseBoolean = (value: string): Either.Either<boolean, CliError> => {\n if (value === \"true\" || value === \"1\") {\n return Either.right(true)\n }\n if (value === \"false\" || value === \"0\") {\n return Either.right(false)\n }\n return Either.left(cliError(`Invalid boolean value: ${value}`))\n}\n\nconst parseCommand = (value: string): Either.Either<CliCommand, CliError> =>\n Match.value(value).pipe(\n Match.when(\"scan\", () => Either.right<CliCommand>(\"scan\")),\n Match.when(\"apply\", () => Either.right<CliCommand>(\"apply\")),\n Match.when(\"release\", () => Either.right<CliCommand>(\"release\")),\n Match.when(\"restore\", () => Either.right<CliCommand>(\"restore\")),\n Match.orElse(() => Either.left(cliError(`Unknown command: ${value}`)))\n )\n\nconst defaultArgs = (command: CliCommand): CliArgs => ({\n command,\n dist: \"./dist\",\n packagePath: \"./package.json\",\n ignorePath: undefined,\n ignorePathExplicit: false,\n keep: [],\n json: false,\n silent: false,\n strict: false,\n conservative: false,\n failOnUnused: false,\n patterns: undefined,\n pruneDev: undefined,\n pruneOptional: undefined,\n write: false,\n releaseCommand: undefined\n})\n\nconst readFlagValue = (\n flagName: string,\n inlineValue: string | undefined,\n nextValue: string | undefined\n): Either.Either<string, CliError> => {\n if (inlineValue !== undefined) {\n return Either.right(inlineValue)\n }\n if (nextValue === undefined || isFlag(nextValue)) {\n return Either.left(cliError(`Missing value for --${flagName}`))\n }\n return Either.right(nextValue)\n}\n\nconst setParsedFlag = (\n next: CliArgs,\n consumed: number\n): Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError> => Either.right({ next, consumed })\n\nconst parseValueFlag = (\n flagName: string,\n current: CliArgs,\n inlineValue: string | undefined,\n nextValue: string | undefined,\n update: (args: CliArgs, value: string) => CliArgs\n): Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError> =>\n Either.map(readFlagValue(flagName, inlineValue, nextValue), (value) => ({\n next: update(current, value),\n consumed: inlineValue === undefined ? 2 : 1\n }))\n\nconst parseOptionalBooleanFlag = (\n current: CliArgs,\n inlineValue: string | undefined,\n nextValue: string | undefined,\n update: (args: CliArgs, value: boolean) => CliArgs\n): Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError> => {\n const useNext = inlineValue === undefined && nextValue !== undefined && !isFlag(nextValue)\n const nextValueResolved = inlineValue ?? (useNext ? nextValue : \"true\")\n return Either.map(parseBoolean(nextValueResolved), (value) => ({\n next: update(current, value),\n consumed: useNext ? 2 : 1\n }))\n}\n\ntype FlagParser = (\n current: CliArgs,\n inlineValue: string | undefined,\n nextValue: string | undefined\n) => Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError>\n\nconst flagParsers: Record<string, FlagParser> = {\n json: (current) => setParsedFlag({ ...current, json: true }, 1),\n silent: (current) => setParsedFlag({ ...current, silent: true }, 1),\n strict: (current) => setParsedFlag({ ...current, strict: true }, 1),\n conservative: (current) => setParsedFlag({ ...current, conservative: true }, 1),\n \"fail-on-unused\": (current) => setParsedFlag({ ...current, failOnUnused: true }, 1),\n write: (current, inlineValue, nextValue) =>\n parseOptionalBooleanFlag(current, inlineValue, nextValue, (args, value) => ({\n ...args,\n write: value\n })),\n dist: (current, inlineValue, nextValue) =>\n parseValueFlag(\"dist\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n dist: value\n })),\n package: (current, inlineValue, nextValue) =>\n parseValueFlag(\"package\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n packagePath: value\n })),\n ignore: (current, inlineValue, nextValue) =>\n parseValueFlag(\"ignore\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n ignorePath: value,\n ignorePathExplicit: true\n })),\n keep: (current, inlineValue, nextValue) =>\n parseValueFlag(\"keep\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n keep: splitList(value)\n })),\n patterns: (current, inlineValue, nextValue) =>\n parseValueFlag(\"patterns\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n patterns: splitList(value)\n })),\n \"prune-dev\": (current, inlineValue, nextValue) =>\n parseOptionalBooleanFlag(current, inlineValue, nextValue, (args, value) => ({\n ...args,\n pruneDev: value\n })),\n \"prune-optional\": (current, inlineValue, nextValue) =>\n parseOptionalBooleanFlag(current, inlineValue, nextValue, (args, value) => ({\n ...args,\n pruneOptional: value\n })),\n command: (current, inlineValue, nextValue) =>\n parseValueFlag(\"command\", current, inlineValue, nextValue, (args, value) => ({\n ...args,\n releaseCommand: value\n }))\n}\n\nconst parseFlag = (\n raw: string,\n nextValue: string | undefined,\n current: CliArgs\n): Either.Either<{ readonly next: CliArgs; readonly consumed: number }, CliError> => {\n if (!raw.startsWith(\"--\")) {\n return Either.left(cliError(`Unknown flag: ${raw}`))\n }\n const [name = \"\", inlineValue] = raw.slice(2).split(\"=\", 2)\n const parser = flagParsers[name]\n if (parser === undefined) {\n return Either.left(cliError(`Unknown flag: --${name}`))\n }\n return parser(current, inlineValue === undefined ? undefined : inlineValue, nextValue)\n}\n\ninterface ParsedCommand {\n readonly command: CliCommand\n readonly startIndex: number\n}\n\nconst parseCommandFromArgs = (\n rawArgs: ReadonlyArray<string>\n): Either.Either<ParsedCommand, CliError> => {\n const first = rawArgs[0]\n if (first === undefined || isFlag(first)) {\n return Either.right({ command: \"scan\", startIndex: 0 })\n }\n const commandEither = parseCommand(first)\n if (Either.isLeft(commandEither)) {\n return Either.left(commandEither.left)\n }\n return Either.right({ command: commandEither.right, startIndex: 1 })\n}\n\nconst parseFlags = (\n rawArgs: ReadonlyArray<string>,\n startIndex: number,\n initial: CliArgs\n): Either.Either<CliArgs, CliError> => {\n let args = initial\n let index = startIndex\n while (index < rawArgs.length) {\n const current = rawArgs[index]\n if (current === undefined) {\n return Either.left(cliError(\"Unexpected end of arguments\"))\n }\n if (!isFlag(current)) {\n return Either.left(cliError(`Unexpected positional argument: ${current}`))\n }\n const nextValue = rawArgs[index + 1]\n const parsed = parseFlag(current, nextValue, args)\n if (Either.isLeft(parsed)) {\n return Either.left(parsed.left)\n }\n args = parsed.right.next\n index += parsed.right.consumed\n }\n return Either.right(args)\n}\n\n/**\n * Parse CLI arguments into a typed configuration.\n *\n * @param argv - Raw process.argv array.\n * @returns Either with parsed CliArgs or CliError.\n *\n * @pure true\n * @invariant command defaults to scan when omitted\n * @complexity O(n)\n */\nexport const parseCliArgs = (\n argv: ReadonlyArray<string>\n): Either.Either<CliArgs, CliError> => {\n const rawArgs = argv.slice(2)\n const commandEither = parseCommandFromArgs(rawArgs)\n if (Either.isLeft(commandEither)) {\n return Either.left(commandEither.left)\n }\n const parsed = commandEither.right\n return parseFlags(rawArgs, parsed.startIndex, defaultArgs(parsed.command))\n}\n","import type { CliArgs } from \"./cli.js\"\n\n// CHANGE: define config merging rules and defaults\n// WHY: ensure CLI flags override config file and defaults deterministically\n// QUOTE(TZ): \"Приоритет: CLI-флаги > конфиг > дефолты.\"\n// REF: req-config-merge-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀k: resolve(cli, cfg).k = cli.k ?? cfg.k ?? default(k)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: resolved patterns list is non-empty\n// COMPLEXITY: O(n)/O(1)\n\nexport interface FileConfig {\n readonly keep?: ReadonlyArray<string>\n readonly ignorePatterns?: ReadonlyArray<string>\n readonly pruneDev?: boolean\n readonly pruneOptional?: boolean\n readonly patterns?: ReadonlyArray<string>\n}\n\nexport interface ResolvedConfig {\n readonly patterns: ReadonlyArray<string>\n readonly ignorePatterns: ReadonlyArray<string>\n readonly keep: ReadonlyArray<string>\n readonly pruneDev: boolean\n readonly pruneOptional: boolean\n}\n\nconst unique = (values: ReadonlyArray<string>): ReadonlyArray<string> => {\n const seen = new Set<string>()\n const result: Array<string> = []\n for (const value of values) {\n if (!seen.has(value)) {\n seen.add(value)\n result.push(value)\n }\n }\n return result\n}\n\nexport const defaultPatterns = (distPath: string): ReadonlyArray<string> => [\n `${distPath}/**/*.js`,\n `${distPath}/**/*.mjs`,\n `${distPath}/**/*.cjs`,\n `${distPath}/**/*.d.ts`\n]\n\nconst resolvePatterns = (cli: CliArgs, fileConfig: FileConfig | undefined): ReadonlyArray<string> =>\n cli.patterns ?? fileConfig?.patterns ?? defaultPatterns(cli.dist)\n\nconst resolveIgnorePatterns = (fileConfig: FileConfig | undefined): ReadonlyArray<string> =>\n fileConfig?.ignorePatterns ?? []\n\nconst resolveKeep = (cli: CliArgs, fileConfig: FileConfig | undefined): ReadonlyArray<string> =>\n unique([...(fileConfig?.keep ?? []), ...cli.keep])\n\nconst resolvePruneDev = (cli: CliArgs, fileConfig: FileConfig | undefined): boolean =>\n cli.pruneDev ?? fileConfig?.pruneDev ?? (cli.command === \"release\")\n\nconst resolvePruneOptional = (cli: CliArgs, fileConfig: FileConfig | undefined): boolean =>\n cli.pruneOptional ?? fileConfig?.pruneOptional ?? false\n\n/**\n * Resolve the effective config from CLI flags, file config, and defaults.\n *\n * @param cli - Parsed CLI arguments.\n * @param fileConfig - Optional config loaded from .dist-deps-prune.json.\n * @returns Resolved configuration.\n *\n * @pure true\n * @invariant patterns length ≥ 1\n * @complexity O(n)\n */\nexport const resolveConfig = (\n cli: CliArgs,\n fileConfig: FileConfig | undefined\n): ResolvedConfig => {\n return {\n patterns: resolvePatterns(cli, fileConfig),\n ignorePatterns: resolveIgnorePatterns(fileConfig),\n keep: resolveKeep(cli, fileConfig),\n pruneDev: resolvePruneDev(cli, fileConfig),\n pruneOptional: resolvePruneOptional(cli, fileConfig)\n }\n}\n","import type { CliError } from \"./cli.js\"\nimport type { PackageJsonError } from \"./package-json.js\"\n\n// CHANGE: unify error algebra for the CLI tool\n// WHY: provide typed failures for program flow and exit codes\n// QUOTE(TZ): \"Коды возврата: 1 — ошибка выполнения\"\n// REF: req-errors-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀e ∈ AppError: e._tag is stable and exhaustively matchable\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: error tags are unique\n// COMPLEXITY: O(1)/O(1)\n\nexport type ConfigError = { readonly _tag: \"ConfigError\"; readonly message: string }\nexport type FileError = { readonly _tag: \"FileError\"; readonly message: string }\nexport type DistNotFound = { readonly _tag: \"DistNotFound\"; readonly path: string }\nexport type ParseFileError = { readonly _tag: \"ParseError\"; readonly file: string; readonly error: string }\nexport type CommandFailed = {\n readonly _tag: \"CommandFailed\"\n readonly command: string\n readonly exitCode: number\n}\nexport type RestoreError = { readonly _tag: \"RestoreError\"; readonly message: string }\nexport type DevDependencyInDist = {\n readonly _tag: \"DevDependencyInDist\"\n readonly packages: ReadonlyArray<string>\n readonly message: string\n}\n\nexport type AppError =\n | CliError\n | PackageJsonError\n | ConfigError\n | FileError\n | DistNotFound\n | ParseFileError\n | CommandFailed\n | RestoreError\n | DevDependencyInDist\n\nexport const configError = (message: string): ConfigError => ({\n _tag: \"ConfigError\",\n message\n})\n\nexport const fileError = (message: string): FileError => ({\n _tag: \"FileError\",\n message\n})\n\nexport const distNotFound = (path: string): DistNotFound => ({\n _tag: \"DistNotFound\",\n path\n})\n\nexport const parseFileError = (file: string, error: string): ParseFileError => ({\n _tag: \"ParseError\",\n file,\n error\n})\n\nexport const commandFailed = (command: string, exitCode: number): CommandFailed => ({\n _tag: \"CommandFailed\",\n command,\n exitCode\n})\n\nexport const restoreError = (message: string): RestoreError => ({\n _tag: \"RestoreError\",\n message\n})\n\nexport const devDependencyInDist = (\n packages: ReadonlyArray<string>\n): DevDependencyInDist => ({\n _tag: \"DevDependencyInDist\",\n packages,\n message: `dist imports packages from devDependencies: ${packages.join(\", \")}\\n` +\n \"Move them to dependencies (runtime) or peerDependencies (plugin/host), then retry.\"\n})\n","import type { PackageJson } from \"./package-json.js\"\n\n// CHANGE: add invariant checks for dist-used dev-only dependencies\n// WHY: prevent runtime imports from staying in devDependencies when not declared elsewhere\n// QUOTE(TZ): \"used in dist and dev-only dependencies must be empty\"\n// REF: req-guard-devdeps-1\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in result: p in used and p in devDependencies and p not in runtime deps\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: result is sorted and unique\n// COMPLEXITY: O(n log n)\n\nconst sortStrings = (values: ReadonlyArray<string>): ReadonlyArray<string> =>\n values.toSorted((left, right) => left.localeCompare(right))\n\nconst listKeys = (map: Readonly<Record<string, string>> | undefined): ReadonlyArray<string> =>\n map === undefined ? [] : Object.keys(map)\n\nconst buildRuntimeSet = (pkg: PackageJson): ReadonlySet<string> =>\n new Set([\n ...listKeys(pkg.dependencies),\n ...listKeys(pkg.peerDependencies),\n ...listKeys(pkg.optionalDependencies)\n ])\n\n/**\n * List dev-only dependencies that are actually imported by dist outputs.\n *\n * @param used - Set of package names used in dist.\n * @param pkg - Validated package.json.\n * @returns Sorted list of devDependencies that appear in used and are not in runtime deps.\n *\n * @pure true\n * @invariant result subset of used and keys(pkg.devDependencies) minus runtime deps\n * @complexity O(n log n)\n */\nexport const listDevDependenciesUsedInDist = (\n used: ReadonlySet<string>,\n pkg: PackageJson\n): ReadonlyArray<string> => {\n const devDependencies = pkg.devDependencies\n if (devDependencies === undefined) {\n return []\n }\n const runtime = buildRuntimeSet(pkg)\n const hits = Object.keys(devDependencies).filter((name) => used.has(name) && !runtime.has(name))\n return sortStrings(hits)\n}\n","import * as Either from \"effect/Either\"\nimport type { Json, JsonObject } from \"./json.js\"\n\n// CHANGE: formalize the PackageJson domain and dependency maps\n// WHY: ensure dependency pruning preserves non-dependency JSON fields safely\n// QUOTE(TZ): \"Сравнивает USED с package.json (dependencies/devDependencies/optional/peer).\"\n// REF: req-package-json-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀k ∈ DepKeys: value(k) ∈ String\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: DependencyMap values are semantic version strings\n// COMPLEXITY: O(1)/O(1)\n\nexport type DependencyMap = Readonly<Record<string, string>>\n\nexport interface PackageJson extends JsonObject {\n readonly dependencies?: DependencyMap\n readonly devDependencies?: DependencyMap\n readonly optionalDependencies?: DependencyMap\n readonly peerDependencies?: DependencyMap\n}\n\ninterface DependencyMaps {\n readonly dependencies?: DependencyMap\n readonly devDependencies?: DependencyMap\n readonly optionalDependencies?: DependencyMap\n readonly peerDependencies?: DependencyMap\n}\n\nexport type PackageJsonError = { readonly _tag: \"PackageJsonError\"; readonly message: string }\n\nconst makePackageJsonError = (message: string): PackageJsonError => ({\n _tag: \"PackageJsonError\",\n message\n})\n\nconst isRecord = (value: Json): value is JsonObject =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst toDependencyMap = (\n fieldName: string,\n value: Json | undefined\n): Either.Either<DependencyMap | undefined, PackageJsonError> => {\n if (value === undefined) {\n const empty: DependencyMap | undefined = undefined\n return Either.right(empty)\n }\n if (!isRecord(value)) {\n return Either.left(makePackageJsonError(`${fieldName} must be an object`))\n }\n const entries = Object.entries(value)\n const result: Record<string, string> = {}\n for (const [key, rawValue] of entries) {\n if (typeof rawValue !== \"string\") {\n return Either.left(makePackageJsonError(`${fieldName}.${key} must be a string`))\n }\n result[key] = rawValue\n }\n return Either.right(result)\n}\n\ntype DependencyField = { readonly key: keyof DependencyMaps; readonly label: string }\n\nconst dependencyFields: ReadonlyArray<DependencyField> = [\n { key: \"dependencies\", label: \"dependencies\" },\n { key: \"devDependencies\", label: \"devDependencies\" },\n { key: \"optionalDependencies\", label: \"optionalDependencies\" },\n { key: \"peerDependencies\", label: \"peerDependencies\" }\n]\n\nconst readDependencyMaps = (value: JsonObject): Either.Either<DependencyMaps, PackageJsonError> => {\n const result: Record<string, DependencyMap> = {}\n for (const field of dependencyFields) {\n const decoded = toDependencyMap(field.label, value[field.key])\n if (Either.isLeft(decoded)) {\n return Either.left(decoded.left)\n }\n if (decoded.right !== undefined) {\n result[field.key] = decoded.right\n }\n }\n return Either.right(result)\n}\n\n/**\n * Decode a JsonObject into a PackageJson with validated dependency maps.\n *\n * @param value - Parsed JSON object representing package.json.\n * @returns PackageJson or a typed PackageJsonError.\n *\n * @pure true\n * @invariant dependency values are strings\n * @complexity O(n) where n = number of dependency entries\n */\nexport const decodePackageJson = (\n value: JsonObject\n): Either.Either<PackageJson, PackageJsonError> => {\n const mapsEither = readDependencyMaps(value)\n if (Either.isLeft(mapsEither)) {\n return Either.left(mapsEither.left)\n }\n const maps = mapsEither.right\n const packageJson: PackageJson = {\n ...value,\n ...maps\n }\n return Either.right(packageJson)\n}\n\nexport const omitDependencyFields = (value: JsonObject): JsonObject => {\n const result: Record<string, Json> = {}\n for (const [key, entry] of Object.entries(value)) {\n if (\n key !== \"dependencies\" &&\n key !== \"devDependencies\" &&\n key !== \"optionalDependencies\" &&\n key !== \"peerDependencies\"\n ) {\n result[key] = entry\n }\n }\n return result\n}\n\nexport const isJsonObject = (value: Json): value is JsonObject =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n","import type { DependencyMap, PackageJson } from \"./package-json.js\"\nimport { omitDependencyFields } from \"./package-json.js\"\nimport type { UnusedByKind } from \"./types.js\"\n\n// CHANGE: implement dependency pruning plan calculation\n// WHY: provide deterministic diff generation and conservative safety mode\n// QUOTE(TZ): \"Удалять из dependencies всё, что отсутствует в USED\"\n// REF: req-prune-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀d ∈ prunable: d ∉ USED ∧ d ∉ KEEP\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: peerDependencies are never removed\n// COMPLEXITY: O(n) where n = total dependencies\n\nexport interface PruneOptions {\n readonly used: ReadonlySet<string>\n readonly keep: ReadonlySet<string>\n readonly pruneDev: boolean\n readonly pruneOptional: boolean\n readonly conservative: boolean\n readonly hasUncertainty: boolean\n}\n\nexport interface PrunePlan {\n readonly unused: UnusedByKind\n readonly prunable: UnusedByKind\n readonly keptByRule: ReadonlyArray<string>\n readonly nextPackageJson: PackageJson\n}\n\nconst emptyUnused: UnusedByKind = {\n dependencies: [],\n devDependencies: [],\n optionalDependencies: [],\n peerDependencies: []\n}\n\nconst listKeys = (map: DependencyMap | undefined): ReadonlyArray<string> => map === undefined ? [] : Object.keys(map)\n\nconst filterMap = (\n map: DependencyMap | undefined,\n remove: ReadonlySet<string>\n): DependencyMap | undefined => {\n if (map === undefined) {\n return undefined\n }\n const entries = Object.entries(map).filter(([name]) => !remove.has(name))\n if (entries.length === 0) {\n return undefined\n }\n const result: Record<string, string> = {}\n for (const [name, version] of entries) {\n result[name] = version\n }\n return result\n}\n\nconst computeUnused = (\n map: DependencyMap | undefined,\n used: ReadonlySet<string>,\n keep: ReadonlySet<string>\n): ReadonlyArray<string> => listKeys(map).filter((name) => !used.has(name) && !keep.has(name))\n\nconst computeUnusedByKind = (pkg: PackageJson, options: PruneOptions): UnusedByKind => ({\n dependencies: computeUnused(pkg.dependencies, options.used, options.keep),\n devDependencies: computeUnused(pkg.devDependencies, options.used, options.keep),\n optionalDependencies: computeUnused(pkg.optionalDependencies, options.used, options.keep),\n peerDependencies: computeUnused(pkg.peerDependencies, options.used, options.keep)\n})\n\nconst computePrunableByKind = (unused: UnusedByKind, options: PruneOptions): UnusedByKind => {\n const hasUncertainty = options.conservative && options.hasUncertainty\n return {\n ...emptyUnused,\n dependencies: hasUncertainty ? [] : unused.dependencies,\n devDependencies: options.pruneDev && !hasUncertainty ? unused.devDependencies : [],\n optionalDependencies: options.pruneOptional && !hasUncertainty ? unused.optionalDependencies : [],\n peerDependencies: []\n }\n}\n\nconst computeKeptByRule = (\n unused: UnusedByKind,\n prunable: UnusedByKind,\n options: PruneOptions\n): ReadonlyArray<string> => {\n const keptExplicit = [...options.keep].filter((name) => !options.used.has(name))\n return [\n ...keptExplicit,\n ...unused.dependencies.filter((name) => !prunable.dependencies.includes(name)),\n ...unused.devDependencies.filter((name) => !prunable.devDependencies.includes(name)),\n ...unused.optionalDependencies.filter((name) => !prunable.optionalDependencies.includes(name)),\n ...unused.peerDependencies\n ]\n}\n\nconst buildNextPackageJson = (pkg: PackageJson, prunable: UnusedByKind): PackageJson => {\n const removeDependencies = new Set(prunable.dependencies)\n const removeDev = new Set(prunable.devDependencies)\n const removeOptional = new Set(prunable.optionalDependencies)\n const nextDependencies = filterMap(pkg.dependencies, removeDependencies)\n const nextDevDependencies = filterMap(pkg.devDependencies, removeDev)\n const nextOptionalDependencies = filterMap(pkg.optionalDependencies, removeOptional)\n const base = omitDependencyFields(pkg)\n return {\n ...base,\n ...(nextDependencies === undefined ? {} : { dependencies: nextDependencies }),\n ...(nextDevDependencies === undefined ? {} : { devDependencies: nextDevDependencies }),\n ...(nextOptionalDependencies === undefined ? {} : { optionalDependencies: nextOptionalDependencies }),\n ...(pkg.peerDependencies === undefined ? {} : { peerDependencies: pkg.peerDependencies })\n }\n}\n\n/**\n * Build the prune plan (analysis + actual removal) for a package.json.\n *\n * @param pkg - Parsed package.json.\n * @param options - Prune options (used set, keep rules, mode flags).\n * @returns PrunePlan with unused, prunable, and next package.json.\n *\n * @pure true\n * @invariant peerDependencies remain unchanged\n * @complexity O(n)\n */\nexport const buildPrunePlan = (pkg: PackageJson, options: PruneOptions): PrunePlan => {\n const unused = computeUnusedByKind(pkg, options)\n const prunable = computePrunableByKind(unused, options)\n const keptByRule = computeKeptByRule(unused, prunable, options)\n const nextPackageJson = buildNextPackageJson(pkg, prunable)\n\n return {\n unused,\n prunable,\n keptByRule,\n nextPackageJson\n }\n}\n","import { Match } from \"effect\"\nimport type { PrunePlan } from \"./prune.js\"\nimport type { Report, ScanOutcome, UnusedByKind, Warning } from \"./types.js\"\n\n// CHANGE: build structured reports and render output formats\n// WHY: keep reporting pure and deterministic across CLI modes\n// QUOTE(TZ): \"Отчёт в stdout (человекочитаемый)\"\n// REF: req-report-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀r: report(r).used is sorted\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: Report.used is unique and sorted\n// COMPLEXITY: O(n log n)\n\nconst compareStrings = (left: string, right: string): number => left.localeCompare(right)\n\nconst mergeSorted = (\n left: ReadonlyArray<string>,\n right: ReadonlyArray<string>\n): ReadonlyArray<string> => {\n if (left.length === 0) {\n return right\n }\n if (right.length === 0) {\n return left\n }\n const leftHead = left[0] ?? \"\"\n const rightHead = right[0] ?? \"\"\n if (compareStrings(leftHead, rightHead) <= 0) {\n return [leftHead, ...mergeSorted(left.slice(1), right)]\n }\n return [rightHead, ...mergeSorted(left, right.slice(1))]\n}\n\nconst mergeSort = (values: ReadonlyArray<string>): ReadonlyArray<string> => {\n if (values.length <= 1) {\n return [...values]\n }\n const mid = Math.floor(values.length / 2)\n const left = mergeSort(values.slice(0, mid))\n const right = mergeSort(values.slice(mid))\n return mergeSorted(left, right)\n}\n\nconst sortUnique = (values: ReadonlyArray<string>): ReadonlyArray<string> => mergeSort([...new Set(values)])\n\nconst sortUnused = (unused: UnusedByKind): UnusedByKind => ({\n dependencies: sortUnique(unused.dependencies),\n devDependencies: sortUnique(unused.devDependencies),\n optionalDependencies: sortUnique(unused.optionalDependencies),\n peerDependencies: sortUnique(unused.peerDependencies)\n})\n\n/**\n * Build a Report object from scan and prune results.\n *\n * @param scan - Scan outcome with used set and warnings.\n * @param plan - Prune plan with unused lists and keptByRule.\n * @returns Report ready for output.\n *\n * @pure true\n * @invariant report.used is sorted and unique\n * @complexity O(n log n)\n */\nexport const buildReport = (scan: ScanOutcome, plan: PrunePlan): Report => ({\n used: sortUnique([...scan.used]),\n unused: sortUnused(plan.unused),\n keptByRule: sortUnique(plan.keptByRule),\n warnings: scan.warnings,\n stats: scan.stats\n})\n\nconst formatWarning = (warning: Warning): string =>\n Match.value(warning).pipe(\n Match.when({ type: \"dynamic-import\" }, (value) => `[dynamic-import] ${value.file}: ${value.expr}`),\n Match.when({ type: \"dynamic-require\" }, (value) => `[dynamic-require] ${value.file}: ${value.expr}`),\n Match.when({ type: \"parse-error\" }, (value) => `[parse-error] ${value.file}: ${value.error}`),\n Match.exhaustive\n )\n\nconst formatList = (title: string, values: ReadonlyArray<string>): ReadonlyArray<string> => {\n if (values.length === 0) {\n return [`${title}: (none)`]\n }\n return [title + \":\", ...values.map((value) => ` - ${value}`)]\n}\n\n/**\n * Render a human-readable report.\n *\n * @param report - Report data.\n * @returns Multi-line string for stdout.\n *\n * @pure true\n * @invariant output lists all required sections\n * @complexity O(n)\n */\nexport const renderHumanReport = (report: Report): string => {\n const lines = [\n ...formatList(\"USED\", report.used),\n ...formatList(\"Unused dependencies\", report.unused.dependencies),\n ...formatList(\"Unused devDependencies\", report.unused.devDependencies),\n ...formatList(\"Unused optionalDependencies\", report.unused.optionalDependencies),\n ...formatList(\"Peer dependencies (reported only)\", report.unused.peerDependencies)\n ]\n const warningLines = report.warnings.length === 0\n ? [\"Warnings: (none)\"]\n : [\n \"Warnings:\",\n ...report.warnings\n .map((warning) => formatWarning(warning))\n .map((line) => ` - ${line}`)\n ]\n const statsLines = [\n `Stats: filesScanned=${report.stats.filesScanned}, importsFound=${report.stats.importsFound}`\n ]\n return [...lines, ...warningLines, ...statsLines].join(\"\\n\")\n}\n\n/**\n * Render report as JSON text.\n *\n * @param report - Report data.\n * @returns JSON string.\n *\n * @pure true\n * @invariant output matches the JSON schema described in the spec\n * @complexity O(n)\n */\nexport const renderJsonReport = (report: Report): string =>\n JSON.stringify(\n {\n used: report.used,\n unused: {\n dependencies: report.unused.dependencies,\n devDependencies: report.unused.devDependencies\n },\n keptByRule: report.keptByRule,\n warnings: report.warnings,\n stats: report.stats\n },\n null,\n 2\n )\n","import * as Effect from \"effect/Effect\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { fileError } from \"../core/errors.js\"\n\n// CHANGE: provide Node builtin module set for filtering\n// WHY: builtins must be excluded from USED dependency detection\n// QUOTE(TZ): \"Node builtins: fs, path, url, node:fs и т.д.\"\n// REF: req-builtins-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀b ∈ builtins: b does not represent an external package\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlySet<string>, AppError, never>\n// INVARIANT: node: prefix is stripped\n// COMPLEXITY: O(n)\n\nexport const loadBuiltinModules: Effect.Effect<ReadonlySet<string>, AppError> = Effect.tryPromise({\n try: () => import(\"node:module\"),\n catch: (error) => fileError(String(error))\n}).pipe(\n Effect.map((module) => {\n const result = new Set<string>()\n for (const name of module.builtinModules) {\n if (name.startsWith(\"node:\")) {\n result.add(name.slice(\"node:\".length))\n } else {\n result.add(name)\n }\n }\n return result\n })\n)\n","import * as Command from \"@effect/platform/Command\"\nimport type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport * as Effect from \"effect/Effect\"\nimport * as Either from \"effect/Either\"\nimport { pipe } from \"effect/Function\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { fileError } from \"../core/errors.js\"\n\n// CHANGE: run external command with Effect CommandExecutor\n// WHY: enable release mode with typed exit code handling\n// QUOTE(TZ): \"Запускает команду из --command\"\n// REF: req-command-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: run(c) = code → code ∈ ℕ\n// PURITY: SHELL\n// EFFECT: Effect<number, AppError, CommandExecutor>\n// INVARIANT: stdout/stderr are inherited\n// COMPLEXITY: O(n)\n\ntype QuoteState = \"\\\"\" | \"'\" | null\n\ninterface ParseStep {\n readonly current: string\n readonly quote: QuoteState\n readonly index: number\n readonly pushToken: boolean\n}\n\nconst consumeQuoted = (\n input: string,\n index: number,\n current: string,\n quote: QuoteState\n): ParseStep => {\n const char = input.charAt(index)\n const nextChar = input.charAt(index + 1)\n if (quote !== null && char === quote) {\n return { current, quote: null, index: index + 1, pushToken: false }\n }\n if (quote === \"\\\"\" && char === \"\\\\\" && nextChar.length > 0) {\n return { current: current + nextChar, quote, index: index + 2, pushToken: false }\n }\n return { current: current + char, quote, index: index + 1, pushToken: false }\n}\n\nconst consumeUnquoted = (input: string, index: number, current: string): ParseStep => {\n const char = input.charAt(index)\n const nextChar = input.charAt(index + 1)\n if (char === \"\\\"\" || char === \"'\") {\n return { current, quote: char, index: index + 1, pushToken: false }\n }\n if (char.trim().length === 0) {\n return { current: \"\", quote: null, index: index + 1, pushToken: current.length > 0 }\n }\n if (char === \"\\\\\" && nextChar.length > 0) {\n return { current: current + nextChar, quote: null, index: index + 2, pushToken: false }\n }\n return { current: current + char, quote: null, index: index + 1, pushToken: false }\n}\n\nconst splitCommandLine = (input: string): Either.Either<Array<string>, AppError> => {\n let result: Array<string> = []\n let current = \"\"\n let quote: QuoteState = null\n let index = 0\n while (index < input.length) {\n const step: ParseStep = quote\n ? consumeQuoted(input, index, current, quote)\n : consumeUnquoted(input, index, current)\n if (step.pushToken) {\n result = [...result, current]\n }\n current = step.current\n quote = step.quote\n index = step.index\n }\n if (quote !== null) {\n return Either.left(fileError(\"Unterminated quote in --command\"))\n }\n if (current.length > 0) {\n result = [...result, current]\n }\n return Either.right(result)\n}\n\nexport const runCommand = (\n commandLine: string,\n cwd: string\n): Effect.Effect<number, AppError, CommandExecutor> =>\n Effect.gen(function*(_) {\n const parts = splitCommandLine(commandLine)\n if (Either.isLeft(parts)) {\n return yield* _(Effect.fail(parts.left))\n }\n if (parts.right.length === 0) {\n return yield* _(Effect.fail(fileError(\"Empty --command\")))\n }\n const [cmd, ...args] = parts.right\n if (cmd === undefined) {\n return yield* _(Effect.fail(fileError(\"Empty --command\")))\n }\n const command = pipe(\n Command.make(cmd, ...args),\n Command.stdin(\"inherit\"),\n Command.stdout(\"inherit\"),\n Command.stderr(\"inherit\"),\n Command.workingDirectory(cwd)\n )\n const exitCode = yield* _(\n Command.exitCode(command).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n return Number(exitCode)\n })\n","import type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { FileSystem } from \"@effect/platform/FileSystem\"\nimport * as S from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport * as Effect from \"effect/Effect\"\nimport { pipe } from \"effect/Function\"\n\nimport type { FileConfig } from \"../core/config.js\"\nimport type { AppError } from \"../core/errors.js\"\nimport { configError, fileError } from \"../core/errors.js\"\n\n// CHANGE: decode .dist-deps-prune.json with schema validation\n// WHY: keep boundary data typed and reject invalid config early\n// QUOTE(TZ): \"поддержать файл .dist-deps-prune.json\"\n// REF: req-config-file-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: decode(c) = Right(cfg) → cfg fields have correct types\n// PURITY: SHELL\n// EFFECT: Effect<FileConfig | undefined, AppError, FileSystem>\n// INVARIANT: missing config yields undefined\n// COMPLEXITY: O(n)\n\nconst RawConfigSchema = S.partial(\n S.Struct({\n keep: S.Array(S.String),\n ignorePatterns: S.Array(S.String),\n pruneDev: S.Boolean,\n pruneOptional: S.Boolean,\n patterns: S.Array(S.String)\n })\n)\n\nconst ConfigSchema = S.parseJson(RawConfigSchema)\n\nconst decodeConfig = (raw: string): Effect.Effect<FileConfig, AppError> =>\n pipe(\n S.decodeUnknown(ConfigSchema)(raw),\n Effect.map((config) => ({\n ...(config.keep === undefined ? {} : { keep: config.keep }),\n ...(config.ignorePatterns === undefined ? {} : { ignorePatterns: config.ignorePatterns }),\n ...(config.pruneDev === undefined ? {} : { pruneDev: config.pruneDev }),\n ...(config.pruneOptional === undefined ? {} : { pruneOptional: config.pruneOptional }),\n ...(config.patterns === undefined ? {} : { patterns: config.patterns })\n })),\n Effect.mapError((error) => configError(TreeFormatter.formatErrorSync(error)))\n )\n\nexport const loadConfigFile = (\n path: string | undefined,\n explicit: boolean\n): Effect.Effect<FileConfig | undefined, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n if (path === undefined) {\n return\n }\n const fs = yield* _(FileSystem)\n const exists = yield* _(\n fs.exists(path).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n if (!exists) {\n if (explicit) {\n return yield* _(Effect.fail(fileError(`Config file not found: ${path}`)))\n }\n return\n }\n const contents = yield* _(\n fs.readFileString(path).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n const decoded = yield* _(decodeConfig(contents))\n return decoded\n })\n","import type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { FileSystem } from \"@effect/platform/FileSystem\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport * as Effect from \"effect/Effect\"\nimport { pipe } from \"effect/Function\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { fileError } from \"../core/errors.js\"\nimport type { Json } from \"../core/json.js\"\nimport { decodePackageJson, isJsonObject } from \"../core/package-json.js\"\nimport type { PackageJson } from \"../core/package-json.js\"\n\n// CHANGE: provide package.json read/write helpers with validation\n// WHY: isolate filesystem IO while keeping typed dependency maps\n// QUOTE(TZ): \"package.json текущего пакета\"\n// REF: req-pkg-io-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: read(p) = Right(pkg) → pkg.dependencies values are strings\n// PURITY: SHELL\n// EFFECT: Effect<PackageJson, AppError, FileSystem>\n// INVARIANT: JSON is validated before use\n// COMPLEXITY: O(n)\n\nconst JsonSchema: Schema.Schema<Json> = Schema.suspend(() =>\n Schema.Union(\n Schema.Null,\n Schema.Boolean,\n Schema.Number,\n Schema.String,\n Schema.Array(JsonSchema),\n Schema.Record({ key: Schema.String, value: JsonSchema })\n )\n)\n\nconst JsonParseSchema = Schema.parseJson(JsonSchema)\n\nconst parseJson = (raw: string): Effect.Effect<Json, AppError> =>\n pipe(\n Schema.decodeUnknown(JsonParseSchema)(raw),\n Effect.mapError((error) => fileError(TreeFormatter.formatErrorSync(error)))\n )\n\nexport const readPackageJsonRaw = (\n path: string\n): Effect.Effect<string, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem)\n return yield* _(\n fs.readFileString(path).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n })\n\nexport const readPackageJson = (\n path: string\n): Effect.Effect<PackageJson, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n const raw = yield* _(readPackageJsonRaw(path))\n const parsed = yield* _(parseJson(raw))\n if (!isJsonObject(parsed)) {\n return yield* _(Effect.fail(fileError(\"package.json must be an object\")))\n }\n const decoded = decodePackageJson(parsed)\n if (decoded._tag === \"Left\") {\n return yield* _(Effect.fail(fileError(decoded.left.message)))\n }\n return decoded.right\n })\n\nexport const writePackageJson = (\n path: string,\n pkg: PackageJson\n): Effect.Effect<void, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem)\n const payload = JSON.stringify(pkg, null, 2) + \"\\n\"\n yield* _(\n fs.writeFileString(path, payload).pipe(Effect.mapError((error) => fileError(String(error))))\n )\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { FileSystem } from \"@effect/platform/FileSystem\"\nimport * as Effect from \"effect/Effect\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { fileError, restoreError } from \"../core/errors.js\"\n\n// CHANGE: add backup/restore helpers for release mode\n// WHY: allow pruning without polluting git history and restore package.json\n// QUOTE(TZ): \"делает backup package.json → .package.json.release.bak\"\n// REF: req-release-1\n// SOURCE: n/a\n// FORMAT THEOREM: backup(p); restore(p) → package.json restored byte-for-byte\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem>\n// INVARIANT: backup path is deterministic\n// COMPLEXITY: O(n)\n\ntype FileSystemEffect<A> = Effect.Effect<A, AppError, FileSystemService>\n\nconst mapFileError = (error: PlatformError): AppError => fileError(String(error))\n\nconst mapRestoreError = (error: PlatformError): AppError => restoreError(String(error))\n\nconst withFileSystem = <A>(\n handler: (fs: FileSystemService) => Effect.Effect<A, AppError, FileSystemService>\n): FileSystemEffect<A> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem)\n return yield* _(handler(fs))\n })\n\nconst readFile = (\n fs: FileSystemService,\n path: string,\n onError: (error: PlatformError) => AppError\n): Effect.Effect<string, AppError> => fs.readFileString(path).pipe(Effect.mapError(onError))\n\nconst writeFile = (\n fs: FileSystemService,\n path: string,\n contents: string,\n onError: (error: PlatformError) => AppError\n): Effect.Effect<void, AppError> => fs.writeFileString(path, contents).pipe(Effect.mapError(onError))\n\nconst pathExists = (\n fs: FileSystemService,\n path: string,\n onError: (error: PlatformError) => AppError\n): Effect.Effect<boolean, AppError> => fs.exists(path).pipe(Effect.mapError(onError))\n\nconst copyFile = (\n fs: FileSystemService,\n from: string,\n to: string,\n onError: (error: PlatformError) => AppError\n): Effect.Effect<void, AppError> =>\n Effect.gen(function*(_) {\n const contents = yield* _(readFile(fs, from, onError))\n yield* _(writeFile(fs, to, contents, onError))\n })\n\nconst ensureThenCopy = (\n fs: FileSystemService,\n source: string,\n target: string,\n onError: (error: PlatformError) => AppError,\n missing: AppError\n): Effect.Effect<void, AppError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(pathExists(fs, source, onError))\n if (!exists) {\n return yield* _(Effect.fail(missing))\n }\n yield* _(copyFile(fs, source, target, onError))\n })\n\nexport const backupPackageJson = (\n packagePath: string,\n backupPath: string\n): FileSystemEffect<void> => withFileSystem((fs) => copyFile(fs, packagePath, backupPath, mapFileError))\n\nexport const restorePackageJson = (\n packagePath: string,\n backupPath: string\n): FileSystemEffect<void> =>\n withFileSystem((fs) =>\n ensureThenCopy(\n fs,\n backupPath,\n packagePath,\n mapRestoreError,\n restoreError(`Backup file not found: ${backupPath}`)\n )\n )\n\nexport const ensureBackup = (\n packagePath: string,\n backupPath: string\n): FileSystemEffect<void> =>\n withFileSystem((fs) =>\n ensureThenCopy(\n fs,\n packagePath,\n backupPath,\n mapFileError,\n fileError(`package.json not found: ${packagePath}`)\n )\n )\n","// CHANGE: implement minimal glob matching for dist scanning\n// WHY: avoid extra dependencies while supporting dist/**/*.js style patterns\n// QUOTE(TZ): \"Пользователь может переопределить маски флагом.\"\n// REF: req-glob-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: match(glob, p) ∈ {true,false}\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: '*' never matches path separator '/'\n// COMPLEXITY: O(n) per match\n\nconst normalizeSlashes = (value: string): string => value.replaceAll(\"\\\\\", \"/\")\n\nconst stripDotSlash = (value: string): string => value.startsWith(\"./\") ? value.slice(2) : value\n\nconst escapeRegex = (value: string): string => value.replaceAll(/[.+^${}()|[\\]\\\\]/gu, String.raw`\\$&`)\n\nconst globToRegex = (pattern: string): RegExp => {\n const normalized = stripDotSlash(normalizeSlashes(pattern))\n let regex = \"^\"\n let index = 0\n while (index < normalized.length) {\n const char = normalized.charAt(index)\n const next = normalized.charAt(index + 1)\n if (char === \"*\" && next === \"*\") {\n const after = normalized.charAt(index + 2)\n if (after === \"/\") {\n regex += \"(?:.*/)?\"\n index += 3\n continue\n }\n regex += \".*\"\n index += 2\n continue\n }\n if (char === \"*\") {\n regex += \"[^/]*\"\n index += 1\n continue\n }\n if (char === \"?\") {\n regex += \"[^/]\"\n index += 1\n continue\n }\n regex += escapeRegex(char)\n index += 1\n }\n regex += \"$\"\n return new RegExp(regex, \"u\")\n}\n\n/**\n * Compile glob patterns into regexes.\n *\n * @param patterns - Raw glob patterns.\n * @returns Compiled regular expressions.\n *\n * @pure true\n * @invariant compiled regexes match only whole paths\n * @complexity O(n) where n = total pattern length\n */\nexport const compileGlobs = (patterns: ReadonlyArray<string>): ReadonlyArray<RegExp> =>\n patterns.map((pattern) => globToRegex(pattern))\n\n/**\n * Check if any compiled glob matches the path.\n *\n * @param globs - Compiled regex patterns.\n * @param candidate - Path to test.\n * @returns true if any pattern matches.\n *\n * @pure true\n * @complexity O(k) where k = number of globs\n */\nexport const matchesAnyGlob = (\n globs: ReadonlyArray<RegExp>,\n candidate: string\n): boolean => {\n const normalized = stripDotSlash(normalizeSlashes(candidate))\n for (const glob of globs) {\n if (glob.test(normalized)) {\n return true\n }\n }\n return false\n}\n","import * as Option from \"effect/Option\"\n\n// CHANGE: centralize package specifier normalization rules\n// WHY: ensure consistent USED set across ESM/CJS/d.ts scanning\n// QUOTE(TZ): \"Нормализация имени пакета: lodash/get → lodash; @scope/name/x → @scope/name\"\n// REF: req-normalize-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀s ∈ Specifier: normalize(s) = Some(p) → p is top-level package name\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: returned package name never contains subpath segments\n// COMPLEXITY: O(n)/O(1)\n\nconst isRelativePath = (specifier: string): boolean => specifier.startsWith(\"./\") || specifier.startsWith(\"../\")\n\nconst isAbsolutePath = (specifier: string): boolean => {\n if (specifier.startsWith(\"/\")) {\n return true\n }\n const windowsDrive = /^[a-zA-Z]:[\\\\/]/u\n return windowsDrive.test(specifier)\n}\n\nconst isNonPackageAlias = (specifier: string): boolean =>\n specifier.startsWith(\"#\") || specifier.startsWith(\"data:\") || specifier.startsWith(\"http:\")\n\nconst stripNodeProtocol = (specifier: string): string =>\n specifier.startsWith(\"node:\") ? specifier.slice(\"node:\".length) : specifier\n\nconst optionSome = Option.some\n\nconst getExternalCandidate = (\n specifier: string,\n builtins: ReadonlySet<string>\n): string | undefined => {\n if (specifier.length === 0) {\n return undefined\n }\n if (isRelativePath(specifier) || isAbsolutePath(specifier) || isNonPackageAlias(specifier)) {\n return undefined\n }\n const withoutProtocol = stripNodeProtocol(specifier)\n const firstSegment = withoutProtocol.split(\"/\")[0]\n if (builtins.has(withoutProtocol) || (firstSegment !== undefined && builtins.has(firstSegment))) {\n return undefined\n }\n return withoutProtocol\n}\n\nconst normalizeScoped = (specifier: string): Option.Option<string> => {\n const parts = specifier.split(\"/\")\n const scope = parts[0]\n const name = parts[1]\n if (scope === undefined || name === undefined || scope.length <= 1 || name.length === 0) {\n return Option.none()\n }\n return optionSome(`${scope}/${name}`)\n}\n\nconst normalizeUnscoped = (specifier: string): Option.Option<string> => {\n const parts = specifier.split(\"/\")\n const head = parts[0]\n return head === undefined || head.length === 0 ? Option.none() : optionSome(head)\n}\n\n/**\n * Normalize an import specifier into a top-level package name, if external.\n *\n * @param specifier - Raw import/require specifier.\n * @param builtins - Set of builtin module names (without node: prefix).\n * @returns Option with normalized package name.\n *\n * @pure true\n * @invariant external → not relative/absolute/builtin\n * @complexity O(n)\n */\nexport const normalizePackageName = (\n specifier: string,\n builtins: ReadonlySet<string>\n): Option.Option<string> => {\n const trimmed = specifier.trim()\n const candidate = getExternalCandidate(trimmed, builtins)\n if (candidate === undefined) {\n return Option.none()\n }\n if (candidate.startsWith(\"@\")) {\n return normalizeScoped(candidate)\n }\n return normalizeUnscoped(candidate)\n}\n","import * as Either from \"effect/Either\"\nimport * as ts from \"typescript\"\n\n// CHANGE: parse import specifiers from JS/TS source using TypeScript AST\n// WHY: cover ESM, CJS, and .d.ts import forms with a single parser\n// QUOTE(TZ): \"Учитывает dist/**/*.d.ts\"\n// REF: req-parse-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀s: parse(s) = Right(p) → p.specifiers ⊆ Strings\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: dynamic imports are reported separately\n// COMPLEXITY: O(n) where n = AST size\n\nexport interface ParsedImports {\n readonly staticSpecifiers: ReadonlyArray<string>\n readonly dynamicImports: ReadonlyArray<string>\n readonly dynamicRequires: ReadonlyArray<string>\n}\n\nconst scriptKindFromFile = (fileName: string): ts.ScriptKind => {\n if (fileName.endsWith(\".d.ts\") || fileName.endsWith(\".ts\")) {\n return ts.ScriptKind.TS\n }\n if (fileName.endsWith(\".mjs\")) {\n return ts.ScriptKind.JS\n }\n if (fileName.endsWith(\".cjs\")) {\n return ts.ScriptKind.JS\n }\n return ts.ScriptKind.JS\n}\n\nconst getStringLiteral = (expression: ts.Expression): string | undefined => {\n if (ts.isStringLiteral(expression)) {\n return expression.text\n }\n if (ts.isNoSubstitutionTemplateLiteral(expression)) {\n return expression.text\n }\n return undefined\n}\n\nconst getImportTypeLiteral = (node: ts.ImportTypeNode): string | undefined => {\n const argument = node.argument\n if (ts.isLiteralTypeNode(argument)) {\n const literal = argument.literal\n if (ts.isStringLiteral(literal) || ts.isNoSubstitutionTemplateLiteral(literal)) {\n return literal.text\n }\n }\n return undefined\n}\n\nconst isRequireIdentifier = (expression: ts.Expression): expression is ts.Identifier =>\n ts.isIdentifier(expression) && expression.text === \"require\"\n\nconst isRequireResolve = (expression: ts.Expression): expression is ts.PropertyAccessExpression =>\n ts.isPropertyAccessExpression(expression) &&\n ts.isIdentifier(expression.expression) &&\n expression.expression.text === \"require\" &&\n expression.name.text === \"resolve\"\n\nconst isDynamicImport = (expression: ts.Expression): boolean => expression.kind === ts.SyntaxKind.ImportKeyword\n\nconst collectImportDeclaration = (\n node: ts.ImportDeclaration,\n staticSpecifiers: Array<string>\n): void => {\n if (ts.isStringLiteral(node.moduleSpecifier)) {\n staticSpecifiers.push(node.moduleSpecifier.text)\n }\n}\n\nconst collectExportDeclaration = (\n node: ts.ExportDeclaration,\n staticSpecifiers: Array<string>\n): void => {\n if (node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {\n staticSpecifiers.push(node.moduleSpecifier.text)\n }\n}\n\nconst collectImportType = (\n node: ts.ImportTypeNode,\n staticSpecifiers: Array<string>\n): void => {\n const literal = getImportTypeLiteral(node)\n if (literal !== undefined) {\n staticSpecifiers.push(literal)\n }\n}\n\nconst collectCallExpression = (\n node: ts.CallExpression,\n sourceFile: ts.SourceFile,\n staticSpecifiers: Array<string>,\n dynamicImports: Array<string>,\n dynamicRequires: Array<string>\n): void => {\n if (isDynamicImport(node.expression)) {\n const argument = node.arguments[0]\n const literal = argument ? getStringLiteral(argument) : undefined\n if (literal === undefined) {\n dynamicImports.push(node.getText(sourceFile))\n } else {\n staticSpecifiers.push(literal)\n }\n return\n }\n if (isRequireIdentifier(node.expression) || isRequireResolve(node.expression)) {\n const argument = node.arguments[0]\n const literal = argument ? getStringLiteral(argument) : undefined\n if (literal === undefined) {\n dynamicRequires.push(node.getText(sourceFile))\n } else {\n staticSpecifiers.push(literal)\n }\n }\n}\n\nconst parseSourceFile = (\n source: string,\n fileName: string\n): Either.Either<ts.SourceFile, string> => {\n if (!fileName.endsWith(\".d.ts\")) {\n const diagnostics = ts.transpileModule(source, {\n compilerOptions: { module: ts.ModuleKind.ESNext },\n fileName,\n reportDiagnostics: true\n }).diagnostics ?? []\n const parseDiagnostics = diagnostics.filter(\n (diag: ts.Diagnostic) => diag.category === ts.DiagnosticCategory.Error\n )\n if (parseDiagnostics.length > 0) {\n const message = parseDiagnostics\n .map((diag: ts.Diagnostic) => ts.flattenDiagnosticMessageText(diag.messageText, \"\\n\"))\n .join(\"; \")\n return Either.left(message)\n }\n }\n const sourceFile = ts.createSourceFile(\n fileName,\n source,\n ts.ScriptTarget.ESNext,\n true,\n scriptKindFromFile(fileName)\n )\n return Either.right(sourceFile)\n}\n\nconst collectImports = (sourceFile: ts.SourceFile): ParsedImports => {\n const staticSpecifiers: Array<string> = []\n const dynamicImports: Array<string> = []\n const dynamicRequires: Array<string> = []\n\n const visit = (node: ts.Node): void => {\n if (ts.isImportDeclaration(node)) {\n collectImportDeclaration(node, staticSpecifiers)\n ts.forEachChild(node, visit)\n return\n }\n if (ts.isExportDeclaration(node)) {\n collectExportDeclaration(node, staticSpecifiers)\n ts.forEachChild(node, visit)\n return\n }\n if (ts.isImportTypeNode(node)) {\n collectImportType(node, staticSpecifiers)\n ts.forEachChild(node, visit)\n return\n }\n if (ts.isCallExpression(node)) {\n collectCallExpression(node, sourceFile, staticSpecifiers, dynamicImports, dynamicRequires)\n ts.forEachChild(node, visit)\n return\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n return {\n staticSpecifiers,\n dynamicImports,\n dynamicRequires\n }\n}\n\n/**\n * Parse a source file and extract import specifiers.\n *\n * @param source - File contents.\n * @param fileName - File name (used for ScriptKind and diagnostics).\n * @returns Either with ParsedImports or parse error message.\n *\n * @pure true\n * @invariant all collected specifiers are string literals\n * @complexity O(n)\n */\nexport const parseImportsFromSource = (\n source: string,\n fileName: string\n): Either.Either<ParsedImports, string> => {\n const sourceEither = parseSourceFile(source, fileName)\n if (sourceEither._tag === \"Left\") {\n return Either.left(sourceEither.left)\n }\n return Either.right(collectImports(sourceEither.right))\n}\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { Path } from \"@effect/platform/Path\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\n\nimport type { AppError } from \"../core/errors.js\"\nimport { distNotFound, fileError, parseFileError } from \"../core/errors.js\"\nimport { compileGlobs, matchesAnyGlob } from \"../core/glob.js\"\nimport { normalizePackageName } from \"../core/normalize.js\"\nimport { parseImportsFromSource } from \"../core/parse.js\"\nimport type { ScanOutcome, Warning } from \"../core/types.js\"\n\n// CHANGE: implement dist scanning with Effect file system services\n// WHY: isolate IO while producing a deterministic ScanOutcome\n// QUOTE(TZ): \"Анализирует содержимое dist/ и строит множество внешних пакетов USED.\"\n// REF: req-scan-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀f ∈ filesScanned: imports(f) ⊆ USED ∪ warnings\n// PURITY: SHELL\n// EFFECT: Effect<ScanOutcome, AppError, FileSystem | Path>\n// INVARIANT: warnings include parse and dynamic import cases\n// COMPLEXITY: O(n + m) where n = files, m = total AST nodes\n\nexport interface ScanSettings {\n readonly distPath: string\n readonly patterns: ReadonlyArray<string>\n readonly ignorePatterns: ReadonlyArray<string>\n readonly strict: boolean\n readonly builtins: ReadonlySet<string>\n}\n\nconst normalizePath = (value: string): string => value.replaceAll(\"\\\\\", \"/\")\n\nconst matchesPatterns = (\n include: ReadonlyArray<RegExp>,\n ignore: ReadonlyArray<RegExp>,\n candidates: ReadonlyArray<string>\n): boolean => {\n const isIncluded = candidates.some((candidate) => matchesAnyGlob(include, candidate))\n if (!isIncluded) {\n return false\n }\n return !candidates.some((candidate) => matchesAnyGlob(ignore, candidate))\n}\n\nconst scanFile = (\n filePath: string,\n source: string,\n builtins: ReadonlySet<string>\n): {\n readonly used: ReadonlyArray<string>\n readonly warnings: ReadonlyArray<Warning>\n readonly importsFound: number\n} => {\n const parsedEither = parseImportsFromSource(source, filePath)\n if (parsedEither._tag === \"Left\") {\n const warning: Warning = {\n type: \"parse-error\",\n file: filePath,\n error: parsedEither.left\n }\n return { used: [], warnings: [warning], importsFound: 0 }\n }\n const parsed = parsedEither.right\n const warnings: Array<Warning> = []\n for (const expr of parsed.dynamicImports) {\n warnings.push({ type: \"dynamic-import\", file: filePath, expr })\n }\n for (const expr of parsed.dynamicRequires) {\n warnings.push({ type: \"dynamic-require\", file: filePath, expr })\n }\n const used = parsed.staticSpecifiers\n .map((specifier) => normalizePackageName(specifier, builtins))\n .filter((option) => Option.isSome(option))\n .map((option) => option.value)\n return { used, warnings, importsFound: parsed.staticSpecifiers.length }\n}\n\nconst mapFsError = (error: PlatformError): AppError => fileError(String(error))\n\nconst ensureDistExists = (\n fs: FileSystemService,\n distPath: string\n): Effect.Effect<void, AppError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(distPath).pipe(Effect.mapError(mapFsError)))\n if (!exists) {\n return yield* _(Effect.fail(distNotFound(distPath)))\n }\n })\n\nconst readDistEntries = (\n fs: FileSystemService,\n distPath: string\n): Effect.Effect<ReadonlyArray<string>, AppError> =>\n fs.readDirectory(distPath, { recursive: true }).pipe(Effect.mapError(mapFsError))\n\ninterface FilterEntriesInput {\n readonly path: PathService\n readonly cwd: string\n readonly distPath: string\n readonly entries: ReadonlyArray<string>\n readonly include: ReadonlyArray<RegExp>\n readonly ignore: ReadonlyArray<RegExp>\n}\n\nconst filterEntries = (input: FilterEntriesInput): ReadonlyArray<string> => {\n const candidates = input.entries.map((entry) => input.path.join(input.distPath, entry))\n return candidates.filter((absolutePath) => {\n const relativeToCwd = normalizePath(input.path.relative(input.cwd, absolutePath))\n const relativeToDist = normalizePath(input.path.relative(input.distPath, absolutePath))\n const absolute = normalizePath(absolutePath)\n return matchesPatterns(input.include, input.ignore, [absolute, relativeToCwd, relativeToDist])\n })\n}\n\nconst scanFiles = (\n fs: FileSystemService,\n files: ReadonlyArray<string>,\n settings: ScanSettings\n): Effect.Effect<ScanOutcome, AppError> =>\n Effect.gen(function*(_) {\n const initialUsed = new Set<string>()\n const warnings: Array<Warning> = []\n let importsFound = 0\n\n for (const filePath of files) {\n const source = yield* _(fs.readFileString(filePath).pipe(Effect.mapError(mapFsError)))\n const fileResult = scanFile(filePath, source, settings.builtins)\n if (settings.strict && fileResult.warnings.some((warning) => warning.type === \"parse-error\")) {\n const parseWarning = fileResult.warnings.find((warning) => warning.type === \"parse-error\")\n if (parseWarning) {\n return yield* _(Effect.fail(parseFileError(parseWarning.file, parseWarning.error)))\n }\n }\n for (const pkg of fileResult.used) {\n initialUsed.add(pkg)\n }\n for (const warning of fileResult.warnings) {\n warnings.push(warning)\n }\n importsFound += fileResult.importsFound\n }\n\n return {\n used: initialUsed,\n warnings,\n stats: {\n filesScanned: files.length,\n importsFound\n }\n }\n })\n\nexport const scanDist = (\n settings: ScanSettings\n): Effect.Effect<ScanOutcome, AppError, FileSystemService | PathService> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem)\n const path = yield* _(Path)\n\n yield* _(ensureDistExists(fs, settings.distPath))\n const cwd = yield* _(Effect.sync(() => process.cwd()))\n const includeGlobs = compileGlobs(settings.patterns)\n const ignoreGlobs = compileGlobs(settings.ignorePatterns)\n\n const entries = yield* _(readDistEntries(fs, settings.distPath))\n const filtered = filterEntries({\n path,\n cwd,\n distPath: settings.distPath,\n entries,\n include: includeGlobs,\n ignore: ignoreGlobs\n })\n return yield* _(scanFiles(fs, filtered, settings))\n })\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { FileSystem as FileSystemService } from \"@effect/platform/FileSystem\"\nimport { Path } from \"@effect/platform/Path\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Effect, Match } from \"effect\"\nimport type * as Either from \"effect/Either\"\nimport * as Exit from \"effect/Exit\"\n\nimport type { CliArgs } from \"../core/cli.js\"\nimport { parseCliArgs } from \"../core/cli.js\"\nimport { resolveConfig } from \"../core/config.js\"\nimport { type AppError, devDependencyInDist } from \"../core/errors.js\"\nimport { listDevDependenciesUsedInDist } from \"../core/invariants.js\"\nimport type { PrunePlan } from \"../core/prune.js\"\nimport { buildPrunePlan } from \"../core/prune.js\"\nimport { buildReport, renderHumanReport, renderJsonReport } from \"../core/report.js\"\nimport type { Report } from \"../core/types.js\"\nimport { loadBuiltinModules } from \"../shell/builtins.js\"\nimport { runCommand } from \"../shell/command.js\"\nimport { loadConfigFile } from \"../shell/config-file.js\"\nimport { readPackageJson, writePackageJson } from \"../shell/package-json.js\"\nimport { ensureBackup, restorePackageJson } from \"../shell/release.js\"\nimport { scanDist } from \"../shell/scan.js\"\n\n// CHANGE: orchestrate CLI modes with functional core + imperative shell\n// WHY: enforce single entrypoint with typed errors and deterministic outputs\n// QUOTE(TZ): \"scan/apply/release/restore\"\n// REF: req-program-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀mode: run(mode) returns exitCode ∈ {0,1,2,...}\n// PURITY: SHELL\n// EFFECT: Effect<ProgramResult, AppError, Services>\n// INVARIANT: report emitted at most once\n// COMPLEXITY: O(n)\n\nexport interface ProgramResult {\n readonly report: Report\n readonly exitCode: number\n}\n\ntype ScanEnv = FileSystemService | PathService\ntype ProgramEnv = FileSystemService | PathService | CommandExecutor\n\ninterface AnalyzeResult {\n readonly report: Report\n readonly plan: PrunePlan\n}\n\nconst emptyReport: Report = {\n used: [],\n unused: {\n dependencies: [],\n devDependencies: [],\n optionalDependencies: [],\n peerDependencies: []\n },\n keptByRule: [],\n warnings: [],\n stats: { filesScanned: 0, importsFound: 0 }\n}\n\nconst hasUnused = (report: Report): boolean =>\n report.unused.dependencies.length > 0 || report.unused.devDependencies.length > 0\n\nconst writeStdout = (payload: string): Effect.Effect<void> =>\n Effect.sync(() => {\n process.stdout.write(payload.endsWith(\"\\n\") ? payload : `${payload}\\n`)\n })\n\nconst fromEither = <A, E>(either: Either.Either<A, E>): Effect.Effect<A, E> =>\n either._tag === \"Left\" ? Effect.fail(either.left) : Effect.succeed(either.right)\n\nconst emitReport = (report: Report, json: boolean, silent: boolean): Effect.Effect<void> => {\n if (silent) {\n return Effect.void\n }\n const payload = json ? renderJsonReport(report) : renderHumanReport(report)\n return writeStdout(payload)\n}\n\nconst runReleaseCommand = (\n cli: CliArgs,\n plan: PrunePlan,\n backupPath: string\n): Effect.Effect<number, AppError, FileSystemService | CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(ensureBackup(cli.packagePath, backupPath))\n yield* _(writePackageJson(cli.packagePath, plan.nextPackageJson))\n const cwd = yield* _(Effect.sync(() => process.cwd()))\n const exit = yield* _(Effect.exit(runCommand(cli.releaseCommand ?? \"\", cwd)))\n yield* _(restorePackageJson(cli.packagePath, backupPath))\n return yield* _(\n Exit.matchEffect(exit, {\n onFailure: (cause) => Effect.failCause(cause),\n onSuccess: (value) => Effect.succeed(value)\n })\n )\n })\n\nconst analyzeProject = (\n cli: CliArgs\n): Effect.Effect<AnalyzeResult, AppError, ScanEnv> =>\n Effect.gen(function*(_) {\n const configPath = cli.ignorePath ?? \"./.dist-deps-prune.json\"\n const configFile = yield* _(loadConfigFile(configPath, cli.ignorePathExplicit))\n const resolved = resolveConfig(cli, configFile)\n const builtins = yield* _(loadBuiltinModules)\n const scan = yield* _(\n scanDist({\n distPath: cli.dist,\n patterns: resolved.patterns,\n ignorePatterns: resolved.ignorePatterns,\n strict: cli.strict,\n builtins\n })\n )\n const pkg = yield* _(readPackageJson(cli.packagePath))\n const usedInDev = listDevDependenciesUsedInDist(scan.used, pkg)\n if (usedInDev.length > 0) {\n return yield* _(Effect.fail(devDependencyInDist(usedInDev)))\n }\n const plan = buildPrunePlan(pkg, {\n used: scan.used,\n keep: new Set(resolved.keep),\n pruneDev: resolved.pruneDev,\n pruneOptional: resolved.pruneOptional,\n conservative: cli.conservative,\n hasUncertainty: scan.warnings.length > 0\n })\n const report = buildReport(scan, plan)\n return { report, plan }\n })\n\nconst handleRestore = (\n cli: CliArgs,\n backupPath: string\n): Effect.Effect<ProgramResult, AppError, FileSystemService> =>\n Effect.gen(function*(_) {\n yield* _(restorePackageJson(cli.packagePath, backupPath))\n yield* _(emitReport(emptyReport, cli.json, cli.silent))\n return { report: emptyReport, exitCode: 0 }\n })\n\nconst handleScan = (\n cli: CliArgs\n): Effect.Effect<ProgramResult, AppError, ScanEnv> =>\n Effect.gen(function*(_) {\n const { report } = yield* _(analyzeProject(cli))\n yield* _(emitReport(report, cli.json, cli.silent))\n const exitCode = cli.failOnUnused && hasUnused(report) ? 2 : 0\n return { report, exitCode }\n })\n\nconst handleApply = (\n cli: CliArgs\n): Effect.Effect<ProgramResult, AppError, ScanEnv> =>\n Effect.gen(function*(_) {\n const { plan, report } = yield* _(analyzeProject(cli))\n if (cli.write) {\n yield* _(writePackageJson(cli.packagePath, plan.nextPackageJson))\n }\n yield* _(emitReport(report, cli.json, cli.silent))\n return { report, exitCode: 0 }\n })\n\nconst handleRelease = (\n cli: CliArgs,\n backupPath: string\n): Effect.Effect<ProgramResult, AppError, ProgramEnv> =>\n Effect.gen(function*(_) {\n const { plan, report } = yield* _(analyzeProject(cli))\n if (cli.releaseCommand) {\n const exitCode = yield* _(runReleaseCommand(cli, plan, backupPath))\n yield* _(emitReport(report, cli.json, cli.silent))\n return { report, exitCode }\n }\n yield* _(ensureBackup(cli.packagePath, backupPath))\n yield* _(writePackageJson(cli.packagePath, plan.nextPackageJson))\n yield* _(emitReport(report, cli.json, cli.silent))\n if (!cli.json && !cli.silent) {\n yield* _(\n writeStdout(\n `package.json modified for release. Restore with: dist-deps-prune restore --package ${cli.packagePath}`\n )\n )\n }\n return { report, exitCode: 0 }\n })\n\nconst executeCommand = (\n cli: CliArgs,\n backupPath: string\n): Effect.Effect<ProgramResult, AppError, ProgramEnv> =>\n Match.value(cli.command).pipe(\n Match.when(\"restore\", () => handleRestore(cli, backupPath)),\n Match.when(\"scan\", () => handleScan(cli)),\n Match.when(\"apply\", () => handleApply(cli)),\n Match.when(\"release\", () => handleRelease(cli, backupPath)),\n Match.exhaustive\n )\n\n/**\n * Run CLI program with the provided argv.\n *\n * @param argv - process.argv array.\n * @returns ProgramResult with report and exit code.\n *\n * @pure false\n * @effect FileSystem, Path, CommandExecutor, Console\n * @invariant exitCode is deterministic for fixed inputs\n * @complexity O(n)\n */\nexport const runCli = (\n argv: ReadonlyArray<string>\n): Effect.Effect<\n ProgramResult,\n AppError,\n ProgramEnv\n> =>\n Effect.gen(function*(_) {\n const cli = yield* _(fromEither(parseCliArgs(argv)))\n const path = yield* _(Path)\n const backupPath = path.join(path.dirname(cli.packagePath), \".package.json.release.bak\")\n return yield* _(executeCommand(cli, backupPath))\n })\n","import { NodeContext, NodeRuntime } from \"@effect/platform-node\"\nimport { Effect } from \"effect\"\n\nimport { runCli } from \"./program.js\"\n\n// CHANGE: wire CLI program into Node runtime with proper teardown\n// WHY: execute effects with platform services and typed error handling\n// QUOTE(TZ): \"CLI-тулу\"\n// REF: req-main-1\n// SOURCE: n/a\n// FORMAT THEOREM: runMain(program) terminates with exitCode from ProgramResult\n// PURITY: SHELL\n// EFFECT: Effect<void, never, NodeContext>\n// INVARIANT: non-zero exit codes terminate the process\n// COMPLEXITY: O(1)\n\nconst main = Effect.gen(function*(_) {\n const result = yield* _(runCli(process.argv))\n if (result.exitCode !== 0) {\n yield* _(\n Effect.sync(() => {\n process.exitCode = result.exitCode\n })\n )\n }\n})\n\nNodeRuntime.runMain(Effect.provide(main, NodeContext.layer))\n"],"names":["listKeys","Schema","Effect"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prover-coder-ai/dist-deps-prune",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "CLI to prune unused dependencies based on dist output",
5
5
  "main": "dist/main.js",
6
6
  "files": [