@htmless/core 0.1.0

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 (435) hide show
  1. package/dist/ai/content-operations.d.ts +26 -0
  2. package/dist/ai/content-operations.d.ts.map +1 -0
  3. package/dist/ai/content-operations.js +75 -0
  4. package/dist/ai/content-operations.js.map +1 -0
  5. package/dist/ai/image-analyzer.d.ts +18 -0
  6. package/dist/ai/image-analyzer.d.ts.map +1 -0
  7. package/dist/ai/image-analyzer.js +457 -0
  8. package/dist/ai/image-analyzer.js.map +1 -0
  9. package/dist/ai/json-to-schema.d.ts +6 -0
  10. package/dist/ai/json-to-schema.d.ts.map +1 -0
  11. package/dist/ai/json-to-schema.js +155 -0
  12. package/dist/ai/json-to-schema.js.map +1 -0
  13. package/dist/ai/schema-generator.d.ts +34 -0
  14. package/dist/ai/schema-generator.d.ts.map +1 -0
  15. package/dist/ai/schema-generator.js +307 -0
  16. package/dist/ai/schema-generator.js.map +1 -0
  17. package/dist/api/cda/assets.d.ts +4 -0
  18. package/dist/api/cda/assets.d.ts.map +1 -0
  19. package/dist/api/cda/assets.js +82 -0
  20. package/dist/api/cda/assets.js.map +1 -0
  21. package/dist/api/cda/blocks.d.ts +4 -0
  22. package/dist/api/cda/blocks.d.ts.map +1 -0
  23. package/dist/api/cda/blocks.js +92 -0
  24. package/dist/api/cda/blocks.js.map +1 -0
  25. package/dist/api/cda/content.d.ts +4 -0
  26. package/dist/api/cda/content.d.ts.map +1 -0
  27. package/dist/api/cda/content.js +192 -0
  28. package/dist/api/cda/content.js.map +1 -0
  29. package/dist/api/cda/index.d.ts +4 -0
  30. package/dist/api/cda/index.d.ts.map +1 -0
  31. package/dist/api/cda/index.js +21 -0
  32. package/dist/api/cda/index.js.map +1 -0
  33. package/dist/api/cda/media.d.ts +4 -0
  34. package/dist/api/cda/media.d.ts.map +1 -0
  35. package/dist/api/cda/media.js +114 -0
  36. package/dist/api/cda/media.js.map +1 -0
  37. package/dist/api/cda/redirects.d.ts +4 -0
  38. package/dist/api/cda/redirects.d.ts.map +1 -0
  39. package/dist/api/cda/redirects.js +69 -0
  40. package/dist/api/cda/redirects.js.map +1 -0
  41. package/dist/api/cda/schemas.d.ts +4 -0
  42. package/dist/api/cda/schemas.d.ts.map +1 -0
  43. package/dist/api/cda/schemas.js +113 -0
  44. package/dist/api/cda/schemas.js.map +1 -0
  45. package/dist/api/cda/taxonomies.d.ts +4 -0
  46. package/dist/api/cda/taxonomies.d.ts.map +1 -0
  47. package/dist/api/cda/taxonomies.js +79 -0
  48. package/dist/api/cda/taxonomies.js.map +1 -0
  49. package/dist/api/cma/ai.d.ts +4 -0
  50. package/dist/api/cma/ai.d.ts.map +1 -0
  51. package/dist/api/cma/ai.js +458 -0
  52. package/dist/api/cma/ai.js.map +1 -0
  53. package/dist/api/cma/assets.d.ts +4 -0
  54. package/dist/api/cma/assets.d.ts.map +1 -0
  55. package/dist/api/cma/assets.js +166 -0
  56. package/dist/api/cma/assets.js.map +1 -0
  57. package/dist/api/cma/audit.d.ts +4 -0
  58. package/dist/api/cma/audit.d.ts.map +1 -0
  59. package/dist/api/cma/audit.js +74 -0
  60. package/dist/api/cma/audit.js.map +1 -0
  61. package/dist/api/cma/auth.d.ts +4 -0
  62. package/dist/api/cma/auth.d.ts.map +1 -0
  63. package/dist/api/cma/auth.js +123 -0
  64. package/dist/api/cma/auth.js.map +1 -0
  65. package/dist/api/cma/blocks.d.ts +4 -0
  66. package/dist/api/cma/blocks.d.ts.map +1 -0
  67. package/dist/api/cma/blocks.js +249 -0
  68. package/dist/api/cma/blocks.js.map +1 -0
  69. package/dist/api/cma/bulk.d.ts +4 -0
  70. package/dist/api/cma/bulk.d.ts.map +1 -0
  71. package/dist/api/cma/bulk.js +258 -0
  72. package/dist/api/cma/bulk.js.map +1 -0
  73. package/dist/api/cma/cache.d.ts +4 -0
  74. package/dist/api/cma/cache.d.ts.map +1 -0
  75. package/dist/api/cma/cache.js +99 -0
  76. package/dist/api/cma/cache.js.map +1 -0
  77. package/dist/api/cma/codegen.d.ts +4 -0
  78. package/dist/api/cma/codegen.d.ts.map +1 -0
  79. package/dist/api/cma/codegen.js +22 -0
  80. package/dist/api/cma/codegen.js.map +1 -0
  81. package/dist/api/cma/comments.d.ts +4 -0
  82. package/dist/api/cma/comments.d.ts.map +1 -0
  83. package/dist/api/cma/comments.js +164 -0
  84. package/dist/api/cma/comments.js.map +1 -0
  85. package/dist/api/cma/diff.d.ts +4 -0
  86. package/dist/api/cma/diff.d.ts.map +1 -0
  87. package/dist/api/cma/diff.js +88 -0
  88. package/dist/api/cma/diff.js.map +1 -0
  89. package/dist/api/cma/entries.d.ts +4 -0
  90. package/dist/api/cma/entries.d.ts.map +1 -0
  91. package/dist/api/cma/entries.js +736 -0
  92. package/dist/api/cma/entries.js.map +1 -0
  93. package/dist/api/cma/environments.d.ts +4 -0
  94. package/dist/api/cma/environments.d.ts.map +1 -0
  95. package/dist/api/cma/environments.js +160 -0
  96. package/dist/api/cma/environments.js.map +1 -0
  97. package/dist/api/cma/extensions.d.ts +4 -0
  98. package/dist/api/cma/extensions.d.ts.map +1 -0
  99. package/dist/api/cma/extensions.js +82 -0
  100. package/dist/api/cma/extensions.js.map +1 -0
  101. package/dist/api/cma/importexport.d.ts +4 -0
  102. package/dist/api/cma/importexport.d.ts.map +1 -0
  103. package/dist/api/cma/importexport.js +496 -0
  104. package/dist/api/cma/importexport.js.map +1 -0
  105. package/dist/api/cma/index.d.ts +4 -0
  106. package/dist/api/cma/index.d.ts.map +1 -0
  107. package/dist/api/cma/index.js +69 -0
  108. package/dist/api/cma/index.js.map +1 -0
  109. package/dist/api/cma/live.d.ts +4 -0
  110. package/dist/api/cma/live.d.ts.map +1 -0
  111. package/dist/api/cma/live.js +64 -0
  112. package/dist/api/cma/live.js.map +1 -0
  113. package/dist/api/cma/locales.d.ts +4 -0
  114. package/dist/api/cma/locales.d.ts.map +1 -0
  115. package/dist/api/cma/locales.js +117 -0
  116. package/dist/api/cma/locales.js.map +1 -0
  117. package/dist/api/cma/marketplace.d.ts +4 -0
  118. package/dist/api/cma/marketplace.d.ts.map +1 -0
  119. package/dist/api/cma/marketplace.js +550 -0
  120. package/dist/api/cma/marketplace.js.map +1 -0
  121. package/dist/api/cma/redirects.d.ts +4 -0
  122. package/dist/api/cma/redirects.d.ts.map +1 -0
  123. package/dist/api/cma/redirects.js +120 -0
  124. package/dist/api/cma/redirects.js.map +1 -0
  125. package/dist/api/cma/relationships.d.ts +4 -0
  126. package/dist/api/cma/relationships.d.ts.map +1 -0
  127. package/dist/api/cma/relationships.js +47 -0
  128. package/dist/api/cma/relationships.js.map +1 -0
  129. package/dist/api/cma/schemas.d.ts +4 -0
  130. package/dist/api/cma/schemas.d.ts.map +1 -0
  131. package/dist/api/cma/schemas.js +248 -0
  132. package/dist/api/cma/schemas.js.map +1 -0
  133. package/dist/api/cma/search.d.ts +4 -0
  134. package/dist/api/cma/search.d.ts.map +1 -0
  135. package/dist/api/cma/search.js +149 -0
  136. package/dist/api/cma/search.js.map +1 -0
  137. package/dist/api/cma/spaces.d.ts +4 -0
  138. package/dist/api/cma/spaces.d.ts.map +1 -0
  139. package/dist/api/cma/spaces.js +119 -0
  140. package/dist/api/cma/spaces.js.map +1 -0
  141. package/dist/api/cma/taxonomies.d.ts +4 -0
  142. package/dist/api/cma/taxonomies.d.ts.map +1 -0
  143. package/dist/api/cma/taxonomies.js +296 -0
  144. package/dist/api/cma/taxonomies.js.map +1 -0
  145. package/dist/api/cma/templates.d.ts +13 -0
  146. package/dist/api/cma/templates.d.ts.map +1 -0
  147. package/dist/api/cma/templates.js +312 -0
  148. package/dist/api/cma/templates.js.map +1 -0
  149. package/dist/api/cma/uploads.d.ts +4 -0
  150. package/dist/api/cma/uploads.d.ts.map +1 -0
  151. package/dist/api/cma/uploads.js +148 -0
  152. package/dist/api/cma/uploads.js.map +1 -0
  153. package/dist/api/cma/webhooks.d.ts +4 -0
  154. package/dist/api/cma/webhooks.d.ts.map +1 -0
  155. package/dist/api/cma/webhooks.js +175 -0
  156. package/dist/api/cma/webhooks.js.map +1 -0
  157. package/dist/api/cma/white-label.d.ts +4 -0
  158. package/dist/api/cma/white-label.d.ts.map +1 -0
  159. package/dist/api/cma/white-label.js +47 -0
  160. package/dist/api/cma/white-label.js.map +1 -0
  161. package/dist/api/graphql/index.d.ts +4 -0
  162. package/dist/api/graphql/index.d.ts.map +1 -0
  163. package/dist/api/graphql/index.js +57 -0
  164. package/dist/api/graphql/index.js.map +1 -0
  165. package/dist/api/graphql/introspection.d.ts +31 -0
  166. package/dist/api/graphql/introspection.d.ts.map +1 -0
  167. package/dist/api/graphql/introspection.js +90 -0
  168. package/dist/api/graphql/introspection.js.map +1 -0
  169. package/dist/api/graphql/parser.d.ts +14 -0
  170. package/dist/api/graphql/parser.d.ts.map +1 -0
  171. package/dist/api/graphql/parser.js +140 -0
  172. package/dist/api/graphql/parser.js.map +1 -0
  173. package/dist/api/graphql/resolver.d.ts +3 -0
  174. package/dist/api/graphql/resolver.d.ts.map +1 -0
  175. package/dist/api/graphql/resolver.js +138 -0
  176. package/dist/api/graphql/resolver.js.map +1 -0
  177. package/dist/api/preview/content.d.ts +4 -0
  178. package/dist/api/preview/content.d.ts.map +1 -0
  179. package/dist/api/preview/content.js +207 -0
  180. package/dist/api/preview/content.js.map +1 -0
  181. package/dist/api/preview/index.d.ts +4 -0
  182. package/dist/api/preview/index.d.ts.map +1 -0
  183. package/dist/api/preview/index.js +11 -0
  184. package/dist/api/preview/index.js.map +1 -0
  185. package/dist/api/preview/live.d.ts +4 -0
  186. package/dist/api/preview/live.d.ts.map +1 -0
  187. package/dist/api/preview/live.js +41 -0
  188. package/dist/api/preview/live.js.map +1 -0
  189. package/dist/audit/logger.d.ts +13 -0
  190. package/dist/audit/logger.d.ts.map +1 -0
  191. package/dist/audit/logger.js +21 -0
  192. package/dist/audit/logger.js.map +1 -0
  193. package/dist/audit/middleware.d.ts +7 -0
  194. package/dist/audit/middleware.d.ts.map +1 -0
  195. package/dist/audit/middleware.js +39 -0
  196. package/dist/audit/middleware.js.map +1 -0
  197. package/dist/auth/jwt.d.ts +9 -0
  198. package/dist/auth/jwt.d.ts.map +1 -0
  199. package/dist/auth/jwt.js +15 -0
  200. package/dist/auth/jwt.js.map +1 -0
  201. package/dist/auth/middleware.d.ts +24 -0
  202. package/dist/auth/middleware.d.ts.map +1 -0
  203. package/dist/auth/middleware.js +99 -0
  204. package/dist/auth/middleware.js.map +1 -0
  205. package/dist/auth/password.d.ts +3 -0
  206. package/dist/auth/password.d.ts.map +1 -0
  207. package/dist/auth/password.js +9 -0
  208. package/dist/auth/password.js.map +1 -0
  209. package/dist/auth/rate-limit.d.ts +19 -0
  210. package/dist/auth/rate-limit.d.ts.map +1 -0
  211. package/dist/auth/rate-limit.js +77 -0
  212. package/dist/auth/rate-limit.js.map +1 -0
  213. package/dist/auth/rbac.d.ts +10 -0
  214. package/dist/auth/rbac.d.ts.map +1 -0
  215. package/dist/auth/rbac.js +61 -0
  216. package/dist/auth/rbac.js.map +1 -0
  217. package/dist/blocks/core-blocks.d.ts +13 -0
  218. package/dist/blocks/core-blocks.d.ts.map +1 -0
  219. package/dist/blocks/core-blocks.js +113 -0
  220. package/dist/blocks/core-blocks.js.map +1 -0
  221. package/dist/blocks/renderer-sdk.d.ts +75 -0
  222. package/dist/blocks/renderer-sdk.d.ts.map +1 -0
  223. package/dist/blocks/renderer-sdk.js +112 -0
  224. package/dist/blocks/renderer-sdk.js.map +1 -0
  225. package/dist/blocks/seed-core-blocks.d.ts +6 -0
  226. package/dist/blocks/seed-core-blocks.d.ts.map +1 -0
  227. package/dist/blocks/seed-core-blocks.js +37 -0
  228. package/dist/blocks/seed-core-blocks.js.map +1 -0
  229. package/dist/blocks/validator.d.ts +10 -0
  230. package/dist/blocks/validator.d.ts.map +1 -0
  231. package/dist/blocks/validator.js +111 -0
  232. package/dist/blocks/validator.js.map +1 -0
  233. package/dist/cache/cdn-purge.d.ts +41 -0
  234. package/dist/cache/cdn-purge.d.ts.map +1 -0
  235. package/dist/cache/cdn-purge.js +180 -0
  236. package/dist/cache/cdn-purge.js.map +1 -0
  237. package/dist/cache/observability.d.ts +36 -0
  238. package/dist/cache/observability.d.ts.map +1 -0
  239. package/dist/cache/observability.js +110 -0
  240. package/dist/cache/observability.js.map +1 -0
  241. package/dist/cache/tags.d.ts +28 -0
  242. package/dist/cache/tags.d.ts.map +1 -0
  243. package/dist/cache/tags.js +94 -0
  244. package/dist/cache/tags.js.map +1 -0
  245. package/dist/cli/commands/codegen.d.ts +2 -0
  246. package/dist/cli/commands/codegen.d.ts.map +1 -0
  247. package/dist/cli/commands/codegen.js +73 -0
  248. package/dist/cli/commands/codegen.js.map +1 -0
  249. package/dist/cli/commands/dev.d.ts +2 -0
  250. package/dist/cli/commands/dev.d.ts.map +1 -0
  251. package/dist/cli/commands/dev.js +60 -0
  252. package/dist/cli/commands/dev.js.map +1 -0
  253. package/dist/cli/commands/help.d.ts +2 -0
  254. package/dist/cli/commands/help.d.ts.map +1 -0
  255. package/dist/cli/commands/help.js +32 -0
  256. package/dist/cli/commands/help.js.map +1 -0
  257. package/dist/cli/commands/init.d.ts +2 -0
  258. package/dist/cli/commands/init.d.ts.map +1 -0
  259. package/dist/cli/commands/init.js +90 -0
  260. package/dist/cli/commands/init.js.map +1 -0
  261. package/dist/cli/commands/migrate.d.ts +2 -0
  262. package/dist/cli/commands/migrate.d.ts.map +1 -0
  263. package/dist/cli/commands/migrate.js +27 -0
  264. package/dist/cli/commands/migrate.js.map +1 -0
  265. package/dist/cli/commands/seed.d.ts +2 -0
  266. package/dist/cli/commands/seed.d.ts.map +1 -0
  267. package/dist/cli/commands/seed.js +28 -0
  268. package/dist/cli/commands/seed.js.map +1 -0
  269. package/dist/cli/index.d.ts +16 -0
  270. package/dist/cli/index.d.ts.map +1 -0
  271. package/dist/cli/index.js +120 -0
  272. package/dist/cli/index.js.map +1 -0
  273. package/dist/config.d.ts +11 -0
  274. package/dist/config.d.ts.map +1 -0
  275. package/dist/config.js +11 -0
  276. package/dist/config.js.map +1 -0
  277. package/dist/content/advanced-query.d.ts +37 -0
  278. package/dist/content/advanced-query.d.ts.map +1 -0
  279. package/dist/content/advanced-query.js +162 -0
  280. package/dist/content/advanced-query.js.map +1 -0
  281. package/dist/content/cache.d.ts +27 -0
  282. package/dist/content/cache.d.ts.map +1 -0
  283. package/dist/content/cache.js +100 -0
  284. package/dist/content/cache.js.map +1 -0
  285. package/dist/content/diff.d.ts +13 -0
  286. package/dist/content/diff.d.ts.map +1 -0
  287. package/dist/content/diff.js +80 -0
  288. package/dist/content/diff.js.map +1 -0
  289. package/dist/content/localization.d.ts +13 -0
  290. package/dist/content/localization.d.ts.map +1 -0
  291. package/dist/content/localization.js +42 -0
  292. package/dist/content/localization.js.map +1 -0
  293. package/dist/content/materializer.d.ts +26 -0
  294. package/dist/content/materializer.d.ts.map +1 -0
  295. package/dist/content/materializer.js +175 -0
  296. package/dist/content/materializer.js.map +1 -0
  297. package/dist/content/relationships.d.ts +30 -0
  298. package/dist/content/relationships.d.ts.map +1 -0
  299. package/dist/content/relationships.js +123 -0
  300. package/dist/content/relationships.js.map +1 -0
  301. package/dist/db.d.ts +5 -0
  302. package/dist/db.d.ts.map +1 -0
  303. package/dist/db.js +5 -0
  304. package/dist/db.js.map +1 -0
  305. package/dist/events/emitter.d.ts +16 -0
  306. package/dist/events/emitter.d.ts.map +1 -0
  307. package/dist/events/emitter.js +15 -0
  308. package/dist/events/emitter.js.map +1 -0
  309. package/dist/events/sse.d.ts +16 -0
  310. package/dist/events/sse.d.ts.map +1 -0
  311. package/dist/events/sse.js +37 -0
  312. package/dist/events/sse.js.map +1 -0
  313. package/dist/events/wire.d.ts +2 -0
  314. package/dist/events/wire.d.ts.map +1 -0
  315. package/dist/events/wire.js +27 -0
  316. package/dist/events/wire.js.map +1 -0
  317. package/dist/extensions/billing.d.ts +60 -0
  318. package/dist/extensions/billing.d.ts.map +1 -0
  319. package/dist/extensions/billing.js +98 -0
  320. package/dist/extensions/billing.js.map +1 -0
  321. package/dist/extensions/manifest.d.ts +43 -0
  322. package/dist/extensions/manifest.d.ts.map +1 -0
  323. package/dist/extensions/manifest.js +66 -0
  324. package/dist/extensions/manifest.js.map +1 -0
  325. package/dist/extensions/marketplace.d.ts +50 -0
  326. package/dist/extensions/marketplace.d.ts.map +1 -0
  327. package/dist/extensions/marketplace.js +676 -0
  328. package/dist/extensions/marketplace.js.map +1 -0
  329. package/dist/extensions/router.d.ts +4 -0
  330. package/dist/extensions/router.d.ts.map +1 -0
  331. package/dist/extensions/router.js +50 -0
  332. package/dist/extensions/router.js.map +1 -0
  333. package/dist/extensions/runtime.d.ts +29 -0
  334. package/dist/extensions/runtime.d.ts.map +1 -0
  335. package/dist/extensions/runtime.js +201 -0
  336. package/dist/extensions/runtime.js.map +1 -0
  337. package/dist/extensions/sdk.d.ts +146 -0
  338. package/dist/extensions/sdk.d.ts.map +1 -0
  339. package/dist/extensions/sdk.js +114 -0
  340. package/dist/extensions/sdk.js.map +1 -0
  341. package/dist/integrations/sheets.d.ts +41 -0
  342. package/dist/integrations/sheets.d.ts.map +1 -0
  343. package/dist/integrations/sheets.js +230 -0
  344. package/dist/integrations/sheets.js.map +1 -0
  345. package/dist/media/metadata.d.ts +9 -0
  346. package/dist/media/metadata.d.ts.map +1 -0
  347. package/dist/media/metadata.js +84 -0
  348. package/dist/media/metadata.js.map +1 -0
  349. package/dist/media/presets.d.ts +17 -0
  350. package/dist/media/presets.d.ts.map +1 -0
  351. package/dist/media/presets.js +21 -0
  352. package/dist/media/presets.js.map +1 -0
  353. package/dist/media/storage.d.ts +16 -0
  354. package/dist/media/storage.d.ts.map +1 -0
  355. package/dist/media/storage.js +39 -0
  356. package/dist/media/storage.js.map +1 -0
  357. package/dist/media/transforms-engine.d.ts +46 -0
  358. package/dist/media/transforms-engine.d.ts.map +1 -0
  359. package/dist/media/transforms-engine.js +91 -0
  360. package/dist/media/transforms-engine.js.map +1 -0
  361. package/dist/media/transforms.d.ts +15 -0
  362. package/dist/media/transforms.d.ts.map +1 -0
  363. package/dist/media/transforms.js +22 -0
  364. package/dist/media/transforms.js.map +1 -0
  365. package/dist/media/usage.d.ts +21 -0
  366. package/dist/media/usage.d.ts.map +1 -0
  367. package/dist/media/usage.js +105 -0
  368. package/dist/media/usage.js.map +1 -0
  369. package/dist/redis.d.ts +2 -0
  370. package/dist/redis.d.ts.map +1 -0
  371. package/dist/redis.js +9 -0
  372. package/dist/redis.js.map +1 -0
  373. package/dist/schema/codegen.d.ts +6 -0
  374. package/dist/schema/codegen.d.ts.map +1 -0
  375. package/dist/schema/codegen.js +95 -0
  376. package/dist/schema/codegen.js.map +1 -0
  377. package/dist/schema/json-schema.d.ts +42 -0
  378. package/dist/schema/json-schema.d.ts.map +1 -0
  379. package/dist/schema/json-schema.js +68 -0
  380. package/dist/schema/json-schema.js.map +1 -0
  381. package/dist/schema/validator.d.ts +14 -0
  382. package/dist/schema/validator.d.ts.map +1 -0
  383. package/dist/schema/validator.js +103 -0
  384. package/dist/schema/validator.js.map +1 -0
  385. package/dist/sdk/client.d.ts +86 -0
  386. package/dist/sdk/client.d.ts.map +1 -0
  387. package/dist/sdk/client.js +117 -0
  388. package/dist/sdk/client.js.map +1 -0
  389. package/dist/server.d.ts +2 -0
  390. package/dist/server.d.ts.map +1 -0
  391. package/dist/server.js +59 -0
  392. package/dist/server.js.map +1 -0
  393. package/dist/spaces/premium-templates.d.ts +37 -0
  394. package/dist/spaces/premium-templates.d.ts.map +1 -0
  395. package/dist/spaces/premium-templates.js +1603 -0
  396. package/dist/spaces/premium-templates.js.map +1 -0
  397. package/dist/spaces/provisioner.d.ts +16 -0
  398. package/dist/spaces/provisioner.d.ts.map +1 -0
  399. package/dist/spaces/provisioner.js +143 -0
  400. package/dist/spaces/provisioner.js.map +1 -0
  401. package/dist/spaces/template-registry.d.ts +34 -0
  402. package/dist/spaces/template-registry.d.ts.map +1 -0
  403. package/dist/spaces/template-registry.js +55 -0
  404. package/dist/spaces/template-registry.js.map +1 -0
  405. package/dist/spaces/templates.d.ts +44 -0
  406. package/dist/spaces/templates.d.ts.map +1 -0
  407. package/dist/spaces/templates.js +201 -0
  408. package/dist/spaces/templates.js.map +1 -0
  409. package/dist/spaces/white-label.d.ts +20 -0
  410. package/dist/spaces/white-label.d.ts.map +1 -0
  411. package/dist/spaces/white-label.js +32 -0
  412. package/dist/spaces/white-label.js.map +1 -0
  413. package/dist/utils/query-shaping.d.ts +27 -0
  414. package/dist/utils/query-shaping.d.ts.map +1 -0
  415. package/dist/utils/query-shaping.js +69 -0
  416. package/dist/utils/query-shaping.js.map +1 -0
  417. package/dist/utils/space.d.ts +4 -0
  418. package/dist/utils/space.d.ts.map +1 -0
  419. package/dist/utils/space.js +17 -0
  420. package/dist/utils/space.js.map +1 -0
  421. package/dist/webhooks/dispatcher.d.ts +9 -0
  422. package/dist/webhooks/dispatcher.d.ts.map +1 -0
  423. package/dist/webhooks/dispatcher.js +102 -0
  424. package/dist/webhooks/dispatcher.js.map +1 -0
  425. package/package.json +84 -0
  426. package/prisma/migrations/20260403025542_init/migration.sql +315 -0
  427. package/prisma/migrations/20260403034855_add_blocks_and_patterns/migration.sql +40 -0
  428. package/prisma/migrations/20260403041936_add_published_documents/migration.sql +30 -0
  429. package/prisma/migrations/20260403042809_add_locales_and_taxonomies/migration.sql +58 -0
  430. package/prisma/migrations/20260403043033_add_scheduled_unpublish_at/migration.sql +2 -0
  431. package/prisma/migrations/20260403052801_add_environments_and_whitelabel/migration.sql +65 -0
  432. package/prisma/migrations/20260403055920_add_marketplace_and_extension_config/migration.sql +73 -0
  433. package/prisma/migrations/migration_lock.toml +3 -0
  434. package/prisma/schema.prisma +530 -0
  435. package/prisma/seed.ts +154 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const config: {
2
+ readonly port: number;
3
+ readonly nodeEnv: string;
4
+ readonly databaseUrl: string;
5
+ readonly redisUrl: string;
6
+ readonly jwtSecret: string;
7
+ readonly jwtExpiresIn: "24h";
8
+ readonly apiTokenPrefix: "hle_";
9
+ readonly previewTokenPrefix: "hlp_";
10
+ };
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,11 @@
1
+ export const config = {
2
+ port: parseInt(process.env.PORT || '3000', 10),
3
+ nodeEnv: process.env.NODE_ENV || 'development',
4
+ databaseUrl: process.env.DATABASE_URL,
5
+ redisUrl: process.env.REDIS_URL || 'redis://localhost:6379',
6
+ jwtSecret: process.env.JWT_SECRET || 'dev-secret-change-in-production-please',
7
+ jwtExpiresIn: '24h',
8
+ apiTokenPrefix: 'hle_',
9
+ previewTokenPrefix: 'hlp_',
10
+ };
11
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC;IAC9C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;IAC9C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAa;IACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,wBAAwB;IAC3D,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,wCAAwC;IAC7E,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,MAAM;IACtB,kBAAkB,EAAE,MAAM;CAClB,CAAC"}
@@ -0,0 +1,37 @@
1
+ export interface FilterCondition {
2
+ field: string;
3
+ operator: string;
4
+ value: unknown;
5
+ }
6
+ export interface SortDirective {
7
+ field: string;
8
+ direction: 'asc' | 'desc';
9
+ }
10
+ /**
11
+ * Parse query params into FilterCondition[].
12
+ *
13
+ * Supported formats:
14
+ * ?filter[field]=value → implicit $eq
15
+ * ?filter[field][$gt]=value → explicit operator
16
+ */
17
+ export declare function parseFilters(query: Record<string, string>): FilterCondition[];
18
+ /**
19
+ * Parse sort query param into SortDirective[].
20
+ *
21
+ * ?sort=field → ascending
22
+ * ?sort=-field → descending
23
+ * ?sort=a,-b → multiple
24
+ */
25
+ export declare function parseSortDirectives(sortParam: string | undefined): SortDirective[];
26
+ /**
27
+ * Apply all filter conditions to a data record.
28
+ * Returns true if the record passes ALL conditions (AND logic).
29
+ */
30
+ export declare function applyFilters(conditions: FilterCondition[], data: Record<string, unknown>): boolean;
31
+ /**
32
+ * Sort an array of items by their data fields according to sort directives.
33
+ */
34
+ export declare function applySorting<T extends {
35
+ data: Record<string, unknown>;
36
+ }>(items: T[], directives: SortDirective[]): T[];
37
+ //# sourceMappingURL=advanced-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advanced-query.d.ts","sourceRoot":"","sources":["../../src/content/advanced-query.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC3B;AAcD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,eAAe,EAAE,CAiC7E;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,EAAE,CAUlF;AAwDD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAElG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EACtE,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,aAAa,EAAE,GAC1B,CAAC,EAAE,CAqBL"}
@@ -0,0 +1,162 @@
1
+ // ─── Advanced CDA Filtering & Sorting ───────────────────────────────
2
+ const SUPPORTED_OPERATORS = new Set([
3
+ '$eq',
4
+ '$ne',
5
+ '$gt',
6
+ '$gte',
7
+ '$lt',
8
+ '$lte',
9
+ '$contains',
10
+ '$startsWith',
11
+ '$in',
12
+ ]);
13
+ /**
14
+ * Parse query params into FilterCondition[].
15
+ *
16
+ * Supported formats:
17
+ * ?filter[field]=value → implicit $eq
18
+ * ?filter[field][$gt]=value → explicit operator
19
+ */
20
+ export function parseFilters(query) {
21
+ const conditions = [];
22
+ for (const [key, raw] of Object.entries(query)) {
23
+ // Match filter[field] or filter[field][$op]
24
+ const match = key.match(/^filter\[([^\]]+)\](?:\[(\$[^\]]+)\])?$/);
25
+ if (!match)
26
+ continue;
27
+ const field = match[1];
28
+ const operator = match[2] ?? '$eq';
29
+ if (!SUPPORTED_OPERATORS.has(operator))
30
+ continue;
31
+ let value = raw;
32
+ // Attempt to parse JSON-like values
33
+ if (raw === 'true')
34
+ value = true;
35
+ else if (raw === 'false')
36
+ value = false;
37
+ else if (raw === 'null')
38
+ value = null;
39
+ else if (/^-?\d+(\.\d+)?$/.test(raw))
40
+ value = Number(raw);
41
+ else if (operator === '$in') {
42
+ // $in expects comma-separated values
43
+ value = raw.split(',').map((v) => {
44
+ const trimmed = v.trim();
45
+ if (/^-?\d+(\.\d+)?$/.test(trimmed))
46
+ return Number(trimmed);
47
+ return trimmed;
48
+ });
49
+ }
50
+ conditions.push({ field, operator, value });
51
+ }
52
+ return conditions;
53
+ }
54
+ /**
55
+ * Parse sort query param into SortDirective[].
56
+ *
57
+ * ?sort=field → ascending
58
+ * ?sort=-field → descending
59
+ * ?sort=a,-b → multiple
60
+ */
61
+ export function parseSortDirectives(sortParam) {
62
+ if (!sortParam || sortParam.trim().length === 0)
63
+ return [];
64
+ return sortParam.split(',').map((s) => {
65
+ const trimmed = s.trim();
66
+ if (trimmed.startsWith('-')) {
67
+ return { field: trimmed.slice(1), direction: 'desc' };
68
+ }
69
+ return { field: trimmed, direction: 'asc' };
70
+ });
71
+ }
72
+ /**
73
+ * Evaluate a single filter condition against a data record.
74
+ */
75
+ function evaluateCondition(data, condition) {
76
+ const { field, operator, value } = condition;
77
+ // Support nested field access via dot notation
78
+ const fieldValue = getNestedValue(data, field);
79
+ switch (operator) {
80
+ case '$eq':
81
+ return fieldValue === value;
82
+ case '$ne':
83
+ return fieldValue !== value;
84
+ case '$gt':
85
+ return typeof fieldValue === 'number' && typeof value === 'number'
86
+ ? fieldValue > value
87
+ : String(fieldValue) > String(value);
88
+ case '$gte':
89
+ return typeof fieldValue === 'number' && typeof value === 'number'
90
+ ? fieldValue >= value
91
+ : String(fieldValue) >= String(value);
92
+ case '$lt':
93
+ return typeof fieldValue === 'number' && typeof value === 'number'
94
+ ? fieldValue < value
95
+ : String(fieldValue) < String(value);
96
+ case '$lte':
97
+ return typeof fieldValue === 'number' && typeof value === 'number'
98
+ ? fieldValue <= value
99
+ : String(fieldValue) <= String(value);
100
+ case '$contains':
101
+ return typeof fieldValue === 'string' && typeof value === 'string'
102
+ ? fieldValue.includes(value)
103
+ : false;
104
+ case '$startsWith':
105
+ return typeof fieldValue === 'string' && typeof value === 'string'
106
+ ? fieldValue.startsWith(value)
107
+ : false;
108
+ case '$in':
109
+ return Array.isArray(value) ? value.includes(fieldValue) : false;
110
+ default:
111
+ return true;
112
+ }
113
+ }
114
+ /**
115
+ * Apply all filter conditions to a data record.
116
+ * Returns true if the record passes ALL conditions (AND logic).
117
+ */
118
+ export function applyFilters(conditions, data) {
119
+ return conditions.every((cond) => evaluateCondition(data, cond));
120
+ }
121
+ /**
122
+ * Sort an array of items by their data fields according to sort directives.
123
+ */
124
+ export function applySorting(items, directives) {
125
+ if (directives.length === 0)
126
+ return items;
127
+ return [...items].sort((a, b) => {
128
+ for (const { field, direction } of directives) {
129
+ const aVal = getNestedValue(a.data, field);
130
+ const bVal = getNestedValue(b.data, field);
131
+ let cmp = 0;
132
+ if (aVal == null && bVal == null)
133
+ cmp = 0;
134
+ else if (aVal == null)
135
+ cmp = -1;
136
+ else if (bVal == null)
137
+ cmp = 1;
138
+ else if (typeof aVal === 'number' && typeof bVal === 'number')
139
+ cmp = aVal - bVal;
140
+ else
141
+ cmp = String(aVal).localeCompare(String(bVal));
142
+ if (cmp !== 0) {
143
+ return direction === 'desc' ? -cmp : cmp;
144
+ }
145
+ }
146
+ return 0;
147
+ });
148
+ }
149
+ /**
150
+ * Get a nested value from an object using dot notation.
151
+ */
152
+ function getNestedValue(obj, path) {
153
+ const parts = path.split('.');
154
+ let current = obj;
155
+ for (const part of parts) {
156
+ if (current == null || typeof current !== 'object')
157
+ return undefined;
158
+ current = current[part];
159
+ }
160
+ return current;
161
+ }
162
+ //# sourceMappingURL=advanced-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advanced-query.js","sourceRoot":"","sources":["../../src/content/advanced-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Build a cache key following the format:
3
+ * cda:${spaceId}:${contentTypeKey}:${slug || 'list'}:${queryHash}
4
+ */
5
+ export declare function buildCacheKey(spaceId: string, contentTypeKey: string, slugOrList: string, queryHash: string): string;
6
+ /**
7
+ * Get a cached response string from Redis.
8
+ */
9
+ export declare function getCachedResponse(key: string): Promise<string | null>;
10
+ /**
11
+ * Set a cached response string in Redis with a TTL.
12
+ */
13
+ export declare function setCachedResponse(key: string, data: string, ttlSeconds: number): Promise<void>;
14
+ /**
15
+ * Invalidate all cache keys that match a specific entry.
16
+ * Uses SCAN to avoid blocking Redis on large key spaces.
17
+ */
18
+ export declare function invalidateByEntry(spaceId: string, entryId: string): Promise<void>;
19
+ /**
20
+ * Invalidate all cache keys for a content type within a space.
21
+ */
22
+ export declare function invalidateByType(spaceId: string, contentTypeKey: string): Promise<void>;
23
+ /**
24
+ * Nuclear option: invalidate every CDA cache key for a space.
25
+ */
26
+ export declare function invalidateBySpace(spaceId: string): Promise<void>;
27
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/content/cache.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO3E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASvF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
@@ -0,0 +1,100 @@
1
+ // ─── Redis CDA Response Cache ───────────────────────────────────────
2
+ import { redis } from '../redis.js';
3
+ const KEY_PREFIX = 'cda';
4
+ /**
5
+ * Build a cache key following the format:
6
+ * cda:${spaceId}:${contentTypeKey}:${slug || 'list'}:${queryHash}
7
+ */
8
+ export function buildCacheKey(spaceId, contentTypeKey, slugOrList, queryHash) {
9
+ return `${KEY_PREFIX}:${spaceId}:${contentTypeKey}:${slugOrList}:${queryHash}`;
10
+ }
11
+ /**
12
+ * Get a cached response string from Redis.
13
+ */
14
+ export async function getCachedResponse(key) {
15
+ try {
16
+ return await redis.get(key);
17
+ }
18
+ catch {
19
+ // Redis failure should never break the read path
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * Set a cached response string in Redis with a TTL.
25
+ */
26
+ export async function setCachedResponse(key, data, ttlSeconds) {
27
+ try {
28
+ await redis.set(key, data, 'EX', ttlSeconds);
29
+ }
30
+ catch {
31
+ // Swallow — cache miss is acceptable
32
+ }
33
+ }
34
+ /**
35
+ * Invalidate all cache keys that match a specific entry.
36
+ * Uses SCAN to avoid blocking Redis on large key spaces.
37
+ */
38
+ export async function invalidateByEntry(spaceId, entryId) {
39
+ // Entry-level keys are hard to track exactly, so we scan for the entry in
40
+ // pattern-matched keys. Since the entry ID isn't embedded in the cache key
41
+ // format, we invalidate the whole space's CDA cache to be safe.
42
+ // For entry-level precision, we would need a secondary index mapping
43
+ // entryId → cache keys. The space-level sweep is acceptable for now.
44
+ await invalidateByPattern(`${KEY_PREFIX}:${spaceId}:*`);
45
+ // Also clean up any per-entry cached single-item responses
46
+ void purgeKeysByTag(spaceId, entryId);
47
+ }
48
+ /**
49
+ * Invalidate all cache keys for a content type within a space.
50
+ */
51
+ export async function invalidateByType(spaceId, contentTypeKey) {
52
+ await invalidateByPattern(`${KEY_PREFIX}:${spaceId}:${contentTypeKey}:*`);
53
+ }
54
+ /**
55
+ * Nuclear option: invalidate every CDA cache key for a space.
56
+ */
57
+ export async function invalidateBySpace(spaceId) {
58
+ await invalidateByPattern(`${KEY_PREFIX}:${spaceId}:*`);
59
+ }
60
+ // ── Internal helpers ────────────────────────────────────────────────
61
+ /**
62
+ * SCAN + DEL for keys matching a glob pattern.
63
+ * Uses SCAN to avoid blocking.
64
+ */
65
+ async function invalidateByPattern(pattern) {
66
+ try {
67
+ let cursor = '0';
68
+ do {
69
+ const [nextCursor, keys] = await redis.scan(cursor, 'MATCH', pattern, 'COUNT', 200);
70
+ cursor = nextCursor;
71
+ if (keys.length > 0) {
72
+ await redis.del(...keys);
73
+ }
74
+ } while (cursor !== '0');
75
+ }
76
+ catch {
77
+ // Redis failure should not propagate to callers
78
+ }
79
+ }
80
+ /**
81
+ * Best-effort tag-based purge. We maintain a Redis set per entry that
82
+ * records which cache keys reference it. On invalidation we delete those
83
+ * keys and the set itself.
84
+ */
85
+ async function purgeKeysByTag(spaceId, entryId) {
86
+ const tagKey = `cda-tag:${spaceId}:entry:${entryId}`;
87
+ try {
88
+ const keys = await redis.smembers(tagKey);
89
+ if (keys.length > 0) {
90
+ await redis.del(...keys, tagKey);
91
+ }
92
+ else {
93
+ await redis.del(tagKey);
94
+ }
95
+ }
96
+ catch {
97
+ // non-critical
98
+ }
99
+ }
100
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/content/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface DiffResult {
2
+ path: string;
3
+ type: 'added' | 'removed' | 'changed';
4
+ oldValue?: unknown;
5
+ newValue?: unknown;
6
+ }
7
+ /**
8
+ * Deep recursive diff of two JSON objects.
9
+ * Returns an array of DiffResult entries describing every difference
10
+ * between versionA and versionB.
11
+ */
12
+ export declare function diffVersions(versionA: Record<string, unknown>, versionB: Record<string, unknown>): DiffResult[];
13
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/content/diff.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,UAAU,EAAE,CAId"}
@@ -0,0 +1,80 @@
1
+ // ─── Content Version Diff Engine ─────────────────────────────────────
2
+ /**
3
+ * Deep recursive diff of two JSON objects.
4
+ * Returns an array of DiffResult entries describing every difference
5
+ * between versionA and versionB.
6
+ */
7
+ export function diffVersions(versionA, versionB) {
8
+ const results = [];
9
+ diffRecursive(versionA, versionB, '', results);
10
+ return results;
11
+ }
12
+ function diffRecursive(a, b, path, results) {
13
+ // Identical values (strict equality covers primitives and same references)
14
+ if (a === b)
15
+ return;
16
+ // Both null/undefined — already covered by ===, but be explicit
17
+ if (a === null && b === null)
18
+ return;
19
+ if (a === undefined && b === undefined)
20
+ return;
21
+ // One is null/undefined and the other is not
22
+ if (a == null && b != null) {
23
+ results.push({ path: path || '(root)', type: 'added', newValue: b });
24
+ return;
25
+ }
26
+ if (a != null && b == null) {
27
+ results.push({ path: path || '(root)', type: 'removed', oldValue: a });
28
+ return;
29
+ }
30
+ const typeA = Array.isArray(a) ? 'array' : typeof a;
31
+ const typeB = Array.isArray(b) ? 'array' : typeof b;
32
+ // Different types — treat as changed
33
+ if (typeA !== typeB) {
34
+ results.push({ path: path || '(root)', type: 'changed', oldValue: a, newValue: b });
35
+ return;
36
+ }
37
+ // Both arrays
38
+ if (typeA === 'array') {
39
+ const arrA = a;
40
+ const arrB = b;
41
+ const maxLen = Math.max(arrA.length, arrB.length);
42
+ for (let i = 0; i < maxLen; i++) {
43
+ const itemPath = path ? `${path}[${i}]` : `[${i}]`;
44
+ if (i >= arrA.length) {
45
+ results.push({ path: itemPath, type: 'added', newValue: arrB[i] });
46
+ }
47
+ else if (i >= arrB.length) {
48
+ results.push({ path: itemPath, type: 'removed', oldValue: arrA[i] });
49
+ }
50
+ else {
51
+ diffRecursive(arrA[i], arrB[i], itemPath, results);
52
+ }
53
+ }
54
+ return;
55
+ }
56
+ // Both objects
57
+ if (typeA === 'object') {
58
+ const objA = a;
59
+ const objB = b;
60
+ const allKeys = new Set([...Object.keys(objA), ...Object.keys(objB)]);
61
+ for (const key of allKeys) {
62
+ const childPath = path ? `${path}.${key}` : key;
63
+ if (!(key in objA)) {
64
+ results.push({ path: childPath, type: 'added', newValue: objB[key] });
65
+ }
66
+ else if (!(key in objB)) {
67
+ results.push({ path: childPath, type: 'removed', oldValue: objA[key] });
68
+ }
69
+ else {
70
+ diffRecursive(objA[key], objB[key], childPath, results);
71
+ }
72
+ }
73
+ return;
74
+ }
75
+ // Primitives (string, number, boolean) — different values
76
+ if (a !== b) {
77
+ results.push({ path: path || '(root)', type: 'changed', oldValue: a, newValue: b });
78
+ }
79
+ }
80
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/content/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Field } from '@prisma/client';
2
+ /**
3
+ * Resolve localized field values for a specific locale.
4
+ *
5
+ * For localized fields, entry data stores:
6
+ * { "title": { "en": "Hello", "es": "Hola" }, "body": "Not localized" }
7
+ *
8
+ * This function extracts the value for the requested locale (with fallback
9
+ * to the default locale), and returns a flat object:
10
+ * { "title": "Hello", "body": "Not localized" }
11
+ */
12
+ export declare function resolveLocale(data: Record<string, unknown>, fields: Field[], locale: string, defaultLocale: string): Record<string, unknown>;
13
+ //# sourceMappingURL=localization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localization.d.ts","sourceRoot":"","sources":["../../src/content/localization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,KAAK,EAAE,EACf,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiCzB"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Resolve localized field values for a specific locale.
3
+ *
4
+ * For localized fields, entry data stores:
5
+ * { "title": { "en": "Hello", "es": "Hola" }, "body": "Not localized" }
6
+ *
7
+ * This function extracts the value for the requested locale (with fallback
8
+ * to the default locale), and returns a flat object:
9
+ * { "title": "Hello", "body": "Not localized" }
10
+ */
11
+ export function resolveLocale(data, fields, locale, defaultLocale) {
12
+ const localizedKeys = new Set(fields.filter((f) => f.localized).map((f) => f.key));
13
+ const resolved = {};
14
+ for (const [key, value] of Object.entries(data)) {
15
+ if (!localizedKeys.has(key)) {
16
+ // Non-localized field — pass through as-is
17
+ resolved[key] = value;
18
+ continue;
19
+ }
20
+ // Localized field — value should be an object keyed by locale code
21
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
22
+ const localeMap = value;
23
+ if (locale in localeMap) {
24
+ resolved[key] = localeMap[locale];
25
+ }
26
+ else if (defaultLocale in localeMap) {
27
+ resolved[key] = localeMap[defaultLocale];
28
+ }
29
+ else {
30
+ // Return first available locale value as last-resort fallback
31
+ const keys = Object.keys(localeMap);
32
+ resolved[key] = keys.length > 0 ? localeMap[keys[0]] : null;
33
+ }
34
+ }
35
+ else {
36
+ // Data not in expected locale-map format — pass through as-is
37
+ resolved[key] = value;
38
+ }
39
+ }
40
+ return resolved;
41
+ }
42
+ //# sourceMappingURL=localization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localization.js","sourceRoot":"","sources":["../../src/content/localization.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,IAA6B,EAC7B,MAAe,EACf,MAAc,EACd,aAAqB;IAErB,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CACpD,CAAC;IAEF,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,2CAA2C;YAC3C,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,SAAS;QACX,CAAC;QAED,mEAAmE;QACnE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,MAAM,SAAS,GAAG,KAAgC,CAAC;YACnD,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;gBACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;gBACtC,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,8DAA8D;gBAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,8DAA8D;YAC9D,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Field } from '@prisma/client';
2
+ /**
3
+ * Materialize an entry into the `published_documents` read-model table.
4
+ * Called immediately after a successful publish transaction.
5
+ *
6
+ * Loads the entry with its published version and content type, resolves
7
+ * all reference/media fields by batch-loading referenced entries, then
8
+ * upserts into `published_documents` with the fully resolved JSON.
9
+ */
10
+ export declare function materializeEntry(entryId: string): Promise<void>;
11
+ /**
12
+ * Remove an entry from the published_documents table.
13
+ * Called after unpublishing an entry.
14
+ */
15
+ export declare function dematerializeEntry(entryId: string): Promise<void>;
16
+ /**
17
+ * Batch-resolve reference and media fields in the data object.
18
+ *
19
+ * 1. Scans the field definitions for reference/media types
20
+ * 2. Collects all referenced entry IDs and asset IDs from the data
21
+ * 3. Batch loads referenced entries (from published_documents) in ONE query
22
+ * 4. Batch loads referenced assets in ONE query
23
+ * 5. Replaces IDs with resolved objects and returns the enriched data
24
+ */
25
+ export declare function batchResolveReferences(data: Record<string, unknown>, fields: Field[], spaceId: string): Promise<Record<string, unknown>>;
26
+ //# sourceMappingURL=materializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materializer.d.ts","sourceRoot":"","sources":["../../src/content/materializer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAU,MAAM,gBAAgB,CAAC;AAEpD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CrE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvE;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,KAAK,EAAE,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA4GlC"}