@design.estate/wcctools 6.0.0 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/changelog.md +13 -0
  2. package/dist_shell/bundle.js +3 -3
  3. package/dist_shell/bundle.js.map +1 -1
  4. package/dist_ts/00_commitinfo_data.js +1 -1
  5. package/dist_ts/cli.js +8 -2
  6. package/dist_ts/plugins.d.ts +7 -2
  7. package/dist_ts/plugins.js +9 -3
  8. package/dist_ts/standards/baselines.d.ts +27 -0
  9. package/dist_ts/standards/baselines.js +83 -0
  10. package/dist_ts/standards/checker.d.ts +21 -0
  11. package/dist_ts/standards/checker.js +88 -0
  12. package/dist_ts/standards/classes.gitrepo.d.ts +13 -0
  13. package/dist_ts/standards/classes.gitrepo.js +43 -0
  14. package/dist_ts/standards/classes.sourceedits.d.ts +15 -0
  15. package/dist_ts/standards/classes.sourceedits.js +54 -0
  16. package/dist_ts/standards/classes.standardfixer.d.ts +40 -0
  17. package/dist_ts/standards/classes.standardfixer.js +210 -0
  18. package/dist_ts/standards/classes.standardproject.d.ts +80 -0
  19. package/dist_ts/standards/classes.standardproject.js +195 -0
  20. package/dist_ts/standards/classes.standardtree.d.ts +56 -0
  21. package/dist_ts/standards/classes.standardtree.js +207 -0
  22. package/dist_ts/standards/cli.d.ts +7 -0
  23. package/dist_ts/standards/cli.js +89 -0
  24. package/dist_ts/standards/config.d.ts +33 -0
  25. package/dist_ts/standards/config.js +139 -0
  26. package/dist_ts/standards/errors.d.ts +9 -0
  27. package/dist_ts/standards/errors.js +17 -0
  28. package/dist_ts/standards/helpers.ast.d.ts +56 -0
  29. package/dist_ts/standards/helpers.ast.js +172 -0
  30. package/dist_ts/standards/helpers.paths.d.ts +36 -0
  31. package/dist_ts/standards/helpers.paths.js +86 -0
  32. package/dist_ts/standards/index.d.ts +14 -0
  33. package/dist_ts/standards/index.js +15 -0
  34. package/dist_ts/standards/output.d.ts +7 -0
  35. package/dist_ts/standards/output.js +57 -0
  36. package/dist_ts/standards/ratchet.d.ts +15 -0
  37. package/dist_ts/standards/ratchet.js +45 -0
  38. package/dist_ts/standards/rule.d.ts +50 -0
  39. package/dist_ts/standards/rule.js +9 -0
  40. package/dist_ts/standards/rules/barrel.element-index.d.ts +7 -0
  41. package/dist_ts/standards/rules/barrel.element-index.js +108 -0
  42. package/dist_ts/standards/rules/barrel.no-demo-export.d.ts +3 -0
  43. package/dist_ts/standards/rules/barrel.no-demo-export.js +29 -0
  44. package/dist_ts/standards/rules/demo.fixture-not-exported.d.ts +3 -0
  45. package/dist_ts/standards/rules/demo.fixture-not-exported.js +29 -0
  46. package/dist_ts/standards/rules/demo.groups.d.ts +6 -0
  47. package/dist_ts/standards/rules/demo.groups.js +72 -0
  48. package/dist_ts/standards/rules/demo.required.d.ts +3 -0
  49. package/dist_ts/standards/rules/demo.required.js +48 -0
  50. package/dist_ts/standards/rules/demo.separate-file.d.ts +3 -0
  51. package/dist_ts/standards/rules/demo.separate-file.js +38 -0
  52. package/dist_ts/standards/rules/demo.shape.d.ts +3 -0
  53. package/dist_ts/standards/rules/demo.shape.js +38 -0
  54. package/dist_ts/standards/rules/docs.component-index.d.ts +8 -0
  55. package/dist_ts/standards/rules/docs.component-index.js +84 -0
  56. package/dist_ts/standards/rules/element.exported.d.ts +3 -0
  57. package/dist_ts/standards/rules/element.exported.js +33 -0
  58. package/dist_ts/standards/rules/element.literal-tag.d.ts +3 -0
  59. package/dist_ts/standards/rules/element.literal-tag.js +30 -0
  60. package/dist_ts/standards/rules/element.reachable.d.ts +3 -0
  61. package/dist_ts/standards/rules/element.reachable.js +48 -0
  62. package/dist_ts/standards/rules/element.tag-map.d.ts +3 -0
  63. package/dist_ts/standards/rules/element.tag-map.js +83 -0
  64. package/dist_ts/standards/rules/i18n.literals.d.ts +3 -0
  65. package/dist_ts/standards/rules/i18n.literals.js +52 -0
  66. package/dist_ts/standards/rules/index.d.ts +12 -0
  67. package/dist_ts/standards/rules/index.js +83 -0
  68. package/dist_ts/standards/rules/layout.element-folder.d.ts +3 -0
  69. package/dist_ts/standards/rules/layout.element-folder.js +47 -0
  70. package/dist_ts/standards/rules/layout.entry-file-name.d.ts +3 -0
  71. package/dist_ts/standards/rules/layout.entry-file-name.js +71 -0
  72. package/dist_ts/standards/rules/layout.entry.d.ts +3 -0
  73. package/dist_ts/standards/rules/layout.entry.js +38 -0
  74. package/dist_ts/standards/rules/layout.group-folder.d.ts +3 -0
  75. package/dist_ts/standards/rules/layout.group-folder.js +22 -0
  76. package/dist_ts/standards/rules/layout.shared-00.d.ts +3 -0
  77. package/dist_ts/standards/rules/layout.shared-00.js +36 -0
  78. package/dist_ts/standards/rules/naming.class-matches-tag.d.ts +3 -0
  79. package/dist_ts/standards/rules/naming.class-matches-tag.js +26 -0
  80. package/dist_ts/standards/rules/naming.lowercase-files.d.ts +3 -0
  81. package/dist_ts/standards/rules/naming.lowercase-files.js +26 -0
  82. package/dist_ts/standards/rules/naming.tag-prefix.d.ts +3 -0
  83. package/dist_ts/standards/rules/naming.tag-prefix.js +23 -0
  84. package/dist_ts/standards/rules/props.accessor.d.ts +3 -0
  85. package/dist_ts/standards/rules/props.accessor.js +35 -0
  86. package/dist_ts/standards/rules/props.object-no-attribute.d.ts +3 -0
  87. package/dist_ts/standards/rules/props.object-no-attribute.js +42 -0
  88. package/dist_ts/standards/rules/props.reflect-primitive.d.ts +5 -0
  89. package/dist_ts/standards/rules/props.reflect-primitive.js +41 -0
  90. package/dist_ts/standards/rules/props.typed.d.ts +6 -0
  91. package/dist_ts/standards/rules/props.typed.js +64 -0
  92. package/dist_ts/standards/rules/shared.d.ts +38 -0
  93. package/dist_ts/standards/rules/shared.js +103 -0
  94. package/dist_ts/standards/rules/style.bdtheme.d.ts +5 -0
  95. package/dist_ts/standards/rules/style.bdtheme.js +28 -0
  96. package/dist_ts_interfaces/index.d.ts +1 -0
  97. package/dist_ts_interfaces/index.js +2 -1
  98. package/dist_ts_interfaces/standard.d.ts +93 -0
  99. package/dist_ts_interfaces/standard.js +6 -0
  100. package/dist_ts_web/00_commitinfo_data.js +1 -1
  101. package/package.json +4 -2
  102. package/readme.md +34 -1
  103. package/ts/00_commitinfo_data.ts +1 -1
  104. package/ts/cli.ts +8 -1
  105. package/ts/plugins.ts +10 -2
  106. package/ts/standards/baselines.ts +100 -0
  107. package/ts/standards/checker.ts +114 -0
  108. package/ts/standards/classes.gitrepo.ts +48 -0
  109. package/ts/standards/classes.sourceedits.ts +58 -0
  110. package/ts/standards/classes.standardfixer.ts +234 -0
  111. package/ts/standards/classes.standardproject.ts +250 -0
  112. package/ts/standards/classes.standardtree.ts +220 -0
  113. package/ts/standards/cli.ts +86 -0
  114. package/ts/standards/config.ts +160 -0
  115. package/ts/standards/errors.ts +18 -0
  116. package/ts/standards/helpers.ast.ts +208 -0
  117. package/ts/standards/helpers.paths.ts +119 -0
  118. package/ts/standards/index.ts +22 -0
  119. package/ts/standards/output.ts +65 -0
  120. package/ts/standards/ratchet.ts +63 -0
  121. package/ts/standards/rule.ts +58 -0
  122. package/ts/standards/rules/barrel.element-index.ts +112 -0
  123. package/ts/standards/rules/barrel.no-demo-export.ts +30 -0
  124. package/ts/standards/rules/demo.fixture-not-exported.ts +30 -0
  125. package/ts/standards/rules/demo.groups.ts +74 -0
  126. package/ts/standards/rules/demo.required.ts +49 -0
  127. package/ts/standards/rules/demo.separate-file.ts +40 -0
  128. package/ts/standards/rules/demo.shape.ts +42 -0
  129. package/ts/standards/rules/docs.component-index.ts +88 -0
  130. package/ts/standards/rules/element.exported.ts +35 -0
  131. package/ts/standards/rules/element.literal-tag.ts +30 -0
  132. package/ts/standards/rules/element.reachable.ts +49 -0
  133. package/ts/standards/rules/element.tag-map.ts +87 -0
  134. package/ts/standards/rules/i18n.literals.ts +58 -0
  135. package/ts/standards/rules/index.ts +87 -0
  136. package/ts/standards/rules/layout.element-folder.ts +49 -0
  137. package/ts/standards/rules/layout.entry-file-name.ts +73 -0
  138. package/ts/standards/rules/layout.entry.ts +40 -0
  139. package/ts/standards/rules/layout.group-folder.ts +23 -0
  140. package/ts/standards/rules/layout.shared-00.ts +37 -0
  141. package/ts/standards/rules/naming.class-matches-tag.ts +27 -0
  142. package/ts/standards/rules/naming.lowercase-files.ts +27 -0
  143. package/ts/standards/rules/naming.tag-prefix.ts +24 -0
  144. package/ts/standards/rules/props.accessor.ts +37 -0
  145. package/ts/standards/rules/props.object-no-attribute.ts +45 -0
  146. package/ts/standards/rules/props.reflect-primitive.ts +44 -0
  147. package/ts/standards/rules/props.typed.ts +70 -0
  148. package/ts/standards/rules/shared.ts +127 -0
  149. package/ts/standards/rules/style.bdtheme.ts +31 -0
  150. package/ts_web/00_commitinfo_data.ts +1 -1
