@prover-coder-ai/dist-deps-prune 1.0.8 → 1.0.9

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,11 @@
1
1
  # dist-deps-prune
2
2
 
3
+ ## 1.0.9
4
+
5
+ ### Patch Changes
6
+
7
+ - chore: automated version bump
8
+
3
9
  ## 1.0.8
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # dist-deps-prune
2
2
 
3
- CLI utility that scans a built `dist/` directory to find **actually used** external packages, reports unused dependencies, and can prune `package.json` for release.
3
+ CLI utility that scans published build outputs (from `package.json` `files`) to find **actually used** external packages, reports unused dependencies, and can prune `package.json` for release.
4
4
 
5
5
  ## Install
6
6
 
@@ -13,19 +13,19 @@ npm i -D @prover-coder-ai/dist-deps-prune
13
13
  ### Scan only
14
14
 
15
15
  ```bash
16
- npx @prover-coder-ai/dist-deps-prune scan --dist ./dist --package ./package.json
16
+ npx @prover-coder-ai/dist-deps-prune scan --package ./package.json
17
17
  ```
18
18
 
19
19
  ### Apply pruning
20
20
 
21
21
  ```bash
22
- npx @prover-coder-ai/dist-deps-prune apply --dist ./dist --package ./package.json --write --prune-dev true
22
+ npx @prover-coder-ai/dist-deps-prune apply --package ./package.json --write --prune-dev true
23
23
  ```
24
24
 
25
25
  ### Release mode (backup + restore)
26
26
 
27
27
  ```bash
28
- npx @prover-coder-ai/dist-deps-prune release --dist ./dist --package ./package.json --command "npm publish"
28
+ npx @prover-coder-ai/dist-deps-prune release --package ./package.json --command "npm publish"
29
29
  ```
30
30
 
31
31
  ### Restore package.json
@@ -36,7 +36,7 @@ npx @prover-coder-ai/dist-deps-prune restore --package ./package.json
36
36
 
37
37
  ## CI/CD (Release workflow)
38
38
 
39
- Use the tool during release so only the `dist/`-used dependencies stay in the published package.
39
+ Use the tool during release so only the published outputs’ dependencies stay in the package.
40
40
  Below is a minimal GitHub Actions snippet that builds, prunes, publishes, and restores automatically:
41
41
 
