@aphexcms/cms-core 0.2.3 → 1.0.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/api/api-keys.d.ts +37 -0
- package/dist/api/api-keys.d.ts.map +1 -0
- package/dist/api/api-keys.js +20 -0
- package/dist/api/assets.d.ts +27 -0
- package/dist/api/assets.d.ts.map +1 -1
- package/dist/api/assets.js +22 -1
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +4 -0
- package/dist/api/instance.d.ts +17 -0
- package/dist/api/instance.d.ts.map +1 -0
- package/dist/api/instance.js +21 -0
- package/dist/api/invitations.d.ts +37 -0
- package/dist/api/invitations.d.ts.map +1 -0
- package/dist/api/invitations.js +27 -0
- package/dist/api/organizations.d.ts +7 -0
- package/dist/api/organizations.d.ts.map +1 -1
- package/dist/api/organizations.js +7 -0
- package/dist/api/types.d.ts +1 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/user.d.ts +23 -0
- package/dist/api/user.d.ts.map +1 -0
- package/dist/api/user.js +20 -0
- package/dist/auth/auth-errors.d.ts +1 -1
- package/dist/auth/auth-errors.d.ts.map +1 -1
- package/dist/auth/auth-hooks.d.ts.map +1 -1
- package/dist/auth/auth-hooks.js +39 -23
- package/dist/auth/provider.d.ts +2 -2
- package/dist/auth/provider.d.ts.map +1 -1
- package/dist/cli/generate-types.d.ts +14 -0
- package/dist/cli/generate-types.d.ts.map +1 -0
- package/dist/cli/generate-types.js +15 -7
- package/dist/cli/generate-types.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/components/AdminApp.svelte +160 -63
- package/dist/components/AdminApp.svelte.d.ts +1 -1
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/AdminLayout.svelte.d.ts +3 -3
- package/dist/components/admin/AssetBrowserModal.svelte +66 -0
- package/dist/components/admin/AssetBrowserModal.svelte.d.ts +15 -0
- package/dist/components/admin/AssetBrowserModal.svelte.d.ts.map +1 -0
- package/dist/components/admin/DocumentEditor.svelte +137 -69
- package/dist/components/admin/DocumentEditor.svelte.d.ts +1 -1
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentsSkeleton.svelte +40 -0
- package/dist/components/admin/DocumentsSkeleton.svelte.d.ts +7 -0
- package/dist/components/admin/DocumentsSkeleton.svelte.d.ts.map +1 -0
- package/dist/components/admin/MediaBrowser.svelte +1398 -0
- package/dist/components/admin/MediaBrowser.svelte.d.ts +23 -0
- package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -0
- package/dist/components/admin/ObjectModal.svelte +3 -4
- package/dist/components/admin/ObjectModal.svelte.d.ts +1 -1
- package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
- package/dist/components/admin/SchemaField.svelte +109 -81
- package/dist/components/admin/SchemaField.svelte.d.ts +1 -1
- package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ArrayField.svelte +611 -277
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/DateField.svelte +3 -2
- package/dist/components/admin/fields/DateField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/DateTimeField.svelte +3 -2
- package/dist/components/admin/fields/DateTimeField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ImageField.svelte +217 -120
- package/dist/components/admin/fields/ImageField.svelte.d.ts +1 -0
- package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ReferenceField.svelte +11 -6
- package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/StringField.svelte +2 -1
- package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/components/layout/OrganizationSwitcher.svelte +109 -45
- package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -1
- package/dist/components/layout/Sidebar.svelte +36 -14
- package/dist/components/layout/Sidebar.svelte.d.ts +2 -1
- package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
- package/dist/components/layout/sidebar/AppSidebar.svelte +1 -1
- package/dist/components/layout/sidebar/NavMain.svelte +1 -1
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts +1 -1
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -1
- package/dist/components/layout/sidebar/NavSecondary.svelte +3 -3
- package/dist/components/layout/sidebar/NavUser.svelte +22 -10
- package/dist/components/layout/sidebar/NavUser.svelte.d.ts +2 -2
- package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -1
- package/dist/db/interfaces/document.d.ts +20 -0
- package/dist/db/interfaces/document.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/instance.d.ts +7 -0
- package/dist/db/interfaces/instance.d.ts.map +1 -0
- package/dist/db/interfaces/instance.js +1 -0
- package/dist/db/interfaces/organization.d.ts +1 -0
- package/dist/db/interfaces/organization.d.ts.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +4 -3
- package/dist/field-validation/date-utils.d.ts.map +1 -1
- package/dist/field-validation/date-utils.js +12 -11
- package/dist/field-validation/rule.d.ts.map +1 -1
- package/dist/field-validation/rule.js +11 -10
- package/dist/field-validation/utils.d.ts.map +1 -1
- package/dist/field-validation/utils.js +16 -15
- package/dist/graphql/index.d.ts +23 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +85 -0
- package/dist/graphql/resolvers.d.ts +4 -0
- package/dist/graphql/resolvers.d.ts.map +1 -0
- package/dist/graphql/resolvers.js +542 -0
- package/dist/graphql/schema.d.ts +3 -0
- package/dist/graphql/schema.d.ts.map +1 -0
- package/dist/graphql/schema.js +356 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +62 -9
- package/dist/lib/api/api-keys.d.ts +37 -0
- package/dist/lib/api/api-keys.d.ts.map +1 -0
- package/dist/lib/api/api-keys.js +21 -0
- package/dist/lib/api/api-keys.js.map +1 -0
- package/dist/lib/api/assets.d.ts +75 -0
- package/dist/lib/api/assets.d.ts.map +1 -0
- package/dist/lib/api/assets.js +74 -0
- package/dist/lib/api/assets.js.map +1 -0
- package/dist/lib/api/client.d.ts +37 -0
- package/dist/lib/api/client.d.ts.map +1 -0
- package/dist/lib/api/client.js +132 -0
- package/dist/lib/api/client.js.map +1 -0
- package/dist/lib/api/documents.d.ts +57 -0
- package/dist/lib/api/documents.d.ts.map +1 -0
- package/dist/lib/api/documents.js +86 -0
- package/dist/lib/api/documents.js.map +1 -0
- package/dist/lib/api/index.d.ts +15 -0
- package/dist/lib/api/index.d.ts.map +1 -0
- package/dist/lib/api/index.js +10 -0
- package/dist/lib/api/index.js.map +1 -0
- package/dist/lib/api/instance.d.ts +17 -0
- package/dist/lib/api/instance.d.ts.map +1 -0
- package/dist/lib/api/instance.js +22 -0
- package/dist/lib/api/instance.js.map +1 -0
- package/dist/lib/api/invitations.d.ts +37 -0
- package/dist/lib/api/invitations.d.ts.map +1 -0
- package/dist/lib/api/invitations.js +28 -0
- package/dist/lib/api/invitations.js.map +1 -0
- package/dist/lib/api/organizations.d.ts +108 -0
- package/dist/lib/api/organizations.d.ts.map +1 -0
- package/dist/lib/api/organizations.js +100 -0
- package/dist/lib/api/organizations.js.map +1 -0
- package/dist/lib/api/types.d.ts +47 -0
- package/dist/lib/api/types.d.ts.map +1 -0
- package/dist/lib/api/types.js +2 -0
- package/dist/lib/api/types.js.map +1 -0
- package/dist/lib/api/user.d.ts +23 -0
- package/dist/lib/api/user.d.ts.map +1 -0
- package/dist/lib/api/user.js +21 -0
- package/dist/lib/api/user.js.map +1 -0
- package/dist/lib/auth/auth-errors.d.ts +7 -0
- package/dist/lib/auth/auth-errors.d.ts.map +1 -0
- package/dist/lib/auth/auth-errors.js +14 -0
- package/dist/lib/auth/auth-errors.js.map +1 -0
- package/dist/lib/auth/auth-hooks.d.ts +6 -0
- package/dist/lib/auth/auth-hooks.d.ts.map +1 -0
- package/dist/lib/auth/auth-hooks.js +139 -0
- package/dist/lib/auth/auth-hooks.js.map +1 -0
- package/dist/lib/auth/provider.d.ts +17 -0
- package/dist/lib/auth/provider.d.ts.map +1 -0
- package/dist/lib/auth/provider.js +1 -0
- package/dist/lib/auth/provider.js.map +1 -0
- package/dist/lib/client/index.d.ts +24 -0
- package/dist/lib/client/index.d.ts.map +1 -0
- package/dist/lib/client/index.js +33 -0
- package/dist/lib/client/index.js.map +1 -0
- package/dist/lib/components/fields/index.d.ts +9 -0
- package/dist/lib/components/fields/index.d.ts.map +1 -0
- package/dist/lib/components/fields/index.js +10 -0
- package/dist/lib/components/fields/index.js.map +1 -0
- package/dist/lib/components/index.d.ts +8 -0
- package/dist/lib/components/index.d.ts.map +1 -0
- package/dist/lib/components/index.js +14 -0
- package/dist/lib/components/index.js.map +1 -0
- package/dist/lib/config.d.ts +3 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +16 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/db/adapters/index.d.ts +1 -0
- package/dist/lib/db/adapters/index.d.ts.map +1 -0
- package/dist/lib/db/adapters/index.js +5 -0
- package/dist/lib/db/adapters/index.js.map +1 -0
- package/dist/lib/db/index.d.ts +2 -0
- package/dist/lib/db/index.d.ts.map +1 -0
- package/dist/lib/db/index.js +1 -0
- package/dist/lib/db/index.js.map +1 -0
- package/dist/lib/db/interfaces/asset.d.ts +73 -0
- package/dist/lib/db/interfaces/asset.d.ts.map +1 -0
- package/dist/lib/db/interfaces/asset.js +1 -0
- package/dist/lib/db/interfaces/asset.js.map +1 -0
- package/dist/lib/db/interfaces/document.d.ts +79 -0
- package/dist/lib/db/interfaces/document.d.ts.map +1 -0
- package/dist/lib/db/interfaces/document.js +1 -0
- package/dist/lib/db/interfaces/document.js.map +1 -0
- package/dist/lib/db/interfaces/index.d.ts +76 -0
- package/dist/lib/db/interfaces/index.d.ts.map +1 -0
- package/dist/lib/db/interfaces/index.js +1 -0
- package/dist/lib/db/interfaces/index.js.map +1 -0
- package/dist/lib/db/interfaces/instance.d.ts +7 -0
- package/dist/lib/db/interfaces/instance.d.ts.map +1 -0
- package/dist/lib/db/interfaces/instance.js +2 -0
- package/dist/lib/db/interfaces/instance.js.map +1 -0
- package/dist/lib/db/interfaces/organization.d.ts +28 -0
- package/dist/lib/db/interfaces/organization.d.ts.map +1 -0
- package/dist/lib/db/interfaces/organization.js +1 -0
- package/dist/lib/db/interfaces/organization.js.map +1 -0
- package/dist/lib/db/interfaces/schema.d.ts +21 -0
- package/dist/lib/db/interfaces/schema.d.ts.map +1 -0
- package/dist/lib/db/interfaces/schema.js +1 -0
- package/dist/lib/db/interfaces/schema.js.map +1 -0
- package/dist/lib/db/interfaces/user.d.ts +17 -0
- package/dist/lib/db/interfaces/user.d.ts.map +1 -0
- package/dist/lib/db/interfaces/user.js +1 -0
- package/dist/lib/db/interfaces/user.js.map +1 -0
- package/dist/lib/db/utils/reference-resolver.d.ts +18 -0
- package/dist/lib/db/utils/reference-resolver.d.ts.map +1 -0
- package/dist/lib/db/utils/reference-resolver.js +81 -0
- package/dist/lib/db/utils/reference-resolver.js.map +1 -0
- package/dist/lib/define.d.ts +3 -0
- package/dist/lib/define.d.ts.map +1 -0
- package/dist/lib/define.js +5 -0
- package/dist/lib/define.js.map +1 -0
- package/dist/lib/email/index.d.ts +2 -0
- package/dist/lib/email/index.d.ts.map +1 -0
- package/dist/lib/email/index.js +1 -0
- package/dist/lib/email/index.js.map +1 -0
- package/dist/lib/email/interfaces/email.d.ts +42 -0
- package/dist/lib/email/interfaces/email.d.ts.map +1 -0
- package/dist/lib/email/interfaces/email.js +1 -0
- package/dist/lib/email/interfaces/email.js.map +1 -0
- package/dist/lib/engine.d.ts +26 -0
- package/dist/lib/engine.d.ts.map +1 -0
- package/dist/lib/engine.js +71 -0
- package/dist/lib/engine.js.map +1 -0
- package/dist/lib/field-validation/date-utils.d.ts +30 -0
- package/dist/lib/field-validation/date-utils.d.ts.map +1 -0
- package/dist/lib/field-validation/date-utils.js +13 -11
- package/dist/lib/field-validation/date-utils.js.map +1 -0
- package/dist/lib/field-validation/rule.d.ts +55 -0
- package/dist/lib/field-validation/rule.d.ts.map +1 -0
- package/dist/lib/field-validation/rule.js +12 -10
- package/dist/lib/field-validation/rule.js.map +1 -0
- package/dist/lib/field-validation/utils.d.ts +43 -0
- package/dist/lib/field-validation/utils.d.ts.map +1 -0
- package/dist/lib/field-validation/utils.js +17 -15
- package/dist/lib/field-validation/utils.js.map +1 -0
- package/dist/lib/graphql/index.d.ts +23 -0
- package/dist/lib/graphql/index.d.ts.map +1 -0
- package/dist/lib/graphql/index.js +86 -0
- package/dist/lib/graphql/index.js.map +1 -0
- package/dist/lib/graphql/resolvers.d.ts +4 -0
- package/dist/lib/graphql/resolvers.d.ts.map +1 -0
- package/dist/lib/graphql/resolvers.js +543 -0
- package/dist/lib/graphql/resolvers.js.map +1 -0
- package/dist/lib/graphql/schema.d.ts +3 -0
- package/dist/lib/graphql/schema.d.ts.map +1 -0
- package/dist/lib/graphql/schema.js +357 -0
- package/dist/lib/graphql/schema.js.map +1 -0
- package/dist/lib/hooks.d.ts +27 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +235 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +5 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/is-mobile.svelte.d.ts +5 -0
- package/dist/lib/is-mobile.svelte.d.ts.map +1 -0
- package/dist/lib/is-mobile.svelte.js +8 -0
- package/dist/lib/is-mobile.svelte.js.map +1 -0
- package/dist/lib/local-api/auth-helpers.d.ts +65 -0
- package/dist/lib/local-api/auth-helpers.d.ts.map +1 -0
- package/dist/lib/local-api/auth-helpers.js +103 -0
- package/dist/lib/local-api/auth-helpers.js.map +1 -0
- package/dist/lib/local-api/collection-api.d.ts +150 -0
- package/dist/lib/local-api/collection-api.d.ts.map +1 -0
- package/dist/lib/local-api/collection-api.js +311 -0
- package/dist/lib/local-api/collection-api.js.map +1 -0
- package/dist/lib/local-api/index.d.ts +108 -0
- package/dist/lib/local-api/index.d.ts.map +1 -0
- package/dist/lib/local-api/index.js +158 -0
- package/dist/lib/local-api/index.js.map +1 -0
- package/dist/lib/local-api/permissions.d.ts +45 -0
- package/dist/lib/local-api/permissions.d.ts.map +1 -0
- package/dist/lib/local-api/permissions.js +117 -0
- package/dist/lib/local-api/permissions.js.map +1 -0
- package/dist/lib/local-api/types.d.ts +65 -0
- package/dist/lib/local-api/types.d.ts.map +1 -0
- package/dist/lib/local-api/types.js +5 -0
- package/dist/lib/local-api/types.js.map +1 -0
- package/dist/lib/routes/assets-bulk.d.ts +3 -0
- package/dist/lib/routes/assets-bulk.d.ts.map +1 -0
- package/dist/lib/routes/assets-bulk.js +49 -0
- package/dist/lib/routes/assets-bulk.js.map +1 -0
- package/dist/lib/routes/assets-by-id.d.ts +5 -0
- package/dist/lib/routes/assets-by-id.d.ts.map +1 -0
- package/dist/lib/routes/assets-by-id.js +106 -0
- package/dist/lib/routes/assets-by-id.js.map +1 -0
- package/dist/lib/routes/assets-cdn.d.ts +3 -0
- package/dist/lib/routes/assets-cdn.d.ts.map +1 -0
- package/dist/lib/routes/assets-cdn.js +125 -0
- package/dist/lib/routes/assets-cdn.js.map +1 -0
- package/dist/lib/routes/assets-references-counts.d.ts +7 -0
- package/dist/lib/routes/assets-references-counts.d.ts.map +1 -0
- package/dist/lib/routes/assets-references-counts.js +32 -0
- package/dist/lib/routes/assets-references-counts.js.map +1 -0
- package/dist/lib/routes/assets-references.d.ts +7 -0
- package/dist/lib/routes/assets-references.d.ts.map +1 -0
- package/dist/lib/routes/assets-references.js +35 -0
- package/dist/lib/routes/assets-references.js.map +1 -0
- package/dist/lib/routes/assets.d.ts +4 -0
- package/dist/lib/routes/assets.d.ts.map +1 -0
- package/dist/lib/routes/assets.js +121 -0
- package/dist/lib/routes/assets.js.map +1 -0
- package/dist/lib/routes/documents-by-id.d.ts +5 -0
- package/dist/lib/routes/documents-by-id.d.ts.map +1 -0
- package/dist/lib/routes/documents-by-id.js +176 -0
- package/dist/lib/routes/documents-by-id.js.map +1 -0
- package/dist/lib/routes/documents-publish.d.ts +4 -0
- package/dist/lib/routes/documents-publish.d.ts.map +1 -0
- package/dist/lib/routes/documents-publish.js +138 -0
- package/dist/lib/routes/documents-publish.js.map +1 -0
- package/dist/lib/routes/documents-query.d.ts +26 -0
- package/dist/lib/routes/documents-query.d.ts.map +1 -0
- package/dist/lib/routes/documents-query.js +101 -0
- package/dist/lib/routes/documents-query.js.map +1 -0
- package/dist/lib/routes/documents.d.ts +4 -0
- package/dist/lib/routes/documents.d.ts.map +1 -0
- package/dist/lib/routes/documents.js +154 -0
- package/dist/lib/routes/documents.js.map +1 -0
- package/dist/lib/routes/index.d.ts +9 -0
- package/dist/lib/routes/index.d.ts.map +1 -0
- package/dist/lib/routes/index.js +15 -0
- package/dist/lib/routes/index.js.map +1 -0
- package/dist/lib/routes/organizations-by-id.d.ts +5 -0
- package/dist/lib/routes/organizations-by-id.d.ts.map +1 -0
- package/dist/lib/routes/organizations-by-id.js +189 -0
- package/dist/lib/routes/organizations-by-id.js.map +1 -0
- package/dist/lib/routes/organizations-invitations.d.ts +4 -0
- package/dist/lib/routes/organizations-invitations.d.ts.map +1 -0
- package/dist/lib/routes/organizations-invitations.js +127 -0
- package/dist/lib/routes/organizations-invitations.js.map +1 -0
- package/dist/lib/routes/organizations-members.d.ts +5 -0
- package/dist/lib/routes/organizations-members.d.ts.map +1 -0
- package/dist/lib/routes/organizations-members.js +208 -0
- package/dist/lib/routes/organizations-members.js.map +1 -0
- package/dist/lib/routes/organizations-switch.d.ts +3 -0
- package/dist/lib/routes/organizations-switch.d.ts.map +1 -0
- package/dist/lib/routes/organizations-switch.js +55 -0
- package/dist/lib/routes/organizations-switch.js.map +1 -0
- package/dist/lib/routes/organizations.d.ts +4 -0
- package/dist/lib/routes/organizations.d.ts.map +1 -0
- package/dist/lib/routes/organizations.js +111 -0
- package/dist/lib/routes/organizations.js.map +1 -0
- package/dist/lib/routes/schemas-by-type.d.ts +3 -0
- package/dist/lib/routes/schemas-by-type.d.ts.map +1 -0
- package/dist/lib/routes/schemas-by-type.js +27 -0
- package/dist/lib/routes/schemas-by-type.js.map +1 -0
- package/dist/lib/routes/schemas.d.ts +3 -0
- package/dist/lib/routes/schemas.d.ts.map +1 -0
- package/dist/lib/routes/schemas.js +12 -0
- package/dist/lib/routes/schemas.js.map +1 -0
- package/dist/lib/routes/user-preferences.d.ts +4 -0
- package/dist/lib/routes/user-preferences.d.ts.map +1 -0
- package/dist/lib/routes/user-preferences.js +79 -0
- package/dist/lib/routes/user-preferences.js.map +1 -0
- package/dist/lib/routes-exports.d.ts +17 -0
- package/dist/lib/routes-exports.d.ts.map +1 -0
- package/dist/lib/routes-exports.js +23 -0
- package/dist/lib/routes-exports.js.map +1 -0
- package/dist/lib/schema/index.d.ts +6 -0
- package/dist/lib/schema/index.d.ts.map +1 -0
- package/dist/lib/schema/index.js +12 -0
- package/dist/lib/schema/index.js.map +1 -0
- package/dist/lib/schema-context.svelte.d.ts +10 -0
- package/dist/lib/schema-context.svelte.d.ts.map +1 -0
- package/dist/lib/schema-context.svelte.js +19 -0
- package/dist/lib/schema-context.svelte.js.map +1 -0
- package/dist/lib/schema-utils/cleanup.d.ts +21 -0
- package/dist/lib/schema-utils/cleanup.d.ts.map +1 -0
- package/dist/lib/schema-utils/cleanup.js +81 -0
- package/dist/lib/schema-utils/cleanup.js.map +1 -0
- package/dist/lib/schema-utils/index.d.ts +4 -0
- package/dist/lib/schema-utils/index.d.ts.map +1 -0
- package/dist/lib/schema-utils/index.js +5 -0
- package/dist/lib/schema-utils/index.js.map +1 -0
- package/dist/lib/schema-utils/utils.d.ts +34 -0
- package/dist/lib/schema-utils/utils.d.ts.map +1 -0
- package/dist/lib/schema-utils/utils.js +59 -0
- package/dist/lib/schema-utils/utils.js.map +1 -0
- package/dist/lib/schema-utils/validator.d.ts +10 -0
- package/dist/lib/schema-utils/validator.d.ts.map +1 -0
- package/dist/lib/schema-utils/validator.js +167 -0
- package/dist/lib/schema-utils/validator.js.map +1 -0
- package/dist/lib/server/index.d.ts +19 -0
- package/dist/lib/server/index.d.ts.map +1 -0
- package/dist/lib/server/index.js +35 -0
- package/dist/lib/server/index.js.map +1 -0
- package/dist/lib/services/asset-service.d.ts +86 -0
- package/dist/lib/services/asset-service.d.ts.map +1 -0
- package/dist/lib/services/asset-service.js +189 -0
- package/dist/lib/services/asset-service.js.map +1 -0
- package/dist/lib/services/index.d.ts +3 -0
- package/dist/lib/services/index.d.ts.map +1 -0
- package/dist/lib/services/index.js +5 -0
- package/dist/lib/services/index.js.map +1 -0
- package/dist/lib/storage/adapters/index.d.ts +2 -0
- package/dist/lib/storage/adapters/index.d.ts.map +1 -0
- package/dist/lib/storage/adapters/index.js +3 -0
- package/dist/lib/storage/adapters/index.js.map +1 -0
- package/dist/lib/storage/adapters/local-storage-adapter.d.ts +54 -0
- package/dist/lib/storage/adapters/local-storage-adapter.d.ts.map +1 -0
- package/dist/lib/storage/adapters/local-storage-adapter.js +189 -0
- package/dist/lib/storage/adapters/local-storage-adapter.js.map +1 -0
- package/dist/lib/storage/index.d.ts +3 -0
- package/dist/lib/storage/index.d.ts.map +1 -0
- package/dist/lib/storage/index.js +7 -0
- package/dist/lib/storage/index.js.map +1 -0
- package/dist/lib/storage/interfaces/index.d.ts +2 -0
- package/dist/lib/storage/interfaces/index.d.ts.map +1 -0
- package/dist/lib/storage/interfaces/index.js +1 -0
- package/dist/lib/storage/interfaces/index.js.map +1 -0
- package/dist/lib/storage/interfaces/storage.d.ts +91 -0
- package/dist/lib/storage/interfaces/storage.d.ts.map +1 -0
- package/dist/lib/storage/interfaces/storage.js +1 -0
- package/dist/lib/storage/interfaces/storage.js.map +1 -0
- package/dist/lib/storage/providers/storage.d.ts +43 -0
- package/dist/lib/storage/providers/storage.d.ts.map +1 -0
- package/dist/lib/storage/providers/storage.js +65 -0
- package/dist/lib/storage/providers/storage.js.map +1 -0
- package/dist/lib/types/asset.d.ts +73 -0
- package/dist/lib/types/asset.d.ts.map +1 -0
- package/dist/lib/types/asset.js +1 -0
- package/dist/lib/types/asset.js.map +1 -0
- package/dist/lib/types/auth.d.ts +62 -0
- package/dist/lib/types/auth.d.ts.map +1 -0
- package/dist/lib/types/auth.js +7 -5
- package/dist/lib/types/auth.js.map +1 -0
- package/dist/lib/types/config.d.ts +77 -0
- package/dist/lib/types/config.d.ts.map +1 -0
- package/dist/lib/types/config.js +1 -0
- package/dist/lib/types/config.js.map +1 -0
- package/dist/lib/types/document.d.ts +35 -0
- package/dist/lib/types/document.d.ts.map +1 -0
- package/dist/lib/types/document.js +1 -0
- package/dist/lib/types/document.js.map +1 -0
- package/dist/lib/types/filters.d.ts +186 -0
- package/dist/lib/types/filters.d.ts.map +1 -0
- package/dist/lib/types/filters.js +1 -0
- package/dist/lib/types/filters.js.map +1 -0
- package/dist/lib/types/index.d.ts +11 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +2 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/types/instance.d.ts +5 -0
- package/dist/lib/types/instance.d.ts.map +1 -0
- package/dist/lib/types/instance.js +3 -0
- package/dist/lib/types/instance.js.map +1 -0
- package/dist/lib/types/organization.d.ts +108 -0
- package/dist/lib/types/organization.d.ts.map +1 -0
- package/dist/lib/types/organization.js +1 -0
- package/dist/lib/types/organization.js.map +1 -0
- package/dist/lib/types/schemas.d.ts +179 -0
- package/dist/lib/types/schemas.d.ts.map +1 -0
- package/dist/lib/types/schemas.js +1 -0
- package/dist/lib/types/schemas.js.map +1 -0
- package/dist/lib/types/sidebar.d.ts +34 -0
- package/dist/lib/types/sidebar.d.ts.map +1 -0
- package/dist/lib/types/sidebar.js +1 -0
- package/dist/lib/types/sidebar.js.map +1 -0
- package/dist/lib/types/user.d.ts +14 -0
- package/dist/lib/types/user.d.ts.map +1 -0
- package/dist/lib/types/user.js +1 -0
- package/dist/lib/types/user.js.map +1 -0
- package/dist/lib/utils/asset-actions.d.ts +9 -0
- package/dist/lib/utils/asset-actions.d.ts.map +1 -0
- package/dist/lib/utils/asset-actions.js +28 -0
- package/dist/lib/utils/asset-actions.js.map +1 -0
- package/dist/lib/utils/content-hash.d.ts +22 -0
- package/dist/lib/utils/content-hash.d.ts.map +1 -0
- package/dist/lib/utils/content-hash.js +68 -0
- package/dist/lib/utils/content-hash.js.map +1 -0
- package/dist/lib/utils/default-orderings.d.ts +10 -0
- package/dist/lib/utils/default-orderings.d.ts.map +1 -0
- package/dist/lib/utils/default-orderings.js +64 -0
- package/dist/lib/utils/default-orderings.js.map +1 -0
- package/dist/lib/utils/element-events.d.ts +15 -0
- package/dist/lib/utils/element-events.d.ts.map +1 -0
- package/dist/lib/utils/element-events.js +17 -0
- package/dist/lib/utils/element-events.js.map +1 -0
- package/dist/lib/utils/field-defaults.d.ts +8 -0
- package/dist/lib/utils/field-defaults.d.ts.map +1 -0
- package/dist/lib/utils/field-defaults.js +21 -0
- package/dist/lib/utils/field-defaults.js.map +1 -0
- package/dist/lib/utils/image-url.d.ts +88 -0
- package/dist/lib/utils/image-url.d.ts.map +1 -0
- package/dist/lib/utils/image-url.js +167 -0
- package/dist/lib/utils/image-url.js.map +1 -0
- package/dist/lib/utils/index.d.ts +8 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +13 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/utils/initial-value-helpers.d.ts +50 -0
- package/dist/lib/utils/initial-value-helpers.d.ts.map +1 -0
- package/dist/lib/utils/initial-value-helpers.js +71 -0
- package/dist/lib/utils/initial-value-helpers.js.map +1 -0
- package/dist/lib/utils/logger.d.ts +9 -0
- package/dist/lib/utils/logger.d.ts.map +1 -0
- package/dist/lib/utils/logger.js +30 -0
- package/dist/lib/utils/logger.js.map +1 -0
- package/dist/lib/utils/slug.d.ts +13 -0
- package/dist/lib/utils/slug.d.ts.map +1 -0
- package/dist/lib/utils/slug.js +31 -0
- package/dist/lib/utils/slug.js.map +1 -0
- package/dist/lib/utils.d.ts +13 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/local-api/index.d.ts.map +1 -1
- package/dist/local-api/permissions.d.ts.map +1 -1
- package/dist/local-api/permissions.js +3 -4
- package/dist/routes/assets-bulk.d.ts +3 -0
- package/dist/routes/assets-bulk.d.ts.map +1 -0
- package/dist/routes/assets-bulk.js +48 -0
- package/dist/routes/assets-by-id.d.ts.map +1 -1
- package/dist/routes/assets-by-id.js +22 -55
- package/dist/routes/assets-cdn.d.ts.map +1 -1
- package/dist/routes/assets-cdn.js +12 -50
- package/dist/routes/assets-references-counts.d.ts +7 -0
- package/dist/routes/assets-references-counts.d.ts.map +1 -0
- package/dist/routes/assets-references-counts.js +31 -0
- package/dist/routes/assets-references.d.ts +7 -0
- package/dist/routes/assets-references.d.ts.map +1 -0
- package/dist/routes/assets-references.js +34 -0
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +27 -6
- package/dist/routes/documents-by-id.d.ts.map +1 -1
- package/dist/routes/documents-by-id.js +4 -3
- package/dist/routes/documents-publish.d.ts.map +1 -1
- package/dist/routes/documents-publish.js +3 -2
- package/dist/routes/documents-query.d.ts.map +1 -1
- package/dist/routes/documents-query.js +2 -1
- package/dist/routes/documents.d.ts.map +1 -1
- package/dist/routes/documents.js +3 -2
- package/dist/routes/organizations-by-id.d.ts.map +1 -1
- package/dist/routes/organizations-by-id.js +4 -3
- package/dist/routes/organizations-invitations.d.ts.map +1 -1
- package/dist/routes/organizations-invitations.js +5 -4
- package/dist/routes/organizations-members.d.ts.map +1 -1
- package/dist/routes/organizations-members.js +7 -6
- package/dist/routes/organizations-switch.d.ts.map +1 -1
- package/dist/routes/organizations-switch.js +2 -1
- package/dist/routes/organizations.d.ts.map +1 -1
- package/dist/routes/organizations.js +3 -2
- package/dist/routes/schemas-by-type.d.ts.map +1 -1
- package/dist/routes/schemas-by-type.js +3 -2
- package/dist/routes/user-preferences.d.ts.map +1 -1
- package/dist/routes/user-preferences.js +3 -2
- package/dist/routes-exports.d.ts +3 -0
- package/dist/routes-exports.d.ts.map +1 -1
- package/dist/routes-exports.js +3 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +11 -0
- package/dist/schema-utils/validator.d.ts.map +1 -1
- package/dist/schema-utils/validator.js +4 -3
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -0
- package/dist/services/asset-service.d.ts.map +1 -1
- package/dist/services/asset-service.js +8 -7
- package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -1
- package/dist/storage/adapters/local-storage-adapter.js +5 -4
- package/dist/types/auth.d.ts +13 -1
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/auth.js +6 -5
- package/dist/types/config.d.ts +14 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/document.d.ts +1 -1
- package/dist/types/document.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/instance.d.ts +5 -0
- package/dist/types/instance.d.ts.map +1 -0
- package/dist/types/instance.js +2 -0
- package/dist/types/schemas.d.ts +1 -1
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/types/sidebar.d.ts +1 -0
- package/dist/types/sidebar.d.ts.map +1 -1
- package/dist/utils/asset-actions.d.ts +9 -0
- package/dist/utils/asset-actions.d.ts.map +1 -0
- package/dist/utils/asset-actions.js +27 -0
- package/dist/utils/element-events.d.ts +15 -0
- package/dist/utils/element-events.d.ts.map +1 -0
- package/dist/utils/element-events.js +16 -0
- package/dist/utils/image-url.d.ts.map +1 -1
- package/dist/utils/image-url.js +10 -9
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +29 -0
- package/package.json +132 -103
- package/LICENSE +0 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,yEAAyE;AAEzE,0CAA0C;AAC1C,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-mobile.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/is-mobile.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,qBAAa,QAAS,SAAQ,UAAU;gBAC3B,UAAU,GAAE,MAAkC;CAG1D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MediaQuery } from 'svelte/reactivity';
|
|
2
|
+
const DEFAULT_MOBILE_BREAKPOINT = 768;
|
|
3
|
+
export class IsMobile extends MediaQuery {
|
|
4
|
+
constructor(breakpoint = DEFAULT_MOBILE_BREAKPOINT) {
|
|
5
|
+
super(`max-width: ${breakpoint - 1}px`);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=is-mobile.svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-mobile.svelte.js","sourceRoot":"","sources":["../../src/lib/is-mobile.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAEtC,MAAM,OAAO,QAAS,SAAQ,UAAU;IACvC,YAAY,aAAqB,yBAAyB;QACzD,KAAK,CAAC,cAAc,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Auth } from '../types/auth.js';
|
|
2
|
+
import type { LocalAPIContext } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Convert SvelteKit locals.auth to LocalAPIContext
|
|
5
|
+
*
|
|
6
|
+
* This helper bridges the gap between the authentication system
|
|
7
|
+
* (handled in the app layer and enriched by handleAuthHook) and
|
|
8
|
+
* the LocalAPI's context-based approach.
|
|
9
|
+
*
|
|
10
|
+
* Preserves the full Auth object in context.auth so custom permission
|
|
11
|
+
* logic can access any custom fields added via module augmentation.
|
|
12
|
+
*
|
|
13
|
+
* @param auth - Auth object from locals.auth (already validated by handleAuthHook)
|
|
14
|
+
* @returns LocalAPIContext for use with LocalAPI operations
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // In a SvelteKit route handler
|
|
19
|
+
* import { authToContext } from '@aphexcms/cms-core/local-api';
|
|
20
|
+
*
|
|
21
|
+
* export const GET: RequestHandler = async ({ locals }) => {
|
|
22
|
+
* const api = locals.aphexCMS.localAPI;
|
|
23
|
+
* const context = authToContext(locals.auth);
|
|
24
|
+
*
|
|
25
|
+
* const pages = await api.collections.page.find(context, {
|
|
26
|
+
* where: { status: { equals: 'published' } }
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* return json({ data: pages });
|
|
30
|
+
* };
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function authToContext(auth: Auth | null | undefined): LocalAPIContext;
|
|
34
|
+
/**
|
|
35
|
+
* Check if auth exists and convert to context
|
|
36
|
+
* Alias for authToContext - more semantic in some contexts
|
|
37
|
+
*
|
|
38
|
+
* @param auth - Auth object from locals.auth
|
|
39
|
+
* @returns LocalAPIContext
|
|
40
|
+
* @throws Error if auth is missing or invalid
|
|
41
|
+
*/
|
|
42
|
+
export declare function requireAuth(auth: Auth | null | undefined): LocalAPIContext;
|
|
43
|
+
/**
|
|
44
|
+
* Create a system context for operations that bypass normal permissions
|
|
45
|
+
* Use this for seed scripts, cron jobs, migrations, and other system-level operations
|
|
46
|
+
*
|
|
47
|
+
* @param organizationId - Organization ID for the operation
|
|
48
|
+
* @returns LocalAPIContext with overrideAccess: true
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* // In a seed script
|
|
53
|
+
* import { systemContext } from '@aphexcms/cms-core/local-api';
|
|
54
|
+
*
|
|
55
|
+
* const api = getLocalAPI();
|
|
56
|
+
* const context = systemContext('org_123');
|
|
57
|
+
*
|
|
58
|
+
* await api.collections.page.create(context, {
|
|
59
|
+
* data: { title: 'Home', slug: 'home' },
|
|
60
|
+
* publish: true
|
|
61
|
+
* });
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare function systemContext(organizationId: string): LocalAPIContext;
|
|
65
|
+
//# sourceMappingURL=auth-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-helpers.d.ts","sourceRoot":"","sources":["../../../src/lib/local-api/auth-helpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,CAiC5E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,CAE1E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,CAKrE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// local-api/auth-helpers.ts
|
|
2
|
+
//
|
|
3
|
+
// Helper utilities to convert between Auth types and LocalAPIContext
|
|
4
|
+
/**
|
|
5
|
+
* Convert SvelteKit locals.auth to LocalAPIContext
|
|
6
|
+
*
|
|
7
|
+
* This helper bridges the gap between the authentication system
|
|
8
|
+
* (handled in the app layer and enriched by handleAuthHook) and
|
|
9
|
+
* the LocalAPI's context-based approach.
|
|
10
|
+
*
|
|
11
|
+
* Preserves the full Auth object in context.auth so custom permission
|
|
12
|
+
* logic can access any custom fields added via module augmentation.
|
|
13
|
+
*
|
|
14
|
+
* @param auth - Auth object from locals.auth (already validated by handleAuthHook)
|
|
15
|
+
* @returns LocalAPIContext for use with LocalAPI operations
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // In a SvelteKit route handler
|
|
20
|
+
* import { authToContext } from '@aphexcms/cms-core/local-api';
|
|
21
|
+
*
|
|
22
|
+
* export const GET: RequestHandler = async ({ locals }) => {
|
|
23
|
+
* const api = locals.aphexCMS.localAPI;
|
|
24
|
+
* const context = authToContext(locals.auth);
|
|
25
|
+
*
|
|
26
|
+
* const pages = await api.collections.page.find(context, {
|
|
27
|
+
* where: { status: { equals: 'published' } }
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* return json({ data: pages });
|
|
31
|
+
* };
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function authToContext(auth) {
|
|
35
|
+
if (!auth) {
|
|
36
|
+
throw new Error('Authentication required');
|
|
37
|
+
}
|
|
38
|
+
// For session auth, extract user and organization info
|
|
39
|
+
if (auth.type === 'session') {
|
|
40
|
+
return {
|
|
41
|
+
organizationId: auth.organizationId,
|
|
42
|
+
user: auth.user,
|
|
43
|
+
auth: auth // Preserve full auth for custom permission logic
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// For API key auth, create a synthetic user for permission checking
|
|
47
|
+
// API keys don't have traditional user accounts, but we need user info
|
|
48
|
+
// for the permission system to work correctly
|
|
49
|
+
if (auth.type === 'api_key') {
|
|
50
|
+
return {
|
|
51
|
+
organizationId: auth.organizationId,
|
|
52
|
+
user: {
|
|
53
|
+
id: `apikey:${auth.keyId}`,
|
|
54
|
+
email: `apikey-${auth.name}@system`,
|
|
55
|
+
name: auth.name,
|
|
56
|
+
// Map API key permissions to user roles for permission checking
|
|
57
|
+
role: auth.permissions.includes('write') ? 'editor' : 'viewer'
|
|
58
|
+
},
|
|
59
|
+
auth: auth // Preserve full auth for custom permission logic
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// This should never happen with proper typing, but just in case
|
|
63
|
+
throw new Error('Unknown auth type');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if auth exists and convert to context
|
|
67
|
+
* Alias for authToContext - more semantic in some contexts
|
|
68
|
+
*
|
|
69
|
+
* @param auth - Auth object from locals.auth
|
|
70
|
+
* @returns LocalAPIContext
|
|
71
|
+
* @throws Error if auth is missing or invalid
|
|
72
|
+
*/
|
|
73
|
+
export function requireAuth(auth) {
|
|
74
|
+
return authToContext(auth);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Create a system context for operations that bypass normal permissions
|
|
78
|
+
* Use this for seed scripts, cron jobs, migrations, and other system-level operations
|
|
79
|
+
*
|
|
80
|
+
* @param organizationId - Organization ID for the operation
|
|
81
|
+
* @returns LocalAPIContext with overrideAccess: true
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* // In a seed script
|
|
86
|
+
* import { systemContext } from '@aphexcms/cms-core/local-api';
|
|
87
|
+
*
|
|
88
|
+
* const api = getLocalAPI();
|
|
89
|
+
* const context = systemContext('org_123');
|
|
90
|
+
*
|
|
91
|
+
* await api.collections.page.create(context, {
|
|
92
|
+
* data: { title: 'Home', slug: 'home' },
|
|
93
|
+
* publish: true
|
|
94
|
+
* });
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export function systemContext(organizationId) {
|
|
98
|
+
return {
|
|
99
|
+
organizationId,
|
|
100
|
+
overrideAccess: true
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=auth-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-helpers.js","sourceRoot":"","sources":["../../../src/lib/local-api/auth-helpers.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,EAAE;AACF,qEAAqE;AAKrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,aAAa,CAAC,IAA6B;IAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAED,uDAAuD;IACvD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO;YACN,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,iDAAiD;SAC5D,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,uEAAuE;IACvE,8CAA8C;IAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO;YACN,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,IAAI,EAAE;gBACL,EAAE,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;gBAC1B,KAAK,EAAE,UAAU,IAAI,CAAC,IAAI,SAAS;gBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,gEAAgE;gBAChE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;aAC9D;YACD,IAAI,EAAE,IAAI,CAAC,iDAAiD;SAC5D,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAA6B;IACxD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,aAAa,CAAC,cAAsB;IACnD,OAAO;QACN,cAAc;QACd,cAAc,EAAE,IAAI;KACpB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { DatabaseAdapter } from '../db/index.js';
|
|
2
|
+
import type { Where, WhereTyped, FindOptions, FindResult } from '../types/filters.js';
|
|
3
|
+
import type { Document } from '../types/document.js';
|
|
4
|
+
import type { LocalAPIContext } from './types.js';
|
|
5
|
+
import type { SchemaType } from '../types/schemas.js';
|
|
6
|
+
import { PermissionChecker } from './permissions.js';
|
|
7
|
+
import { type DocumentValidationResult } from '../field-validation/utils.js';
|
|
8
|
+
/**
|
|
9
|
+
* Result from create/update operations that includes validation
|
|
10
|
+
*/
|
|
11
|
+
export interface DocumentResult<T> {
|
|
12
|
+
document: T;
|
|
13
|
+
validation: DocumentValidationResult;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Collection API - provides type-safe operations for a single collection
|
|
17
|
+
* Generic type T represents the document type for this collection
|
|
18
|
+
*/
|
|
19
|
+
export declare class CollectionAPI<T = Document> {
|
|
20
|
+
private collectionName;
|
|
21
|
+
private databaseAdapter;
|
|
22
|
+
private _schema;
|
|
23
|
+
private permissions;
|
|
24
|
+
constructor(collectionName: string, databaseAdapter: DatabaseAdapter, _schema: SchemaType, permissions: PermissionChecker);
|
|
25
|
+
/**
|
|
26
|
+
* Get the schema for this collection
|
|
27
|
+
*/
|
|
28
|
+
get schema(): SchemaType;
|
|
29
|
+
/**
|
|
30
|
+
* Find multiple documents with advanced filtering and pagination
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const result = await api.collections.pages.find(
|
|
35
|
+
* { organizationId: 'org_123', user },
|
|
36
|
+
* {
|
|
37
|
+
* where: {
|
|
38
|
+
* status: { equals: 'published' },
|
|
39
|
+
* 'author.name': { contains: 'John' }
|
|
40
|
+
* },
|
|
41
|
+
* limit: 20,
|
|
42
|
+
* sort: '-publishedAt'
|
|
43
|
+
* }
|
|
44
|
+
* );
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
find(context: LocalAPIContext, options?: FindOptions<T>): Promise<FindResult<T>>;
|
|
48
|
+
/**
|
|
49
|
+
* Find a single document by ID
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const page = await api.collections.pages.findByID(
|
|
54
|
+
* { organizationId: 'org_123', user },
|
|
55
|
+
* 'doc_123',
|
|
56
|
+
* { depth: 1, perspective: 'published' }
|
|
57
|
+
* );
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
findByID(context: LocalAPIContext, id: string, options?: Partial<FindOptions<T>>): Promise<T | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Count documents matching a where clause
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const count = await api.collections.pages.count(
|
|
67
|
+
* { organizationId: 'org_123', user },
|
|
68
|
+
* { where: { status: { equals: 'published' } } }
|
|
69
|
+
* );
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
count(context: LocalAPIContext, options?: {
|
|
73
|
+
where?: WhereTyped<T> | Where;
|
|
74
|
+
}): Promise<number>;
|
|
75
|
+
/**
|
|
76
|
+
* Create a new document
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const result = await api.collections.pages.create(
|
|
81
|
+
* { organizationId: 'org_123', user },
|
|
82
|
+
* {
|
|
83
|
+
* title: 'New Page',
|
|
84
|
+
* slug: 'new-page',
|
|
85
|
+
* content: []
|
|
86
|
+
* }
|
|
87
|
+
* );
|
|
88
|
+
* // result.document - the created document
|
|
89
|
+
* // result.validation - validation results
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
create(context: LocalAPIContext, data: Omit<T, 'id' | '_meta'>, options?: {
|
|
93
|
+
publish?: boolean;
|
|
94
|
+
}): Promise<DocumentResult<T>>;
|
|
95
|
+
/**
|
|
96
|
+
* Update an existing document
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const result = await api.collections.pages.update(
|
|
101
|
+
* { organizationId: 'org_123', user },
|
|
102
|
+
* 'doc_123',
|
|
103
|
+
* { title: 'Updated Title' },
|
|
104
|
+
* { publish: true }
|
|
105
|
+
* );
|
|
106
|
+
* // result.document - the updated document
|
|
107
|
+
* // result.validation - validation results
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
update(context: LocalAPIContext, id: string, data: Partial<Omit<T, 'id' | '_meta'>>, options?: {
|
|
111
|
+
publish?: boolean;
|
|
112
|
+
}): Promise<DocumentResult<T> | null>;
|
|
113
|
+
/**
|
|
114
|
+
* Delete a document
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* const deleted = await api.collections.pages.delete(
|
|
119
|
+
* { organizationId: 'org_123', user },
|
|
120
|
+
* 'doc_123'
|
|
121
|
+
* );
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
delete(context: LocalAPIContext, id: string): Promise<boolean>;
|
|
125
|
+
/**
|
|
126
|
+
* Publish a document
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const published = await api.collections.pages.publish(
|
|
131
|
+
* { organizationId: 'org_123', user },
|
|
132
|
+
* 'doc_123'
|
|
133
|
+
* );
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
publish(context: LocalAPIContext, id: string): Promise<T | null>;
|
|
137
|
+
/**
|
|
138
|
+
* Unpublish a document
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```typescript
|
|
142
|
+
* const unpublished = await api.collections.pages.unpublish(
|
|
143
|
+
* { organizationId: 'org_123', user },
|
|
144
|
+
* 'doc_123'
|
|
145
|
+
* );
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
unpublish(context: LocalAPIContext, id: string): Promise<T | null>;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=collection-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-api.d.ts","sourceRoot":"","sources":["../../../src/lib/local-api/collection-api.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAwB,KAAK,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAEhG;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC;IACZ,UAAU,EAAE,wBAAwB,CAAC;CACrC;AA4BD;;;GAGG;AACH,qBAAa,aAAa,CAAC,CAAC,GAAG,QAAQ;IAErC,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;gBAHX,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,iBAAiB;IAMvC;;OAEG;IACH,IAAI,MAAM,IAAI,UAAU,CAEvB;IAED;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAqB1F;;;;;;;;;;;OAWG;IACG,QAAQ,CACb,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAmBpB;;;;;;;;;;OAUG;IACG,KAAK,CACV,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;KAAE,GACzC,OAAO,CAAC,MAAM,CAAC;IAWlB;;;;;;;;;;;;;;;;OAgBG;IACG,MAAM,CACX,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7B,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IA4C7B;;;;;;;;;;;;;;OAcG;IACG,MAAM,CACX,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7B,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAkEpC;;;;;;;;;;OAUG;IACG,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpE;;;;;;;;;;OAUG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAgCtE;;;;;;;;;;OAUG;IACG,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;CAUxE"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
// local-api/collection-api.ts
|
|
2
|
+
//
|
|
3
|
+
// Collection API - provides type-safe CRUD operations for a single collection
|
|
4
|
+
import { validateDocumentData } from '../field-validation/utils.js';
|
|
5
|
+
/**
|
|
6
|
+
* Transform a raw database document into a typed document with data extracted
|
|
7
|
+
* based on perspective (draft or published)
|
|
8
|
+
*/
|
|
9
|
+
function transformDocument(doc, perspective = 'draft') {
|
|
10
|
+
const data = perspective === 'draft' ? doc.draftData : doc.publishedData;
|
|
11
|
+
// Merge document metadata with the content data
|
|
12
|
+
return {
|
|
13
|
+
id: doc.id,
|
|
14
|
+
...data,
|
|
15
|
+
// Include metadata fields
|
|
16
|
+
_meta: {
|
|
17
|
+
type: doc.type,
|
|
18
|
+
status: doc.status,
|
|
19
|
+
organizationId: doc.organizationId,
|
|
20
|
+
createdAt: doc.createdAt,
|
|
21
|
+
updatedAt: doc.updatedAt,
|
|
22
|
+
createdBy: doc.createdBy,
|
|
23
|
+
updatedBy: doc.updatedBy,
|
|
24
|
+
publishedAt: doc.publishedAt,
|
|
25
|
+
publishedHash: doc.publishedHash
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Collection API - provides type-safe operations for a single collection
|
|
31
|
+
* Generic type T represents the document type for this collection
|
|
32
|
+
*/
|
|
33
|
+
export class CollectionAPI {
|
|
34
|
+
collectionName;
|
|
35
|
+
databaseAdapter;
|
|
36
|
+
_schema;
|
|
37
|
+
permissions;
|
|
38
|
+
constructor(collectionName, databaseAdapter, _schema, permissions) {
|
|
39
|
+
this.collectionName = collectionName;
|
|
40
|
+
this.databaseAdapter = databaseAdapter;
|
|
41
|
+
this._schema = _schema;
|
|
42
|
+
this.permissions = permissions;
|
|
43
|
+
// Validate collection exists
|
|
44
|
+
this.permissions.validateCollection(collectionName);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get the schema for this collection
|
|
48
|
+
*/
|
|
49
|
+
get schema() {
|
|
50
|
+
return this._schema;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Find multiple documents with advanced filtering and pagination
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const result = await api.collections.pages.find(
|
|
58
|
+
* { organizationId: 'org_123', user },
|
|
59
|
+
* {
|
|
60
|
+
* where: {
|
|
61
|
+
* status: { equals: 'published' },
|
|
62
|
+
* 'author.name': { contains: 'John' }
|
|
63
|
+
* },
|
|
64
|
+
* limit: 20,
|
|
65
|
+
* sort: '-publishedAt'
|
|
66
|
+
* }
|
|
67
|
+
* );
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
async find(context, options = {}) {
|
|
71
|
+
// Permission check (unless overrideAccess)
|
|
72
|
+
await this.permissions.canRead(context, this.collectionName);
|
|
73
|
+
// Call adapter's advanced find method
|
|
74
|
+
const result = await this.databaseAdapter.findManyDocAdvanced(context.organizationId, this.collectionName, options);
|
|
75
|
+
// Transform documents to extract data based on perspective
|
|
76
|
+
const perspective = options.perspective || 'draft';
|
|
77
|
+
const transformedDocs = result.docs.map((doc) => transformDocument(doc, perspective));
|
|
78
|
+
return {
|
|
79
|
+
...result,
|
|
80
|
+
docs: transformedDocs
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Find a single document by ID
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const page = await api.collections.pages.findByID(
|
|
89
|
+
* { organizationId: 'org_123', user },
|
|
90
|
+
* 'doc_123',
|
|
91
|
+
* { depth: 1, perspective: 'published' }
|
|
92
|
+
* );
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
async findByID(context, id, options) {
|
|
96
|
+
// Permission check (unless overrideAccess)
|
|
97
|
+
await this.permissions.canRead(context, this.collectionName);
|
|
98
|
+
const result = await this.databaseAdapter.findByDocIdAdvanced(context.organizationId, id, options);
|
|
99
|
+
if (!result) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
// Transform document to extract data based on perspective
|
|
103
|
+
const perspective = options?.perspective || 'draft';
|
|
104
|
+
return transformDocument(result, perspective);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Count documents matching a where clause
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* const count = await api.collections.pages.count(
|
|
112
|
+
* { organizationId: 'org_123', user },
|
|
113
|
+
* { where: { status: { equals: 'published' } } }
|
|
114
|
+
* );
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
async count(context, options) {
|
|
118
|
+
// Permission check (unless overrideAccess)
|
|
119
|
+
await this.permissions.canRead(context, this.collectionName);
|
|
120
|
+
return this.databaseAdapter.countDocuments(context.organizationId, this.collectionName, options?.where);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a new document
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* const result = await api.collections.pages.create(
|
|
128
|
+
* { organizationId: 'org_123', user },
|
|
129
|
+
* {
|
|
130
|
+
* title: 'New Page',
|
|
131
|
+
* slug: 'new-page',
|
|
132
|
+
* content: []
|
|
133
|
+
* }
|
|
134
|
+
* );
|
|
135
|
+
* // result.document - the created document
|
|
136
|
+
* // result.validation - validation results
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
async create(context, data, options) {
|
|
140
|
+
// Permission check (unless overrideAccess)
|
|
141
|
+
await this.permissions.canWrite(context, this.collectionName);
|
|
142
|
+
// Validate and normalize data (dates converted to ISO)
|
|
143
|
+
const validationResult = await validateDocumentData(this._schema, data, data);
|
|
144
|
+
if (options?.publish) {
|
|
145
|
+
await this.permissions.canPublish(context, this.collectionName);
|
|
146
|
+
// Block publish if validation fails
|
|
147
|
+
if (!validationResult.isValid) {
|
|
148
|
+
const errorMessage = validationResult.errors
|
|
149
|
+
.map((e) => `${e.field}: ${e.errors.join(', ')}`)
|
|
150
|
+
.join('; ');
|
|
151
|
+
throw new Error(`Cannot publish: validation errors - ${errorMessage}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Create document with normalized data (dates in ISO format)
|
|
155
|
+
const document = await this.databaseAdapter.createDocument({
|
|
156
|
+
organizationId: context.organizationId,
|
|
157
|
+
type: this.collectionName,
|
|
158
|
+
draftData: validationResult.normalizedData,
|
|
159
|
+
createdBy: context.user?.id
|
|
160
|
+
});
|
|
161
|
+
// Publish immediately if requested (validation already done above)
|
|
162
|
+
if (options?.publish) {
|
|
163
|
+
const published = await this.databaseAdapter.publishDoc(context.organizationId, document.id);
|
|
164
|
+
if (published) {
|
|
165
|
+
return {
|
|
166
|
+
document: transformDocument(published, 'published'),
|
|
167
|
+
validation: validationResult
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
document: transformDocument(document, 'draft'),
|
|
173
|
+
validation: validationResult
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Update an existing document
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* ```typescript
|
|
181
|
+
* const result = await api.collections.pages.update(
|
|
182
|
+
* { organizationId: 'org_123', user },
|
|
183
|
+
* 'doc_123',
|
|
184
|
+
* { title: 'Updated Title' },
|
|
185
|
+
* { publish: true }
|
|
186
|
+
* );
|
|
187
|
+
* // result.document - the updated document
|
|
188
|
+
* // result.validation - validation results
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
async update(context, id, data, options) {
|
|
192
|
+
// Permission check (unless overrideAccess)
|
|
193
|
+
await this.permissions.canWrite(context, this.collectionName);
|
|
194
|
+
// Get existing document to merge with updates
|
|
195
|
+
const existingDoc = await this.databaseAdapter.findByDocIdAdvanced(context.organizationId, id);
|
|
196
|
+
if (!existingDoc) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
// Merge existing data with updates, but only keep fields defined in schema
|
|
200
|
+
// This prevents orphaned fields from persisting when schema changes
|
|
201
|
+
const schemaFieldNames = new Set(this._schema.fields.map((f) => f.name));
|
|
202
|
+
const cleanedExisting = {};
|
|
203
|
+
// Only copy fields from existing doc that are still in the schema
|
|
204
|
+
for (const [key, value] of Object.entries(existingDoc.draftData || {})) {
|
|
205
|
+
if (schemaFieldNames.has(key)) {
|
|
206
|
+
cleanedExisting[key] = value;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Merge cleaned existing data with new updates
|
|
210
|
+
const mergedData = { ...cleanedExisting, ...data };
|
|
211
|
+
// Validate and normalize the merged data
|
|
212
|
+
const validationResult = await validateDocumentData(this._schema, mergedData, mergedData);
|
|
213
|
+
// Update draft with normalized data (dates in ISO format)
|
|
214
|
+
const document = await this.databaseAdapter.updateDocDraft(context.organizationId, id, validationResult.normalizedData, context.user?.id);
|
|
215
|
+
if (!document) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
if (options?.publish) {
|
|
219
|
+
await this.permissions.canPublish(context, this.collectionName);
|
|
220
|
+
// Block publish if validation fails
|
|
221
|
+
if (!validationResult.isValid) {
|
|
222
|
+
const errorMessage = validationResult.errors
|
|
223
|
+
.map((e) => `${e.field}: ${e.errors.join(', ')}`)
|
|
224
|
+
.join('; ');
|
|
225
|
+
throw new Error(`Cannot publish: validation errors - ${errorMessage}`);
|
|
226
|
+
}
|
|
227
|
+
const published = await this.databaseAdapter.publishDoc(context.organizationId, document.id);
|
|
228
|
+
if (published) {
|
|
229
|
+
return {
|
|
230
|
+
document: transformDocument(published, 'published'),
|
|
231
|
+
validation: validationResult
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
document: transformDocument(document, 'draft'),
|
|
237
|
+
validation: validationResult
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Delete a document
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* ```typescript
|
|
245
|
+
* const deleted = await api.collections.pages.delete(
|
|
246
|
+
* { organizationId: 'org_123', user },
|
|
247
|
+
* 'doc_123'
|
|
248
|
+
* );
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
async delete(context, id) {
|
|
252
|
+
// Permission check (unless overrideAccess)
|
|
253
|
+
await this.permissions.canDelete(context, this.collectionName);
|
|
254
|
+
return this.databaseAdapter.deleteDocById(context.organizationId, id);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Publish a document
|
|
258
|
+
*
|
|
259
|
+
* @example
|
|
260
|
+
* ```typescript
|
|
261
|
+
* const published = await api.collections.pages.publish(
|
|
262
|
+
* { organizationId: 'org_123', user },
|
|
263
|
+
* 'doc_123'
|
|
264
|
+
* );
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
async publish(context, id) {
|
|
268
|
+
// Permission check (unless overrideAccess)
|
|
269
|
+
await this.permissions.canPublish(context, this.collectionName);
|
|
270
|
+
// Get the document to access draft data for validation
|
|
271
|
+
const document = await this.databaseAdapter.findByDocIdAdvanced(context.organizationId, id);
|
|
272
|
+
if (!document || !document.draftData) {
|
|
273
|
+
throw new Error('Document not found or has no draft content to publish');
|
|
274
|
+
}
|
|
275
|
+
// Validate draft data (dates already in ISO, will be converted for validation)
|
|
276
|
+
const validationResult = await validateDocumentData(this._schema, document.draftData, document.draftData);
|
|
277
|
+
if (!validationResult.isValid) {
|
|
278
|
+
const errorMessage = validationResult.errors
|
|
279
|
+
.map((e) => `${e.field}: ${e.errors.join(', ')}`)
|
|
280
|
+
.join('; ');
|
|
281
|
+
throw new Error(`Cannot publish: validation errors - ${errorMessage}`);
|
|
282
|
+
}
|
|
283
|
+
// Validation passed - proceed with publish
|
|
284
|
+
const publishedDocument = await this.databaseAdapter.publishDoc(context.organizationId, id);
|
|
285
|
+
if (!publishedDocument) {
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
return transformDocument(publishedDocument, 'published');
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Unpublish a document
|
|
292
|
+
*
|
|
293
|
+
* @example
|
|
294
|
+
* ```typescript
|
|
295
|
+
* const unpublished = await api.collections.pages.unpublish(
|
|
296
|
+
* { organizationId: 'org_123', user },
|
|
297
|
+
* 'doc_123'
|
|
298
|
+
* );
|
|
299
|
+
* ```
|
|
300
|
+
*/
|
|
301
|
+
async unpublish(context, id) {
|
|
302
|
+
// Permission check (unless overrideAccess)
|
|
303
|
+
await this.permissions.canPublish(context, this.collectionName);
|
|
304
|
+
const document = await this.databaseAdapter.unpublishDoc(context.organizationId, id);
|
|
305
|
+
if (!document) {
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
return transformDocument(document, 'draft');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=collection-api.js.map
|