@beechcms/core 0.9.5 → 0.9.7

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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auth/login-request.d.ts +16 -0
  3. package/dist/auth/login-request.d.ts.map +1 -0
  4. package/dist/auth/login-request.js +22 -0
  5. package/dist/automations-grammar-words.d.ts +2 -0
  6. package/dist/automations-grammar-words.d.ts.map +1 -0
  7. package/dist/automations-grammar-words.js +8 -0
  8. package/dist/automations.repository.interface.d.ts +19 -0
  9. package/dist/automations.repository.interface.d.ts.map +1 -0
  10. package/dist/automations.repository.interface.js +3 -0
  11. package/dist/automations.runner.interface.d.ts +10 -0
  12. package/dist/automations.runner.interface.d.ts.map +1 -0
  13. package/dist/automations.runner.interface.js +3 -0
  14. package/dist/automations.runner.stub.d.ts +5 -0
  15. package/dist/automations.runner.stub.d.ts.map +1 -0
  16. package/dist/automations.runner.stub.js +7 -0
  17. package/dist/automations.types.d.ts +75 -0
  18. package/dist/automations.types.d.ts.map +1 -0
  19. package/dist/automations.types.js +3 -0
  20. package/dist/clock.d.ts +25 -0
  21. package/dist/clock.d.ts.map +1 -0
  22. package/dist/clock.js +11 -0
  23. package/dist/content/content.repository.d.ts +22 -22
  24. package/dist/content/content.repository.d.ts.map +1 -1
  25. package/dist/content/retention.d.ts +13 -0
  26. package/dist/content/retention.d.ts.map +1 -0
  27. package/dist/content/retention.js +20 -0
  28. package/dist/content/slug-utils.d.ts +7 -0
  29. package/dist/content/slug-utils.d.ts.map +1 -1
  30. package/dist/content/slug-utils.js +12 -0
  31. package/dist/content-scan.repository.d.ts +9 -0
  32. package/dist/content-scan.repository.d.ts.map +1 -0
  33. package/dist/content-scan.repository.js +3 -0
  34. package/dist/content.repository.d.ts +247 -0
  35. package/dist/content.repository.d.ts.map +1 -0
  36. package/dist/content.repository.js +59 -0
  37. package/dist/dashboard-layout/dashboard-layout.d.ts +2 -2
  38. package/dist/dashboard-layout/dashboard-layout.d.ts.map +1 -1
  39. package/dist/dashboard-layout/dashboard-layout.js +3 -3
  40. package/dist/dashboard-layout/relation-avatar.d.ts +12 -0
  41. package/dist/dashboard-layout/relation-avatar.d.ts.map +1 -0
  42. package/dist/dashboard-layout/relation-avatar.js +18 -0
  43. package/dist/dashboard-layout/seed-layout.d.ts.map +1 -1
  44. package/dist/dashboard-layout/seed-layout.js +17 -1
  45. package/dist/dashboard-layout.d.ts +154 -0
  46. package/dist/dashboard-layout.d.ts.map +1 -0
  47. package/dist/dashboard-layout.js +186 -0
  48. package/dist/dashboard-layout.repository.d.ts +18 -0
  49. package/dist/dashboard-layout.repository.d.ts.map +1 -0
  50. package/dist/dashboard-layout.repository.js +3 -0
  51. package/dist/dashboard-permissions.d.ts +3 -0
  52. package/dist/dashboard-permissions.d.ts.map +1 -0
  53. package/dist/dashboard-permissions.js +11 -0
  54. package/dist/dashboard-scopes.d.ts +12 -0
  55. package/dist/dashboard-scopes.d.ts.map +1 -0
  56. package/dist/dashboard-scopes.js +30 -0
  57. package/dist/define-seed.d.ts +3 -0
  58. package/dist/define-seed.d.ts.map +1 -0
  59. package/dist/define-seed.js +5 -0
  60. package/dist/demo-data.repository.d.ts +5 -0
  61. package/dist/demo-data.repository.d.ts.map +1 -0
  62. package/dist/demo-data.repository.js +3 -0
  63. package/dist/email.provider.d.ts +32 -0
  64. package/dist/email.provider.d.ts.map +1 -0
  65. package/dist/email.provider.js +4 -0
  66. package/dist/engine/ddl/ddl.d.ts +4 -6
  67. package/dist/engine/ddl/ddl.d.ts.map +1 -1
  68. package/dist/engine/ddl/ddl.js +13 -27
  69. package/dist/engine/ddl/seed-ddl.d.ts.map +1 -1
  70. package/dist/engine/ddl/seed-ddl.js +10 -2
  71. package/dist/engine/ddl.d.ts +0 -23
  72. package/dist/engine/ddl.d.ts.map +1 -1
  73. package/dist/engine/ddl.js +3 -59
  74. package/dist/engine/localization.d.ts +127 -0
  75. package/dist/engine/localization.d.ts.map +1 -0
  76. package/dist/engine/localization.js +212 -0
  77. package/dist/engine/privacy.service.d.ts.map +1 -1
  78. package/dist/engine/query/active-clause.d.ts +2 -3
  79. package/dist/engine/query/active-clause.d.ts.map +1 -1
  80. package/dist/engine/query/active-clause.js +3 -4
  81. package/dist/engine/query/query.js +8 -8
  82. package/dist/engine/query/search-support.d.ts +32 -0
  83. package/dist/engine/query/search-support.d.ts.map +1 -0
  84. package/dist/engine/query/search-support.js +34 -0
  85. package/dist/engine/query.d.ts.map +1 -1
  86. package/dist/engine/query.js +0 -12
  87. package/dist/engine/schema-fingerprint.d.ts +2 -0
  88. package/dist/engine/schema-fingerprint.d.ts.map +1 -1
  89. package/dist/engine/schema-fingerprint.js +2 -0
  90. package/dist/engine/seed-ddl.d.ts +1 -4
  91. package/dist/engine/seed-ddl.d.ts.map +1 -1
  92. package/dist/engine/seed-ddl.js +2 -17
  93. package/dist/engine/seed-registry.d.ts.map +1 -1
  94. package/dist/engine/seed-types-generator.d.ts +2 -17
  95. package/dist/engine/seed-types-generator.d.ts.map +1 -1
  96. package/dist/engine/seed-types-generator.js +3 -31
  97. package/dist/engine/seed-validation.d.ts.map +1 -1
  98. package/dist/engine/seed-validation.js +0 -10
  99. package/dist/engine/seeds/seed-definition-diff.d.ts +1 -1
  100. package/dist/engine/seeds/seed-definition-diff.d.ts.map +1 -1
  101. package/dist/engine/seeds/seed-definition-diff.js +2 -2
  102. package/dist/engine/seeds/seed-validation.d.ts.map +1 -1
  103. package/dist/engine/seeds/seed-validation.js +3 -12
  104. package/dist/engine/types.d.ts +7 -7
  105. package/dist/engine/types.d.ts.map +1 -1
  106. package/dist/engine.d.ts +144 -0
  107. package/dist/engine.d.ts.map +1 -0
  108. package/dist/engine.js +741 -0
  109. package/dist/file-types.d.ts +13 -0
  110. package/dist/file-types.d.ts.map +1 -0
  111. package/dist/file-types.js +85 -0
  112. package/dist/hooks.d.ts +29 -0
  113. package/dist/hooks.d.ts.map +1 -0
  114. package/dist/hooks.js +3 -0
  115. package/dist/id-generator.d.ts +26 -0
  116. package/dist/id-generator.d.ts.map +1 -0
  117. package/dist/id-generator.js +12 -0
  118. package/dist/idempotency.repository.d.ts +13 -0
  119. package/dist/idempotency.repository.d.ts.map +1 -0
  120. package/dist/idempotency.repository.js +3 -0
  121. package/dist/index.d.ts +1 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +1 -0
  124. package/dist/kanban-position.repository.d.ts +19 -0
  125. package/dist/kanban-position.repository.d.ts.map +1 -0
  126. package/dist/kanban-position.repository.js +3 -0
  127. package/dist/kanban.d.ts +75 -0
  128. package/dist/kanban.d.ts.map +1 -0
  129. package/dist/kanban.js +82 -0
  130. package/dist/layout-permissions.d.ts +3 -0
  131. package/dist/layout-permissions.d.ts.map +1 -0
  132. package/dist/layout-permissions.js +11 -0
  133. package/dist/media.repository.d.ts +61 -0
  134. package/dist/media.repository.d.ts.map +1 -0
  135. package/dist/media.repository.js +3 -0
  136. package/dist/notifications/notification.repository.d.ts +6 -3
  137. package/dist/notifications/notification.repository.d.ts.map +1 -1
  138. package/dist/policies.d.ts +10 -0
  139. package/dist/policies.d.ts.map +1 -0
  140. package/dist/policies.js +33 -0
  141. package/dist/queue.interface.d.ts +39 -0
  142. package/dist/queue.interface.d.ts.map +1 -0
  143. package/dist/queue.interface.js +3 -0
  144. package/dist/queue.stub.d.ts +6 -0
  145. package/dist/queue.stub.d.ts.map +1 -0
  146. package/dist/queue.stub.js +8 -0
  147. package/dist/relations.d.ts +28 -0
  148. package/dist/relations.d.ts.map +1 -0
  149. package/dist/relations.js +25 -0
  150. package/dist/richtext-render.d.ts +11 -0
  151. package/dist/richtext-render.d.ts.map +1 -0
  152. package/dist/richtext-render.js +87 -0
  153. package/dist/richtext.d.ts +11 -0
  154. package/dist/richtext.d.ts.map +1 -0
  155. package/dist/richtext.js +13 -0
  156. package/dist/scheduler.interface.d.ts +4 -0
  157. package/dist/scheduler.interface.d.ts.map +1 -0
  158. package/dist/scheduler.interface.js +3 -0
  159. package/dist/scheduler.stub.d.ts +5 -0
  160. package/dist/scheduler.stub.d.ts.map +1 -0
  161. package/dist/scheduler.stub.js +7 -0
  162. package/dist/schema-mutator.d.ts +26 -0
  163. package/dist/schema-mutator.d.ts.map +1 -0
  164. package/dist/schema-mutator.js +3 -0
  165. package/dist/security/time-trap.d.ts +3 -2
  166. package/dist/security/time-trap.d.ts.map +1 -1
  167. package/dist/security/time-trap.js +5 -4
  168. package/dist/seed-ddl-destructive.d.ts +40 -0
  169. package/dist/seed-ddl-destructive.d.ts.map +1 -0
  170. package/dist/seed-ddl-destructive.js +149 -0
  171. package/dist/seed-ddl.d.ts +40 -0
  172. package/dist/seed-ddl.d.ts.map +1 -0
  173. package/dist/seed-ddl.js +100 -0
  174. package/dist/seed-layout.d.ts +145 -0
  175. package/dist/seed-layout.d.ts.map +1 -0
  176. package/dist/seed-layout.js +192 -0
  177. package/dist/seed-layout.repository.d.ts +22 -0
  178. package/dist/seed-layout.repository.d.ts.map +1 -0
  179. package/dist/seed-layout.repository.js +3 -0
  180. package/dist/seed-registry.d.ts +71 -0
  181. package/dist/seed-registry.d.ts.map +1 -0
  182. package/dist/seed-registry.js +143 -0
  183. package/dist/seed-types-generator.d.ts +1 -1
  184. package/dist/seed-types-generator.d.ts.map +1 -1
  185. package/dist/seed-validation.d.ts +23 -0
  186. package/dist/seed-validation.d.ts.map +1 -0
  187. package/dist/seed-validation.js +224 -0
  188. package/dist/seed.repository.d.ts +37 -0
  189. package/dist/seed.repository.d.ts.map +1 -0
  190. package/dist/seed.repository.js +3 -0
  191. package/dist/seeds.d.ts +20 -0
  192. package/dist/seeds.d.ts.map +1 -0
  193. package/dist/seeds.js +21 -0
  194. package/dist/settings/site-settings.repository.d.ts +2 -0
  195. package/dist/settings/site-settings.repository.d.ts.map +1 -1
  196. package/dist/site-settings.repository.d.ts +16 -0
  197. package/dist/site-settings.repository.d.ts.map +1 -0
  198. package/dist/site-settings.repository.js +3 -0
  199. package/dist/slug-utils.d.ts +18 -0
  200. package/dist/slug-utils.d.ts.map +1 -0
  201. package/dist/slug-utils.js +32 -0
  202. package/dist/storage.d.ts +46 -0
  203. package/dist/storage.d.ts.map +1 -0
  204. package/dist/storage.js +3 -0
  205. package/dist/types.d.ts +243 -0
  206. package/dist/types.d.ts.map +1 -0
  207. package/dist/types.js +3 -0
  208. package/dist/validation.d.ts +50 -0
  209. package/dist/validation.d.ts.map +1 -0
  210. package/dist/validation.js +660 -0
  211. package/dist/webhook-validation.d.ts +3 -0
  212. package/dist/webhook-validation.d.ts.map +1 -0
  213. package/dist/webhook-validation.js +6 -0
  214. package/package.json +1 -1
  215. package/dist/content/content-lock.repository.d.ts +0 -63
  216. package/dist/content/content-lock.repository.d.ts.map +0 -1
  217. package/dist/content/content-lock.repository.js +0 -15
