@aphexcms/cms-core 9.4.0 → 9.5.1

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 (408) hide show
  1. package/dist/admin/block-previews.svelte.d.ts +46 -0
  2. package/dist/admin/block-previews.svelte.d.ts.map +1 -0
  3. package/dist/admin/block-previews.svelte.js +26 -0
  4. package/dist/admin/field-components.svelte.d.ts +16 -0
  5. package/dist/admin/field-components.svelte.d.ts.map +1 -0
  6. package/dist/admin/field-components.svelte.js +18 -0
  7. package/dist/admin/nav.svelte.d.ts +34 -0
  8. package/dist/admin/nav.svelte.d.ts.map +1 -0
  9. package/dist/admin/nav.svelte.js +78 -0
  10. package/dist/admin/slots.svelte.d.ts +50 -0
  11. package/dist/admin/slots.svelte.d.ts.map +1 -0
  12. package/dist/admin/slots.svelte.js +67 -0
  13. package/dist/admin/types.d.ts +7 -0
  14. package/dist/admin/types.d.ts.map +1 -0
  15. package/dist/admin/types.js +1 -0
  16. package/dist/api/schemas/api-keys.d.ts +4 -37
  17. package/dist/api/schemas/api-keys.d.ts.map +1 -1
  18. package/dist/api/schemas/api-keys.js +5 -2
  19. package/dist/api/schemas/assets.d.ts +4 -0
  20. package/dist/api/schemas/assets.d.ts.map +1 -1
  21. package/dist/api/schemas/assets.js +3 -0
  22. package/dist/api/schemas/plugin-settings.d.ts +6 -0
  23. package/dist/api/schemas/plugin-settings.d.ts.map +1 -0
  24. package/dist/api/schemas/plugin-settings.js +8 -0
  25. package/dist/api/schemas/roles.d.ts +7 -56
  26. package/dist/api/schemas/roles.d.ts.map +1 -1
  27. package/dist/api/schemas/roles.js +11 -6
  28. package/dist/api/schemas/user.d.ts +2 -1
  29. package/dist/api/schemas/user.d.ts.map +1 -1
  30. package/dist/api/schemas/user.js +7 -2
  31. package/dist/app-augment.d.ts +11 -0
  32. package/dist/app-augment.d.ts.map +1 -1
  33. package/dist/app.d.ts +2 -0
  34. package/dist/auth/provider.d.ts +3 -0
  35. package/dist/auth/provider.d.ts.map +1 -1
  36. package/dist/cli/index.js +4 -4
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/client/index.d.ts +6 -0
  39. package/dist/client/index.d.ts.map +1 -1
  40. package/dist/client/index.js +9 -0
  41. package/dist/components/AdminApp.svelte +259 -113
  42. package/dist/components/AdminApp.svelte.d.ts +18 -2
  43. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  44. package/dist/components/admin/AdminSlot.svelte +18 -0
  45. package/dist/components/admin/AdminSlot.svelte.d.ts +12 -0
  46. package/dist/components/admin/AdminSlot.svelte.d.ts.map +1 -0
  47. package/dist/components/admin/DocumentEditor.svelte +646 -385
  48. package/dist/components/admin/DocumentEditor.svelte.d.ts +13 -0
  49. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  50. package/dist/components/admin/MediaBrowser.svelte +13 -3
  51. package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
  52. package/dist/components/admin/PluginSettingsPanel.svelte +231 -0
  53. package/dist/components/admin/PluginSettingsPanel.svelte.d.ts +8 -0
  54. package/dist/components/admin/PluginSettingsPanel.svelte.d.ts.map +1 -0
  55. package/dist/components/admin/SchemaField.svelte +76 -95
  56. package/dist/components/admin/SchemaField.svelte.d.ts +7 -0
  57. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -1
  58. package/dist/components/admin/fields/ArrayField.svelte +24 -2
  59. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
  60. package/dist/components/admin/fields/FieldInput.svelte +109 -0
  61. package/dist/components/admin/fields/FieldInput.svelte.d.ts +17 -0
  62. package/dist/components/admin/fields/FieldInput.svelte.d.ts.map +1 -0
  63. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte +5 -12
  64. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts +2 -9
  65. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts.map +1 -1
  66. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte +18 -17
  67. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts +2 -9
  68. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts.map +1 -1
  69. package/dist/components/admin/fields/richtext/RichtextField.svelte +55 -2
  70. package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts.map +1 -1
  71. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts +7 -0
  72. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -1
  73. package/dist/components/admin/fields/richtext/portable-text-object-node.js +4 -2
  74. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts +16 -1
  75. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
  76. package/dist/components/admin/fields/richtext/svelte-node-view.js +20 -1
  77. package/dist/components/layout/OrganizationSwitcher.svelte +31 -10
  78. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -1
  79. package/dist/components/layout/Sidebar.svelte +49 -11
  80. package/dist/components/layout/Sidebar.svelte.d.ts +5 -1
  81. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
  82. package/dist/components/layout/sidebar/AppSidebar.svelte +66 -3
  83. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +5 -0
  84. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -1
  85. package/dist/components/layout/sidebar/NavMain.svelte +3 -2
  86. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +4 -3
  87. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -1
  88. package/dist/components/layout/sidebar/NavUser.svelte +5 -1
  89. package/dist/config.d.ts.map +1 -1
  90. package/dist/config.js +11 -0
  91. package/dist/db/interfaces/asset.d.ts +1 -0
  92. package/dist/db/interfaces/asset.d.ts.map +1 -1
  93. package/dist/db/interfaces/index.d.ts +3 -1
  94. package/dist/db/interfaces/index.d.ts.map +1 -1
  95. package/dist/db/interfaces/plugin-settings.d.ts +23 -0
  96. package/dist/db/interfaces/plugin-settings.d.ts.map +1 -0
  97. package/dist/db/interfaces/plugin-settings.js +13 -0
  98. package/dist/db/interfaces/role.d.ts +14 -5
  99. package/dist/db/interfaces/role.d.ts.map +1 -1
  100. package/dist/engine.d.ts +28 -0
  101. package/dist/engine.d.ts.map +1 -1
  102. package/dist/engine.js +44 -0
  103. package/dist/hooks.d.ts +6 -0
  104. package/dist/hooks.d.ts.map +1 -1
  105. package/dist/hooks.js +59 -2
  106. package/dist/index.d.ts +2 -0
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +5 -0
  109. package/dist/lib/admin/block-previews.svelte.d.ts +46 -0
  110. package/dist/lib/admin/block-previews.svelte.d.ts.map +1 -0
  111. package/dist/lib/admin/block-previews.svelte.js +27 -0
  112. package/dist/lib/admin/block-previews.svelte.js.map +1 -0
  113. package/dist/lib/admin/field-components.svelte.d.ts +16 -0
  114. package/dist/lib/admin/field-components.svelte.d.ts.map +1 -0
  115. package/dist/lib/admin/field-components.svelte.js +19 -0
  116. package/dist/lib/admin/field-components.svelte.js.map +1 -0
  117. package/dist/lib/admin/nav.svelte.d.ts +34 -0
  118. package/dist/lib/admin/nav.svelte.d.ts.map +1 -0
  119. package/dist/lib/admin/nav.svelte.js +79 -0
  120. package/dist/lib/admin/nav.svelte.js.map +1 -0
  121. package/dist/lib/admin/slots.svelte.d.ts +50 -0
  122. package/dist/lib/admin/slots.svelte.d.ts.map +1 -0
  123. package/dist/lib/admin/slots.svelte.js +68 -0
  124. package/dist/lib/admin/slots.svelte.js.map +1 -0
  125. package/dist/lib/admin/types.d.ts +7 -0
  126. package/dist/lib/admin/types.d.ts.map +1 -0
  127. package/dist/lib/admin/types.js +2 -0
  128. package/dist/lib/admin/types.js.map +1 -0
  129. package/dist/lib/api/schemas/api-keys.d.ts +4 -37
  130. package/dist/lib/api/schemas/api-keys.d.ts.map +1 -1
  131. package/dist/lib/api/schemas/api-keys.js +5 -2
  132. package/dist/lib/api/schemas/api-keys.js.map +1 -1
  133. package/dist/lib/api/schemas/assets.d.ts +4 -0
  134. package/dist/lib/api/schemas/assets.d.ts.map +1 -1
  135. package/dist/lib/api/schemas/assets.js +3 -0
  136. package/dist/lib/api/schemas/assets.js.map +1 -1
  137. package/dist/lib/api/schemas/plugin-settings.d.ts +6 -0
  138. package/dist/lib/api/schemas/plugin-settings.d.ts.map +1 -0
  139. package/dist/lib/api/schemas/plugin-settings.js +9 -0
  140. package/dist/lib/api/schemas/plugin-settings.js.map +1 -0
  141. package/dist/lib/api/schemas/roles.d.ts +7 -56
  142. package/dist/lib/api/schemas/roles.d.ts.map +1 -1
  143. package/dist/lib/api/schemas/roles.js +11 -6
  144. package/dist/lib/api/schemas/roles.js.map +1 -1
  145. package/dist/lib/api/schemas/user.d.ts +2 -1
  146. package/dist/lib/api/schemas/user.d.ts.map +1 -1
  147. package/dist/lib/api/schemas/user.js +7 -2
  148. package/dist/lib/api/schemas/user.js.map +1 -1
  149. package/dist/lib/app-augment.d.ts +11 -0
  150. package/dist/lib/app-augment.d.ts.map +1 -1
  151. package/dist/lib/auth/provider.d.ts +3 -0
  152. package/dist/lib/auth/provider.d.ts.map +1 -1
  153. package/dist/lib/client/index.d.ts +6 -0
  154. package/dist/lib/client/index.d.ts.map +1 -1
  155. package/dist/lib/client/index.js +9 -0
  156. package/dist/lib/client/index.js.map +1 -1
  157. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts +7 -0
  158. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -1
  159. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js +4 -2
  160. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js.map +1 -1
  161. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts +16 -1
  162. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
  163. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js +20 -1
  164. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js.map +1 -1
  165. package/dist/lib/config.d.ts.map +1 -1
  166. package/dist/lib/config.js +11 -0
  167. package/dist/lib/config.js.map +1 -1
  168. package/dist/lib/db/interfaces/asset.d.ts +1 -0
  169. package/dist/lib/db/interfaces/asset.d.ts.map +1 -1
  170. package/dist/lib/db/interfaces/index.d.ts +3 -1
  171. package/dist/lib/db/interfaces/index.d.ts.map +1 -1
  172. package/dist/lib/db/interfaces/plugin-settings.d.ts +23 -0
  173. package/dist/lib/db/interfaces/plugin-settings.d.ts.map +1 -0
  174. package/dist/lib/db/interfaces/plugin-settings.js +14 -0
  175. package/dist/lib/db/interfaces/plugin-settings.js.map +1 -0
  176. package/dist/lib/db/interfaces/role.d.ts +14 -5
  177. package/dist/lib/db/interfaces/role.d.ts.map +1 -1
  178. package/dist/lib/engine.d.ts +28 -0
  179. package/dist/lib/engine.d.ts.map +1 -1
  180. package/dist/lib/engine.js +44 -0
  181. package/dist/lib/engine.js.map +1 -1
  182. package/dist/lib/hooks.d.ts +6 -0
  183. package/dist/lib/hooks.d.ts.map +1 -1
  184. package/dist/lib/hooks.js +59 -2
  185. package/dist/lib/hooks.js.map +1 -1
  186. package/dist/lib/index.d.ts +2 -0
  187. package/dist/lib/index.d.ts.map +1 -1
  188. package/dist/lib/index.js +5 -0
  189. package/dist/lib/index.js.map +1 -1
  190. package/dist/lib/local-api/collection-api.d.ts.map +1 -1
  191. package/dist/lib/local-api/collection-api.js +4 -2
  192. package/dist/lib/local-api/collection-api.js.map +1 -1
  193. package/dist/lib/local-api/types.d.ts +8 -0
  194. package/dist/lib/local-api/types.d.ts.map +1 -1
  195. package/dist/lib/mcp/tools.d.ts.map +1 -1
  196. package/dist/lib/mcp/tools.js +69 -1
  197. package/dist/lib/mcp/tools.js.map +1 -1
  198. package/dist/lib/permissions-context.svelte.d.ts +7 -4
  199. package/dist/lib/permissions-context.svelte.d.ts.map +1 -1
  200. package/dist/lib/permissions-context.svelte.js.map +1 -1
  201. package/dist/lib/plugins/index.d.ts +3 -0
  202. package/dist/lib/plugins/index.d.ts.map +1 -0
  203. package/dist/lib/plugins/index.js +3 -0
  204. package/dist/lib/plugins/index.js.map +1 -0
  205. package/dist/lib/plugins/resolver.d.ts +49 -0
  206. package/dist/lib/plugins/resolver.d.ts.map +1 -0
  207. package/dist/lib/plugins/resolver.js +66 -0
  208. package/dist/lib/plugins/resolver.js.map +1 -0
  209. package/dist/lib/plugins/types.d.ts +233 -0
  210. package/dist/lib/plugins/types.d.ts.map +1 -0
  211. package/dist/lib/plugins/types.js +9 -0
  212. package/dist/lib/plugins/types.js.map +1 -0
  213. package/dist/lib/schema-utils/desugar.d.ts +27 -0
  214. package/dist/lib/schema-utils/desugar.d.ts.map +1 -0
  215. package/dist/lib/schema-utils/desugar.js +102 -0
  216. package/dist/lib/schema-utils/desugar.js.map +1 -0
  217. package/dist/lib/schema-utils/index.d.ts +2 -0
  218. package/dist/lib/schema-utils/index.d.ts.map +1 -1
  219. package/dist/lib/schema-utils/index.js +2 -0
  220. package/dist/lib/schema-utils/index.js.map +1 -1
  221. package/dist/lib/schema-utils/settings.d.ts +17 -0
  222. package/dist/lib/schema-utils/settings.d.ts.map +1 -0
  223. package/dist/lib/schema-utils/settings.js +23 -0
  224. package/dist/lib/schema-utils/settings.js.map +1 -0
  225. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  226. package/dist/lib/schema-utils/validator.js +11 -0
  227. package/dist/lib/schema-utils/validator.js.map +1 -1
  228. package/dist/lib/security/secret-crypto.d.ts +18 -0
  229. package/dist/lib/security/secret-crypto.d.ts.map +1 -0
  230. package/dist/lib/security/secret-crypto.js +71 -0
  231. package/dist/lib/security/secret-crypto.js.map +1 -0
  232. package/dist/lib/server/api/index.d.ts.map +1 -1
  233. package/dist/lib/server/api/index.js +3 -0
  234. package/dist/lib/server/api/index.js.map +1 -1
  235. package/dist/lib/server/api/routes/assets.d.ts.map +1 -1
  236. package/dist/lib/server/api/routes/assets.js +8 -2
  237. package/dist/lib/server/api/routes/assets.js.map +1 -1
  238. package/dist/lib/server/api/routes/organizations.d.ts.map +1 -1
  239. package/dist/lib/server/api/routes/organizations.js +4 -1
  240. package/dist/lib/server/api/routes/organizations.js.map +1 -1
  241. package/dist/lib/server/api/routes/plugin-settings.d.ts +4 -0
  242. package/dist/lib/server/api/routes/plugin-settings.d.ts.map +1 -0
  243. package/dist/lib/server/api/routes/plugin-settings.js +109 -0
  244. package/dist/lib/server/api/routes/plugin-settings.js.map +1 -0
  245. package/dist/lib/server/api/routes/roles.d.ts.map +1 -1
  246. package/dist/lib/server/api/routes/roles.js +37 -0
  247. package/dist/lib/server/api/routes/roles.js.map +1 -1
  248. package/dist/lib/server/api/routes/user.d.ts.map +1 -1
  249. package/dist/lib/server/api/routes/user.js +14 -3
  250. package/dist/lib/server/api/routes/user.js.map +1 -1
  251. package/dist/lib/services/asset-service.d.ts +1 -0
  252. package/dist/lib/services/asset-service.d.ts.map +1 -1
  253. package/dist/lib/services/asset-service.js.map +1 -1
  254. package/dist/lib/services/index.d.ts +2 -0
  255. package/dist/lib/services/index.d.ts.map +1 -1
  256. package/dist/lib/services/index.js +1 -0
  257. package/dist/lib/services/index.js.map +1 -1
  258. package/dist/lib/services/plugin-settings-service.d.ts +76 -0
  259. package/dist/lib/services/plugin-settings-service.d.ts.map +1 -0
  260. package/dist/lib/services/plugin-settings-service.js +236 -0
  261. package/dist/lib/services/plugin-settings-service.js.map +1 -0
  262. package/dist/lib/services/roles-service.d.ts +2 -2
  263. package/dist/lib/services/roles-service.d.ts.map +1 -1
  264. package/dist/lib/services/roles-service.js.map +1 -1
  265. package/dist/lib/theme/css.d.ts +30 -0
  266. package/dist/lib/theme/css.d.ts.map +1 -0
  267. package/dist/lib/theme/css.js +54 -0
  268. package/dist/lib/theme/css.js.map +1 -0
  269. package/dist/lib/theme/derive.d.ts +27 -0
  270. package/dist/lib/theme/derive.d.ts.map +1 -0
  271. package/dist/lib/theme/derive.js +108 -0
  272. package/dist/lib/theme/derive.js.map +1 -0
  273. package/dist/lib/theme/index.d.ts +5 -0
  274. package/dist/lib/theme/index.d.ts.map +1 -0
  275. package/dist/lib/theme/index.js +5 -0
  276. package/dist/lib/theme/index.js.map +1 -0
  277. package/dist/lib/theme/schemes.d.ts +60 -0
  278. package/dist/lib/theme/schemes.d.ts.map +1 -0
  279. package/dist/lib/theme/schemes.js +150 -0
  280. package/dist/lib/theme/schemes.js.map +1 -0
  281. package/dist/lib/theme/tokens.d.ts +57 -0
  282. package/dist/lib/theme/tokens.d.ts.map +1 -0
  283. package/dist/lib/theme/tokens.js +11 -0
  284. package/dist/lib/theme/tokens.js.map +1 -0
  285. package/dist/{cli/generate-types.d.ts → lib/type-gen.d.ts} +3 -6
  286. package/dist/lib/type-gen.d.ts.map +1 -0
  287. package/dist/lib/type-gen.js +658 -0
  288. package/dist/lib/type-gen.js.map +1 -0
  289. package/dist/lib/types/auth.d.ts +10 -10
  290. package/dist/lib/types/auth.d.ts.map +1 -1
  291. package/dist/lib/types/capabilities.d.ts +50 -9
  292. package/dist/lib/types/capabilities.d.ts.map +1 -1
  293. package/dist/lib/types/capabilities.js +147 -5
  294. package/dist/lib/types/capabilities.js.map +1 -1
  295. package/dist/lib/types/config.d.ts +30 -1
  296. package/dist/lib/types/config.d.ts.map +1 -1
  297. package/dist/lib/types/schemas.d.ts +90 -2
  298. package/dist/lib/types/schemas.d.ts.map +1 -1
  299. package/dist/lib/types/schemas.js.map +1 -1
  300. package/dist/lib/types/sidebar.d.ts +3 -1
  301. package/dist/lib/types/sidebar.d.ts.map +1 -1
  302. package/dist/lib/utils/index.d.ts +1 -0
  303. package/dist/lib/utils/index.d.ts.map +1 -1
  304. package/dist/lib/utils/index.js +1 -0
  305. package/dist/lib/utils/index.js.map +1 -1
  306. package/dist/lib/utils/preview.d.ts +16 -5
  307. package/dist/lib/utils/preview.d.ts.map +1 -1
  308. package/dist/lib/utils/preview.js +7 -2
  309. package/dist/lib/utils/preview.js.map +1 -1
  310. package/dist/lib/vite/index.d.ts +7 -0
  311. package/dist/lib/vite/index.d.ts.map +1 -1
  312. package/dist/lib/vite/index.js +37 -6
  313. package/dist/lib/vite/index.js.map +1 -1
  314. package/dist/local-api/collection-api.d.ts.map +1 -1
  315. package/dist/local-api/collection-api.js +4 -2
  316. package/dist/local-api/types.d.ts +8 -0
  317. package/dist/local-api/types.d.ts.map +1 -1
  318. package/dist/mcp/tools.d.ts.map +1 -1
  319. package/dist/mcp/tools.js +69 -1
  320. package/dist/permissions-context.svelte.d.ts +7 -4
  321. package/dist/permissions-context.svelte.d.ts.map +1 -1
  322. package/dist/plugins/index.d.ts +3 -0
  323. package/dist/plugins/index.d.ts.map +1 -0
  324. package/dist/plugins/index.js +2 -0
  325. package/dist/plugins/resolver.d.ts +49 -0
  326. package/dist/plugins/resolver.d.ts.map +1 -0
  327. package/dist/plugins/resolver.js +65 -0
  328. package/dist/plugins/types.d.ts +233 -0
  329. package/dist/plugins/types.d.ts.map +1 -0
  330. package/dist/plugins/types.js +8 -0
  331. package/dist/schema-utils/desugar.d.ts +27 -0
  332. package/dist/schema-utils/desugar.d.ts.map +1 -0
  333. package/dist/schema-utils/desugar.js +101 -0
  334. package/dist/schema-utils/index.d.ts +2 -0
  335. package/dist/schema-utils/index.d.ts.map +1 -1
  336. package/dist/schema-utils/index.js +2 -0
  337. package/dist/schema-utils/settings.d.ts +17 -0
  338. package/dist/schema-utils/settings.d.ts.map +1 -0
  339. package/dist/schema-utils/settings.js +22 -0
  340. package/dist/schema-utils/validator.d.ts.map +1 -1
  341. package/dist/schema-utils/validator.js +11 -0
  342. package/dist/security/secret-crypto.d.ts +18 -0
  343. package/dist/security/secret-crypto.d.ts.map +1 -0
  344. package/dist/security/secret-crypto.js +70 -0
  345. package/dist/server/api/index.d.ts.map +1 -1
  346. package/dist/server/api/index.js +3 -0
  347. package/dist/server/api/routes/assets.d.ts.map +1 -1
  348. package/dist/server/api/routes/assets.js +8 -2
  349. package/dist/server/api/routes/organizations.d.ts.map +1 -1
  350. package/dist/server/api/routes/organizations.js +4 -1
  351. package/dist/server/api/routes/plugin-settings.d.ts +4 -0
  352. package/dist/server/api/routes/plugin-settings.d.ts.map +1 -0
  353. package/dist/server/api/routes/plugin-settings.js +108 -0
  354. package/dist/server/api/routes/roles.d.ts.map +1 -1
  355. package/dist/server/api/routes/roles.js +37 -0
  356. package/dist/server/api/routes/user.d.ts.map +1 -1
  357. package/dist/server/api/routes/user.js +14 -3
  358. package/dist/services/asset-service.d.ts +1 -0
  359. package/dist/services/asset-service.d.ts.map +1 -1
  360. package/dist/services/index.d.ts +2 -0
  361. package/dist/services/index.d.ts.map +1 -1
  362. package/dist/services/index.js +1 -0
  363. package/dist/services/plugin-settings-service.d.ts +76 -0
  364. package/dist/services/plugin-settings-service.d.ts.map +1 -0
  365. package/dist/services/plugin-settings-service.js +235 -0
  366. package/dist/services/roles-service.d.ts +2 -2
  367. package/dist/services/roles-service.d.ts.map +1 -1
  368. package/dist/theme/css.d.ts +30 -0
  369. package/dist/theme/css.d.ts.map +1 -0
  370. package/dist/theme/css.js +53 -0
  371. package/dist/theme/derive.d.ts +27 -0
  372. package/dist/theme/derive.d.ts.map +1 -0
  373. package/dist/theme/derive.js +107 -0
  374. package/dist/theme/index.d.ts +5 -0
  375. package/dist/theme/index.d.ts.map +1 -0
  376. package/dist/theme/index.js +4 -0
  377. package/dist/theme/schemes.d.ts +60 -0
  378. package/dist/theme/schemes.d.ts.map +1 -0
  379. package/dist/theme/schemes.js +149 -0
  380. package/dist/theme/tokens.d.ts +57 -0
  381. package/dist/theme/tokens.d.ts.map +1 -0
  382. package/dist/theme/tokens.js +10 -0
  383. package/dist/type-gen.d.ts +19 -0
  384. package/dist/type-gen.d.ts.map +1 -0
  385. package/dist/{cli/generate-types.js → type-gen.js} +101 -68
  386. package/dist/types/auth.d.ts +10 -10
  387. package/dist/types/auth.d.ts.map +1 -1
  388. package/dist/types/capabilities.d.ts +50 -9
  389. package/dist/types/capabilities.d.ts.map +1 -1
  390. package/dist/types/capabilities.js +147 -5
  391. package/dist/types/config.d.ts +30 -1
  392. package/dist/types/config.d.ts.map +1 -1
  393. package/dist/types/schemas.d.ts +90 -2
  394. package/dist/types/schemas.d.ts.map +1 -1
  395. package/dist/types/sidebar.d.ts +3 -1
  396. package/dist/types/sidebar.d.ts.map +1 -1
  397. package/dist/utils/index.d.ts +1 -0
  398. package/dist/utils/index.d.ts.map +1 -1
  399. package/dist/utils/index.js +1 -0
  400. package/dist/utils/preview.d.ts +16 -5
  401. package/dist/utils/preview.d.ts.map +1 -1
  402. package/dist/utils/preview.js +7 -2
  403. package/dist/vite/index.d.ts +7 -0
  404. package/dist/vite/index.d.ts.map +1 -1
  405. package/dist/vite/index.js +37 -6
  406. package/package.json +6 -4
  407. package/dist/cli/generate-types.d.ts.map +0 -1
  408. package/dist/cli/generate-types.js.map +0 -1
