@telora/daemon 0.22.290 → 0.22.306
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/README.md +2 -2
- package/build-info.json +2 -2
- package/dist/backends/index.js +1 -1
- package/dist/cli/connect/config-write.d.ts.map +1 -1
- package/dist/cli/connect/config-write.js +2 -1
- package/dist/cli/connect/config-write.js.map +1 -1
- package/dist/completion/review-exit/review-census-record.d.ts.map +1 -1
- package/dist/completion/review-exit/review-census-record.js +1 -0
- package/dist/completion/review-exit/review-census-record.js.map +1 -1
- package/dist/completion/review-exit/review-exit-deps.d.ts +1 -0
- package/dist/completion/review-exit/review-exit-deps.d.ts.map +1 -1
- package/dist/completion/review-exit/review-exit-phase.js +7 -4
- package/dist/completion/review-exit/review-exit-phase.js.map +1 -1
- package/dist/completion/review-exit-holds/review-exit-verdict-gate.d.ts +17 -1
- package/dist/completion/review-exit-holds/review-exit-verdict-gate.d.ts.map +1 -1
- package/dist/completion/review-exit-holds/review-exit-verdict-gate.js +21 -0
- package/dist/completion/review-exit-holds/review-exit-verdict-gate.js.map +1 -1
- package/dist/completion/state-cascade/standing-approval-convergence.d.ts +7 -2
- package/dist/completion/state-cascade/standing-approval-convergence.d.ts.map +1 -1
- package/dist/completion/state-cascade/standing-approval-convergence.js +56 -31
- package/dist/completion/state-cascade/standing-approval-convergence.js.map +1 -1
- package/dist/completion/state-cascade/standing-approval-stranded.d.ts +39 -0
- package/dist/completion/state-cascade/standing-approval-stranded.d.ts.map +1 -0
- package/dist/completion/state-cascade/standing-approval-stranded.js +142 -0
- package/dist/completion/state-cascade/standing-approval-stranded.js.map +1 -0
- package/dist/composition/commit-gate-context.d.ts.map +1 -1
- package/dist/composition/commit-gate-context.js +2 -1
- package/dist/composition/commit-gate-context.js.map +1 -1
- package/dist/composition/execution-spawn-context.d.ts.map +1 -1
- package/dist/composition/execution-spawn-context.js +1 -0
- package/dist/composition/execution-spawn-context.js.map +1 -1
- package/dist/composition/focus-activity-live-sources.d.ts.map +1 -1
- package/dist/composition/focus-activity-live-sources.js +3 -0
- package/dist/composition/focus-activity-live-sources.js.map +1 -1
- package/dist/composition/standing-approval-context.d.ts.map +1 -1
- package/dist/composition/standing-approval-context.js +2 -0
- package/dist/composition/standing-approval-context.js.map +1 -1
- package/dist/composition/verify-probe-context.d.ts +7 -0
- package/dist/composition/verify-probe-context.d.ts.map +1 -1
- package/dist/composition/verify-probe-context.js +55 -3
- package/dist/composition/verify-probe-context.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +4 -3
- package/dist/config/config.js.map +1 -1
- package/dist/config/session-cap.d.ts +89 -0
- package/dist/config/session-cap.d.ts.map +1 -0
- package/dist/config/session-cap.js +176 -0
- package/dist/config/session-cap.js.map +1 -0
- package/dist/daemon-state/focus-team-state.d.ts +21 -1
- package/dist/daemon-state/focus-team-state.d.ts.map +1 -1
- package/dist/daemon-state/focus-team-state.js +36 -1
- package/dist/daemon-state/focus-team-state.js.map +1 -1
- package/dist/directive/directive-queue.js +1 -1
- package/dist/focus/focus-activity-poll-facts.d.ts.map +1 -1
- package/dist/focus/focus-activity-poll-facts.js +2 -1
- package/dist/focus/focus-activity-poll-facts.js.map +1 -1
- package/dist/focus/focus-activity-producers.d.ts +7 -1
- package/dist/focus/focus-activity-producers.d.ts.map +1 -1
- package/dist/focus/focus-activity-producers.js +19 -7
- package/dist/focus/focus-activity-producers.js.map +1 -1
- package/dist/focus/focus-activity-record.d.ts.map +1 -1
- package/dist/focus/focus-activity-record.js +4 -1
- package/dist/focus/focus-activity-record.js.map +1 -1
- package/dist/focus/focus-activity-sources.d.ts +4 -0
- package/dist/focus/focus-activity-sources.d.ts.map +1 -1
- package/dist/focus/focus-activity-sources.js.map +1 -1
- package/dist/focus/heartbeat-metadata.d.ts.map +1 -1
- package/dist/focus/heartbeat-metadata.js +6 -0
- package/dist/focus/heartbeat-metadata.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
- package/dist/prompt-sections/persona-sections.js +3 -0
- package/dist/prompt-sections/persona-sections.js.map +1 -1
- package/dist/prompt-sections/routing-decider-sections.d.ts.map +1 -1
- package/dist/prompt-sections/routing-decider-sections.js +2 -0
- package/dist/prompt-sections/routing-decider-sections.js.map +1 -1
- package/dist/queries/api-client/shared.js +1 -1
- package/dist/queries/delivery-gate-state/delivery-gate-holds.d.ts +25 -1
- package/dist/queries/delivery-gate-state/delivery-gate-holds.d.ts.map +1 -1
- package/dist/queries/delivery-gate-state/delivery-gate-state.d.ts +3 -1
- package/dist/queries/delivery-gate-state/delivery-gate-state.d.ts.map +1 -1
- package/dist/queries/delivery-gate-state/delivery-gate-state.js.map +1 -1
- package/dist/queries/escalations/cause-key.d.ts +11 -0
- package/dist/queries/escalations/cause-key.d.ts.map +1 -1
- package/dist/queries/escalations/cause-key.js +15 -0
- package/dist/queries/escalations/cause-key.js.map +1 -1
- package/dist/queries/escalations/escalation-consumption.d.ts.map +1 -1
- package/dist/queries/escalations/escalation-consumption.js +1 -0
- package/dist/queries/escalations/escalation-consumption.js.map +1 -1
- package/dist/queries/escalations/filing-observation.d.ts.map +1 -1
- package/dist/queries/escalations/filing-observation.js +1 -0
- package/dist/queries/escalations/filing-observation.js.map +1 -1
- package/dist/shell/config-hot-reload.d.ts +11 -0
- package/dist/shell/config-hot-reload.d.ts.map +1 -1
- package/dist/shell/config-hot-reload.js +12 -0
- package/dist/shell/config-hot-reload.js.map +1 -1
- package/dist/shell/unified-engine-lifecycle.d.ts +8 -1
- package/dist/shell/unified-engine-lifecycle.d.ts.map +1 -1
- package/dist/shell/unified-engine-lifecycle.js +44 -24
- package/dist/shell/unified-engine-lifecycle.js.map +1 -1
- package/dist/shell/unified-init.d.ts +5 -1
- package/dist/shell/unified-init.d.ts.map +1 -1
- package/dist/shell/unified-init.js +2 -2
- package/dist/shell/unified-init.js.map +1 -1
- package/dist/shell/unified-shell-config.d.ts +2 -1
- package/dist/shell/unified-shell-config.d.ts.map +1 -1
- package/dist/shell/unified-shell-config.js +9 -3
- package/dist/shell/unified-shell-config.js.map +1 -1
- package/dist/shell/unified-shell-status.js +1 -1
- package/dist/shell/unified-shell-status.js.map +1 -1
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +2 -1
- package/dist/shell/unified-shell.js.map +1 -1
- package/dist/spawn/helpers.d.ts.map +1 -1
- package/dist/spawn/helpers.js +4 -0
- package/dist/spawn/helpers.js.map +1 -1
- package/dist/spawn/spawn-decision.d.ts.map +1 -1
- package/dist/spawn/spawn-decision.js +4 -0
- package/dist/spawn/spawn-decision.js.map +1 -1
- package/dist/spawn/team-working-delivery.d.ts +76 -0
- package/dist/spawn/team-working-delivery.d.ts.map +1 -0
- package/dist/spawn/team-working-delivery.js +76 -0
- package/dist/spawn/team-working-delivery.js.map +1 -0
- package/dist/supervision/agent-resolvable-promotion.d.ts +14 -2
- package/dist/supervision/agent-resolvable-promotion.d.ts.map +1 -1
- package/dist/supervision/agent-resolvable-promotion.js +24 -3
- package/dist/supervision/agent-resolvable-promotion.js.map +1 -1
- package/dist/supervision/escalation-filing.js +1 -1
- package/dist/supervision/escalation-suppression.js +1 -1
- package/dist/supervision/focus-delivery-aggregate-phase.d.ts.map +1 -1
- package/dist/supervision/focus-delivery-aggregate-phase.js +1 -0
- package/dist/supervision/focus-delivery-aggregate-phase.js.map +1 -1
- package/dist/supervision/stop-registry.d.ts +1 -0
- package/dist/supervision/stop-registry.d.ts.map +1 -1
- package/dist/supervision/stop-rows-delivery.d.ts +6 -0
- package/dist/supervision/stop-rows-delivery.d.ts.map +1 -1
- package/dist/supervision/stop-rows-delivery.js +20 -0
- package/dist/supervision/stop-rows-delivery.js.map +1 -1
- package/dist/testing/fake-npm-registry.d.ts +31 -0
- package/dist/testing/fake-npm-registry.d.ts.map +1 -0
- package/dist/testing/fake-npm-registry.js +127 -0
- package/dist/testing/fake-npm-registry.js.map +1 -0
- package/dist/testing/fixtures/api-client.js +1 -1
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/types/config.d.ts +30 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/focus-team-state.d.ts +14 -0
- package/dist/types/focus-team-state.d.ts.map +1 -1
- package/dist/types/focus-team-state.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/verify/gate-config/commit-gate-configured.d.ts +2 -0
- package/dist/verify/gate-config/commit-gate-configured.d.ts.map +1 -1
- package/dist/verify/gate-config/commit-gate-configured.js.map +1 -1
- package/dist/verify/install-probe/in-repo-publish.d.ts +154 -0
- package/dist/verify/install-probe/in-repo-publish.d.ts.map +1 -0
- package/dist/verify/install-probe/in-repo-publish.js +183 -0
- package/dist/verify/install-probe/in-repo-publish.js.map +1 -0
- package/dist/verify/install-probe/install-probe-tick.d.ts +23 -2
- package/dist/verify/install-probe/install-probe-tick.d.ts.map +1 -1
- package/dist/verify/install-probe/install-probe-tick.js +84 -12
- package/dist/verify/install-probe/install-probe-tick.js.map +1 -1
- package/dist/verify/install-probe/install-probe.d.ts +16 -0
- package/dist/verify/install-probe/install-probe.d.ts.map +1 -1
- package/dist/verify/install-probe/install-probe.js +35 -19
- package/dist/verify/install-probe/install-probe.js.map +1 -1
- package/dist/verify/install-probe/npm-unresolved.d.ts +37 -0
- package/dist/verify/install-probe/npm-unresolved.d.ts.map +1 -0
- package/dist/verify/install-probe/npm-unresolved.js +63 -0
- package/dist/verify/install-probe/npm-unresolved.js.map +1 -0
- package/dist/verify/shortfalls/each-table.d.ts +45 -0
- package/dist/verify/shortfalls/each-table.d.ts.map +1 -0
- package/dist/verify/shortfalls/each-table.js +219 -0
- package/dist/verify/shortfalls/each-table.js.map +1 -0
- package/dist/verify/shortfalls/each-title-render.d.ts +67 -0
- package/dist/verify/shortfalls/each-title-render.d.ts.map +1 -0
- package/dist/verify/shortfalls/each-title-render.js +473 -0
- package/dist/verify/shortfalls/each-title-render.js.map +1 -0
- package/dist/verify/shortfalls/generated-test-titles.d.ts +18 -0
- package/dist/verify/shortfalls/generated-test-titles.d.ts.map +1 -0
- package/dist/verify/shortfalls/generated-test-titles.js +232 -0
- package/dist/verify/shortfalls/generated-test-titles.js.map +1 -0
- package/dist/verify/shortfalls/ruling-evidence-resolution.d.ts.map +1 -1
- package/dist/verify/shortfalls/ruling-evidence-resolution.js +6 -2
- package/dist/verify/shortfalls/ruling-evidence-resolution.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-unresolved.d.ts","sourceRoot":"","sources":["../../../src/verify/install-probe/npm-unresolved.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;CACd;AAwBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CAkBrE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGzD;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAE1D"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/verify/install-probe/npm-unresolved.test.ts
|
|
3
|
+
// PINNED-BY-END
|
|
4
|
+
// A package name: optionally scoped, then the bare name. Anchored per use.
|
|
5
|
+
const NAME = '(@[a-z0-9][\\w.-]*\\/[a-z0-9][\\w.-]*|[a-z0-9][\\w.-]*)';
|
|
6
|
+
// A version or range npm prints after the `@`: no whitespace, no closing quote.
|
|
7
|
+
const SPEC = '([^\\s\'"`]+?)';
|
|
8
|
+
const PATTERNS = [
|
|
9
|
+
// ETARGET: "notarget No matching version found for @telora/daemon-core@^0.2.102."
|
|
10
|
+
new RegExp(`No matching version found for ${NAME}@${SPEC}\\.?(?:\\s|$)`, 'g'),
|
|
11
|
+
// E404: "404 '@telora/daemon-core@0.2.102' is not in this registry."
|
|
12
|
+
new RegExp(`'${NAME}@${SPEC}' is not in this registry`, 'g'),
|
|
13
|
+
// EUSAGE desync: "Invalid: lock file's @telora/daemon-core@0.2.100 does not satisfy @telora/daemon-core@^0.2.102"
|
|
14
|
+
new RegExp(`does not satisfy ${NAME}@${SPEC}(?:\\s|$)`, 'g'),
|
|
15
|
+
// EUSAGE desync: "Missing: @telora/daemon-core@0.2.102 from lock file"
|
|
16
|
+
new RegExp(`Missing: ${NAME}@${SPEC} from lock file`, 'g'),
|
|
17
|
+
];
|
|
18
|
+
// E404 on a lockfile-resolved tarball, in the npmjs layout or Gitea's:
|
|
19
|
+
// "404 Not Found - GET https://host/@telora/daemon-core/-/daemon-core-0.2.102.tgz"
|
|
20
|
+
// "404 Not Found - GET https://host/api/packages/o/npm/%40telora%2Fdaemon-core/-/0.2.102/daemon-core-0.2.102.tgz"
|
|
21
|
+
// (the scope's `@` and `/` may each be URL-encoded).
|
|
22
|
+
const TARBALL_404 = /404 Not Found - GET \S*?\/(?:@|%40)([a-z0-9][\w.-]*)(?:\/|%2[fF])([a-z0-9][\w.-]*)\/-\/(?:[\w.+-]+\/)?[\w.-]+?-(\d+\.\d+\.\d+[\w.+-]*?)\.tgz/g;
|
|
23
|
+
/**
|
|
24
|
+
* Every package@spec npm's output names as unresolvable, deduped and in order of
|
|
25
|
+
* first mention. Empty when the output names none.
|
|
26
|
+
*/
|
|
27
|
+
export function parseUnresolvedSpecs(output) {
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
const found = [];
|
|
30
|
+
const add = (at, name, spec) => {
|
|
31
|
+
const key = `${name}@${spec}`;
|
|
32
|
+
if (seen.has(key))
|
|
33
|
+
return;
|
|
34
|
+
seen.add(key);
|
|
35
|
+
found.push({ at, spec: { name, spec } });
|
|
36
|
+
};
|
|
37
|
+
const hay = output ?? '';
|
|
38
|
+
for (const re of PATTERNS) {
|
|
39
|
+
for (const m of hay.matchAll(re))
|
|
40
|
+
add(m.index ?? 0, m[1] ?? '', (m[2] ?? '').replace(/\.$/, ''));
|
|
41
|
+
}
|
|
42
|
+
for (const m of hay.matchAll(TARBALL_404))
|
|
43
|
+
add(m.index ?? 0, `@${m[1]}/${m[2]}`, m[3] ?? '');
|
|
44
|
+
return found
|
|
45
|
+
.filter(f => f.spec.name !== '' && f.spec.spec !== '')
|
|
46
|
+
.sort((a, b) => a.at - b.at)
|
|
47
|
+
.map(f => f.spec);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The exact version a spec pins, or null when it is a range this module does not
|
|
51
|
+
* reduce. `0.2.102`, `^0.2.102`, `~0.2.102`, `>=0.2.102`, `v0.2.102` -> `0.2.102`.
|
|
52
|
+
* A compound range (`1.x`, `>=1 <2`, `*`) is NOT reduced: the caller must not
|
|
53
|
+
* act on a version it had to guess.
|
|
54
|
+
*/
|
|
55
|
+
export function pinnedVersion(spec) {
|
|
56
|
+
const m = /^(?:\^|~|>=|=|v)?(\d+\.\d+\.\d+(?:-[\w.]+)?)$/.exec(spec.trim());
|
|
57
|
+
return m ? (m[1] ?? null) : null;
|
|
58
|
+
}
|
|
59
|
+
/** `name@spec` joined for display. */
|
|
60
|
+
export function formatUnresolved(u) {
|
|
61
|
+
return `${u.name}@${u.spec}`;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=npm-unresolved.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-unresolved.js","sourceRoot":"","sources":["../../../src/verify/install-probe/npm-unresolved.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rows of a `.each` table the source writes out LITERALLY, and the text a
|
|
3
|
+
* title placeholder renders each row value as.
|
|
4
|
+
*
|
|
5
|
+
* verify/shortfalls/generated-test-titles.ts expands an each-style title against
|
|
6
|
+
* its table so a cited name resolves only when a row the table really holds
|
|
7
|
+
* produces it: `it.each(['a', 'b'])('case %s')` generates `case a` and `case b`,
|
|
8
|
+
* never `case z`. This module reads the table: an array literal (`[...]`,
|
|
9
|
+
* optionally `as const`) of string / number / boolean / null / undefined values,
|
|
10
|
+
* arrays and plain objects, or a tagged-template table whose cells are each one
|
|
11
|
+
* `${literal}`. Anything else a table holds -- an identifier, a call, an arrow, a
|
|
12
|
+
* spread, a template with a substitution -- is UNKNOWN: a row value the title
|
|
13
|
+
* never renders costs nothing, and a placeholder that WOULD render one produces
|
|
14
|
+
* no pattern for that row (fail closed). A table that is not a literal at all
|
|
15
|
+
* (`it.each(CASES)`) yields no rows.
|
|
16
|
+
* Rendering a row into a title is verify/shortfalls/each-title-render.ts.
|
|
17
|
+
* Pure; nothing is evaluated.
|
|
18
|
+
*
|
|
19
|
+
* @module verify/shortfalls/each-table
|
|
20
|
+
*/
|
|
21
|
+
/** A value that is not a literal the table spells out. */
|
|
22
|
+
export declare const UNKNOWN: unique symbol;
|
|
23
|
+
/** One table value, as far as the source spells it out. */
|
|
24
|
+
export type EachValue = string | number | boolean | null | undefined | typeof UNKNOWN | EachValue[] | {
|
|
25
|
+
[key: string]: EachValue;
|
|
26
|
+
};
|
|
27
|
+
/** One row: the arguments its test receives (a non-array array element is one argument). */
|
|
28
|
+
export type EachRow = EachValue[];
|
|
29
|
+
interface Parsed {
|
|
30
|
+
value: EachValue;
|
|
31
|
+
next: number;
|
|
32
|
+
}
|
|
33
|
+
/** One value from `i`; an expression that is not a plain literal reads as UNKNOWN, consumed to its end. */
|
|
34
|
+
export declare function parseValue(s: string, i: number): Parsed;
|
|
35
|
+
/**
|
|
36
|
+
* The elements of an array-literal table (the text between `.each(` and its `)`),
|
|
37
|
+
* as written -- each runner turns them into rows its own way; null when it is not one.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseArrayTableItems(text: string): EachValue[] | null;
|
|
40
|
+
/** The rows of an array-literal table, one per element (an element that is not an array is one argument); null when it is not one. */
|
|
41
|
+
export declare function parseArrayTable(text: string): EachRow[] | null;
|
|
42
|
+
/** The rows of a tagged-template table (its raw body); null unless every cell is one `${literal}`. */
|
|
43
|
+
export declare function parseTemplateTable(body: string): EachRow[] | null;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=each-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"each-table.d.ts","sourceRoot":"","sources":["../../../src/verify/shortfalls/each-table.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,0DAA0D;AAC1D,eAAO,MAAM,OAAO,EAAE,OAAO,MAAqC,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,MAAM,SAAS,GACjB,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAC5C,OAAO,OAAO,GACd,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC,4FAA4F;AAC5F,MAAM,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;AAElC,UAAU,MAAM;IAAG,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AA4FnD,2GAA2G;AAC3G,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAsBvD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,IAAI,CAOrE;AAED,sIAAsI;AACtI,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,IAAI,CAE9D;AAED,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,IAAI,CAuBjE"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/verify/shortfalls/each-title-render.test.ts,
|
|
3
|
+
// packages/daemon/src/verify/shortfalls/generated-test-titles.test.ts
|
|
4
|
+
// PINNED-BY-END
|
|
5
|
+
/**
|
|
6
|
+
* The rows of a `.each` table the source writes out LITERALLY, and the text a
|
|
7
|
+
* title placeholder renders each row value as.
|
|
8
|
+
*
|
|
9
|
+
* verify/shortfalls/generated-test-titles.ts expands an each-style title against
|
|
10
|
+
* its table so a cited name resolves only when a row the table really holds
|
|
11
|
+
* produces it: `it.each(['a', 'b'])('case %s')` generates `case a` and `case b`,
|
|
12
|
+
* never `case z`. This module reads the table: an array literal (`[...]`,
|
|
13
|
+
* optionally `as const`) of string / number / boolean / null / undefined values,
|
|
14
|
+
* arrays and plain objects, or a tagged-template table whose cells are each one
|
|
15
|
+
* `${literal}`. Anything else a table holds -- an identifier, a call, an arrow, a
|
|
16
|
+
* spread, a template with a substitution -- is UNKNOWN: a row value the title
|
|
17
|
+
* never renders costs nothing, and a placeholder that WOULD render one produces
|
|
18
|
+
* no pattern for that row (fail closed). A table that is not a literal at all
|
|
19
|
+
* (`it.each(CASES)`) yields no rows.
|
|
20
|
+
* Rendering a row into a title is verify/shortfalls/each-title-render.ts.
|
|
21
|
+
* Pure; nothing is evaluated.
|
|
22
|
+
*
|
|
23
|
+
* @module verify/shortfalls/each-table
|
|
24
|
+
*/
|
|
25
|
+
/** A value that is not a literal the table spells out. */
|
|
26
|
+
export const UNKNOWN = Symbol('unknown-each-value');
|
|
27
|
+
const CLOSERS = new Set([',', ']', '}', ')']);
|
|
28
|
+
/** Skip whitespace and comments from `i`. */
|
|
29
|
+
function skipSpace(s, i) {
|
|
30
|
+
for (;;) {
|
|
31
|
+
while (i < s.length && /\s/.test(s[i] ?? ''))
|
|
32
|
+
i++;
|
|
33
|
+
if (s.startsWith('//', i)) {
|
|
34
|
+
const nl = s.indexOf('\n', i);
|
|
35
|
+
i = nl === -1 ? s.length : nl + 1;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (s.startsWith('/*', i)) {
|
|
39
|
+
const close = s.indexOf('*/', i + 2);
|
|
40
|
+
i = close === -1 ? s.length : close + 2;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
return i;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** The index just past a quoted or template string opening at `i` (substitutions included). */
|
|
47
|
+
function skipString(s, i) {
|
|
48
|
+
const quote = s[i];
|
|
49
|
+
let j = i + 1;
|
|
50
|
+
while (j < s.length && s[j] !== quote) {
|
|
51
|
+
if (s[j] === '\\') {
|
|
52
|
+
j += 2;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (quote === '`' && s[j] === '$' && s[j + 1] === '{') {
|
|
56
|
+
j = skipBalanced(s, j + 1);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
j++;
|
|
60
|
+
}
|
|
61
|
+
return j + 1;
|
|
62
|
+
}
|
|
63
|
+
/** The index just past the bracket group opening at `i`. */
|
|
64
|
+
function skipBalanced(s, i) {
|
|
65
|
+
let depth = 0;
|
|
66
|
+
let j = i;
|
|
67
|
+
while (j < s.length) {
|
|
68
|
+
const c = s[j] ?? '';
|
|
69
|
+
if (c === '"' || c === "'" || c === '`') {
|
|
70
|
+
j = skipString(s, j);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (c === '(' || c === '[' || c === '{')
|
|
74
|
+
depth++;
|
|
75
|
+
else if (c === ')' || c === ']' || c === '}') {
|
|
76
|
+
depth--;
|
|
77
|
+
if (depth === 0)
|
|
78
|
+
return j + 1;
|
|
79
|
+
}
|
|
80
|
+
j++;
|
|
81
|
+
}
|
|
82
|
+
return s.length;
|
|
83
|
+
}
|
|
84
|
+
/** The index of the next top-level `,` / closer from `i`: an expression this reader does not evaluate. */
|
|
85
|
+
function skipExpression(s, i) {
|
|
86
|
+
let j = i;
|
|
87
|
+
while (j < s.length && !CLOSERS.has(s[j] ?? '')) {
|
|
88
|
+
const c = s[j] ?? '';
|
|
89
|
+
if (c === '"' || c === "'" || c === '`') {
|
|
90
|
+
j = skipString(s, j);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (c === '(' || c === '[' || c === '{') {
|
|
94
|
+
j = skipBalanced(s, j);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
j++;
|
|
98
|
+
}
|
|
99
|
+
return j;
|
|
100
|
+
}
|
|
101
|
+
const ESCAPES = { n: '\n', t: '\t', r: '\r', b: '\b', f: '\f', v: '\v', 0: '\0' };
|
|
102
|
+
/** A string literal's value; null when it is a template with a substitution. */
|
|
103
|
+
function stringValue(raw, quote) {
|
|
104
|
+
if (quote === '`' && /(^|[^\\])\$\{/.test(raw))
|
|
105
|
+
return null;
|
|
106
|
+
return raw.replace(/\\(.)/gs, (_m, c) => ESCAPES[c] ?? c);
|
|
107
|
+
}
|
|
108
|
+
/** A comma-separated group closing on `close`, each item read by `item`. Null when malformed. */
|
|
109
|
+
function parseGroup(s, i, close, item) {
|
|
110
|
+
let j = skipSpace(s, i);
|
|
111
|
+
while (s[j] !== close) {
|
|
112
|
+
if (j >= s.length)
|
|
113
|
+
return null;
|
|
114
|
+
const after = item(j);
|
|
115
|
+
if (after === null)
|
|
116
|
+
return null;
|
|
117
|
+
j = skipSpace(s, after);
|
|
118
|
+
if (s[j] === ',')
|
|
119
|
+
j = skipSpace(s, j + 1);
|
|
120
|
+
else if (s[j] !== close)
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
return j + 1;
|
|
124
|
+
}
|
|
125
|
+
function parseArray(s, i) {
|
|
126
|
+
const out = [];
|
|
127
|
+
const next = parseGroup(s, i + 1, ']', (at) => { const v = parseValue(s, at); out.push(v.value); return v.next; });
|
|
128
|
+
return next === null ? { value: UNKNOWN, next: skipBalanced(s, i) } : { value: out, next };
|
|
129
|
+
}
|
|
130
|
+
function parseObject(s, i) {
|
|
131
|
+
const out = {};
|
|
132
|
+
const next = parseGroup(s, i + 1, '}', (at) => {
|
|
133
|
+
const key = /^(?:([A-Za-z_$][\w$]*)|'((?:\\.|[^'\\])*)'|"((?:\\.|[^"\\])*)"|(\d+))\s*:/.exec(s.slice(at));
|
|
134
|
+
if (key === null)
|
|
135
|
+
return null; // a spread, a shorthand or a method: the row's keys are not all spelled out
|
|
136
|
+
const v = parseValue(s, at + key[0].length);
|
|
137
|
+
out[key[1] ?? key[2] ?? key[3] ?? key[4] ?? ''] = v.value;
|
|
138
|
+
return v.next;
|
|
139
|
+
});
|
|
140
|
+
return next === null ? { value: UNKNOWN, next: skipBalanced(s, i) } : { value: out, next };
|
|
141
|
+
}
|
|
142
|
+
/** One value from `i`; an expression that is not a plain literal reads as UNKNOWN, consumed to its end. */
|
|
143
|
+
export function parseValue(s, i) {
|
|
144
|
+
const at = skipSpace(s, i);
|
|
145
|
+
const c = s[at] ?? '';
|
|
146
|
+
let parsed = null;
|
|
147
|
+
if (c === '[')
|
|
148
|
+
parsed = parseArray(s, at);
|
|
149
|
+
else if (c === '{')
|
|
150
|
+
parsed = parseObject(s, at);
|
|
151
|
+
else if (c === '"' || c === "'" || c === '`') {
|
|
152
|
+
const end = skipString(s, at);
|
|
153
|
+
const value = stringValue(s.slice(at + 1, end - 1), c);
|
|
154
|
+
parsed = { value: value ?? UNKNOWN, next: end };
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const word = /^(?:-?(?:\d[\d_]*(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?|true|false|null|undefined)(?![\w$.])/i.exec(s.slice(at));
|
|
158
|
+
if (word !== null) {
|
|
159
|
+
const w = word[0];
|
|
160
|
+
const value = w === 'true' ? true : w === 'false' ? false : w === 'null' ? null : w === 'undefined' ? undefined : Number(w.replace(/_/g, ''));
|
|
161
|
+
parsed = { value, next: at + w.length };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (parsed === null)
|
|
165
|
+
return { value: UNKNOWN, next: skipExpression(s, at) };
|
|
166
|
+
const after = skipSpace(s, parsed.next);
|
|
167
|
+
if (after < s.length && !CLOSERS.has(s[after] ?? ''))
|
|
168
|
+
return { value: UNKNOWN, next: skipExpression(s, after) };
|
|
169
|
+
return { ...parsed, next: after };
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* The elements of an array-literal table (the text between `.each(` and its `)`),
|
|
173
|
+
* as written -- each runner turns them into rows its own way; null when it is not one.
|
|
174
|
+
*/
|
|
175
|
+
export function parseArrayTableItems(text) {
|
|
176
|
+
const trimmed = text.replace(/\s+as\s+const\s*,?\s*$/, '').replace(/,\s*$/, '');
|
|
177
|
+
const at = skipSpace(trimmed, 0);
|
|
178
|
+
if (trimmed[at] !== '[')
|
|
179
|
+
return null;
|
|
180
|
+
const table = parseArray(trimmed, at);
|
|
181
|
+
if (!Array.isArray(table.value) || skipSpace(trimmed, table.next) < trimmed.length)
|
|
182
|
+
return null;
|
|
183
|
+
return table.value;
|
|
184
|
+
}
|
|
185
|
+
/** The rows of an array-literal table, one per element (an element that is not an array is one argument); null when it is not one. */
|
|
186
|
+
export function parseArrayTable(text) {
|
|
187
|
+
return parseArrayTableItems(text)?.map((row) => (Array.isArray(row) ? row : [row])) ?? null;
|
|
188
|
+
}
|
|
189
|
+
/** The rows of a tagged-template table (its raw body); null unless every cell is one `${literal}`. */
|
|
190
|
+
export function parseTemplateTable(body) {
|
|
191
|
+
const lines = body.split('\n').map((l) => l.trim()).filter((l) => l.length > 0);
|
|
192
|
+
const header = lines.shift()?.split('|').map((h) => h.trim()) ?? [];
|
|
193
|
+
if (header.length === 0 || header.some((h) => !/^[A-Za-z_$][\w$]*$/.test(h)))
|
|
194
|
+
return null;
|
|
195
|
+
const rows = [];
|
|
196
|
+
for (const line of lines) {
|
|
197
|
+
const cells = [];
|
|
198
|
+
let i = 0;
|
|
199
|
+
while (i < line.length) {
|
|
200
|
+
i = skipSpace(line, i);
|
|
201
|
+
if (!line.startsWith('${', i))
|
|
202
|
+
return null;
|
|
203
|
+
const end = skipBalanced(line, i + 1);
|
|
204
|
+
const inner = line.slice(i + 2, end - 1);
|
|
205
|
+
const v = parseValue(inner, 0);
|
|
206
|
+
cells.push(skipSpace(inner, v.next) < inner.length ? UNKNOWN : v.value);
|
|
207
|
+
i = skipSpace(line, end);
|
|
208
|
+
if (line[i] === '|')
|
|
209
|
+
i++;
|
|
210
|
+
else if (i < line.length)
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
if (cells.length !== header.length)
|
|
214
|
+
return null;
|
|
215
|
+
rows.push([Object.fromEntries(header.map((h, k) => [h, cells[k]]))]);
|
|
216
|
+
}
|
|
217
|
+
return rows;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=each-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"each-table.js","sourceRoot":"","sources":["../../../src/verify/shortfalls/each-table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The titles a test runner gives the rows of a `.each` table: the exact text of
|
|
3
|
+
* each, or null for a row this reader cannot reproduce.
|
|
4
|
+
*
|
|
5
|
+
* verify/shortfalls/generated-test-titles.ts resolves a cited test name only when
|
|
6
|
+
* it IS a title the source generates, so each row's title must be the one the
|
|
7
|
+
* runner prints. Each runner's title algorithm is PORTED here from its source and
|
|
8
|
+
* replayed on the table's literal values (property walks, Number / parseInt run
|
|
9
|
+
* natively on those values); only the value printers are reproduced by hand:
|
|
10
|
+
*
|
|
11
|
+
* jest-each 30 (its table array, template and interpolation modules): an array
|
|
12
|
+
* table whose title has no `%[#Odfijops]` once `%%` is protected, whose
|
|
13
|
+
* elements are all objects and not all arrays, interpolates `$key` (keys
|
|
14
|
+
* longest-first, getPath, `$#` the index); every other array table formats
|
|
15
|
+
* row by row -- `%#` / `%$` first, then per argument `%p` (pretty-format min,
|
|
16
|
+
* depth 1), `%j` (JSON) or Node util.format (whose `%s` of an object is
|
|
17
|
+
* util.inspect at depth 0, compact 3). A tagged-template row interpolates
|
|
18
|
+
* `$key` only.
|
|
19
|
+
* vitest 4 (@vitest/runner formatTitle): `%#` / `%$` first, then printf over the
|
|
20
|
+
* row (format from @vitest/utils) and `$key` via objectAttr + objDisplay.
|
|
21
|
+
*
|
|
22
|
+
* The printers reproduced: pretty-format min; Node util.inspect of literal
|
|
23
|
+
* values that fit one line (depth 0, compact 3, breakLength 80, strEscape
|
|
24
|
+
* quoting); loupe's single-line inspect (vitest `%s` of an object, an array's own
|
|
25
|
+
* toString) and objDisplay below its truncation (40). What they would print
|
|
26
|
+
* otherwise -- a multi-line inspect, a truncated objDisplay, a value the source
|
|
27
|
+
* does not spell out (UNKNOWN), `%o` / `%O` -- makes that row null: no pattern,
|
|
28
|
+
* fail closed. `unknown` (a file naming neither runner) keeps a row only when
|
|
29
|
+
* both runners give it the identical title.
|
|
30
|
+
*
|
|
31
|
+
* A template-literal title's `${...}` parts carry scope values this reader cannot
|
|
32
|
+
* see; they are assumed to hold no placeholder and match any text.
|
|
33
|
+
*
|
|
34
|
+
* Pinned by titles the real runners printed (each-title-render.test.ts). Pure.
|
|
35
|
+
*
|
|
36
|
+
* @module verify/shortfalls/each-title-render
|
|
37
|
+
*/
|
|
38
|
+
import { type EachValue } from './each-table.js';
|
|
39
|
+
/** The runner that generates the file's titles (eachRunnerOf). */
|
|
40
|
+
export type EachRunner = 'vitest' | 'jest' | 'unknown';
|
|
41
|
+
/** One run of a title: literal text, or a `${...}` substitution whose value lives in scope. */
|
|
42
|
+
export interface TitlePart {
|
|
43
|
+
text: string;
|
|
44
|
+
wildcard: boolean;
|
|
45
|
+
}
|
|
46
|
+
/** A `.each` table as the source wrote it: an array literal's elements, or a tagged template's rows. */
|
|
47
|
+
export type EachTableInput = {
|
|
48
|
+
kind: 'array';
|
|
49
|
+
items: readonly EachValue[];
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'template';
|
|
52
|
+
rows: readonly {
|
|
53
|
+
[key: string]: EachValue;
|
|
54
|
+
}[];
|
|
55
|
+
};
|
|
56
|
+
/** The runner a test file's own imports / globals name, or unknown when they name neither or both. */
|
|
57
|
+
export declare function eachRunnerOf(source: string): EachRunner;
|
|
58
|
+
/** pretty-format `{ min: true, maxDepth: 1 }`: strings double-quoted (only `"` and `\` escaped), keys sorted. */
|
|
59
|
+
export declare function prettyMin(v: unknown, depth?: number): string;
|
|
60
|
+
/**
|
|
61
|
+
* Each row's title exactly as `runner` names the test, as the literal segments
|
|
62
|
+
* between the title's `${...}` parts (one segment when it has none), or null for
|
|
63
|
+
* a row not reproduced. An unknown runner keeps a row only when vitest and jest
|
|
64
|
+
* give it the identical title.
|
|
65
|
+
*/
|
|
66
|
+
export declare function renderTableTitles(parts: readonly TitlePart[], table: EachTableInput, runner: EachRunner): (string[] | null)[];
|
|
67
|
+
//# sourceMappingURL=each-title-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"each-title-render.d.ts","sourceRoot":"","sources":["../../../src/verify/shortfalls/each-title-render.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE1D,kEAAkE;AAClE,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvD,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE;AAE9D,wGAAwG;AACxG,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC;AAExE,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAIvD;AAwBD,iHAAiH;AACjH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,MAAM,CAWvD;AAsUD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAa7H"}
|