@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.
Files changed (93) hide show
  1. package/dist/MantleRuntime.d.ts +11 -0
  2. package/dist/MantleRuntime.d.ts.map +1 -1
  3. package/dist/MantleRuntime.js +34 -3
  4. package/dist/MantleRuntime.js.map +1 -1
  5. package/dist/domain/model/HandlerContext.d.ts +13 -0
  6. package/dist/domain/model/HandlerContext.d.ts.map +1 -1
  7. package/dist/domain/port/AtomicEntryWriter.d.ts +23 -0
  8. package/dist/domain/port/AtomicEntryWriter.d.ts.map +1 -0
  9. package/dist/domain/port/AtomicEntryWriter.js +2 -0
  10. package/dist/domain/port/AtomicEntryWriter.js.map +1 -0
  11. package/dist/domain/port/DatabaseDriver.d.ts +2 -0
  12. package/dist/domain/port/DatabaseDriver.d.ts.map +1 -1
  13. package/dist/domain/port/ExpirySweeper.d.ts +19 -0
  14. package/dist/domain/port/ExpirySweeper.d.ts.map +1 -0
  15. package/dist/domain/port/ExpirySweeper.js +2 -0
  16. package/dist/domain/port/ExpirySweeper.js.map +1 -0
  17. package/dist/domain/port/MantleStorageAdapter.d.ts +8 -0
  18. package/dist/domain/port/MantleStorageAdapter.d.ts.map +1 -1
  19. package/dist/domain/port/RunObservationStore.d.ts +26 -0
  20. package/dist/domain/port/RunObservationStore.d.ts.map +1 -0
  21. package/dist/domain/port/RunObservationStore.js +2 -0
  22. package/dist/domain/port/RunObservationStore.js.map +1 -0
  23. package/dist/domain/service/RuntimePlanCompiler.d.ts +16 -2
  24. package/dist/domain/service/RuntimePlanCompiler.d.ts.map +1 -1
  25. package/dist/domain/service/RuntimePlanCompiler.js +13 -2
  26. package/dist/domain/service/RuntimePlanCompiler.js.map +1 -1
  27. package/dist/domain/service/io/EntryWriteGuard.d.ts +2 -0
  28. package/dist/domain/service/io/EntryWriteGuard.d.ts.map +1 -1
  29. package/dist/domain/service/io/EntryWriteGuard.js +2 -1
  30. package/dist/domain/service/io/EntryWriteGuard.js.map +1 -1
  31. package/dist/index.d.ts +8 -3
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +4 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/infrastructure/boot/bootState.d.ts +1 -1
  36. package/dist/infrastructure/boot/bootState.d.ts.map +1 -1
  37. package/dist/infrastructure/boot/bootState.js +19 -4
  38. package/dist/infrastructure/boot/bootState.js.map +1 -1
  39. package/dist/infrastructure/boot/canonicalMigrations.d.ts.map +1 -1
  40. package/dist/infrastructure/boot/canonicalMigrations.js +28 -0
  41. package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -1
  42. package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +10 -2
  43. package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -1
  44. package/dist/infrastructure/persistence/DatabaseEntryRepository.js +123 -11
  45. package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -1
  46. package/dist/infrastructure/persistence/DatabaseRunObservationStore.d.ts +14 -0
  47. package/dist/infrastructure/persistence/DatabaseRunObservationStore.d.ts.map +1 -0
  48. package/dist/infrastructure/persistence/DatabaseRunObservationStore.js +68 -0
  49. package/dist/infrastructure/persistence/DatabaseRunObservationStore.js.map +1 -0
  50. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts +5 -0
  51. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts.map +1 -1
  52. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js +13 -0
  53. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js.map +1 -1
  54. package/dist/infrastructure/storage/SqliteMantleStorageAdapter.d.ts +5 -3
  55. package/dist/infrastructure/storage/SqliteMantleStorageAdapter.d.ts.map +1 -1
  56. package/dist/infrastructure/storage/SqliteMantleStorageAdapter.js +49 -16
  57. package/dist/infrastructure/storage/SqliteMantleStorageAdapter.js.map +1 -1
  58. package/dist/infrastructure/storage/SqliteMigrationArtifact.d.ts +17 -1
  59. package/dist/infrastructure/storage/SqliteMigrationArtifact.d.ts.map +1 -1
  60. package/dist/infrastructure/storage/SqliteMigrationArtifact.js +62 -6
  61. package/dist/infrastructure/storage/SqliteMigrationArtifact.js.map +1 -1
  62. package/dist/infrastructure/storage/SqliteSchemaTables.d.ts +4 -0
  63. package/dist/infrastructure/storage/SqliteSchemaTables.d.ts.map +1 -1
  64. package/dist/infrastructure/storage/SqliteSchemaTables.js +16 -2
  65. package/dist/infrastructure/storage/SqliteSchemaTables.js.map +1 -1
  66. package/dist/infrastructure/storage/SqliteViewCompiler.d.ts +1 -1
  67. package/dist/infrastructure/storage/SqliteViewCompiler.d.ts.map +1 -1
  68. package/dist/infrastructure/storage/SqliteViewCompiler.js +11 -2
  69. package/dist/infrastructure/storage/SqliteViewCompiler.js.map +1 -1
  70. package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -1
  71. package/dist/usecase/boot/ValidateBootUseCase.js +15 -0
  72. package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -1
  73. package/dist/usecase/content/AtomicEntryWriteUseCase.d.ts +37 -0
  74. package/dist/usecase/content/AtomicEntryWriteUseCase.d.ts.map +1 -0
  75. package/dist/usecase/content/AtomicEntryWriteUseCase.js +108 -0
  76. package/dist/usecase/content/AtomicEntryWriteUseCase.js.map +1 -0
  77. package/dist/usecase/content/CreateDraftUseCase.d.ts +5 -0
  78. package/dist/usecase/content/CreateDraftUseCase.d.ts.map +1 -1
  79. package/dist/usecase/content/CreateDraftUseCase.js +8 -3
  80. package/dist/usecase/content/CreateDraftUseCase.js.map +1 -1
  81. package/dist/usecase/content/DeleteEntryUseCase.d.ts +6 -0
  82. package/dist/usecase/content/DeleteEntryUseCase.d.ts.map +1 -1
  83. package/dist/usecase/content/DeleteEntryUseCase.js +12 -8
  84. package/dist/usecase/content/DeleteEntryUseCase.js.map +1 -1
  85. package/dist/usecase/content/UpdateDraftUseCase.d.ts +9 -0
  86. package/dist/usecase/content/UpdateDraftUseCase.d.ts.map +1 -1
  87. package/dist/usecase/content/UpdateDraftUseCase.js +15 -9
  88. package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -1
  89. package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts +4 -1
  90. package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts.map +1 -1
  91. package/dist/usecase/procedure/InvokeProcedureUseCase.js +10 -2
  92. package/dist/usecase/procedure/InvokeProcedureUseCase.js.map +1 -1
  93. 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
