@trebired/code-discipline 3.3.2 → 3.4.0

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.
Files changed (81) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +2 -0
  3. package/dist/checks/fix-folderization.d.ts.map +1 -1
  4. package/dist/checks/fix-folderization.js +55 -10
  5. package/dist/checks/fix-folderization.js.map +1 -1
  6. package/dist/checks/progress.d.ts +30 -0
  7. package/dist/checks/progress.d.ts.map +1 -0
  8. package/dist/checks/progress.js +40 -0
  9. package/dist/checks/progress.js.map +1 -0
  10. package/dist/checks/rules/banned/files.d.ts.map +1 -1
  11. package/dist/checks/rules/banned/files.js +27 -3
  12. package/dist/checks/rules/banned/files.js.map +1 -1
  13. package/dist/checks/rules/banned/patterns.d.ts.map +1 -1
  14. package/dist/checks/rules/banned/patterns.js +10 -1
  15. package/dist/checks/rules/banned/patterns.js.map +1 -1
  16. package/dist/checks/rules/dry/candidates.d.ts +2 -2
  17. package/dist/checks/rules/dry/candidates.d.ts.map +1 -1
  18. package/dist/checks/rules/dry/candidates.js +32 -120
  19. package/dist/checks/rules/dry/candidates.js.map +1 -1
  20. package/dist/checks/rules/dry/index.js +1 -1
  21. package/dist/checks/rules/dry/index.js.map +1 -1
  22. package/dist/checks/rules/dry/matching.d.ts +12 -0
  23. package/dist/checks/rules/dry/matching.d.ts.map +1 -0
  24. package/dist/checks/rules/dry/matching.js +184 -0
  25. package/dist/checks/rules/dry/matching.js.map +1 -0
  26. package/dist/checks/rules/dry/similarity.d.ts +22 -0
  27. package/dist/checks/rules/dry/similarity.d.ts.map +1 -0
  28. package/dist/checks/rules/dry/similarity.js +108 -0
  29. package/dist/checks/rules/dry/similarity.js.map +1 -0
  30. package/dist/checks/rules/evasion-guards/index.d.ts.map +1 -1
  31. package/dist/checks/rules/evasion-guards/index.js +14 -3
  32. package/dist/checks/rules/evasion-guards/index.js.map +1 -1
  33. package/dist/checks/rules/folderize/compound-files.d.ts.map +1 -1
  34. package/dist/checks/rules/folderize/compound-files.js +10 -2
  35. package/dist/checks/rules/folderize/compound-files.js.map +1 -1
  36. package/dist/checks/rules/folderize/plan.d.ts.map +1 -1
  37. package/dist/checks/rules/folderize/plan.js +17 -3
  38. package/dist/checks/rules/folderize/plan.js.map +1 -1
  39. package/dist/checks/rules/max/file-lines.d.ts.map +1 -1
  40. package/dist/checks/rules/max/file-lines.js +15 -3
  41. package/dist/checks/rules/max/file-lines.js.map +1 -1
  42. package/dist/checks/rules/max/function-lines.d.ts.map +1 -1
  43. package/dist/checks/rules/max/function-lines.js +13 -4
  44. package/dist/checks/rules/max/function-lines.js.map +1 -1
  45. package/dist/checks/rules/remove-comments.d.ts.map +1 -1
  46. package/dist/checks/rules/remove-comments.js +43 -10
  47. package/dist/checks/rules/remove-comments.js.map +1 -1
  48. package/dist/checks/sync-options.d.ts +2 -1
  49. package/dist/checks/sync-options.d.ts.map +1 -1
  50. package/dist/checks/sync-options.js +1 -0
  51. package/dist/checks/sync-options.js.map +1 -1
  52. package/dist/checks/types.d.ts +3 -1
  53. package/dist/checks/types.d.ts.map +1 -1
  54. package/dist/cli/progress.d.ts +2 -2
  55. package/dist/cli/progress.d.ts.map +1 -1
  56. package/dist/cli/progress.js +23 -1
  57. package/dist/cli/progress.js.map +1 -1
  58. package/dist/cli/run-cli.d.ts.map +1 -1
  59. package/dist/cli/run-cli.js +53 -6
  60. package/dist/cli/run-cli.js.map +1 -1
  61. package/dist/config/normalize/check-options.d.ts.map +1 -1
  62. package/dist/config/normalize/check-options.js +1 -0
  63. package/dist/config/normalize/check-options.js.map +1 -1
  64. package/dist/config/normalize/sync-imports-options.d.ts.map +1 -1
  65. package/dist/config/normalize/sync-imports-options.js +1 -0
  66. package/dist/config/normalize/sync-imports-options.js.map +1 -1
  67. package/dist/imports/check-sync-imports.d.ts.map +1 -1
  68. package/dist/imports/check-sync-imports.js +10 -1
  69. package/dist/imports/check-sync-imports.js.map +1 -1
  70. package/dist/imports/rewrite.d.ts.map +1 -1
  71. package/dist/imports/rewrite.js +11 -1
  72. package/dist/imports/rewrite.js.map +1 -1
  73. package/dist/imports/types.d.ts +39 -1
  74. package/dist/imports/types.d.ts.map +1 -1
  75. package/dist/index.d.ts +1 -1
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/run.d.ts +2 -1
  78. package/dist/run.d.ts.map +1 -1
  79. package/dist/run.js +2 -0
  80. package/dist/run.js.map +1 -1
  81. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to `@trebired/code-discipline` will be documented here.
