@aphexcms/cms-core 0.1.11 → 0.1.13
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/LICENSE +21 -0
- package/dist/api/assets.d.ts +48 -0
- package/dist/api/assets.d.ts.map +1 -0
- package/dist/api/assets.js +52 -0
- package/dist/api/client.d.ts +37 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +125 -0
- package/dist/api/documents.d.ts +57 -0
- package/dist/api/documents.d.ts.map +1 -0
- package/dist/api/documents.js +85 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +5 -0
- package/dist/api/organizations.d.ts +101 -0
- package/dist/api/organizations.d.ts.map +1 -0
- package/dist/api/organizations.js +92 -0
- package/dist/api/types.d.ts +45 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +1 -0
- package/dist/auth/auth-errors.d.ts +7 -0
- package/dist/auth/auth-errors.d.ts.map +1 -0
- package/dist/auth/auth-errors.js +13 -0
- package/dist/auth/auth-hooks.d.ts +6 -0
- package/dist/auth/auth-hooks.d.ts.map +1 -0
- package/dist/auth/auth-hooks.js +122 -0
- package/dist/auth/provider.d.ts +17 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +1 -0
- package/dist/cli/generate-types.js +218 -0
- package/dist/cli/index.js +86 -0
- package/dist/client/index.d.ts +24 -0
- package/dist/client/index.d.ts.map +1 -0
- package/{src/lib/client/index.ts → dist/client/index.js} +7 -18
- package/{src/lib → dist}/components/AdminApp.svelte +26 -55
- package/dist/components/AdminApp.svelte.d.ts +24 -0
- package/dist/components/AdminApp.svelte.d.ts.map +1 -0
- package/dist/components/admin/AdminLayout.svelte.d.ts +15 -0
- package/dist/components/admin/AdminLayout.svelte.d.ts.map +1 -0
- package/{src/lib → dist}/components/admin/DocumentEditor.svelte +60 -14
- package/dist/components/admin/DocumentEditor.svelte.d.ts +18 -0
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -0
- package/dist/components/admin/DocumentTypesList.svelte.d.ts +14 -0
- package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +1 -0
- package/dist/components/admin/ObjectModal.svelte.d.ts +15 -0
- package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -0
- package/dist/components/admin/SchemaField.svelte.d.ts +19 -0
- package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/ArrayField.svelte.d.ts +12 -0
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/BooleanField.svelte.d.ts +13 -0
- package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/ImageField.svelte.d.ts +15 -0
- package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/NumberField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/NumberField.svelte.d.ts.map +1 -0
- package/{src/lib → dist}/components/admin/fields/ReferenceField.svelte +2 -3
- package/dist/components/admin/fields/ReferenceField.svelte.d.ts +12 -0
- package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/SlugField.svelte.d.ts +15 -0
- package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/StringField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/TextareaField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -0
- package/dist/components/fields/index.d.ts +9 -0
- package/dist/components/fields/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.d.ts.map +1 -0
- package/{src/lib/components/index.ts → dist/components/index.js} +1 -5
- package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +11 -0
- package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -0
- package/dist/components/layout/Sidebar.svelte.d.ts +14 -0
- package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +11 -0
- package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts +19 -0
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +9 -0
- package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/NavUser.svelte.d.ts +9 -0
- package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +15 -0
- package/dist/db/adapters/index.d.ts +1 -0
- package/dist/db/adapters/index.d.ts.map +1 -0
- package/{src/lib/db/adapters/index.ts → dist/db/adapters/index.js} +1 -0
- package/dist/db/index.d.ts +2 -0
- package/dist/db/index.d.ts.map +1 -0
- package/{src/lib/db/index.ts → dist/db/index.js} +1 -2
- package/dist/db/interfaces/asset.d.ts +73 -0
- package/dist/db/interfaces/asset.d.ts.map +1 -0
- package/dist/db/interfaces/asset.js +1 -0
- package/dist/db/interfaces/document.d.ts +61 -0
- package/dist/db/interfaces/document.d.ts.map +1 -0
- package/dist/db/interfaces/document.js +1 -0
- package/dist/db/interfaces/index.d.ts +73 -0
- package/dist/db/interfaces/index.d.ts.map +1 -0
- package/dist/db/interfaces/index.js +1 -0
- package/dist/db/interfaces/organization.d.ts +27 -0
- package/dist/db/interfaces/organization.d.ts.map +1 -0
- package/dist/db/interfaces/organization.js +1 -0
- package/dist/db/interfaces/schema.d.ts +21 -0
- package/dist/db/interfaces/schema.d.ts.map +1 -0
- package/dist/db/interfaces/schema.js +1 -0
- package/dist/db/interfaces/user.d.ts +15 -0
- package/dist/db/interfaces/user.d.ts.map +1 -0
- package/dist/db/interfaces/user.js +1 -0
- package/dist/db/utils/reference-resolver.d.ts +18 -0
- package/dist/db/utils/reference-resolver.d.ts.map +1 -0
- package/dist/db/utils/reference-resolver.js +80 -0
- package/dist/define.d.ts +3 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +4 -0
- package/dist/email/index.d.ts +2 -0
- package/dist/email/index.d.ts.map +1 -0
- package/{src/lib/email/index.ts → dist/email/index.js} +1 -2
- package/dist/email/interfaces/email.d.ts +42 -0
- package/dist/email/interfaces/email.d.ts.map +1 -0
- package/dist/email/interfaces/email.js +1 -0
- package/dist/engine.d.ts +26 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +66 -0
- package/dist/field-validation/rule.d.ts +51 -0
- package/dist/field-validation/rule.d.ts.map +1 -0
- package/dist/field-validation/rule.js +221 -0
- package/dist/field-validation/utils.d.ts +39 -0
- package/dist/field-validation/utils.d.ts.map +1 -0
- package/dist/field-validation/utils.js +99 -0
- package/dist/hooks.d.ts +25 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +164 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/{src/lib/index.ts → dist/index.js} +1 -2
- package/dist/is-mobile.svelte.d.ts +5 -0
- package/dist/is-mobile.svelte.d.ts.map +1 -0
- package/{src/lib/is-mobile.svelte.ts → dist/is-mobile.svelte.js} +3 -5
- package/dist/lib/auth/provider.js +1 -0
- package/dist/lib/db/index.js +4 -0
- package/dist/lib/db/interfaces/asset.js +1 -0
- package/dist/lib/db/interfaces/document.js +1 -0
- package/dist/lib/db/interfaces/index.js +1 -0
- package/dist/lib/db/interfaces/organization.js +1 -0
- package/dist/lib/db/interfaces/schema.js +1 -0
- package/dist/lib/db/interfaces/user.js +1 -0
- package/dist/lib/email/index.js +4 -0
- package/dist/lib/email/interfaces/email.js +1 -0
- package/dist/lib/field-validation/rule.js +221 -0
- package/dist/lib/field-validation/utils.js +99 -0
- package/dist/lib/storage/interfaces/index.js +2 -0
- package/dist/lib/storage/interfaces/storage.js +1 -0
- package/dist/lib/types/asset.js +2 -0
- package/dist/lib/types/auth.js +41 -0
- package/dist/lib/types/config.js +1 -0
- package/dist/lib/types/document.js +1 -0
- package/dist/lib/types/filters.js +5 -0
- package/dist/lib/types/index.js +9 -0
- package/dist/lib/types/organization.js +3 -0
- package/dist/lib/types/schemas.js +1 -0
- package/dist/lib/types/sidebar.js +1 -0
- package/dist/lib/types/user.js +1 -0
- package/dist/local-api/auth-helpers.d.ts +65 -0
- package/dist/local-api/auth-helpers.d.ts.map +1 -0
- package/dist/local-api/auth-helpers.js +102 -0
- package/dist/local-api/collection-api.d.ts +138 -0
- package/dist/local-api/collection-api.d.ts.map +1 -0
- package/dist/local-api/collection-api.js +276 -0
- package/dist/local-api/index.d.ts +108 -0
- package/dist/local-api/index.d.ts.map +1 -0
- package/dist/local-api/index.js +157 -0
- package/dist/local-api/permissions.d.ts +45 -0
- package/dist/local-api/permissions.d.ts.map +1 -0
- package/dist/local-api/permissions.js +117 -0
- package/dist/local-api/types.d.ts +65 -0
- package/dist/local-api/types.d.ts.map +1 -0
- package/dist/local-api/types.js +4 -0
- package/dist/routes/assets-by-id.d.ts +5 -0
- package/dist/routes/assets-by-id.d.ts.map +1 -0
- package/dist/routes/assets-by-id.js +138 -0
- package/dist/routes/assets-cdn.d.ts +3 -0
- package/dist/routes/assets-cdn.d.ts.map +1 -0
- package/dist/routes/assets-cdn.js +155 -0
- package/dist/routes/assets.d.ts +4 -0
- package/dist/routes/assets.d.ts.map +1 -0
- package/dist/routes/assets.js +94 -0
- package/dist/routes/documents-by-id.d.ts +5 -0
- package/dist/routes/documents-by-id.d.ts.map +1 -0
- package/dist/routes/documents-by-id.js +163 -0
- package/dist/routes/documents-publish.d.ts +4 -0
- package/dist/routes/documents-publish.d.ts.map +1 -0
- package/dist/routes/documents-publish.js +136 -0
- package/dist/routes/documents-query.d.ts +24 -0
- package/dist/routes/documents-query.d.ts.map +1 -0
- package/dist/routes/documents-query.js +95 -0
- package/dist/routes/documents.d.ts +4 -0
- package/dist/routes/documents.d.ts.map +1 -0
- package/dist/routes/documents.js +136 -0
- package/dist/routes/index.d.ts +8 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +12 -0
- package/dist/routes/organizations-by-id.d.ts +5 -0
- package/dist/routes/organizations-by-id.d.ts.map +1 -0
- package/dist/routes/organizations-by-id.js +187 -0
- package/dist/routes/organizations-invitations.d.ts +4 -0
- package/dist/routes/organizations-invitations.d.ts.map +1 -0
- package/dist/routes/organizations-invitations.js +125 -0
- package/dist/routes/organizations-members.d.ts +5 -0
- package/dist/routes/organizations-members.d.ts.map +1 -0
- package/dist/routes/organizations-members.js +206 -0
- package/dist/routes/organizations-switch.d.ts +3 -0
- package/dist/routes/organizations-switch.d.ts.map +1 -0
- package/dist/routes/organizations-switch.js +53 -0
- package/dist/routes/organizations.d.ts +4 -0
- package/dist/routes/organizations.d.ts.map +1 -0
- package/dist/routes/organizations.js +109 -0
- package/dist/routes/schemas-by-type.d.ts +3 -0
- package/dist/routes/schemas-by-type.d.ts.map +1 -0
- package/dist/routes/schemas-by-type.js +25 -0
- package/dist/routes/schemas.d.ts +3 -0
- package/dist/routes/schemas.d.ts.map +1 -0
- package/dist/routes/schemas.js +11 -0
- package/dist/routes-exports.d.ts +14 -0
- package/dist/routes-exports.d.ts.map +1 -0
- package/dist/routes-exports.js +19 -0
- package/dist/schema-context.svelte.d.ts +10 -0
- package/dist/schema-context.svelte.d.ts.map +1 -0
- package/dist/schema-context.svelte.js +18 -0
- package/dist/schema-utils/cleanup.d.ts +21 -0
- package/dist/schema-utils/cleanup.d.ts.map +1 -0
- package/dist/schema-utils/cleanup.js +80 -0
- package/dist/schema-utils/index.d.ts +4 -0
- package/dist/schema-utils/index.d.ts.map +1 -0
- package/dist/schema-utils/index.js +4 -0
- package/dist/schema-utils/utils.d.ts +30 -0
- package/dist/schema-utils/utils.d.ts.map +1 -0
- package/dist/schema-utils/utils.js +37 -0
- package/dist/schema-utils/validator.d.ts +6 -0
- package/dist/schema-utils/validator.d.ts.map +1 -0
- package/dist/schema-utils/validator.js +45 -0
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +30 -0
- package/dist/services/asset-service.d.ts +86 -0
- package/dist/services/asset-service.d.ts.map +1 -0
- package/dist/services/asset-service.js +187 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +4 -0
- package/dist/storage/adapters/index.d.ts +2 -0
- package/dist/storage/adapters/index.d.ts.map +1 -0
- package/dist/storage/adapters/index.js +2 -0
- package/dist/storage/adapters/local-storage-adapter.d.ts +54 -0
- package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -0
- package/dist/storage/adapters/local-storage-adapter.js +187 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/{src/lib/storage/index.ts → dist/storage/index.js} +2 -4
- package/dist/storage/interfaces/index.d.ts +2 -0
- package/dist/storage/interfaces/index.d.ts.map +1 -0
- package/dist/storage/interfaces/index.js +2 -0
- package/dist/storage/interfaces/storage.d.ts +91 -0
- package/dist/storage/interfaces/storage.d.ts.map +1 -0
- package/dist/storage/interfaces/storage.js +1 -0
- package/dist/storage/providers/storage.d.ts +43 -0
- package/dist/storage/providers/storage.d.ts.map +1 -0
- package/dist/storage/providers/storage.js +64 -0
- package/dist/types/asset.d.ts +73 -0
- package/dist/types/asset.d.ts.map +1 -0
- package/dist/types/asset.js +2 -0
- package/dist/types/auth.d.ts +50 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +41 -0
- package/dist/types/config.d.ts +64 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +1 -0
- package/dist/types/document.d.ts +35 -0
- package/dist/types/document.d.ts.map +1 -0
- package/dist/types/document.js +1 -0
- package/dist/types/filters.d.ts +173 -0
- package/dist/types/filters.d.ts.map +1 -0
- package/dist/types/filters.js +5 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/organization.d.ts +105 -0
- package/dist/types/organization.d.ts.map +1 -0
- package/dist/types/organization.js +3 -0
- package/dist/types/schemas.d.ts +114 -0
- package/dist/types/schemas.d.ts.map +1 -0
- package/dist/types/schemas.js +1 -0
- package/dist/types/sidebar.d.ts +33 -0
- package/dist/types/sidebar.d.ts.map +1 -0
- package/dist/types/sidebar.js +1 -0
- package/dist/types/user.d.ts +14 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +1 -0
- package/dist/utils/content-hash.d.ts +22 -0
- package/dist/utils/content-hash.d.ts.map +1 -0
- package/dist/utils/content-hash.js +67 -0
- package/dist/utils/image-url.d.ts +88 -0
- package/dist/utils/image-url.d.ts.map +1 -0
- package/dist/utils/image-url.js +165 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/slug.d.ts +13 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +30 -0
- package/dist/utils.d.ts +13 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +5 -0
- package/package.json +101 -95
- package/src/lib/api/assets.ts +0 -75
- package/src/lib/api/client.ts +0 -150
- package/src/lib/api/documents.ts +0 -102
- package/src/lib/api/index.ts +0 -7
- package/src/lib/api/organizations.ts +0 -154
- package/src/lib/api/types.ts +0 -34
- package/src/lib/auth/auth-errors.ts +0 -23
- package/src/lib/auth/auth-hooks.ts +0 -132
- package/src/lib/auth/provider.ts +0 -25
- package/src/lib/config.ts +0 -18
- package/src/lib/db/interfaces/asset.ts +0 -61
- package/src/lib/db/interfaces/document.ts +0 -53
- package/src/lib/db/interfaces/index.ts +0 -98
- package/src/lib/db/interfaces/organization.ts +0 -51
- package/src/lib/db/interfaces/schema.ts +0 -13
- package/src/lib/db/interfaces/user.ts +0 -16
- package/src/lib/db/utils/reference-resolver.ts +0 -119
- package/src/lib/define.ts +0 -7
- package/src/lib/email/interfaces/email.ts +0 -45
- package/src/lib/engine.ts +0 -85
- package/src/lib/field-validation/rule.ts +0 -287
- package/src/lib/field-validation/utils.ts +0 -91
- package/src/lib/hooks.ts +0 -142
- package/src/lib/routes/assets-by-id.ts +0 -161
- package/src/lib/routes/assets-cdn.ts +0 -185
- package/src/lib/routes/assets.ts +0 -116
- package/src/lib/routes/documents-by-id.ts +0 -188
- package/src/lib/routes/documents-publish.ts +0 -211
- package/src/lib/routes/documents.ts +0 -172
- package/src/lib/routes/index.ts +0 -13
- package/src/lib/routes/organizations-by-id.ts +0 -258
- package/src/lib/routes/organizations-invitations.ts +0 -183
- package/src/lib/routes/organizations-members.ts +0 -301
- package/src/lib/routes/organizations-switch.ts +0 -74
- package/src/lib/routes/organizations.ts +0 -147
- package/src/lib/routes/schemas-by-type.ts +0 -35
- package/src/lib/routes/schemas.ts +0 -19
- package/src/lib/routes-exports.ts +0 -42
- package/src/lib/schema-context.svelte.ts +0 -24
- package/src/lib/schema-utils/cleanup.ts +0 -116
- package/src/lib/schema-utils/index.ts +0 -4
- package/src/lib/schema-utils/utils.ts +0 -47
- package/src/lib/schema-utils/validator.ts +0 -58
- package/src/lib/server/index.ts +0 -40
- package/src/lib/services/asset-service.ts +0 -256
- package/src/lib/services/index.ts +0 -6
- package/src/lib/storage/adapters/index.ts +0 -2
- package/src/lib/storage/adapters/local-storage-adapter.ts +0 -215
- package/src/lib/storage/interfaces/index.ts +0 -2
- package/src/lib/storage/interfaces/storage.ts +0 -114
- package/src/lib/storage/providers/storage.ts +0 -83
- package/src/lib/types/asset.ts +0 -81
- package/src/lib/types/auth.ts +0 -80
- package/src/lib/types/config.ts +0 -45
- package/src/lib/types/document.ts +0 -38
- package/src/lib/types/index.ts +0 -8
- package/src/lib/types/organization.ts +0 -119
- package/src/lib/types/schemas.ts +0 -156
- package/src/lib/types/sidebar.ts +0 -37
- package/src/lib/types/user.ts +0 -17
- package/src/lib/utils/content-hash.ts +0 -75
- package/src/lib/utils/image-url.ts +0 -204
- package/src/lib/utils/index.ts +0 -12
- package/src/lib/utils/slug.ts +0 -33
- package/src/lib/utils.ts +0 -13
- /package/{src/lib → dist}/app.d.ts +0 -0
- /package/{src/lib → dist}/auth/MULTI_TENANCY_PLAN.md +0 -0
- /package/{src/lib → dist}/components/admin/AdminLayout.svelte +0 -0
- /package/{src/lib → dist}/components/admin/DocumentTypesList.svelte +0 -0
- /package/{src/lib → dist}/components/admin/ObjectModal.svelte +0 -0
- /package/{src/lib → dist}/components/admin/SchemaField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/ArrayField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/BooleanField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/ImageField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/NumberField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/SlugField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/StringField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/TextareaField.svelte +0 -0
- /package/{src/lib/components/fields/index.ts → dist/components/fields/index.js} +0 -0
- /package/{src/lib → dist}/components/layout/OrganizationSwitcher.svelte +0 -0
- /package/{src/lib → dist}/components/layout/Sidebar.svelte +0 -0
- /package/{src/lib → dist}/components/layout/sidebar/AppSidebar.svelte +0 -0
- /package/{src/lib → dist}/components/layout/sidebar/NavMain.svelte +0 -0
- /package/{src/lib → dist}/components/layout/sidebar/NavSecondary.svelte +0 -0
- /package/{src/lib → dist}/components/layout/sidebar/NavUser.svelte +0 -0
- /package/{src/lib → dist}/plugins/README.md +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Document, NewDocument } from '../types/index.js';
|
|
2
|
+
export interface PaginationMeta {
|
|
3
|
+
total: number;
|
|
4
|
+
page: number;
|
|
5
|
+
pageSize: number;
|
|
6
|
+
totalPages: number;
|
|
7
|
+
hasNextPage: boolean;
|
|
8
|
+
hasPrevPage: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ApiResponse<T> {
|
|
11
|
+
success: boolean;
|
|
12
|
+
data?: T;
|
|
13
|
+
error?: string;
|
|
14
|
+
message?: string;
|
|
15
|
+
pagination?: PaginationMeta;
|
|
16
|
+
meta?: {
|
|
17
|
+
count: number;
|
|
18
|
+
limit: number;
|
|
19
|
+
offset: number;
|
|
20
|
+
filters: Record<string, any>;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface DocumentListParams {
|
|
24
|
+
type?: string;
|
|
25
|
+
docType?: string;
|
|
26
|
+
status?: string;
|
|
27
|
+
page?: number;
|
|
28
|
+
pageSize?: number;
|
|
29
|
+
limit?: number;
|
|
30
|
+
offset?: number;
|
|
31
|
+
depth?: number;
|
|
32
|
+
sort?: string;
|
|
33
|
+
perspective?: 'draft' | 'published';
|
|
34
|
+
}
|
|
35
|
+
export interface CreateDocumentData {
|
|
36
|
+
type: string;
|
|
37
|
+
data: Record<string, any>;
|
|
38
|
+
publish?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface UpdateDocumentData {
|
|
41
|
+
data: Record<string, any>;
|
|
42
|
+
publish?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export type { Document, NewDocument };
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/api/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG5D,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACrB;AAGD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,UAAU,CAAC,EAAE,cAAc,CAAC;IAE5B,IAAI,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC7B,CAAC;CACF;AAGD,MAAM,WAAW,kBAAkB;IAElC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;CACpC;AAGD,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAGD,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAGD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type AuthErrorCode = 'no_session' | 'session_expired' | 'no_organization' | 'kicked_from_org' | 'unauthorized';
|
|
2
|
+
export declare class AuthError extends Error {
|
|
3
|
+
code: AuthErrorCode;
|
|
4
|
+
constructor(code: AuthErrorCode, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function createAuthError(code: AuthErrorCode, message: string): AuthError;
|
|
7
|
+
//# sourceMappingURL=auth-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-errors.d.ts","sourceRoot":"","sources":["../../src/lib/auth/auth-errors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GACtB,YAAY,GACZ,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,CAAC;AAElB,qBAAa,SAAU,SAAQ,KAAK;IACnC,IAAI,EAAE,aAAa,CAAC;gBAER,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM;CAKhD;AAGD,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAE/E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Custom authentication errors with error codes for better error handling
|
|
2
|
+
export class AuthError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = 'AuthError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
// Helper function to create auth errors
|
|
11
|
+
export function createAuthError(code, message) {
|
|
12
|
+
return new AuthError(code, message);
|
|
13
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RequestEvent } from '@sveltejs/kit';
|
|
2
|
+
import type { DatabaseAdapter } from '../db/index.js';
|
|
3
|
+
import type { CMSConfig } from '../types/index.js';
|
|
4
|
+
import type { AuthProvider } from './provider.js';
|
|
5
|
+
export declare function handleAuthHook(event: RequestEvent, config: CMSConfig, authProvider: AuthProvider, db: DatabaseAdapter): Promise<Response | null>;
|
|
6
|
+
//# sourceMappingURL=auth-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-hooks.d.ts","sourceRoot":"","sources":["../../src/lib/auth/auth-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAQ,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,wBAAsB,cAAc,CACnC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,YAAY,EAC1B,EAAE,EAAE,eAAe,GACjB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoI1B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { redirect } from '@sveltejs/kit';
|
|
2
|
+
import { AuthError } from './auth-errors.js';
|
|
3
|
+
export async function handleAuthHook(event, config, authProvider, db) {
|
|
4
|
+
const path = event.url.pathname;
|
|
5
|
+
// 1. Admin UI routes - require session authentication
|
|
6
|
+
if (path.startsWith('/admin')) {
|
|
7
|
+
try {
|
|
8
|
+
const session = await authProvider.requireSession(event.request, db);
|
|
9
|
+
event.locals.auth = session;
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
// If it's an AuthError, redirect to login with error code
|
|
13
|
+
if (error instanceof AuthError) {
|
|
14
|
+
const loginUrl = config.auth?.loginUrl || '/login';
|
|
15
|
+
throw redirect(302, `${loginUrl}?error=${error.code}`);
|
|
16
|
+
}
|
|
17
|
+
// For other errors, redirect without error code
|
|
18
|
+
throw redirect(302, config.auth?.loginUrl || '/login');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// 2. Asset CDN routes - accept session OR API key OR signed token
|
|
22
|
+
// Support both /assets/ and /media/ paths (media is Sanity-style URL)
|
|
23
|
+
if (path.startsWith('/assets/') || path.startsWith('/media/')) {
|
|
24
|
+
// Try session first (for admin UI)
|
|
25
|
+
let auth = await authProvider.getSession(event.request, db);
|
|
26
|
+
// If no session, try API key
|
|
27
|
+
if (!auth) {
|
|
28
|
+
auth = await authProvider.validateApiKey(event.request, db);
|
|
29
|
+
}
|
|
30
|
+
// Make auth available (can be null, route will check for signed token)
|
|
31
|
+
if (auth) {
|
|
32
|
+
event.locals.auth = auth;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// 3. API routes - accept session OR API key
|
|
36
|
+
if (path.startsWith('/api/')) {
|
|
37
|
+
// Skip auth routes (Better Auth handles these)
|
|
38
|
+
if (path.startsWith('/api/auth')) {
|
|
39
|
+
return null; // Let the main hook continue
|
|
40
|
+
}
|
|
41
|
+
// If API key is explicitly provided, prioritize it over session
|
|
42
|
+
// This allows public content access even when user is logged in to a different org
|
|
43
|
+
const hasApiKey = event.request.headers.has('x-api-key');
|
|
44
|
+
let auth = null;
|
|
45
|
+
if (hasApiKey) {
|
|
46
|
+
// API key takes precedence when explicitly provided
|
|
47
|
+
auth = await authProvider.validateApiKey(event.request, db);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Otherwise, try session (for admin UI making API calls)
|
|
51
|
+
auth = await authProvider.getSession(event.request, db);
|
|
52
|
+
}
|
|
53
|
+
// Check if GraphQL plugin is configured
|
|
54
|
+
let graphqlEndpoint;
|
|
55
|
+
const hasGraphQLPlugin = config.plugins?.some((p) => {
|
|
56
|
+
if (typeof p === 'string')
|
|
57
|
+
return p === '@aphexcms/graphql-plugin';
|
|
58
|
+
if (typeof p === 'object')
|
|
59
|
+
return p.name === '@aphexcms/graphql-plugin';
|
|
60
|
+
return false;
|
|
61
|
+
});
|
|
62
|
+
if (hasGraphQLPlugin) {
|
|
63
|
+
graphqlEndpoint = '/api/graphql'; // Standard GraphQL endpoint
|
|
64
|
+
}
|
|
65
|
+
// Require authentication for protected API routes
|
|
66
|
+
const protectedApiRoutes = [
|
|
67
|
+
'/api/documents',
|
|
68
|
+
'/api/assets',
|
|
69
|
+
'/api/schemas',
|
|
70
|
+
'/api/organizations',
|
|
71
|
+
'/api/settings'
|
|
72
|
+
];
|
|
73
|
+
if (graphqlEndpoint) {
|
|
74
|
+
protectedApiRoutes.push(graphqlEndpoint);
|
|
75
|
+
}
|
|
76
|
+
const isProtectedRoute = protectedApiRoutes.some((route) => path.startsWith(route));
|
|
77
|
+
if (isProtectedRoute && !auth) {
|
|
78
|
+
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
|
|
79
|
+
status: 401,
|
|
80
|
+
headers: { 'Content-Type': 'application/json' }
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// Check write permission for mutations
|
|
84
|
+
if (auth && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(event.request.method)) {
|
|
85
|
+
// Special handling for GraphQL
|
|
86
|
+
if (graphqlEndpoint && path.startsWith(graphqlEndpoint)) {
|
|
87
|
+
// We need to read the body to check if it's a mutation.
|
|
88
|
+
// It's important to clone the request so we don't consume the body stream.
|
|
89
|
+
const requestBody = await event.request.clone().text();
|
|
90
|
+
const isMutation = requestBody.trim().startsWith('mutation');
|
|
91
|
+
if (isMutation && auth.type === 'api_key' && !auth.permissions.includes('write')) {
|
|
92
|
+
return new Response(JSON.stringify({ error: 'Forbidden: Write permission required for mutations' }), {
|
|
93
|
+
status: 403,
|
|
94
|
+
headers: { 'Content-Type': 'application/json' }
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Existing logic for other API routes
|
|
100
|
+
if (auth.type === 'api_key' && !auth.permissions.includes('write')) {
|
|
101
|
+
return new Response(JSON.stringify({ error: 'Forbidden: Write permission required' }), {
|
|
102
|
+
status: 403,
|
|
103
|
+
headers: { 'Content-Type': 'application/json' }
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Make auth available in API routes
|
|
109
|
+
if (auth) {
|
|
110
|
+
event.locals.auth = auth;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// 4. All other routes - try to populate auth if session exists (optional auth)
|
|
114
|
+
// This allows public pages to detect if user is logged in (like WordPress admin bar)
|
|
115
|
+
if (!event.locals.auth) {
|
|
116
|
+
const auth = await authProvider.getSession(event.request, db);
|
|
117
|
+
if (auth) {
|
|
118
|
+
event.locals.auth = auth;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null; // Tell the main hook to continue
|
|
122
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SessionAuth, ApiKeyAuth } from '../types/index.js';
|
|
2
|
+
import type { DatabaseAdapter } from '../db/interfaces/index.js';
|
|
3
|
+
export interface AuthProvider {
|
|
4
|
+
getSession(request: Request, db: DatabaseAdapter): Promise<SessionAuth | null>;
|
|
5
|
+
requireSession(request: Request, db: DatabaseAdapter): Promise<SessionAuth>;
|
|
6
|
+
validateApiKey(request: Request, db: DatabaseAdapter): Promise<ApiKeyAuth | null>;
|
|
7
|
+
requireApiKey(request: Request, db: DatabaseAdapter, permission?: 'read' | 'write'): Promise<ApiKeyAuth>;
|
|
8
|
+
getUserById(userId: string): Promise<{
|
|
9
|
+
id: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
email: string;
|
|
12
|
+
} | null>;
|
|
13
|
+
changeUserName(userId: string, name: string): Promise<void>;
|
|
14
|
+
requestPasswordReset(email: string, redirectTo?: string): Promise<void>;
|
|
15
|
+
resetPassword(token: string, newPassword: string): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/lib/auth/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,YAAY;IAE5B,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC/E,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAG5E,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClF,aAAa,CACZ,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,eAAe,EACnB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAC3B,OAAO,CAAC,UAAU,CAAC,CAAC;IAGvB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC1F,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5D,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { isFieldRequired } from '../lib/field-validation/utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Map Aphex field types to TypeScript types
|
|
4
|
+
*/
|
|
5
|
+
function mapFieldTypeToTS(field, schemaMap) {
|
|
6
|
+
switch (field.type) {
|
|
7
|
+
case 'string':
|
|
8
|
+
case 'text':
|
|
9
|
+
case 'slug':
|
|
10
|
+
return 'string';
|
|
11
|
+
case 'number':
|
|
12
|
+
return 'number';
|
|
13
|
+
case 'boolean':
|
|
14
|
+
return 'boolean';
|
|
15
|
+
case 'image':
|
|
16
|
+
// Image fields store reference to asset
|
|
17
|
+
return 'string'; // Asset ID
|
|
18
|
+
case 'array': {
|
|
19
|
+
if (!('of' in field) || !field.of || field.of.length === 0) {
|
|
20
|
+
return 'unknown[]';
|
|
21
|
+
}
|
|
22
|
+
// Union of all possible array item types
|
|
23
|
+
const types = field.of
|
|
24
|
+
.map((ref) => {
|
|
25
|
+
const refSchema = schemaMap.get(ref.type);
|
|
26
|
+
if (refSchema && refSchema.type === 'object') {
|
|
27
|
+
return pascalCase(ref.type);
|
|
28
|
+
}
|
|
29
|
+
return 'unknown';
|
|
30
|
+
})
|
|
31
|
+
.filter((t) => t !== 'unknown');
|
|
32
|
+
if (types.length === 0) {
|
|
33
|
+
return 'unknown[]';
|
|
34
|
+
}
|
|
35
|
+
return types.length === 1 ? `${types[0]}[]` : `Array<${types.join(' | ')}>`;
|
|
36
|
+
}
|
|
37
|
+
case 'object': {
|
|
38
|
+
if (!('fields' in field) || !field.fields) {
|
|
39
|
+
return 'Record<string, unknown>';
|
|
40
|
+
}
|
|
41
|
+
// Generate inline interface for object fields
|
|
42
|
+
const props = field.fields
|
|
43
|
+
.map((f) => {
|
|
44
|
+
const tsType = mapFieldTypeToTS(f, schemaMap);
|
|
45
|
+
const optional = isFieldOptional(f) ? '?' : '';
|
|
46
|
+
return ` ${f.name}${optional}: ${tsType};`;
|
|
47
|
+
})
|
|
48
|
+
.join('\n');
|
|
49
|
+
return `{\n${props}\n}`;
|
|
50
|
+
}
|
|
51
|
+
case 'reference': {
|
|
52
|
+
// References store document ID as string
|
|
53
|
+
return 'string';
|
|
54
|
+
}
|
|
55
|
+
default:
|
|
56
|
+
return 'unknown';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Convert kebab-case or snake_case to PascalCase
|
|
61
|
+
*/
|
|
62
|
+
function pascalCase(str) {
|
|
63
|
+
return str
|
|
64
|
+
.split(/[-_]/)
|
|
65
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
66
|
+
.join('');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Determine if a field is optional based on validation rules
|
|
70
|
+
*/
|
|
71
|
+
function isFieldOptional(field) {
|
|
72
|
+
return !isFieldRequired(field);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate TypeScript interface for a schema type
|
|
76
|
+
*/
|
|
77
|
+
function generateInterface(schema, schemaMap) {
|
|
78
|
+
const interfaceName = pascalCase(schema.name);
|
|
79
|
+
const fields = schema.fields
|
|
80
|
+
.map((field) => {
|
|
81
|
+
const tsType = mapFieldTypeToTS(field, schemaMap);
|
|
82
|
+
const optional = isFieldOptional(field) ? '?' : '';
|
|
83
|
+
const comment = field.description ? ` /** ${field.description} */\n` : '';
|
|
84
|
+
return `${comment} ${field.name}${optional}: ${tsType};`;
|
|
85
|
+
})
|
|
86
|
+
.join('\n');
|
|
87
|
+
// Add id and _meta fields for document types
|
|
88
|
+
const isDocument = schema.type === 'document';
|
|
89
|
+
const metadataFields = isDocument
|
|
90
|
+
? ` /** Document ID */
|
|
91
|
+
id: string;
|
|
92
|
+
${fields}
|
|
93
|
+
/** Document metadata */
|
|
94
|
+
_meta?: {
|
|
95
|
+
type: string;
|
|
96
|
+
status: 'draft' | 'published';
|
|
97
|
+
organizationId: string;
|
|
98
|
+
createdAt: Date | null;
|
|
99
|
+
updatedAt: Date | null;
|
|
100
|
+
createdBy?: string;
|
|
101
|
+
updatedBy?: string;
|
|
102
|
+
publishedAt?: Date | null;
|
|
103
|
+
publishedHash?: string | null;
|
|
104
|
+
};`
|
|
105
|
+
: fields;
|
|
106
|
+
return `export interface ${interfaceName} {\n${metadataFields}\n}`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Generate the Collections interface augmentation
|
|
110
|
+
*/
|
|
111
|
+
function generateCollectionsAugmentation(documentSchemas) {
|
|
112
|
+
const mappings = documentSchemas
|
|
113
|
+
.map((schema) => {
|
|
114
|
+
const interfaceName = pascalCase(schema.name);
|
|
115
|
+
return ` ${schema.name}: CollectionAPI<${interfaceName}>;`;
|
|
116
|
+
})
|
|
117
|
+
.join('\n');
|
|
118
|
+
return `declare module '@aphexcms/cms-core/server' {
|
|
119
|
+
interface Collections {
|
|
120
|
+
${mappings}
|
|
121
|
+
}
|
|
122
|
+
}`;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Generate complete TypeScript types file with module augmentation
|
|
126
|
+
*/
|
|
127
|
+
export function generateTypes(schemas) {
|
|
128
|
+
// Create schema map for lookups
|
|
129
|
+
const schemaMap = new Map(schemas.map((s) => [s.name, s]));
|
|
130
|
+
// Separate document and object types
|
|
131
|
+
const documentSchemas = schemas.filter((s) => s.type === 'document');
|
|
132
|
+
const objectSchemas = schemas.filter((s) => s.type === 'object');
|
|
133
|
+
// Generate interfaces for all schemas
|
|
134
|
+
const objectInterfaces = objectSchemas.map((s) => generateInterface(s, schemaMap)).join('\n\n');
|
|
135
|
+
const documentInterfaces = documentSchemas.map((s) => generateInterface(s, schemaMap)).join('\n\n');
|
|
136
|
+
// Generate Collections interface augmentation
|
|
137
|
+
const collectionsAugmentation = generateCollectionsAugmentation(documentSchemas);
|
|
138
|
+
// Build the complete file
|
|
139
|
+
const output = `/**
|
|
140
|
+
* Generated types for Aphex CMS
|
|
141
|
+
* This file is auto-generated - DO NOT EDIT manually
|
|
142
|
+
*/
|
|
143
|
+
import type { CollectionAPI } from '@aphexcms/cms-core/server';
|
|
144
|
+
|
|
145
|
+
// ============================================================================
|
|
146
|
+
// Object Types (nested in documents)
|
|
147
|
+
// ============================================================================
|
|
148
|
+
|
|
149
|
+
${objectInterfaces}
|
|
150
|
+
|
|
151
|
+
// ============================================================================
|
|
152
|
+
// Document Types (collections)
|
|
153
|
+
// ============================================================================
|
|
154
|
+
|
|
155
|
+
${documentInterfaces}
|
|
156
|
+
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// Module Augmentation - Extends Collections interface globally
|
|
159
|
+
// ============================================================================
|
|
160
|
+
|
|
161
|
+
${collectionsAugmentation}
|
|
162
|
+
`;
|
|
163
|
+
return output;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* CLI helper to generate types from schema file
|
|
167
|
+
*/
|
|
168
|
+
export async function generateTypesFromConfig(schemaPath, outputPath) {
|
|
169
|
+
try {
|
|
170
|
+
// Resolve paths relative to current working directory
|
|
171
|
+
const path = await import('path');
|
|
172
|
+
const { pathToFileURL } = await import('url');
|
|
173
|
+
const fs = await import('fs/promises');
|
|
174
|
+
const absoluteSchemaPath = path.resolve(process.cwd(), schemaPath);
|
|
175
|
+
const absoluteOutputPath = path.resolve(process.cwd(), outputPath);
|
|
176
|
+
// If the schema file is TypeScript, compile it with esbuild first
|
|
177
|
+
let schemaModulePath = absoluteSchemaPath;
|
|
178
|
+
let tempFile = null;
|
|
179
|
+
if (absoluteSchemaPath.endsWith('.ts')) {
|
|
180
|
+
const { build } = await import('esbuild');
|
|
181
|
+
const tempOutFile = path.join(path.dirname(absoluteSchemaPath), '.temp-schema.mjs');
|
|
182
|
+
await build({
|
|
183
|
+
entryPoints: [absoluteSchemaPath],
|
|
184
|
+
bundle: true,
|
|
185
|
+
format: 'esm',
|
|
186
|
+
platform: 'node',
|
|
187
|
+
outfile: tempOutFile,
|
|
188
|
+
external: ['@aphexcms/*']
|
|
189
|
+
});
|
|
190
|
+
schemaModulePath = tempOutFile;
|
|
191
|
+
tempFile = tempOutFile;
|
|
192
|
+
}
|
|
193
|
+
// Dynamic import the schema types
|
|
194
|
+
// Use file:// URL for proper ESM import
|
|
195
|
+
const schemaModule = await import(pathToFileURL(schemaModulePath).href);
|
|
196
|
+
const schemas = schemaModule.schemaTypes || schemaModule.default;
|
|
197
|
+
// Clean up temp file if created
|
|
198
|
+
if (tempFile) {
|
|
199
|
+
try {
|
|
200
|
+
await fs.unlink(tempFile);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Ignore cleanup errors
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (!schemas || !Array.isArray(schemas)) {
|
|
207
|
+
throw new Error('Invalid schema file: expected schemaTypes array export');
|
|
208
|
+
}
|
|
209
|
+
const generatedTypes = generateTypes(schemas);
|
|
210
|
+
// Write to output file
|
|
211
|
+
await fs.writeFile(absoluteOutputPath, generatedTypes, 'utf-8');
|
|
212
|
+
console.log(`✅ Types generated successfully at: ${absoluteOutputPath}`);
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
console.error('❌ Failed to generate types:', error);
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Aphex CMS CLI
|
|
4
|
+
* Uses cac for command parsing + clack for interactive prompts
|
|
5
|
+
*/
|
|
6
|
+
import { intro, outro, spinner, text, cancel, isCancel } from '@clack/prompts';
|
|
7
|
+
import { cac } from 'cac';
|
|
8
|
+
import pc from 'picocolors';
|
|
9
|
+
import { generateTypesFromConfig } from './generate-types.js';
|
|
10
|
+
const cli = cac('aphex');
|
|
11
|
+
// Version from package.json
|
|
12
|
+
const version = '0.1.13';
|
|
13
|
+
// ASCII Art Banner
|
|
14
|
+
function printBanner() {
|
|
15
|
+
console.log(pc.cyan(`${pc.bold('⚡ Aphex CMS')}\n${pc.dim('A modern headless CMS')}`));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* aphex generate:types [schema-path] [output-path]
|
|
19
|
+
* Generate TypeScript types from schema
|
|
20
|
+
*/
|
|
21
|
+
cli
|
|
22
|
+
.command('generate:types [schema-path] [output-path]', 'Generate TypeScript types from schema')
|
|
23
|
+
.action(async (schemaPath, outputPath) => {
|
|
24
|
+
intro(pc.cyan('⚡ Aphex CMS - Type Generator'));
|
|
25
|
+
try {
|
|
26
|
+
// If paths not provided, prompt for them
|
|
27
|
+
if (!schemaPath) {
|
|
28
|
+
const result = await text({
|
|
29
|
+
message: 'Schema file path:',
|
|
30
|
+
placeholder: './src/lib/schemaTypes/index.ts',
|
|
31
|
+
defaultValue: './src/lib/schemaTypes/index.ts'
|
|
32
|
+
});
|
|
33
|
+
if (isCancel(result)) {
|
|
34
|
+
cancel('Operation cancelled.');
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
schemaPath = result;
|
|
38
|
+
}
|
|
39
|
+
if (!outputPath) {
|
|
40
|
+
const result = await text({
|
|
41
|
+
message: 'Output file path:',
|
|
42
|
+
placeholder: './src/lib/generated-types.ts',
|
|
43
|
+
defaultValue: './src/lib/generated-types.ts'
|
|
44
|
+
});
|
|
45
|
+
if (isCancel(result)) {
|
|
46
|
+
cancel('Operation cancelled.');
|
|
47
|
+
process.exit(0);
|
|
48
|
+
}
|
|
49
|
+
outputPath = result;
|
|
50
|
+
}
|
|
51
|
+
const s = spinner();
|
|
52
|
+
s.start('Generating types...');
|
|
53
|
+
await generateTypesFromConfig(schemaPath, outputPath);
|
|
54
|
+
s.stop(pc.green('✅ Types generated successfully!'));
|
|
55
|
+
outro(pc.dim(`Output: ${pc.cyan(outputPath)}`));
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
cancel(pc.red('Failed to generate types'));
|
|
59
|
+
console.error(error);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* aphex help
|
|
65
|
+
*/
|
|
66
|
+
cli.help();
|
|
67
|
+
/**
|
|
68
|
+
* aphex --version
|
|
69
|
+
*/
|
|
70
|
+
cli.version(version);
|
|
71
|
+
/**
|
|
72
|
+
* Default command - show banner and help
|
|
73
|
+
*/
|
|
74
|
+
cli.on('command:*', () => {
|
|
75
|
+
printBanner();
|
|
76
|
+
console.log(pc.red(`Unknown command: ${cli.args.join(' ')}\n`));
|
|
77
|
+
console.log(`Run ${pc.cyan('aphex --help')} to see available commands.`);
|
|
78
|
+
process.exit(1);
|
|
79
|
+
});
|
|
80
|
+
// Parse CLI args
|
|
81
|
+
cli.parse();
|
|
82
|
+
// If no command provided, show banner and help
|
|
83
|
+
if (!process.argv.slice(2).length) {
|
|
84
|
+
printBanner();
|
|
85
|
+
cli.outputHelp();
|
|
86
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export * from '../types/index.js';
|
|
2
|
+
export type { SidebarUser, SidebarNavItem, SidebarBranding, SidebarData } from '../types/sidebar.js';
|
|
3
|
+
export * from '../field-validation/rule.js';
|
|
4
|
+
export * from '../field-validation/utils.js';
|
|
5
|
+
export { createContentHash, hasUnpublishedChanges } from '../utils/content-hash.js';
|
|
6
|
+
export { setSchemaContext, getSchemaContext } from '../schema-context.svelte';
|
|
7
|
+
export * from '../schema-utils/index.js';
|
|
8
|
+
export { default as DocumentEditor } from '../components/admin/DocumentEditor.svelte';
|
|
9
|
+
export { default as DocumentTypesList } from '../components/admin/DocumentTypesList.svelte';
|
|
10
|
+
export { default as SchemaField } from '../components/admin/SchemaField.svelte';
|
|
11
|
+
export { default as AdminApp } from '../components/AdminApp.svelte';
|
|
12
|
+
export { default as Sidebar } from '../components/layout/Sidebar.svelte';
|
|
13
|
+
export { default as StringField } from '../components/admin/fields/StringField.svelte';
|
|
14
|
+
export { default as TextareaField } from '../components/admin/fields/TextareaField.svelte';
|
|
15
|
+
export { default as NumberField } from '../components/admin/fields/NumberField.svelte';
|
|
16
|
+
export { default as BooleanField } from '../components/admin/fields/BooleanField.svelte';
|
|
17
|
+
export { default as ImageField } from '../components/admin/fields/ImageField.svelte';
|
|
18
|
+
export { default as SlugField } from '../components/admin/fields/SlugField.svelte';
|
|
19
|
+
export { default as ArrayField } from '../components/admin/fields/ArrayField.svelte';
|
|
20
|
+
export { default as ReferenceField } from '../components/admin/fields/ReferenceField.svelte';
|
|
21
|
+
export * from '../utils/index.js';
|
|
22
|
+
export * from '../api/index.js';
|
|
23
|
+
export type { ApiResponse } from '../api/index.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/client/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGlG,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAG1C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG9E,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAC5F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kDAAkD,CAAC;AAG7F,cAAc,gBAAgB,CAAC;AAE/B,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1,30 +1,22 @@
|
|
|
1
1
|
// Aphex CMS Core - Client-side exports
|
|
2
2
|
// These are safe to import in the browser (no Node.js dependencies)
|
|
3
|
-
|
|
4
3
|
// Core types (shared between client and server)
|
|
5
|
-
export * from '../types/index';
|
|
6
|
-
export type { SidebarUser, SidebarNavItem, SidebarBranding, SidebarData } from '../types/sidebar';
|
|
7
|
-
|
|
4
|
+
export * from '../types/index.js';
|
|
8
5
|
// Field validation (client-side validation)
|
|
9
|
-
export * from '../field-validation/rule';
|
|
10
|
-
export * from '../field-validation/utils';
|
|
11
|
-
|
|
6
|
+
export * from '../field-validation/rule.js';
|
|
7
|
+
export * from '../field-validation/utils.js';
|
|
12
8
|
// Content hashing utilities (for client-side change detection)
|
|
13
|
-
export { createContentHash, hasUnpublishedChanges } from '../utils/content-hash';
|
|
14
|
-
|
|
9
|
+
export { createContentHash, hasUnpublishedChanges } from '../utils/content-hash.js';
|
|
15
10
|
// Schema context (for providing schemas to components)
|
|
16
11
|
export { setSchemaContext, getSchemaContext } from '../schema-context.svelte';
|
|
17
|
-
|
|
18
12
|
// Schema utilities (for working with schemas)
|
|
19
|
-
export * from '../schema-utils/index';
|
|
20
|
-
|
|
13
|
+
export * from '../schema-utils/index.js';
|
|
21
14
|
// Components (UI components for the admin interface)
|
|
22
15
|
export { default as DocumentEditor } from '../components/admin/DocumentEditor.svelte';
|
|
23
16
|
export { default as DocumentTypesList } from '../components/admin/DocumentTypesList.svelte';
|
|
24
17
|
export { default as SchemaField } from '../components/admin/SchemaField.svelte';
|
|
25
18
|
export { default as AdminApp } from '../components/AdminApp.svelte';
|
|
26
19
|
export { default as Sidebar } from '../components/layout/Sidebar.svelte';
|
|
27
|
-
|
|
28
20
|
// Field components
|
|
29
21
|
export { default as StringField } from '../components/admin/fields/StringField.svelte';
|
|
30
22
|
export { default as TextareaField } from '../components/admin/fields/TextareaField.svelte';
|
|
@@ -34,9 +26,6 @@ export { default as ImageField } from '../components/admin/fields/ImageField.sve
|
|
|
34
26
|
export { default as SlugField } from '../components/admin/fields/SlugField.svelte';
|
|
35
27
|
export { default as ArrayField } from '../components/admin/fields/ArrayField.svelte';
|
|
36
28
|
export { default as ReferenceField } from '../components/admin/fields/ReferenceField.svelte';
|
|
37
|
-
|
|
38
29
|
// Utility functions (browser-safe)
|
|
39
|
-
export * from '../utils/index';
|
|
40
|
-
|
|
41
|
-
export * from '../api/index';
|
|
42
|
-
export type { ApiResponse } from '../api/index';
|
|
30
|
+
export * from '../utils/index.js';
|
|
31
|
+
export * from '../api/index.js';
|