@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.
- package/dist/admin/block-previews.svelte.d.ts +46 -0
- package/dist/admin/block-previews.svelte.d.ts.map +1 -0
- package/dist/admin/block-previews.svelte.js +26 -0
- package/dist/admin/field-components.svelte.d.ts +16 -0
- package/dist/admin/field-components.svelte.d.ts.map +1 -0
- package/dist/admin/field-components.svelte.js +18 -0
- package/dist/admin/nav.svelte.d.ts +34 -0
- package/dist/admin/nav.svelte.d.ts.map +1 -0
- package/dist/admin/nav.svelte.js +78 -0
- package/dist/admin/slots.svelte.d.ts +50 -0
- package/dist/admin/slots.svelte.d.ts.map +1 -0
- package/dist/admin/slots.svelte.js +67 -0
- package/dist/admin/types.d.ts +7 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +1 -0
- package/dist/api/schemas/api-keys.d.ts +4 -37
- package/dist/api/schemas/api-keys.d.ts.map +1 -1
- package/dist/api/schemas/api-keys.js +5 -2
- package/dist/api/schemas/assets.d.ts +4 -0
- package/dist/api/schemas/assets.d.ts.map +1 -1
- package/dist/api/schemas/assets.js +3 -0
- package/dist/api/schemas/plugin-settings.d.ts +6 -0
- package/dist/api/schemas/plugin-settings.d.ts.map +1 -0
- package/dist/api/schemas/plugin-settings.js +8 -0
- package/dist/api/schemas/roles.d.ts +7 -56
- package/dist/api/schemas/roles.d.ts.map +1 -1
- package/dist/api/schemas/roles.js +11 -6
- package/dist/api/schemas/user.d.ts +2 -1
- package/dist/api/schemas/user.d.ts.map +1 -1
- package/dist/api/schemas/user.js +7 -2
- package/dist/app-augment.d.ts +11 -0
- package/dist/app-augment.d.ts.map +1 -1
- package/dist/app.d.ts +2 -0
- package/dist/auth/provider.d.ts +3 -0
- package/dist/auth/provider.d.ts.map +1 -1
- package/dist/cli/index.js +4 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +9 -0
- package/dist/components/AdminApp.svelte +259 -113
- package/dist/components/AdminApp.svelte.d.ts +18 -2
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/AdminSlot.svelte +18 -0
- package/dist/components/admin/AdminSlot.svelte.d.ts +12 -0
- package/dist/components/admin/AdminSlot.svelte.d.ts.map +1 -0
- package/dist/components/admin/DocumentEditor.svelte +646 -385
- package/dist/components/admin/DocumentEditor.svelte.d.ts +13 -0
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
- package/dist/components/admin/MediaBrowser.svelte +13 -3
- package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
- package/dist/components/admin/PluginSettingsPanel.svelte +231 -0
- package/dist/components/admin/PluginSettingsPanel.svelte.d.ts +8 -0
- package/dist/components/admin/PluginSettingsPanel.svelte.d.ts.map +1 -0
- package/dist/components/admin/SchemaField.svelte +76 -95
- package/dist/components/admin/SchemaField.svelte.d.ts +7 -0
- package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ArrayField.svelte +24 -2
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/FieldInput.svelte +109 -0
- package/dist/components/admin/fields/FieldInput.svelte.d.ts +17 -0
- package/dist/components/admin/fields/FieldInput.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/richtext/PortableTextImageView.svelte +5 -12
- package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts +2 -9
- package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte +18 -17
- package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts +2 -9
- package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/richtext/RichtextField.svelte +55 -2
- package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts +7 -0
- package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -1
- package/dist/components/admin/fields/richtext/portable-text-object-node.js +4 -2
- package/dist/components/admin/fields/richtext/svelte-node-view.d.ts +16 -1
- package/dist/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
- package/dist/components/admin/fields/richtext/svelte-node-view.js +20 -1
- package/dist/components/layout/OrganizationSwitcher.svelte +31 -10
- package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -1
- package/dist/components/layout/Sidebar.svelte +49 -11
- package/dist/components/layout/Sidebar.svelte.d.ts +5 -1
- package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
- package/dist/components/layout/sidebar/AppSidebar.svelte +66 -3
- package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +5 -0
- package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -1
- package/dist/components/layout/sidebar/NavMain.svelte +3 -2
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts +4 -3
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -1
- package/dist/components/layout/sidebar/NavUser.svelte +5 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -0
- package/dist/db/interfaces/asset.d.ts +1 -0
- package/dist/db/interfaces/asset.d.ts.map +1 -1
- package/dist/db/interfaces/index.d.ts +3 -1
- package/dist/db/interfaces/index.d.ts.map +1 -1
- package/dist/db/interfaces/plugin-settings.d.ts +23 -0
- package/dist/db/interfaces/plugin-settings.d.ts.map +1 -0
- package/dist/db/interfaces/plugin-settings.js +13 -0
- package/dist/db/interfaces/role.d.ts +14 -5
- package/dist/db/interfaces/role.d.ts.map +1 -1
- package/dist/engine.d.ts +28 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +44 -0
- package/dist/hooks.d.ts +6 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +59 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/lib/admin/block-previews.svelte.d.ts +46 -0
- package/dist/lib/admin/block-previews.svelte.d.ts.map +1 -0
- package/dist/lib/admin/block-previews.svelte.js +27 -0
- package/dist/lib/admin/block-previews.svelte.js.map +1 -0
- package/dist/lib/admin/field-components.svelte.d.ts +16 -0
- package/dist/lib/admin/field-components.svelte.d.ts.map +1 -0
- package/dist/lib/admin/field-components.svelte.js +19 -0
- package/dist/lib/admin/field-components.svelte.js.map +1 -0
- package/dist/lib/admin/nav.svelte.d.ts +34 -0
- package/dist/lib/admin/nav.svelte.d.ts.map +1 -0
- package/dist/lib/admin/nav.svelte.js +79 -0
- package/dist/lib/admin/nav.svelte.js.map +1 -0
- package/dist/lib/admin/slots.svelte.d.ts +50 -0
- package/dist/lib/admin/slots.svelte.d.ts.map +1 -0
- package/dist/lib/admin/slots.svelte.js +68 -0
- package/dist/lib/admin/slots.svelte.js.map +1 -0
- package/dist/lib/admin/types.d.ts +7 -0
- package/dist/lib/admin/types.d.ts.map +1 -0
- package/dist/lib/admin/types.js +2 -0
- package/dist/lib/admin/types.js.map +1 -0
- package/dist/lib/api/schemas/api-keys.d.ts +4 -37
- package/dist/lib/api/schemas/api-keys.d.ts.map +1 -1
- package/dist/lib/api/schemas/api-keys.js +5 -2
- package/dist/lib/api/schemas/api-keys.js.map +1 -1
- package/dist/lib/api/schemas/assets.d.ts +4 -0
- package/dist/lib/api/schemas/assets.d.ts.map +1 -1
- package/dist/lib/api/schemas/assets.js +3 -0
- package/dist/lib/api/schemas/assets.js.map +1 -1
- package/dist/lib/api/schemas/plugin-settings.d.ts +6 -0
- package/dist/lib/api/schemas/plugin-settings.d.ts.map +1 -0
- package/dist/lib/api/schemas/plugin-settings.js +9 -0
- package/dist/lib/api/schemas/plugin-settings.js.map +1 -0
- package/dist/lib/api/schemas/roles.d.ts +7 -56
- package/dist/lib/api/schemas/roles.d.ts.map +1 -1
- package/dist/lib/api/schemas/roles.js +11 -6
- package/dist/lib/api/schemas/roles.js.map +1 -1
- package/dist/lib/api/schemas/user.d.ts +2 -1
- package/dist/lib/api/schemas/user.d.ts.map +1 -1
- package/dist/lib/api/schemas/user.js +7 -2
- package/dist/lib/api/schemas/user.js.map +1 -1
- package/dist/lib/app-augment.d.ts +11 -0
- package/dist/lib/app-augment.d.ts.map +1 -1
- package/dist/lib/auth/provider.d.ts +3 -0
- package/dist/lib/auth/provider.d.ts.map +1 -1
- package/dist/lib/client/index.d.ts +6 -0
- package/dist/lib/client/index.d.ts.map +1 -1
- package/dist/lib/client/index.js +9 -0
- package/dist/lib/client/index.js.map +1 -1
- package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts +7 -0
- package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -1
- package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js +4 -2
- package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js.map +1 -1
- package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts +16 -1
- package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
- package/dist/lib/components/admin/fields/richtext/svelte-node-view.js +20 -1
- package/dist/lib/components/admin/fields/richtext/svelte-node-view.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +11 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/db/interfaces/asset.d.ts +1 -0
- package/dist/lib/db/interfaces/asset.d.ts.map +1 -1
- package/dist/lib/db/interfaces/index.d.ts +3 -1
- package/dist/lib/db/interfaces/index.d.ts.map +1 -1
- package/dist/lib/db/interfaces/plugin-settings.d.ts +23 -0
- package/dist/lib/db/interfaces/plugin-settings.d.ts.map +1 -0
- package/dist/lib/db/interfaces/plugin-settings.js +14 -0
- package/dist/lib/db/interfaces/plugin-settings.js.map +1 -0
- package/dist/lib/db/interfaces/role.d.ts +14 -5
- package/dist/lib/db/interfaces/role.d.ts.map +1 -1
- package/dist/lib/engine.d.ts +28 -0
- package/dist/lib/engine.d.ts.map +1 -1
- package/dist/lib/engine.js +44 -0
- package/dist/lib/engine.js.map +1 -1
- package/dist/lib/hooks.d.ts +6 -0
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +59 -2
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +5 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/local-api/collection-api.d.ts.map +1 -1
- package/dist/lib/local-api/collection-api.js +4 -2
- package/dist/lib/local-api/collection-api.js.map +1 -1
- package/dist/lib/local-api/types.d.ts +8 -0
- package/dist/lib/local-api/types.d.ts.map +1 -1
- package/dist/lib/mcp/tools.d.ts.map +1 -1
- package/dist/lib/mcp/tools.js +69 -1
- package/dist/lib/mcp/tools.js.map +1 -1
- package/dist/lib/permissions-context.svelte.d.ts +7 -4
- package/dist/lib/permissions-context.svelte.d.ts.map +1 -1
- package/dist/lib/permissions-context.svelte.js.map +1 -1
- package/dist/lib/plugins/index.d.ts +3 -0
- package/dist/lib/plugins/index.d.ts.map +1 -0
- package/dist/lib/plugins/index.js +3 -0
- package/dist/lib/plugins/index.js.map +1 -0
- package/dist/lib/plugins/resolver.d.ts +49 -0
- package/dist/lib/plugins/resolver.d.ts.map +1 -0
- package/dist/lib/plugins/resolver.js +66 -0
- package/dist/lib/plugins/resolver.js.map +1 -0
- package/dist/lib/plugins/types.d.ts +233 -0
- package/dist/lib/plugins/types.d.ts.map +1 -0
- package/dist/lib/plugins/types.js +9 -0
- package/dist/lib/plugins/types.js.map +1 -0
- package/dist/lib/schema-utils/desugar.d.ts +27 -0
- package/dist/lib/schema-utils/desugar.d.ts.map +1 -0
- package/dist/lib/schema-utils/desugar.js +102 -0
- package/dist/lib/schema-utils/desugar.js.map +1 -0
- package/dist/lib/schema-utils/index.d.ts +2 -0
- package/dist/lib/schema-utils/index.d.ts.map +1 -1
- package/dist/lib/schema-utils/index.js +2 -0
- package/dist/lib/schema-utils/index.js.map +1 -1
- package/dist/lib/schema-utils/settings.d.ts +17 -0
- package/dist/lib/schema-utils/settings.d.ts.map +1 -0
- package/dist/lib/schema-utils/settings.js +23 -0
- package/dist/lib/schema-utils/settings.js.map +1 -0
- package/dist/lib/schema-utils/validator.d.ts.map +1 -1
- package/dist/lib/schema-utils/validator.js +11 -0
- package/dist/lib/schema-utils/validator.js.map +1 -1
- package/dist/lib/security/secret-crypto.d.ts +18 -0
- package/dist/lib/security/secret-crypto.d.ts.map +1 -0
- package/dist/lib/security/secret-crypto.js +71 -0
- package/dist/lib/security/secret-crypto.js.map +1 -0
- package/dist/lib/server/api/index.d.ts.map +1 -1
- package/dist/lib/server/api/index.js +3 -0
- package/dist/lib/server/api/index.js.map +1 -1
- package/dist/lib/server/api/routes/assets.d.ts.map +1 -1
- package/dist/lib/server/api/routes/assets.js +8 -2
- package/dist/lib/server/api/routes/assets.js.map +1 -1
- package/dist/lib/server/api/routes/organizations.d.ts.map +1 -1
- package/dist/lib/server/api/routes/organizations.js +4 -1
- package/dist/lib/server/api/routes/organizations.js.map +1 -1
- package/dist/lib/server/api/routes/plugin-settings.d.ts +4 -0
- package/dist/lib/server/api/routes/plugin-settings.d.ts.map +1 -0
- package/dist/lib/server/api/routes/plugin-settings.js +109 -0
- package/dist/lib/server/api/routes/plugin-settings.js.map +1 -0
- package/dist/lib/server/api/routes/roles.d.ts.map +1 -1
- package/dist/lib/server/api/routes/roles.js +37 -0
- package/dist/lib/server/api/routes/roles.js.map +1 -1
- package/dist/lib/server/api/routes/user.d.ts.map +1 -1
- package/dist/lib/server/api/routes/user.js +14 -3
- package/dist/lib/server/api/routes/user.js.map +1 -1
- package/dist/lib/services/asset-service.d.ts +1 -0
- package/dist/lib/services/asset-service.d.ts.map +1 -1
- package/dist/lib/services/asset-service.js.map +1 -1
- package/dist/lib/services/index.d.ts +2 -0
- package/dist/lib/services/index.d.ts.map +1 -1
- package/dist/lib/services/index.js +1 -0
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/plugin-settings-service.d.ts +76 -0
- package/dist/lib/services/plugin-settings-service.d.ts.map +1 -0
- package/dist/lib/services/plugin-settings-service.js +236 -0
- package/dist/lib/services/plugin-settings-service.js.map +1 -0
- package/dist/lib/services/roles-service.d.ts +2 -2
- package/dist/lib/services/roles-service.d.ts.map +1 -1
- package/dist/lib/services/roles-service.js.map +1 -1
- package/dist/lib/theme/css.d.ts +30 -0
- package/dist/lib/theme/css.d.ts.map +1 -0
- package/dist/lib/theme/css.js +54 -0
- package/dist/lib/theme/css.js.map +1 -0
- package/dist/lib/theme/derive.d.ts +27 -0
- package/dist/lib/theme/derive.d.ts.map +1 -0
- package/dist/lib/theme/derive.js +108 -0
- package/dist/lib/theme/derive.js.map +1 -0
- package/dist/lib/theme/index.d.ts +5 -0
- package/dist/lib/theme/index.d.ts.map +1 -0
- package/dist/lib/theme/index.js +5 -0
- package/dist/lib/theme/index.js.map +1 -0
- package/dist/lib/theme/schemes.d.ts +60 -0
- package/dist/lib/theme/schemes.d.ts.map +1 -0
- package/dist/lib/theme/schemes.js +150 -0
- package/dist/lib/theme/schemes.js.map +1 -0
- package/dist/lib/theme/tokens.d.ts +57 -0
- package/dist/lib/theme/tokens.d.ts.map +1 -0
- package/dist/lib/theme/tokens.js +11 -0
- package/dist/lib/theme/tokens.js.map +1 -0
- package/dist/{cli/generate-types.d.ts → lib/type-gen.d.ts} +3 -6
- package/dist/lib/type-gen.d.ts.map +1 -0
- package/dist/lib/type-gen.js +658 -0
- package/dist/lib/type-gen.js.map +1 -0
- package/dist/lib/types/auth.d.ts +10 -10
- package/dist/lib/types/auth.d.ts.map +1 -1
- package/dist/lib/types/capabilities.d.ts +50 -9
- package/dist/lib/types/capabilities.d.ts.map +1 -1
- package/dist/lib/types/capabilities.js +147 -5
- package/dist/lib/types/capabilities.js.map +1 -1
- package/dist/lib/types/config.d.ts +30 -1
- package/dist/lib/types/config.d.ts.map +1 -1
- package/dist/lib/types/schemas.d.ts +90 -2
- package/dist/lib/types/schemas.d.ts.map +1 -1
- package/dist/lib/types/schemas.js.map +1 -1
- package/dist/lib/types/sidebar.d.ts +3 -1
- package/dist/lib/types/sidebar.d.ts.map +1 -1
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.d.ts.map +1 -1
- package/dist/lib/utils/index.js +1 -0
- package/dist/lib/utils/index.js.map +1 -1
- package/dist/lib/utils/preview.d.ts +16 -5
- package/dist/lib/utils/preview.d.ts.map +1 -1
- package/dist/lib/utils/preview.js +7 -2
- package/dist/lib/utils/preview.js.map +1 -1
- package/dist/lib/vite/index.d.ts +7 -0
- package/dist/lib/vite/index.d.ts.map +1 -1
- package/dist/lib/vite/index.js +37 -6
- package/dist/lib/vite/index.js.map +1 -1
- package/dist/local-api/collection-api.d.ts.map +1 -1
- package/dist/local-api/collection-api.js +4 -2
- package/dist/local-api/types.d.ts +8 -0
- package/dist/local-api/types.d.ts.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +69 -1
- package/dist/permissions-context.svelte.d.ts +7 -4
- package/dist/permissions-context.svelte.d.ts.map +1 -1
- package/dist/plugins/index.d.ts +3 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +2 -0
- package/dist/plugins/resolver.d.ts +49 -0
- package/dist/plugins/resolver.d.ts.map +1 -0
- package/dist/plugins/resolver.js +65 -0
- package/dist/plugins/types.d.ts +233 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +8 -0
- package/dist/schema-utils/desugar.d.ts +27 -0
- package/dist/schema-utils/desugar.d.ts.map +1 -0
- package/dist/schema-utils/desugar.js +101 -0
- package/dist/schema-utils/index.d.ts +2 -0
- package/dist/schema-utils/index.d.ts.map +1 -1
- package/dist/schema-utils/index.js +2 -0
- package/dist/schema-utils/settings.d.ts +17 -0
- package/dist/schema-utils/settings.d.ts.map +1 -0
- package/dist/schema-utils/settings.js +22 -0
- package/dist/schema-utils/validator.d.ts.map +1 -1
- package/dist/schema-utils/validator.js +11 -0
- package/dist/security/secret-crypto.d.ts +18 -0
- package/dist/security/secret-crypto.d.ts.map +1 -0
- package/dist/security/secret-crypto.js +70 -0
- package/dist/server/api/index.d.ts.map +1 -1
- package/dist/server/api/index.js +3 -0
- package/dist/server/api/routes/assets.d.ts.map +1 -1
- package/dist/server/api/routes/assets.js +8 -2
- package/dist/server/api/routes/organizations.d.ts.map +1 -1
- package/dist/server/api/routes/organizations.js +4 -1
- package/dist/server/api/routes/plugin-settings.d.ts +4 -0
- package/dist/server/api/routes/plugin-settings.d.ts.map +1 -0
- package/dist/server/api/routes/plugin-settings.js +108 -0
- package/dist/server/api/routes/roles.d.ts.map +1 -1
- package/dist/server/api/routes/roles.js +37 -0
- package/dist/server/api/routes/user.d.ts.map +1 -1
- package/dist/server/api/routes/user.js +14 -3
- package/dist/services/asset-service.d.ts +1 -0
- package/dist/services/asset-service.d.ts.map +1 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/plugin-settings-service.d.ts +76 -0
- package/dist/services/plugin-settings-service.d.ts.map +1 -0
- package/dist/services/plugin-settings-service.js +235 -0
- package/dist/services/roles-service.d.ts +2 -2
- package/dist/services/roles-service.d.ts.map +1 -1
- package/dist/theme/css.d.ts +30 -0
- package/dist/theme/css.d.ts.map +1 -0
- package/dist/theme/css.js +53 -0
- package/dist/theme/derive.d.ts +27 -0
- package/dist/theme/derive.d.ts.map +1 -0
- package/dist/theme/derive.js +107 -0
- package/dist/theme/index.d.ts +5 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +4 -0
- package/dist/theme/schemes.d.ts +60 -0
- package/dist/theme/schemes.d.ts.map +1 -0
- package/dist/theme/schemes.js +149 -0
- package/dist/theme/tokens.d.ts +57 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +10 -0
- package/dist/type-gen.d.ts +19 -0
- package/dist/type-gen.d.ts.map +1 -0
- package/dist/{cli/generate-types.js → type-gen.js} +101 -68
- package/dist/types/auth.d.ts +10 -10
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/capabilities.d.ts +50 -9
- package/dist/types/capabilities.d.ts.map +1 -1
- package/dist/types/capabilities.js +147 -5
- package/dist/types/config.d.ts +30 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/schemas.d.ts +90 -2
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/types/sidebar.d.ts +3 -1
- package/dist/types/sidebar.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/preview.d.ts +16 -5
- package/dist/utils/preview.d.ts.map +1 -1
- package/dist/utils/preview.js +7 -2
- package/dist/vite/index.d.ts +7 -0
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +37 -6
- package/package.json +6 -4
- package/dist/cli/generate-types.d.ts.map +0 -1
- 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
|