- await assertUniqueIndexes(args);
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":"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"}
1
+ {"version":3,"file":"EntryWriteGuard.js","sourceRoot":"","sources":["../../../../src/domain/service/io/EntryWriteGuard.ts"],"names":[],"mappings":"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"}
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";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,yCAAyC,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAC1G,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,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC9F,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAC7G,OAAO,EAAE,uBAAuB,EAAE,KAAK,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AAClH,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,4BAA4B,EAC5B,kBAAkB,EAClB,6BAA6B,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC3B,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,WAAW,EACX,UAAU,GACX,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,KAAK,4BAA4B,GAClC,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,WAAW,EACX,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,YAAY,EACV,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,GACZ,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAKzF,OAAO,EAAE,KAAK,WAAW,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGrF,YAAY,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAC1C,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;AAI9C,OAAO,EACL,oBAAoB,EACpB,KAAK,WAAW,GACjB,MAAM,8CAA8C,CAAC;AACtD,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAInF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAIzE,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAE9E,OAAO,EACL,gCAAgC,EAChC,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,wCAAwC,CAAC"}
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,GAYhB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,2BAA2B,GAI5B,MAAM,iDAAiD,CAAC;AAsCzD,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,kBAAkB,EAClB,6BAA6B,GAE9B,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,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"}
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,CAW7F;AAED,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"}
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
- const row = await db
17
- .prepare("SELECT fingerprint, store_instance_id FROM _mantle_boot_state WHERE id = ? LIMIT 1")
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;IACzE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE;aACjB,OAAO,CAAC,oFAAoF,CAAC;aAC7F,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,EAA6D,CAAC;QACtE,OAAO,GAAG,EAAE,WAAW,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAkB,EAAE,WAAmB;IAC3E,MAAM,EAAE;SACL,OAAO,CACN,uFAAuF;QACrF,oEAAoE;QACpE,gGAAgG,CACnG;SACA,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;SACrD,GAAG,EAAE,CAAC;AACX,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAkB;IAC1D,MAAM,GAAG,GAAG,MAAM,EAAE;SACjB,OAAO,CAAC,uEAAuE,CAAC;SAChF,IAAI,CAAC,aAAa,CAAC;SACnB,KAAK,EAAwC,CAAC;IACjD,IAAI,CAAC,GAAG,EAAE,iBAAiB;QAAE,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACjH,OAAO,GAAG,CAAC,iBAAiB,CAAC;AAC/B,CAAC"}
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,EAwRpD,CAAC"}
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
- constructor(db: DatabaseDriver, schemasByName?: ReadonlyMap<string, SchemaManifest>);
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,EAGL,KAAK,KAAK,EACV,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,QAAQ,EACR,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EAChB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,8BAA8B,EAC9B,kBAAkB,EAClB,4BAA4B,EAC5B,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,gCAAgC,CAAC;AAoBxC,oEAAoE;AACpE,qBAAa,uBAAwB,YAAW,eAAe,EAAE,WAAW;IAExE,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBADb,EAAE,EAAE,cAAc,EAClB,aAAa,GAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAa;IAG3E,sBAAsB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsBjF,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0BhD,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAO7C,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoBhD,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAYrE,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiB/D,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4CvD,eAAe,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAIzE,gBAAgB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAI3E,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAK/C,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAI5D,eAAe,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAKtE,iBAAiB,CAAC,IAAI,EAAE,4BAA4B,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC;IAsBhF,aAAa,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC;IAWxE,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuC3E,mBAAmB,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC;IAS1F,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,WAAW;YAOL,OAAO;IAuBrB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,kBAAkB;YAWZ,eAAe;CAI9B;AA6DD,wEAAwE;AACxE,wBAAsB,eAAe,CACnC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAEvB"}
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
- constructor(db, schemasByName = new Map()) {
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 row = await this.db.prepare(`SELECT ${table.selectColumns} FROM ${table.table} WHERE "_mantle_id" = ?`)
64
- .bind(args.id).first();
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 rows = await this.db.prepare(`SELECT ${table.selectColumns} FROM ${table.table} WHERE ${field} = ? ORDER BY "_mantle_updated_at" DESC, "_mantle_id" DESC LIMIT ${limit}`)
274
- .bind(encodeScalar(table.schema, args.field, args.value)).all();
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)