@makeswift/runtime 0.22.3 → 0.23.0-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/api/{graphql/fragments.js → fragments.js} +1 -1
- package/dist/cjs/api/fragments.js.map +1 -0
- package/dist/cjs/api/index.js +4 -4
- package/dist/cjs/api/index.js.map +1 -1
- package/dist/cjs/api/react.js +46 -46
- package/dist/cjs/api/react.js.map +1 -1
- package/dist/cjs/api/{graphql/types.js → types.js} +9 -4
- package/dist/cjs/api/types.js.map +1 -0
- package/dist/cjs/builder/serialization/control-serialization.js +13 -9
- package/dist/cjs/builder/serialization/control-serialization.js.map +1 -1
- package/dist/cjs/components/builtin/Form/Form.js +2 -2
- package/dist/cjs/components/builtin/Form/Form.js.map +1 -1
- package/dist/cjs/components/builtin/Slot/Slot.js +33 -0
- package/dist/cjs/components/builtin/Slot/Slot.js.map +1 -0
- package/dist/cjs/components/builtin/Slot/index.js +35 -0
- package/dist/cjs/components/builtin/Slot/index.js.map +1 -0
- package/dist/cjs/components/builtin/Slot/register.js +56 -0
- package/dist/cjs/components/builtin/Slot/register.js.map +1 -0
- package/dist/cjs/components/builtin/constants.js +1 -0
- package/dist/cjs/components/builtin/constants.js.map +1 -1
- package/dist/cjs/components/builtin/index.js +3 -0
- package/dist/cjs/components/builtin/index.js.map +1 -1
- package/dist/cjs/components/builtin/register.js +9 -6
- package/dist/cjs/components/builtin/register.js.map +1 -1
- package/dist/cjs/components/hooks/usePageSnippets.js +2 -2
- package/dist/cjs/components/hooks/usePageSnippets.js.map +1 -1
- package/dist/cjs/components/page/Page.js +2 -3
- package/dist/cjs/components/page/Page.js.map +1 -1
- package/dist/cjs/components/page/PageHead.js +2 -2
- package/dist/cjs/components/page/PageHead.js.map +1 -1
- package/dist/cjs/components/shared/BackgroundsContainer/index.js +5 -3
- package/dist/cjs/components/shared/BackgroundsContainer/index.js.map +1 -1
- package/dist/cjs/controls/index.js +10 -0
- package/dist/cjs/controls/index.js.map +1 -1
- package/dist/cjs/core/index.js +4 -2
- package/dist/cjs/core/index.js.map +1 -1
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/jest-setup.js +2 -1
- package/dist/cjs/jest-setup.js.map +1 -1
- package/dist/cjs/next/api-handler/handlers/manifest.js +4 -2
- package/dist/cjs/next/api-handler/handlers/manifest.js.map +1 -1
- package/dist/cjs/next/api-handler/handlers/webhook/index.js +55 -0
- package/dist/cjs/next/api-handler/handlers/webhook/index.js.map +1 -0
- package/dist/cjs/next/api-handler/handlers/webhook/site-published.js +36 -0
- package/dist/cjs/next/api-handler/handlers/webhook/site-published.js.map +1 -0
- package/dist/cjs/next/api-handler/handlers/webhook/types.js +46 -0
- package/dist/cjs/next/api-handler/handlers/webhook/types.js.map +1 -0
- package/dist/cjs/next/api-handler/index.js +7 -7
- package/dist/cjs/next/api-handler/index.js.map +1 -1
- package/dist/cjs/next/client.js +136 -18
- package/dist/cjs/next/client.js.map +1 -1
- package/dist/cjs/next/components/MakeswiftComponent.js +50 -0
- package/dist/cjs/next/components/MakeswiftComponent.js.map +1 -0
- package/dist/cjs/next/components/Slot.js +50 -0
- package/dist/cjs/next/components/Slot.js.map +1 -0
- package/dist/cjs/next/components/SlotProvider.js +41 -0
- package/dist/cjs/next/components/SlotProvider.js.map +1 -0
- package/dist/cjs/next/components/page.js +20 -18
- package/dist/cjs/next/components/page.js.map +1 -1
- package/dist/cjs/next/components/tests/controls/page-control-prop-rendering.js +6 -5
- package/dist/cjs/next/components/tests/controls/page-control-prop-rendering.js.map +1 -1
- package/dist/cjs/next/components/tests/prop-controllers/page-prop-controller.js +6 -6
- package/dist/cjs/next/components/tests/prop-controllers/page-prop-controller.js.map +1 -1
- package/dist/cjs/next/document.js +1 -1
- package/dist/cjs/next/document.js.map +1 -1
- package/dist/cjs/next/draft-mode/draft-mode-script.js +17 -3
- package/dist/cjs/next/draft-mode/draft-mode-script.js.map +1 -1
- package/dist/cjs/next/index.js +10 -4
- package/dist/cjs/next/index.js.map +1 -1
- package/dist/cjs/next/preview-mode.js +4 -1
- package/dist/cjs/next/preview-mode.js.map +1 -1
- package/dist/cjs/prop-controllers/introspection.js +1 -1
- package/dist/cjs/prop-controllers/introspection.js.map +1 -1
- package/dist/cjs/react.js +2 -4
- package/dist/cjs/react.js.map +1 -1
- package/dist/cjs/runtimes/react/components/Document.js +3 -2
- package/dist/cjs/runtimes/react/components/Document.js.map +1 -1
- package/dist/cjs/runtimes/react/components/{DocumentReference.js → DocumentRoot.js} +9 -9
- package/dist/cjs/runtimes/react/components/DocumentRoot.js.map +1 -0
- package/dist/cjs/runtimes/react/components/Element.js +10 -22
- package/dist/cjs/runtimes/react/components/Element.js.map +1 -1
- package/dist/cjs/runtimes/react/components/ElementReference.js +3 -1
- package/dist/cjs/runtimes/react/components/ElementReference.js.map +1 -1
- package/dist/cjs/runtimes/react/components/ElementRegistration.js +55 -0
- package/dist/cjs/runtimes/react/components/ElementRegistration.js.map +1 -0
- package/dist/cjs/runtimes/react/components/LiveProvider.js +10 -8
- package/dist/cjs/runtimes/react/components/LiveProvider.js.map +1 -1
- package/dist/cjs/runtimes/react/components/PreviewProvider.js +9 -22
- package/dist/cjs/runtimes/react/components/PreviewProvider.js.map +1 -1
- package/dist/cjs/runtimes/react/components/RuntimeProvider.js +23 -5
- package/dist/cjs/runtimes/react/components/RuntimeProvider.js.map +1 -1
- package/dist/cjs/runtimes/react/controls/group.js +45 -0
- package/dist/cjs/runtimes/react/controls/group.js.map +1 -0
- package/dist/cjs/runtimes/react/hooks/makeswift-api.js +20 -18
- package/dist/cjs/runtimes/react/hooks/makeswift-api.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/use-cache-data.js +35 -0
- package/dist/cjs/runtimes/react/hooks/use-cache-data.js.map +1 -0
- package/dist/cjs/runtimes/react/hooks/use-dispatch.js +1 -2
- package/dist/cjs/runtimes/react/hooks/use-dispatch.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/use-document-context.js +49 -0
- package/dist/cjs/runtimes/react/hooks/use-document-context.js.map +1 -0
- package/dist/cjs/runtimes/react/hooks/use-element-id.js +2 -2
- package/dist/cjs/runtimes/react/hooks/use-element-id.js.map +1 -1
- package/dist/cjs/{next/context/react-runtime.js → runtimes/react/hooks/use-react-runtime.js} +12 -16
- package/dist/cjs/runtimes/react/hooks/use-react-runtime.js.map +1 -0
- package/dist/cjs/runtimes/react/hooks/use-register-document.js +42 -0
- package/dist/cjs/runtimes/react/hooks/use-register-document.js.map +1 -0
- package/dist/cjs/runtimes/react/hooks/use-resolved-props.js +2 -2
- package/dist/cjs/runtimes/react/hooks/use-resolved-props.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/use-resource-resolver.js +6 -6
- package/dist/cjs/runtimes/react/hooks/use-resource-resolver.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/use-store.js +6 -3
- package/dist/cjs/runtimes/react/hooks/use-store.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/use-universal-dispatch.js +38 -0
- package/dist/cjs/runtimes/react/hooks/use-universal-dispatch.js.map +1 -0
- package/dist/cjs/{next/context/makeswift-host-api-client.js → runtimes/react/host-api-client.js} +4 -4
- package/dist/cjs/runtimes/react/host-api-client.js.map +1 -0
- package/dist/cjs/runtimes/react/index.js +8 -8
- package/dist/cjs/runtimes/react/index.js.map +1 -1
- package/dist/cjs/runtimes/react/react-runtime.js +0 -24
- package/dist/cjs/runtimes/react/react-runtime.js.map +1 -1
- package/dist/cjs/runtimes/react/runtime-core.js +2 -17
- package/dist/cjs/runtimes/react/runtime-core.js.map +1 -1
- package/dist/cjs/state/actions.js +33 -16
- package/dist/cjs/state/actions.js.map +1 -1
- package/dist/cjs/state/makeswift-api-client.js +98 -18
- package/dist/cjs/state/makeswift-api-client.js.map +1 -1
- package/dist/cjs/{runtimes/react/hooks/use-document-key.js → state/mixins/setup-teardown.js} +12 -13
- package/dist/cjs/state/mixins/setup-teardown.js.map +1 -0
- package/dist/cjs/state/modules/api-resources.js +62 -24
- package/dist/cjs/state/modules/api-resources.js.map +1 -1
- package/dist/cjs/state/modules/element-trees.js +14 -7
- package/dist/cjs/state/modules/element-trees.js.map +1 -1
- package/dist/cjs/state/modules/localized-resources-map.js +80 -0
- package/dist/cjs/state/modules/localized-resources-map.js.map +1 -0
- package/dist/cjs/state/modules/read-only-documents.js +16 -13
- package/dist/cjs/state/modules/read-only-documents.js.map +1 -1
- package/dist/cjs/state/modules/read-write-documents.js +9 -8
- package/dist/cjs/state/modules/read-write-documents.js.map +1 -1
- package/dist/cjs/state/react-builder-preview.js +18 -61
- package/dist/cjs/state/react-builder-preview.js.map +1 -1
- package/dist/cjs/state/react-page.js +64 -8
- package/dist/cjs/state/react-page.js.map +1 -1
- package/dist/cjs/{api/resource-types.js → utils/branded.js} +3 -10
- package/dist/cjs/utils/branded.js.map +1 -0
- package/dist/cjs/utils/canonicalize.js +39 -0
- package/dist/cjs/utils/canonicalize.js.map +1 -0
- package/dist/cjs/utils/deterministic-uuid.js +35 -0
- package/dist/cjs/utils/deterministic-uuid.js.map +1 -0
- package/dist/cjs/utils/is-server.js +31 -0
- package/dist/cjs/utils/is-server.js.map +1 -0
- package/dist/cjs/utils/serializeState.js +42 -0
- package/dist/cjs/utils/serializeState.js.map +1 -0
- package/dist/cjs/utils/tests/element-data-test-test.js +10 -9
- package/dist/cjs/utils/tests/element-data-test-test.js.map +1 -1
- package/dist/esm/api/fragments.js +6 -0
- package/dist/esm/api/fragments.js.map +1 -0
- package/dist/esm/api/index.js +2 -2
- package/dist/esm/api/index.js.map +1 -1
- package/dist/esm/api/react.js +45 -46
- package/dist/esm/api/react.js.map +1 -1
- package/dist/esm/api/{graphql/types.js → types.js} +7 -3
- package/dist/esm/api/types.js.map +1 -0
- package/dist/esm/builder/serialization/control-serialization.js +19 -11
- package/dist/esm/builder/serialization/control-serialization.js.map +1 -1
- package/dist/esm/components/builtin/Form/Form.js +1 -1
- package/dist/esm/components/builtin/Form/Form.js.map +1 -1
- package/dist/esm/components/builtin/Slot/Slot.js +13 -0
- package/dist/esm/components/builtin/Slot/Slot.js.map +1 -0
- package/dist/esm/components/builtin/Slot/index.js +5 -0
- package/dist/esm/components/builtin/Slot/index.js.map +1 -0
- package/dist/esm/components/builtin/Slot/register.js +22 -0
- package/dist/esm/components/builtin/Slot/register.js.map +1 -0
- package/dist/esm/components/builtin/constants.js +1 -0
- package/dist/esm/components/builtin/constants.js.map +1 -1
- package/dist/esm/components/builtin/index.js +8 -6
- package/dist/esm/components/builtin/index.js.map +1 -1
- package/dist/esm/components/builtin/register.js +3 -0
- package/dist/esm/components/builtin/register.js.map +1 -1
- package/dist/esm/components/hooks/usePageSnippets.js +1 -1
- package/dist/esm/components/hooks/usePageSnippets.js.map +1 -1
- package/dist/esm/components/page/Page.js +3 -4
- package/dist/esm/components/page/Page.js.map +1 -1
- package/dist/esm/components/page/PageHead.js +1 -1
- package/dist/esm/components/page/PageHead.js.map +1 -1
- package/dist/esm/components/shared/BackgroundsContainer/index.js +5 -3
- package/dist/esm/components/shared/BackgroundsContainer/index.js.map +1 -1
- package/dist/esm/controls/index.js +17 -7
- package/dist/esm/controls/index.js.map +1 -1
- package/dist/esm/core/index.js +4 -2
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/jest-setup.js +2 -1
- package/dist/esm/jest-setup.js.map +1 -1
- package/dist/esm/next/api-handler/handlers/manifest.js +4 -2
- package/dist/esm/next/api-handler/handlers/manifest.js.map +1 -1
- package/dist/esm/next/api-handler/handlers/webhook/index.js +38 -0
- package/dist/esm/next/api-handler/handlers/webhook/index.js.map +1 -0
- package/dist/esm/next/api-handler/handlers/webhook/site-published.js +11 -0
- package/dist/esm/next/api-handler/handlers/webhook/site-published.js.map +1 -0
- package/dist/esm/next/api-handler/handlers/webhook/types.js +21 -0
- package/dist/esm/next/api-handler/handlers/webhook/types.js.map +1 -0
- package/dist/esm/next/api-handler/index.js +7 -7
- package/dist/esm/next/api-handler/index.js.map +1 -1
- package/dist/esm/next/client.js +133 -17
- package/dist/esm/next/client.js.map +1 -1
- package/dist/esm/next/components/MakeswiftComponent.js +26 -0
- package/dist/esm/next/components/MakeswiftComponent.js.map +1 -0
- package/dist/esm/next/components/Slot.js +16 -0
- package/dist/esm/next/components/Slot.js.map +1 -0
- package/dist/esm/next/components/SlotProvider.js +17 -0
- package/dist/esm/next/components/SlotProvider.js.map +1 -0
- package/dist/esm/next/components/page.js +24 -20
- package/dist/esm/next/components/page.js.map +1 -1
- package/dist/esm/next/components/tests/controls/page-control-prop-rendering.js +4 -3
- package/dist/esm/next/components/tests/controls/page-control-prop-rendering.js.map +1 -1
- package/dist/esm/next/components/tests/prop-controllers/page-prop-controller.js +3 -3
- package/dist/esm/next/components/tests/prop-controllers/page-prop-controller.js.map +1 -1
- package/dist/esm/next/document.js +1 -1
- package/dist/esm/next/document.js.map +1 -1
- package/dist/esm/next/draft-mode/draft-mode-script.js +7 -3
- package/dist/esm/next/draft-mode/draft-mode-script.js.map +1 -1
- package/dist/esm/next/index.js +6 -2
- package/dist/esm/next/index.js.map +1 -1
- package/dist/esm/next/preview-mode.js +4 -1
- package/dist/esm/next/preview-mode.js.map +1 -1
- package/dist/esm/prop-controllers/introspection.js +2 -2
- package/dist/esm/prop-controllers/introspection.js.map +1 -1
- package/dist/esm/react.js +2 -4
- package/dist/esm/react.js.map +1 -1
- package/dist/esm/runtimes/react/components/Document.js +3 -2
- package/dist/esm/runtimes/react/components/Document.js.map +1 -1
- package/dist/esm/runtimes/react/components/{DocumentReference.js → DocumentRoot.js} +7 -7
- package/dist/esm/runtimes/react/components/DocumentRoot.js.map +1 -0
- package/dist/esm/runtimes/react/components/Element.js +11 -23
- package/dist/esm/runtimes/react/components/Element.js.map +1 -1
- package/dist/esm/runtimes/react/components/ElementReference.js +3 -1
- package/dist/esm/runtimes/react/components/ElementReference.js.map +1 -1
- package/dist/esm/runtimes/react/components/ElementRegistration.js +31 -0
- package/dist/esm/runtimes/react/components/ElementRegistration.js.map +1 -0
- package/dist/esm/runtimes/react/components/LiveProvider.js +9 -7
- package/dist/esm/runtimes/react/components/LiveProvider.js.map +1 -1
- package/dist/esm/runtimes/react/components/PreviewProvider.js +8 -21
- package/dist/esm/runtimes/react/components/PreviewProvider.js.map +1 -1
- package/dist/esm/runtimes/react/components/RuntimeProvider.js +23 -5
- package/dist/esm/runtimes/react/components/RuntimeProvider.js.map +1 -1
- package/dist/esm/runtimes/react/controls/group.js +23 -0
- package/dist/esm/runtimes/react/controls/group.js.map +1 -0
- package/dist/esm/runtimes/react/hooks/makeswift-api.js +11 -9
- package/dist/esm/runtimes/react/hooks/makeswift-api.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-cache-data.js +11 -0
- package/dist/esm/runtimes/react/hooks/use-cache-data.js.map +1 -0
- package/dist/esm/runtimes/react/hooks/use-dispatch.js +2 -3
- package/dist/esm/runtimes/react/hooks/use-dispatch.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-document-context.js +22 -0
- package/dist/esm/runtimes/react/hooks/use-document-context.js.map +1 -0
- package/dist/esm/runtimes/react/hooks/use-element-id.js +1 -1
- package/dist/esm/runtimes/react/hooks/use-element-id.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-react-runtime.js +15 -0
- package/dist/esm/runtimes/react/hooks/use-react-runtime.js.map +1 -0
- package/dist/esm/runtimes/react/hooks/use-register-document.js +18 -0
- package/dist/esm/runtimes/react/hooks/use-register-document.js.map +1 -0
- package/dist/esm/runtimes/react/hooks/use-resolved-props.js +1 -1
- package/dist/esm/runtimes/react/hooks/use-resolved-props.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-resource-resolver.js +5 -5
- package/dist/esm/runtimes/react/hooks/use-resource-resolver.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-store.js +6 -3
- package/dist/esm/runtimes/react/hooks/use-store.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-universal-dispatch.js +14 -0
- package/dist/esm/runtimes/react/hooks/use-universal-dispatch.js.map +1 -0
- package/dist/esm/{next/context/makeswift-host-api-client.js → runtimes/react/host-api-client.js} +1 -1
- package/dist/esm/runtimes/react/host-api-client.js.map +1 -0
- package/dist/esm/runtimes/react/index.js +5 -5
- package/dist/esm/runtimes/react/index.js.map +1 -1
- package/dist/esm/runtimes/react/react-runtime.js +0 -24
- package/dist/esm/runtimes/react/react-runtime.js.map +1 -1
- package/dist/esm/runtimes/react/runtime-core.js +2 -17
- package/dist/esm/runtimes/react/runtime-core.js.map +1 -1
- package/dist/esm/state/actions.js +29 -14
- package/dist/esm/state/actions.js.map +1 -1
- package/dist/esm/state/makeswift-api-client.js +103 -18
- package/dist/esm/state/makeswift-api-client.js.map +1 -1
- package/dist/esm/state/mixins/setup-teardown.js +11 -0
- package/dist/esm/state/mixins/setup-teardown.js.map +1 -0
- package/dist/esm/state/modules/api-resources.js +66 -25
- package/dist/esm/state/modules/api-resources.js.map +1 -1
- package/dist/esm/state/modules/element-trees.js +14 -7
- package/dist/esm/state/modules/element-trees.js.map +1 -1
- package/dist/esm/state/modules/localized-resources-map.js +53 -0
- package/dist/esm/state/modules/localized-resources-map.js.map +1 -0
- package/dist/esm/state/modules/read-only-documents.js +13 -12
- package/dist/esm/state/modules/read-only-documents.js.map +1 -1
- package/dist/esm/state/modules/read-write-documents.js +9 -8
- package/dist/esm/state/modules/read-write-documents.js.map +1 -1
- package/dist/esm/state/react-builder-preview.js +18 -64
- package/dist/esm/state/react-builder-preview.js.map +1 -1
- package/dist/esm/state/react-page.js +73 -9
- package/dist/esm/state/react-page.js.map +1 -1
- package/dist/esm/utils/branded.js +1 -0
- package/dist/esm/utils/branded.js.map +1 -0
- package/dist/esm/utils/canonicalize.js +15 -0
- package/dist/esm/utils/canonicalize.js.map +1 -0
- package/dist/esm/utils/deterministic-uuid.js +11 -0
- package/dist/esm/utils/deterministic-uuid.js.map +1 -0
- package/dist/esm/utils/is-server.js +7 -0
- package/dist/esm/utils/is-server.js.map +1 -0
- package/dist/esm/utils/serializeState.js +18 -0
- package/dist/esm/utils/serializeState.js.map +1 -0
- package/dist/esm/utils/tests/element-data-test-test.js +10 -9
- package/dist/esm/utils/tests/element-data-test-test.js.map +1 -1
- package/dist/types/api/{graphql/fragments.d.ts → fragments.d.ts} +1 -1
- package/dist/types/api/fragments.d.ts.map +1 -0
- package/dist/types/api/index.d.ts +2 -2
- package/dist/types/api/index.d.ts.map +1 -1
- package/dist/types/api/react.d.ts +28 -22
- package/dist/types/api/react.d.ts.map +1 -1
- package/dist/types/api/types.d.ts +18 -0
- package/dist/types/api/types.d.ts.map +1 -0
- package/dist/types/builder/serialization/control-serialization.d.ts.map +1 -1
- package/dist/types/components/builtin/Form/Form.d.ts.map +1 -1
- package/dist/types/components/builtin/Slot/Slot.d.ts +8 -0
- package/dist/types/components/builtin/Slot/Slot.d.ts.map +1 -0
- package/dist/types/components/builtin/Slot/index.d.ts +2 -0
- package/dist/types/components/builtin/Slot/index.d.ts.map +1 -0
- package/dist/types/components/builtin/Slot/register.d.ts +3 -0
- package/dist/types/components/builtin/Slot/register.d.ts.map +1 -0
- package/dist/types/components/builtin/constants.d.ts +1 -0
- package/dist/types/components/builtin/constants.d.ts.map +1 -1
- package/dist/types/components/builtin/index.d.ts +1 -0
- package/dist/types/components/builtin/index.d.ts.map +1 -1
- package/dist/types/components/builtin/register.d.ts.map +1 -1
- package/dist/types/components/hooks/usePageSnippets.d.ts +1 -1
- package/dist/types/components/hooks/usePageSnippets.d.ts.map +1 -1
- package/dist/types/components/page/Page.d.ts +4 -3
- package/dist/types/components/page/Page.d.ts.map +1 -1
- package/dist/types/components/shared/BackgroundsContainer/index.d.ts.map +1 -1
- package/dist/types/controls/index.d.ts +1 -1
- package/dist/types/controls/index.d.ts.map +1 -1
- package/dist/types/controls/rich-text-v2/rich-text-v2.d.ts +4 -4
- package/dist/types/core/index.d.ts +1 -1
- package/dist/types/core/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/locale.d.ts +1 -1
- package/dist/types/next/api-handler/handlers/manifest.d.ts +1 -0
- package/dist/types/next/api-handler/handlers/manifest.d.ts.map +1 -1
- package/dist/types/next/api-handler/handlers/webhook/index.d.ts +21 -0
- package/dist/types/next/api-handler/handlers/webhook/index.d.ts.map +1 -0
- package/dist/types/next/api-handler/handlers/webhook/site-published.d.ts +4 -0
- package/dist/types/next/api-handler/handlers/webhook/site-published.d.ts.map +1 -0
- package/dist/types/next/api-handler/handlers/webhook/types.d.ts +121 -0
- package/dist/types/next/api-handler/handlers/webhook/types.d.ts.map +1 -0
- package/dist/types/next/api-handler/index.d.ts +4 -3
- package/dist/types/next/api-handler/index.d.ts.map +1 -1
- package/dist/types/next/client.d.ts +356 -50
- package/dist/types/next/client.d.ts.map +1 -1
- package/dist/types/next/components/MakeswiftComponent.d.ts +10 -0
- package/dist/types/next/components/MakeswiftComponent.d.ts.map +1 -0
- package/dist/types/next/components/Slot.d.ts +10 -0
- package/dist/types/next/components/Slot.d.ts.map +1 -0
- package/dist/types/next/components/SlotProvider.d.ts +12 -0
- package/dist/types/next/components/SlotProvider.d.ts.map +1 -0
- package/dist/types/next/components/page.d.ts +1 -1
- package/dist/types/next/components/page.d.ts.map +1 -1
- package/dist/types/next/components/tests/controls/font-control.test.d.ts +2 -0
- package/dist/types/next/components/tests/controls/font-control.test.d.ts.map +1 -0
- package/dist/types/next/components/tests/controls/group-control.test.d.ts +2 -0
- package/dist/types/next/components/tests/controls/group-control.test.d.ts.map +1 -0
- package/dist/types/next/components/tests/controls/page-control-prop-rendering.d.ts +3 -2
- package/dist/types/next/components/tests/controls/page-control-prop-rendering.d.ts.map +1 -1
- package/dist/types/next/components/tests/global-element-rendering.test.d.ts +3 -0
- package/dist/types/next/components/tests/global-element-rendering.test.d.ts.map +1 -0
- package/dist/types/next/components/tests/makeswift-component-rendering.test.d.ts +3 -0
- package/dist/types/next/components/tests/makeswift-component-rendering.test.d.ts.map +1 -0
- package/dist/types/next/document.d.ts +5 -1
- package/dist/types/next/document.d.ts.map +1 -1
- package/dist/types/next/draft-mode/draft-mode-script.d.ts.map +1 -1
- package/dist/types/next/index.d.ts +3 -1
- package/dist/types/next/index.d.ts.map +1 -1
- package/dist/types/next/preview-mode.d.ts.map +1 -1
- package/dist/types/next/tests/client.get-component-snapshot.test.d.ts +2 -0
- package/dist/types/next/tests/client.get-component-snapshot.test.d.ts.map +1 -0
- package/dist/types/react.d.ts +1 -1
- package/dist/types/react.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/Document.d.ts +1 -1
- package/dist/types/runtimes/react/components/Document.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/DocumentRoot.d.ts +9 -0
- package/dist/types/runtimes/react/components/DocumentRoot.d.ts.map +1 -0
- package/dist/types/runtimes/react/components/Element.d.ts +3 -3
- package/dist/types/runtimes/react/components/Element.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/ElementReference.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/ElementRegistration.d.ts +10 -0
- package/dist/types/runtimes/react/components/ElementRegistration.d.ts.map +1 -0
- package/dist/types/runtimes/react/components/LiveProvider.d.ts +2 -10
- package/dist/types/runtimes/react/components/LiveProvider.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/PreviewProvider.d.ts +2 -10
- package/dist/types/runtimes/react/components/PreviewProvider.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/RuntimeProvider.d.ts +7 -11
- package/dist/types/runtimes/react/components/RuntimeProvider.d.ts.map +1 -1
- package/dist/types/runtimes/react/controls/group.d.ts +11 -0
- package/dist/types/runtimes/react/controls/group.d.ts.map +1 -0
- package/dist/types/runtimes/react/hooks/makeswift-api.d.ts +2 -3
- package/dist/types/runtimes/react/hooks/makeswift-api.d.ts.map +1 -1
- package/dist/types/runtimes/react/hooks/use-cache-data.d.ts +3 -0
- package/dist/types/runtimes/react/hooks/use-cache-data.d.ts.map +1 -0
- package/dist/types/runtimes/react/hooks/use-dispatch.d.ts.map +1 -1
- package/dist/types/runtimes/react/hooks/use-document-context.d.ts +11 -0
- package/dist/types/runtimes/react/hooks/use-document-context.d.ts.map +1 -0
- package/dist/types/runtimes/react/hooks/use-react-runtime.d.ts +5 -0
- package/dist/types/runtimes/react/hooks/use-react-runtime.d.ts.map +1 -0
- package/dist/types/runtimes/react/hooks/use-register-document.d.ts +6 -0
- package/dist/types/runtimes/react/hooks/use-register-document.d.ts.map +1 -0
- package/dist/types/runtimes/react/hooks/use-store.d.ts +1 -1
- package/dist/types/runtimes/react/hooks/use-store.d.ts.map +1 -1
- package/dist/types/runtimes/react/hooks/use-universal-dispatch.d.ts +6 -0
- package/dist/types/runtimes/react/hooks/use-universal-dispatch.d.ts.map +1 -0
- package/dist/types/{next/context/makeswift-host-api-client.d.ts → runtimes/react/host-api-client.d.ts} +1 -1
- package/dist/types/runtimes/react/host-api-client.d.ts.map +1 -0
- package/dist/types/runtimes/react/index.d.ts +3 -3
- package/dist/types/runtimes/react/index.d.ts.map +1 -1
- package/dist/types/runtimes/react/react-runtime.d.ts +0 -9
- package/dist/types/runtimes/react/react-runtime.d.ts.map +1 -1
- package/dist/types/runtimes/react/runtime-core.d.ts +0 -5
- package/dist/types/runtimes/react/runtime-core.d.ts.map +1 -1
- package/dist/types/slate/test-helpers/slate-test-helper.d.ts +4 -4
- package/dist/types/state/actions.d.ts +45 -13
- package/dist/types/state/actions.d.ts.map +1 -1
- package/dist/types/state/makeswift-api-client.d.ts +18 -11
- package/dist/types/state/makeswift-api-client.d.ts.map +1 -1
- package/dist/types/state/mixins/setup-teardown.d.ts +7 -0
- package/dist/types/state/mixins/setup-teardown.d.ts.map +1 -0
- package/dist/types/state/modules/__tests__/api-resources.test.d.ts +2 -0
- package/dist/types/state/modules/__tests__/api-resources.test.d.ts.map +1 -0
- package/dist/types/state/modules/__tests__/fixtures/element-trees.d.ts +1 -1
- package/dist/types/state/modules/__tests__/localized-resources-map.test.d.ts +2 -0
- package/dist/types/state/modules/__tests__/localized-resources-map.test.d.ts.map +1 -0
- package/dist/types/state/modules/api-resources.d.ts +8 -5
- package/dist/types/state/modules/api-resources.d.ts.map +1 -1
- package/dist/types/state/modules/element-trees.d.ts +2 -1
- package/dist/types/state/modules/element-trees.d.ts.map +1 -1
- package/dist/types/state/modules/localized-resources-map.d.ts +13 -0
- package/dist/types/state/modules/localized-resources-map.d.ts.map +1 -0
- package/dist/types/state/modules/read-only-documents.d.ts +22 -5
- package/dist/types/state/modules/read-only-documents.d.ts.map +1 -1
- package/dist/types/state/modules/read-write-documents.d.ts +2 -2
- package/dist/types/state/modules/read-write-documents.d.ts.map +1 -1
- package/dist/types/state/react-builder-preview.d.ts +5 -11
- package/dist/types/state/react-builder-preview.d.ts.map +1 -1
- package/dist/types/state/react-page.d.ts +8 -6
- package/dist/types/state/react-page.d.ts.map +1 -1
- package/dist/types/utils/__tests__/serializeState.test.d.ts +2 -0
- package/dist/types/utils/__tests__/serializeState.test.d.ts.map +1 -0
- package/dist/types/utils/branded.d.ts +7 -0
- package/dist/types/utils/branded.d.ts.map +1 -0
- package/dist/types/utils/canonicalize.d.ts +7 -0
- package/dist/types/utils/canonicalize.d.ts.map +1 -0
- package/dist/types/utils/canonicalize.test.d.ts +2 -0
- package/dist/types/utils/canonicalize.test.d.ts.map +1 -0
- package/dist/types/utils/deterministic-uuid.d.ts +2 -0
- package/dist/types/utils/deterministic-uuid.d.ts.map +1 -0
- package/dist/types/utils/is-server.d.ts +2 -0
- package/dist/types/utils/is-server.d.ts.map +1 -0
- package/dist/types/utils/serializeState.d.ts +3 -0
- package/dist/types/utils/serializeState.d.ts.map +1 -0
- package/dist/types/utils/tests/element-data-test-test.d.ts +6 -3
- package/dist/types/utils/tests/element-data-test-test.d.ts.map +1 -1
- package/package.json +5 -4
- package/dist/cjs/api/graphql/fragments.js.map +0 -1
- package/dist/cjs/api/graphql/types.js.map +0 -1
- package/dist/cjs/api/resource-types.js.map +0 -1
- package/dist/cjs/next/context/makeswift-host-api-client.js.map +0 -1
- package/dist/cjs/next/context/react-runtime.js.map +0 -1
- package/dist/cjs/runtimes/react/components/DocumentReference.js.map +0 -1
- package/dist/cjs/runtimes/react/hooks/use-document-key.js.map +0 -1
- package/dist/esm/api/graphql/fragments.js +0 -6
- package/dist/esm/api/graphql/fragments.js.map +0 -1
- package/dist/esm/api/graphql/types.js.map +0 -1
- package/dist/esm/api/resource-types.js +0 -8
- package/dist/esm/api/resource-types.js.map +0 -1
- package/dist/esm/next/context/makeswift-host-api-client.js.map +0 -1
- package/dist/esm/next/context/react-runtime.js +0 -19
- package/dist/esm/next/context/react-runtime.js.map +0 -1
- package/dist/esm/runtimes/react/components/DocumentReference.js.map +0 -1
- package/dist/esm/runtimes/react/hooks/use-document-key.js +0 -11
- package/dist/esm/runtimes/react/hooks/use-document-key.js.map +0 -1
- package/dist/types/api/graphql/fragments.d.ts.map +0 -1
- package/dist/types/api/graphql/types.d.ts +0 -8
- package/dist/types/api/graphql/types.d.ts.map +0 -1
- package/dist/types/api/resource-types.d.ts +0 -20
- package/dist/types/api/resource-types.d.ts.map +0 -1
- package/dist/types/next/context/makeswift-host-api-client.d.ts.map +0 -1
- package/dist/types/next/context/react-runtime.d.ts +0 -8
- package/dist/types/next/context/react-runtime.d.ts.map +0 -1
- package/dist/types/runtimes/react/components/DocumentReference.d.ts +0 -9
- package/dist/types/runtimes/react/components/DocumentReference.d.ts.map +0 -1
- package/dist/types/runtimes/react/hooks/use-document-key.d.ts +0 -4
- package/dist/types/runtimes/react/hooks/use-document-key.d.ts.map +0 -1
|
@@ -31,28 +31,59 @@ __export(makeswift_api_client_exports, {
|
|
|
31
31
|
configureStore: () => configureStore,
|
|
32
32
|
fetchAPIResource: () => fetchAPIResource,
|
|
33
33
|
getAPIResource: () => getAPIResource,
|
|
34
|
-
getHasAPIResource: () => getHasAPIResource
|
|
35
|
-
getSerializedState: () => getSerializedState
|
|
34
|
+
getHasAPIResource: () => getHasAPIResource
|
|
36
35
|
});
|
|
37
36
|
module.exports = __toCommonJS(makeswift_api_client_exports);
|
|
38
37
|
var import_redux = require("redux");
|
|
39
38
|
var import_redux_thunk = __toESM(require("redux-thunk"));
|
|
39
|
+
var import_extension = require("@redux-devtools/extension");
|
|
40
|
+
var import_serializeState = require("../utils/serializeState");
|
|
40
41
|
var APIResources = __toESM(require("./modules/api-resources"));
|
|
42
|
+
var LocalizedResourcesMap = __toESM(require("./modules/localized-resources-map"));
|
|
41
43
|
var import_actions = require("./actions");
|
|
42
44
|
var import_api = require("../api");
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
var import_site_published = require("../next/api-handler/handlers/webhook/site-published");
|
|
46
|
+
const reducer = (0, import_redux.combineReducers)({
|
|
47
|
+
apiResources: APIResources.reducer,
|
|
48
|
+
localizedResourcesMap: LocalizedResourcesMap.reducer
|
|
49
|
+
});
|
|
50
|
+
function getLocalizedResourceId(state, locale, resourceId) {
|
|
51
|
+
return LocalizedResourcesMap.getLocalizedResourceId(
|
|
52
|
+
state.localizedResourcesMap,
|
|
53
|
+
locale,
|
|
54
|
+
resourceId
|
|
55
|
+
);
|
|
46
56
|
}
|
|
47
|
-
function getHasAPIResource(state, resourceType, resourceId) {
|
|
48
|
-
|
|
57
|
+
function getHasAPIResource(state, resourceType, resourceId, locale) {
|
|
58
|
+
switch (resourceType) {
|
|
59
|
+
case import_api.APIResourceType.LocalizedGlobalElement:
|
|
60
|
+
if (locale == null) {
|
|
61
|
+
console.error(`Attempt to access ${resourceType} ${resourceId} without a locale`);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const localizedId = getLocalizedResourceId(state, locale, resourceId);
|
|
65
|
+
return localizedId != null && APIResources.getHasAPIResource(state.apiResources, resourceType, localizedId, locale);
|
|
66
|
+
default:
|
|
67
|
+
return APIResources.getHasAPIResource(state.apiResources, resourceType, resourceId, locale);
|
|
68
|
+
}
|
|
49
69
|
}
|
|
50
|
-
function getAPIResource(state, resourceType, resourceId) {
|
|
51
|
-
|
|
70
|
+
function getAPIResource(state, resourceType, resourceId, locale) {
|
|
71
|
+
switch (resourceType) {
|
|
72
|
+
case import_api.APIResourceType.LocalizedGlobalElement:
|
|
73
|
+
if (locale == null) {
|
|
74
|
+
console.error(`Attempt to access ${resourceType} ${resourceId} without a locale`);
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const localizedId = getLocalizedResourceId(state, locale, resourceId);
|
|
78
|
+
return localizedId != null ? APIResources.getAPIResource(state.apiResources, resourceType, localizedId, locale) : null;
|
|
79
|
+
default:
|
|
80
|
+
return APIResources.getAPIResource(state.apiResources, resourceType, resourceId, locale);
|
|
81
|
+
}
|
|
52
82
|
}
|
|
53
83
|
async function fetchJson(url) {
|
|
54
84
|
const response = await fetch(url, {
|
|
55
|
-
headers: { "Content-Type": "application/json" }
|
|
85
|
+
headers: { "Content-Type": "application/json" },
|
|
86
|
+
next: { tags: [import_site_published.MAKESWIFT_CACHE_TAG] }
|
|
56
87
|
});
|
|
57
88
|
if (response.status === 404)
|
|
58
89
|
return null;
|
|
@@ -68,8 +99,8 @@ async function fetchJson(url) {
|
|
|
68
99
|
function fetchAPIResource(resourceType, resourceId, locale) {
|
|
69
100
|
return async (dispatch, getState) => {
|
|
70
101
|
const state = getState();
|
|
71
|
-
if (getHasAPIResource(state, resourceType, resourceId)) {
|
|
72
|
-
return getAPIResource(state, resourceType, resourceId);
|
|
102
|
+
if (getHasAPIResource(state, resourceType, resourceId, locale)) {
|
|
103
|
+
return getAPIResource(state, resourceType, resourceId, locale);
|
|
73
104
|
}
|
|
74
105
|
let resource;
|
|
75
106
|
switch (resourceType) {
|
|
@@ -88,15 +119,25 @@ function fetchAPIResource(resourceType, resourceId, locale) {
|
|
|
88
119
|
case import_api.APIResourceType.LocalizedGlobalElement: {
|
|
89
120
|
if (locale == null)
|
|
90
121
|
throw new Error("Locale is required to fetch LocalizedGlobalElement");
|
|
122
|
+
if (getLocalizedResourceId(state, locale, resourceId) === null) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
91
125
|
resource = await fetchJson(
|
|
92
126
|
`/api/makeswift/localized-global-elements/${resourceId}/${locale}`
|
|
93
127
|
);
|
|
128
|
+
dispatch(
|
|
129
|
+
(0, import_actions.setLocalizedResourceId)({
|
|
130
|
+
locale,
|
|
131
|
+
resourceId,
|
|
132
|
+
localizedResourceId: resource?.id ?? null
|
|
133
|
+
})
|
|
134
|
+
);
|
|
94
135
|
break;
|
|
95
136
|
}
|
|
96
137
|
case import_api.APIResourceType.PagePathnameSlice: {
|
|
97
138
|
const url = new URL(`/api/makeswift/page-pathname-slices/${resourceId}`, "http://n");
|
|
98
139
|
if (locale != null)
|
|
99
|
-
url.searchParams.set("locale", locale
|
|
140
|
+
url.searchParams.set("locale", locale);
|
|
100
141
|
resource = await fetchJson(url.pathname + url.search);
|
|
101
142
|
break;
|
|
102
143
|
}
|
|
@@ -106,19 +147,58 @@ function fetchAPIResource(resourceType, resourceId, locale) {
|
|
|
106
147
|
default:
|
|
107
148
|
resource = null;
|
|
108
149
|
}
|
|
109
|
-
dispatch((0, import_actions.apiResourceFulfilled)(resourceType, resourceId, resource));
|
|
150
|
+
dispatch((0, import_actions.apiResourceFulfilled)(resourceType, resourceId, resource, locale));
|
|
110
151
|
return resource;
|
|
111
152
|
};
|
|
112
153
|
}
|
|
113
|
-
function
|
|
114
|
-
return (
|
|
154
|
+
function defaultLocaleMiddleware(defaultLocale) {
|
|
155
|
+
return () => (next) => {
|
|
156
|
+
return (action) => {
|
|
157
|
+
switch (action.type) {
|
|
158
|
+
case import_actions.ActionTypes.CHANGE_API_RESOURCE:
|
|
159
|
+
case import_actions.ActionTypes.EVICT_API_RESOURCE:
|
|
160
|
+
case import_actions.ActionTypes.SET_LOCALIZED_RESOURCE_ID: {
|
|
161
|
+
const { locale } = action.payload;
|
|
162
|
+
return next({
|
|
163
|
+
...action,
|
|
164
|
+
payload: { ...action.payload, locale: locale ?? defaultLocale }
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return next(action);
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function configureStore({
|
|
173
|
+
defaultLocale,
|
|
174
|
+
serializedState
|
|
175
|
+
}) {
|
|
176
|
+
const composeEnhancers = (0, import_extension.composeWithDevToolsDevelopmentOnly)({
|
|
177
|
+
name: `API client store (${(/* @__PURE__ */ new Date()).toISOString()})`,
|
|
178
|
+
serialize: true,
|
|
179
|
+
stateSanitizer: (state) => (0, import_serializeState.serializeState)(state),
|
|
180
|
+
actionsDenylist: [
|
|
181
|
+
import_actions.ActionTypes.BUILDER_POINTER_MOVE,
|
|
182
|
+
import_actions.ActionTypes.HANDLE_POINTER_MOVE,
|
|
183
|
+
import_actions.ActionTypes.ELEMENT_FROM_POINT_CHANGE
|
|
184
|
+
]
|
|
185
|
+
});
|
|
186
|
+
return (0, import_redux.createStore)(
|
|
187
|
+
reducer,
|
|
188
|
+
{
|
|
189
|
+
apiResources: APIResources.getInitialState(serializedState?.apiResources),
|
|
190
|
+
localizedResourcesMap: LocalizedResourcesMap.getInitialState(
|
|
191
|
+
serializedState?.localizedResourcesMap
|
|
192
|
+
)
|
|
193
|
+
},
|
|
194
|
+
composeEnhancers((0, import_redux.applyMiddleware)(import_redux_thunk.default, defaultLocaleMiddleware(defaultLocale)))
|
|
195
|
+
);
|
|
115
196
|
}
|
|
116
197
|
// Annotate the CommonJS export names for ESM import in node:
|
|
117
198
|
0 && (module.exports = {
|
|
118
199
|
configureStore,
|
|
119
200
|
fetchAPIResource,
|
|
120
201
|
getAPIResource,
|
|
121
|
-
getHasAPIResource
|
|
122
|
-
getSerializedState
|
|
202
|
+
getHasAPIResource
|
|
123
203
|
});
|
|
124
204
|
//# sourceMappingURL=makeswift-api-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/state/makeswift-api-client.ts"],"sourcesContent":["import { applyMiddleware, createStore, Store as ReduxStore } from 'redux'\nimport thunk, { ThunkAction, ThunkDispatch } from 'redux-thunk'\n\nimport * as APIResources from './modules/api-resources'\nimport { Action, apiResourceFulfilled } from './actions'\nimport {\n APIResource,\n APIResourceType,\n Swatch,\n File,\n Typography,\n GlobalElement,\n PagePathnameSlice,\n Table,\n LocalizedGlobalElement,\n} from '../api'\n\nconst reducer = APIResources.reducer\n\nexport type State = ReturnType<typeof reducer>\n\nexport type SerializedState = APIResources.SerializedState\n\nexport function getSerializedState(state: State): SerializedState {\n return APIResources.getSerializedState(state)\n}\n\nexport function getHasAPIResource(\n state: State,\n resourceType: APIResourceType,\n resourceId: string,\n): boolean {\n return APIResources.getHasAPIResource(state, resourceType, resourceId)\n}\n\nexport function getAPIResource<T extends APIResourceType>(\n state: State,\n resourceType: T,\n resourceId: string,\n): Extract<APIResource, { __typename: T }> | null {\n return APIResources.getAPIResource(state, resourceType, resourceId)\n}\n\ntype Thunk<ReturnType> = ThunkAction<ReturnType, State, unknown, Action>\n\nasync function fetchJson<T>(url: string): Promise<T | null> {\n const response = await fetch(url, {\n headers: { 'Content-Type': 'application/json' },\n })\n\n if (response.status === 404) return null\n\n if (!response.ok) throw new Error(response.statusText)\n\n if (response.headers.get('content-type')?.includes('application/json') !== true) {\n throw new Error(\n `Expected JSON response from \"${url}\" but got \"${response.headers.get('content-type')}\"`,\n )\n }\n\n return response.json()\n}\n\nexport function fetchAPIResource<T extends APIResourceType>(\n resourceType: T,\n resourceId: string,\n locale?: Intl.Locale,\n): Thunk<Promise<Extract<APIResource, { __typename: T }> | null>> {\n return async (dispatch, getState) => {\n const state = getState()\n\n if (getHasAPIResource(state, resourceType, resourceId)) {\n return getAPIResource(state, resourceType, resourceId)\n }\n\n let resource: APIResource | null\n\n switch (resourceType) {\n case APIResourceType.Swatch:\n resource = await fetchJson<Swatch>(`/api/makeswift/swatches/${resourceId}`)\n break\n\n case APIResourceType.File:\n resource = await fetchJson<File>(`/api/makeswift/files/${resourceId}`)\n break\n\n case APIResourceType.Typography:\n resource = await fetchJson<Typography>(`/api/makeswift/typographies/${resourceId}`)\n break\n\n case APIResourceType.GlobalElement:\n resource = await fetchJson<GlobalElement>(`/api/makeswift/global-elements/${resourceId}`)\n break\n\n case APIResourceType.LocalizedGlobalElement: {\n if (locale == null) throw new Error('Locale is required to fetch LocalizedGlobalElement')\n\n resource = await fetchJson<LocalizedGlobalElement>(\n `/api/makeswift/localized-global-elements/${resourceId}/${locale}`,\n )\n break\n }\n\n case APIResourceType.PagePathnameSlice: {\n const url = new URL(`/api/makeswift/page-pathname-slices/${resourceId}`, 'http://n')\n\n if (locale != null) url.searchParams.set('locale', locale.toString())\n\n resource = await fetchJson<PagePathnameSlice>(url.pathname + url.search)\n break\n }\n\n case APIResourceType.Table:\n resource = await fetchJson<Table>(`/api/makeswift/tables/${resourceId}`)\n break\n\n default:\n resource = null\n }\n\n dispatch(apiResourceFulfilled(resourceType, resourceId, resource))\n\n return resource as Extract<APIResource, { __typename: T }> | null\n }\n}\n\nexport type Dispatch = ThunkDispatch<State, unknown, Action>\n\nexport type Store = ReduxStore<State, Action> & { dispatch: Dispatch }\n\nexport function configureStore({ serializedState }: { serializedState?: SerializedState }): Store {\n return createStore(reducer, APIResources.getInitialState(serializedState), applyMiddleware(thunk))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkE;AAClE,yBAAkD;AAElD,mBAA8B;AAC9B,qBAA6C;AAC7C,iBAUO;AAEP,MAAM,UAAU,aAAa;AAMtB,SAAS,mBAAmB,OAA+B;AAChE,SAAO,aAAa,mBAAmB,KAAK;AAC9C;AAEO,SAAS,kBACd,OACA,cACA,YACS;AACT,SAAO,aAAa,kBAAkB,OAAO,cAAc,UAAU;AACvE;AAEO,SAAS,eACd,OACA,cACA,YACgD;AAChD,SAAO,aAAa,eAAe,OAAO,cAAc,UAAU;AACpE;AAIA,eAAe,UAAa,KAAgC;AAC1D,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,EAChD,CAAC;AAED,MAAI,SAAS,WAAW;AAAK,WAAO;AAEpC,MAAI,CAAC,SAAS;AAAI,UAAM,IAAI,MAAM,SAAS,UAAU;AAErD,MAAI,SAAS,QAAQ,IAAI,cAAc,GAAG,SAAS,kBAAkB,MAAM,MAAM;AAC/E,UAAM,IAAI;AAAA,MACR,gCAAgC,GAAG,cAAc,SAAS,QAAQ,IAAI,cAAc,CAAC;AAAA,IACvF;AAAA,EACF;AAEA,SAAO,SAAS,KAAK;AACvB;AAEO,SAAS,iBACd,cACA,YACA,QACgE;AAChE,SAAO,OAAO,UAAU,aAAa;AACnC,UAAM,QAAQ,SAAS;AAEvB,QAAI,kBAAkB,OAAO,cAAc,UAAU,GAAG;AACtD,aAAO,eAAe,OAAO,cAAc,UAAU;AAAA,IACvD;AAEA,QAAI;AAEJ,YAAQ,cAAc;AAAA,MACpB,KAAK,2BAAgB;AACnB,mBAAW,MAAM,UAAkB,2BAA2B,UAAU,EAAE;AAC1E;AAAA,MAEF,KAAK,2BAAgB;AACnB,mBAAW,MAAM,UAAgB,wBAAwB,UAAU,EAAE;AACrE;AAAA,MAEF,KAAK,2BAAgB;AACnB,mBAAW,MAAM,UAAsB,+BAA+B,UAAU,EAAE;AAClF;AAAA,MAEF,KAAK,2BAAgB;AACnB,mBAAW,MAAM,UAAyB,kCAAkC,UAAU,EAAE;AACxF;AAAA,MAEF,KAAK,2BAAgB,wBAAwB;AAC3C,YAAI,UAAU;AAAM,gBAAM,IAAI,MAAM,oDAAoD;AAExF,mBAAW,MAAM;AAAA,UACf,4CAA4C,UAAU,IAAI,MAAM;AAAA,QAClE;AACA;AAAA,MACF;AAAA,MAEA,KAAK,2BAAgB,mBAAmB;AACtC,cAAM,MAAM,IAAI,IAAI,uCAAuC,UAAU,IAAI,UAAU;AAEnF,YAAI,UAAU;AAAM,cAAI,aAAa,IAAI,UAAU,OAAO,SAAS,CAAC;AAEpE,mBAAW,MAAM,UAA6B,IAAI,WAAW,IAAI,MAAM;AACvE;AAAA,MACF;AAAA,MAEA,KAAK,2BAAgB;AACnB,mBAAW,MAAM,UAAiB,yBAAyB,UAAU,EAAE;AACvE;AAAA,MAEF;AACE,mBAAW;AAAA,IACf;AAEA,iBAAS,qCAAqB,cAAc,YAAY,QAAQ,CAAC;AAEjE,WAAO;AAAA,EACT;AACF;AAMO,SAAS,eAAe,EAAE,gBAAgB,GAAiD;AAChG,aAAO,0BAAY,SAAS,aAAa,gBAAgB,eAAe,OAAG,8BAAgB,mBAAAA,OAAK,CAAC;AACnG;","names":["thunk"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/state/makeswift-api-client.ts"],"sourcesContent":["import {\n applyMiddleware,\n createStore,\n combineReducers,\n type Dispatch as ReduxDispatch,\n type Store as ReduxStore,\n type Middleware,\n} from 'redux'\nimport thunk, { type ThunkAction, type ThunkDispatch } from 'redux-thunk'\n\nimport { composeWithDevToolsDevelopmentOnly } from '@redux-devtools/extension'\n\nimport { serializeState } from '../utils/serializeState'\n\nimport * as APIResources from './modules/api-resources'\nimport * as LocalizedResourcesMap from './modules/localized-resources-map'\nimport { type Action, ActionTypes, apiResourceFulfilled, setLocalizedResourceId } from './actions'\nimport {\n APIResourceType,\n type APIResource,\n type Swatch,\n type File,\n type Typography,\n type GlobalElement,\n type PagePathnameSlice,\n type Table,\n type LocalizedGlobalElement,\n type APIResourceLocale,\n} from '../api'\nimport { MAKESWIFT_CACHE_TAG } from '../next/api-handler/handlers/webhook/site-published'\n\nconst reducer = combineReducers({\n apiResources: APIResources.reducer,\n localizedResourcesMap: LocalizedResourcesMap.reducer,\n})\n\nexport type State = ReturnType<typeof reducer>\n\nexport type SerializedState = {\n apiResources: APIResources.SerializedState\n localizedResourcesMap: LocalizedResourcesMap.SerializedState\n}\n\nfunction getLocalizedResourceId(\n state: State,\n locale: string,\n resourceId: string,\n): string | undefined | null {\n return LocalizedResourcesMap.getLocalizedResourceId(\n state.localizedResourcesMap,\n locale,\n resourceId,\n )\n}\n\nexport function getHasAPIResource<T extends APIResourceType>(\n state: State,\n resourceType: APIResourceType,\n resourceId: string,\n locale?: APIResourceLocale<T>,\n): boolean {\n switch (resourceType) {\n case APIResourceType.LocalizedGlobalElement:\n if (locale == null) {\n console.error(`Attempt to access ${resourceType} ${resourceId} without a locale`)\n return false\n }\n\n const localizedId = getLocalizedResourceId(state, locale, resourceId)\n return (\n localizedId != null &&\n APIResources.getHasAPIResource(state.apiResources, resourceType, localizedId, locale)\n )\n\n default:\n return APIResources.getHasAPIResource(state.apiResources, resourceType, resourceId, locale)\n }\n}\n\nexport function getAPIResource<T extends APIResourceType>(\n state: State,\n resourceType: T,\n resourceId: string,\n locale?: APIResourceLocale<T>,\n): Extract<APIResource, { __typename: T }> | null {\n switch (resourceType) {\n case APIResourceType.LocalizedGlobalElement:\n if (locale == null) {\n console.error(`Attempt to access ${resourceType} ${resourceId} without a locale`)\n return null\n }\n\n const localizedId = getLocalizedResourceId(state, locale, resourceId)\n return localizedId != null\n ? APIResources.getAPIResource(state.apiResources, resourceType, localizedId, locale)\n : null\n\n default:\n return APIResources.getAPIResource(state.apiResources, resourceType, resourceId, locale)\n }\n}\n\ntype Thunk<ReturnType> = ThunkAction<ReturnType, State, unknown, Action>\n\nasync function fetchJson<T>(url: string): Promise<T | null> {\n const response = await fetch(url, {\n headers: { 'Content-Type': 'application/json' },\n next: { tags: [MAKESWIFT_CACHE_TAG] },\n })\n\n if (response.status === 404) return null\n\n if (!response.ok) throw new Error(response.statusText)\n\n if (response.headers.get('content-type')?.includes('application/json') !== true) {\n throw new Error(\n `Expected JSON response from \"${url}\" but got \"${response.headers.get('content-type')}\"`,\n )\n }\n\n return response.json()\n}\n\nexport function fetchAPIResource<T extends APIResourceType>(\n resourceType: T,\n resourceId: string,\n locale?: APIResourceLocale<T>,\n): Thunk<Promise<Extract<APIResource, { __typename: T }> | null>> {\n return async (dispatch, getState) => {\n const state = getState()\n\n if (getHasAPIResource(state, resourceType, resourceId, locale)) {\n return getAPIResource(state, resourceType, resourceId, locale)\n }\n\n let resource: APIResource | null\n\n switch (resourceType) {\n case APIResourceType.Swatch:\n resource = await fetchJson<Swatch>(`/api/makeswift/swatches/${resourceId}`)\n break\n\n case APIResourceType.File:\n resource = await fetchJson<File>(`/api/makeswift/files/${resourceId}`)\n break\n\n case APIResourceType.Typography:\n resource = await fetchJson<Typography>(`/api/makeswift/typographies/${resourceId}`)\n break\n\n case APIResourceType.GlobalElement:\n resource = await fetchJson<GlobalElement>(`/api/makeswift/global-elements/${resourceId}`)\n break\n\n case APIResourceType.LocalizedGlobalElement: {\n if (locale == null) throw new Error('Locale is required to fetch LocalizedGlobalElement')\n\n // If `getLocalizedResourceId` returns null, it means we have tried to fetch the resource,\n // but the resource is not available. If we haven't fetched it yet, it'll return undefined.\n if (getLocalizedResourceId(state, locale, resourceId) === null) {\n return null\n }\n\n resource = await fetchJson<LocalizedGlobalElement>(\n `/api/makeswift/localized-global-elements/${resourceId}/${locale}`,\n )\n\n dispatch(\n setLocalizedResourceId({\n locale,\n resourceId,\n localizedResourceId: resource?.id ?? null,\n }),\n )\n\n break\n }\n\n case APIResourceType.PagePathnameSlice: {\n const url = new URL(`/api/makeswift/page-pathname-slices/${resourceId}`, 'http://n')\n\n if (locale != null) url.searchParams.set('locale', locale)\n\n resource = await fetchJson<PagePathnameSlice>(url.pathname + url.search)\n break\n }\n\n case APIResourceType.Table:\n resource = await fetchJson<Table>(`/api/makeswift/tables/${resourceId}`)\n break\n\n default:\n resource = null\n }\n\n dispatch(apiResourceFulfilled(resourceType, resourceId, resource, locale))\n\n return resource as Extract<APIResource, { __typename: T }> | null\n }\n}\n\nexport type Dispatch = ThunkDispatch<State, unknown, Action>\n\nexport type Store = ReduxStore<State, Action> & { dispatch: Dispatch }\n\n// FIXME: this middleware can be removed once we've upgraded the builder\n// to always provide the locale when dispatching resource actions\nfunction defaultLocaleMiddleware(\n defaultLocale: string | undefined,\n): Middleware<Dispatch, State, Dispatch> {\n return () => (next: ReduxDispatch<Action>) => {\n return (action: Action): Action => {\n switch (action.type) {\n case ActionTypes.CHANGE_API_RESOURCE:\n case ActionTypes.EVICT_API_RESOURCE:\n case ActionTypes.SET_LOCALIZED_RESOURCE_ID: {\n const { locale } = action.payload\n return next({\n ...action,\n payload: { ...action.payload, locale: locale ?? defaultLocale },\n } as Action)\n }\n }\n\n return next(action)\n }\n }\n}\n\nexport function configureStore({\n defaultLocale,\n serializedState,\n}: {\n defaultLocale: string | undefined\n serializedState?: SerializedState\n}): Store {\n const composeEnhancers = composeWithDevToolsDevelopmentOnly({\n name: `API client store (${new Date().toISOString()})`,\n serialize: true,\n stateSanitizer: (state: any) => serializeState(state),\n actionsDenylist: [\n ActionTypes.BUILDER_POINTER_MOVE,\n ActionTypes.HANDLE_POINTER_MOVE,\n ActionTypes.ELEMENT_FROM_POINT_CHANGE,\n ],\n })\n\n return createStore(\n reducer,\n {\n apiResources: APIResources.getInitialState(serializedState?.apiResources),\n localizedResourcesMap: LocalizedResourcesMap.getInitialState(\n serializedState?.localizedResourcesMap,\n ),\n },\n composeEnhancers(applyMiddleware(thunk, defaultLocaleMiddleware(defaultLocale))),\n )\n}\n"],"mappings":"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","names":["thunk"]}
|
package/dist/cjs/{runtimes/react/hooks/use-document-key.js → state/mixins/setup-teardown.js}
RENAMED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
"use client";
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -17,20 +16,20 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
16
|
return to;
|
|
18
17
|
};
|
|
19
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
-
var
|
|
21
|
-
__export(
|
|
22
|
-
|
|
23
|
-
useDocumentKey: () => useDocumentKey
|
|
19
|
+
var setup_teardown_exports = {};
|
|
20
|
+
__export(setup_teardown_exports, {
|
|
21
|
+
withSetupTeardown: () => withSetupTeardown
|
|
24
22
|
});
|
|
25
|
-
module.exports = __toCommonJS(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
module.exports = __toCommonJS(setup_teardown_exports);
|
|
24
|
+
function withSetupTeardown(setup, teardown) {
|
|
25
|
+
return (next) => (reducer, preloadedState) => ({
|
|
26
|
+
...next(reducer, preloadedState),
|
|
27
|
+
setup,
|
|
28
|
+
teardown
|
|
29
|
+
});
|
|
30
30
|
}
|
|
31
31
|
// Annotate the CommonJS export names for ESM import in node:
|
|
32
32
|
0 && (module.exports = {
|
|
33
|
-
|
|
34
|
-
useDocumentKey
|
|
33
|
+
withSetupTeardown
|
|
35
34
|
});
|
|
36
|
-
//# sourceMappingURL=
|
|
35
|
+
//# sourceMappingURL=setup-teardown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/state/mixins/setup-teardown.ts"],"sourcesContent":["import { StoreEnhancer } from 'redux'\n\nexport interface SetupTeardownMixin {\n setup: () => void\n teardown: () => void\n}\n\nexport function withSetupTeardown(\n setup: () => void,\n teardown: () => void,\n): StoreEnhancer<SetupTeardownMixin> {\n return next => (reducer, preloadedState?) => ({\n ...next(reducer, preloadedState),\n setup,\n teardown,\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,SAAS,kBACd,OACA,UACmC;AACnC,SAAO,UAAQ,CAAC,SAAS,oBAAqB;AAAA,IAC5C,GAAG,KAAK,SAAS,cAAc;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -38,6 +38,19 @@ module.exports = __toCommonJS(api_resources_exports);
|
|
|
38
38
|
var import_api = require("../../api");
|
|
39
39
|
var import_deepEqual = __toESM(require("../../utils/deepEqual"));
|
|
40
40
|
var import_actions = require("../actions");
|
|
41
|
+
function isValidAPIResourceType(resourceType) {
|
|
42
|
+
return resourceType in import_api.APIResourceType;
|
|
43
|
+
}
|
|
44
|
+
function isLocalizableAPIResourceType(resourceType) {
|
|
45
|
+
return resourceType in import_api.LocalizableAPIResourceType;
|
|
46
|
+
}
|
|
47
|
+
function compositeId(resourceId, resourceType, locale) {
|
|
48
|
+
return locale != null && isLocalizableAPIResourceType(resourceType) ? `${resourceId}@${locale}` : resourceId;
|
|
49
|
+
}
|
|
50
|
+
function parseCompositeId(compositeId2) {
|
|
51
|
+
const [resourceId, locale] = compositeId2.split("@");
|
|
52
|
+
return [resourceId, locale ?? null];
|
|
53
|
+
}
|
|
41
54
|
function getInitialState(serializedState = {
|
|
42
55
|
Swatch: [],
|
|
43
56
|
File: [],
|
|
@@ -51,9 +64,14 @@ function getInitialState(serializedState = {
|
|
|
51
64
|
LocalizedGlobalElement: []
|
|
52
65
|
}) {
|
|
53
66
|
return new Map(
|
|
54
|
-
Object.entries(serializedState).map(([
|
|
55
|
-
|
|
56
|
-
new Map(
|
|
67
|
+
Object.entries(serializedState).map(([resourceType, resources]) => [
|
|
68
|
+
resourceType,
|
|
69
|
+
new Map(
|
|
70
|
+
resources.map(({ id, value, locale }) => [
|
|
71
|
+
compositeId(id, resourceType, locale),
|
|
72
|
+
value
|
|
73
|
+
])
|
|
74
|
+
)
|
|
57
75
|
])
|
|
58
76
|
);
|
|
59
77
|
}
|
|
@@ -72,53 +90,73 @@ function getSerializedState(state) {
|
|
|
72
90
|
};
|
|
73
91
|
Array.from(state.entries()).forEach(([resourceType, resources]) => {
|
|
74
92
|
const particularResourceMap = [];
|
|
75
|
-
Array.from(resources.entries()).forEach(([
|
|
93
|
+
Array.from(resources.entries()).forEach(([compositeId2, value]) => {
|
|
76
94
|
if (value != null) {
|
|
77
|
-
|
|
95
|
+
const [id, locale] = parseCompositeId(compositeId2);
|
|
96
|
+
console.assert(
|
|
97
|
+
locale == null || isLocalizableAPIResourceType(resourceType),
|
|
98
|
+
`Unexpected locale for non-localizable resource type ${resourceType}`,
|
|
99
|
+
{ id, locale }
|
|
100
|
+
);
|
|
101
|
+
particularResourceMap.push(locale != null ? { id, value, locale } : { id, value });
|
|
78
102
|
}
|
|
79
103
|
});
|
|
80
104
|
resourceMap[resourceType] = particularResourceMap;
|
|
81
105
|
});
|
|
82
106
|
return resourceMap;
|
|
83
107
|
}
|
|
84
|
-
function getHasAPIResource(state, resourceType, resourceId) {
|
|
85
|
-
return state.get(resourceType)?.has(resourceId) ?? false;
|
|
108
|
+
function getHasAPIResource(state, resourceType, resourceId, locale) {
|
|
109
|
+
return state.get(resourceType)?.has(compositeId(resourceId, resourceType, locale)) ?? false;
|
|
86
110
|
}
|
|
87
|
-
function getAPIResource(state, resourceType, resourceId) {
|
|
88
|
-
const resource = state.get(resourceType)?.get(resourceId);
|
|
111
|
+
function getAPIResource(state, resourceType, resourceId, locale) {
|
|
112
|
+
const resource = state.get(resourceType)?.get(compositeId(resourceId, resourceType, locale));
|
|
89
113
|
return resource?.__typename === resourceType ? resource : null;
|
|
90
114
|
}
|
|
91
115
|
function reducer(state = getInitialState(), action) {
|
|
92
116
|
switch (action.type) {
|
|
117
|
+
case import_actions.ActionTypes.UPDATE_API_CLIENT_CACHE: {
|
|
118
|
+
const { apiResources } = action.payload;
|
|
119
|
+
return Object.entries(apiResources).reduce((state2, [resourceType, cachedResources]) => {
|
|
120
|
+
const resType = resourceType;
|
|
121
|
+
const cached = cachedResources;
|
|
122
|
+
const existing = state2.get(resType) ?? /* @__PURE__ */ new Map();
|
|
123
|
+
const updated = cached?.reduce((r, { id, value, locale }) => {
|
|
124
|
+
const cid = compositeId(id, resType, locale);
|
|
125
|
+
return r.get(cid) != null ? r : new Map(r).set(cid, value);
|
|
126
|
+
}, existing);
|
|
127
|
+
return updated == null || updated === existing ? state2 : new Map(state2).set(resType, updated);
|
|
128
|
+
}, state);
|
|
129
|
+
}
|
|
93
130
|
case import_actions.ActionTypes.API_RESOURCE_FULFILLED: {
|
|
94
|
-
const { resourceType, resourceId, resource } = action.payload;
|
|
131
|
+
const { resourceType, resourceId, resource, locale } = action.payload;
|
|
95
132
|
return new Map(state).set(
|
|
96
133
|
resourceType,
|
|
97
|
-
new Map(state.get(resourceType)).set(
|
|
134
|
+
new Map(state.get(resourceType)).set(
|
|
135
|
+
compositeId(resourceId, resourceType, locale),
|
|
136
|
+
resource
|
|
137
|
+
)
|
|
98
138
|
);
|
|
99
139
|
}
|
|
100
140
|
case import_actions.ActionTypes.CHANGE_API_RESOURCE: {
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
action.payload.resource.id
|
|
105
|
-
);
|
|
106
|
-
if ((0, import_deepEqual.default)(existingApiResource, action.payload.resource))
|
|
141
|
+
const { resource, locale } = action.payload;
|
|
142
|
+
const existingApiResource = getAPIResource(state, resource.__typename, resource.id, locale);
|
|
143
|
+
if ((0, import_deepEqual.default)(existingApiResource, resource))
|
|
107
144
|
return state;
|
|
108
145
|
return new Map(state).set(
|
|
109
|
-
|
|
110
|
-
new Map(state.get(
|
|
111
|
-
|
|
112
|
-
|
|
146
|
+
resource.__typename,
|
|
147
|
+
new Map(state.get(resource.__typename)).set(
|
|
148
|
+
compositeId(resource.id, resource.__typename, locale),
|
|
149
|
+
resource
|
|
113
150
|
)
|
|
114
151
|
);
|
|
115
152
|
}
|
|
116
153
|
case import_actions.ActionTypes.EVICT_API_RESOURCE: {
|
|
117
|
-
const
|
|
118
|
-
|
|
154
|
+
const { id, locale } = action.payload;
|
|
155
|
+
const [resourceType, resourceId] = id.split(":");
|
|
156
|
+
if (!isValidAPIResourceType(resourceType))
|
|
119
157
|
return state;
|
|
120
158
|
const resources = new Map(state.get(resourceType));
|
|
121
|
-
const deleted = resources.delete(resourceId);
|
|
159
|
+
const deleted = resources.delete(compositeId(resourceId, resourceType, locale));
|
|
122
160
|
return deleted ? new Map(state).set(resourceType, resources) : state;
|
|
123
161
|
}
|
|
124
162
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/state/modules/api-resources.ts"],"sourcesContent":["import { APIResource
|
|
1
|
+
{"version":3,"sources":["../../../../src/state/modules/api-resources.ts"],"sourcesContent":["import {\n APIResourceType,\n APIResourceLocale,\n LocalizableAPIResourceType,\n type APIResource,\n} from '../../api'\n\nimport deepEqual from '../../utils/deepEqual'\nimport { Branded } from '../../utils/branded'\n\nimport { type Action, ActionTypes } from '../actions'\n\ntype CompositeResourceId = Branded<string, 'CompositeResourceId'>\n\nfunction isValidAPIResourceType(resourceType: string): resourceType is APIResourceType {\n return resourceType in APIResourceType\n}\n\nfunction isLocalizableAPIResourceType(\n resourceType: APIResourceType,\n): resourceType is LocalizableAPIResourceType {\n return resourceType in LocalizableAPIResourceType\n}\n\nfunction compositeId(\n resourceId: string,\n resourceType: APIResourceType,\n locale?: string | null,\n): CompositeResourceId {\n return (\n locale != null && isLocalizableAPIResourceType(resourceType)\n ? `${resourceId}@${locale}`\n : resourceId\n ) as CompositeResourceId\n}\n\nfunction parseCompositeId(compositeId: CompositeResourceId): [string, string | null] {\n const [resourceId, locale] = compositeId.split('@')\n return [resourceId, locale ?? null]\n}\n\nexport type State = Map<APIResourceType, Map<CompositeResourceId, APIResource | null>>\n\nexport type SerializedState = {\n [key in APIResourceType]?: {\n id: string\n value: Extract<APIResource, { __typename: key }> | null\n locale?: APIResourceLocale<key>\n }[]\n}\n\nexport function getInitialState(\n serializedState: SerializedState = {\n Swatch: [],\n File: [],\n Typography: [],\n PagePathnameSlice: [],\n GlobalElement: [],\n Table: [],\n Snippet: [],\n Page: [],\n Site: [],\n LocalizedGlobalElement: [],\n },\n): State {\n return new Map(\n Object.entries(serializedState).map(([resourceType, resources]) => [\n resourceType,\n new Map(\n resources.map(({ id, value, locale }) => [\n compositeId(id, resourceType as APIResourceType, locale),\n value,\n ]),\n ),\n ]),\n ) as State\n}\n\nexport function getSerializedState(state: State): SerializedState {\n const resourceMap: SerializedState = {\n Swatch: [],\n File: [],\n Typography: [],\n PagePathnameSlice: [],\n GlobalElement: [],\n Table: [],\n Snippet: [],\n Page: [],\n Site: [],\n LocalizedGlobalElement: [],\n }\n\n Array.from(state.entries()).forEach(([resourceType, resources]) => {\n const particularResourceMap: { id: string; value: any; locale?: any }[] = []\n\n Array.from(resources.entries()).forEach(([compositeId, value]) => {\n if (value != null) {\n const [id, locale] = parseCompositeId(compositeId)\n console.assert(\n locale == null || isLocalizableAPIResourceType(resourceType),\n `Unexpected locale for non-localizable resource type ${resourceType}`,\n { id, locale },\n )\n\n particularResourceMap.push(locale != null ? { id, value, locale } : { id, value })\n }\n })\n\n resourceMap[resourceType] = particularResourceMap\n })\n\n return resourceMap\n}\n\nexport function getHasAPIResource<T extends APIResourceType>(\n state: State,\n resourceType: T,\n resourceId: string,\n locale?: APIResourceLocale<T>,\n): boolean {\n return state.get(resourceType)?.has(compositeId(resourceId, resourceType, locale)) ?? false\n}\n\nexport function getAPIResource<T extends APIResourceType>(\n state: State,\n resourceType: T,\n resourceId: string,\n locale?: APIResourceLocale<T>,\n): Extract<APIResource, { __typename: T }> | null {\n const resource = state.get(resourceType)?.get(compositeId(resourceId, resourceType, locale))\n\n return resource?.__typename === resourceType\n ? (resource as Extract<typeof resource, { __typename: T }>)\n : null\n}\n\nexport function reducer(state: State = getInitialState(), action: Action): State {\n switch (action.type) {\n case ActionTypes.UPDATE_API_CLIENT_CACHE: {\n const { apiResources } = action.payload\n\n return Object.entries(apiResources).reduce((state, [resourceType, cachedResources]) => {\n const resType = resourceType as APIResourceType\n const cached:\n | { id: string; value: APIResource | null; locale?: string | null }[]\n | undefined = cachedResources\n\n const existing = state.get(resType) ?? new Map<CompositeResourceId, APIResource | null>()\n const updated = cached?.reduce((r, { id, value, locale }) => {\n const cid = compositeId(id, resType, locale)\n return r.get(cid) != null ? r : new Map(r).set(cid, value)\n }, existing)\n\n return updated == null || updated === existing\n ? state\n : new Map(state).set(resType, updated)\n }, state)\n }\n\n case ActionTypes.API_RESOURCE_FULFILLED: {\n const { resourceType, resourceId, resource, locale } = action.payload\n return new Map(state).set(\n resourceType,\n new Map(state.get(resourceType)!).set(\n compositeId(resourceId, resourceType, locale),\n resource,\n ),\n )\n }\n\n case ActionTypes.CHANGE_API_RESOURCE: {\n const { resource, locale } = action.payload\n const existingApiResource = getAPIResource(state, resource.__typename, resource.id, locale)\n\n if (deepEqual(existingApiResource, resource)) return state\n\n return new Map(state).set(\n resource.__typename,\n new Map(state.get(resource.__typename)!).set(\n compositeId(resource.id, resource.__typename, locale),\n resource,\n ),\n )\n }\n\n case ActionTypes.EVICT_API_RESOURCE: {\n const { id, locale } = action.payload\n const [resourceType, resourceId] = id.split(':')\n\n if (!isValidAPIResourceType(resourceType)) return state\n\n const resources = new Map(state.get(resourceType as APIResourceType)!)\n\n const deleted = resources.delete(compositeId(resourceId, resourceType, locale))\n\n return deleted ? new Map(state).set(resourceType as APIResourceType, resources) : state\n }\n\n default:\n return state\n }\n}\n"],"mappings":"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","names":["compositeId","state","deepEqual"]}
|
|
@@ -31,14 +31,15 @@ __export(element_trees_exports, {
|
|
|
31
31
|
module.exports = __toCommonJS(element_trees_exports);
|
|
32
32
|
var import_immutable = require("immutable");
|
|
33
33
|
var import_controls = require("@makeswift/controls");
|
|
34
|
-
var import_actions = require("../actions");
|
|
35
34
|
var import_prop_controllers = require("../../prop-controllers");
|
|
36
|
-
|
|
35
|
+
var import_actions = require("../actions");
|
|
36
|
+
var import_read_only_documents = require("./read-only-documents");
|
|
37
|
+
function getInitialState(documents, descriptors) {
|
|
37
38
|
const state = /* @__PURE__ */ new Map();
|
|
38
|
-
if (
|
|
39
|
+
if (documents == null || descriptors == null)
|
|
39
40
|
return state;
|
|
40
|
-
for (const [documentKey,
|
|
41
|
-
state.set(documentKey, buildElementTree(
|
|
41
|
+
for (const [documentKey, document] of documents) {
|
|
42
|
+
state.set(documentKey, buildElementTree((0, import_read_only_documents.getRootElement)(document), descriptors));
|
|
42
43
|
}
|
|
43
44
|
return state;
|
|
44
45
|
}
|
|
@@ -61,7 +62,10 @@ function reducer(state = getInitialState(), action) {
|
|
|
61
62
|
switch (action.type) {
|
|
62
63
|
case import_actions.ActionTypes.CREATE_ELEMENT_TREE: {
|
|
63
64
|
const { document, descriptors } = action.payload;
|
|
64
|
-
return new Map(state).set(
|
|
65
|
+
return new Map(state).set(
|
|
66
|
+
document.key,
|
|
67
|
+
buildElementTree((0, import_read_only_documents.getRootElement)(document), descriptors)
|
|
68
|
+
);
|
|
65
69
|
}
|
|
66
70
|
case import_actions.ActionTypes.DELETE_ELEMENT_TREE: {
|
|
67
71
|
const nextState = new Map(state);
|
|
@@ -81,7 +85,10 @@ function reducer(state = getInitialState(), action) {
|
|
|
81
85
|
const updatedElementTree = applyChanges(
|
|
82
86
|
elementTree,
|
|
83
87
|
descriptors,
|
|
84
|
-
{
|
|
88
|
+
{
|
|
89
|
+
old: (0, import_read_only_documents.getRootElement)(oldDocument),
|
|
90
|
+
new: (0, import_read_only_documents.getRootElement)(newDocument)
|
|
91
|
+
},
|
|
85
92
|
operation
|
|
86
93
|
);
|
|
87
94
|
return new Map(state).set(documentKey, updatedElementTree);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/state/modules/element-trees.ts"],"sourcesContent":["import { type Operation } from 'ot-json0'\nimport { getIn } from 'immutable'\n\nimport { type Element, ElementData, isElementReference } from '@makeswift/controls'\n\nimport { type Action, ActionTypes } from '../actions'\nimport { Introspection } from '../../prop-controllers'\n\nimport { type DescriptorsByComponentType } from './prop-controllers'\n\nexport type ElementTree = {\n elements: Map<string, Element>\n elementIds: Map<string, string>\n}\n\nexport type State = Map<string, ElementTree>\n\nexport function getInitialState(\n rootElements?: Map<string, Element>,\n descriptors?: DescriptorsByComponentType,\n): State {\n const state = new Map<string, ElementTree>()\n if (rootElements == null || descriptors == null) return state\n\n for (const [documentKey, rootElement] of rootElements) {\n state.set(documentKey, buildElementTree(rootElement, descriptors))\n }\n\n return state\n}\n\nfunction getElementTree(state: State, id: string): ElementTree | null {\n return state.get(id) ?? null\n}\n\nexport function getElements(state: State, documentKey: string): Map<string, Element> {\n return getElementTree(state, documentKey)?.elements ?? new Map()\n}\n\nexport function getElementIds(state: State, documentKey: string): Map<string, string> {\n return getElementTree(state, documentKey)?.elementIds ?? new Map()\n}\n\nexport function getElement(state: State, documentKey: string, elementKey: string): Element | null {\n return getElements(state, documentKey).get(elementKey) ?? null\n}\n\nexport function getElementId(state: State, documentKey: string, elementKey: string): string | null {\n return getElementIds(state, documentKey).get(elementKey) ?? null\n}\n\nexport function reducer(state: State = getInitialState(), action: Action): State {\n switch (action.type) {\n case ActionTypes.CREATE_ELEMENT_TREE: {\n const { document, descriptors } = action.payload\n return new Map(state).set(document.key, buildElementTree(document.rootElement, descriptors))\n }\n\n case ActionTypes.DELETE_ELEMENT_TREE: {\n const nextState = new Map(state)\n const deleted = nextState.delete(action.payload.documentKey)\n return deleted ? nextState : state\n }\n\n case ActionTypes.CHANGE_ELEMENT_TREE: {\n const { oldDocument, newDocument, descriptors, operation } = action.payload\n const documentKey = oldDocument.key\n console.assert(\n documentKey === newDocument.key,\n `Mismatching document keys ${documentKey} !== ${newDocument.key}`,\n )\n\n const elementTree = state.get(documentKey)\n if (elementTree == null) return state\n\n const updatedElementTree = applyChanges(\n elementTree,\n descriptors,\n { old: oldDocument.rootElement, new: newDocument.rootElement },\n operation,\n )\n\n return new Map(state).set(documentKey, updatedElementTree)\n }\n\n default:\n return state\n }\n}\n\nexport function* traverseElementTree(\n element: Element,\n descriptors: DescriptorsByComponentType,\n): Generator<Element> {\n yield element\n if (isElementReference(element)) return\n\n const elementDescriptors = descriptors.get(element.type)\n if (elementDescriptors == null) return\n\n for (const [propKey, descriptor] of Object.entries(elementDescriptors)) {\n const children = Introspection.getElementChildren(descriptor, element.props[propKey])\n for (const child of children) {\n yield* traverseElementTree(child, descriptors)\n }\n }\n}\n\nfunction getElementIdProp(\n element: ElementData,\n descriptors: DescriptorsByComponentType,\n): string | null {\n const elementDescriptors = descriptors.get(element.type)\n if (elementDescriptors == null) return null\n\n for (const [propName, descriptor] of Object.entries(elementDescriptors)) {\n const elementId = Introspection.getElementId(descriptor, element.props[propName])\n if (elementId != null) return elementId\n }\n\n return null\n}\n\nexport function buildElementTree(\n rootElement: Element,\n descriptors: DescriptorsByComponentType,\n): ElementTree {\n const elements = new Map<string, Element>()\n const elementIds = new Map<string, string>()\n\n for (const element of traverseElementTree(rootElement, descriptors)) {\n elements.set(element.key, element)\n if (!isElementReference(element)) {\n const elementId = getElementIdProp(element, descriptors)\n if (elementId != null) elementIds.set(element.key, elementId)\n }\n }\n\n return {\n elements,\n elementIds,\n }\n}\n\ntype OperationPath = Operation[number]['p']\n\n// performance-sensitive function, intentionally not using `elementData` schema here\nfunction isElement(item: unknown): item is Element {\n return (\n typeof item === 'object' &&\n item != null &&\n 'key' in item &&\n 'type' in item &&\n typeof item.key === 'string' &&\n typeof item.type === 'string'\n )\n}\n\ntype ElementOperationPath = { elementPath: OperationPath; propName: string }\n\nfunction getElementOperationPath(path: OperationPath): ElementOperationPath {\n const i = path.findLastIndex(\n (fragment, i) =>\n typeof fragment === 'number' && (i === path.length - 1 || path[i + 1] === 'props'),\n )\n\n if (path.length === 0 || (i === -1 && path[0] !== 'props') || path.length - i < 3) {\n console.error('Operation path does not point to an element property', { path })\n return { elementPath: [], propName: 'children' }\n }\n\n return { elementPath: path.slice(0, i + 1), propName: `${path.slice(i + 1).at(1)}` }\n}\n\nexport function getChangedElementsPaths(\n path: OperationPath,\n): [ElementOperationPath, ...ElementOperationPath[]] {\n let elementOp = getElementOperationPath(path)\n const result: [ElementOperationPath, ...ElementOperationPath[]] = [elementOp]\n while (elementOp.elementPath.length > 0) {\n elementOp = getElementOperationPath(elementOp.elementPath.slice(0, -1))\n result.push(elementOp)\n }\n\n return result\n}\n\nfunction getElementByPath(rootElement: Element, elementPath: OperationPath): Element | null {\n const item = getIn(rootElement, elementPath)\n if (!isElement(item)) {\n console.error('Expected an element, got', item, {\n rootElement,\n elementPath,\n })\n\n return null\n }\n\n return item\n}\n\nfunction getElementAndPropName(\n rootElement: Element,\n { elementPath, propName }: ElementOperationPath,\n): [Element, string] {\n const element = getElementByPath(rootElement, elementPath)\n return element != null ? [element, propName] : [rootElement, 'children']\n}\n\nfunction updateParentElements(\n elements: ElementTree['elements'],\n elementPaths: ElementOperationPath[],\n rootElement: Element,\n): void {\n elementPaths.forEach(({ elementPath }) => {\n const element = getElementByPath(rootElement, elementPath)\n if (element != null) elements.set(element.key, element)\n })\n}\n\nfunction hasChildren(\n element: Element,\n propName: string,\n descriptors: DescriptorsByComponentType,\n): boolean {\n if (isElementReference(element)) return false\n\n const propDescriptor = descriptors.get(element.type)?.[propName]\n if (propDescriptor == null) return false\n\n const children = Introspection.getElementChildren(propDescriptor, element.props[propName])\n return children.length > 0\n}\n\nfunction deleteElement(\n { elements, elementIds }: ElementTree,\n deletedElement: Element,\n propName: string,\n descriptors: DescriptorsByComponentType,\n) {\n if (hasChildren(deletedElement, propName, descriptors)) {\n for (const element of traverseElementTree(deletedElement, descriptors)) {\n elements.delete(element.key)\n elementIds.delete(element.key)\n }\n } else {\n elements.delete(deletedElement.key)\n elementIds.delete(deletedElement.key)\n }\n}\n\nfunction applyDelete(\n elementTree: ElementTree,\n descriptors: DescriptorsByComponentType,\n rootElements: { old: Element; new: Element },\n path: OperationPath,\n): ElementTree {\n const [deleteElementPath, ...parentElementPaths] = getChangedElementsPaths(path)\n const [deletedElement, propName] = getElementAndPropName(rootElements.old, deleteElementPath)\n\n const elements = new Map(elementTree.elements)\n const elementIds = new Map(elementTree.elementIds)\n\n deleteElement({ elements, elementIds }, deletedElement, propName, descriptors)\n updateParentElements(elements, parentElementPaths, rootElements.new)\n\n return {\n elements,\n elementIds,\n }\n}\n\nfunction insertElement(\n { elements, elementIds }: ElementTree,\n insertedElement: Element,\n propName: string,\n descriptors: DescriptorsByComponentType,\n) {\n if (hasChildren(insertedElement, propName, descriptors)) {\n for (const element of traverseElementTree(insertedElement, descriptors)) {\n elements.set(element.key, element)\n if (!isElementReference(element)) {\n const elementId = getElementIdProp(element, descriptors)\n if (elementId != null) elementIds.set(element.key, elementId)\n }\n }\n } else {\n elements.set(insertedElement.key, insertedElement)\n if (!isElementReference(insertedElement)) {\n const elementId = getElementIdProp(insertedElement, descriptors)\n if (elementId != null) elementIds.set(insertedElement.key, elementId)\n }\n }\n}\n\nfunction applyInsert(\n elementTree: ElementTree,\n descriptors: DescriptorsByComponentType,\n rootElements: { old: Element; new: Element },\n path: OperationPath,\n): ElementTree {\n const [insertedElementPath, ...parentElementPaths] = getChangedElementsPaths(path)\n const [insertedElement, propName] = getElementAndPropName(rootElements.new, insertedElementPath)\n\n const elements = new Map(elementTree.elements)\n const elementIds = new Map(elementTree.elementIds)\n\n insertElement({ elements, elementIds }, insertedElement, propName, descriptors)\n updateParentElements(elements, parentElementPaths, rootElements.new)\n\n return {\n elements,\n elementIds,\n }\n}\n\nfunction applyUpdate(\n elementTree: ElementTree,\n descriptors: DescriptorsByComponentType,\n rootElements: { old: Element; new: Element },\n path: OperationPath,\n): ElementTree {\n const [updateElementPath, ...parentElementPaths] = getChangedElementsPaths(path)\n const [deletedElement, propName] = getElementAndPropName(rootElements.old, updateElementPath)\n const [insertedElement, _] = getElementAndPropName(rootElements.new, updateElementPath)\n\n const elements = new Map(elementTree.elements)\n const elementIds = new Map(elementTree.elementIds)\n\n deleteElement({ elements, elementIds }, deletedElement, propName, descriptors)\n insertElement({ elements, elementIds }, insertedElement, propName, descriptors)\n\n updateParentElements(elements, parentElementPaths, rootElements.new)\n\n return {\n elements,\n elementIds,\n }\n}\n\nfunction applyChanges(\n elementTree: ElementTree,\n descriptors: DescriptorsByComponentType,\n rootElements: { old: Element; new: Element },\n operation: Operation,\n): ElementTree {\n return operation.reduce((tree, op) => {\n const hasDelete = 'ld' in op || 'od' in op\n const hasInsert = 'li' in op || 'oi' in op\n if (hasDelete && hasInsert) {\n return applyUpdate(tree, descriptors, rootElements, op.p)\n }\n\n if (hasDelete) return applyDelete(tree, descriptors, rootElements, op.p)\n if (hasInsert) return applyInsert(tree, descriptors, rootElements, op.p)\n return tree\n }, elementTree)\n}\n"],"mappings":"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","names":["i"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/state/modules/element-trees.ts"],"sourcesContent":["import { type Operation } from 'ot-json0'\nimport { getIn } from 'immutable'\n\nimport { type Element, type ElementData, isElementReference } from '@makeswift/controls'\n\nimport { Introspection } from '../../prop-controllers'\n\nimport { type Action, ActionTypes } from '../actions'\n\nimport { getRootElement, type Document } from './read-only-documents'\nimport { type DescriptorsByComponentType } from './prop-controllers'\n\nexport type ElementTree = {\n elements: Map<string, Element>\n elementIds: Map<string, string>\n}\n\nexport type State = Map<string, ElementTree>\n\nexport function getInitialState(\n documents?: Map<string, Document>,\n descriptors?: DescriptorsByComponentType,\n): State {\n const state = new Map<string, ElementTree>()\n if (documents == null || descriptors == null) return state\n\n for (const [documentKey, document] of documents) {\n state.set(documentKey, buildElementTree(getRootElement(document), descriptors))\n }\n\n return state\n}\n\nfunction getElementTree(state: State, id: string): ElementTree | null {\n return state.get(id) ?? null\n}\n\nexport function getElements(state: State, documentKey: string): Map<string, Element> {\n return getElementTree(state, documentKey)?.elements ?? new Map()\n}\n\nexport function getElementIds(state: State, documentKey: string): Map<string, string> {\n return getElementTree(state, documentKey)?.elementIds ?? new Map()\n}\n\nexport function getElement(state: State, documentKey: string, elementKey: string): Element | null {\n return getElements(state, documentKey).get(elementKey) ?? null\n}\n\nexport function getElementId(state: State, documentKey: string, elementKey: string): string | null {\n return getElementIds(state, documentKey).get(elementKey) ?? null\n}\n\nexport function reducer(state: State = getInitialState(), action: Action): State {\n switch (action.type) {\n case ActionTypes.CREATE_ELEMENT_TREE: {\n const { document, descriptors } = action.payload\n return new Map(state).set(\n document.key,\n buildElementTree(getRootElement(document), descriptors),\n )\n }\n\n case ActionTypes.DELETE_ELEMENT_TREE: {\n const nextState = new Map(state)\n const deleted = nextState.delete(action.payload.documentKey)\n return deleted ? nextState : state\n }\n\n case ActionTypes.CHANGE_ELEMENT_TREE: {\n const { oldDocument, newDocument, descriptors, operation } = action.payload\n const documentKey = oldDocument.key\n console.assert(\n documentKey === newDocument.key,\n `Mismatching document keys ${documentKey} !== ${newDocument.key}`,\n )\n\n const elementTree = state.get(documentKey)\n if (elementTree == null) return state\n\n const updatedElementTree = applyChanges(\n elementTree,\n descriptors,\n {\n old: getRootElement(oldDocument),\n new: getRootElement(newDocument),\n },\n operation,\n )\n\n return new Map(state).set(documentKey, updatedElementTree)\n }\n\n default:\n return state\n }\n}\n\nexport function* traverseElementTree(\n element: Element,\n descriptors: DescriptorsByComponentType,\n): Generator<Element> {\n yield element\n if (isElementReference(element)) return\n\n const elementDescriptors = descriptors.get(element.type)\n if (elementDescriptors == null) return\n\n for (const [propKey, descriptor] of Object.entries(elementDescriptors)) {\n const children = Introspection.getElementChildren(descriptor, element.props[propKey])\n for (const child of children) {\n yield* traverseElementTree(child, descriptors)\n }\n }\n}\n\nfunction getElementIdProp(\n element: ElementData,\n descriptors: DescriptorsByComponentType,\n): string | null {\n const elementDescriptors = descriptors.get(element.type)\n if (elementDescriptors == null) return null\n\n for (const [propName, descriptor] of Object.entries(elementDescriptors)) {\n const elementId = Introspection.getElementId(descriptor, element.props[propName])\n if (elementId != null) return elementId\n }\n\n return null\n}\n\nexport function buildElementTree(\n rootElement: Element,\n descriptors: DescriptorsByComponentType,\n): ElementTree {\n const elements = new Map<string, Element>()\n const elementIds = new Map<string, string>()\n\n for (const element of traverseElementTree(rootElement, descriptors)) {\n elements.set(element.key, element)\n if (!isElementReference(element)) {\n const elementId = getElementIdProp(element, descriptors)\n if (elementId != null) elementIds.set(element.key, elementId)\n }\n }\n\n return {\n elements,\n elementIds,\n }\n}\n\ntype OperationPath = Operation[number]['p']\n\n// performance-sensitive function, intentionally not using `elementData` schema here\nfunction isElement(item: unknown): item is Element {\n return (\n typeof item === 'object' &&\n item != null &&\n 'key' in item &&\n 'type' in item &&\n typeof item.key === 'string' &&\n typeof item.type === 'string'\n )\n}\n\ntype ElementOperationPath = { elementPath: OperationPath; propName: string }\n\nfunction getElementOperationPath(path: OperationPath): ElementOperationPath {\n const i = path.findLastIndex(\n (fragment, i) =>\n typeof fragment === 'number' && (i === path.length - 1 || path[i + 1] === 'props'),\n )\n\n if (path.length === 0 || (i === -1 && path[0] !== 'props') || path.length - i < 3) {\n console.error('Operation path does not point to an element property', { path })\n return { elementPath: [], propName: 'children' }\n }\n\n return { elementPath: path.slice(0, i + 1), propName: `${path.slice(i + 1).at(1)}` }\n}\n\nexport function getChangedElementsPaths(\n path: OperationPath,\n): [ElementOperationPath, ...ElementOperationPath[]] {\n let elementOp = getElementOperationPath(path)\n const result: [ElementOperationPath, ...ElementOperationPath[]] = [elementOp]\n while (elementOp.elementPath.length > 0) {\n elementOp = getElementOperationPath(elementOp.elementPath.slice(0, -1))\n result.push(elementOp)\n }\n\n return result\n}\n\nfunction getElementByPath(rootElement: Element, elementPath: OperationPath): Element | null {\n const item = getIn(rootElement, elementPath)\n if (!isElement(item)) {\n console.error('Expected an element, got', item, {\n rootElement,\n elementPath,\n })\n\n return null\n }\n\n return item\n}\n\nfunction getElementAndPropName(\n rootElement: Element,\n { elementPath, propName }: ElementOperationPath,\n): [Element, string] {\n const element = getElementByPath(rootElement, elementPath)\n return element != null ? [element, propName] : [rootElement, 'children']\n}\n\nfunction updateParentElements(\n elements: ElementTree['elements'],\n elementPaths: ElementOperationPath[],\n rootElement: Element,\n): void {\n elementPaths.forEach(({ elementPath }) => {\n const element = getElementByPath(rootElement, elementPath)\n if (element != null) elements.set(element.key, element)\n })\n}\n\nfunction hasChildren(\n element: Element,\n propName: string,\n descriptors: DescriptorsByComponentType,\n): boolean {\n if (isElementReference(element)) return false\n\n const propDescriptor = descriptors.get(element.type)?.[propName]\n if (propDescriptor == null) return false\n\n const children = Introspection.getElementChildren(propDescriptor, element.props[propName])\n return children.length > 0\n}\n\nfunction deleteElement(\n { elements, elementIds }: ElementTree,\n deletedElement: Element,\n propName: string,\n descriptors: DescriptorsByComponentType,\n) {\n if (hasChildren(deletedElement, propName, descriptors)) {\n for (const element of traverseElementTree(deletedElement, descriptors)) {\n elements.delete(element.key)\n elementIds.delete(element.key)\n }\n } else {\n elements.delete(deletedElement.key)\n elementIds.delete(deletedElement.key)\n }\n}\n\nfunction applyDelete(\n elementTree: ElementTree,\n descriptors: DescriptorsByComponentType,\n rootElements: { old: Element; new: Element },\n path: OperationPath,\n): ElementTree {\n const [deleteElementPath, ...parentElementPaths] = getChangedElementsPaths(path)\n const [deletedElement, propName] = getElementAndPropName(rootElements.old, deleteElementPath)\n\n const elements = new Map(elementTree.elements)\n const elementIds = new Map(elementTree.elementIds)\n\n deleteElement({ elements, elementIds }, deletedElement, propName, descriptors)\n updateParentElements(elements, parentElementPaths, rootElements.new)\n\n return {\n elements,\n elementIds,\n }\n}\n\nfunction insertElement(\n { elements, elementIds }: ElementTree,\n insertedElement: Element,\n propName: string,\n descriptors: DescriptorsByComponentType,\n) {\n if (hasChildren(insertedElement, propName, descriptors)) {\n for (const element of traverseElementTree(insertedElement, descriptors)) {\n elements.set(element.key, element)\n if (!isElementReference(element)) {\n const elementId = getElementIdProp(element, descriptors)\n if (elementId != null) elementIds.set(element.key, elementId)\n }\n }\n } else {\n elements.set(insertedElement.key, insertedElement)\n if (!isElementReference(insertedElement)) {\n const elementId = getElementIdProp(insertedElement, descriptors)\n if (elementId != null) elementIds.set(insertedElement.key, elementId)\n }\n }\n}\n\nfunction applyInsert(\n elementTree: ElementTree,\n descriptors: DescriptorsByComponentType,\n rootElements: { old: Element; new: Element },\n path: OperationPath,\n): ElementTree {\n const [insertedElementPath, ...parentElementPaths] = getChangedElementsPaths(path)\n const [insertedElement, propName] = getElementAndPropName(rootElements.new, insertedElementPath)\n\n const elements = new Map(elementTree.elements)\n const elementIds = new Map(elementTree.elementIds)\n\n insertElement({ elements, elementIds }, insertedElement, propName, descriptors)\n updateParentElements(elements, parentElementPaths, rootElements.new)\n\n return {\n elements,\n elementIds,\n }\n}\n\nfunction applyUpdate(\n elementTree: ElementTree,\n descriptors: DescriptorsByComponentType,\n rootElements: { old: Element; new: Element },\n path: OperationPath,\n): ElementTree {\n const [updateElementPath, ...parentElementPaths] = getChangedElementsPaths(path)\n const [deletedElement, propName] = getElementAndPropName(rootElements.old, updateElementPath)\n const [insertedElement, _] = getElementAndPropName(rootElements.new, updateElementPath)\n\n const elements = new Map(elementTree.elements)\n const elementIds = new Map(elementTree.elementIds)\n\n deleteElement({ elements, elementIds }, deletedElement, propName, descriptors)\n insertElement({ elements, elementIds }, insertedElement, propName, descriptors)\n\n updateParentElements(elements, parentElementPaths, rootElements.new)\n\n return {\n elements,\n elementIds,\n }\n}\n\nfunction applyChanges(\n elementTree: ElementTree,\n descriptors: DescriptorsByComponentType,\n rootElements: { old: Element; new: Element },\n operation: Operation,\n): ElementTree {\n return operation.reduce((tree, op) => {\n const hasDelete = 'ld' in op || 'od' in op\n const hasInsert = 'li' in op || 'oi' in op\n if (hasDelete && hasInsert) {\n return applyUpdate(tree, descriptors, rootElements, op.p)\n }\n\n if (hasDelete) return applyDelete(tree, descriptors, rootElements, op.p)\n if (hasInsert) return applyInsert(tree, descriptors, rootElements, op.p)\n return tree\n }, elementTree)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,uBAAsB;AAEtB,sBAAmE;AAEnE,8BAA8B;AAE9B,qBAAyC;AAEzC,iCAA8C;AAUvC,SAAS,gBACd,WACA,aACO;AACP,QAAM,QAAQ,oBAAI,IAAyB;AAC3C,MAAI,aAAa,QAAQ,eAAe;AAAM,WAAO;AAErD,aAAW,CAAC,aAAa,QAAQ,KAAK,WAAW;AAC/C,UAAM,IAAI,aAAa,qBAAiB,2CAAe,QAAQ,GAAG,WAAW,CAAC;AAAA,EAChF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAc,IAAgC;AACpE,SAAO,MAAM,IAAI,EAAE,KAAK;AAC1B;AAEO,SAAS,YAAY,OAAc,aAA2C;AACnF,SAAO,eAAe,OAAO,WAAW,GAAG,YAAY,oBAAI,IAAI;AACjE;AAEO,SAAS,cAAc,OAAc,aAA0C;AACpF,SAAO,eAAe,OAAO,WAAW,GAAG,cAAc,oBAAI,IAAI;AACnE;AAEO,SAAS,WAAW,OAAc,aAAqB,YAAoC;AAChG,SAAO,YAAY,OAAO,WAAW,EAAE,IAAI,UAAU,KAAK;AAC5D;AAEO,SAAS,aAAa,OAAc,aAAqB,YAAmC;AACjG,SAAO,cAAc,OAAO,WAAW,EAAE,IAAI,UAAU,KAAK;AAC9D;AAEO,SAAS,QAAQ,QAAe,gBAAgB,GAAG,QAAuB;AAC/E,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,2BAAY,qBAAqB;AACpC,YAAM,EAAE,UAAU,YAAY,IAAI,OAAO;AACzC,aAAO,IAAI,IAAI,KAAK,EAAE;AAAA,QACpB,SAAS;AAAA,QACT,qBAAiB,2CAAe,QAAQ,GAAG,WAAW;AAAA,MACxD;AAAA,IACF;AAAA,IAEA,KAAK,2BAAY,qBAAqB;AACpC,YAAM,YAAY,IAAI,IAAI,KAAK;AAC/B,YAAM,UAAU,UAAU,OAAO,OAAO,QAAQ,WAAW;AAC3D,aAAO,UAAU,YAAY;AAAA,IAC/B;AAAA,IAEA,KAAK,2BAAY,qBAAqB;AACpC,YAAM,EAAE,aAAa,aAAa,aAAa,UAAU,IAAI,OAAO;AACpE,YAAM,cAAc,YAAY;AAChC,cAAQ;AAAA,QACN,gBAAgB,YAAY;AAAA,QAC5B,6BAA6B,WAAW,QAAQ,YAAY,GAAG;AAAA,MACjE;AAEA,YAAM,cAAc,MAAM,IAAI,WAAW;AACzC,UAAI,eAAe;AAAM,eAAO;AAEhC,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,UACE,SAAK,2CAAe,WAAW;AAAA,UAC/B,SAAK,2CAAe,WAAW;AAAA,QACjC;AAAA,QACA;AAAA,MACF;AAEA,aAAO,IAAI,IAAI,KAAK,EAAE,IAAI,aAAa,kBAAkB;AAAA,IAC3D;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;AAEO,UAAU,oBACf,SACA,aACoB;AACpB,QAAM;AACN,UAAI,oCAAmB,OAAO;AAAG;AAEjC,QAAM,qBAAqB,YAAY,IAAI,QAAQ,IAAI;AACvD,MAAI,sBAAsB;AAAM;AAEhC,aAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AACtE,UAAM,WAAW,sCAAc,mBAAmB,YAAY,QAAQ,MAAM,OAAO,CAAC;AACpF,eAAW,SAAS,UAAU;AAC5B,aAAO,oBAAoB,OAAO,WAAW;AAAA,IAC/C;AAAA,EACF;AACF;AAEA,SAAS,iBACP,SACA,aACe;AACf,QAAM,qBAAqB,YAAY,IAAI,QAAQ,IAAI;AACvD,MAAI,sBAAsB;AAAM,WAAO;AAEvC,aAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AACvE,UAAM,YAAY,sCAAc,aAAa,YAAY,QAAQ,MAAM,QAAQ,CAAC;AAChF,QAAI,aAAa;AAAM,aAAO;AAAA,EAChC;AAEA,SAAO;AACT;AAEO,SAAS,iBACd,aACA,aACa;AACb,QAAM,WAAW,oBAAI,IAAqB;AAC1C,QAAM,aAAa,oBAAI,IAAoB;AAE3C,aAAW,WAAW,oBAAoB,aAAa,WAAW,GAAG;AACnE,aAAS,IAAI,QAAQ,KAAK,OAAO;AACjC,QAAI,KAAC,oCAAmB,OAAO,GAAG;AAChC,YAAM,YAAY,iBAAiB,SAAS,WAAW;AACvD,UAAI,aAAa;AAAM,mBAAW,IAAI,QAAQ,KAAK,SAAS;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,UAAU,MAAgC;AACjD,SACE,OAAO,SAAS,YAChB,QAAQ,QACR,SAAS,QACT,UAAU,QACV,OAAO,KAAK,QAAQ,YACpB,OAAO,KAAK,SAAS;AAEzB;AAIA,SAAS,wBAAwB,MAA2C;AAC1E,QAAM,IAAI,KAAK;AAAA,IACb,CAAC,UAAUA,OACT,OAAO,aAAa,aAAaA,OAAM,KAAK,SAAS,KAAK,KAAKA,KAAI,CAAC,MAAM;AAAA,EAC9E;AAEA,MAAI,KAAK,WAAW,KAAM,MAAM,MAAM,KAAK,CAAC,MAAM,WAAY,KAAK,SAAS,IAAI,GAAG;AACjF,YAAQ,MAAM,wDAAwD,EAAE,KAAK,CAAC;AAC9E,WAAO,EAAE,aAAa,CAAC,GAAG,UAAU,WAAW;AAAA,EACjD;AAEA,SAAO,EAAE,aAAa,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,UAAU,GAAG,KAAK,MAAM,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG;AACrF;AAEO,SAAS,wBACd,MACmD;AACnD,MAAI,YAAY,wBAAwB,IAAI;AAC5C,QAAM,SAA4D,CAAC,SAAS;AAC5E,SAAO,UAAU,YAAY,SAAS,GAAG;AACvC,gBAAY,wBAAwB,UAAU,YAAY,MAAM,GAAG,EAAE,CAAC;AACtE,WAAO,KAAK,SAAS;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,aAAsB,aAA4C;AAC1F,QAAM,WAAO,wBAAM,aAAa,WAAW;AAC3C,MAAI,CAAC,UAAU,IAAI,GAAG;AACpB,YAAQ,MAAM,4BAA4B,MAAM;AAAA,MAC9C;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,sBACP,aACA,EAAE,aAAa,SAAS,GACL;AACnB,QAAM,UAAU,iBAAiB,aAAa,WAAW;AACzD,SAAO,WAAW,OAAO,CAAC,SAAS,QAAQ,IAAI,CAAC,aAAa,UAAU;AACzE;AAEA,SAAS,qBACP,UACA,cACA,aACM;AACN,eAAa,QAAQ,CAAC,EAAE,YAAY,MAAM;AACxC,UAAM,UAAU,iBAAiB,aAAa,WAAW;AACzD,QAAI,WAAW;AAAM,eAAS,IAAI,QAAQ,KAAK,OAAO;AAAA,EACxD,CAAC;AACH;AAEA,SAAS,YACP,SACA,UACA,aACS;AACT,UAAI,oCAAmB,OAAO;AAAG,WAAO;AAExC,QAAM,iBAAiB,YAAY,IAAI,QAAQ,IAAI,IAAI,QAAQ;AAC/D,MAAI,kBAAkB;AAAM,WAAO;AAEnC,QAAM,WAAW,sCAAc,mBAAmB,gBAAgB,QAAQ,MAAM,QAAQ,CAAC;AACzF,SAAO,SAAS,SAAS;AAC3B;AAEA,SAAS,cACP,EAAE,UAAU,WAAW,GACvB,gBACA,UACA,aACA;AACA,MAAI,YAAY,gBAAgB,UAAU,WAAW,GAAG;AACtD,eAAW,WAAW,oBAAoB,gBAAgB,WAAW,GAAG;AACtE,eAAS,OAAO,QAAQ,GAAG;AAC3B,iBAAW,OAAO,QAAQ,GAAG;AAAA,IAC/B;AAAA,EACF,OAAO;AACL,aAAS,OAAO,eAAe,GAAG;AAClC,eAAW,OAAO,eAAe,GAAG;AAAA,EACtC;AACF;AAEA,SAAS,YACP,aACA,aACA,cACA,MACa;AACb,QAAM,CAAC,mBAAmB,GAAG,kBAAkB,IAAI,wBAAwB,IAAI;AAC/E,QAAM,CAAC,gBAAgB,QAAQ,IAAI,sBAAsB,aAAa,KAAK,iBAAiB;AAE5F,QAAM,WAAW,IAAI,IAAI,YAAY,QAAQ;AAC7C,QAAM,aAAa,IAAI,IAAI,YAAY,UAAU;AAEjD,gBAAc,EAAE,UAAU,WAAW,GAAG,gBAAgB,UAAU,WAAW;AAC7E,uBAAqB,UAAU,oBAAoB,aAAa,GAAG;AAEnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,cACP,EAAE,UAAU,WAAW,GACvB,iBACA,UACA,aACA;AACA,MAAI,YAAY,iBAAiB,UAAU,WAAW,GAAG;AACvD,eAAW,WAAW,oBAAoB,iBAAiB,WAAW,GAAG;AACvE,eAAS,IAAI,QAAQ,KAAK,OAAO;AACjC,UAAI,KAAC,oCAAmB,OAAO,GAAG;AAChC,cAAM,YAAY,iBAAiB,SAAS,WAAW;AACvD,YAAI,aAAa;AAAM,qBAAW,IAAI,QAAQ,KAAK,SAAS;AAAA,MAC9D;AAAA,IACF;AAAA,EACF,OAAO;AACL,aAAS,IAAI,gBAAgB,KAAK,eAAe;AACjD,QAAI,KAAC,oCAAmB,eAAe,GAAG;AACxC,YAAM,YAAY,iBAAiB,iBAAiB,WAAW;AAC/D,UAAI,aAAa;AAAM,mBAAW,IAAI,gBAAgB,KAAK,SAAS;AAAA,IACtE;AAAA,EACF;AACF;AAEA,SAAS,YACP,aACA,aACA,cACA,MACa;AACb,QAAM,CAAC,qBAAqB,GAAG,kBAAkB,IAAI,wBAAwB,IAAI;AACjF,QAAM,CAAC,iBAAiB,QAAQ,IAAI,sBAAsB,aAAa,KAAK,mBAAmB;AAE/F,QAAM,WAAW,IAAI,IAAI,YAAY,QAAQ;AAC7C,QAAM,aAAa,IAAI,IAAI,YAAY,UAAU;AAEjD,gBAAc,EAAE,UAAU,WAAW,GAAG,iBAAiB,UAAU,WAAW;AAC9E,uBAAqB,UAAU,oBAAoB,aAAa,GAAG;AAEnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,YACP,aACA,aACA,cACA,MACa;AACb,QAAM,CAAC,mBAAmB,GAAG,kBAAkB,IAAI,wBAAwB,IAAI;AAC/E,QAAM,CAAC,gBAAgB,QAAQ,IAAI,sBAAsB,aAAa,KAAK,iBAAiB;AAC5F,QAAM,CAAC,iBAAiB,CAAC,IAAI,sBAAsB,aAAa,KAAK,iBAAiB;AAEtF,QAAM,WAAW,IAAI,IAAI,YAAY,QAAQ;AAC7C,QAAM,aAAa,IAAI,IAAI,YAAY,UAAU;AAEjD,gBAAc,EAAE,UAAU,WAAW,GAAG,gBAAgB,UAAU,WAAW;AAC7E,gBAAc,EAAE,UAAU,WAAW,GAAG,iBAAiB,UAAU,WAAW;AAE9E,uBAAqB,UAAU,oBAAoB,aAAa,GAAG;AAEnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,aACP,aACA,aACA,cACA,WACa;AACb,SAAO,UAAU,OAAO,CAAC,MAAM,OAAO;AACpC,UAAM,YAAY,QAAQ,MAAM,QAAQ;AACxC,UAAM,YAAY,QAAQ,MAAM,QAAQ;AACxC,QAAI,aAAa,WAAW;AAC1B,aAAO,YAAY,MAAM,aAAa,cAAc,GAAG,CAAC;AAAA,IAC1D;AAEA,QAAI;AAAW,aAAO,YAAY,MAAM,aAAa,cAAc,GAAG,CAAC;AACvE,QAAI;AAAW,aAAO,YAAY,MAAM,aAAa,cAAc,GAAG,CAAC;AACvE,WAAO;AAAA,EACT,GAAG,WAAW;AAChB;","names":["i"]}
|