@aotter/mantle-runtime 0.1.4 → 0.1.5-alpha.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/dist/MantleRuntime.d.ts +11 -0
- package/dist/MantleRuntime.d.ts.map +1 -1
- package/dist/MantleRuntime.js +34 -3
- package/dist/MantleRuntime.js.map +1 -1
- package/dist/domain/model/HandlerContext.d.ts +13 -0
- package/dist/domain/model/HandlerContext.d.ts.map +1 -1
- package/dist/domain/port/AtomicEntryWriter.d.ts +23 -0
- package/dist/domain/port/AtomicEntryWriter.d.ts.map +1 -0
- package/dist/domain/port/AtomicEntryWriter.js +2 -0
- package/dist/domain/port/AtomicEntryWriter.js.map +1 -0
- package/dist/domain/port/DatabaseDriver.d.ts +2 -0
- package/dist/domain/port/DatabaseDriver.d.ts.map +1 -1
- package/dist/domain/port/ExpirySweeper.d.ts +19 -0
- package/dist/domain/port/ExpirySweeper.d.ts.map +1 -0
- package/dist/domain/port/ExpirySweeper.js +2 -0
- package/dist/domain/port/ExpirySweeper.js.map +1 -0
- package/dist/domain/port/MantleStorageAdapter.d.ts +8 -0
- package/dist/domain/port/MantleStorageAdapter.d.ts.map +1 -1
- package/dist/domain/port/RunObservationStore.d.ts +26 -0
- package/dist/domain/port/RunObservationStore.d.ts.map +1 -0
- package/dist/domain/port/RunObservationStore.js +2 -0
- package/dist/domain/port/RunObservationStore.js.map +1 -0
- package/dist/domain/service/RuntimePlanCompiler.d.ts +16 -2
- package/dist/domain/service/RuntimePlanCompiler.d.ts.map +1 -1
- package/dist/domain/service/RuntimePlanCompiler.js +13 -2
- package/dist/domain/service/RuntimePlanCompiler.js.map +1 -1
- package/dist/domain/service/io/EntryWriteGuard.d.ts +2 -0
- package/dist/domain/service/io/EntryWriteGuard.d.ts.map +1 -1
- package/dist/domain/service/io/EntryWriteGuard.js +2 -1
- package/dist/domain/service/io/EntryWriteGuard.js.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/boot/bootState.d.ts +1 -1
- package/dist/infrastructure/boot/bootState.d.ts.map +1 -1
- package/dist/infrastructure/boot/bootState.js +19 -4
- package/dist/infrastructure/boot/bootState.js.map +1 -1
- package/dist/infrastructure/boot/canonicalMigrations.d.ts.map +1 -1
- package/dist/infrastructure/boot/canonicalMigrations.js +28 -0
- package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +10 -2
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js +123 -11
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseRunObservationStore.d.ts +14 -0
- package/dist/infrastructure/persistence/DatabaseRunObservationStore.d.ts.map +1 -0
- package/dist/infrastructure/persistence/DatabaseRunObservationStore.js +68 -0
- package/dist/infrastructure/persistence/DatabaseRunObservationStore.js.map +1 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts +5 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js +13 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js.map +1 -1
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.d.ts +5 -3
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.d.ts.map +1 -1
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.js +49 -16
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.js.map +1 -1
- package/dist/infrastructure/storage/SqliteMigrationArtifact.d.ts +17 -1
- package/dist/infrastructure/storage/SqliteMigrationArtifact.d.ts.map +1 -1
- package/dist/infrastructure/storage/SqliteMigrationArtifact.js +62 -6
- package/dist/infrastructure/storage/SqliteMigrationArtifact.js.map +1 -1
- package/dist/infrastructure/storage/SqliteSchemaTables.d.ts +4 -0
- package/dist/infrastructure/storage/SqliteSchemaTables.d.ts.map +1 -1
- package/dist/infrastructure/storage/SqliteSchemaTables.js +16 -2
- package/dist/infrastructure/storage/SqliteSchemaTables.js.map +1 -1
- package/dist/infrastructure/storage/SqliteViewCompiler.d.ts +1 -1
- package/dist/infrastructure/storage/SqliteViewCompiler.d.ts.map +1 -1
- package/dist/infrastructure/storage/SqliteViewCompiler.js +11 -2
- package/dist/infrastructure/storage/SqliteViewCompiler.js.map +1 -1
- package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -1
- package/dist/usecase/boot/ValidateBootUseCase.js +15 -0
- package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -1
- package/dist/usecase/content/AtomicEntryWriteUseCase.d.ts +37 -0
- package/dist/usecase/content/AtomicEntryWriteUseCase.d.ts.map +1 -0
- package/dist/usecase/content/AtomicEntryWriteUseCase.js +108 -0
- package/dist/usecase/content/AtomicEntryWriteUseCase.js.map +1 -0
- package/dist/usecase/content/CreateDraftUseCase.d.ts +5 -0
- package/dist/usecase/content/CreateDraftUseCase.d.ts.map +1 -1
- package/dist/usecase/content/CreateDraftUseCase.js +8 -3
- package/dist/usecase/content/CreateDraftUseCase.js.map +1 -1
- package/dist/usecase/content/DeleteEntryUseCase.d.ts +6 -0
- package/dist/usecase/content/DeleteEntryUseCase.d.ts.map +1 -1
- package/dist/usecase/content/DeleteEntryUseCase.js +12 -8
- package/dist/usecase/content/DeleteEntryUseCase.js.map +1 -1
- package/dist/usecase/content/UpdateDraftUseCase.d.ts +9 -0
- package/dist/usecase/content/UpdateDraftUseCase.d.ts.map +1 -1
- package/dist/usecase/content/UpdateDraftUseCase.js +15 -9
- package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -1
- package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts +4 -1
- package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts.map +1 -1
- package/dist/usecase/procedure/InvokeProcedureUseCase.js +10 -2
- package/dist/usecase/procedure/InvokeProcedureUseCase.js.map +1 -1
- package/package.json +2 -2
|
@@ -12,7 +12,8 @@ export async function assertEntryWritable(args) {
|
|
|
12
12
|
if (diagnostics.length > 0)
|
|
13
13
|
throw new DiagnosticError(diagnostics);
|
|
14
14
|
await assertLocale(args);
|
|
15
|
-
|
|
15
|
+
if (!args.skipUniquePreflight)
|
|
16
|
+
await assertUniqueIndexes(args);
|
|
16
17
|
}
|
|
17
18
|
async function assertLocale(args) {
|
|
18
19
|
const localized = args.schema.spec.localized === true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntryWriteGuard.js","sourceRoot":"","sources":["../../../../src/domain/service/io/EntryWriteGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEf,mBAAmB,EACnB,iBAAiB,GAElB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"EntryWriteGuard.js","sourceRoot":"","sources":["../../../../src/domain/service/io/EntryWriteGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEf,mBAAmB,EACnB,iBAAiB,GAElB,MAAM,qBAAqB,CAAC;AAoB7B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAA6B;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QAClG,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;KAC/B,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI,CAAC,mBAAmB;QAAE,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAA6B;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO;QAClD,MAAM,IAAI,eAAe,CACvB,iBAAiB,CAAC;YAChB,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,SAAS;YAC7B,KAAK;YACL,QAAQ,EAAE,kCAAkC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,oBAAoB;YACzF,OAAO,EAAE,mCAAmC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,+BAA+B;SACrG,CAAC,CACH,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,6DAA6D;QAC7D,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,IAAI,eAAe,CACvB,iBAAiB,CAAC;YAChB,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,SAAS;YAC7B,KAAK;YACL,QAAQ,EAAE,oBAAoB;YAC9B,OAAO,EAAE,+BAA+B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,2BAA2B;SAC7F,CAAC,CACH,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,UAAU;QAAE,OAAO;IAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IACpD,kEAAkE;IAClE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IACpC,MAAM,IAAI,eAAe,CACvB,iBAAiB,CAAC;QAChB,IAAI,EAAE,yBAAyB;QAC/B,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,SAAS;QAC7B,KAAK;QACL,QAAQ,EAAE,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACtD,UAAU,EAAE,OAAO;QACnB,OAAO,EAAE,WAAW,KAAK,iCAAiC;KAC3D,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAsB,EACtB,IAA6B;IAE7B,MAAM,UAAU,GACb,MAAM,CAAC,IAAI,CAAC,MAAmD,CAAC,UAAU,IAAI,EAAE,CAAC;IACpF,IAAI,GAAG,GAAmC,IAAI,CAAC;IAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,SAAS;QACnE,IAAI,CAAC,GAAG;YAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,IAAI,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,mBAAmB,IAAI,OAAO,CAAC;AAC3F,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAA6B;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,QAAQ,GAAG,KAAK,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YACnD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;YACrC,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,MAAM,IAAI,eAAe,CACvB,iBAAiB,CAAC;YAChB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,kBAAkB,CAAC,EAAE;YACzC,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,UAAU,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG;YAC5G,OAAO,EAAE,uCAAuC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,YAAY,QAAQ,CAAC,EAAE,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;SAC3I,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,10 +14,15 @@
|
|
|
14
14
|
* specific type.
|
|
15
15
|
*/
|
|
16
16
|
export { bootMantleRuntime, createMantleRuntime, type BootMantleRuntimeArgs, type CreateMantleRuntimeArgs, type MantleRuntime, type MantleMedia, type MantleRuntimePorts, type InvokeMantleProcedureRequest, type ExecuteMantleViewRequest, type InvokeMantleTriggerRequest, } from "./MantleRuntime.js";
|
|
17
|
-
export { RUNTIME_PLAN_VERSION, compileRuntimePlan, sealRuntimePlan, type CompileResult, type RuntimePlan, type RuntimePlanData, type RuntimeSchemaPlan, type RuntimeViewPlan, type RuntimeProcedurePlan, type RuntimeTriggerPlan, type LogicalViewPlan, type LifecycleHookPlan, type HttpRoutePlan, type McpToolPlan, } from "./domain/service/RuntimePlanCompiler.js";
|
|
17
|
+
export { RUNTIME_PLAN_VERSION, compileRuntimePlan, sealRuntimePlan, type CompileResult, type RuntimePlan, type RuntimePlanData, type RuntimeSchemaPlan, type RuntimeViewPlan, type RuntimeProcedurePlan, type RuntimeTriggerPlan, type LogicalViewPlan, type LifecycleHookPlan, type HttpRoutePlan, type SchedulePlan, type McpToolPlan, } from "./domain/service/RuntimePlanCompiler.js";
|
|
18
|
+
export type { RunObservation, RunObservationStore } from "./domain/port/RunObservationStore.js";
|
|
19
|
+
export { DatabaseRunObservationStore } from "./infrastructure/persistence/DatabaseRunObservationStore.js";
|
|
18
20
|
export { projectCallableCapabilities, type RuntimeCallableCapability, type ViewCallableCapability, type ProcedureCallableCapability, } from "./domain/service/CallableCapabilityProjector.js";
|
|
19
21
|
export type { DatabaseDriver, PreparedStatement, RunResult, BatchResult, MigrationRunner, Migration, } from "./domain/port/DatabaseDriver.js";
|
|
20
22
|
export type { EntryRepository, EntryKey, CreateEntryArgs, UpdateEntryArgs, DeleteEntryArgs, TransitionStatusArgs, ListEntriesArgs, ListEntriesResult, FindEntryByDataFieldArgs, FindEntryByDataFieldsArgs, } from "./domain/port/EntryRepository.js";
|
|
23
|
+
export type { AtomicEntryWrite, AtomicEntryWriter } from "./domain/port/AtomicEntryWriter.js";
|
|
24
|
+
export type { ExpirySweeper, SweepExpiredRequest, SweepExpiredResult } from "./domain/port/ExpirySweeper.js";
|
|
25
|
+
export { AtomicEntryWriteUseCase, type AtomicDraftOperation } from "./usecase/content/AtomicEntryWriteUseCase.js";
|
|
21
26
|
export type { EntryReader, CreationStatisticsArgs, CreationStatistics, EntryDataScalar, ReadEntryBySlugArgs, ReadEntryByDataFieldArgs, ReadEntriesByDataFieldInArgs, ReadPublishedEntriesArgs, ReadPublishedPageArgs, PublishedEntryPage, FindManyEntriesByDataFieldArgs, } from "./domain/port/EntryReader.js";
|
|
22
27
|
export { joinParentIfTranslation, joinParentForList, } from "./domain/service/io/JoinedEntryReader.js";
|
|
23
28
|
export type { ViewQueryExecutor, ViewQueryOptions, ViewQueryRequest, ViewQueryResult, } from "./domain/port/ViewQueryExecutor.js";
|
|
@@ -32,8 +37,8 @@ export type { Clock } from "./domain/port/Clock.js";
|
|
|
32
37
|
export { JsonBodyTooLargeError, MAX_JSON_BODY_BYTES, readJsonBody } from "./infrastructure/http/readJsonBody.js";
|
|
33
38
|
export type { SiteConfigRepository, LocalePolicyReader, UpdateEditableSiteConfigArgs, } from "./domain/port/SiteConfigRepository.js";
|
|
34
39
|
export { SqliteMantleStorageAdapter, type SqliteMantleStorageAdapterOptions, } from "./infrastructure/storage/SqliteMantleStorageAdapter.js";
|
|
35
|
-
export { buildSqliteMigrationArtifact, storageFingerprint, verifySqliteMigrationArtifact, type SqliteMigrationArtifact, } from "./infrastructure/storage/SqliteMigrationArtifact.js";
|
|
36
|
-
export { isAdditiveSchemaTableChange, mergeSchemaTableProjections, } from "./infrastructure/storage/SqliteSchemaTables.js";
|
|
40
|
+
export { buildSqliteMigrationArtifact, renderSqliteManagedMigration, storageFingerprint, verifySqliteMigrationArtifact, type SqliteMigrationArtifact, type SqliteMigrationSource, } from "./infrastructure/storage/SqliteMigrationArtifact.js";
|
|
41
|
+
export { isAdditiveSchemaTableChange, mergeSchemaTableProjections, fieldColumn, quoteIdent, } from "./infrastructure/storage/SqliteSchemaTables.js";
|
|
37
42
|
export { prepareDeployment, type DeploymentPreparationOptions, } from "./usecase/boot/ValidateBootUseCase.js";
|
|
38
43
|
export type { MediaStorage, CreateUploadArgs, CreateUploadVariantSpec, CreateUploadResult, UploadCapability, CommitUploadArgs, CommitUploadVariantSpec, GetPublicUrlArgs, DeleteObjectArgs, MediaAsset, MediaVariant, MediaVariantRole, } from "./domain/port/MediaStorage.js";
|
|
39
44
|
export { pickPrimaryVariant } from "./domain/port/MediaStorage.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,GAChC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,2BAA2B,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,GACjC,MAAM,iDAAiD,CAAC;AAKzD,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,eAAe,EACf,SAAS,GACV,MAAM,iCAAiC,CAAC;AACzC,YAAY,EACV,eAAe,EACf,QAAQ,EACR,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,WAAW,EACX,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,8BAA8B,GAC/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,yBAAyB,EACzB,kBAAkB,EAClB,KAAK,QAAQ,GACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,GACV,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAC3G,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,GACjC,MAAM,qDAAqD,CAAC;AAC7D,YAAY,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACjH,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,0BAA0B,EAC1B,KAAK,iCAAiC,GACvC,MAAM,wDAAwD,CAAC;AAChE,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,EAClB,6BAA6B,EAC7B,KAAK,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
// Assembly root.
|
|
17
17
|
export { bootMantleRuntime, createMantleRuntime, } from "./MantleRuntime.js";
|
|
18
18
|
export { RUNTIME_PLAN_VERSION, compileRuntimePlan, sealRuntimePlan, } from "./domain/service/RuntimePlanCompiler.js";
|
|
19
|
+
export { DatabaseRunObservationStore } from "./infrastructure/persistence/DatabaseRunObservationStore.js";
|
|
19
20
|
export { projectCallableCapabilities, } from "./domain/service/CallableCapabilityProjector.js";
|
|
21
|
+
export { AtomicEntryWriteUseCase } from "./usecase/content/AtomicEntryWriteUseCase.js";
|
|
20
22
|
export { joinParentIfTranslation, joinParentForList, } from "./domain/service/io/JoinedEntryReader.js";
|
|
21
23
|
export { EntryStatusConflict, EntryUniqueConflict, EntryVersionConflict, liftLocale, materializeNullableFields, projectPublicEntry, } from "./domain/model/EntryRow.js";
|
|
22
24
|
export { clampLimit, clampPage, clampShow, } from "./domain/service/Pagination.js";
|
|
@@ -25,8 +27,8 @@ export { SqliteMigrationRunner, splitSqlStatements } from "./infrastructure/boot
|
|
|
25
27
|
export { MANTLE_VIEW_ROUTE_PREFIX, createMantleRequestHandler, } from "./infrastructure/http/createMantleRequestHandler.js";
|
|
26
28
|
export { JsonBodyTooLargeError, MAX_JSON_BODY_BYTES, readJsonBody } from "./infrastructure/http/readJsonBody.js";
|
|
27
29
|
export { SqliteMantleStorageAdapter, } from "./infrastructure/storage/SqliteMantleStorageAdapter.js";
|
|
28
|
-
export { buildSqliteMigrationArtifact, storageFingerprint, verifySqliteMigrationArtifact, } from "./infrastructure/storage/SqliteMigrationArtifact.js";
|
|
29
|
-
export { isAdditiveSchemaTableChange, mergeSchemaTableProjections, } from "./infrastructure/storage/SqliteSchemaTables.js";
|
|
30
|
+
export { buildSqliteMigrationArtifact, renderSqliteManagedMigration, storageFingerprint, verifySqliteMigrationArtifact, } from "./infrastructure/storage/SqliteMigrationArtifact.js";
|
|
31
|
+
export { isAdditiveSchemaTableChange, mergeSchemaTableProjections, fieldColumn, quoteIdent, } from "./infrastructure/storage/SqliteSchemaTables.js";
|
|
30
32
|
export { prepareDeployment, } from "./usecase/boot/ValidateBootUseCase.js";
|
|
31
33
|
export { pickPrimaryVariant } from "./domain/port/MediaStorage.js";
|
|
32
34
|
export { extensionForMime } from "./usecase/media/mediaAllowlist.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,iBAAiB;AACjB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GASpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,iBAAiB;AACjB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GASpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAahB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAC1G,OAAO,EACL,2BAA2B,GAI5B,MAAM,iDAAiD,CAAC;AA2BzD,OAAO,EAAE,uBAAuB,EAA6B,MAAM,8CAA8C,CAAC;AAclH,OAAO,EACL,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,0CAA0C,CAAC;AAWlD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,yBAAyB,EACzB,kBAAkB,GAEnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,GACV,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAC3G,OAAO,EACL,wBAAwB,EACxB,0BAA0B,GAG3B,MAAM,qDAAqD,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAMjH,OAAO,EACL,0BAA0B,GAE3B,MAAM,wDAAwD,CAAC;AAChE,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,kBAAkB,EAClB,6BAA6B,GAG9B,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,WAAW,EACX,UAAU,GACX,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACL,iBAAiB,GAElB,MAAM,uCAAuC,CAAC;AAe/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAUnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAOrE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAEzF,qEAAqE;AACrE,oEAAoE;AACpE,wDAAwD;AACxD,OAAO,EAAoB,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAUrF,OAAO,EAAE,eAAe,EAAE,MAAM,yDAAyD,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sCAAsC,CAAC;AAE9C,iEAAiE;AACjE,4DAA4D;AAC5D,OAAO,EACL,oBAAoB,GAErB,MAAM,8CAA8C,CAAC;AAGtD,6DAA6D;AAC7D,4DAA4D;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,qEAAqE;AACrE,gCAAgC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAE9E,OAAO,EACL,gCAAgC,EAChC,mBAAmB,GAEpB,MAAM,wCAAwC,CAAC"}
|
|
@@ -6,7 +6,7 @@ export declare function bootFingerprint(input: {
|
|
|
6
6
|
readonly siteDefaults?: SiteDefaults;
|
|
7
7
|
readonly schemaMigrations?: readonly Migration[];
|
|
8
8
|
}): Promise<string>;
|
|
9
|
-
export declare function isBootCurrent(db: DatabaseDriver, fingerprint: string): Promise<boolean>;
|
|
9
|
+
export declare function isBootCurrent(db: DatabaseDriver, fingerprint: string, hasManagedMarker?: boolean): Promise<boolean>;
|
|
10
10
|
export declare function markBootCurrent(db: DatabaseDriver, fingerprint: string): Promise<void>;
|
|
11
11
|
/** Identity minted by the store itself; derivative caches use it as a namespace. */
|
|
12
12
|
export declare function readStoreInstanceId(db: DatabaseDriver): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootState.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/boot/bootState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAKrE,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CAClD,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlB;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"bootState.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/boot/bootState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAKrE,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CAClD,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlB;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBvH;AAQD,wBAAsB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS5F;AAED,oFAAoF;AACpF,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAO7E"}
|
|
@@ -11,18 +11,33 @@ export async function bootFingerprint(input) {
|
|
|
11
11
|
const digest = await crypto.subtle.digest("SHA-256", bytes);
|
|
12
12
|
return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
13
13
|
}
|
|
14
|
-
export async function isBootCurrent(db, fingerprint) {
|
|
14
|
+
export async function isBootCurrent(db, fingerprint, hasManagedMarker = false) {
|
|
15
|
+
let row;
|
|
15
16
|
try {
|
|
16
|
-
|
|
17
|
-
.prepare(
|
|
17
|
+
row = await db
|
|
18
|
+
.prepare(hasManagedMarker
|
|
19
|
+
? "SELECT b.fingerprint, b.store_instance_id, m.canonical_version FROM _mantle_boot_state b LEFT JOIN _mantle_managed_runtime_state m ON m.id = 1 WHERE b.id = ? LIMIT 1"
|
|
20
|
+
: "SELECT fingerprint, store_instance_id FROM _mantle_boot_state WHERE id = ? LIMIT 1")
|
|
18
21
|
.bind(BOOT_STATE_ID)
|
|
19
22
|
.first();
|
|
20
|
-
return row?.fingerprint === fingerprint && Boolean(row.store_instance_id);
|
|
21
23
|
}
|
|
22
24
|
catch {
|
|
23
25
|
// First boot and pre-alpha.5 databases do not have the marker table yet.
|
|
26
|
+
if (hasManagedMarker)
|
|
27
|
+
await assertNoManagedVersion(db);
|
|
24
28
|
return false;
|
|
25
29
|
}
|
|
30
|
+
if (hasManagedMarker && !row)
|
|
31
|
+
await assertNoManagedVersion(db);
|
|
32
|
+
if (row?.canonical_version)
|
|
33
|
+
throw new Error("Managed SQLite database cannot use runtime-managed migrations.");
|
|
34
|
+
return row?.fingerprint === fingerprint && Boolean(row.store_instance_id);
|
|
35
|
+
}
|
|
36
|
+
async function assertNoManagedVersion(db) {
|
|
37
|
+
const row = await db.prepare("SELECT canonical_version FROM _mantle_managed_runtime_state WHERE id = 1")
|
|
38
|
+
.first();
|
|
39
|
+
if (row?.canonical_version)
|
|
40
|
+
throw new Error("Managed SQLite database cannot use runtime-managed migrations.");
|
|
26
41
|
}
|
|
27
42
|
export async function markBootCurrent(db, fingerprint) {
|
|
28
43
|
await db
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootState.js","sourceRoot":"","sources":["../../../src/infrastructure/boot/bootState.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAIrC;IACC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACpD,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACzE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAkB,EAAE,WAAmB;
|
|
1
|
+
{"version":3,"file":"bootState.js","sourceRoot":"","sources":["../../../src/infrastructure/boot/bootState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalMigrations.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/boot/canonicalMigrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,SAAS,
|
|
1
|
+
{"version":3,"file":"canonicalMigrations.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/boot/canonicalMigrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,SAAS,EAoTpD,CAAC"}
|
|
@@ -280,5 +280,33 @@ export const CANONICAL_MIGRATIONS = [
|
|
|
280
280
|
description: "Bind derivative storage keys to one physical store instance",
|
|
281
281
|
sql: "ALTER TABLE _mantle_boot_state ADD COLUMN store_instance_id TEXT;",
|
|
282
282
|
},
|
|
283
|
+
{
|
|
284
|
+
id: "0006-managed-runtime-version",
|
|
285
|
+
description: "Record canonical migration readiness for managed SQLite hosts",
|
|
286
|
+
sql: `CREATE TABLE IF NOT EXISTS _mantle_managed_runtime_state (
|
|
287
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
288
|
+
canonical_version TEXT NOT NULL
|
|
289
|
+
);`,
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
id: "0007-schedule-run-observations",
|
|
293
|
+
description: "Bounded, durable Cloudflare schedule attempt observations",
|
|
294
|
+
sql: `CREATE TABLE IF NOT EXISTS _mantle_schedule_runs (
|
|
295
|
+
run_id TEXT NOT NULL,
|
|
296
|
+
attempt INTEGER NOT NULL,
|
|
297
|
+
schedule_id TEXT NOT NULL,
|
|
298
|
+
scheduled_at INTEGER NOT NULL,
|
|
299
|
+
started_at INTEGER NOT NULL,
|
|
300
|
+
finished_at INTEGER,
|
|
301
|
+
status TEXT NOT NULL,
|
|
302
|
+
error_summary TEXT,
|
|
303
|
+
counts TEXT,
|
|
304
|
+
PRIMARY KEY (run_id, attempt)
|
|
305
|
+
);
|
|
306
|
+
CREATE INDEX IF NOT EXISTS _mantle_schedule_runs_recent
|
|
307
|
+
ON _mantle_schedule_runs (started_at DESC);
|
|
308
|
+
CREATE INDEX IF NOT EXISTS _mantle_schedule_runs_schedule_recent
|
|
309
|
+
ON _mantle_schedule_runs (schedule_id, started_at DESC);`,
|
|
310
|
+
},
|
|
283
311
|
];
|
|
284
312
|
//# sourceMappingURL=canonicalMigrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalMigrations.js","sourceRoot":"","sources":["../../../src/infrastructure/boot/canonicalMigrations.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAyB;IACxD;QACE,EAAE,EAAE,WAAW;QACf,WAAW,EACT,oEAAoE;QACtE,4DAA4D;QAC5D,gEAAgE;QAChE,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuNJ;KACF;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,WAAW,EACT,mNAAmN;QACrN,GAAG,EAAE;;;;;;;;;;;;KAYJ;KACF;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,WAAW,EACT,6FAA6F;QAC/F,GAAG,EAAE;;;;;;;;;KASJ;KACF;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,WAAW,EAAE,gEAAgE;QAC7E,GAAG,EAAE;;;;;;;;;;;;;KAaJ;KACF;IACD;QACE,EAAE,EAAE,wBAAwB;QAC5B,WAAW,EAAE,6DAA6D;QAC1E,GAAG,EAAE,mEAAmE;KACzE;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"canonicalMigrations.js","sourceRoot":"","sources":["../../../src/infrastructure/boot/canonicalMigrations.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAyB;IACxD;QACE,EAAE,EAAE,WAAW;QACf,WAAW,EACT,oEAAoE;QACtE,4DAA4D;QAC5D,gEAAgE;QAChE,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuNJ;KACF;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,WAAW,EACT,mNAAmN;QACrN,GAAG,EAAE;;;;;;;;;;;;KAYJ;KACF;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,WAAW,EACT,6FAA6F;QAC/F,GAAG,EAAE;;;;;;;;;KASJ;KACF;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,WAAW,EAAE,gEAAgE;QAC7E,GAAG,EAAE;;;;;;;;;;;;;KAaJ;KACF;IACD;QACE,EAAE,EAAE,wBAAwB;QAC5B,WAAW,EAAE,6DAA6D;QAC1E,GAAG,EAAE,mEAAmE;KACzE;IACD;QACE,EAAE,EAAE,8BAA8B;QAClC,WAAW,EAAE,+DAA+D;QAC5E,GAAG,EAAE;;;OAGF;KACJ;IACD;QACE,EAAE,EAAE,gCAAgC;QACpC,WAAW,EAAE,2DAA2D;QACxE,GAAG,EAAE;;;;;;;;;;;;;;;+DAesD;KAC5D;CACF,CAAC"}
|
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import { type Entry, type SchemaManifest } from "@aotter/mantle-spec";
|
|
2
2
|
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
3
|
+
import type { AtomicEntryWrite, AtomicEntryWriter } from "../../domain/port/AtomicEntryWriter.js";
|
|
4
|
+
import type { ExpirySweeper, SweepExpiredRequest, SweepExpiredResult } from "../../domain/port/ExpirySweeper.js";
|
|
3
5
|
import type { CreateEntryArgs, DeleteEntryArgs, EntryKey, EntryRepository, FindEntryByDataFieldArgs, FindEntryByDataFieldsArgs, ListEntriesArgs, ListEntriesResult, TransitionStatusArgs, UpdateEntryArgs } from "../../domain/port/EntryRepository.js";
|
|
4
6
|
import type { CreationStatistics, CreationStatisticsArgs, EntryReader, FindManyEntriesByDataFieldArgs, PublishedEntryPage, ReadEntriesByDataFieldInArgs, ReadEntryByDataFieldArgs, ReadEntryBySlugArgs, ReadPublishedEntriesArgs, ReadPublishedPageArgs } from "../../domain/port/EntryReader.js";
|
|
5
7
|
import { type EntryRow } from "../../domain/model/EntryRow.js";
|
|
6
8
|
/** SQLite/D1 repository where each Schema is one physical table. */
|
|
7
|
-
export declare class DatabaseEntryRepository implements EntryRepository, EntryReader {
|
|
9
|
+
export declare class DatabaseEntryRepository implements EntryRepository, EntryReader, AtomicEntryWriter, ExpirySweeper {
|
|
8
10
|
private readonly db;
|
|
9
11
|
private readonly schemasByName;
|
|
10
|
-
|
|
12
|
+
private readonly now;
|
|
13
|
+
constructor(db: DatabaseDriver, schemasByName?: ReadonlyMap<string, SchemaManifest>, now?: () => number);
|
|
11
14
|
readCreationStatistics(args: CreationStatisticsArgs): Promise<CreationStatistics>;
|
|
12
15
|
create(args: CreateEntryArgs): Promise<EntryRow>;
|
|
16
|
+
writeAtomically(writes: readonly AtomicEntryWrite[]): Promise<void>;
|
|
13
17
|
get(args: EntryKey): Promise<EntryRow | null>;
|
|
18
|
+
sweepExpired(request: SweepExpiredRequest & {
|
|
19
|
+
readonly limit: number;
|
|
20
|
+
}): Promise<SweepExpiredResult>;
|
|
14
21
|
update(args: UpdateEntryArgs): Promise<EntryRow>;
|
|
15
22
|
delete(args: DeleteEntryArgs): Promise<{
|
|
16
23
|
readonly removed: boolean;
|
|
@@ -30,6 +37,7 @@ export declare class DatabaseEntryRepository implements EntryRepository, EntryRe
|
|
|
30
37
|
private encodedData;
|
|
31
38
|
private findOne;
|
|
32
39
|
private addReadConditions;
|
|
40
|
+
private addLiveCondition;
|
|
33
41
|
private addLocaleCondition;
|
|
34
42
|
private versionConflict;
|
|
35
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatabaseEntryRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseEntryRepository.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"DatabaseEntryRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseEntryRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { checkSchemaAdminUi, } from "@aotter/mantle-spec";
|
|
1
|
+
import { DiagnosticError, checkSchemaAdminUi, runtimeDiagnostic, } from "@aotter/mantle-spec";
|
|
2
2
|
import { EntryStatusConflict, EntryUniqueConflict, EntryVersionConflict, liftLocale, projectPublicEntry, } from "../../domain/model/EntryRow.js";
|
|
3
3
|
import { clampLimit } from "../../domain/service/Pagination.js";
|
|
4
4
|
import { decodeEntrySortCursor, encodeEntrySortCursor, escapeLikeTerm, PUBLISHED_PAGE_DATA_BUDGET, publishedPageLimit, } from "./Pagination.js";
|
|
5
|
-
import { decodeField, encodeField, fieldColumn, fieldSql, isNullableJsonSchema, sqliteSchemaTable, } from "../storage/SqliteSchemaTables.js";
|
|
5
|
+
import { decodeField, encodeField, fieldColumn, fieldSql, isNullableJsonSchema, sqliteSchemaTable, ttlCutoff, } from "../storage/SqliteSchemaTables.js";
|
|
6
6
|
/** SQLite/D1 repository where each Schema is one physical table. */
|
|
7
7
|
export class DatabaseEntryRepository {
|
|
8
8
|
db;
|
|
9
9
|
schemasByName;
|
|
10
|
-
|
|
10
|
+
now;
|
|
11
|
+
constructor(db, schemasByName = new Map(), now = Date.now) {
|
|
11
12
|
this.db = db;
|
|
12
13
|
this.schemasByName = schemasByName;
|
|
14
|
+
this.now = now;
|
|
13
15
|
}
|
|
14
16
|
async readCreationStatistics(args) {
|
|
15
17
|
const { from, to, bucketMs } = args;
|
|
@@ -19,16 +21,19 @@ export class DatabaseEntryRepository {
|
|
|
19
21
|
}
|
|
20
22
|
const table = this.table(args.collection);
|
|
21
23
|
const filter = checkSchemaAdminUi(table.schema).filter;
|
|
24
|
+
const live = [];
|
|
25
|
+
const liveBinds = [];
|
|
26
|
+
this.addLiveCondition(table, live, liveBinds);
|
|
22
27
|
const subtypeField = filter ? requiredFieldSql(table.schema, filter.field) : null;
|
|
23
28
|
const subtype = filter && subtypeField
|
|
24
29
|
? `CASE WHEN ${subtypeField} IN (${filter.values.map(() => "?").join(", ")}) THEN ${subtypeField} ELSE NULL END`
|
|
25
30
|
: "NULL";
|
|
26
|
-
const total = await this.db.prepare(`SELECT COUNT(*) AS count FROM ${table.table}`)
|
|
27
|
-
.first();
|
|
31
|
+
const total = await this.db.prepare(`SELECT COUNT(*) AS count FROM ${table.table}${live.length ? ` WHERE ${live.join(" AND ")}` : ""}`)
|
|
32
|
+
.bind(...liveBinds).first();
|
|
28
33
|
const rows = await this.db.prepare(`SELECT CAST(("_mantle_created_at" - ?) / ? AS INTEGER) AS bucket,
|
|
29
34
|
${subtype} AS subtype, COUNT(*) AS count FROM ${table.table}
|
|
30
|
-
WHERE "_mantle_created_at" >= ? AND "_mantle_created_at" < ? GROUP BY bucket, subtype`)
|
|
31
|
-
.bind(from, bucketMs, ...(filter ? filter.values : []), from, to)
|
|
35
|
+
WHERE "_mantle_created_at" >= ? AND "_mantle_created_at" < ?${live.length ? ` AND ${live.join(" AND ")}` : ""} GROUP BY bucket, subtype`)
|
|
36
|
+
.bind(from, bucketMs, ...(filter ? filter.values : []), from, to, ...liveBinds)
|
|
32
37
|
.all();
|
|
33
38
|
return { total: total?.count ?? 0, buckets: rows };
|
|
34
39
|
}
|
|
@@ -58,12 +63,100 @@ export class DatabaseEntryRepository {
|
|
|
58
63
|
updatedAt: args.now,
|
|
59
64
|
};
|
|
60
65
|
}
|
|
66
|
+
async writeAtomically(writes) {
|
|
67
|
+
if (writes.length === 0)
|
|
68
|
+
return;
|
|
69
|
+
const statements = writes.flatMap((write) => {
|
|
70
|
+
const table = this.table(write.args.collection);
|
|
71
|
+
if (write.kind === "create") {
|
|
72
|
+
const { args } = write;
|
|
73
|
+
const columns = ["_mantle_id", "_mantle_status", "_mantle_version", "_mantle_author_id", "_mantle_created_at", "_mantle_updated_at", ...table.fields];
|
|
74
|
+
const values = [args.id, args.status, 1, args.authorId, args.now, args.now, ...this.encodedData(table, args.data)];
|
|
75
|
+
return [this.db.prepare(`INSERT INTO ${table.table} (${columns.map(quote).join(", ")}) VALUES (${columns.map(() => "?").join(", ")})`).bind(...values)];
|
|
76
|
+
}
|
|
77
|
+
const mutation = write.kind === "update"
|
|
78
|
+
? this.db.prepare(`UPDATE ${table.table} SET ${[
|
|
79
|
+
...table.fields.map((field) => `${quote(field)} = ?`),
|
|
80
|
+
'"_mantle_version" = "_mantle_version" + 1',
|
|
81
|
+
'"_mantle_updated_at" = ?',
|
|
82
|
+
].join(", ")} WHERE "_mantle_id" = ? AND "_mantle_version" = ? AND "_mantle_version" = ? AND "_mantle_status" = ?`)
|
|
83
|
+
.bind(...this.encodedData(table, write.args.data), write.args.now, write.args.id, write.args.expectedVersion, write.args.observedVersion, write.args.expectedStatus)
|
|
84
|
+
: this.db.prepare(`DELETE FROM ${table.table} WHERE "_mantle_id" = ? AND "_mantle_version" = ? AND "_mantle_version" = ? AND "_mantle_status" = ? AND "_mantle_status" = ?`)
|
|
85
|
+
.bind(write.args.id, write.args.expectedVersion, write.args.observedVersion, write.args.expectedStatus, write.args.observedStatus);
|
|
86
|
+
// Both D1 and Bun roll the batch back on a constraint error. The
|
|
87
|
+
// NOT NULL check does not depend on a particular boot-state row.
|
|
88
|
+
const guard = this.db.prepare(`INSERT INTO _mantle_boot_state (id, fingerprint)
|
|
89
|
+
VALUES ('atomic-guard', CASE WHEN changes() = 1 THEN 'ok' ELSE NULL END)
|
|
90
|
+
ON CONFLICT(id) DO UPDATE SET fingerprint = excluded.fingerprint`);
|
|
91
|
+
const cleanup = this.db.prepare("DELETE FROM _mantle_boot_state WHERE id = 'atomic-guard'");
|
|
92
|
+
return [mutation, guard, cleanup];
|
|
93
|
+
});
|
|
94
|
+
try {
|
|
95
|
+
await this.db.batch(statements);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error instanceof Error && error.message.includes("_mantle_boot_state.fingerprint")) {
|
|
99
|
+
for (const write of writes) {
|
|
100
|
+
if (write.kind === "create")
|
|
101
|
+
continue;
|
|
102
|
+
const current = await this.get(write.args);
|
|
103
|
+
if (!current || current.version !== write.args.expectedVersion) {
|
|
104
|
+
throw new EntryVersionConflict(write.args.id, write.args.expectedVersion, current?.version ?? 0);
|
|
105
|
+
}
|
|
106
|
+
if (current.status !== write.args.expectedStatus) {
|
|
107
|
+
throw new EntryStatusConflict(write.args.id, write.args.expectedStatus, current.status);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
throw new DiagnosticError(runtimeDiagnostic({
|
|
111
|
+
code: "CONFLICT", severity: "error", path: "storage/AtomicEntryWrite",
|
|
112
|
+
message: "An entry precondition changed during the atomic write; reread and retry.",
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
if (isDriverUniqueConstraintError(error)) {
|
|
116
|
+
throw new DiagnosticError(runtimeDiagnostic({
|
|
117
|
+
code: "CONFLICT", severity: "error", path: "storage/AtomicEntryWrite",
|
|
118
|
+
message: `Atomic entry uniqueness conflict: ${error.message}`,
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
61
124
|
async get(args) {
|
|
62
125
|
const table = this.table(args.collection);
|
|
63
|
-
const
|
|
64
|
-
|
|
126
|
+
const conditions = ['"_mantle_id" = ?'];
|
|
127
|
+
const binds = [args.id];
|
|
128
|
+
this.addLiveCondition(table, conditions, binds);
|
|
129
|
+
const row = await this.db.prepare(`SELECT ${table.selectColumns} FROM ${table.table} WHERE ${conditions.join(" AND ")}`)
|
|
130
|
+
.bind(...binds).first();
|
|
65
131
|
return row ? rowFromDb(table, row) : null;
|
|
66
132
|
}
|
|
133
|
+
async sweepExpired(request) {
|
|
134
|
+
const table = this.table(request.collection);
|
|
135
|
+
const ttl = table.schema.spec.ttl;
|
|
136
|
+
if (!ttl)
|
|
137
|
+
throw new Error(`Schema '${request.collection}' has no TTL policy.`);
|
|
138
|
+
const field = requiredFieldSql(table.schema, ttl.field);
|
|
139
|
+
const cutoff = ttlCutoff(this.now(), ttl.expireAfterSeconds);
|
|
140
|
+
if (cutoff === null)
|
|
141
|
+
return { scanned: 0, removed: 0 };
|
|
142
|
+
const cursor = request.cursor ?? "";
|
|
143
|
+
const rows = await this.db.prepare(`SELECT "_mantle_id" AS id FROM ${table.table}
|
|
144
|
+
WHERE "_mantle_id" > ? AND ${field} IS NOT NULL AND julianday(${field}) <= julianday(?)
|
|
145
|
+
ORDER BY "_mantle_id" LIMIT ?`)
|
|
146
|
+
.bind(cursor, cutoff, request.limit + 1).all();
|
|
147
|
+
const page = rows.slice(0, request.limit);
|
|
148
|
+
let removed = 0;
|
|
149
|
+
if (request.delete && page.length) {
|
|
150
|
+
const result = await this.db.prepare(`DELETE FROM ${table.table} WHERE "_mantle_id" IN (
|
|
151
|
+
SELECT "_mantle_id" FROM ${table.table}
|
|
152
|
+
WHERE "_mantle_id" > ? AND ${field} IS NOT NULL AND julianday(${field}) <= julianday(?)
|
|
153
|
+
ORDER BY "_mantle_id" LIMIT ?)`)
|
|
154
|
+
.bind(cursor, cutoff, request.limit).run();
|
|
155
|
+
removed = result.meta.changes;
|
|
156
|
+
}
|
|
157
|
+
return { scanned: page.length, removed,
|
|
158
|
+
...(rows.length > request.limit ? { nextCursor: page.at(-1).id } : {}) };
|
|
159
|
+
}
|
|
67
160
|
async update(args) {
|
|
68
161
|
const table = this.table(args.collection);
|
|
69
162
|
const version = args.expectedVersion + 1;
|
|
@@ -132,6 +225,7 @@ export class DatabaseEntryRepository {
|
|
|
132
225
|
const direction = backward ? (sort.direction === "asc" ? "DESC" : "ASC") : sort.direction.toUpperCase();
|
|
133
226
|
const conditions = [];
|
|
134
227
|
const binds = [];
|
|
228
|
+
this.addLiveCondition(table, conditions, binds);
|
|
135
229
|
if (args.status) {
|
|
136
230
|
conditions.push('"_mantle_status" = ?');
|
|
137
231
|
binds.push(args.status);
|
|
@@ -218,6 +312,7 @@ export class DatabaseEntryRepository {
|
|
|
218
312
|
const table = this.table(args.collection);
|
|
219
313
|
const conditions = ['"_mantle_status" = \'published\''];
|
|
220
314
|
const binds = [];
|
|
315
|
+
this.addLiveCondition(table, conditions, binds);
|
|
221
316
|
this.addLocaleCondition(table, conditions, binds, args.locale);
|
|
222
317
|
const limit = typeof args.limit === "number" && Number.isFinite(args.limit) && args.limit > 0 ? ` LIMIT ${Math.floor(args.limit)}` : "";
|
|
223
318
|
const rows = await this.db.prepare(`SELECT ${table.selectColumns} FROM ${table.table} WHERE ${conditions.join(" AND ")} ORDER BY "_mantle_updated_at" DESC${limit}`)
|
|
@@ -233,6 +328,7 @@ export class DatabaseEntryRepository {
|
|
|
233
328
|
const columns = ['"_mantle_id"', '"_mantle_status"', '"_mantle_version"', '"_mantle_author_id"', '"_mantle_created_at"', '"_mantle_updated_at"', ...fields.map(quote)];
|
|
234
329
|
const conditions = ['"_mantle_status" = \'published\''];
|
|
235
330
|
const binds = [];
|
|
331
|
+
this.addLiveCondition(table, conditions, binds);
|
|
236
332
|
if (args.includeUnlocalized && typeof args.locale === "string") {
|
|
237
333
|
const locale = requiredFieldSql(table.schema, "locale");
|
|
238
334
|
conditions.push(`(${locale} = ? OR ${locale} IS NULL)`);
|
|
@@ -270,8 +366,11 @@ export class DatabaseEntryRepository {
|
|
|
270
366
|
const table = this.table(args.collection);
|
|
271
367
|
const field = requiredFieldSql(table.schema, args.field);
|
|
272
368
|
const limit = Number.isFinite(args.limit) && args.limit > 0 ? Math.floor(args.limit) : 1;
|
|
273
|
-
const
|
|
274
|
-
|
|
369
|
+
const conditions = [`${field} = ?`];
|
|
370
|
+
const binds = [encodeScalar(table.schema, args.field, args.value)];
|
|
371
|
+
this.addLiveCondition(table, conditions, binds);
|
|
372
|
+
const rows = await this.db.prepare(`SELECT ${table.selectColumns} FROM ${table.table} WHERE ${conditions.join(" AND ")} ORDER BY "_mantle_updated_at" DESC, "_mantle_id" DESC LIMIT ${limit}`)
|
|
373
|
+
.bind(...binds).all();
|
|
275
374
|
return rows.map((row) => projectPublicEntry(rowFromDb(table, row)));
|
|
276
375
|
}
|
|
277
376
|
table(collection) {
|
|
@@ -306,6 +405,7 @@ export class DatabaseEntryRepository {
|
|
|
306
405
|
conditions.push('"_mantle_id" <> ?');
|
|
307
406
|
binds.push(args.excludeId);
|
|
308
407
|
}
|
|
408
|
+
this.addLiveCondition(table, conditions, binds);
|
|
309
409
|
const row = await this.db.prepare(`SELECT ${table.selectColumns} FROM ${table.table} WHERE ${conditions.join(" AND ")} ORDER BY "_mantle_updated_at" DESC LIMIT 1`)
|
|
310
410
|
.bind(...binds).first();
|
|
311
411
|
return row ? rowFromDb(table, row) : null;
|
|
@@ -316,6 +416,18 @@ export class DatabaseEntryRepository {
|
|
|
316
416
|
binds.push(args.status);
|
|
317
417
|
}
|
|
318
418
|
this.addLocaleCondition(table, conditions, binds, args.locale);
|
|
419
|
+
this.addLiveCondition(table, conditions, binds);
|
|
420
|
+
}
|
|
421
|
+
addLiveCondition(table, conditions, binds) {
|
|
422
|
+
const ttl = table.schema.spec.ttl;
|
|
423
|
+
if (!ttl)
|
|
424
|
+
return;
|
|
425
|
+
const cutoff = ttlCutoff(this.now(), ttl.expireAfterSeconds);
|
|
426
|
+
if (cutoff === null)
|
|
427
|
+
return;
|
|
428
|
+
const field = requiredFieldSql(table.schema, ttl.field);
|
|
429
|
+
conditions.push(`(${field} IS NULL OR julianday(${field}) IS NULL OR julianday(${field}) > julianday(?))`);
|
|
430
|
+
binds.push(cutoff);
|
|
319
431
|
}
|
|
320
432
|
addLocaleCondition(table, conditions, binds, locale) {
|
|
321
433
|
if (locale === undefined)
|