4
4
 
5
+ ## 3.4.0
6
+
7
+ - Rendered `dry` duplicate groups in CLI output with the duplicated function names, file paths, line numbers, confidence, and `signals: ...` metadata.
8
+ - Changed the public `dry` violation message to `duplicate function group` while keeping duplicate details intact for API and report consumers.
9
+ - Kept chunk progress output as after-chunk summaries for check and fix runs, including DRY parse/match result counts.
10
+
11
+ ## 3.3.3
12
+
13
+ - Added chunked rule progress for CLI/API check and fix runs, including per-chunk violation and mutation counts for long-running rules.
14
+ - Replaced the expensive all-pairs `dry` similarity pass with indexed matching and chunked parse/match progress to avoid stalls on large function sets.
15
+
5
16
  ## 3.3.2
6
17
 
7
18
  - Removed `dry.helpers` registration and the helper-based `dry` autofix path; `dry` now scans source functions directly.
package/README.md CHANGED
@@ -79,6 +79,8 @@ Typical `package.json` scripts can stay simple:
79
79
 
80
80
  `gate` runs the same repo config discovery as `check`. If violations are found, it exits non-zero and does not launch the child command. If the repo is clean, it starts the child command and forwards its exit status.
81
81
 
82
+ Long check and fix runs emit chunked rule progress in the CLI, including current violation counts and fix mutation counts where applicable.
83
+
82
84
  ## Config
83
85
 
84
86
  The CLI auto-discovers a top-level config module in this order:
