@aphexcms/cms-core 9.3.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 +10 -5
- package/dist/cli/generate-types.d.ts.map +1 -1
- package/dist/cli/generate-types.js +117 -77
- package/dist/cli/generate-types.js.map +1 -1
- package/dist/cli/index.js +5 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/migrate.d.ts +1 -1
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +27 -2
- package/dist/cli/migrate.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 +271 -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/field-validation/utils.d.ts +15 -0
- package/dist/field-validation/utils.d.ts.map +1 -1
- package/dist/field-validation/utils.js +74 -0
- package/dist/graphql/resolvers.d.ts.map +1 -1
- package/dist/graphql/resolvers.js +9 -10
- package/dist/graphql/schema.d.ts.map +1 -1
- package/dist/graphql/schema.js +18 -19
- 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/field-validation/utils.d.ts +15 -0
- package/dist/lib/field-validation/utils.d.ts.map +1 -1
- package/dist/lib/field-validation/utils.js +74 -0
- package/dist/lib/field-validation/utils.js.map +1 -1
- package/dist/lib/graphql/resolvers.d.ts.map +1 -1
- package/dist/lib/graphql/resolvers.js +9 -10
- package/dist/lib/graphql/resolvers.js.map +1 -1
- package/dist/lib/graphql/schema.d.ts.map +1 -1
- package/dist/lib/graphql/schema.js +18 -19
- package/dist/lib/graphql/schema.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 +110 -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/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/utils/string-case.d.ts +21 -0
- package/dist/lib/utils/string-case.d.ts.map +1 -0
- package/dist/lib/utils/string-case.js +26 -0
- package/dist/lib/utils/string-case.js.map +1 -0
- 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 +110 -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/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/utils/string-case.d.ts +21 -0
- package/dist/utils/string-case.d.ts.map +1 -0
- package/dist/utils/string-case.js +25 -0
- 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
|
@@ -10,14 +10,24 @@
|
|
|
10
10
|
import type { SidebarData } from '../../types/sidebar';
|
|
11
11
|
import AppSidebar from './sidebar/AppSidebar.svelte';
|
|
12
12
|
import { usePermissions } from '../../permissions-context.svelte';
|
|
13
|
+
import { setAdminSlots } from '../../admin/slots.svelte';
|
|
14
|
+
import type { AdminArea } from '../../admin/types';
|
|
15
|
+
import type { CMSPlugin, AdminToolPart } from '../../plugins/types';
|
|
16
|
+
|
|
17
|
+
// Admin extension-slot registry, published to the whole admin subtree. The
|
|
18
|
+
// navbar renders `navbar-start` / `navbar-end` outlets; the document editor (and
|
|
19
|
+
// later, plugins) register controls into them so everything lives in one bar.
|
|
20
|
+
const slots = setAdminSlots();
|
|
13
21
|
|
|
14
22
|
type Props = {
|
|
15
23
|
data: SidebarData;
|
|
16
24
|
onSignOut?: () => void | Promise<void>;
|
|
17
25
|
children: any;
|
|
18
26
|
enableGraphiQL?: boolean;
|
|
19
|
-
activeTab?: { value:
|
|
27
|
+
activeTab?: { value: AdminArea };
|
|
20
28
|
onTabChange?: (value: string) => void;
|
|
29
|
+
/** Plugin registry — used to render sidebar-placed admin tools as persistent nav. */
|
|
30
|
+
plugins?: CMSPlugin[];
|
|
21
31
|
};
|
|
22
32
|
|
|
23
33
|
let {
|
|
@@ -26,10 +36,11 @@
|
|
|
26
36
|
children,
|
|
27
37
|
enableGraphiQL = false,
|
|
28
38
|
activeTab,
|
|
29
|
-
onTabChange
|
|
39
|
+
onTabChange,
|
|
40
|
+
plugins = []
|
|
30
41
|
}: Props = $props();
|
|
31
42
|
|
|
32
|
-
function switchTab(value:
|
|
43
|
+
function switchTab(value: AdminArea) {
|
|
33
44
|
if (onTabChange) {
|
|
34
45
|
onTabChange(value);
|
|
35
46
|
} else if (activeTab) {
|
|
@@ -37,6 +48,24 @@
|
|
|
37
48
|
}
|
|
38
49
|
}
|
|
39
50
|
|
|
51
|
+
// Sidebar-placed admin tools (`placement: 'sidebar'`). Rendered here at the
|
|
52
|
+
// persistent layout level — not via AdminApp's slot — so the Tools nav stays
|
|
53
|
+
// visible on every admin page (settings included), where AdminApp isn't mounted.
|
|
54
|
+
// Capability-filtered with the same rule the part resolver uses.
|
|
55
|
+
const perms = usePermissions();
|
|
56
|
+
const sidebarTools = $derived(
|
|
57
|
+
(plugins ?? [])
|
|
58
|
+
.flatMap((p) => p.parts ?? [])
|
|
59
|
+
.filter(
|
|
60
|
+
(part): part is AdminToolPart =>
|
|
61
|
+
part.implements === 'aphex/admin/tool' && part.placement === 'sidebar'
|
|
62
|
+
)
|
|
63
|
+
.filter(
|
|
64
|
+
(t) => !t.requiredCapabilities?.length || t.requiredCapabilities.every((c) => perms.can(c))
|
|
65
|
+
)
|
|
66
|
+
.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
|
|
67
|
+
);
|
|
68
|
+
|
|
40
69
|
// Only show tabs on the main /admin page
|
|
41
70
|
const showTabs = $derived(page.url.pathname === '/admin');
|
|
42
71
|
|
|
@@ -44,23 +73,25 @@
|
|
|
44
73
|
// document list — a user without `document.read` won't be on /admin at
|
|
45
74
|
// all). Media needs asset.read; Vision is dev-only so we leave it to
|
|
46
75
|
// `enableGraphiQL` alone.
|
|
47
|
-
const perms = usePermissions();
|
|
48
76
|
const canSeeMedia = $derived(perms.can('asset.read'));
|
|
49
77
|
</script>
|
|
50
78
|
|
|
51
79
|
<ModeWatcher />
|
|
52
80
|
<Toaster closeButton />
|
|
53
81
|
<SidebarProvider class="h-screen">
|
|
54
|
-
<AppSidebar {data} {onSignOut} />
|
|
82
|
+
<AppSidebar {data} {onSignOut} {sidebarTools} onSelectTool={(id) => switchTab(`plugin:${id}`)} />
|
|
55
83
|
<SidebarInset class="flex h-full min-w-0 flex-col">
|
|
56
84
|
<header
|
|
57
85
|
class="border-rule flex h-16 shrink-0 items-center gap-2 border-b transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12"
|
|
58
86
|
>
|
|
59
|
-
<div class="flex w-full items-center px-4"
|
|
60
|
-
<!-- Left: Trigger and
|
|
61
|
-
<div class="flex items-center gap-2">
|
|
87
|
+
<div class="flex w-full items-center gap-2 px-4">
|
|
88
|
+
<!-- Left: Trigger, Separator, and navbar-start slot (e.g. editor breadcrumb) -->
|
|
89
|
+
<div class="flex min-w-0 items-center gap-2">
|
|
62
90
|
<SidebarTrigger class="-ml-1" />
|
|
63
|
-
<Separator orientation="vertical" class="
|
|
91
|
+
<Separator orientation="vertical" class="h-4" />
|
|
92
|
+
{#each slots.get('navbar-start') as entry (entry.id)}
|
|
93
|
+
{@render entry.snippet()}
|
|
94
|
+
{/each}
|
|
64
95
|
</div>
|
|
65
96
|
|
|
66
97
|
<!-- Center: Structure/Vision/Media Tabs (only on /admin page) -->
|
|
@@ -96,11 +127,18 @@
|
|
|
96
127
|
Media
|
|
97
128
|
</button>
|
|
98
129
|
{/if}
|
|
130
|
+
<!-- Plugin admin-tool tabs register here (see AdminApp). -->
|
|
131
|
+
{#each slots.get('admin-tabs') as entry (entry.id)}
|
|
132
|
+
{@render entry.snippet()}
|
|
133
|
+
{/each}
|
|
99
134
|
</div>
|
|
100
135
|
{/if}
|
|
101
136
|
|
|
102
|
-
<!-- Right: Theme Toggle -->
|
|
103
|
-
<div class:ml-auto
|
|
137
|
+
<!-- Right: navbar-end slot (e.g. editor actions) + Theme Toggle -->
|
|
138
|
+
<div class="flex items-center gap-2 {showTabs ? '' : 'ml-auto'}">
|
|
139
|
+
{#each slots.get('navbar-end') as entry (entry.id)}
|
|
140
|
+
{@render entry.snippet()}
|
|
141
|
+
{/each}
|
|
104
142
|
<Button onclick={toggleMode} variant="outline" size="icon" class="cursor-pointer">
|
|
105
143
|
<Sun
|
|
106
144
|
class="h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90"
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import type { SidebarData } from '../../types/sidebar.js';
|
|
2
|
+
import type { AdminArea } from '../../admin/types.js';
|
|
3
|
+
import type { CMSPlugin } from '../../plugins/types.js';
|
|
2
4
|
type Props = {
|
|
3
5
|
data: SidebarData;
|
|
4
6
|
onSignOut?: () => void | Promise<void>;
|
|
5
7
|
children: any;
|
|
6
8
|
enableGraphiQL?: boolean;
|
|
7
9
|
activeTab?: {
|
|
8
|
-
value:
|
|
10
|
+
value: AdminArea;
|
|
9
11
|
};
|
|
10
12
|
onTabChange?: (value: string) => void;
|
|
13
|
+
/** Plugin registry — used to render sidebar-placed admin tools as persistent nav. */
|
|
14
|
+
plugins?: CMSPlugin[];
|
|
11
15
|
};
|
|
12
16
|
declare const Sidebar: import("svelte").Component<Props, {}, "">;
|
|
13
17
|
type Sidebar = ReturnType<typeof Sidebar>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/layout/Sidebar.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"Sidebar.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/layout/Sidebar.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAGnE,KAAK,KAAK,GAAG;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,EAAE,GAAG,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,SAAS,CAAA;KAAE,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,qFAAqF;IACrF,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB,CAAC;AAuIH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
|
|
@@ -3,7 +3,12 @@
|
|
|
3
3
|
Sidebar,
|
|
4
4
|
SidebarContent,
|
|
5
5
|
SidebarFooter,
|
|
6
|
+
SidebarGroup,
|
|
7
|
+
SidebarGroupLabel,
|
|
6
8
|
SidebarHeader,
|
|
9
|
+
SidebarMenu,
|
|
10
|
+
SidebarMenuItem,
|
|
11
|
+
SidebarMenuButton,
|
|
7
12
|
SidebarRail
|
|
8
13
|
} from '@aphexcms/ui/shadcn/sidebar';
|
|
9
14
|
import OrganizationSwitcher from '../OrganizationSwitcher.svelte';
|
|
@@ -11,20 +16,51 @@
|
|
|
11
16
|
import NavUser from './NavUser.svelte';
|
|
12
17
|
import type { SidebarData } from '../../../types/sidebar';
|
|
13
18
|
import type { ComponentProps } from 'svelte';
|
|
19
|
+
import { page } from '$app/state';
|
|
20
|
+
import type { AdminToolPart } from '../../../plugins/types';
|
|
21
|
+
|
|
22
|
+
// A sidebar-placed plugin tool lives on /admin with `?view=plugin:<id>`. The
|
|
23
|
+
// active view only counts on /admin — on settings (and other admin pages) no
|
|
24
|
+
// tool is "current", so clicking one navigates back to /admin?view=plugin:<id>.
|
|
25
|
+
const activeView = $derived(
|
|
26
|
+
page.url.pathname === '/admin' ? (page.url.searchParams.get('view') ?? '') : ''
|
|
27
|
+
);
|
|
28
|
+
// Its own nav item lights up; the parent /admin ("Studio") item shouldn't also
|
|
29
|
+
// — the more-specific tool wins, like nested nav. Suppress it in that case.
|
|
30
|
+
const pluginToolActive = $derived(activeView.startsWith('plugin:'));
|
|
31
|
+
const isToolActive = (id: string) => activeView === `plugin:${id}`;
|
|
32
|
+
|
|
33
|
+
function isNavActive(path: string, item: { url: string; exact?: boolean }): boolean {
|
|
34
|
+
if (pluginToolActive && item.url === '/admin') return false;
|
|
35
|
+
if (item.exact) return path === item.url;
|
|
36
|
+
const matches = path === item.url || path.startsWith(item.url + '/');
|
|
37
|
+
if (!matches) return false;
|
|
38
|
+
// Longest-match wins when items nest (mirrors NavMain's default tiebreak).
|
|
39
|
+
return !navMainItems.some(
|
|
40
|
+
(other) =>
|
|
41
|
+
other !== item &&
|
|
42
|
+
other.url.length > item.url.length &&
|
|
43
|
+
(path === other.url || path.startsWith(other.url + '/'))
|
|
44
|
+
);
|
|
45
|
+
}
|
|
14
46
|
|
|
15
47
|
type Props = ComponentProps<typeof Sidebar> & {
|
|
16
48
|
data: SidebarData;
|
|
17
49
|
onSignOut?: () => void | Promise<void>;
|
|
50
|
+
/** Sidebar-placed plugin admin tools, already capability-filtered. */
|
|
51
|
+
sidebarTools?: AdminToolPart[];
|
|
52
|
+
/** Open a tool's `plugin:<id>` area (navigates to /admin if elsewhere). */
|
|
53
|
+
onSelectTool?: (id: string) => void;
|
|
18
54
|
};
|
|
19
55
|
|
|
20
|
-
let { data, onSignOut, ...restProps }: Props = $props();
|
|
56
|
+
let { data, onSignOut, sidebarTools = [], onSelectTool, ...restProps }: Props = $props();
|
|
21
57
|
|
|
22
58
|
// Convert navItems to the format expected by NavMain
|
|
23
59
|
const navMainItems = $derived(
|
|
24
60
|
data?.navItems?.map((item) => ({
|
|
25
61
|
title: item.label,
|
|
26
62
|
url: item.href,
|
|
27
|
-
icon:
|
|
63
|
+
icon: item.icon,
|
|
28
64
|
isActive: false
|
|
29
65
|
})) || [
|
|
30
66
|
{
|
|
@@ -51,7 +87,34 @@
|
|
|
51
87
|
</SidebarHeader>
|
|
52
88
|
|
|
53
89
|
<SidebarContent>
|
|
54
|
-
<NavMain items={navMainItems} />
|
|
90
|
+
<NavMain items={navMainItems} isActive={isNavActive} />
|
|
91
|
+
|
|
92
|
+
<!-- Plugin admin tools placed in the sidebar (placement: 'sidebar'). Rendered
|
|
93
|
+
from the plugin list at this persistent layout level, so the Tools nav
|
|
94
|
+
stays visible across every admin page (settings included). -->
|
|
95
|
+
{#if sidebarTools.length > 0}
|
|
96
|
+
<SidebarGroup>
|
|
97
|
+
<SidebarGroupLabel>Tools</SidebarGroupLabel>
|
|
98
|
+
<SidebarMenu>
|
|
99
|
+
{#each sidebarTools as tool (tool.id)}
|
|
100
|
+
<SidebarMenuItem>
|
|
101
|
+
<SidebarMenuButton
|
|
102
|
+
onclick={() => onSelectTool?.(tool.id)}
|
|
103
|
+
isActive={isToolActive(tool.id)}
|
|
104
|
+
tooltipContent={tool.title}
|
|
105
|
+
class="cursor-pointer"
|
|
106
|
+
>
|
|
107
|
+
{#if tool.icon}
|
|
108
|
+
{@const Icon = tool.icon}
|
|
109
|
+
<Icon class="h-4 w-4" />
|
|
110
|
+
{/if}
|
|
111
|
+
<span>{tool.title}</span>
|
|
112
|
+
</SidebarMenuButton>
|
|
113
|
+
</SidebarMenuItem>
|
|
114
|
+
{/each}
|
|
115
|
+
</SidebarMenu>
|
|
116
|
+
</SidebarGroup>
|
|
117
|
+
{/if}
|
|
55
118
|
</SidebarContent>
|
|
56
119
|
|
|
57
120
|
<SidebarFooter>
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { Sidebar } from '@aphexcms/ui/shadcn/sidebar';
|
|
2
2
|
import type { SidebarData } from '../../../types/sidebar.js';
|
|
3
3
|
import type { ComponentProps } from 'svelte';
|
|
4
|
+
import type { AdminToolPart } from '../../../plugins/types.js';
|
|
4
5
|
type Props = ComponentProps<typeof Sidebar> & {
|
|
5
6
|
data: SidebarData;
|
|
6
7
|
onSignOut?: () => void | Promise<void>;
|
|
8
|
+
/** Sidebar-placed plugin admin tools, already capability-filtered. */
|
|
9
|
+
sidebarTools?: AdminToolPart[];
|
|
10
|
+
/** Open a tool's `plugin:<id>` area (navigates to /admin if elsewhere). */
|
|
11
|
+
onSelectTool?: (id: string) => void;
|
|
7
12
|
};
|
|
8
13
|
declare const AppSidebar: import("svelte").Component<Props, {}, "">;
|
|
9
14
|
type AppSidebar = ReturnType<typeof AppSidebar>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppSidebar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/layout/sidebar/AppSidebar.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,OAAO,
|
|
1
|
+
{"version":3,"file":"AppSidebar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/layout/sidebar/AppSidebar.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,OAAO,EAUP,MAAM,6BAA6B,CAAC;AAItC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG3D,KAAK,KAAK,GAAG,cAAc,CAAC,OAAO,OAAO,CAAC,GAAG;IAC7C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,sEAAsE;IACtE,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC;IAC/B,2EAA2E;IAC3E,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAqGH,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -12,12 +12,13 @@
|
|
|
12
12
|
SidebarMenuSubItem,
|
|
13
13
|
SidebarMenuSubButton
|
|
14
14
|
} from '@aphexcms/ui/shadcn/sidebar';
|
|
15
|
-
import { ChevronRight, type
|
|
15
|
+
import { ChevronRight, type IconProps } from '@lucide/svelte';
|
|
16
|
+
import type { Component } from 'svelte';
|
|
16
17
|
|
|
17
18
|
type NavItem = {
|
|
18
19
|
title: string;
|
|
19
20
|
url: string;
|
|
20
|
-
icon?:
|
|
21
|
+
icon?: Component<IconProps>;
|
|
21
22
|
isActive?: boolean;
|
|
22
23
|
exact?: boolean;
|
|
23
24
|
items?: {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type IconProps } from '@lucide/svelte';
|
|
2
|
+
import type { Component } from 'svelte';
|
|
2
3
|
type NavItem = {
|
|
3
4
|
title: string;
|
|
4
5
|
url: string;
|
|
5
|
-
icon?:
|
|
6
|
+
icon?: Component<IconProps>;
|
|
6
7
|
isActive?: boolean;
|
|
7
8
|
exact?: boolean;
|
|
8
9
|
items?: {
|
|
@@ -15,7 +16,7 @@ type Props = {
|
|
|
15
16
|
label?: string;
|
|
16
17
|
isActive?: (path: string, item: NavItem) => boolean;
|
|
17
18
|
};
|
|
18
|
-
declare const NavMain:
|
|
19
|
+
declare const NavMain: Component<Props, {}, "">;
|
|
19
20
|
type NavMain = ReturnType<typeof NavMain>;
|
|
20
21
|
export default NavMain;
|
|
21
22
|
//# sourceMappingURL=NavMain.svelte.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavMain.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/layout/sidebar/NavMain.svelte.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAgB,KAAK,
|
|
1
|
+
{"version":3,"file":"NavMain.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/layout/sidebar/NavMain.svelte.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGvC,KAAK,OAAO,GAAG;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACZ,EAAE,CAAC;CACJ,CAAC;AAEF,KAAK,KAAK,GAAG;IACZ,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;CACpD,CAAC;AAoFH,QAAA,MAAM,OAAO,0BAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
|
|
@@ -43,7 +43,11 @@
|
|
|
43
43
|
class="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground"
|
|
44
44
|
>
|
|
45
45
|
{#if user.image}
|
|
46
|
-
<img
|
|
46
|
+
<img
|
|
47
|
+
src={user.image}
|
|
48
|
+
alt={user.name || user.email}
|
|
49
|
+
class="h-8 w-8 rounded-lg object-cover"
|
|
50
|
+
/>
|
|
47
51
|
{:else}
|
|
48
52
|
<div
|
|
49
53
|
class="bg-sidebar-primary text-sidebar-primary-foreground flex h-8 w-8 items-center justify-center rounded-lg text-sm font-semibold"
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/lib/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/lib/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAwB5D"}
|
package/dist/config.js
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
|
+
import { createPartResolver } from './plugins/resolver.js';
|
|
1
2
|
export function createCMSConfig(config) {
|
|
3
|
+
// Resolve plugin parts once (also runs duplicate-part-id validation) and fold
|
|
4
|
+
// schema contributions into `schemaTypes` so the engine, GraphQL, and typegen
|
|
5
|
+
// treat plugin schemas identically to app schemas. Non-schema parts are indexed
|
|
6
|
+
// by a resolver rebuilt at hook-init and exposed on locals.aphexCMS.partResolver.
|
|
7
|
+
const resolver = createPartResolver(config.plugins ?? []);
|
|
8
|
+
const pluginSchemas = resolver.schemaTypes();
|
|
9
|
+
// Merge plugin schemas, then let schema-transform parts decorate the full list
|
|
10
|
+
// (e.g. inject an SEO field group into chosen collections).
|
|
11
|
+
const mergedSchemas = resolver.applySchemaTransforms([...config.schemaTypes, ...pluginSchemas]);
|
|
2
12
|
return {
|
|
3
13
|
// Start with the user's config and apply defaults for missing properties
|
|
4
14
|
...config,
|
|
15
|
+
schemaTypes: mergedSchemas,
|
|
5
16
|
storage: config.storage ?? null, // Default to null if not provided
|
|
6
17
|
customization: {
|
|
7
18
|
branding: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/asset.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/asset.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import type { OrganizationAdapter } from './organization.js';
|
|
|
6
6
|
import type { InstanceAdapter } from './instance.js';
|
|
7
7
|
import type { RolesAdapter } from './role.js';
|
|
8
8
|
import type { ReferenceAdapter } from './reference.js';
|
|
9
|
+
import type { PluginSettingsAdapter } from './plugin-settings.js';
|
|
9
10
|
export type { DocumentAdapter, DocumentFilters, CreateDocumentData, UpdateDocumentData } from './document.js';
|
|
10
11
|
export type { AssetAdapter, CreateAssetData, UpdateAssetData } from './asset.js';
|
|
11
12
|
export type { UserProfileAdapter, NewUserProfileData } from './user.js';
|
|
@@ -14,11 +15,12 @@ export type { OrganizationAdapter } from './organization.js';
|
|
|
14
15
|
export type { InstanceAdapter, InstanceSettings } from './instance.js';
|
|
15
16
|
export type { RolesAdapter } from './role.js';
|
|
16
17
|
export type { ReferenceAdapter, BackReferenceRow, BackReferenceLookup } from './reference.js';
|
|
18
|
+
export type { PluginSettingsAdapter, PluginSettingsRow } from './plugin-settings.js';
|
|
17
19
|
/**
|
|
18
20
|
* Combined database adapter interface
|
|
19
21
|
* Extends all entity-specific adapters for full database functionality
|
|
20
22
|
*/
|
|
21
|
-
export interface DatabaseAdapter extends DocumentAdapter, AssetAdapter, UserProfileAdapter, SchemaAdapter, OrganizationAdapter, InstanceAdapter, RolesAdapter, ReferenceAdapter {
|
|
23
|
+
export interface DatabaseAdapter extends DocumentAdapter, AssetAdapter, UserProfileAdapter, SchemaAdapter, OrganizationAdapter, InstanceAdapter, RolesAdapter, ReferenceAdapter, PluginSettingsAdapter {
|
|
22
24
|
connect?(): Promise<void>;
|
|
23
25
|
disconnect?(): Promise<void>;
|
|
24
26
|
isHealthy(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** A stored settings row: the raw persisted values for one (org, plugin) pair. */
|
|
2
|
+
export interface PluginSettingsRow {
|
|
3
|
+
organizationId: string;
|
|
4
|
+
pluginId: string;
|
|
5
|
+
/** Opaque JSON blob of the plugin's settings values (secrets stored encrypted). */
|
|
6
|
+
values: Record<string, unknown>;
|
|
7
|
+
updatedAt: Date;
|
|
8
|
+
}
|
|
9
|
+
export interface PluginSettingsAdapter {
|
|
10
|
+
/**
|
|
11
|
+
* Read the stored values for a plugin in an org. Returns `null` when the plugin
|
|
12
|
+
* has never been configured for that org (no row yet) — callers treat that as
|
|
13
|
+
* "use declared defaults".
|
|
14
|
+
*/
|
|
15
|
+
getPluginSettings(organizationId: string, pluginId: string): Promise<Record<string, unknown> | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Upsert the full values object for a plugin in an org (one row per pair). The
|
|
18
|
+
* passed object replaces the stored one — callers merge partial edits before
|
|
19
|
+
* calling. Secret values must already be encrypted by core.
|
|
20
|
+
*/
|
|
21
|
+
setPluginSettings(organizationId: string, pluginId: string, values: Record<string, unknown>): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=plugin-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-settings.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/plugin-settings.ts"],"names":[],"mappings":"AAaA,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACrC;;;;OAIG;IACH,iBAAiB,CAChB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAE3C;;;;OAIG;IACH,iBAAiB,CAChB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Plugin-settings adapter interface — the generic per-(org, plugin) config store.
|
|
2
|
+
//
|
|
3
|
+
// This is the storage primitive behind the plugin settings & secrets feature
|
|
4
|
+
// (references/plugin-settings-and-secrets-scope.md). It is deliberately generic:
|
|
5
|
+
// ONE table serves every plugin, keyed by (organizationId, pluginId), one row per
|
|
6
|
+
// pair (a config singleton). Values are an opaque JSON object — the store neither
|
|
7
|
+
// knows nor cares which values are content vs config vs encrypted secrets. Core
|
|
8
|
+
// handles encryption/decryption of secret fields above this layer; the adapter only
|
|
9
|
+
// persists the resulting strings.
|
|
10
|
+
//
|
|
11
|
+
// NOT part of the content model: no drafts, versions, references, or RLS-as-content.
|
|
12
|
+
// Org isolation is by the `organizationId` key (and RLS on the pglite path).
|
|
13
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Role, NewRole
|
|
1
|
+
import type { Role, NewRole } from '../../types/capabilities.js';
|
|
2
2
|
export interface RolesAdapter {
|
|
3
3
|
/** List all roles for an organization (built-in + custom). */
|
|
4
4
|
listRoles(organizationId: string): Promise<Role[]>;
|
|
@@ -12,14 +12,23 @@ export interface RolesAdapter {
|
|
|
12
12
|
*/
|
|
13
13
|
updateRole(organizationId: string, name: string, data: {
|
|
14
14
|
description?: string | null;
|
|
15
|
-
capabilities?:
|
|
15
|
+
capabilities?: string[];
|
|
16
16
|
}): Promise<Role | null>;
|
|
17
17
|
/** Delete a role by name. Returns `true` when a row was removed. */
|
|
18
18
|
deleteRole(organizationId: string, name: string): Promise<boolean>;
|
|
19
19
|
/**
|
|
20
|
-
* Ensure the four built-in roles exist for an organization
|
|
21
|
-
*
|
|
20
|
+
* Ensure the four built-in roles exist for an organization, and that `owner`
|
|
21
|
+
* still holds every capability.
|
|
22
|
+
*
|
|
23
|
+
* Idempotent: inserts missing rows, leaves existing admin/editor/viewer rows
|
|
24
|
+
* untouched (they are editable), and reconciles `owner` to the full set so a
|
|
25
|
+
* capability added by a core upgrade reaches orgs seeded before it existed.
|
|
26
|
+
*
|
|
27
|
+
* `ownerCapabilities` is what "every capability" means for this install. Callers
|
|
28
|
+
* that know the plugin registry pass the merged catalog, so plugin-declared
|
|
29
|
+
* capabilities reach owners; omitting it falls back to core's built-ins, which
|
|
30
|
+
* would leave an owner unable to hold a capability its own plugins declared.
|
|
22
31
|
*/
|
|
23
|
-
seedBuiltinRoles(organizationId: string): Promise<void>;
|
|
32
|
+
seedBuiltinRoles(organizationId: string, ownerCapabilities?: string[]): Promise<void>;
|
|
24
33
|
}
|
|
25
34
|
//# sourceMappingURL=role.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/role.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/role.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC5B,8DAA8D;IAC9D,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAEnD,gEAAgE;IAChE,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAE3E,2EAA2E;IAC3E,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC;;;OAGG;IACH,UAAU,CACT,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC5D,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAExB,oEAAoE;IACpE,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnE;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtF"}
|
package/dist/engine.d.ts
CHANGED
|
@@ -7,6 +7,34 @@ export declare class CMSEngine {
|
|
|
7
7
|
constructor(config: CMSConfig, dbAdapter: DatabaseAdapter);
|
|
8
8
|
updateConfig(newConfig: CMSConfig): void;
|
|
9
9
|
initialize(): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Every capability this install recognises: core's built-ins plus whatever the
|
|
12
|
+
* registered plugins declare.
|
|
13
|
+
*
|
|
14
|
+
* `ALL_CAPABILITIES` is core-only and static, so on its own it would leave an
|
|
15
|
+
* owner unable to hold a capability its own plugins declared — owner would end up
|
|
16
|
+
* with strictly fewer permissions than admin, who can be granted plugin
|
|
17
|
+
* capabilities through the roles UI.
|
|
18
|
+
*/
|
|
19
|
+
ownerCapabilities(): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Re-seed built-in roles for every existing organization.
|
|
22
|
+
*
|
|
23
|
+
* Org creation seeds roles once, which means an org created before a
|
|
24
|
+
* capability existed never learns about it — that is why an owner could be
|
|
25
|
+
* missing `plugin.settings.manage` after upgrading core. Re-seeding on boot
|
|
26
|
+
* closes that gap: it inserts any missing built-in row and reconciles `owner`
|
|
27
|
+
* back to the full capability set, which now includes plugin-declared
|
|
28
|
+
* capabilities. Editable roles (admin/editor/viewer) are left as the operator
|
|
29
|
+
* configured them.
|
|
30
|
+
*
|
|
31
|
+
* Because this runs on every boot, installing or removing a plugin is enough to
|
|
32
|
+
* bring owners in line with the capabilities that plugin declares.
|
|
33
|
+
*
|
|
34
|
+
* Idempotent and cheap — orgs are few and this is four rows each — so it runs
|
|
35
|
+
* unconditionally rather than behind a schema-version check.
|
|
36
|
+
*/
|
|
37
|
+
private reconcileBuiltinRoles;
|
|
10
38
|
getSchemaType(name: string): Promise<SchemaType | null>;
|
|
11
39
|
listSchemas(): Promise<SchemaType[]>;
|
|
12
40
|
getSchemaTypeByName(name: string): SchemaType | null;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/lib/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/lib/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,qBAAa,SAAS;IACrB,OAAO,CAAC,EAAE,CAAkB;IACrB,MAAM,EAAE,SAAS,CAAC;gBAEb,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe;IAMzD,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAUlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BjC;;;;;;;;OAQG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAM7B;;;;;;;;;;;;;;;;OAgBG;YACW,qBAAqB;IAe7B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIvD,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAI1C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI9C,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAI1F,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAG9F;AAKD,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,GAAG,SAAS,CASlF;AAED,wBAAgB,MAAM,IAAI,SAAS,CAKlC"}
|
package/dist/engine.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { createPartResolver } from './plugins/resolver.js';
|
|
1
2
|
import { validateSchemaReferences } from './schema-utils/validator.js';
|
|
3
|
+
import { ALL_CAPABILITIES } from './types/capabilities.js';
|
|
2
4
|
import { cmsLogger } from './utils/logger.js';
|
|
3
5
|
export class CMSEngine {
|
|
4
6
|
db;
|
|
@@ -35,8 +37,50 @@ export class CMSEngine {
|
|
|
35
37
|
for (const schemaType of this.config.schemaTypes) {
|
|
36
38
|
await this.db.registerSchemaType(schemaType);
|
|
37
39
|
}
|
|
40
|
+
await this.reconcileBuiltinRoles();
|
|
38
41
|
cmsLogger.info('[CMS]', 'Initialized successfully');
|
|
39
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Every capability this install recognises: core's built-ins plus whatever the
|
|
45
|
+
* registered plugins declare.
|
|
46
|
+
*
|
|
47
|
+
* `ALL_CAPABILITIES` is core-only and static, so on its own it would leave an
|
|
48
|
+
* owner unable to hold a capability its own plugins declared — owner would end up
|
|
49
|
+
* with strictly fewer permissions than admin, who can be granted plugin
|
|
50
|
+
* capabilities through the roles UI.
|
|
51
|
+
*/
|
|
52
|
+
ownerCapabilities() {
|
|
53
|
+
const resolver = createPartResolver(this.config.plugins ?? []);
|
|
54
|
+
const declared = resolver.capabilityCatalog().map((def) => def.id);
|
|
55
|
+
return Array.from(new Set([...ALL_CAPABILITIES, ...declared]));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Re-seed built-in roles for every existing organization.
|
|
59
|
+
*
|
|
60
|
+
* Org creation seeds roles once, which means an org created before a
|
|
61
|
+
* capability existed never learns about it — that is why an owner could be
|
|
62
|
+
* missing `plugin.settings.manage` after upgrading core. Re-seeding on boot
|
|
63
|
+
* closes that gap: it inserts any missing built-in row and reconciles `owner`
|
|
64
|
+
* back to the full capability set, which now includes plugin-declared
|
|
65
|
+
* capabilities. Editable roles (admin/editor/viewer) are left as the operator
|
|
66
|
+
* configured them.
|
|
67
|
+
*
|
|
68
|
+
* Because this runs on every boot, installing or removing a plugin is enough to
|
|
69
|
+
* bring owners in line with the capabilities that plugin declares.
|
|
70
|
+
*
|
|
71
|
+
* Idempotent and cheap — orgs are few and this is four rows each — so it runs
|
|
72
|
+
* unconditionally rather than behind a schema-version check.
|
|
73
|
+
*/
|
|
74
|
+
async reconcileBuiltinRoles() {
|
|
75
|
+
const organizations = await this.db.findAllOrganizations();
|
|
76
|
+
const ownerCaps = this.ownerCapabilities();
|
|
77
|
+
for (const org of organizations) {
|
|
78
|
+
await this.db.seedBuiltinRoles(org.id, ownerCaps);
|
|
79
|
+
}
|
|
80
|
+
if (organizations.length > 0) {
|
|
81
|
+
cmsLogger.info('[CMS]', `Reconciled built-in roles for ${organizations.length} org(s) (owner: ${ownerCaps.length} capabilities)`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
40
84
|
// Schema Type utility methods
|
|
41
85
|
async getSchemaType(name) {
|
|
42
86
|
return this.db.getSchemaType(name);
|
|
@@ -15,6 +15,21 @@ export interface DocumentValidationResult {
|
|
|
15
15
|
* Check if a field is required based on its validation rules
|
|
16
16
|
*/
|
|
17
17
|
export declare function isFieldRequired(field: Field): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Structural (shape) validation for a field's stored value — the depth=0 write
|
|
20
|
+
* shape. This catches a caller (notably an AI agent over MCP) sending the wrong
|
|
21
|
+
* JSON shape that presence/required checks would miss: a slug as `{ current }`
|
|
22
|
+
* (Sanity's convention — AphexCMS stores slugs as plain strings), or a
|
|
23
|
+
* reference/image missing its `_ref`. Runs before the user's Rule validation
|
|
24
|
+
* and only when a value is meaningfully present (absent/empty is a required-ness
|
|
25
|
+
* concern, handled separately), so optional and half-filled fields are left
|
|
26
|
+
* alone. Returns an error message, or null when the shape is acceptable.
|
|
27
|
+
*
|
|
28
|
+
* Intentionally conservative: only unambiguous mismatches error, and empty
|
|
29
|
+
* placeholders (`''`, an image with no `asset`) are treated as absent so the
|
|
30
|
+
* admin's in-progress edit states don't trip it.
|
|
31
|
+
*/
|
|
32
|
+
export declare function validateValueShape(field: Field, value: unknown): string | null;
|
|
18
33
|
/**
|
|
19
34
|
* Validate a field value against its validation rules
|
|
20
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKxD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUrD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKxD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUrD;AAYD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmC9E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC,CA6ID;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAO/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC,wBAAwB,CAAC,CAqDnC"}
|