@design.estate/wcctools 6.0.0 → 6.2.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 +33 -0
- package/dist_shell/bundle.js +405 -368
- package/dist_shell/bundle.js.map +1 -1
- package/dist_shell/bundle.js.third-party-notices.json +52 -0
- package/dist_shell/bundle.js.third-party-notices.txt +107 -1
- package/dist_shell/index.html +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.bundlestatus.d.ts +36 -0
- package/dist_ts/classes.bundlestatus.js +110 -0
- package/dist_ts/classes.devapi.d.ts +3 -0
- package/dist_ts/classes.devapi.js +8 -1
- package/dist_ts/classes.devserver.d.ts +45 -10
- package/dist_ts/classes.devserver.js +123 -49
- package/dist_ts/cli.js +12 -3
- package/dist_ts/index.d.ts +0 -2
- package/dist_ts/index.js +1 -3
- package/dist_ts/plugins.d.ts +7 -2
- package/dist_ts/plugins.js +9 -3
- package/dist_ts/standards/baselines.d.ts +27 -0
- package/dist_ts/standards/baselines.js +83 -0
- package/dist_ts/standards/checker.d.ts +21 -0
- package/dist_ts/standards/checker.js +88 -0
- package/dist_ts/standards/classes.gitrepo.d.ts +13 -0
- package/dist_ts/standards/classes.gitrepo.js +43 -0
- package/dist_ts/standards/classes.sourceedits.d.ts +15 -0
- package/dist_ts/standards/classes.sourceedits.js +54 -0
- package/dist_ts/standards/classes.standardfixer.d.ts +40 -0
- package/dist_ts/standards/classes.standardfixer.js +210 -0
- package/dist_ts/standards/classes.standardproject.d.ts +80 -0
- package/dist_ts/standards/classes.standardproject.js +195 -0
- package/dist_ts/standards/classes.standardtree.d.ts +56 -0
- package/dist_ts/standards/classes.standardtree.js +207 -0
- package/dist_ts/standards/cli.d.ts +7 -0
- package/dist_ts/standards/cli.js +89 -0
- package/dist_ts/standards/config.d.ts +33 -0
- package/dist_ts/standards/config.js +139 -0
- package/dist_ts/standards/errors.d.ts +9 -0
- package/dist_ts/standards/errors.js +17 -0
- package/dist_ts/standards/helpers.ast.d.ts +56 -0
- package/dist_ts/standards/helpers.ast.js +172 -0
- package/dist_ts/standards/helpers.paths.d.ts +36 -0
- package/dist_ts/standards/helpers.paths.js +86 -0
- package/dist_ts/standards/index.d.ts +14 -0
- package/dist_ts/standards/index.js +15 -0
- package/dist_ts/standards/output.d.ts +7 -0
- package/dist_ts/standards/output.js +57 -0
- package/dist_ts/standards/ratchet.d.ts +15 -0
- package/dist_ts/standards/ratchet.js +45 -0
- package/dist_ts/standards/rule.d.ts +50 -0
- package/dist_ts/standards/rule.js +9 -0
- package/dist_ts/standards/rules/barrel.element-index.d.ts +7 -0
- package/dist_ts/standards/rules/barrel.element-index.js +108 -0
- package/dist_ts/standards/rules/barrel.no-demo-export.d.ts +3 -0
- package/dist_ts/standards/rules/barrel.no-demo-export.js +29 -0
- package/dist_ts/standards/rules/demo.fixture-not-exported.d.ts +3 -0
- package/dist_ts/standards/rules/demo.fixture-not-exported.js +29 -0
- package/dist_ts/standards/rules/demo.groups.d.ts +6 -0
- package/dist_ts/standards/rules/demo.groups.js +72 -0
- package/dist_ts/standards/rules/demo.required.d.ts +3 -0
- package/dist_ts/standards/rules/demo.required.js +48 -0
- package/dist_ts/standards/rules/demo.separate-file.d.ts +3 -0
- package/dist_ts/standards/rules/demo.separate-file.js +38 -0
- package/dist_ts/standards/rules/demo.shape.d.ts +3 -0
- package/dist_ts/standards/rules/demo.shape.js +38 -0
- package/dist_ts/standards/rules/docs.component-index.d.ts +8 -0
- package/dist_ts/standards/rules/docs.component-index.js +84 -0
- package/dist_ts/standards/rules/element.exported.d.ts +3 -0
- package/dist_ts/standards/rules/element.exported.js +33 -0
- package/dist_ts/standards/rules/element.literal-tag.d.ts +3 -0
- package/dist_ts/standards/rules/element.literal-tag.js +30 -0
- package/dist_ts/standards/rules/element.reachable.d.ts +3 -0
- package/dist_ts/standards/rules/element.reachable.js +48 -0
- package/dist_ts/standards/rules/element.tag-map.d.ts +3 -0
- package/dist_ts/standards/rules/element.tag-map.js +83 -0
- package/dist_ts/standards/rules/i18n.literals.d.ts +3 -0
- package/dist_ts/standards/rules/i18n.literals.js +52 -0
- package/dist_ts/standards/rules/index.d.ts +12 -0
- package/dist_ts/standards/rules/index.js +83 -0
- package/dist_ts/standards/rules/layout.element-folder.d.ts +3 -0
- package/dist_ts/standards/rules/layout.element-folder.js +47 -0
- package/dist_ts/standards/rules/layout.entry-file-name.d.ts +3 -0
- package/dist_ts/standards/rules/layout.entry-file-name.js +71 -0
- package/dist_ts/standards/rules/layout.entry.d.ts +3 -0
- package/dist_ts/standards/rules/layout.entry.js +38 -0
- package/dist_ts/standards/rules/layout.group-folder.d.ts +3 -0
- package/dist_ts/standards/rules/layout.group-folder.js +22 -0
- package/dist_ts/standards/rules/layout.shared-00.d.ts +3 -0
- package/dist_ts/standards/rules/layout.shared-00.js +36 -0
- package/dist_ts/standards/rules/naming.class-matches-tag.d.ts +3 -0
- package/dist_ts/standards/rules/naming.class-matches-tag.js +26 -0
- package/dist_ts/standards/rules/naming.lowercase-files.d.ts +3 -0
- package/dist_ts/standards/rules/naming.lowercase-files.js +26 -0
- package/dist_ts/standards/rules/naming.tag-prefix.d.ts +3 -0
- package/dist_ts/standards/rules/naming.tag-prefix.js +23 -0
- package/dist_ts/standards/rules/props.accessor.d.ts +3 -0
- package/dist_ts/standards/rules/props.accessor.js +35 -0
- package/dist_ts/standards/rules/props.object-no-attribute.d.ts +3 -0
- package/dist_ts/standards/rules/props.object-no-attribute.js +42 -0
- package/dist_ts/standards/rules/props.reflect-primitive.d.ts +5 -0
- package/dist_ts/standards/rules/props.reflect-primitive.js +41 -0
- package/dist_ts/standards/rules/props.typed.d.ts +6 -0
- package/dist_ts/standards/rules/props.typed.js +64 -0
- package/dist_ts/standards/rules/shared.d.ts +38 -0
- package/dist_ts/standards/rules/shared.js +103 -0
- package/dist_ts/standards/rules/style.bdtheme.d.ts +5 -0
- package/dist_ts/standards/rules/style.bdtheme.js +28 -0
- package/dist_ts_interfaces/index.d.ts +1 -0
- package/dist_ts_interfaces/index.js +2 -1
- package/dist_ts_interfaces/requests.d.ts +35 -0
- package/dist_ts_interfaces/standard.d.ts +93 -0
- package/dist_ts_interfaces/standard.js +6 -0
- package/dist_ts_shell/bundlestatus.d.ts +15 -0
- package/dist_ts_shell/bundlestatus.js +64 -0
- package/dist_ts_shell/elements/wcc-contextmenu.d.ts +3 -0
- package/dist_ts_shell/elements/wcc-contextmenu.js +18 -3
- package/dist_ts_shell/elements/wcc-preview-frame.d.ts +6 -0
- package/dist_ts_shell/elements/wcc-preview-frame.js +50 -2
- package/dist_ts_shell/elements/wcc-shell.d.ts +15 -0
- package/dist_ts_shell/elements/wcc-shell.js +45 -3
- package/dist_ts_shell/plugins.d.ts +2 -1
- package/dist_ts_shell/plugins.js +3 -2
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +8 -3
- package/readme.md +40 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.bundlestatus.ts +123 -0
- package/ts/classes.devapi.ts +9 -0
- package/ts/classes.devserver.ts +127 -47
- package/ts/cli.ts +12 -2
- package/ts/index.ts +0 -2
- package/ts/plugins.ts +10 -2
- package/ts/standards/baselines.ts +100 -0
- package/ts/standards/checker.ts +114 -0
- package/ts/standards/classes.gitrepo.ts +48 -0
- package/ts/standards/classes.sourceedits.ts +58 -0
- package/ts/standards/classes.standardfixer.ts +234 -0
- package/ts/standards/classes.standardproject.ts +250 -0
- package/ts/standards/classes.standardtree.ts +220 -0
- package/ts/standards/cli.ts +86 -0
- package/ts/standards/config.ts +160 -0
- package/ts/standards/errors.ts +18 -0
- package/ts/standards/helpers.ast.ts +208 -0
- package/ts/standards/helpers.paths.ts +119 -0
- package/ts/standards/index.ts +22 -0
- package/ts/standards/output.ts +65 -0
- package/ts/standards/ratchet.ts +63 -0
- package/ts/standards/rule.ts +58 -0
- package/ts/standards/rules/barrel.element-index.ts +112 -0
- package/ts/standards/rules/barrel.no-demo-export.ts +30 -0
- package/ts/standards/rules/demo.fixture-not-exported.ts +30 -0
- package/ts/standards/rules/demo.groups.ts +74 -0
- package/ts/standards/rules/demo.required.ts +49 -0
- package/ts/standards/rules/demo.separate-file.ts +40 -0
- package/ts/standards/rules/demo.shape.ts +42 -0
- package/ts/standards/rules/docs.component-index.ts +88 -0
- package/ts/standards/rules/element.exported.ts +35 -0
- package/ts/standards/rules/element.literal-tag.ts +30 -0
- package/ts/standards/rules/element.reachable.ts +49 -0
- package/ts/standards/rules/element.tag-map.ts +87 -0
- package/ts/standards/rules/i18n.literals.ts +58 -0
- package/ts/standards/rules/index.ts +87 -0
- package/ts/standards/rules/layout.element-folder.ts +49 -0
- package/ts/standards/rules/layout.entry-file-name.ts +73 -0
- package/ts/standards/rules/layout.entry.ts +40 -0
- package/ts/standards/rules/layout.group-folder.ts +23 -0
- package/ts/standards/rules/layout.shared-00.ts +37 -0
- package/ts/standards/rules/naming.class-matches-tag.ts +27 -0
- package/ts/standards/rules/naming.lowercase-files.ts +27 -0
- package/ts/standards/rules/naming.tag-prefix.ts +24 -0
- package/ts/standards/rules/props.accessor.ts +37 -0
- package/ts/standards/rules/props.object-no-attribute.ts +45 -0
- package/ts/standards/rules/props.reflect-primitive.ts +44 -0
- package/ts/standards/rules/props.typed.ts +70 -0
- package/ts/standards/rules/shared.ts +127 -0
- package/ts/standards/rules/style.bdtheme.ts +31 -0
- package/ts_interfaces/bridge.ts +95 -0
- package/ts_interfaces/catalog.ts +37 -0
- package/ts_interfaces/index.ts +4 -0
- package/ts_interfaces/plugins.ts +3 -0
- package/ts_interfaces/requests.ts +65 -0
- package/ts_interfaces/standard.ts +103 -0
- package/ts_shared/index.ts +1 -0
- package/ts_shared/plugins.ts +3 -0
- package/ts_shared/previewroute.ts +58 -0
- package/ts_shell/bundlestatus.ts +68 -0
- package/ts_shell/elements/wcc-contextmenu.ts +306 -0
- package/ts_shell/elements/wcc-preview-frame.ts +167 -0
- package/ts_shell/elements/wcc-properties.ts +998 -0
- package/ts_shell/elements/wcc-record-button.ts +108 -0
- package/ts_shell/elements/wcc-recording-panel.ts +1005 -0
- package/ts_shell/elements/wcc-shell.ts +485 -0
- package/ts_shell/elements/wcc-sidebar.ts +1419 -0
- package/ts_shell/index.html +21 -0
- package/ts_shell/index.ts +4 -0
- package/ts_shell/plugins.ts +12 -0
- package/ts_shell/previewconnection.ts +103 -0
- package/ts_shell/services/recorder.service.ts +451 -0
- package/ts_shell/types/dom-mediacapture-stub/index.d.ts +12 -0
- package/ts_shell/types/dom-mediacapture-stub/package.json +6 -0
- package/ts_shell/types/dom-webcodecs-stub/index.d.ts +2 -0
- package/ts_shell/types/dom-webcodecs-stub/package.json +6 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as ast from './helpers.ast.js';
|
|
3
|
+
import { isDemoFile, isTypeScriptSource, resolveSpecifier, toPosix } from './helpers.paths.js';
|
|
4
|
+
const ts = plugins.typescript;
|
|
5
|
+
/** The root barrel every reachability check starts from. */
|
|
6
|
+
export const rootBarrel = 'ts_web/index.ts';
|
|
7
|
+
export const elementsBarrel = 'ts_web/elements/index.ts';
|
|
8
|
+
/**
|
|
9
|
+
* The syntax-only model of a catalog the rules read: its files, elements, reactive properties and
|
|
10
|
+
* barrel graph. Built from a map of repository paths to file texts, so the same model serves a
|
|
11
|
+
* repository on disk and the fixer's in-memory tree.
|
|
12
|
+
*/
|
|
13
|
+
export class StandardProject {
|
|
14
|
+
files;
|
|
15
|
+
existsOnDisk;
|
|
16
|
+
parseCache;
|
|
17
|
+
elementsCache = null;
|
|
18
|
+
propertiesCache = null;
|
|
19
|
+
reexportsCache = new Map();
|
|
20
|
+
constructor(filesArg, existsOnDiskArg, parseCacheArg = new Map()) {
|
|
21
|
+
this.files = filesArg;
|
|
22
|
+
this.existsOnDisk = existsOnDiskArg;
|
|
23
|
+
this.parseCache = parseCacheArg;
|
|
24
|
+
}
|
|
25
|
+
/** True when the file is part of the model or exists in the repository. */
|
|
26
|
+
exists(fileArg) {
|
|
27
|
+
return this.files.has(fileArg) || this.existsOnDisk(fileArg);
|
|
28
|
+
}
|
|
29
|
+
/** The `ts_web/**\/*.ts` sources, sorted. */
|
|
30
|
+
get webFiles() {
|
|
31
|
+
return [...this.files.keys()].filter((fileArg) => fileArg.startsWith('ts_web/') && fileArg.endsWith('.ts') && isTypeScriptSource(fileArg)).sort();
|
|
32
|
+
}
|
|
33
|
+
sourceFile(fileArg) {
|
|
34
|
+
const text = this.files.get(fileArg);
|
|
35
|
+
if (text === undefined) {
|
|
36
|
+
throw new Error(`Not a known file: ${fileArg}`);
|
|
37
|
+
}
|
|
38
|
+
const cached = this.parseCache.get(fileArg);
|
|
39
|
+
if (cached && cached.text === text) {
|
|
40
|
+
return cached.sourceFile;
|
|
41
|
+
}
|
|
42
|
+
const sourceFile = ast.parseSource(fileArg, text);
|
|
43
|
+
this.parseCache.set(fileArg, { text, sourceFile });
|
|
44
|
+
return sourceFile;
|
|
45
|
+
}
|
|
46
|
+
/** `compilerOptions.experimentalDecorators` of tsconfig.json (its `extends` chain is not followed). */
|
|
47
|
+
get experimentalDecorators() {
|
|
48
|
+
const text = this.files.get('tsconfig.json');
|
|
49
|
+
if (!text) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const parsed = ts.parseConfigFileTextToJson('tsconfig.json', text);
|
|
53
|
+
return parsed.config?.compilerOptions?.experimentalDecorators === true;
|
|
54
|
+
}
|
|
55
|
+
get elements() {
|
|
56
|
+
if (!this.elementsCache) {
|
|
57
|
+
this.elementsCache = [];
|
|
58
|
+
for (const file of this.webFiles) {
|
|
59
|
+
const sourceFile = this.sourceFile(file);
|
|
60
|
+
const visit = (nodeArg) => {
|
|
61
|
+
if (ts.isClassDeclaration(nodeArg)) {
|
|
62
|
+
const decorator = ast.findDecoratorCall(nodeArg, ['customElement']);
|
|
63
|
+
if (decorator) {
|
|
64
|
+
const tagArgument = decorator.call.arguments[0];
|
|
65
|
+
this.elementsCache.push({
|
|
66
|
+
file,
|
|
67
|
+
sourceFile,
|
|
68
|
+
classNode: nodeArg,
|
|
69
|
+
className: nodeArg.name?.text ?? null,
|
|
70
|
+
decoratorCall: decorator.call,
|
|
71
|
+
tag: decorator.call.arguments.length === 1 && ast.isStringLiteralLike(tagArgument) ? tagArgument.text : null,
|
|
72
|
+
exported: ast.hasModifier(nodeArg, ts.SyntaxKind.ExportKeyword),
|
|
73
|
+
inDemoFile: isDemoFile(file),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
ts.forEachChild(nodeArg, visit);
|
|
78
|
+
};
|
|
79
|
+
visit(sourceFile);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return this.elementsCache;
|
|
83
|
+
}
|
|
84
|
+
get properties() {
|
|
85
|
+
if (!this.propertiesCache) {
|
|
86
|
+
this.propertiesCache = [];
|
|
87
|
+
for (const file of this.webFiles) {
|
|
88
|
+
const sourceFile = this.sourceFile(file);
|
|
89
|
+
const visit = (nodeArg) => {
|
|
90
|
+
if (ts.isClassDeclaration(nodeArg) || ts.isClassExpression(nodeArg)) {
|
|
91
|
+
for (const member of nodeArg.members) {
|
|
92
|
+
const decorator = ast.findDecoratorCall(member, ['property', 'state']);
|
|
93
|
+
const name = ast.memberNameText(member);
|
|
94
|
+
if (!decorator || name === null) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const firstArgument = decorator.call.arguments[0];
|
|
98
|
+
const isPrivateName = !!member.name && ts.isPrivateIdentifier(member.name);
|
|
99
|
+
this.propertiesCache.push({
|
|
100
|
+
file,
|
|
101
|
+
sourceFile,
|
|
102
|
+
classNode: nodeArg,
|
|
103
|
+
member,
|
|
104
|
+
name: isPrivateName && !name.startsWith('#') ? `#${name}` : name,
|
|
105
|
+
decorator: decorator.name,
|
|
106
|
+
call: decorator.call,
|
|
107
|
+
options: firstArgument && ts.isObjectLiteralExpression(firstArgument) ? firstArgument : null,
|
|
108
|
+
dynamicOptions: !!firstArgument && !ts.isObjectLiteralExpression(firstArgument),
|
|
109
|
+
isPublic: !isPrivateName
|
|
110
|
+
&& !ast.hasModifier(member, ts.SyntaxKind.PrivateKeyword)
|
|
111
|
+
&& !ast.hasModifier(member, ts.SyntaxKind.ProtectedKeyword),
|
|
112
|
+
inDemoFile: isDemoFile(file),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
ts.forEachChild(nodeArg, visit);
|
|
117
|
+
};
|
|
118
|
+
visit(sourceFile);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return this.propertiesCache;
|
|
122
|
+
}
|
|
123
|
+
/** The `export … from` declarations of a file with relative specifiers. */
|
|
124
|
+
reexports(fileArg) {
|
|
125
|
+
let reexports = this.reexportsCache.get(fileArg);
|
|
126
|
+
if (!reexports) {
|
|
127
|
+
reexports = [];
|
|
128
|
+
if (this.files.has(fileArg)) {
|
|
129
|
+
for (const statement of this.sourceFile(fileArg).statements) {
|
|
130
|
+
if (ts.isExportDeclaration(statement) && statement.moduleSpecifier && ast.isStringLiteralLike(statement.moduleSpecifier)) {
|
|
131
|
+
const specifier = statement.moduleSpecifier.text;
|
|
132
|
+
if (!specifier.startsWith('.')) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const resolved = resolveSpecifier(fileArg, specifier, (candidateArg) => this.files.has(candidateArg));
|
|
136
|
+
reexports.push({ file: fileArg, statement, specifier, target: resolved?.target ?? null });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
this.reexportsCache.set(fileArg, reexports);
|
|
141
|
+
}
|
|
142
|
+
return reexports;
|
|
143
|
+
}
|
|
144
|
+
/** Every file reached from a barrel by following `export … from` declarations. */
|
|
145
|
+
reachableFrom(fileArg) {
|
|
146
|
+
const reached = new Set();
|
|
147
|
+
const queue = this.files.has(fileArg) ? [fileArg] : [];
|
|
148
|
+
while (queue.length > 0) {
|
|
149
|
+
const file = queue.shift();
|
|
150
|
+
if (reached.has(file)) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
reached.add(file);
|
|
154
|
+
for (const reexport of this.reexports(file)) {
|
|
155
|
+
if (reexport.target && !reached.has(reexport.target)) {
|
|
156
|
+
queue.push(reexport.target);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return reached;
|
|
161
|
+
}
|
|
162
|
+
lineAndColumn(fileArg, positionArg) {
|
|
163
|
+
return ast.lineAndColumn(this.sourceFile(fileArg), positionArg);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** The files besides `ts_web/**` a check reads. */
|
|
167
|
+
export const standardSideFiles = ['html/index.ts', 'html/index.html', 'tsconfig.json', 'readme.md'];
|
|
168
|
+
/** Reads the files the standard covers from a repository on disk. */
|
|
169
|
+
export const loadStandardProject = async (rootDirArg) => {
|
|
170
|
+
const files = new Map();
|
|
171
|
+
const webDir = plugins.path.join(rootDirArg, 'ts_web');
|
|
172
|
+
if (plugins.fsSync.existsSync(webDir)) {
|
|
173
|
+
const entries = await plugins.fs.readdir(webDir, { recursive: true, withFileTypes: true });
|
|
174
|
+
for (const entry of entries) {
|
|
175
|
+
if (!entry.isFile()) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const relative = toPosix(plugins.path.relative(rootDirArg, plugins.path.join(entry.parentPath, entry.name)));
|
|
179
|
+
if (relative.split('/').some((segmentArg) => segmentArg === 'node_modules')) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (relative.endsWith('.ts') && isTypeScriptSource(relative)) {
|
|
183
|
+
files.set(relative, await plugins.fs.readFile(plugins.path.join(rootDirArg, relative), 'utf8'));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
for (const sideFile of standardSideFiles) {
|
|
188
|
+
const absolute = plugins.path.join(rootDirArg, sideFile);
|
|
189
|
+
if (plugins.fsSync.existsSync(absolute)) {
|
|
190
|
+
files.set(sideFile, await plugins.fs.readFile(absolute, 'utf8'));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return new StandardProject(files, (fileArg) => plugins.fsSync.existsSync(plugins.path.join(rootDirArg, fileArg)));
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdGFuZGFyZHByb2plY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdGFuZGFyZHMvY2xhc3Nlcy5zdGFuZGFyZHByb2plY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9GLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUEyQzlCLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDO0FBRXpEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUNWLEtBQUssQ0FBOEI7SUFDbEMsWUFBWSxDQUErQjtJQUMzQyxVQUFVLENBQWM7SUFDakMsYUFBYSxHQUE4QixJQUFJLENBQUM7SUFDaEQsZUFBZSxHQUErQixJQUFJLENBQUM7SUFDbkQsY0FBYyxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBRWhFLFlBQVksUUFBcUMsRUFBRSxlQUE2QyxFQUFFLGdCQUE2QixJQUFJLEdBQUcsRUFBRTtRQUN0SSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQztRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztJQUNsQyxDQUFDO0lBRUQsMkVBQTJFO0lBQ3BFLE1BQU0sQ0FBQyxPQUFlO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLElBQVcsUUFBUTtRQUNqQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwSixDQUFDO0lBRU0sVUFBVSxDQUFDLE9BQWU7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDM0IsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCx1R0FBdUc7SUFDdkcsSUFBVyxzQkFBc0I7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixLQUFLLElBQUksQ0FBQztJQUN6RSxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBa0IsRUFBUSxFQUFFO29CQUN6QyxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUNuQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQzt3QkFDcEUsSUFBSSxTQUFTLEVBQUUsQ0FBQzs0QkFDZCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDaEQsSUFBSSxDQUFDLGFBQWMsQ0FBQyxJQUFJLENBQUM7Z0NBQ3ZCLElBQUk7Z0NBQ0osVUFBVTtnQ0FDVixTQUFTLEVBQUUsT0FBTztnQ0FDbEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUk7Z0NBQ3JDLGFBQWEsRUFBRSxTQUFTLENBQUMsSUFBSTtnQ0FDN0IsR0FBRyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO2dDQUM1RyxRQUFRLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7Z0NBQy9ELFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDOzZCQUM3QixDQUFDLENBQUM7d0JBQ0wsQ0FBQztvQkFDSCxDQUFDO29CQUNELEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNsQyxDQUFDLENBQUM7Z0JBQ0YsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUMxQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFrQixFQUFRLEVBQUU7b0JBQ3pDLElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUNwRSxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDckMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDOzRCQUN2RSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUN4QyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQ0FDaEMsU0FBUzs0QkFDWCxDQUFDOzRCQUNELE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNsRCxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUMzRSxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxJQUFJLENBQUM7Z0NBQ3pCLElBQUk7Z0NBQ0osVUFBVTtnQ0FDVixTQUFTLEVBQUUsT0FBZ0M7Z0NBQzNDLE1BQU07Z0NBQ04sSUFBSSxFQUFFLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7Z0NBQ2hFLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBNEI7Z0NBQ2pELElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtnQ0FDcEIsT0FBTyxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMseUJBQXlCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQ0FDNUYsY0FBYyxFQUFFLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsYUFBYSxDQUFDO2dDQUMvRSxRQUFRLEVBQUUsQ0FBQyxhQUFhO3VDQUNuQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO3VDQUN0RCxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUM7Z0NBQzdELFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDOzZCQUM3QixDQUFDLENBQUM7d0JBQ0wsQ0FBQztvQkFDSCxDQUFDO29CQUNELEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNsQyxDQUFDLENBQUM7Z0JBQ0YsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCwyRUFBMkU7SUFDcEUsU0FBUyxDQUFDLE9BQWU7UUFDOUIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNmLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUM1RCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsZUFBZSxJQUFJLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQzt3QkFDekgsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7d0JBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQy9CLFNBQVM7d0JBQ1gsQ0FBQzt3QkFDRCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUN0RyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzVGLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxrRkFBa0Y7SUFDM0UsYUFBYSxDQUFDLE9BQWU7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFHLENBQUM7WUFDNUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDckQsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxhQUFhLENBQUMsT0FBZSxFQUFFLFdBQW1CO1FBQ3ZELE9BQU8sR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDRjtBQUVELG1EQUFtRDtBQUNuRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFcEcscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEtBQUssRUFBRSxVQUFrQixFQUE0QixFQUFFO0lBQ3hGLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdHLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsS0FBSyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUM1RSxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM3RCxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELEtBQUssTUFBTSxRQUFRLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwSCxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as ast from './helpers.ast.js';
|
|
3
|
+
import { StandardProject } from './classes.standardproject.js';
|
|
4
|
+
import type { IFixBuilder } from './rule.js';
|
|
5
|
+
/** The changes one rule run collected. */
|
|
6
|
+
export declare class FixBatch implements IFixBuilder {
|
|
7
|
+
readonly edits: Map<string, ast.ITextEdit[]>;
|
|
8
|
+
readonly creates: Map<string, string>;
|
|
9
|
+
readonly moves: Map<string, string>;
|
|
10
|
+
readonly redirects: Map<string, string>;
|
|
11
|
+
edit(fileArg: string, startArg: number, endArg: number, textArg: string): void;
|
|
12
|
+
create(fileArg: string, textArg: string): void;
|
|
13
|
+
move(fromArg: string, toArg: string): void;
|
|
14
|
+
redirectBarrelExports(targetArg: string, barrelTargetArg: string): void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The fixer's in-memory copy of a repository: the tracked TypeScript sources and the side files the
|
|
18
|
+
* standard reads, with the moves and edits applied so far. Nothing touches the disk until the
|
|
19
|
+
* fixer commits the tree. Every path a batch names must be a repository path (see isRepoPath);
|
|
20
|
+
* a batch with any other path is rejected before it changes the tree.
|
|
21
|
+
*/
|
|
22
|
+
export declare class StandardTree {
|
|
23
|
+
readonly files: Map<string, string>;
|
|
24
|
+
private readonly originalTexts;
|
|
25
|
+
/** Current path → original path, for moved files. */
|
|
26
|
+
private readonly originOf;
|
|
27
|
+
/** Original paths that were moved away. */
|
|
28
|
+
private readonly vacated;
|
|
29
|
+
readonly created: Set<string>;
|
|
30
|
+
/** Current path → ids of the rules that changed the file. */
|
|
31
|
+
private readonly changedBy;
|
|
32
|
+
private readonly parseCache;
|
|
33
|
+
/** Every tracked file of the repository, including those the tree holds no text for (`.json`, `.css`, `.d.ts`, …). */
|
|
34
|
+
private readonly trackedFiles;
|
|
35
|
+
private readonly existsOnDisk;
|
|
36
|
+
constructor(filesArg: Map<string, string>, trackedFilesArg: Iterable<string>, existsOnDiskArg: (fileArg: string) => boolean);
|
|
37
|
+
exists(fileArg: string): boolean;
|
|
38
|
+
/** The model of the tree's current state. */
|
|
39
|
+
project(): StandardProject;
|
|
40
|
+
private markChanged;
|
|
41
|
+
/**
|
|
42
|
+
* Applies a batch: edits, then new files, then moves with import rewriting. Returns the number of
|
|
43
|
+
* applied changes. Throws without changing the tree when the batch names a path that is not a
|
|
44
|
+
* repository path.
|
|
45
|
+
*/
|
|
46
|
+
apply(ruleIdArg: string, batchArg: FixBatch): number;
|
|
47
|
+
/**
|
|
48
|
+
* Rewrites every relative module specifier whose importing file or target moves, keeping its
|
|
49
|
+
* extension style. A specifier resolves to any tracked file (sources, `.d.ts`, `.json`, `.css`, …),
|
|
50
|
+
* so a moved file's imports of files that stay keep pointing at them. Barrel re-exports of a
|
|
51
|
+
* redirected target point at the redirect instead.
|
|
52
|
+
*/
|
|
53
|
+
private rewriteSpecifiers;
|
|
54
|
+
/** The tree's changes against the repository it was read from. */
|
|
55
|
+
plan(): plugins.interfaces.IStandardFixPlan;
|
|
56
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as ast from './helpers.ast.js';
|
|
3
|
+
import { baseOf, isRepoPath, isTypeScriptSource, resolveSpecifier, specifierFor } from './helpers.paths.js';
|
|
4
|
+
import { SourceEdits } from './classes.sourceedits.js';
|
|
5
|
+
import { StandardProject } from './classes.standardproject.js';
|
|
6
|
+
const ts = plugins.typescript;
|
|
7
|
+
/** The changes one rule run collected. */
|
|
8
|
+
export class FixBatch {
|
|
9
|
+
edits = new Map();
|
|
10
|
+
creates = new Map();
|
|
11
|
+
moves = new Map();
|
|
12
|
+
redirects = new Map();
|
|
13
|
+
edit(fileArg, startArg, endArg, textArg) {
|
|
14
|
+
this.edits.set(fileArg, [...(this.edits.get(fileArg) ?? []), { start: startArg, end: endArg, text: textArg }]);
|
|
15
|
+
}
|
|
16
|
+
create(fileArg, textArg) {
|
|
17
|
+
if (!this.creates.has(fileArg)) {
|
|
18
|
+
this.creates.set(fileArg, textArg);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
move(fromArg, toArg) {
|
|
22
|
+
if (!this.moves.has(fromArg)) {
|
|
23
|
+
this.moves.set(fromArg, toArg);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
redirectBarrelExports(targetArg, barrelTargetArg) {
|
|
27
|
+
this.redirects.set(targetArg, barrelTargetArg);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The fixer's in-memory copy of a repository: the tracked TypeScript sources and the side files the
|
|
32
|
+
* standard reads, with the moves and edits applied so far. Nothing touches the disk until the
|
|
33
|
+
* fixer commits the tree. Every path a batch names must be a repository path (see isRepoPath);
|
|
34
|
+
* a batch with any other path is rejected before it changes the tree.
|
|
35
|
+
*/
|
|
36
|
+
export class StandardTree {
|
|
37
|
+
files;
|
|
38
|
+
originalTexts = new Map();
|
|
39
|
+
/** Current path → original path, for moved files. */
|
|
40
|
+
originOf = new Map();
|
|
41
|
+
/** Original paths that were moved away. */
|
|
42
|
+
vacated = new Set();
|
|
43
|
+
created = new Set();
|
|
44
|
+
/** Current path → ids of the rules that changed the file. */
|
|
45
|
+
changedBy = new Map();
|
|
46
|
+
parseCache = new Map();
|
|
47
|
+
/** Every tracked file of the repository, including those the tree holds no text for (`.json`, `.css`, `.d.ts`, …). */
|
|
48
|
+
trackedFiles;
|
|
49
|
+
existsOnDisk;
|
|
50
|
+
constructor(filesArg, trackedFilesArg, existsOnDiskArg) {
|
|
51
|
+
this.files = new Map(filesArg);
|
|
52
|
+
for (const [file, text] of filesArg) {
|
|
53
|
+
this.originalTexts.set(file, text);
|
|
54
|
+
}
|
|
55
|
+
this.trackedFiles = new Set(trackedFilesArg);
|
|
56
|
+
this.existsOnDisk = existsOnDiskArg;
|
|
57
|
+
}
|
|
58
|
+
exists(fileArg) {
|
|
59
|
+
return this.files.has(fileArg) || (!this.vacated.has(fileArg) && this.existsOnDisk(fileArg));
|
|
60
|
+
}
|
|
61
|
+
/** The model of the tree's current state. */
|
|
62
|
+
project() {
|
|
63
|
+
return new StandardProject(this.files, (fileArg) => this.exists(fileArg), this.parseCache);
|
|
64
|
+
}
|
|
65
|
+
markChanged(fileArg, ruleIdArg) {
|
|
66
|
+
this.changedBy.set(fileArg, new Set([...(this.changedBy.get(fileArg) ?? []), ruleIdArg]));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Applies a batch: edits, then new files, then moves with import rewriting. Returns the number of
|
|
70
|
+
* applied changes. Throws without changing the tree when the batch names a path that is not a
|
|
71
|
+
* repository path.
|
|
72
|
+
*/
|
|
73
|
+
apply(ruleIdArg, batchArg) {
|
|
74
|
+
const outside = [
|
|
75
|
+
...batchArg.edits.keys(),
|
|
76
|
+
...batchArg.creates.keys(),
|
|
77
|
+
...[...batchArg.moves].flat(),
|
|
78
|
+
...[...batchArg.redirects].flat(),
|
|
79
|
+
].filter((pathArg) => !isRepoPath(pathArg));
|
|
80
|
+
if (outside.length > 0) {
|
|
81
|
+
throw new Error(`The fix of ${ruleIdArg} names paths outside the repository root: ${[...new Set(outside)].join(', ')}`);
|
|
82
|
+
}
|
|
83
|
+
let applied = 0;
|
|
84
|
+
for (const [file, edits] of batchArg.edits) {
|
|
85
|
+
const text = this.files.get(file);
|
|
86
|
+
if (text === undefined) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const sourceEdits = new SourceEdits();
|
|
90
|
+
edits.forEach((editArg) => sourceEdits.add(editArg));
|
|
91
|
+
const next = sourceEdits.apply(text);
|
|
92
|
+
if (next !== text) {
|
|
93
|
+
this.files.set(file, next);
|
|
94
|
+
this.markChanged(file, ruleIdArg);
|
|
95
|
+
applied += sourceEdits.size;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
for (const [file, text] of batchArg.creates) {
|
|
99
|
+
if (this.exists(file)) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
this.files.set(file, text);
|
|
103
|
+
this.created.add(file);
|
|
104
|
+
this.markChanged(file, ruleIdArg);
|
|
105
|
+
applied++;
|
|
106
|
+
}
|
|
107
|
+
const moves = new Map();
|
|
108
|
+
const targets = new Set();
|
|
109
|
+
for (const [from, to] of batchArg.moves) {
|
|
110
|
+
if (from === to || !this.files.has(from) || targets.has(to) || (this.exists(to) && !batchArg.moves.has(to))) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
moves.set(from, to);
|
|
114
|
+
targets.add(to);
|
|
115
|
+
}
|
|
116
|
+
if (moves.size > 0) {
|
|
117
|
+
this.rewriteSpecifiers(ruleIdArg, moves, batchArg.redirects);
|
|
118
|
+
const texts = new Map([...moves.keys()].map((fromArg) => [fromArg, this.files.get(fromArg)]));
|
|
119
|
+
for (const [from, to] of moves) {
|
|
120
|
+
this.files.delete(from);
|
|
121
|
+
if (this.created.delete(from)) {
|
|
122
|
+
this.created.add(to);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const origin = this.originOf.get(from) ?? from;
|
|
126
|
+
this.originOf.delete(from);
|
|
127
|
+
if (origin !== to) {
|
|
128
|
+
this.originOf.set(to, origin);
|
|
129
|
+
}
|
|
130
|
+
if (origin === from) {
|
|
131
|
+
this.vacated.add(from);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const changed = this.changedBy.get(from);
|
|
135
|
+
this.changedBy.delete(from);
|
|
136
|
+
if (changed) {
|
|
137
|
+
this.changedBy.set(to, changed);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
for (const [from, to] of moves) {
|
|
141
|
+
this.files.set(to, texts.get(from));
|
|
142
|
+
this.vacated.delete(to);
|
|
143
|
+
}
|
|
144
|
+
applied += moves.size;
|
|
145
|
+
}
|
|
146
|
+
return applied;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Rewrites every relative module specifier whose importing file or target moves, keeping its
|
|
150
|
+
* extension style. A specifier resolves to any tracked file (sources, `.d.ts`, `.json`, `.css`, …),
|
|
151
|
+
* so a moved file's imports of files that stay keep pointing at them. Barrel re-exports of a
|
|
152
|
+
* redirected target point at the redirect instead.
|
|
153
|
+
*/
|
|
154
|
+
rewriteSpecifiers(ruleIdArg, movesArg, redirectsArg) {
|
|
155
|
+
const known = (fileArg) => this.files.has(fileArg) || (this.trackedFiles.has(fileArg) && !this.vacated.has(fileArg));
|
|
156
|
+
const project = this.project();
|
|
157
|
+
for (const [file, text] of [...this.files]) {
|
|
158
|
+
if (!isTypeScriptSource(file)) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const newFile = movesArg.get(file) ?? file;
|
|
162
|
+
const sourceFile = project.sourceFile(file);
|
|
163
|
+
const edits = new SourceEdits();
|
|
164
|
+
for (const literal of ast.moduleSpecifierLiterals(sourceFile)) {
|
|
165
|
+
const resolved = resolveSpecifier(file, literal.text, known);
|
|
166
|
+
if (!resolved) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
let target = movesArg.get(resolved.target) ?? resolved.target;
|
|
170
|
+
let viaFolder = resolved.viaFolder;
|
|
171
|
+
const redirect = redirectsArg.get(resolved.target);
|
|
172
|
+
if (redirect && redirect !== newFile && ts.isExportDeclaration(literal.parent) && baseOf(newFile) === 'index.ts') {
|
|
173
|
+
target = redirect;
|
|
174
|
+
viaFolder = true;
|
|
175
|
+
}
|
|
176
|
+
if (newFile === file && target === resolved.target) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const specifier = specifierFor(newFile, target, resolved.style, viaFolder);
|
|
180
|
+
if (specifier !== literal.text) {
|
|
181
|
+
edits.add({ start: literal.getStart() + 1, end: literal.end - 1, text: specifier });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (edits.size > 0) {
|
|
185
|
+
this.files.set(file, edits.apply(text));
|
|
186
|
+
this.markChanged(file, ruleIdArg);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** The tree's changes against the repository it was read from. */
|
|
191
|
+
plan() {
|
|
192
|
+
const moves = [...this.originOf].map(([to, from]) => ({ from, to })).sort((a, b) => a.from.localeCompare(b.from));
|
|
193
|
+
const created = [...this.created].sort();
|
|
194
|
+
const edited = [];
|
|
195
|
+
for (const [file, ruleIds] of [...this.changedBy].sort(([a], [b]) => a.localeCompare(b))) {
|
|
196
|
+
if (this.created.has(file)) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const origin = this.originOf.get(file) ?? file;
|
|
200
|
+
if (this.files.get(file) !== this.originalTexts.get(origin)) {
|
|
201
|
+
edited.push({ file, ruleIds: [...ruleIds].sort() });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return { moves, created, edited };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdGFuZGFyZHRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdGFuZGFyZHMvY2xhc3Nlcy5zdGFuZGFyZHRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSw4QkFBOEIsQ0FBQztBQUdqRixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBRTlCLDBDQUEwQztBQUMxQyxNQUFNLE9BQU8sUUFBUTtJQUNILEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUNoRCxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDcEMsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ2xDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUUvQyxJQUFJLENBQUMsT0FBZSxFQUFFLFFBQWdCLEVBQUUsTUFBYyxFQUFFLE9BQWU7UUFDNUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakgsQ0FBQztJQUVNLE1BQU0sQ0FBQyxPQUFlLEVBQUUsT0FBZTtRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFTSxJQUFJLENBQUMsT0FBZSxFQUFFLEtBQWE7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRU0scUJBQXFCLENBQUMsU0FBaUIsRUFBRSxlQUF1QjtRQUNyRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNQLEtBQUssQ0FBc0I7SUFDMUIsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzNELHFEQUFxRDtJQUNwQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDdEQsMkNBQTJDO0lBQzFCLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzdCLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzVDLDZEQUE2RDtJQUM1QyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDM0MsVUFBVSxHQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3JELHNIQUFzSDtJQUNyRyxZQUFZLENBQXNCO0lBQ2xDLFlBQVksQ0FBK0I7SUFFNUQsWUFBWSxRQUE2QixFQUFFLGVBQWlDLEVBQUUsZUFBNkM7UUFDekgsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDO0lBQ3RDLENBQUM7SUFFTSxNQUFNLENBQUMsT0FBZTtRQUMzQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELDZDQUE2QztJQUN0QyxPQUFPO1FBQ1osT0FBTyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRU8sV0FBVyxDQUFDLE9BQWUsRUFBRSxTQUFpQjtRQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLFNBQWlCLEVBQUUsUUFBa0I7UUFDaEQsTUFBTSxPQUFPLEdBQUc7WUFDZCxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ3hCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDMUIsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRTtZQUM3QixHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFO1NBQ2xDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsU0FBUyw2Q0FBNkMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxSCxDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3ZCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN0QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDbEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN0QixTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsSUFBSSxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzVHLFNBQVM7WUFDWCxDQUFDO1lBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN4QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO29CQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7d0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztvQkFDRCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVCLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFFLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUIsQ0FBQztZQUNELE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3hCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQkFBaUIsQ0FBQyxTQUFpQixFQUFFLFFBQTZCLEVBQUUsWUFBaUM7UUFDM0csTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFlLEVBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RJLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM5QixTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQzNDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQyxLQUFLLE1BQU0sT0FBTyxJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM5RCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNkLFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUM5RCxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUNuQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxRQUFRLElBQUksUUFBUSxLQUFLLE9BQU8sSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDakgsTUFBTSxHQUFHLFFBQVEsQ0FBQztvQkFDbEIsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDbkIsQ0FBQztnQkFDRCxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbkQsU0FBUztnQkFDWCxDQUFDO2dCQUNELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzNFLElBQUksU0FBUyxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDL0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDdEYsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELGtFQUFrRTtJQUMzRCxJQUFJO1FBQ1QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEgsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBa0QsRUFBRSxDQUFDO1FBQ2pFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekYsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzQixTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztZQUMvQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzVELE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Registers `wcctools check` and `wcctools fix`. Both work on the current directory, the
|
|
4
|
+
* repository root that holds `.smartconfig.json`. Exit codes: 0 ok, 1 failing findings or a
|
|
5
|
+
* refused baseline update, 2 configuration or usage error (StandardConfigError/StandardUsageError).
|
|
6
|
+
*/
|
|
7
|
+
export declare const registerStandardCommands: (out: plugins.smartconsole.SmartConsole) => void;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { checkStandard } from './checker.js';
|
|
3
|
+
import { loadStandardProject } from './classes.standardproject.js';
|
|
4
|
+
import { StandardFixer } from './classes.standardfixer.js';
|
|
5
|
+
import { openStandardConfig } from './config.js';
|
|
6
|
+
import { StandardUsageError } from './errors.js';
|
|
7
|
+
import { renderFixResult, renderStandardReport } from './output.js';
|
|
8
|
+
import { initBaselines, updateBaselines } from './ratchet.js';
|
|
9
|
+
/**
|
|
10
|
+
* Registers `wcctools check` and `wcctools fix`. Both work on the current directory, the
|
|
11
|
+
* repository root that holds `.smartconfig.json`. Exit codes: 0 ok, 1 failing findings or a
|
|
12
|
+
* refused baseline update, 2 configuration or usage error (StandardConfigError/StandardUsageError).
|
|
13
|
+
*/
|
|
14
|
+
export const registerStandardCommands = (out) => {
|
|
15
|
+
out.cli.command({
|
|
16
|
+
name: 'check',
|
|
17
|
+
description: 'Check the catalog against the wcctools component standard (https://code.foss.global/design.estate/wcctools/src/branch/main/docs/standard.md)',
|
|
18
|
+
options: {
|
|
19
|
+
json: { type: 'boolean', description: 'Print the report as one JSON document (IStandardReport) and nothing else' },
|
|
20
|
+
verbose: { type: 'boolean', description: 'Also list info findings, findings covered by the allowlist or baselines, and baseline slack' },
|
|
21
|
+
initBaseline: { type: 'boolean', description: 'Record the current error counts as standard.baselines (only while none exist)' },
|
|
22
|
+
updateBaseline: { type: 'boolean', description: 'Lower standard.baselines to the current counts; refuses to raise any count' },
|
|
23
|
+
},
|
|
24
|
+
}, async ({ options }) => {
|
|
25
|
+
if (options.initBaseline && options.updateBaseline) {
|
|
26
|
+
throw new StandardUsageError('--init-baseline and --update-baseline exclude each other');
|
|
27
|
+
}
|
|
28
|
+
const rootDir = process.cwd();
|
|
29
|
+
const opened = openStandardConfig(rootDir);
|
|
30
|
+
const notes = [];
|
|
31
|
+
let report;
|
|
32
|
+
let refused = false;
|
|
33
|
+
if (options.initBaseline || options.updateBaseline) {
|
|
34
|
+
const result = options.initBaseline ? await initBaselines(rootDir, opened) : await updateBaselines(rootDir, opened);
|
|
35
|
+
report = result.report;
|
|
36
|
+
if (result.raised.length > 0) {
|
|
37
|
+
refused = true;
|
|
38
|
+
for (const raise of result.raised) {
|
|
39
|
+
await out.error(`refusing to raise the ${raise.ruleId} baseline of ${raise.file}: ${raise.baseline} → ${raise.current}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
notes.push(`standard.baselines written: ${result.writtenFiles} file(s)`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
report = checkStandard(await loadStandardProject(rootDir), opened.loaded);
|
|
48
|
+
}
|
|
49
|
+
if (options.json) {
|
|
50
|
+
await out.log(JSON.stringify(report));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
for (const line of [...renderStandardReport(report, !!options.verbose), ...notes]) {
|
|
54
|
+
await out.log(line);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
process.exitCode = report.ok && !refused ? 0 : 1;
|
|
58
|
+
});
|
|
59
|
+
out.cli.command({
|
|
60
|
+
name: 'fix',
|
|
61
|
+
description: 'Fix findings of the wcctools component standard with span edits and git mv; needs a clean work tree, never commits',
|
|
62
|
+
options: {
|
|
63
|
+
rule: { type: 'strings', description: 'Fix only this rule (repeatable); opt-in rules run only when named' },
|
|
64
|
+
dryRun: { type: 'boolean', description: 'Show the changes without writing anything' },
|
|
65
|
+
json: { type: 'boolean', description: 'Print the result as one JSON document (IStandardFixResult) and nothing else' },
|
|
66
|
+
verbose: { type: 'boolean', description: 'Also list info and covered findings of the remaining check' },
|
|
67
|
+
},
|
|
68
|
+
}, async ({ options }) => {
|
|
69
|
+
const rootDir = process.cwd();
|
|
70
|
+
const opened = openStandardConfig(rootDir);
|
|
71
|
+
const result = await new StandardFixer({
|
|
72
|
+
rootDir,
|
|
73
|
+
loaded: opened.loaded,
|
|
74
|
+
rules: options.rule,
|
|
75
|
+
dryRun: !!options.dryRun,
|
|
76
|
+
configWriter: opened.writer,
|
|
77
|
+
}).run();
|
|
78
|
+
if (options.json) {
|
|
79
|
+
await out.log(JSON.stringify(result));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
for (const line of renderFixResult(result, !!options.verbose)) {
|
|
83
|
+
await out.log(line);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
process.exitCode = result.remaining.ok ? 0 : 1;
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvc3RhbmRhcmRzL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsR0FBc0MsRUFBUSxFQUFFO0lBQ3ZGLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ2QsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsOElBQThJO1FBQzNKLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLDBFQUEwRSxFQUFFO1lBQ2xILE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLDZGQUE2RixFQUFFO1lBQ3hJLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLCtFQUErRSxFQUFFO1lBQy9ILGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLDRFQUE0RSxFQUFFO1NBQy9IO0tBQ0YsRUFBRSxLQUFLLEVB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
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
type IStandardConfig = plugins.interfaces.IStandardConfig;
|
|
3
|
+
type TStandardProfile = plugins.interfaces.TStandardProfile;
|
|
4
|
+
/** The key of wcctools' configuration in `.smartconfig.json`. */
|
|
5
|
+
export declare const wcctoolsConfigKey = "@design.estate/wcctools";
|
|
6
|
+
/** Persists the `standard` configuration of the repository it was read from. */
|
|
7
|
+
export interface IStandardConfigWriter {
|
|
8
|
+
writeStandardConfig(configArg: IStandardConfig): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export interface ILoadedStandardConfig {
|
|
11
|
+
config: IStandardConfig;
|
|
12
|
+
profile: TStandardProfile;
|
|
13
|
+
}
|
|
14
|
+
/** A validated configuration together with the writer bound to the `.smartconfig.json` it was read from. */
|
|
15
|
+
export interface IOpenedStandardConfig {
|
|
16
|
+
loaded: ILoadedStandardConfig;
|
|
17
|
+
writer: IStandardConfigWriter;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Writes through the Smartconfig instance that read the configuration, so a write is refused
|
|
21
|
+
* (SmartconfigChangedError) when `.smartconfig.json` changed in between. Other keys of the
|
|
22
|
+
* `@design.estate/wcctools` block keep their values.
|
|
23
|
+
*/
|
|
24
|
+
export declare class SmartconfigStandardConfigWriter implements IStandardConfigWriter {
|
|
25
|
+
private readonly smartconfig;
|
|
26
|
+
constructor(smartconfigArg: plugins.smartconfig.Smartconfig);
|
|
27
|
+
writeStandardConfig(configArg: IStandardConfig): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/** Validates the `standard` object; collects every problem into one StandardConfigError. */
|
|
30
|
+
export declare const validateStandardConfig: (valueArg: unknown) => ILoadedStandardConfig;
|
|
31
|
+
/** Reads and validates `.smartconfig.json` → `@design.estate/wcctools` → `standard` of a repository. */
|
|
32
|
+
export declare const openStandardConfig: (rootDirArg: string) => IOpenedStandardConfig;
|
|
33
|
+
export {};
|