@@ -1 +1 @@
1
- {"version":3,"file":"fix-folderization.d.ts","sourceRoot":"","sources":["../../src/checks/fix-folderization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,uBAAuB,EACvB,oCAAoC,EACrC,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAQ7E,KAAK,WAAW,GAAG;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,iBAAS,4BAA4B,CACnC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,oCAAoC,EAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,uBAAuB,CASzB;AAED,iBAAS,aAAa,CACpB,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,GAC5C;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,uBAAuB,EAAE,CAAA;CAAE,CAqBjE;AAuKD,iBAAe,gBAAgB,CAC7B,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,EAC7C,MAAM,EAAE,8BAA8B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CA4DlC;AAED,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"fix-folderization.d.ts","sourceRoot":"","sources":["../../src/checks/fix-folderization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,uBAAuB,EACvB,oCAAoC,EACrC,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAS7E,KAAK,WAAW,GAAG;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AACF,iBAAS,4BAA4B,CACnC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,oCAAoC,EAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,uBAAuB,CASzB;AAED,iBAAS,aAAa,CACpB,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,GAC5C;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,uBAAuB,EAAE,CAAA;CAAE,CAqBjE;AA8ND,iBAAe,gBAAgB,CAC7B,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,EAC7C,MAAM,EAAE,8BAA8B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAyDlC;AAED,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,CAAC"}
@@ -5,6 +5,7 @@ import { isRelativeImportSpecifier } from "../imports/resolve.js";
5
5
  import { supportsFolderizationFix } from "../shared/languages.js";
6
6
  import { FileConflictError, FixFailureError, RewriteFailureError } from "../shared/errors.js";
7
7
  import { ensureDotExtension, pathExists, stripKnownExtension, toPosixPath } from "../shared/utils.js";
8
+ import { createRuleProgress, emitRuleChunk, emitRuleCompleted } from "./progress.js";
8
9
  import { planFolderizeCompoundFiles } from "./rules/folderize/plan.js";
9
10
  function createFolderizationViolation(filePath, suggestedPath, options, details) {
10
11
  return {
@@ -74,11 +75,20 @@ async function planImportRewritesForFolderizationMoves(sourceFiles, moves, optio
74
75
  const movedPaths = new Map(moves.map((move) => [move.fromAbsolutePath, move.toAbsolutePath]));
75
76
  const knownFiles = new Set(sourceFiles.map((file) => file.absolutePath));
76
77
  const rewrittenByPath = new Map();
78
+ const progress = createRuleProgress({
79
+ observer: options.progressObserver,
80
+ rule: "folderize-compound-files",
81
+ stage: "rewrite-plan",
82
+ totalItems: sourceFiles.length,
83
+ });
77
84
  let rewrittenFiles = 0;
78
85
  let rewrittenImports = 0;
79
- for (const file of sourceFiles) {
80
- if (!supportsFolderizationFix(file.extension))
86
+ for (let index = 0; index < sourceFiles.length; index += 1) {
87
+ const file = sourceFiles[index];
88
+ if (!supportsFolderizationFix(file.extension)) {
89
+ emitRuleChunk(progress, index + 1, 0, { rewrittenFiles, rewrittenImports });
81
90
  continue;
91
+ }
82
92
  const originalText = await fs.readFile(file.absolutePath, "utf8");
83
93
  const futureFilePath = movedPaths.get(file.absolutePath) ?? file.absolutePath;
84
94
  const replacements = [];
@@ -105,12 +115,16 @@ async function planImportRewritesForFolderizationMoves(sourceFiles, moves, optio
105
115
  throw new RewriteFailureError(file.relativeFromProjectRoot, error);
106
116
  }
107
117
  const next = applyTextReplacements(originalText, replacements);
108
- if (next.count === 0)
118
+ if (next.count === 0) {
119
+ emitRuleChunk(progress, index + 1, 0, { rewrittenFiles, rewrittenImports });
109
120
  continue;
121
+ }
110
122
  rewrittenByPath.set(futureFilePath, next);
111
123
  rewrittenFiles += 1;
112
124
  rewrittenImports += next.count;
125
+ emitRuleChunk(progress, index + 1, 0, { rewrittenFiles, rewrittenImports });
113
126
  }
127
+ emitRuleCompleted(progress, 0, { rewrittenFiles, rewrittenImports });
114
128
  return { rewrittenByPath, rewrittenFiles, rewrittenImports };
115
129
  }
116
130
  async function validateMovePlan(moves) {
@@ -134,17 +148,50 @@ async function validateMovePlan(moves) {
134
148
  }
135
149
  }
136
150
  }
137
- async function moveFiles(moves) {
151
+ async function moveFiles(moves, options) {
152
+ const progress = createRuleProgress({
153
+ observer: options.progressObserver,
154
+ rule: "folderize-compound-files",
155
+ stage: "move",
156
+ totalItems: moves.length,
157
+ });
138
158
  let movedFiles = 0;
139
- for (const move of moves) {
140
- if (move.fromAbsolutePath === move.toAbsolutePath)
159
+ for (let index = 0; index < moves.length; index += 1) {
160
+ const move = moves[index];
161
+ if (move.fromAbsolutePath === move.toAbsolutePath) {
162
+ emitRuleChunk(progress, index + 1, 0, { movedFiles });
141
163
  continue;
164
+ }
142
165
  await fs.mkdir(path.dirname(move.toAbsolutePath), { recursive: true });
143
166
  await fs.rename(move.fromAbsolutePath, move.toAbsolutePath);
144
167
  movedFiles += 1;
168
+ emitRuleChunk(progress, index + 1, 0, { movedFiles });
145
169
  }
170
+ emitRuleCompleted(progress, 0, { movedFiles });
146
171
  return movedFiles;
147
172
  }
173
+ async function writeFolderizationRewrites(rewrites, options) {
174
+ const entries = [...rewrites.entries()];
175
+ const totalImports = entries.reduce((sum, [, rewrite]) => sum + rewrite.count, 0);
176
+ const progress = createRuleProgress({
177
+ observer: options.progressObserver,
178
+ rule: "folderize-compound-files",
179
+ stage: "write",
180
+ totalItems: entries.length,
181
+ });
182
+ for (let index = 0; index < entries.length; index += 1) {
183
+ const [filePath, next] = entries[index];
184
+ await fs.writeFile(filePath, next.text);
185
+ emitRuleChunk(progress, index + 1, 0, {
186
+ rewrittenFiles: index + 1,
187
+ rewrittenImports: totalImports,
188
+ });
189
+ }
190
+ emitRuleCompleted(progress, 0, {
191
+ rewrittenFiles: entries.length,
192
+ rewrittenImports: totalImports,
193
+ });
194
+ }
148
195
  async function removeEmptyDirectories(directories) {
149
196
  const sorted = [...new Set(directories)].sort((left, right) => right.length - left.length);
150
197
  for (const directoryPath of sorted) {
@@ -178,10 +225,8 @@ async function fixFolderization(sourceFiles, options, logger) {
178
225
  const sourceDirectories = moves.map((move) => path.dirname(move.fromAbsolutePath));
179
226
  try {
180
227
  const rewriteState = await planImportRewritesForFolderizationMoves(sourceFiles, moves, options);
181
- const movedFiles = await moveFiles(moves);
182
- for (const [filePath, next] of rewriteState.rewrittenByPath) {
183
- await fs.writeFile(filePath, next.text);
184
- }
228
+ const movedFiles = await moveFiles(moves, options);
229
+ await writeFolderizationRewrites(rewriteState.rewrittenByPath, options);
185
230
  await removeEmptyDirectories(sourceDirectories);
186
231
  logger.success("fix-folderization-finished", `folderized files=${movedFiles} rewrittenImports=${rewriteState.rewrittenImports}`, {
187
232
  movedFiles,
@@ -1 +1 @@
1
- {"version":3,"file":"fix-folderization.js","sourceRoot":"","sources":["../../src/checks/fix-folderization.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fix-folderization.js","sourceRoot":"","sources":["../../src/checks/fix-folderization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { SourceProgressObserver } from "../imports/types.js";
2
+ type RuleProgressExtras = {
3
+ comparedCandidates?: number;
4
+ deletedFiles?: number;
5
+ discoveredFunctions?: number;
6
+ duplicateGroups?: number;
7
+ movedFiles?: number;
8
+ removedComments?: number;
9
+ rewrittenFiles?: number;
10
+ rewrittenImports?: number;
11
+ };
12
+ type RuleProgressState = {
13
+ chunkSize: number;
14
+ observer?: SourceProgressObserver;
15
+ rule: string;
16
+ stage: string;
17
+ startedAt: number;
18
+ totalItems: number;
19
+ };
20
+ declare function createRuleProgress(args: {
21
+ chunkSize?: number;
22
+ observer?: SourceProgressObserver;
23
+ rule: string;
24
+ stage?: string;
25
+ totalItems: number;
26
+ }): RuleProgressState;
27
+ declare function emitRuleChunk(state: RuleProgressState, completedItems: number, violationCount: number, extras?: RuleProgressExtras): void;
28
+ declare function emitRuleCompleted(state: RuleProgressState, violationCount: number, extras?: RuleProgressExtras): void;
29
+ export { createRuleProgress, emitRuleChunk, emitRuleCompleted };
30
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/checks/progress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIlE,KAAK,kBAAkB,GAAG;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,iBAAS,kBAAkB,CAAC,IAAI,EAAE;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,iBAAiB,CASpB;AAED,iBAAS,aAAa,CACpB,KAAK,EAAE,iBAAiB,EACxB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,MAAM,GAAE,kBAAuB,GAC9B,IAAI,CAcN;AAED,iBAAS,iBAAiB,CACxB,KAAK,EAAE,iBAAiB,EACxB,cAAc,EAAE,MAAM,EACtB,MAAM,GAAE,kBAAuB,GAC9B,IAAI,CAUN;AAED,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { performance } from "node:perf_hooks";
2
+ const DEFAULT_RULE_PROGRESS_CHUNK_SIZE = 250;
3
+ function createRuleProgress(args) {
4
+ return {
5
+ chunkSize: args.chunkSize ?? DEFAULT_RULE_PROGRESS_CHUNK_SIZE,
6
+ observer: args.observer,
7
+ rule: args.rule,
8
+ stage: args.stage ?? "scan",
9
+ startedAt: performance.now(),
10
+ totalItems: args.totalItems,
11
+ };
12
+ }
13
+ function emitRuleChunk(state, completedItems, violationCount, extras = {}) {
14
+ if (completedItems % state.chunkSize !== 0 && completedItems !== state.totalItems)
15
+ return;
16
+ state.observer?.({
17
+ phase: "rule-chunk",
18
+ rule: state.rule,
19
+ stage: state.stage,
20
+ chunkIndex: Math.ceil(completedItems / state.chunkSize),
21
+ completedItems,
22
+ totalItems: state.totalItems,
23
+ violationCount,
24
+ elapsedMs: performance.now() - state.startedAt,
25
+ ...extras,
26
+ });
27
+ }
28
+ function emitRuleCompleted(state, violationCount, extras = {}) {
29
+ state.observer?.({
30
+ phase: "rule-completed",
31
+ rule: state.rule,
32
+ stage: state.stage,
33
+ totalItems: state.totalItems,
34
+ violationCount,
35
+ elapsedMs: performance.now() - state.startedAt,
36
+ ...extras,
37
+ });
38
+ }
39
+ export { createRuleProgress, emitRuleChunk, emitRuleCompleted };
40
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/checks/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAsB7C,SAAS,kBAAkB,CAAC,IAM3B;IACC,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,gCAAgC;QAC7D,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM;QAC3B,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE;QAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,KAAwB,EACxB,cAAsB,EACtB,cAAsB,EACtB,SAA6B,EAAE;IAE/B,IAAI,cAAc,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,cAAc,KAAK,KAAK,CAAC,UAAU;QAAE,OAAO;IAE1F,KAAK,CAAC,QAAQ,EAAE,CAAC;QACf,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC;QACvD,cAAc;QACd,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,cAAc;QACd,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS;QAC9C,GAAG,MAAM;KACV,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAwB,EACxB,cAAsB,EACtB,SAA6B,EAAE;IAE/B,KAAK,CAAC,QAAQ,EAAE,CAAC;QACf,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,cAAc;QACd,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS;QAC9C,GAAG,MAAM;KACV,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../../src/checks/rules/banned/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,KAAK,EAAE,2BAA2B,EAAE,oCAAoC,EAAE,MAAM,gBAAgB,CAAC;AAExG,iBAAS,2BAA2B,CAClC,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,GAC5C,uBAAuB,EAAE,CAuB3B;AAED,iBAAe,kBAAkB,CAC/B,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,2BAA2B,CAAC,CA8BtC;AAED,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../../src/checks/rules/banned/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAEnF,OAAO,KAAK,EAAE,2BAA2B,EAAE,oCAAoC,EAAE,MAAM,gBAAgB,CAAC;AAIxG,iBAAS,2BAA2B,CAClC,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,GAC5C,uBAAuB,EAAE,CAgC3B;AAED,iBAAe,kBAAkB,CAC/B,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,2BAA2B,CAAC,CA4CtC;AAED,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1,12 +1,20 @@
1
1
  import fs from "node:fs/promises";
2
2
  import { FixFailureError } from "../../../shared/errors.js";
3
3
  import { matchesGlob } from "../../../shared/globs.js";
4
+ import { createRuleProgress, emitRuleChunk, emitRuleCompleted } from "../../progress.js";
5
+ const BANNED_FILES_FIX_CHUNK_SIZE = 250;
4
6
  function collectBannedFileViolations(sourceFiles, options) {
5
7
  const rule = options.rules.bannedFiles;
6
8
  if (!rule)
7
9
  return [];
8
10
  const violations = [];
9
- for (const file of sourceFiles) {
11
+ const progress = createRuleProgress({
12
+ observer: options.progressObserver,
13
+ rule: "banned-files",
14
+ totalItems: sourceFiles.length,
15
+ });
16
+ for (let index = 0; index < sourceFiles.length; index += 1) {
17
+ const file = sourceFiles[index];
10
18
  for (const pattern of rule.patterns) {
11
19
  if (!matchesGlob(file.relativeFromProjectRoot, pattern.glob))
12
20
  continue;
@@ -20,7 +28,9 @@ function collectBannedFileViolations(sourceFiles, options) {
20
28
  },
21
29
  });
22
30
  }
31
+ emitRuleChunk(progress, index + 1, violations.length);
23
32
  }
33
+ emitRuleCompleted(progress, violations.length);
24
34
  return violations;
25
35
  }
26
36
  async function fixBannedFilesRule(sourceFiles, options) {
@@ -37,19 +47,33 @@ async function fixBannedFilesRule(sourceFiles, options) {
37
47
  const filesToDelete = [...new Set(violations.map((violation) => violation.filePath))]
38
48
  .map((filePath) => filesByRelativePath.get(filePath))
39
49
  .filter((file) => Boolean(file));
50
+ const progress = createRuleProgress({
51
+ chunkSize: BANNED_FILES_FIX_CHUNK_SIZE,
52
+ observer: options.progressObserver,
53
+ rule: "banned-files",
54
+ stage: "fix",
55
+ totalItems: filesToDelete.length,
56
+ });
57
+ let deletedFiles = 0;
40
58
  try {
41
- await Promise.all(filesToDelete.map((file) => fs.unlink(file.absolutePath)));
59
+ for (let index = 0; index < filesToDelete.length; index += BANNED_FILES_FIX_CHUNK_SIZE) {
60
+ const chunk = filesToDelete.slice(index, index + BANNED_FILES_FIX_CHUNK_SIZE);
61
+ await Promise.all(chunk.map((file) => fs.unlink(file.absolutePath)));
62
+ deletedFiles += chunk.length;
63
+ emitRuleChunk(progress, deletedFiles, 0, { deletedFiles });
64
+ }
42
65
  }
43
66
  catch (error) {
44
67
  throw new FixFailureError("banned-files fix failed", {
45
68
  cause: error instanceof Error ? error.message : String(error),
46
69
  });
47
70
  }
71
+ emitRuleCompleted(progress, 0, { deletedFiles });
48
72
  return {
49
73
  ok: true,
50
74
  violationCount: 0,
51
75
  violations: [],
52
- deleted_files: filesToDelete.length,
76
+ deleted_files: deletedFiles,
53
77
  };
54
78
  }
55
79
  export { collectBannedFileViolations, fixBannedFilesRule };
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../../src/checks/rules/banned/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIvD,SAAS,2BAA2B,CAClC,WAAgC,EAChC,OAA6C;IAE7C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,UAAU,GAA8B,EAAE,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEvE,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,cAAc;gBACpB,GAAG,EAAE,KAAK;gBACV,QAAQ,EAAE,IAAI,CAAC,uBAAuB;gBACtC,OAAO,EAAE,kCAAkC,OAAO,CAAC,IAAI,GAAG;gBAC1D,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO,CAAC,IAAI;iBACnB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,WAAgC,EAChC,OAA6C;IAE7C,MAAM,UAAU,GAAG,2BAA2B,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACrE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,EAAE,EAAE,IAAI;YACR,cAAc,EAAE,CAAC;YACjB,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,CAAC;SACjB,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;SAClF,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;SACpD,MAAM,CAAC,CAAC,IAAI,EAA6B,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,yBAAyB,EAAE;YACnD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,EAAE;QACd,aAAa,EAAE,aAAa,CAAC,MAAM;KACpC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../../src/checks/rules/banned/files.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../src/checks/rules/banned/patterns.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAkBnF,iBAAe,8BAA8B,CAC3C,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,uBAAuB,EAAE,CAAC,CA8BpC;AAED,OAAO,EAAE,8BAA8B,EAAE,CAAC"}
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../src/checks/rules/banned/patterns.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAmBnF,iBAAe,8BAA8B,CAC3C,WAAW,EAAE,iBAAiB,EAAE,EAChC,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAuCpC;AAED,OAAO,EAAE,8BAA8B,EAAE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import fs from "node:fs/promises";
2
+ import { createRuleProgress, emitRuleChunk, emitRuleCompleted } from "../../progress.js";
2
3
  function countOccurrences(text, pattern) {
3
4
  if (!pattern)
4
5
  return 0;
@@ -18,7 +19,13 @@ async function collectBannedPatternViolations(sourceFiles, options) {
18
19
  if (!rule)
19
20
  return [];
20
21
  const violations = [];
21
- for (const file of sourceFiles) {
22
+ const progress = createRuleProgress({
23
+ observer: options.progressObserver,
24
+ rule: "banned-patterns",
25
+ totalItems: sourceFiles.length,
26
+ });
27
+ for (let index = 0; index < sourceFiles.length; index += 1) {
28
+ const file = sourceFiles[index];
22
29
  const text = await fs.readFile(file.absolutePath, "utf8");
23
30
  const normalizedText = text.toLowerCase();
24
31
  for (const pattern of rule.patterns) {
@@ -39,7 +46,9 @@ async function collectBannedPatternViolations(sourceFiles, options) {
39
46
  },
40
47
  });
41
48
  }
49
+ emitRuleChunk(progress, index + 1, violations.length);
42
50
  }
51
+ emitRuleCompleted(progress, violations.length);
43
52
  return violations;
44
53
  }
45
54
  export { collectBannedPatternViolations };
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../../src/checks/rules/banned/patterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMlC,SAAS,gBAAgB,CAAC,IAAY,EAAE,OAAe;IACrD,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAEvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChD,IAAI,UAAU,GAAG,CAAC;YAAE,MAAM;QAC1B,KAAK,IAAI,CAAC,CAAC;QACX,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,WAAgC,EAChC,OAA6C;IAE7C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,UAAU,GAA8B,EAAE,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAE1C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC;gBAAE,SAAS;YAC1E,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC;gBAAE,SAAS;YAEhE,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;YAC9E,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,iBAAiB;gBACvB,GAAG,EAAE,KAAK;gBACV,QAAQ,EAAE,IAAI,CAAC,uBAAuB;gBACtC,OAAO,EAAE,iCAAiC,OAAO,CAAC,KAAK,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC3G,OAAO,EAAE;oBACP,OAAO,EAAE,OAAO,CAAC,KAAK;oBACtB,WAAW;oBACX,YAAY,EAAE,OAAO,CAAC,YAAY;iBACnC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,OAAO,EAAE,8BAA8B,EAAE,CAAC"}
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../../src/checks/rules/banned/patterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAKlC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzF,SAAS,gBAAgB,CAAC,IAAY,EAAE,OAAe;IACrD,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAEvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChD,IAAI,UAAU,GAAG,CAAC;YAAE,MAAM;QAC1B,KAAK,IAAI,CAAC,CAAC;QACX,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,WAAgC,EAChC,OAA6C;IAE7C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,UAAU,GAA8B,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,QAAQ,EAAE,OAAO,CAAC,gBAAgB;QAClC,IAAI,EAAE,iBAAiB;QACvB,UAAU,EAAE,WAAW,CAAC,MAAM;KAC/B,CAAC,CAAC;IAEH,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAE1C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC;gBAAE,SAAS;YAC1E,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC;gBAAE,SAAS;YAEhE,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;YAC9E,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,iBAAiB;gBACvB,GAAG,EAAE,KAAK;gBACV,QAAQ,EAAE,IAAI,CAAC,uBAAuB;gBACtC,OAAO,EAAE,iCAAiC,OAAO,CAAC,KAAK,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC3G,OAAO,EAAE;oBACP,OAAO,EAAE,OAAO,CAAC,KAAK;oBACtB,WAAW;oBACX,YAAY,EAAE,OAAO,CAAC,YAAY;iBACnC;aACF,CAAC,CAAC;QACL,CAAC;QAED,aAAa,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,OAAO,EAAE,8BAA8B,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { ScannedSourceFile } from "../../../imports/types.js";
1
+ import type { ScannedSourceFile, SourceProgressObserver } from "../../../imports/types.js";
2
2
  import type { CodeDisciplineViolation } from "../../../shared/discipline-types.js";
3
- declare function collectDrySourceDuplicateViolations(sourceFiles: ScannedSourceFile[]): Promise<CodeDisciplineViolation[]>;
3
+ declare function collectDrySourceDuplicateViolations(sourceFiles: ScannedSourceFile[], observer?: SourceProgressObserver): Promise<CodeDisciplineViolation[]>;
4
4
  export { collectDrySourceDuplicateViolations };
5
5
  //# sourceMappingURL=candidates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../../src/checks/rules/dry/candidates.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AA6QnF,iBAAe,mCAAmC,CAAC,WAAW,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAGvH;AAED,OAAO,EAAE,mCAAmC,EAAE,CAAC"}
1
+ {"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../../src/checks/rules/dry/candidates.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAkJnF,iBAAe,mCAAmC,CAChD,WAAW,EAAE,iBAAiB,EAAE,EAChC,QAAQ,CAAC,EAAE,sBAAsB,GAChC,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAGpC;AAED,OAAO,EAAE,mCAAmC,EAAE,CAAC"}
@@ -1,30 +1,10 @@
1
1
  import fs from "node:fs/promises";
2
+ import { performance } from "node:perf_hooks";
2
3
  import ts from "typescript";
3
4
  import { parseSource } from "../../../imports/module-specifiers.js";
4
5
  import { createFunctionFingerprint, resolveClassification, resolveFunctionDisplayName } from "./fingerprint.js";
5
- const MIN_SOURCE_DUPLICATE_CHARACTERS = 300;
6
- const MIN_NAME_DUPLICATE_CHARACTERS = 300;
7
- const SIMILARITY_THRESHOLD = 0.99;
8
- class DisjointSet {
9
- constructor(size) {
10
- this.parents = Array.from({ length: size }, (_, index) => index);
11
- }
12
- find(index) {
13
- const parent = this.parents[index];
14
- if (parent === index)
15
- return index;
16
- const root = this.find(parent);
17
- this.parents[index] = root;
18
- return root;
19
- }
20
- union(left, right) {
21
- const leftRoot = this.find(left);
22
- const rightRoot = this.find(right);
23
- if (leftRoot === rightRoot)
24
- return;
25
- this.parents[rightRoot] = leftRoot;
26
- }
27
- }
6
+ import { collectDuplicateGroups } from "./matching.js";
7
+ const DRY_PARSE_CHUNK_SIZE = 250;
28
8
  function isFingerprintableFunction(node) {
29
9
  return (ts.isFunctionDeclaration(node) && Boolean(node.body))
30
10
  || (ts.isFunctionExpression(node) && Boolean(node.body))
@@ -74,9 +54,11 @@ function buildDryFunctionDescriptor(node, sourceFile, file) {
74
54
  usesRestrictedRuntime: fingerprintState.usesRestrictedRuntime,
75
55
  };
76
56
  }
77
- async function collectDryFunctions(sourceFiles) {
57
+ async function collectDryFunctions(sourceFiles, observer) {
58
+ const startedAt = performance.now();
78
59
  const functions = [];
79
- for (const file of sourceFiles) {
60
+ for (let fileIndex = 0; fileIndex < sourceFiles.length; fileIndex += 1) {
61
+ const file = sourceFiles[fileIndex];
80
62
  const text = await fs.readFile(file.absolutePath, "utf8");
81
63
  const sourceFile = parseSource(text, file.absolutePath);
82
64
  const visit = (node) => {
@@ -88,100 +70,30 @@ async function collectDryFunctions(sourceFiles) {
88
70
  ts.forEachChild(node, visit);
89
71
  };
90
72
  visit(sourceFile);
91
- }
92
- return functions.sort((left, right) => left.filePath.localeCompare(right.filePath) || left.nodeStart - right.nodeStart);
93
- }
94
- function getTrigrams(value) {
95
- const padded = ` ${value} `;
96
- const trigrams = new Set();
97
- for (let index = 0; index <= padded.length - 3; index += 1) {
98
- trigrams.add(padded.slice(index, index + 3));
99
- }
100
- return trigrams;
101
- }
102
- function jaccardSimilarity(left, right) {
103
- let intersection = 0;
104
- for (const entry of left) {
105
- if (right.has(entry))
106
- intersection += 1;
107
- }
108
- const union = left.size + right.size - intersection;
109
- return union === 0 ? 1 : intersection / union;
110
- }
111
- function shouldCompareSimilarity(left, right) {
112
- if (left.characterCount < MIN_SOURCE_DUPLICATE_CHARACTERS || right.characterCount < MIN_SOURCE_DUPLICATE_CHARACTERS)
113
- return false;
114
- const smaller = Math.min(left.normalizedText.length, right.normalizedText.length);
115
- const larger = Math.max(left.normalizedText.length, right.normalizedText.length);
116
- return smaller / larger >= 0.75;
117
- }
118
- function resolvePairSignals(left, right) {
119
- const signals = [];
120
- if (left.fingerprint === right.fingerprint && left.characterCount >= MIN_SOURCE_DUPLICATE_CHARACTERS && right.characterCount >= MIN_SOURCE_DUPLICATE_CHARACTERS) {
121
- signals.push({ confidence: 1, signal: "exact-normalized" });
122
- }
123
- if (left.classification === "standalone"
124
- && right.classification === "standalone"
125
- && left.topLevel
126
- && right.topLevel
127
- && left.characterCount >= MIN_NAME_DUPLICATE_CHARACTERS
128
- && right.characterCount >= MIN_NAME_DUPLICATE_CHARACTERS
129
- && left.normalizedName
130
- && left.normalizedName === right.normalizedName) {
131
- signals.push({ confidence: 1, signal: "matching-name" });
132
- }
133
- if (shouldCompareSimilarity(left, right)) {
134
- const similarity = jaccardSimilarity(getTrigrams(left.normalizedText), getTrigrams(right.normalizedText));
135
- if (similarity >= SIMILARITY_THRESHOLD) {
136
- signals.push({ confidence: similarity, signal: "similar-structure" });
137
- }
138
- }
139
- return signals;
140
- }
141
- function collectDuplicateGroups(functions) {
142
- const disjointSet = new DisjointSet(functions.length);
143
- const groupSignals = new Map();
144
- for (let leftIndex = 0; leftIndex < functions.length; leftIndex += 1) {
145
- for (let rightIndex = leftIndex + 1; rightIndex < functions.length; rightIndex += 1) {
146
- const signals = resolvePairSignals(functions[leftIndex], functions[rightIndex]);
147
- if (signals.length === 0)
148
- continue;
149
- disjointSet.union(leftIndex, rightIndex);
150
- const key = `${leftIndex}:${rightIndex}`;
151
- groupSignals.set(key, {
152
- confidence: Math.max(...signals.map((signal) => signal.confidence)),
153
- signals: new Set(signals.map((signal) => signal.signal)),
73
+ const completedItems = fileIndex + 1;
74
+ if (completedItems % DRY_PARSE_CHUNK_SIZE === 0 || completedItems === sourceFiles.length) {
75
+ observer?.({
76
+ phase: "rule-chunk",
77
+ rule: "dry",
78
+ stage: "parse",
79
+ chunkIndex: Math.ceil(completedItems / DRY_PARSE_CHUNK_SIZE),
80
+ completedItems,
81
+ totalItems: sourceFiles.length,
82
+ discoveredFunctions: functions.length,
83
+ elapsedMs: performance.now() - startedAt,
154
84
  });
155
85
  }
156
86
  }
157
- const indexesByRoot = new Map();
158
- for (let index = 0; index < functions.length; index += 1) {
159
- const root = disjointSet.find(index);
160
- const indexes = indexesByRoot.get(root) ?? [];
161
- indexes.push(index);
162
- indexesByRoot.set(root, indexes);
163
- }
164
- const groups = [];
165
- for (const indexes of indexesByRoot.values()) {
166
- if (indexes.length < 2)
167
- continue;
168
- let confidence = 0;
169
- const signals = new Set();
170
- for (const [key, entry] of groupSignals) {
171
- const [left, right] = key.split(":").map((value) => Number.parseInt(value, 10));
172
- if (!indexes.includes(left) || !indexes.includes(right))
173
- continue;
174
- confidence = Math.max(confidence, entry.confidence);
175
- for (const signal of entry.signals)
176
- signals.add(signal);
177
- }
178
- groups.push({
179
- confidence,
180
- functions: indexes.map((index) => functions[index]),
181
- signals: [...signals].sort(),
182
- });
183
- }
184
- return groups;
87
+ const sortedFunctions = functions.sort((left, right) => left.filePath.localeCompare(right.filePath) || left.nodeStart - right.nodeStart);
88
+ observer?.({
89
+ phase: "rule-completed",
90
+ rule: "dry",
91
+ stage: "parse",
92
+ totalItems: sourceFiles.length,
93
+ discoveredFunctions: sortedFunctions.length,
94
+ elapsedMs: performance.now() - startedAt,
95
+ });
96
+ return sortedFunctions;
185
97
  }
186
98
  function formatFunctionLocation(descriptor) {
187
99
  return descriptor.localName
@@ -194,7 +106,7 @@ function createDryGroupViolation(group) {
194
106
  rule: "dry",
195
107
  fix: false,
196
108
  filePath: "multiple files",
197
- message: `function duplicates in files: ${files.join(", ")}`,
109
+ message: "duplicate function group",
198
110
  details: {
199
111
  confidence: Number(group.confidence.toFixed(3)),
200
112
  files,
@@ -212,9 +124,9 @@ function createDryGroupViolation(group) {
212
124
  },
213
125
  };
214
126
  }
215
- async function collectDrySourceDuplicateViolations(sourceFiles) {
216
- const functions = await collectDryFunctions(sourceFiles);
217
- return collectDuplicateGroups(functions).map(createDryGroupViolation);
127
+ async function collectDrySourceDuplicateViolations(sourceFiles, observer) {
128
+ const functions = await collectDryFunctions(sourceFiles, observer);
129
+ return collectDuplicateGroups(functions, observer).map(createDryGroupViolation);
218
130
  }
219
131
  export { collectDrySourceDuplicateViolations };
220
132
  //# sourceMappingURL=candidates.js.map