@@ -0,0 +1,658 @@
1
+ import { createPartResolver } from './plugins/resolver.js';
2
+ import { isFieldRequired } from './field-validation/utils.js';
3
+ import { toPascalCase } from './utils/string-case.js';
4
+ /**
5
+ * Map Aphex field types to TypeScript types
6
+ */
7
+ function mapFieldTypeToTS(field, schemaMap, opts = {}) {
8
+ const { inArray = false, resolved = false, parentSchemaName, blockContentFields } = opts;
9
+ switch (field.type) {
10
+ case 'string':
11
+ case 'text':
12
+ case 'slug':
13
+ case 'url':
14
+ return 'string';
15
+ case 'number':
16
+ return 'number';
17
+ case 'boolean':
18
+ return 'boolean';
19
+ case 'date':
20
+ // Dates are stored as ISO date strings (YYYY-MM-DD)
21
+ return 'string';
22
+ case 'datetime':
23
+ // Datetimes are stored as ISO datetime strings in UTC (YYYY-MM-DDTHH:mm:ssZ)
24
+ return 'string';
25
+ case 'image':
26
+ // Image fields store a Sanity-style value: { _type: 'image', asset: { _type: 'reference', _ref } }
27
+ return 'ImageValue';
28
+ case 'file':
29
+ // File fields mirror image: { _type: 'file', asset: { _type: 'reference', _ref } }
30
+ return 'FileValue';
31
+ case 'array': {
32
+ if (!('of' in field) || !field.of || field.of.length === 0) {
33
+ return 'unknown[]';
34
+ }
35
+ if (field.of.some((item) => item.type === 'block')) {
36
+ if (parentSchemaName && blockContentFields) {
37
+ const info = blockContentFields.find((f) => f.schemaName === parentSchemaName && f.fieldName === field.name);
38
+ if (info)
39
+ return getBlockContentArrayType(info);
40
+ }
41
+ return 'PortableTextBlock[]';
42
+ }
43
+ // Map each array item type. Items get `_key?` injected at runtime by
44
+ // ArrayField for stable DnD ordering; reflect that in the type.
45
+ const types = field.of
46
+ .map((item) => {
47
+ // Reference array item: stored as { _type: 'reference', _ref, _key }.
48
+ // Raw mode → Reference<Target>; resolved mode → Target (the raw
49
+ // target — at depth=1 the resolver doesn't recurse into the
50
+ // fetched docs, so their inner refs stay raw).
51
+ if (item.type === 'reference') {
52
+ const to = item.to;
53
+ const targets = to
54
+ ?.map((t) => {
55
+ const target = schemaMap.get(t.type);
56
+ return target ? toPascalCase(t.type) : null;
57
+ })
58
+ .filter((s) => !!s) ?? [];
59
+ if (targets.length === 0) {
60
+ return resolved ? 'unknown' : 'Reference<unknown>';
61
+ }
62
+ const union = targets.join(' | ');
63
+ if (resolved) {
64
+ return targets.length === 1 ? targets[0] : `(${union})`;
65
+ }
66
+ return targets.length === 1 ? `Reference<${targets[0]}>` : `Reference<${union}>`;
67
+ }
68
+ // Named object schema — refs inside it are part of the same
69
+ // document tree, so in resolved mode point at the *Resolved
70
+ // variant (only if it actually has refs; otherwise no Resolved
71
+ // variant was emitted).
72
+ const refSchema = schemaMap.get(item.type);
73
+ if (refSchema && refSchema.type === 'object') {
74
+ const useResolved = resolved && hasReferences(refSchema, schemaMap);
75
+ const name = toPascalCase(item.type) + (useResolved ? 'Resolved' : '');
76
+ return `(${name} & { _key?: string })`;
77
+ }
78
+ // Inline object or primitive — recurse, propagating resolved.
79
+ return mapFieldTypeToTS(item, schemaMap, { inArray: true, resolved });
80
+ })
81
+ .filter((t) => t !== 'unknown');
82
+ if (types.length === 0) {
83
+ return 'unknown[]';
84
+ }
85
+ return types.length === 1 ? `${types[0]}[]` : `Array<${types.join(' | ')}>`;
86
+ }
87
+ case 'object': {
88
+ if (!('fields' in field) || !field.fields) {
89
+ return 'Record<string, unknown>';
90
+ }
91
+ // Generate inline interface for object fields. When this object is
92
+ // itself an array item, prepend the runtime-only `_key?` and
93
+ // `_type?` discriminator props.
94
+ const arrayMeta = inArray ? ' _key?: string;\n _type?: string;\n' : '';
95
+ const props = field.fields
96
+ .map((f) => {
97
+ const tsType = mapFieldTypeToTS(f, schemaMap, { resolved });
98
+ const optional = isFieldOptional(f) ? '?' : '';
99
+ return ` ${f.name}${optional}: ${tsType};`;
100
+ })
101
+ .join('\n');
102
+ return `{\n${arrayMeta}${props}\n}`;
103
+ }
104
+ case 'reference': {
105
+ const to = field.to;
106
+ const targets = to
107
+ ?.map((t) => (schemaMap.get(t.type) ? toPascalCase(t.type) : null))
108
+ .filter((s) => !!s) ?? [];
109
+ if (resolved) {
110
+ // At depth=1 the ref is replaced with the full target doc (raw shape).
111
+ if (targets.length === 0)
112
+ return 'unknown';
113
+ return targets.length === 1 ? targets[0] : targets.join(' | ');
114
+ }
115
+ // Raw: stored as { _type: 'reference', _ref } — same shape as array items.
116
+ if (targets.length === 0)
117
+ return 'Reference<unknown>';
118
+ const union = targets.join(' | ');
119
+ return targets.length === 1 ? `Reference<${targets[0]}>` : `Reference<${union}>`;
120
+ }
121
+ default:
122
+ return 'unknown';
123
+ }
124
+ }
125
+ /**
126
+ * The depth=0 write shape (TypeScript type string) for a single field, e.g.
127
+ * `string` for a slug, `Reference<author>` for a reference, `ImageValue` for an
128
+ * image. Same mapping `generate-types` uses to emit `generated-types.ts`, so
129
+ * agent-facing schema introspection (MCP `get_schema`) can derive value shapes
130
+ * from the one source of truth instead of hand-authoring a parallel list.
131
+ */
132
+ export function fieldWriteShape(field, schemas) {
133
+ const schemaMap = new Map(schemas.map((s) => [s.name, s]));
134
+ return mapFieldTypeToTS(field, schemaMap, {});
135
+ }
136
+ /**
137
+ * Determine if a field is optional based on validation rules
138
+ */
139
+ function isFieldOptional(field) {
140
+ return !isFieldRequired(field);
141
+ }
142
+ function generateBlockTypeInterface(info) {
143
+ const props = info.fields
144
+ .map((f) => {
145
+ const tsType = mapFieldTypeToTS(f, new Map(), {});
146
+ const optional = isFieldOptional(f) ? '?' : '';
147
+ return ` ${f.name}${optional}: ${tsType};`;
148
+ })
149
+ .join('\n');
150
+ return `export interface ${info.interfaceName} {\n _type: '${info.name}';\n _key: string;\n${props}\n}`;
151
+ }
152
+ function collectBlockContentFields(schemas, schemaMap) {
153
+ const allBlockTypes = new Map();
154
+ const fields = [];
155
+ for (const schema of schemas) {
156
+ for (const field of schema.fields) {
157
+ if (field.type !== 'array' || !('of' in field) || !field.of)
158
+ continue;
159
+ const blockDef = field.of.find((item) => item.type === 'block');
160
+ if (!blockDef)
161
+ continue;
162
+ const mapTypeName = `${toPascalCase(schema.name)}${toPascalCase(field.name)}Types`;
163
+ const blockTypes = [];
164
+ const inlineTypes = [];
165
+ const annotations = [];
166
+ let hasImage = false;
167
+ for (const item of field.of) {
168
+ if (item.type === 'block')
169
+ continue;
170
+ if (item.type === 'image') {
171
+ hasImage = true;
172
+ continue;
173
+ }
174
+ const existing = schemaMap.get(item.type);
175
+ const itemFields = item.fields || existing?.fields || [];
176
+ const interfaceName = toPascalCase(item.type) + 'Block';
177
+ const info = {
178
+ name: item.type,
179
+ interfaceName,
180
+ fields: itemFields
181
+ };
182
+ if (!allBlockTypes.has(item.type)) {
183
+ allBlockTypes.set(item.type, info);
184
+ }
185
+ blockTypes.push(info);
186
+ }
187
+ const blockOfItems = blockDef.of;
188
+ if (blockOfItems) {
189
+ for (const item of blockOfItems) {
190
+ const existing = schemaMap.get(item.type);
191
+ const itemFields = item.fields || existing?.fields || [];
192
+ const interfaceName = toPascalCase(item.type) + 'Inline';
193
+ const info = {
194
+ name: item.type,
195
+ interfaceName,
196
+ fields: itemFields
197
+ };
198
+ if (!allBlockTypes.has(`inline:${item.type}`)) {
199
+ allBlockTypes.set(`inline:${item.type}`, info);
200
+ }
201
+ inlineTypes.push(info);
202
+ }
203
+ }
204
+ const markAnnotations = blockDef.marks?.annotations;
205
+ if (markAnnotations) {
206
+ for (const ann of markAnnotations) {
207
+ const interfaceName = toPascalCase(ann.name) + 'Annotation';
208
+ const info = {
209
+ name: ann.name,
210
+ interfaceName,
211
+ fields: ann.fields || []
212
+ };
213
+ if (!allBlockTypes.has(`annotation:${ann.name}`)) {
214
+ allBlockTypes.set(`annotation:${ann.name}`, info);
215
+ }
216
+ annotations.push(info);
217
+ }
218
+ }
219
+ fields.push({
220
+ schemaName: schema.name,
221
+ fieldName: field.name,
222
+ mapTypeName,
223
+ blockTypes,
224
+ inlineTypes,
225
+ annotations,
226
+ hasImage
227
+ });
228
+ }
229
+ }
230
+ return { fields, allBlockTypes };
231
+ }
232
+ function generateBlockContentTypes(allBlockTypes, fields) {
233
+ if (fields.length === 0)
234
+ return '';
235
+ const sections = [];
236
+ // Standalone interfaces (deduped)
237
+ const interfaces = [];
238
+ for (const [, info] of allBlockTypes) {
239
+ interfaces.push(generateBlockTypeInterface(info));
240
+ }
241
+ // Image block (built-in)
242
+ const hasAnyImage = fields.some((f) => f.hasImage);
243
+ if (hasAnyImage) {
244
+ interfaces.push(`export interface PortableTextImageBlock {
245
+ _type: 'image';
246
+ _key: string;
247
+ asset?: { _ref: string; _type: string };
248
+ alt?: string;
249
+ }`);
250
+ }
251
+ if (interfaces.length > 0) {
252
+ sections.push(interfaces.join('\n\n'));
253
+ }
254
+ // Per-field mapped types for indexed access
255
+ for (const field of fields) {
256
+ const entries = [];
257
+ for (const bt of field.blockTypes) {
258
+ entries.push(` ${bt.name}: ${bt.interfaceName};`);
259
+ }
260
+ if (field.hasImage) {
261
+ entries.push(` image: PortableTextImageBlock;`);
262
+ }
263
+ for (const it of field.inlineTypes) {
264
+ entries.push(` ${it.name}: ${it.interfaceName};`);
265
+ }
266
+ for (const ann of field.annotations) {
267
+ entries.push(` ${ann.name}: ${ann.interfaceName};`);
268
+ }
269
+ if (entries.length > 0) {
270
+ sections.push(`export interface ${field.mapTypeName} {\n${entries.join('\n')}\n}`);
271
+ }
272
+ }
273
+ return sections.join('\n\n');
274
+ }
275
+ function getBlockContentArrayType(field) {
276
+ const types = ['PortableTextBlock'];
277
+ for (const bt of field.blockTypes) {
278
+ types.push(bt.interfaceName);
279
+ }
280
+ if (field.hasImage) {
281
+ types.push('PortableTextImageBlock');
282
+ }
283
+ if (types.length === 1)
284
+ return 'PortableTextBlock[]';
285
+ return `Array<\n | ${types.join('\n | ')}\n >`;
286
+ }
287
+ /**
288
+ * Generate TypeScript interface for a schema type. When `resolved` is true,
289
+ * emits the depth=1 shape (refs swapped for their targets) under the name
290
+ * `<Name>Resolved`.
291
+ */
292
+ function generateInterface(schema, schemaMap, resolved = false, blockContentFields) {
293
+ const interfaceName = toPascalCase(schema.name) + (resolved ? 'Resolved' : '');
294
+ const fields = schema.fields
295
+ .map((field) => {
296
+ const tsType = mapFieldTypeToTS(field, schemaMap, {
297
+ resolved,
298
+ parentSchemaName: schema.name,
299
+ blockContentFields
300
+ });
301
+ const optional = isFieldOptional(field) ? '?' : '';
302
+ // Build comment with description and format information
303
+ let comment = '';
304
+ const needsComment = field.description || field.type === 'date' || field.type === 'datetime';
305
+ if (needsComment) {
306
+ const parts = [];
307
+ if (field.description) {
308
+ parts.push(field.description);
309
+ }
310
+ if (field.type === 'date') {
311
+ const dateField = field;
312
+ const format = dateField.options?.dateFormat || 'YYYY-MM-DD';
313
+ parts.push(`@format ISO date string (YYYY-MM-DD) - displays as ${format}`);
314
+ }
315
+ else if (field.type === 'datetime') {
316
+ const dateTimeField = field;
317
+ const dateFormat = dateTimeField.options?.dateFormat || 'YYYY-MM-DD';
318
+ const timeFormat = dateTimeField.options?.timeFormat || 'HH:mm';
319
+ parts.push(`@format ISO datetime string in UTC (YYYY-MM-DDTHH:mm:ssZ) - displays as ${dateFormat} ${timeFormat}`);
320
+ }
321
+ if (parts.length > 0) {
322
+ comment = ` /**\n * ${parts.join('\n * ')}\n */\n`;
323
+ }
324
+ }
325
+ return `${comment} ${field.name}${optional}: ${tsType};`;
326
+ })
327
+ .join('\n');
328
+ // Add id and _meta fields for document types, _type for object types
329
+ const isDocument = schema.type === 'document';
330
+ let finalFields;
331
+ if (isDocument) {
332
+ finalFields = ` /** Document ID */
333
+ id: string;
334
+ ${fields}
335
+ /** Document metadata */
336
+ _meta?: {
337
+ type: string;
338
+ status: 'draft' | 'published';
339
+ organizationId: string;
340
+ createdAt: Date | null;
341
+ updatedAt: Date | null;
342
+ createdBy?: string;
343
+ updatedBy?: string;
344
+ publishedAt?: Date | null;
345
+ publishedHash?: string | null;
346
+ };`;
347
+ }
348
+ else {
349
+ // Object types include _type for array item discrimination
350
+ finalFields = ` /** Object type discriminator */
351
+ _type?: string;
352
+ ${fields}`;
353
+ }
354
+ return `export interface ${interfaceName} {\n${finalFields}\n}`;
355
+ }
356
+ /**
357
+ * True if the schema (or any object schema reachable from it) contains a
358
+ * reference field. Used to skip emitting `*Resolved` variants for schemas
359
+ * that have nothing to resolve.
360
+ */
361
+ function hasReferences(schema, schemaMap, visited = new Set()) {
362
+ if (visited.has(schema.name))
363
+ return false;
364
+ visited.add(schema.name);
365
+ return schema.fields.some((f) => fieldHasReferences(f, schemaMap, visited));
366
+ }
367
+ function fieldHasReferences(field, schemaMap, visited) {
368
+ if (field.type === 'reference')
369
+ return true;
370
+ if (field.type === 'array' && 'of' in field && field.of) {
371
+ return field.of.some((item) => {
372
+ if (item.type === 'reference')
373
+ return true;
374
+ const named = schemaMap.get(item.type);
375
+ if (named && named.type === 'object')
376
+ return hasReferences(named, schemaMap, visited);
377
+ return fieldHasReferences(item, schemaMap, visited);
378
+ });
379
+ }
380
+ if (field.type === 'object' && 'fields' in field && field.fields) {
381
+ return field.fields.some((f) => fieldHasReferences(f, schemaMap, visited));
382
+ }
383
+ return false;
384
+ }
385
+ /**
386
+ * Generate the Collections interface augmentation. Singleton-flagged schemas
387
+ * are typed as `SingletonCollection<T>` (a narrowed pick exposing only
388
+ * `get`/`update`/`publish`/`unpublish`/`singletonId`/`schema`) so consumers
389
+ * can't accidentally call list/findByID/create/delete on them at compile
390
+ * time. The runtime is still the same CollectionAPI instance.
391
+ */
392
+ function generateCollectionsAugmentation(documentSchemas) {
393
+ const mappings = documentSchemas
394
+ .map((schema) => {
395
+ const interfaceName = toPascalCase(schema.name);
396
+ const collectionType = schema.singleton
397
+ ? `SingletonCollection<${interfaceName}>`
398
+ : `CollectionAPI<${interfaceName}>`;
399
+ return ` ${schema.name}: ${collectionType};`;
400
+ })
401
+ .join('\n');
402
+ return `declare module '@aphexcms/cms-core/server' {
403
+ interface Collections {
404
+ ${mappings}
405
+ }
406
+ }`;
407
+ }
408
+ /**
409
+ * Generate complete TypeScript types file with module augmentation
410
+ */
411
+ export function generateTypes(schemas) {
412
+ // Create schema map for lookups
413
+ const schemaMap = new Map(schemas.map((s) => [s.name, s]));
414
+ // Separate document and object types
415
+ const documentSchemas = schemas.filter((s) => s.type === 'document');
416
+ const objectSchemas = schemas.filter((s) => s.type === 'object');
417
+ // Collect block content field info for typed unions
418
+ const { fields: blockContentFields, allBlockTypes } = collectBlockContentFields(schemas, schemaMap);
419
+ // Raw shape (storage / depth=0)
420
+ const objectInterfaces = objectSchemas
421
+ .map((s) => generateInterface(s, schemaMap, false, blockContentFields))
422
+ .join('\n\n');
423
+ const documentInterfaces = documentSchemas
424
+ .map((s) => generateInterface(s, schemaMap, false, blockContentFields))
425
+ .join('\n\n');
426
+ // Resolved shape (depth=1) — only for schemas that actually contain refs.
427
+ const objectResolvedInterfaces = objectSchemas
428
+ .filter((s) => hasReferences(s, schemaMap))
429
+ .map((s) => generateInterface(s, schemaMap, true, blockContentFields))
430
+ .join('\n\n');
431
+ const documentResolvedInterfaces = documentSchemas
432
+ .filter((s) => hasReferences(s, schemaMap))
433
+ .map((s) => generateInterface(s, schemaMap, true, blockContentFields))
434
+ .join('\n\n');
435
+ // Block content types (custom blocks, inline objects, annotations)
436
+ const blockContentTypeDefs = generateBlockContentTypes(allBlockTypes, blockContentFields);
437
+ const hasResolved = !!(objectResolvedInterfaces || documentResolvedInterfaces);
438
+ // Generate Collections interface augmentation
439
+ const hasSingletons = documentSchemas.some((s) => s.singleton);
440
+ const collectionsAugmentation = generateCollectionsAugmentation(documentSchemas);
441
+ const resolvedSection = hasResolved
442
+ ? `
443
+
444
+ // ============================================================================
445
+ // Resolved Types (depth=1) — refs swapped for their target docs
446
+ // ============================================================================
447
+ //
448
+ // Use these when reading with \`depth: 1\`. The local API and HTTP routes default
449
+ // to depth=0 (raw IDs); pass \`{ depth: 1 }\` to get the resolved shape:
450
+ //
451
+ // const menu = (await cms.collections.menu.get(id, { depth: 1 })) as MenuResolved;
452
+ //
453
+ // At depth=1 only the outer document's refs resolve — refs inside the resolved
454
+ // targets stay raw, which is why \`MenuResolved.items\` is \`MenuItem[]\` (not
455
+ // \`MenuItemResolved[]\`).
456
+
457
+ ${objectResolvedInterfaces ? objectResolvedInterfaces + '\n\n' : ''}${documentResolvedInterfaces}`
458
+ : '';
459
+ // Only import the asset value types the generated interfaces actually reference, so a
460
+ // schema with no image (or no file) fields doesn't pull in an unused import.
461
+ const generatedBody = [
462
+ blockContentTypeDefs,
463
+ objectInterfaces,
464
+ documentInterfaces,
465
+ resolvedSection,
466
+ collectionsAugmentation
467
+ ].join('\n');
468
+ const assetImports = [
469
+ /\bImageValue\b/.test(generatedBody) ? 'ImageValue' : null,
470
+ /\bFileValue\b/.test(generatedBody) ? 'FileValue' : null
471
+ ].filter((name) => name !== null);
472
+ const apiImports = hasSingletons ? 'CollectionAPI, SingletonCollection' : 'CollectionAPI';
473
+ const importNames = [apiImports, ...assetImports].join(', ');
474
+ // Build the complete file
475
+ const output = `/**
476
+ * Generated types for Aphex CMS
477
+ * This file is auto-generated - DO NOT EDIT manually
478
+ */
479
+ import type { ${importNames} } from '@aphexcms/cms-core/server';
480
+
481
+ /**
482
+ * A reference to another document, stored as \`{ _type: 'reference', _ref }\`
483
+ * inside arrays. At depth=0 (default) this is the raw shape; at depth=1 the
484
+ * field is replaced with the target document — see the \`*Resolved\` variants.
485
+ */
486
+ export interface Reference<T = unknown> {
487
+ _type: 'reference';
488
+ _ref: string;
489
+ _key?: string;
490
+ /** Phantom — present only in the type, used for inferring the target. */
491
+ __targetType?: T;
492
+ }
493
+
494
+ export interface PortableTextBlock {
495
+ _type: 'block';
496
+ _key: string;
497
+ style?: string;
498
+ children: Array<{
499
+ _type: 'span';
500
+ _key: string;
501
+ text: string;
502
+ marks?: string[];
503
+ }>;
504
+ markDefs?: Array<{
505
+ _type: string;
506
+ _key: string;
507
+ [key: string]: unknown;
508
+ }>;
509
+ listItem?: string;
510
+ level?: number;
511
+ }
512
+
513
+ // ============================================================================
514
+ // Block Content Types (custom blocks, inline objects, annotations)
515
+ // ============================================================================
516
+
517
+ ${blockContentTypeDefs}
518
+
519
+ // ============================================================================
520
+ // Object Types (nested in documents)
521
+ // ============================================================================
522
+
523
+ ${objectInterfaces}
524
+
525
+ // ============================================================================
526
+ // Document Types (collections)
527
+ // ============================================================================
528
+
529
+ ${documentInterfaces}${resolvedSection}
530
+
531
+ // ============================================================================
532
+ // Module Augmentation - Extends Collections interface globally
533
+ // ============================================================================
534
+
535
+ ${collectionsAugmentation}
536
+ `;
537
+ return output;
538
+ }
539
+ /**
540
+ * CLI helper to generate types from schema file
541
+ */
542
+ /**
543
+ * Compile a `.ts` module with esbuild (stubbing icons + Svelte components, which never
544
+ * affect types) and dynamically import it, returning the module namespace. Used for both
545
+ * the schema module and the optional plugins module.
546
+ */
547
+ async function compileAndImportModule(absolutePath, tempName, opts = {}) {
548
+ const path = await import('path');
549
+ const { pathToFileURL } = await import('url');
550
+ const fs = await import('fs/promises');
551
+ let modulePath = absolutePath;
552
+ let tempFile = null;
553
+ if (absolutePath.endsWith('.ts')) {
554
+ const { build } = await import('esbuild');
555
+ const tempOutFile = path.join(path.dirname(absolutePath), tempName);
556
+ // The plugins module imports plugin *main* entries (Svelte-laden) and cms-core
557
+ // runtime utils — so bundle the plugins (the Svelte-stub strips their components)
558
+ // and alias cms-core to its built dist (real JS; source `.ts` can't load in Node).
559
+ // The schema module keeps `@aphexcms/*` external (its plugin imports use the
560
+ // server-safe `/schema` subpath, which loads fine).
561
+ const alias = opts.bundlePlugins && opts.cmsCoreDist
562
+ ? { '@aphexcms/cms-core': opts.cmsCoreDist }
563
+ : undefined;
564
+ await build({
565
+ entryPoints: [absolutePath],
566
+ bundle: true,
567
+ format: 'esm',
568
+ platform: 'node',
569
+ outfile: tempOutFile,
570
+ external: opts.bundlePlugins ? ['sharp', 'graphql', 'graphql-yoga'] : ['@aphexcms/*'],
571
+ alias,
572
+ plugins: [
573
+ {
574
+ name: 'remove-icons',
575
+ setup(build) {
576
+ build.onResolve({ filter: /^@lucide\/svelte/ }, (args) => {
577
+ return { path: args.path, namespace: 'lucide-stub' };
578
+ });
579
+ build.onLoad({ filter: /.*/, namespace: 'lucide-stub' }, () => {
580
+ return { contents: 'export default {}', loader: 'js' };
581
+ });
582
+ // Stub .svelte components — a schema/plugin module can transitively
583
+ // import component parts (actions, tools, widgets) that never affect types.
584
+ build.onResolve({ filter: /\.svelte(\?.*)?$/ }, (args) => {
585
+ return { path: args.path, namespace: 'svelte-stub' };
586
+ });
587
+ build.onLoad({ filter: /.*/, namespace: 'svelte-stub' }, () => {
588
+ return { contents: 'export default {}', loader: 'js' };
589
+ });
590
+ build.onLoad({ filter: /\.(ts|js)$/ }, async (args) => {
591
+ const contents = await fs.readFile(args.path, 'utf8');
592
+ const transformed = contents.replace(/icon:\s*\w+/g, 'icon: undefined');
593
+ return { contents: transformed, loader: args.path.endsWith('.ts') ? 'ts' : 'js' };
594
+ });
595
+ }
596
+ }
597
+ ]
598
+ });
599
+ modulePath = tempOutFile;
600
+ tempFile = tempOutFile;
601
+ }
602
+ // @vite-ignore: path is resolved at CLI runtime, not statically analyzable.
603
+ const mod = await import(/* @vite-ignore */ pathToFileURL(modulePath).href);
604
+ if (tempFile) {
605
+ try {
606
+ await fs.unlink(tempFile);
607
+ }
608
+ catch {
609
+ // Ignore cleanup errors
610
+ }
611
+ }
612
+ return mod;
613
+ }
614
+ export async function generateTypesFromConfig(schemaPath, outputPath, pluginsPath) {
615
+ try {
616
+ const path = await import('path');
617
+ const fs = await import('fs/promises');
618
+ const absoluteSchemaPath = path.resolve(process.cwd(), schemaPath);
619
+ const absoluteOutputPath = path.resolve(process.cwd(), outputPath);
620
+ const schemaModule = await compileAndImportModule(absoluteSchemaPath, '.temp-schema.mjs');
621
+ let schemas = schemaModule.schemaTypes || schemaModule.default;
622
+ if (!schemas || !Array.isArray(schemas)) {
623
+ throw new Error('Invalid schema file: expected schemaTypes array export');
624
+ }
625
+ // Apply plugin schema-transforms so plugin-provided field types (e.g. `type: 'color'`)
626
+ // desugar exactly as they do at runtime — without this, codegen emits `unknown` for
627
+ // them. `pluginsPath` points at the app's client-safe plugin registry (e.g.
628
+ // `src/lib/plugins.ts`, exporting `plugins`).
629
+ if (pluginsPath) {
630
+ const absolutePluginsPath = path.resolve(process.cwd(), pluginsPath);
631
+ // Resolve cms-core's built dist so the plugins' cms-core runtime imports load
632
+ // (the source `.ts` entry can't run in Node). Present in both the monorepo
633
+ // (symlink) and real installs (published dist).
634
+ const fsSync = await import('fs');
635
+ const cmsCoreDistCandidate = path.join(process.cwd(), 'node_modules/@aphexcms/cms-core/dist/index.js');
636
+ const cmsCoreDist = fsSync.existsSync(cmsCoreDistCandidate)
637
+ ? cmsCoreDistCandidate
638
+ : undefined;
639
+ const pluginsModule = await compileAndImportModule(absolutePluginsPath, '.temp-plugins.mjs', {
640
+ bundlePlugins: true,
641
+ cmsCoreDist
642
+ });
643
+ const plugins = (pluginsModule.plugins || pluginsModule.default);
644
+ if (Array.isArray(plugins)) {
645
+ schemas = createPartResolver(plugins).applySchemaTransforms(schemas);
646
+ }
647
+ }
648
+ const generatedTypes = generateTypes(schemas);
649
+ // Write to output file
650
+ await fs.writeFile(absoluteOutputPath, generatedTypes, 'utf-8');
651
+ console.log(`✅ Types generated successfully at: ${absoluteOutputPath}`);
652
+ }
653
+ catch (error) {
654
+ console.error('❌ Failed to generate types:', error);
655
+ throw error;
656
+ }
657
+ }
658
+ //# sourceMappingURL=type-gen.js.map