@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,92 @@
1
+ import { Router } from 'express';
2
+ import { prisma } from '../../db.js';
3
+ const router = Router();
4
+ // ── GET /blocks/definitions ─────────────────────────────────────────
5
+ router.get('/definitions', async (req, res) => {
6
+ const spaceId = req.headers['x-space-id'];
7
+ if (!spaceId) {
8
+ res.status(400).json({ error: 'missing_space', message: 'X-Space-Id header is required' });
9
+ return;
10
+ }
11
+ const definitions = await prisma.blockDefinition.findMany({
12
+ where: { spaceId },
13
+ orderBy: { key: 'asc' },
14
+ });
15
+ res
16
+ .set('Cache-Control', 'public, max-age=60')
17
+ .json({ items: definitions, total: definitions.length });
18
+ });
19
+ // ── GET /blocks/definitions/:key ────────────────────────────────────
20
+ router.get('/definitions/:key', async (req, res) => {
21
+ const spaceId = req.headers['x-space-id'];
22
+ if (!spaceId) {
23
+ res.status(400).json({ error: 'missing_space', message: 'X-Space-Id header is required' });
24
+ return;
25
+ }
26
+ const key = req.params.key;
27
+ // Return the latest version
28
+ const definition = await prisma.blockDefinition.findFirst({
29
+ where: { spaceId, key },
30
+ orderBy: { version: 'desc' },
31
+ });
32
+ if (!definition) {
33
+ res.status(404).json({ error: 'not_found', message: `Block definition "${key}" not found` });
34
+ return;
35
+ }
36
+ res
37
+ .set('Cache-Control', 'public, max-age=60')
38
+ .json(definition);
39
+ });
40
+ // ── GET /blocks/patterns ────────────────────────────────────────────
41
+ router.get('/patterns', async (req, res) => {
42
+ const spaceId = req.headers['x-space-id'];
43
+ if (!spaceId) {
44
+ res.status(400).json({ error: 'missing_space', message: 'X-Space-Id header is required' });
45
+ return;
46
+ }
47
+ const typeKey = req.query.typeKey;
48
+ let patterns;
49
+ if (typeKey) {
50
+ // Filter patterns whose typeKeys array contains the given key (or typeKeys is null = applies to all)
51
+ patterns = await prisma.pattern.findMany({
52
+ where: { spaceId },
53
+ orderBy: { title: 'asc' },
54
+ });
55
+ // Post-filter: include patterns where typeKeys is null (any) or contains the key
56
+ patterns = patterns.filter((p) => {
57
+ if (p.typeKeys === null)
58
+ return true;
59
+ const keys = p.typeKeys;
60
+ return Array.isArray(keys) && keys.includes(typeKey);
61
+ });
62
+ }
63
+ else {
64
+ patterns = await prisma.pattern.findMany({
65
+ where: { spaceId },
66
+ orderBy: { title: 'asc' },
67
+ });
68
+ }
69
+ res
70
+ .set('Cache-Control', 'public, max-age=60')
71
+ .json({ items: patterns, total: patterns.length });
72
+ });
73
+ // ── GET /blocks/patterns/:id ────────────────────────────────────────
74
+ router.get('/patterns/:id', async (req, res) => {
75
+ const spaceId = req.headers['x-space-id'];
76
+ if (!spaceId) {
77
+ res.status(400).json({ error: 'missing_space', message: 'X-Space-Id header is required' });
78
+ return;
79
+ }
80
+ const pattern = await prisma.pattern.findFirst({
81
+ where: { id: req.params.id, spaceId },
82
+ });
83
+ if (!pattern) {
84
+ res.status(404).json({ error: 'not_found', message: 'Pattern not found' });
85
+ return;
86
+ }
87
+ res
88
+ .set('Cache-Control', 'public, max-age=60')
89
+ .json(pattern);
90
+ });
91
+ export default router;
92
+ //# sourceMappingURL=blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../src/api/cda/blocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Router as IRouter } from 'express';
2
+ declare const router: IRouter;
3
+ export default router;
4
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../src/api/cda/content.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAoBjD,QAAA,MAAM,MAAM,EAAE,OAAkB,CAAC;AA6NjC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,192 @@
1
+ import { Router } from 'express';
2
+ import { createHash } from 'crypto';
3
+ import { prisma } from '../../db.js';
4
+ import { parseFields, projectFields } from '../../utils/query-shaping.js';
5
+ import { getCachedResponse, setCachedResponse, buildCacheKey, } from '../../content/cache.js';
6
+ import { parseFilters, parseSortDirectives, applyFilters, applySorting, } from '../../content/advanced-query.js';
7
+ import { trackCacheHit, trackCacheMiss } from '../../cache/observability.js';
8
+ import { addCacheTag, buildSurrogateKeyTags } from '../../cache/tags.js';
9
+ const router = Router();
10
+ const CACHE_TTL = 60; // seconds
11
+ /**
12
+ * Compute a weak ETag from a JSON-serialisable value.
13
+ */
14
+ function computeEtag(value) {
15
+ const hash = createHash('md5').update(JSON.stringify(value)).digest('hex');
16
+ return `W/"${hash}"`;
17
+ }
18
+ /**
19
+ * Hash query parameters into a short, deterministic string for cache keys.
20
+ */
21
+ function hashQuery(params) {
22
+ const sorted = JSON.stringify(params, Object.keys(params).sort());
23
+ return createHash('md5').update(sorted).digest('hex').slice(0, 12);
24
+ }
25
+ // ── GET /content/:typeKey ────────────────────────────────────────────
26
+ router.get('/:typeKey', async (req, res) => {
27
+ const spaceId = req.headers['x-space-id'];
28
+ if (!spaceId) {
29
+ res.status(400).json({ error: 'missing_space', message: 'X-Space-Id header is required' });
30
+ return;
31
+ }
32
+ const typeKey = req.params.typeKey;
33
+ const slug = req.query.slug;
34
+ const page = Math.max(1, parseInt(req.query.page, 10) || 1);
35
+ const limit = Math.min(100, Math.max(1, parseInt(req.query.limit, 10) || 25));
36
+ const fields = parseFields(req.query.fields);
37
+ const sortParam = req.query.sort;
38
+ // ── Redis cache check ──
39
+ const qHash = hashQuery({ ...req.query, page, limit });
40
+ const cacheKey = buildCacheKey(spaceId, typeKey, slug ?? 'list', qHash);
41
+ const cached = await getCachedResponse(cacheKey);
42
+ if (cached) {
43
+ trackCacheHit().catch(() => { });
44
+ const parsed = JSON.parse(cached);
45
+ const etag = parsed.etag;
46
+ if (req.headers['if-none-match'] === etag) {
47
+ res.status(304).end();
48
+ return;
49
+ }
50
+ res
51
+ .set('Cache-Control', 'public, max-age=60, stale-while-revalidate=300')
52
+ .set('ETag', etag)
53
+ .set('Surrogate-Key', `space:${spaceId} type:${typeKey}`)
54
+ .set('Content-Type', 'application/json')
55
+ .send(JSON.stringify(parsed.body));
56
+ return;
57
+ }
58
+ trackCacheMiss().catch(() => { });
59
+ // ── Parse advanced filters & sort ──
60
+ const filterConditions = parseFilters(req.query);
61
+ const sortDirectives = parseSortDirectives(sortParam);
62
+ // ── Query published_documents (single table, no joins) ──
63
+ const where = {
64
+ spaceId,
65
+ contentTypeKey: typeKey,
66
+ ...(slug ? { slug } : {}),
67
+ };
68
+ const docs = await prisma.publishedDocument.findMany({
69
+ where,
70
+ orderBy: { publishedAt: 'desc' },
71
+ });
72
+ // ── Apply in-memory filters ──
73
+ let items = docs.map((doc) => ({
74
+ id: doc.entryId,
75
+ type: doc.contentTypeKey,
76
+ slug: doc.slug,
77
+ data: (doc.data ?? {}),
78
+ publishedAt: doc.publishedAt.toISOString(),
79
+ updatedAt: doc.updatedAt.toISOString(),
80
+ }));
81
+ if (filterConditions.length > 0) {
82
+ items = items.filter((item) => applyFilters(filterConditions, item.data));
83
+ }
84
+ // ── Apply sorting ──
85
+ if (sortDirectives.length > 0) {
86
+ items = applySorting(items, sortDirectives);
87
+ }
88
+ // ── Pagination (post-filter) ──
89
+ const total = items.length;
90
+ const skip = (page - 1) * limit;
91
+ const paged = items.slice(skip, skip + limit);
92
+ // ── Field projection ──
93
+ const projected = paged.map((item) => ({
94
+ ...item,
95
+ data: projectFields(item.data, fields),
96
+ }));
97
+ const body = {
98
+ items: projected,
99
+ pagination: {
100
+ page,
101
+ limit,
102
+ total,
103
+ totalPages: Math.ceil(total / limit),
104
+ },
105
+ };
106
+ const etag = computeEtag(body);
107
+ // ── ETag match ──
108
+ if (req.headers['if-none-match'] === etag) {
109
+ res.status(304).end();
110
+ return;
111
+ }
112
+ // ── Cache the response + register Surrogate-Key tags ──
113
+ setCachedResponse(cacheKey, JSON.stringify({ etag, body }), CACHE_TTL).catch(() => { });
114
+ const surrogateKeys = buildSurrogateKeyTags(spaceId, typeKey);
115
+ addCacheTag(cacheKey, surrogateKeys).catch(() => { });
116
+ res
117
+ .set('Cache-Control', 'public, max-age=60, stale-while-revalidate=300')
118
+ .set('ETag', etag)
119
+ .set('Surrogate-Key', surrogateKeys.join(' '))
120
+ .json(body);
121
+ });
122
+ // ── GET /content/:typeKey/:id ────────────────────────────────────────
123
+ router.get('/:typeKey/:id', async (req, res) => {
124
+ const spaceId = req.headers['x-space-id'];
125
+ if (!spaceId) {
126
+ res.status(400).json({ error: 'missing_space', message: 'X-Space-Id header is required' });
127
+ return;
128
+ }
129
+ const typeKey = req.params.typeKey;
130
+ const id = req.params.id;
131
+ const fields = parseFields(req.query.fields);
132
+ // ── Redis cache check ──
133
+ const qHash = hashQuery({ fields: req.query.fields });
134
+ const cacheKey = buildCacheKey(spaceId, typeKey, id, qHash);
135
+ const cached = await getCachedResponse(cacheKey);
136
+ if (cached) {
137
+ trackCacheHit().catch(() => { });
138
+ const parsed = JSON.parse(cached);
139
+ const etag = parsed.etag;
140
+ if (req.headers['if-none-match'] === etag) {
141
+ res.status(304).end();
142
+ return;
143
+ }
144
+ res
145
+ .set('Cache-Control', 'public, max-age=60, stale-while-revalidate=300')
146
+ .set('ETag', etag)
147
+ .set('Surrogate-Key', `space:${spaceId} type:${typeKey} entry:${id}`)
148
+ .set('Content-Type', 'application/json')
149
+ .send(JSON.stringify(parsed.body));
150
+ return;
151
+ }
152
+ trackCacheMiss().catch(() => { });
153
+ // ── Single-row lookup from published_documents ──
154
+ const doc = await prisma.publishedDocument.findFirst({
155
+ where: {
156
+ spaceId,
157
+ contentTypeKey: typeKey,
158
+ entryId: id,
159
+ },
160
+ });
161
+ if (!doc) {
162
+ res.status(404).json({ error: 'not_found', message: 'Entry not found or not published' });
163
+ return;
164
+ }
165
+ const rawData = (doc.data ?? {});
166
+ const data = projectFields(rawData, fields);
167
+ const body = {
168
+ id: doc.entryId,
169
+ type: doc.contentTypeKey,
170
+ slug: doc.slug,
171
+ data,
172
+ publishedAt: doc.publishedAt.toISOString(),
173
+ updatedAt: doc.updatedAt.toISOString(),
174
+ };
175
+ const etag = computeEtag(body);
176
+ // ── ETag match ──
177
+ if (req.headers['if-none-match'] === etag) {
178
+ res.status(304).end();
179
+ return;
180
+ }
181
+ // ── Cache the response + register Surrogate-Key tags ──
182
+ setCachedResponse(cacheKey, JSON.stringify({ etag, body }), CACHE_TTL).catch(() => { });
183
+ const surrogateKeys = buildSurrogateKeyTags(spaceId, typeKey, id);
184
+ addCacheTag(cacheKey, surrogateKeys).catch(() => { });
185
+ res
186
+ .set('Cache-Control', 'public, max-age=60, stale-while-revalidate=300')
187
+ .set('ETag', etag)
188
+ .set('Surrogate-Key', surrogateKeys.join(' '))
189
+ .json(body);
190
+ });
191
+ export default router;
192
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/api/cda/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Router as IRouter } from 'express';
2
+ declare const router: IRouter;
3
+ export default router;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/cda/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAUjD,QAAA,MAAM,MAAM,EAAE,OAAkB,CAAC;AAajC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Router } from 'express';
2
+ import { authenticate } from '../../auth/middleware.js';
3
+ import contentRoutes from './content.js';
4
+ import schemasRoutes from './schemas.js';
5
+ import assetsRoutes from './assets.js';
6
+ import mediaRoutes from './media.js';
7
+ import blocksRoutes from './blocks.js';
8
+ import taxonomiesRoutes from './taxonomies.js';
9
+ import redirectsRoutes from './redirects.js';
10
+ const router = Router();
11
+ // CDA is public or token-gated — auth not strictly required
12
+ router.use(authenticate({ required: false }));
13
+ router.use('/content', contentRoutes);
14
+ router.use('/schemas', schemasRoutes);
15
+ router.use('/assets', assetsRoutes);
16
+ router.use('/media', mediaRoutes);
17
+ router.use('/blocks', blocksRoutes);
18
+ router.use('/taxonomies', taxonomiesRoutes);
19
+ router.use('/redirects', redirectsRoutes);
20
+ export default router;
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/cda/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,aAAa,MAAM,cAAc,CAAC;AACzC,OAAO,aAAa,MAAM,cAAc,CAAC;AACzC,OAAO,YAAY,MAAM,aAAa,CAAC;AACvC,OAAO,WAAW,MAAM,YAAY,CAAC;AACrC,OAAO,YAAY,MAAM,aAAa,CAAC;AACvC,OAAO,gBAAgB,MAAM,iBAAiB,CAAC;AAC/C,OAAO,eAAe,MAAM,gBAAgB,CAAC;AAE7C,MAAM,MAAM,GAAY,MAAM,EAAE,CAAC;AAEjC,4DAA4D;AAC5D,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAE9C,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACtC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACtC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAClC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACpC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAC5C,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAE1C,eAAe,MAAM,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Router as IRouter } from 'express';
2
+ declare const router: IRouter;
3
+ export default router;
4
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/api/cda/media.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,OAAO,EAAqB,MAAM,SAAS,CAAC;AAUpE,QAAA,MAAM,MAAM,EAAE,OAAkB,CAAC;AA6HjC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { Router } from 'express';
2
+ import { existsSync, readFileSync } from 'fs';
3
+ import { LocalStorageProvider, getStorageProvider } from '../../media/storage.js';
4
+ import { transformImage, parseTransformParams, buildTransformHeaders, } from '../../media/transforms-engine.js';
5
+ import { getPreset } from '../../media/presets.js';
6
+ const router = Router();
7
+ // ─── MIME to extension fallback map ─────────────────────────────────
8
+ const EXTENSION_TO_MIME = {
9
+ '.jpg': 'image/jpeg',
10
+ '.jpeg': 'image/jpeg',
11
+ '.png': 'image/png',
12
+ '.gif': 'image/gif',
13
+ '.webp': 'image/webp',
14
+ '.avif': 'image/avif',
15
+ '.svg': 'image/svg+xml',
16
+ '.pdf': 'application/pdf',
17
+ '.mp4': 'video/mp4',
18
+ '.webm': 'video/webm',
19
+ '.json': 'application/json',
20
+ '.txt': 'text/plain',
21
+ '.csv': 'text/csv',
22
+ '.html': 'text/html',
23
+ '.css': 'text/css',
24
+ '.js': 'application/javascript',
25
+ '.zip': 'application/zip',
26
+ '.gz': 'application/gzip',
27
+ '.mp3': 'audio/mpeg',
28
+ '.wav': 'audio/wav',
29
+ '.ogg': 'audio/ogg',
30
+ };
31
+ function guessMime(filename) {
32
+ const dot = filename.lastIndexOf('.');
33
+ if (dot === -1)
34
+ return 'application/octet-stream';
35
+ const ext = filename.slice(dot).toLowerCase();
36
+ return EXTENSION_TO_MIME[ext] ?? 'application/octet-stream';
37
+ }
38
+ // ─── GET /media/* ───────────────────────────────────────────────────
39
+ // Serves a stored file by its storage key.
40
+ // Supports optional transform query params (w, h, fm) that are
41
+ // currently no-ops but reserved for future server-side transforms.
42
+ //
43
+ // Express 5 no longer accepts unnamed wildcard routes like `/*`,
44
+ // so we match everything mounted under `/media` and derive the key
45
+ // from the remaining request path instead.
46
+ router.use(async (req, res) => {
47
+ const storageKey = decodeURIComponent(req.path.replace(/^\/+/, ''));
48
+ if (!storageKey) {
49
+ res.status(400).json({ error: 'validation_error', message: 'Storage key is required' });
50
+ return;
51
+ }
52
+ const provider = getStorageProvider();
53
+ // For LocalStorageProvider we can resolve the path directly
54
+ let filePath;
55
+ if (provider instanceof LocalStorageProvider) {
56
+ filePath = provider.resolve(storageKey);
57
+ }
58
+ else {
59
+ // Future: stream from S3 / GCS etc.
60
+ res.status(501).json({ error: 'not_implemented', message: 'Remote storage delivery not yet implemented' });
61
+ return;
62
+ }
63
+ if (!existsSync(filePath)) {
64
+ res.status(404).json({ error: 'not_found', message: 'File not found' });
65
+ return;
66
+ }
67
+ const contentType = guessMime(storageKey);
68
+ const fileBuffer = readFileSync(filePath);
69
+ // Parse transform query params (w, h, fit, fm, q, fp_x, fp_y, preset)
70
+ const query = req.query;
71
+ // If a preset is specified, merge its params (explicit params override preset)
72
+ let transformParams = parseTransformParams(query);
73
+ if (query.preset) {
74
+ const preset = getPreset(query.preset);
75
+ if (preset) {
76
+ transformParams = {
77
+ w: preset.w,
78
+ h: preset.h,
79
+ fit: preset.fit,
80
+ fm: preset.fm,
81
+ q: preset.q,
82
+ ...Object.fromEntries(Object.entries(transformParams).filter(([, v]) => v !== undefined)),
83
+ };
84
+ }
85
+ }
86
+ const hasTransforms = transformParams.w !== undefined ||
87
+ transformParams.h !== undefined ||
88
+ transformParams.fit !== undefined ||
89
+ transformParams.fm !== undefined ||
90
+ transformParams.q !== undefined;
91
+ let outputBuffer = fileBuffer;
92
+ if (hasTransforms) {
93
+ try {
94
+ outputBuffer = await transformImage(Buffer.from(fileBuffer), transformParams);
95
+ }
96
+ catch (err) {
97
+ res.status(400).json({
98
+ error: 'transform_error',
99
+ message: err instanceof Error ? err.message : 'Invalid transform parameters',
100
+ });
101
+ return;
102
+ }
103
+ }
104
+ // Build transform headers (describes requested/applied transforms)
105
+ const transformHeaders = hasTransforms ? buildTransformHeaders(transformParams) : {};
106
+ res
107
+ .set('Content-Type', contentType)
108
+ .set('Content-Length', String(outputBuffer.length))
109
+ .set('Cache-Control', 'public, max-age=31536000, immutable')
110
+ .set(transformHeaders)
111
+ .end(outputBuffer);
112
+ });
113
+ export default router;
114
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/api/cda/media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Router as IRouter } from 'express';
2
+ declare const router: IRouter;
3
+ export default router;
4
+ //# sourceMappingURL=redirects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../../src/api/cda/redirects.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,OAAO,EAAqB,MAAM,SAAS,CAAC;AAGpE,QAAA,MAAM,MAAM,EAAE,OAAkB,CAAC;AA2EjC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { Router } from 'express';
2
+ import { prisma } from '../../db.js';
3
+ const router = Router();
4
+ // ─── GET /redirects ───
5
+ // Lists all redirects for the space.
6
+ router.get('/', async (req, res) => {
7
+ const spaceId = req.headers['x-space-id'];
8
+ if (!spaceId) {
9
+ res.status(400).json({ error: 'missing_space', message: 'X-Space-Id header is required' });
10
+ return;
11
+ }
12
+ const page = Math.max(1, parseInt(req.query.page, 10) || 1);
13
+ const limit = Math.min(100, Math.max(1, parseInt(req.query.limit, 10) || 25));
14
+ const skip = (page - 1) * limit;
15
+ const [redirects, total] = await Promise.all([
16
+ prisma.redirect.findMany({
17
+ where: { spaceId },
18
+ orderBy: { createdAt: 'desc' },
19
+ take: limit,
20
+ skip,
21
+ }),
22
+ prisma.redirect.count({ where: { spaceId } }),
23
+ ]);
24
+ res
25
+ .set('Cache-Control', 'public, max-age=60')
26
+ .json({
27
+ items: redirects.map((r) => ({
28
+ id: r.id,
29
+ fromSlug: r.fromSlug,
30
+ toSlug: r.toSlug,
31
+ statusCode: r.statusCode,
32
+ createdAt: r.createdAt.toISOString(),
33
+ })),
34
+ pagination: {
35
+ page,
36
+ limit,
37
+ total,
38
+ totalPages: Math.ceil(total / limit),
39
+ },
40
+ });
41
+ });
42
+ // ─── GET /redirects/:slug ───
43
+ // Looks up a redirect by the source slug.
44
+ router.get('/:slug', async (req, res) => {
45
+ const spaceId = req.headers['x-space-id'];
46
+ if (!spaceId) {
47
+ res.status(400).json({ error: 'missing_space', message: 'X-Space-Id header is required' });
48
+ return;
49
+ }
50
+ const slug = req.params.slug;
51
+ const redirect = await prisma.redirect.findUnique({
52
+ where: { spaceId_fromSlug: { spaceId, fromSlug: slug } },
53
+ });
54
+ if (!redirect) {
55
+ res.status(404).json({ error: 'not_found', message: 'No redirect found for this slug' });
56
+ return;
57
+ }
58
+ res
59
+ .set('Cache-Control', 'public, max-age=300')
60
+ .json({
61
+ id: redirect.id,
62
+ fromSlug: redirect.fromSlug,
63
+ toSlug: redirect.toSlug,
64
+ statusCode: redirect.statusCode,
65
+ createdAt: redirect.createdAt.toISOString(),
66
+ });
67
+ });
68
+ export default router;
69
+ //# sourceMappingURL=redirects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects.js","sourceRoot":"","sources":["../../../src/api/cda/redirects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Router as IRouter } from 'express';
2
+ declare const router: IRouter;
3
+ export default router;
4
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/api/cda/schemas.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAMjD,QAAA,MAAM,MAAM,EAAE,OAAkB,CAAC;AA0HjC,eAAe,MAAM,CAAC"}