@elytracms/core 0.0.6
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/clipboard/build.d.ts +77 -0
- package/dist/clipboard/build.js +128 -0
- package/dist/clipboard/build.js.map +1 -0
- package/dist/clipboard/clipboard.d.ts +33 -0
- package/dist/clipboard/clipboard.js +45 -0
- package/dist/clipboard/clipboard.js.map +1 -0
- package/dist/clipboard/fragment.d.ts +112 -0
- package/dist/clipboard/fragment.js +79 -0
- package/dist/clipboard/fragment.js.map +1 -0
- package/dist/clipboard/html.d.ts +26 -0
- package/dist/clipboard/html.js +82 -0
- package/dist/clipboard/html.js.map +1 -0
- package/dist/clipboard/index.d.ts +15 -0
- package/dist/clipboard/index.js +16 -0
- package/dist/clipboard/index.js.map +1 -0
- package/dist/clipboard/references.d.ts +50 -0
- package/dist/clipboard/references.js +0 -0
- package/dist/clipboard/references.js.map +1 -0
- package/dist/clipboard/serialize.d.ts +69 -0
- package/dist/clipboard/serialize.js +130 -0
- package/dist/clipboard/serialize.js.map +1 -0
- package/dist/cms-core/collections.d.ts +82 -0
- package/dist/cms-core/collections.js +187 -0
- package/dist/cms-core/collections.js.map +1 -0
- package/dist/cms-core/documents.d.ts +71 -0
- package/dist/cms-core/documents.js +67 -0
- package/dist/cms-core/documents.js.map +1 -0
- package/dist/cms-core/envelopes.d.ts +80 -0
- package/dist/cms-core/envelopes.js +124 -0
- package/dist/cms-core/envelopes.js.map +1 -0
- package/dist/cms-core/fields.d.ts +220 -0
- package/dist/cms-core/fields.js +250 -0
- package/dist/cms-core/fields.js.map +1 -0
- package/dist/cms-core/fixtures.d.ts +92 -0
- package/dist/cms-core/fixtures.js +357 -0
- package/dist/cms-core/fixtures.js.map +1 -0
- package/dist/cms-core/hierarchy.d.ts +113 -0
- package/dist/cms-core/hierarchy.js +223 -0
- package/dist/cms-core/hierarchy.js.map +1 -0
- package/dist/cms-core/index.d.ts +25 -0
- package/dist/cms-core/index.js +26 -0
- package/dist/cms-core/index.js.map +1 -0
- package/dist/cms-core/infer.d.ts +103 -0
- package/dist/cms-core/infer.js +57 -0
- package/dist/cms-core/infer.js.map +1 -0
- package/dist/cms-core/issues.d.ts +92 -0
- package/dist/cms-core/issues.js +74 -0
- package/dist/cms-core/issues.js.map +1 -0
- package/dist/cms-core/json-schema.d.ts +25 -0
- package/dist/cms-core/json-schema.js +110 -0
- package/dist/cms-core/json-schema.js.map +1 -0
- package/dist/cms-core/localization.d.ts +51 -0
- package/dist/cms-core/localization.js +89 -0
- package/dist/cms-core/localization.js.map +1 -0
- package/dist/cms-core/routes.d.ts +76 -0
- package/dist/cms-core/routes.js +220 -0
- package/dist/cms-core/routes.js.map +1 -0
- package/dist/cms-core/self-type.d.ts +41 -0
- package/dist/cms-core/self-type.js +191 -0
- package/dist/cms-core/self-type.js.map +1 -0
- package/dist/cms-core/url-for-document.d.ts +39 -0
- package/dist/cms-core/url-for-document.js +138 -0
- package/dist/cms-core/url-for-document.js.map +1 -0
- package/dist/cms-core/validate-document.d.ts +121 -0
- package/dist/cms-core/validate-document.js +871 -0
- package/dist/cms-core/validate-document.js.map +1 -0
- package/dist/cms-core/versions.d.ts +75 -0
- package/dist/cms-core/versions.js +97 -0
- package/dist/cms-core/versions.js.map +1 -0
- package/dist/collaboration/approval.d.ts +68 -0
- package/dist/collaboration/approval.js +104 -0
- package/dist/collaboration/approval.js.map +1 -0
- package/dist/collaboration/collaboration.d.ts +49 -0
- package/dist/collaboration/collaboration.js +56 -0
- package/dist/collaboration/collaboration.js.map +1 -0
- package/dist/collaboration/comments.d.ts +72 -0
- package/dist/collaboration/comments.js +118 -0
- package/dist/collaboration/comments.js.map +1 -0
- package/dist/collaboration/core.d.ts +25 -0
- package/dist/collaboration/core.js +26 -0
- package/dist/collaboration/core.js.map +1 -0
- package/dist/collaboration/index.d.ts +14 -0
- package/dist/collaboration/index.js +15 -0
- package/dist/collaboration/index.js.map +1 -0
- package/dist/collaboration/presence.d.ts +62 -0
- package/dist/collaboration/presence.js +85 -0
- package/dist/collaboration/presence.js.map +1 -0
- package/dist/collaboration/publishing.d.ts +60 -0
- package/dist/collaboration/publishing.js +93 -0
- package/dist/collaboration/publishing.js.map +1 -0
- package/dist/collaboration/versions.d.ts +52 -0
- package/dist/collaboration/versions.js +81 -0
- package/dist/collaboration/versions.js.map +1 -0
- package/dist/component-registry/index.d.ts +3 -0
- package/dist/component-registry/index.js +4 -0
- package/dist/component-registry/index.js.map +1 -0
- package/dist/component-registry/issues.d.ts +6 -0
- package/dist/component-registry/issues.js +2 -0
- package/dist/component-registry/issues.js.map +1 -0
- package/dist/component-registry/manifest.d.ts +164 -0
- package/dist/component-registry/manifest.js +129 -0
- package/dist/component-registry/manifest.js.map +1 -0
- package/dist/component-registry/registry.d.ts +33 -0
- package/dist/component-registry/registry.js +90 -0
- package/dist/component-registry/registry.js.map +1 -0
- package/dist/content/__fixtures__/filterable-collections.d.ts +14 -0
- package/dist/content/__fixtures__/filterable-collections.js +15 -0
- package/dist/content/__fixtures__/filterable-collections.js.map +1 -0
- package/dist/content/__fixtures__/sample-accessor-types.d.ts +56 -0
- package/dist/content/__fixtures__/sample-accessor-types.js +5 -0
- package/dist/content/__fixtures__/sample-accessor-types.js.map +1 -0
- package/dist/content/__fixtures__/sample-delivery-types.d.ts +122 -0
- package/dist/content/__fixtures__/sample-delivery-types.js +5 -0
- package/dist/content/__fixtures__/sample-delivery-types.js.map +1 -0
- package/dist/content/assets.d.ts +53 -0
- package/dist/content/assets.js +38 -0
- package/dist/content/assets.js.map +1 -0
- package/dist/content/binding-sources.d.ts +53 -0
- package/dist/content/binding-sources.js +73 -0
- package/dist/content/binding-sources.js.map +1 -0
- package/dist/content/client.d.ts +90 -0
- package/dist/content/client.js +383 -0
- package/dist/content/client.js.map +1 -0
- package/dist/content/codegen.d.ts +54 -0
- package/dist/content/codegen.js +305 -0
- package/dist/content/codegen.js.map +1 -0
- package/dist/content/context.d.ts +38 -0
- package/dist/content/context.js +21 -0
- package/dist/content/context.js.map +1 -0
- package/dist/content/cursor.d.ts +33 -0
- package/dist/content/cursor.js +104 -0
- package/dist/content/cursor.js.map +1 -0
- package/dist/content/index.d.ts +28 -0
- package/dist/content/index.js +29 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/locale.d.ts +30 -0
- package/dist/content/locale.js +26 -0
- package/dist/content/locale.js.map +1 -0
- package/dist/content/perspective.d.ts +29 -0
- package/dist/content/perspective.js +31 -0
- package/dist/content/perspective.js.map +1 -0
- package/dist/content/populate.d.ts +25 -0
- package/dist/content/populate.js +22 -0
- package/dist/content/populate.js.map +1 -0
- package/dist/content/query.d.ts +122 -0
- package/dist/content/query.js +257 -0
- package/dist/content/query.js.map +1 -0
- package/dist/content/raw.d.ts +13 -0
- package/dist/content/raw.js +14 -0
- package/dist/content/raw.js.map +1 -0
- package/dist/content/resolve.d.ts +97 -0
- package/dist/content/resolve.js +261 -0
- package/dist/content/resolve.js.map +1 -0
- package/dist/content/serialize.d.ts +30 -0
- package/dist/content/serialize.js +57 -0
- package/dist/content/serialize.js.map +1 -0
- package/dist/content/tags.d.ts +54 -0
- package/dist/content/tags.js +40 -0
- package/dist/content/tags.js.map +1 -0
- package/dist/data-binding/fixtures.d.ts +20 -0
- package/dist/data-binding/fixtures.js +47 -0
- package/dist/data-binding/fixtures.js.map +1 -0
- package/dist/data-binding/index.d.ts +14 -0
- package/dist/data-binding/index.js +15 -0
- package/dist/data-binding/index.js.map +1 -0
- package/dist/data-binding/issues.d.ts +45 -0
- package/dist/data-binding/issues.js +46 -0
- package/dist/data-binding/issues.js.map +1 -0
- package/dist/data-binding/resolve.d.ts +87 -0
- package/dist/data-binding/resolve.js +204 -0
- package/dist/data-binding/resolve.js.map +1 -0
- package/dist/data-binding/sample.d.ts +21 -0
- package/dist/data-binding/sample.js +23 -0
- package/dist/data-binding/sample.js.map +1 -0
- package/dist/data-binding/sources.d.ts +225 -0
- package/dist/data-binding/sources.js +154 -0
- package/dist/data-binding/sources.js.map +1 -0
- package/dist/data-binding/tokens.d.ts +62 -0
- package/dist/data-binding/tokens.js +150 -0
- package/dist/data-binding/tokens.js.map +1 -0
- package/dist/design-tokens/css.d.ts +34 -0
- package/dist/design-tokens/css.js +51 -0
- package/dist/design-tokens/css.js.map +1 -0
- package/dist/design-tokens/index.d.ts +10 -0
- package/dist/design-tokens/index.js +11 -0
- package/dist/design-tokens/index.js.map +1 -0
- package/dist/design-tokens/style-guide.d.ts +30 -0
- package/dist/design-tokens/style-guide.js +31 -0
- package/dist/design-tokens/style-guide.js.map +1 -0
- package/dist/design-tokens/tokens.d.ts +89 -0
- package/dist/design-tokens/tokens.js +112 -0
- package/dist/design-tokens/tokens.js.map +1 -0
- package/dist/export-sync/builder-source.d.ts +85 -0
- package/dist/export-sync/builder-source.js +124 -0
- package/dist/export-sync/builder-source.js.map +1 -0
- package/dist/export-sync/check.d.ts +61 -0
- package/dist/export-sync/check.js +126 -0
- package/dist/export-sync/check.js.map +1 -0
- package/dist/export-sync/cli.d.ts +89 -0
- package/dist/export-sync/cli.js +323 -0
- package/dist/export-sync/cli.js.map +1 -0
- package/dist/export-sync/core.d.ts +58 -0
- package/dist/export-sync/core.js +41 -0
- package/dist/export-sync/core.js.map +1 -0
- package/dist/export-sync/eject.d.ts +28 -0
- package/dist/export-sync/eject.js +21 -0
- package/dist/export-sync/eject.js.map +1 -0
- package/dist/export-sync/fixtures.d.ts +25 -0
- package/dist/export-sync/fixtures.js +87 -0
- package/dist/export-sync/fixtures.js.map +1 -0
- package/dist/export-sync/generate.d.ts +7 -0
- package/dist/export-sync/generate.js +505 -0
- package/dist/export-sync/generate.js.map +1 -0
- package/dist/export-sync/index.d.ts +37 -0
- package/dist/export-sync/index.js +39 -0
- package/dist/export-sync/index.js.map +1 -0
- package/dist/export-sync/init.d.ts +123 -0
- package/dist/export-sync/init.js +234 -0
- package/dist/export-sync/init.js.map +1 -0
- package/dist/export-sync/manifest-host.d.ts +48 -0
- package/dist/export-sync/manifest-host.js +73 -0
- package/dist/export-sync/manifest-host.js.map +1 -0
- package/dist/export-sync/node.d.ts +20 -0
- package/dist/export-sync/node.js +101 -0
- package/dist/export-sync/node.js.map +1 -0
- package/dist/export-sync/push.d.ts +76 -0
- package/dist/export-sync/push.js +197 -0
- package/dist/export-sync/push.js.map +1 -0
- package/dist/export-sync/registry-sync-client.d.ts +59 -0
- package/dist/export-sync/registry-sync-client.js +97 -0
- package/dist/export-sync/registry-sync-client.js.map +1 -0
- package/dist/export-sync/sync.d.ts +47 -0
- package/dist/export-sync/sync.js +47 -0
- package/dist/export-sync/sync.js.map +1 -0
- package/dist/export-sync/typegen.d.ts +40 -0
- package/dist/export-sync/typegen.js +45 -0
- package/dist/export-sync/typegen.js.map +1 -0
- package/dist/export-sync/validate.d.ts +19 -0
- package/dist/export-sync/validate.js +102 -0
- package/dist/export-sync/validate.js.map +1 -0
- package/dist/export-sync/watch.d.ts +66 -0
- package/dist/export-sync/watch.js +70 -0
- package/dist/export-sync/watch.js.map +1 -0
- package/dist/operations/assets.d.ts +198 -0
- package/dist/operations/assets.js +75 -0
- package/dist/operations/assets.js.map +1 -0
- package/dist/operations/authorization.d.ts +49 -0
- package/dist/operations/authorization.js +128 -0
- package/dist/operations/authorization.js.map +1 -0
- package/dist/operations/changesets.d.ts +160 -0
- package/dist/operations/changesets.js +442 -0
- package/dist/operations/changesets.js.map +1 -0
- package/dist/operations/client.d.ts +49 -0
- package/dist/operations/client.js +57 -0
- package/dist/operations/client.js.map +1 -0
- package/dist/operations/core.d.ts +238 -0
- package/dist/operations/core.js +269 -0
- package/dist/operations/core.js.map +1 -0
- package/dist/operations/documents.d.ts +432 -0
- package/dist/operations/documents.js +344 -0
- package/dist/operations/documents.js.map +1 -0
- package/dist/operations/graph.d.ts +138 -0
- package/dist/operations/graph.js +78 -0
- package/dist/operations/graph.js.map +1 -0
- package/dist/operations/index.d.ts +19 -0
- package/dist/operations/index.js +20 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/operations/members.d.ts +87 -0
- package/dist/operations/members.js +56 -0
- package/dist/operations/members.js.map +1 -0
- package/dist/operations/publishing.d.ts +89 -0
- package/dist/operations/publishing.js +57 -0
- package/dist/operations/publishing.js.map +1 -0
- package/dist/operations/references.d.ts +222 -0
- package/dist/operations/references.js +177 -0
- package/dist/operations/references.js.map +1 -0
- package/dist/operations/schema.d.ts +413 -0
- package/dist/operations/schema.js +138 -0
- package/dist/operations/schema.js.map +1 -0
- package/dist/operations/tokens.d.ts +79 -0
- package/dist/operations/tokens.js +102 -0
- package/dist/operations/tokens.js.map +1 -0
- package/dist/persistence/adapter.d.ts +79 -0
- package/dist/persistence/adapter.js +55 -0
- package/dist/persistence/adapter.js.map +1 -0
- package/dist/persistence/assets.d.ts +120 -0
- package/dist/persistence/assets.js +141 -0
- package/dist/persistence/assets.js.map +1 -0
- package/dist/persistence/backend-validation.d.ts +43 -0
- package/dist/persistence/backend-validation.js +57 -0
- package/dist/persistence/backend-validation.js.map +1 -0
- package/dist/persistence/cli-tokens.d.ts +50 -0
- package/dist/persistence/cli-tokens.js +66 -0
- package/dist/persistence/cli-tokens.js.map +1 -0
- package/dist/persistence/cms.d.ts +148 -0
- package/dist/persistence/cms.js +232 -0
- package/dist/persistence/cms.js.map +1 -0
- package/dist/persistence/contract-scenarios.d.ts +73 -0
- package/dist/persistence/contract-scenarios.js +496 -0
- package/dist/persistence/contract-scenarios.js.map +1 -0
- package/dist/persistence/core.d.ts +96 -0
- package/dist/persistence/core.js +110 -0
- package/dist/persistence/core.js.map +1 -0
- package/dist/persistence/graph.d.ts +61 -0
- package/dist/persistence/graph.js +98 -0
- package/dist/persistence/graph.js.map +1 -0
- package/dist/persistence/index.d.ts +22 -0
- package/dist/persistence/index.js +23 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/members.d.ts +70 -0
- package/dist/persistence/members.js +0 -0
- package/dist/persistence/members.js.map +1 -0
- package/dist/persistence/publishing.d.ts +59 -0
- package/dist/persistence/publishing.js +95 -0
- package/dist/persistence/publishing.js.map +1 -0
- package/dist/persistence/reference-extraction.d.ts +44 -0
- package/dist/persistence/reference-extraction.js +204 -0
- package/dist/persistence/reference-extraction.js.map +1 -0
- package/dist/persistence/reference-indexing.d.ts +68 -0
- package/dist/persistence/reference-indexing.js +112 -0
- package/dist/persistence/reference-indexing.js.map +1 -0
- package/dist/persistence/references.d.ts +257 -0
- package/dist/persistence/references.js +0 -0
- package/dist/persistence/references.js.map +1 -0
- package/dist/persistence/seed.d.ts +55 -0
- package/dist/persistence/seed.js +102 -0
- package/dist/persistence/seed.js.map +1 -0
- package/dist/persistence/self-maintaining-adapter.d.ts +41 -0
- package/dist/persistence/self-maintaining-adapter.js +79 -0
- package/dist/persistence/self-maintaining-adapter.js.map +1 -0
- package/dist/plugins/asset-storage.d.ts +76 -0
- package/dist/plugins/asset-storage.js +104 -0
- package/dist/plugins/asset-storage.js.map +1 -0
- package/dist/plugins/component-package.d.ts +54 -0
- package/dist/plugins/component-package.js +92 -0
- package/dist/plugins/component-package.js.map +1 -0
- package/dist/plugins/data-sources.d.ts +78 -0
- package/dist/plugins/data-sources.js +99 -0
- package/dist/plugins/data-sources.js.map +1 -0
- package/dist/plugins/examples.d.ts +47 -0
- package/dist/plugins/examples.js +205 -0
- package/dist/plugins/examples.js.map +1 -0
- package/dist/plugins/export-targets.d.ts +47 -0
- package/dist/plugins/export-targets.js +78 -0
- package/dist/plugins/export-targets.js.map +1 -0
- package/dist/plugins/field-types.d.ts +86 -0
- package/dist/plugins/field-types.js +93 -0
- package/dist/plugins/field-types.js.map +1 -0
- package/dist/plugins/hooks.d.ts +60 -0
- package/dist/plugins/hooks.js +94 -0
- package/dist/plugins/hooks.js.map +1 -0
- package/dist/plugins/index.d.ts +27 -0
- package/dist/plugins/index.js +28 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/marketplace.d.ts +90 -0
- package/dist/plugins/marketplace.js +110 -0
- package/dist/plugins/marketplace.js.map +1 -0
- package/dist/plugins/plugin.d.ts +107 -0
- package/dist/plugins/plugin.js +122 -0
- package/dist/plugins/plugin.js.map +1 -0
- package/dist/plugins/templates.d.ts +66 -0
- package/dist/plugins/templates.js +74 -0
- package/dist/plugins/templates.js.map +1 -0
- package/dist/project-graph/binding.d.ts +68 -0
- package/dist/project-graph/binding.js +39 -0
- package/dist/project-graph/binding.js.map +1 -0
- package/dist/project-graph/container.d.ts +126 -0
- package/dist/project-graph/container.js +221 -0
- package/dist/project-graph/container.js.map +1 -0
- package/dist/project-graph/edit.d.ts +66 -0
- package/dist/project-graph/edit.js +201 -0
- package/dist/project-graph/edit.js.map +1 -0
- package/dist/project-graph/fixtures.d.ts +51 -0
- package/dist/project-graph/fixtures.js +224 -0
- package/dist/project-graph/fixtures.js.map +1 -0
- package/dist/project-graph/ids.d.ts +17 -0
- package/dist/project-graph/ids.js +19 -0
- package/dist/project-graph/ids.js.map +1 -0
- package/dist/project-graph/index.d.ts +12 -0
- package/dist/project-graph/index.js +13 -0
- package/dist/project-graph/index.js.map +1 -0
- package/dist/project-graph/issues.d.ts +61 -0
- package/dist/project-graph/issues.js +44 -0
- package/dist/project-graph/issues.js.map +1 -0
- package/dist/project-graph/json.d.ts +6 -0
- package/dist/project-graph/json.js +10 -0
- package/dist/project-graph/json.js.map +1 -0
- package/dist/project-graph/node.d.ts +48 -0
- package/dist/project-graph/node.js +42 -0
- package/dist/project-graph/node.js.map +1 -0
- package/dist/project-graph/normalize.d.ts +17 -0
- package/dist/project-graph/normalize.js +110 -0
- package/dist/project-graph/normalize.js.map +1 -0
- package/dist/project-graph/serialize.d.ts +36 -0
- package/dist/project-graph/serialize.js +51 -0
- package/dist/project-graph/serialize.js.map +1 -0
- package/dist/project-graph/structure.d.ts +40 -0
- package/dist/project-graph/structure.js +36 -0
- package/dist/project-graph/structure.js.map +1 -0
- package/dist/project-graph/validate.d.ts +84 -0
- package/dist/project-graph/validate.js +158 -0
- package/dist/project-graph/validate.js.map +1 -0
- package/dist/rich-text/adapter.d.ts +43 -0
- package/dist/rich-text/adapter.js +24 -0
- package/dist/rich-text/adapter.js.map +1 -0
- package/dist/rich-text/dom-editor.d.ts +101 -0
- package/dist/rich-text/dom-editor.js +482 -0
- package/dist/rich-text/dom-editor.js.map +1 -0
- package/dist/rich-text/embed.d.ts +70 -0
- package/dist/rich-text/embed.js +70 -0
- package/dist/rich-text/embed.js.map +1 -0
- package/dist/rich-text/fixtures.d.ts +25 -0
- package/dist/rich-text/fixtures.js +115 -0
- package/dist/rich-text/fixtures.js.map +1 -0
- package/dist/rich-text/html.d.ts +5 -0
- package/dist/rich-text/html.js +309 -0
- package/dist/rich-text/html.js.map +1 -0
- package/dist/rich-text/index.d.ts +19 -0
- package/dist/rich-text/index.js +20 -0
- package/dist/rich-text/index.js.map +1 -0
- package/dist/rich-text/markdown.d.ts +7 -0
- package/dist/rich-text/markdown.js +235 -0
- package/dist/rich-text/markdown.js.map +1 -0
- package/dist/rich-text/portable-text.d.ts +50 -0
- package/dist/rich-text/portable-text.js +223 -0
- package/dist/rich-text/portable-text.js.map +1 -0
- package/dist/rich-text/registry.d.ts +48 -0
- package/dist/rich-text/registry.js +16 -0
- package/dist/rich-text/registry.js.map +1 -0
- package/dist/rich-text/render.d.ts +69 -0
- package/dist/rich-text/render.js +205 -0
- package/dist/rich-text/render.js.map +1 -0
- package/dist/rich-text/schema.d.ts +86 -0
- package/dist/rich-text/schema.js +80 -0
- package/dist/rich-text/schema.js.map +1 -0
- package/dist/rich-text/test-support.d.ts +7 -0
- package/dist/rich-text/test-support.js +8 -0
- package/dist/rich-text/test-support.js.map +1 -0
- package/dist/runtime-renderer/client.d.ts +14 -0
- package/dist/runtime-renderer/client.js +15 -0
- package/dist/runtime-renderer/client.js.map +1 -0
- package/dist/runtime-renderer/condition.d.ts +8 -0
- package/dist/runtime-renderer/condition.js +48 -0
- package/dist/runtime-renderer/condition.js.map +1 -0
- package/dist/runtime-renderer/content-client.d.ts +62 -0
- package/dist/runtime-renderer/content-client.js +37 -0
- package/dist/runtime-renderer/content-client.js.map +1 -0
- package/dist/runtime-renderer/context.d.ts +185 -0
- package/dist/runtime-renderer/context.js +7 -0
- package/dist/runtime-renderer/context.js.map +1 -0
- package/dist/runtime-renderer/fallback.d.ts +39 -0
- package/dist/runtime-renderer/fallback.js +45 -0
- package/dist/runtime-renderer/fallback.js.map +1 -0
- package/dist/runtime-renderer/index.d.ts +13 -0
- package/dist/runtime-renderer/index.js +13 -0
- package/dist/runtime-renderer/index.js.map +1 -0
- package/dist/runtime-renderer/primitives.d.ts +85 -0
- package/dist/runtime-renderer/primitives.js +442 -0
- package/dist/runtime-renderer/primitives.js.map +1 -0
- package/dist/runtime-renderer/render.d.ts +138 -0
- package/dist/runtime-renderer/render.js +825 -0
- package/dist/runtime-renderer/render.js.map +1 -0
- package/dist/runtime-renderer/rich-text.d.ts +26 -0
- package/dist/runtime-renderer/rich-text.js +113 -0
- package/dist/runtime-renderer/rich-text.js.map +1 -0
- package/dist/starter-kits/index.d.ts +13 -0
- package/dist/starter-kits/index.js +14 -0
- package/dist/starter-kits/index.js.map +1 -0
- package/dist/starter-kits/instantiate.d.ts +29 -0
- package/dist/starter-kits/instantiate.js +24 -0
- package/dist/starter-kits/instantiate.js.map +1 -0
- package/dist/starter-kits/kit.d.ts +61 -0
- package/dist/starter-kits/kit.js +37 -0
- package/dist/starter-kits/kit.js.map +1 -0
- package/dist/starter-kits/kits.d.ts +7 -0
- package/dist/starter-kits/kits.js +201 -0
- package/dist/starter-kits/kits.js.map +1 -0
- package/dist/starter-kits/manifests.d.ts +7 -0
- package/dist/starter-kits/manifests.js +111 -0
- package/dist/starter-kits/manifests.js.map +1 -0
- package/dist/starter-kits/upgrade.d.ts +39 -0
- package/dist/starter-kits/upgrade.js +54 -0
- package/dist/starter-kits/upgrade.js.map +1 -0
- package/dist/starter-kits/validate.d.ts +16 -0
- package/dist/starter-kits/validate.js +77 -0
- package/dist/starter-kits/validate.js.map +1 -0
- package/dist/studio-core/context.d.ts +27 -0
- package/dist/studio-core/context.js +44 -0
- package/dist/studio-core/context.js.map +1 -0
- package/dist/studio-core/errors.d.ts +58 -0
- package/dist/studio-core/errors.js +74 -0
- package/dist/studio-core/errors.js.map +1 -0
- package/dist/studio-core/fixtures.d.ts +18 -0
- package/dist/studio-core/fixtures.js +83 -0
- package/dist/studio-core/fixtures.js.map +1 -0
- package/dist/studio-core/ids.d.ts +22 -0
- package/dist/studio-core/ids.js +33 -0
- package/dist/studio-core/ids.js.map +1 -0
- package/dist/studio-core/index.d.ts +11 -0
- package/dist/studio-core/index.js +12 -0
- package/dist/studio-core/index.js.map +1 -0
- package/dist/studio-core/issues.d.ts +50 -0
- package/dist/studio-core/issues.js +33 -0
- package/dist/studio-core/issues.js.map +1 -0
- package/dist/studio-core/metadata.d.ts +109 -0
- package/dist/studio-core/metadata.js +74 -0
- package/dist/studio-core/metadata.js.map +1 -0
- package/dist/studio-core/repository.d.ts +73 -0
- package/dist/studio-core/repository.js +202 -0
- package/dist/studio-core/repository.js.map +1 -0
- package/dist/studio-core/sections.d.ts +73 -0
- package/dist/studio-core/sections.js +68 -0
- package/dist/studio-core/sections.js.map +1 -0
- package/dist/studio-core/validate.d.ts +15 -0
- package/dist/studio-core/validate.js +119 -0
- package/dist/studio-core/validate.js.map +1 -0
- package/dist/studio-core/workspace-config.d.ts +587 -0
- package/dist/studio-core/workspace-config.js +434 -0
- package/dist/studio-core/workspace-config.js.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { splitPath } from './routes';
|
|
2
|
+
const DEFAULT_PARENT_FIELD = 'parent';
|
|
3
|
+
const DEFAULT_SLUG_FIELD = 'slug';
|
|
4
|
+
/** Resolve a {@link HierarchyConfig} to its concrete field names. */
|
|
5
|
+
export function hierarchyFields(config = {}) {
|
|
6
|
+
return {
|
|
7
|
+
parentField: config.parentField ?? DEFAULT_PARENT_FIELD,
|
|
8
|
+
slugField: config.slugField ?? DEFAULT_SLUG_FIELD,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The self-relation field that names a document's parent, if this collection
|
|
13
|
+
* declares one: a single-valued `relation` field, named per the config, whose
|
|
14
|
+
* target is the collection itself.
|
|
15
|
+
*/
|
|
16
|
+
export function parentRelationField(collection, config = {}) {
|
|
17
|
+
const { parentField } = hierarchyFields(config);
|
|
18
|
+
const field = collection.fields.find((f) => f.name === parentField);
|
|
19
|
+
if (field &&
|
|
20
|
+
field.type === 'relation' &&
|
|
21
|
+
field.target === collection.id &&
|
|
22
|
+
field.cardinality === 'one') {
|
|
23
|
+
return field;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
/** Does this collection model a parent/child hierarchy (a `parent` self-relation)? */
|
|
28
|
+
export function isHierarchical(collection, config = {}) {
|
|
29
|
+
return parentRelationField(collection, config) !== undefined;
|
|
30
|
+
}
|
|
31
|
+
/** The parent document id from a `one` self-relation value (a `DocumentRef` or bare id). */
|
|
32
|
+
function readParentId(doc, parentField) {
|
|
33
|
+
const value = doc.values[parentField];
|
|
34
|
+
if (value == null)
|
|
35
|
+
return undefined;
|
|
36
|
+
if (typeof value === 'string')
|
|
37
|
+
return value.length > 0 ? value : undefined;
|
|
38
|
+
if (typeof value === 'object' && 'id' in value) {
|
|
39
|
+
const id = value.id;
|
|
40
|
+
return typeof id === 'string' && id.length > 0 ? id : undefined;
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
/** The local slug segment of a document, or undefined when unset/empty. */
|
|
45
|
+
function readSlug(doc, slugField) {
|
|
46
|
+
const value = doc.values[slugField];
|
|
47
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compose a document's full path segments by walking its parent chain from the
|
|
51
|
+
* leaf up, then ordering root → leaf. Cycle-safe: revisiting a document stops
|
|
52
|
+
* the walk and flags `cycle`. `getById` looks documents up *within the same
|
|
53
|
+
* collection* (a self-relation never crosses collections).
|
|
54
|
+
*/
|
|
55
|
+
export function composePath(doc, getById, config = {}) {
|
|
56
|
+
const { parentField, slugField } = hierarchyFields(config);
|
|
57
|
+
const segments = [];
|
|
58
|
+
const seen = new Set([doc.id]);
|
|
59
|
+
let cycle = false;
|
|
60
|
+
let missingSlug = false;
|
|
61
|
+
let danglingParent = false;
|
|
62
|
+
let current = doc;
|
|
63
|
+
while (current) {
|
|
64
|
+
const slug = readSlug(current, slugField);
|
|
65
|
+
if (slug === undefined)
|
|
66
|
+
missingSlug = true;
|
|
67
|
+
else
|
|
68
|
+
segments.unshift(slug);
|
|
69
|
+
const parentId = readParentId(current, parentField);
|
|
70
|
+
if (parentId === undefined)
|
|
71
|
+
break;
|
|
72
|
+
const parent = getById(parentId);
|
|
73
|
+
if (!parent) {
|
|
74
|
+
danglingParent = true;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
if (seen.has(parent.id)) {
|
|
78
|
+
cycle = true;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
seen.add(parent.id);
|
|
82
|
+
current = parent;
|
|
83
|
+
}
|
|
84
|
+
return { segments, ok: !cycle && !missingSlug && !danglingParent, cycle, missingSlug, danglingParent };
|
|
85
|
+
}
|
|
86
|
+
/** Does a document's parent chain loop? (cycle-safe; uses {@link composePath}). */
|
|
87
|
+
export function hasParentCycle(doc, getById, config = {}) {
|
|
88
|
+
return composePath(doc, getById, config).cycle;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Order documents as a depth-first hierarchy (parents immediately before their
|
|
92
|
+
* children, siblings in input order), annotating each with its depth. Roots are
|
|
93
|
+
* documents with no parent, or whose parent is absent (orphans surface at the
|
|
94
|
+
* root). Cycle-safe: documents trapped in a parent cycle are never lost — they
|
|
95
|
+
* are appended at depth 0 rather than recursed into. The read-side of the
|
|
96
|
+
* hierarchical list view (EC-218).
|
|
97
|
+
*/
|
|
98
|
+
export function orderHierarchically(docs, config = {}) {
|
|
99
|
+
const { parentField } = hierarchyFields(config);
|
|
100
|
+
const byId = new Map(docs.map((d) => [d.id, d]));
|
|
101
|
+
// Bucket each document under its effective parent key (null = a root).
|
|
102
|
+
const children = new Map();
|
|
103
|
+
for (const doc of docs) {
|
|
104
|
+
const parentId = readParentId(doc, parentField);
|
|
105
|
+
const key = parentId != null && parentId !== doc.id && byId.has(parentId) ? parentId : null;
|
|
106
|
+
const bucket = children.get(key);
|
|
107
|
+
if (bucket)
|
|
108
|
+
bucket.push(doc);
|
|
109
|
+
else
|
|
110
|
+
children.set(key, [doc]);
|
|
111
|
+
}
|
|
112
|
+
const rows = [];
|
|
113
|
+
const visited = new Set();
|
|
114
|
+
const walk = (parentKey, depth) => {
|
|
115
|
+
for (const doc of children.get(parentKey) ?? []) {
|
|
116
|
+
if (visited.has(doc.id))
|
|
117
|
+
continue;
|
|
118
|
+
visited.add(doc.id);
|
|
119
|
+
rows.push({ doc, depth, hasChildren: (children.get(doc.id)?.length ?? 0) > 0 });
|
|
120
|
+
walk(doc.id, depth + 1);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
walk(null, 0);
|
|
124
|
+
// Any document not reached from a root is trapped in a cycle — surface it at
|
|
125
|
+
// the root so the list never silently drops a document. It may still have
|
|
126
|
+
// (cycle-trapped) children, so report hasChildren the same way the main walk does.
|
|
127
|
+
for (const doc of docs) {
|
|
128
|
+
if (!visited.has(doc.id)) {
|
|
129
|
+
visited.add(doc.id);
|
|
130
|
+
rows.push({ doc, depth: 0, hasChildren: (children.get(doc.id)?.length ?? 0) > 0 });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return rows;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The ids of every descendant of `rootId` (children, grandchildren, …). Used to
|
|
137
|
+
* keep a `parent` picker from offering a document its own subtree — which would
|
|
138
|
+
* create a cycle. Excludes `rootId` itself; cycle-safe.
|
|
139
|
+
*/
|
|
140
|
+
export function descendantIds(rootId, docs, config = {}) {
|
|
141
|
+
const { parentField } = hierarchyFields(config);
|
|
142
|
+
const children = new Map();
|
|
143
|
+
for (const doc of docs) {
|
|
144
|
+
const parentId = readParentId(doc, parentField);
|
|
145
|
+
if (parentId == null)
|
|
146
|
+
continue;
|
|
147
|
+
const bucket = children.get(parentId);
|
|
148
|
+
if (bucket)
|
|
149
|
+
bucket.push(doc);
|
|
150
|
+
else
|
|
151
|
+
children.set(parentId, [doc]);
|
|
152
|
+
}
|
|
153
|
+
const out = new Set();
|
|
154
|
+
const stack = [rootId];
|
|
155
|
+
while (stack.length > 0) {
|
|
156
|
+
const id = stack.pop();
|
|
157
|
+
for (const child of children.get(id) ?? []) {
|
|
158
|
+
if (child.id !== rootId && !out.has(child.id)) {
|
|
159
|
+
out.add(child.id);
|
|
160
|
+
stack.push(child.id);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Is this route a hierarchy mount? — its pattern ends with a catch-all param
|
|
168
|
+
* segment (`:name*`), declaring "this collection's documents are served by their
|
|
169
|
+
* composed nested paths under this prefix" (EC-218). The host pulls these out of
|
|
170
|
+
* the router and resolves them per-request with {@link resolveByPath}, so the
|
|
171
|
+
* URL→document mapping stays perspective-aware (draft vs published) and the path
|
|
172
|
+
* stays derived, never stored.
|
|
173
|
+
*/
|
|
174
|
+
export function isHierarchyTemplate(route) {
|
|
175
|
+
if (!route.document)
|
|
176
|
+
return false;
|
|
177
|
+
const segments = splitPath(route.pattern);
|
|
178
|
+
const last = segments[segments.length - 1];
|
|
179
|
+
return last !== undefined && last.startsWith(':') && last.endsWith('*');
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Parse a hierarchy mount from a catch-all template route (EC-218), or undefined
|
|
183
|
+
* when the route is not a valid mount (not a catch-all, or its prefix contains a
|
|
184
|
+
* dynamic segment, which a composed-path mount does not support).
|
|
185
|
+
*/
|
|
186
|
+
export function hierarchyMount(route) {
|
|
187
|
+
if (!isHierarchyTemplate(route) || !route.document)
|
|
188
|
+
return undefined;
|
|
189
|
+
const prefix = splitPath(route.pattern).slice(0, -1);
|
|
190
|
+
if (prefix.some((segment) => segment.startsWith(':')))
|
|
191
|
+
return undefined;
|
|
192
|
+
return {
|
|
193
|
+
collection: route.document.collection,
|
|
194
|
+
prefix,
|
|
195
|
+
...(route.locale ? { locale: route.locale } : {}),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Resolve a path (its slug segments, prefix already stripped) to the one document
|
|
200
|
+
* whose composed nested path matches (EC-218). The caller supplies the documents
|
|
201
|
+
* already selected for the active perspective (draft/published), so resolution is
|
|
202
|
+
* perspective-aware. Documents with a broken or cyclic chain never match.
|
|
203
|
+
* Deterministic on the rare duplicate composed path: the lowest id wins (the same
|
|
204
|
+
* tie-break the single-slug fallback uses).
|
|
205
|
+
*/
|
|
206
|
+
export function resolveByPath(segments, docs, config = {}) {
|
|
207
|
+
if (segments.length === 0)
|
|
208
|
+
return undefined;
|
|
209
|
+
const byId = new Map(docs.map((d) => [d.id, d]));
|
|
210
|
+
const getById = (id) => byId.get(id);
|
|
211
|
+
const target = segments.join('/');
|
|
212
|
+
let match;
|
|
213
|
+
for (const doc of docs) {
|
|
214
|
+
const composed = composePath(doc, getById, config);
|
|
215
|
+
if (!composed.ok)
|
|
216
|
+
continue;
|
|
217
|
+
if (composed.segments.join('/') === target && (!match || doc.id < match.id)) {
|
|
218
|
+
match = doc;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return match;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=hierarchy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/cms-core/hierarchy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @elytracms/cms-core — provider-neutral, schema-driven CMS primitives (brief §7.4).
|
|
3
|
+
*
|
|
4
|
+
* Collections & fields, relations & assets, localization, route/redirect
|
|
5
|
+
* resolution, conflict & loop detection, and draft/published + version history.
|
|
6
|
+
* Reuses canonical types from `@elytracms/core/project-graph` and mirrors its
|
|
7
|
+
* structured-issue conventions (brief §4.11): invalid states are explicit
|
|
8
|
+
* `CmsValidationIssue`s, never silent failures or crashes.
|
|
9
|
+
*/
|
|
10
|
+
export declare const PACKAGE = "@elytracms/core/cms-core";
|
|
11
|
+
export * from './issues';
|
|
12
|
+
export * from './fields';
|
|
13
|
+
export * from './collections';
|
|
14
|
+
export * from './documents';
|
|
15
|
+
export * from './envelopes';
|
|
16
|
+
export * from './self-type';
|
|
17
|
+
export * from './localization';
|
|
18
|
+
export * from './validate-document';
|
|
19
|
+
export * from './infer';
|
|
20
|
+
export * from './json-schema';
|
|
21
|
+
export * from './routes';
|
|
22
|
+
export * from './hierarchy';
|
|
23
|
+
export * from './url-for-document';
|
|
24
|
+
export * from './versions';
|
|
25
|
+
export * from './fixtures';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @elytracms/cms-core — provider-neutral, schema-driven CMS primitives (brief §7.4).
|
|
3
|
+
*
|
|
4
|
+
* Collections & fields, relations & assets, localization, route/redirect
|
|
5
|
+
* resolution, conflict & loop detection, and draft/published + version history.
|
|
6
|
+
* Reuses canonical types from `@elytracms/core/project-graph` and mirrors its
|
|
7
|
+
* structured-issue conventions (brief §4.11): invalid states are explicit
|
|
8
|
+
* `CmsValidationIssue`s, never silent failures or crashes.
|
|
9
|
+
*/
|
|
10
|
+
export const PACKAGE = '@elytracms/core/cms-core';
|
|
11
|
+
export * from './issues';
|
|
12
|
+
export * from './fields';
|
|
13
|
+
export * from './collections';
|
|
14
|
+
export * from './documents';
|
|
15
|
+
export * from './envelopes';
|
|
16
|
+
export * from './self-type';
|
|
17
|
+
export * from './localization';
|
|
18
|
+
export * from './validate-document';
|
|
19
|
+
export * from './infer';
|
|
20
|
+
export * from './json-schema';
|
|
21
|
+
export * from './routes';
|
|
22
|
+
export * from './hierarchy';
|
|
23
|
+
export * from './url-for-document';
|
|
24
|
+
export * from './versions';
|
|
25
|
+
export * from './fixtures';
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cms-core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,0BAA0B,CAAA;AAEjD,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { CollectionDef } from './collections';
|
|
2
|
+
import type { DocumentRef } from './documents';
|
|
3
|
+
import type { FieldDef } from './fields';
|
|
4
|
+
/**
|
|
5
|
+
* Map a single field definition to its inferred runtime TS type. Relations
|
|
6
|
+
* resolve to `DocumentRef`(s), assets to asset-id string(s), select to its
|
|
7
|
+
* option-value union, etc. (EC-016: "inferred TS types").
|
|
8
|
+
*
|
|
9
|
+
* This is a *type-level* mapping consumed via `InferDocument<C>`. Cardinality
|
|
10
|
+
* (`one` vs `many`) widens to an array.
|
|
11
|
+
*/
|
|
12
|
+
export type InferFieldValue<F extends FieldDef> = F extends {
|
|
13
|
+
type: 'text';
|
|
14
|
+
} ? string : F extends {
|
|
15
|
+
type: 'richText';
|
|
16
|
+
} ? string : F extends {
|
|
17
|
+
type: 'number';
|
|
18
|
+
} ? number : F extends {
|
|
19
|
+
type: 'boolean';
|
|
20
|
+
} ? boolean : F extends {
|
|
21
|
+
type: 'date';
|
|
22
|
+
} ? string | number : F extends {
|
|
23
|
+
type: 'select';
|
|
24
|
+
options: infer O;
|
|
25
|
+
multiple: infer M;
|
|
26
|
+
} ? O extends ReadonlyArray<{
|
|
27
|
+
value: infer V;
|
|
28
|
+
}> ? M extends true ? V[] : V : string : F extends {
|
|
29
|
+
type: 'relation';
|
|
30
|
+
cardinality: infer C;
|
|
31
|
+
} ? C extends 'many' ? DocumentRef[] : DocumentRef : F extends {
|
|
32
|
+
type: 'asset';
|
|
33
|
+
cardinality: infer AC;
|
|
34
|
+
} ? AC extends 'many' ? string[] : string : F extends {
|
|
35
|
+
type: 'object';
|
|
36
|
+
cardinality: infer OC;
|
|
37
|
+
} ? OC extends 'many' ? Record<string, unknown>[] : Record<string, unknown> : unknown;
|
|
38
|
+
/** The union of all field definitions in a collection literal. */
|
|
39
|
+
type FieldUnion<C extends {
|
|
40
|
+
fields: readonly FieldDef[];
|
|
41
|
+
}> = C['fields'][number];
|
|
42
|
+
/** Names of all fields. */
|
|
43
|
+
type FieldNames<C extends {
|
|
44
|
+
fields: readonly FieldDef[];
|
|
45
|
+
}> = FieldUnion<C> extends {
|
|
46
|
+
name: infer N extends string;
|
|
47
|
+
} ? N : never;
|
|
48
|
+
/** Names of required fields (validation.required === true). */
|
|
49
|
+
type RequiredFieldNames<C extends {
|
|
50
|
+
fields: readonly FieldDef[];
|
|
51
|
+
}> = Extract<FieldUnion<C>, {
|
|
52
|
+
validation: {
|
|
53
|
+
required: true;
|
|
54
|
+
};
|
|
55
|
+
}> extends {
|
|
56
|
+
name: infer N extends string;
|
|
57
|
+
} ? N : never;
|
|
58
|
+
/** Names of optional fields (everything that isn't required). */
|
|
59
|
+
type OptionalFieldNames<C extends {
|
|
60
|
+
fields: readonly FieldDef[];
|
|
61
|
+
}> = Exclude<FieldNames<C>, RequiredFieldNames<C>>;
|
|
62
|
+
/** The inferred value type of the field named `N` in collection `C`. */
|
|
63
|
+
type ValueOfField<C extends {
|
|
64
|
+
fields: readonly FieldDef[];
|
|
65
|
+
}, N extends string> = InferFieldValue<Extract<FieldUnion<C>, {
|
|
66
|
+
name: N;
|
|
67
|
+
}>>;
|
|
68
|
+
/**
|
|
69
|
+
* Infer the TS shape of a document for a collection literal (EC-016). Use with
|
|
70
|
+
* `as const` collection definitions to get a precise type:
|
|
71
|
+
*
|
|
72
|
+
* ```ts
|
|
73
|
+
* const post = { id: 'post', kind: 'document', fields: [...] } as const
|
|
74
|
+
* type Post = InferDocument<typeof post>
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* Required fields are required; the rest are optional. The value of each field
|
|
78
|
+
* is correlated to that field by name (not positionally), so per-field types are
|
|
79
|
+
* preserved precisely.
|
|
80
|
+
*/
|
|
81
|
+
export type InferDocument<C extends {
|
|
82
|
+
fields: readonly FieldDef[];
|
|
83
|
+
}> = {
|
|
84
|
+
[N in RequiredFieldNames<C>]: ValueOfField<C, N>;
|
|
85
|
+
} & {
|
|
86
|
+
[N in OptionalFieldNames<C>]?: ValueOfField<C, N>;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* A runtime descriptor of a field's inferred type — useful for codegen and
|
|
90
|
+
* tooling that can't consume the type-level `InferDocument` (EC-016).
|
|
91
|
+
*/
|
|
92
|
+
export interface InferredFieldType {
|
|
93
|
+
name: string;
|
|
94
|
+
/** TS type expression, e.g. `string`, `DocumentRef[]`, `'a' | 'b'`. */
|
|
95
|
+
tsType: string;
|
|
96
|
+
optional: boolean;
|
|
97
|
+
localized: boolean;
|
|
98
|
+
}
|
|
99
|
+
/** Produce a runtime descriptor of a field's inferred TS type. */
|
|
100
|
+
export declare function inferredFieldType(field: FieldDef): InferredFieldType;
|
|
101
|
+
/** Runtime descriptors for every field in a collection (EC-016). */
|
|
102
|
+
export declare function inferCollectionTypes(collection: CollectionDef): InferredFieldType[];
|
|
103
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
function selectUnion(field) {
|
|
2
|
+
const union = field.options.map((o) => JSON.stringify(o.value)).join(' | ');
|
|
3
|
+
return field.multiple ? `(${union})[]` : union;
|
|
4
|
+
}
|
|
5
|
+
/** Produce a runtime descriptor of a field's inferred TS type. */
|
|
6
|
+
export function inferredFieldType(field) {
|
|
7
|
+
const optional = field.validation?.required !== true;
|
|
8
|
+
const localized = field.localized === true;
|
|
9
|
+
const base = () => {
|
|
10
|
+
switch (field.type) {
|
|
11
|
+
case 'text':
|
|
12
|
+
case 'richText':
|
|
13
|
+
return 'string';
|
|
14
|
+
case 'number':
|
|
15
|
+
return 'number';
|
|
16
|
+
case 'boolean':
|
|
17
|
+
return 'boolean';
|
|
18
|
+
case 'date':
|
|
19
|
+
return 'string | number';
|
|
20
|
+
case 'select':
|
|
21
|
+
return selectUnion(field);
|
|
22
|
+
case 'relation':
|
|
23
|
+
return field.cardinality === 'many' ? 'DocumentRef[]' : 'DocumentRef';
|
|
24
|
+
case 'asset':
|
|
25
|
+
return field.cardinality === 'many' ? 'string[]' : 'string';
|
|
26
|
+
case 'blocks':
|
|
27
|
+
// Composition value (EC-186): an opaque tree to delivery consumers — the
|
|
28
|
+
// host renders it through the canvas engine. EC-187/188 refine this to
|
|
29
|
+
// the composition value type once compositions live in documents.
|
|
30
|
+
return field.cardinality === 'many' ? 'unknown[]' : 'unknown';
|
|
31
|
+
case 'object': {
|
|
32
|
+
// EC-253: a precise nested object type expression (the repeater's item
|
|
33
|
+
// shape), `Array<...>` for `many`. Recurses for nested objects.
|
|
34
|
+
const shape = field.fields
|
|
35
|
+
.map((sub) => {
|
|
36
|
+
const st = inferredFieldType(sub);
|
|
37
|
+
return `${sub.name}${st.optional ? '?' : ''}: ${st.tsType}`;
|
|
38
|
+
})
|
|
39
|
+
.join('; ');
|
|
40
|
+
const objectType = field.fields.length > 0 ? `{ ${shape} }` : 'Record<string, unknown>';
|
|
41
|
+
return field.cardinality === 'many' ? `Array<${objectType}>` : objectType;
|
|
42
|
+
}
|
|
43
|
+
default: {
|
|
44
|
+
// Exhaustiveness: a new field type must add a case above (EC-253).
|
|
45
|
+
const _exhaustive = field;
|
|
46
|
+
void _exhaustive;
|
|
47
|
+
return 'unknown';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
return { name: field.name, tsType: base(), optional, localized };
|
|
52
|
+
}
|
|
53
|
+
/** Runtime descriptors for every field in a collection (EC-016). */
|
|
54
|
+
export function inferCollectionTypes(collection) {
|
|
55
|
+
return collection.fields.map(inferredFieldType);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=infer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infer.js","sourceRoot":"","sources":["../../src/cms-core/infer.ts"],"names":[],"mappings":"AA0GA,SAAS,WAAW,CAAC,KAA4C;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC3E,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;AAChD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,KAAe;IAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,QAAQ,KAAK,IAAI,CAAA;IACpD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,IAAI,CAAA;IAC1C,MAAM,IAAI,GAAG,GAAW,EAAE;QACxB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC;YACZ,KAAK,UAAU;gBACb,OAAO,QAAQ,CAAA;YACjB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAA;YACjB,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAA;YAClB,KAAK,MAAM;gBACT,OAAO,iBAAiB,CAAA;YAC1B,KAAK,QAAQ;gBACX,OAAO,WAAW,CAAC,KAAK,CAAC,CAAA;YAC3B,KAAK,UAAU;gBACb,OAAO,KAAK,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAA;YACvE,KAAK,OAAO;gBACV,OAAO,KAAK,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAA;YAC7D,KAAK,QAAQ;gBACX,yEAAyE;gBACzE,uEAAuE;gBACvE,kEAAkE;gBAClE,OAAO,KAAK,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;YAC/D,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,uEAAuE;gBACvE,gEAAgE;gBAChE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM;qBACvB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACX,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;oBACjC,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,CAAA;gBAC7D,CAAC,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC,CAAA;gBACb,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAA;gBACvF,OAAO,KAAK,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,CAAA;YAC3E,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,mEAAmE;gBACnE,MAAM,WAAW,GAAU,KAAK,CAAA;gBAChC,KAAK,WAAW,CAAA;gBAChB,OAAO,SAAS,CAAA;YAClB,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;AAClE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,oBAAoB,CAAC,UAAyB;IAC5D,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;AACjD,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Stable codes for structured CMS validation issues (brief §4.11, §7.4).
|
|
4
|
+
*
|
|
5
|
+
* We mirror the conventions of `@elytracms/core/project-graph`'s `ValidationIssue`
|
|
6
|
+
* (a structured object with `code`/`severity`/`message`/`path`, never a thrown
|
|
7
|
+
* error) so callers can treat graph and CMS issues uniformly. The code set here
|
|
8
|
+
* is CMS-specific; the shape is shared.
|
|
9
|
+
*/
|
|
10
|
+
export declare const cmsIssueCodeSchema: z.ZodEnum<{
|
|
11
|
+
"route-conflict": "route-conflict";
|
|
12
|
+
"duplicate-collection": "duplicate-collection";
|
|
13
|
+
"duplicate-field": "duplicate-field";
|
|
14
|
+
"unknown-collection": "unknown-collection";
|
|
15
|
+
"invalid-collection-config": "invalid-collection-config";
|
|
16
|
+
"invalid-field-config": "invalid-field-config";
|
|
17
|
+
"reserved-field-name": "reserved-field-name";
|
|
18
|
+
"missing-required-field": "missing-required-field";
|
|
19
|
+
"invalid-field-value": "invalid-field-value";
|
|
20
|
+
"unknown-relation-target": "unknown-relation-target";
|
|
21
|
+
"unpublished-relation-target": "unpublished-relation-target";
|
|
22
|
+
"cardinality-violation": "cardinality-violation";
|
|
23
|
+
"unknown-asset": "unknown-asset";
|
|
24
|
+
"duplicate-document": "duplicate-document";
|
|
25
|
+
"unknown-locale": "unknown-locale";
|
|
26
|
+
"missing-localized-value": "missing-localized-value";
|
|
27
|
+
"redirect-loop": "redirect-loop";
|
|
28
|
+
"unknown-route-target": "unknown-route-target";
|
|
29
|
+
"hierarchy-cycle": "hierarchy-cycle";
|
|
30
|
+
"unknown-version": "unknown-version";
|
|
31
|
+
}>;
|
|
32
|
+
export type CmsIssueCode = z.infer<typeof cmsIssueCodeSchema>;
|
|
33
|
+
export declare const cmsIssueSeveritySchema: z.ZodEnum<{
|
|
34
|
+
error: "error";
|
|
35
|
+
warning: "warning";
|
|
36
|
+
}>;
|
|
37
|
+
export type CmsIssueSeverity = z.infer<typeof cmsIssueSeveritySchema>;
|
|
38
|
+
/** A JSON-serializable scalar carried in issue metadata. */
|
|
39
|
+
export type CmsIssueMetaValue = string | number | boolean | null | readonly (string | number)[];
|
|
40
|
+
/**
|
|
41
|
+
* A structured CMS validation issue. Same conventions as
|
|
42
|
+
* `@elytracms/core/project-graph`'s `ValidationIssue`: a path locating the offending
|
|
43
|
+
* data, optional document/collection identity, and free-form metadata.
|
|
44
|
+
*/
|
|
45
|
+
export declare const cmsValidationIssueSchema: z.ZodObject<{
|
|
46
|
+
code: z.ZodEnum<{
|
|
47
|
+
"route-conflict": "route-conflict";
|
|
48
|
+
"duplicate-collection": "duplicate-collection";
|
|
49
|
+
"duplicate-field": "duplicate-field";
|
|
50
|
+
"unknown-collection": "unknown-collection";
|
|
51
|
+
"invalid-collection-config": "invalid-collection-config";
|
|
52
|
+
"invalid-field-config": "invalid-field-config";
|
|
53
|
+
"reserved-field-name": "reserved-field-name";
|
|
54
|
+
"missing-required-field": "missing-required-field";
|
|
55
|
+
"invalid-field-value": "invalid-field-value";
|
|
56
|
+
"unknown-relation-target": "unknown-relation-target";
|
|
57
|
+
"unpublished-relation-target": "unpublished-relation-target";
|
|
58
|
+
"cardinality-violation": "cardinality-violation";
|
|
59
|
+
"unknown-asset": "unknown-asset";
|
|
60
|
+
"duplicate-document": "duplicate-document";
|
|
61
|
+
"unknown-locale": "unknown-locale";
|
|
62
|
+
"missing-localized-value": "missing-localized-value";
|
|
63
|
+
"redirect-loop": "redirect-loop";
|
|
64
|
+
"unknown-route-target": "unknown-route-target";
|
|
65
|
+
"hierarchy-cycle": "hierarchy-cycle";
|
|
66
|
+
"unknown-version": "unknown-version";
|
|
67
|
+
}>;
|
|
68
|
+
severity: z.ZodEnum<{
|
|
69
|
+
error: "error";
|
|
70
|
+
warning: "warning";
|
|
71
|
+
}>;
|
|
72
|
+
message: z.ZodString;
|
|
73
|
+
path: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
74
|
+
collectionId: z.ZodOptional<z.ZodString>;
|
|
75
|
+
documentId: z.ZodOptional<z.ZodString>;
|
|
76
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
77
|
+
}, z.core.$strip>;
|
|
78
|
+
export type CmsValidationIssue = z.infer<typeof cmsValidationIssueSchema>;
|
|
79
|
+
export type CmsPath = ReadonlyArray<string | number>;
|
|
80
|
+
export interface CmsIssueInit {
|
|
81
|
+
code: CmsIssueCode;
|
|
82
|
+
severity?: CmsIssueSeverity;
|
|
83
|
+
message: string;
|
|
84
|
+
path: CmsPath;
|
|
85
|
+
collectionId?: string;
|
|
86
|
+
documentId?: string;
|
|
87
|
+
meta?: Record<string, unknown>;
|
|
88
|
+
}
|
|
89
|
+
/** Construct a structured CMS issue. `severity` defaults to `error`. */
|
|
90
|
+
export declare function cmsIssue(init: CmsIssueInit): CmsValidationIssue;
|
|
91
|
+
/** True if a set of CMS issues contains no error-severity entries. */
|
|
92
|
+
export declare function isCmsValid(issues: readonly CmsValidationIssue[]): boolean;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Stable codes for structured CMS validation issues (brief §4.11, §7.4).
|
|
4
|
+
*
|
|
5
|
+
* We mirror the conventions of `@elytracms/core/project-graph`'s `ValidationIssue`
|
|
6
|
+
* (a structured object with `code`/`severity`/`message`/`path`, never a thrown
|
|
7
|
+
* error) so callers can treat graph and CMS issues uniformly. The code set here
|
|
8
|
+
* is CMS-specific; the shape is shared.
|
|
9
|
+
*/
|
|
10
|
+
export const cmsIssueCodeSchema = z.enum([
|
|
11
|
+
// collections & fields (EC-016)
|
|
12
|
+
'duplicate-collection',
|
|
13
|
+
'duplicate-field',
|
|
14
|
+
'unknown-collection',
|
|
15
|
+
'invalid-collection-config',
|
|
16
|
+
'invalid-field-config',
|
|
17
|
+
// self-describing data (EC-277): a field name collides with a reserved node key
|
|
18
|
+
'reserved-field-name',
|
|
19
|
+
'missing-required-field',
|
|
20
|
+
'invalid-field-value',
|
|
21
|
+
// relations & assets (EC-017)
|
|
22
|
+
'unknown-relation-target',
|
|
23
|
+
// broken published references after a weak unpublish (EC-173)
|
|
24
|
+
'unpublished-relation-target',
|
|
25
|
+
'cardinality-violation',
|
|
26
|
+
'unknown-asset',
|
|
27
|
+
'duplicate-document',
|
|
28
|
+
// localization (EC-018)
|
|
29
|
+
'unknown-locale',
|
|
30
|
+
'missing-localized-value',
|
|
31
|
+
// routes / redirects / resolution (EC-019, EC-020)
|
|
32
|
+
'route-conflict',
|
|
33
|
+
'redirect-loop',
|
|
34
|
+
'unknown-route-target',
|
|
35
|
+
// page hierarchy (EC-218): a parent chain that loops
|
|
36
|
+
'hierarchy-cycle',
|
|
37
|
+
// versions (EC-021)
|
|
38
|
+
'unknown-version',
|
|
39
|
+
]);
|
|
40
|
+
export const cmsIssueSeveritySchema = z.enum(['error', 'warning']);
|
|
41
|
+
/**
|
|
42
|
+
* A structured CMS validation issue. Same conventions as
|
|
43
|
+
* `@elytracms/core/project-graph`'s `ValidationIssue`: a path locating the offending
|
|
44
|
+
* data, optional document/collection identity, and free-form metadata.
|
|
45
|
+
*/
|
|
46
|
+
export const cmsValidationIssueSchema = z.object({
|
|
47
|
+
code: cmsIssueCodeSchema,
|
|
48
|
+
severity: cmsIssueSeveritySchema,
|
|
49
|
+
message: z.string(),
|
|
50
|
+
/** Path into the CMS data, e.g. ['collections', 'post', 'fields', 'author']. */
|
|
51
|
+
path: z.array(z.union([z.string(), z.number()])),
|
|
52
|
+
/** The offending collection id, when applicable. */
|
|
53
|
+
collectionId: z.string().optional(),
|
|
54
|
+
/** The offending document id, when applicable. */
|
|
55
|
+
documentId: z.string().optional(),
|
|
56
|
+
meta: z.record(z.string(), z.unknown()).optional(),
|
|
57
|
+
});
|
|
58
|
+
/** Construct a structured CMS issue. `severity` defaults to `error`. */
|
|
59
|
+
export function cmsIssue(init) {
|
|
60
|
+
return {
|
|
61
|
+
code: init.code,
|
|
62
|
+
severity: init.severity ?? 'error',
|
|
63
|
+
message: init.message,
|
|
64
|
+
path: [...init.path],
|
|
65
|
+
...(init.collectionId ? { collectionId: init.collectionId } : {}),
|
|
66
|
+
...(init.documentId ? { documentId: init.documentId } : {}),
|
|
67
|
+
...(init.meta ? { meta: init.meta } : {}),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** True if a set of CMS issues contains no error-severity entries. */
|
|
71
|
+
export function isCmsValid(issues) {
|
|
72
|
+
return !issues.some((i) => i.severity === 'error');
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=issues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/cms-core/issues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC;IACvC,gCAAgC;IAChC,sBAAsB;IACtB,iBAAiB;IACjB,oBAAoB;IACpB,2BAA2B;IAC3B,sBAAsB;IACtB,gFAAgF;IAChF,qBAAqB;IACrB,wBAAwB;IACxB,qBAAqB;IACrB,8BAA8B;IAC9B,yBAAyB;IACzB,8DAA8D;IAC9D,6BAA6B;IAC7B,uBAAuB;IACvB,eAAe;IACf,oBAAoB;IACpB,wBAAwB;IACxB,gBAAgB;IAChB,yBAAyB;IACzB,mDAAmD;IACnD,gBAAgB;IAChB,eAAe;IACf,sBAAsB;IACtB,qDAAqD;IACrD,iBAAiB;IACjB,oBAAoB;IACpB,iBAAiB;CAClB,CAAC,CAAA;AAGF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;AAMlE;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,IAAI,EAAE,kBAAkB;IACxB,QAAQ,EAAE,sBAAsB;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,gFAAgF;IAChF,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChD,oDAAoD;IACpD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,kDAAkD;IAClD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAA;AAeF,wEAAwE;AACxE,MAAM,UAAU,QAAQ,CAAC,IAAkB;IACzC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,OAAO;QAClC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAA;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,MAAqC;IAC9D,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAA;AACpD,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { JsonValue } from '@elytracms/core/project-graph';
|
|
2
|
+
import type { CollectionDef } from './collections';
|
|
3
|
+
/**
|
|
4
|
+
* A JSON Schema document (draft 2020-12 subset) represented with the canonical
|
|
5
|
+
* `JsonValue` type from `@elytracms/core/project-graph` so it stays serialization-safe.
|
|
6
|
+
*/
|
|
7
|
+
export type JsonSchema = {
|
|
8
|
+
[key: string]: JsonValue;
|
|
9
|
+
};
|
|
10
|
+
export interface JsonSchemaOptions {
|
|
11
|
+
/**
|
|
12
|
+
* For localized fields, emit `{ [locale]: <value-schema> }` objects when a
|
|
13
|
+
* locale set is supplied; otherwise localized fields are emitted as their bare
|
|
14
|
+
* value schema (the document's default-locale value).
|
|
15
|
+
*/
|
|
16
|
+
locales?: readonly string[];
|
|
17
|
+
/** $id for the schema; defaults to a urn derived from the collection id. */
|
|
18
|
+
$id?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Produce a JSON Schema for a collection's document shape (EC-016). Required
|
|
22
|
+
* fields populate `required`; declared validation metadata maps to standard
|
|
23
|
+
* JSON Schema keywords. Localized fields can be wrapped in a per-locale object.
|
|
24
|
+
*/
|
|
25
|
+
export declare function collectionJsonSchema(collection: CollectionDef, options?: JsonSchemaOptions): JsonSchema;
|