archprint 0.14.0 → 0.16.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.
- package/CHANGELOG.md +30 -0
- package/README.md +42 -26
- package/dist/cli/adopted-rules.d.ts +23 -2
- package/dist/cli/adopted-rules.d.ts.map +1 -1
- package/dist/cli/adopted-rules.js +100 -2
- package/dist/cli/adopted-rules.js.map +1 -1
- package/dist/cli/allow.d.ts.map +1 -1
- package/dist/cli/allow.js +5 -14
- package/dist/cli/allow.js.map +1 -1
- package/dist/cli/allowed-evidence.d.ts.map +1 -1
- package/dist/cli/allowed-evidence.js +105 -0
- package/dist/cli/allowed-evidence.js.map +1 -1
- package/dist/cli/check-evaluate.d.ts +2 -1
- package/dist/cli/check-evaluate.d.ts.map +1 -1
- package/dist/cli/check-evaluate.js +84 -1
- package/dist/cli/check-evaluate.js.map +1 -1
- package/dist/cli/check-locate.d.ts.map +1 -1
- package/dist/cli/check-locate.js +4 -2
- package/dist/cli/check-locate.js.map +1 -1
- package/dist/cli/check.js +2 -2
- package/dist/cli/check.js.map +1 -1
- package/dist/cli/eslint-check.d.ts +6 -0
- package/dist/cli/eslint-check.d.ts.map +1 -0
- package/dist/cli/eslint-check.js +160 -0
- package/dist/cli/eslint-check.js.map +1 -0
- package/dist/cli/generate.d.ts +3 -6
- package/dist/cli/generate.d.ts.map +1 -1
- package/dist/cli/generate.js +67 -64
- package/dist/cli/generate.js.map +1 -1
- package/dist/cli/layout.d.ts +18 -2
- package/dist/cli/layout.d.ts.map +1 -1
- package/dist/cli/layout.js +82 -15
- package/dist/cli/layout.js.map +1 -1
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +1 -2
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/program.d.ts +0 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +59 -79
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/ratchet.d.ts +24 -0
- package/dist/cli/ratchet.d.ts.map +1 -0
- package/dist/cli/ratchet.js +43 -0
- package/dist/cli/ratchet.js.map +1 -0
- package/dist/cli/recommend.d.ts +3 -0
- package/dist/cli/recommend.d.ts.map +1 -1
- package/dist/cli/recommend.js +16 -1
- package/dist/cli/recommend.js.map +1 -1
- package/dist/cli/report.d.ts +8 -4
- package/dist/cli/report.d.ts.map +1 -1
- package/dist/cli/report.js +50 -34
- package/dist/cli/report.js.map +1 -1
- package/dist/cli/rule-ref.d.ts +10 -0
- package/dist/cli/rule-ref.d.ts.map +1 -0
- package/dist/cli/rule-ref.js +18 -0
- package/dist/cli/rule-ref.js.map +1 -0
- package/dist/cli/scan.d.ts.map +1 -1
- package/dist/cli/scan.js +4 -4
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/summary.d.ts +7 -0
- package/dist/cli/summary.d.ts.map +1 -1
- package/dist/cli/summary.js +60 -2
- package/dist/cli/summary.js.map +1 -1
- package/dist/detector/orphan-detector.d.ts +8 -6
- package/dist/detector/orphan-detector.d.ts.map +1 -1
- package/dist/detector/orphan-detector.js +74 -15
- package/dist/detector/orphan-detector.js.map +1 -1
- package/dist/detector/pattern-detector.d.ts +2 -0
- package/dist/detector/pattern-detector.d.ts.map +1 -1
- package/dist/detector/pattern-detector.js +5 -0
- package/dist/detector/pattern-detector.js.map +1 -1
- package/dist/detector/stories-isolation-detector.d.ts +1 -0
- package/dist/detector/stories-isolation-detector.d.ts.map +1 -1
- package/dist/detector/stories-isolation-detector.js +1 -1
- package/dist/detector/stories-isolation-detector.js.map +1 -1
- package/dist/generator/app-isolation-emitters.d.ts +4 -1
- package/dist/generator/app-isolation-emitters.d.ts.map +1 -1
- package/dist/generator/app-isolation-emitters.js +10 -4
- package/dist/generator/app-isolation-emitters.js.map +1 -1
- package/dist/generator/console-isolation-emitters.d.ts +2 -6
- package/dist/generator/console-isolation-emitters.d.ts.map +1 -1
- package/dist/generator/console-isolation-emitters.js +3 -2
- package/dist/generator/console-isolation-emitters.js.map +1 -1
- package/dist/generator/deep-relative-emitters.d.ts +2 -16
- package/dist/generator/deep-relative-emitters.d.ts.map +1 -1
- package/dist/generator/deep-relative-emitters.js +6 -20
- package/dist/generator/deep-relative-emitters.js.map +1 -1
- package/dist/generator/depcruise-exempt.d.ts +17 -2
- package/dist/generator/depcruise-exempt.d.ts.map +1 -1
- package/dist/generator/depcruise-exempt.js +18 -4
- package/dist/generator/depcruise-exempt.js.map +1 -1
- package/dist/generator/dependency-internals-emitters.d.ts +1 -1
- package/dist/generator/dependency-internals-emitters.d.ts.map +1 -1
- package/dist/generator/dependency-internals-emitters.js +2 -2
- package/dist/generator/dependency-internals-emitters.js.map +1 -1
- package/dist/generator/entry-purity-emitters.d.ts +1 -1
- package/dist/generator/entry-purity-emitters.d.ts.map +1 -1
- package/dist/generator/entry-purity-emitters.js +3 -3
- package/dist/generator/entry-purity-emitters.js.map +1 -1
- package/dist/generator/env-access-emitters.d.ts +3 -2
- package/dist/generator/env-access-emitters.d.ts.map +1 -1
- package/dist/generator/env-access-emitters.js +4 -11
- package/dist/generator/env-access-emitters.js.map +1 -1
- package/dist/generator/eslint-app-emitter.d.ts +1 -0
- package/dist/generator/eslint-app-emitter.d.ts.map +1 -1
- package/dist/generator/eslint-app-emitter.js +1 -22
- package/dist/generator/eslint-app-emitter.js.map +1 -1
- package/dist/generator/eslint-family-rules.d.ts +23 -0
- package/dist/generator/eslint-family-rules.d.ts.map +1 -0
- package/dist/generator/eslint-family-rules.js +35 -0
- package/dist/generator/eslint-family-rules.js.map +1 -0
- package/dist/generator/eslint-plugin-emitter.d.ts +2 -0
- package/dist/generator/eslint-plugin-emitter.d.ts.map +1 -1
- package/dist/generator/eslint-plugin-emitter.js +21 -0
- package/dist/generator/eslint-plugin-emitter.js.map +1 -1
- package/dist/generator/eslint-preset-emitter.d.ts +2 -1
- package/dist/generator/eslint-preset-emitter.d.ts.map +1 -1
- package/dist/generator/eslint-preset-emitter.js +13 -10
- package/dist/generator/eslint-preset-emitter.js.map +1 -1
- package/dist/generator/eslint-scope.d.ts +0 -11
- package/dist/generator/eslint-scope.d.ts.map +1 -1
- package/dist/generator/eslint-scope.js +0 -44
- package/dist/generator/eslint-scope.js.map +1 -1
- package/dist/generator/feature-slice-emitters.d.ts +4 -1
- package/dist/generator/feature-slice-emitters.d.ts.map +1 -1
- package/dist/generator/feature-slice-emitters.js +10 -4
- package/dist/generator/feature-slice-emitters.js.map +1 -1
- package/dist/generator/layer-emitters.d.ts.map +1 -1
- package/dist/generator/layer-emitters.js +1 -4
- package/dist/generator/layer-emitters.js.map +1 -1
- package/dist/generator/phantom-dependency-emitters.d.ts +1 -1
- package/dist/generator/phantom-dependency-emitters.d.ts.map +1 -1
- package/dist/generator/phantom-dependency-emitters.js +2 -2
- package/dist/generator/phantom-dependency-emitters.js.map +1 -1
- package/dist/generator/public-api-emitters.d.ts +2 -1
- package/dist/generator/public-api-emitters.d.ts.map +1 -1
- package/dist/generator/public-api-emitters.js +8 -5
- package/dist/generator/public-api-emitters.js.map +1 -1
- package/dist/generator/role-layering-emitters.d.ts +5 -1
- package/dist/generator/role-layering-emitters.d.ts.map +1 -1
- package/dist/generator/role-layering-emitters.js +16 -8
- package/dist/generator/role-layering-emitters.js.map +1 -1
- package/dist/generator/server-client-emitters.d.ts.map +1 -1
- package/dist/generator/server-client-emitters.js +1 -4
- package/dist/generator/server-client-emitters.js.map +1 -1
- package/dist/generator/stories-isolation-emitters.d.ts +4 -2
- package/dist/generator/stories-isolation-emitters.d.ts.map +1 -1
- package/dist/generator/stories-isolation-emitters.js +7 -3
- package/dist/generator/stories-isolation-emitters.js.map +1 -1
- package/dist/generator/test-isolation-emitters.d.ts +4 -3
- package/dist/generator/test-isolation-emitters.d.ts.map +1 -1
- package/dist/generator/test-isolation-emitters.js +8 -17
- package/dist/generator/test-isolation-emitters.js.map +1 -1
- package/dist/generator/ui-data-isolation-emitters.d.ts +4 -1
- package/dist/generator/ui-data-isolation-emitters.d.ts.map +1 -1
- package/dist/generator/ui-data-isolation-emitters.js +8 -3
- package/dist/generator/ui-data-isolation-emitters.js.map +1 -1
- package/dist/generator/workspace-package-emitters.d.ts +3 -2
- package/dist/generator/workspace-package-emitters.d.ts.map +1 -1
- package/dist/generator/workspace-package-emitters.js +7 -15
- package/dist/generator/workspace-package-emitters.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/remote/server.d.ts +2 -2
- package/dist/mcp/remote/server.d.ts.map +1 -1
- package/dist/mcp/remote/server.js +8 -2
- package/dist/mcp/remote/server.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +4 -4
- package/dist/mcp/tools.js.map +1 -1
- package/dist/scanner/file-walker.d.ts +4 -0
- package/dist/scanner/file-walker.d.ts.map +1 -1
- package/dist/scanner/file-walker.js +33 -2
- package/dist/scanner/file-walker.js.map +1 -1
- package/dist/scanner/usage-scanner.d.ts +2 -0
- package/dist/scanner/usage-scanner.d.ts.map +1 -1
- package/dist/scanner/usage-scanner.js +25 -8
- package/dist/scanner/usage-scanner.js.map +1 -1
- package/package.json +3 -2
package/dist/cli/layout.js
CHANGED
|
@@ -5,7 +5,11 @@ import { ARCHPRINT_DIR, collectEnforcement, emitLayout } from './generate.js';
|
|
|
5
5
|
import { buildConfig, readConfig, writeConfig } from './archprint-config.js';
|
|
6
6
|
import { injectAdoptionSection } from './adoption-readme.js';
|
|
7
7
|
import { ensureIgnoreEntry } from './ignore-file.js';
|
|
8
|
-
import {
|
|
8
|
+
import { reconcileWithAdopted } from './recommend.js';
|
|
9
|
+
import { renderAdoptionBody } from './report.js';
|
|
10
|
+
import { currentExceptions } from './summary.js';
|
|
11
|
+
import { comparableIn, firstRecorded, fixedExceptions, newExceptions, NewViolationsError, remeasured, } from './ratchet.js';
|
|
12
|
+
import { LEGACY_RULES_FILE, readAdoptedRules, } from './adopted-rules.js';
|
|
9
13
|
import { allowedFilesByRule, LEGACY_ALLOW_FILE, readAllowed, sortAllowed, } from './allowed-exceptions.js';
|
|
10
14
|
export class UnknownRulesError extends Error {
|
|
11
15
|
constructor(unknown, available, structural) {
|
|
@@ -43,6 +47,22 @@ function removeFoldedFiles(outDir, cwd) {
|
|
|
43
47
|
}
|
|
44
48
|
return folded;
|
|
45
49
|
}
|
|
50
|
+
/** The previously adopted rules outside this run's selection: a run adds to the adoption, never replaces it. */
|
|
51
|
+
function carriedRuleIds(previous, requested) {
|
|
52
|
+
const requestedIds = new Set(requested.map((rule) => rule.id));
|
|
53
|
+
return previous.filter((id) => !requestedIds.has(id));
|
|
54
|
+
}
|
|
55
|
+
/** Selects the requested and carried rules by id, across every family: a carried rule was adopted, held or not. */
|
|
56
|
+
function withCarried(options, requested, carried) {
|
|
57
|
+
if (carried.length === 0)
|
|
58
|
+
return options;
|
|
59
|
+
return {
|
|
60
|
+
...options,
|
|
61
|
+
structural: true,
|
|
62
|
+
only: undefined,
|
|
63
|
+
ruleIds: [...requested.map((rule) => rule.id), ...carried],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
46
66
|
export function writeLayout(scan, outDir, options) {
|
|
47
67
|
assertRealDirectory(outDir);
|
|
48
68
|
const allowed = readAllowed(outDir);
|
|
@@ -55,43 +75,64 @@ export function writeLayout(scan, outDir, options) {
|
|
|
55
75
|
ruleIds: options.ruleIds,
|
|
56
76
|
mode: options.mode,
|
|
57
77
|
};
|
|
58
|
-
const
|
|
59
|
-
if (unknownRules.length > 0)
|
|
60
|
-
throw new UnknownRulesError(unknownRules, availableRules, options.structural ?? false);
|
|
78
|
+
const requested = collectEnforcement(scan, collectOptions);
|
|
79
|
+
if (requested.unknownRules.length > 0)
|
|
80
|
+
throw new UnknownRulesError(requested.unknownRules, requested.availableRules, options.structural ?? false);
|
|
81
|
+
const adoptedBefore = readAdoptedRules(outDir) ?? [];
|
|
82
|
+
const previousRules = options.reset ? [] : adoptedBefore;
|
|
83
|
+
const exceptionsNow = currentExceptions(scan);
|
|
84
|
+
const comparable = previousRules.filter(comparableIn(options.mode));
|
|
85
|
+
const broken = newExceptions(comparable, exceptionsNow);
|
|
86
|
+
if (broken.length > 0)
|
|
87
|
+
throw new NewViolationsError(broken);
|
|
88
|
+
const previous = adoptedBefore.map((rule) => rule.id);
|
|
89
|
+
const carried = options.reset ? [] : carriedRuleIds(previous, requested.adopted);
|
|
61
90
|
const removed = cleanPrior(outDir, options.cwd);
|
|
62
91
|
const emitted = emitLayout(scan, outDir, {
|
|
63
|
-
...collectOptions,
|
|
92
|
+
...withCarried(collectOptions, requested.adopted, carried),
|
|
64
93
|
expand: options.expand,
|
|
65
|
-
graph: options.graph,
|
|
94
|
+
graph: options.only === undefined && options.graph !== false,
|
|
66
95
|
version: options.version,
|
|
67
96
|
});
|
|
97
|
+
const emittedIds = new Set(emitted.rules.map((rule) => rule.id));
|
|
98
|
+
const keptRules = previousRules.filter((rule) => emittedIds.has(rule.id));
|
|
99
|
+
const keptComparable = keptRules.filter(comparableIn(options.mode));
|
|
100
|
+
const adoption = reconcileWithAdopted(options.recommendations, emitted.rules);
|
|
68
101
|
const files = [emitted.eslint, emitted.depcruise, ...emitted.expanded].filter((file) => file !== null);
|
|
69
102
|
const prior = readConfig(outDir);
|
|
70
103
|
let readme = 'off';
|
|
71
104
|
let readmeCreated = prior?.managed.readmeCreated ?? false;
|
|
72
|
-
if (options.
|
|
73
|
-
const result = injectAdoptionSection(path.join(options.cwd, 'README.md'),
|
|
105
|
+
if (options.readme && files.length > 0) {
|
|
106
|
+
const result = injectAdoptionSection(path.join(options.cwd, 'README.md'), renderAdoptionBody(adoption, emitted.rules));
|
|
74
107
|
readme = result.status;
|
|
75
108
|
if (result.status === 'created')
|
|
76
109
|
readmeCreated = true;
|
|
77
110
|
}
|
|
78
111
|
const outRel = path.relative(options.cwd, outDir) || ARCHPRINT_DIR;
|
|
79
112
|
const ignoreEntry = `${outRel.split(path.sep).join('/')}/`;
|
|
113
|
+
const changedIgnoreFiles = [];
|
|
80
114
|
let prettierignore = prior?.managed.prettierignore ?? false;
|
|
81
115
|
let prettierignoreCreated = prior?.managed.prettierignoreCreated ?? false;
|
|
82
116
|
let npmignore = prior?.managed.npmignore ?? false;
|
|
83
117
|
const npmignoreCreated = prior?.managed.npmignoreCreated ?? false;
|
|
84
118
|
if (files.length > 0) {
|
|
85
|
-
const
|
|
119
|
+
const prettierPath = path.join(options.cwd, '.prettierignore');
|
|
120
|
+
const prettier = ensureIgnoreEntry(prettierPath, ignoreEntry);
|
|
86
121
|
if (prettier !== 'skipped')
|
|
87
122
|
prettierignore = true;
|
|
88
123
|
if (prettier === 'created')
|
|
89
124
|
prettierignoreCreated = true;
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
});
|
|
125
|
+
const npmPath = path.join(options.cwd, '.npmignore');
|
|
126
|
+
const npm = ensureIgnoreEntry(npmPath, ignoreEntry, { create: false });
|
|
93
127
|
if (npm !== 'skipped')
|
|
94
128
|
npmignore = true;
|
|
129
|
+
for (const [file, result] of [
|
|
130
|
+
[prettierPath, prettier],
|
|
131
|
+
[npmPath, npm],
|
|
132
|
+
]) {
|
|
133
|
+
if (result === 'created' || result === 'appended')
|
|
134
|
+
changedIgnoreFiles.push(file);
|
|
135
|
+
}
|
|
95
136
|
}
|
|
96
137
|
const managed = {
|
|
97
138
|
files: files.map((file) => path.relative(options.cwd, file)),
|
|
@@ -102,11 +143,37 @@ export function writeLayout(scan, outDir, options) {
|
|
|
102
143
|
npmignore,
|
|
103
144
|
npmignoreCreated,
|
|
104
145
|
};
|
|
105
|
-
const configPath = writeConfig(outDir, buildConfig(
|
|
146
|
+
const configPath = writeConfig(outDir, buildConfig(adoption, options.version, {
|
|
106
147
|
app: options.app,
|
|
107
148
|
rulesDir: path.relative(options.cwd, outDir) || ARCHPRINT_DIR,
|
|
108
|
-
}, {
|
|
149
|
+
}, {
|
|
150
|
+
rules: emitted.rules.map((rule) => ({
|
|
151
|
+
...rule,
|
|
152
|
+
exceptions: exceptionsNow.get(rule.id) ?? [],
|
|
153
|
+
})),
|
|
154
|
+
allowed: sortAllowed(allowed),
|
|
155
|
+
}, managed));
|
|
109
156
|
const folded = removeFoldedFiles(outDir, options.cwd);
|
|
110
|
-
return {
|
|
157
|
+
return {
|
|
158
|
+
files,
|
|
159
|
+
removed,
|
|
160
|
+
folded,
|
|
161
|
+
readme,
|
|
162
|
+
configPath,
|
|
163
|
+
kept: carried.filter((id) => emittedIds.has(id)),
|
|
164
|
+
dropped: carried.filter((id) => !emittedIds.has(id)),
|
|
165
|
+
reset: options.reset ? previous.filter((id) => !emittedIds.has(id)) : [],
|
|
166
|
+
fixed: fixedExceptions(keptComparable, exceptionsNow),
|
|
167
|
+
firstRecorded: firstRecorded(keptRules, exceptionsNow),
|
|
168
|
+
remeasured: remeasured(keptRules, exceptionsNow, options.mode),
|
|
169
|
+
touched: [
|
|
170
|
+
configPath,
|
|
171
|
+
...files,
|
|
172
|
+
...(readme === 'created' || readme === 'updated'
|
|
173
|
+
? [path.join(options.cwd, 'README.md')]
|
|
174
|
+
: []),
|
|
175
|
+
...changedIgnoreFiles,
|
|
176
|
+
].map((file) => path.relative(options.cwd, file)),
|
|
177
|
+
};
|
|
111
178
|
}
|
|
112
179
|
//# sourceMappingURL=layout.js.map
|
package/dist/cli/layout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/cli/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9F,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAuB,UAAU,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAuB,MAAM,uBAAuB,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/cli/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAC5C,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAI9C,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAwGD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAa7D;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,aAAa,CAgDf"}
|
package/dist/cli/migrate.js
CHANGED
|
@@ -4,7 +4,6 @@ import { detectEnforcers } from '../scanner/enforcers.js';
|
|
|
4
4
|
import { discoverAppDirs } from '../scanner/app-dirs.js';
|
|
5
5
|
import { hasTsConfig, scanRepo } from './scan.js';
|
|
6
6
|
import { buildRecommendations, detectStack } from './recommend.js';
|
|
7
|
-
import { renderAdoptionBody } from './report.js';
|
|
8
7
|
import { writeLayout } from './layout.js';
|
|
9
8
|
import { ARCHPRINT_DIR, DEPCRUISE_FILE, ESLINT_FILE, collectEnforcement, writesEslint, } from './generate.js';
|
|
10
9
|
import { CONFIG_FILE } from './archprint-config.js';
|
|
@@ -163,7 +162,7 @@ export function runMigration(cwd, version, options = {}) {
|
|
|
163
162
|
recommendations,
|
|
164
163
|
app: path.relative(cwd, plan.appDir) || '.',
|
|
165
164
|
cwd,
|
|
166
|
-
|
|
165
|
+
readme: true,
|
|
167
166
|
});
|
|
168
167
|
for (const edit of edits)
|
|
169
168
|
if (staysInsideItsFolder(edit.path))
|
package/dist/cli/migrate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/program.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
export declare function readVersion(): string;
|
|
3
|
-
export declare function runEslintCheck(appDir: string, outDir: string): Promise<void>;
|
|
4
3
|
export declare function buildProgram(version?: string): Command;
|
|
5
4
|
//# sourceMappingURL=program.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCpC,wBAAgB,WAAW,IAAI,MAAM,CAOpC;AAqFD,wBAAgB,YAAY,CAAC,OAAO,SAAgB,GAAG,OAAO,CAsqB7D"}
|
package/dist/cli/program.js
CHANGED
|
@@ -4,17 +4,20 @@ import { AllowError, runAllow } from './allow.js';
|
|
|
4
4
|
import { InvalidAllowError, LEGACY_ALLOW_FILE } from './allowed-exceptions.js';
|
|
5
5
|
import { adoptedAllowances, excludeAllowed } from './allowed-evidence.js';
|
|
6
6
|
import { InvalidRulesError, LEGACY_RULES_FILE } from './adopted-rules.js';
|
|
7
|
-
import { fileURLToPath
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import { Command } from 'commander';
|
|
9
9
|
import { checkSelfConsistency } from '../detector/self-consistency.js';
|
|
10
10
|
import { discoverAppDirs } from '../scanner/app-dirs.js';
|
|
11
11
|
import { detectEnforcers } from '../scanner/enforcers.js';
|
|
12
12
|
import { hasTsConfig, scanRepo } from './scan.js';
|
|
13
|
-
import {
|
|
13
|
+
import { renderExplain, renderInit, renderReport, renderRecommendations, renderRuleExplain, } from './report.js';
|
|
14
|
+
import { findRule, ruleNames } from './rule-ref.js';
|
|
14
15
|
import { buildRecommendations, detectStack } from './recommend.js';
|
|
15
|
-
import { toScanSummary } from './summary.js';
|
|
16
|
-
import { ARCHPRINT_DIR,
|
|
16
|
+
import { summarizeRules, toScanSummary } from './summary.js';
|
|
17
|
+
import { ARCHPRINT_DIR, FAMILY_NAMES, emitOne } from './generate.js';
|
|
17
18
|
import { writeLayout } from './layout.js';
|
|
19
|
+
import { runEslintCheck } from './eslint-check.js';
|
|
20
|
+
import { formatExceptions } from './ratchet.js';
|
|
18
21
|
import { CONFIG_FILE, readConfig, recordManagedFiles } from './archprint-config.js';
|
|
19
22
|
import { assertRealDirectory, ownedPath, staysInsideItsFolder } from '../generator/owned-paths.js';
|
|
20
23
|
import { stripAdoptionSection } from './adoption-readme.js';
|
|
@@ -60,66 +63,6 @@ function applyEmitOverride(detected, emit) {
|
|
|
60
63
|
return detected;
|
|
61
64
|
}
|
|
62
65
|
}
|
|
63
|
-
export async function runEslintCheck(appDir, outDir) {
|
|
64
|
-
const rulesFile = path.join(outDir, ESLINT_FILE);
|
|
65
|
-
if (!existsSync(rulesFile)) {
|
|
66
|
-
console.log('Check: no eslint rules were generated to check.');
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
const [{ ESLint }, tseslint, generated] = await Promise.all([
|
|
70
|
-
import('eslint'),
|
|
71
|
-
import('typescript-eslint'),
|
|
72
|
-
import(pathToFileURL(rulesFile).href),
|
|
73
|
-
]);
|
|
74
|
-
const archprintRuleIds = new Set();
|
|
75
|
-
for (const block of generated.default) {
|
|
76
|
-
const rules = block.rules;
|
|
77
|
-
if (rules)
|
|
78
|
-
for (const id of Object.keys(rules))
|
|
79
|
-
archprintRuleIds.add(id);
|
|
80
|
-
}
|
|
81
|
-
const config = [
|
|
82
|
-
{ files: ['**/*.{ts,tsx}'], languageOptions: { parser: tseslint.default.parser } },
|
|
83
|
-
...generated.default,
|
|
84
|
-
];
|
|
85
|
-
const eslint = new ESLint({
|
|
86
|
-
cwd: appDir,
|
|
87
|
-
overrideConfigFile: true,
|
|
88
|
-
overrideConfig: config,
|
|
89
|
-
});
|
|
90
|
-
let results;
|
|
91
|
-
/* v8 ignore start -- defensive: eslint throws only on an unresolved rule (e.g. an unregistered plugin) */
|
|
92
|
-
try {
|
|
93
|
-
results = await eslint.lintFiles(['**/*.{ts,tsx}']);
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
console.log(`Check: could not run eslint (${error.message}).`);
|
|
97
|
-
process.exitCode = 1;
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
/* v8 ignore stop */
|
|
101
|
-
const offends = (message) => message.severity === 2 && message.ruleId !== null && archprintRuleIds.has(message.ruleId);
|
|
102
|
-
const offenders = results.filter((result) => result.messages.some(offends));
|
|
103
|
-
const count = offenders.reduce((total, r) => total + r.messages.filter(offends).length, 0);
|
|
104
|
-
const unparsed = results.filter((result) => result.messages.some((m) => m.fatal));
|
|
105
|
-
if (unparsed.length > 0) {
|
|
106
|
-
console.log(`Check: ${unparsed.length} file(s) could not be parsed, so they were not checked:`);
|
|
107
|
-
for (const result of unparsed.slice(0, 10))
|
|
108
|
-
console.log(` ${path.relative(appDir, result.filePath)}`);
|
|
109
|
-
process.exitCode = 1;
|
|
110
|
-
}
|
|
111
|
-
if (count === 0) {
|
|
112
|
-
if (unparsed.length === 0)
|
|
113
|
-
console.log('Check: the generated eslint rules pass clean on this repo.');
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
console.log(`Check: ${count} violation(s) of the generated rules:`);
|
|
117
|
-
for (const result of offenders.slice(0, 10)) {
|
|
118
|
-
const rules = [...new Set(result.messages.filter(offends).map((m) => m.ruleId))];
|
|
119
|
-
console.log(` ${path.relative(appDir, result.filePath)}: ${rules.join(', ')}`);
|
|
120
|
-
}
|
|
121
|
-
process.exitCode = 1;
|
|
122
|
-
}
|
|
123
66
|
function resolveApp(input) {
|
|
124
67
|
const appDir = path.resolve(input);
|
|
125
68
|
if (hasTsConfig(appDir))
|
|
@@ -141,6 +84,12 @@ function displayPath(target, cwd = process.cwd()) {
|
|
|
141
84
|
const relative = path.relative(cwd, target);
|
|
142
85
|
return relative === '' ? '.' : relative.startsWith('..') ? target : relative;
|
|
143
86
|
}
|
|
87
|
+
/** Whether a flag other than --check and --out was given, so `generate --check` writes before it checks. */
|
|
88
|
+
function generationFlagsPassed(command) {
|
|
89
|
+
return command.options
|
|
90
|
+
.map((option) => option.attributeName())
|
|
91
|
+
.some((name) => name !== 'check' && name !== 'out' && command.getOptionValueSource(name) === 'cli');
|
|
92
|
+
}
|
|
144
93
|
function findPattern(input, id, deep) {
|
|
145
94
|
const appDir = resolveApp(input);
|
|
146
95
|
const pattern = scanRepo(appDir, { deep }).patterns.find((candidate) => candidate.config.id.toLowerCase() === id.toLowerCase());
|
|
@@ -163,6 +112,7 @@ export function buildProgram(version = readVersion()) {
|
|
|
163
112
|
.option('--fast', 'skip barrel/alias resolution (faster, less accurate)')
|
|
164
113
|
.option('--include-structural', 'also enforce the structural-inference families (held for review by default)')
|
|
165
114
|
.option('--expand', 'also write the per-family files, rule cards, and fixtures')
|
|
115
|
+
.option('--readme', 'also add an archprint section to README.md listing the adopted rules')
|
|
166
116
|
.option('--force', `overwrite an existing ${ARCHPRINT_DIR}/${CONFIG_FILE} and rules`)
|
|
167
117
|
.action((input, options) => {
|
|
168
118
|
const appDir = resolveApp(input);
|
|
@@ -192,7 +142,7 @@ export function buildProgram(version = readVersion()) {
|
|
|
192
142
|
const structural = options.includeStructural ?? false;
|
|
193
143
|
const enforcers = detectEnforcers(scan.appDir);
|
|
194
144
|
const recommendations = buildRecommendations(scan, detectStack(appDir), enforcers);
|
|
195
|
-
const { files, folded, configPath } = writeLayout(scan, outDir, {
|
|
145
|
+
const { files, folded, configPath, touched } = writeLayout(scan, outDir, {
|
|
196
146
|
structural,
|
|
197
147
|
enforcers,
|
|
198
148
|
expand: options.expand,
|
|
@@ -201,13 +151,14 @@ export function buildProgram(version = readVersion()) {
|
|
|
201
151
|
recommendations,
|
|
202
152
|
app: displayPath(appDir, cwd),
|
|
203
153
|
cwd,
|
|
204
|
-
|
|
154
|
+
readme: options.readme,
|
|
155
|
+
reset: true,
|
|
205
156
|
});
|
|
206
157
|
const config = readConfig(outDir);
|
|
207
158
|
/* v8 ignore next -- writeLayout always writes a readable config */
|
|
208
159
|
if (config === null)
|
|
209
160
|
return;
|
|
210
|
-
console.log(renderInit(config, files.length, structural, version));
|
|
161
|
+
console.log(renderInit(config, touched, files.length, structural, version));
|
|
211
162
|
reportFolded(folded, displayPath(configPath, cwd));
|
|
212
163
|
if (options.fast) {
|
|
213
164
|
console.log('\nWarning: rules came from a fast specifier-level scan; re-run without --fast before enforcing.');
|
|
@@ -257,10 +208,15 @@ export function buildProgram(version = readVersion()) {
|
|
|
257
208
|
.option('--no-graph', 'skip the layer dependency graph (Mermaid and Graphviz, with --expand)')
|
|
258
209
|
.option('--expand', 'also write the per-family files, rule cards, fixtures, and graph')
|
|
259
210
|
.option('--readme', 'also add an archprint section to README.md summarizing what is enforced')
|
|
260
|
-
.option('--only <family>', `
|
|
261
|
-
.option('--rules <ids>', '
|
|
262
|
-
.option('--
|
|
263
|
-
.
|
|
211
|
+
.option('--only <family>', `adopt one rule family, keeping the rules adopted before (${FAMILY_NAMES.join(', ')})`)
|
|
212
|
+
.option('--rules <ids>', 'adopt these rules, keeping the rules adopted before (comma-separated ids, e.g. AP-002,import-style,no-lib-to-app)')
|
|
213
|
+
.option('--reset', 'start from the default rule set instead of keeping the rules adopted before, and list the ones it removes')
|
|
214
|
+
.option('--check', 'run the generated eslint rules against the repo and report pass/fail; on its own it checks the rules already generated and writes nothing')
|
|
215
|
+
.action(async (input, options, command) => {
|
|
216
|
+
if (options.check && !generationFlagsPassed(command)) {
|
|
217
|
+
await runEslintCheck(resolveApp(input), path.resolve(options.out));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
264
220
|
if (options.emit !== undefined && !EMIT_TARGETS.includes(options.emit)) {
|
|
265
221
|
console.error(`Invalid --emit target '${options.emit}'. Use: ${EMIT_TARGETS.join(', ')}.`);
|
|
266
222
|
process.exitCode = 1;
|
|
@@ -316,24 +272,37 @@ export function buildProgram(version = readVersion()) {
|
|
|
316
272
|
process.exitCode = 1;
|
|
317
273
|
return;
|
|
318
274
|
}
|
|
319
|
-
const { files, removed, folded, configPath } = writeLayout(scan, outDir, {
|
|
275
|
+
const { files, removed, folded, configPath, kept, dropped, reset, fixed, firstRecorded, remeasured, } = writeLayout(scan, outDir, {
|
|
320
276
|
structural,
|
|
321
277
|
enforcers,
|
|
322
278
|
graph: options.graph,
|
|
323
279
|
expand: options.expand,
|
|
324
280
|
only: options.only,
|
|
325
281
|
ruleIds,
|
|
282
|
+
reset: options.reset,
|
|
326
283
|
mode: options.fast ? 'fast' : 'deep',
|
|
327
284
|
version,
|
|
328
285
|
recommendations,
|
|
329
286
|
app: displayPath(scan.appDir, cwd),
|
|
330
287
|
cwd,
|
|
331
|
-
|
|
288
|
+
readme: options.readme,
|
|
332
289
|
});
|
|
333
290
|
if (removed.length > 0) {
|
|
334
291
|
console.log(`Refreshed: removed ${removed.length} stale archprint output(s) before writing.`);
|
|
335
292
|
}
|
|
336
293
|
reportFolded(folded, displayPath(configPath, cwd));
|
|
294
|
+
if (kept.length > 0)
|
|
295
|
+
console.log(`Kept ${kept.length} previously adopted rule(s): ${kept.join(', ')}.`);
|
|
296
|
+
if (dropped.length > 0)
|
|
297
|
+
console.log(`Dropped ${dropped.length} previously adopted rule(s) the current scan no longer generates: ${dropped.join(', ')}. Review their evidence with 'archprint scan'.`);
|
|
298
|
+
if (reset.length > 0)
|
|
299
|
+
console.log(`Reset to the default rules: removed ${reset.length} previously adopted rule(s): ${reset.join(', ')}.`);
|
|
300
|
+
if (fixed.length > 0)
|
|
301
|
+
console.log(`Fixed since the last run, so the rules now apply to them:\n${formatExceptions(fixed)}`);
|
|
302
|
+
if (remeasured.length > 0)
|
|
303
|
+
console.log(`Measured again, since these rules were adopted from a ${options.fast ? 'full' : 'fast'} scan and this run is ${options.fast ? 'fast' : 'full'}; run in the rule's mode to compare:\n${formatExceptions(remeasured)}`);
|
|
304
|
+
if (firstRecorded.length > 0)
|
|
305
|
+
console.log(`Recorded the existing exceptions of rules adopted by an earlier archprint; from now on generate only removes them as they are fixed:\n${formatExceptions(firstRecorded)}`);
|
|
337
306
|
if (files.length === 0) {
|
|
338
307
|
if (heldStructuralAuto > 0) {
|
|
339
308
|
console.log(`No mechanical AUTO rules to generate. ${heldStructuralAuto} structural rule(s) are held for review; pass --include-structural to emit them (review before enforcing).`);
|
|
@@ -384,13 +353,24 @@ export function buildProgram(version = readVersion()) {
|
|
|
384
353
|
});
|
|
385
354
|
program
|
|
386
355
|
.command('explain')
|
|
387
|
-
.description('Show the gate evidence behind a rule
|
|
388
|
-
.argument('<
|
|
356
|
+
.description('Show the gate evidence behind a rule')
|
|
357
|
+
.argument('<rule>', 'rule id, label or ESLint name, e.g. AP-002, no-lib-to-app, "lib !-> app" or archprint/no-lib-to-app')
|
|
389
358
|
.argument('[path]', 'app directory', '.')
|
|
390
359
|
.option('--deep', 'resolve imports through barrels/aliases (slower, more accurate)')
|
|
391
|
-
.action((
|
|
392
|
-
const
|
|
393
|
-
|
|
360
|
+
.action((ref, input, options) => {
|
|
361
|
+
const appDir = resolveApp(input);
|
|
362
|
+
const scan = scanRepo(appDir, { deep: Boolean(options.deep) });
|
|
363
|
+
const pattern = findRule(ref, scan.patterns.map((candidate) => ({ ...candidate, id: candidate.config.id })));
|
|
364
|
+
if (pattern !== undefined) {
|
|
365
|
+
console.log(renderExplain(pattern, appDir));
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
const rules = summarizeRules(scan);
|
|
369
|
+
const rule = findRule(ref, rules);
|
|
370
|
+
if (rule === undefined) {
|
|
371
|
+
throw new Error(`No rule "${ref}" found in ${appDir}. Rules found: ${ruleNames(rules).join(', ') || 'none'}.`);
|
|
372
|
+
}
|
|
373
|
+
console.log(renderRuleExplain(rule));
|
|
394
374
|
});
|
|
395
375
|
program
|
|
396
376
|
.command('wire')
|
|
@@ -588,7 +568,7 @@ export function buildProgram(version = readVersion()) {
|
|
|
588
568
|
program
|
|
589
569
|
.command('allow')
|
|
590
570
|
.description('Allow one adopted rule to be broken in one file, with a reason. archprint check accepts it, lists it in the pull request, and archprint generate stops the generated rules flagging it.')
|
|
591
|
-
.argument('<rule>', 'adopted rule id, e.g. AP-001 or
|
|
571
|
+
.argument('<rule>', 'adopted rule id or ESLint name, e.g. AP-001, console-isolation or archprint/no-lib-to-app')
|
|
592
572
|
.argument('<file>', 'file the rule reports, relative to the current directory')
|
|
593
573
|
.option('--reason <text>', 'why this file is an exception (required)')
|
|
594
574
|
.option('--remove', 'remove the exception instead')
|