@aotter/mantle-runtime 0.1.0-alpha.9 → 0.1.2-alpha.2
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 +74 -4
- package/dist/MantleRuntime.js +14 -6
- package/dist/MantleRuntime.js.map +1 -1
- package/dist/domain/model/EntryRow.d.ts +16 -16
- package/dist/domain/model/EntryRow.d.ts.map +1 -1
- package/dist/domain/model/EntryRow.js +34 -0
- package/dist/domain/model/EntryRow.js.map +1 -1
- package/dist/domain/port/DatabaseDriver.d.ts +2 -2
- package/dist/domain/port/DatabaseDriver.d.ts.map +1 -1
- package/dist/domain/port/EntryReader.d.ts +38 -3
- package/dist/domain/port/EntryReader.d.ts.map +1 -1
- package/dist/domain/port/EntryRepository.d.ts +13 -6
- package/dist/domain/port/EntryRepository.d.ts.map +1 -1
- package/dist/domain/port/index.d.ts +2 -2
- package/dist/domain/port/index.d.ts.map +1 -1
- package/dist/domain/port/index.js.map +1 -1
- package/dist/domain/service/CallableCapabilityProjector.d.ts +28 -0
- package/dist/domain/service/CallableCapabilityProjector.d.ts.map +1 -0
- package/dist/domain/service/CallableCapabilityProjector.js +67 -0
- package/dist/domain/service/CallableCapabilityProjector.js.map +1 -0
- package/dist/domain/service/EntryMutationDiagnostics.d.ts.map +1 -1
- package/dist/domain/service/EntryMutationDiagnostics.js +11 -1
- package/dist/domain/service/EntryMutationDiagnostics.js.map +1 -1
- package/dist/domain/service/PathMatcher.d.ts +7 -0
- package/dist/domain/service/PathMatcher.d.ts.map +1 -1
- package/dist/domain/service/PathMatcher.js +56 -0
- package/dist/domain/service/PathMatcher.js.map +1 -1
- package/dist/domain/service/RuntimePlanCompiler.d.ts +7 -2
- package/dist/domain/service/RuntimePlanCompiler.d.ts.map +1 -1
- package/dist/domain/service/RuntimePlanCompiler.js +1 -0
- package/dist/domain/service/RuntimePlanCompiler.js.map +1 -1
- package/dist/domain/service/index.d.ts +1 -0
- package/dist/domain/service/index.d.ts.map +1 -1
- package/dist/domain/service/index.js +1 -0
- package/dist/domain/service/index.js.map +1 -1
- package/dist/domain/service/io/JoinedEntryReader.d.ts.map +1 -1
- package/dist/domain/service/io/JoinedEntryReader.js +2 -3
- package/dist/domain/service/io/JoinedEntryReader.js.map +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/boot/SqliteMigrationRunner.d.ts +1 -0
- package/dist/infrastructure/boot/SqliteMigrationRunner.d.ts.map +1 -1
- package/dist/infrastructure/boot/SqliteMigrationRunner.js +71 -12
- package/dist/infrastructure/boot/SqliteMigrationRunner.js.map +1 -1
- package/dist/infrastructure/boot/bootState.d.ts +2 -0
- package/dist/infrastructure/boot/bootState.d.ts.map +1 -1
- package/dist/infrastructure/boot/bootState.js +3 -1
- package/dist/infrastructure/boot/bootState.js.map +1 -1
- package/dist/infrastructure/boot/canonicalMigrations.d.ts +4 -15
- package/dist/infrastructure/boot/canonicalMigrations.d.ts.map +1 -1
- package/dist/infrastructure/boot/canonicalMigrations.js +14 -200
- package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -1
- package/dist/infrastructure/boot/index.d.ts +2 -2
- package/dist/infrastructure/boot/index.d.ts.map +1 -1
- package/dist/infrastructure/boot/index.js +2 -2
- package/dist/infrastructure/boot/index.js.map +1 -1
- package/dist/infrastructure/http/createMantleRequestHandler.d.ts +3 -0
- package/dist/infrastructure/http/createMantleRequestHandler.d.ts.map +1 -1
- package/dist/infrastructure/http/createMantleRequestHandler.js +36 -15
- package/dist/infrastructure/http/createMantleRequestHandler.js.map +1 -1
- package/dist/infrastructure/http/readJsonBody.d.ts +8 -0
- package/dist/infrastructure/http/readJsonBody.d.ts.map +1 -0
- package/dist/infrastructure/http/readJsonBody.js +36 -0
- package/dist/infrastructure/http/readJsonBody.js.map +1 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +22 -17
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +89 -86
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js.map +1 -1
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts +11 -9
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpToolCatalog.js +70 -80
- package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +15 -20
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js +291 -331
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts +2 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js +5 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js.map +1 -1
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts +2 -2
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js +5 -5
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js.map +1 -1
- package/dist/infrastructure/persistence/Pagination.d.ts +6 -0
- package/dist/infrastructure/persistence/Pagination.d.ts.map +1 -1
- package/dist/infrastructure/persistence/Pagination.js +25 -0
- package/dist/infrastructure/persistence/Pagination.js.map +1 -1
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.d.ts +15 -1
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.d.ts.map +1 -1
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.js +64 -9
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.js.map +1 -1
- package/dist/infrastructure/storage/SqliteMigrationArtifact.d.ts +19 -0
- package/dist/infrastructure/storage/SqliteMigrationArtifact.d.ts.map +1 -0
- package/dist/infrastructure/storage/SqliteMigrationArtifact.js +41 -0
- package/dist/infrastructure/storage/SqliteMigrationArtifact.js.map +1 -0
- package/dist/infrastructure/storage/SqliteSchemaTables.d.ts +23 -0
- package/dist/infrastructure/storage/SqliteSchemaTables.d.ts.map +1 -0
- package/dist/infrastructure/storage/SqliteSchemaTables.js +244 -0
- package/dist/infrastructure/storage/SqliteSchemaTables.js.map +1 -0
- package/dist/infrastructure/storage/SqliteViewCompiler.d.ts +3 -5
- package/dist/infrastructure/storage/SqliteViewCompiler.d.ts.map +1 -1
- package/dist/infrastructure/storage/SqliteViewCompiler.js +20 -51
- package/dist/infrastructure/storage/SqliteViewCompiler.js.map +1 -1
- package/dist/infrastructure/testing/HttpBenchmarkHarness.d.ts +26 -1
- package/dist/infrastructure/testing/HttpBenchmarkHarness.d.ts.map +1 -1
- package/dist/infrastructure/testing/HttpBenchmarkHarness.js +27 -12
- package/dist/infrastructure/testing/HttpBenchmarkHarness.js.map +1 -1
- package/dist/infrastructure/testing/IndexCoverageHarness.d.ts.map +1 -1
- package/dist/infrastructure/testing/IndexCoverageHarness.js +19 -31
- package/dist/infrastructure/testing/IndexCoverageHarness.js.map +1 -1
- package/dist/infrastructure/testing/StorageConformance.d.ts +32 -0
- package/dist/infrastructure/testing/StorageConformance.d.ts.map +1 -0
- package/dist/infrastructure/testing/StorageConformance.js +306 -0
- package/dist/infrastructure/testing/StorageConformance.js.map +1 -0
- package/dist/testing-storage.d.ts +3 -0
- package/dist/testing-storage.d.ts.map +1 -0
- package/dist/testing-storage.js +3 -0
- package/dist/testing-storage.js.map +1 -0
- package/dist/usecase/content/ArchiveUseCase.js +4 -4
- package/dist/usecase/content/ArchiveUseCase.js.map +1 -1
- package/dist/usecase/content/DeleteEntryUseCase.js +4 -4
- package/dist/usecase/content/DeleteEntryUseCase.js.map +1 -1
- package/dist/usecase/content/GetEntryUseCase.d.ts +1 -2
- package/dist/usecase/content/GetEntryUseCase.d.ts.map +1 -1
- package/dist/usecase/content/GetEntryUseCase.js +2 -6
- package/dist/usecase/content/GetEntryUseCase.js.map +1 -1
- package/dist/usecase/content/ListEntriesUseCase.d.ts +1 -1
- package/dist/usecase/content/ListEntriesUseCase.d.ts.map +1 -1
- package/dist/usecase/content/ListEntriesUseCase.js +18 -2
- package/dist/usecase/content/ListEntriesUseCase.js.map +1 -1
- package/dist/usecase/content/RequestPublishUseCase.js +4 -4
- package/dist/usecase/content/RequestPublishUseCase.js.map +1 -1
- package/dist/usecase/content/UnpublishUseCase.js +4 -4
- package/dist/usecase/content/UnpublishUseCase.js.map +1 -1
- package/dist/usecase/content/UpdateDraftUseCase.js +4 -4
- package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -1
- package/dist/usecase/dto/content/index.d.ts +8 -5
- package/dist/usecase/dto/content/index.d.ts.map +1 -1
- package/dist/usecase/media/DeleteMediaAssetUseCase.d.ts +3 -3
- package/dist/usecase/media/DeleteMediaAssetUseCase.d.ts.map +1 -1
- package/dist/usecase/media/DeleteMediaAssetUseCase.js +35 -19
- package/dist/usecase/media/DeleteMediaAssetUseCase.js.map +1 -1
- package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts +8 -2
- package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts.map +1 -1
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js +98 -16
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js.map +1 -1
- package/dist/usecase/procedure/InvokeProcedureUseCase.js +2 -2
- package/dist/usecase/procedure/InvokeProcedureUseCase.js.map +1 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.d.ts.map +1 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.js +8 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.js.map +1 -1
- package/package.json +9 -5
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export async function benchmarkHttpRoutes(options) {
|
|
3
3
|
const rounds = clampCount(options.rounds, 20, 1, 500);
|
|
4
4
|
const warmup = clampCount(options.warmup, 2, 0, 50);
|
|
5
|
+
const concurrency = clampCount(options.concurrency, 1, 1, 8);
|
|
5
6
|
const fetcher = options.fetch ?? globalThis.fetch;
|
|
6
7
|
const results = [];
|
|
7
8
|
for (const target of options.targets) {
|
|
@@ -9,17 +10,24 @@ export async function benchmarkHttpRoutes(options) {
|
|
|
9
10
|
await sample(fetcher, target, index);
|
|
10
11
|
}
|
|
11
12
|
const timings = [];
|
|
13
|
+
const ttfbs = [];
|
|
14
|
+
const bytes = [];
|
|
12
15
|
const queryCounts = [];
|
|
13
16
|
const rowsRead = [];
|
|
14
17
|
let status = 0;
|
|
15
|
-
for (let
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
for (let offset = 0; offset < rounds; offset += concurrency) {
|
|
19
|
+
const batch = await Promise.all(Array.from({ length: Math.min(concurrency, rounds - offset) }, (_, index) => sample(fetcher, target, offset + index + warmup)));
|
|
20
|
+
for (const current of batch) {
|
|
21
|
+
status = current.status;
|
|
22
|
+
timings.push(current.elapsedMs);
|
|
23
|
+
ttfbs.push(current.ttfbMs);
|
|
24
|
+
bytes.push(current.responseBytes);
|
|
25
|
+
if (current.queryCount !== undefined)
|
|
26
|
+
queryCounts.push(current.queryCount);
|
|
27
|
+
if (current.rowsRead !== undefined)
|
|
28
|
+
rowsRead.push(current.rowsRead);
|
|
29
|
+
options.onSample?.(current);
|
|
30
|
+
}
|
|
23
31
|
}
|
|
24
32
|
assertMetricCoverage(target.name, "x-mantle-query-count", queryCounts.length, rounds);
|
|
25
33
|
assertMetricCoverage(target.name, "x-mantle-rows-read", rowsRead.length, rounds);
|
|
@@ -28,6 +36,8 @@ export async function benchmarkHttpRoutes(options) {
|
|
|
28
36
|
samples: rounds,
|
|
29
37
|
status,
|
|
30
38
|
timingMs: distribution(timings),
|
|
39
|
+
ttfbMs: distribution(ttfbs),
|
|
40
|
+
responseBytes: distribution(bytes),
|
|
31
41
|
...(queryCounts.length > 0 ? { queryCount: distribution(queryCounts) } : {}),
|
|
32
42
|
...(rowsRead.length > 0 ? { rowsRead: distribution(rowsRead) } : {}),
|
|
33
43
|
});
|
|
@@ -35,19 +45,24 @@ export async function benchmarkHttpRoutes(options) {
|
|
|
35
45
|
return { version: 1, rounds, warmup, results };
|
|
36
46
|
}
|
|
37
47
|
async function sample(fetcher, target, iteration) {
|
|
48
|
+
// Token/proof generation and assertions are client setup, not Worker latency.
|
|
49
|
+
const init = typeof target.init === "function" ? await target.init(iteration) : target.init;
|
|
50
|
+
const url = typeof target.url === "function" ? target.url(iteration) : target.url;
|
|
38
51
|
const start = performance.now();
|
|
39
|
-
const response = await fetcher(
|
|
40
|
-
|
|
52
|
+
const response = await fetcher(url, init);
|
|
53
|
+
const ttfbMs = performance.now() - start;
|
|
54
|
+
const body = await response.arrayBuffer();
|
|
41
55
|
const elapsedMs = performance.now() - start;
|
|
42
56
|
const expected = target.expectedStatus ?? 200;
|
|
43
57
|
if (response.status !== expected) {
|
|
44
58
|
throw new Error(`${target.name} returned ${response.status}; expected ${expected}`);
|
|
45
59
|
}
|
|
60
|
+
await target.validate?.(response, body);
|
|
46
61
|
const queryCount = numberHeader(response, "x-mantle-query-count");
|
|
47
62
|
const rowsRead = numberHeader(response, "x-mantle-rows-read");
|
|
48
63
|
return {
|
|
49
|
-
status: response.status,
|
|
50
|
-
elapsedMs,
|
|
64
|
+
name: target.name, iteration, status: response.status,
|
|
65
|
+
ttfbMs, elapsedMs, responseBytes: body.byteLength,
|
|
51
66
|
...(queryCount === undefined ? {} : { queryCount }),
|
|
52
67
|
...(rowsRead === undefined ? {} : { rowsRead }),
|
|
53
68
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpBenchmarkHarness.js","sourceRoot":"","sources":["../../../src/infrastructure/testing/HttpBenchmarkHarness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HttpBenchmarkHarness.js","sourceRoot":"","sources":["../../../src/infrastructure/testing/HttpBenchmarkHarness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexCoverageHarness.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/testing/IndexCoverageHarness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IndexCoverageHarness.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/testing/IndexCoverageHarness.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAK/E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;QACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;KACjC,CAAC;CACH;AAMD,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CA+CrB"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { DatabaseSync } from "node:sqlite";
|
|
2
|
-
import { RESERVED_ENTRY_COLUMNS,
|
|
2
|
+
import { RESERVED_ENTRY_COLUMNS, } from "@aotter/mantle-spec";
|
|
3
3
|
import { compileView } from "../storage/SqliteViewCompiler.js";
|
|
4
4
|
import { CANONICAL_MIGRATIONS } from "../boot/canonicalMigrations.js";
|
|
5
|
+
import { quoteIdent, schemaTableMigrations } from "../storage/SqliteSchemaTables.js";
|
|
5
6
|
/** Execute real compiled Views against the real schema in crowded SQLite. */
|
|
6
7
|
export function inspectIndexCoverage(runtimePlan, options = {}) {
|
|
7
8
|
const rowsPerSchema = clampRows(options.rowsPerSchema);
|
|
@@ -13,14 +14,8 @@ export function inspectIndexCoverage(runtimePlan, options = {}) {
|
|
|
13
14
|
try {
|
|
14
15
|
for (const migration of CANONICAL_MIGRATIONS)
|
|
15
16
|
db.exec(migration.sql);
|
|
16
|
-
for (const
|
|
17
|
-
|
|
18
|
-
for (const column of ddl.columns)
|
|
19
|
-
db.exec(column.sql);
|
|
20
|
-
for (const index of ddl.indexes)
|
|
21
|
-
db.exec(index.sql);
|
|
22
|
-
db.exec(buildSchemaSqlView(schema).createSql);
|
|
23
|
-
}
|
|
17
|
+
for (const migration of schemaTableMigrations(schemas))
|
|
18
|
+
db.exec(migration.sql);
|
|
24
19
|
seedSchemas(db, schemas, rowsPerSchema);
|
|
25
20
|
db.exec("ANALYZE");
|
|
26
21
|
const paths = views.map((view) => inspectView(db, view, view.spec.from ? schemasByName.get(view.spec.from) : undefined, (options.requirePublic === true && view.spec.surface !== "staff") ||
|
|
@@ -60,23 +55,22 @@ function inspectView(db, view, schema, explicitlyRequired) {
|
|
|
60
55
|
.map(({ detail }) => detail);
|
|
61
56
|
const rows = db.prepare(compiled.sql).all(...sqliteParams);
|
|
62
57
|
const usedIndexes = [...new Set(plan.flatMap(indexFromPlan))];
|
|
63
|
-
const
|
|
64
|
-
const tableScan =
|
|
65
|
-
const indexedScan =
|
|
58
|
+
const tableAccess = plan.filter((detail) => /\b(?:SCAN|SEARCH)\b/.test(detail));
|
|
59
|
+
const tableScan = tableAccess.some((detail) => !/\bUSING (?:COVERING )?INDEX\b/.test(detail));
|
|
60
|
+
const indexedScan = tableAccess.some((detail) => /\bUSING (?:COVERING )?INDEX\b/.test(detail));
|
|
66
61
|
const temporarySort = plan.some((detail) => /USE TEMP B-TREE.*ORDER BY/.test(detail));
|
|
67
62
|
const accessFields = [...dataAccessFields(view)].sort();
|
|
68
63
|
const filterFields = [...dataFilterFields(view)].sort();
|
|
69
|
-
const
|
|
70
|
-
const usedSchemaFields = new Set(usedIndexes.flatMap((name) => schemaIndexFields.get(name) ?? []));
|
|
64
|
+
const usedSchemaFields = new Set(usedIndexes.flatMap((name) => indexFields(db, name)));
|
|
71
65
|
const schemaIndexRequired = accessFields.length > 0;
|
|
72
66
|
const schemaIndexUsed = schemaIndexRequired &&
|
|
73
67
|
accessFields.every((field) => usedSchemaFields.has(field));
|
|
74
68
|
const findings = [];
|
|
75
69
|
if (tableScan)
|
|
76
|
-
findings.push("full
|
|
70
|
+
findings.push("full table scan");
|
|
77
71
|
if (indexedScan &&
|
|
78
72
|
filterFields.length > 0 &&
|
|
79
|
-
!plan.some((detail) => /\bSEARCH
|
|
73
|
+
!plan.some((detail) => /\bSEARCH\b/.test(detail))) {
|
|
80
74
|
findings.push("data-field filter scans an index without a searchable prefix");
|
|
81
75
|
}
|
|
82
76
|
if (temporarySort)
|
|
@@ -104,28 +98,22 @@ function inspectView(db, view, schema, explicitlyRequired) {
|
|
|
104
98
|
findings,
|
|
105
99
|
};
|
|
106
100
|
}
|
|
107
|
-
function
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const declarations = [
|
|
111
|
-
...(schema.spec.uniqueIndexes ?? []),
|
|
112
|
-
...(schema.spec.indexes ?? []),
|
|
113
|
-
];
|
|
114
|
-
return new Map(buildDdl(schema).indexes.map((index, position) => [
|
|
115
|
-
index.name,
|
|
116
|
-
declarations[position] ?? [],
|
|
117
|
-
]));
|
|
101
|
+
function indexFields(db, name) {
|
|
102
|
+
return db.prepare(`PRAGMA index_info(${quoteIdent(name)})`).all()
|
|
103
|
+
.map((row) => row.name);
|
|
118
104
|
}
|
|
119
105
|
function seedSchemas(db, schemas, rowsPerSchema) {
|
|
120
|
-
const insert = db.prepare(`INSERT OR IGNORE INTO entries
|
|
121
|
-
(id, collection, status, version, data, author_id, created_at, updated_at)
|
|
122
|
-
VALUES (?, ?, ?, 1, ?, NULL, ?, ?)`);
|
|
123
106
|
for (const schema of schemas) {
|
|
107
|
+
const fields = Object.keys(schema.spec.schema.properties ?? {});
|
|
108
|
+
const insert = db.prepare(`INSERT OR IGNORE INTO ${quoteIdent(schema.metadata.name)}
|
|
109
|
+
(${["_mantle_id", "_mantle_status", "_mantle_version", "_mantle_author_id", "_mantle_created_at", "_mantle_updated_at", ...fields].map(quoteIdent).join(", ")})
|
|
110
|
+
VALUES (${Array.from({ length: 6 + fields.length }, () => "?").join(", ")})`);
|
|
124
111
|
const singleUnique = new Set((schema.spec.uniqueIndexes ?? [])
|
|
125
112
|
.filter((fields) => fields.length === 1)
|
|
126
113
|
.map((fields) => fields[0]));
|
|
127
114
|
for (let index = 0; index < rowsPerSchema; index += 1) {
|
|
128
|
-
|
|
115
|
+
const data = sampleData(schema, index, singleUnique);
|
|
116
|
+
insert.run(`${schema.metadata.name}-${index}`, index % 5 === 0 ? "published" : "draft", 1, null, index, index, ...fields.map((field) => toSqliteValue(data[field])));
|
|
129
117
|
}
|
|
130
118
|
}
|
|
131
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexCoverageHarness.js","sourceRoot":"","sources":["../../../src/infrastructure/testing/IndexCoverageHarness.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IndexCoverageHarness.js","sourceRoot":"","sources":["../../../src/infrastructure/testing/IndexCoverageHarness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { PreparedMantleStorage } from "../../domain/port/MantleStorageAdapter.js";
|
|
2
|
+
import { type RuntimePlan } from "../../domain/service/RuntimePlanCompiler.js";
|
|
3
|
+
export interface StorageConformanceFixture {
|
|
4
|
+
readonly storage: PreparedMantleStorage;
|
|
5
|
+
/** Release all resources, including the isolated database, even after failure. */
|
|
6
|
+
readonly cleanup: () => void | Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export interface StorageConformanceOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Prepare a fresh, empty store for each check. Never supply a live database.
|
|
11
|
+
* Adapters with a locale policy must enable en, zh-TW and ja for this fixture.
|
|
12
|
+
*/
|
|
13
|
+
readonly create: (plan: RuntimePlan) => Promise<StorageConformanceFixture>;
|
|
14
|
+
}
|
|
15
|
+
export interface StorageConformanceFailure {
|
|
16
|
+
readonly check: string;
|
|
17
|
+
readonly phase: "setup" | "assertion" | "cleanup";
|
|
18
|
+
readonly message: string;
|
|
19
|
+
}
|
|
20
|
+
export interface StorageConformanceReport {
|
|
21
|
+
readonly ok: boolean;
|
|
22
|
+
/** Stable check identifiers, in execution order, including failed checks. */
|
|
23
|
+
readonly checks: readonly string[];
|
|
24
|
+
readonly failures: readonly StorageConformanceFailure[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check the existing semantic ports using synthetic JSON data and a sealed plan.
|
|
28
|
+
* Cases run sequentially with separate storage. Failures never suppress cleanup
|
|
29
|
+
* or later cases. This is a baseline, not certification of every adapter feature.
|
|
30
|
+
*/
|
|
31
|
+
export declare function runStorageConformance(options: StorageConformanceOptions): Promise<StorageConformanceReport>;
|
|
32
|
+
//# sourceMappingURL=StorageConformance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageConformance.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/testing/StorageConformance.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAEnG,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,yBAAyB,EAAE,CAAC;CACzD;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAwBnC"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { linkManifestSet, parseManifestSources } from "@aotter/mantle-spec";
|
|
2
|
+
import { EntryStatusConflict, EntryVersionConflict } from "../../domain/model/EntryRow.js";
|
|
3
|
+
import { compileRuntimePlan } from "../../domain/service/RuntimePlanCompiler.js";
|
|
4
|
+
/**
|
|
5
|
+
* Check the existing semantic ports using synthetic JSON data and a sealed plan.
|
|
6
|
+
* Cases run sequentially with separate storage. Failures never suppress cleanup
|
|
7
|
+
* or later cases. This is a baseline, not certification of every adapter feature.
|
|
8
|
+
*/
|
|
9
|
+
export async function runStorageConformance(options) {
|
|
10
|
+
const plan = fixturePlan();
|
|
11
|
+
const failures = [];
|
|
12
|
+
for (const [check, run] of checks) {
|
|
13
|
+
let fixture;
|
|
14
|
+
try {
|
|
15
|
+
fixture = await options.create(plan);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
failures.push({ check, phase: "setup", message: errorMessage(error) });
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
await run(fixture.storage);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
failures.push({ check, phase: "assertion", message: errorMessage(error) });
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
try {
|
|
29
|
+
await fixture.cleanup();
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
failures.push({ check, phase: "cleanup", message: errorMessage(error) });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { ok: failures.length === 0, checks: checks.map(([id]) => id), failures };
|
|
37
|
+
}
|
|
38
|
+
const collection = "conformance-posts";
|
|
39
|
+
const otherCollection = "conformance-other";
|
|
40
|
+
const key = (id, target = collection) => ({ id, collection: target });
|
|
41
|
+
const checks = [
|
|
42
|
+
["entries.crud", async ({ entries }) => {
|
|
43
|
+
equal(await entries.get(key("a")), null, "missing get");
|
|
44
|
+
equal(await entries.readById(key("a")), null, "missing readById");
|
|
45
|
+
const args = entry("a");
|
|
46
|
+
const created = await entries.create(args);
|
|
47
|
+
equal(created, {
|
|
48
|
+
id: "a", collection, status: "draft", version: 1, data: args.data,
|
|
49
|
+
authorId: "synthetic-author", createdAt: 100, updatedAt: 100, locale: "en",
|
|
50
|
+
}, "created row");
|
|
51
|
+
equal(await entries.get(key("a")), created, "persisted create");
|
|
52
|
+
const updated = await entries.update({
|
|
53
|
+
id: "a", collection, expectedVersion: 1, data: { title: "Replacement" }, now: 200,
|
|
54
|
+
});
|
|
55
|
+
equal(updated, {
|
|
56
|
+
id: "a", collection, status: "draft", version: 2,
|
|
57
|
+
data: { title: "Replacement", locale: null }, authorId: "synthetic-author",
|
|
58
|
+
createdAt: 100, updatedAt: 200,
|
|
59
|
+
}, "update replaces data and clears lifted locale");
|
|
60
|
+
equal(await entries.get(key("a")), updated, "persisted update");
|
|
61
|
+
equal(await entries.delete({
|
|
62
|
+
id: "a", collection: otherCollection, expectedVersion: 2, expectedStatus: "draft",
|
|
63
|
+
}), { removed: false }, "delete respects collection");
|
|
64
|
+
equal(await entries.get(key("a")), updated, "wrong-collection delete preserves row");
|
|
65
|
+
const deletion = { id: "a", collection, expectedVersion: 2, expectedStatus: "draft" };
|
|
66
|
+
equal(await entries.delete(deletion), { removed: true }, "delete existing row");
|
|
67
|
+
equal(await entries.get(key("a")), null, "deleted get");
|
|
68
|
+
equal(await entries.readById(key("a")), null, "deleted public read");
|
|
69
|
+
equal(await entries.delete(deletion), { removed: false }, "delete missing row");
|
|
70
|
+
}],
|
|
71
|
+
["entries.version-conflicts", async ({ entries }) => {
|
|
72
|
+
await entries.create(entry("a"));
|
|
73
|
+
const updates = await Promise.allSettled(["first", "second"].map((title) => entries.update({
|
|
74
|
+
id: "a", collection, expectedVersion: 1, data: { title }, now: 200,
|
|
75
|
+
})));
|
|
76
|
+
equal(updates.filter((result) => result.status === "fulfilled").length, 1, "one concurrent update wins");
|
|
77
|
+
const rejected = updates.find((result) => result.status === "rejected");
|
|
78
|
+
assert(rejected?.status === "rejected", "concurrent loser rejects");
|
|
79
|
+
assert(rejected.reason instanceof EntryVersionConflict, "concurrent loser is EntryVersionConflict");
|
|
80
|
+
equal([rejected.reason.id, rejected.reason.expected, rejected.reason.actual], ["a", 1, 2], "OCC details");
|
|
81
|
+
const before = await entries.get(key("a"));
|
|
82
|
+
assert(before !== null, "concurrent winner is persisted");
|
|
83
|
+
equal(before.version, 2, "only one version increment");
|
|
84
|
+
await conflict(() => entries.update({
|
|
85
|
+
id: "a", collection, expectedVersion: 1, data: { title: "stale" }, now: 300,
|
|
86
|
+
}), EntryVersionConflict, 1, 2);
|
|
87
|
+
await conflict(() => entries.transitionStatus({
|
|
88
|
+
id: "a", collection, expectedVersion: 1, expectedStatus: "draft", to: "published", now: 300,
|
|
89
|
+
}), EntryVersionConflict, 1, 2);
|
|
90
|
+
await conflict(() => entries.delete({
|
|
91
|
+
id: "a", collection, expectedVersion: 1, expectedStatus: "draft",
|
|
92
|
+
}), EntryVersionConflict, 1, 2);
|
|
93
|
+
equal(await entries.get(key("a")), before, "version conflicts leave row unchanged");
|
|
94
|
+
}],
|
|
95
|
+
["entries.status-conflicts", async ({ entries }) => {
|
|
96
|
+
const original = await entries.create(entry("a"));
|
|
97
|
+
await conflict(() => entries.transitionStatus({
|
|
98
|
+
id: "a", collection, expectedStatus: "published", expectedVersion: 1, to: "archived", now: 200,
|
|
99
|
+
}), EntryStatusConflict, "published", "draft");
|
|
100
|
+
await conflict(() => entries.delete({
|
|
101
|
+
id: "a", collection, expectedVersion: 1, expectedStatus: "published",
|
|
102
|
+
}), EntryStatusConflict, "published", "draft");
|
|
103
|
+
equal(await entries.get(key("a")), original, "status conflicts leave row unchanged");
|
|
104
|
+
const published = await entries.transitionStatus({
|
|
105
|
+
id: "a", collection, expectedStatus: "draft", expectedVersion: 1, to: "published", now: 200,
|
|
106
|
+
});
|
|
107
|
+
equal(published, { ...original, status: "published", version: 2, updatedAt: 200 }, "successful status transition");
|
|
108
|
+
equal(await entries.get(key("a")), published, "persisted transition");
|
|
109
|
+
}],
|
|
110
|
+
["entries.clone-isolation", async ({ entries }) => {
|
|
111
|
+
const data = { title: "Original", nested: { values: ["stored"] } };
|
|
112
|
+
const created = await entries.create({ ...entry("a"), data });
|
|
113
|
+
data.nested.values.push("input mutation");
|
|
114
|
+
created.data["title"] = "returned mutation";
|
|
115
|
+
const expected = { title: "Original", nested: { values: ["stored"] }, locale: null };
|
|
116
|
+
equal((await entries.get(key("a")))?.data, expected, "create data is isolated from storage");
|
|
117
|
+
const readers = [
|
|
118
|
+
() => entries.get(key("a")),
|
|
119
|
+
() => entries.readById(key("a")),
|
|
120
|
+
async () => (await entries.list({ collection })).rows[0],
|
|
121
|
+
];
|
|
122
|
+
for (const read of readers) {
|
|
123
|
+
const row = await read();
|
|
124
|
+
assert(row != null, "isolation fixture exists");
|
|
125
|
+
const nested = row.data["nested"];
|
|
126
|
+
nested.values.push("read mutation");
|
|
127
|
+
equal((await entries.get(key("a")))?.data, expected, "nested read mutation does not persist");
|
|
128
|
+
}
|
|
129
|
+
const replacement = { nested: { values: ["replacement"] } };
|
|
130
|
+
const updated = await entries.update({ id: "a", collection, expectedVersion: 1, data: replacement, now: 200 });
|
|
131
|
+
replacement.nested.values.push("input mutation");
|
|
132
|
+
updated.data["nested"].values.push("returned mutation");
|
|
133
|
+
equal((await entries.get(key("a")))?.data, { nested: { values: ["replacement"] }, locale: null }, "update data is isolated from storage");
|
|
134
|
+
}],
|
|
135
|
+
["entries.read-helpers", async ({ entries }) => {
|
|
136
|
+
for (const args of [
|
|
137
|
+
{ ...entry("en"), status: "published", now: 100 },
|
|
138
|
+
{ ...entry("zh", "zh-TW"), status: "published", now: 200 },
|
|
139
|
+
{ ...entry("missing"), data: { slug: "shared", group: "g" }, status: "published", now: 300 },
|
|
140
|
+
{ ...entry("null"), data: { slug: "shared", group: "g", locale: null }, status: "published", now: 400 },
|
|
141
|
+
{ ...entry("draft"), now: 500 },
|
|
142
|
+
{ ...entry("other"), collection: otherCollection, status: "published", now: 600 },
|
|
143
|
+
])
|
|
144
|
+
await entries.create(args);
|
|
145
|
+
const query = { collection, slug: "shared", status: "published" };
|
|
146
|
+
equal((await entries.readBySlug({ ...query, locale: "en" }))?.id, "en", "exact locale");
|
|
147
|
+
equal((await entries.readBySlug({ ...query, locale: "zh-TW" }))?.locale, "zh-TW", "lifted locale");
|
|
148
|
+
equal((await entries.readBySlug({ ...query, locale: null }))?.id, "null", "null locale includes missing/null");
|
|
149
|
+
equal((await entries.readBySlug(query))?.id, "null", "omitted locale accepts all locales");
|
|
150
|
+
equal(await entries.readBySlug({ ...query, locale: "ja" }), null, "unmatched locale");
|
|
151
|
+
equal((await entries.readByDataField({ collection, field: "group", value: "g", status: "published", locale: "en" }))?.id, "en", "data-field read respects status/locale");
|
|
152
|
+
equal(ids(await entries.readByDataFieldIn({ collection, field: "group", values: ["g", "g"], status: "published", locale: null })), ["null", "missing"], "IN read deduplicates values and filters locale");
|
|
153
|
+
equal(await entries.readByDataFieldIn({ collection, field: "group", values: [] }), [], "empty IN read");
|
|
154
|
+
equal(ids(await entries.readByDataFieldIn({ collection, field: "group", values: ["g"], status: "published", latestPerValue: true })), ["null"], "latest parent per join value");
|
|
155
|
+
equal(ids(await entries.readPublished({ collection, limit: 2 })), ["null", "missing"], "published limit/status/collection");
|
|
156
|
+
equal(ids(await entries.readPublished({ collection, locale: "en" })), ["en"], "published exact locale");
|
|
157
|
+
const pageArgs = { collection, locale: "en", includeUnlocalized: true, limit: 2 };
|
|
158
|
+
const page = await entries.readPublishedPage(pageArgs);
|
|
159
|
+
equal(ids(page.rows), ["null", "missing"], "published page merges shared locale and retains order");
|
|
160
|
+
assert(page.nextCursor !== undefined, "published page exposes continuation");
|
|
161
|
+
const next = await entries.readPublishedPage({ ...pageArgs, cursor: page.nextCursor, dataFields: ["slug", "absent"] });
|
|
162
|
+
equal(ids(next.rows), ["en"], "published continuation excludes other locales and drafts");
|
|
163
|
+
equal(next.rows[0]?.data, { slug: "shared", absent: null }, "published metadata projection");
|
|
164
|
+
equal(next.rows[0]?.locale, "en", "metadata projection retains envelope locale");
|
|
165
|
+
equal(next.nextCursor, undefined, "last published page terminates");
|
|
166
|
+
equal(ids(await entries.findManyByDataField({ collection, field: "group", value: "g", limit: 2 })), ["draft", "null"], "findMany includes drafts and honors limit");
|
|
167
|
+
equal((await entries.findByDataField({ collection, field: "slug", value: "shared", status: "published" }))?.id, "null", "repository data-field read");
|
|
168
|
+
equal((await entries.findByDataFields({ collection, fields: { slug: "shared", locale: "en" }, excludeId: "draft" }))?.id, "en", "composite read and excludeId");
|
|
169
|
+
equal(await entries.findByDataFields({ collection, fields: { slug: "absent", locale: "en" } }), null, "unmatched composite read");
|
|
170
|
+
const publicRows = [
|
|
171
|
+
await entries.readById(key("en")),
|
|
172
|
+
await entries.readBySlug({ ...query, locale: "en" }),
|
|
173
|
+
await entries.readByDataField({ collection, field: "slug", value: "shared" }),
|
|
174
|
+
...await entries.readByDataFieldIn({ collection, field: "group", values: ["g"] }),
|
|
175
|
+
...await entries.readPublished({ collection }),
|
|
176
|
+
...(await entries.readPublishedPage({ collection })).rows,
|
|
177
|
+
...await entries.findManyByDataField({ collection, field: "group", value: "g", limit: 10 }),
|
|
178
|
+
];
|
|
179
|
+
const allowed = new Set(["id", "collection", "locale", "status", "version", "data", "createdAt", "updatedAt"]);
|
|
180
|
+
for (const row of publicRows) {
|
|
181
|
+
assert(row !== null, "public projection exists");
|
|
182
|
+
equal(Object.keys(row).filter((key) => !allowed.has(key)), [], "public projection excludes persistence fields");
|
|
183
|
+
const stored = await entries.get(key(row.id, row.collection));
|
|
184
|
+
assert(stored !== null, "public row has a stored counterpart");
|
|
185
|
+
const { authorId: _authorId, ...projection } = stored;
|
|
186
|
+
equal(row, projection, "public projection preserves public fields");
|
|
187
|
+
}
|
|
188
|
+
}],
|
|
189
|
+
["entries.cursors", async ({ entries }) => {
|
|
190
|
+
for (const id of ["a", "d", "b", "c", "e"])
|
|
191
|
+
await entries.create(entry(id));
|
|
192
|
+
await entries.create({ ...entry("other"), collection: otherCollection });
|
|
193
|
+
await entries.create({ ...entry("published"), status: "published" });
|
|
194
|
+
const query = { collection, status: "draft", limit: 2 };
|
|
195
|
+
for (const direction of ["asc", "desc"]) {
|
|
196
|
+
const sort = { field: "updatedAt", direction };
|
|
197
|
+
const expected = direction === "asc" ? ["a", "b", "c", "d", "e"] : ["e", "d", "c", "b", "a"];
|
|
198
|
+
const first = await entries.list({ ...query, sort });
|
|
199
|
+
equal(ids(first.rows), expected.slice(0, 2), "first page uses stable id tie-break");
|
|
200
|
+
assert(first.nextCursor !== undefined, "first page has next cursor");
|
|
201
|
+
equal(first.previousCursor, undefined, "first page has no previous cursor");
|
|
202
|
+
const second = await entries.list({ ...query, sort, cursor: first.nextCursor });
|
|
203
|
+
equal(ids(second.rows), expected.slice(2, 4), "forward page has no duplicates or skips");
|
|
204
|
+
assert(second.previousCursor !== undefined && second.nextCursor !== undefined, "middle page has both cursors");
|
|
205
|
+
const back = await entries.list({ ...query, sort, cursor: second.previousCursor, cursorDirection: "backward" });
|
|
206
|
+
equal(ids(back.rows), ids(first.rows), "backward cursor restores first page in display order");
|
|
207
|
+
equal(back.previousCursor, undefined, "backward first page has no previous cursor");
|
|
208
|
+
const last = await entries.list({ ...query, sort, cursor: second.nextCursor });
|
|
209
|
+
equal(ids(last.rows), expected.slice(4), "last page");
|
|
210
|
+
equal(last.nextCursor, undefined, "last page has no next cursor");
|
|
211
|
+
equal(ids((await entries.list({ ...query, sort, cursor: first.nextCursor })).rows), ids(second.rows), "cursor can be replayed deterministically");
|
|
212
|
+
}
|
|
213
|
+
}],
|
|
214
|
+
["views.declarative", async ({ entries, views }) => {
|
|
215
|
+
for (const [id, locale, score, status] of [
|
|
216
|
+
["a", "en", 2, "published"], ["b", "zh-TW", 3, "published"],
|
|
217
|
+
["c", "en", 1, "published"], ["draft", "en", 9, "draft"],
|
|
218
|
+
["ja", "ja", 8, "published"],
|
|
219
|
+
])
|
|
220
|
+
await entries.create({ ...entry(id, locale), status, data: { title: id, locale, score } });
|
|
221
|
+
const first = await views.execute({ view: "conformance-ranked", params: { minimum: 0 }, show: 2 });
|
|
222
|
+
equal(first, { rows: [{ id: "b", title: "b", score: 3 }, { id: "a", title: "a", score: 2 }], page: 1, show: 2, hasMore: true }, "View projection, nested AND/OR and ordering");
|
|
223
|
+
const second = await views.execute({ view: "conformance-ranked", params: { minimum: 0 }, show: 2, page: 2 });
|
|
224
|
+
equal(second, { rows: [{ id: "c", title: "c", score: 1 }], page: 2, show: 2, hasMore: false }, "View pagination");
|
|
225
|
+
equal((await views.execute({ view: "conformance-ranked", params: { minimum: 2 }, show: 2 })).rows, [{ id: "b", title: "b", score: 3 }], "View parameter binding");
|
|
226
|
+
equal((await views.execute({ view: "conformance-ranked", params: { minimum: 9 } })).rows, [], "View with no matches");
|
|
227
|
+
}],
|
|
228
|
+
];
|
|
229
|
+
function entry(id, locale = "en") {
|
|
230
|
+
return {
|
|
231
|
+
id, collection, status: "draft", authorId: "synthetic-author", now: 100,
|
|
232
|
+
data: { title: id, slug: "shared", group: "g", locale },
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function ids(rows) {
|
|
236
|
+
return rows.map(({ id }) => id);
|
|
237
|
+
}
|
|
238
|
+
function assert(condition, message) {
|
|
239
|
+
if (!condition)
|
|
240
|
+
throw new Error(message);
|
|
241
|
+
}
|
|
242
|
+
function equal(actual, expected, message) {
|
|
243
|
+
const a = stableJson(actual);
|
|
244
|
+
const e = stableJson(expected);
|
|
245
|
+
assert(a === e, `${message}: expected ${e}, received ${a}`);
|
|
246
|
+
}
|
|
247
|
+
// Object key order and absent optional properties are not storage contracts.
|
|
248
|
+
function stableJson(value) {
|
|
249
|
+
return JSON.stringify(value, (_key, child) => {
|
|
250
|
+
if (!child || typeof child !== "object" || Array.isArray(child))
|
|
251
|
+
return child;
|
|
252
|
+
return Object.fromEntries(Object.entries(child).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0));
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
async function conflict(run, kind, expected, actual) {
|
|
256
|
+
try {
|
|
257
|
+
await run();
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
assert(error instanceof kind, `expected ${kind.name}, received ${errorMessage(error)}`);
|
|
261
|
+
equal([error.id, error.expected, error.actual], ["a", expected, actual], `${kind.name} details`);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
throw new Error(`expected ${kind.name}, operation succeeded`);
|
|
265
|
+
}
|
|
266
|
+
function errorMessage(error) {
|
|
267
|
+
return error instanceof Error ? error.message : String(error);
|
|
268
|
+
}
|
|
269
|
+
function fixturePlan() {
|
|
270
|
+
const schemas = [collection, otherCollection].map((name) => ({
|
|
271
|
+
apiVersion: "cms.mantle.aotter.net/v1", kind: "Schema", metadata: { name },
|
|
272
|
+
spec: {
|
|
273
|
+
title: name, lifecycle: "publishing", localized: true,
|
|
274
|
+
schema: { type: "object", properties: {
|
|
275
|
+
title: { type: "string" }, slug: { type: "string" }, group: { type: "string" },
|
|
276
|
+
locale: { type: ["string", "null"] }, score: { type: "number" }, nested: { type: "object" },
|
|
277
|
+
} },
|
|
278
|
+
},
|
|
279
|
+
}));
|
|
280
|
+
const view = {
|
|
281
|
+
apiVersion: "cms.mantle.aotter.net/v1", kind: "View", metadata: { name: "conformance-ranked" },
|
|
282
|
+
spec: {
|
|
283
|
+
surface: "public", from: collection, fields: ["id", "title", "score"],
|
|
284
|
+
params: { type: "object", required: ["minimum"], properties: { minimum: { type: "number" } } },
|
|
285
|
+
filter: { and: [
|
|
286
|
+
{ eq: { field: "status", value: "published" } },
|
|
287
|
+
{ or: ["en", "zh-TW"].map((locale) => ({ eq: { field: "locale", value: locale } })) },
|
|
288
|
+
{ gt: { field: "score", value: { $param: "minimum" } } },
|
|
289
|
+
] },
|
|
290
|
+
orderBy: [{ field: "score", direction: "desc" }], limit: 20,
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
const parsed = parseManifestSources({
|
|
294
|
+
sources: [{ sourceId: "memory:storage-conformance", text: [...schemas, view].map((atom) => JSON.stringify(atom)).join("\n---\n") }],
|
|
295
|
+
});
|
|
296
|
+
if (!parsed.ok)
|
|
297
|
+
throw new Error(`Conformance fixture parse failed: ${JSON.stringify(parsed.diagnostics)}`);
|
|
298
|
+
const linked = linkManifestSet(parsed.value);
|
|
299
|
+
if (!linked.ok)
|
|
300
|
+
throw new Error(`Conformance fixture link failed: ${JSON.stringify(linked.diagnostics)}`);
|
|
301
|
+
const compiled = compileRuntimePlan(linked.value);
|
|
302
|
+
if (!compiled.ok)
|
|
303
|
+
throw new Error(`Conformance fixture compile failed: ${JSON.stringify(compiled.diagnostics)}`);
|
|
304
|
+
return compiled.value;
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=StorageConformance.js.map
|