@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.
- package/changelog.md +13 -0
- package/dist_shell/bundle.js +3 -3
- package/dist_shell/bundle.js.map +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/cli.js +8 -2
- 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/standard.d.ts +93 -0
- package/dist_ts_interfaces/standard.js +6 -0
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +4 -2
- package/readme.md +34 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/cli.ts +8 -1
- 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_web/00_commitinfo_data.ts +1 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** File and folder names under `ts_web/` are lowercase. */
|
|
2
|
+
export const namingLowercaseFilesRule = {
|
|
3
|
+
id: 'naming/lowercase-files',
|
|
4
|
+
severity: { base: 'error' },
|
|
5
|
+
fixMode: 'auto',
|
|
6
|
+
detect: ({ project }) => {
|
|
7
|
+
const findings = [];
|
|
8
|
+
const lowered = new Map();
|
|
9
|
+
for (const file of project.files.keys()) {
|
|
10
|
+
lowered.set(file.toLowerCase(), (lowered.get(file.toLowerCase()) ?? 0) + 1);
|
|
11
|
+
}
|
|
12
|
+
for (const file of project.webFiles) {
|
|
13
|
+
if (!/[A-Z]/.test(file)) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const target = file.toLowerCase();
|
|
17
|
+
const finding = { file, position: 0, key: file, message: `${file} is not lowercase; expected ${target}` };
|
|
18
|
+
if (lowered.get(target) === 1 && !project.exists(target)) {
|
|
19
|
+
finding.fix = (builderArg) => builderArg.move(file, target);
|
|
20
|
+
}
|
|
21
|
+
findings.push(finding);
|
|
22
|
+
}
|
|
23
|
+
return findings;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtaW5nLmxvd2VyY2FzZS1maWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3N0YW5kYXJkcy9ydWxlcy9uYW1pbmcubG93ZXJjYXNlLWZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBa0I7SUFDckQsRUFBRSxFQUFFLHdCQUF3QjtJQUM1QixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0lBQzNCLE9BQU8sRUFBRSxNQUFNO0lBQ2YsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFtQixFQUFFLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDMUMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN4QixTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxNQUFNLE9BQU8sR0FBaUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksK0JBQStCLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDeEgsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDekQsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRixDQUFDIn0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { elementKey } from './shared.js';
|
|
2
|
+
/** Every tag starts with `<tagPrefix>-`. Applies to fixture elements in demo files too: they share the page. */
|
|
3
|
+
export const namingTagPrefixRule = {
|
|
4
|
+
id: 'naming/tag-prefix',
|
|
5
|
+
severity: { base: 'error' },
|
|
6
|
+
fixMode: 'none',
|
|
7
|
+
allowlistCategories: ['published'],
|
|
8
|
+
detect: ({ project, config }) => {
|
|
9
|
+
const findings = [];
|
|
10
|
+
for (const element of project.elements) {
|
|
11
|
+
if (element.tag && !element.tag.startsWith(`${config.tagPrefix}-`)) {
|
|
12
|
+
findings.push({
|
|
13
|
+
file: element.file,
|
|
14
|
+
position: element.decoratorCall.getStart(),
|
|
15
|
+
key: elementKey(element),
|
|
16
|
+
message: `<${element.tag}> does not start with the tag prefix '${config.tagPrefix}-'`,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return findings;
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtaW5nLnRhZy1wcmVmaXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9zdGFuZGFyZHMvcnVsZXMvbmFtaW5nLnRhZy1wcmVmaXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV6QyxnSEFBZ0g7QUFDaEgsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWtCO0lBQ2hELEVBQUUsRUFBRSxtQkFBbUI7SUFDdkIsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtJQUMzQixPQUFPLEVBQUUsTUFBTTtJQUNmLG1CQUFtQixFQUFFLENBQUMsV0FBVyxDQUFDO0lBQ2xDLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7UUFDOUIsTUFBTSxRQUFRLEdBQW1CLEVBQUUsQ0FBQztRQUNwQyxLQUFLLE1BQU0sT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25FLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ1osSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO29CQUNsQixRQUFRLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUU7b0JBQzFDLEdBQUcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDO29CQUN4QixPQUFPLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyx5Q0FBeUMsTUFBTSxDQUFDLFNBQVMsSUFBSTtpQkFDdEYsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as ast from '../helpers.ast.js';
|
|
3
|
+
import { propertyKey } from './shared.js';
|
|
4
|
+
const ts = plugins.typescript;
|
|
5
|
+
/** Members decorated with `@property` or `@state` use the `accessor` keyword (standard decorators). */
|
|
6
|
+
export const propsAccessorRule = {
|
|
7
|
+
id: 'props/accessor',
|
|
8
|
+
severity: { base: 'error' },
|
|
9
|
+
fixMode: 'auto',
|
|
10
|
+
detect: ({ project }) => {
|
|
11
|
+
const findings = [];
|
|
12
|
+
if (project.experimentalDecorators) {
|
|
13
|
+
return findings;
|
|
14
|
+
}
|
|
15
|
+
for (const property of project.properties) {
|
|
16
|
+
const member = property.member;
|
|
17
|
+
if (!ts.isPropertyDeclaration(member) || ast.hasModifier(member, ts.SyntaxKind.AccessorKeyword)) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const finding = {
|
|
21
|
+
file: property.file,
|
|
22
|
+
position: member.name.getStart(),
|
|
23
|
+
key: propertyKey(property),
|
|
24
|
+
message: `@${property.decorator} ${property.name} is a field; standard decorators need 'accessor ${property.name}'`,
|
|
25
|
+
};
|
|
26
|
+
if (!ast.hasModifier(member, ts.SyntaxKind.DeclareKeyword)) {
|
|
27
|
+
const at = member.name.getStart();
|
|
28
|
+
finding.fix = (builderArg) => builderArg.edit(property.file, at, at, 'accessor ');
|
|
29
|
+
}
|
|
30
|
+
findings.push(finding);
|
|
31
|
+
}
|
|
32
|
+
return findings;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcHMuYWNjZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9zdGFuZGFyZHMvcnVsZXMvcHJvcHMuYWNjZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssR0FBRyxNQUFNLG1CQUFtQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUU5Qix1R0FBdUc7QUFDdkcsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWtCO0lBQzlDLEVBQUUsRUFBRSxnQkFBZ0I7SUFDcEIsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtJQUMzQixPQUFPLEVBQUUsTUFBTTtJQUNmLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtRQUN0QixNQUFNLFFBQVEsR0FBbUIsRUFBRSxDQUFDO1FBQ3BDLElBQUksT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbkMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELEtBQUssTUFBTSxRQUFRLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDL0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hHLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQWlCO2dCQUM1QixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDaEMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUM7Z0JBQzFCLE9BQU8sRUFBRSxJQUFJLFFBQVEsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksbURBQW1ELFFBQVEsQ0FBQyxJQUFJLEdBQUc7YUFDcEgsQ0FBQztZQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as ast from '../helpers.ast.js';
|
|
3
|
+
import { addOptionFix } from './props.typed.js';
|
|
4
|
+
import { coreTypeOf, isArrayTypeNode, propertyKey, publicProperties } from './shared.js';
|
|
5
|
+
const ts = plugins.typescript;
|
|
6
|
+
/** An array, object literal type or `I`-prefixed interface annotation. */
|
|
7
|
+
const isObjectAnnotation = (typeArg) => {
|
|
8
|
+
if (!typeArg) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return isArrayTypeNode(typeArg)
|
|
12
|
+
|| ts.isTypeLiteralNode(typeArg)
|
|
13
|
+
|| (ts.isTypeReferenceNode(typeArg) && ts.isIdentifier(typeArg.typeName) && /^I[A-Z]/.test(typeArg.typeName.text));
|
|
14
|
+
};
|
|
15
|
+
/** A public property holding an object or array declares `type: Object`/`type: Array` or `attribute: false`. */
|
|
16
|
+
export const propsObjectNoAttributeRule = {
|
|
17
|
+
id: 'props/object-no-attribute',
|
|
18
|
+
severity: { base: 'warn' },
|
|
19
|
+
fixMode: 'auto',
|
|
20
|
+
detect: ({ project }) => {
|
|
21
|
+
const findings = [];
|
|
22
|
+
for (const property of publicProperties(project)) {
|
|
23
|
+
if (property.dynamicOptions || !isObjectAnnotation(coreTypeOf(property))) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const options = property.options;
|
|
27
|
+
const type = options ? ast.objectPropertyText(options, 'type') : null;
|
|
28
|
+
if (type === 'Object' || type === 'Array' || (options && ast.objectPropertyText(options, 'attribute') === 'false')) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
findings.push({
|
|
32
|
+
file: property.file,
|
|
33
|
+
position: property.call.getStart(),
|
|
34
|
+
key: propertyKey(property),
|
|
35
|
+
message: `@property ${property.name} holds an object or array but declares neither type: Object/Array nor attribute: false`,
|
|
36
|
+
fix: addOptionFix(property, 'attribute: false', 'last'),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return findings;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcHMub2JqZWN0LW5vLWF0dHJpYnV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3N0YW5kYXJkcy9ydWxlcy9wcm9wcy5vYmplY3Qtbm8tYXR0cmlidXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQztBQUV6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpGLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFFOUIsMEVBQTBFO0FBQzFFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxPQUE2QixFQUFXLEVBQUU7SUFDcEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDO1dBQzFCLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7V0FDN0IsQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkgsQ0FBQyxDQUFDO0FBRUYsZ0hBQWdIO0FBQ2hILE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFrQjtJQUN2RCxFQUFFLEVBQUUsMkJBQTJCO0lBQy9CLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7SUFDMUIsT0FBTyxFQUFFLE1BQU07SUFDZixNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7UUFDdEIsTUFBTSxRQUFRLEdBQW1CLEVBQUUsQ0FBQztRQUNwQyxLQUFLLE1BQU0sUUFBUSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxRQUFRLENBQUMsY0FBYyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDekUsU0FBUztZQUNYLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3RFLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkgsU0FBUztZQUNYLENBQUM7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNaLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNsQyxHQUFHLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQztnQkFDMUIsT0FBTyxFQUFFLGFBQWEsUUFBUSxDQUFDLElBQUksd0ZBQXdGO2dCQUMzSCxHQUFHLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLENBQUM7YUFDeEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRixDQUFDIn0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IStandardRule } from '../rule.js';
|
|
2
|
+
/** Global attributes with native behaviour that stay unreflected without an allowlist entry. */
|
|
3
|
+
export declare const reflectExemptNames: readonly string[];
|
|
4
|
+
/** A primitive public property declares `reflect: true` or `attribute: false`. */
|
|
5
|
+
export declare const propsReflectPrimitiveRule: IStandardRule;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as ast from '../helpers.ast.js';
|
|
2
|
+
import { addOptionFix } from './props.typed.js';
|
|
3
|
+
import { propertyKey, publicProperties } from './shared.js';
|
|
4
|
+
/** Global attributes with native behaviour that stay unreflected without an allowlist entry. */
|
|
5
|
+
export const reflectExemptNames = ['title', 'hidden', 'dir', 'lang', 'role', 'inert', 'draggable'];
|
|
6
|
+
const primitiveTypes = ['String', 'Number', 'Boolean'];
|
|
7
|
+
/** A primitive public property declares `reflect: true` or `attribute: false`. */
|
|
8
|
+
export const propsReflectPrimitiveRule = {
|
|
9
|
+
id: 'props/reflect-primitive',
|
|
10
|
+
severity: { base: 'error' },
|
|
11
|
+
fixMode: 'opt-in',
|
|
12
|
+
allowlistCategories: ['user-data', 'object', 'large-text', 'global-attribute'],
|
|
13
|
+
detect: ({ project }) => {
|
|
14
|
+
const findings = [];
|
|
15
|
+
for (const property of publicProperties(project)) {
|
|
16
|
+
if (property.dynamicOptions || reflectExemptNames.includes(property.name)) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const options = property.options;
|
|
20
|
+
const type = options ? ast.objectPropertyText(options, 'type') : null;
|
|
21
|
+
if (type !== null && !primitiveTypes.includes(type)) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (options && (ast.objectPropertyText(options, 'attribute') === 'false' || ast.objectPropertyText(options, 'reflect') === 'true')) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const explicitReflect = options ? ast.objectProperty(options, 'reflect') : null;
|
|
28
|
+
findings.push({
|
|
29
|
+
file: property.file,
|
|
30
|
+
position: property.call.getStart(),
|
|
31
|
+
key: propertyKey(property),
|
|
32
|
+
message: `public primitive @property ${property.name} declares neither reflect: true nor attribute: false`,
|
|
33
|
+
fix: explicitReflect
|
|
34
|
+
? (builderArg) => builderArg.edit(property.file, explicitReflect.initializer.getStart(), explicitReflect.initializer.end, 'true')
|
|
35
|
+
: addOptionFix(property, 'reflect: true', 'last'),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return findings;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcHMucmVmbGVjdC1wcmltaXRpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9zdGFuZGFyZHMvcnVsZXMvcHJvcHMucmVmbGVjdC1wcmltaXRpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQztBQUV6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RCxnR0FBZ0c7QUFDaEcsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQXNCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFdEgsTUFBTSxjQUFjLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRXZELGtGQUFrRjtBQUNsRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBa0I7SUFDdEQsRUFBRSxFQUFFLHlCQUF5QjtJQUM3QixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0lBQzNCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLG1CQUFtQixFQUFFLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUM7SUFDOUUsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFtQixFQUFFLENBQUM7UUFDcEMsS0FBSyxNQUFNLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pELElBQUksUUFBUSxDQUFDLGNBQWMsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzFFLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUNqQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN0RSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxLQUFLLE9BQU8sSUFBSSxHQUFHLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ25JLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2hGLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xDLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDO2dCQUMxQixPQUFPLEVBQUUsOEJBQThCLFFBQVEsQ0FBQyxJQUFJLHNEQUFzRDtnQkFDMUcsR0FBRyxFQUFFLGVBQWU7b0JBQ2xCLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsZUFBZSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO29CQUNqSSxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDO2FBQ3BELENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { IStandardProperty } from '../classes.standardproject.js';
|
|
2
|
+
import type { IStandardRule, TFixAction } from '../rule.js';
|
|
3
|
+
/** The edit that adds `propertyTextArg` to a property decorator's options, creating the options literal when absent. */
|
|
4
|
+
export declare const addOptionFix: (propertyArg: IStandardProperty, propertyTextArg: string, placementArg: "first" | "last") => TFixAction;
|
|
5
|
+
/** A public property declares `type`. */
|
|
6
|
+
export declare const propsTypedRule: IStandardRule;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as ast from '../helpers.ast.js';
|
|
3
|
+
import { coreTypeOf, isArrayTypeNode, propertyKey, publicProperties } from './shared.js';
|
|
4
|
+
const ts = plugins.typescript;
|
|
5
|
+
/** The Lit `type` that the property's annotation maps to, or null when the annotation does not decide it. */
|
|
6
|
+
const litTypeFor = (propertyArg) => {
|
|
7
|
+
const typeNode = coreTypeOf(propertyArg);
|
|
8
|
+
if (!typeNode) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
switch (typeNode.kind) {
|
|
12
|
+
case ts.SyntaxKind.StringKeyword:
|
|
13
|
+
return 'String';
|
|
14
|
+
case ts.SyntaxKind.NumberKeyword:
|
|
15
|
+
return 'Number';
|
|
16
|
+
case ts.SyntaxKind.BooleanKeyword:
|
|
17
|
+
return 'Boolean';
|
|
18
|
+
}
|
|
19
|
+
if (ts.isUnionTypeNode(typeNode) && typeNode.types.every((typeArg) => (ts.isLiteralTypeNode(typeArg) && ts.isStringLiteral(typeArg.literal))
|
|
20
|
+
|| typeArg.kind === ts.SyntaxKind.UndefinedKeyword
|
|
21
|
+
|| (ts.isLiteralTypeNode(typeArg) && typeArg.literal.kind === ts.SyntaxKind.NullKeyword))) {
|
|
22
|
+
return 'String';
|
|
23
|
+
}
|
|
24
|
+
if (ts.isLiteralTypeNode(typeNode) && ts.isStringLiteral(typeNode.literal)) {
|
|
25
|
+
return 'String';
|
|
26
|
+
}
|
|
27
|
+
return isArrayTypeNode(typeNode) ? 'Array' : null;
|
|
28
|
+
};
|
|
29
|
+
/** The edit that adds `propertyTextArg` to a property decorator's options, creating the options literal when absent. */
|
|
30
|
+
export const addOptionFix = (propertyArg, propertyTextArg, placementArg) => (builderArg) => {
|
|
31
|
+
if (propertyArg.options) {
|
|
32
|
+
const edit = placementArg === 'first'
|
|
33
|
+
? ast.prependObjectPropertyEdit(propertyArg.options, propertyTextArg)
|
|
34
|
+
: ast.appendObjectPropertyEdit(propertyArg.options, propertyTextArg);
|
|
35
|
+
builderArg.edit(propertyArg.file, edit.start, edit.end, edit.text);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const at = propertyArg.call.arguments.pos;
|
|
39
|
+
builderArg.edit(propertyArg.file, at, at, `{ ${propertyTextArg} }`);
|
|
40
|
+
};
|
|
41
|
+
/** A public property declares `type`. */
|
|
42
|
+
export const propsTypedRule = {
|
|
43
|
+
id: 'props/typed',
|
|
44
|
+
severity: { base: 'warn' },
|
|
45
|
+
fixMode: 'auto',
|
|
46
|
+
detect: ({ project }) => {
|
|
47
|
+
const findings = [];
|
|
48
|
+
for (const property of publicProperties(project)) {
|
|
49
|
+
if (property.dynamicOptions || (property.options && ast.objectProperty(property.options, 'type'))) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const litType = litTypeFor(property);
|
|
53
|
+
findings.push({
|
|
54
|
+
file: property.file,
|
|
55
|
+
position: property.call.getStart(),
|
|
56
|
+
key: propertyKey(property),
|
|
57
|
+
message: `@property ${property.name} declares no type`,
|
|
58
|
+
fix: litType ? addOptionFix(property, `type: ${litType}`, 'first') : undefined,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return findings;
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcHMudHlwZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9zdGFuZGFyZHMvcnVsZXMvcHJvcHMudHlwZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssR0FBRyxNQUFNLG1CQUFtQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV6RixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBRTlCLDZHQUE2RztBQUM3RyxNQUFNLFVBQVUsR0FBRyxDQUFDLFdBQThCLEVBQWlCLEVBQUU7SUFDbkUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELFFBQVEsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhO1lBQzlCLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhO1lBQzlCLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjO1lBQy9CLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNuRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztXQUNuRSxP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
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as ast from '../helpers.ast.js';
|
|
2
|
+
import type { IStandardElement, IStandardProperty, StandardProject } from '../classes.standardproject.js';
|
|
3
|
+
import type { IFixBuilder } from '../rule.js';
|
|
4
|
+
export declare const elementsDir = "ts_web/elements";
|
|
5
|
+
/** `ts_web/elements/00group-<area>` or `ts_web/elements` itself. */
|
|
6
|
+
export declare const isElementParentDir: (dirArg: string) => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* A valid custom element name in the ASCII subset the standard allows: a lowercase letter first,
|
|
9
|
+
* then lowercase letters, digits, `-`, `.` and `_`, at least one `-`, and not a reserved name. Such
|
|
10
|
+
* a tag is also a safe file and folder name, so only these tags feed fixes that derive paths or code.
|
|
11
|
+
*/
|
|
12
|
+
export declare const isCustomElementName: (tagArg: string) => boolean;
|
|
13
|
+
/** True when an element's entry file sits in its own element folder `…/<tag>/`. */
|
|
14
|
+
export declare const isInElementFolder: (elementArg: IStandardElement) => boolean;
|
|
15
|
+
/** The `<area>` of `ts_web/elements/00group-<area>/…`, or null. */
|
|
16
|
+
export declare const groupAreaOf: (fileArg: string) => string | null;
|
|
17
|
+
/** Elements outside demo files: the catalog's own elements. */
|
|
18
|
+
export declare const catalogElements: (projectArg: StandardProject) => IStandardElement[];
|
|
19
|
+
/** Public `@property` members outside demo files. */
|
|
20
|
+
export declare const publicProperties: (projectArg: StandardProject) => IStandardProperty[];
|
|
21
|
+
export declare const elementKey: (elementArg: IStandardElement) => string;
|
|
22
|
+
export declare const propertyKey: (propertyArg: IStandardProperty) => string;
|
|
23
|
+
/** The type annotation of a property member without `undefined` and `null` union members. */
|
|
24
|
+
export declare const coreTypeOf: (propertyArg: IStandardProperty) => ast.TTypeNode | null;
|
|
25
|
+
export declare const isArrayTypeNode: (typeArg: ast.TTypeNode) => boolean;
|
|
26
|
+
/** The position at the start of the line after the last `export … from` statement, or at the end of the file. */
|
|
27
|
+
export declare const exportInsertionPoint: (sourceFileArg: ast.TSourceFile) => {
|
|
28
|
+
position: number;
|
|
29
|
+
prefix: string;
|
|
30
|
+
};
|
|
31
|
+
/** Adds `export * from '<target>';` to a barrel. */
|
|
32
|
+
export declare const addReexport: (builderArg: IFixBuilder, projectArg: StandardProject, barrelArg: string, targetArg: string) => void;
|
|
33
|
+
/** Removes a whole statement including its line break; from the line start when only indentation precedes it. */
|
|
34
|
+
export declare const removeStatement: (builderArg: IFixBuilder, fileArg: string, statementArg: ast.TNode) => void;
|
|
35
|
+
/** The identifier a `static demo` value refers to at its root, e.g. `demoFunc` or `demos` in `demos.main`. */
|
|
36
|
+
export declare const rootIdentifier: (expressionArg: ast.TExpression) => string | null;
|
|
37
|
+
/** The start of the line following the line a position is on. */
|
|
38
|
+
export declare const nextLineStart: (textArg: string, positionArg: number) => number;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as ast from '../helpers.ast.js';
|
|
3
|
+
import { baseOf, dirOf, specifierFor } from '../helpers.paths.js';
|
|
4
|
+
const ts = plugins.typescript;
|
|
5
|
+
export const elementsDir = 'ts_web/elements';
|
|
6
|
+
/** `ts_web/elements/00group-<area>` or `ts_web/elements` itself. */
|
|
7
|
+
export const isElementParentDir = (dirArg) => dirArg === elementsDir || /^ts_web\/elements\/00group-[^/]+$/.test(dirArg);
|
|
8
|
+
/** Names the HTML specification reserves; `customElements.define` rejects them. */
|
|
9
|
+
const reservedElementNames = ['annotation-xml', 'color-profile', 'font-face', 'font-face-src', 'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'];
|
|
10
|
+
/**
|
|
11
|
+
* A valid custom element name in the ASCII subset the standard allows: a lowercase letter first,
|
|
12
|
+
* then lowercase letters, digits, `-`, `.` and `_`, at least one `-`, and not a reserved name. Such
|
|
13
|
+
* a tag is also a safe file and folder name, so only these tags feed fixes that derive paths or code.
|
|
14
|
+
*/
|
|
15
|
+
export const isCustomElementName = (tagArg) => /^[a-z][a-z0-9._-]*$/.test(tagArg) && tagArg.includes('-') && !reservedElementNames.includes(tagArg);
|
|
16
|
+
/** True when an element's entry file sits in its own element folder `…/<tag>/`. */
|
|
17
|
+
export const isInElementFolder = (elementArg) => {
|
|
18
|
+
const folder = dirOf(elementArg.file);
|
|
19
|
+
return !!elementArg.tag && baseOf(folder) === elementArg.tag && isElementParentDir(dirOf(folder));
|
|
20
|
+
};
|
|
21
|
+
/** The `<area>` of `ts_web/elements/00group-<area>/…`, or null. */
|
|
22
|
+
export const groupAreaOf = (fileArg) => /^ts_web\/elements\/00group-([^/]+)\//.exec(fileArg)?.[1] ?? null;
|
|
23
|
+
/** Elements outside demo files: the catalog's own elements. */
|
|
24
|
+
export const catalogElements = (projectArg) => projectArg.elements.filter((elementArg) => !elementArg.inDemoFile);
|
|
25
|
+
/** Public `@property` members outside demo files. */
|
|
26
|
+
export const publicProperties = (projectArg) => projectArg.properties.filter((propertyArg) => propertyArg.decorator === 'property' && propertyArg.isPublic && !propertyArg.inDemoFile);
|
|
27
|
+
export const elementKey = (elementArg) => `${elementArg.file}#${elementArg.className ?? elementArg.tag ?? '?'}`;
|
|
28
|
+
export const propertyKey = (propertyArg) => `${propertyArg.file}#${propertyArg.name}`;
|
|
29
|
+
/** The type annotation of a property member without `undefined` and `null` union members. */
|
|
30
|
+
export const coreTypeOf = (propertyArg) => {
|
|
31
|
+
const member = propertyArg.member;
|
|
32
|
+
const typeNode = ts.isPropertyDeclaration(member) ? member.type : undefined;
|
|
33
|
+
if (!typeNode) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (ts.isUnionTypeNode(typeNode)) {
|
|
37
|
+
const members = typeNode.types.filter((typeArg) => typeArg.kind !== ts.SyntaxKind.UndefinedKeyword
|
|
38
|
+
&& !(ts.isLiteralTypeNode(typeArg) && typeArg.literal.kind === ts.SyntaxKind.NullKeyword));
|
|
39
|
+
if (members.length === 1) {
|
|
40
|
+
return members[0];
|
|
41
|
+
}
|
|
42
|
+
return typeNode;
|
|
43
|
+
}
|
|
44
|
+
return typeNode;
|
|
45
|
+
};
|
|
46
|
+
export const isArrayTypeNode = (typeArg) => {
|
|
47
|
+
if (ts.isArrayTypeNode(typeArg)) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
if (ts.isTypeOperatorNode(typeArg) && typeArg.operator === ts.SyntaxKind.ReadonlyKeyword) {
|
|
51
|
+
return ts.isArrayTypeNode(typeArg.type);
|
|
52
|
+
}
|
|
53
|
+
return ts.isTypeReferenceNode(typeArg) && ts.isIdentifier(typeArg.typeName) && ['Array', 'ReadonlyArray'].includes(typeArg.typeName.text);
|
|
54
|
+
};
|
|
55
|
+
/** The position at the start of the line after the last `export … from` statement, or at the end of the file. */
|
|
56
|
+
export const exportInsertionPoint = (sourceFileArg) => {
|
|
57
|
+
let lastEnd = -1;
|
|
58
|
+
for (const statement of sourceFileArg.statements) {
|
|
59
|
+
if (ts.isExportDeclaration(statement)) {
|
|
60
|
+
lastEnd = statement.end;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const text = sourceFileArg.text;
|
|
64
|
+
if (lastEnd === -1) {
|
|
65
|
+
return { position: text.length, prefix: text.length > 0 && !text.endsWith('\n') ? '\n' : '' };
|
|
66
|
+
}
|
|
67
|
+
const newline = text.indexOf('\n', lastEnd);
|
|
68
|
+
return newline === -1 ? { position: text.length, prefix: '\n' } : { position: newline + 1, prefix: '' };
|
|
69
|
+
};
|
|
70
|
+
/** Adds `export * from '<target>';` to a barrel. */
|
|
71
|
+
export const addReexport = (builderArg, projectArg, barrelArg, targetArg) => {
|
|
72
|
+
const point = exportInsertionPoint(projectArg.sourceFile(barrelArg));
|
|
73
|
+
builderArg.edit(barrelArg, point.position, point.position, `${point.prefix}export * from '${specifierFor(barrelArg, targetArg, 'js')}';\n`);
|
|
74
|
+
};
|
|
75
|
+
/** Removes a whole statement including its line break; from the line start when only indentation precedes it. */
|
|
76
|
+
export const removeStatement = (builderArg, fileArg, statementArg) => {
|
|
77
|
+
const text = statementArg.getSourceFile().text;
|
|
78
|
+
let start = statementArg.getStart();
|
|
79
|
+
const lineStart = text.lastIndexOf('\n', start - 1) + 1;
|
|
80
|
+
if (/^[ \t]*$/.test(text.slice(lineStart, start))) {
|
|
81
|
+
start = lineStart;
|
|
82
|
+
}
|
|
83
|
+
let end = statementArg.end;
|
|
84
|
+
const rest = /^[ \t]*\r?\n/.exec(text.slice(end));
|
|
85
|
+
if (rest) {
|
|
86
|
+
end += rest[0].length;
|
|
87
|
+
}
|
|
88
|
+
builderArg.edit(fileArg, start, end, '');
|
|
89
|
+
};
|
|
90
|
+
/** The identifier a `static demo` value refers to at its root, e.g. `demoFunc` or `demos` in `demos.main`. */
|
|
91
|
+
export const rootIdentifier = (expressionArg) => {
|
|
92
|
+
let current = expressionArg;
|
|
93
|
+
while (ts.isPropertyAccessExpression(current)) {
|
|
94
|
+
current = current.expression;
|
|
95
|
+
}
|
|
96
|
+
return ts.isIdentifier(current) ? current.text : null;
|
|
97
|
+
};
|
|
98
|
+
/** The start of the line following the line a position is on. */
|
|
99
|
+
export const nextLineStart = (textArg, positionArg) => {
|
|
100
|
+
const newline = textArg.indexOf('\n', positionArg);
|
|
101
|
+
return newline === -1 ? textArg.length : newline + 1;
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvc3RhbmRhcmRzL3J1bGVzL3NoYXJlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxHQUFHLE1BQU0sbUJBQW1CLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFJbEUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUU5QixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUFFN0Msb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsTUFBYyxFQUFXLEVBQUUsQ0FDNUQsTUFBTSxLQUFLLFdBQVcsSUFBSSxtQ0FBbUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFN0UsbUZBQW1GO0FBQ25GLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFFdks7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsTUFBYyxFQUFXLEVBQUUsQ0FDN0QscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFdkcsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsVUFBNEIsRUFBVyxFQUFFO0lBQ3pFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLENB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
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IStandardRule } from '../rule.js';
|
|
2
|
+
/** The one module that may call `bdTheme()`: the token bridge. */
|
|
3
|
+
export declare const bdThemeBridge = "ts_web/elements/00theme.ts";
|
|
4
|
+
/** dees: no new `cssManager.bdTheme()` call outside `ts_web/elements/00theme.ts`. A ratchet: baselines only. */
|
|
5
|
+
export declare const styleBdThemeRule: IStandardRule;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as ast from '../helpers.ast.js';
|
|
3
|
+
const ts = plugins.typescript;
|
|
4
|
+
/** The one module that may call `bdTheme()`: the token bridge. */
|
|
5
|
+
export const bdThemeBridge = 'ts_web/elements/00theme.ts';
|
|
6
|
+
/** dees: no new `cssManager.bdTheme()` call outside `ts_web/elements/00theme.ts`. A ratchet: baselines only. */
|
|
7
|
+
export const styleBdThemeRule = {
|
|
8
|
+
id: 'style/bdtheme',
|
|
9
|
+
severity: { dees: 'error' },
|
|
10
|
+
fixMode: 'none',
|
|
11
|
+
detect: ({ project }) => {
|
|
12
|
+
const findings = [];
|
|
13
|
+
for (const file of project.webFiles) {
|
|
14
|
+
if (file === bdThemeBridge) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const visit = (nodeArg) => {
|
|
18
|
+
if (ts.isCallExpression(nodeArg) && ast.calleeName(nodeArg.expression) === 'bdTheme') {
|
|
19
|
+
findings.push({ file, position: nodeArg.getStart(), key: file, message: 'bdTheme() call; use --dees-* tokens' });
|
|
20
|
+
}
|
|
21
|
+
ts.forEachChild(nodeArg, visit);
|
|
22
|
+
};
|
|
23
|
+
visit(project.sourceFile(file));
|
|
24
|
+
}
|
|
25
|
+
return findings;
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGUuYmR0aGVtZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3N0YW5kYXJkcy9ydWxlcy9zdHlsZS5iZHRoZW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQztBQUd6QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBRTlCLGtFQUFrRTtBQUNsRSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFFMUQsZ0hBQWdIO0FBQ2hILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFrQjtJQUM3QyxFQUFFLEVBQUUsZUFBZTtJQUNuQixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0lBQzNCLE9BQU8sRUFBRSxNQUFNO0lBQ2YsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFtQixFQUFFLENBQUM7UUFDcEMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQzNCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFrQixFQUFRLEVBQUU7Z0JBQ3pDLElBQUksRUFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNyRixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNuSCxDQUFDO2dCQUNELEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLENBQUMsQ0FBQztZQUNGLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRixDQUFDIn0=
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './catalog.js';
|
|
2
2
|
export * from './bridge.js';
|
|
3
3
|
export * from './requests.js';
|
|
4
|
-
|
|
4
|
+
export * from './standard.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19pbnRlcmZhY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsZUFBZSxDQUFDIn0=
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wcctools component standard (docs/standard.md): its configuration in `.smartconfig.json`
|
|
3
|
+
* and the reports `wcctools check` and `wcctools fix` produce.
|
|
4
|
+
*/
|
|
5
|
+
/** Rule set a repository adopts. */
|
|
6
|
+
export type TStandardProfile = 'base' | 'dees';
|
|
7
|
+
/** A rule id of the form `<area>/<name>`, e.g. `props/reflect-primitive`. */
|
|
8
|
+
export type TStandardRuleId = string;
|
|
9
|
+
export type TStandardSeverity = 'error' | 'warn' | 'info';
|
|
10
|
+
/**
|
|
11
|
+
* What `wcctools fix` does for a rule:
|
|
12
|
+
* - `auto`: fixes it on every run;
|
|
13
|
+
* - `opt-in`: fixes it only when the rule is named with `--rule`;
|
|
14
|
+
* - `none`: reports only.
|
|
15
|
+
*/
|
|
16
|
+
export type TStandardFixMode = 'auto' | 'opt-in' | 'none';
|
|
17
|
+
/** `.smartconfig.json` → `@design.estate/wcctools` → `standard`. */
|
|
18
|
+
export interface IStandardConfig {
|
|
19
|
+
/** Rule set; 'base' when absent. */
|
|
20
|
+
profile?: TStandardProfile;
|
|
21
|
+
/** Tag prefix without the trailing hyphen, e.g. 'dees'. */
|
|
22
|
+
tagPrefix: string;
|
|
23
|
+
/** dees profile: display name per group area, e.g. { harness: 'Agent Chat' }. */
|
|
24
|
+
groupNames?: Record<string, string>;
|
|
25
|
+
/** Exact exceptions: rule id → '<file>#<member>' → '<category>: <reason>'. */
|
|
26
|
+
allowlist?: Record<TStandardRuleId, Record<string, string>>;
|
|
27
|
+
/** Accepted counts of error findings: rule id → file → count. Only shrinks. */
|
|
28
|
+
baselines?: Record<TStandardRuleId, Record<string, number>>;
|
|
29
|
+
}
|
|
30
|
+
/** `.smartconfig.json` → `@design.estate/wcctools`. */
|
|
31
|
+
export interface IWccToolsConfig {
|
|
32
|
+
standard?: IStandardConfig;
|
|
33
|
+
}
|
|
34
|
+
export interface IStandardFinding {
|
|
35
|
+
ruleId: TStandardRuleId;
|
|
36
|
+
severity: TStandardSeverity;
|
|
37
|
+
/** Path relative to the repository root, '/' separators. */
|
|
38
|
+
file: string;
|
|
39
|
+
/** 1-based. */
|
|
40
|
+
line: number;
|
|
41
|
+
/** 1-based. */
|
|
42
|
+
column: number;
|
|
43
|
+
message: string;
|
|
44
|
+
/** True when `wcctools fix` resolves this finding (for opt-in rules: with --rule). */
|
|
45
|
+
fixable: boolean;
|
|
46
|
+
/** Set when the finding is covered by the allowlist or a baseline and does not fail check. */
|
|
47
|
+
covered?: 'allowlist' | 'baseline';
|
|
48
|
+
}
|
|
49
|
+
/** A file whose finding count is below its baseline: a candidate for lowering the baseline. */
|
|
50
|
+
export interface IStandardBaselineSlack {
|
|
51
|
+
ruleId: TStandardRuleId;
|
|
52
|
+
file: string;
|
|
53
|
+
baseline: number;
|
|
54
|
+
current: number;
|
|
55
|
+
}
|
|
56
|
+
export interface IStandardReport {
|
|
57
|
+
profile: TStandardProfile;
|
|
58
|
+
findings: IStandardFinding[];
|
|
59
|
+
/** Files whose count is below their baseline: candidates for --update-baseline. */
|
|
60
|
+
baselineSlack: IStandardBaselineSlack[];
|
|
61
|
+
/** True when no error finding remains outside the allowlist and baselines. */
|
|
62
|
+
ok: boolean;
|
|
63
|
+
}
|
|
64
|
+
/** A rule as it applies in one profile. */
|
|
65
|
+
export interface IStandardRuleInfo {
|
|
66
|
+
id: TStandardRuleId;
|
|
67
|
+
severity: TStandardSeverity;
|
|
68
|
+
fixMode: TStandardFixMode;
|
|
69
|
+
/** Categories an allowlist entry for this rule may use; empty when the rule takes no allowlist. */
|
|
70
|
+
allowlistCategories: string[];
|
|
71
|
+
}
|
|
72
|
+
export interface IStandardFileMove {
|
|
73
|
+
from: string;
|
|
74
|
+
to: string;
|
|
75
|
+
}
|
|
76
|
+
/** The changes a `wcctools fix` run makes (or, with --dry-run, would make). */
|
|
77
|
+
export interface IStandardFixPlan {
|
|
78
|
+
/** `git mv` operations, from the original path to the final path. */
|
|
79
|
+
moves: IStandardFileMove[];
|
|
80
|
+
/** New files, by final path. */
|
|
81
|
+
created: string[];
|
|
82
|
+
/** Changed existing files, by final path, with the rules that changed them. */
|
|
83
|
+
edited: Array<{
|
|
84
|
+
file: string;
|
|
85
|
+
ruleIds: TStandardRuleId[];
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
export interface IStandardFixResult {
|
|
89
|
+
dryRun: boolean;
|
|
90
|
+
plan: IStandardFixPlan;
|
|
91
|
+
/** The check after the fix (with --dry-run: as the fix would leave the repository). */
|
|
92
|
+
remaining: IStandardReport;
|
|
93
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wcctools component standard (docs/standard.md): its configuration in `.smartconfig.json`
|
|
3
|
+
* and the reports `wcctools check` and `wcctools fix` produce.
|
|
4
|
+
*/
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19pbnRlcmZhY2VzL3N0YW5kYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRyJ9
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@design.estate/wcctools',
|
|
6
|
-
version: '6.
|
|
6
|
+
version: '6.1.0',
|
|
7
7
|
description: 'A set of web component tools for creating element catalogues, enabling the structured development and documentation of custom elements and pages.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUseUJBQXlCO0lBQy9CLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxtSkFBbUo7Q0FDakssQ0FBQSJ9
|