@@ -0,0 +1,172 @@
1
+ import * as plugins from '../plugins.js';
2
+ const ts = plugins.typescript;
3
+ export const parseSource = (fileArg, textArg) => ts.createSourceFile(fileArg, textArg, ts.ScriptTarget.Latest, true);
4
+ /** 1-based line and column of a position. */
5
+ export const lineAndColumn = (sourceFileArg, positionArg) => {
6
+ const location = sourceFileArg.getLineAndCharacterOfPosition(positionArg);
7
+ return { line: location.line + 1, column: location.character + 1 };
8
+ };
9
+ /** The called name of `name(...)` or `a.b.name(...)`. */
10
+ export const calleeName = (expressionArg) => {
11
+ if (ts.isIdentifier(expressionArg)) {
12
+ return expressionArg.text;
13
+ }
14
+ if (ts.isPropertyAccessExpression(expressionArg)) {
15
+ return expressionArg.name.text;
16
+ }
17
+ return null;
18
+ };
19
+ /** The decorator call named `nameArg` on a node, e.g. `@customElement('x')`. */
20
+ export const findDecoratorCall = (nodeArg, namesArg) => {
21
+ if (!ts.canHaveDecorators(nodeArg)) {
22
+ return null;
23
+ }
24
+ for (const decorator of ts.getDecorators(nodeArg) ?? []) {
25
+ if (ts.isCallExpression(decorator.expression)) {
26
+ const name = calleeName(decorator.expression.expression);
27
+ if (name && namesArg.includes(name)) {
28
+ return { name, call: decorator.expression };
29
+ }
30
+ }
31
+ }
32
+ return null;
33
+ };
34
+ export const hasModifier = (nodeArg, kindArg) => ts.canHaveModifiers(nodeArg) && (ts.getModifiers(nodeArg) ?? []).some((modifierArg) => modifierArg.kind === kindArg);
35
+ /** The text of a member name: identifier, private identifier (with '#'), string or numeric literal. */
36
+ export const memberNameText = (memberArg) => {
37
+ const name = memberArg.name;
38
+ if (!name) {
39
+ return null;
40
+ }
41
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {
42
+ return name.text;
43
+ }
44
+ if (ts.isPrivateIdentifier(name)) {
45
+ return name.text;
46
+ }
47
+ return null;
48
+ };
49
+ export const isStatic = (memberArg) => hasModifier(memberArg, ts.SyntaxKind.StaticKeyword);
50
+ /** The static property declaration `static <name> = …` of a class. */
51
+ export const findStaticProperty = (classArg, nameArg) => {
52
+ for (const member of classArg.members) {
53
+ if (ts.isPropertyDeclaration(member) && isStatic(member) && memberNameText(member) === nameArg) {
54
+ return member;
55
+ }
56
+ }
57
+ return null;
58
+ };
59
+ export const isStringLiteralLike = (nodeArg) => !!nodeArg && (ts.isStringLiteral(nodeArg) || ts.isNoSubstitutionTemplateLiteral(nodeArg));
60
+ /** A property assignment `key: value` of an object literal, by key. */
61
+ export const objectProperty = (objectArg, keyArg) => {
62
+ for (const property of objectArg.properties) {
63
+ if (ts.isPropertyAssignment(property)) {
64
+ const name = property.name;
65
+ if ((ts.isIdentifier(name) || ts.isStringLiteral(name)) && name.text === keyArg) {
66
+ return property;
67
+ }
68
+ }
69
+ }
70
+ return null;
71
+ };
72
+ /** The source text of an object literal property's value, or null. */
73
+ export const objectPropertyText = (objectArg, keyArg) => objectProperty(objectArg, keyArg)?.initializer.getText() ?? null;
74
+ /** The indentation (leading whitespace) of the line a position is on. */
75
+ export const indentationAt = (textArg, positionArg) => {
76
+ const lineStart = textArg.lastIndexOf('\n', positionArg - 1) + 1;
77
+ return /^[ \t]*/.exec(textArg.slice(lineStart))[0];
78
+ };
79
+ /**
80
+ * The edit that adds `propertyTextArg` (e.g. `reflect: true`) as the last property of an object
81
+ * literal, following the literal's own layout: inline literals stay on one line, multi-line
82
+ * literals get a new line with the indentation of their last property.
83
+ */
84
+ export const appendObjectPropertyEdit = (objectArg, propertyTextArg) => {
85
+ const sourceText = objectArg.getSourceFile().text;
86
+ const properties = objectArg.properties;
87
+ if (properties.length === 0) {
88
+ return { start: objectArg.getStart(), end: objectArg.end, text: `{ ${propertyTextArg} }` };
89
+ }
90
+ const last = properties[properties.length - 1];
91
+ const closeBrace = objectArg.end - 1;
92
+ const between = sourceText.slice(last.end, closeBrace);
93
+ const multiLine = sourceText.slice(objectArg.getStart(), objectArg.end).includes('\n');
94
+ if (multiLine) {
95
+ const indentation = indentationAt(sourceText, last.getStart());
96
+ const commaIndex = between.indexOf(',');
97
+ if (commaIndex !== -1) {
98
+ const at = last.end + commaIndex + 1;
99
+ return { start: at, end: at, text: `\n${indentation}${propertyTextArg},` };
100
+ }
101
+ return { start: last.end, end: last.end, text: `,\n${indentation}${propertyTextArg}` };
102
+ }
103
+ return { start: last.end, end: last.end, text: `, ${propertyTextArg}` };
104
+ };
105
+ /** The edit that adds `propertyTextArg` (e.g. `type: String`) as the first property of an object literal. */
106
+ export const prependObjectPropertyEdit = (objectArg, propertyTextArg) => {
107
+ const sourceText = objectArg.getSourceFile().text;
108
+ const properties = objectArg.properties;
109
+ if (properties.length === 0) {
110
+ return { start: objectArg.getStart(), end: objectArg.end, text: `{ ${propertyTextArg} }` };
111
+ }
112
+ const first = properties[0];
113
+ const multiLine = sourceText.slice(objectArg.getStart(), objectArg.end).includes('\n');
114
+ const start = first.getStart();
115
+ if (multiLine && sourceText.slice(objectArg.getStart() + 1, start).includes('\n')) {
116
+ return { start, end: start, text: `${propertyTextArg},\n${indentationAt(sourceText, start)}` };
117
+ }
118
+ return { start, end: start, text: `${propertyTextArg}, ` };
119
+ };
120
+ /** The position after the last import declaration, at the start of the following line; 0 without imports. */
121
+ export const afterLastImport = (sourceFileArg) => {
122
+ let position = 0;
123
+ for (const statement of sourceFileArg.statements) {
124
+ if (ts.isImportDeclaration(statement) || ts.isImportEqualsDeclaration(statement)) {
125
+ position = statement.end;
126
+ }
127
+ }
128
+ if (position === 0) {
129
+ return 0;
130
+ }
131
+ const newline = sourceFileArg.text.indexOf('\n', position);
132
+ return newline === -1 ? sourceFileArg.text.length : newline + 1;
133
+ };
134
+ /** The module an identifier is imported from in a file, e.g. `html` → `lit`. */
135
+ export const importSourceOf = (sourceFileArg, identifierArg) => {
136
+ for (const statement of sourceFileArg.statements) {
137
+ if (!ts.isImportDeclaration(statement) || !statement.importClause || !ts.isStringLiteral(statement.moduleSpecifier)) {
138
+ continue;
139
+ }
140
+ const clause = statement.importClause;
141
+ if (clause.name?.text === identifierArg) {
142
+ return statement.moduleSpecifier.text;
143
+ }
144
+ const bindings = clause.namedBindings;
145
+ if (bindings && ts.isNamespaceImport(bindings) && bindings.name.text === identifierArg) {
146
+ return statement.moduleSpecifier.text;
147
+ }
148
+ if (bindings && ts.isNamedImports(bindings) && bindings.elements.some((elementArg) => elementArg.name.text === identifierArg)) {
149
+ return statement.moduleSpecifier.text;
150
+ }
151
+ }
152
+ return null;
153
+ };
154
+ /** Every relative-capable module specifier literal of a file: imports, re-exports, dynamic `import()` and `import('…')` types. */
155
+ export const moduleSpecifierLiterals = (sourceFileArg) => {
156
+ const found = [];
157
+ const visit = (nodeArg) => {
158
+ if ((ts.isImportDeclaration(nodeArg) || ts.isExportDeclaration(nodeArg)) && nodeArg.moduleSpecifier && isStringLiteralLike(nodeArg.moduleSpecifier)) {
159
+ found.push(nodeArg.moduleSpecifier);
160
+ }
161
+ else if (ts.isCallExpression(nodeArg) && nodeArg.expression.kind === ts.SyntaxKind.ImportKeyword && isStringLiteralLike(nodeArg.arguments[0])) {
162
+ found.push(nodeArg.arguments[0]);
163
+ }
164
+ else if (ts.isImportTypeNode(nodeArg) && ts.isLiteralTypeNode(nodeArg.argument) && isStringLiteralLike(nodeArg.argument.literal)) {
165
+ found.push(nodeArg.argument.literal);
166
+ }
167
+ ts.forEachChild(nodeArg, visit);
168
+ };
169
+ visit(sourceFileArg);
170
+ return found;
171
+ };
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5hc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdGFuZGFyZHMvaGVscGVycy5hc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQWE5QixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFlLEVBQUUsT0FBZSxFQUFlLEVBQUUsQ0FDM0UsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFdEUsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLGFBQTBCLEVBQUUsV0FBbUIsRUFBb0MsRUFBRTtJQUNqSCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsNkJBQTZCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNyRSxDQUFDLENBQUM7QUFFRix5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsYUFBMEIsRUFBaUIsRUFBRTtJQUN0RSxJQUFJLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUNELElBQUksRUFBRSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDakQsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFD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
@@ -0,0 +1,36 @@
1
+ export declare const toPosix: (pathArg: string) => string;
2
+ export declare const dirOf: (fileArg: string) => string;
3
+ export declare const baseOf: (fileArg: string) => string;
4
+ export declare const joinPath: (...partsArg: string[]) => string;
5
+ /** A demo file: `<name>.demo.ts`, `demo.ts`, `<name>.demodata.ts` (and similar), or any file under `ts_web/demos/`. */
6
+ export declare const isDemoFile: (fileArg: string) => boolean;
7
+ export declare const isTypeScriptSource: (fileArg: string) => boolean;
8
+ /**
9
+ * True for a path the fixer may write: relative to the repository root, '/' separators, already
10
+ * normalised, and without '.' or '..' segments, so it cannot leave the root lexically.
11
+ */
12
+ export declare const isRepoPath: (pathArg: string) => boolean;
13
+ /**
14
+ * How a relative module specifier spells its target: `exact` names the file itself (`./x.ts`,
15
+ * `./data.json`, `./x.d.ts`), `js` names a TypeScript file by its emitted extension (`./x.js` for
16
+ * `x.ts` or `x.d.ts`), `none` leaves the extension out (`./x`, or `./folder` for its index file).
17
+ */
18
+ type TSpecifierStyle = 'exact' | 'js' | 'none';
19
+ export interface IResolvedSpecifier {
20
+ /** The resolved repository path. */
21
+ target: string;
22
+ style: TSpecifierStyle;
23
+ /** True when the specifier names a folder and resolved to its index file. */
24
+ viaFolder: boolean;
25
+ }
26
+ /**
27
+ * Resolves a relative module specifier against the importing file the way NodeNext resolution
28
+ * does: an emitted `.js` specifier maps back to its `.ts`, `.tsx` or `.d.ts` source, any other
29
+ * specifier that names a known file exactly resolves to it (`.ts`, `.json`, `.css`, `.d.ts`, …), and
30
+ * an extensionless one to a source or a folder's index file. Returns null for package specifiers
31
+ * and for targets that are not among the known files.
32
+ */
33
+ export declare const resolveSpecifier: (fromFileArg: string, specifierArg: string, existsArg: (fileArg: string) => boolean) => IResolvedSpecifier | null;
34
+ /** The relative specifier from a file to a target, spelled in the given style. */
35
+ export declare const specifierFor: (fromFileArg: string, targetArg: string, styleArg: TSpecifierStyle, viaFolderArg?: boolean) => string;
36
+ export {};
@@ -0,0 +1,86 @@
1
+ import * as plugins from '../plugins.js';
2
+ /**
3
+ * Repository paths in the standard are relative to the repository root with '/' separators.
4
+ */
5
+ const posix = plugins.path.posix;
6
+ export const toPosix = (pathArg) => pathArg.split(plugins.path.sep).join('/');
7
+ export const dirOf = (fileArg) => posix.dirname(fileArg);
8
+ export const baseOf = (fileArg) => posix.basename(fileArg);
9
+ export const joinPath = (...partsArg) => posix.normalize(posix.join(...partsArg));
10
+ /** A demo file: `<name>.demo.ts`, `demo.ts`, `<name>.demodata.ts` (and similar), or any file under `ts_web/demos/`. */
11
+ export const isDemoFile = (fileArg) => /(^|[./-])demo(data)?\.ts$/.test(baseOf(fileArg)) || fileArg.startsWith('ts_web/demos/');
12
+ export const isTypeScriptSource = (fileArg) => /\.(ts|tsx|mts|cts)$/.test(fileArg) && !/\.d\.(ts|mts|cts)$/.test(fileArg);
13
+ /**
14
+ * True for a path the fixer may write: relative to the repository root, '/' separators, already
15
+ * normalised, and without '.' or '..' segments, so it cannot leave the root lexically.
16
+ */
17
+ export const isRepoPath = (pathArg) => pathArg.length > 0
18
+ && !pathArg.includes('\\')
19
+ && !pathArg.includes('\0')
20
+ && posix.normalize(pathArg) === pathArg
21
+ && pathArg.split('/').every((segmentArg) => segmentArg !== '' && segmentArg !== '.' && segmentArg !== '..');
22
+ /** The files an emitted extension stands for, in NodeNext resolution order. */
23
+ const sourcesOfEmittedExtension = {
24
+ '.js': ['.ts', '.tsx', '.d.ts'],
25
+ '.jsx': ['.tsx'],
26
+ '.mjs': ['.mts', '.d.mts'],
27
+ '.cjs': ['.cts', '.d.cts'],
28
+ };
29
+ /** The files an extensionless specifier stands for, in resolution order. */
30
+ const extensionlessSuffixes = ['.ts', '.tsx', '.d.ts'];
31
+ const folderIndexSuffixes = ['/index.ts', '/index.tsx', '/index.d.ts'];
32
+ const typeScriptExtension = /(\.d)?\.(ts|tsx|mts|cts)$/;
33
+ /**
34
+ * Resolves a relative module specifier against the importing file the way NodeNext resolution
35
+ * does: an emitted `.js` specifier maps back to its `.ts`, `.tsx` or `.d.ts` source, any other
36
+ * specifier that names a known file exactly resolves to it (`.ts`, `.json`, `.css`, `.d.ts`, …), and
37
+ * an extensionless one to a source or a folder's index file. Returns null for package specifiers
38
+ * and for targets that are not among the known files.
39
+ */
40
+ export const resolveSpecifier = (fromFileArg, specifierArg, existsArg) => {
41
+ if (!specifierArg.startsWith('./') && !specifierArg.startsWith('../')) {
42
+ return null;
43
+ }
44
+ const raw = joinPath(dirOf(fromFileArg), specifierArg);
45
+ const extension = posix.extname(raw);
46
+ for (const sourceExtension of sourcesOfEmittedExtension[extension] ?? []) {
47
+ const target = raw.slice(0, -extension.length) + sourceExtension;
48
+ if (existsArg(target)) {
49
+ return { target, style: 'js', viaFolder: false };
50
+ }
51
+ }
52
+ if (existsArg(raw)) {
53
+ return { target: raw, style: 'exact', viaFolder: false };
54
+ }
55
+ for (const suffix of extensionlessSuffixes) {
56
+ if (existsArg(`${raw}${suffix}`)) {
57
+ return { target: `${raw}${suffix}`, style: 'none', viaFolder: false };
58
+ }
59
+ }
60
+ for (const suffix of folderIndexSuffixes) {
61
+ if (existsArg(`${raw}${suffix}`)) {
62
+ return { target: `${raw}${suffix}`, style: 'none', viaFolder: true };
63
+ }
64
+ }
65
+ return null;
66
+ };
67
+ /** The relative specifier from a file to a target, spelled in the given style. */
68
+ export const specifierFor = (fromFileArg, targetArg, styleArg, viaFolderArg = false) => {
69
+ let target = targetArg;
70
+ if (styleArg === 'none' && viaFolderArg && /^index(\.d)?\.(ts|tsx)$/.test(baseOf(target))) {
71
+ target = dirOf(target);
72
+ }
73
+ else if (styleArg === 'none') {
74
+ target = target.replace(typeScriptExtension, '');
75
+ }
76
+ else if (styleArg === 'js') {
77
+ const emitted = { ts: '.js', tsx: '.jsx', mts: '.mjs', cts: '.cjs' };
78
+ target = target.replace(typeScriptExtension, (_matchArg, _declarationArg, extensionArg) => emitted[extensionArg]);
79
+ }
80
+ let relative = posix.relative(dirOf(fromFileArg), target);
81
+ if (!relative.startsWith('.')) {
82
+ relative = `./${relative}`;
83
+ }
84
+ return relative;
85
+ };
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5wYXRocy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3N0YW5kYXJkcy9oZWxwZXJzLnBhdGhzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBRXpDOztHQUVHO0FBRUgsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQWUsRUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUFlLEVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxRQUFrQixFQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBRXBHLHVIQUF1SDtBQUN2SCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFlLEVBQVcsRUFBRSxDQUNyRCwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUUzRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE9BQWUsRUFBVyxFQUFFLENBQzdELHFCQUFxQixDQUFD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
@@ -0,0 +1,14 @@
1
+ export { initialBaselines, rekeyStandardConfig, updatedBaselines, type IBaselineRaise } from './baselines.js';
2
+ export { checkStandard, describeStandardRules, detectFindings, rulesOfProfile, type IDetectedFinding } from './checker.js';
3
+ export { GitRepo } from './classes.gitrepo.js';
4
+ export { SourceEdits } from './classes.sourceedits.js';
5
+ export { StandardFixer, type IStandardFixOptions } from './classes.standardfixer.js';
6
+ export { StandardProject, loadStandardProject, type IStandardElement, type IStandardProperty } from './classes.standardproject.js';
7
+ export { FixBatch, StandardTree } from './classes.standardtree.js';
8
+ export { SmartconfigStandardConfigWriter, openStandardConfig, validateStandardConfig, wcctoolsConfigKey, type ILoadedStandardConfig, type IOpenedStandardConfig, type IStandardConfigWriter, } from './config.js';
9
+ export { StandardConfigError, StandardUsageError } from './errors.js';
10
+ export { isDemoFile, resolveSpecifier, specifierFor } from './helpers.paths.js';
11
+ export { registerStandardCommands } from './cli.js';
12
+ export { renderFixResult, renderStandardReport } from './output.js';
13
+ export { initBaselines, updateBaselines, type IBaselineRunResult } from './ratchet.js';
14
+ export { allowlistStaleRuleId, fixOrder, standardRules } from './rules/index.js';
@@ -0,0 +1,15 @@
1
+ export { initialBaselines, rekeyStandardConfig, updatedBaselines } from './baselines.js';
2
+ export { checkStandard, describeStandardRules, detectFindings, rulesOfProfile } from './checker.js';
3
+ export { GitRepo } from './classes.gitrepo.js';
4
+ export { SourceEdits } from './classes.sourceedits.js';
5
+ export { StandardFixer } from './classes.standardfixer.js';
6
+ export { StandardProject, loadStandardProject } from './classes.standardproject.js';
7
+ export { FixBatch, StandardTree } from './classes.standardtree.js';
8
+ export { SmartconfigStandardConfigWriter, openStandardConfig, validateStandardConfig, wcctoolsConfigKey, } from './config.js';
9
+ export { StandardConfigError, StandardUsageError } from './errors.js';
10
+ export { isDemoFile, resolveSpecifier, specifierFor } from './helpers.paths.js';
11
+ export { registerStandardCommands } from './cli.js';
12
+ export { renderFixResult, renderStandardReport } from './output.js';
13
+ export { initBaselines, updateBaselines } from './ratchet.js';
14
+ export { allowlistStaleRuleId, fixOrder, standardRules } from './rules/index.js';
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdGFuZGFyZHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUF1QixNQUFNLGdCQUFnQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBeUIsTUFBTSxjQUFjLENBQUM7QUFDM0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUE0QixNQUFNLDRCQUE0QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQWlELE1BQU0sOEJBQThCLENBQUM7QUFDbkksT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGtCQUFrQixFQUNsQixzQkFBc0IsRUFDdEIsaUJBQWlCLEdBSWxCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUEyQixNQUFNLGNBQWMsQ0FBQztBQUN2RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDIn0=
@@ -0,0 +1,7 @@
1
+ import * as plugins from '../plugins.js';
2
+ type IStandardReport = plugins.interfaces.IStandardReport;
3
+ /** The text form of a check report: findings grouped by file, then a summary. */
4
+ export declare const renderStandardReport: (reportArg: IStandardReport, verboseArg: boolean) => string[];
5
+ /** The text form of a fix result: the changes, then the check that remains. */
6
+ export declare const renderFixResult: (resultArg: plugins.interfaces.IStandardFixResult, verboseArg: boolean) => string[];
7
+ export {};
@@ -0,0 +1,57 @@
1
+ import * as plugins from '../plugins.js';
2
+ const isShown = (findingArg, verboseArg) => verboseArg || (!findingArg.covered && findingArg.severity !== 'info');
3
+ /** The text form of a check report: findings grouped by file, then a summary. */
4
+ export const renderStandardReport = (reportArg, verboseArg) => {
5
+ const lines = [];
6
+ let currentFile = null;
7
+ for (const finding of reportArg.findings.filter((findingArg) => isShown(findingArg, verboseArg))) {
8
+ if (finding.file !== currentFile) {
9
+ if (currentFile !== null) {
10
+ lines.push('');
11
+ }
12
+ lines.push(finding.file);
13
+ currentFile = finding.file;
14
+ }
15
+ const notes = [finding.fixable ? 'fixable' : '', finding.covered ? `covered by the ${finding.covered}` : ''].filter(Boolean);
16
+ lines.push(` ${finding.line}:${finding.column} ${finding.severity} ${finding.ruleId} ${finding.message}${notes.length ? ` (${notes.join(', ')})` : ''}`);
17
+ }
18
+ if (verboseArg && reportArg.baselineSlack.length > 0) {
19
+ lines.push('', 'Below their baseline:');
20
+ for (const slack of reportArg.baselineSlack) {
21
+ lines.push(` ${slack.ruleId} ${slack.file} ${slack.baseline} → ${slack.current}`);
22
+ }
23
+ }
24
+ const count = (predicateArg) => reportArg.findings.filter(predicateArg).length;
25
+ const failing = count((findingArg) => findingArg.severity === 'error' && !findingArg.covered);
26
+ const warnings = count((findingArg) => findingArg.severity === 'warn' && !findingArg.covered);
27
+ const infos = count((findingArg) => findingArg.severity === 'info' && !findingArg.covered);
28
+ const allowlisted = count((findingArg) => findingArg.covered === 'allowlist');
29
+ const baselined = count((findingArg) => findingArg.covered === 'baseline');
30
+ if (lines.length > 0) {
31
+ lines.push('');
32
+ }
33
+ lines.push(`wcctools check (${reportArg.profile}): ${failing} error(s), ${warnings} warning(s), ${infos} info; `
34
+ + `${allowlisted} allowlisted, ${baselined} within baselines, ${reportArg.baselineSlack.length} file(s) below their baseline — ${reportArg.ok ? 'ok' : 'failed'}`);
35
+ return lines;
36
+ };
37
+ /** The text form of a fix result: the changes, then the check that remains. */
38
+ export const renderFixResult = (resultArg, verboseArg) => {
39
+ const { plan } = resultArg;
40
+ const lines = [resultArg.dryRun ? 'wcctools fix --dry-run would make these changes:' : 'wcctools fix made these changes:'];
41
+ for (const move of plan.moves) {
42
+ lines.push(` git mv ${move.from} ${move.to}`);
43
+ }
44
+ for (const file of plan.created) {
45
+ lines.push(` create ${file}`);
46
+ }
47
+ for (const edited of plan.edited) {
48
+ lines.push(` edit ${edited.file} (${edited.ruleIds.join(', ')})`);
49
+ }
50
+ if (plan.moves.length + plan.created.length + plan.edited.length === 0) {
51
+ lines.push(' nothing to fix');
52
+ }
53
+ lines.push('', resultArg.dryRun ? 'Remaining after the fix:' : 'Remaining:');
54
+ lines.push(...renderStandardReport(resultArg.remaining, verboseArg));
55
+ return lines;
56
+ };
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvc3RhbmRhcmRzL291dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUt6QyxNQUFNLE9BQU8sR0FBRyxDQUFDLFVBQTRCLEVBQUUsVUFBbUIsRUFBVyxFQUFFLENBQzdFLFVBQVUsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBRXhFLGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFNBQTBCLEVBQUUsVUFBbUIsRUFBWSxFQUFFO0lBQ2hHLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixJQUFJLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0lBQ3RDLEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pHLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQixDQUFDO1lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDN0IsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMs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
@@ -0,0 +1,15 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { type IBaselineRaise } from './baselines.js';
3
+ import type { IOpenedStandardConfig } from './config.js';
4
+ export interface IBaselineRunResult {
5
+ /** The check with the configuration as it is after the run. */
6
+ report: plugins.interfaces.IStandardReport;
7
+ /** Files per rule written to the baselines; 0 when nothing was written. */
8
+ writtenFiles: number;
9
+ /** For --update-baseline: counts that would have to grow; the update was refused when not empty. */
10
+ raised: IBaselineRaise[];
11
+ }
12
+ /** `wcctools check --init-baseline`: records the current error counts; only while no baseline exists. */
13
+ export declare const initBaselines: (rootDirArg: string, openedArg: IOpenedStandardConfig) => Promise<IBaselineRunResult>;
14
+ /** `wcctools check --update-baseline`: lowers counts to the current ones, removes zeros, refuses to raise any. */
15
+ export declare const updateBaselines: (rootDirArg: string, openedArg: IOpenedStandardConfig) => Promise<IBaselineRunResult>;
@@ -0,0 +1,45 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { initialBaselines, updatedBaselines } from './baselines.js';
3
+ import { checkStandard } from './checker.js';
4
+ import { loadStandardProject } from './classes.standardproject.js';
5
+ import { StandardUsageError } from './errors.js';
6
+ const hasBaselines = (configArg) => Object.values(configArg.baselines ?? {}).some((countsArg) => Object.keys(countsArg).length > 0);
7
+ const withBaselines = (configArg, baselinesArg) => {
8
+ const config = { ...configArg };
9
+ delete config.baselines;
10
+ return Object.keys(baselinesArg).length > 0 ? { ...config, baselines: baselinesArg } : config;
11
+ };
12
+ const countFiles = (baselinesArg) => Object.values(baselinesArg).reduce((sumArg, countsArg) => sumArg + Object.keys(countsArg).length, 0);
13
+ /** `wcctools check --init-baseline`: records the current error counts; only while no baseline exists. */
14
+ export const initBaselines = async (rootDirArg, openedArg) => {
15
+ const { loaded, writer } = openedArg;
16
+ if (hasBaselines(loaded.config)) {
17
+ throw new StandardUsageError('standard.baselines already exist; lower them with --update-baseline');
18
+ }
19
+ const project = await loadStandardProject(rootDirArg);
20
+ const baselines = initialBaselines(checkStandard(project, loaded));
21
+ const config = withBaselines(loaded.config, baselines);
22
+ if (countFiles(baselines) > 0) {
23
+ await writer.writeStandardConfig(config);
24
+ }
25
+ return { report: checkStandard(project, { ...loaded, config }), writtenFiles: countFiles(baselines), raised: [] };
26
+ };
27
+ /** `wcctools check --update-baseline`: lowers counts to the current ones, removes zeros, refuses to raise any. */
28
+ export const updateBaselines = async (rootDirArg, openedArg) => {
29
+ const { loaded, writer } = openedArg;
30
+ if (!hasBaselines(loaded.config)) {
31
+ throw new StandardUsageError('standard.baselines do not exist; record them with --init-baseline');
32
+ }
33
+ const project = await loadStandardProject(rootDirArg);
34
+ const report = checkStandard(project, loaded);
35
+ const { baselines, raised } = updatedBaselines(report, loaded.config.baselines);
36
+ if (raised.length > 0) {
37
+ return { report, writtenFiles: 0, raised };
38
+ }
39
+ const config = withBaselines(loaded.config, baselines);
40
+ if (JSON.stringify(config) !== JSON.stringify(loaded.config)) {
41
+ await writer.writeStandardConfig(config);
42
+ }
43
+ return { report: checkStandard(project, { ...loaded, config }), writtenFiles: countFiles(baselines), raised };
44
+ };
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0Y2hldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3N0YW5kYXJkcy9yYXRjaGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBdUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRW5FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWFqRCxNQUFNLFlBQVksR0FBRyxDQUFDLFNBQTBCLEVBQVcsRUFBRSxDQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUVsRyxNQUFNLGFBQWEsR0FBRyxDQUFDLFNBQTBCLEVBQUUsWUFBdUQsRUFBbUIsRUFBRTtJQUM3SCxNQUFNLE1BQU0sR0FBb0IsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQ2pELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUN4QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNoRyxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxDQUFDLFlBQXVELEVBQVUsRUFBRSxDQUNyRixNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUV2Ryx5R0FBeUc7QUFDekcsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxVQUFrQixFQUFFLFNBQWdDLEVBQStCLEVBQUU7SUFDdkgsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUM7SUFDckMsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLGtCQUFrQixDQUFDLHFFQUFxRSxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3BILENBQUMsQ0FBQztBQUVGLGtIQUFrSDtBQUNsSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLFVBQWtCLEVBQUUsU0FBZ0MsRUFBK0IsRUFBRTtJQUN6SCxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFVLENBQUMsQ0FBQztJQUNqRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM3RCxNQUFNLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ2hILENBQUMsQ0FBQyJ9
@@ -0,0 +1,50 @@
1
+ import * as plugins from '../plugins.js';
2
+ import type { StandardProject } from './classes.standardproject.js';
3
+ type TStandardProfile = plugins.interfaces.TStandardProfile;
4
+ type TStandardSeverity = plugins.interfaces.TStandardSeverity;
5
+ /** Collects the changes of one fix run of one rule; the fixer applies them to its in-memory tree. */
6
+ export interface IFixBuilder {
7
+ /** Replaces the span [start, end) of a file's current text. Identical edits are applied once. */
8
+ edit(fileArg: string, startArg: number, endArg: number, textArg: string): void;
9
+ /** Creates a file; skipped when the path exists. */
10
+ create(fileArg: string, textArg: string): void;
11
+ /** Moves a file (`git mv`) and rewrites every relative module specifier that resolves to it. */
12
+ move(fromArg: string, toArg: string): void;
13
+ /**
14
+ * In this run's moves, `export … from` declarations of barrels (index.ts) that resolve to `targetArg`
15
+ * point at `barrelTargetArg` instead, e.g. at the new element folder's index.ts.
16
+ */
17
+ redirectBarrelExports(targetArg: string, barrelTargetArg: string): void;
18
+ }
19
+ export type TFixAction = (builderArg: IFixBuilder) => void;
20
+ export interface IRuleFinding {
21
+ file: string;
22
+ /** Offset in the file's text; 0 for file-level findings and for files that do not exist. */
23
+ position: number;
24
+ message: string;
25
+ /** Allowlist key: '<file>#<member>' or '<file>'. */
26
+ key: string;
27
+ /** Set when `wcctools fix` resolves the finding. */
28
+ fix?: TFixAction;
29
+ }
30
+ export interface IRuleContext {
31
+ project: StandardProject;
32
+ config: plugins.interfaces.IStandardConfig;
33
+ profile: TStandardProfile;
34
+ }
35
+ /** One rule of docs/standard.md. */
36
+ export interface IStandardRule {
37
+ id: string;
38
+ /** Severity per profile; a rule without a `base` severity belongs to `dees` only. `dees` falls back to `base`. */
39
+ severity: {
40
+ base?: TStandardSeverity;
41
+ dees?: TStandardSeverity;
42
+ };
43
+ fixMode: plugins.interfaces.TStandardFixMode;
44
+ /** Categories an allowlist entry may use; absent when the rule takes no allowlist. */
45
+ allowlistCategories?: readonly string[];
46
+ detect(contextArg: IRuleContext): IRuleFinding[];
47
+ }
48
+ /** The rule's severity in a profile, or null when the rule is not part of it. */
49
+ export declare const severityIn: (ruleArg: IStandardRule, profileArg: TStandardProfile) => TStandardSeverity | null;
50
+ export {};
@@ -0,0 +1,9 @@
1
+ import * as plugins from '../plugins.js';
2
+ /** The rule's severity in a profile, or null when the rule is not part of it. */
3
+ export const severityIn = (ruleArg, profileArg) => {
4
+ if (profileArg === 'dees') {
5
+ return ruleArg.severity.dees ?? ruleArg.severity.base ?? null;
6
+ }
7
+ return ruleArg.severity.base ?? null;
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3N0YW5kYXJkcy9ydWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBbUR6QyxpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBc0IsRUFBRSxVQUE0QixFQUE0QixFQUFFO0lBQzNHLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzFCLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO0lBQ2hFLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztBQUN2QyxDQUFDLENBQUMifQ==
@@ -0,0 +1,7 @@
1
+ import type { IStandardRule } from '../rule.js';
2
+ /**
3
+ * An element folder has `index.ts` re-exporting the entry file (and `types.ts`); a group folder's
4
+ * `index.ts` re-exports each element folder's `index.ts`; `ts_web/elements/index.ts` re-exports each
5
+ * group or element folder.
6
+ */
7
+ export declare const barrelElementIndexRule: IStandardRule;