@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,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lossy Markdown import/export helpers (brief §7.6).
|
|
3
|
+
*
|
|
4
|
+
* Supports the common CommonMark-ish subset: ATX headings, paragraphs, bullet and
|
|
5
|
+
* ordered lists, blockquotes, fenced code blocks, horizontal rules, plus inline
|
|
6
|
+
* bold/italic/code and links. Anything outside this subset is dropped on export
|
|
7
|
+
* and treated as plain text on import — lossy by design. No external Markdown
|
|
8
|
+
* library is required, keeping the spike dependency-free and server-safe.
|
|
9
|
+
*/
|
|
10
|
+
function attrStr(node, name) {
|
|
11
|
+
const v = node.attrs?.[name];
|
|
12
|
+
return typeof v === 'string' ? v : undefined;
|
|
13
|
+
}
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Export: storage tree → Markdown
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
function hasMark(node, type) {
|
|
18
|
+
return node.marks?.find((m) => m.type === type);
|
|
19
|
+
}
|
|
20
|
+
function inlineToMd(nodes) {
|
|
21
|
+
return (nodes ?? [])
|
|
22
|
+
.map((node) => {
|
|
23
|
+
if (node.type === 'hardBreak')
|
|
24
|
+
return '\n';
|
|
25
|
+
if (node.type !== 'text')
|
|
26
|
+
return inlineToMd(node.content);
|
|
27
|
+
let text = node.text ?? '';
|
|
28
|
+
if (hasMark(node, 'code'))
|
|
29
|
+
text = `\`${text}\``;
|
|
30
|
+
if (hasMark(node, 'bold'))
|
|
31
|
+
text = `**${text}**`;
|
|
32
|
+
if (hasMark(node, 'italic'))
|
|
33
|
+
text = `*${text}*`;
|
|
34
|
+
const link = hasMark(node, 'link');
|
|
35
|
+
if (link) {
|
|
36
|
+
const href = typeof link.attrs?.href === 'string' ? link.attrs.href : '';
|
|
37
|
+
text = `[${text}](${href})`;
|
|
38
|
+
}
|
|
39
|
+
return text;
|
|
40
|
+
})
|
|
41
|
+
.join('');
|
|
42
|
+
}
|
|
43
|
+
function listToMd(node, ordered) {
|
|
44
|
+
return (node.content ?? [])
|
|
45
|
+
.map((item, i) => {
|
|
46
|
+
const marker = ordered ? `${i + 1}.` : '-';
|
|
47
|
+
const body = (item.content ?? [])
|
|
48
|
+
.map((child) => (child.type === 'paragraph' ? inlineToMd(child.content) : nodeToMd(child)))
|
|
49
|
+
.join(' ');
|
|
50
|
+
return `${marker} ${body}`;
|
|
51
|
+
})
|
|
52
|
+
.join('\n');
|
|
53
|
+
}
|
|
54
|
+
function nodeToMd(node) {
|
|
55
|
+
switch (node.type) {
|
|
56
|
+
case 'paragraph':
|
|
57
|
+
return inlineToMd(node.content);
|
|
58
|
+
case 'heading': {
|
|
59
|
+
const level = typeof node.attrs?.level === 'number' ? node.attrs.level : 1;
|
|
60
|
+
const l = Math.min(Math.max(level, 1), 6);
|
|
61
|
+
return `${'#'.repeat(l)} ${inlineToMd(node.content)}`;
|
|
62
|
+
}
|
|
63
|
+
case 'bulletList':
|
|
64
|
+
return listToMd(node, false);
|
|
65
|
+
case 'orderedList':
|
|
66
|
+
return listToMd(node, true);
|
|
67
|
+
case 'blockquote':
|
|
68
|
+
return (node.content ?? [])
|
|
69
|
+
.map((child) => nodeToMd(child))
|
|
70
|
+
.join('\n')
|
|
71
|
+
.split('\n')
|
|
72
|
+
.map((line) => `> ${line}`)
|
|
73
|
+
.join('\n');
|
|
74
|
+
case 'codeBlock': {
|
|
75
|
+
const language = attrStr(node, 'language') ?? '';
|
|
76
|
+
const text = (node.content ?? []).map((c) => c.text ?? '').join('');
|
|
77
|
+
return `\`\`\`${language}\n${text}\n\`\`\``;
|
|
78
|
+
}
|
|
79
|
+
case 'horizontalRule':
|
|
80
|
+
return '---';
|
|
81
|
+
case 'image': {
|
|
82
|
+
const src = attrStr(node, 'src') ?? '';
|
|
83
|
+
const alt = attrStr(node, 'alt') ?? '';
|
|
84
|
+
return ``;
|
|
85
|
+
}
|
|
86
|
+
default:
|
|
87
|
+
// Lossy: unknown/custom blocks have no Markdown form — drop them.
|
|
88
|
+
return '';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Serialize a document to a lossy Markdown string. */
|
|
92
|
+
export function richTextToMarkdown(doc) {
|
|
93
|
+
return doc.content
|
|
94
|
+
.map(nodeToMd)
|
|
95
|
+
.filter((block) => block.length > 0)
|
|
96
|
+
.join('\n\n');
|
|
97
|
+
}
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Import: Markdown → storage tree
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
/** Parse inline Markdown (bold/italic/code/link) into text nodes. Lossy. */
|
|
102
|
+
export function parseInlineMarkdown(text) {
|
|
103
|
+
const nodes = [];
|
|
104
|
+
// Token regex, ordered so code spans win over emphasis inside them.
|
|
105
|
+
const re = /(`[^`]+`)|(\*\*[^*]+\*\*)|(\*[^*]+\*)|(\[[^\]]+\]\([^)]*\))/g;
|
|
106
|
+
let last = 0;
|
|
107
|
+
let m;
|
|
108
|
+
const pushText = (raw, marks) => {
|
|
109
|
+
if (raw.length === 0)
|
|
110
|
+
return;
|
|
111
|
+
nodes.push(marks.length > 0 ? { type: 'text', text: raw, marks } : { type: 'text', text: raw });
|
|
112
|
+
};
|
|
113
|
+
while ((m = re.exec(text)) !== null) {
|
|
114
|
+
if (m.index > last)
|
|
115
|
+
pushText(text.slice(last, m.index), []);
|
|
116
|
+
last = re.lastIndex;
|
|
117
|
+
const token = m[0];
|
|
118
|
+
if (token.startsWith('`')) {
|
|
119
|
+
pushText(token.slice(1, -1), [{ type: 'code' }]);
|
|
120
|
+
}
|
|
121
|
+
else if (token.startsWith('**')) {
|
|
122
|
+
pushText(token.slice(2, -2), [{ type: 'bold' }]);
|
|
123
|
+
}
|
|
124
|
+
else if (token.startsWith('*')) {
|
|
125
|
+
pushText(token.slice(1, -1), [{ type: 'italic' }]);
|
|
126
|
+
}
|
|
127
|
+
else if (token.startsWith('[')) {
|
|
128
|
+
const linkMatch = /^\[([^\]]+)\]\(([^)]*)\)$/.exec(token);
|
|
129
|
+
if (linkMatch) {
|
|
130
|
+
const label = linkMatch[1] ?? '';
|
|
131
|
+
const href = linkMatch[2] ?? '';
|
|
132
|
+
pushText(label, [{ type: 'link', attrs: { href } }]);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (last < text.length)
|
|
137
|
+
pushText(text.slice(last), []);
|
|
138
|
+
return nodes;
|
|
139
|
+
}
|
|
140
|
+
function isOrderedItem(line) {
|
|
141
|
+
return /^\s*\d+\.\s+/.test(line);
|
|
142
|
+
}
|
|
143
|
+
function isBulletItem(line) {
|
|
144
|
+
return /^\s*[-*+]\s+/.test(line);
|
|
145
|
+
}
|
|
146
|
+
/** Parse a lossy Markdown string into a document tree. */
|
|
147
|
+
export function markdownToRichText(markdown) {
|
|
148
|
+
const lines = markdown.replace(/\r\n/g, '\n').split('\n');
|
|
149
|
+
const content = [];
|
|
150
|
+
let i = 0;
|
|
151
|
+
const flushParagraph = (buffer) => {
|
|
152
|
+
if (buffer.length === 0)
|
|
153
|
+
return;
|
|
154
|
+
const text = buffer.join(' ').trim();
|
|
155
|
+
if (text.length > 0)
|
|
156
|
+
content.push({ type: 'paragraph', content: parseInlineMarkdown(text) });
|
|
157
|
+
buffer.length = 0;
|
|
158
|
+
};
|
|
159
|
+
const paragraph = [];
|
|
160
|
+
while (i < lines.length) {
|
|
161
|
+
const line = lines[i] ?? '';
|
|
162
|
+
const trimmed = line.trim();
|
|
163
|
+
// Fenced code block.
|
|
164
|
+
const fence = /^```(\w*)\s*$/.exec(trimmed);
|
|
165
|
+
if (fence) {
|
|
166
|
+
flushParagraph(paragraph);
|
|
167
|
+
const language = fence[1] ?? '';
|
|
168
|
+
const codeLines = [];
|
|
169
|
+
i++;
|
|
170
|
+
while (i < lines.length && !/^```\s*$/.test((lines[i] ?? '').trim())) {
|
|
171
|
+
codeLines.push(lines[i] ?? '');
|
|
172
|
+
i++;
|
|
173
|
+
}
|
|
174
|
+
i++; // skip closing fence
|
|
175
|
+
content.push({
|
|
176
|
+
type: 'codeBlock',
|
|
177
|
+
...(language ? { attrs: { language } } : {}),
|
|
178
|
+
content: codeLines.length > 0 ? [{ type: 'text', text: codeLines.join('\n') }] : [],
|
|
179
|
+
});
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
// Blank line ends a paragraph.
|
|
183
|
+
if (trimmed.length === 0) {
|
|
184
|
+
flushParagraph(paragraph);
|
|
185
|
+
i++;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
// Horizontal rule.
|
|
189
|
+
if (/^(-{3,}|\*{3,}|_{3,})$/.test(trimmed)) {
|
|
190
|
+
flushParagraph(paragraph);
|
|
191
|
+
content.push({ type: 'horizontalRule' });
|
|
192
|
+
i++;
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// ATX heading.
|
|
196
|
+
const heading = /^(#{1,6})\s+(.*)$/.exec(trimmed);
|
|
197
|
+
if (heading) {
|
|
198
|
+
flushParagraph(paragraph);
|
|
199
|
+
const level = heading[1]?.length ?? 1;
|
|
200
|
+
content.push({ type: 'heading', attrs: { level }, content: parseInlineMarkdown(heading[2] ?? '') });
|
|
201
|
+
i++;
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
// Blockquote (consume consecutive `>` lines).
|
|
205
|
+
if (/^>\s?/.test(trimmed)) {
|
|
206
|
+
flushParagraph(paragraph);
|
|
207
|
+
const quoteLines = [];
|
|
208
|
+
while (i < lines.length && /^\s*>\s?/.test(lines[i] ?? '')) {
|
|
209
|
+
quoteLines.push((lines[i] ?? '').replace(/^\s*>\s?/, ''));
|
|
210
|
+
i++;
|
|
211
|
+
}
|
|
212
|
+
content.push({ type: 'blockquote', content: [{ type: 'paragraph', content: parseInlineMarkdown(quoteLines.join(' ').trim()) }] });
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
// Lists (consume consecutive items of the same kind).
|
|
216
|
+
if (isBulletItem(line) || isOrderedItem(line)) {
|
|
217
|
+
flushParagraph(paragraph);
|
|
218
|
+
const ordered = isOrderedItem(line);
|
|
219
|
+
const items = [];
|
|
220
|
+
while (i < lines.length && (ordered ? isOrderedItem(lines[i] ?? '') : isBulletItem(lines[i] ?? ''))) {
|
|
221
|
+
const itemText = (lines[i] ?? '').replace(ordered ? /^\s*\d+\.\s+/ : /^\s*[-*+]\s+/, '');
|
|
222
|
+
items.push({ type: 'listItem', content: [{ type: 'paragraph', content: parseInlineMarkdown(itemText) }] });
|
|
223
|
+
i++;
|
|
224
|
+
}
|
|
225
|
+
content.push({ type: ordered ? 'orderedList' : 'bulletList', content: items });
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
// Otherwise accumulate into the current paragraph.
|
|
229
|
+
paragraph.push(trimmed);
|
|
230
|
+
i++;
|
|
231
|
+
}
|
|
232
|
+
flushParagraph(paragraph);
|
|
233
|
+
return { type: 'doc', content };
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/rich-text/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { RichTextValue } from './schema';
|
|
2
|
+
/**
|
|
3
|
+
* Sanity **Portable Text → TipTap richText** migration transform (EC-229).
|
|
4
|
+
*
|
|
5
|
+
* Both real migration targets store long-form content as Portable Text
|
|
6
|
+
* (Naturkinder's `freeform` block, Konditorei's `richTextSection.content`). This
|
|
7
|
+
* is the one reusable piece of migration tooling both sites need — written once,
|
|
8
|
+
* as a pure, dependency-free, never-throwing transform that lives next to the
|
|
9
|
+
* storage format it produces (`./schema`).
|
|
10
|
+
*
|
|
11
|
+
* What it maps:
|
|
12
|
+
* - block `style` → node: `normal`→`paragraph`, `h1..h6`→`heading{level}`,
|
|
13
|
+
* `blockquote`→`blockquote`(wrapping a paragraph). Unknown styles fall back to
|
|
14
|
+
* a paragraph **with a flagged issue** (text preserved, never lost).
|
|
15
|
+
* - span decorators → marks: `strong`→`bold`, `em`→`italic`, `code`→`code`,
|
|
16
|
+
* `underline`→`underline`, `strike-through`→`strike`.
|
|
17
|
+
* - span annotation keys → marks via the block's `markDefs`: a `link` def →
|
|
18
|
+
* a `link` mark (`href`, `target` when the def is `blank`).
|
|
19
|
+
* - `listItem`/`level` blocks → nested `bulletList`/`orderedList`/`listItem`.
|
|
20
|
+
*
|
|
21
|
+
* What it deliberately does NOT map (flagged, never silently dropped):
|
|
22
|
+
* - Embedded **object blocks** (`_type` other than `block`: images, custom
|
|
23
|
+
* sections, references). Resolving a Sanity image needs asset dereferencing,
|
|
24
|
+
* and custom sections need per-site component mapping — neither is a pure text
|
|
25
|
+
* transform. Each becomes an `unmapped-block-type` issue so the site-specific
|
|
26
|
+
* migration can handle it (assets pipeline / component mapping).
|
|
27
|
+
* - Unknown decorators / annotation types → `unmapped-mark` issues; the text is
|
|
28
|
+
* always kept, only the mark is dropped.
|
|
29
|
+
*
|
|
30
|
+
* The contract is "never a silent loss": anything the transform can't represent
|
|
31
|
+
* surfaces as a structured {@link PortableTextIssue}, mirroring how the rest of
|
|
32
|
+
* the system treats unmappable content as a visible validation issue.
|
|
33
|
+
*/
|
|
34
|
+
/** A structured, non-fatal problem encountered while transforming Portable Text. */
|
|
35
|
+
export interface PortableTextIssue {
|
|
36
|
+
code: 'unmapped-block-type' | 'unmapped-block-style' | 'unmapped-mark' | 'malformed';
|
|
37
|
+
message: string;
|
|
38
|
+
/** Location in the input, e.g. `[3]` or `[3, 'children', 1]`. */
|
|
39
|
+
path: (string | number)[];
|
|
40
|
+
}
|
|
41
|
+
/** Result of {@link portableTextToRichText}: the value plus any issues. */
|
|
42
|
+
export interface PortableTextResult {
|
|
43
|
+
value: RichTextValue;
|
|
44
|
+
issues: PortableTextIssue[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Transform Sanity Portable Text into a versioned {@link RichTextValue}. Pure and
|
|
48
|
+
* total — never throws; unmappable content surfaces as {@link PortableTextIssue}s.
|
|
49
|
+
*/
|
|
50
|
+
export declare function portableTextToRichText(input: unknown): PortableTextResult;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { createRichTextValue } from './schema';
|
|
2
|
+
/** Sanity decorator name → TipTap mark type. */
|
|
3
|
+
const DECORATOR_TO_MARK = {
|
|
4
|
+
strong: 'bold',
|
|
5
|
+
em: 'italic',
|
|
6
|
+
code: 'code',
|
|
7
|
+
underline: 'underline',
|
|
8
|
+
'strike-through': 'strike',
|
|
9
|
+
};
|
|
10
|
+
/** Heading-style block `style` → heading level. */
|
|
11
|
+
const HEADING_LEVELS = {
|
|
12
|
+
h1: 1,
|
|
13
|
+
h2: 2,
|
|
14
|
+
h3: 3,
|
|
15
|
+
h4: 4,
|
|
16
|
+
h5: 5,
|
|
17
|
+
h6: 6,
|
|
18
|
+
};
|
|
19
|
+
function isObject(value) {
|
|
20
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function str(value) {
|
|
23
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
24
|
+
}
|
|
25
|
+
/** Resolve a span's `marks` (decorators + annotation keys) to TipTap marks. */
|
|
26
|
+
function resolveMarks(raw, markDefs, path, issues) {
|
|
27
|
+
if (!Array.isArray(raw))
|
|
28
|
+
return [];
|
|
29
|
+
const marks = [];
|
|
30
|
+
for (const entry of raw) {
|
|
31
|
+
if (typeof entry !== 'string')
|
|
32
|
+
continue;
|
|
33
|
+
const decorator = DECORATOR_TO_MARK[entry];
|
|
34
|
+
if (decorator) {
|
|
35
|
+
marks.push({ type: decorator });
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Not a known decorator → an annotation key referencing a markDef.
|
|
39
|
+
const def = markDefs.find((candidate) => isObject(candidate) && candidate['_key'] === entry);
|
|
40
|
+
if (isObject(def)) {
|
|
41
|
+
const mark = annotationToMark(def);
|
|
42
|
+
if (mark) {
|
|
43
|
+
marks.push(mark);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
issues.push({
|
|
47
|
+
code: 'unmapped-mark',
|
|
48
|
+
message: `Annotation "${str(def['_type']) ?? '(missing _type)'}" (${entry}) has no mark mapping; dropped (text kept).`,
|
|
49
|
+
path,
|
|
50
|
+
});
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
issues.push({
|
|
54
|
+
code: 'unmapped-mark',
|
|
55
|
+
message: `Unknown mark "${entry}"; dropped (text kept).`,
|
|
56
|
+
path,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return marks;
|
|
60
|
+
}
|
|
61
|
+
/** Map a Portable Text annotation (markDef) to a TipTap mark, or null if unmapped. */
|
|
62
|
+
function annotationToMark(def) {
|
|
63
|
+
if (str(def['_type']) === 'link') {
|
|
64
|
+
const href = str(def['href']) ?? '';
|
|
65
|
+
const attrs = { href };
|
|
66
|
+
if (def['blank'] === true || str(def['target']) === '_blank')
|
|
67
|
+
attrs['target'] = '_blank';
|
|
68
|
+
return { type: 'link', attrs };
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/** Convert a `block`'s `children` spans into inline text nodes. */
|
|
73
|
+
function inlineChildren(block, index, issues) {
|
|
74
|
+
const children = block['children'];
|
|
75
|
+
if (!Array.isArray(children))
|
|
76
|
+
return [];
|
|
77
|
+
const markDefs = Array.isArray(block['markDefs']) ? block['markDefs'] : [];
|
|
78
|
+
const nodes = [];
|
|
79
|
+
children.forEach((span, si) => {
|
|
80
|
+
if (!isObject(span))
|
|
81
|
+
return;
|
|
82
|
+
if (str(span['_type']) !== 'span') {
|
|
83
|
+
issues.push({
|
|
84
|
+
code: 'unmapped-block-type',
|
|
85
|
+
message: `Inline "${str(span['_type']) ?? '(missing _type)'}" has no rich-text mapping; dropped.`,
|
|
86
|
+
path: [index, 'children', si],
|
|
87
|
+
});
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// ProseMirror text nodes must be non-empty.
|
|
91
|
+
const text = typeof span['text'] === 'string' ? span['text'] : '';
|
|
92
|
+
if (text.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
const marks = resolveMarks(span['marks'], markDefs, [index, 'children', si], issues);
|
|
95
|
+
nodes.push(marks.length > 0 ? { type: 'text', text, marks } : { type: 'text', text });
|
|
96
|
+
});
|
|
97
|
+
return nodes;
|
|
98
|
+
}
|
|
99
|
+
/** Convert a single non-list Portable Text block to a node, or null if dropped. */
|
|
100
|
+
function convertBlock(block, index, issues) {
|
|
101
|
+
if (str(block['_type']) !== 'block') {
|
|
102
|
+
issues.push({
|
|
103
|
+
code: 'unmapped-block-type',
|
|
104
|
+
message: `Embedded block "${str(block['_type']) ?? '(missing _type)'}" has no rich-text mapping; dropped. Handle it in site-specific migration (asset/component).`,
|
|
105
|
+
path: [index],
|
|
106
|
+
});
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const content = inlineChildren(block, index, issues);
|
|
110
|
+
const style = str(block['style']) ?? 'normal';
|
|
111
|
+
if (style === 'normal')
|
|
112
|
+
return { type: 'paragraph', content };
|
|
113
|
+
if (style === 'blockquote') {
|
|
114
|
+
return { type: 'blockquote', content: [{ type: 'paragraph', content }] };
|
|
115
|
+
}
|
|
116
|
+
const level = HEADING_LEVELS[style];
|
|
117
|
+
if (level)
|
|
118
|
+
return { type: 'heading', attrs: { level }, content };
|
|
119
|
+
issues.push({
|
|
120
|
+
code: 'unmapped-block-style',
|
|
121
|
+
message: `Unknown block style "${style}"; rendered as a paragraph (text kept).`,
|
|
122
|
+
path: [index, 'style'],
|
|
123
|
+
});
|
|
124
|
+
return { type: 'paragraph', content };
|
|
125
|
+
}
|
|
126
|
+
function listTypeFor(listItem) {
|
|
127
|
+
return listItem === 'number' ? 'orderedList' : 'bulletList';
|
|
128
|
+
}
|
|
129
|
+
function itemsOf(node) {
|
|
130
|
+
if (!node.content)
|
|
131
|
+
node.content = [];
|
|
132
|
+
return node.content;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Build nested lists from a run of consecutive `listItem` blocks. Sanity encodes
|
|
136
|
+
* nesting with a 1-based `level`; a deeper level nests inside the previous item,
|
|
137
|
+
* and a different `listItem` kind at the same level starts a sibling list.
|
|
138
|
+
*/
|
|
139
|
+
function buildLists(run, issues) {
|
|
140
|
+
const roots = [];
|
|
141
|
+
const stack = [];
|
|
142
|
+
for (const { block, index } of run) {
|
|
143
|
+
const listItem = str(block['listItem']) ?? 'bullet';
|
|
144
|
+
const rawLevel = block['level'];
|
|
145
|
+
const level = typeof rawLevel === 'number' && rawLevel >= 1 ? Math.floor(rawLevel) : 1;
|
|
146
|
+
const itemNode = {
|
|
147
|
+
type: 'listItem',
|
|
148
|
+
content: [{ type: 'paragraph', content: inlineChildren(block, index, issues) }],
|
|
149
|
+
};
|
|
150
|
+
// Close any lists deeper than this item.
|
|
151
|
+
while (stack.length > 0 && stack[stack.length - 1].level > level)
|
|
152
|
+
stack.pop();
|
|
153
|
+
let top = stack[stack.length - 1];
|
|
154
|
+
// Same depth but a different list kind → close it and open a sibling.
|
|
155
|
+
if (top && top.level === level && top.listItem !== listItem) {
|
|
156
|
+
stack.pop();
|
|
157
|
+
top = stack[stack.length - 1];
|
|
158
|
+
}
|
|
159
|
+
if (top && top.level === level) {
|
|
160
|
+
itemsOf(top.node).push(itemNode);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
// Open a new list at this level — nested in the parent's last item, or a root.
|
|
164
|
+
const listNode = { type: listTypeFor(listItem), content: [itemNode] };
|
|
165
|
+
if (top && top.level < level) {
|
|
166
|
+
const parentItems = itemsOf(top.node);
|
|
167
|
+
const lastItem = parentItems[parentItems.length - 1];
|
|
168
|
+
if (lastItem)
|
|
169
|
+
itemsOf(lastItem).push(listNode);
|
|
170
|
+
else
|
|
171
|
+
parentItems.push({ type: 'listItem', content: [listNode] });
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
roots.push(listNode);
|
|
175
|
+
}
|
|
176
|
+
stack.push({ level, listItem, node: listNode });
|
|
177
|
+
}
|
|
178
|
+
return roots;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Transform Sanity Portable Text into a versioned {@link RichTextValue}. Pure and
|
|
182
|
+
* total — never throws; unmappable content surfaces as {@link PortableTextIssue}s.
|
|
183
|
+
*/
|
|
184
|
+
export function portableTextToRichText(input) {
|
|
185
|
+
const issues = [];
|
|
186
|
+
const content = [];
|
|
187
|
+
// A nullish field is empty content, not an error.
|
|
188
|
+
if (input === null || input === undefined) {
|
|
189
|
+
return { value: createRichTextValue({ type: 'doc', content }), issues };
|
|
190
|
+
}
|
|
191
|
+
if (!Array.isArray(input)) {
|
|
192
|
+
issues.push({ code: 'malformed', message: 'Portable Text must be an array of blocks.', path: [] });
|
|
193
|
+
return { value: createRichTextValue({ type: 'doc', content }), issues };
|
|
194
|
+
}
|
|
195
|
+
let i = 0;
|
|
196
|
+
while (i < input.length) {
|
|
197
|
+
const block = input[i];
|
|
198
|
+
if (!isObject(block)) {
|
|
199
|
+
issues.push({ code: 'malformed', message: `Block at index ${i} is not an object; skipped.`, path: [i] });
|
|
200
|
+
i++;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
// Group a run of consecutive list blocks into nested lists.
|
|
204
|
+
if (str(block['_type']) === 'block' && str(block['listItem'])) {
|
|
205
|
+
const run = [];
|
|
206
|
+
while (i < input.length) {
|
|
207
|
+
const next = input[i];
|
|
208
|
+
if (!isObject(next) || str(next['_type']) !== 'block' || !str(next['listItem']))
|
|
209
|
+
break;
|
|
210
|
+
run.push({ block: next, index: i });
|
|
211
|
+
i++;
|
|
212
|
+
}
|
|
213
|
+
content.push(...buildLists(run, issues));
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
const node = convertBlock(block, i, issues);
|
|
217
|
+
if (node)
|
|
218
|
+
content.push(node);
|
|
219
|
+
i++;
|
|
220
|
+
}
|
|
221
|
+
return { value: createRichTextValue({ type: 'doc', content }), issues };
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=portable-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-text.js","sourceRoot":"","sources":["../../src/rich-text/portable-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
2
|
+
import type { RichTextNode } from './schema';
|
|
3
|
+
/**
|
|
4
|
+
* Registration hooks for rendering custom rich-text nodes (brief §7.6).
|
|
5
|
+
*
|
|
6
|
+
* Two flavours, mirroring TipTap's node groups:
|
|
7
|
+
* - **block** components — full-width blocks (e.g. a callout, a CTA card) that the
|
|
8
|
+
* builder surfaces from the component registry as custom blocks.
|
|
9
|
+
* - **inline** components — mentions, badges, tokens, and data references that sit
|
|
10
|
+
* inside a paragraph alongside text.
|
|
11
|
+
*
|
|
12
|
+
* The renderer (see `render.tsx`) is server-safe and only knows the *shape* of a
|
|
13
|
+
* registry, not where it comes from. Consumers build a registry from their own
|
|
14
|
+
* component manifests and pass it in, keeping the renderer decoupled from the
|
|
15
|
+
* project's component registry package.
|
|
16
|
+
*/
|
|
17
|
+
/** Props handed to a custom node renderer. */
|
|
18
|
+
export interface CustomNodeRenderProps {
|
|
19
|
+
/** The raw storage node, so the component can read its `attrs`. */
|
|
20
|
+
node: RichTextNode;
|
|
21
|
+
/**
|
|
22
|
+
* Already-rendered children (present for block components with inline/leaf
|
|
23
|
+
* content). Inline atoms typically ignore this.
|
|
24
|
+
*/
|
|
25
|
+
children?: ReactNode;
|
|
26
|
+
}
|
|
27
|
+
export type CustomNodeRenderer = (props: CustomNodeRenderProps) => ReactElement | null;
|
|
28
|
+
export interface CustomNodeDefinition {
|
|
29
|
+
/** The storage `node.type` this renderer handles, e.g. `callout` or `mention`. */
|
|
30
|
+
type: string;
|
|
31
|
+
group: 'block' | 'inline';
|
|
32
|
+
render: CustomNodeRenderer;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A read-only registry of custom node renderers. Look-ups are keyed by storage
|
|
36
|
+
* `node.type`; the renderer falls back to a visible placeholder when a type is not
|
|
37
|
+
* registered and is not a built-in.
|
|
38
|
+
*/
|
|
39
|
+
export interface RichTextRegistry {
|
|
40
|
+
has(type: string): boolean;
|
|
41
|
+
get(type: string): CustomNodeDefinition | undefined;
|
|
42
|
+
/** Whether a registered custom node renders inline (vs. as a block). */
|
|
43
|
+
isInline(type: string): boolean;
|
|
44
|
+
}
|
|
45
|
+
/** Build an immutable {@link RichTextRegistry} from a list of definitions. */
|
|
46
|
+
export declare function createRichTextRegistry(definitions?: readonly CustomNodeDefinition[]): RichTextRegistry;
|
|
47
|
+
/** An empty registry — convenient default for callers with no custom blocks. */
|
|
48
|
+
export declare const emptyRichTextRegistry: RichTextRegistry;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Build an immutable {@link RichTextRegistry} from a list of definitions. */
|
|
2
|
+
export function createRichTextRegistry(definitions = []) {
|
|
3
|
+
const byType = new Map();
|
|
4
|
+
for (const def of definitions) {
|
|
5
|
+
// Last registration wins, matching how a builder would override a block.
|
|
6
|
+
byType.set(def.type, def);
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
has: (type) => byType.has(type),
|
|
10
|
+
get: (type) => byType.get(type),
|
|
11
|
+
isInline: (type) => byType.get(type)?.group === 'inline',
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** An empty registry — convenient default for callers with no custom blocks. */
|
|
15
|
+
export const emptyRichTextRegistry = createRichTextRegistry();
|
|
16
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/rich-text/registry.tsx"],"names":[],"mappings":"AAkDA,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CACpC,cAA+C,EAAE;IAEjD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgC,CAAA;IACtD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,yEAAyE;QACzE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO;QACL,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,QAAQ;KACzD,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAqB,sBAAsB,EAAE,CAAA"}
|