@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,530 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ url = env("DATABASE_URL")
8
+ }
9
+
10
+ // ─── Spaces (Multi-tenancy) ───
11
+
12
+ model Space {
13
+ id String @id @default(cuid())
14
+ name String
15
+ slug String @unique
16
+ whiteLabelConfig Json?
17
+ createdAt DateTime @default(now())
18
+ updatedAt DateTime @updatedAt
19
+
20
+ contentTypes ContentType[]
21
+ entries Entry[]
22
+ assets Asset[]
23
+ apiTokens ApiToken[]
24
+ previewTokens PreviewToken[]
25
+ webhooks Webhook[]
26
+ roleBindings RoleBinding[]
27
+ publishedDocuments PublishedDocument[]
28
+ blockDefinitions BlockDefinition[]
29
+ patterns Pattern[]
30
+ auditLogs AuditLog[]
31
+ locales Locale[]
32
+ taxonomies Taxonomy[]
33
+ comments Comment[]
34
+ environments Environment[]
35
+ redirects Redirect[]
36
+ extensionConfigs ExtensionConfig[]
37
+
38
+ @@map("spaces")
39
+ }
40
+
41
+ // ─── Users & Auth ───
42
+
43
+ model User {
44
+ id String @id @default(cuid())
45
+ email String @unique
46
+ passwordHash String
47
+ name String
48
+ avatarUrl String?
49
+ createdAt DateTime @default(now())
50
+ updatedAt DateTime @updatedAt
51
+
52
+ roleBindings RoleBinding[]
53
+ apiTokens ApiToken[]
54
+ previewTokens PreviewToken[]
55
+ entryVersions EntryVersion[]
56
+ auditLogs AuditLog[]
57
+ comments Comment[]
58
+
59
+ @@map("users")
60
+ }
61
+
62
+ model Role {
63
+ id String @id @default(cuid())
64
+ name String @unique // admin, editor, author, viewer
65
+ permissions Json // { "entry.create": true, "entry.publish": true, ... }
66
+ builtIn Boolean @default(false)
67
+ createdAt DateTime @default(now())
68
+
69
+ roleBindings RoleBinding[]
70
+
71
+ @@map("roles")
72
+ }
73
+
74
+ model RoleBinding {
75
+ id String @id @default(cuid())
76
+ userId String
77
+ roleId String
78
+ spaceId String
79
+ createdAt DateTime @default(now())
80
+
81
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
82
+ role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
83
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
84
+
85
+ @@unique([userId, roleId, spaceId])
86
+ @@map("role_bindings")
87
+ }
88
+
89
+ model ApiToken {
90
+ id String @id @default(cuid())
91
+ name String
92
+ tokenHash String @unique
93
+ scopes Json // ["cda:read", "cma:write"]
94
+ spaceId String
95
+ createdById String
96
+ expiresAt DateTime?
97
+ lastUsedAt DateTime?
98
+ createdAt DateTime @default(now())
99
+
100
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
101
+ createdBy User @relation(fields: [createdById], references: [id])
102
+
103
+ @@map("api_tokens")
104
+ }
105
+
106
+ model PreviewToken {
107
+ id String @id @default(cuid())
108
+ tokenHash String @unique
109
+ spaceId String
110
+ entryId String?
111
+ route String?
112
+ createdById String
113
+ expiresAt DateTime
114
+ createdAt DateTime @default(now())
115
+
116
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
117
+ entry Entry? @relation(fields: [entryId], references: [id])
118
+ createdBy User @relation(fields: [createdById], references: [id])
119
+
120
+ @@map("preview_tokens")
121
+ }
122
+
123
+ // ─── Schema Registry ───
124
+
125
+ model ContentType {
126
+ id String @id @default(cuid())
127
+ spaceId String
128
+ key String // "article", "page", "product"
129
+ name String // "Article"
130
+ description String?
131
+ version Int @default(1)
132
+ createdAt DateTime @default(now())
133
+ updatedAt DateTime @updatedAt
134
+
135
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
136
+ fields Field[]
137
+ entries Entry[]
138
+
139
+ @@unique([spaceId, key])
140
+ @@map("content_types")
141
+ }
142
+
143
+ model Field {
144
+ id String @id @default(cuid())
145
+ contentTypeId String
146
+ key String // "title", "body", "heroImage"
147
+ name String // "Title"
148
+ type String // text, richtext, number, boolean, date, media, reference, json, slug, enum
149
+ required Boolean @default(false)
150
+ unique Boolean @default(false)
151
+ localized Boolean @default(false)
152
+ validations Json? // { minLength: 1, maxLength: 255, ... }
153
+ defaultValue Json?
154
+ enumValues Json? // ["draft", "active", "archived"]
155
+ referenceTarget String? // content type key for reference fields
156
+ sortOrder Int @default(0)
157
+ createdAt DateTime @default(now())
158
+ updatedAt DateTime @updatedAt
159
+
160
+ contentType ContentType @relation(fields: [contentTypeId], references: [id], onDelete: Cascade)
161
+
162
+ @@unique([contentTypeId, key])
163
+ @@map("fields")
164
+ }
165
+
166
+ // ─── Content ───
167
+
168
+ model Entry {
169
+ id String @id @default(cuid())
170
+ spaceId String
171
+ contentTypeId String
172
+ slug String
173
+ createdAt DateTime @default(now())
174
+ updatedAt DateTime @updatedAt
175
+
176
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
177
+ contentType ContentType @relation(fields: [contentTypeId], references: [id])
178
+ versions EntryVersion[]
179
+ state EntryState?
180
+ previewTokens PreviewToken[]
181
+
182
+ @@unique([spaceId, contentTypeId, slug])
183
+ @@map("entries")
184
+ }
185
+
186
+ model EntryVersion {
187
+ id String @id @default(cuid())
188
+ entryId String
189
+ kind String // "draft" | "published"
190
+ data Json // { title: "Hello", body: [...] }
191
+ etag String
192
+ createdById String
193
+ createdAt DateTime @default(now())
194
+
195
+ entry Entry @relation(fields: [entryId], references: [id], onDelete: Cascade)
196
+ createdBy User @relation(fields: [createdById], references: [id])
197
+
198
+ // Reverse relations for entry state
199
+ draftStates EntryState[] @relation("DraftVersion")
200
+ publishedStates EntryState[] @relation("PublishedVersion")
201
+
202
+ @@index([entryId, createdAt(sort: Desc)])
203
+ @@map("entry_versions")
204
+ }
205
+
206
+ model EntryState {
207
+ id String @id @default(cuid())
208
+ entryId String @unique
209
+ status String @default("draft") // draft, published, scheduled, archived
210
+ draftVersionId String
211
+ publishedVersionId String?
212
+ scheduledAt DateTime?
213
+ scheduledUnpublishAt DateTime?
214
+ updatedAt DateTime @updatedAt
215
+
216
+ entry Entry @relation(fields: [entryId], references: [id], onDelete: Cascade)
217
+ draftVersion EntryVersion @relation("DraftVersion", fields: [draftVersionId], references: [id])
218
+ publishedVersion EntryVersion? @relation("PublishedVersion", fields: [publishedVersionId], references: [id])
219
+
220
+ @@map("entry_state")
221
+ }
222
+
223
+ // ─── Media ───
224
+
225
+ model Asset {
226
+ id String @id @default(cuid())
227
+ spaceId String
228
+ filename String
229
+ mimeType String
230
+ bytes Int
231
+ width Int?
232
+ height Int?
233
+ alt String?
234
+ caption String?
235
+ storageKey String // path in storage provider
236
+ checksum String?
237
+ createdById String?
238
+ createdAt DateTime @default(now())
239
+ updatedAt DateTime @updatedAt
240
+
241
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
242
+
243
+ @@map("assets")
244
+ }
245
+
246
+ // ─── Denormalized Read Model (CDA Performance) ───
247
+
248
+ model PublishedDocument {
249
+ id String @id @default(cuid())
250
+ spaceId String
251
+ entryId String @unique
252
+ contentTypeKey String
253
+ slug String
254
+ data Json // Pre-resolved JSON with references expanded
255
+ publishedAt DateTime
256
+ etag String
257
+ createdAt DateTime @default(now())
258
+ updatedAt DateTime @updatedAt
259
+
260
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
261
+
262
+ @@unique([spaceId, contentTypeKey, slug])
263
+ @@index([spaceId, contentTypeKey])
264
+ @@index([spaceId, slug])
265
+ @@map("published_documents")
266
+ }
267
+
268
+ // ─── Blocks ───
269
+
270
+ model BlockDefinition {
271
+ id String @id @default(cuid())
272
+ spaceId String
273
+ key String // "paragraph", "heading", "image", "callout"
274
+ version String @default("1.0.0")
275
+ title String
276
+ description String?
277
+ icon String? // emoji or icon identifier
278
+ attributesSchema Json // JSON Schema for block attributes
279
+ allowedChildren Json? // array of block keys allowed as children, null = any
280
+ builtIn Boolean @default(false) // core blocks shipped with HTMLess
281
+ createdAt DateTime @default(now())
282
+ updatedAt DateTime @updatedAt
283
+
284
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
285
+
286
+ @@unique([spaceId, key, version])
287
+ @@map("block_definitions")
288
+ }
289
+
290
+ model Pattern {
291
+ id String @id @default(cuid())
292
+ spaceId String
293
+ title String
294
+ description String?
295
+ blockTree Json // array of BlockInstance objects
296
+ typeKeys Json? // content type keys this pattern applies to, null = any
297
+ createdAt DateTime @default(now())
298
+ updatedAt DateTime @updatedAt
299
+
300
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
301
+
302
+ @@map("patterns")
303
+ }
304
+
305
+ // ─── Webhooks ───
306
+
307
+ model Webhook {
308
+ id String @id @default(cuid())
309
+ spaceId String
310
+ url String
311
+ events Json // ["entry.published", "asset.created"]
312
+ signingSecret String
313
+ active Boolean @default(true)
314
+ createdAt DateTime @default(now())
315
+ updatedAt DateTime @updatedAt
316
+
317
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
318
+ deliveries WebhookDelivery[]
319
+
320
+ @@map("webhooks")
321
+ }
322
+
323
+ model WebhookDelivery {
324
+ id String @id @default(cuid())
325
+ webhookId String
326
+ eventType String
327
+ payload Json
328
+ statusCode Int?
329
+ responseTime Int? // ms
330
+ attempt Int @default(1)
331
+ success Boolean @default(false)
332
+ error String?
333
+ createdAt DateTime @default(now())
334
+
335
+ webhook Webhook @relation(fields: [webhookId], references: [id], onDelete: Cascade)
336
+
337
+ @@index([webhookId, createdAt(sort: Desc)])
338
+ @@map("webhook_deliveries")
339
+ }
340
+
341
+ // ─── Audit ───
342
+
343
+ model AuditLog {
344
+ id String @id @default(cuid())
345
+ spaceId String
346
+ userId String?
347
+ action String // "entry.created", "schema.updated", "user.login"
348
+ resource String? // "entry:ent_123", "contentType:article"
349
+ meta Json?
350
+ createdAt DateTime @default(now())
351
+
352
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
353
+ user User? @relation(fields: [userId], references: [id])
354
+
355
+ @@index([spaceId, createdAt(sort: Desc)])
356
+ @@map("audit_logs")
357
+ }
358
+
359
+ // ─── Redirects ───
360
+
361
+ model Redirect {
362
+ id String @id @default(cuid())
363
+ spaceId String
364
+ fromSlug String
365
+ toSlug String
366
+ statusCode Int @default(301) // 301 or 302
367
+ createdAt DateTime @default(now())
368
+
369
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
370
+
371
+ @@unique([spaceId, fromSlug])
372
+ @@map("redirects")
373
+ }
374
+
375
+ // ─── Localization ───
376
+
377
+ model Locale {
378
+ id String @id @default(cuid())
379
+ spaceId String
380
+ code String // "en", "es", "fr", "de"
381
+ name String // "English", "Spanish"
382
+ isDefault Boolean @default(false)
383
+ createdAt DateTime @default(now())
384
+
385
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
386
+
387
+ @@unique([spaceId, code])
388
+ @@map("locales")
389
+ }
390
+
391
+ // ─── Taxonomies ───
392
+
393
+ model Taxonomy {
394
+ id String @id @default(cuid())
395
+ spaceId String
396
+ key String
397
+ name String
398
+ hierarchical Boolean @default(false)
399
+ createdAt DateTime @default(now())
400
+ updatedAt DateTime @updatedAt
401
+
402
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
403
+ terms TaxonomyTerm[]
404
+
405
+ @@unique([spaceId, key])
406
+ @@map("taxonomies")
407
+ }
408
+
409
+ model TaxonomyTerm {
410
+ id String @id @default(cuid())
411
+ taxonomyId String
412
+ slug String
413
+ name String
414
+ parentId String?
415
+ sortOrder Int @default(0)
416
+ createdAt DateTime @default(now())
417
+
418
+ taxonomy Taxonomy @relation(fields: [taxonomyId], references: [id], onDelete: Cascade)
419
+ parent TaxonomyTerm? @relation("TermParent", fields: [parentId], references: [id])
420
+ children TaxonomyTerm[] @relation("TermParent")
421
+
422
+ @@unique([taxonomyId, slug])
423
+ @@map("taxonomy_terms")
424
+ }
425
+
426
+ // ─── Editorial Collaboration ───
427
+
428
+ model Comment {
429
+ id String @id @default(cuid())
430
+ spaceId String
431
+ entryId String
432
+ userId String
433
+ body String
434
+ parentId String?
435
+ resolved Boolean @default(false)
436
+ createdAt DateTime @default(now())
437
+ updatedAt DateTime @updatedAt
438
+
439
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
440
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
441
+ parent Comment? @relation("CommentThread", fields: [parentId], references: [id], onDelete: Cascade)
442
+ replies Comment[] @relation("CommentThread")
443
+
444
+ @@index([entryId, createdAt])
445
+ @@map("comments")
446
+ }
447
+
448
+ // ─── Environments ───
449
+
450
+ model Environment {
451
+ id String @id @default(cuid())
452
+ spaceId String
453
+ name String // "Production", "Staging", "Development"
454
+ slug String // "production", "staging", "development"
455
+ isDefault Boolean @default(false)
456
+ createdAt DateTime @default(now())
457
+
458
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
459
+
460
+ @@unique([spaceId, slug])
461
+ @@map("environments")
462
+ }
463
+
464
+ // ─── Extension Config Storage ───
465
+
466
+ model ExtensionConfig {
467
+ id String @id @default(cuid())
468
+ spaceId String
469
+ extensionKey String
470
+ configKey String
471
+ value Json
472
+ createdAt DateTime @default(now())
473
+ updatedAt DateTime @updatedAt
474
+
475
+ space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
476
+
477
+ @@unique([spaceId, extensionKey, configKey])
478
+ @@map("extension_configs")
479
+ }
480
+
481
+ // ─── Marketplace ───
482
+
483
+ model MarketplaceListing {
484
+ id String @id @default(cuid())
485
+ extensionKey String @unique
486
+ name String
487
+ description String
488
+ longDescription String?
489
+ author String
490
+ authorEmail String?
491
+ repository String?
492
+ homepage String?
493
+ iconUrl String?
494
+ screenshotUrls Json? // string[]
495
+ category String // ai, analytics, commerce, media, seo, notifications, integration, utility
496
+ tags Json? // string[]
497
+ pricing String @default("free") // free, paid, freemium
498
+ priceMonthly Int? // cents
499
+ license String @default("MIT")
500
+ version String
501
+ manifest Json // full ExtensionManifest
502
+ downloads Int @default(0)
503
+ rating Float?
504
+ reviewCount Int @default(0)
505
+ status String @default("pending") // pending, approved, rejected, suspended
506
+ rejectionReason String?
507
+ submittedAt DateTime @default(now())
508
+ approvedAt DateTime?
509
+ createdAt DateTime @default(now())
510
+ updatedAt DateTime @updatedAt
511
+
512
+ reviews MarketplaceReview[]
513
+
514
+ @@map("marketplace_listings")
515
+ }
516
+
517
+ model MarketplaceReview {
518
+ id String @id @default(cuid())
519
+ listingId String
520
+ userId String
521
+ rating Int // 1-5
522
+ title String?
523
+ body String?
524
+ createdAt DateTime @default(now())
525
+
526
+ listing MarketplaceListing @relation(fields: [listingId], references: [id], onDelete: Cascade)
527
+
528
+ @@unique([listingId, userId])
529
+ @@map("marketplace_reviews")
530
+ }
package/prisma/seed.ts ADDED
@@ -0,0 +1,154 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ import bcrypt from 'bcryptjs';
3
+
4
+ const prisma = new PrismaClient();
5
+
6
+ async function main() {
7
+ // Create built-in roles
8
+ const adminRole = await prisma.role.upsert({
9
+ where: { name: 'admin' },
10
+ update: {},
11
+ create: {
12
+ name: 'admin',
13
+ builtIn: true,
14
+ permissions: {
15
+ 'space.manage': true,
16
+ 'schema.admin': true,
17
+ 'entry.create': true,
18
+ 'entry.read': true,
19
+ 'entry.update': true,
20
+ 'entry.delete': true,
21
+ 'entry.publish': true,
22
+ 'asset.upload': true,
23
+ 'asset.delete': true,
24
+ 'webhook.manage': true,
25
+ 'token.manage': true,
26
+ 'user.manage': true,
27
+ },
28
+ },
29
+ });
30
+
31
+ const editorRole = await prisma.role.upsert({
32
+ where: { name: 'editor' },
33
+ update: {},
34
+ create: {
35
+ name: 'editor',
36
+ builtIn: true,
37
+ permissions: {
38
+ 'entry.create': true,
39
+ 'entry.read': true,
40
+ 'entry.update': true,
41
+ 'entry.publish': true,
42
+ 'asset.upload': true,
43
+ },
44
+ },
45
+ });
46
+
47
+ const authorRole = await prisma.role.upsert({
48
+ where: { name: 'author' },
49
+ update: {},
50
+ create: {
51
+ name: 'author',
52
+ builtIn: true,
53
+ permissions: {
54
+ 'entry.create': true,
55
+ 'entry.read': true,
56
+ 'entry.update': true,
57
+ 'asset.upload': true,
58
+ },
59
+ },
60
+ });
61
+
62
+ await prisma.role.upsert({
63
+ where: { name: 'viewer' },
64
+ update: {},
65
+ create: {
66
+ name: 'viewer',
67
+ builtIn: true,
68
+ permissions: {
69
+ 'entry.read': true,
70
+ },
71
+ },
72
+ });
73
+
74
+ // Create default admin user
75
+ const passwordHash = await bcrypt.hash('admin123', 12);
76
+ const admin = await prisma.user.upsert({
77
+ where: { email: 'admin@htmless.com' },
78
+ update: {},
79
+ create: {
80
+ email: 'admin@htmless.com',
81
+ name: 'Admin',
82
+ passwordHash,
83
+ },
84
+ });
85
+
86
+ // Create default space
87
+ const space = await prisma.space.upsert({
88
+ where: { slug: 'default' },
89
+ update: {},
90
+ create: {
91
+ name: 'Default Space',
92
+ slug: 'default',
93
+ },
94
+ });
95
+
96
+ // Bind admin to space
97
+ await prisma.roleBinding.upsert({
98
+ where: {
99
+ userId_roleId_spaceId: {
100
+ userId: admin.id,
101
+ roleId: adminRole.id,
102
+ spaceId: space.id,
103
+ },
104
+ },
105
+ update: {},
106
+ create: {
107
+ userId: admin.id,
108
+ roleId: adminRole.id,
109
+ spaceId: space.id,
110
+ },
111
+ });
112
+
113
+ // Create sample content type
114
+ const articleType = await prisma.contentType.upsert({
115
+ where: { spaceId_key: { spaceId: space.id, key: 'article' } },
116
+ update: {},
117
+ create: {
118
+ spaceId: space.id,
119
+ key: 'article',
120
+ name: 'Article',
121
+ description: 'Blog articles and posts',
122
+ },
123
+ });
124
+
125
+ // Create fields for article
126
+ const fields = [
127
+ { key: 'title', name: 'Title', type: 'text', required: true, sortOrder: 0 },
128
+ { key: 'slug', name: 'Slug', type: 'slug', required: true, unique: true, sortOrder: 1 },
129
+ { key: 'excerpt', name: 'Excerpt', type: 'text', required: false, sortOrder: 2 },
130
+ { key: 'body', name: 'Body', type: 'richtext', required: true, sortOrder: 3 },
131
+ { key: 'featuredImage', name: 'Featured Image', type: 'media', required: false, sortOrder: 4 },
132
+ ];
133
+
134
+ for (const field of fields) {
135
+ await prisma.field.upsert({
136
+ where: { contentTypeId_key: { contentTypeId: articleType.id, key: field.key } },
137
+ update: {},
138
+ create: {
139
+ contentTypeId: articleType.id,
140
+ ...field,
141
+ },
142
+ });
143
+ }
144
+
145
+ console.log('Seed complete:');
146
+ console.log(` Roles: admin, editor, author, viewer`);
147
+ console.log(` User: admin@htmless.com (password: admin123)`);
148
+ console.log(` Space: ${space.slug} (${space.id})`);
149
+ console.log(` Content Type: article with ${fields.length} fields`);
150
+ }
151
+
152
+ main()
153
+ .catch(console.error)
154
+ .finally(() => prisma.$disconnect());