@typed-sql/conformance 2.0.0-rc.1 → 2.1.0-rc.1
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 +69 -0
- package/README.md +30 -20
- package/dist/packages/conformance/src/assertions.d.ts +7 -1
- package/dist/packages/conformance/src/assertions.d.ts.map +1 -1
- package/dist/packages/conformance/src/assertions.js +89 -1
- package/dist/packages/conformance/src/assertions.js.map +1 -1
- package/dist/packages/conformance/src/failure-injection.d.ts +24 -0
- package/dist/packages/conformance/src/failure-injection.d.ts.map +1 -0
- package/dist/packages/conformance/src/failure-injection.js +52 -0
- package/dist/packages/conformance/src/failure-injection.js.map +1 -0
- package/dist/packages/conformance/src/feature-ledger-markdown.d.ts +4 -0
- package/dist/packages/conformance/src/feature-ledger-markdown.d.ts.map +1 -0
- package/dist/packages/conformance/src/feature-ledger-markdown.js +58 -0
- package/dist/packages/conformance/src/feature-ledger-markdown.js.map +1 -0
- package/dist/packages/conformance/src/feature-ledger.d.ts +62 -0
- package/dist/packages/conformance/src/feature-ledger.d.ts.map +1 -0
- package/dist/packages/conformance/src/feature-ledger.js +347 -0
- package/dist/packages/conformance/src/feature-ledger.js.map +1 -0
- package/dist/packages/conformance/src/index.d.ts +6 -2
- package/dist/packages/conformance/src/index.d.ts.map +1 -1
- package/dist/packages/conformance/src/index.js +3 -1
- package/dist/packages/conformance/src/index.js.map +1 -1
- package/dist/packages/conformance/src/types.d.ts +60 -1
- package/dist/packages/conformance/src/types.d.ts.map +1 -1
- package/dist/packages/conformance/src/types.js +1 -0
- package/dist/packages/conformance/src/types.js.map +1 -1
- package/dist/packages/conformance/src/v2/contracts.d.ts +7 -0
- package/dist/packages/conformance/src/v2/contracts.d.ts.map +1 -0
- package/dist/packages/conformance/src/v2/contracts.js +97 -0
- package/dist/packages/conformance/src/v2/contracts.js.map +1 -0
- package/dist/packages/conformance/src/v2/fixtures.d.ts +4 -0
- package/dist/packages/conformance/src/v2/fixtures.d.ts.map +1 -0
- package/dist/packages/conformance/src/v2/fixtures.js +58 -0
- package/dist/packages/conformance/src/v2/fixtures.js.map +1 -0
- package/dist/packages/conformance/src/v2/index.d.ts +9 -0
- package/dist/packages/conformance/src/v2/index.d.ts.map +1 -0
- package/dist/packages/conformance/src/v2/index.js +8 -0
- package/dist/packages/conformance/src/v2/index.js.map +1 -0
- package/dist/packages/conformance/src/v2/legacy.d.ts +6 -0
- package/dist/packages/conformance/src/v2/legacy.d.ts.map +1 -0
- package/dist/packages/conformance/src/v2/legacy.js +75 -0
- package/dist/packages/conformance/src/v2/legacy.js.map +1 -0
- package/dist/packages/conformance/src/v2/reporters.d.ts +4 -0
- package/dist/packages/conformance/src/v2/reporters.d.ts.map +1 -0
- package/dist/packages/conformance/src/v2/reporters.js +17 -0
- package/dist/packages/conformance/src/v2/reporters.js.map +1 -0
- package/dist/packages/conformance/src/v2/reproduction.d.ts +4 -0
- package/dist/packages/conformance/src/v2/reproduction.d.ts.map +1 -0
- package/dist/packages/conformance/src/v2/reproduction.js +35 -0
- package/dist/packages/conformance/src/v2/reproduction.js.map +1 -0
- package/dist/packages/conformance/src/v2/runner.d.ts +9 -0
- package/dist/packages/conformance/src/v2/runner.d.ts.map +1 -0
- package/dist/packages/conformance/src/v2/runner.js +369 -0
- package/dist/packages/conformance/src/v2/runner.js.map +1 -0
- package/dist/packages/conformance/src/v2/types.d.ts +204 -0
- package/dist/packages/conformance/src/v2/types.d.ts.map +1 -0
- package/dist/packages/conformance/src/v2/types.js +3 -0
- package/dist/packages/conformance/src/v2/types.js.map +1 -0
- package/package.json +5 -4
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { CONFORMANCE_VERSION, } from "./types.js";
|
|
2
|
+
const probeIdPattern = /^[a-z][a-z0-9]*(?:[.-][a-z][a-z0-9]*)+$/u;
|
|
3
|
+
const featureIdPattern = /^[a-z][a-z0-9]*(?:[.-][a-z][a-z0-9]*)+$/u;
|
|
4
|
+
const repositoryPathPattern = /^(?!\/)(?!.*(?:^|\/)\.\.?\/)[a-zA-Z0-9_.@/-]+$/u;
|
|
5
|
+
function freeze(value, seen = new Set()) {
|
|
6
|
+
if (typeof value !== "object" || value === null || seen.has(value))
|
|
7
|
+
return value;
|
|
8
|
+
seen.add(value);
|
|
9
|
+
for (const child of Object.values(value))
|
|
10
|
+
freeze(child, seen);
|
|
11
|
+
return Object.freeze(value);
|
|
12
|
+
}
|
|
13
|
+
function validateSelector(selector, label) {
|
|
14
|
+
if (selector.databaseVersion !== undefined &&
|
|
15
|
+
(selector.minimumDatabaseVersion !== undefined || selector.maximumDatabaseVersion !== undefined)) {
|
|
16
|
+
throw new TypeError(`${label} cannot combine an exact database version with a version range`);
|
|
17
|
+
}
|
|
18
|
+
if (selector.minimumDatabaseVersion !== undefined &&
|
|
19
|
+
selector.maximumDatabaseVersion !== undefined &&
|
|
20
|
+
selector.minimumDatabaseVersion.localeCompare(selector.maximumDatabaseVersion, undefined, { numeric: true }) > 0) {
|
|
21
|
+
throw new TypeError(`${label} has an inverted database version range`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function defineConformanceProbe(probe) {
|
|
25
|
+
if (probe.version !== CONFORMANCE_VERSION)
|
|
26
|
+
throw new TypeError("Unsupported conformance probe version");
|
|
27
|
+
if (!probeIdPattern.test(probe.id))
|
|
28
|
+
throw new TypeError(`Invalid conformance probe id ${JSON.stringify(probe.id)}`);
|
|
29
|
+
if (!featureIdPattern.test(probe.featureId))
|
|
30
|
+
throw new TypeError(`Invalid feature id ${JSON.stringify(probe.featureId)}`);
|
|
31
|
+
if (probe.grammar.length === 0)
|
|
32
|
+
throw new TypeError("Conformance probe grammar must not be empty");
|
|
33
|
+
if (probe.source.length === 0)
|
|
34
|
+
throw new TypeError("Conformance probe SQL must not be empty");
|
|
35
|
+
if (!repositoryPathPattern.test(probe.schemaFixture))
|
|
36
|
+
throw new TypeError("schemaFixture must be a repository path");
|
|
37
|
+
if (probe.targets.length === 0 || probe.expected.length === 0) {
|
|
38
|
+
throw new TypeError("Conformance probes require targets and expected outcomes");
|
|
39
|
+
}
|
|
40
|
+
for (const [index, target] of probe.targets.entries()) {
|
|
41
|
+
if (target.grammar !== probe.grammar)
|
|
42
|
+
throw new TypeError(`${probe.id}.targets[${index}] uses another grammar`);
|
|
43
|
+
}
|
|
44
|
+
for (const [index, outcome] of probe.expected.entries())
|
|
45
|
+
validateSelector(outcome.target, `${probe.id}.expected[${index}]`);
|
|
46
|
+
if (probe.quarantine !== undefined && Date.parse(probe.quarantine.expires) <= Date.now()) {
|
|
47
|
+
throw new TypeError(`${probe.id} quarantine expired`);
|
|
48
|
+
}
|
|
49
|
+
return freeze({ ...probe });
|
|
50
|
+
}
|
|
51
|
+
export function defineConformanceSuite(suite, ledger) {
|
|
52
|
+
if (suite.version !== CONFORMANCE_VERSION)
|
|
53
|
+
throw new TypeError("Unsupported conformance suite version");
|
|
54
|
+
if (suite.name.length === 0)
|
|
55
|
+
throw new TypeError("Conformance suite name must not be empty");
|
|
56
|
+
const probes = suite.probes.map(defineConformanceProbe);
|
|
57
|
+
if (new Set(probes.map(({ id }) => id)).size !== probes.length)
|
|
58
|
+
throw new TypeError("Conformance probe IDs must be unique");
|
|
59
|
+
if (ledger !== undefined) {
|
|
60
|
+
const features = new Set(ledger.entries.map(({ id }) => id));
|
|
61
|
+
for (const probe of probes) {
|
|
62
|
+
if (!features.has(probe.featureId))
|
|
63
|
+
throw new TypeError(`${probe.id} references unknown feature ${probe.featureId}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return freeze({ ...suite, probes });
|
|
67
|
+
}
|
|
68
|
+
function capabilitiesMatch(required, actual) {
|
|
69
|
+
if (required === undefined)
|
|
70
|
+
return true;
|
|
71
|
+
return Object.entries(required).every(([name, value]) => actual?.[name] === value);
|
|
72
|
+
}
|
|
73
|
+
export function targetMatches(selector, target) {
|
|
74
|
+
if (selector.grammarVersion !== undefined && selector.grammarVersion !== target.grammarVersion)
|
|
75
|
+
return false;
|
|
76
|
+
if (selector.databaseVersion !== undefined && selector.databaseVersion !== target.databaseVersion)
|
|
77
|
+
return false;
|
|
78
|
+
if (selector.minimumDatabaseVersion !== undefined &&
|
|
79
|
+
(target.databaseVersion === undefined ||
|
|
80
|
+
target.databaseVersion.localeCompare(selector.minimumDatabaseVersion, undefined, { numeric: true }) < 0)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (selector.maximumDatabaseVersion !== undefined &&
|
|
84
|
+
(target.databaseVersion === undefined ||
|
|
85
|
+
target.databaseVersion.localeCompare(selector.maximumDatabaseVersion, undefined, { numeric: true }) > 0)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return capabilitiesMatch(selector.capabilities, target.capabilities);
|
|
89
|
+
}
|
|
90
|
+
export function selectExpectedOutcome(probe, target) {
|
|
91
|
+
const matches = probe.expected.filter(({ target: selector }) => targetMatches(selector, target));
|
|
92
|
+
if (matches.length !== 1) {
|
|
93
|
+
throw new TypeError(`${probe.id} expected exactly one outcome for ${target.grammar}@${target.databaseVersion ?? "static"}`);
|
|
94
|
+
}
|
|
95
|
+
return matches[0];
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../../../src/v2/contracts.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,GAMpB,MAAM,YAAY,CAAC;AAEpB,MAAM,cAAc,GAAG,0CAA0C,CAAC;AAClE,MAAM,gBAAgB,GAAG,0CAA0C,CAAC;AACpE,MAAM,qBAAqB,GAAG,iDAAiD,CAAC;AAEhF,SAAS,MAAM,CAAQ,KAAY,EAAE,IAAI,GAAG,IAAI,GAAG,EAAU;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAmC,EAAE,KAAa;IAC1E,IACE,QAAQ,CAAC,eAAe,KAAK,SAAS;QACtC,CAAC,QAAQ,CAAC,sBAAsB,KAAK,SAAS,IAAI,QAAQ,CAAC,sBAAsB,KAAK,SAAS,CAAC,EAChG,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,gEAAgE,CAAC,CAAC;IAChG,CAAC;IACD,IACE,QAAQ,CAAC,sBAAsB,KAAK,SAAS;QAC7C,QAAQ,CAAC,sBAAsB,KAAK,SAAS;QAC7C,QAAQ,CAAC,sBAAsB,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAChH,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAuB;IAC5D,IAAI,KAAK,CAAC,OAAO,KAAK,mBAAmB;QAAE,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IACxG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpH,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QACzC,MAAM,IAAI,SAAS,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IACnG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IAC9F,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACrH,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;IAClF,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,YAAY,KAAK,wBAAwB,CAAC,CAAC;IAClH,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE;QACrD,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,aAAa,KAAK,GAAG,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACzF,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,MAA6B;IAC3F,IAAI,KAAK,CAAC,OAAO,KAAK,mBAAmB;QAAE,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IACxG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACxD,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QAC5D,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC9D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;gBAChC,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,+BAA+B,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAmD,EACnD,MAAyC;IAEzC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAmC,EAAE,MAAyB;IAC1F,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,IAAI,QAAQ,CAAC,cAAc,KAAK,MAAM,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC7G,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,IAAI,QAAQ,CAAC,eAAe,KAAK,MAAM,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAChH,IACE,QAAQ,CAAC,sBAAsB,KAAK,SAAS;QAC7C,CAAC,MAAM,CAAC,eAAe,KAAK,SAAS;YACnC,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAC1G,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IACE,QAAQ,CAAC,sBAAsB,KAAK,SAAS;QAC7C,CAAC,MAAM,CAAC,eAAe,KAAK,SAAS;YACnC,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAC1G,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAuB,EAAE,MAAyB;IACtF,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACjG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,SAAS,CACjB,GAAG,KAAK,CAAC,EAAE,qCAAqC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,eAAe,IAAI,QAAQ,EAAE,CACvG,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ConformanceProbe, type ConformanceSuite } from "./types.js";
|
|
2
|
+
export declare function discoverConformanceFixtures(root: string): Promise<ConformanceSuite>;
|
|
3
|
+
export declare function minimizeConformanceSource(probe: ConformanceProbe, preservesFailure: (candidate: ConformanceProbe) => boolean | Promise<boolean>): Promise<ConformanceProbe>;
|
|
4
|
+
//# sourceMappingURL=fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../../../src/v2/fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAa/F,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiBzF;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,gBAAgB,EACvB,gBAAgB,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAC5E,OAAO,CAAC,gBAAgB,CAAC,CAkB3B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { extname, join, relative } from "node:path";
|
|
3
|
+
import { defineConformanceProbe, defineConformanceSuite } from "./contracts.js";
|
|
4
|
+
import { CONFORMANCE_VERSION } from "./types.js";
|
|
5
|
+
async function fixturePaths(root, directory = root) {
|
|
6
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
7
|
+
const paths = [];
|
|
8
|
+
for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
9
|
+
const path = join(directory, entry.name);
|
|
10
|
+
if (entry.isDirectory())
|
|
11
|
+
paths.push(...(await fixturePaths(root, path)));
|
|
12
|
+
else if (entry.isFile() && extname(entry.name) === ".json" && entry.name.endsWith(".probe.json"))
|
|
13
|
+
paths.push(path);
|
|
14
|
+
}
|
|
15
|
+
return paths;
|
|
16
|
+
}
|
|
17
|
+
export async function discoverConformanceFixtures(root) {
|
|
18
|
+
const paths = await fixturePaths(root);
|
|
19
|
+
const probes = [];
|
|
20
|
+
for (const path of paths) {
|
|
21
|
+
let value;
|
|
22
|
+
try {
|
|
23
|
+
value = JSON.parse(await readFile(path, "utf8"));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new TypeError(`Invalid conformance fixture ${relative(root, path)}: ${String(error)}`);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
probes.push(defineConformanceProbe(value));
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new TypeError(`Invalid conformance fixture ${relative(root, path)}: ${String(error)}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return defineConformanceSuite({ version: CONFORMANCE_VERSION, name: root, probes });
|
|
36
|
+
}
|
|
37
|
+
export async function minimizeConformanceSource(probe, preservesFailure) {
|
|
38
|
+
let tokens = probe.source.match(/\S+\s*/gu) ?? [];
|
|
39
|
+
let width = Math.max(1, Math.floor(tokens.length / 2));
|
|
40
|
+
while (width >= 1) {
|
|
41
|
+
let reduced = false;
|
|
42
|
+
for (let start = 0; start + width <= tokens.length; start += 1) {
|
|
43
|
+
const source = [...tokens.slice(0, start), ...tokens.slice(start + width)].join("").trim();
|
|
44
|
+
if (source.length === 0)
|
|
45
|
+
continue;
|
|
46
|
+
const candidate = Object.freeze({ ...probe, source });
|
|
47
|
+
if (await preservesFailure(candidate)) {
|
|
48
|
+
tokens = candidate.source.match(/\S+\s*/gu) ?? [];
|
|
49
|
+
reduced = true;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!reduced)
|
|
54
|
+
width = Math.floor(width / 2);
|
|
55
|
+
}
|
|
56
|
+
return defineConformanceProbe({ ...probe, source: tokens.join("").trim() });
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../../../../src/v2/fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { defineConformanceProbe, defineConformanceSuite, selectExpectedOutcome, targetMatches, } from "./contracts.js";
|
|
2
|
+
export { discoverConformanceFixtures, minimizeConformanceSource, } from "./fixtures.js";
|
|
3
|
+
export { adaptGrammarConformanceV1, runAdaptedGrammarConformanceV1, } from "./legacy.js";
|
|
4
|
+
export { formatConformanceReport, serializeConformanceReport } from "./reporters.js";
|
|
5
|
+
export { createConformanceReproductionBundle, serializeConformanceReproductionBundle, } from "./reproduction.js";
|
|
6
|
+
export { assertExactConformance, CONFORMANCE_LAYERS, createConformanceReport, runLiveConformanceProbe, runStaticConformanceProbe, } from "./runner.js";
|
|
7
|
+
export type { ConformanceDifference, ConformanceEnvironment, ConformanceLayer, ConformanceLayerResult, ConformanceLayerStatus, ConformanceLiveAdapter, ConformanceLiveRequest, ConformanceNativeField, ConformanceParserResult, ConformancePreparedEvidence, ConformanceProbe, ConformanceProbeResult, ConformanceReport, ConformanceReproductionBundle, ConformanceServerErrorClass, ConformanceSkipReason, ConformanceStaticContext, ConformanceSuite, ConformanceSupport, ConformanceTarget, ConformanceTargetSelector, ConformanceTypeNormalizer, ExpectedColumn, ExpectedCompileResult, ExpectedDiagnostic, ExpectedOutcome, ExpectedParameter, ExpectedRenderedQuery, LiveProbePolicy, } from "./types.js";
|
|
8
|
+
export { CONFORMANCE_REPORT_FORMAT_VERSION, CONFORMANCE_VERSION } from "./types.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/v2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EACL,mCAAmC,EACnC,sCAAsC,GACvC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,6BAA6B,EAC7B,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iCAAiC,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { defineConformanceProbe, defineConformanceSuite, selectExpectedOutcome, targetMatches, } from "./contracts.js";
|
|
2
|
+
export { discoverConformanceFixtures, minimizeConformanceSource, } from "./fixtures.js";
|
|
3
|
+
export { adaptGrammarConformanceV1, runAdaptedGrammarConformanceV1, } from "./legacy.js";
|
|
4
|
+
export { formatConformanceReport, serializeConformanceReport } from "./reporters.js";
|
|
5
|
+
export { createConformanceReproductionBundle, serializeConformanceReproductionBundle, } from "./reproduction.js";
|
|
6
|
+
export { assertExactConformance, CONFORMANCE_LAYERS, createConformanceReport, runLiveConformanceProbe, runStaticConformanceProbe, } from "./runner.js";
|
|
7
|
+
export { CONFORMANCE_REPORT_FORMAT_VERSION, CONFORMANCE_VERSION } from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/v2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EACL,mCAAmC,EACnC,sCAAsC,GACvC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAgCrB,OAAO,EAAE,iCAAiC,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SchemaSnapshot } from "@typed-sql/core";
|
|
2
|
+
import type { GrammarConformanceFixture } from "../types.js";
|
|
3
|
+
import { type ConformanceProbeResult, type ConformanceSuite } from "./types.js";
|
|
4
|
+
export declare function adaptGrammarConformanceV1<Snapshot extends SchemaSnapshot, Policy>(fixture: GrammarConformanceFixture<Snapshot, Policy>): ConformanceSuite;
|
|
5
|
+
export declare function runAdaptedGrammarConformanceV1<Snapshot extends SchemaSnapshot, Policy>(fixture: GrammarConformanceFixture<Snapshot, Policy>): readonly ConformanceProbeResult[];
|
|
6
|
+
//# sourceMappingURL=legacy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../../../../src/v2/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAwB,yBAAyB,EAAwB,MAAM,aAAa,CAAC;AAGzG,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAGtB,MAAM,YAAY,CAAC;AA8CpB,wBAAgB,yBAAyB,CAAC,QAAQ,SAAS,cAAc,EAAE,MAAM,EAC/E,OAAO,EAAE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,GACnD,gBAAgB,CAmBlB;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,SAAS,cAAc,EAAE,MAAM,EACpF,OAAO,EAAE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,GACnD,SAAS,sBAAsB,EAAE,CAenC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { defineConformanceProbe, defineConformanceSuite } from "./contracts.js";
|
|
2
|
+
import { runStaticConformanceProbe } from "./runner.js";
|
|
3
|
+
import { CONFORMANCE_VERSION, } from "./types.js";
|
|
4
|
+
const legacyFeatures = Object.freeze({
|
|
5
|
+
select: "statement.select",
|
|
6
|
+
parameters: "expression.operator",
|
|
7
|
+
nullability: "resolver.catalog",
|
|
8
|
+
joins: "query.join",
|
|
9
|
+
ctes: "query.cte",
|
|
10
|
+
functions: "expression.function.call",
|
|
11
|
+
dml: "statement.update",
|
|
12
|
+
});
|
|
13
|
+
function expectedOutcome(fixture, probe) {
|
|
14
|
+
const analysis = fixture.dialect.analyze(probe.sql, fixture.snapshot);
|
|
15
|
+
return {
|
|
16
|
+
target: { grammarVersion: fixture.dialect.grammarVersion },
|
|
17
|
+
support: "exact",
|
|
18
|
+
rows: analysis.columns.map(({ name, tsType, nullable, databaseType, range }) => ({
|
|
19
|
+
name,
|
|
20
|
+
tsType,
|
|
21
|
+
nullable,
|
|
22
|
+
...(databaseType === undefined ? {} : { databaseType }),
|
|
23
|
+
range,
|
|
24
|
+
})),
|
|
25
|
+
parameters: analysis.parameters.map(({ index, tsType, nullable, databaseType }) => ({
|
|
26
|
+
index,
|
|
27
|
+
tsType,
|
|
28
|
+
nullable,
|
|
29
|
+
...(databaseType === undefined ? {} : { databaseType }),
|
|
30
|
+
})),
|
|
31
|
+
diagnostics: analysis.diagnostics.map(({ code, severity, range }) => ({ code, severity, range })),
|
|
32
|
+
resultKind: analysis.resultKind ?? "rows",
|
|
33
|
+
skips: {
|
|
34
|
+
"lex-parse": "grammar-parser-private",
|
|
35
|
+
compile: "no-compiler-source",
|
|
36
|
+
render: "no-runtime-query",
|
|
37
|
+
prepare: "no-live-adapter",
|
|
38
|
+
execute: "no-live-adapter",
|
|
39
|
+
plan: "no-live-adapter",
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function adaptGrammarConformanceV1(fixture) {
|
|
44
|
+
const target = Object.freeze({
|
|
45
|
+
grammar: fixture.dialect.id,
|
|
46
|
+
grammarVersion: fixture.dialect.grammarVersion,
|
|
47
|
+
});
|
|
48
|
+
const probes = Object.entries(fixture.probes).map(([name, probe]) => {
|
|
49
|
+
const requiredName = name;
|
|
50
|
+
return defineConformanceProbe({
|
|
51
|
+
version: CONFORMANCE_VERSION,
|
|
52
|
+
id: `${fixture.dialect.id}.legacy.${name}`,
|
|
53
|
+
featureId: legacyFeatures[requiredName],
|
|
54
|
+
grammar: fixture.dialect.id,
|
|
55
|
+
targets: [target],
|
|
56
|
+
source: probe.sql,
|
|
57
|
+
schemaFixture: `legacy/${fixture.dialect.id}/schema.json`,
|
|
58
|
+
expected: [expectedOutcome(fixture, probe)],
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
return defineConformanceSuite({ version: CONFORMANCE_VERSION, name: `${fixture.name}-legacy-v2`, probes });
|
|
62
|
+
}
|
|
63
|
+
export function runAdaptedGrammarConformanceV1(fixture) {
|
|
64
|
+
const suite = adaptGrammarConformanceV1(fixture);
|
|
65
|
+
const target = Object.freeze({
|
|
66
|
+
grammar: fixture.dialect.id,
|
|
67
|
+
grammarVersion: fixture.dialect.grammarVersion,
|
|
68
|
+
});
|
|
69
|
+
return Object.freeze(suite.probes.map((probe) => runStaticConformanceProbe(probe, target, {
|
|
70
|
+
dialect: fixture.dialect,
|
|
71
|
+
snapshot: fixture.snapshot,
|
|
72
|
+
renderer: fixture.renderer,
|
|
73
|
+
})));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=legacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../../../../src/v2/legacy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporters.d.ts","sourceRoot":"","sources":["../../../../../src/v2/reporters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAE5E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAczE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function serializeConformanceReport(report) {
|
|
2
|
+
return `${JSON.stringify(report, null, 2)}\n`;
|
|
3
|
+
}
|
|
4
|
+
export function formatConformanceReport(report) {
|
|
5
|
+
const lines = [
|
|
6
|
+
`${report.suite}: ${report.summary.pass} passed, ${report.summary.fail} failed, ${report.summary.skip} skipped, ${report.summary.quarantined} quarantined`,
|
|
7
|
+
`target ${report.environment.grammar}@${report.environment.grammarVersion}${report.environment.databaseVersion === undefined ? "" : ` / database ${report.environment.databaseVersion}`}`,
|
|
8
|
+
];
|
|
9
|
+
for (const result of report.results.filter(({ status }) => status !== "pass")) {
|
|
10
|
+
lines.push(`${result.status.toUpperCase()} ${result.probeId} (${result.featureId})`);
|
|
11
|
+
for (const layer of result.layers.filter(({ status }) => status !== "pass")) {
|
|
12
|
+
lines.push(` ${layer.layer}: ${layer.status}${layer.skipReason === undefined ? "" : ` (${layer.skipReason})`}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return `${lines.join("\n")}\n`;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=reporters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporters.js","sourceRoot":"","sources":["../../../../../src/v2/reporters.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,0BAA0B,CAAC,MAAyB;IAClE,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAyB;IAC/D,MAAM,KAAK,GAAG;QACZ,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,YAAY,MAAM,CAAC,OAAO,CAAC,IAAI,YAAY,MAAM,CAAC,OAAO,CAAC,IAAI,aAAa,MAAM,CAAC,OAAO,CAAC,WAAW,cAAc;QAC1J,UAAU,MAAM,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,WAAW,CAAC,cAAc,GACvE,MAAM,CAAC,WAAW,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,WAAW,CAAC,eAAe,EAC3G,EAAE;KACH,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QACrF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ConformanceEnvironment, ConformanceProbe, ConformanceProbeResult, ConformanceReproductionBundle, ConformanceTarget, ExpectedOutcome } from "./types.js";
|
|
2
|
+
export declare function createConformanceReproductionBundle(probe: ConformanceProbe, target: ConformanceTarget, environment: ConformanceEnvironment, expected: ExpectedOutcome, actual: ConformanceProbeResult): ConformanceReproductionBundle;
|
|
3
|
+
export declare function serializeConformanceReproductionBundle(bundle: ConformanceReproductionBundle): string;
|
|
4
|
+
//# sourceMappingURL=reproduction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reproduction.d.ts","sourceRoot":"","sources":["../../../../../src/v2/reproduction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,6BAA6B,EAC7B,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAC;AAmBpB,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,sBAAsB,EACnC,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,sBAAsB,GAC7B,6BAA6B,CAc/B;AAED,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,6BAA6B,GAAG,MAAM,CAEpG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function redactOutcome(outcome) {
|
|
2
|
+
return Object.freeze({
|
|
3
|
+
...outcome,
|
|
4
|
+
...(outcome.rendered === undefined
|
|
5
|
+
? {}
|
|
6
|
+
: {
|
|
7
|
+
rendered: Object.freeze({
|
|
8
|
+
...outcome.rendered,
|
|
9
|
+
values: Object.freeze(outcome.rendered.values.map(() => "[redacted]")),
|
|
10
|
+
}),
|
|
11
|
+
}),
|
|
12
|
+
...(outcome.decodedRows === undefined
|
|
13
|
+
? {}
|
|
14
|
+
: { decodedRows: Object.freeze(outcome.decodedRows.map(() => "[redacted]")) }),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export function createConformanceReproductionBundle(probe, target, environment, expected, actual) {
|
|
18
|
+
const databaseArgument = target.databaseVersion === undefined ? "" : ` --database-version ${target.databaseVersion}`;
|
|
19
|
+
return Object.freeze({
|
|
20
|
+
formatVersion: 1,
|
|
21
|
+
probeId: probe.id,
|
|
22
|
+
featureId: probe.featureId,
|
|
23
|
+
source: probe.source,
|
|
24
|
+
schemaFixture: probe.schemaFixture,
|
|
25
|
+
target,
|
|
26
|
+
environment,
|
|
27
|
+
expected: redactOutcome(expected),
|
|
28
|
+
actual,
|
|
29
|
+
command: `pnpm conformance:v2 -- --probe ${probe.id} --grammar ${probe.grammar}${databaseArgument}`,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export function serializeConformanceReproductionBundle(bundle) {
|
|
33
|
+
return `${JSON.stringify(bundle, null, 2)}\n`;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=reproduction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reproduction.js","sourceRoot":"","sources":["../../../../../src/v2/reproduction.ts"],"names":[],"mappings":"AASA,SAAS,aAAa,CAAC,OAAwB;IAC7C,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,OAAO;QACV,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS;YAChC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;oBACtB,GAAG,OAAO,CAAC,QAAQ;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;iBACvE,CAAC;aACH,CAAC;QACN,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS;YACnC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,KAAuB,EACvB,MAAyB,EACzB,WAAmC,EACnC,QAAyB,EACzB,MAA8B;IAE9B,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,MAAM,CAAC,eAAe,EAAE,CAAC;IACrH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,MAAM;QACN,WAAW;QACX,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC;QACjC,MAAM;QACN,OAAO,EAAE,kCAAkC,KAAK,CAAC,EAAE,cAAc,KAAK,CAAC,OAAO,GAAG,gBAAgB,EAAE;KACpG,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sCAAsC,CAAC,MAAqC;IAC1F,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type SchemaSnapshot } from "@typed-sql/core";
|
|
2
|
+
import { type ConformanceEnvironment, type ConformanceLiveAdapter, type ConformanceProbe, type ConformanceProbeResult, type ConformanceReport, type ConformanceStaticContext, type ConformanceTarget, type ConformanceTypeNormalizer } from "./types.js";
|
|
3
|
+
declare const allLayers: readonly ["lex-parse", "resolve", "compile", "render", "prepare", "execute", "plan"];
|
|
4
|
+
export declare function runStaticConformanceProbe<Snapshot extends SchemaSnapshot, Policy>(probe: ConformanceProbe, target: ConformanceTarget, context: ConformanceStaticContext<Snapshot, Policy>): ConformanceProbeResult;
|
|
5
|
+
export declare function runLiveConformanceProbe(probe: ConformanceProbe, target: ConformanceTarget, adapter: ConformanceLiveAdapter, normalizer: ConformanceTypeNormalizer, staticResult?: ConformanceProbeResult): Promise<ConformanceProbeResult>;
|
|
6
|
+
export declare function createConformanceReport(suite: string, environment: ConformanceEnvironment, results: readonly ConformanceProbeResult[], generatedAt?: Date): ConformanceReport;
|
|
7
|
+
export declare function assertExactConformance(report: ConformanceReport): void;
|
|
8
|
+
export { allLayers as CONFORMANCE_LAYERS };
|
|
9
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../../src/v2/runner.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,cAAc,EAAoB,MAAM,iBAAiB,CAAC;AAEjG,OAAO,EAIL,KAAK,sBAAsB,EAG3B,KAAK,sBAAsB,EAG3B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EAEtB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAK/B,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,SAAS,sFAQkC,CAAC;AAmKlD,wBAAgB,yBAAyB,CAAC,QAAQ,SAAS,cAAc,EAAE,MAAM,EAC/E,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,GAClD,sBAAsB,CAsGxB;AAkCD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,yBAAyB,EACrC,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,sBAAsB,CAAC,CA6DjC;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,sBAAsB,EACnC,OAAO,EAAE,SAAS,sBAAsB,EAAE,EAC1C,WAAW,OAAa,GACvB,iBAAiB,CAsBnB;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAOtE;AAED,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,CAAC"}
|