@elytracms/core 0.0.6

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 (521) hide show
  1. package/LICENSE +21 -0
  2. package/dist/clipboard/build.d.ts +77 -0
  3. package/dist/clipboard/build.js +128 -0
  4. package/dist/clipboard/build.js.map +1 -0
  5. package/dist/clipboard/clipboard.d.ts +33 -0
  6. package/dist/clipboard/clipboard.js +45 -0
  7. package/dist/clipboard/clipboard.js.map +1 -0
  8. package/dist/clipboard/fragment.d.ts +112 -0
  9. package/dist/clipboard/fragment.js +79 -0
  10. package/dist/clipboard/fragment.js.map +1 -0
  11. package/dist/clipboard/html.d.ts +26 -0
  12. package/dist/clipboard/html.js +82 -0
  13. package/dist/clipboard/html.js.map +1 -0
  14. package/dist/clipboard/index.d.ts +15 -0
  15. package/dist/clipboard/index.js +16 -0
  16. package/dist/clipboard/index.js.map +1 -0
  17. package/dist/clipboard/references.d.ts +50 -0
  18. package/dist/clipboard/references.js +0 -0
  19. package/dist/clipboard/references.js.map +1 -0
  20. package/dist/clipboard/serialize.d.ts +69 -0
  21. package/dist/clipboard/serialize.js +130 -0
  22. package/dist/clipboard/serialize.js.map +1 -0
  23. package/dist/cms-core/collections.d.ts +82 -0
  24. package/dist/cms-core/collections.js +187 -0
  25. package/dist/cms-core/collections.js.map +1 -0
  26. package/dist/cms-core/documents.d.ts +71 -0
  27. package/dist/cms-core/documents.js +67 -0
  28. package/dist/cms-core/documents.js.map +1 -0
  29. package/dist/cms-core/envelopes.d.ts +80 -0
  30. package/dist/cms-core/envelopes.js +124 -0
  31. package/dist/cms-core/envelopes.js.map +1 -0
  32. package/dist/cms-core/fields.d.ts +220 -0
  33. package/dist/cms-core/fields.js +250 -0
  34. package/dist/cms-core/fields.js.map +1 -0
  35. package/dist/cms-core/fixtures.d.ts +92 -0
  36. package/dist/cms-core/fixtures.js +357 -0
  37. package/dist/cms-core/fixtures.js.map +1 -0
  38. package/dist/cms-core/hierarchy.d.ts +113 -0
  39. package/dist/cms-core/hierarchy.js +223 -0
  40. package/dist/cms-core/hierarchy.js.map +1 -0
  41. package/dist/cms-core/index.d.ts +25 -0
  42. package/dist/cms-core/index.js +26 -0
  43. package/dist/cms-core/index.js.map +1 -0
  44. package/dist/cms-core/infer.d.ts +103 -0
  45. package/dist/cms-core/infer.js +57 -0
  46. package/dist/cms-core/infer.js.map +1 -0
  47. package/dist/cms-core/issues.d.ts +92 -0
  48. package/dist/cms-core/issues.js +74 -0
  49. package/dist/cms-core/issues.js.map +1 -0
  50. package/dist/cms-core/json-schema.d.ts +25 -0
  51. package/dist/cms-core/json-schema.js +110 -0
  52. package/dist/cms-core/json-schema.js.map +1 -0
  53. package/dist/cms-core/localization.d.ts +51 -0
  54. package/dist/cms-core/localization.js +89 -0
  55. package/dist/cms-core/localization.js.map +1 -0
  56. package/dist/cms-core/routes.d.ts +76 -0
  57. package/dist/cms-core/routes.js +220 -0
  58. package/dist/cms-core/routes.js.map +1 -0
  59. package/dist/cms-core/self-type.d.ts +41 -0
  60. package/dist/cms-core/self-type.js +191 -0
  61. package/dist/cms-core/self-type.js.map +1 -0
  62. package/dist/cms-core/url-for-document.d.ts +39 -0
  63. package/dist/cms-core/url-for-document.js +138 -0
  64. package/dist/cms-core/url-for-document.js.map +1 -0
  65. package/dist/cms-core/validate-document.d.ts +121 -0
  66. package/dist/cms-core/validate-document.js +871 -0
  67. package/dist/cms-core/validate-document.js.map +1 -0
  68. package/dist/cms-core/versions.d.ts +75 -0
  69. package/dist/cms-core/versions.js +97 -0
  70. package/dist/cms-core/versions.js.map +1 -0
  71. package/dist/collaboration/approval.d.ts +68 -0
  72. package/dist/collaboration/approval.js +104 -0
  73. package/dist/collaboration/approval.js.map +1 -0
  74. package/dist/collaboration/collaboration.d.ts +49 -0
  75. package/dist/collaboration/collaboration.js +56 -0
  76. package/dist/collaboration/collaboration.js.map +1 -0
  77. package/dist/collaboration/comments.d.ts +72 -0
  78. package/dist/collaboration/comments.js +118 -0
  79. package/dist/collaboration/comments.js.map +1 -0
  80. package/dist/collaboration/core.d.ts +25 -0
  81. package/dist/collaboration/core.js +26 -0
  82. package/dist/collaboration/core.js.map +1 -0
  83. package/dist/collaboration/index.d.ts +14 -0
  84. package/dist/collaboration/index.js +15 -0
  85. package/dist/collaboration/index.js.map +1 -0
  86. package/dist/collaboration/presence.d.ts +62 -0
  87. package/dist/collaboration/presence.js +85 -0
  88. package/dist/collaboration/presence.js.map +1 -0
  89. package/dist/collaboration/publishing.d.ts +60 -0
  90. package/dist/collaboration/publishing.js +93 -0
  91. package/dist/collaboration/publishing.js.map +1 -0
  92. package/dist/collaboration/versions.d.ts +52 -0
  93. package/dist/collaboration/versions.js +81 -0
  94. package/dist/collaboration/versions.js.map +1 -0
  95. package/dist/component-registry/index.d.ts +3 -0
  96. package/dist/component-registry/index.js +4 -0
  97. package/dist/component-registry/index.js.map +1 -0
  98. package/dist/component-registry/issues.d.ts +6 -0
  99. package/dist/component-registry/issues.js +2 -0
  100. package/dist/component-registry/issues.js.map +1 -0
  101. package/dist/component-registry/manifest.d.ts +164 -0
  102. package/dist/component-registry/manifest.js +129 -0
  103. package/dist/component-registry/manifest.js.map +1 -0
  104. package/dist/component-registry/registry.d.ts +33 -0
  105. package/dist/component-registry/registry.js +90 -0
  106. package/dist/component-registry/registry.js.map +1 -0
  107. package/dist/content/__fixtures__/filterable-collections.d.ts +14 -0
  108. package/dist/content/__fixtures__/filterable-collections.js +15 -0
  109. package/dist/content/__fixtures__/filterable-collections.js.map +1 -0
  110. package/dist/content/__fixtures__/sample-accessor-types.d.ts +56 -0
  111. package/dist/content/__fixtures__/sample-accessor-types.js +5 -0
  112. package/dist/content/__fixtures__/sample-accessor-types.js.map +1 -0
  113. package/dist/content/__fixtures__/sample-delivery-types.d.ts +122 -0
  114. package/dist/content/__fixtures__/sample-delivery-types.js +5 -0
  115. package/dist/content/__fixtures__/sample-delivery-types.js.map +1 -0
  116. package/dist/content/assets.d.ts +53 -0
  117. package/dist/content/assets.js +38 -0
  118. package/dist/content/assets.js.map +1 -0
  119. package/dist/content/binding-sources.d.ts +53 -0
  120. package/dist/content/binding-sources.js +73 -0
  121. package/dist/content/binding-sources.js.map +1 -0
  122. package/dist/content/client.d.ts +90 -0
  123. package/dist/content/client.js +383 -0
  124. package/dist/content/client.js.map +1 -0
  125. package/dist/content/codegen.d.ts +54 -0
  126. package/dist/content/codegen.js +305 -0
  127. package/dist/content/codegen.js.map +1 -0
  128. package/dist/content/context.d.ts +38 -0
  129. package/dist/content/context.js +21 -0
  130. package/dist/content/context.js.map +1 -0
  131. package/dist/content/cursor.d.ts +33 -0
  132. package/dist/content/cursor.js +104 -0
  133. package/dist/content/cursor.js.map +1 -0
  134. package/dist/content/index.d.ts +28 -0
  135. package/dist/content/index.js +29 -0
  136. package/dist/content/index.js.map +1 -0
  137. package/dist/content/locale.d.ts +30 -0
  138. package/dist/content/locale.js +26 -0
  139. package/dist/content/locale.js.map +1 -0
  140. package/dist/content/perspective.d.ts +29 -0
  141. package/dist/content/perspective.js +31 -0
  142. package/dist/content/perspective.js.map +1 -0
  143. package/dist/content/populate.d.ts +25 -0
  144. package/dist/content/populate.js +22 -0
  145. package/dist/content/populate.js.map +1 -0
  146. package/dist/content/query.d.ts +122 -0
  147. package/dist/content/query.js +257 -0
  148. package/dist/content/query.js.map +1 -0
  149. package/dist/content/raw.d.ts +13 -0
  150. package/dist/content/raw.js +14 -0
  151. package/dist/content/raw.js.map +1 -0
  152. package/dist/content/resolve.d.ts +97 -0
  153. package/dist/content/resolve.js +261 -0
  154. package/dist/content/resolve.js.map +1 -0
  155. package/dist/content/serialize.d.ts +30 -0
  156. package/dist/content/serialize.js +57 -0
  157. package/dist/content/serialize.js.map +1 -0
  158. package/dist/content/tags.d.ts +54 -0
  159. package/dist/content/tags.js +40 -0
  160. package/dist/content/tags.js.map +1 -0
  161. package/dist/data-binding/fixtures.d.ts +20 -0
  162. package/dist/data-binding/fixtures.js +47 -0
  163. package/dist/data-binding/fixtures.js.map +1 -0
  164. package/dist/data-binding/index.d.ts +14 -0
  165. package/dist/data-binding/index.js +15 -0
  166. package/dist/data-binding/index.js.map +1 -0
  167. package/dist/data-binding/issues.d.ts +45 -0
  168. package/dist/data-binding/issues.js +46 -0
  169. package/dist/data-binding/issues.js.map +1 -0
  170. package/dist/data-binding/resolve.d.ts +87 -0
  171. package/dist/data-binding/resolve.js +204 -0
  172. package/dist/data-binding/resolve.js.map +1 -0
  173. package/dist/data-binding/sample.d.ts +21 -0
  174. package/dist/data-binding/sample.js +23 -0
  175. package/dist/data-binding/sample.js.map +1 -0
  176. package/dist/data-binding/sources.d.ts +225 -0
  177. package/dist/data-binding/sources.js +154 -0
  178. package/dist/data-binding/sources.js.map +1 -0
  179. package/dist/data-binding/tokens.d.ts +62 -0
  180. package/dist/data-binding/tokens.js +150 -0
  181. package/dist/data-binding/tokens.js.map +1 -0
  182. package/dist/design-tokens/css.d.ts +34 -0
  183. package/dist/design-tokens/css.js +51 -0
  184. package/dist/design-tokens/css.js.map +1 -0
  185. package/dist/design-tokens/index.d.ts +10 -0
  186. package/dist/design-tokens/index.js +11 -0
  187. package/dist/design-tokens/index.js.map +1 -0
  188. package/dist/design-tokens/style-guide.d.ts +30 -0
  189. package/dist/design-tokens/style-guide.js +31 -0
  190. package/dist/design-tokens/style-guide.js.map +1 -0
  191. package/dist/design-tokens/tokens.d.ts +89 -0
  192. package/dist/design-tokens/tokens.js +112 -0
  193. package/dist/design-tokens/tokens.js.map +1 -0
  194. package/dist/export-sync/builder-source.d.ts +85 -0
  195. package/dist/export-sync/builder-source.js +124 -0
  196. package/dist/export-sync/builder-source.js.map +1 -0
  197. package/dist/export-sync/check.d.ts +61 -0
  198. package/dist/export-sync/check.js +126 -0
  199. package/dist/export-sync/check.js.map +1 -0
  200. package/dist/export-sync/cli.d.ts +89 -0
  201. package/dist/export-sync/cli.js +323 -0
  202. package/dist/export-sync/cli.js.map +1 -0
  203. package/dist/export-sync/core.d.ts +58 -0
  204. package/dist/export-sync/core.js +41 -0
  205. package/dist/export-sync/core.js.map +1 -0
  206. package/dist/export-sync/eject.d.ts +28 -0
  207. package/dist/export-sync/eject.js +21 -0
  208. package/dist/export-sync/eject.js.map +1 -0
  209. package/dist/export-sync/fixtures.d.ts +25 -0
  210. package/dist/export-sync/fixtures.js +87 -0
  211. package/dist/export-sync/fixtures.js.map +1 -0
  212. package/dist/export-sync/generate.d.ts +7 -0
  213. package/dist/export-sync/generate.js +505 -0
  214. package/dist/export-sync/generate.js.map +1 -0
  215. package/dist/export-sync/index.d.ts +37 -0
  216. package/dist/export-sync/index.js +39 -0
  217. package/dist/export-sync/index.js.map +1 -0
  218. package/dist/export-sync/init.d.ts +123 -0
  219. package/dist/export-sync/init.js +234 -0
  220. package/dist/export-sync/init.js.map +1 -0
  221. package/dist/export-sync/manifest-host.d.ts +48 -0
  222. package/dist/export-sync/manifest-host.js +73 -0
  223. package/dist/export-sync/manifest-host.js.map +1 -0
  224. package/dist/export-sync/node.d.ts +20 -0
  225. package/dist/export-sync/node.js +101 -0
  226. package/dist/export-sync/node.js.map +1 -0
  227. package/dist/export-sync/push.d.ts +76 -0
  228. package/dist/export-sync/push.js +197 -0
  229. package/dist/export-sync/push.js.map +1 -0
  230. package/dist/export-sync/registry-sync-client.d.ts +59 -0
  231. package/dist/export-sync/registry-sync-client.js +97 -0
  232. package/dist/export-sync/registry-sync-client.js.map +1 -0
  233. package/dist/export-sync/sync.d.ts +47 -0
  234. package/dist/export-sync/sync.js +47 -0
  235. package/dist/export-sync/sync.js.map +1 -0
  236. package/dist/export-sync/typegen.d.ts +40 -0
  237. package/dist/export-sync/typegen.js +45 -0
  238. package/dist/export-sync/typegen.js.map +1 -0
  239. package/dist/export-sync/validate.d.ts +19 -0
  240. package/dist/export-sync/validate.js +102 -0
  241. package/dist/export-sync/validate.js.map +1 -0
  242. package/dist/export-sync/watch.d.ts +66 -0
  243. package/dist/export-sync/watch.js +70 -0
  244. package/dist/export-sync/watch.js.map +1 -0
  245. package/dist/operations/assets.d.ts +198 -0
  246. package/dist/operations/assets.js +75 -0
  247. package/dist/operations/assets.js.map +1 -0
  248. package/dist/operations/authorization.d.ts +49 -0
  249. package/dist/operations/authorization.js +128 -0
  250. package/dist/operations/authorization.js.map +1 -0
  251. package/dist/operations/changesets.d.ts +160 -0
  252. package/dist/operations/changesets.js +442 -0
  253. package/dist/operations/changesets.js.map +1 -0
  254. package/dist/operations/client.d.ts +49 -0
  255. package/dist/operations/client.js +57 -0
  256. package/dist/operations/client.js.map +1 -0
  257. package/dist/operations/core.d.ts +238 -0
  258. package/dist/operations/core.js +269 -0
  259. package/dist/operations/core.js.map +1 -0
  260. package/dist/operations/documents.d.ts +432 -0
  261. package/dist/operations/documents.js +344 -0
  262. package/dist/operations/documents.js.map +1 -0
  263. package/dist/operations/graph.d.ts +138 -0
  264. package/dist/operations/graph.js +78 -0
  265. package/dist/operations/graph.js.map +1 -0
  266. package/dist/operations/index.d.ts +19 -0
  267. package/dist/operations/index.js +20 -0
  268. package/dist/operations/index.js.map +1 -0
  269. package/dist/operations/members.d.ts +87 -0
  270. package/dist/operations/members.js +56 -0
  271. package/dist/operations/members.js.map +1 -0
  272. package/dist/operations/publishing.d.ts +89 -0
  273. package/dist/operations/publishing.js +57 -0
  274. package/dist/operations/publishing.js.map +1 -0
  275. package/dist/operations/references.d.ts +222 -0
  276. package/dist/operations/references.js +177 -0
  277. package/dist/operations/references.js.map +1 -0
  278. package/dist/operations/schema.d.ts +413 -0
  279. package/dist/operations/schema.js +138 -0
  280. package/dist/operations/schema.js.map +1 -0
  281. package/dist/operations/tokens.d.ts +79 -0
  282. package/dist/operations/tokens.js +102 -0
  283. package/dist/operations/tokens.js.map +1 -0
  284. package/dist/persistence/adapter.d.ts +79 -0
  285. package/dist/persistence/adapter.js +55 -0
  286. package/dist/persistence/adapter.js.map +1 -0
  287. package/dist/persistence/assets.d.ts +120 -0
  288. package/dist/persistence/assets.js +141 -0
  289. package/dist/persistence/assets.js.map +1 -0
  290. package/dist/persistence/backend-validation.d.ts +43 -0
  291. package/dist/persistence/backend-validation.js +57 -0
  292. package/dist/persistence/backend-validation.js.map +1 -0
  293. package/dist/persistence/cli-tokens.d.ts +50 -0
  294. package/dist/persistence/cli-tokens.js +66 -0
  295. package/dist/persistence/cli-tokens.js.map +1 -0
  296. package/dist/persistence/cms.d.ts +148 -0
  297. package/dist/persistence/cms.js +232 -0
  298. package/dist/persistence/cms.js.map +1 -0
  299. package/dist/persistence/contract-scenarios.d.ts +73 -0
  300. package/dist/persistence/contract-scenarios.js +496 -0
  301. package/dist/persistence/contract-scenarios.js.map +1 -0
  302. package/dist/persistence/core.d.ts +96 -0
  303. package/dist/persistence/core.js +110 -0
  304. package/dist/persistence/core.js.map +1 -0
  305. package/dist/persistence/graph.d.ts +61 -0
  306. package/dist/persistence/graph.js +98 -0
  307. package/dist/persistence/graph.js.map +1 -0
  308. package/dist/persistence/index.d.ts +22 -0
  309. package/dist/persistence/index.js +23 -0
  310. package/dist/persistence/index.js.map +1 -0
  311. package/dist/persistence/members.d.ts +70 -0
  312. package/dist/persistence/members.js +0 -0
  313. package/dist/persistence/members.js.map +1 -0
  314. package/dist/persistence/publishing.d.ts +59 -0
  315. package/dist/persistence/publishing.js +95 -0
  316. package/dist/persistence/publishing.js.map +1 -0
  317. package/dist/persistence/reference-extraction.d.ts +44 -0
  318. package/dist/persistence/reference-extraction.js +204 -0
  319. package/dist/persistence/reference-extraction.js.map +1 -0
  320. package/dist/persistence/reference-indexing.d.ts +68 -0
  321. package/dist/persistence/reference-indexing.js +112 -0
  322. package/dist/persistence/reference-indexing.js.map +1 -0
  323. package/dist/persistence/references.d.ts +257 -0
  324. package/dist/persistence/references.js +0 -0
  325. package/dist/persistence/references.js.map +1 -0
  326. package/dist/persistence/seed.d.ts +55 -0
  327. package/dist/persistence/seed.js +102 -0
  328. package/dist/persistence/seed.js.map +1 -0
  329. package/dist/persistence/self-maintaining-adapter.d.ts +41 -0
  330. package/dist/persistence/self-maintaining-adapter.js +79 -0
  331. package/dist/persistence/self-maintaining-adapter.js.map +1 -0
  332. package/dist/plugins/asset-storage.d.ts +76 -0
  333. package/dist/plugins/asset-storage.js +104 -0
  334. package/dist/plugins/asset-storage.js.map +1 -0
  335. package/dist/plugins/component-package.d.ts +54 -0
  336. package/dist/plugins/component-package.js +92 -0
  337. package/dist/plugins/component-package.js.map +1 -0
  338. package/dist/plugins/data-sources.d.ts +78 -0
  339. package/dist/plugins/data-sources.js +99 -0
  340. package/dist/plugins/data-sources.js.map +1 -0
  341. package/dist/plugins/examples.d.ts +47 -0
  342. package/dist/plugins/examples.js +205 -0
  343. package/dist/plugins/examples.js.map +1 -0
  344. package/dist/plugins/export-targets.d.ts +47 -0
  345. package/dist/plugins/export-targets.js +78 -0
  346. package/dist/plugins/export-targets.js.map +1 -0
  347. package/dist/plugins/field-types.d.ts +86 -0
  348. package/dist/plugins/field-types.js +93 -0
  349. package/dist/plugins/field-types.js.map +1 -0
  350. package/dist/plugins/hooks.d.ts +60 -0
  351. package/dist/plugins/hooks.js +94 -0
  352. package/dist/plugins/hooks.js.map +1 -0
  353. package/dist/plugins/index.d.ts +27 -0
  354. package/dist/plugins/index.js +28 -0
  355. package/dist/plugins/index.js.map +1 -0
  356. package/dist/plugins/marketplace.d.ts +90 -0
  357. package/dist/plugins/marketplace.js +110 -0
  358. package/dist/plugins/marketplace.js.map +1 -0
  359. package/dist/plugins/plugin.d.ts +107 -0
  360. package/dist/plugins/plugin.js +122 -0
  361. package/dist/plugins/plugin.js.map +1 -0
  362. package/dist/plugins/templates.d.ts +66 -0
  363. package/dist/plugins/templates.js +74 -0
  364. package/dist/plugins/templates.js.map +1 -0
  365. package/dist/project-graph/binding.d.ts +68 -0
  366. package/dist/project-graph/binding.js +39 -0
  367. package/dist/project-graph/binding.js.map +1 -0
  368. package/dist/project-graph/container.d.ts +126 -0
  369. package/dist/project-graph/container.js +221 -0
  370. package/dist/project-graph/container.js.map +1 -0
  371. package/dist/project-graph/edit.d.ts +66 -0
  372. package/dist/project-graph/edit.js +201 -0
  373. package/dist/project-graph/edit.js.map +1 -0
  374. package/dist/project-graph/fixtures.d.ts +51 -0
  375. package/dist/project-graph/fixtures.js +224 -0
  376. package/dist/project-graph/fixtures.js.map +1 -0
  377. package/dist/project-graph/ids.d.ts +17 -0
  378. package/dist/project-graph/ids.js +19 -0
  379. package/dist/project-graph/ids.js.map +1 -0
  380. package/dist/project-graph/index.d.ts +12 -0
  381. package/dist/project-graph/index.js +13 -0
  382. package/dist/project-graph/index.js.map +1 -0
  383. package/dist/project-graph/issues.d.ts +61 -0
  384. package/dist/project-graph/issues.js +44 -0
  385. package/dist/project-graph/issues.js.map +1 -0
  386. package/dist/project-graph/json.d.ts +6 -0
  387. package/dist/project-graph/json.js +10 -0
  388. package/dist/project-graph/json.js.map +1 -0
  389. package/dist/project-graph/node.d.ts +48 -0
  390. package/dist/project-graph/node.js +42 -0
  391. package/dist/project-graph/node.js.map +1 -0
  392. package/dist/project-graph/normalize.d.ts +17 -0
  393. package/dist/project-graph/normalize.js +110 -0
  394. package/dist/project-graph/normalize.js.map +1 -0
  395. package/dist/project-graph/serialize.d.ts +36 -0
  396. package/dist/project-graph/serialize.js +51 -0
  397. package/dist/project-graph/serialize.js.map +1 -0
  398. package/dist/project-graph/structure.d.ts +40 -0
  399. package/dist/project-graph/structure.js +36 -0
  400. package/dist/project-graph/structure.js.map +1 -0
  401. package/dist/project-graph/validate.d.ts +84 -0
  402. package/dist/project-graph/validate.js +158 -0
  403. package/dist/project-graph/validate.js.map +1 -0
  404. package/dist/rich-text/adapter.d.ts +43 -0
  405. package/dist/rich-text/adapter.js +24 -0
  406. package/dist/rich-text/adapter.js.map +1 -0
  407. package/dist/rich-text/dom-editor.d.ts +101 -0
  408. package/dist/rich-text/dom-editor.js +482 -0
  409. package/dist/rich-text/dom-editor.js.map +1 -0
  410. package/dist/rich-text/embed.d.ts +70 -0
  411. package/dist/rich-text/embed.js +70 -0
  412. package/dist/rich-text/embed.js.map +1 -0
  413. package/dist/rich-text/fixtures.d.ts +25 -0
  414. package/dist/rich-text/fixtures.js +115 -0
  415. package/dist/rich-text/fixtures.js.map +1 -0
  416. package/dist/rich-text/html.d.ts +5 -0
  417. package/dist/rich-text/html.js +309 -0
  418. package/dist/rich-text/html.js.map +1 -0
  419. package/dist/rich-text/index.d.ts +19 -0
  420. package/dist/rich-text/index.js +20 -0
  421. package/dist/rich-text/index.js.map +1 -0
  422. package/dist/rich-text/markdown.d.ts +7 -0
  423. package/dist/rich-text/markdown.js +235 -0
  424. package/dist/rich-text/markdown.js.map +1 -0
  425. package/dist/rich-text/portable-text.d.ts +50 -0
  426. package/dist/rich-text/portable-text.js +223 -0
  427. package/dist/rich-text/portable-text.js.map +1 -0
  428. package/dist/rich-text/registry.d.ts +48 -0
  429. package/dist/rich-text/registry.js +16 -0
  430. package/dist/rich-text/registry.js.map +1 -0
  431. package/dist/rich-text/render.d.ts +69 -0
  432. package/dist/rich-text/render.js +205 -0
  433. package/dist/rich-text/render.js.map +1 -0
  434. package/dist/rich-text/schema.d.ts +86 -0
  435. package/dist/rich-text/schema.js +80 -0
  436. package/dist/rich-text/schema.js.map +1 -0
  437. package/dist/rich-text/test-support.d.ts +7 -0
  438. package/dist/rich-text/test-support.js +8 -0
  439. package/dist/rich-text/test-support.js.map +1 -0
  440. package/dist/runtime-renderer/client.d.ts +14 -0
  441. package/dist/runtime-renderer/client.js +15 -0
  442. package/dist/runtime-renderer/client.js.map +1 -0
  443. package/dist/runtime-renderer/condition.d.ts +8 -0
  444. package/dist/runtime-renderer/condition.js +48 -0
  445. package/dist/runtime-renderer/condition.js.map +1 -0
  446. package/dist/runtime-renderer/content-client.d.ts +62 -0
  447. package/dist/runtime-renderer/content-client.js +37 -0
  448. package/dist/runtime-renderer/content-client.js.map +1 -0
  449. package/dist/runtime-renderer/context.d.ts +185 -0
  450. package/dist/runtime-renderer/context.js +7 -0
  451. package/dist/runtime-renderer/context.js.map +1 -0
  452. package/dist/runtime-renderer/fallback.d.ts +39 -0
  453. package/dist/runtime-renderer/fallback.js +45 -0
  454. package/dist/runtime-renderer/fallback.js.map +1 -0
  455. package/dist/runtime-renderer/index.d.ts +13 -0
  456. package/dist/runtime-renderer/index.js +13 -0
  457. package/dist/runtime-renderer/index.js.map +1 -0
  458. package/dist/runtime-renderer/primitives.d.ts +85 -0
  459. package/dist/runtime-renderer/primitives.js +442 -0
  460. package/dist/runtime-renderer/primitives.js.map +1 -0
  461. package/dist/runtime-renderer/render.d.ts +138 -0
  462. package/dist/runtime-renderer/render.js +825 -0
  463. package/dist/runtime-renderer/render.js.map +1 -0
  464. package/dist/runtime-renderer/rich-text.d.ts +26 -0
  465. package/dist/runtime-renderer/rich-text.js +113 -0
  466. package/dist/runtime-renderer/rich-text.js.map +1 -0
  467. package/dist/starter-kits/index.d.ts +13 -0
  468. package/dist/starter-kits/index.js +14 -0
  469. package/dist/starter-kits/index.js.map +1 -0
  470. package/dist/starter-kits/instantiate.d.ts +29 -0
  471. package/dist/starter-kits/instantiate.js +24 -0
  472. package/dist/starter-kits/instantiate.js.map +1 -0
  473. package/dist/starter-kits/kit.d.ts +61 -0
  474. package/dist/starter-kits/kit.js +37 -0
  475. package/dist/starter-kits/kit.js.map +1 -0
  476. package/dist/starter-kits/kits.d.ts +7 -0
  477. package/dist/starter-kits/kits.js +201 -0
  478. package/dist/starter-kits/kits.js.map +1 -0
  479. package/dist/starter-kits/manifests.d.ts +7 -0
  480. package/dist/starter-kits/manifests.js +111 -0
  481. package/dist/starter-kits/manifests.js.map +1 -0
  482. package/dist/starter-kits/upgrade.d.ts +39 -0
  483. package/dist/starter-kits/upgrade.js +54 -0
  484. package/dist/starter-kits/upgrade.js.map +1 -0
  485. package/dist/starter-kits/validate.d.ts +16 -0
  486. package/dist/starter-kits/validate.js +77 -0
  487. package/dist/starter-kits/validate.js.map +1 -0
  488. package/dist/studio-core/context.d.ts +27 -0
  489. package/dist/studio-core/context.js +44 -0
  490. package/dist/studio-core/context.js.map +1 -0
  491. package/dist/studio-core/errors.d.ts +58 -0
  492. package/dist/studio-core/errors.js +74 -0
  493. package/dist/studio-core/errors.js.map +1 -0
  494. package/dist/studio-core/fixtures.d.ts +18 -0
  495. package/dist/studio-core/fixtures.js +83 -0
  496. package/dist/studio-core/fixtures.js.map +1 -0
  497. package/dist/studio-core/ids.d.ts +22 -0
  498. package/dist/studio-core/ids.js +33 -0
  499. package/dist/studio-core/ids.js.map +1 -0
  500. package/dist/studio-core/index.d.ts +11 -0
  501. package/dist/studio-core/index.js +12 -0
  502. package/dist/studio-core/index.js.map +1 -0
  503. package/dist/studio-core/issues.d.ts +50 -0
  504. package/dist/studio-core/issues.js +33 -0
  505. package/dist/studio-core/issues.js.map +1 -0
  506. package/dist/studio-core/metadata.d.ts +109 -0
  507. package/dist/studio-core/metadata.js +74 -0
  508. package/dist/studio-core/metadata.js.map +1 -0
  509. package/dist/studio-core/repository.d.ts +73 -0
  510. package/dist/studio-core/repository.js +202 -0
  511. package/dist/studio-core/repository.js.map +1 -0
  512. package/dist/studio-core/sections.d.ts +73 -0
  513. package/dist/studio-core/sections.js +68 -0
  514. package/dist/studio-core/sections.js.map +1 -0
  515. package/dist/studio-core/validate.d.ts +15 -0
  516. package/dist/studio-core/validate.js +119 -0
  517. package/dist/studio-core/validate.js.map +1 -0
  518. package/dist/studio-core/workspace-config.d.ts +587 -0
  519. package/dist/studio-core/workspace-config.js +434 -0
  520. package/dist/studio-core/workspace-config.js.map +1 -0
  521. package/package.json +104 -0