@@ -44,18 +44,6 @@ export function buildSelectQuery(seed, options = {}) {
44
44
  whereClauses.push(`${table}.status = ?`);
45
45
  bindings.push(status);
46
46
  }
47
- // Soft delete: 'active' is the default, so a caller that forgets the option can never
48
- // observe a trashed row — including the Public API, relation expansion and subqueries,
49
- // which all reach SQL only through repository.findMany.
50
- if (seed.softDelete) {
51
- const trashed = options.trashed ?? 'active';
52
- if (trashed === 'active') {
53
- whereClauses.push(`${table}.deleted_at IS NULL`);
54
- }
55
- else if (trashed === 'trashed') {
56
- whereClauses.push(`${table}.deleted_at IS NOT NULL`);
57
- }
58
- }
59
47
  const groupClauses = [];
60
48
  for (const group of filters) {
61
49
  if (!isValidColumn(seed, group.column))
@@ -21,6 +21,8 @@ export interface ContractBranch {
21
21
  publicEdit: boolean;
22
22
  minItems?: number;
23
23
  maxItems?: number;
24
+ /** Present only when true: the dictionary shape is part of the public contract (`?lang=all`, writes). */
25
+ localized?: boolean;
24
26
  /** Repeater sub-fields, same projection, recursively. */
25
27
  fields?: ContractBranch[];
26
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema-fingerprint.d.ts","sourceRoot":"","sources":["../../src/engine/schema-fingerprint.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAE3C,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,gBAAgB,EAAE,OAAO,CAAA;IACzB,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2FAA2F;IAC3F,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACxC,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yDAAyD;IACzD,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;CAC1B;AAED,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,OAAO,CAAA;IACpB,eAAe,EAAE,OAAO,CAAA;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,cAAc,EAAE,CAAA;CAC3B;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAA;CACtB;AAuBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,CAenE;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAI7E"}
1
+ {"version":3,"file":"schema-fingerprint.d.ts","sourceRoot":"","sources":["../../src/engine/schema-fingerprint.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAE3C,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,gBAAgB,EAAE,OAAO,CAAA;IACzB,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2FAA2F;IAC3F,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACxC,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yGAAyG;IACzG,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,yDAAyD;IACzD,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;CAC1B;AAED,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,OAAO,CAAA;IACpB,eAAe,EAAE,OAAO,CAAA;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,cAAc,EAAE,CAAA;CAC3B;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAA;CACtB;AAyBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,CAenE;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAI7E"}
@@ -39,6 +39,8 @@ function projectBranch(branch) {
39
39
  publicEdit: policies.publicEdit,
40
40
  ...(branch.minItems !== undefined ? { minItems: branch.minItems } : {}),
41
41
  ...(branch.maxItems !== undefined ? { maxItems: branch.maxItems } : {}),
42
+ // Spread only when true so every schema without localized branches keeps its fingerprint.
43
+ ...(branch.localized === true ? { localized: true } : {}),
42
44
  ...(branch.fields ? { fields: branch.fields.map(projectBranch) } : {}),
43
45
  };
44
46
  }
@@ -20,11 +20,8 @@ export interface ExtendPlan {
20
20
  * FTS: SQLite cannot ALTER an fts5 table's columns. If a new text/richtext
21
21
  * searchable branch was added, ftsRebuildNeeded=true signals the caller
22
22
  * (sprint 03) to handle it — no DROP is emitted.
23
- *
24
- * Draft tables: pass `existingDraftColumns` (PRAGMA table_info on content_{slug}_drafts) to have the
25
- * `live_snapshot_at` system column added retroactively; omit it to skip that check entirely.
26
23
  */
27
- export declare function planExtendSeed(seed: Seed, existingColumns: Set<string>, existingDraftColumns?: Set<string> | null): ExtendPlan;
24
+ export declare function planExtendSeed(seed: Seed, existingColumns: Set<string>): ExtendPlan;
28
25
  /**
29
26
  * Destructive FTS rebuild (sprint 06). SQLite cannot ALTER an fts5 table's
30
27
  * columns, so when a searchable branch is added, renamed, retyped, or dropped
@@ -1 +1 @@
1
- {"version":3,"file":"seed-ddl.d.ts","sourceRoot":"","sources":["../../src/engine/seed-ddl.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAgBtC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAanD;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GACxC,UAAU,CAmCZ;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CA0BnD"}
1
+ {"version":3,"file":"seed-ddl.d.ts","sourceRoot":"","sources":["../../src/engine/seed-ddl.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AActC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAanD;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,UAAU,CAqBnF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CA0BnD"}
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
  // Copyright (c) 2024–2026 Flavio De Musso
3
- import { generateCreateTable, generateDraftTable, generateIndexes, generateFtsTable, generateFtsTriggers, generateAddColumn, generateAddDraftSnapshotColumn, generateJunctionTable, generateJunctionIndexes, generateJunctionDraftTable, generateEnableSoftDelete, indexableSearchBranches, } from './engine.js';
3
+ import { generateCreateTable, generateDraftTable, generateIndexes, generateFtsTable, generateFtsTriggers, generateAddColumn, generateJunctionTable, generateJunctionIndexes, generateJunctionDraftTable, indexableSearchBranches, } from './engine.js';
4
4
  /**
5
5
  * Full create-from-scratch statement set for a seed. Mirrors the CLI's buildStatements.
6
6
  * Order: parent table → indexes → draft table → FTS table → FTS triggers →
@@ -35,11 +35,8 @@ export function planCreateSeed(seed) {
35
35
  * FTS: SQLite cannot ALTER an fts5 table's columns. If a new text/richtext
36
36
  * searchable branch was added, ftsRebuildNeeded=true signals the caller
37
37
  * (sprint 03) to handle it — no DROP is emitted.
38
- *
39
- * Draft tables: pass `existingDraftColumns` (PRAGMA table_info on content_{slug}_drafts) to have the
40
- * `live_snapshot_at` system column added retroactively; omit it to skip that check entirely.
41
38
  */
42
- export function planExtendSeed(seed, existingColumns, existingDraftColumns) {
39
+ export function planExtendSeed(seed, existingColumns) {
43
40
  const statements = [];
44
41
  let ftsRebuildNeeded = false;
45
42
  for (const branch of seed.branches) {
@@ -58,18 +55,6 @@ export function planExtendSeed(seed, existingColumns, existingDraftColumns) {
58
55
  ftsRebuildNeeded = true;
59
56
  }
60
57
  }
61
- // System column, not a branch: the branch loop above can never emit it.
62
- if (seed.softDelete && !existingColumns.has('deleted_at')) {
63
- statements.push(...generateEnableSoftDelete(seed));
64
- }
65
- // Draft-table system column. Emitted only when the caller actually introspected
66
- // content_{slug}_drafts: `undefined` means "not introspected" and `null` means "table absent",
67
- // and in both cases emitting a non-idempotent ADD COLUMN would abort the caller's whole DDL batch.
68
- if (seed.allowDrafts &&
69
- existingDraftColumns != null &&
70
- !existingDraftColumns.has('live_snapshot_at')) {
71
- statements.push(generateAddDraftSnapshotColumn(seed));
72
- }
73
58
  // CREATE INDEX IF NOT EXISTS — idempotent, safe to re-run
74
59
  statements.push(...generateIndexes(seed));
75
60
  return { statements, ftsRebuildNeeded };
@@ -1 +1 @@
1
- {"version":3,"file":"seed-registry.d.ts","sourceRoot":"","sources":["../../src/engine/seed-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAI9C,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,GAAG,IAAI,IAAI,EAAE,CAAA;IAEb;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IAE9B;;;;;OAKG;IACH,kBAAkB,IAAI,IAAI,EAAE,CAAA;IAE5B;;;OAGG;IACH,cAAc,IAAI,IAAI,EAAE,CAAA;IAExB;;;OAGG;IACH,YAAY,IAAI,IAAI,EAAE,CAAA;CACvB;AAID,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;gBAEzB,KAAK,EAAE,IAAI,EAAE;IAkCzB,GAAG,IAAI,IAAI,EAAE;IAIb,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI9B,kBAAkB,IAAI,IAAI,EAAE;IAI5B,cAAc,IAAI,IAAI,EAAE;IAIxB,YAAY,IAAI,IAAI,EAAE;CAGvB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;CAAG;AAEzD,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,MAAM,CAQjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CA0F1E"}
1
+ {"version":3,"file":"seed-registry.d.ts","sourceRoot":"","sources":["../../src/engine/seed-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAI9C,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,GAAG,IAAI,IAAI,EAAE,CAAA;IAEb;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IAE9B;;;;;OAKG;IACH,kBAAkB,IAAI,IAAI,EAAE,CAAA;IAE5B;;;OAGG;IACH,cAAc,IAAI,IAAI,EAAE,CAAA;IAExB;;;OAGG;IACH,YAAY,IAAI,IAAI,EAAE,CAAA;CACvB;AAID,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAErC,YAAY,KAAK,EAAE,IAAI,EAAE,EAgCxB;IAED,GAAG,IAAI,IAAI,EAAE,CAEZ;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE7B;IAED,kBAAkB,IAAI,IAAI,EAAE,CAE3B;IAED,cAAc,IAAI,IAAI,EAAE,CAEvB;IAED,YAAY,IAAI,IAAI,EAAE,CAErB;CACF;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;CAAG;AAEzD,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,MAAM,CAQjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CA0F1E"}
@@ -5,21 +5,6 @@ export declare function pascalCase(input: string): string;
5
5
  export declare function tsTypeForBranch(branch: Branch): string;
6
6
  /** Emits one exported interface for a single Seed. */
7
7
  export declare function interfaceForSeed(seed: Seed): string;
8
- /** Options that affect the emitted module beyond the seed interfaces themselves. */
9
- export interface SeedTypesOptions {
10
- /**
11
- * Schema fingerprint to embed as `SCHEMA_FINGERPRINT`, from `computeSchemaFingerprint`.
12
- * Omitted ⇒ no constant is emitted and the output is byte-identical to a pre-fingerprint build,
13
- * which is what keeps the legacy `beech gen-types` aliases non-breaking.
14
- */
15
- fingerprint?: string;
16
- }
17
- /**
18
- * Pure entry point. Deterministic: sorts seeds by slug for stable diffs.
19
- *
20
- * The embedded fingerprint is the client's half of the drift check: `@beechcms/client` compares it
21
- * against the `X-Schema-Revision` header the API returns and raises an actionable error on a
22
- * mismatch, instead of trusting a stale response shape.
23
- */
24
- export declare function generateSeedTypes(seeds: Seed[], options?: SeedTypesOptions): string;
8
+ /** Pure entry point. Deterministic: sorts seeds by slug for stable diffs. */
9
+ export declare function generateSeedTypes(seeds: Seed[]): string;
25
10
  //# sourceMappingURL=seed-types-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"seed-types-generator.d.ts","sourceRoot":"","sources":["../../src/engine/seed-types-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAe9C,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD;AAMD,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoCtD;AAWD,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAYnD;AAKD,oFAAoF;AACpF,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAcvF"}
1
+ {"version":3,"file":"seed-types-generator.d.ts","sourceRoot":"","sources":["../../src/engine/seed-types-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAe9C,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD;AAMD,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoCtD;AAWD,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAYnD;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAcvD"}
@@ -74,16 +74,8 @@ export function interfaceForSeed(seed) {
74
74
  SYSTEM_TIMESTAMPS +
75
75
  `}\n`);
76
76
  }
77
- /** `v{version}:{32 hex}` — the exact shape `computeSchemaFingerprint` returns. */
78
- const FINGERPRINT_RE = /^v\d+:[0-9a-f]{32}$/;
79
- /**
80
- * Pure entry point. Deterministic: sorts seeds by slug for stable diffs.
81
- *
82
- * The embedded fingerprint is the client's half of the drift check: `@beechcms/client` compares it
83
- * against the `X-Schema-Revision` header the API returns and raises an actionable error on a
84
- * mismatch, instead of trusting a stale response shape.
85
- */
86
- export function generateSeedTypes(seeds, options = {}) {
77
+ /** Pure entry point. Deterministic: sorts seeds by slug for stable diffs. */
78
+ export function generateSeedTypes(seeds) {
87
79
  const sorted = [...seeds].sort((a, b) => a.slug.localeCompare(b.slug));
88
80
  const interfaces = sorted.map(interfaceForSeed).join('\n');
89
81
  const registryProps = sorted
@@ -93,25 +85,5 @@ export function generateSeedTypes(seeds, options = {}) {
93
85
  (registryProps ? registryProps + '\n' : '') +
94
86
  `}\n\n` +
95
87
  `export type SeedRegistryTypes = BeechDatabase\n`;
96
- return `${HEADER}\n${fingerprintBlock(options.fingerprint)}${interfaces}\n${databaseRegistry}`;
97
- }
98
- /**
99
- * Emits the fingerprint constant, or nothing.
100
- *
101
- * The value is interpolated into source, so its shape is verified first: a fingerprint carrying a
102
- * quote or a newline would emit a file that does not parse, and the failure would surface in the
103
- * consumer's build rather than here.
104
- */
105
- function fingerprintBlock(fingerprint) {
106
- if (fingerprint === undefined)
107
- return '';
108
- if (!FINGERPRINT_RE.test(fingerprint)) {
109
- throw new Error(`Refusing to embed '${fingerprint}' as a schema fingerprint: expected the v{n}:{32 hex} form produced by computeSchemaFingerprint().`);
110
- }
111
- return (`/**\n` +
112
- ` * Schema revision these types were generated from. \`@beechcms/client\` compares it against the\n` +
113
- ` * \`X-Schema-Revision\` response header; a mismatch means the backend schema moved and this file\n` +
114
- ` * must be regenerated with \`beech types generate\`.\n` +
115
- ` */\n` +
116
- `export const SCHEMA_FINGERPRINT = '${fingerprint}'\n\n`);
88
+ return `${HEADER}\n${interfaces}\n${databaseRegistry}`;
117
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"seed-validation.d.ts","sourceRoot":"","sources":["../../src/engine/seed-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAQtC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAyB,CAAA;AAErD;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAAiB,CAAA;AAC1C,eAAO,MAAM,OAAO,QAAe,CAAA;AAGnC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,mBAAmB,EAAE,CA6T5E;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAErD"}
1
+ {"version":3,"file":"seed-validation.d.ts","sourceRoot":"","sources":["../../src/engine/seed-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAQtC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAyB,CAAA;AAErD;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAAiB,CAAA;AAC1C,eAAO,MAAM,OAAO,QAAe,CAAA;AAGnC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,mBAAmB,EAAE,CAkT5E;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAErD"}
@@ -311,16 +311,6 @@ export function validateSeedDefinitions(seeds) {
311
311
  });
312
312
  }
313
313
  }
314
- // ── Fatal 16: softDelete type validation ────────────────────────────────────
315
- for (const seed of seeds) {
316
- if (seed.softDelete !== undefined && typeof seed.softDelete !== 'boolean') {
317
- result.push({
318
- slug: seed.slug,
319
- messages: [`softDelete must be a boolean (got ${typeof seed.softDelete}).`],
320
- fatal: true,
321
- });
322
- }
323
- }
324
314
  return result;
325
315
  }
326
316
  /** Convenience: true iff no fatal issues. */
@@ -10,7 +10,7 @@ export type SeedDefinitionLike = Omit<Seed, 'branches' | 'layout'> & {
10
10
  layout?: unknown;
11
11
  };
12
12
  /** Seed-level flags the engine treats as `false` when omitted. */
13
- export declare const SEED_DEFINITION_FLAGS: readonly ["allowDrafts", "allowPublicRead", "allowPublicPost", "allowPublicEdit", "softDelete"];
13
+ export declare const SEED_DEFINITION_FLAGS: readonly ["allowDrafts", "allowPublicRead", "allowPublicPost", "allowPublicEdit"];
14
14
  /** Branch-level flags the engine treats as `false` when omitted. `multiple` is resolved separately (see normalizeBranchDefinition). */
15
15
  export declare const BRANCH_DEFINITION_FLAGS: readonly ["requiredOnCreate", "requiredOnUpdate"];
16
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"seed-definition-diff.d.ts","sourceRoot":"","sources":["../../../src/engine/seeds/seed-definition-diff.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAI/C,yHAAyH;AACzH,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAAA;AAEnH,0GAA0G;AAC1G,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC,GAAG;IAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAE3H,kEAAkE;AAClE,eAAO,MAAM,qBAAqB,iGAAkG,CAAA;AAEpI,uIAAuI;AACvI,eAAO,MAAM,uBAAuB,mDAAoD,CAAA;AAExF;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO/F;AAED,0HAA0H;AAC1H,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzF;AAED,MAAM,WAAW,kBAAkB;IACjC,uHAAuH;IACvH,OAAO,EAAE,OAAO,CAAA;IAChB;;;OAGG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,8HAA8H;AAC9H,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,kBAAkB,CAe3F"}
1
+ {"version":3,"file":"seed-definition-diff.d.ts","sourceRoot":"","sources":["../../../src/engine/seeds/seed-definition-diff.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAI/C,yHAAyH;AACzH,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAAA;AAEnH,0GAA0G;AAC1G,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC,GAAG;IAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAE3H,kEAAkE;AAClE,eAAO,MAAM,qBAAqB,mFAAoF,CAAA;AAEtH,uIAAuI;AACvI,eAAO,MAAM,uBAAuB,mDAAoD,CAAA;AAExF;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO/F;AAED,0HAA0H;AAC1H,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzF;AAED,MAAM,WAAW,kBAAkB;IACjC,uHAAuH;IACvH,OAAO,EAAE,OAAO,CAAA;IAChB;;;OAGG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,8HAA8H;AAC9H,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,kBAAkB,CAe3F"}
@@ -3,7 +3,7 @@
3
3
  import { canonicalStringify } from '../../common/canonical-json.js';
4
4
  import { isSingleChoiceTags } from './tag-options.js';
5
5
  /** Seed-level flags the engine treats as `false` when omitted. */
6
- export const SEED_DEFINITION_FLAGS = ['allowDrafts', 'allowPublicRead', 'allowPublicPost', 'allowPublicEdit', 'softDelete'];
6
+ export const SEED_DEFINITION_FLAGS = ['allowDrafts', 'allowPublicRead', 'allowPublicPost', 'allowPublicEdit'];
7
7
  /** Branch-level flags the engine treats as `false` when omitted. `multiple` is resolved separately (see normalizeBranchDefinition). */
8
8
  export const BRANCH_DEFINITION_FLAGS = ['requiredOnCreate', 'requiredOnUpdate'];
9
9
  /**
@@ -26,7 +26,7 @@ export function normalizeBranchDefinition(branch) {
26
26
  }
27
27
  /** Comparable form of one seed definition (branches normalized, order kept). `layout` is server-populated and dropped. */
28
28
  export function normalizeSeedDefinition(seed) {
29
- const { layout: _layout, branches, ...rest } = seed;
29
+ const { layout: _layout, softDelete: _deprecated, branches, ...rest } = seed;
30
30
  const normalized = { ...rest };
31
31
  for (const flag of SEED_DEFINITION_FLAGS)
32
32
  normalized[flag] = seed[flag] === true;
@@ -1 +1 @@
1
- {"version":3,"file":"seed-validation.d.ts","sourceRoot":"","sources":["../../../src/engine/seeds/seed-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAWvC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAyB,CAAA;AAErD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CActE;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAAiB,CAAA;AAC1C,eAAO,MAAM,OAAO,QAAe,CAAA;AAGnC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,mBAAmB,EAAE,CA2V5E;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAErD"}
1
+ {"version":3,"file":"seed-validation.d.ts","sourceRoot":"","sources":["../../../src/engine/seeds/seed-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAYvC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAyB,CAAA;AAErD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CActE;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAAiB,CAAA;AAC1C,eAAO,MAAM,OAAO,QAAe,CAAA;AAGnC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,mBAAmB,EAAE,CAgV5E;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAErD"}
@@ -1,5 +1,6 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
  // Copyright (c) 2024–2026 Flavio De Musso
3
+ import { isValidRetentionDays, MAX_RETENTION_DAYS } from '../../content/retention.js';
3
4
  import { AUTOMATION_RESERVED_WORDS } from '../../automations/automations-grammar-words.js';
4
5
  import { SYSTEM_COLUMNS } from '../ddl/ddl.js';
5
6
  import { LOCALIZABLE_BRANCH_TYPES } from '../localization/localization.js';
@@ -293,11 +294,11 @@ export function validateSeedDefinitions(seeds) {
293
294
  }
294
295
  // ── Fatal 13: retentionDays validation ─────────────────────────────────────
295
296
  for (const seed of seeds) {
296
- if (seed.retentionDays !== undefined && (!Number.isInteger(seed.retentionDays) || seed.retentionDays <= 0)) {
297
+ if (seed.retentionDays !== undefined && !isValidRetentionDays(seed.retentionDays)) {
297
298
  result.push({
298
299
  slug: seed.slug,
299
300
  messages: [
300
- `retentionDays must be a positive integer >= 1 (got ${seed.retentionDays}).`,
301
+ `retentionDays must be an integer between 0 and ${MAX_RETENTION_DAYS} (0 = never purge; got ${seed.retentionDays}).`,
301
302
  ],
302
303
  fatal: true,
303
304
  });
@@ -327,16 +328,6 @@ export function validateSeedDefinitions(seeds) {
327
328
  });
328
329
  }
329
330
  }
330
- // ── Fatal 16: softDelete type validation ────────────────────────────────────
331
- for (const seed of seeds) {
332
- if (seed.softDelete !== undefined && typeof seed.softDelete !== 'boolean') {
333
- result.push({
334
- slug: seed.slug,
335
- messages: [`softDelete must be a boolean (got ${typeof seed.softDelete}).`],
336
- fatal: true,
337
- });
338
- }
339
- }
340
331
  // ── Fatal 17: field-level localization constraints ─────────────────────────
341
332
  // A localized value is a readable locale dictionary. Encrypted or hashed storage turns it into an
342
333
  // opaque blob: per-locale extraction would be meaningless and would break decryption. Repeater
@@ -237,10 +237,10 @@ export interface Seed {
237
237
  */
238
238
  allowDrafts?: boolean;
239
239
  /**
240
- * Enables the Trash for this content type. When true, `content_{slug}` carries a
241
- * `deleted_at INTEGER NULL` column, `DELETE` becomes a reversible soft delete, and every
242
- * read excludes trashed rows unless the caller opts in via `SelectOptions.trashed`.
243
- * Default: false.
240
+ * @deprecated Ignored. Every seed has a Trash: `content_{slug}` always carries `deleted_at`,
241
+ * `DELETE` is always a reversible soft delete, and every read excludes trashed rows unless
242
+ * the caller opts in via `SelectOptions.trashed`. Kept only so existing seed definitions
243
+ * still type-check.
244
244
  */
245
245
  softDelete?: boolean;
246
246
  /**
@@ -249,8 +249,9 @@ export interface Seed {
249
249
  */
250
250
  displayNameAlias: string;
251
251
  /**
252
- * Number of days to retain entries before automatic cleanup or anonymization (GDPR compliance).
253
- * Must be a positive integer (>= 1) when specified.
252
+ * Days a trashed entry is kept before the retention sweep purges it.
253
+ * Overrides the global `trashRetentionDays` site setting; `0` means never purge.
254
+ * Absent means use the global value. Integer `0..36500`.
254
255
  */
255
256
  retentionDays?: number;
256
257
  /** List of fields (Branch). */
@@ -286,7 +287,6 @@ export interface FilterGroup {
286
287
  * - 'active' (default) — only rows with `deleted_at IS NULL`
287
288
  * - 'trashed' — only rows with `deleted_at IS NOT NULL` (the Trash view)
288
289
  * - 'any' — no predicate (restore/purge lookups, reconciliation)
289
- * Ignored entirely for seeds without `softDelete: true`.
290
290
  */
291
291
  export type TrashedMode = 'active' | 'trashed' | 'any';
292
292
  /** The language a read resolves localized branches to (consumed by `buildSelectQuery`). */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Botanical Engine: Schema Compiler + Query Builder.
3
+ *
4
+ * In v0.4.0 each Seed has a dedicated SQL table (`content_{slug}`) with
5
+ * real typed columns. This module generates the DDL and builds parameterized queries.
6
+ * It does not know about HTTP, auth, or UI — it's a pure TypeScript library.
7
+ */
8
+ import type { Seed, Branch, SelectOptions, ParameterizedQuery } from './types.js';
9
+ export declare function indexableSearchBranches(seed: Seed): Branch[];
10
+ /**
11
+ * Generates `CREATE TABLE IF NOT EXISTS content_{slug}` with system columns
12
+ * + one column per Branch. Pure function: same Seed → same SQL.
13
+ */
14
+ export declare function generateCreateTable(seed: Seed): string;
15
+ /**
16
+ * Generates the drafts table `content_{slug}_drafts` for Seeds with `allowDrafts: true`.
17
+ * All branch columns are nullable (drafts are partial).
18
+ * Returns null if the Seed does not have `allowDrafts: true`.
19
+ */
20
+ export declare function generateDraftTable(seed: Seed): string | null;
21
+ /**
22
+ * Generates `ALTER TABLE content_{slug} ADD COLUMN {alias} {type}`.
23
+ * New columns are always nullable (SQLite limit on ALTER TABLE).
24
+ */
25
+ export declare function generateAddColumn(seed: Seed, branch: Branch): string;
26
+ /**
27
+ * Generates B-tree indexes for status, created_at and every filterable Branch
28
+ * with an indexable type (text, number, date, boolean).
29
+ */
30
+ export declare function generateIndexes(seed: Seed): string[];
31
+ /**
32
+ * Generates the FTS5 virtual table for indexable text/richtext Branches.
33
+ * Returns null if the Seed has no branches with search enabled.
34
+ */
35
+ export declare function generateFtsTable(seed: Seed): string | null;
36
+ /**
37
+ * Generates the 3 SQLite triggers (insert/update/delete) that keep the FTS
38
+ * automatically synchronized — eliminates the need for manual syncFts.
39
+ * Returns an empty array if the Seed has no indexable branches.
40
+ */
41
+ export declare function generateFtsTriggers(seed: Seed): string[];
42
+ /**
43
+ * Builds a parameterized SELECT on `content_{slug}`.
44
+ * Never uses json_extract — every column is a real column.
45
+ * Unknown columns in filters/orderBy are ignored (fail-closed).
46
+ */
47
+ export declare function buildSelectQuery(seed: Seed, options?: SelectOptions): ParameterizedQuery;
48
+ export interface SchemaColumn {
49
+ name: string;
50
+ sqlType: 'TEXT' | 'REAL' | 'INTEGER';
51
+ notNull: boolean;
52
+ isPk: boolean;
53
+ }
54
+ /**
55
+ * Returns the list of expected columns for a Seed's table.
56
+ * Used by `beech seed:load --diff` to compare current vs expected schema.
57
+ */
58
+ export declare function getExpectedColumns(seed: Seed): SchemaColumn[];
59
+ /**
60
+ * Serializes a value for writing to the DB.
61
+ * boolean → 0/1 | date → Unix timestamp | json/asset-list → JSON string
62
+ */
63
+ export declare function serializeForDb(branch: Branch, value: unknown): string | number | null;
64
+ /**
65
+ * Returns the junction table name for a many-to-many relation branch.
66
+ * Format: `rel_<seedSlug>_<branchAlias>`.
67
+ */
68
+ export declare function junctionTableName(seedSlug: string, branchAlias: string): string;
69
+ /**
70
+ * Generates `CREATE TABLE IF NOT EXISTS rel_<seed>_<alias>` for a multi-relation
71
+ * branch. The parent FK always cascades (parent lifecycle owns the edge);
72
+ * the target FK uses `branch.onDelete` (default CASCADE).
73
+ *
74
+ * @throws {Error} when called on a non-multi-relation branch
75
+ * @throws {Error} when `branch.targetSeed` is missing
76
+ */
77
+ export declare function generateJunctionTable(seed: Seed, branch: Branch): string;
78
+ /**
79
+ * Generates the two B-tree indexes for a junction table:
80
+ * one on `parent_id` (list entries by parent) and one on `target_id`
81
+ * (cascade checks from target side).
82
+ */
83
+ export declare function generateJunctionIndexes(seed: Seed, branch: Branch): string[];
84
+ /**
85
+ * Generates the drafts junction table `rel_<seed>_<alias>_drafts` for a
86
+ * many-to-many relation branch. Note: no FK on `target_id` — targets may be
87
+ * deleted between draft save and publish; the FK would be wrong here.
88
+ * Returns null when `seed.allowDrafts` is falsy.
89
+ */
90
+ export declare function generateJunctionDraftTable(seed: Seed, branch: Branch): string | null;
91
+ /**
92
+ * Returns every `DROP TABLE IF EXISTS` needed to fully remove a content type:
93
+ * the main `content_{slug}` table, its `fts_{slug}` virtual table, the
94
+ * `content_{slug}_drafts` mirror (when drafts are enabled), and each
95
+ * multi-relation junction table `rel_{slug}_{alias}` (+ its `_drafts` mirror).
96
+ *
97
+ * FTS triggers reference the main table; dropping the main table also drops
98
+ * its triggers in SQLite, but we drop the FTS table explicitly so no orphaned
99
+ * virtual table survives. Order: junction (children) → drafts → fts → main.
100
+ */
101
+ export declare function generateDropTable(seed: Seed): string[];
102
+ /**
103
+ * Returns the `DROP COLUMN` statements for removing a single field.
104
+ *
105
+ * - For a multi-relation branch (no column on the parent table) it drops the
106
+ * junction table `rel_{slug}_{alias}` (+ `_drafts`) instead.
107
+ * - For a normal branch it drops the column from `content_{slug}` and, when
108
+ * drafts are enabled, the mirror column from `content_{slug}_drafts`.
109
+ * - For an orphan column (no matching branch in the definition) it falls back
110
+ * to a plain `ALTER TABLE … DROP COLUMN`, never touching drafts.
111
+ *
112
+ * Callers must rebuild FTS separately (planFtsRebuild) when the dropped column
113
+ * was searchable, since SQLite cannot ALTER an fts5 table's columns.
114
+ */
115
+ export declare function generateDropColumn(seed: Seed, alias: string): string[];
116
+ /**
117
+ * Returns the `RENAME COLUMN` statements for renaming a field's alias while
118
+ * keeping the stable `branch.id`. Renames the column on `content_{slug}` and,
119
+ * when drafts are enabled, the mirror column on `content_{slug}_drafts`.
120
+ *
121
+ * For a multi-relation branch the alias is part of the junction table name, so
122
+ * the junction table (+ `_drafts`) is renamed instead of a column.
123
+ *
124
+ * Callers must rebuild FTS separately (planFtsRebuild) when the renamed column
125
+ * was searchable.
126
+ */
127
+ export declare function generateRenameColumn(seed: Seed, from: string, to: string): string[];
128
+ /**
129
+ * Returns the add/copy/drop/rename statements that change a column's SQL type
130
+ * in place, preserving data via `CAST`. This is the documented simpler
131
+ * alternative to SQLite's full 12-step table rebuild.
132
+ *
133
+ * The `branch` passed in is the *target* definition (already carrying the new
134
+ * `type`); its SQL type is read from BRANCH_TYPE_SQL. Multi-relation branches
135
+ * have no column to retype and are rejected. Mirrors the change onto the drafts
136
+ * table when drafts are enabled. Callers rebuild FTS separately when needed.
137
+ */
138
+ export declare function generateRetypeColumn(seed: Seed, branch: Branch): string[];
139
+ /**
140
+ * Deserializes a value read from the DB for the API response.
141
+ * 0/1 → boolean | Unix timestamp → ISO 8601 | JSON string → object
142
+ */
143
+ export declare function deserializeFromDb(branch: Branch, value: unknown): unknown;
144
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,OAAO,KAAK,EACV,IAAI,EACJ,MAAM,EAKN,aAAa,EACb,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAsCnB,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAI5D;AAkED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CA0BtD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAyB5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAuBpD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAc1D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAgCxD;AAID;;;;GAIG;AAGH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,aAAkB,GAAG,kBAAkB,CAsF5F;AAgHD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;CACd;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,YAAY,EAAE,CAiB7D;AAID;;;GAGG;AAEH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAwCrF;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBxE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAM5E;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAapF;AAcD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CA0BtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnF;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBzE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAqCzE"}