@design.estate/wcctools 5.1.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/.smartconfig.json +7 -3
- package/changelog.md +28 -0
- package/cli.js +3 -0
- package/dist_shell/bundle.js +2970 -0
- package/dist_shell/bundle.js.map +1 -0
- package/dist_shell/bundle.js.third-party-notices.json +1722 -0
- package/dist_shell/bundle.js.third-party-notices.txt +4195 -0
- package/dist_shell/index.html +21 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.devapi.d.ts +11 -0
- package/dist_ts/classes.devapi.js +21 -0
- package/dist_ts/classes.devserver.d.ts +49 -0
- package/dist_ts/classes.devserver.js +142 -0
- package/dist_ts/cli.d.ts +6 -0
- package/dist_ts/cli.js +51 -0
- package/dist_ts/index.d.ts +3 -0
- package/dist_ts/index.js +4 -0
- package/dist_ts/paths.d.ts +4 -0
- package/dist_ts/paths.js +6 -0
- package/dist_ts/plugins.d.ts +20 -0
- package/dist_ts/plugins.js +27 -0
- package/dist_ts/shellcontent.d.ts +9 -0
- package/dist_ts/shellcontent.js +42 -0
- 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/bridge.d.ts +88 -0
- package/dist_ts_interfaces/bridge.js +2 -0
- package/dist_ts_interfaces/catalog.d.ts +32 -0
- package/dist_ts_interfaces/catalog.js +6 -0
- package/dist_ts_interfaces/index.d.ts +4 -0
- package/dist_ts_interfaces/index.js +5 -0
- package/dist_ts_interfaces/plugins.d.ts +2 -0
- package/dist_ts_interfaces/plugins.js +3 -0
- package/dist_ts_interfaces/requests.d.ts +15 -0
- package/dist_ts_interfaces/requests.js +2 -0
- package/dist_ts_interfaces/standard.d.ts +93 -0
- package/dist_ts_interfaces/standard.js +6 -0
- package/dist_ts_shared/index.d.ts +1 -0
- package/dist_ts_shared/index.js +2 -0
- package/dist_ts_shared/plugins.d.ts +2 -0
- package/dist_ts_shared/plugins.js +3 -0
- package/dist_ts_shared/previewroute.d.ts +18 -0
- package/dist_ts_shared/previewroute.js +47 -0
- package/{dist_ts_web → dist_ts_shell}/elements/wcc-contextmenu.js +1 -1
- package/dist_ts_shell/elements/wcc-preview-frame.d.ts +23 -0
- package/dist_ts_shell/elements/wcc-preview-frame.js +197 -0
- package/dist_ts_shell/elements/wcc-properties.d.ts +49 -0
- package/{dist_ts_web → dist_ts_shell}/elements/wcc-properties.js +149 -216
- package/{dist_ts_web → dist_ts_shell}/elements/wcc-record-button.js +1 -1
- package/{dist_ts_web → dist_ts_shell}/elements/wcc-recording-panel.d.ts +2 -2
- package/{dist_ts_web → dist_ts_shell}/elements/wcc-recording-panel.js +12 -16
- package/dist_ts_shell/elements/wcc-shell.d.ts +87 -0
- package/dist_ts_shell/elements/wcc-shell.js +524 -0
- package/{dist_ts_web → dist_ts_shell}/elements/wcc-sidebar.d.ts +12 -10
- package/{dist_ts_web → dist_ts_shell}/elements/wcc-sidebar.js +137 -183
- package/dist_ts_shell/index.d.ts +4 -0
- package/dist_ts_shell/index.js +5 -0
- package/dist_ts_shell/plugins.d.ts +4 -0
- package/dist_ts_shell/plugins.js +5 -0
- package/dist_ts_shell/previewconnection.d.ts +30 -0
- package/dist_ts_shell/previewconnection.js +86 -0
- package/dist_ts_shell/services/recorder.service.js +353 -0
- package/dist_ts_web/00_commitinfo_data.js +2 -2
- package/dist_ts_web/catalog.d.ts +45 -0
- package/dist_ts_web/catalog.js +153 -0
- package/dist_ts_web/elementproperties.d.ts +15 -0
- package/dist_ts_web/elementproperties.js +89 -0
- package/dist_ts_web/elements/wcc-preview.d.ts +19 -0
- package/dist_ts_web/elements/wcc-preview.js +164 -0
- package/dist_ts_web/elements/wcc-standalone-notice.d.ts +14 -0
- package/dist_ts_web/elements/wcc-standalone-notice.js +110 -0
- package/dist_ts_web/elements/wcctools.helpers.d.ts +2 -6
- package/dist_ts_web/elements/wcctools.helpers.js +1 -7
- package/dist_ts_web/index.d.ts +2 -5
- package/dist_ts_web/index.js +38 -17
- package/dist_ts_web/previewbridge.d.ts +39 -0
- package/dist_ts_web/previewbridge.js +153 -0
- package/dist_ts_web/renderedtree.d.ts +5 -0
- package/dist_ts_web/renderedtree.js +37 -0
- package/dist_ts_web/wcctools.interfaces.d.ts +3 -6
- package/dist_ts_web/wcctools.interfaces.js +1 -1
- package/dist_ts_web/wcctools.plugins.d.ts +3 -1
- package/dist_ts_web/wcctools.plugins.js +4 -2
- package/package.json +17 -7
- package/readme.md +93 -28
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.devapi.ts +25 -0
- package/ts/classes.devserver.ts +161 -0
- package/ts/cli.ts +53 -0
- package/ts/index.ts +3 -0
- package/ts/paths.ts +7 -0
- package/ts/plugins.ts +37 -0
- package/ts/shellcontent.ts +42 -0
- 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
- package/ts_web/catalog.ts +194 -0
- package/ts_web/elementproperties.ts +96 -0
- package/ts_web/elements/wcc-preview.ts +111 -0
- package/ts_web/elements/wcc-standalone-notice.ts +65 -0
- package/ts_web/elements/wcctools.helpers.ts +2 -10
- package/ts_web/index.ts +38 -19
- package/ts_web/previewbridge.ts +189 -0
- package/ts_web/readme.md +26 -85
- package/ts_web/renderedtree.ts +43 -0
- package/ts_web/wcctools.interfaces.ts +4 -7
- package/ts_web/wcctools.plugins.ts +6 -1
- package/dist_bundle/bundle.js +0 -92419
- package/dist_bundle/bundle.js.map +0 -1
- package/dist_ts_web/elements/wcc-dashboard.d.ts +0 -119
- package/dist_ts_web/elements/wcc-dashboard.js +0 -700
- package/dist_ts_web/elements/wcc-frame.d.ts +0 -22
- package/dist_ts_web/elements/wcc-frame.js +0 -256
- package/dist_ts_web/elements/wcc-properties.d.ts +0 -43
- package/dist_ts_web/pages/index.d.ts +0 -1
- package/dist_ts_web/pages/index.js +0 -2
- package/dist_ts_web/services/recorder.service.js +0 -353
- package/ts_web/elements/wcc-contextmenu.ts +0 -291
- package/ts_web/elements/wcc-dashboard.ts +0 -672
- package/ts_web/elements/wcc-frame.ts +0 -189
- package/ts_web/elements/wcc-properties.ts +0 -1089
- package/ts_web/elements/wcc-record-button.ts +0 -108
- package/ts_web/elements/wcc-recording-panel.ts +0 -1010
- package/ts_web/elements/wcc-sidebar.ts +0 -1470
- package/ts_web/pages/index.ts +0 -1
- package/ts_web/services/recorder.service.ts +0 -451
- package/ts_web/types/dom-mediacapture-stub/index.d.ts +0 -12
- package/ts_web/types/dom-mediacapture-stub/package.json +0 -6
- package/ts_web/types/dom-webcodecs-stub/index.d.ts +0 -2
- package/ts_web/types/dom-webcodecs-stub/package.json +0 -6
- /package/{dist_ts_web → dist_ts_shell}/elements/wcc-contextmenu.d.ts +0 -0
- /package/{dist_ts_web → dist_ts_shell}/elements/wcc-record-button.d.ts +0 -0
- /package/{dist_ts_web → dist_ts_shell}/services/recorder.service.d.ts +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>wcctools</title>
|
|
7
|
+
<link rel="icon" href="data:," />
|
|
8
|
+
<link rel="preconnect" href="https://assetbroker.lossless.one/" crossorigin>
|
|
9
|
+
<link rel="stylesheet" href="https://assetbroker.lossless.one/fonts/fonts.css">
|
|
10
|
+
<style>
|
|
11
|
+
body {
|
|
12
|
+
margin: 0px;
|
|
13
|
+
background: #0a0a0a;
|
|
14
|
+
}
|
|
15
|
+
</style>
|
|
16
|
+
<script type="module" src="/wcctools/bundle.js"></script>
|
|
17
|
+
</head>
|
|
18
|
+
<body>
|
|
19
|
+
<wcc-shell preview-path="/wcctools-preview"></wcc-shell>
|
|
20
|
+
</body>
|
|
21
|
+
</html>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autocreated commitinfo by @push.rocks/commitinfo
|
|
3
|
+
*/
|
|
4
|
+
export const commitinfo = {
|
|
5
|
+
name: '@design.estate/wcctools',
|
|
6
|
+
version: '6.1.0',
|
|
7
|
+
description: 'A set of web component tools for creating element catalogues, enabling the structured development and documentation of custom elements and pages.'
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLG1KQUFtSjtDQUNqSyxDQUFBIn0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* The typed API the shell reaches on `/wcctools/typedrequest`. Later features register their
|
|
4
|
+
* handlers on `typedrouter`.
|
|
5
|
+
*/
|
|
6
|
+
export declare class WccDevApi {
|
|
7
|
+
readonly typedrouter: plugins.typedrequest.TypedRouter<import("@api.global/typedrequest-interfaces").ITypedRequest>;
|
|
8
|
+
private serverInfo;
|
|
9
|
+
constructor();
|
|
10
|
+
setServerInfo(infoArg: plugins.interfaces.IWccDevServerInfo): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* The typed API the shell reaches on `/wcctools/typedrequest`. Later features register their
|
|
4
|
+
* handlers on `typedrouter`.
|
|
5
|
+
*/
|
|
6
|
+
export class WccDevApi {
|
|
7
|
+
typedrouter = new plugins.typedrequest.TypedRouter();
|
|
8
|
+
serverInfo = null;
|
|
9
|
+
constructor() {
|
|
10
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getDevServerInfo', async () => {
|
|
11
|
+
if (!this.serverInfo) {
|
|
12
|
+
throw new Error('The dev server has not started.');
|
|
13
|
+
}
|
|
14
|
+
return { ...this.serverInfo };
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
setServerInfo(infoArg) {
|
|
18
|
+
this.serverInfo = { ...infoArg };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kZXZhcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmRldmFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNKLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0QsVUFBVSxHQUFnRCxJQUFJLENBQUM7SUFFdkU7UUFDRSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FDOUIsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBMkMsa0JBQWtCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDN0csSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTSxhQUFhLENBQUMsT0FBNkM7UUFDaEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDbkMsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { WccDevApi } from './classes.devapi.js';
|
|
2
|
+
export interface IWccDevServerOptions {
|
|
3
|
+
/** Port to listen on; overrides the tswatch configuration. 0 picks a free port. */
|
|
4
|
+
port?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface IWccDevServerAddress {
|
|
7
|
+
port: number;
|
|
8
|
+
/** The shell's address. */
|
|
9
|
+
url: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* `wcctools dev`: bundles the catalog of the current project with tswatch, as its
|
|
13
|
+
* `@git.zone/tswatch` configuration (or the `element` preset) describes, and serves on one port:
|
|
14
|
+
*
|
|
15
|
+
* - the shell on `/wcctools/` (`/` redirects there) and its routes `/wcctools-route/...`,
|
|
16
|
+
* - the typed API on `/wcctools/typedrequest`,
|
|
17
|
+
* - the catalog's preview document and bundle from the tswatch serve directory on every other
|
|
18
|
+
* path, with live reload that reloads only the preview document.
|
|
19
|
+
*
|
|
20
|
+
* tswatch resolves its paths against the process's working directory, so the server serves the
|
|
21
|
+
* project the process runs in.
|
|
22
|
+
*/
|
|
23
|
+
export declare class WccDevServer {
|
|
24
|
+
private readonly options;
|
|
25
|
+
/** The typed API on `/wcctools/typedrequest`; register further handlers before `start()`. */
|
|
26
|
+
readonly api: WccDevApi;
|
|
27
|
+
private tsWatch;
|
|
28
|
+
private typedServer;
|
|
29
|
+
private readonly smartExit;
|
|
30
|
+
constructor(options?: IWccDevServerOptions);
|
|
31
|
+
start(): Promise<IWccDevServerAddress>;
|
|
32
|
+
/** Stops the server, then tswatch's bundling and watching. */
|
|
33
|
+
stop(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* The shell: the prebuilt shell bundle and the typed API.
|
|
36
|
+
*
|
|
37
|
+
* Seam for side-effecting APIs (assistant, capture, standards fixes): before any handler with
|
|
38
|
+
* side effects is registered here, add a `websocketAdmission`/`requestAdmission` that accepts
|
|
39
|
+
* only the shell's own origin, and keep surface mode's strict authority validation.
|
|
40
|
+
*/
|
|
41
|
+
private createShellSurface;
|
|
42
|
+
/**
|
|
43
|
+
* The preview: the catalog's own document and bundle from the tswatch serve directory, on
|
|
44
|
+
* the root paths it was written for. Its live reload client is injected into its document
|
|
45
|
+
* only, so a rebuilt bundle reloads the preview frame and never the shell.
|
|
46
|
+
*/
|
|
47
|
+
private createPreviewSurface;
|
|
48
|
+
private readProjectName;
|
|
49
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as paths from './paths.js';
|
|
3
|
+
import { commitinfo } from './00_commitinfo_data.js';
|
|
4
|
+
import { WccDevApi } from './classes.devapi.js';
|
|
5
|
+
import { loadShellContent, shellPathPrefix } from './shellcontent.js';
|
|
6
|
+
/** tswatch's default port and serve directory, used when the configuration names none. */
|
|
7
|
+
const defaultPort = 3002;
|
|
8
|
+
const defaultServeDir = './dist_watch/';
|
|
9
|
+
/** The development headers tswatch serves catalogs with: a cross-origin isolated document. */
|
|
10
|
+
const securityHeaders = {
|
|
11
|
+
crossOriginOpenerPolicy: 'same-origin',
|
|
12
|
+
crossOriginEmbedderPolicy: 'require-corp',
|
|
13
|
+
};
|
|
14
|
+
const acceptAnyHostname = () => true;
|
|
15
|
+
/**
|
|
16
|
+
* `wcctools dev`: bundles the catalog of the current project with tswatch, as its
|
|
17
|
+
* `@git.zone/tswatch` configuration (or the `element` preset) describes, and serves on one port:
|
|
18
|
+
*
|
|
19
|
+
* - the shell on `/wcctools/` (`/` redirects there) and its routes `/wcctools-route/...`,
|
|
20
|
+
* - the typed API on `/wcctools/typedrequest`,
|
|
21
|
+
* - the catalog's preview document and bundle from the tswatch serve directory on every other
|
|
22
|
+
* path, with live reload that reloads only the preview document.
|
|
23
|
+
*
|
|
24
|
+
* tswatch resolves its paths against the process's working directory, so the server serves the
|
|
25
|
+
* project the process runs in.
|
|
26
|
+
*/
|
|
27
|
+
export class WccDevServer {
|
|
28
|
+
options;
|
|
29
|
+
/** The typed API on `/wcctools/typedrequest`; register further handlers before `start()`. */
|
|
30
|
+
api = new WccDevApi();
|
|
31
|
+
tsWatch = null;
|
|
32
|
+
typedServer = null;
|
|
33
|
+
smartExit = new plugins.smartexit.SmartExit({ silent: true });
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
this.options = options;
|
|
36
|
+
this.smartExit.addCleanupFunction(() => this.stop());
|
|
37
|
+
}
|
|
38
|
+
async start() {
|
|
39
|
+
if (this.typedServer) {
|
|
40
|
+
throw new Error('wcctools: the dev server is already started.');
|
|
41
|
+
}
|
|
42
|
+
const cwd = process.cwd();
|
|
43
|
+
const configHandler = new plugins.tswatch.ConfigHandler(cwd);
|
|
44
|
+
const config = configHandler.loadConfig() ?? configHandler.getPreset('element');
|
|
45
|
+
const serveDir = plugins.path.resolve(cwd, config.server?.serveDir ?? defaultServeDir);
|
|
46
|
+
const port = this.options.port ?? config.server?.port ?? defaultPort;
|
|
47
|
+
// The preview surface watches the serve directory, which must exist before the first bundle
|
|
48
|
+
await plugins.fs.mkdir(serveDir, { recursive: true });
|
|
49
|
+
this.api.setServerInfo({
|
|
50
|
+
wcctoolsVersion: commitinfo.version,
|
|
51
|
+
projectName: await this.readProjectName(cwd),
|
|
52
|
+
});
|
|
53
|
+
const typedServer = new plugins.typedserver.TypedServer({
|
|
54
|
+
cors: false,
|
|
55
|
+
port,
|
|
56
|
+
surfaces: [
|
|
57
|
+
await this.createShellSurface(),
|
|
58
|
+
this.createPreviewSurface(serveDir),
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
this.typedServer = typedServer;
|
|
62
|
+
// Bundling and watching stay tswatch's; its own server stays off
|
|
63
|
+
this.tsWatch = new plugins.tswatch.TsWatch({ ...config, server: { enabled: false } });
|
|
64
|
+
try {
|
|
65
|
+
await this.tsWatch.start();
|
|
66
|
+
await typedServer.start();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
await this.stop();
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
const boundPort = typedServer.listeningPort ?? port;
|
|
73
|
+
return { port: boundPort, url: `http://localhost:${boundPort}${shellPathPrefix}/` };
|
|
74
|
+
}
|
|
75
|
+
/** Stops the server, then tswatch's bundling and watching. */
|
|
76
|
+
async stop() {
|
|
77
|
+
const typedServer = this.typedServer;
|
|
78
|
+
const tsWatch = this.tsWatch;
|
|
79
|
+
this.typedServer = null;
|
|
80
|
+
this.tsWatch = null;
|
|
81
|
+
this.smartExit.deregister();
|
|
82
|
+
await typedServer?.stop();
|
|
83
|
+
await tsWatch?.stop();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The shell: the prebuilt shell bundle and the typed API.
|
|
87
|
+
*
|
|
88
|
+
* Seam for side-effecting APIs (assistant, capture, standards fixes): before any handler with
|
|
89
|
+
* side effects is registered here, add a `websocketAdmission`/`requestAdmission` that accepts
|
|
90
|
+
* only the shell's own origin, and keep surface mode's strict authority validation.
|
|
91
|
+
*/
|
|
92
|
+
async createShellSurface() {
|
|
93
|
+
return {
|
|
94
|
+
name: 'shell',
|
|
95
|
+
match: {
|
|
96
|
+
hostnameResolver: acceptAnyHostname,
|
|
97
|
+
pathPrefixes: [shellPathPrefix, '/wcctools-route'],
|
|
98
|
+
},
|
|
99
|
+
bundledContent: await loadShellContent(paths.distShellDir),
|
|
100
|
+
spaFallback: true,
|
|
101
|
+
httpTypedRouter: this.api.typedrouter,
|
|
102
|
+
typedRequestPath: `${shellPathPrefix}/typedrequest`,
|
|
103
|
+
noCache: true,
|
|
104
|
+
securityHeaders,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The preview: the catalog's own document and bundle from the tswatch serve directory, on
|
|
109
|
+
* the root paths it was written for. Its live reload client is injected into its document
|
|
110
|
+
* only, so a rebuilt bundle reloads the preview frame and never the shell.
|
|
111
|
+
*/
|
|
112
|
+
createPreviewSurface(serveDirArg) {
|
|
113
|
+
return {
|
|
114
|
+
name: 'preview',
|
|
115
|
+
match: {
|
|
116
|
+
hostnameResolver: acceptAnyHostname,
|
|
117
|
+
pathPrefixes: ['/'],
|
|
118
|
+
},
|
|
119
|
+
serveDir: serveDirArg,
|
|
120
|
+
spaFallback: true,
|
|
121
|
+
injectReload: true,
|
|
122
|
+
watch: true,
|
|
123
|
+
// Lets the reload client get pushed changes instead of polling
|
|
124
|
+
websocketTypedRouter: new plugins.typedrequest.TypedRouter(),
|
|
125
|
+
// As tswatch serves catalogs
|
|
126
|
+
cors: true,
|
|
127
|
+
httpHandler: async (contextArg) => {
|
|
128
|
+
if (contextArg.path === '/' && (contextArg.method === 'GET' || contextArg.method === 'HEAD')) {
|
|
129
|
+
return new Response(null, { status: 302, headers: { Location: `${shellPathPrefix}/` } });
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
},
|
|
133
|
+
noCache: true,
|
|
134
|
+
securityHeaders,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async readProjectName(cwdArg) {
|
|
138
|
+
const packageJson = JSON.parse(await plugins.fs.readFile(plugins.path.join(cwdArg, 'package.json'), 'utf8'));
|
|
139
|
+
return packageJson.name ?? plugins.path.basename(cwdArg);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kZXZzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmRldnNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWF0RSwwRkFBMEY7QUFDMUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQztBQUV4Qyw4RkFBOEY7QUFDOUYsTUFBTSxlQUFlLEdBQXlDO0lBQzVELHVCQUF1QixFQUFFLGFBQWE7SUFDdEMseUJBQXlCLEVBQUUsY0FBYztDQUMxQyxDQUFDO0FBRUYsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFFckM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQU9NO0lBTjdCLDZGQUE2RjtJQUM3RSxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUM5QixPQUFPLEdBQW1DLElBQUksQ0FBQztJQUMvQyxXQUFXLEdBQTJDLElBQUksQ0FBQztJQUNsRCxTQUFTLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRS9FLFlBQTZCLFVBQWdDLEVBQUU7UUFBbEMsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMs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
|
package/dist_ts/cli.d.ts
ADDED
package/dist_ts/cli.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { commitinfo } from './00_commitinfo_data.js';
|
|
3
|
+
import { WccDevServer } from './classes.devserver.js';
|
|
4
|
+
import { StandardConfigError, StandardUsageError, registerStandardCommands } from './standards/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Registers the wcctools commands on the given console.
|
|
7
|
+
*/
|
|
8
|
+
export const registerCommands = (out) => {
|
|
9
|
+
out.cli.configure({
|
|
10
|
+
name: 'wcctools',
|
|
11
|
+
version: commitinfo.version,
|
|
12
|
+
description: 'Develop a web component catalog in the wcctools shell',
|
|
13
|
+
});
|
|
14
|
+
out.cli.command({
|
|
15
|
+
name: 'dev',
|
|
16
|
+
description: 'Bundle the catalog with live reload and serve it in the wcctools shell',
|
|
17
|
+
options: {
|
|
18
|
+
port: {
|
|
19
|
+
type: 'number',
|
|
20
|
+
description: 'Port to listen on (0 picks a free port); overrides the tswatch configuration',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
}, async ({ options }) => {
|
|
24
|
+
const devServer = new WccDevServer({ port: options.port });
|
|
25
|
+
const address = await devServer.start();
|
|
26
|
+
await out.log(`wcctools dev: ${address.url}`);
|
|
27
|
+
});
|
|
28
|
+
registerStandardCommands(out);
|
|
29
|
+
out.cli.default({}, async () => {
|
|
30
|
+
await out.log(out.cli.renderHelp());
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
export const runCli = async () => {
|
|
34
|
+
const out = new plugins.smartconsole.SmartConsole();
|
|
35
|
+
try {
|
|
36
|
+
registerCommands(out);
|
|
37
|
+
await out.cli.run();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
await out.error(error instanceof Error ? error.message : String(error));
|
|
41
|
+
// Configuration and usage errors exit with 2, every other failure with 1.
|
|
42
|
+
const usageError = error instanceof plugins.smartconsole.CliUsageError
|
|
43
|
+
|| error instanceof StandardConfigError
|
|
44
|
+
|| error instanceof StandardUsageError;
|
|
45
|
+
process.exitCode = usageError ? 2 : 1;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
await out.dispose();
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFekc7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQXNDLEVBQVEsRUFBRTtJQUMvRSxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUNoQixJQUFJLEVBQUUsVUFBVTtRQUNoQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87UUFDM0IsV0FBVyxFQUFFLHVEQUF1RDtLQUNyRSxDQUFDLENBQUM7SUFFSCxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUNkLElBQUksRUFBRSxLQUFLO1FBQ1gsV0FBVyxFQUFFLHdFQUF3RTtRQUNyRixPQUFPLEVBQUU7WUFDUCxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDhFQUE4RTthQUM1RjtTQUNGO0tBQ0YsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFFSCx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5QixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDN0IsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxLQUFLLElBQUksRUFBRTtJQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEQsSUFBSSxDQUFDO1FBQ0gsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLDBFQUEwRTtRQUMxRSxNQUFNLFVBQVUsR0FBRyxLQUFLLFlBQVksT0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhO2VBQ2pFLEtBQUssWUFBWSxtQkFBbUI7ZUFDcEMsS0FBSyxZQUFZLGtCQUFrQixDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDLENBQUMifQ==
|
package/dist_ts/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { runCli } from './cli.js';
|
|
2
|
+
export { WccDevServer } from './classes.devserver.js';
|
|
3
|
+
export { WccDevApi } from './classes.devapi.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxZQUFZLEVBQXdELE1BQU0sd0JBQXdCLENBQUM7QUFDNUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDIn0=
|
package/dist_ts/paths.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
/** The root of the installed wcctools package. */
|
|
3
|
+
export const packageDir = plugins.path.resolve(plugins.path.dirname(plugins.url.fileURLToPath(import.meta.url)), '..');
|
|
4
|
+
/** The prebuilt shell bundle the package ships. */
|
|
5
|
+
export const distShellDir = plugins.path.join(packageDir, 'dist_shell');
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUV2SCxtREFBbUQ7QUFDbkQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as childProcess from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as fsSync from 'node:fs';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import * as url from 'node:url';
|
|
6
|
+
export { childProcess, fs, fsSync, path, url };
|
|
7
|
+
import * as typedrequest from '@api.global/typedrequest';
|
|
8
|
+
import * as typedserver from '@api.global/typedserver';
|
|
9
|
+
export { typedrequest, typedserver };
|
|
10
|
+
import * as tswatch from '@git.zone/tswatch';
|
|
11
|
+
export { tswatch };
|
|
12
|
+
import * as smartconfig from '@push.rocks/smartconfig';
|
|
13
|
+
import * as smartconsole from '@push.rocks/smartconsole';
|
|
14
|
+
import * as smartexit from '@push.rocks/smartexit';
|
|
15
|
+
export { smartconfig, smartconsole, smartexit };
|
|
16
|
+
import typescript from 'typescript';
|
|
17
|
+
export { typescript };
|
|
18
|
+
import * as interfaces from '../dist_ts_interfaces/index.js';
|
|
19
|
+
import * as shared from '../dist_ts_shared/index.js';
|
|
20
|
+
export { interfaces, shared };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// node native scope
|
|
2
|
+
import * as childProcess from 'node:child_process';
|
|
3
|
+
import * as fs from 'node:fs/promises';
|
|
4
|
+
import * as fsSync from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import * as url from 'node:url';
|
|
7
|
+
export { childProcess, fs, fsSync, path, url };
|
|
8
|
+
// @api.global scope
|
|
9
|
+
import * as typedrequest from '@api.global/typedrequest';
|
|
10
|
+
import * as typedserver from '@api.global/typedserver';
|
|
11
|
+
export { typedrequest, typedserver };
|
|
12
|
+
// @git.zone scope
|
|
13
|
+
import * as tswatch from '@git.zone/tswatch';
|
|
14
|
+
export { tswatch };
|
|
15
|
+
// @push.rocks scope
|
|
16
|
+
import * as smartconfig from '@push.rocks/smartconfig';
|
|
17
|
+
import * as smartconsole from '@push.rocks/smartconsole';
|
|
18
|
+
import * as smartexit from '@push.rocks/smartexit';
|
|
19
|
+
export { smartconfig, smartconsole, smartexit };
|
|
20
|
+
// third party scope
|
|
21
|
+
import typescript from 'typescript';
|
|
22
|
+
export { typescript };
|
|
23
|
+
// project scope
|
|
24
|
+
import * as interfaces from '../dist_ts_interfaces/index.js';
|
|
25
|
+
import * as shared from '../dist_ts_shared/index.js';
|
|
26
|
+
export { interfaces, shared };
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEtBQUssTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUVoQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRS9DLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUVyQyxrQkFBa0I7QUFDbEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFFbkIsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBRWhELG9CQUFvQjtBQUNwQixPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFFcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBRXRCLGdCQUFnQjtBQUNoQixPQUFPLEtBQUssVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sS0FBSyxNQUFNLE1BQU0sdUJBQXVCLENBQUM7QUFFaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
/** The path below which the shell surface serves the shell bundle. */
|
|
3
|
+
export declare const shellPathPrefix = "/wcctools";
|
|
4
|
+
/**
|
|
5
|
+
* The prebuilt shell bundle as in-memory content of the shell surface. A surface serves files
|
|
6
|
+
* by their full request path, so every file is keyed below `wcctools/`; the shell page is
|
|
7
|
+
* also keyed as `index.html`, which the surface's SPA fallback answers `/wcctools-route/...` with.
|
|
8
|
+
*/
|
|
9
|
+
export declare const loadShellContent: (distShellDirArg: string) => Promise<plugins.typedserver.IBundledContentItem[]>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
/** The path below which the shell surface serves the shell bundle. */
|
|
3
|
+
export const shellPathPrefix = '/wcctools';
|
|
4
|
+
const collectFiles = async (dirArg, relativeDirArg = '') => {
|
|
5
|
+
const entries = await plugins.fs.readdir(plugins.path.join(dirArg, relativeDirArg), { withFileTypes: true });
|
|
6
|
+
const files = [];
|
|
7
|
+
for (const entry of entries) {
|
|
8
|
+
const relativePath = relativeDirArg ? `${relativeDirArg}/${entry.name}` : entry.name;
|
|
9
|
+
if (entry.isDirectory()) {
|
|
10
|
+
files.push(...await collectFiles(dirArg, relativePath));
|
|
11
|
+
}
|
|
12
|
+
else if (entry.isFile()) {
|
|
13
|
+
files.push(relativePath);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return files;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The prebuilt shell bundle as in-memory content of the shell surface. A surface serves files
|
|
20
|
+
* by their full request path, so every file is keyed below `wcctools/`; the shell page is
|
|
21
|
+
* also keyed as `index.html`, which the surface's SPA fallback answers `/wcctools-route/...` with.
|
|
22
|
+
*/
|
|
23
|
+
export const loadShellContent = async (distShellDirArg) => {
|
|
24
|
+
const indexPath = plugins.path.join(distShellDirArg, 'index.html');
|
|
25
|
+
try {
|
|
26
|
+
await plugins.fs.access(indexPath);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new Error(`wcctools: the shell bundle is missing (${indexPath}); build the package with "pnpm build".`);
|
|
30
|
+
}
|
|
31
|
+
const prefix = shellPathPrefix.slice(1);
|
|
32
|
+
const content = [];
|
|
33
|
+
for (const relativePath of await collectFiles(distShellDirArg)) {
|
|
34
|
+
const contentBase64 = (await plugins.fs.readFile(plugins.path.join(distShellDirArg, relativePath))).toString('base64');
|
|
35
|
+
content.push({ path: `${prefix}/${relativePath}`, contentBase64 });
|
|
36
|
+
if (relativePath === 'index.html') {
|
|
37
|
+
content.push({ path: 'index.html', contentBase64 });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return content;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGxjb250ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvc2hlbGxjb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDO0FBRTNDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxNQUFjLEVBQUUsY0FBYyxHQUFHLEVBQUUsRUFBcUIsRUFBRTtJQUNwRixNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdHLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3JGLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLEVBQUUsZUFBdUIsRUFBc0QsRUFBRTtJQUNwSCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsU0FBUyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUE4QyxFQUFFLENBQUM7SUFDOUQsS0FBSyxNQUFNLFlBQVksSUFBSSxNQUFNLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQy9ELE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2SCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLFlBQVksRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxZQUFZLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
type IStandardConfig = plugins.interfaces.IStandardConfig;
|
|
3
|
+
type IStandardReport = plugins.interfaces.IStandardReport;
|
|
4
|
+
type TBaselines = NonNullable<IStandardConfig['baselines']>;
|
|
5
|
+
/** `--init-baseline`: the current error counts of every rule. Only valid while the configuration has no baselines. */
|
|
6
|
+
export declare const initialBaselines: (reportArg: IStandardReport) => TBaselines;
|
|
7
|
+
export interface IBaselineRaise {
|
|
8
|
+
ruleId: string;
|
|
9
|
+
file: string;
|
|
10
|
+
baseline: number;
|
|
11
|
+
current: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* `--update-baseline`: lowers every count to the current one and removes entries that reach 0.
|
|
15
|
+
* `raised` lists every file whose count would have to grow, including files without an entry;
|
|
16
|
+
* when it is not empty the update is refused.
|
|
17
|
+
*/
|
|
18
|
+
export declare const updatedBaselines: (reportArg: IStandardReport, baselinesArg: TBaselines) => {
|
|
19
|
+
baselines: TBaselines;
|
|
20
|
+
raised: IBaselineRaise[];
|
|
21
|
+
};
|
|
22
|
+
/** The configuration with allowlist and baseline file paths moved along with `wcctools fix` moves. */
|
|
23
|
+
export declare const rekeyStandardConfig: (configArg: IStandardConfig, movesArg: readonly plugins.interfaces.IStandardFileMove[]) => {
|
|
24
|
+
config: IStandardConfig;
|
|
25
|
+
changed: string[];
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { allowlistStaleRuleId } from './rules/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Baseline arithmetic of the ratchet. Pure functions: persisting the result goes through
|
|
5
|
+
* IStandardConfigWriter (see config.ts).
|
|
6
|
+
*/
|
|
7
|
+
/** Per rule and file, the error findings a baseline would have to accept (allowlisted findings excluded). */
|
|
8
|
+
const errorCounts = (reportArg) => {
|
|
9
|
+
const counts = {};
|
|
10
|
+
for (const finding of reportArg.findings) {
|
|
11
|
+
if (finding.severity !== 'error' || finding.covered === 'allowlist' || finding.ruleId === allowlistStaleRuleId) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
counts[finding.ruleId] ??= {};
|
|
15
|
+
counts[finding.ruleId][finding.file] = (counts[finding.ruleId][finding.file] ?? 0) + 1;
|
|
16
|
+
}
|
|
17
|
+
return counts;
|
|
18
|
+
};
|
|
19
|
+
const sortBaselines = (baselinesArg) => {
|
|
20
|
+
const sorted = {};
|
|
21
|
+
for (const ruleId of Object.keys(baselinesArg).sort()) {
|
|
22
|
+
const files = Object.keys(baselinesArg[ruleId]).sort();
|
|
23
|
+
if (files.length > 0) {
|
|
24
|
+
sorted[ruleId] = Object.fromEntries(files.map((fileArg) => [fileArg, baselinesArg[ruleId][fileArg]]));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return sorted;
|
|
28
|
+
};
|
|
29
|
+
/** `--init-baseline`: the current error counts of every rule. Only valid while the configuration has no baselines. */
|
|
30
|
+
export const initialBaselines = (reportArg) => sortBaselines(errorCounts(reportArg));
|
|
31
|
+
/**
|
|
32
|
+
* `--update-baseline`: lowers every count to the current one and removes entries that reach 0.
|
|
33
|
+
* `raised` lists every file whose count would have to grow, including files without an entry;
|
|
34
|
+
* when it is not empty the update is refused.
|
|
35
|
+
*/
|
|
36
|
+
export const updatedBaselines = (reportArg, baselinesArg) => {
|
|
37
|
+
const current = errorCounts(reportArg);
|
|
38
|
+
const raised = [];
|
|
39
|
+
const baselines = {};
|
|
40
|
+
for (const [ruleId, counts] of Object.entries(baselinesArg)) {
|
|
41
|
+
baselines[ruleId] = {};
|
|
42
|
+
for (const [file, baseline] of Object.entries(counts)) {
|
|
43
|
+
const count = current[ruleId]?.[file] ?? 0;
|
|
44
|
+
if (count > baseline) {
|
|
45
|
+
raised.push({ ruleId, file, baseline, current: count });
|
|
46
|
+
}
|
|
47
|
+
else if (count > 0) {
|
|
48
|
+
baselines[ruleId][file] = count;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const [ruleId, counts] of Object.entries(current)) {
|
|
53
|
+
for (const [file, count] of Object.entries(counts)) {
|
|
54
|
+
if (baselinesArg[ruleId]?.[file] === undefined) {
|
|
55
|
+
raised.push({ ruleId, file, baseline: 0, current: count });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { baselines: sortBaselines(baselines), raised };
|
|
60
|
+
};
|
|
61
|
+
/** The configuration with allowlist and baseline file paths moved along with `wcctools fix` moves. */
|
|
62
|
+
export const rekeyStandardConfig = (configArg, movesArg) => {
|
|
63
|
+
const moved = new Map(movesArg.map((moveArg) => [moveArg.from, moveArg.to]));
|
|
64
|
+
const changed = [];
|
|
65
|
+
const rekey = (keyArg) => {
|
|
66
|
+
const [file, ...member] = keyArg.split('#');
|
|
67
|
+
const target = moved.get(file);
|
|
68
|
+
if (!target) {
|
|
69
|
+
return keyArg;
|
|
70
|
+
}
|
|
71
|
+
changed.push(keyArg);
|
|
72
|
+
return [target, ...member].join('#');
|
|
73
|
+
};
|
|
74
|
+
const config = { ...configArg };
|
|
75
|
+
if (configArg.allowlist) {
|
|
76
|
+
config.allowlist = Object.fromEntries(Object.entries(configArg.allowlist).map(([ruleId, entries]) => [ruleId, Object.fromEntries(Object.entries(entries).map(([key, value]) => [rekey(key), value]))]));
|
|
77
|
+
}
|
|
78
|
+
if (configArg.baselines) {
|
|
79
|
+
config.baselines = Object.fromEntries(Object.entries(configArg.baselines).map(([ruleId, counts]) => [ruleId, Object.fromEntries(Object.entries(counts).map(([file, count]) => [rekey(file), count]))]));
|
|
80
|
+
}
|
|
81
|
+
return { config, changed };
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZWxpbmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvc3RhbmRhcmRzL2Jhc2VsaW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQU14RDs7O0dBR0c7QUFFSCw2R0FBNkc7QUFDN0csTUFBTSxXQUFXLEdBQUcsQ0FBQyxTQUEwQixFQUFjLEVBQUU7SUFDN0QsTUFBTSxNQUFNLEdBQWUsRUFBRSxDQUFDO0lBQzlCLEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1lBQy9HLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLENBQUMsWUFBd0IsRUFBYyxFQUFFO0lBQzdELE1BQU0sTUFBTSxHQUFlLEVBQUUsQ0FBQztJQUM5QixLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEtB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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type { StandardProject } from './classes.standardproject.js';
|
|
3
|
+
import type { ILoadedStandardConfig } from './config.js';
|
|
4
|
+
import { type IRuleFinding, type IStandardRule } from './rule.js';
|
|
5
|
+
type IStandardReport = plugins.interfaces.IStandardReport;
|
|
6
|
+
type TStandardProfile = plugins.interfaces.TStandardProfile;
|
|
7
|
+
/** The rules of a profile, in the order of docs/standard.md. */
|
|
8
|
+
export declare const rulesOfProfile: (profileArg: TStandardProfile) => IStandardRule[];
|
|
9
|
+
/** The rules of a profile as the shell and the AI agent see them. */
|
|
10
|
+
export declare const describeStandardRules: (profileArg: TStandardProfile) => plugins.interfaces.IStandardRuleInfo[];
|
|
11
|
+
/** A finding of one rule with its allowlist state. */
|
|
12
|
+
export interface IDetectedFinding {
|
|
13
|
+
rule: IStandardRule;
|
|
14
|
+
finding: IRuleFinding;
|
|
15
|
+
allowlisted: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Runs the rules of the configured profile; findings carry their fix actions. */
|
|
18
|
+
export declare const detectFindings: (projectArg: StandardProject, loadedArg: ILoadedStandardConfig, rulesArg?: readonly IStandardRule[]) => IDetectedFinding[];
|
|
19
|
+
/** Checks a repository against the standard: findings, allowlist, baselines. */
|
|
20
|
+
export declare const checkStandard: (projectArg: StandardProject, loadedArg: ILoadedStandardConfig) => IStandardReport;
|
|
21
|
+
export {};
|