@aotter/mantle-runtime 0.0.11-alpha.62 → 0.0.11-alpha.63
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 +4 -0
- package/dist/domain/model/EntryRow.d.ts +4 -1
- package/dist/domain/model/EntryRow.d.ts.map +1 -1
- package/dist/domain/model/EntryRow.js +14 -0
- package/dist/domain/model/EntryRow.js.map +1 -1
- package/dist/domain/model/PendingUploadRecord.d.ts +19 -0
- package/dist/domain/model/PendingUploadRecord.d.ts.map +1 -0
- package/dist/domain/model/PendingUploadRecord.js.map +1 -0
- package/dist/domain/model/index.d.ts +1 -0
- package/dist/domain/model/index.d.ts.map +1 -1
- package/dist/domain/model/index.js.map +1 -1
- package/dist/domain/port/EntryReader.d.ts +49 -0
- package/dist/domain/port/EntryReader.d.ts.map +1 -0
- package/dist/domain/port/EntryReader.js +2 -0
- package/dist/domain/port/EntryReader.js.map +1 -0
- package/dist/domain/port/PendingUploadRepository.d.ts +8 -0
- package/dist/domain/port/PendingUploadRepository.d.ts.map +1 -0
- package/dist/domain/port/PendingUploadRepository.js +2 -0
- package/dist/domain/port/PendingUploadRepository.js.map +1 -0
- package/dist/domain/port/PublishOrchestrator.d.ts +2 -0
- package/dist/domain/port/PublishOrchestrator.d.ts.map +1 -1
- package/dist/domain/port/SiteConfigRepository.d.ts +13 -0
- package/dist/domain/port/SiteConfigRepository.d.ts.map +1 -1
- package/dist/domain/port/index.d.ts +3 -1
- package/dist/domain/port/index.d.ts.map +1 -1
- package/dist/domain/port/index.js.map +1 -1
- package/dist/domain/service/index.d.ts +1 -2
- package/dist/domain/service/index.d.ts.map +1 -1
- package/dist/domain/service/index.js +1 -2
- package/dist/domain/service/index.js.map +1 -1
- package/dist/domain/service/io/JoinedEntryReader.d.ts +3 -3
- package/dist/domain/service/io/JoinedEntryReader.d.ts.map +1 -1
- package/dist/domain/service/io/JoinedEntryReader.js +4 -5
- package/dist/domain/service/io/JoinedEntryReader.js.map +1 -1
- package/dist/domain/service/io/index.d.ts +1 -6
- package/dist/domain/service/io/index.d.ts.map +1 -1
- package/dist/domain/service/io/index.js +1 -6
- package/dist/domain/service/io/index.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/boot/canonicalMigrations.d.ts.map +1 -1
- package/dist/infrastructure/boot/canonicalMigrations.js +35 -0
- package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +13 -2
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js +175 -13
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -1
- package/dist/infrastructure/persistence/DatabasePendingUploadRepository.d.ts +13 -0
- package/dist/infrastructure/persistence/DatabasePendingUploadRepository.d.ts.map +1 -0
- package/dist/infrastructure/persistence/DatabasePendingUploadRepository.js +36 -0
- package/dist/infrastructure/persistence/DatabasePendingUploadRepository.js.map +1 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts +5 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js +37 -5
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js.map +1 -1
- package/dist/infrastructure/persistence/index.d.ts +1 -0
- package/dist/infrastructure/persistence/index.d.ts.map +1 -1
- package/dist/infrastructure/persistence/index.js +1 -0
- package/dist/infrastructure/persistence/index.js.map +1 -1
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts +5 -3
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts.map +1 -1
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js +25 -11
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js.map +1 -1
- package/dist/infrastructure/testing/HttpBenchmarkHarness.d.ts +41 -0
- package/dist/infrastructure/testing/HttpBenchmarkHarness.d.ts.map +1 -0
- package/dist/infrastructure/testing/HttpBenchmarkHarness.js +88 -0
- package/dist/infrastructure/testing/HttpBenchmarkHarness.js.map +1 -0
- package/dist/infrastructure/testing/IndexCoverageHarness.d.ts +42 -0
- package/dist/infrastructure/testing/IndexCoverageHarness.d.ts.map +1 -0
- package/dist/infrastructure/testing/IndexCoverageHarness.js +222 -0
- package/dist/infrastructure/testing/IndexCoverageHarness.js.map +1 -0
- package/dist/infrastructure/testing/index.d.ts +3 -0
- package/dist/infrastructure/testing/index.d.ts.map +1 -0
- package/dist/infrastructure/testing/index.js +3 -0
- package/dist/infrastructure/testing/index.js.map +1 -0
- package/dist/runtime.d.ts +10 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +16 -9
- package/dist/runtime.js.map +1 -1
- package/dist/testing.d.ts +3 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +3 -0
- package/dist/testing.js.map +1 -0
- package/dist/usecase/dto/index.d.ts +1 -0
- package/dist/usecase/dto/index.d.ts.map +1 -1
- package/dist/usecase/dto/index.js +1 -0
- package/dist/usecase/dto/index.js.map +1 -1
- package/dist/usecase/dto/site/UpdateSiteSettingsRequest.d.ts +3 -0
- package/dist/usecase/dto/site/UpdateSiteSettingsRequest.d.ts.map +1 -0
- package/dist/usecase/dto/site/UpdateSiteSettingsRequest.js +2 -0
- package/dist/usecase/dto/site/UpdateSiteSettingsRequest.js.map +1 -0
- package/dist/usecase/dto/site/index.d.ts +2 -0
- package/dist/usecase/dto/site/index.d.ts.map +1 -0
- package/dist/usecase/dto/site/index.js +2 -0
- package/dist/usecase/dto/site/index.js.map +1 -0
- package/dist/usecase/index.d.ts +1 -0
- package/dist/usecase/index.d.ts.map +1 -1
- package/dist/usecase/index.js +1 -0
- package/dist/usecase/index.js.map +1 -1
- package/dist/usecase/media/CommitMediaUploadUseCase.d.ts +4 -4
- package/dist/usecase/media/CommitMediaUploadUseCase.d.ts.map +1 -1
- package/dist/usecase/media/CommitMediaUploadUseCase.js +9 -11
- package/dist/usecase/media/CommitMediaUploadUseCase.js.map +1 -1
- package/dist/usecase/media/CreateMediaUploadUseCase.d.ts +3 -3
- package/dist/usecase/media/CreateMediaUploadUseCase.d.ts.map +1 -1
- package/dist/usecase/media/CreateMediaUploadUseCase.js +5 -5
- package/dist/usecase/media/CreateMediaUploadUseCase.js.map +1 -1
- package/dist/usecase/media/index.d.ts +1 -1
- package/dist/usecase/media/index.d.ts.map +1 -1
- package/dist/usecase/media/index.js +1 -1
- package/dist/usecase/media/index.js.map +1 -1
- package/dist/usecase/media/mediaAllowlist.d.ts +0 -5
- package/dist/usecase/media/mediaAllowlist.d.ts.map +1 -1
- package/dist/usecase/media/mediaAllowlist.js +0 -5
- package/dist/usecase/media/mediaAllowlist.js.map +1 -1
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts +3 -3
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts.map +1 -1
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js +6 -7
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js.map +1 -1
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts +3 -3
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts.map +1 -1
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js +4 -5
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js.map +1 -1
- package/dist/usecase/render/ComposeSitemapUseCase.d.ts +3 -3
- package/dist/usecase/render/ComposeSitemapUseCase.d.ts.map +1 -1
- package/dist/usecase/render/ComposeSitemapUseCase.js +4 -5
- package/dist/usecase/render/ComposeSitemapUseCase.js.map +1 -1
- package/dist/usecase/render/PreviewEntryUseCase.d.ts +3 -3
- package/dist/usecase/render/PreviewEntryUseCase.d.ts.map +1 -1
- package/dist/usecase/render/PreviewEntryUseCase.js +5 -6
- package/dist/usecase/render/PreviewEntryUseCase.js.map +1 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts +3 -3
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts.map +1 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.js +5 -6
- package/dist/usecase/render/RenderEntryLiveUseCase.js.map +1 -1
- package/dist/usecase/render/RenderListLiveUseCase.d.ts +3 -3
- package/dist/usecase/render/RenderListLiveUseCase.d.ts.map +1 -1
- package/dist/usecase/render/RenderListLiveUseCase.js +5 -6
- package/dist/usecase/render/RenderListLiveUseCase.js.map +1 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.d.ts +12 -0
- package/dist/usecase/site/UpdateSiteSettingsUseCase.d.ts.map +1 -0
- package/dist/usecase/site/UpdateSiteSettingsUseCase.js +18 -0
- package/dist/usecase/site/UpdateSiteSettingsUseCase.js.map +1 -0
- package/dist/usecase/site/index.d.ts +2 -0
- package/dist/usecase/site/index.d.ts.map +1 -0
- package/dist/usecase/site/index.js +2 -0
- package/dist/usecase/site/index.js.map +1 -0
- package/package.json +6 -2
- package/dist/domain/service/io/PublishedEntries.d.ts +0 -69
- package/dist/domain/service/io/PublishedEntries.d.ts.map +0 -1
- package/dist/domain/service/io/PublishedEntries.js +0 -116
- package/dist/domain/service/io/PublishedEntries.js.map +0 -1
- package/dist/usecase/media/PendingUploadRecord.d.ts +0 -36
- package/dist/usecase/media/PendingUploadRecord.d.ts.map +0 -1
- package/dist/usecase/media/PendingUploadRecord.js.map +0 -1
- /package/dist/{usecase/media → domain/model}/PendingUploadRecord.js +0 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { DiagnosticError, runtimeDiagnostic, } from "@aotter/mantle-spec";
|
|
2
2
|
import { entryHtmlKey, entryMarkdownKey, listHtmlKey, llmsTxtKey, } from "../../domain/service/PublishKeys.js";
|
|
3
|
-
import { readEntryById, readPublishedEntries, } from "../../domain/service/io/PublishedEntries.js";
|
|
4
3
|
import { joinParentForList, joinParentIfTranslation, } from "../../domain/service/io/JoinedEntryReader.js";
|
|
5
4
|
import { serializeEntryAsMarkdown } from "../../domain/service/MarkdownSerializer.js";
|
|
6
5
|
import { renderEntryHtml, renderListHtml, } from "../../domain/service/HtmlRenderer.js";
|
|
@@ -20,15 +19,15 @@ import { composeSeoIfPathed, } from "../../usecase/render/ComposeEntrySeoMetaUse
|
|
|
20
19
|
*/
|
|
21
20
|
const DEFAULT_DOCTYPE = "<!DOCTYPE html>\n";
|
|
22
21
|
export class HtmlPublishOrchestrator {
|
|
23
|
-
|
|
22
|
+
reader;
|
|
24
23
|
kv;
|
|
25
24
|
paths;
|
|
26
25
|
composeSeo;
|
|
27
26
|
composeLlmsTxt;
|
|
28
27
|
schemas;
|
|
29
28
|
mediaAssets;
|
|
30
|
-
constructor(
|
|
31
|
-
this.
|
|
29
|
+
constructor(reader, kv, paths, composeSeo, composeLlmsTxt, schemas, mediaAssets = null) {
|
|
30
|
+
this.reader = reader;
|
|
32
31
|
this.kv = kv;
|
|
33
32
|
this.paths = paths;
|
|
34
33
|
this.composeSeo = composeSeo;
|
|
@@ -37,11 +36,11 @@ export class HtmlPublishOrchestrator {
|
|
|
37
36
|
this.mediaAssets = mediaAssets;
|
|
38
37
|
}
|
|
39
38
|
async publish(request) {
|
|
40
|
-
const raw = await requireEntry(this.
|
|
39
|
+
const raw = await requireEntry(this.reader, request.entryId, "usecase/PublishEntry");
|
|
41
40
|
// Materialize parent fields into the translation's data before
|
|
42
41
|
// rendering (ADR-0010). RequestPublishUseCase has already asserted
|
|
43
42
|
// the parent is published, so a status filter is safe here.
|
|
44
|
-
const entry = await joinParentIfTranslation(this.
|
|
43
|
+
const entry = await joinParentIfTranslation(this.reader, this.schemas, raw, {
|
|
45
44
|
parentStatus: "published",
|
|
46
45
|
});
|
|
47
46
|
const indexLocale = entry.locale ?? null;
|
|
@@ -53,7 +52,7 @@ export class HtmlPublishOrchestrator {
|
|
|
53
52
|
]);
|
|
54
53
|
}
|
|
55
54
|
async unpublish(request) {
|
|
56
|
-
const entry = await requireEntry(this.
|
|
55
|
+
const entry = await requireEntry(this.reader, request.entryId, "usecase/UnpublishEntryCache");
|
|
57
56
|
const indexLocale = entry.locale ?? null;
|
|
58
57
|
await Promise.all([
|
|
59
58
|
this.kv.delete(entryHtmlKey(entry)),
|
|
@@ -63,6 +62,21 @@ export class HtmlPublishOrchestrator {
|
|
|
63
62
|
...(indexLocale === null ? [] : [this.kv.delete(llmsTxtKey(""))]),
|
|
64
63
|
]);
|
|
65
64
|
}
|
|
65
|
+
async invalidateAll() {
|
|
66
|
+
await Promise.all([
|
|
67
|
+
this.deletePrefix("entry:html:"),
|
|
68
|
+
this.deletePrefix("list:html:"),
|
|
69
|
+
this.deletePrefix("llms:"),
|
|
70
|
+
]);
|
|
71
|
+
}
|
|
72
|
+
async deletePrefix(prefix) {
|
|
73
|
+
let cursor = null;
|
|
74
|
+
do {
|
|
75
|
+
const page = await this.kv.list(prefix, cursor);
|
|
76
|
+
await Promise.all(page.keys.map((key) => this.kv.delete(key)));
|
|
77
|
+
cursor = page.cursor;
|
|
78
|
+
} while (cursor);
|
|
79
|
+
}
|
|
66
80
|
async renderEntry(entry, site, templates, doctype) {
|
|
67
81
|
const seo = await composeSeoIfPathed(this.composeSeo, this.paths, entry, site);
|
|
68
82
|
const mediaAssets = await resolveMediaAssetsForEntries(this.mediaAssets, [entry]);
|
|
@@ -76,8 +90,8 @@ export class HtmlPublishOrchestrator {
|
|
|
76
90
|
}
|
|
77
91
|
}
|
|
78
92
|
async renderList(collection, locale, site, templates, doctype) {
|
|
79
|
-
const raw = await
|
|
80
|
-
const entries = await joinParentForList(this.
|
|
93
|
+
const raw = await this.reader.readPublished({ locale, collection });
|
|
94
|
+
const entries = await joinParentForList(this.reader, this.schemas, raw, {
|
|
81
95
|
parentStatus: "published",
|
|
82
96
|
});
|
|
83
97
|
const mediaAssets = await resolveMediaAssetsForEntries(this.mediaAssets, entries);
|
|
@@ -99,8 +113,8 @@ export class HtmlPublishOrchestrator {
|
|
|
99
113
|
await this.kv.put(llmsTxtKey(locale ?? ""), body);
|
|
100
114
|
}
|
|
101
115
|
}
|
|
102
|
-
async function requireEntry(
|
|
103
|
-
const entry = await
|
|
116
|
+
async function requireEntry(reader, entryId, pathPrefix) {
|
|
117
|
+
const entry = await reader.readById(entryId);
|
|
104
118
|
if (entry)
|
|
105
119
|
return entry;
|
|
106
120
|
throw new DiagnosticError(runtimeDiagnostic({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HtmlPublishOrchestrator.js","sourceRoot":"","sources":["../../../src/infrastructure/render/HtmlPublishOrchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,iBAAiB,GAIlB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,UAAU,GACX,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"HtmlPublishOrchestrator.js","sourceRoot":"","sources":["../../../src/infrastructure/render/HtmlPublishOrchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface HttpBenchmarkTarget {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly url: string | ((iteration: number) => string);
|
|
4
|
+
readonly init?: RequestInit;
|
|
5
|
+
readonly expectedStatus?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface HttpBenchmarkOptions {
|
|
8
|
+
readonly targets: readonly HttpBenchmarkTarget[];
|
|
9
|
+
readonly rounds?: number;
|
|
10
|
+
readonly warmup?: number;
|
|
11
|
+
readonly fetch?: typeof globalThis.fetch;
|
|
12
|
+
}
|
|
13
|
+
export interface HttpBenchmarkResult {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly samples: number;
|
|
16
|
+
readonly status: number;
|
|
17
|
+
readonly timingMs: {
|
|
18
|
+
readonly p50: number;
|
|
19
|
+
readonly p95: number;
|
|
20
|
+
readonly max: number;
|
|
21
|
+
};
|
|
22
|
+
readonly queryCount?: {
|
|
23
|
+
readonly p50: number;
|
|
24
|
+
readonly p95: number;
|
|
25
|
+
readonly max: number;
|
|
26
|
+
};
|
|
27
|
+
readonly rowsRead?: {
|
|
28
|
+
readonly p50: number;
|
|
29
|
+
readonly p95: number;
|
|
30
|
+
readonly max: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export interface HttpBenchmarkReport {
|
|
34
|
+
readonly version: 1;
|
|
35
|
+
readonly rounds: number;
|
|
36
|
+
readonly warmup: number;
|
|
37
|
+
readonly results: readonly HttpBenchmarkResult[];
|
|
38
|
+
}
|
|
39
|
+
/** Sample live Worker routes. Optional metric headers come from a test wrapper. */
|
|
40
|
+
export declare function benchmarkHttpRoutes(options: HttpBenchmarkOptions): Promise<HttpBenchmarkReport>;
|
|
41
|
+
//# sourceMappingURL=HttpBenchmarkHarness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpBenchmarkHarness.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/testing/HttpBenchmarkHarness.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CAC1C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACxF,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3F,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1F;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAClD;AAED,mFAAmF;AACnF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAkC9B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/** Sample live Worker routes. Optional metric headers come from a test wrapper. */
|
|
2
|
+
export async function benchmarkHttpRoutes(options) {
|
|
3
|
+
const rounds = clampCount(options.rounds, 20, 1, 500);
|
|
4
|
+
const warmup = clampCount(options.warmup, 2, 0, 50);
|
|
5
|
+
const fetcher = options.fetch ?? globalThis.fetch;
|
|
6
|
+
const results = [];
|
|
7
|
+
for (const target of options.targets) {
|
|
8
|
+
for (let index = 0; index < warmup; index += 1) {
|
|
9
|
+
await sample(fetcher, target, index);
|
|
10
|
+
}
|
|
11
|
+
const timings = [];
|
|
12
|
+
const queryCounts = [];
|
|
13
|
+
const rowsRead = [];
|
|
14
|
+
let status = 0;
|
|
15
|
+
for (let index = 0; index < rounds; index += 1) {
|
|
16
|
+
const current = await sample(fetcher, target, index + warmup);
|
|
17
|
+
status = current.status;
|
|
18
|
+
timings.push(current.elapsedMs);
|
|
19
|
+
if (current.queryCount !== undefined)
|
|
20
|
+
queryCounts.push(current.queryCount);
|
|
21
|
+
if (current.rowsRead !== undefined)
|
|
22
|
+
rowsRead.push(current.rowsRead);
|
|
23
|
+
}
|
|
24
|
+
assertMetricCoverage(target.name, "x-mantle-query-count", queryCounts.length, rounds);
|
|
25
|
+
assertMetricCoverage(target.name, "x-mantle-rows-read", rowsRead.length, rounds);
|
|
26
|
+
results.push({
|
|
27
|
+
name: target.name,
|
|
28
|
+
samples: rounds,
|
|
29
|
+
status,
|
|
30
|
+
timingMs: distribution(timings),
|
|
31
|
+
...(queryCounts.length > 0 ? { queryCount: distribution(queryCounts) } : {}),
|
|
32
|
+
...(rowsRead.length > 0 ? { rowsRead: distribution(rowsRead) } : {}),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return { version: 1, rounds, warmup, results };
|
|
36
|
+
}
|
|
37
|
+
async function sample(fetcher, target, iteration) {
|
|
38
|
+
const start = performance.now();
|
|
39
|
+
const response = await fetcher(typeof target.url === "function" ? target.url(iteration) : target.url, target.init);
|
|
40
|
+
await response.arrayBuffer();
|
|
41
|
+
const elapsedMs = performance.now() - start;
|
|
42
|
+
const expected = target.expectedStatus ?? 200;
|
|
43
|
+
if (response.status !== expected) {
|
|
44
|
+
throw new Error(`${target.name} returned ${response.status}; expected ${expected}`);
|
|
45
|
+
}
|
|
46
|
+
const queryCount = numberHeader(response, "x-mantle-query-count");
|
|
47
|
+
const rowsRead = numberHeader(response, "x-mantle-rows-read");
|
|
48
|
+
return {
|
|
49
|
+
status: response.status,
|
|
50
|
+
elapsedMs,
|
|
51
|
+
...(queryCount === undefined ? {} : { queryCount }),
|
|
52
|
+
...(rowsRead === undefined ? {} : { rowsRead }),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function numberHeader(response, name) {
|
|
56
|
+
const raw = response.headers.get(name);
|
|
57
|
+
if (raw === null)
|
|
58
|
+
return undefined;
|
|
59
|
+
const parsed = Number(raw);
|
|
60
|
+
if (!Number.isSafeInteger(parsed) || parsed < 0) {
|
|
61
|
+
throw new Error(`${name} must be a non-negative integer; got ${JSON.stringify(raw)}`);
|
|
62
|
+
}
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
function assertMetricCoverage(target, header, samples, rounds) {
|
|
66
|
+
if (samples !== 0 && samples !== rounds) {
|
|
67
|
+
throw new Error(`${target} returned ${header} for ${samples}/${rounds} measured requests`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function distribution(values) {
|
|
71
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
72
|
+
return {
|
|
73
|
+
p50: percentile(sorted, 0.5),
|
|
74
|
+
p95: percentile(sorted, 0.95),
|
|
75
|
+
max: sorted.at(-1) ?? 0,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function percentile(sorted, quantile) {
|
|
79
|
+
if (sorted.length === 0)
|
|
80
|
+
return 0;
|
|
81
|
+
return sorted[Math.ceil(sorted.length * quantile) - 1] ?? sorted[0];
|
|
82
|
+
}
|
|
83
|
+
function clampCount(value, fallback, minimum, maximum) {
|
|
84
|
+
if (value === undefined || !Number.isFinite(value))
|
|
85
|
+
return fallback;
|
|
86
|
+
return Math.min(maximum, Math.max(minimum, Math.floor(value)));
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=HttpBenchmarkHarness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpBenchmarkHarness.js","sourceRoot":"","sources":["../../../src/infrastructure/testing/HttpBenchmarkHarness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Manifest } from "@aotter/mantle-spec";
|
|
2
|
+
export interface IndexCoverageOptions {
|
|
3
|
+
readonly rowsPerSchema?: number;
|
|
4
|
+
readonly requirePublic?: boolean;
|
|
5
|
+
readonly requiredViews?: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export interface IndexCoveragePath {
|
|
8
|
+
readonly view: string;
|
|
9
|
+
readonly schema: string;
|
|
10
|
+
readonly surface: string;
|
|
11
|
+
readonly required: boolean;
|
|
12
|
+
readonly sql: string;
|
|
13
|
+
readonly params: readonly unknown[];
|
|
14
|
+
readonly plan: readonly string[];
|
|
15
|
+
readonly usedIndexes: readonly string[];
|
|
16
|
+
readonly resultCount: number;
|
|
17
|
+
readonly tableScan: boolean;
|
|
18
|
+
readonly indexedScan: boolean;
|
|
19
|
+
readonly temporarySort: boolean;
|
|
20
|
+
readonly dataAccessFields: readonly string[];
|
|
21
|
+
readonly schemaIndexRequired: boolean;
|
|
22
|
+
readonly schemaIndexUsed: boolean;
|
|
23
|
+
readonly passed: boolean;
|
|
24
|
+
readonly findings: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
export interface IndexCoverageReport {
|
|
27
|
+
readonly version: 1;
|
|
28
|
+
readonly sqliteVersion: string;
|
|
29
|
+
readonly rowsPerSchema: number;
|
|
30
|
+
readonly paths: readonly IndexCoveragePath[];
|
|
31
|
+
readonly summary: {
|
|
32
|
+
readonly views: number;
|
|
33
|
+
readonly required: number;
|
|
34
|
+
readonly requiredFailures: number;
|
|
35
|
+
readonly missingRequiredViews: readonly string[];
|
|
36
|
+
readonly tableScans: number;
|
|
37
|
+
readonly temporarySorts: number;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Execute real compiled Views against the real schema in crowded SQLite. */
|
|
41
|
+
export declare function inspectIndexCoverage(manifests: readonly Manifest[], options?: IndexCoverageOptions): IndexCoverageReport;
|
|
42
|
+
//# sourceMappingURL=IndexCoverageHarness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexCoverageHarness.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/testing/IndexCoverageHarness.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,QAAQ,EAGd,MAAM,qBAAqB,CAAC;AAI7B,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,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAkDrB"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { RESERVED_ENTRY_COLUMNS, buildDdl, partitionManifests, } from "@aotter/mantle-spec";
|
|
3
|
+
import { compileView } from "../../domain/service/ViewSqlCompiler.js";
|
|
4
|
+
import { CANONICAL_MIGRATIONS } from "../boot/canonicalMigrations.js";
|
|
5
|
+
/** Execute real compiled Views against the real schema in crowded SQLite. */
|
|
6
|
+
export function inspectIndexCoverage(manifests, options = {}) {
|
|
7
|
+
const rowsPerSchema = clampRows(options.rowsPerSchema);
|
|
8
|
+
const requiredNames = new Set(options.requiredViews ?? []);
|
|
9
|
+
const { schemas, views } = partitionManifests([...manifests]);
|
|
10
|
+
const schemasByName = new Map(schemas.map((schema) => [schema.metadata.name, schema]));
|
|
11
|
+
const db = new DatabaseSync(":memory:");
|
|
12
|
+
try {
|
|
13
|
+
for (const migration of CANONICAL_MIGRATIONS)
|
|
14
|
+
db.exec(migration.sql);
|
|
15
|
+
for (const schema of schemas) {
|
|
16
|
+
const ddl = buildDdl(schema);
|
|
17
|
+
for (const column of ddl.columns)
|
|
18
|
+
db.exec(column.sql);
|
|
19
|
+
for (const index of ddl.indexes)
|
|
20
|
+
db.exec(index.sql);
|
|
21
|
+
}
|
|
22
|
+
seedSchemas(db, schemas, rowsPerSchema);
|
|
23
|
+
db.exec("ANALYZE");
|
|
24
|
+
const paths = views.map((view) => inspectView(db, view, schemasByName.get(view.spec.from), (options.requirePublic === true && view.spec.surface !== "staff") ||
|
|
25
|
+
requiredNames.has(view.metadata.name)));
|
|
26
|
+
const viewNames = new Set(views.map((view) => view.metadata.name));
|
|
27
|
+
const missingRequiredViews = [...requiredNames]
|
|
28
|
+
.filter((name) => !viewNames.has(name))
|
|
29
|
+
.sort();
|
|
30
|
+
const sqliteVersion = db.prepare("SELECT sqlite_version() AS version")
|
|
31
|
+
.get();
|
|
32
|
+
return {
|
|
33
|
+
version: 1,
|
|
34
|
+
sqliteVersion: sqliteVersion.version,
|
|
35
|
+
rowsPerSchema,
|
|
36
|
+
paths,
|
|
37
|
+
summary: {
|
|
38
|
+
views: paths.length,
|
|
39
|
+
required: paths.filter((path) => path.required).length + missingRequiredViews.length,
|
|
40
|
+
requiredFailures: paths.filter((path) => path.required && !path.passed).length +
|
|
41
|
+
missingRequiredViews.length,
|
|
42
|
+
missingRequiredViews,
|
|
43
|
+
tableScans: paths.filter((path) => path.tableScan).length,
|
|
44
|
+
temporarySorts: paths.filter((path) => path.temporarySort).length,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
db.close();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function inspectView(db, view, schema, explicitlyRequired) {
|
|
53
|
+
const params = sampleParams(view);
|
|
54
|
+
const compiled = compileView(view, { params, page: 1 }, schema);
|
|
55
|
+
const sqliteParams = compiled.params.map(toSqliteValue);
|
|
56
|
+
const plan = db.prepare(`EXPLAIN QUERY PLAN ${compiled.sql}`)
|
|
57
|
+
.all(...sqliteParams)
|
|
58
|
+
.map(({ detail }) => detail);
|
|
59
|
+
const rows = db.prepare(compiled.sql).all(...sqliteParams);
|
|
60
|
+
const usedIndexes = [...new Set(plan.flatMap(indexFromPlan))];
|
|
61
|
+
const entryScans = plan.filter((detail) => /\bSCAN entries\b/.test(detail));
|
|
62
|
+
const tableScan = entryScans.some((detail) => !/\bUSING (?:COVERING )?INDEX\b/.test(detail));
|
|
63
|
+
const indexedScan = entryScans.some((detail) => /\bUSING (?:COVERING )?INDEX\b/.test(detail));
|
|
64
|
+
const temporarySort = plan.some((detail) => /USE TEMP B-TREE.*ORDER BY/.test(detail));
|
|
65
|
+
const accessFields = [...dataAccessFields(view)].sort();
|
|
66
|
+
const filterFields = [...dataFilterFields(view)].sort();
|
|
67
|
+
const schemaIndexFields = declaredIndexFields(schema);
|
|
68
|
+
const usedSchemaFields = new Set(usedIndexes.flatMap((name) => schemaIndexFields.get(name) ?? []));
|
|
69
|
+
const schemaIndexRequired = accessFields.length > 0;
|
|
70
|
+
const schemaIndexUsed = schemaIndexRequired &&
|
|
71
|
+
accessFields.every((field) => usedSchemaFields.has(field));
|
|
72
|
+
const findings = [];
|
|
73
|
+
if (tableScan)
|
|
74
|
+
findings.push("full entries scan");
|
|
75
|
+
if (indexedScan &&
|
|
76
|
+
filterFields.length > 0 &&
|
|
77
|
+
!plan.some((detail) => /\bSEARCH entries\b/.test(detail))) {
|
|
78
|
+
findings.push("data-field filter scans an index without a searchable prefix");
|
|
79
|
+
}
|
|
80
|
+
if (temporarySort)
|
|
81
|
+
findings.push("temporary ORDER BY B-tree");
|
|
82
|
+
if (schemaIndexRequired && !schemaIndexUsed) {
|
|
83
|
+
findings.push("data-field predicates/order do not use a declared Schema index");
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
view: view.metadata.name,
|
|
87
|
+
schema: view.spec.from,
|
|
88
|
+
surface: view.spec.surface ?? "public",
|
|
89
|
+
required: explicitlyRequired,
|
|
90
|
+
sql: compiled.sql,
|
|
91
|
+
params: compiled.params,
|
|
92
|
+
plan,
|
|
93
|
+
usedIndexes,
|
|
94
|
+
resultCount: rows.length,
|
|
95
|
+
tableScan,
|
|
96
|
+
indexedScan,
|
|
97
|
+
temporarySort,
|
|
98
|
+
dataAccessFields: accessFields,
|
|
99
|
+
schemaIndexRequired,
|
|
100
|
+
schemaIndexUsed,
|
|
101
|
+
passed: findings.length === 0,
|
|
102
|
+
findings,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function declaredIndexFields(schema) {
|
|
106
|
+
if (!schema)
|
|
107
|
+
return new Map();
|
|
108
|
+
const declarations = [
|
|
109
|
+
...(schema.spec.uniqueIndexes ?? []),
|
|
110
|
+
...(schema.spec.indexes ?? []),
|
|
111
|
+
];
|
|
112
|
+
return new Map(buildDdl(schema).indexes.map((index, position) => [
|
|
113
|
+
index.name,
|
|
114
|
+
declarations[position] ?? [],
|
|
115
|
+
]));
|
|
116
|
+
}
|
|
117
|
+
function seedSchemas(db, schemas, rowsPerSchema) {
|
|
118
|
+
const insert = db.prepare(`INSERT OR IGNORE INTO entries
|
|
119
|
+
(id, collection, status, version, data, author_id, created_at, updated_at)
|
|
120
|
+
VALUES (?, ?, ?, 1, ?, NULL, ?, ?)`);
|
|
121
|
+
for (const schema of schemas) {
|
|
122
|
+
const singleUnique = new Set((schema.spec.uniqueIndexes ?? [])
|
|
123
|
+
.filter((fields) => fields.length === 1)
|
|
124
|
+
.map((fields) => fields[0]));
|
|
125
|
+
for (let index = 0; index < rowsPerSchema; index += 1) {
|
|
126
|
+
insert.run(`${schema.metadata.name}-${index}`, schema.metadata.name, index % 5 === 0 ? "published" : "draft", JSON.stringify(sampleData(schema, index, singleUnique)), index, index);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function sampleData(schema, index, singleUnique) {
|
|
131
|
+
const jsonSchema = schema.spec.schema;
|
|
132
|
+
const data = {};
|
|
133
|
+
for (const [field, raw] of Object.entries(jsonSchema.properties ?? {})) {
|
|
134
|
+
if (field === "locale" && !singleUnique.has(field)) {
|
|
135
|
+
data[field] = index % 20 === 0 ? null : index % 4 === 0 ? "zh-TW" : "en";
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
data[field] = sampleProperty(field, raw, index, singleUnique.has(field));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return data;
|
|
142
|
+
}
|
|
143
|
+
function sampleParams(view) {
|
|
144
|
+
const schema = view.spec.params;
|
|
145
|
+
return Object.fromEntries(Object.entries(schema?.properties ?? {}).map(([name, raw]) => [
|
|
146
|
+
name,
|
|
147
|
+
sampleProperty(name, raw, 1, false),
|
|
148
|
+
]));
|
|
149
|
+
}
|
|
150
|
+
function sampleProperty(field, raw, index, singleUnique) {
|
|
151
|
+
const property = isRecord(raw) ? raw : {};
|
|
152
|
+
const rawType = property["type"];
|
|
153
|
+
const types = Array.isArray(rawType) ? rawType : [rawType];
|
|
154
|
+
const type = types.find((candidate) => candidate !== "null");
|
|
155
|
+
if (type === "integer" || type === "number")
|
|
156
|
+
return index + 1;
|
|
157
|
+
if (type === "boolean")
|
|
158
|
+
return singleUnique && index > 1 ? null : index % 2 === 0;
|
|
159
|
+
if (type === "array")
|
|
160
|
+
return [];
|
|
161
|
+
if (type === "object")
|
|
162
|
+
return {};
|
|
163
|
+
return `${field}-${index}`;
|
|
164
|
+
}
|
|
165
|
+
function dataAccessFields(view) {
|
|
166
|
+
const fields = new Set();
|
|
167
|
+
for (const item of view.spec.orderBy ?? [])
|
|
168
|
+
addDataField(fields, item.field);
|
|
169
|
+
if (view.spec.filter)
|
|
170
|
+
collectFilterFields(view.spec.filter, fields);
|
|
171
|
+
return fields;
|
|
172
|
+
}
|
|
173
|
+
function dataFilterFields(view) {
|
|
174
|
+
const fields = new Set();
|
|
175
|
+
if (view.spec.filter)
|
|
176
|
+
collectFilterFields(view.spec.filter, fields);
|
|
177
|
+
return fields;
|
|
178
|
+
}
|
|
179
|
+
function collectFilterFields(node, fields) {
|
|
180
|
+
const comparison = "eq" in node ? node.eq
|
|
181
|
+
: "gt" in node ? node.gt
|
|
182
|
+
: "gte" in node ? node.gte
|
|
183
|
+
: "lt" in node ? node.lt
|
|
184
|
+
: "lte" in node ? node.lte
|
|
185
|
+
: null;
|
|
186
|
+
if (comparison) {
|
|
187
|
+
addDataField(fields, comparison.field);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const children = "and" in node ? node.and : "or" in node ? node.or : [];
|
|
191
|
+
for (const child of children)
|
|
192
|
+
collectFilterFields(child, fields);
|
|
193
|
+
}
|
|
194
|
+
function addDataField(fields, field) {
|
|
195
|
+
if (!RESERVED_ENTRY_COLUMNS.includes(field))
|
|
196
|
+
fields.add(field);
|
|
197
|
+
}
|
|
198
|
+
function indexFromPlan(detail) {
|
|
199
|
+
const match = detail.match(/USING (?:COVERING )?INDEX ([^ ]+)/);
|
|
200
|
+
return match?.[1] ? [match[1]] : [];
|
|
201
|
+
}
|
|
202
|
+
function toSqliteValue(value) {
|
|
203
|
+
if (typeof value === "boolean")
|
|
204
|
+
return value ? 1 : 0;
|
|
205
|
+
if (value === null ||
|
|
206
|
+
typeof value === "string" ||
|
|
207
|
+
typeof value === "number" ||
|
|
208
|
+
typeof value === "bigint" ||
|
|
209
|
+
value instanceof Uint8Array) {
|
|
210
|
+
return value;
|
|
211
|
+
}
|
|
212
|
+
return JSON.stringify(value);
|
|
213
|
+
}
|
|
214
|
+
function clampRows(value) {
|
|
215
|
+
if (!Number.isFinite(value) || value === undefined)
|
|
216
|
+
return 2_000;
|
|
217
|
+
return Math.min(20_000, Math.max(100, Math.floor(value)));
|
|
218
|
+
}
|
|
219
|
+
function isRecord(value) {
|
|
220
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=IndexCoverageHarness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexCoverageHarness.js","sourceRoot":"","sources":["../../../src/infrastructure/testing/IndexCoverageHarness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { inspectIndexCoverage, type IndexCoverageOptions, type IndexCoveragePath, type IndexCoverageReport, } from "./IndexCoverageHarness.js";
|
|
2
|
+
export { benchmarkHttpRoutes, type HttpBenchmarkOptions, type HttpBenchmarkReport, type HttpBenchmarkResult, type HttpBenchmarkTarget, } from "./HttpBenchmarkHarness.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAIrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,GAKpB,MAAM,2BAA2B,CAAC"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { TemplateRegistry } from "./domain/model/TemplateRegistry.js";
|
|
|
4
4
|
import type { AssetServer } from "./domain/port/AssetServer.js";
|
|
5
5
|
import type { DatabaseDriver } from "./domain/port/DatabaseDriver.js";
|
|
6
6
|
import type { DeferredHookDispatcher } from "./domain/port/DeferredHookDispatcher.js";
|
|
7
|
+
import type { EntryReader } from "./domain/port/EntryReader.js";
|
|
7
8
|
import type { KvCache } from "./domain/port/KvCache.js";
|
|
8
9
|
import type { MediaStorage } from "./domain/port/MediaStorage.js";
|
|
9
10
|
import type { PublishOrchestrator } from "./domain/port/PublishOrchestrator.js";
|
|
@@ -18,6 +19,7 @@ import { ValidateBootUseCase } from "./usecase/boot/index.js";
|
|
|
18
19
|
import { RunDeferredHookUseCase } from "./usecase/lifecycle/index.js";
|
|
19
20
|
import { ComposeEntrySeoMetaUseCase, ComposeLlmsTxtUseCase, ComposeSitemapUseCase, PreviewEntryUseCase, RenderEntryLiveUseCase, RenderListLiveUseCase } from "./usecase/render/index.js";
|
|
20
21
|
import { CommitMediaUploadUseCase, CreateMediaUploadUseCase, ListMediaAssetsUseCase, GetMediaAssetUseCase, UpdateMediaAssetUseCase, DeleteMediaAssetUseCase } from "./usecase/media/index.js";
|
|
22
|
+
import { UpdateSiteSettingsUseCase } from "./usecase/site/index.js";
|
|
21
23
|
import type { PublicPathResolver } from "./domain/service/PublicPathResolver.js";
|
|
22
24
|
import type { MediaAsset } from "./domain/port/MediaStorage.js";
|
|
23
25
|
/**
|
|
@@ -56,7 +58,7 @@ export interface CreateCmsRuntimeArgs {
|
|
|
56
58
|
* admin upload endpoints are not registered — uploads return 404 /
|
|
57
59
|
* `MEDIA_NOT_CONFIGURED`. When set, the runtime wires
|
|
58
60
|
* `CreateMediaUpload` + `CommitMediaUpload` use cases backed by
|
|
59
|
-
* this adapter.
|
|
61
|
+
* this adapter. Pending create-to-commit state remains canonical in DB. */
|
|
60
62
|
readonly mediaStorage?: MediaStorage;
|
|
61
63
|
/** Whether the SVG mime is allowed in `CreateMediaUpload`. Default
|
|
62
64
|
* false; object stores don't sanitize SVG payloads. */
|
|
@@ -72,10 +74,15 @@ export interface CreateCmsRuntimeArgs {
|
|
|
72
74
|
readonly idgen?: IdGenerator;
|
|
73
75
|
}
|
|
74
76
|
export interface CmsRuntime {
|
|
75
|
-
/**
|
|
77
|
+
/** Raw ADR-0011 database driver, retained for adapter compatibility.
|
|
78
|
+
* @deprecated Use purpose-shaped surfaces such as `entryReader` and
|
|
79
|
+
* `siteConfig`; adapters should retain their injected driver for tables
|
|
80
|
+
* they own. */
|
|
76
81
|
readonly db: DatabaseDriver;
|
|
77
82
|
readonly kv: KvCache;
|
|
78
83
|
readonly assets: AssetServer;
|
|
84
|
+
/** Schema-aware, lifecycle-neutral entry reads for adapter-owned routes. */
|
|
85
|
+
readonly entryReader: EntryReader;
|
|
79
86
|
/** Use cases (pre-wired with ports + clock + idgen). */
|
|
80
87
|
readonly createDraft: CreateDraftUseCase;
|
|
81
88
|
readonly updateDraft: UpdateDraftUseCase;
|
|
@@ -96,6 +103,7 @@ export interface CmsRuntime {
|
|
|
96
103
|
readonly validateBoot: ValidateBootUseCase;
|
|
97
104
|
readonly publishOrchestrator: PublishOrchestrator;
|
|
98
105
|
readonly siteConfig: SiteConfigRepository;
|
|
106
|
+
readonly updateSiteSettings: UpdateSiteSettingsUseCase;
|
|
99
107
|
/** The resolver passed at boot, or `null` when the consumer didn't
|
|
100
108
|
* supply one. Adapters use this to derive URLs (sitemap, SEO
|
|
101
109
|
* hreflangs) without rebuilding the mapping. */
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|