@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,141 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { RecordNotFoundError, cloneRecord, recordMetaSchema, createSequentialClock, createSequentialIdFactory, } from './core';
|
|
3
|
+
/**
|
|
4
|
+
* Persisted asset metadata (brief §7.4, §8.6, §10). The bytes themselves live in
|
|
5
|
+
* a {@link BlobStorageAdapter}; this record is the queryable metadata that CMS
|
|
6
|
+
* `asset` fields point at by id.
|
|
7
|
+
*/
|
|
8
|
+
export const assetRecordSchema = recordMetaSchema.extend({
|
|
9
|
+
id: z.string().min(1),
|
|
10
|
+
projectId: z.string().min(1),
|
|
11
|
+
filename: z.string().min(1),
|
|
12
|
+
contentType: z.string().min(1),
|
|
13
|
+
byteSize: z.number().int().nonnegative(),
|
|
14
|
+
width: z.number().int().positive().optional(),
|
|
15
|
+
height: z.number().int().positive().optional(),
|
|
16
|
+
alt: z.string().optional(),
|
|
17
|
+
/** Editable display title (EC-152 asset library metadata). */
|
|
18
|
+
title: z.string().optional(),
|
|
19
|
+
/** Opaque key into the blob storage adapter. */
|
|
20
|
+
storageKey: z.string().min(1),
|
|
21
|
+
/**
|
|
22
|
+
* Stable, resolvable serve URL for the stored bytes (EC-151). Delivery-shape
|
|
23
|
+
* asset resolution reads this straight off the metadata record; optional
|
|
24
|
+
* because records created before byte storage existed have no URL yet.
|
|
25
|
+
*/
|
|
26
|
+
url: z.string().min(1).optional(),
|
|
27
|
+
/**
|
|
28
|
+
* Image focal point (EC-230): a normalized hotspot `{ x, y }` in 0–1. Threaded
|
|
29
|
+
* to the rendered image's CSS `object-position` so art-directed / cover crops
|
|
30
|
+
* keep the subject in frame. Optional — most assets have none; a migration
|
|
31
|
+
* importer populates it from a source hotspot (e.g. Sanity's `hotspot`).
|
|
32
|
+
*/
|
|
33
|
+
focalPoint: z.object({ x: z.number().min(0).max(1), y: z.number().min(0).max(1) }).optional(),
|
|
34
|
+
});
|
|
35
|
+
export class InMemoryBlobStorage {
|
|
36
|
+
blobs = new Map();
|
|
37
|
+
/** Deterministic backend-assigned keys (no Date/random). */
|
|
38
|
+
seq = 0;
|
|
39
|
+
async put(key, data) {
|
|
40
|
+
this.blobs.set(key, data);
|
|
41
|
+
}
|
|
42
|
+
async get(key) {
|
|
43
|
+
return this.blobs.get(key);
|
|
44
|
+
}
|
|
45
|
+
url(key) {
|
|
46
|
+
return `memory://blobs/${key}`;
|
|
47
|
+
}
|
|
48
|
+
async has(key) {
|
|
49
|
+
return this.blobs.has(key);
|
|
50
|
+
}
|
|
51
|
+
async delete(key) {
|
|
52
|
+
this.blobs.delete(key);
|
|
53
|
+
}
|
|
54
|
+
async store(data) {
|
|
55
|
+
this.seq += 1;
|
|
56
|
+
const key = `blob-${this.seq}`;
|
|
57
|
+
this.blobs.set(key, data);
|
|
58
|
+
return key;
|
|
59
|
+
}
|
|
60
|
+
async resolveUrl(key) {
|
|
61
|
+
return this.blobs.has(key) ? this.url(key) : undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export class InMemoryAssetRepository {
|
|
65
|
+
/** projectId → (assetId → record). */
|
|
66
|
+
byProject = new Map();
|
|
67
|
+
clock;
|
|
68
|
+
nextId;
|
|
69
|
+
constructor(options = {}) {
|
|
70
|
+
this.clock = options.clock ?? createSequentialClock();
|
|
71
|
+
this.nextId = options.idFactory ?? createSequentialIdFactory('asset');
|
|
72
|
+
for (const record of options.seed ?? []) {
|
|
73
|
+
const parsed = assetRecordSchema.parse(record);
|
|
74
|
+
this.projectMap(parsed.projectId).set(parsed.id, parsed);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
projectMap(projectId) {
|
|
78
|
+
const existing = this.byProject.get(projectId);
|
|
79
|
+
if (existing)
|
|
80
|
+
return existing;
|
|
81
|
+
const created = new Map();
|
|
82
|
+
this.byProject.set(projectId, created);
|
|
83
|
+
return created;
|
|
84
|
+
}
|
|
85
|
+
async upsertAsset(projectId, input) {
|
|
86
|
+
const map = this.projectMap(projectId);
|
|
87
|
+
const id = input.id ?? this.nextId();
|
|
88
|
+
const now = this.clock();
|
|
89
|
+
const previous = map.get(id);
|
|
90
|
+
const record = assetRecordSchema.parse({
|
|
91
|
+
id,
|
|
92
|
+
projectId,
|
|
93
|
+
filename: input.filename,
|
|
94
|
+
contentType: input.contentType,
|
|
95
|
+
byteSize: input.byteSize,
|
|
96
|
+
...(input.width !== undefined ? { width: input.width } : {}),
|
|
97
|
+
...(input.height !== undefined ? { height: input.height } : {}),
|
|
98
|
+
...(input.alt !== undefined ? { alt: input.alt } : {}),
|
|
99
|
+
...(input.title !== undefined ? { title: input.title } : {}),
|
|
100
|
+
...(input.url !== undefined ? { url: input.url } : {}),
|
|
101
|
+
...(input.focalPoint !== undefined ? { focalPoint: input.focalPoint } : {}),
|
|
102
|
+
storageKey: input.storageKey ?? `${projectId}/${id}`,
|
|
103
|
+
createdAt: previous?.createdAt ?? now,
|
|
104
|
+
updatedAt: now,
|
|
105
|
+
});
|
|
106
|
+
map.set(id, record);
|
|
107
|
+
return cloneRecord(record);
|
|
108
|
+
}
|
|
109
|
+
async getAsset(projectId, id) {
|
|
110
|
+
const record = this.byProject.get(projectId)?.get(id);
|
|
111
|
+
if (!record)
|
|
112
|
+
throw new RecordNotFoundError('asset', `${projectId}/${id}`);
|
|
113
|
+
return cloneRecord(record);
|
|
114
|
+
}
|
|
115
|
+
async findAsset(projectId, id) {
|
|
116
|
+
const record = this.byProject.get(projectId)?.get(id);
|
|
117
|
+
return record ? cloneRecord(record) : undefined;
|
|
118
|
+
}
|
|
119
|
+
async listAssets(projectId) {
|
|
120
|
+
return [...(this.byProject.get(projectId)?.values() ?? [])]
|
|
121
|
+
.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
|
|
122
|
+
.map(cloneRecord);
|
|
123
|
+
}
|
|
124
|
+
async removeAsset(projectId, id) {
|
|
125
|
+
const map = this.byProject.get(projectId);
|
|
126
|
+
if (!map?.has(id))
|
|
127
|
+
throw new RecordNotFoundError('asset', `${projectId}/${id}`);
|
|
128
|
+
map.delete(id);
|
|
129
|
+
}
|
|
130
|
+
async resolveMany(projectId, ids) {
|
|
131
|
+
const map = this.byProject.get(projectId);
|
|
132
|
+
const out = new Map();
|
|
133
|
+
for (const id of ids) {
|
|
134
|
+
const record = map?.get(id);
|
|
135
|
+
if (record)
|
|
136
|
+
out.set(id, cloneRecord(record));
|
|
137
|
+
}
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/persistence/assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ComponentLookup, ProjectGraph, ValidationIssue } from '@elytracms/core/project-graph';
|
|
2
|
+
import type { CmsValidationIssue, CollectionDef, RedirectRecord, RouteRecord } from '@elytracms/core/cms-core';
|
|
3
|
+
import type { PersistenceIssue } from './core';
|
|
4
|
+
/**
|
|
5
|
+
* Inputs to the backend validation service (brief §4.11, §10). Any subset may be
|
|
6
|
+
* provided; only supplied domains are validated.
|
|
7
|
+
*/
|
|
8
|
+
export interface BackendValidationInput {
|
|
9
|
+
graph?: ProjectGraph;
|
|
10
|
+
/** Registry lookup for component/prop/slot checks against the graph. */
|
|
11
|
+
components?: ComponentLookup;
|
|
12
|
+
/** Known data-source ids for binding resolution. */
|
|
13
|
+
knownSourceIds?: ReadonlySet<string>;
|
|
14
|
+
collections?: readonly CollectionDef[];
|
|
15
|
+
routes?: readonly RouteRecord[];
|
|
16
|
+
redirects?: readonly RedirectRecord[];
|
|
17
|
+
defaultLocale?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Structured, typed validation results returned to clients (brief §4.11). */
|
|
20
|
+
export interface BackendValidationResult {
|
|
21
|
+
ok: boolean;
|
|
22
|
+
/** Graph + binding + component issues (from `@elytracms/core/project-graph`). */
|
|
23
|
+
graphIssues: ValidationIssue[];
|
|
24
|
+
/** Collection/field schema issues (from `@elytracms/core/cms-core`). */
|
|
25
|
+
schemaIssues: CmsValidationIssue[];
|
|
26
|
+
/** Route conflict + redirect loop issues (from `@elytracms/core/cms-core`). */
|
|
27
|
+
routeIssues: CmsValidationIssue[];
|
|
28
|
+
/** Count of error-severity issues across all domains. */
|
|
29
|
+
errorCount: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Validate project graphs, bindings, schemas, and routes on the server before
|
|
33
|
+
* persisting (brief §4.11, §10, EC-047). Reuses the canonical validators —
|
|
34
|
+
* logic is shared, never duplicated — and returns a structured result.
|
|
35
|
+
*/
|
|
36
|
+
export declare function validateForPersistence(input: BackendValidationInput): BackendValidationResult;
|
|
37
|
+
/** Flatten a {@link BackendValidationResult} into generic persistence issues. */
|
|
38
|
+
export declare function toPersistenceIssues(result: BackendValidationResult): PersistenceIssue[];
|
|
39
|
+
/**
|
|
40
|
+
* Validate and throw a {@link PersistenceValidationError} when invalid — the
|
|
41
|
+
* server-side rejection path. Only error-severity issues block.
|
|
42
|
+
*/
|
|
43
|
+
export declare function assertValidForPersistence(input: BackendValidationInput): BackendValidationResult;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { validateProjectGraph } from '@elytracms/core/project-graph';
|
|
2
|
+
import { createCollectionRegistry, createRouter } from '@elytracms/core/cms-core';
|
|
3
|
+
import { PersistenceValidationError } from './core';
|
|
4
|
+
/**
|
|
5
|
+
* Validate project graphs, bindings, schemas, and routes on the server before
|
|
6
|
+
* persisting (brief §4.11, §10, EC-047). Reuses the canonical validators —
|
|
7
|
+
* logic is shared, never duplicated — and returns a structured result.
|
|
8
|
+
*/
|
|
9
|
+
export function validateForPersistence(input) {
|
|
10
|
+
const graphIssues = input.graph
|
|
11
|
+
? validateProjectGraph(input.graph, {
|
|
12
|
+
components: input.components,
|
|
13
|
+
knownSourceIds: input.knownSourceIds,
|
|
14
|
+
})
|
|
15
|
+
: [];
|
|
16
|
+
const schemaIssues = input.collections ? createCollectionRegistry(input.collections).issues.slice() : [];
|
|
17
|
+
const routeIssues = input.routes
|
|
18
|
+
? createRouter(input.routes, input.redirects ?? [], {
|
|
19
|
+
defaultLocale: input.defaultLocale,
|
|
20
|
+
}).issues.slice()
|
|
21
|
+
: [];
|
|
22
|
+
const errorCount = graphIssues.filter((i) => i.severity === 'error').length +
|
|
23
|
+
schemaIssues.filter((i) => i.severity === 'error').length +
|
|
24
|
+
routeIssues.filter((i) => i.severity === 'error').length;
|
|
25
|
+
return { ok: errorCount === 0, graphIssues, schemaIssues, routeIssues, errorCount };
|
|
26
|
+
}
|
|
27
|
+
/** Flatten a {@link BackendValidationResult} into generic persistence issues. */
|
|
28
|
+
export function toPersistenceIssues(result) {
|
|
29
|
+
return [
|
|
30
|
+
...result.graphIssues.map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'graph' })),
|
|
31
|
+
...result.schemaIssues.map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'cms' })),
|
|
32
|
+
...result.routeIssues.map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'routes' })),
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate and throw a {@link PersistenceValidationError} when invalid — the
|
|
37
|
+
* server-side rejection path. Only error-severity issues block.
|
|
38
|
+
*/
|
|
39
|
+
export function assertValidForPersistence(input) {
|
|
40
|
+
const result = validateForPersistence(input);
|
|
41
|
+
if (!result.ok) {
|
|
42
|
+
const errorIssues = [
|
|
43
|
+
...result.graphIssues
|
|
44
|
+
.filter((i) => i.severity === 'error')
|
|
45
|
+
.map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'graph' })),
|
|
46
|
+
...result.schemaIssues
|
|
47
|
+
.filter((i) => i.severity === 'error')
|
|
48
|
+
.map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'cms' })),
|
|
49
|
+
...result.routeIssues
|
|
50
|
+
.filter((i) => i.severity === 'error')
|
|
51
|
+
.map((i) => ({ code: i.code, message: i.message, path: i.path.slice(), domain: 'routes' })),
|
|
52
|
+
];
|
|
53
|
+
throw new PersistenceValidationError(`Project state failed backend validation (${result.errorCount} error(s)).`, errorIssues);
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=backend-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-validation.js","sourceRoot":"","sources":["../../src/persistence/backend-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Clock, IdFactory } from './core';
|
|
3
|
+
/**
|
|
4
|
+
* Revocable per-project CLI tokens (EC-150). The EC-147 push CLI authenticates
|
|
5
|
+
* with `Authorization: Bearer <token>`; the builder stores only a SHA-256 hash
|
|
6
|
+
* of the token (`tokenHash`) — the plaintext is shown exactly once at issuance
|
|
7
|
+
* and never persisted. Verification (`verifyCliToken` in `@elytracms/core/operations`)
|
|
8
|
+
* hashes the presented token and looks it up here; revoked tokens stay stored
|
|
9
|
+
* (with `revokedAt`) so revocation is auditable and ids stay stable.
|
|
10
|
+
*/
|
|
11
|
+
export declare const cliTokenRecordSchema: z.ZodObject<{
|
|
12
|
+
id: z.ZodString;
|
|
13
|
+
label: z.ZodString;
|
|
14
|
+
tokenHash: z.ZodString;
|
|
15
|
+
createdAt: z.ZodString;
|
|
16
|
+
revokedAt: z.ZodOptional<z.ZodString>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export type CliTokenRecord = z.infer<typeof cliTokenRecordSchema>;
|
|
19
|
+
export interface NewCliTokenInput {
|
|
20
|
+
label: string;
|
|
21
|
+
tokenHash: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Token storage boundary. The in-memory implementation below and the
|
|
25
|
+
* Convex-backed implementation in `apps/builder` both satisfy it.
|
|
26
|
+
*/
|
|
27
|
+
export interface CliTokenRepository {
|
|
28
|
+
/** Persist a freshly issued token (hash only). */
|
|
29
|
+
createToken(input: NewCliTokenInput): Promise<CliTokenRecord>;
|
|
30
|
+
/** All tokens of this deployment (revoked included), ordered by id. */
|
|
31
|
+
listTokens(): Promise<CliTokenRecord[]>;
|
|
32
|
+
/** Mark a token revoked (idempotent). Throws `RecordNotFoundError` when absent. */
|
|
33
|
+
revokeToken(tokenId: string): Promise<CliTokenRecord>;
|
|
34
|
+
/** Look a token up by its hash — the verification path. */
|
|
35
|
+
findByHash(tokenHash: string): Promise<CliTokenRecord | undefined>;
|
|
36
|
+
}
|
|
37
|
+
export interface InMemoryCliTokenRepositoryOptions {
|
|
38
|
+
clock?: Clock;
|
|
39
|
+
idFactory?: IdFactory;
|
|
40
|
+
}
|
|
41
|
+
export declare class InMemoryCliTokenRepository implements CliTokenRepository {
|
|
42
|
+
private readonly records;
|
|
43
|
+
private readonly clock;
|
|
44
|
+
private readonly idFactory;
|
|
45
|
+
constructor(options?: InMemoryCliTokenRepositoryOptions);
|
|
46
|
+
createToken(input: NewCliTokenInput): Promise<CliTokenRecord>;
|
|
47
|
+
listTokens(): Promise<CliTokenRecord[]>;
|
|
48
|
+
revokeToken(tokenId: string): Promise<CliTokenRecord>;
|
|
49
|
+
findByHash(tokenHash: string): Promise<CliTokenRecord | undefined>;
|
|
50
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { cloneRecord, createSequentialClock, createSequentialIdFactory } from './core';
|
|
3
|
+
import { RecordNotFoundError } from './core';
|
|
4
|
+
/**
|
|
5
|
+
* Revocable per-project CLI tokens (EC-150). The EC-147 push CLI authenticates
|
|
6
|
+
* with `Authorization: Bearer <token>`; the builder stores only a SHA-256 hash
|
|
7
|
+
* of the token (`tokenHash`) — the plaintext is shown exactly once at issuance
|
|
8
|
+
* and never persisted. Verification (`verifyCliToken` in `@elytracms/core/operations`)
|
|
9
|
+
* hashes the presented token and looks it up here; revoked tokens stay stored
|
|
10
|
+
* (with `revokedAt`) so revocation is auditable and ids stay stable.
|
|
11
|
+
*/
|
|
12
|
+
export const cliTokenRecordSchema = z.object({
|
|
13
|
+
/** Stable token id (`tok_*`) — used for revocation, never secret. */
|
|
14
|
+
id: z.string().min(1),
|
|
15
|
+
/** Human label, e.g. "CI push token". */
|
|
16
|
+
label: z.string().min(1),
|
|
17
|
+
/** Hex SHA-256 of the plaintext token. */
|
|
18
|
+
tokenHash: z.string().min(1),
|
|
19
|
+
createdAt: z.string().min(1),
|
|
20
|
+
/** Present once revoked; a revoked token never verifies again. */
|
|
21
|
+
revokedAt: z.string().min(1).optional(),
|
|
22
|
+
});
|
|
23
|
+
export class InMemoryCliTokenRepository {
|
|
24
|
+
records = new Map();
|
|
25
|
+
clock;
|
|
26
|
+
idFactory;
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
this.clock = options.clock ?? createSequentialClock();
|
|
29
|
+
this.idFactory = options.idFactory ?? createSequentialIdFactory('tok');
|
|
30
|
+
}
|
|
31
|
+
async createToken(input) {
|
|
32
|
+
const record = {
|
|
33
|
+
id: this.idFactory(),
|
|
34
|
+
label: input.label,
|
|
35
|
+
tokenHash: input.tokenHash,
|
|
36
|
+
createdAt: this.clock(),
|
|
37
|
+
};
|
|
38
|
+
this.records.set(record.id, record);
|
|
39
|
+
return cloneRecord(record);
|
|
40
|
+
}
|
|
41
|
+
async listTokens() {
|
|
42
|
+
return [...this.records.values()]
|
|
43
|
+
.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
|
|
44
|
+
.map(cloneRecord);
|
|
45
|
+
}
|
|
46
|
+
async revokeToken(tokenId) {
|
|
47
|
+
const record = this.records.get(tokenId);
|
|
48
|
+
if (!record) {
|
|
49
|
+
throw new RecordNotFoundError('cli-token', tokenId);
|
|
50
|
+
}
|
|
51
|
+
const revoked = {
|
|
52
|
+
...record,
|
|
53
|
+
revokedAt: record.revokedAt ?? this.clock(),
|
|
54
|
+
};
|
|
55
|
+
this.records.set(tokenId, revoked);
|
|
56
|
+
return cloneRecord(revoked);
|
|
57
|
+
}
|
|
58
|
+
async findByHash(tokenHash) {
|
|
59
|
+
for (const record of this.records.values()) {
|
|
60
|
+
if (record.tokenHash === tokenHash)
|
|
61
|
+
return cloneRecord(record);
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=cli-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-tokens.js","sourceRoot":"","sources":["../../src/persistence/cli-tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { CmsDocument, CollectionDef, DocumentRef } from '@elytracms/core/cms-core';
|
|
3
|
+
import { type Clock } from './core';
|
|
4
|
+
/** The persisted CMS schema for a project: its collection definitions (brief §7.4, §10). */
|
|
5
|
+
export declare const cmsSchemaRecordSchema: z.ZodObject<{
|
|
6
|
+
createdAt: z.ZodString;
|
|
7
|
+
updatedAt: z.ZodString;
|
|
8
|
+
projectId: z.ZodString;
|
|
9
|
+
collections: z.ZodArray<z.ZodObject<{
|
|
10
|
+
id: z.ZodString;
|
|
11
|
+
kind: z.ZodDefault<z.ZodEnum<{
|
|
12
|
+
asset: "asset";
|
|
13
|
+
document: "document";
|
|
14
|
+
}>>;
|
|
15
|
+
fields: z.ZodDefault<z.ZodArray<z.ZodType<import("@elytracms/core/cms-core").FieldDef, unknown, z.core.$ZodTypeInternals<import("@elytracms/core/cms-core").FieldDef, unknown>>>>;
|
|
16
|
+
form: z.ZodOptional<z.ZodObject<{
|
|
17
|
+
label: z.ZodOptional<z.ZodString>;
|
|
18
|
+
labelSingular: z.ZodOptional<z.ZodString>;
|
|
19
|
+
description: z.ZodOptional<z.ZodString>;
|
|
20
|
+
groups: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
21
|
+
tabs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
22
|
+
}, z.core.$strip>>;
|
|
23
|
+
localized: z.ZodOptional<z.ZodBoolean>;
|
|
24
|
+
titleField: z.ZodOptional<z.ZodString>;
|
|
25
|
+
singleton: z.ZodOptional<z.ZodBoolean>;
|
|
26
|
+
}, z.core.$strip>>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export type CmsSchemaRecord = z.infer<typeof cmsSchemaRecordSchema>;
|
|
29
|
+
/**
|
|
30
|
+
* A persisted CMS document. The stored `document` is the continuous working
|
|
31
|
+
* **draft** (every edit updates it); `publishedVersion` pins which recorded
|
|
32
|
+
* version is currently live (the Sanity draft/published model, EC-224). Absent
|
|
33
|
+
* `publishedVersion` means the document has never been published / is unpublished.
|
|
34
|
+
* Localized variants ride along on the `CmsDocument` itself.
|
|
35
|
+
*/
|
|
36
|
+
export declare const cmsDocumentRecordSchema: z.ZodObject<{
|
|
37
|
+
createdAt: z.ZodString;
|
|
38
|
+
updatedAt: z.ZodString;
|
|
39
|
+
projectId: z.ZodString;
|
|
40
|
+
document: z.ZodObject<{
|
|
41
|
+
collection: z.ZodString;
|
|
42
|
+
id: z.ZodString;
|
|
43
|
+
values: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
44
|
+
localized: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
45
|
+
defaultLocale: z.ZodOptional<z.ZodString>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
publishedVersion: z.ZodOptional<z.ZodNumber>;
|
|
48
|
+
}, z.core.$strip>;
|
|
49
|
+
export type CmsDocumentRecord = z.infer<typeof cmsDocumentRecordSchema>;
|
|
50
|
+
/**
|
|
51
|
+
* An immutable snapshot of a document at one recorded version (EC-224). Append-only,
|
|
52
|
+
* mirroring {@link GraphRevisionRecord} but document-scoped: one row per version,
|
|
53
|
+
* keyed by (projectId, collection, docId, version). Created on publish (the promoted
|
|
54
|
+
* draft) and by an explicit pre-restore snapshot, never on a plain draft edit.
|
|
55
|
+
*/
|
|
56
|
+
export declare const documentVersionRecordSchema: z.ZodObject<{
|
|
57
|
+
projectId: z.ZodString;
|
|
58
|
+
collection: z.ZodString;
|
|
59
|
+
docId: z.ZodString;
|
|
60
|
+
version: z.ZodNumber;
|
|
61
|
+
snapshot: z.ZodObject<{
|
|
62
|
+
collection: z.ZodString;
|
|
63
|
+
id: z.ZodString;
|
|
64
|
+
values: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
65
|
+
localized: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
66
|
+
defaultLocale: z.ZodOptional<z.ZodString>;
|
|
67
|
+
}, z.core.$strip>;
|
|
68
|
+
createdAt: z.ZodString;
|
|
69
|
+
label: z.ZodOptional<z.ZodString>;
|
|
70
|
+
}, z.core.$strip>;
|
|
71
|
+
export type DocumentVersionRecord = z.infer<typeof documentVersionRecordSchema>;
|
|
72
|
+
export interface SaveDocumentVersionOptions {
|
|
73
|
+
label?: string;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Persists CMS collection schemas and documents (brief §7.4, §10). Localized
|
|
77
|
+
* variants and draft/published state ride along on the `CmsDocument` itself.
|
|
78
|
+
*/
|
|
79
|
+
export interface CmsRepository {
|
|
80
|
+
/** Persist (replace) the project's collection schema; validates structural shape. */
|
|
81
|
+
saveSchema(projectId: string, collections: readonly CollectionDef[]): Promise<CmsSchemaRecord>;
|
|
82
|
+
getSchema(projectId: string): Promise<CmsSchemaRecord>;
|
|
83
|
+
findSchema(projectId: string): Promise<CmsSchemaRecord | undefined>;
|
|
84
|
+
/** Insert or update a document (keyed by collection + id). */
|
|
85
|
+
upsertDocument(projectId: string, document: CmsDocument): Promise<CmsDocumentRecord>;
|
|
86
|
+
getDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord>;
|
|
87
|
+
findDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord | undefined>;
|
|
88
|
+
/** All documents for a project, optionally filtered to one collection. */
|
|
89
|
+
listDocuments(projectId: string, collection?: string): Promise<CmsDocumentRecord[]>;
|
|
90
|
+
deleteDocument(projectId: string, ref: DocumentRef): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Append a snapshot of a document as a new monotonic version (EC-224). Used by
|
|
93
|
+
* publish (the promoted draft) and the pre-restore snapshot so a rollback is
|
|
94
|
+
* itself undoable. The (collection, docId) is derived from the snapshot.
|
|
95
|
+
*/
|
|
96
|
+
saveDocumentVersion(projectId: string, snapshot: CmsDocument, options?: SaveDocumentVersionOptions): Promise<DocumentVersionRecord>;
|
|
97
|
+
/** All recorded versions for a document, newest first. Empty when none. */
|
|
98
|
+
listDocumentVersions(projectId: string, ref: DocumentRef): Promise<DocumentVersionRecord[]>;
|
|
99
|
+
/**
|
|
100
|
+
* Every recorded version across all documents in a project (EC-224). Backs the
|
|
101
|
+
* delivery feeders, which reconstruct each document's `DocumentHistory` from
|
|
102
|
+
* one bulk fetch rather than a per-document query. Order is deterministic
|
|
103
|
+
* (by document key, then version ascending).
|
|
104
|
+
*/
|
|
105
|
+
listAllDocumentVersions(projectId: string): Promise<DocumentVersionRecord[]>;
|
|
106
|
+
/** A specific recorded version. Throws `RecordNotFoundError` if absent. */
|
|
107
|
+
getDocumentVersion(projectId: string, ref: DocumentRef, version: number): Promise<DocumentVersionRecord>;
|
|
108
|
+
/**
|
|
109
|
+
* Pin an existing recorded version live (EC-224 publish). Throws
|
|
110
|
+
* `RecordNotFoundError` if the document or the version is unknown.
|
|
111
|
+
*/
|
|
112
|
+
publishDocumentVersion(projectId: string, ref: DocumentRef, version: number): Promise<CmsDocumentRecord>;
|
|
113
|
+
/**
|
|
114
|
+
* Clear the live pin (EC-224 unpublish). Throws `PersistenceValidationError`
|
|
115
|
+
* if the document is not currently published.
|
|
116
|
+
*/
|
|
117
|
+
unpublishDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord>;
|
|
118
|
+
}
|
|
119
|
+
export interface InMemoryCmsRepositoryOptions {
|
|
120
|
+
clock?: Clock;
|
|
121
|
+
seedSchemas?: readonly CmsSchemaRecord[];
|
|
122
|
+
seedDocuments?: readonly CmsDocumentRecord[];
|
|
123
|
+
}
|
|
124
|
+
export declare class InMemoryCmsRepository implements CmsRepository {
|
|
125
|
+
private readonly schemas;
|
|
126
|
+
/** projectId → (documentKey → record). */
|
|
127
|
+
private readonly documents;
|
|
128
|
+
/** projectId → (documentKey → versions in ascending version order). */
|
|
129
|
+
private readonly versions;
|
|
130
|
+
private readonly clock;
|
|
131
|
+
constructor(options?: InMemoryCmsRepositoryOptions);
|
|
132
|
+
private docMap;
|
|
133
|
+
private versionMap;
|
|
134
|
+
saveSchema(projectId: string, collections: readonly CollectionDef[]): Promise<CmsSchemaRecord>;
|
|
135
|
+
getSchema(projectId: string): Promise<CmsSchemaRecord>;
|
|
136
|
+
findSchema(projectId: string): Promise<CmsSchemaRecord | undefined>;
|
|
137
|
+
upsertDocument(projectId: string, document: CmsDocument): Promise<CmsDocumentRecord>;
|
|
138
|
+
getDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord>;
|
|
139
|
+
findDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord | undefined>;
|
|
140
|
+
listDocuments(projectId: string, collection?: string): Promise<CmsDocumentRecord[]>;
|
|
141
|
+
deleteDocument(projectId: string, ref: DocumentRef): Promise<void>;
|
|
142
|
+
saveDocumentVersion(projectId: string, snapshot: CmsDocument, options?: SaveDocumentVersionOptions): Promise<DocumentVersionRecord>;
|
|
143
|
+
listDocumentVersions(projectId: string, ref: DocumentRef): Promise<DocumentVersionRecord[]>;
|
|
144
|
+
listAllDocumentVersions(projectId: string): Promise<DocumentVersionRecord[]>;
|
|
145
|
+
getDocumentVersion(projectId: string, ref: DocumentRef, version: number): Promise<DocumentVersionRecord>;
|
|
146
|
+
publishDocumentVersion(projectId: string, ref: DocumentRef, version: number): Promise<CmsDocumentRecord>;
|
|
147
|
+
unpublishDocument(projectId: string, ref: DocumentRef): Promise<CmsDocumentRecord>;
|
|
148
|
+
}
|