@design.estate/wcctools 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +33 -0
- package/dist_shell/bundle.js +405 -368
- package/dist_shell/bundle.js.map +1 -1
- package/dist_shell/bundle.js.third-party-notices.json +52 -0
- package/dist_shell/bundle.js.third-party-notices.txt +107 -1
- package/dist_shell/index.html +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.bundlestatus.d.ts +36 -0
- package/dist_ts/classes.bundlestatus.js +110 -0
- package/dist_ts/classes.devapi.d.ts +3 -0
- package/dist_ts/classes.devapi.js +8 -1
- package/dist_ts/classes.devserver.d.ts +45 -10
- package/dist_ts/classes.devserver.js +123 -49
- package/dist_ts/cli.js +12 -3
- package/dist_ts/index.d.ts +0 -2
- package/dist_ts/index.js +1 -3
- package/dist_ts/plugins.d.ts +7 -2
- package/dist_ts/plugins.js +9 -3
- package/dist_ts/standards/baselines.d.ts +27 -0
- package/dist_ts/standards/baselines.js +83 -0
- package/dist_ts/standards/checker.d.ts +21 -0
- package/dist_ts/standards/checker.js +88 -0
- package/dist_ts/standards/classes.gitrepo.d.ts +13 -0
- package/dist_ts/standards/classes.gitrepo.js +43 -0
- package/dist_ts/standards/classes.sourceedits.d.ts +15 -0
- package/dist_ts/standards/classes.sourceedits.js +54 -0
- package/dist_ts/standards/classes.standardfixer.d.ts +40 -0
- package/dist_ts/standards/classes.standardfixer.js +210 -0
- package/dist_ts/standards/classes.standardproject.d.ts +80 -0
- package/dist_ts/standards/classes.standardproject.js +195 -0
- package/dist_ts/standards/classes.standardtree.d.ts +56 -0
- package/dist_ts/standards/classes.standardtree.js +207 -0
- package/dist_ts/standards/cli.d.ts +7 -0
- package/dist_ts/standards/cli.js +89 -0
- package/dist_ts/standards/config.d.ts +33 -0
- package/dist_ts/standards/config.js +139 -0
- package/dist_ts/standards/errors.d.ts +9 -0
- package/dist_ts/standards/errors.js +17 -0
- package/dist_ts/standards/helpers.ast.d.ts +56 -0
- package/dist_ts/standards/helpers.ast.js +172 -0
- package/dist_ts/standards/helpers.paths.d.ts +36 -0
- package/dist_ts/standards/helpers.paths.js +86 -0
- package/dist_ts/standards/index.d.ts +14 -0
- package/dist_ts/standards/index.js +15 -0
- package/dist_ts/standards/output.d.ts +7 -0
- package/dist_ts/standards/output.js +57 -0
- package/dist_ts/standards/ratchet.d.ts +15 -0
- package/dist_ts/standards/ratchet.js +45 -0
- package/dist_ts/standards/rule.d.ts +50 -0
- package/dist_ts/standards/rule.js +9 -0
- package/dist_ts/standards/rules/barrel.element-index.d.ts +7 -0
- package/dist_ts/standards/rules/barrel.element-index.js +108 -0
- package/dist_ts/standards/rules/barrel.no-demo-export.d.ts +3 -0
- package/dist_ts/standards/rules/barrel.no-demo-export.js +29 -0
- package/dist_ts/standards/rules/demo.fixture-not-exported.d.ts +3 -0
- package/dist_ts/standards/rules/demo.fixture-not-exported.js +29 -0
- package/dist_ts/standards/rules/demo.groups.d.ts +6 -0
- package/dist_ts/standards/rules/demo.groups.js +72 -0
- package/dist_ts/standards/rules/demo.required.d.ts +3 -0
- package/dist_ts/standards/rules/demo.required.js +48 -0
- package/dist_ts/standards/rules/demo.separate-file.d.ts +3 -0
- package/dist_ts/standards/rules/demo.separate-file.js +38 -0
- package/dist_ts/standards/rules/demo.shape.d.ts +3 -0
- package/dist_ts/standards/rules/demo.shape.js +38 -0
- package/dist_ts/standards/rules/docs.component-index.d.ts +8 -0
- package/dist_ts/standards/rules/docs.component-index.js +84 -0
- package/dist_ts/standards/rules/element.exported.d.ts +3 -0
- package/dist_ts/standards/rules/element.exported.js +33 -0
- package/dist_ts/standards/rules/element.literal-tag.d.ts +3 -0
- package/dist_ts/standards/rules/element.literal-tag.js +30 -0
- package/dist_ts/standards/rules/element.reachable.d.ts +3 -0
- package/dist_ts/standards/rules/element.reachable.js +48 -0
- package/dist_ts/standards/rules/element.tag-map.d.ts +3 -0
- package/dist_ts/standards/rules/element.tag-map.js +83 -0
- package/dist_ts/standards/rules/i18n.literals.d.ts +3 -0
- package/dist_ts/standards/rules/i18n.literals.js +52 -0
- package/dist_ts/standards/rules/index.d.ts +12 -0
- package/dist_ts/standards/rules/index.js +83 -0
- package/dist_ts/standards/rules/layout.element-folder.d.ts +3 -0
- package/dist_ts/standards/rules/layout.element-folder.js +47 -0
- package/dist_ts/standards/rules/layout.entry-file-name.d.ts +3 -0
- package/dist_ts/standards/rules/layout.entry-file-name.js +71 -0
- package/dist_ts/standards/rules/layout.entry.d.ts +3 -0
- package/dist_ts/standards/rules/layout.entry.js +38 -0
- package/dist_ts/standards/rules/layout.group-folder.d.ts +3 -0
- package/dist_ts/standards/rules/layout.group-folder.js +22 -0
- package/dist_ts/standards/rules/layout.shared-00.d.ts +3 -0
- package/dist_ts/standards/rules/layout.shared-00.js +36 -0
- package/dist_ts/standards/rules/naming.class-matches-tag.d.ts +3 -0
- package/dist_ts/standards/rules/naming.class-matches-tag.js +26 -0
- package/dist_ts/standards/rules/naming.lowercase-files.d.ts +3 -0
- package/dist_ts/standards/rules/naming.lowercase-files.js +26 -0
- package/dist_ts/standards/rules/naming.tag-prefix.d.ts +3 -0
- package/dist_ts/standards/rules/naming.tag-prefix.js +23 -0
- package/dist_ts/standards/rules/props.accessor.d.ts +3 -0
- package/dist_ts/standards/rules/props.accessor.js +35 -0
- package/dist_ts/standards/rules/props.object-no-attribute.d.ts +3 -0
- package/dist_ts/standards/rules/props.object-no-attribute.js +42 -0
- package/dist_ts/standards/rules/props.reflect-primitive.d.ts +5 -0
- package/dist_ts/standards/rules/props.reflect-primitive.js +41 -0
- package/dist_ts/standards/rules/props.typed.d.ts +6 -0
- package/dist_ts/standards/rules/props.typed.js +64 -0
- package/dist_ts/standards/rules/shared.d.ts +38 -0
- package/dist_ts/standards/rules/shared.js +103 -0
- package/dist_ts/standards/rules/style.bdtheme.d.ts +5 -0
- package/dist_ts/standards/rules/style.bdtheme.js +28 -0
- package/dist_ts_interfaces/index.d.ts +1 -0
- package/dist_ts_interfaces/index.js +2 -1
- package/dist_ts_interfaces/requests.d.ts +35 -0
- package/dist_ts_interfaces/standard.d.ts +93 -0
- package/dist_ts_interfaces/standard.js +6 -0
- package/dist_ts_shell/bundlestatus.d.ts +15 -0
- package/dist_ts_shell/bundlestatus.js +64 -0
- package/dist_ts_shell/elements/wcc-contextmenu.d.ts +3 -0
- package/dist_ts_shell/elements/wcc-contextmenu.js +18 -3
- package/dist_ts_shell/elements/wcc-preview-frame.d.ts +6 -0
- package/dist_ts_shell/elements/wcc-preview-frame.js +50 -2
- package/dist_ts_shell/elements/wcc-shell.d.ts +15 -0
- package/dist_ts_shell/elements/wcc-shell.js +45 -3
- package/dist_ts_shell/plugins.d.ts +2 -1
- package/dist_ts_shell/plugins.js +3 -2
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +8 -3
- package/readme.md +40 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.bundlestatus.ts +123 -0
- package/ts/classes.devapi.ts +9 -0
- package/ts/classes.devserver.ts +127 -47
- package/ts/cli.ts +12 -2
- package/ts/index.ts +0 -2
- package/ts/plugins.ts +10 -2
- package/ts/standards/baselines.ts +100 -0
- package/ts/standards/checker.ts +114 -0
- package/ts/standards/classes.gitrepo.ts +48 -0
- package/ts/standards/classes.sourceedits.ts +58 -0
- package/ts/standards/classes.standardfixer.ts +234 -0
- package/ts/standards/classes.standardproject.ts +250 -0
- package/ts/standards/classes.standardtree.ts +220 -0
- package/ts/standards/cli.ts +86 -0
- package/ts/standards/config.ts +160 -0
- package/ts/standards/errors.ts +18 -0
- package/ts/standards/helpers.ast.ts +208 -0
- package/ts/standards/helpers.paths.ts +119 -0
- package/ts/standards/index.ts +22 -0
- package/ts/standards/output.ts +65 -0
- package/ts/standards/ratchet.ts +63 -0
- package/ts/standards/rule.ts +58 -0
- package/ts/standards/rules/barrel.element-index.ts +112 -0
- package/ts/standards/rules/barrel.no-demo-export.ts +30 -0
- package/ts/standards/rules/demo.fixture-not-exported.ts +30 -0
- package/ts/standards/rules/demo.groups.ts +74 -0
- package/ts/standards/rules/demo.required.ts +49 -0
- package/ts/standards/rules/demo.separate-file.ts +40 -0
- package/ts/standards/rules/demo.shape.ts +42 -0
- package/ts/standards/rules/docs.component-index.ts +88 -0
- package/ts/standards/rules/element.exported.ts +35 -0
- package/ts/standards/rules/element.literal-tag.ts +30 -0
- package/ts/standards/rules/element.reachable.ts +49 -0
- package/ts/standards/rules/element.tag-map.ts +87 -0
- package/ts/standards/rules/i18n.literals.ts +58 -0
- package/ts/standards/rules/index.ts +87 -0
- package/ts/standards/rules/layout.element-folder.ts +49 -0
- package/ts/standards/rules/layout.entry-file-name.ts +73 -0
- package/ts/standards/rules/layout.entry.ts +40 -0
- package/ts/standards/rules/layout.group-folder.ts +23 -0
- package/ts/standards/rules/layout.shared-00.ts +37 -0
- package/ts/standards/rules/naming.class-matches-tag.ts +27 -0
- package/ts/standards/rules/naming.lowercase-files.ts +27 -0
- package/ts/standards/rules/naming.tag-prefix.ts +24 -0
- package/ts/standards/rules/props.accessor.ts +37 -0
- package/ts/standards/rules/props.object-no-attribute.ts +45 -0
- package/ts/standards/rules/props.reflect-primitive.ts +44 -0
- package/ts/standards/rules/props.typed.ts +70 -0
- package/ts/standards/rules/shared.ts +127 -0
- package/ts/standards/rules/style.bdtheme.ts +31 -0
- package/ts_interfaces/bridge.ts +95 -0
- package/ts_interfaces/catalog.ts +37 -0
- package/ts_interfaces/index.ts +4 -0
- package/ts_interfaces/plugins.ts +3 -0
- package/ts_interfaces/requests.ts +65 -0
- package/ts_interfaces/standard.ts +103 -0
- package/ts_shared/index.ts +1 -0
- package/ts_shared/plugins.ts +3 -0
- package/ts_shared/previewroute.ts +58 -0
- package/ts_shell/bundlestatus.ts +68 -0
- package/ts_shell/elements/wcc-contextmenu.ts +306 -0
- package/ts_shell/elements/wcc-preview-frame.ts +167 -0
- package/ts_shell/elements/wcc-properties.ts +998 -0
- package/ts_shell/elements/wcc-record-button.ts +108 -0
- package/ts_shell/elements/wcc-recording-panel.ts +1005 -0
- package/ts_shell/elements/wcc-shell.ts +485 -0
- package/ts_shell/elements/wcc-sidebar.ts +1419 -0
- package/ts_shell/index.html +21 -0
- package/ts_shell/index.ts +4 -0
- package/ts_shell/plugins.ts +12 -0
- package/ts_shell/previewconnection.ts +103 -0
- package/ts_shell/services/recorder.service.ts +451 -0
- package/ts_shell/types/dom-mediacapture-stub/index.d.ts +12 -0
- package/ts_shell/types/dom-mediacapture-stub/package.json +6 -0
- package/ts_shell/types/dom-webcodecs-stub/index.d.ts +2 -0
- package/ts_shell/types/dom-webcodecs-stub/package.json +6 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -13,81 +13,155 @@ const securityHeaders = {
|
|
|
13
13
|
};
|
|
14
14
|
const acceptAnyHostname = () => true;
|
|
15
15
|
/**
|
|
16
|
-
* `wcctools dev`: bundles the catalog of
|
|
17
|
-
*
|
|
16
|
+
* `wcctools dev`: bundles the catalog of a project with tswatch, as its `@git.zone/tswatch`
|
|
17
|
+
* configuration (or the `element` preset) describes, and serves on one port:
|
|
18
18
|
*
|
|
19
19
|
* - the shell on `/wcctools/` (`/` redirects there) and its routes `/wcctools-route/...`,
|
|
20
|
-
* - the typed API on `/wcctools/typedrequest`,
|
|
20
|
+
* - the typed API on `/wcctools/typedrequest`, including the bundles' status,
|
|
21
21
|
* - the catalog's preview document and bundle from the tswatch serve directory on every other
|
|
22
22
|
* path, with live reload that reloads only the preview document.
|
|
23
23
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
24
|
+
* The server owns no process lifecycle: while it runs, a process shutdown through smartexit's
|
|
25
|
+
* `ProcessLifecycle` stops it. The entry point installs that lifecycle with
|
|
26
|
+
* `getShutdownTimeoutMs()`.
|
|
26
27
|
*/
|
|
27
28
|
export class WccDevServer {
|
|
28
29
|
options;
|
|
29
30
|
/** The typed API on `/wcctools/typedrequest`; register further handlers before `start()`. */
|
|
30
31
|
api = new WccDevApi();
|
|
31
|
-
|
|
32
|
+
/** The project directory everything resolves against. */
|
|
33
|
+
cwd;
|
|
34
|
+
/** The project's tswatch configuration, or the `element` preset; read once, on construction. */
|
|
35
|
+
config;
|
|
36
|
+
/** Bundling and watching stay tswatch's; its own server stays off. */
|
|
37
|
+
tsWatch;
|
|
32
38
|
typedServer = null;
|
|
33
|
-
|
|
39
|
+
/** Stops the server on a process shutdown; registered by start(), released by stop(). */
|
|
40
|
+
smartExit = null;
|
|
41
|
+
unsubscribeBundleEvents = null;
|
|
42
|
+
running = false;
|
|
43
|
+
starting = null;
|
|
44
|
+
stopping = null;
|
|
34
45
|
constructor(options = {}) {
|
|
35
46
|
this.options = options;
|
|
36
|
-
this.
|
|
47
|
+
this.cwd = plugins.path.resolve(options.cwd ?? process.cwd());
|
|
48
|
+
const configHandler = new plugins.tswatch.ConfigHandler(this.cwd);
|
|
49
|
+
this.config = configHandler.loadConfig() ?? this.getElementPreset(configHandler);
|
|
50
|
+
this.tsWatch = new plugins.tswatch.TsWatch({ ...this.config, server: { enabled: false } }, { cwd: this.cwd });
|
|
37
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* The shutdown deadline the server needs, tswatch's: the entry point installs smartexit's
|
|
54
|
+
* `ProcessLifecycle` with it, so every watcher command keeps its full grace period.
|
|
55
|
+
*/
|
|
56
|
+
getShutdownTimeoutMs() {
|
|
57
|
+
return this.tsWatch.getShutdownTimeoutMs();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Bundles the catalog, starts the watchers and serves. Refused while the server runs or stops;
|
|
61
|
+
* the server starts again after stop().
|
|
62
|
+
*/
|
|
38
63
|
async start() {
|
|
39
|
-
if (this.
|
|
40
|
-
throw new Error('wcctools: the dev server is already started.');
|
|
64
|
+
if (this.running || this.stopping) {
|
|
65
|
+
throw new Error('wcctools: the dev server is already started or still stopping.');
|
|
41
66
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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 } });
|
|
67
|
+
this.running = true;
|
|
68
|
+
// A process shutdown stops the server from here on, also while it is still starting
|
|
69
|
+
const smartExit = new plugins.smartexit.SmartExit({ silent: true });
|
|
70
|
+
smartExit.addCleanupFunction(() => this.stop());
|
|
71
|
+
this.smartExit = smartExit;
|
|
72
|
+
const starting = this.startServing();
|
|
73
|
+
this.starting = starting;
|
|
64
74
|
try {
|
|
65
|
-
await
|
|
66
|
-
|
|
75
|
+
const address = await starting;
|
|
76
|
+
if (this.stopping) {
|
|
77
|
+
throw new Error('wcctools: the dev server was stopped while starting.');
|
|
78
|
+
}
|
|
79
|
+
return address;
|
|
67
80
|
}
|
|
68
81
|
catch (error) {
|
|
82
|
+
// A start that failed halfway releases what it opened
|
|
69
83
|
await this.stop();
|
|
70
84
|
throw error;
|
|
71
85
|
}
|
|
72
|
-
|
|
73
|
-
|
|
86
|
+
finally {
|
|
87
|
+
if (this.starting === starting) {
|
|
88
|
+
this.starting = null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
74
91
|
}
|
|
75
|
-
/**
|
|
76
|
-
|
|
92
|
+
/**
|
|
93
|
+
* Stops the server and tswatch's bundling and watching, and releases everything start()
|
|
94
|
+
* registered. A stop during start() waits for the start to settle first; concurrent and
|
|
95
|
+
* repeated calls share one stop.
|
|
96
|
+
*/
|
|
97
|
+
stop() {
|
|
98
|
+
this.stopping ??= this.release().finally(() => {
|
|
99
|
+
this.stopping = null;
|
|
100
|
+
});
|
|
101
|
+
return this.stopping;
|
|
102
|
+
}
|
|
103
|
+
async release() {
|
|
104
|
+
await this.starting?.catch(() => undefined);
|
|
105
|
+
const smartExit = this.smartExit;
|
|
77
106
|
const typedServer = this.typedServer;
|
|
78
|
-
const
|
|
107
|
+
const unsubscribeBundleEvents = this.unsubscribeBundleEvents;
|
|
108
|
+
this.smartExit = null;
|
|
79
109
|
this.typedServer = null;
|
|
80
|
-
this.
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
110
|
+
this.unsubscribeBundleEvents = null;
|
|
111
|
+
smartExit?.deregister();
|
|
112
|
+
// Status requests waiting for a change are refused now, so none holds the server's stop, and
|
|
113
|
+
// requests until the server stops listening are refused too: the shell backs off
|
|
114
|
+
this.api.bundleStatus.close();
|
|
115
|
+
try {
|
|
116
|
+
await typedServer?.stop();
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
try {
|
|
120
|
+
await this.tsWatch.stop();
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
unsubscribeBundleEvents?.();
|
|
124
|
+
this.running = false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async startServing() {
|
|
129
|
+
const serveDir = plugins.path.resolve(this.cwd, this.config.server?.serveDir ?? defaultServeDir);
|
|
130
|
+
const port = this.options.port ?? this.config.server?.port ?? defaultPort;
|
|
131
|
+
// The preview surface watches the serve directory, which must exist before the first bundle
|
|
132
|
+
await plugins.fs.mkdir(serveDir, { recursive: true });
|
|
133
|
+
this.api.setServerInfo({
|
|
134
|
+
wcctoolsVersion: commitinfo.version,
|
|
135
|
+
projectName: await this.readProjectName(),
|
|
136
|
+
});
|
|
137
|
+
const surfaces = [await this.createShellSurface(), this.createPreviewSurface(serveDir)];
|
|
138
|
+
const typedServer = new plugins.typedserver.TypedServer({ cors: false, port, surfaces });
|
|
139
|
+
this.typedServer = typedServer;
|
|
140
|
+
this.api.bundleStatus.open();
|
|
141
|
+
const bundleStatus = this.api.bundleStatus;
|
|
142
|
+
this.unsubscribeBundleEvents = this.tsWatch.onBundleEvent((eventArg) => bundleStatus.record(eventArg));
|
|
143
|
+
// The initial bundles run here; a failed one is reported in the bundle status
|
|
144
|
+
await this.tsWatch.start();
|
|
145
|
+
await typedServer.start();
|
|
146
|
+
const boundPort = typedServer.listeningPort ?? port;
|
|
147
|
+
return { port: boundPort, url: `http://localhost:${boundPort}${shellPathPrefix}/` };
|
|
148
|
+
}
|
|
149
|
+
getElementPreset(configHandlerArg) {
|
|
150
|
+
const preset = configHandlerArg.getPreset('element');
|
|
151
|
+
if (!preset) {
|
|
152
|
+
throw new Error('wcctools: tswatch provides no `element` preset.');
|
|
153
|
+
}
|
|
154
|
+
return preset;
|
|
84
155
|
}
|
|
85
156
|
/**
|
|
86
157
|
* The shell: the prebuilt shell bundle and the typed API.
|
|
87
158
|
*
|
|
88
159
|
* Seam for side-effecting APIs (assistant, capture, standards fixes): before any handler with
|
|
89
|
-
* side effects is registered here,
|
|
90
|
-
* only
|
|
160
|
+
* side effects is registered here, the server binds to localhost by default (another interface
|
|
161
|
+
* only on explicit request), validates the Host header against the addresses it serves instead
|
|
162
|
+
* of accepting any hostname, and admits typedsocket connections and typed requests only from the
|
|
163
|
+
* shell's own origin (a `websocketAdmission`/`requestAdmission`), keeping surface mode's strict
|
|
164
|
+
* authority validation. Until then every handler here is read-only.
|
|
91
165
|
*/
|
|
92
166
|
async createShellSurface() {
|
|
93
167
|
return {
|
|
@@ -134,9 +208,9 @@ export class WccDevServer {
|
|
|
134
208
|
securityHeaders,
|
|
135
209
|
};
|
|
136
210
|
}
|
|
137
|
-
async readProjectName(
|
|
138
|
-
const packageJson = JSON.parse(await plugins.fs.readFile(plugins.path.join(
|
|
139
|
-
return packageJson.name ?? plugins.path.basename(
|
|
211
|
+
async readProjectName() {
|
|
212
|
+
const packageJson = JSON.parse(await plugins.fs.readFile(plugins.path.join(this.cwd, 'package.json'), 'utf8'));
|
|
213
|
+
return packageJson.name ?? plugins.path.basename(this.cwd);
|
|
140
214
|
}
|
|
141
215
|
}
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
216
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kZXZzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmRldnNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWtCdEUsMEZBQTBGO0FBQzFGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFFeEMsOEZBQThGO0FBQzlGLE1BQU0sZUFBZSxHQUF5QztJQUM1RCx1QkFBdUIsRUFBRSxhQUFhO0lBQ3RDLHlCQUF5QixFQUFFLGNBQWM7Q0FDMUMsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBRXJDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBaUJNO0lBaEI3Qiw2RkFBNkY7SUFDN0UsR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7SUFDdEMseURBQXlEO0lBQ3pDLEdBQUcsQ0FBUztJQUM1QixnR0FBZ0c7SUFDL0UsTUFBTSxDQUFpQztJQUN4RCxzRUFBc0U7SUFDckQsT0FBTyxDQUEwQjtJQUMxQyxXQUFXLEdBQTJDLElBQUksQ0FBQztJQUNuRSx5RkFBeUY7SUFDakYsU0FBUyxHQUF1QyxJQUFJLENBQUM7SUFDckQsdUJBQXVCLEdBQXdCLElBQUksQ0FBQztJQUNwRCxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLFFBQVEsR0FBeUMsSUFBSSxDQUFDO0lBQ3RELFFBQVEs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
|
package/dist_ts/cli.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import { commitinfo } from './00_commitinfo_data.js';
|
|
3
3
|
import { WccDevServer } from './classes.devserver.js';
|
|
4
|
+
import { StandardConfigError, StandardUsageError, registerStandardCommands } from './standards/index.js';
|
|
4
5
|
/**
|
|
5
6
|
* Registers the wcctools commands on the given console.
|
|
6
7
|
*/
|
|
@@ -20,10 +21,14 @@ export const registerCommands = (out) => {
|
|
|
20
21
|
},
|
|
21
22
|
},
|
|
22
23
|
}, async ({ options }) => {
|
|
23
|
-
const devServer = new WccDevServer({ port: options.port });
|
|
24
|
+
const devServer = new WccDevServer({ port: options.port, cwd: process.cwd() });
|
|
25
|
+
// The entry point owns process signals: SIGINT and SIGTERM run every registered cleanup, the
|
|
26
|
+
// dev server's stop among them, once within tswatch's shutdown deadline, then exit.
|
|
27
|
+
plugins.smartexit.ProcessLifecycle.install({ shutdownTimeoutMs: devServer.getShutdownTimeoutMs() });
|
|
24
28
|
const address = await devServer.start();
|
|
25
29
|
await out.log(`wcctools dev: ${address.url}`);
|
|
26
30
|
});
|
|
31
|
+
registerStandardCommands(out);
|
|
27
32
|
out.cli.default({}, async () => {
|
|
28
33
|
await out.log(out.cli.renderHelp());
|
|
29
34
|
});
|
|
@@ -36,10 +41,14 @@ export const runCli = async () => {
|
|
|
36
41
|
}
|
|
37
42
|
catch (error) {
|
|
38
43
|
await out.error(error instanceof Error ? error.message : String(error));
|
|
39
|
-
|
|
44
|
+
// Configuration and usage errors exit with 2, every other failure with 1.
|
|
45
|
+
const usageError = error instanceof plugins.smartconsole.CliUsageError
|
|
46
|
+
|| error instanceof StandardConfigError
|
|
47
|
+
|| error instanceof StandardUsageError;
|
|
48
|
+
process.exitCode = usageError ? 2 : 1;
|
|
40
49
|
}
|
|
41
50
|
finally {
|
|
42
51
|
await out.dispose();
|
|
43
52
|
}
|
|
44
53
|
};
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFekc7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQXNDLEVBQVEsRUFBRTtJQUMvRSxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUNoQixJQUFJLEVBQUUsVUFBVTtRQUNoQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87UUFDM0IsV0FBVyxFQUFFLHVEQUF1RDtLQUNyRSxDQUFDLENBQUM7SUFFSCxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUNkLElBQUksRUFBRSxLQUFLO1FBQ1gsV0FBVyxFQUFFLHdFQUF3RTtRQUNyRixPQUFPLEVBQUU7WUFDUCxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDhFQUE4RTthQUM1RjtTQUNGO0tBQ0YsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0UsNkZBQTZGO1FBQzdGLG9GQUFvRjtRQUNwRixPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRyxNQUFNLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0lBRUgsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFOUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzdCLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BELElBQUksQ0FBQztRQUNILGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RSwwRUFBMEU7UUFDMUUsTUFBTSxVQUFVLEdBQUcsS0FBSyxZQUFZLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYTtlQUNqRSxLQUFLLFlBQVksbUJBQW1CO2VBQ3BDLEtBQUssWUFBWSxrQkFBa0IsQ0FBQztRQUN6QyxPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QixDQUFDO0FBQ0gsQ0FBQyxDQUFDIn0=
|
package/dist_ts/index.d.ts
CHANGED
package/dist_ts/index.js
CHANGED
|
@@ -1,4 +1,2 @@
|
|
|
1
1
|
export { runCli } from './cli.js';
|
|
2
|
-
|
|
3
|
-
export { WccDevApi } from './classes.devapi.js';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxZQUFZLEVBQXdELE1BQU0sd0JBQXdCLENBQUM7QUFDNUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDIn0=
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDIn0=
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
|
+
import * as childProcess from 'node:child_process';
|
|
1
2
|
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as fsSync from 'node:fs';
|
|
2
4
|
import * as path from 'node:path';
|
|
3
5
|
import * as url from 'node:url';
|
|
4
|
-
export { fs, path, url };
|
|
6
|
+
export { childProcess, fs, fsSync, path, url };
|
|
5
7
|
import * as typedrequest from '@api.global/typedrequest';
|
|
6
8
|
import * as typedserver from '@api.global/typedserver';
|
|
7
9
|
export { typedrequest, typedserver };
|
|
8
10
|
import * as tswatch from '@git.zone/tswatch';
|
|
9
11
|
export { tswatch };
|
|
12
|
+
import * as smartconfig from '@push.rocks/smartconfig';
|
|
10
13
|
import * as smartconsole from '@push.rocks/smartconsole';
|
|
11
14
|
import * as smartexit from '@push.rocks/smartexit';
|
|
12
|
-
export { smartconsole, smartexit };
|
|
15
|
+
export { smartconfig, smartconsole, smartexit };
|
|
16
|
+
import typescript from 'typescript';
|
|
17
|
+
export { typescript };
|
|
13
18
|
import * as interfaces from '../dist_ts_interfaces/index.js';
|
|
14
19
|
import * as shared from '../dist_ts_shared/index.js';
|
|
15
20
|
export { interfaces, shared };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// node native scope
|
|
2
|
+
import * as childProcess from 'node:child_process';
|
|
2
3
|
import * as fs from 'node:fs/promises';
|
|
4
|
+
import * as fsSync from 'node:fs';
|
|
3
5
|
import * as path from 'node:path';
|
|
4
6
|
import * as url from 'node:url';
|
|
5
|
-
export { fs, path, url };
|
|
7
|
+
export { childProcess, fs, fsSync, path, url };
|
|
6
8
|
// @api.global scope
|
|
7
9
|
import * as typedrequest from '@api.global/typedrequest';
|
|
8
10
|
import * as typedserver from '@api.global/typedserver';
|
|
@@ -11,11 +13,15 @@ export { typedrequest, typedserver };
|
|
|
11
13
|
import * as tswatch from '@git.zone/tswatch';
|
|
12
14
|
export { tswatch };
|
|
13
15
|
// @push.rocks scope
|
|
16
|
+
import * as smartconfig from '@push.rocks/smartconfig';
|
|
14
17
|
import * as smartconsole from '@push.rocks/smartconsole';
|
|
15
18
|
import * as smartexit from '@push.rocks/smartexit';
|
|
16
|
-
export { smartconsole, smartexit };
|
|
19
|
+
export { smartconfig, smartconsole, smartexit };
|
|
20
|
+
// third party scope
|
|
21
|
+
import typescript from 'typescript';
|
|
22
|
+
export { typescript };
|
|
17
23
|
// project scope
|
|
18
24
|
import * as interfaces from '../dist_ts_interfaces/index.js';
|
|
19
25
|
import * as shared from '../dist_ts_shared/index.js';
|
|
20
26
|
export { interfaces, shared };
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEtBQUssTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUVoQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRS9DLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUVyQyxrQkFBa0I7QUFDbEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFFbkIsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBRWhELG9CQUFvQjtBQUNwQixPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFFcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBRXRCLGdCQUFnQjtBQUNoQixPQUFPLEtBQUssVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sS0FBSyxNQUFNLE1BQU0sdUJBQXVCLENBQUM7QUFFaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyJ9
|
|
@@ -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 {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { severityIn } from './rule.js';
|
|
3
|
+
import { allowlistStaleRuleId, standardRules } from './rules/index.js';
|
|
4
|
+
/** The rules of a profile, in the order of docs/standard.md. */
|
|
5
|
+
export const rulesOfProfile = (profileArg) => standardRules.filter((ruleArg) => severityIn(ruleArg, profileArg) !== null);
|
|
6
|
+
/** The rules of a profile as the shell and the AI agent see them. */
|
|
7
|
+
export const describeStandardRules = (profileArg) => rulesOfProfile(profileArg).map((ruleArg) => ({
|
|
8
|
+
id: ruleArg.id,
|
|
9
|
+
severity: severityIn(ruleArg, profileArg),
|
|
10
|
+
fixMode: ruleArg.fixMode,
|
|
11
|
+
allowlistCategories: [...(ruleArg.allowlistCategories ?? [])],
|
|
12
|
+
}));
|
|
13
|
+
/** Runs the rules of the configured profile; findings carry their fix actions. */
|
|
14
|
+
export const detectFindings = (projectArg, loadedArg, rulesArg = rulesOfProfile(loadedArg.profile)) => {
|
|
15
|
+
const context = { project: projectArg, config: loadedArg.config, profile: loadedArg.profile };
|
|
16
|
+
const detected = [];
|
|
17
|
+
for (const rule of rulesArg) {
|
|
18
|
+
const allowlist = loadedArg.config.allowlist?.[rule.id] ?? {};
|
|
19
|
+
for (const finding of rule.detect(context)) {
|
|
20
|
+
detected.push({ rule, finding, allowlisted: Object.hasOwn(allowlist, finding.key) });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return detected;
|
|
24
|
+
};
|
|
25
|
+
const locate = (projectArg, fileArg, positionArg) => {
|
|
26
|
+
const text = projectArg.files.get(fileArg);
|
|
27
|
+
if (text === undefined) {
|
|
28
|
+
return { line: 1, column: 1 };
|
|
29
|
+
}
|
|
30
|
+
if (/\.(ts|tsx|mts|cts)$/.test(fileArg)) {
|
|
31
|
+
return projectArg.lineAndColumn(fileArg, positionArg);
|
|
32
|
+
}
|
|
33
|
+
const before = text.slice(0, positionArg);
|
|
34
|
+
return { line: before.split('\n').length, column: positionArg - before.lastIndexOf('\n') };
|
|
35
|
+
};
|
|
36
|
+
/** Checks a repository against the standard: findings, allowlist, baselines. */
|
|
37
|
+
export const checkStandard = (projectArg, loadedArg) => {
|
|
38
|
+
const { config, profile } = loadedArg;
|
|
39
|
+
const detected = detectFindings(projectArg, loadedArg);
|
|
40
|
+
const findings = detected.map(({ rule, finding, allowlisted }) => ({
|
|
41
|
+
ruleId: rule.id,
|
|
42
|
+
severity: severityIn(rule, profile),
|
|
43
|
+
file: finding.file,
|
|
44
|
+
...locate(projectArg, finding.file, finding.position),
|
|
45
|
+
message: finding.message,
|
|
46
|
+
fixable: !!finding.fix,
|
|
47
|
+
...(allowlisted ? { covered: 'allowlist' } : {}),
|
|
48
|
+
}));
|
|
49
|
+
// An allowlist entry without its finding is stale: the list only shrinks.
|
|
50
|
+
for (const [ruleId, entries] of Object.entries(config.allowlist ?? {})) {
|
|
51
|
+
for (const key of Object.keys(entries)) {
|
|
52
|
+
if (!detected.some(({ rule, finding }) => rule.id === ruleId && finding.key === key)) {
|
|
53
|
+
findings.push({
|
|
54
|
+
ruleId: allowlistStaleRuleId,
|
|
55
|
+
severity: 'error',
|
|
56
|
+
file: '.smartconfig.json',
|
|
57
|
+
line: 1,
|
|
58
|
+
column: 1,
|
|
59
|
+
message: `the ${ruleId} allowlist entry '${key}' matches no finding; remove it`,
|
|
60
|
+
fixable: false,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Baselines: per rule and file, a count at or below the baseline is covered; above it nothing is.
|
|
66
|
+
const baselineSlack = [];
|
|
67
|
+
for (const [ruleId, counts] of Object.entries(config.baselines ?? {})) {
|
|
68
|
+
for (const [file, baseline] of Object.entries(counts)) {
|
|
69
|
+
const inFile = findings.filter((findingArg) => findingArg.ruleId === ruleId && findingArg.file === file && !findingArg.covered);
|
|
70
|
+
if (inFile.length <= baseline) {
|
|
71
|
+
inFile.forEach((findingArg) => {
|
|
72
|
+
findingArg.covered = 'baseline';
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (inFile.length < baseline) {
|
|
76
|
+
baselineSlack.push({ ruleId, file, baseline, current: inFile.length });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
findings.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line || a.column - b.column || a.ruleId.localeCompare(b.ruleId));
|
|
81
|
+
return {
|
|
82
|
+
profile,
|
|
83
|
+
findings,
|
|
84
|
+
baselineSlack,
|
|
85
|
+
ok: !findings.some((findingArg) => findingArg.severity === 'error' && !findingArg.covered),
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3N0YW5kYXJkcy9jaGVja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBR3pDLE9BQU8sRUFBRSxVQUFVLEVBQXlDLE1BQU0sV0FBVyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQU12RSxnRUFBZ0U7QUFDaEUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsVUFBNEIsRUFBbUIsRUFBRSxDQUM5RSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0FBRTlFLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFVBQTRCLEVBQTBDLEVBQUUsQ0FDNUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7SUFDZCxRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUU7SUFDMUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO0lBQ3hCLG1CQUFtQixFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUMsQ0FBQztDQUM5RCxDQUFDLENBQUMsQ0FBQztBQVNOLGtGQUFrRjtBQUNsRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsVUFBMkIsRUFDM0IsU0FBZ0MsRUFDaEMsV0FBcUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFDbEQsRUFBRTtJQUN0QixNQUFNLE9BQU8sR0FBRyxFQUFF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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The git operations `wcctools fix` needs, run with an argument vector and no shell. */
|
|
2
|
+
export declare class GitRepo {
|
|
3
|
+
readonly rootDir: string;
|
|
4
|
+
constructor(rootDirArg: string);
|
|
5
|
+
run(argsArg: string[]): Promise<string>;
|
|
6
|
+
/** The repository's top-level directory, or null when the directory is not inside a git work tree. */
|
|
7
|
+
topLevel(): Promise<string | null>;
|
|
8
|
+
/** `git status --porcelain` lines; empty for a clean tree (untracked files count as changes). */
|
|
9
|
+
statusLines(): Promise<string[]>;
|
|
10
|
+
/** Tracked files, relative to the repository root. */
|
|
11
|
+
trackedFiles(): Promise<string[]>;
|
|
12
|
+
move(fromArg: string, toArg: string): Promise<void>;
|
|
13
|
+
}
|