42
42
  ```yaml
@@ -46,7 +46,6 @@ Below is a minimal GitHub Actions snippet that builds, prunes, publishes, and re
46
46
  - name: Publish with dist-deps-prune (auto restore)
47
47
  run: |
48
48
  npx @prover-coder-ai/dist-deps-prune release \
49
- --dist ./dist \
50
49
  --package ./package.json \
51
50
  --prune-dev true \
52
51
  --command "npm publish" \
package/dist/main.js CHANGED
@@ -33,6 +33,7 @@ const parseCommand = (value) => Match.value(value).pipe(
33
33
  const defaultArgs = (command) => ({
34
34
  command,
35
35
  dist: "./dist",
36
+ distExplicit: false,
36
37
  packagePath: "./package.json",
37
38
  ignorePath: void 0,
38
39
  ignorePathExplicit: false,
@@ -82,7 +83,8 @@ const flagParsers = {
82
83
  })),
83
84
  dist: (current, inlineValue, nextValue) => parseValueFlag("dist", current, inlineValue, nextValue, (args, value) => ({
84
85
  ...args,
85
- dist: value
86
+ dist: value,
87
+ distExplicit: true
86
88
  })),
87
89
  package: (current, inlineValue, nextValue) => parseValueFlag("package", current, inlineValue, nextValue, (args, value) => ({
88
90
  ...args,
@@ -166,7 +168,7 @@ const parseCliArgs = (argv) => {
166
168
  const parsed = commandEither.right;
167
169
  return parseFlags(rawArgs, parsed.startIndex, defaultArgs(parsed.command));
168
170
  };
169
- const unique = (values) => {
171
+ const unique$1 = (values) => {
170
172
  const seen = /* @__PURE__ */ new Set();
171
173
  const result = [];
172
174
  for (const value of values) {
@@ -185,7 +187,7 @@ const defaultPatterns = (distPath) => [
185
187
  ];
186
188
  const resolvePatterns = (cli, fileConfig) => cli.patterns ?? fileConfig?.patterns ?? defaultPatterns(cli.dist);
187
189
  const resolveIgnorePatterns = (fileConfig) => fileConfig?.ignorePatterns ?? [];
188
- const resolveKeep = (cli, fileConfig) => unique([...fileConfig?.keep ?? [], ...cli.keep]);
190
+ const resolveKeep = (cli, fileConfig) => unique$1([...fileConfig?.keep ?? [], ...cli.keep]);
189
191
  const resolvePruneDev = (cli, fileConfig) => cli.pruneDev ?? fileConfig?.pruneDev ?? cli.command === "release";
190
192
  const resolvePruneOptional = (cli, fileConfig) => cli.pruneOptional ?? fileConfig?.pruneOptional ?? false;
191
193
  const resolveConfig = (cli, fileConfig) => {
@@ -197,42 +199,6 @@ const resolveConfig = (cli, fileConfig) => {
197
199
  pruneOptional: resolvePruneOptional(cli, fileConfig)
198
200
  };
199
201
  };
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
- Remove them from devDependencies and keep them only in dependencies or peerDependencies, then retry.`
226
- });
227
- const sortStrings = (values) => values.toSorted((left, right) => left.localeCompare(right));
228
- const listDevDependenciesUsedInDist = (used, pkg) => {
229
- const devDependencies = pkg.devDependencies;
230
- if (devDependencies === void 0) {
231
- return [];
232
- }
233
- const hits = Object.keys(devDependencies).filter((name) => used.has(name));
234
- return sortStrings(hits);
235
- };
236
202
  const makePackageJsonError = (message) => ({
237
203
  _tag: "PackageJsonError",
238
204
  message
@@ -297,6 +263,298 @@ const omitDependencyFields = (value) => {
297
263
  return result;
298
264
  };
299
265
  const isJsonObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
266
+ const normalizePath$1 = (value) => value.replaceAll("\\", "/");
267
+ const stripDotSlash$1 = (value) => value.startsWith("./") ? value.slice(2) : value;
268
+ const findWildcardIndex = (value) => {
269
+ const star = value.indexOf("*");
270
+ const question = value.indexOf("?");
271
+ if (star === -1) {
272
+ return question;
273
+ }
274
+ if (question === -1) {
275
+ return star;
276
+ }
277
+ return Math.min(star, question);
278
+ };
279
+ const trimSlashes = (value) => value.endsWith("/") ? value.slice(0, -1) : value;
280
+ const normalizeFilesEntry = (value) => {
281
+ const trimmed = value.trim();
282
+ if (trimmed === "" || trimmed.startsWith("!")) {
283
+ return void 0;
284
+ }
285
+ const normalized = stripDotSlash$1(normalizePath$1(trimmed));
286
+ const sanitized = normalized.startsWith("/") ? normalized.slice(1) : normalized;
287
+ if (sanitized === "" || sanitized === "." || sanitized === "..") {
288
+ return void 0;
289
+ }
290
+ return sanitized;
291
+ };
292
+ const withNormalizedFilesEntry = (value, toResult) => {
293
+ const sanitized = normalizeFilesEntry(value);
294
+ if (sanitized === void 0) {
295
+ return void 0;
296
+ }
297
+ return toResult(sanitized);
298
+ };
299
+ const stripWildcardPrefix = (value) => {
300
+ const wildcardIndex = findWildcardIndex(value);
301
+ return wildcardIndex >= 0 ? value.slice(0, wildcardIndex) : value;
302
+ };
303
+ const normalizeFilesPrefix = (value) => {
304
+ const prefix = stripWildcardPrefix(value);
305
+ const withoutTrailing = trimSlashes(prefix);
306
+ if (withoutTrailing === "" || withoutTrailing === "." || withoutTrailing === "..") {
307
+ return void 0;
308
+ }
309
+ return withoutTrailing;
310
+ };
311
+ const deriveRootFromPrefix = (value) => {
312
+ const segments = value.split("/");
313
+ const last = segments.at(-1);
314
+ if (last === void 0) {
315
+ return void 0;
316
+ }
317
+ const hasExtension = last.includes(".");
318
+ if (segments.length === 1) {
319
+ return hasExtension ? void 0 : value;
320
+ }
321
+ if (hasExtension) {
322
+ return segments.slice(0, -1).join("/");
323
+ }
324
+ return value;
325
+ };
326
+ const toStringArray = (value) => Array.isArray(value) ? value.filter((entry) => typeof entry === "string") : [];
327
+ const readStringField = (value) => typeof value === "string" ? [value] : [];
328
+ const isJsonArray = (value) => Array.isArray(value);
329
+ const readBinField = (value) => {
330
+ if (value === void 0) {
331
+ return [];
332
+ }
333
+ if (typeof value === "string") {
334
+ return [value];
335
+ }
336
+ if (isJsonObject(value)) {
337
+ const result = [];
338
+ for (const key of Object.keys(value)) {
339
+ const entry = value[key];
340
+ if (typeof entry === "string") {
341
+ result.push(entry);
342
+ }
343
+ }
344
+ return result;
345
+ }
346
+ return [];
347
+ };
348
+ const collectExportPathsFromArray = (value) => {
349
+ const result = [];
350
+ for (const entry of value) {
351
+ const nested = collectExportPaths(entry);
352
+ for (const item of nested) {
353
+ result.push(item);
354
+ }
355
+ }
356
+ return result;
357
+ };
358
+ const collectExportPathsFromObject = (value) => {
359
+ const result = [];
360
+ for (const key of Object.keys(value)) {
361
+ const entry = value[key];
362
+ if (entry === void 0) {
363
+ continue;
364
+ }
365
+ const nested = collectExportPaths(entry);
366
+ for (const item of nested) {
367
+ result.push(item);
368
+ }
369
+ }
370
+ return result;
371
+ };
372
+ const collectExportPaths = (value) => {
373
+ if (typeof value === "string") {
374
+ return [value];
375
+ }
376
+ if (isJsonArray(value)) {
377
+ return collectExportPathsFromArray(value);
378
+ }
379
+ if (isJsonObject(value)) {
380
+ return collectExportPathsFromObject(value);
381
+ }
382
+ return [];
383
+ };
384
+ const readExportsField = (value) => value === void 0 ? [] : collectExportPaths(value);
385
+ const hasJsExtension = (value) => normalizePath$1(value).toLowerCase().endsWith(".js") || normalizePath$1(value).toLowerCase().endsWith(".mjs") || normalizePath$1(value).toLowerCase().endsWith(".cjs") || normalizePath$1(value).toLowerCase().endsWith(".node");
386
+ const topLevelFromPath = (value) => {
387
+ const normalized = stripDotSlash$1(normalizePath$1(value));
388
+ const trimmed = normalized.startsWith("/") ? normalized.slice(1) : normalized;
389
+ const [first, ...rest] = trimmed.split("/");
390
+ const head = first ?? "";
391
+ if (head === "" || head === "." || head === ".." || head.includes("*")) {
392
+ return void 0;
393
+ }
394
+ if (rest.length === 0) {
395
+ return void 0;
396
+ }
397
+ return head;
398
+ };
399
+ const rootFromFilesEntry = (value) => withNormalizedFilesEntry(value, (sanitized) => {
400
+ const prefix = normalizeFilesPrefix(sanitized);
401
+ if (prefix === void 0) {
402
+ return;
403
+ }
404
+ return deriveRootFromPrefix(prefix);
405
+ });
406
+ const topLevelFromFilesEntry = (value) => withNormalizedFilesEntry(value, (sanitized) => {
407
+ const segments = sanitized.split("/");
408
+ const head = segments[0] ?? "";
409
+ if (head === "" || head.includes("*")) {
410
+ return;
411
+ }
412
+ if (segments.length > 1) {
413
+ return head;
414
+ }
415
+ if (sanitized.endsWith("/")) {
416
+ return head;
417
+ }
418
+ return head.includes(".") ? void 0 : head;
419
+ });
420
+ const unique = (values) => [...new Set(values)];
421
+ const isBetterFrequency = (best, bestCount, key, count) => count > bestCount || count === bestCount && best !== void 0 && key < best;
422
+ const mostFrequent = (values) => {
423
+ if (values.length === 0) {
424
+ return void 0;
425
+ }
426
+ const counts = /* @__PURE__ */ new Map();
427
+ for (const value of values) {
428
+ counts.set(value, (counts.get(value) ?? 0) + 1);
429
+ }
430
+ let best;
431
+ let bestCount = -1;
432
+ for (const [key, count] of counts.entries()) {
433
+ if (isBetterFrequency(best, bestCount, key, count)) {
434
+ best = key;
435
+ bestCount = count;
436
+ }
437
+ }
438
+ return best;
439
+ };
440
+ const chooseCandidate = (primary, secondary) => {
441
+ if (primary.length === 0) {
442
+ return void 0;
443
+ }
444
+ const uniquePrimary = unique(primary);
445
+ if (uniquePrimary.length === 1) {
446
+ return uniquePrimary[0];
447
+ }
448
+ const secondarySet = new Set(secondary);
449
+ const intersection = uniquePrimary.filter((value) => secondarySet.has(value));
450
+ if (intersection.length === 1) {
451
+ return intersection[0];
452
+ }
453
+ return mostFrequent(primary);
454
+ };
455
+ const collectEntrypointPaths = (pkg) => [
456
+ ...readStringField(pkg["main"]),
457
+ ...readStringField(pkg["module"]),
458
+ ...readStringField(pkg["types"]),
459
+ ...readStringField(pkg["typings"]),
460
+ ...readBinField(pkg["bin"]),
461
+ ...readExportsField(pkg["exports"])
462
+ ];
463
+ const collectFilesDirs = (pkg) => {
464
+ const result = [];
465
+ for (const entry of toStringArray(pkg["files"])) {
466
+ const value = topLevelFromFilesEntry(entry);
467
+ if (value !== void 0) {
468
+ result.push(value);
469
+ }
470
+ }
471
+ return result;
472
+ };
473
+ const collectReleaseRoots = (pkg) => {
474
+ const result = [];
475
+ for (const entry of toStringArray(pkg["files"])) {
476
+ const value = rootFromFilesEntry(entry);
477
+ if (value !== void 0) {
478
+ result.push(value);
479
+ }
480
+ }
481
+ return result;
482
+ };
483
+ const collectEntrypointDirs = (paths) => {
484
+ const result = [];
485
+ for (const entry of paths) {
486
+ const value = topLevelFromPath(entry);
487
+ if (value !== void 0) {
488
+ result.push(value);
489
+ }
490
+ }
491
+ return result;
492
+ };
493
+ const collectJsEntrypointDirs = (paths) => {
494
+ const result = [];
495
+ for (const entry of paths) {
496
+ if (hasJsExtension(entry)) {
497
+ const value = topLevelFromPath(entry);
498
+ if (value !== void 0) {
499
+ result.push(value);
500
+ }
501
+ }
502
+ }
503
+ return result;
504
+ };
505
+ const inferDistDirFromPackageJson = (pkg) => {
506
+ const entrypointPaths = collectEntrypointPaths(pkg);
507
+ const jsEntrypointDirs = collectJsEntrypointDirs(entrypointPaths);
508
+ const entrypointDirs = collectEntrypointDirs(entrypointPaths);
509
+ const filesDirs = collectFilesDirs(pkg);
510
+ const fromJsEntrypoints = chooseCandidate(jsEntrypointDirs, filesDirs);
511
+ if (fromJsEntrypoints !== void 0) {
512
+ return fromJsEntrypoints;
513
+ }
514
+ const fromEntrypoints = chooseCandidate(entrypointDirs, filesDirs);
515
+ if (fromEntrypoints !== void 0) {
516
+ return fromEntrypoints;
517
+ }
518
+ return mostFrequent(filesDirs);
519
+ };
520
+ const inferDistRootsFromPackageJson = (pkg) => unique(collectReleaseRoots(pkg));
521
+ const buildPatternsForDistPaths = (distPaths) => unique(distPaths.flatMap((distPath) => defaultPatterns(distPath)));
522
+ const configError = (message) => ({
523
+ _tag: "ConfigError",
524
+ message
525
+ });
526
+ const fileError = (message) => ({
527
+ _tag: "FileError",
528
+ message
529
+ });
530
+ const distNotFound = (path) => ({
531
+ _tag: "DistNotFound",
532
+ path
533
+ });
534
+ const parseFileError = (file, error) => ({
535
+ _tag: "ParseError",
536
+ file,
537
+ error
538
+ });
539
+ const restoreError = (message) => ({
540
+ _tag: "RestoreError",
541
+ message
542
+ });
543
+ const devDependencyInDist = (packages) => ({
544
+ _tag: "DevDependencyInDist",
545
+ packages,
546
+ message: `dist imports packages from devDependencies: ${packages.join(", ")}
547
+ Remove them from devDependencies and keep them only in dependencies or peerDependencies, then retry.`
548
+ });
549
+ const sortStrings = (values) => values.toSorted((left, right) => left.localeCompare(right));
550
+ const listDevDependenciesUsedInDist = (used, pkg) => {
551
+ const devDependencies = pkg.devDependencies;
552
+ if (devDependencies === void 0) {
553
+ return [];
554
+ }
555
+ const hits = Object.keys(devDependencies).filter((name) => used.has(name));
556
+ return sortStrings(hits);
557
+ };
300
558
  const emptyUnused = {
301
559
  dependencies: [],
302
560
  devDependencies: [],
@@ -454,6 +712,26 @@ const renderJsonReport = (report) => JSON.stringify(
454
712
  null,
455
713
  2
456
714
  );
715
+ const emptyScanOutcome = {
716
+ used: /* @__PURE__ */ new Set(),
717
+ warnings: [],
718
+ stats: { filesScanned: 0, importsFound: 0 }
719
+ };
720
+ const mergeScanOutcomes = (left, right) => ({
721
+ used: /* @__PURE__ */ new Set([...left.used, ...right.used]),
722
+ warnings: [...left.warnings, ...right.warnings],
723
+ stats: {
724
+ filesScanned: left.stats.filesScanned + right.stats.filesScanned,
725
+ importsFound: left.stats.importsFound + right.stats.importsFound
726
+ }
727
+ });
728
+ const mergeAllScanOutcomes = (outcomes) => {
729
+ let merged = emptyScanOutcome;
730
+ for (const outcome of outcomes) {
731
+ merged = mergeScanOutcomes(merged, outcome);
732
+ }
733
+ return merged;
734
+ };
457
735
  const loadBuiltinModules = Effect.tryPromise({
458
736
  try: () => import("node:module"),
459
737
  catch: (error) => fileError(String(error))
@@ -987,6 +1265,47 @@ const scanDist = (settings) => Effect.gen(function* (_) {
987
1265
  });
988
1266
  return yield* _(scanFiles(fs, filtered, settings));
989
1267
  });
1268
+ const resolveDistPath = (cli, pkg, path) => {
1269
+ if (cli.distExplicit) {
1270
+ return cli.dist;
1271
+ }
1272
+ const inferred = inferDistDirFromPackageJson(pkg);
1273
+ if (inferred === void 0) {
1274
+ return cli.dist;
1275
+ }
1276
+ return path.join(path.dirname(cli.packagePath), inferred);
1277
+ };
1278
+ const hasPatternsOverride = (cli, configFile) => cli.patterns !== void 0 || configFile?.patterns !== void 0;
1279
+ const resolveDistRoots = (cli, pkg) => cli.distExplicit ? [] : inferDistRootsFromPackageJson(pkg);
1280
+ const buildDistPaths = (useFiles, distRoots, packageDir, path) => useFiles ? distRoots.map((root) => path.join(packageDir, root)) : [];
1281
+ const resolveDistPathForScan = (useFiles, distPaths, cli, pkg, path) => useFiles ? distPaths[0] ?? cli.dist : resolveDistPath(cli, pkg, path);
1282
+ const resolvePatternsForScan = (useFiles, distPaths) => useFiles ? buildPatternsForDistPaths(distPaths) : void 0;
1283
+ const resolveScanPlan = (cli, configFile, pkg, path) => {
1284
+ const distRoots = resolveDistRoots(cli, pkg);
1285
+ const useFiles = distRoots.length > 0 && !hasPatternsOverride(cli, configFile);
1286
+ const packageDir = path.dirname(cli.packagePath);
1287
+ const distPaths = buildDistPaths(useFiles, distRoots, packageDir, path);
1288
+ const distPath = resolveDistPathForScan(useFiles, distPaths, cli, pkg, path);
1289
+ const patterns = resolvePatternsForScan(useFiles, distPaths);
1290
+ const resolved = resolveConfig(
1291
+ patterns === void 0 ? { ...cli, dist: distPath } : { ...cli, dist: distPath, patterns },
1292
+ configFile
1293
+ );
1294
+ return { distPath, distPaths, useFiles, resolved };
1295
+ };
1296
+ const scanFromPlan = (plan, builtins, strict) => plan.useFiles ? Effect$1.forEach(plan.distPaths, (current) => scanDist({
1297
+ distPath: current,
1298
+ patterns: plan.resolved.patterns,
1299
+ ignorePatterns: plan.resolved.ignorePatterns,
1300
+ strict,
1301
+ builtins
1302
+ }), { concurrency: 1 }).pipe(Effect$1.map((outcomes) => mergeAllScanOutcomes(outcomes))) : scanDist({
1303
+ distPath: plan.distPath,
1304
+ patterns: plan.resolved.patterns,
1305
+ ignorePatterns: plan.resolved.ignorePatterns,
1306
+ strict,
1307
+ builtins
1308
+ });
990
1309
  const emptyReport = {
991
1310
  used: [],
992
1311
  unused: {
@@ -1028,27 +1347,20 @@ const runReleaseCommand = (cli, plan, backupPath) => Effect$1.gen(function* (_)
1028
1347
  const analyzeProject = (cli) => Effect$1.gen(function* (_) {
1029
1348
  const configPath = cli.ignorePath ?? "./.dist-deps-prune.json";
1030
1349
  const configFile = yield* _(loadConfigFile(configPath, cli.ignorePathExplicit));
1031
- const resolved = resolveConfig(cli, configFile);
1032
- const builtins = yield* _(loadBuiltinModules);
1033
- const scan = yield* _(
1034
- scanDist({
1035
- distPath: cli.dist,
1036
- patterns: resolved.patterns,
1037
- ignorePatterns: resolved.ignorePatterns,
1038
- strict: cli.strict,
1039
- builtins
1040
- })
1041
- );
1042
1350
  const pkg = yield* _(readPackageJson(cli.packagePath));
1351
+ const path = yield* _(Path);
1352
+ const scanPlan = resolveScanPlan(cli, configFile, pkg, path);
1353
+ const builtins = yield* _(loadBuiltinModules);
1354
+ const scan = yield* _(scanFromPlan(scanPlan, builtins, cli.strict));
1043
1355
  const usedInDev = listDevDependenciesUsedInDist(scan.used, pkg);
1044
1356
  if (usedInDev.length > 0) {
1045
1357
  return yield* _(Effect$1.fail(devDependencyInDist(usedInDev)));
1046
1358
  }
1047
1359
  const plan = buildPrunePlan(pkg, {
1048
1360
  used: scan.used,
1049
- keep: new Set(resolved.keep),
1050
- pruneDev: resolved.pruneDev,
1051
- pruneOptional: resolved.pruneOptional,
1361
+ keep: new Set(scanPlan.resolved.keep),
1362
+ pruneDev: scanPlan.resolved.pruneDev,
1363
+ pruneOptional: scanPlan.resolved.pruneOptional,
1052
1364
  conservative: cli.conservative,
1053
1365
  hasUncertainty: scan.warnings.length > 0
1054
1366
  });
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/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 \"Remove them from devDependencies and keep them only in dependencies or peerDependencies, then retry.\"\n})\n","import type { PackageJson } from \"./package-json.js\"\n\n// CHANGE: add invariant checks for dist-used devDependencies\n// WHY: forbid devDependencies in runtime imports even if duplicated elsewhere\n// QUOTE(TZ): \"надо что бы он заставлял полностью удалять dev\"\n// REF: req-guard-devdeps-1\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in result: p in used and p in devDependencies\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\n/**\n * List devDependencies 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.\n *\n * @pure true\n * @invariant result subset of used and keys(pkg.devDependencies)\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 hits = Object.keys(devDependencies).filter((name) => used.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":["Schema","Effect"],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sources":["../src/core/cli.ts","../src/core/config.ts","../src/core/package-json.ts","../src/core/dist-path.ts","../src/core/errors.ts","../src/core/invariants.ts","../src/core/prune.ts","../src/core/report.ts","../src/core/scan-outcome.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 distExplicit: boolean\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 distExplicit: false,\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 distExplicit: true\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 { defaultPatterns } from \"./config.js\"\nimport type { Json, JsonObject } from \"./json.js\"\nimport type { PackageJson } from \"./package-json.js\"\nimport { isJsonObject } from \"./package-json.js\"\n\n// CHANGE: infer dist directory candidates from package.json entrypoints and files\n// WHY: allow default dist resolution without forcing --dist for non-standard output folders\n// QUOTE(TZ): \"анализировал где смотреть запакованную версию исходя из package.json\"\n// REF: req-dist-infer-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀pkg: infer(pkg)=d → d ∈ Candidates(pkg) ∪ {undefined}\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: inferred distDir is a top-level path segment\n// COMPLEXITY: O(n) where n = number of inspected paths\n\nconst normalizePath = (value: string): string => value.replaceAll(\"\\\\\", \"/\")\nconst stripDotSlash = (value: string): string => value.startsWith(\"./\") ? value.slice(2) : value\nconst findWildcardIndex = (value: string): number => {\n const star = value.indexOf(\"*\")\n const question = value.indexOf(\"?\")\n if (star === -1) {\n return question\n }\n if (question === -1) {\n return star\n }\n return Math.min(star, question)\n}\nconst trimSlashes = (value: string): string => value.endsWith(\"/\") ? value.slice(0, -1) : value\nconst normalizeFilesEntry = (value: string): string | undefined => {\n const trimmed = value.trim()\n if (trimmed === \"\" || trimmed.startsWith(\"!\")) {\n return undefined\n }\n const normalized = stripDotSlash(normalizePath(trimmed))\n const sanitized = normalized.startsWith(\"/\") ? normalized.slice(1) : normalized\n if (sanitized === \"\" || sanitized === \".\" || sanitized === \"..\") {\n return undefined\n }\n return sanitized\n}\nconst withNormalizedFilesEntry = <T>(\n value: string,\n toResult: (sanitized: string) => T | undefined\n): T | undefined => {\n const sanitized = normalizeFilesEntry(value)\n if (sanitized === undefined) {\n return undefined\n }\n return toResult(sanitized)\n}\nconst stripWildcardPrefix = (value: string): string => {\n const wildcardIndex = findWildcardIndex(value)\n return wildcardIndex >= 0 ? value.slice(0, wildcardIndex) : value\n}\nconst normalizeFilesPrefix = (value: string): string | undefined => {\n const prefix = stripWildcardPrefix(value)\n const withoutTrailing = trimSlashes(prefix)\n if (withoutTrailing === \"\" || withoutTrailing === \".\" || withoutTrailing === \"..\") {\n return undefined\n }\n return withoutTrailing\n}\nconst deriveRootFromPrefix = (value: string): string | undefined => {\n const segments = value.split(\"/\")\n const last = segments.at(-1)\n if (last === undefined) {\n return undefined\n }\n const hasExtension = last.includes(\".\")\n if (segments.length === 1) {\n return hasExtension ? undefined : value\n }\n if (hasExtension) {\n return segments.slice(0, -1).join(\"/\")\n }\n return value\n}\nconst toStringArray = (value: Json | undefined): ReadonlyArray<string> =>\n Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\") : []\n\nconst readStringField = (value: Json | undefined): ReadonlyArray<string> => typeof value === \"string\" ? [value] : []\n\nconst isJsonArray = (value: Json): value is ReadonlyArray<Json> => Array.isArray(value)\n\nconst readBinField = (value: Json | undefined): ReadonlyArray<string> => {\n if (value === undefined) {\n return []\n }\n if (typeof value === \"string\") {\n return [value]\n }\n if (isJsonObject(value)) {\n const result: Array<string> = []\n for (const key of Object.keys(value)) {\n const entry = value[key]\n if (typeof entry === \"string\") {\n result.push(entry)\n }\n }\n return result\n }\n return []\n}\n\nconst collectExportPathsFromArray = (value: ReadonlyArray<Json>): ReadonlyArray<string> => {\n const result: Array<string> = []\n for (const entry of value) {\n const nested = collectExportPaths(entry)\n for (const item of nested) {\n result.push(item)\n }\n }\n return result\n}\n\nconst collectExportPathsFromObject = (value: JsonObject): ReadonlyArray<string> => {\n const result: Array<string> = []\n for (const key of Object.keys(value)) {\n const entry = value[key]\n if (entry === undefined) {\n continue\n }\n const nested = collectExportPaths(entry)\n for (const item of nested) {\n result.push(item)\n }\n }\n return result\n}\n\nconst collectExportPaths = (value: Json): ReadonlyArray<string> => {\n if (typeof value === \"string\") {\n return [value]\n }\n if (isJsonArray(value)) {\n return collectExportPathsFromArray(value)\n }\n if (isJsonObject(value)) {\n return collectExportPathsFromObject(value)\n }\n return []\n}\n\nconst readExportsField = (value: Json | undefined): ReadonlyArray<string> =>\n value === undefined ? [] : collectExportPaths(value)\n\nconst hasJsExtension = (value: string): boolean =>\n normalizePath(value).toLowerCase().endsWith(\".js\") ||\n normalizePath(value).toLowerCase().endsWith(\".mjs\") ||\n normalizePath(value).toLowerCase().endsWith(\".cjs\") ||\n normalizePath(value).toLowerCase().endsWith(\".node\")\n\nconst topLevelFromPath = (value: string): string | undefined => {\n const normalized = stripDotSlash(normalizePath(value))\n const trimmed = normalized.startsWith(\"/\") ? normalized.slice(1) : normalized\n const [first, ...rest] = trimmed.split(\"/\")\n const head = first ?? \"\"\n if (head === \"\" || head === \".\" || head === \"..\" || head.includes(\"*\")) {\n return undefined\n }\n if (rest.length === 0) {\n return undefined\n }\n return head\n}\n\nconst rootFromFilesEntry = (value: string): string | undefined =>\n withNormalizedFilesEntry(value, (sanitized) => {\n const prefix = normalizeFilesPrefix(sanitized)\n if (prefix === undefined) {\n return\n }\n return deriveRootFromPrefix(prefix)\n })\n\nconst topLevelFromFilesEntry = (value: string): string | undefined =>\n withNormalizedFilesEntry(value, (sanitized) => {\n const segments = sanitized.split(\"/\")\n const head = segments[0] ?? \"\"\n if (head === \"\" || head.includes(\"*\")) {\n return\n }\n if (segments.length > 1) {\n return head\n }\n if (sanitized.endsWith(\"/\")) {\n return head\n }\n return head.includes(\".\") ? undefined : head\n })\n\nconst unique = (values: ReadonlyArray<string>): ReadonlyArray<string> => [...new Set(values)]\n\nconst isBetterFrequency = (\n best: string | undefined,\n bestCount: number,\n key: string,\n count: number\n): boolean => count > bestCount || (count === bestCount && best !== undefined && key < best)\n\nconst mostFrequent = (values: ReadonlyArray<string>): string | undefined => {\n if (values.length === 0) {\n return undefined\n }\n const counts = new Map<string, number>()\n for (const value of values) {\n counts.set(value, (counts.get(value) ?? 0) + 1)\n }\n let best: string | undefined\n let bestCount = -1\n for (const [key, count] of counts.entries()) {\n if (isBetterFrequency(best, bestCount, key, count)) {\n best = key\n bestCount = count\n }\n }\n return best\n}\n\nconst chooseCandidate = (\n primary: ReadonlyArray<string>,\n secondary: ReadonlyArray<string>\n): string | undefined => {\n if (primary.length === 0) {\n return undefined\n }\n const uniquePrimary = unique(primary)\n if (uniquePrimary.length === 1) {\n return uniquePrimary[0]\n }\n const secondarySet = new Set(secondary)\n const intersection = uniquePrimary.filter((value) => secondarySet.has(value))\n if (intersection.length === 1) {\n return intersection[0]\n }\n return mostFrequent(primary)\n}\n\nconst collectEntrypointPaths = (pkg: PackageJson): ReadonlyArray<string> => [\n ...readStringField(pkg[\"main\"]),\n ...readStringField(pkg[\"module\"]),\n ...readStringField(pkg[\"types\"]),\n ...readStringField(pkg[\"typings\"]),\n ...readBinField(pkg[\"bin\"]),\n ...readExportsField(pkg[\"exports\"])\n]\n\nconst collectFilesDirs = (pkg: PackageJson): ReadonlyArray<string> => {\n const result: Array<string> = []\n for (const entry of toStringArray(pkg[\"files\"])) {\n const value = topLevelFromFilesEntry(entry)\n if (value !== undefined) {\n result.push(value)\n }\n }\n return result\n}\n\nconst collectReleaseRoots = (pkg: PackageJson): ReadonlyArray<string> => {\n const result: Array<string> = []\n for (const entry of toStringArray(pkg[\"files\"])) {\n const value = rootFromFilesEntry(entry)\n if (value !== undefined) {\n result.push(value)\n }\n }\n return result\n}\n\nconst collectEntrypointDirs = (paths: ReadonlyArray<string>): ReadonlyArray<string> => {\n const result: Array<string> = []\n for (const entry of paths) {\n const value = topLevelFromPath(entry)\n if (value !== undefined) {\n result.push(value)\n }\n }\n return result\n}\n\nconst collectJsEntrypointDirs = (paths: ReadonlyArray<string>): ReadonlyArray<string> => {\n const result: Array<string> = []\n for (const entry of paths) {\n if (hasJsExtension(entry)) {\n const value = topLevelFromPath(entry)\n if (value !== undefined) {\n result.push(value)\n }\n }\n }\n return result\n}\n\n/**\n * Infer the top-level dist directory from package.json metadata.\n *\n * @param pkg - Parsed package.json object.\n * @returns Dist directory name or undefined when no candidates exist.\n *\n * @pure true\n * @invariant returned value is a top-level path segment\n * @complexity O(n)\n */\nexport const inferDistDirFromPackageJson = (pkg: PackageJson): string | undefined => {\n const entrypointPaths = collectEntrypointPaths(pkg)\n const jsEntrypointDirs = collectJsEntrypointDirs(entrypointPaths)\n const entrypointDirs = collectEntrypointDirs(entrypointPaths)\n const filesDirs = collectFilesDirs(pkg)\n\n const fromJsEntrypoints = chooseCandidate(jsEntrypointDirs, filesDirs)\n if (fromJsEntrypoints !== undefined) {\n return fromJsEntrypoints\n }\n const fromEntrypoints = chooseCandidate(entrypointDirs, filesDirs)\n if (fromEntrypoints !== undefined) {\n return fromEntrypoints\n }\n return mostFrequent(filesDirs)\n}\n\n// CHANGE: derive scan roots from package.json files entries\n// WHY: treat published directories as authoritative release sources\n// QUOTE(TZ): \"он правильно работал с files\"\n// REF: req-dist-files-1\n// SOURCE: n/a\n// FORMAT THEOREM: ∀r ∈ roots: r is relative directory path\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: roots are unique and non-empty\n// COMPLEXITY: O(n)\nexport const inferDistRootsFromPackageJson = (pkg: PackageJson): ReadonlyArray<string> =>\n unique(collectReleaseRoots(pkg))\n\n// CHANGE: build scan patterns for multiple dist roots\n// WHY: support scanning all published directories from package.json files\n// QUOTE(TZ): \"их надо анализировать\"\n// REF: req-dist-files-2\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p ∈ paths: patterns(p) cover {js,mjs,cjs,d.ts}\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: patterns list is non-empty when distPaths is non-empty\n// COMPLEXITY: O(n)\nexport const buildPatternsForDistPaths = (\n distPaths: ReadonlyArray<string>\n): ReadonlyArray<string> => unique(distPaths.flatMap((distPath) => defaultPatterns(distPath)))\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 \"Remove them from devDependencies and keep them only in dependencies or peerDependencies, then retry.\"\n})\n","import type { PackageJson } from \"./package-json.js\"\n\n// CHANGE: add invariant checks for dist-used devDependencies\n// WHY: forbid devDependencies in runtime imports even if duplicated elsewhere\n// QUOTE(TZ): \"надо что бы он заставлял полностью удалять dev\"\n// REF: req-guard-devdeps-1\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in result: p in used and p in devDependencies\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\n/**\n * List devDependencies 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.\n *\n * @pure true\n * @invariant result subset of used and keys(pkg.devDependencies)\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 hits = Object.keys(devDependencies).filter((name) => used.has(name))\n return sortStrings(hits)\n}\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 { ScanOutcome } from \"./types.js\"\n\n// CHANGE: provide pure helpers for scan outcome aggregation\n// WHY: enable multi-root scanning while preserving functional core\n// QUOTE(TZ): \"их надо анализировать\"\n// REF: req-dist-files-3\n// SOURCE: n/a\n// FORMAT THEOREM: ∀a,b: used(merge(a,b)) = used(a) ∪ used(b)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: stats are additive\n// COMPLEXITY: O(n + m)\n\nexport const emptyScanOutcome: ScanOutcome = {\n used: new Set<string>(),\n warnings: [],\n stats: { filesScanned: 0, importsFound: 0 }\n}\n\n/**\n * Merge two scan outcomes.\n *\n * @param left - First scan outcome.\n * @param right - Second scan outcome.\n * @returns Combined scan outcome.\n *\n * @pure true\n * @invariant used = union of inputs\n * @complexity O(n + m)\n */\nexport const mergeScanOutcomes = (left: ScanOutcome, right: ScanOutcome): ScanOutcome => ({\n used: new Set<string>([...left.used, ...right.used]),\n warnings: [...left.warnings, ...right.warnings],\n stats: {\n filesScanned: left.stats.filesScanned + right.stats.filesScanned,\n importsFound: left.stats.importsFound + right.stats.importsFound\n }\n})\n\n// CHANGE: aggregate multiple scan outcomes without Array.reduce\n// WHY: comply with lint rules while preserving pure aggregation\n// QUOTE(TZ): \"их надо анализировать\"\n// REF: req-dist-files-4\n// SOURCE: n/a\n// FORMAT THEOREM: ∀xs: used(mergeAll(xs)) = ⋃ used(x)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: stats are additive across outcomes\n// COMPLEXITY: O(n + m)\nexport const mergeAllScanOutcomes = (\n outcomes: ReadonlyArray<ScanOutcome>\n): ScanOutcome => {\n let merged = emptyScanOutcome\n for (const outcome of outcomes) {\n merged = mergeScanOutcomes(merged, outcome)\n }\n return merged\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 { type FileConfig, resolveConfig, type ResolvedConfig } from \"../core/config.js\"\nimport {\n buildPatternsForDistPaths,\n inferDistDirFromPackageJson,\n inferDistRootsFromPackageJson\n} from \"../core/dist-path.js\"\nimport { type AppError, devDependencyInDist } from \"../core/errors.js\"\nimport { listDevDependenciesUsedInDist } from \"../core/invariants.js\"\nimport type { PackageJson } from \"../core/package-json.js\"\nimport type { PrunePlan } from \"../core/prune.js\"\nimport { buildPrunePlan } from \"../core/prune.js\"\nimport { buildReport, renderHumanReport, renderJsonReport } from \"../core/report.js\"\nimport { mergeAllScanOutcomes } from \"../core/scan-outcome.js\"\nimport type { Report, ScanOutcome } 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\n// CHANGE: resolve dist path from package.json when --dist is not provided\n// WHY: support non-standard build output directories without extra CLI flags\n// QUOTE(TZ): \"анализировал где смотреть запакованную версию исходя из package.json\"\n// REF: req-dist-infer-2\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cli,pkg: dist(cli,pkg)=cli.dist if explicit else join(dirname(pkg), infer(pkg) ?? cli.dist)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: resolved distPath is deterministic for fixed inputs\n// COMPLEXITY: O(1)\nconst resolveDistPath = (\n cli: CliArgs,\n pkg: PackageJson,\n path: PathService\n): string => {\n if (cli.distExplicit) {\n return cli.dist\n }\n const inferred = inferDistDirFromPackageJson(pkg)\n if (inferred === undefined) {\n return cli.dist\n }\n return path.join(path.dirname(cli.packagePath), inferred)\n}\n\ninterface ScanPlan {\n readonly distPath: string\n readonly distPaths: ReadonlyArray<string>\n readonly useFiles: boolean\n readonly resolved: ResolvedConfig\n}\n\nconst hasPatternsOverride = (cli: CliArgs, configFile: FileConfig | undefined): boolean =>\n cli.patterns !== undefined || configFile?.patterns !== undefined\n\nconst resolveDistRoots = (cli: CliArgs, pkg: PackageJson): ReadonlyArray<string> =>\n cli.distExplicit ? [] : inferDistRootsFromPackageJson(pkg)\n\nconst buildDistPaths = (\n useFiles: boolean,\n distRoots: ReadonlyArray<string>,\n packageDir: string,\n path: PathService\n): ReadonlyArray<string> => (useFiles ? distRoots.map((root) => path.join(packageDir, root)) : [])\n\nconst resolveDistPathForScan = (\n useFiles: boolean,\n distPaths: ReadonlyArray<string>,\n cli: CliArgs,\n pkg: PackageJson,\n path: PathService\n): string => (useFiles ? distPaths[0] ?? cli.dist : resolveDistPath(cli, pkg, path))\n\nconst resolvePatternsForScan = (\n useFiles: boolean,\n distPaths: ReadonlyArray<string>\n): ReadonlyArray<string> | undefined => (useFiles ? buildPatternsForDistPaths(distPaths) : undefined)\n\n// CHANGE: compute scan plan from CLI, config, and package.json\n// WHY: keep analyzeProject within lint limits while preserving determinism\n// QUOTE(TZ): \"анализировал где смотреть запакованную версию исходя из package.json\"\n// REF: req-dist-infer-3\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cli,pkg: plan(cli,pkg).distPath deterministic\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: resolved patterns list is non-empty\n// COMPLEXITY: O(n)\nconst resolveScanPlan = (\n cli: CliArgs,\n configFile: FileConfig | undefined,\n pkg: PackageJson,\n path: PathService\n): ScanPlan => {\n const distRoots = resolveDistRoots(cli, pkg)\n const useFiles = distRoots.length > 0 && !hasPatternsOverride(cli, configFile)\n const packageDir = path.dirname(cli.packagePath)\n const distPaths = buildDistPaths(useFiles, distRoots, packageDir, path)\n const distPath = resolveDistPathForScan(useFiles, distPaths, cli, pkg, path)\n const patterns = resolvePatternsForScan(useFiles, distPaths)\n const resolved = resolveConfig(\n patterns === undefined ? { ...cli, dist: distPath } : { ...cli, dist: distPath, patterns },\n configFile\n )\n return { distPath, distPaths, useFiles, resolved }\n}\n\n// CHANGE: run scan according to computed scan plan\n// WHY: isolate multi-root scan behavior for lint and readability\n// QUOTE(TZ): \"их надо анализировать\"\n// REF: req-dist-files-5\n// SOURCE: n/a\n// FORMAT THEOREM: ∀plan: scan(plan) returns ScanOutcome\n// PURITY: SHELL\n// EFFECT: Effect<ScanOutcome, AppError, FileSystem | Path>\n// INVARIANT: stats are additive across roots\n// COMPLEXITY: O(n)\nconst scanFromPlan = (\n plan: ScanPlan,\n builtins: ReadonlySet<string>,\n strict: boolean\n): Effect.Effect<ScanOutcome, AppError, ScanEnv> =>\n plan.useFiles\n ? Effect.forEach(plan.distPaths, (current) =>\n scanDist({\n distPath: current,\n patterns: plan.resolved.patterns,\n ignorePatterns: plan.resolved.ignorePatterns,\n strict,\n builtins\n }), { concurrency: 1 }).pipe(Effect.map((outcomes) => mergeAllScanOutcomes(outcomes)))\n : scanDist({\n distPath: plan.distPath,\n patterns: plan.resolved.patterns,\n ignorePatterns: plan.resolved.ignorePatterns,\n strict,\n builtins\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 pkg = yield* _(readPackageJson(cli.packagePath))\n const path = yield* _(Path)\n const scanPlan = resolveScanPlan(cli, configFile, pkg, path)\n const builtins = yield* _(loadBuiltinModules)\n const scan = yield* _(scanFromPlan(scanPlan, builtins, cli.strict))\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(scanPlan.resolved.keep),\n pruneDev: scanPlan.resolved.pruneDev,\n pruneOptional: scanPlan.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":["unique","normalizePath","stripDotSlash","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.8",
3
+ "version": "1.0.9",
4
4
  "description": "CLI to prune unused dependencies based on dist output",
5
5
  "main": "dist/main.js",
6
6
  "files": [