@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,138 @@
1
+ import { z } from 'zod';
2
+ import { collectionDefSchema, fieldDefSchema } from '@elytracms/core/cms-core';
3
+ import { projectIdSchema } from '@elytracms/core/studio-core';
4
+ import { OperationFailure, bindOperation, defineCommand, defineQuery, notFoundError } from './core';
5
+ /**
6
+ * CMS schema operations: collections and fields (EC-139). The persistence
7
+ * boundary stores the schema as one record per project (`CmsRepository.saveSchema`),
8
+ * so collection- and field-level commands load, edit, and re-save it — keeping
9
+ * the canonical structural validation (duplicate ids, bad select options) in
10
+ * the repository.
11
+ */
12
+ export const saveSchemaInputSchema = z.object({
13
+ projectId: projectIdSchema,
14
+ collections: z.array(collectionDefSchema),
15
+ });
16
+ export const upsertCollectionInputSchema = z.object({
17
+ projectId: projectIdSchema,
18
+ collection: collectionDefSchema,
19
+ });
20
+ export const removeCollectionInputSchema = z.object({
21
+ projectId: projectIdSchema,
22
+ collectionId: z.string().min(1),
23
+ });
24
+ export const upsertFieldInputSchema = z.object({
25
+ projectId: projectIdSchema,
26
+ collectionId: z.string().min(1),
27
+ field: fieldDefSchema,
28
+ });
29
+ export const removeFieldInputSchema = z.object({
30
+ projectId: projectIdSchema,
31
+ collectionId: z.string().min(1),
32
+ fieldName: z.string().min(1),
33
+ });
34
+ export const getSchemaInputSchema = z.object({
35
+ projectId: projectIdSchema,
36
+ });
37
+ /** Load the project's collections, tolerating a not-yet-created schema. */
38
+ async function loadCollections(context, projectId) {
39
+ const record = await context.adapter.cms.findSchema(projectId);
40
+ return record ? [...record.collections] : [];
41
+ }
42
+ /** Load a collection or fail with a structured not-found error. */
43
+ async function requireCollection(context, projectId, collectionId) {
44
+ const collections = await loadCollections(context, projectId);
45
+ const index = collections.findIndex((c) => c.id === collectionId);
46
+ if (index < 0) {
47
+ throw new OperationFailure(notFoundError('collection', `${projectId}/${collectionId}`));
48
+ }
49
+ return { collections, index };
50
+ }
51
+ export const schemaOperationDefinitions = {
52
+ save: defineCommand({
53
+ name: 'schema.save',
54
+ domain: 'schema',
55
+ description: 'Replace the full CMS collection schema of a project.',
56
+ input: saveSchemaInputSchema,
57
+ execute: (context, input) => context.adapter.cms.saveSchema(input.projectId, input.collections),
58
+ }),
59
+ upsertCollection: defineCommand({
60
+ name: 'schema.upsertCollection',
61
+ domain: 'schema',
62
+ description: 'Add a collection to the project schema, or replace it by id.',
63
+ input: upsertCollectionInputSchema,
64
+ execute: async (context, input) => {
65
+ const collections = await loadCollections(context, input.projectId);
66
+ const index = collections.findIndex((c) => c.id === input.collection.id);
67
+ if (index >= 0)
68
+ collections[index] = input.collection;
69
+ else
70
+ collections.push(input.collection);
71
+ return context.adapter.cms.saveSchema(input.projectId, collections);
72
+ },
73
+ }),
74
+ removeCollection: defineCommand({
75
+ name: 'schema.removeCollection',
76
+ domain: 'schema',
77
+ description: 'Remove a collection from the project schema.',
78
+ input: removeCollectionInputSchema,
79
+ execute: async (context, input) => {
80
+ const { collections } = await requireCollection(context, input.projectId, input.collectionId);
81
+ return context.adapter.cms.saveSchema(input.projectId, collections.filter((c) => c.id !== input.collectionId));
82
+ },
83
+ }),
84
+ upsertField: defineCommand({
85
+ name: 'schema.upsertField',
86
+ domain: 'schema',
87
+ description: 'Add a field to a collection, or replace it by name.',
88
+ input: upsertFieldInputSchema,
89
+ execute: async (context, input) => {
90
+ const { collections, index } = await requireCollection(context, input.projectId, input.collectionId);
91
+ const collection = collections[index];
92
+ const fields = [...collection.fields];
93
+ const fieldIndex = fields.findIndex((f) => f.name === input.field.name);
94
+ if (fieldIndex >= 0)
95
+ fields[fieldIndex] = input.field;
96
+ else
97
+ fields.push(input.field);
98
+ collections[index] = { ...collection, fields };
99
+ return context.adapter.cms.saveSchema(input.projectId, collections);
100
+ },
101
+ }),
102
+ removeField: defineCommand({
103
+ name: 'schema.removeField',
104
+ domain: 'schema',
105
+ description: 'Remove a field from a collection by name.',
106
+ input: removeFieldInputSchema,
107
+ execute: async (context, input) => {
108
+ const { collections, index } = await requireCollection(context, input.projectId, input.collectionId);
109
+ const collection = collections[index];
110
+ if (!collection.fields.some((f) => f.name === input.fieldName)) {
111
+ throw new OperationFailure(notFoundError('field', `${input.collectionId}/${input.fieldName}`));
112
+ }
113
+ collections[index] = {
114
+ ...collection,
115
+ fields: collection.fields.filter((f) => f.name !== input.fieldName),
116
+ };
117
+ return context.adapter.cms.saveSchema(input.projectId, collections);
118
+ },
119
+ }),
120
+ get: defineQuery({
121
+ name: 'schema.get',
122
+ domain: 'schema',
123
+ description: 'Load the persisted CMS schema of a project.',
124
+ input: getSchemaInputSchema,
125
+ execute: (context, input) => context.adapter.cms.getSchema(input.projectId),
126
+ }),
127
+ };
128
+ export function createSchemaOperations(runtime) {
129
+ return {
130
+ save: bindOperation(runtime, schemaOperationDefinitions.save),
131
+ upsertCollection: bindOperation(runtime, schemaOperationDefinitions.upsertCollection),
132
+ removeCollection: bindOperation(runtime, schemaOperationDefinitions.removeCollection),
133
+ upsertField: bindOperation(runtime, schemaOperationDefinitions.upsertField),
134
+ removeField: bindOperation(runtime, schemaOperationDefinitions.removeField),
135
+ get: bindOperation(runtime, schemaOperationDefinitions.get),
136
+ };
137
+ }
138
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/operations/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { z } from 'zod';
2
+ import type { PersistenceAdapter, ProjectRole } from '@elytracms/core/persistence';
3
+ import type { OperationsRuntime } from './core';
4
+ /**
5
+ * Revocable per-project CLI tokens (EC-150; consumed by the EC-147/148 sync
6
+ * CLI, which sends them as `Authorization: Bearer <token>`).
7
+ *
8
+ * Lifecycle:
9
+ * 1. `tokens.issue` (admin-only via the EC-150 role hook) generates the
10
+ * plaintext once, persists only its SHA-256 hash, and returns the plaintext
11
+ * in the result — it is never stored or retrievable again.
12
+ * 2. The CLI presents the plaintext; the builder-side endpoint (EC-156 HTTP
13
+ * wiring) calls {@link verifyCliToken}, which hashes and looks it up.
14
+ * 3. `tokens.revoke` stamps `revokedAt`; revoked tokens never verify again but
15
+ * stay listed for auditability.
16
+ *
17
+ * Token issuance UI is deliberately out of scope for v1 — admins issue tokens
18
+ * via the operations layer (CLI/ops tooling); see the EC-150 task notes.
19
+ */
20
+ /** Plaintext token shape: `ect_` + 48 hex chars (24 random bytes). */
21
+ export declare const CLI_TOKEN_PREFIX = "ect_";
22
+ /** Hex SHA-256 via Web Crypto — available in browsers, Node 18+, and Convex. */
23
+ export declare function sha256Hex(value: string): Promise<string>;
24
+ /** Generate a fresh plaintext token (the only moment it exists outside the caller). */
25
+ export declare function generateCliToken(): string;
26
+ /** Safe, listable view of a stored token — never includes the hash. */
27
+ export interface CliTokenSummary {
28
+ readonly id: string;
29
+ readonly label: string;
30
+ readonly createdAt: string;
31
+ readonly revokedAt?: string;
32
+ }
33
+ export declare const issueTokenInputSchema: z.ZodObject<{
34
+ label: z.ZodString;
35
+ }, z.core.$strip>;
36
+ export declare const revokeTokenInputSchema: z.ZodObject<{
37
+ tokenId: z.ZodString;
38
+ }, z.core.$strip>;
39
+ export declare const listTokensInputSchema: z.ZodObject<{}, z.core.$strip>;
40
+ export declare const tokenOperationDefinitions: {
41
+ readonly issue: import("./core").OperationDefinition<z.ZodObject<{
42
+ label: z.ZodString;
43
+ }, z.core.$strip>, {
44
+ token: string;
45
+ summary: CliTokenSummary;
46
+ }>;
47
+ readonly revoke: import("./core").OperationDefinition<z.ZodObject<{
48
+ tokenId: z.ZodString;
49
+ }, z.core.$strip>, CliTokenSummary>;
50
+ readonly list: import("./core").OperationDefinition<z.ZodObject<{}, z.core.$strip>, CliTokenSummary[]>;
51
+ };
52
+ export declare function createTokenOperations(runtime: OperationsRuntime): {
53
+ issue: (input: {
54
+ label: string;
55
+ }) => Promise<import("./core").OperationResult<{
56
+ token: string;
57
+ summary: CliTokenSummary;
58
+ }>>;
59
+ revoke: (input: {
60
+ tokenId: string;
61
+ }) => Promise<import("./core").OperationResult<CliTokenSummary>>;
62
+ list: (input: Record<string, never>) => Promise<import("./core").OperationResult<CliTokenSummary[]>>;
63
+ };
64
+ export type TokenOperations = ReturnType<typeof createTokenOperations>;
65
+ /** Result of a successful CLI token verification. */
66
+ export interface VerifiedCliToken {
67
+ /**
68
+ * The capability the token grants. CLI tokens push component manifests and
69
+ * pull project data — `editor`-level content access, never administration.
70
+ */
71
+ readonly role: ProjectRole;
72
+ }
73
+ /**
74
+ * Server-side verification for the EC-147 Bearer token: hash the presented
75
+ * plaintext, look it up, and reject revoked/unknown tokens. The builder's
76
+ * registry-sync HTTP endpoint (EC-156) calls this before touching any
77
+ * repository.
78
+ */
79
+ export declare function verifyCliToken(adapter: PersistenceAdapter, token: string): Promise<VerifiedCliToken | null>;
@@ -0,0 +1,102 @@
1
+ import { z } from 'zod';
2
+ import { bindOperation, defineCommand, defineQuery } from './core';
3
+ /**
4
+ * Revocable per-project CLI tokens (EC-150; consumed by the EC-147/148 sync
5
+ * CLI, which sends them as `Authorization: Bearer <token>`).
6
+ *
7
+ * Lifecycle:
8
+ * 1. `tokens.issue` (admin-only via the EC-150 role hook) generates the
9
+ * plaintext once, persists only its SHA-256 hash, and returns the plaintext
10
+ * in the result — it is never stored or retrievable again.
11
+ * 2. The CLI presents the plaintext; the builder-side endpoint (EC-156 HTTP
12
+ * wiring) calls {@link verifyCliToken}, which hashes and looks it up.
13
+ * 3. `tokens.revoke` stamps `revokedAt`; revoked tokens never verify again but
14
+ * stay listed for auditability.
15
+ *
16
+ * Token issuance UI is deliberately out of scope for v1 — admins issue tokens
17
+ * via the operations layer (CLI/ops tooling); see the EC-150 task notes.
18
+ */
19
+ /** Plaintext token shape: `ect_` + 48 hex chars (24 random bytes). */
20
+ export const CLI_TOKEN_PREFIX = 'ect_';
21
+ const TOKEN_RANDOM_BYTES = 24;
22
+ /** Hex SHA-256 via Web Crypto — available in browsers, Node 18+, and Convex. */
23
+ export async function sha256Hex(value) {
24
+ const bytes = new TextEncoder().encode(value);
25
+ const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes);
26
+ return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, '0')).join('');
27
+ }
28
+ /** Generate a fresh plaintext token (the only moment it exists outside the caller). */
29
+ export function generateCliToken() {
30
+ const bytes = new Uint8Array(TOKEN_RANDOM_BYTES);
31
+ globalThis.crypto.getRandomValues(bytes);
32
+ return `${CLI_TOKEN_PREFIX}${[...bytes].map((b) => b.toString(16).padStart(2, '0')).join('')}`;
33
+ }
34
+ function toSummary(record) {
35
+ return {
36
+ id: record.id,
37
+ label: record.label,
38
+ createdAt: record.createdAt,
39
+ ...(record.revokedAt ? { revokedAt: record.revokedAt } : {}),
40
+ };
41
+ }
42
+ export const issueTokenInputSchema = z.object({
43
+ label: z.string().min(1).max(80),
44
+ });
45
+ export const revokeTokenInputSchema = z.object({
46
+ tokenId: z.string().min(1),
47
+ });
48
+ export const listTokensInputSchema = z.object({});
49
+ export const tokenOperationDefinitions = {
50
+ issue: defineCommand({
51
+ name: 'tokens.issue',
52
+ domain: 'tokens',
53
+ description: 'Issue a revocable CLI sync token for a project. Returns the plaintext exactly once; only its SHA-256 hash is stored.',
54
+ input: issueTokenInputSchema,
55
+ // Never log the (future) plaintext: summarize by label only.
56
+ summarize: (input) => JSON.stringify({ label: input.label }),
57
+ execute: async (context, input) => {
58
+ const token = generateCliToken();
59
+ const record = await context.adapter.cliTokens.createToken({
60
+ label: input.label,
61
+ tokenHash: await sha256Hex(token),
62
+ });
63
+ return { token, summary: toSummary(record) };
64
+ },
65
+ }),
66
+ revoke: defineCommand({
67
+ name: 'tokens.revoke',
68
+ domain: 'tokens',
69
+ description: 'Revoke a CLI token. Revoked tokens never verify again but stay listed.',
70
+ input: revokeTokenInputSchema,
71
+ execute: async (context, input) => toSummary(await context.adapter.cliTokens.revokeToken(input.tokenId)),
72
+ }),
73
+ list: defineQuery({
74
+ name: 'tokens.list',
75
+ domain: 'tokens',
76
+ description: 'List the CLI tokens of this deployment (metadata only — hashes are never returned).',
77
+ input: listTokensInputSchema,
78
+ execute: async (context) => (await context.adapter.cliTokens.listTokens()).map(toSummary),
79
+ }),
80
+ };
81
+ export function createTokenOperations(runtime) {
82
+ return {
83
+ issue: bindOperation(runtime, tokenOperationDefinitions.issue),
84
+ revoke: bindOperation(runtime, tokenOperationDefinitions.revoke),
85
+ list: bindOperation(runtime, tokenOperationDefinitions.list),
86
+ };
87
+ }
88
+ /**
89
+ * Server-side verification for the EC-147 Bearer token: hash the presented
90
+ * plaintext, look it up, and reject revoked/unknown tokens. The builder's
91
+ * registry-sync HTTP endpoint (EC-156) calls this before touching any
92
+ * repository.
93
+ */
94
+ export async function verifyCliToken(adapter, token) {
95
+ if (!token || !token.startsWith(CLI_TOKEN_PREFIX))
96
+ return null;
97
+ const record = await adapter.cliTokens.findByHash(await sha256Hex(token));
98
+ if (!record || record.revokedAt)
99
+ return null;
100
+ return { role: 'editor' };
101
+ }
102
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/operations/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { type BackendStatus, type Clock } from './core';
2
+ import type { GraphRepository } from './graph';
3
+ import type { CmsRepository } from './cms';
4
+ import type { AssetRepository, BlobStorageAdapter } from './assets';
5
+ import type { PublishingRepository } from './publishing';
6
+ import type { ReferenceIndexRepository } from './references';
7
+ import type { MembersRepository } from './members';
8
+ import type { CliTokenRepository } from './cli-tokens';
9
+ import type { BackendValidationInput, BackendValidationResult } from './backend-validation';
10
+ /**
11
+ * The aggregate persistence boundary (brief §4.10, §10). Core packages depend on
12
+ * this interface — never on Convex directly. A Convex-backed implementation and
13
+ * the in-memory implementation below both satisfy it, so the Studio, seeds, and
14
+ * tests are provider-agnostic.
15
+ */
16
+ export interface PersistenceAdapter {
17
+ readonly graphs: GraphRepository;
18
+ readonly cms: CmsRepository;
19
+ readonly assets: AssetRepository;
20
+ readonly publishing: PublishingRepository;
21
+ /** Reference index — outbound/inbound reference entries per variant (EC-155, AD-6). */
22
+ readonly references: ReferenceIndexRepository;
23
+ /**
24
+ * Whether this adapter keeps the reference index current in its own write path
25
+ * (EC-277, AD-6 "maintained at the source"). When `true`, the studio bootstrap
26
+ * does NOT attach the legacy client-side `attachReferenceIndex` subscriber —
27
+ * maintenance lives in the store (in-process via `withMaintainedReferenceIndex`,
28
+ * or server-side in the Convex mutations). Absent/`false` for a bare adapter
29
+ * that still relies on the subscriber.
30
+ */
31
+ readonly maintainsReferenceIndex?: boolean;
32
+ /** Per-project membership roles — admin/editor/viewer (EC-150, AD-7). */
33
+ readonly members: MembersRepository;
34
+ /** Revocable per-project CLI sync tokens, stored hashed (EC-150). */
35
+ readonly cliTokens: CliTokenRepository;
36
+ /** Blob storage boundary for asset bytes. */
37
+ readonly blobs: BlobStorageAdapter;
38
+ /** Backend identity + reachability, for degraded-state UI. */
39
+ status(): Promise<BackendStatus>;
40
+ /** Server-side validation service (brief §4.11, EC-047). */
41
+ validate(input: BackendValidationInput): BackendValidationResult;
42
+ }
43
+ export interface InMemoryPersistenceAdapterOptions {
44
+ /** Shared deterministic clock across all repositories. */
45
+ clock?: Clock;
46
+ graphs?: GraphRepository;
47
+ cms?: CmsRepository;
48
+ assets?: AssetRepository;
49
+ publishing?: PublishingRepository;
50
+ references?: ReferenceIndexRepository;
51
+ members?: MembersRepository;
52
+ cliTokens?: CliTokenRepository;
53
+ blobs?: BlobStorageAdapter;
54
+ /**
55
+ * EC-277: keep the reference index current in the write path (AD-6). When set,
56
+ * each document/graph/publishing write reindexes the affected source in the same
57
+ * call, so the index never relies on a client-side subscriber. Default `false`.
58
+ */
59
+ maintainReferenceIndex?: boolean;
60
+ }
61
+ /**
62
+ * In-memory implementation of {@link PersistenceAdapter} (brief §10). Backs
63
+ * deterministic fixtures, tests, smoke validation, and browser inspection before
64
+ * (and alongside) Convex.
65
+ */
66
+ export declare class InMemoryPersistenceAdapter implements PersistenceAdapter {
67
+ readonly graphs: GraphRepository;
68
+ readonly cms: CmsRepository;
69
+ readonly assets: AssetRepository;
70
+ readonly publishing: PublishingRepository;
71
+ readonly references: ReferenceIndexRepository;
72
+ readonly members: MembersRepository;
73
+ readonly cliTokens: CliTokenRepository;
74
+ readonly blobs: BlobStorageAdapter;
75
+ readonly maintainsReferenceIndex: boolean;
76
+ constructor(options?: InMemoryPersistenceAdapterOptions);
77
+ status(): Promise<BackendStatus>;
78
+ validate(input: BackendValidationInput): BackendValidationResult;
79
+ }
@@ -0,0 +1,55 @@
1
+ import { createSequentialClock, } from './core';
2
+ import { InMemoryGraphRepository } from './graph';
3
+ import { InMemoryCmsRepository } from './cms';
4
+ import { InMemoryAssetRepository, InMemoryBlobStorage } from './assets';
5
+ import { InMemoryPublishingRepository } from './publishing';
6
+ import { InMemoryReferenceIndexRepository } from './references';
7
+ import { InMemoryMembersRepository } from './members';
8
+ import { InMemoryCliTokenRepository } from './cli-tokens';
9
+ import { validateForPersistence } from './backend-validation';
10
+ import { maintainReferenceIndex } from './self-maintaining-adapter';
11
+ /**
12
+ * In-memory implementation of {@link PersistenceAdapter} (brief §10). Backs
13
+ * deterministic fixtures, tests, smoke validation, and browser inspection before
14
+ * (and alongside) Convex.
15
+ */
16
+ export class InMemoryPersistenceAdapter {
17
+ graphs;
18
+ cms;
19
+ assets;
20
+ publishing;
21
+ references;
22
+ members;
23
+ cliTokens;
24
+ blobs;
25
+ maintainsReferenceIndex = false;
26
+ constructor(options = {}) {
27
+ const clock = options.clock ?? createSequentialClock();
28
+ this.graphs = options.graphs ?? new InMemoryGraphRepository({ clock });
29
+ this.cms = options.cms ?? new InMemoryCmsRepository({ clock });
30
+ this.assets = options.assets ?? new InMemoryAssetRepository({ clock });
31
+ this.publishing = options.publishing ?? new InMemoryPublishingRepository({ clock });
32
+ this.references = options.references ?? new InMemoryReferenceIndexRepository();
33
+ this.members = options.members ?? new InMemoryMembersRepository({ clock });
34
+ this.cliTokens = options.cliTokens ?? new InMemoryCliTokenRepository({ clock });
35
+ this.blobs = options.blobs ?? new InMemoryBlobStorage();
36
+ // EC-277: opt into write-path index maintenance (AD-6 "at the source"). Wrap
37
+ // the write-bearing repos so a raw `cms.upsertDocument` — no operations layer,
38
+ // no subscriber — reindexes in the same call, mirroring the Convex server-side
39
+ // mutations. Off by default so existing callers' behaviour is unchanged.
40
+ if (options.maintainReferenceIndex) {
41
+ const maintained = maintainReferenceIndex({ cms: this.cms, graphs: this.graphs, publishing: this.publishing }, () => this);
42
+ this.cms = maintained.cms;
43
+ this.graphs = maintained.graphs;
44
+ this.publishing = maintained.publishing;
45
+ this.maintainsReferenceIndex = true;
46
+ }
47
+ }
48
+ async status() {
49
+ return { backend: 'in-memory', available: true };
50
+ }
51
+ validate(input) {
52
+ return validateForPersistence(input);
53
+ }
54
+ }
55
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/persistence/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import { z } from 'zod';
2
+ import { type Clock, type IdFactory } 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 declare const assetRecordSchema: z.ZodObject<{
9
+ createdAt: z.ZodString;
10
+ updatedAt: z.ZodString;
11
+ id: z.ZodString;
12
+ projectId: z.ZodString;
13
+ filename: z.ZodString;
14
+ contentType: z.ZodString;
15
+ byteSize: z.ZodNumber;
16
+ width: z.ZodOptional<z.ZodNumber>;
17
+ height: z.ZodOptional<z.ZodNumber>;
18
+ alt: z.ZodOptional<z.ZodString>;
19
+ title: z.ZodOptional<z.ZodString>;
20
+ storageKey: z.ZodString;
21
+ url: z.ZodOptional<z.ZodString>;
22
+ focalPoint: z.ZodOptional<z.ZodObject<{
23
+ x: z.ZodNumber;
24
+ y: z.ZodNumber;
25
+ }, z.core.$strip>>;
26
+ }, z.core.$strip>;
27
+ export type AssetRecord = z.infer<typeof assetRecordSchema>;
28
+ export interface NewAssetInput {
29
+ id?: string;
30
+ filename: string;
31
+ contentType: string;
32
+ byteSize: number;
33
+ width?: number;
34
+ height?: number;
35
+ alt?: string;
36
+ /** Editable display title (EC-152 asset library metadata). */
37
+ title?: string;
38
+ /** Defaults to a key derived from the asset id. */
39
+ storageKey?: string;
40
+ /** Resolvable serve URL for the stored bytes (EC-151). */
41
+ url?: string;
42
+ /** Normalized image focal point `{ x, y }` in 0–1 (EC-230). */
43
+ focalPoint?: {
44
+ x: number;
45
+ y: number;
46
+ };
47
+ }
48
+ /**
49
+ * Storage boundary for asset *bytes* (brief §8.6). Project-owned and swappable
50
+ * (Convex file storage, S3, etc.); the in-memory implementation backs tests and
51
+ * local inspection. Metadata stays in the {@link AssetRepository}.
52
+ */
53
+ export interface BlobStorageAdapter {
54
+ put(key: string, data: Uint8Array, contentType?: string): Promise<void>;
55
+ get(key: string): Promise<Uint8Array | undefined>;
56
+ /** A resolvable locator for the blob (e.g. a CDN/file URL). */
57
+ url(key: string): string;
58
+ has(key: string): Promise<boolean>;
59
+ delete(key: string): Promise<void>;
60
+ /**
61
+ * Store bytes under a backend-assigned key and return it (EC-151). Backends
62
+ * like Convex file storage mint their own ids, so callers cannot choose the
63
+ * key up front the way {@link put} assumes. Optional; in-memory implements it
64
+ * deterministically.
65
+ */
66
+ store?(data: Uint8Array, contentType?: string): Promise<string>;
67
+ /**
68
+ * Mint a short-lived URL the client can POST bytes to directly (EC-151,
69
+ * Convex `storage.generateUploadUrl()`). Optional — backends without
70
+ * client-direct uploads omit it and callers fall back to {@link store}/{@link put}.
71
+ */
72
+ createUploadUrl?(): Promise<string>;
73
+ /**
74
+ * Resolve the serve URL for a stored blob asynchronously (EC-151, Convex
75
+ * `storage.getUrl()`). Returns `undefined` when the blob does not exist.
76
+ * Optional; backends with synchronous stable URLs can rely on {@link url}.
77
+ */
78
+ resolveUrl?(key: string): Promise<string | undefined>;
79
+ }
80
+ export declare class InMemoryBlobStorage implements BlobStorageAdapter {
81
+ private readonly blobs;
82
+ /** Deterministic backend-assigned keys (no Date/random). */
83
+ private seq;
84
+ put(key: string, data: Uint8Array): Promise<void>;
85
+ get(key: string): Promise<Uint8Array | undefined>;
86
+ url(key: string): string;
87
+ has(key: string): Promise<boolean>;
88
+ delete(key: string): Promise<void>;
89
+ store(data: Uint8Array): Promise<string>;
90
+ resolveUrl(key: string): Promise<string | undefined>;
91
+ }
92
+ /** Persists asset metadata records (brief §7.4, §8.6, §10). */
93
+ export interface AssetRepository {
94
+ upsertAsset(projectId: string, input: NewAssetInput): Promise<AssetRecord>;
95
+ getAsset(projectId: string, id: string): Promise<AssetRecord>;
96
+ findAsset(projectId: string, id: string): Promise<AssetRecord | undefined>;
97
+ listAssets(projectId: string): Promise<AssetRecord[]>;
98
+ removeAsset(projectId: string, id: string): Promise<void>;
99
+ /** Resolve persisted metadata for the asset ids referenced by CMS fields. */
100
+ resolveMany(projectId: string, ids: readonly string[]): Promise<Map<string, AssetRecord>>;
101
+ }
102
+ export interface InMemoryAssetRepositoryOptions {
103
+ clock?: Clock;
104
+ idFactory?: IdFactory;
105
+ seed?: readonly AssetRecord[];
106
+ }
107
+ export declare class InMemoryAssetRepository implements AssetRepository {
108
+ /** projectId → (assetId → record). */
109
+ private readonly byProject;
110
+ private readonly clock;
111
+ private readonly nextId;
112
+ constructor(options?: InMemoryAssetRepositoryOptions);
113
+ private projectMap;
114
+ upsertAsset(projectId: string, input: NewAssetInput): Promise<AssetRecord>;
115
+ getAsset(projectId: string, id: string): Promise<AssetRecord>;
116
+ findAsset(projectId: string, id: string): Promise<AssetRecord | undefined>;
117
+ listAssets(projectId: string): Promise<AssetRecord[]>;
118
+ removeAsset(projectId: string, id: string): Promise<void>;
119
+ resolveMany(projectId: string, ids: readonly string[]): Promise<Map<string, AssetRecord>>;
120
+ }