@aphexcms/cms-core 9.4.0 → 9.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/generate-types.d.ts +1 -4
- package/dist/cli/generate-types.d.ts.map +1 -1
- package/dist/cli/generate-types.js +99 -65
- package/dist/cli/generate-types.js.map +1 -1
- package/dist/cli/index.js +3 -3
- 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 +68 -0
- 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/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 +68 -0
- 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/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/hooks.js
CHANGED
|
@@ -1,11 +1,35 @@
|
|
|
1
1
|
import { handleAuthHook } from './auth/auth-hooks.js';
|
|
2
|
+
import { getPreviewPerspective } from './preview/perspective.js';
|
|
3
|
+
import { resolveCapabilities } from './types/capabilities.js';
|
|
2
4
|
import { cmsLogger, setLogLevel, setLogger } from './utils/logger.js';
|
|
3
5
|
import { createStorageAdapter as createStorageAdapterProvider } from './storage/providers/storage.js';
|
|
4
6
|
import { AssetService as AssetServiceClass } from './services/asset-service.js';
|
|
5
7
|
import { RolesService } from './services/roles-service.js';
|
|
8
|
+
import { PluginSettingsService } from './services/plugin-settings-service.js';
|
|
6
9
|
import { createCMS } from './engine.js';
|
|
7
10
|
import { createLocalAPI } from './local-api/index.js';
|
|
11
|
+
import { createPartResolver } from './plugins/resolver.js';
|
|
8
12
|
import { createAphexApi, mountAphexBuiltins, toHonoHandler } from './server/api/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* Wrap a plugin route handler so it enforces `requiredCapabilities` before running.
|
|
15
|
+
* 401 when there's no authenticated principal at all; 403 when authenticated but
|
|
16
|
+
* missing a required capability. Uses the same server-resolved capability set every
|
|
17
|
+
* core resource checks — the client can't forge it.
|
|
18
|
+
*/
|
|
19
|
+
function gateHandler(handler, required) {
|
|
20
|
+
return (c) => {
|
|
21
|
+
const auth = c.var.auth;
|
|
22
|
+
if (!auth || auth.type === 'partial_session') {
|
|
23
|
+
return c.json({ success: false, error: 'Authentication required' }, 401);
|
|
24
|
+
}
|
|
25
|
+
const caps = resolveCapabilities(auth);
|
|
26
|
+
const missing = required.filter((cap) => !caps.has(cap));
|
|
27
|
+
if (missing.length > 0) {
|
|
28
|
+
return c.json({ success: false, error: 'Insufficient permissions', missingCapabilities: missing }, 403);
|
|
29
|
+
}
|
|
30
|
+
return handler(c);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
9
33
|
let cmsInstances = null;
|
|
10
34
|
let schemaError = null;
|
|
11
35
|
let initPromise = null;
|
|
@@ -89,8 +113,28 @@ export function createCMSHook(config) {
|
|
|
89
113
|
// Build the Hono API app shell. User middleware/overrides register
|
|
90
114
|
// FIRST (so they sit ahead of built-ins in the chain), then we mount
|
|
91
115
|
// the built-in routes, then GraphQL.
|
|
116
|
+
// Index plugin parts (validates duplicate part ids). Mount plugin server
|
|
117
|
+
// routes after the user's `api` hook and before built-ins, so a plugin's
|
|
118
|
+
// `POST /bookings` becomes `POST /api/bookings`, overridable by the app.
|
|
119
|
+
const partResolver = createPartResolver(currentConfig.plugins ?? []);
|
|
120
|
+
// Per-(org, plugin) config store — merges declared defaults with stored
|
|
121
|
+
// values and writes edits back, scoped to the org. The encryption key gates
|
|
122
|
+
// `secret` fields (absent → secrets disabled, fail safe).
|
|
123
|
+
const pluginSettingsService = new PluginSettingsService(databaseAdapter, partResolver, currentConfig.security?.secretEncryptionKey ?? null);
|
|
92
124
|
const apiApp = createAphexApi();
|
|
93
125
|
currentConfig.api?.(apiApp);
|
|
126
|
+
for (const route of partResolver.serverRoutes()) {
|
|
127
|
+
// Gate every plugin route by its declared `requiredCapabilities` before the
|
|
128
|
+
// handler runs, so a declared capability is ENFORCED rather than merely
|
|
129
|
+
// documented. `'public'` is the single ungated path and the author had to
|
|
130
|
+
// write it: an empty list still requires authentication, and omitting the
|
|
131
|
+
// field entirely doesn't type-check. Ungated is therefore always a choice,
|
|
132
|
+
// never an oversight.
|
|
133
|
+
const handler = route.requiredCapabilities === 'public'
|
|
134
|
+
? route.handler
|
|
135
|
+
: gateHandler(route.handler, route.requiredCapabilities);
|
|
136
|
+
apiApp.on(route.method, route.path, handler);
|
|
137
|
+
}
|
|
94
138
|
mountAphexBuiltins(apiApp);
|
|
95
139
|
// Initialize schemas with validation
|
|
96
140
|
try {
|
|
@@ -115,9 +159,11 @@ export function createCMSHook(config) {
|
|
|
115
159
|
cmsEngine,
|
|
116
160
|
localAPI,
|
|
117
161
|
rolesService,
|
|
162
|
+
pluginSettingsService,
|
|
118
163
|
logger: cmsLogger,
|
|
119
164
|
auth: currentConfig.auth?.provider,
|
|
120
|
-
apiApp
|
|
165
|
+
apiApp,
|
|
166
|
+
partResolver
|
|
121
167
|
}, currentConfig.schemaTypes, graphqlConfig);
|
|
122
168
|
// Register GraphQL directly on the Hono app. The Yoga handler
|
|
123
169
|
// internally distinguishes GET (GraphiQL UI) from POST (queries),
|
|
@@ -147,10 +193,12 @@ export function createCMSHook(config) {
|
|
|
147
193
|
cmsEngine: cmsEngine,
|
|
148
194
|
localAPI: localAPI,
|
|
149
195
|
rolesService,
|
|
196
|
+
pluginSettingsService,
|
|
150
197
|
logger: cmsLogger,
|
|
151
198
|
auth: currentConfig.auth?.provider,
|
|
152
199
|
graphqlSettings,
|
|
153
|
-
apiApp
|
|
200
|
+
apiApp,
|
|
201
|
+
partResolver
|
|
154
202
|
};
|
|
155
203
|
resolveInit();
|
|
156
204
|
}
|
|
@@ -166,6 +214,15 @@ export function createCMSHook(config) {
|
|
|
166
214
|
if (authResponse)
|
|
167
215
|
return authResponse;
|
|
168
216
|
}
|
|
217
|
+
// Resolve the read perspective once per request so site loads inherit it
|
|
218
|
+
// (published normally / draft in an authenticated `?aphex-preview` session)
|
|
219
|
+
// via `locals.previewPerspective` — no per-load wiring. Apps can override the
|
|
220
|
+
// policy with `config.preview.resolvePerspective`.
|
|
221
|
+
event.locals.previewPerspective =
|
|
222
|
+
currentConfig.preview?.resolvePerspective?.({
|
|
223
|
+
auth: event.locals.auth,
|
|
224
|
+
url: event.url
|
|
225
|
+
}) ?? getPreviewPerspective(event.locals.auth, event.url);
|
|
169
226
|
return resolve(event);
|
|
170
227
|
};
|
|
171
228
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export * from './field-validation/rule.js';
|
|
|
4
4
|
export * from './field-validation/utils.js';
|
|
5
5
|
export { createContentHash, hasUnpublishedChanges } from './utils/content-hash.js';
|
|
6
6
|
export * from './schema-utils/index.js';
|
|
7
|
+
export * from './theme/index.js';
|
|
8
|
+
export * from './plugins/index.js';
|
|
7
9
|
export * from './utils/index.js';
|
|
8
10
|
export * from './api/index.js';
|
|
9
11
|
export type { ApiResponse } from './api/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAkBA,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGjG,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,cAAc,sBAAsB,CAAC;AAGrC,cAAc,eAAe,CAAC;AAG9B,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAkBA,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGjG,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,cAAc,sBAAsB,CAAC;AAGrC,cAAc,eAAe,CAAC;AAI9B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,eAAe,CAAC;AAG9B,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -23,6 +23,11 @@ export * from './field-validation/utils.js';
|
|
|
23
23
|
export { createContentHash, hasUnpublishedChanges } from './utils/content-hash.js';
|
|
24
24
|
// Schema utilities
|
|
25
25
|
export * from './schema-utils/index.js';
|
|
26
|
+
// Theme design-system tokens — plain TS (Svelte-free), safe for the universal barrel.
|
|
27
|
+
export * from './theme/index.js';
|
|
28
|
+
// Plugin API — definePlugin(), part types, part resolver. Runtime is plain JS
|
|
29
|
+
// (svelte/hono imports are type-only), so it's safe on both server and client.
|
|
30
|
+
export * from './plugins/index.js';
|
|
26
31
|
// General utility functions (logger, image URL builder, etc)
|
|
27
32
|
export * from './utils/index.js';
|
|
28
33
|
// Unified API client
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rich-text block preview registry (client-side context).
|
|
3
|
+
*
|
|
4
|
+
* By default a custom Portable Text block renders in the editor as a generic card
|
|
5
|
+
* (title/subtitle from its `preview` config). That's fine for data-ish blocks, but for
|
|
6
|
+
* visual ones — an embed, a gallery, a button — authors expect to see the real thing
|
|
7
|
+
* inline while writing (the Ghost/Sanity "what you see is what you get" editor).
|
|
8
|
+
*
|
|
9
|
+
* An app registers a preview per block `_type`; RichtextField resolves it and the
|
|
10
|
+
* ProseMirror node view mounts it INSTEAD of the generic card. The preview still gets
|
|
11
|
+
* `onEdit`/`onDelete` so the block stays editable and removable.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately separate from the field-component registry: that one supplies *inputs*
|
|
14
|
+
* (`field`/`value`/`onUpdate`); this one supplies *renderers* (`data`/`onEdit`). Same
|
|
15
|
+
* idea, different contract.
|
|
16
|
+
*/
|
|
17
|
+
import { type Component } from 'svelte';
|
|
18
|
+
import type { PreviewSource } from '../utils/preview.js';
|
|
19
|
+
/**
|
|
20
|
+
* The stable props a block preview component receives.
|
|
21
|
+
*
|
|
22
|
+
* Also the contract for core's own built-in views (the generic card and the image
|
|
23
|
+
* view), so all three are mountable by the node view through one type.
|
|
24
|
+
*/
|
|
25
|
+
export interface BlockPreviewProps {
|
|
26
|
+
/** The block's `_type`. */
|
|
27
|
+
type: string;
|
|
28
|
+
/** The block's `_key` — its stable identity within the field's array. */
|
|
29
|
+
nodeKey: string;
|
|
30
|
+
/** The block's stored data (its fields). */
|
|
31
|
+
data: Record<string, unknown>;
|
|
32
|
+
/** The block type's schema, for reading its `preview` config if useful. */
|
|
33
|
+
schema?: PreviewSource;
|
|
34
|
+
/** True while the block is selected in the editor. */
|
|
35
|
+
selected?: boolean;
|
|
36
|
+
/** Open the block's edit modal — wire this to a click/edit affordance. */
|
|
37
|
+
onEdit: () => void;
|
|
38
|
+
/** Remove the block. */
|
|
39
|
+
onDelete: () => void;
|
|
40
|
+
}
|
|
41
|
+
export type BlockPreviewLookup = (type: string) => Component<BlockPreviewProps> | undefined;
|
|
42
|
+
/** Publish the block-preview lookup to descendants (call in the admin shell). */
|
|
43
|
+
export declare function setBlockPreviews(lookup: BlockPreviewLookup): void;
|
|
44
|
+
/** Resolve the lookup. Returns a no-op lookup outside the admin shell. */
|
|
45
|
+
export declare function useBlockPreviews(): BlockPreviewLookup;
|
|
46
|
+
//# sourceMappingURL=block-previews.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-previews.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/admin/block-previews.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IACjC,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;AAI5F,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAEjE;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,IAAI,kBAAkB,CAErD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rich-text block preview registry (client-side context).
|
|
3
|
+
*
|
|
4
|
+
* By default a custom Portable Text block renders in the editor as a generic card
|
|
5
|
+
* (title/subtitle from its `preview` config). That's fine for data-ish blocks, but for
|
|
6
|
+
* visual ones — an embed, a gallery, a button — authors expect to see the real thing
|
|
7
|
+
* inline while writing (the Ghost/Sanity "what you see is what you get" editor).
|
|
8
|
+
*
|
|
9
|
+
* An app registers a preview per block `_type`; RichtextField resolves it and the
|
|
10
|
+
* ProseMirror node view mounts it INSTEAD of the generic card. The preview still gets
|
|
11
|
+
* `onEdit`/`onDelete` so the block stays editable and removable.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately separate from the field-component registry: that one supplies *inputs*
|
|
14
|
+
* (`field`/`value`/`onUpdate`); this one supplies *renderers* (`data`/`onEdit`). Same
|
|
15
|
+
* idea, different contract.
|
|
16
|
+
*/
|
|
17
|
+
import { getContext, setContext } from 'svelte';
|
|
18
|
+
const BLOCK_PREVIEWS_KEY = Symbol.for('aphex.admin.block-previews');
|
|
19
|
+
/** Publish the block-preview lookup to descendants (call in the admin shell). */
|
|
20
|
+
export function setBlockPreviews(lookup) {
|
|
21
|
+
setContext(BLOCK_PREVIEWS_KEY, lookup);
|
|
22
|
+
}
|
|
23
|
+
/** Resolve the lookup. Returns a no-op lookup outside the admin shell. */
|
|
24
|
+
export function useBlockPreviews() {
|
|
25
|
+
return getContext(BLOCK_PREVIEWS_KEY) ?? (() => undefined);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=block-previews.svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-previews.svelte.js","sourceRoot":"","sources":["../../../src/lib/admin/block-previews.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAkB,MAAM,QAAQ,CAAC;AA4BhE,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAEpE,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,MAA0B;IAC1D,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB;IAC/B,OAAO,UAAU,CAAiC,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC5F,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-input widget registry (client-side context).
|
|
3
|
+
*
|
|
4
|
+
* Plugins contribute custom input widgets via `aphex/field/component` parts, keyed
|
|
5
|
+
* by an `input` string. A field opts into one with `{ …, input: 'color' }`.
|
|
6
|
+
* The admin shell publishes a lookup here; SchemaField (however deeply nested)
|
|
7
|
+
* resolves the widget and renders it in place of the built-in for that field type.
|
|
8
|
+
*/
|
|
9
|
+
import { type Component } from 'svelte';
|
|
10
|
+
import type { FieldComponentProps } from '../plugins/types.js';
|
|
11
|
+
export type FieldComponentLookup = (input: string) => Component<FieldComponentProps> | undefined;
|
|
12
|
+
/** Publish the widget lookup to descendants (call in the admin shell). */
|
|
13
|
+
export declare function setFieldComponents(lookup: FieldComponentLookup): void;
|
|
14
|
+
/** Resolve the widget lookup. Returns a no-op lookup outside the admin shell. */
|
|
15
|
+
export declare function useFieldComponents(): FieldComponentLookup;
|
|
16
|
+
//# sourceMappingURL=field-components.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-components.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/admin/field-components.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,mBAAmB,CAAC,GAAG,SAAS,CAAC;AAIjG,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAErE;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,IAAI,oBAAoB,CAEzD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-input widget registry (client-side context).
|
|
3
|
+
*
|
|
4
|
+
* Plugins contribute custom input widgets via `aphex/field/component` parts, keyed
|
|
5
|
+
* by an `input` string. A field opts into one with `{ …, input: 'color' }`.
|
|
6
|
+
* The admin shell publishes a lookup here; SchemaField (however deeply nested)
|
|
7
|
+
* resolves the widget and renders it in place of the built-in for that field type.
|
|
8
|
+
*/
|
|
9
|
+
import { getContext, setContext } from 'svelte';
|
|
10
|
+
const FIELD_COMPONENTS_KEY = Symbol.for('aphex.admin.field-components');
|
|
11
|
+
/** Publish the widget lookup to descendants (call in the admin shell). */
|
|
12
|
+
export function setFieldComponents(lookup) {
|
|
13
|
+
setContext(FIELD_COMPONENTS_KEY, lookup);
|
|
14
|
+
}
|
|
15
|
+
/** Resolve the widget lookup. Returns a no-op lookup outside the admin shell. */
|
|
16
|
+
export function useFieldComponents() {
|
|
17
|
+
return getContext(FIELD_COMPONENTS_KEY) ?? (() => undefined);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=field-components.svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-components.svelte.js","sourceRoot":"","sources":["../../../src/lib/admin/field-components.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAkB,MAAM,QAAQ,CAAC;AAKhE,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAExE,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,MAA4B;IAC9D,UAAU,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,kBAAkB;IACjC,OAAO,UAAU,CAAmC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAChG,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AdminArea } from './types.js';
|
|
2
|
+
/** The known admin URL params. Central list so intents never typo a key. */
|
|
3
|
+
export type AdminParam = 'view' | 'docType' | 'docId' | 'action' | 'stack' | 'history' | 'focus' | 'orgId' | 'fromDocId' | 'fromDocType';
|
|
4
|
+
/** A set of param changes: a value sets the key, `null` clears it. */
|
|
5
|
+
export type ParamPatch = Partial<Record<AdminParam, string | null>>;
|
|
6
|
+
export interface AdminNav {
|
|
7
|
+
/** Apply a param patch and navigate. `replace` defaults to true. */
|
|
8
|
+
patch(changes: ParamPatch, opts?: {
|
|
9
|
+
replace?: boolean;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
/** Switch the top-level area/tab. `structure` clears `?view`; others set it. */
|
|
12
|
+
openArea(area: AdminArea): Promise<void>;
|
|
13
|
+
/** Show a document type's list (structure area). */
|
|
14
|
+
openType(docType: string): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Open a document in the editor (structure area). `docType` is optional — when
|
|
17
|
+
* omitted the existing `?docType` is preserved (the URL effect resolves it).
|
|
18
|
+
*/
|
|
19
|
+
openDocument(docId: string, docType?: string, opts?: {
|
|
20
|
+
replace?: boolean;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
/** Start creating a new document of a type. */
|
|
23
|
+
createDocument(docType: string): Promise<void>;
|
|
24
|
+
/** Close the current document, back to its type's list. */
|
|
25
|
+
closeToType(docType: string): Promise<void>;
|
|
26
|
+
/** Back to the dashboard (no type, no doc). */
|
|
27
|
+
goHome(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/** Create an admin nav and publish it to descendants (call once in the shell). */
|
|
30
|
+
export declare function setAdminNav(basePath?: string): AdminNav;
|
|
31
|
+
/** Read the admin nav. `undefined` outside the admin shell (safe to guard). */
|
|
32
|
+
export declare function useAdminNav(): AdminNav | undefined;
|
|
33
|
+
export declare function createAdminNav(basePath?: string): AdminNav;
|
|
34
|
+
//# sourceMappingURL=nav.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/admin/nav.svelte.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,4EAA4E;AAC5E,MAAM,MAAM,UAAU,GACnB,MAAM,GACN,SAAS,GACT,OAAO,GACP,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,OAAO,GACP,WAAW,GACX,aAAa,CAAC;AAEjB,sEAAsE;AACtE,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AAEpE,MAAM,WAAW,QAAQ;IACxB,oEAAoE;IACpE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,+CAA+C;IAC/C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,2DAA2D;IAC3D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,+CAA+C;IAC/C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAID,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,QAAQ,SAAW,GAAG,QAAQ,CAIzD;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,IAAI,QAAQ,GAAG,SAAS,CAElD;AAED,wBAAgB,cAAc,CAAC,QAAQ,SAAW,GAAG,QAAQ,CAgE5D"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin URL navigation — the single place that knows the admin's query-param
|
|
3
|
+
* vocabulary and how each navigation intent maps onto it.
|
|
4
|
+
*
|
|
5
|
+
* The admin encodes its whole view state in the URL (`?view`, `?docType`, `?docId`,
|
|
6
|
+
* `?action`, `?stack`, …) and a URL-watching effect derives component state from it.
|
|
7
|
+
* That's good (shareable, back-button-friendly) but the writes were scattered as
|
|
8
|
+
* ad-hoc `SvelteURLSearchParams` + `goto` blocks, each hand-clearing the params it
|
|
9
|
+
* happened to remember — which is how "opening a doc left a stale ?view" slipped in.
|
|
10
|
+
*
|
|
11
|
+
* This module replaces those with named intents. Each intent declares the FULL set
|
|
12
|
+
* of params it touches (setting some, clearing others), so no caller has to
|
|
13
|
+
* remember the interactions. `patch()` remains for the rare bespoke case.
|
|
14
|
+
*/
|
|
15
|
+
import { getContext, setContext } from 'svelte';
|
|
16
|
+
import { goto } from '$app/navigation';
|
|
17
|
+
import { page } from '$app/state';
|
|
18
|
+
import { SvelteURLSearchParams } from 'svelte/reactivity';
|
|
19
|
+
const ADMIN_NAV_KEY = Symbol.for('aphex.admin.nav');
|
|
20
|
+
/** Create an admin nav and publish it to descendants (call once in the shell). */
|
|
21
|
+
export function setAdminNav(basePath = '/admin') {
|
|
22
|
+
const nav = createAdminNav(basePath);
|
|
23
|
+
setContext(ADMIN_NAV_KEY, nav);
|
|
24
|
+
return nav;
|
|
25
|
+
}
|
|
26
|
+
/** Read the admin nav. `undefined` outside the admin shell (safe to guard). */
|
|
27
|
+
export function useAdminNav() {
|
|
28
|
+
return getContext(ADMIN_NAV_KEY);
|
|
29
|
+
}
|
|
30
|
+
export function createAdminNav(basePath = '/admin') {
|
|
31
|
+
async function patch(changes, { replace = true } = {}) {
|
|
32
|
+
const params = new SvelteURLSearchParams(page.url.searchParams);
|
|
33
|
+
for (const [key, value] of Object.entries(changes)) {
|
|
34
|
+
if (value == null)
|
|
35
|
+
params.delete(key);
|
|
36
|
+
else
|
|
37
|
+
params.set(key, value);
|
|
38
|
+
}
|
|
39
|
+
const query = params.toString();
|
|
40
|
+
await goto(`${basePath}${query ? `?${query}` : ''}`, {
|
|
41
|
+
replaceState: replace,
|
|
42
|
+
keepFocus: true
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
patch,
|
|
47
|
+
openArea: (area) =>
|
|
48
|
+
// A plugin/other area is addressable via ?view; structure is the default (no ?view).
|
|
49
|
+
// Leaving an area always drops any open document.
|
|
50
|
+
patch({
|
|
51
|
+
view: area === 'structure' ? null : area,
|
|
52
|
+
docId: null,
|
|
53
|
+
docType: null,
|
|
54
|
+
stack: null,
|
|
55
|
+
action: null
|
|
56
|
+
}),
|
|
57
|
+
openType: (docType) => patch({ docType, docId: null, action: null, stack: null, history: null, view: null }, { replace: false }),
|
|
58
|
+
openDocument: (docId, docType, opts) => patch({
|
|
59
|
+
docId,
|
|
60
|
+
...(docType ? { docType } : {}),
|
|
61
|
+
action: null,
|
|
62
|
+
fromDocId: null,
|
|
63
|
+
fromDocType: null,
|
|
64
|
+
view: null
|
|
65
|
+
}, { replace: opts?.replace ?? false }),
|
|
66
|
+
createDocument: (docType) => patch({ docType, action: 'create', docId: null, stack: null, view: null }, { replace: false }),
|
|
67
|
+
closeToType: (docType) => patch({ docType, docId: null, action: null, stack: null, focus: null, history: null, view: null }, { replace: false }),
|
|
68
|
+
goHome: () => patch({
|
|
69
|
+
view: null,
|
|
70
|
+
docType: null,
|
|
71
|
+
docId: null,
|
|
72
|
+
action: null,
|
|
73
|
+
stack: null,
|
|
74
|
+
focus: null,
|
|
75
|
+
history: null
|
|
76
|
+
})
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=nav.svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav.svelte.js","sourceRoot":"","sources":["../../../src/lib/admin/nav.svelte.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin slot registry — the extension-point primitive for the admin shell.
|
|
3
|
+
*
|
|
4
|
+
* Named regions ("slots") in the admin chrome that any component can render UI
|
|
5
|
+
* into at runtime, without the shell knowing who the contributor is and without
|
|
6
|
+
* anyone patching AdminApp/Sidebar directly. This is the client-side half of the
|
|
7
|
+
* plugin system's "extension slots" (see references/PLUGIN_SYSTEM_PLAN.md §4):
|
|
8
|
+
* registration happens in the browser via context + snippets, never through
|
|
9
|
+
* SvelteKit `load` (load data must stay serializable — components can't cross it).
|
|
10
|
+
*
|
|
11
|
+
* Today's first consumer is the document editor, which registers its toolbar into
|
|
12
|
+
* the `navbar-start` / `navbar-end` slots so its controls live in the single top
|
|
13
|
+
* bar. Tomorrow, plugin document-actions and admin tools register the same way.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* // shell (once, high in the tree)
|
|
17
|
+
* const slots = setAdminSlots();
|
|
18
|
+
* // outlet
|
|
19
|
+
* {#each slots.get('navbar-end') as entry (entry.id)}{@render entry.snippet()}{/each}
|
|
20
|
+
* // contributor (auto-cleans up)
|
|
21
|
+
* const slots = useAdminSlots();
|
|
22
|
+
* $effect(() => slots?.register('navbar-end', { id: 'editor', snippet: bar }));
|
|
23
|
+
*/
|
|
24
|
+
import { type Snippet } from 'svelte';
|
|
25
|
+
/** Well-known slot names. Plain strings are allowed too (e.g. plugin-defined). */
|
|
26
|
+
export type AdminSlotName = 'navbar-start' | 'navbar-end' | 'document-actions' | 'admin-tabs' | (string & {});
|
|
27
|
+
export interface AdminSlotEntry {
|
|
28
|
+
/** Stable id — re-registering with the same id replaces the prior entry. */
|
|
29
|
+
id: string;
|
|
30
|
+
snippet: Snippet;
|
|
31
|
+
/** Ascending sort within the slot. Defaults to 0. */
|
|
32
|
+
order?: number;
|
|
33
|
+
}
|
|
34
|
+
export declare class AdminSlots {
|
|
35
|
+
#private;
|
|
36
|
+
/**
|
|
37
|
+
* Register a snippet into a slot. Returns an unregister function — call it on
|
|
38
|
+
* cleanup (returning it from an `$effect` does this automatically).
|
|
39
|
+
*/
|
|
40
|
+
register(name: AdminSlotName, entry: AdminSlotEntry): () => void;
|
|
41
|
+
/** Entries registered in a slot, in sort order. Empty array if none. */
|
|
42
|
+
get(name: AdminSlotName): AdminSlotEntry[];
|
|
43
|
+
/** Whether a slot has any entries — handy for conditional chrome. */
|
|
44
|
+
has(name: AdminSlotName): boolean;
|
|
45
|
+
}
|
|
46
|
+
/** Create a registry and publish it to descendants. Call once in the admin shell. */
|
|
47
|
+
export declare function setAdminSlots(): AdminSlots;
|
|
48
|
+
/** Read the registry. Returns `undefined` outside an admin shell (safe to guard). */
|
|
49
|
+
export declare function useAdminSlots(): AdminSlots | undefined;
|
|
50
|
+
//# sourceMappingURL=slots.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slots.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/admin/slots.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAmC,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGvE,kFAAkF;AAClF,MAAM,MAAM,aAAa,GACtB,cAAc,GACd,YAAY,GACZ,kBAAkB,GAClB,YAAY,GACZ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAEjB,MAAM,WAAW,cAAc;IAC9B,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,UAAU;;IAItB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM,IAAI;IAgBhE,wEAAwE;IACxE,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,EAAE;IAI1C,qEAAqE;IACrE,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;CAGjC;AAID,qFAAqF;AACrF,wBAAgB,aAAa,IAAI,UAAU,CAI1C;AAED,qFAAqF;AACrF,wBAAgB,aAAa,IAAI,UAAU,GAAG,SAAS,CAEtD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin slot registry — the extension-point primitive for the admin shell.
|
|
3
|
+
*
|
|
4
|
+
* Named regions ("slots") in the admin chrome that any component can render UI
|
|
5
|
+
* into at runtime, without the shell knowing who the contributor is and without
|
|
6
|
+
* anyone patching AdminApp/Sidebar directly. This is the client-side half of the
|
|
7
|
+
* plugin system's "extension slots" (see references/PLUGIN_SYSTEM_PLAN.md §4):
|
|
8
|
+
* registration happens in the browser via context + snippets, never through
|
|
9
|
+
* SvelteKit `load` (load data must stay serializable — components can't cross it).
|
|
10
|
+
*
|
|
11
|
+
* Today's first consumer is the document editor, which registers its toolbar into
|
|
12
|
+
* the `navbar-start` / `navbar-end` slots so its controls live in the single top
|
|
13
|
+
* bar. Tomorrow, plugin document-actions and admin tools register the same way.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* // shell (once, high in the tree)
|
|
17
|
+
* const slots = setAdminSlots();
|
|
18
|
+
* // outlet
|
|
19
|
+
* {#each slots.get('navbar-end') as entry (entry.id)}{@render entry.snippet()}{/each}
|
|
20
|
+
* // contributor (auto-cleans up)
|
|
21
|
+
* const slots = useAdminSlots();
|
|
22
|
+
* $effect(() => slots?.register('navbar-end', { id: 'editor', snippet: bar }));
|
|
23
|
+
*/
|
|
24
|
+
import { getContext, setContext, untrack } from 'svelte';
|
|
25
|
+
import { SvelteMap } from 'svelte/reactivity';
|
|
26
|
+
export class AdminSlots {
|
|
27
|
+
// Reactive so outlets re-render as entries come and go.
|
|
28
|
+
#slots = new SvelteMap();
|
|
29
|
+
/**
|
|
30
|
+
* Register a snippet into a slot. Returns an unregister function — call it on
|
|
31
|
+
* cleanup (returning it from an `$effect` does this automatically).
|
|
32
|
+
*/
|
|
33
|
+
register(name, entry) {
|
|
34
|
+
const current = untrack(() => this.#slots.get(name) ?? []);
|
|
35
|
+
const next = [...current.filter((e) => e.id !== entry.id), entry].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
36
|
+
this.#slots.set(name, next);
|
|
37
|
+
return () => {
|
|
38
|
+
const list = untrack(() => this.#slots.get(name));
|
|
39
|
+
if (!list)
|
|
40
|
+
return;
|
|
41
|
+
const filtered = list.filter((e) => e.id !== entry.id);
|
|
42
|
+
if (filtered.length > 0)
|
|
43
|
+
this.#slots.set(name, filtered);
|
|
44
|
+
else
|
|
45
|
+
this.#slots.delete(name);
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Entries registered in a slot, in sort order. Empty array if none. */
|
|
49
|
+
get(name) {
|
|
50
|
+
return this.#slots.get(name) ?? [];
|
|
51
|
+
}
|
|
52
|
+
/** Whether a slot has any entries — handy for conditional chrome. */
|
|
53
|
+
has(name) {
|
|
54
|
+
return this.get(name).length > 0;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const ADMIN_SLOTS_KEY = Symbol.for('aphex.admin.slots');
|
|
58
|
+
/** Create a registry and publish it to descendants. Call once in the admin shell. */
|
|
59
|
+
export function setAdminSlots() {
|
|
60
|
+
const slots = new AdminSlots();
|
|
61
|
+
setContext(ADMIN_SLOTS_KEY, slots);
|
|
62
|
+
return slots;
|
|
63
|
+
}
|
|
64
|
+
/** Read the registry. Returns `undefined` outside an admin shell (safe to guard). */
|
|
65
|
+
export function useAdminSlots() {
|
|
66
|
+
return getContext(ADMIN_SLOTS_KEY);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=slots.svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slots.svelte.js","sourceRoot":"","sources":["../../../src/lib/admin/slots.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAgB,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAkB9C,MAAM,OAAO,UAAU;IACtB,wDAAwD;IACxD,MAAM,GAAG,IAAI,SAAS,EAA4B,CAAC;IAEnD;;;OAGG;IACH,QAAQ,CAAC,IAAmB,EAAE,KAAqB;QAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CACrE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CACzC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE5B,OAAO,GAAG,EAAE;YACX,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;YACvD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;;gBACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,GAAG,CAAC,IAAmB;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,qEAAqE;IACrE,GAAG,CAAC,IAAmB;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;CACD;AAED,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAExD,qFAAqF;AACrF,MAAM,UAAU,aAAa;IAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;IAC/B,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC;AACd,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,aAAa;IAC5B,OAAO,UAAU,CAAyB,eAAe,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The active admin area (tab). Built-in tools are named literals; plugin admin
|
|
3
|
+
* tools are addressed as `plugin:<tool-id>`, so the tab system is open-ended
|
|
4
|
+
* without the shell hardcoding plugin knowledge.
|
|
5
|
+
*/
|
|
6
|
+
export type AdminArea = 'structure' | 'vision' | 'media' | `plugin:${string}`;
|
|
7
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/admin/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/admin/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,59 +1,26 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { type Capability } from '../../types/capabilities.js';
|
|
3
2
|
export declare const apiKeyPermissionSchema: z.ZodEnum<{
|
|
4
3
|
read: "read";
|
|
5
4
|
write: "write";
|
|
6
5
|
}>;
|
|
7
|
-
export declare const apiKeyCapabilitySchema: z.
|
|
8
|
-
"document.read": "document.read";
|
|
9
|
-
"document.create": "document.create";
|
|
10
|
-
"document.update": "document.update";
|
|
11
|
-
"document.delete": "document.delete";
|
|
12
|
-
"document.publish": "document.publish";
|
|
13
|
-
"document.unpublish": "document.unpublish";
|
|
14
|
-
"asset.read": "asset.read";
|
|
15
|
-
"asset.upload": "asset.upload";
|
|
16
|
-
"asset.delete": "asset.delete";
|
|
17
|
-
"member.invite": "member.invite";
|
|
18
|
-
"member.remove": "member.remove";
|
|
19
|
-
"member.changeRole": "member.changeRole";
|
|
20
|
-
"apiKey.manage": "apiKey.manage";
|
|
21
|
-
"role.manage": "role.manage";
|
|
22
|
-
"org.settings": "org.settings";
|
|
23
|
-
}>;
|
|
6
|
+
export declare const apiKeyCapabilitySchema: z.ZodString;
|
|
24
7
|
export declare const createApiKeyRequest: z.ZodPipe<z.ZodObject<{
|
|
25
8
|
name: z.ZodString;
|
|
26
9
|
permissions: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
27
10
|
read: "read";
|
|
28
11
|
write: "write";
|
|
29
12
|
}>>>;
|
|
30
|
-
capabilities: z.ZodOptional<z.ZodArray<z.
|
|
31
|
-
"document.read": "document.read";
|
|
32
|
-
"document.create": "document.create";
|
|
33
|
-
"document.update": "document.update";
|
|
34
|
-
"document.delete": "document.delete";
|
|
35
|
-
"document.publish": "document.publish";
|
|
36
|
-
"document.unpublish": "document.unpublish";
|
|
37
|
-
"asset.read": "asset.read";
|
|
38
|
-
"asset.upload": "asset.upload";
|
|
39
|
-
"asset.delete": "asset.delete";
|
|
40
|
-
"member.invite": "member.invite";
|
|
41
|
-
"member.remove": "member.remove";
|
|
42
|
-
"member.changeRole": "member.changeRole";
|
|
43
|
-
"apiKey.manage": "apiKey.manage";
|
|
44
|
-
"role.manage": "role.manage";
|
|
45
|
-
"org.settings": "org.settings";
|
|
46
|
-
}>>>;
|
|
13
|
+
capabilities: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
47
14
|
expiresInDays: z.ZodOptional<z.ZodNumber>;
|
|
48
15
|
}, z.core.$strip>, z.ZodTransform<{
|
|
49
16
|
permissions: ("read" | "write")[] | undefined;
|
|
50
|
-
capabilities:
|
|
17
|
+
capabilities: string[] | undefined;
|
|
51
18
|
name: string;
|
|
52
19
|
expiresInDays?: number | undefined;
|
|
53
20
|
}, {
|
|
54
21
|
name: string;
|
|
55
22
|
permissions?: ("read" | "write")[] | undefined;
|
|
56
|
-
capabilities?:
|
|
23
|
+
capabilities?: string[] | undefined;
|
|
57
24
|
expiresInDays?: number | undefined;
|
|
58
25
|
}>>;
|
|
59
26
|
export type ApiKeyPermission = z.infer<typeof apiKeyPermissionSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/schemas/api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/schemas/api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,sBAAsB;;;EAA4B,CAAC;AAIhE,eAAO,MAAM,sBAAsB,aAAmB,CAAC;AASvD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;GAoB5B,CAAC;AAIL,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { normalizeCapabilities } from '../../types/capabilities.js';
|
|
3
|
+
import { capabilitySchema } from './roles.js';
|
|
3
4
|
// ---------- Shared ----------
|
|
4
5
|
export const apiKeyPermissionSchema = z.enum(['read', 'write']);
|
|
5
|
-
|
|
6
|
+
// Same capability-id format guard as roles; the authoritative validity check
|
|
7
|
+
// (against the runtime registry) happens in the route handler.
|
|
8
|
+
export const apiKeyCapabilitySchema = capabilitySchema;
|
|
6
9
|
// ---------- POST /settings/api-keys ----------
|
|
7
10
|
// Two provisioning modes:
|
|
8
11
|
// 1. Coarse `permissions`: 'read' alone, or 'write' (always implies read).
|