@@ -0,0 +1,141 @@
1
+ import { z } from 'zod';
2
+ import { RecordNotFoundError, cloneRecord, recordMetaSchema, createSequentialClock, createSequentialIdFactory, } from './core';
3
+ /**
4
+ * Persisted asset metadata (brief §7.4, §8.6, §10). The bytes themselves live in
5
+ * a {@link BlobStorageAdapter}; this record is the queryable metadata that CMS
6
+ * `asset` fields point at by id.
7
+ */
8
+ export const assetRecordSchema = recordMetaSchema.extend({
9
+ id: z.string().min(1),
10
+ projectId: z.string().min(1),
11
+ filename: z.string().min(1),
12
+ contentType: z.string().min(1),
13
+ byteSize: z.number().int().nonnegative(),
14
+ width: z.number().int().positive().optional(),
15
+ height: z.number().int().positive().optional(),
16
+ alt: z.string().optional(),
17
+ /** Editable display title (EC-152 asset library metadata). */
18
+ title: z.string().optional(),
19
+ /** Opaque key into the blob storage adapter. */
20
+ storageKey: z.string().min(1),
21
+ /**
22
+ * Stable, resolvable serve URL for the stored bytes (EC-151). Delivery-shape
23
+ * asset resolution reads this straight off the metadata record; optional
24
+ * because records created before byte storage existed have no URL yet.
25
+ */
26
+ url: z.string().min(1).optional(),
27
+ /**
28
+ * Image focal point (EC-230): a normalized hotspot `{ x, y }` in 0–1. Threaded
29
+ * to the rendered image's CSS `object-position` so art-directed / cover crops
30
+ * keep the subject in frame. Optional — most assets have none; a migration
31
+ * importer populates it from a source hotspot (e.g. Sanity's `hotspot`).
32
+ */
33
+ focalPoint: z.object({ x: z.number().min(0).max(1), y: z.number().min(0).max(1) }).optional(),
34
+ });
35
+ export class InMemoryBlobStorage {
36
+ blobs = new Map();
37
+ /** Deterministic backend-assigned keys (no Date/random). */
38
+ seq = 0;
39
+ async put(key, data) {
40
+ this.blobs.set(key, data);
41
+ }
42
+ async get(key) {
43
+ return this.blobs.get(key);
44
+ }
45
+ url(key) {
46
+ return `memory://blobs/${key}`;
47
+ }
48
+ async has(key) {
49
+ return this.blobs.has(key);
50
+ }
51
+ async delete(key) {
52
+ this.blobs.delete(key);
53
+ }
54
+ async store(data) {
55
+ this.seq += 1;
56
+ const key = `blob-${this.seq}`;
57
+ this.blobs.set(key, data);
58
+ return key;
59
+ }
60
+ async resolveUrl(key) {
61
+ return this.blobs.has(key) ? this.url(key) : undefined;
62
+ }
63
+ }
64
+ export class InMemoryAssetRepository {
65
+ /** projectId → (assetId → record). */
66
+ byProject = new Map();
67
+ clock;
68
+ nextId;
69
+ constructor(options = {}) {
70
+ this.clock = options.clock ?? createSequentialClock();
71
+ this.nextId = options.idFactory ?? createSequentialIdFactory('asset');
72
+ for (const record of options.seed ?? []) {
73
+ const parsed = assetRecordSchema.parse(record);
74
+ this.projectMap(parsed.projectId).set(parsed.id, parsed);
75
+ }
76
+ }
77
+ projectMap(projectId) {
78
+ const existing = this.byProject.get(projectId);
79
+ if (existing)
80
+ return existing;
81
+ const created = new Map();
82
+ this.byProject.set(projectId, created);
83
+ return created;
84
+ }
85
+ async upsertAsset(projectId, input) {
86
+ const map = this.projectMap(projectId);
87
+ const id = input.id ?? this.nextId();
88
+ const now = this.clock();
89
+ const previous = map.get(id);
90
+ const record = assetRecordSchema.parse({
91
+ id,
92
+ projectId,
93
+ filename: input.filename,
94
+ contentType: input.contentType,
95
+ byteSize: input.byteSize,
96
+ ...(input.width !== undefined ? { width: input.width } : {}),
97
+ ...(input.height !== undefined ? { height: input.height } : {}),
98
+ ...(input.alt !== undefined ? { alt: input.alt } : {}),
99
+ ...(input.title !== undefined ? { title: input.title } : {}),
100
+ ...(input.url !== undefined ? { url: input.url } : {}),
101
+ ...(input.focalPoint !== undefined ? { focalPoint: input.focalPoint } : {}),
102
+ storageKey: input.storageKey ?? `${projectId}/${id}`,
103
+ createdAt: previous?.createdAt ?? now,
104
+ updatedAt: now,
105
+ });
106
+ map.set(id, record);
107
+ return cloneRecord(record);
108
+ }
109
+ async getAsset(projectId, id) {
110
+ const record = this.byProject.get(projectId)?.get(id);
111
+ if (!record)
112
+ throw new RecordNotFoundError('asset', `${projectId}/${id}`);
113
+ return cloneRecord(record);
114
+ }
115
+ async findAsset(projectId, id) {
116
+ const record = this.byProject.get(projectId)?.get(id);
117
+ return record ? cloneRecord(record) : undefined;
118
+ }
119
+ async listAssets(projectId) {
120
+ return [...(this.byProject.get(projectId)?.values() ?? [])]
121
+ .sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
122
+ .map(cloneRecord);
123
+ }
124
+ async removeAsset(projectId, id) {
125
+ const map = this.byProject.get(projectId);
126
+ if (!map?.has(id))
127
+ throw new RecordNotFoundError('asset', `${projectId}/${id}`);
128
+ map.delete(id);
129
+ }
130
+ async resolveMany(projectId, ids) {
131
+ const map = this.byProject.get(projectId);
132
+ const out = new Map();
133
+ for (const id of ids) {
134
+ const record = map?.get(id);
135
+ if (record)
136
+ out.set(id, cloneRecord(record));
137
+ }
138
+ return out;
139
+ }
140
+ }
141
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/persistence/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAGhB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,QAAQ,CAAA;AAEf;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAC;IACvD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,8DAA8D;IAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,gDAAgD;IAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B;;;;OAIG;IACH,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjC;;;;;OAKG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC9F,CAAC,CAAA;AAsDF,MAAM,OAAO,mBAAmB;IACb,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAA;IACtD,4DAA4D;IACpD,GAAG,GAAG,CAAC,CAAA;IAEf,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAgB;QACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC3B,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IACD,GAAG,CAAC,GAAW;QACb,OAAO,kBAAkB,GAAG,EAAE,CAAA;IAChC,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,IAAgB;QAC1B,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;QACb,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAA;QAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACzB,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxD,CAAC;CACF;AAmBD,MAAM,OAAO,uBAAuB;IAClC,sCAAsC;IACrB,SAAS,GAAG,IAAI,GAAG,EAAoC,CAAA;IACvD,KAAK,CAAO;IACZ,MAAM,CAAW;IAElC,YAAY,UAA0C,EAAE;QACtD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,qBAAqB,EAAE,CAAA;QACrD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,IAAI,yBAAyB,CAAC,OAAO,CAAC,CAAA;QACrE,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAC9C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,SAAiB;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAA;QAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAA;QAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QACtC,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,KAAoB;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QACtC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAA;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QACxB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC5B,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC;YACrC,EAAE;YACF,SAAS;YACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,GAAG,SAAS,IAAI,EAAE,EAAE;YACpD,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,SAAS,EAAE,GAAG;SACf,CAAC,CAAA;QACF,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACnB,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,EAAU;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QACrD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,mBAAmB,CAAC,OAAO,EAAE,GAAG,SAAS,IAAI,EAAE,EAAE,CAAC,CAAA;QACzE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,EAAU;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QACrD,OAAO,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACxD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACxD,GAAG,CAAC,WAAW,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,EAAU;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACzC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,mBAAmB,CAAC,OAAO,EAAE,GAAG,SAAS,IAAI,EAAE,EAAE,CAAC,CAAA;QAC/E,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,GAAsB;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAA;QAC1C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;YAC3B,IAAI,MAAM;gBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9C,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ import type { ComponentLookup, ProjectGraph, ValidationIssue } from '@elytracms/core/project-graph';
2
+ import type { CmsValidationIssue, CollectionDef, RedirectRecord, RouteRecord } from '@elytracms/core/cms-core';
3
+ import type { PersistenceIssue } from './core';
4
+ /**
5
+ * Inputs to the backend validation service (brief §4.11, §10). Any subset may be
6
+ * provided; only supplied domains are validated.
7
+ */
8
+ export interface BackendValidationInput {
9
+ graph?: ProjectGraph;
10
+ /** Registry lookup for component/prop/slot checks against the graph. */
11
+ components?: ComponentLookup;
12
+ /** Known data-source ids for binding resolution. */
13
+ knownSourceIds?: ReadonlySet<string>;
14
+ collections?: readonly CollectionDef[];
15
+ routes?: readonly RouteRecord[];
16
+ redirects?: readonly RedirectRecord[];
17
+ defaultLocale?: string;
18
+ }
19
+ /** Structured, typed validation results returned to clients (brief §4.11). */
20
+ export interface BackendValidationResult {
21
+ ok: boolean;
22
+ /** Graph + binding + component issues (from `@elytracms/core/project-graph`). */
23
+ graphIssues: ValidationIssue[];
24
+ /** Collection/field schema issues (from `@elytracms/core/cms-core`). */
25
+ schemaIssues: CmsValidationIssue[];
26
+ /** Route conflict + redirect loop issues (from `@elytracms/core/cms-core`). */
27
+ routeIssues: CmsValidationIssue[];
28
+ /** Count of error-severity issues across all domains. */
29
+ errorCount: number;
30
+ }
31
+ /**
32
+ * Validate project graphs, bindings, schemas, and routes on the server before
33
+ * persisting (brief §4.11, §10, EC-047). Reuses the canonical validators —
34
+ * logic is shared, never duplicated — and returns a structured result.
35
+ */
36
+ export declare function validateForPersistence(input: BackendValidationInput): BackendValidationResult;
37
+ /** Flatten a {@link BackendValidationResult} into generic persistence issues. */
38
+ export declare function toPersistenceIssues(result: BackendValidationResult): PersistenceIssue[];
39
+ /**
40
+ * Validate and throw a {@link PersistenceValidationError} when invalid — the
41
+ * server-side rejection path. Only error-severity issues block.
42
+ */
43
+ export declare function assertValidForPersistence(input: BackendValidationInput): BackendValidationResult;
@@ -0,0 +1,57 @@
1
+ import { validateProjectGraph } from '@elytracms/core/project-graph';
2
+ import { createCollectionRegistry, createRouter } from '@elytracms/core/cms-core';
3
+ import { PersistenceValidationError } from './core';
4
+ /**
5
+ * Validate project graphs, bindings, schemas, and routes on the server before
6
+ * persisting (brief §4.11, §10, EC-047). Reuses the canonical validators —
7
+ * logic is shared, never duplicated — and returns a structured result.
8
+ */
9
+ export function validateForPersistence(input) {
10
+ const graphIssues = input.graph
11
+ ? validateProjectGraph(input.graph, {
12
+ components: input.components,
13
+ knownSourceIds: input.knownSourceIds,
14
+ })
15
+ : [];
16
+ const schemaIssues = input.collections ? createCollectionRegistry(input.collections).issues.slice() : [];
17
+ const routeIssues = input.routes
18
+ ? createRouter(input.routes, input.redirects ?? [], {
19
+ defaultLocale: input.defaultLocale,
20
+ }).issues.slice()
21
+ : [];
22
+ const errorCount = graphIssues.filter((i) => i.severity === 'error').length +
23
+ schemaIssues.filter((i) => i.severity === 'error').length +
24
+ routeIssues.filter((i) => i.severity === 'error').length;
25
+ return { ok: errorCount === 0, graphIssues, schemaIssues, routeIssues, errorCount };
26
+ }
27
+ /** Flatten a {@link BackendValidationResult} into generic persistence issues. */
28
+ export function toPersistenceIssues(result) {
29
+ return [
30
+ ...result.graphIssues.map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'graph' })),
31
+ ...result.schemaIssues.map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'cms' })),
32
+ ...result.routeIssues.map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'routes' })),
33
+ ];
34
+ }
35
+ /**
36
+ * Validate and throw a {@link PersistenceValidationError} when invalid — the
37
+ * server-side rejection path. Only error-severity issues block.
38
+ */
39
+ export function assertValidForPersistence(input) {
40
+ const result = validateForPersistence(input);
41
+ if (!result.ok) {
42
+ const errorIssues = [
43
+ ...result.graphIssues
44
+ .filter((i) => i.severity === 'error')
45
+ .map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'graph' })),
46
+ ...result.schemaIssues
47
+ .filter((i) => i.severity === 'error')
48
+ .map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'cms' })),
49
+ ...result.routeIssues
50
+ .filter((i) => i.severity === 'error')
51
+ .map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'routes' })),
52
+ ];
53
+ throw new PersistenceValidationError(`Project state failed backend validation (${result.errorCount} error(s)).`, errorIssues);
54
+ }
55
+ return result;
56
+ }
57
+ //# sourceMappingURL=backend-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-validation.js","sourceRoot":"","sources":["../../src/persistence/backend-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAEpE,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAOjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,QAAQ,CAAA;AAgCnD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK;QAC7B,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;SACrC,CAAC;QACJ,CAAC,CAAC,EAAE,CAAA;IAEN,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAExG,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM;QAC9B,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE,EAAE;YAChD,aAAa,EAAE,KAAK,CAAC,aAAa;SACnC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE;QACnB,CAAC,CAAC,EAAE,CAAA;IAEN,MAAM,UAAU,GACd,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM;QACxD,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM;QACzD,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAA;IAE1D,OAAO,EAAE,EAAE,EAAE,UAAU,KAAK,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,CAAA;AACrF,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,mBAAmB,CAAC,MAA+B;IACjE,OAAO;QACL,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/G,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9G,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;KACjH,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAA6B;IACrE,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAA;IAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,WAAW,GAAuB;YACtC,GAAG,MAAM,CAAC,WAAW;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;iBACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5F,GAAG,MAAM,CAAC,YAAY;iBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;iBACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1F,GAAG,MAAM,CAAC,WAAW;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;iBACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;SAC9F,CAAA;QACD,MAAM,IAAI,0BAA0B,CAClC,4CAA4C,MAAM,CAAC,UAAU,aAAa,EAC1E,WAAW,CACZ,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { z } from 'zod';
2
+ import type { Clock, IdFactory } from './core';
3
+ /**
4
+ * Revocable per-project CLI tokens (EC-150). The EC-147 push CLI authenticates
5
+ * with `Authorization: Bearer <token>`; the builder stores only a SHA-256 hash
6
+ * of the token (`tokenHash`) — the plaintext is shown exactly once at issuance
7
+ * and never persisted. Verification (`verifyCliToken` in `@elytracms/core/operations`)
8
+ * hashes the presented token and looks it up here; revoked tokens stay stored
9
+ * (with `revokedAt`) so revocation is auditable and ids stay stable.
10
+ */
11
+ export declare const cliTokenRecordSchema: z.ZodObject<{
12
+ id: z.ZodString;
13
+ label: z.ZodString;
14
+ tokenHash: z.ZodString;
15
+ createdAt: z.ZodString;
16
+ revokedAt: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>;
18
+ export type CliTokenRecord = z.infer<typeof cliTokenRecordSchema>;
19
+ export interface NewCliTokenInput {
20
+ label: string;
21
+ tokenHash: string;
22
+ }
23
+ /**
24
+ * Token storage boundary. The in-memory implementation below and the
25
+ * Convex-backed implementation in `apps/builder` both satisfy it.
26
+ */
27
+ export interface CliTokenRepository {
28
+ /** Persist a freshly issued token (hash only). */
29
+ createToken(input: NewCliTokenInput): Promise<CliTokenRecord>;
30
+ /** All tokens of this deployment (revoked included), ordered by id. */
31
+ listTokens(): Promise<CliTokenRecord[]>;
32
+ /** Mark a token revoked (idempotent). Throws `RecordNotFoundError` when absent. */
33
+ revokeToken(tokenId: string): Promise<CliTokenRecord>;
34
+ /** Look a token up by its hash — the verification path. */
35
+ findByHash(tokenHash: string): Promise<CliTokenRecord | undefined>;
36
+ }
37
+ export interface InMemoryCliTokenRepositoryOptions {
38
+ clock?: Clock;
39
+ idFactory?: IdFactory;
40
+ }
41
+ export declare class InMemoryCliTokenRepository implements CliTokenRepository {
42
+ private readonly records;
43
+ private readonly clock;
44
+ private readonly idFactory;
45
+ constructor(options?: InMemoryCliTokenRepositoryOptions);
46
+ createToken(input: NewCliTokenInput): Promise<CliTokenRecord>;
47
+ listTokens(): Promise<CliTokenRecord[]>;
48
+ revokeToken(tokenId: string): Promise<CliTokenRecord>;
49
+ findByHash(tokenHash: string): Promise<CliTokenRecord | undefined>;
50
+ }
@@ -0,0 +1,66 @@
1
+ import { z } from 'zod';
2
+ import { cloneRecord, createSequentialClock, createSequentialIdFactory } from './core';
3
+ import { RecordNotFoundError } from './core';
4
+ /**
5
+ * Revocable per-project CLI tokens (EC-150). The EC-147 push CLI authenticates
6
+ * with `Authorization: Bearer <token>`; the builder stores only a SHA-256 hash
7
+ * of the token (`tokenHash`) — the plaintext is shown exactly once at issuance
8
+ * and never persisted. Verification (`verifyCliToken` in `@elytracms/core/operations`)
9
+ * hashes the presented token and looks it up here; revoked tokens stay stored
10
+ * (with `revokedAt`) so revocation is auditable and ids stay stable.
11
+ */
12
+ export const cliTokenRecordSchema = z.object({
13
+ /** Stable token id (`tok_*`) — used for revocation, never secret. */
14
+ id: z.string().min(1),
15
+ /** Human label, e.g. "CI push token". */
16
+ label: z.string().min(1),
17
+ /** Hex SHA-256 of the plaintext token. */
18
+ tokenHash: z.string().min(1),
19
+ createdAt: z.string().min(1),
20
+ /** Present once revoked; a revoked token never verifies again. */
21
+ revokedAt: z.string().min(1).optional(),
22
+ });
23
+ export class InMemoryCliTokenRepository {
24
+ records = new Map();
25
+ clock;
26
+ idFactory;
27
+ constructor(options = {}) {
28
+ this.clock = options.clock ?? createSequentialClock();
29
+ this.idFactory = options.idFactory ?? createSequentialIdFactory('tok');
30
+ }
31
+ async createToken(input) {
32
+ const record = {
33
+ id: this.idFactory(),
34
+ label: input.label,
35
+ tokenHash: input.tokenHash,
36
+ createdAt: this.clock(),
37
+ };
38
+ this.records.set(record.id, record);
39
+ return cloneRecord(record);
40
+ }
41
+ async listTokens() {
42
+ return [...this.records.values()]
43
+ .sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
44
+ .map(cloneRecord);
45
+ }
46
+ async revokeToken(tokenId) {
47
+ const record = this.records.get(tokenId);
48
+ if (!record) {
49
+ throw new RecordNotFoundError('cli-token', tokenId);
50
+ }
51
+ const revoked = {
52
+ ...record,
53
+ revokedAt: record.revokedAt ?? this.clock(),
54
+ };
55
+ this.records.set(tokenId, revoked);
56
+ return cloneRecord(revoked);
57
+ }
58
+ async findByHash(tokenHash) {
59
+ for (const record of this.records.values()) {
60
+ if (record.tokenHash === tokenHash)
61
+ return cloneRecord(record);
62
+ }
63
+ return undefined;
64
+ }
65
+ }
66
+ //# sourceMappingURL=cli-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-tokens.js","sourceRoot":"","sources":["../../src/persistence/cli-tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ import { z } from 'zod';
2
+ import type { CmsDocument, CollectionDef, DocumentRef } from '@elytracms/core/cms-core';
3
+ import { type Clock } from './core';
4
+ /** The persisted CMS schema for a project: its collection definitions (brief §7.4, §10). */
5
+ export declare const cmsSchemaRecordSchema: z.ZodObject<{
6
+ createdAt: z.ZodString;
7
+ updatedAt: z.ZodString;
8
+ projectId: z.ZodString;
9
+ collections: z.ZodArray<z.ZodObject<{
10
+ id: z.ZodString;
11
+ kind: z.ZodDefault<z.ZodEnum<{
12
+ asset: "asset";
13
+ document: "document";
14
+ }>>;
15
+ fields: z.ZodDefault<z.ZodArray<z.ZodType<import("@elytracms/core/cms-core").FieldDef, unknown, z.core.$ZodTypeInternals<import("@elytracms/core/cms-core").FieldDef, unknown>>>>;
16
+ form: z.ZodOptional<z.ZodObject<{
17
+ label: z.ZodOptional<z.ZodString>;
18
+ labelSingular: z.ZodOptional<z.ZodString>;
19
+ description: z.ZodOptional<z.ZodString>;
20
+ groups: z.ZodOptional<z.ZodArray<z.ZodString>>;
21
+ tabs: z.ZodOptional<z.ZodArray<z.ZodString>>;
22
+ }, z.core.$strip>>;
23
+ localized: z.ZodOptional<z.ZodBoolean>;
24
+ titleField: z.ZodOptional<z.ZodString>;
25
+ singleton: z.ZodOptional<z.ZodBoolean>;
26
+ }, z.core.$strip>>;
27
+ }, z.core.$strip>;
28
+ export type CmsSchemaRecord = z.infer<typeof cmsSchemaRecordSchema>;
29
+ /**
30
+ * A persisted CMS document. The stored `document` is the continuous working
31
+ * **draft** (every edit updates it); `publishedVersion` pins which recorded
32
+ * version is currently live (the Sanity draft/published model, EC-224). Absent
33
+ * `publishedVersion` means the document has never been published / is unpublished.
34
+ * Localized variants ride along on the `CmsDocument` itself.
35
+ */
36
+ export declare const cmsDocumentRecordSchema: z.ZodObject<{
37
+ createdAt: z.ZodString;
38
+ updatedAt: z.ZodString;
39
+ projectId: z.ZodString;
40
+ document: z.ZodObject<{
41
+ collection: z.ZodString;
42
+ id: z.ZodString;
43
+ values: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
44
+ localized: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
45
+ defaultLocale: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strip>;
47
+ publishedVersion: z.ZodOptional<z.ZodNumber>;
48
+ }, z.core.$strip>;
49
+ export type CmsDocumentRecord = z.infer<typeof cmsDocumentRecordSchema>;
50
+ /**
51
+ * An immutable snapshot of a document at one recorded version (EC-224). Append-only,
52
+ * mirroring {@link GraphRevisionRecord} but document-scoped: one row per version,
53
+ * keyed by (projectId, collection, docId, version). Created on publish (the promoted
54
+ * draft) and by an explicit pre-restore snapshot, never on a plain draft edit.
55
+ */
56
+ export declare const documentVersionRecordSchema: z.ZodObject<{
57
+ projectId: z.ZodString;
58
+ collection: z.ZodString;
59
+ docId: z.ZodString;
60
+ version: z.ZodNumber;
61
+ snapshot: z.ZodObject<{
62
+ collection: z.ZodString;
63
+ id: z.ZodString;
64
+ values: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
65
+ localized: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
66
+ defaultLocale: z.ZodOptional<z.ZodString>;
67
+ }, z.core.$strip>;
68
+ createdAt: z.ZodString;
69
+ label: z.ZodOptional<z.ZodString>;
70
+ }, z.core.$strip>;
71
+ export type DocumentVersionRecord = z.infer<typeof documentVersionRecordSchema>;
72
+ export interface SaveDocumentVersionOptions {
73
+ label?: string;
74
+ }
75
+ /**
76
+ * Persists CMS collection schemas and documents (brief §7.4, §10). Localized
77
+ * variants and draft/published state ride along on the `CmsDocument` itself.
78
+ */
79
+ export interface CmsRepository {
80
+ /** Persist (replace) the project's collection schema; validates structural shape. */
81
+ saveSchema(projectId: string, collections: readonly CollectionDef[]): Promise<CmsSchemaRecord>;
82
+ getSchema(projectId: string): Promise<CmsSchemaRecord>;
83
+ findSchema(projectId: string): Promise<CmsSchemaRecord | undefined>;
84
+ /** Insert or update a document (keyed by collection + id). */
85
+ upsertDocument(projectId: string, document: CmsDocument): Promise<CmsDocumentRecord>;
86
+ getDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord>;
87
+ findDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord | undefined>;
88
+ /** All documents for a project, optionally filtered to one collection. */
89
+ listDocuments(projectId: string, collection?: string): Promise<CmsDocumentRecord[]>;
90
+ deleteDocument(projectId: string, ref: DocumentRef): Promise<void>;
91
+ /**
92
+ * Append a snapshot of a document as a new monotonic version (EC-224). Used by
93
+ * publish (the promoted draft) and the pre-restore snapshot so a rollback is
94
+ * itself undoable. The (collection, docId) is derived from the snapshot.
95
+ */
96
+ saveDocumentVersion(projectId: string, snapshot: CmsDocument, options?: SaveDocumentVersionOptions): Promise<DocumentVersionRecord>;
97
+ /** All recorded versions for a document, newest first. Empty when none. */
98
+ listDocumentVersions(projectId: string, ref: DocumentRef): Promise<DocumentVersionRecord[]>;
99
+ /**
100
+ * Every recorded version across all documents in a project (EC-224). Backs the
101
+ * delivery feeders, which reconstruct each document's `DocumentHistory` from
102
+ * one bulk fetch rather than a per-document query. Order is deterministic
103
+ * (by document key, then version ascending).
104
+ */
105
+ listAllDocumentVersions(projectId: string): Promise<DocumentVersionRecord[]>;
106
+ /** A specific recorded version. Throws `RecordNotFoundError` if absent. */
107
+ getDocumentVersion(projectId: string, ref: DocumentRef, version: number): Promise<DocumentVersionRecord>;
108
+ /**
109
+ * Pin an existing recorded version live (EC-224 publish). Throws
110
+ * `RecordNotFoundError` if the document or the version is unknown.
111
+ */
112
+ publishDocumentVersion(projectId: string, ref: DocumentRef, version: number): Promise<CmsDocumentRecord>;
113
+ /**
114
+ * Clear the live pin (EC-224 unpublish). Throws `PersistenceValidationError`
115
+ * if the document is not currently published.
116
+ */
117
+ unpublishDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord>;
118
+ }
119
+ export interface InMemoryCmsRepositoryOptions {
120
+ clock?: Clock;
121
+ seedSchemas?: readonly CmsSchemaRecord[];
122
+ seedDocuments?: readonly CmsDocumentRecord[];
123
+ }
124
+ export declare class InMemoryCmsRepository implements CmsRepository {
125
+ private readonly schemas;
126
+ /** projectId → (documentKey → record). */
127
+ private readonly documents;
128
+ /** projectId → (documentKey → versions in ascending version order). */
129
+ private readonly versions;
130
+ private readonly clock;
131
+ constructor(options?: InMemoryCmsRepositoryOptions);
132
+ private docMap;
133
+ private versionMap;
134
+ saveSchema(projectId: string, collections: readonly CollectionDef[]): Promise<CmsSchemaRecord>;
135
+ getSchema(projectId: string): Promise<CmsSchemaRecord>;
136
+ findSchema(projectId: string): Promise<CmsSchemaRecord | undefined>;
137
+ upsertDocument(projectId: string, document: CmsDocument): Promise<CmsDocumentRecord>;
138
+ getDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord>;
139
+ findDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord | undefined>;
140
+ listDocuments(projectId: string, collection?: string): Promise<CmsDocumentRecord[]>;
141
+ deleteDocument(projectId: string, ref: DocumentRef): Promise<void>;
142
+ saveDocumentVersion(projectId: string, snapshot: CmsDocument, options?: SaveDocumentVersionOptions): Promise<DocumentVersionRecord>;
143
+ listDocumentVersions(projectId: string, ref: DocumentRef): Promise<DocumentVersionRecord[]>;
144
+ listAllDocumentVersions(projectId: string): Promise<DocumentVersionRecord[]>;
145
+ getDocumentVersion(projectId: string, ref: DocumentRef, version: number): Promise<DocumentVersionRecord>;
146
+ publishDocumentVersion(projectId: string, ref: DocumentRef, version: number): Promise<CmsDocumentRecord>;
147
+ unpublishDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord>;
148
+ }