@shopify/ui-extensions-server-kit 5.2.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/CHANGELOG.md +121 -0
- package/README.md +74 -0
- package/dist/ExtensionServerClient/ExtensionServerClient.cjs.js +1 -0
- package/dist/ExtensionServerClient/ExtensionServerClient.d.ts +28 -0
- package/dist/ExtensionServerClient/ExtensionServerClient.es.js +133 -0
- package/dist/ExtensionServerClient/ExtensionServerClient.test.d.ts +1 -0
- package/dist/ExtensionServerClient/index.d.ts +2 -0
- package/dist/ExtensionServerClient/types.cjs.js +1 -0
- package/dist/ExtensionServerClient/types.d.ts +124 -0
- package/dist/ExtensionServerClient/types.es.js +4 -0
- package/dist/context/ExtensionServerProvider.cjs.js +1 -0
- package/dist/context/ExtensionServerProvider.d.ts +2 -0
- package/dist/context/ExtensionServerProvider.es.js +29 -0
- package/dist/context/ExtensionServerProvider.test.d.ts +1 -0
- package/dist/context/constants.cjs.js +1 -0
- package/dist/context/constants.d.ts +3 -0
- package/dist/context/constants.es.js +14 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/types.d.ts +11 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/useExtensionClient.cjs.js +1 -0
- package/dist/hooks/useExtensionClient.d.ts +1 -0
- package/dist/hooks/useExtensionClient.es.js +8 -0
- package/dist/hooks/useExtensionServerContext.cjs.js +1 -0
- package/dist/hooks/useExtensionServerContext.d.ts +1 -0
- package/dist/hooks/useExtensionServerContext.es.js +6 -0
- package/dist/hooks/useExtensionServerEvent.cjs.js +1 -0
- package/dist/hooks/useExtensionServerEvent.d.ts +1 -0
- package/dist/hooks/useExtensionServerEvent.es.js +9 -0
- package/dist/hooks/useExtensionServerState.cjs.js +1 -0
- package/dist/hooks/useExtensionServerState.d.ts +1 -0
- package/dist/hooks/useExtensionServerState.es.js +9 -0
- package/dist/hooks/useIsomorphicLayoutEffect.cjs.js +1 -0
- package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -0
- package/dist/hooks/useIsomorphicLayoutEffect.es.js +5 -0
- package/dist/i18n.cjs.js +1 -0
- package/dist/i18n.d.ts +93 -0
- package/dist/i18n.es.js +61 -0
- package/dist/i18n.test.d.ts +1 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.cjs2.js +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.es.js +54 -0
- package/dist/index.es2.js +8 -0
- package/dist/state/actions/actions.cjs.js +1 -0
- package/dist/state/actions/actions.d.ts +6 -0
- package/dist/state/actions/actions.es.js +37 -0
- package/dist/state/actions/index.d.ts +2 -0
- package/dist/state/actions/types.d.ts +21 -0
- package/dist/state/index.d.ts +2 -0
- package/dist/state/reducers/constants.cjs.js +1 -0
- package/dist/state/reducers/constants.d.ts +2 -0
- package/dist/state/reducers/constants.es.js +7 -0
- package/dist/state/reducers/extensionServerReducer.cjs.js +1 -0
- package/dist/state/reducers/extensionServerReducer.d.ts +3 -0
- package/dist/state/reducers/extensionServerReducer.es.js +57 -0
- package/dist/state/reducers/extensionServerReducer.test.d.ts +1 -0
- package/dist/state/reducers/index.d.ts +3 -0
- package/dist/state/reducers/types.d.ts +6 -0
- package/dist/testing/MockExtensionServerProvider.cjs.js +1 -0
- package/dist/testing/MockExtensionServerProvider.d.ts +7 -0
- package/dist/testing/MockExtensionServerProvider.es.js +24 -0
- package/dist/testing/app.cjs.js +1 -0
- package/dist/testing/app.d.ts +2 -0
- package/dist/testing/app.es.js +16 -0
- package/dist/testing/extensions.cjs.js +1 -0
- package/dist/testing/extensions.d.ts +6 -0
- package/dist/testing/extensions.es.js +65 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/types.cjs.js +1 -0
- package/dist/types.d.ts +169 -0
- package/dist/types.es.js +4 -0
- package/dist/utilities/assetToString.cjs.js +1 -0
- package/dist/utilities/assetToString.d.ts +2 -0
- package/dist/utilities/assetToString.es.js +7 -0
- package/dist/utilities/assetToString.test.d.ts +1 -0
- package/dist/utilities/groupByKey.cjs.js +1 -0
- package/dist/utilities/groupByKey.d.ts +3 -0
- package/dist/utilities/groupByKey.es.js +6 -0
- package/dist/utilities/index.d.ts +7 -0
- package/dist/utilities/isUIExtension.cjs.js +1 -0
- package/dist/utilities/isUIExtension.d.ts +1 -0
- package/dist/utilities/isUIExtension.es.js +6 -0
- package/dist/utilities/isValidSurface.cjs.js +1 -0
- package/dist/utilities/isValidSurface.d.ts +2 -0
- package/dist/utilities/isValidSurface.es.js +7 -0
- package/dist/utilities/noop.cjs.js +1 -0
- package/dist/utilities/noop.d.ts +1 -0
- package/dist/utilities/noop.es.js +5 -0
- package/dist/utilities/replaceUpdated.cjs.js +1 -0
- package/dist/utilities/replaceUpdated.d.ts +1 -0
- package/dist/utilities/replaceUpdated.es.js +14 -0
- package/dist/utilities/replaceUpdated.test.d.ts +1 -0
- package/dist/utilities/set.cjs.js +1 -0
- package/dist/utilities/set.d.ts +4 -0
- package/dist/utilities/set.es.js +18 -0
- package/dist/utilities/set.test.d.ts +1 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.mjs +1 -0
- package/node_modules/@shopify/react-testing/LICENSE.md +21 -0
- package/node_modules/@shopify/react-testing/README.md +711 -0
- package/node_modules/@shopify/react-testing/build/cjs/TestWrapper.js +52 -0
- package/node_modules/@shopify/react-testing/build/cjs/_virtual/_rollupPluginBabelHelpers.js +47 -0
- package/node_modules/@shopify/react-testing/build/cjs/compat.js +14 -0
- package/node_modules/@shopify/react-testing/build/cjs/destroy.js +13 -0
- package/node_modules/@shopify/react-testing/build/cjs/element.js +225 -0
- package/node_modules/@shopify/react-testing/build/cjs/index.js +21 -0
- package/node_modules/@shopify/react-testing/build/cjs/matchers/components.js +46 -0
- package/node_modules/@shopify/react-testing/build/cjs/matchers/context.js +25 -0
- package/node_modules/@shopify/react-testing/build/cjs/matchers/index.js +16 -0
- package/node_modules/@shopify/react-testing/build/cjs/matchers/props.js +38 -0
- package/node_modules/@shopify/react-testing/build/cjs/matchers/strings.js +42 -0
- package/node_modules/@shopify/react-testing/build/cjs/matchers/utilities.js +110 -0
- package/node_modules/@shopify/react-testing/build/cjs/mount.js +76 -0
- package/node_modules/@shopify/react-testing/build/cjs/root.js +284 -0
- package/node_modules/@shopify/react-testing/build/cjs/toReactString.js +86 -0
- package/node_modules/@shopify/react-testing/build/cjs/types.js +28 -0
- package/node_modules/@shopify/react-testing/build/esm/TestWrapper.mjs +44 -0
- package/node_modules/@shopify/react-testing/build/esm/_virtual/_rollupPluginBabelHelpers.mjs +42 -0
- package/node_modules/@shopify/react-testing/build/esm/compat.mjs +10 -0
- package/node_modules/@shopify/react-testing/build/esm/destroy.mjs +9 -0
- package/node_modules/@shopify/react-testing/build/esm/element.mjs +221 -0
- package/node_modules/@shopify/react-testing/build/esm/index.mjs +5 -0
- package/node_modules/@shopify/react-testing/build/esm/matchers/components.mjs +41 -0
- package/node_modules/@shopify/react-testing/build/esm/matchers/context.mjs +21 -0
- package/node_modules/@shopify/react-testing/build/esm/matchers/index.mjs +14 -0
- package/node_modules/@shopify/react-testing/build/esm/matchers/props.mjs +33 -0
- package/node_modules/@shopify/react-testing/build/esm/matchers/strings.mjs +37 -0
- package/node_modules/@shopify/react-testing/build/esm/matchers/utilities.mjs +101 -0
- package/node_modules/@shopify/react-testing/build/esm/mount.mjs +70 -0
- package/node_modules/@shopify/react-testing/build/esm/root.mjs +275 -0
- package/node_modules/@shopify/react-testing/build/esm/toReactString.mjs +80 -0
- package/node_modules/@shopify/react-testing/build/esm/types.mjs +26 -0
- package/node_modules/@shopify/react-testing/build/esnext/TestWrapper.esnext +44 -0
- package/node_modules/@shopify/react-testing/build/esnext/compat.esnext +10 -0
- package/node_modules/@shopify/react-testing/build/esnext/destroy.esnext +9 -0
- package/node_modules/@shopify/react-testing/build/esnext/element.esnext +221 -0
- package/node_modules/@shopify/react-testing/build/esnext/index.esnext +5 -0
- package/node_modules/@shopify/react-testing/build/esnext/matchers/components.esnext +41 -0
- package/node_modules/@shopify/react-testing/build/esnext/matchers/context.esnext +21 -0
- package/node_modules/@shopify/react-testing/build/esnext/matchers/index.esnext +14 -0
- package/node_modules/@shopify/react-testing/build/esnext/matchers/props.esnext +33 -0
- package/node_modules/@shopify/react-testing/build/esnext/matchers/strings.esnext +37 -0
- package/node_modules/@shopify/react-testing/build/esnext/matchers/utilities.esnext +99 -0
- package/node_modules/@shopify/react-testing/build/esnext/mount.esnext +71 -0
- package/node_modules/@shopify/react-testing/build/esnext/root.esnext +275 -0
- package/node_modules/@shopify/react-testing/build/esnext/toReactString.esnext +80 -0
- package/node_modules/@shopify/react-testing/build/esnext/types.esnext +26 -0
- package/node_modules/@shopify/react-testing/build/ts/TestWrapper.d.ts +17 -0
- package/node_modules/@shopify/react-testing/build/ts/TestWrapper.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/compat.d.ts +3 -0
- package/node_modules/@shopify/react-testing/build/ts/compat.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/destroy.d.ts +2 -0
- package/node_modules/@shopify/react-testing/build/ts/destroy.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/element.d.ts +42 -0
- package/node_modules/@shopify/react-testing/build/ts/element.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/index.d.ts +7 -0
- package/node_modules/@shopify/react-testing/build/ts/index.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/components.d.ts +12 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/components.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/context.d.ts +8 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/context.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/index.d.ts +20 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/index.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/props.d.ts +10 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/props.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/strings.d.ts +11 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/strings.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/utilities.d.ts +17 -0
- package/node_modules/@shopify/react-testing/build/ts/matchers/utilities.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/mount.d.ts +39 -0
- package/node_modules/@shopify/react-testing/build/ts/mount.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/root.d.ts +55 -0
- package/node_modules/@shopify/react-testing/build/ts/root.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/toReactString.d.ts +5 -0
- package/node_modules/@shopify/react-testing/build/ts/toReactString.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/build/ts/types.d.ts +89 -0
- package/node_modules/@shopify/react-testing/build/ts/types.d.ts.map +1 -0
- package/node_modules/@shopify/react-testing/index.esnext +1 -0
- package/node_modules/@shopify/react-testing/index.js +1 -0
- package/node_modules/@shopify/react-testing/index.mjs +1 -0
- package/node_modules/@shopify/react-testing/matchers.esnext +1 -0
- package/node_modules/@shopify/react-testing/matchers.js +1 -0
- package/node_modules/@shopify/react-testing/matchers.mjs +1 -0
- package/node_modules/@shopify/react-testing/package.json +69 -0
- package/node_modules/@shopify/ui-extensions-test-utils/CHANGELOG.md +66 -0
- package/node_modules/@shopify/ui-extensions-test-utils/dist/index.js +3 -0
- package/node_modules/@shopify/ui-extensions-test-utils/dist/render.js +5 -0
- package/node_modules/@shopify/ui-extensions-test-utils/dist/renderHook.js +20 -0
- package/node_modules/@shopify/ui-extensions-test-utils/dist/withProviders.js +6 -0
- package/node_modules/@shopify/ui-extensions-test-utils/package.json +41 -0
- package/node_modules/@shopify/ui-extensions-test-utils/project.json +39 -0
- package/node_modules/@types/node/LICENSE +21 -0
- package/node_modules/@types/node/README.md +15 -0
- package/node_modules/@types/node/assert/strict.d.ts +8 -0
- package/node_modules/@types/node/assert.d.ts +985 -0
- package/node_modules/@types/node/async_hooks.d.ts +522 -0
- package/node_modules/@types/node/buffer.d.ts +2321 -0
- package/node_modules/@types/node/child_process.d.ts +1544 -0
- package/node_modules/@types/node/cluster.d.ts +432 -0
- package/node_modules/@types/node/console.d.ts +412 -0
- package/node_modules/@types/node/constants.d.ts +19 -0
- package/node_modules/@types/node/crypto.d.ts +4451 -0
- package/node_modules/@types/node/dgram.d.ts +586 -0
- package/node_modules/@types/node/diagnostics_channel.d.ts +192 -0
- package/node_modules/@types/node/dns/promises.d.ts +381 -0
- package/node_modules/@types/node/dns.d.ts +809 -0
- package/node_modules/@types/node/dom-events.d.ts +122 -0
- package/node_modules/@types/node/domain.d.ts +170 -0
- package/node_modules/@types/node/events.d.ts +803 -0
- package/node_modules/@types/node/fs/promises.d.ts +1205 -0
- package/node_modules/@types/node/fs.d.ts +4211 -0
- package/node_modules/@types/node/globals.d.ts +377 -0
- package/node_modules/@types/node/globals.global.d.ts +1 -0
- package/node_modules/@types/node/http.d.ts +1801 -0
- package/node_modules/@types/node/http2.d.ts +2386 -0
- package/node_modules/@types/node/https.d.ts +544 -0
- package/node_modules/@types/node/index.d.ts +88 -0
- package/node_modules/@types/node/inspector.d.ts +2739 -0
- package/node_modules/@types/node/module.d.ts +298 -0
- package/node_modules/@types/node/net.d.ts +913 -0
- package/node_modules/@types/node/os.d.ts +473 -0
- package/node_modules/@types/node/package.json +235 -0
- package/node_modules/@types/node/path.d.ts +191 -0
- package/node_modules/@types/node/perf_hooks.d.ts +626 -0
- package/node_modules/@types/node/process.d.ts +1531 -0
- package/node_modules/@types/node/punycode.d.ts +117 -0
- package/node_modules/@types/node/querystring.d.ts +141 -0
- package/node_modules/@types/node/readline/promises.d.ts +143 -0
- package/node_modules/@types/node/readline.d.ts +666 -0
- package/node_modules/@types/node/repl.d.ts +430 -0
- package/node_modules/@types/node/stream/consumers.d.ts +12 -0
- package/node_modules/@types/node/stream/promises.d.ts +83 -0
- package/node_modules/@types/node/stream/web.d.ts +336 -0
- package/node_modules/@types/node/stream.d.ts +1731 -0
- package/node_modules/@types/node/string_decoder.d.ts +67 -0
- package/node_modules/@types/node/test.d.ts +1113 -0
- package/node_modules/@types/node/timers/promises.d.ts +93 -0
- package/node_modules/@types/node/timers.d.ts +126 -0
- package/node_modules/@types/node/tls.d.ts +1203 -0
- package/node_modules/@types/node/trace_events.d.ts +171 -0
- package/node_modules/@types/node/ts4.8/assert/strict.d.ts +8 -0
- package/node_modules/@types/node/ts4.8/assert.d.ts +985 -0
- package/node_modules/@types/node/ts4.8/async_hooks.d.ts +522 -0
- package/node_modules/@types/node/ts4.8/buffer.d.ts +2321 -0
- package/node_modules/@types/node/ts4.8/child_process.d.ts +1544 -0
- package/node_modules/@types/node/ts4.8/cluster.d.ts +432 -0
- package/node_modules/@types/node/ts4.8/console.d.ts +412 -0
- package/node_modules/@types/node/ts4.8/constants.d.ts +19 -0
- package/node_modules/@types/node/ts4.8/crypto.d.ts +4450 -0
- package/node_modules/@types/node/ts4.8/dgram.d.ts +586 -0
- package/node_modules/@types/node/ts4.8/diagnostics_channel.d.ts +192 -0
- package/node_modules/@types/node/ts4.8/dns/promises.d.ts +381 -0
- package/node_modules/@types/node/ts4.8/dns.d.ts +809 -0
- package/node_modules/@types/node/ts4.8/dom-events.d.ts +122 -0
- package/node_modules/@types/node/ts4.8/domain.d.ts +170 -0
- package/node_modules/@types/node/ts4.8/events.d.ts +754 -0
- package/node_modules/@types/node/ts4.8/fs/promises.d.ts +1205 -0
- package/node_modules/@types/node/ts4.8/fs.d.ts +4211 -0
- package/node_modules/@types/node/ts4.8/globals.d.ts +377 -0
- package/node_modules/@types/node/ts4.8/globals.global.d.ts +1 -0
- package/node_modules/@types/node/ts4.8/http.d.ts +1801 -0
- package/node_modules/@types/node/ts4.8/http2.d.ts +2386 -0
- package/node_modules/@types/node/ts4.8/https.d.ts +544 -0
- package/node_modules/@types/node/ts4.8/index.d.ts +88 -0
- package/node_modules/@types/node/ts4.8/inspector.d.ts +2739 -0
- package/node_modules/@types/node/ts4.8/module.d.ts +298 -0
- package/node_modules/@types/node/ts4.8/net.d.ts +913 -0
- package/node_modules/@types/node/ts4.8/os.d.ts +473 -0
- package/node_modules/@types/node/ts4.8/path.d.ts +191 -0
- package/node_modules/@types/node/ts4.8/perf_hooks.d.ts +626 -0
- package/node_modules/@types/node/ts4.8/process.d.ts +1531 -0
- package/node_modules/@types/node/ts4.8/punycode.d.ts +117 -0
- package/node_modules/@types/node/ts4.8/querystring.d.ts +141 -0
- package/node_modules/@types/node/ts4.8/readline/promises.d.ts +143 -0
- package/node_modules/@types/node/ts4.8/readline.d.ts +666 -0
- package/node_modules/@types/node/ts4.8/repl.d.ts +430 -0
- package/node_modules/@types/node/ts4.8/stream/consumers.d.ts +12 -0
- package/node_modules/@types/node/ts4.8/stream/promises.d.ts +83 -0
- package/node_modules/@types/node/ts4.8/stream/web.d.ts +336 -0
- package/node_modules/@types/node/ts4.8/stream.d.ts +1731 -0
- package/node_modules/@types/node/ts4.8/string_decoder.d.ts +67 -0
- package/node_modules/@types/node/ts4.8/test.d.ts +1113 -0
- package/node_modules/@types/node/ts4.8/timers/promises.d.ts +93 -0
- package/node_modules/@types/node/ts4.8/timers.d.ts +126 -0
- package/node_modules/@types/node/ts4.8/tls.d.ts +1203 -0
- package/node_modules/@types/node/ts4.8/trace_events.d.ts +171 -0
- package/node_modules/@types/node/ts4.8/tty.d.ts +206 -0
- package/node_modules/@types/node/ts4.8/url.d.ts +937 -0
- package/node_modules/@types/node/ts4.8/util.d.ts +2075 -0
- package/node_modules/@types/node/ts4.8/v8.d.ts +541 -0
- package/node_modules/@types/node/ts4.8/vm.d.ts +667 -0
- package/node_modules/@types/node/ts4.8/wasi.d.ts +158 -0
- package/node_modules/@types/node/ts4.8/worker_threads.d.ts +692 -0
- package/node_modules/@types/node/ts4.8/zlib.d.ts +517 -0
- package/node_modules/@types/node/tty.d.ts +206 -0
- package/node_modules/@types/node/url.d.ts +937 -0
- package/node_modules/@types/node/util.d.ts +2075 -0
- package/node_modules/@types/node/v8.d.ts +541 -0
- package/node_modules/@types/node/vm.d.ts +667 -0
- package/node_modules/@types/node/wasi.d.ts +158 -0
- package/node_modules/@types/node/worker_threads.d.ts +692 -0
- package/node_modules/@types/node/zlib.d.ts +517 -0
- package/node_modules/@types/react/LICENSE +21 -0
- package/node_modules/@types/react/README.md +16 -0
- package/node_modules/@types/react/experimental.d.ts +192 -0
- package/node_modules/@types/react/global.d.ts +151 -0
- package/node_modules/@types/react/index.d.ts +3175 -0
- package/node_modules/@types/react/jsx-dev-runtime.d.ts +2 -0
- package/node_modules/@types/react/jsx-runtime.d.ts +2 -0
- package/node_modules/@types/react/package.json +149 -0
- package/node_modules/@vitejs/plugin-react-refresh/LICENSE +21 -0
- package/node_modules/@vitejs/plugin-react-refresh/README.md +73 -0
- package/node_modules/@vitejs/plugin-react-refresh/index.d.ts +14 -0
- package/node_modules/@vitejs/plugin-react-refresh/index.js +239 -0
- package/node_modules/@vitejs/plugin-react-refresh/package.json +35 -0
- package/package.json +65 -0
- package/project.json +74 -0
- package/scripts/create-entry-files.ts +44 -0
- package/src/ExtensionServerClient/ExtensionServerClient.test.ts +730 -0
- package/src/ExtensionServerClient/ExtensionServerClient.ts +310 -0
- package/src/ExtensionServerClient/index.ts +2 -0
- package/src/ExtensionServerClient/types.ts +159 -0
- package/src/context/ExtensionServerProvider.test.tsx +173 -0
- package/src/context/ExtensionServerProvider.tsx +46 -0
- package/src/context/constants.ts +15 -0
- package/src/context/index.ts +3 -0
- package/src/context/types.ts +13 -0
- package/src/hooks/index.ts +5 -0
- package/src/hooks/useExtensionClient.ts +6 -0
- package/src/hooks/useExtensionServerContext.ts +4 -0
- package/src/hooks/useExtensionServerEvent.ts +11 -0
- package/src/hooks/useExtensionServerState.ts +6 -0
- package/src/hooks/useIsomorphicLayoutEffect.ts +6 -0
- package/src/i18n.test.ts +417 -0
- package/src/i18n.ts +208 -0
- package/src/index.ts +7 -0
- package/src/state/actions/actions.ts +36 -0
- package/src/state/actions/index.ts +2 -0
- package/src/state/actions/types.ts +26 -0
- package/src/state/index.ts +2 -0
- package/src/state/reducers/constants.ts +6 -0
- package/src/state/reducers/extensionServerReducer.test.ts +160 -0
- package/src/state/reducers/extensionServerReducer.ts +87 -0
- package/src/state/reducers/index.ts +3 -0
- package/src/state/reducers/types.ts +7 -0
- package/src/testing/MockExtensionServerProvider.tsx +36 -0
- package/src/testing/app.ts +15 -0
- package/src/testing/extensions.ts +70 -0
- package/src/testing/index.ts +3 -0
- package/src/types.ts +172 -0
- package/src/utilities/assetToString.test.ts +16 -0
- package/src/utilities/assetToString.ts +8 -0
- package/src/utilities/groupByKey.ts +3 -0
- package/src/utilities/index.ts +7 -0
- package/src/utilities/isUIExtension.ts +7 -0
- package/src/utilities/isValidSurface.ts +7 -0
- package/src/utilities/noop.ts +1 -0
- package/src/utilities/replaceUpdated.test.ts +26 -0
- package/src/utilities/replaceUpdated.ts +16 -0
- package/src/utilities/set.test.ts +19 -0
- package/src/utilities/set.ts +29 -0
- package/testing.d.ts +1 -0
- package/testing.js +1 -0
- package/testing.mjs +1 -0
- package/tests/setup.ts +6 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { toReactString, nodeName } from './toReactString.mjs';
|
|
2
|
+
import { Tag } from './types.mjs';
|
|
3
|
+
|
|
4
|
+
class Element {
|
|
5
|
+
get props() {
|
|
6
|
+
return this.tree.props;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
get type() {
|
|
10
|
+
return this.tree.type;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
get isDOM() {
|
|
14
|
+
return this.tree.tag === Tag.HostComponent;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get instance() {
|
|
18
|
+
return this.tree.instance;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
get children() {
|
|
22
|
+
return this.elementChildren;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get elementDescendants() {
|
|
26
|
+
if (!this.descendantsCache) {
|
|
27
|
+
this.descendantsCache = getDescendants(this);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return this.descendantsCache;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get elementChildren() {
|
|
34
|
+
if (!this.elementChildrenCache) {
|
|
35
|
+
this.elementChildrenCache = this.allChildren.filter(element => typeof element !== 'string');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return this.elementChildrenCache;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get descendants() {
|
|
42
|
+
return this.elementDescendants;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
get domNodes() {
|
|
46
|
+
if (this.isDOM) {
|
|
47
|
+
return [this.instance];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return this.elementChildren.filter(element => element.isDOM).map(element => element.instance);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get domNode() {
|
|
54
|
+
const {
|
|
55
|
+
domNodes
|
|
56
|
+
} = this;
|
|
57
|
+
|
|
58
|
+
if (domNodes.length > 1) {
|
|
59
|
+
throw new Error('You can’t call getDOMNode() on an element that returns multiple HTML elements. Call getDOMNodes() to retrieve all of the elements instead.');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return domNodes[0] || null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
constructor(tree, allChildren, root) {
|
|
66
|
+
this.tree = tree;
|
|
67
|
+
this.allChildren = allChildren;
|
|
68
|
+
this.root = root;
|
|
69
|
+
this.descendantsCache = null;
|
|
70
|
+
this.elementChildrenCache = null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
data(key) {
|
|
74
|
+
return this.props[key.startsWith('data-') ? key : `data-${key}`];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
prop(key) {
|
|
78
|
+
return this.props[key];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
text() {
|
|
82
|
+
const {
|
|
83
|
+
instance,
|
|
84
|
+
allChildren,
|
|
85
|
+
tree: {
|
|
86
|
+
tag
|
|
87
|
+
}
|
|
88
|
+
} = this;
|
|
89
|
+
|
|
90
|
+
if (tag === Tag.HostPortal) {
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (instance instanceof HTMLElement) {
|
|
95
|
+
return instance.textContent || '';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return allChildren.reduce((text, child) => text + (typeof child === 'string' ? child : child.text()), '');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
html() {
|
|
102
|
+
const {
|
|
103
|
+
instance,
|
|
104
|
+
allChildren,
|
|
105
|
+
tree: {
|
|
106
|
+
tag
|
|
107
|
+
}
|
|
108
|
+
} = this;
|
|
109
|
+
|
|
110
|
+
if (tag === Tag.HostPortal) {
|
|
111
|
+
return '';
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (instance instanceof HTMLElement) {
|
|
115
|
+
return instance.outerHTML;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return allChildren.reduce((text, child) => text + (typeof child === 'string' ? child : child.html()), '');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
is(type) {
|
|
122
|
+
return isMatchingType(this.type, type);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
find(type, props) {
|
|
126
|
+
return this.elementDescendants.find(element => isMatchingType(element.type, type) && (props == null || equalSubset(props, element.props))) || null;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
findAll(type, props) {
|
|
130
|
+
return this.elementDescendants.filter(element => isMatchingType(element.type, type) && (props == null || equalSubset(props, element.props)));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
findWhere(predicate) {
|
|
134
|
+
return this.elementDescendants.find(element => predicate(element)) || null;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
findAllWhere(predicate) {
|
|
138
|
+
return this.elementDescendants.filter(element => predicate(element));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
trigger(prop, ...args) {
|
|
142
|
+
return this.root.act(() => {
|
|
143
|
+
const propValue = this.props[prop];
|
|
144
|
+
|
|
145
|
+
if (propValue == null) {
|
|
146
|
+
throw new Error(`Attempted to call prop ${prop} but it was not defined.`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return propValue(...args);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
triggerKeypath(keypath, ...args) {
|
|
154
|
+
return this.root.act(() => {
|
|
155
|
+
const {
|
|
156
|
+
props
|
|
157
|
+
} = this;
|
|
158
|
+
const parts = keypath.split(/[.[\]]/g).filter(Boolean);
|
|
159
|
+
let currentProp = props;
|
|
160
|
+
const currentKeypath = [];
|
|
161
|
+
|
|
162
|
+
for (const part of parts) {
|
|
163
|
+
if (currentProp == null || typeof currentProp !== 'object') {
|
|
164
|
+
throw new Error(`Attempted to access field keypath '${currentKeypath.join('.')}', but it was not an object.`);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
currentProp = currentProp[part];
|
|
168
|
+
currentKeypath.push(part);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (typeof currentProp !== 'function') {
|
|
172
|
+
throw new Error(`Value at keypath '${keypath}' is not a function.`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return currentProp(...args);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
debug(options) {
|
|
180
|
+
return toReactString(this, options);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
toString() {
|
|
184
|
+
return `<${nodeName(this)} />`;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function isMatchingType(type, test) {
|
|
190
|
+
if (type === test) {
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (test == null) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return test.type != null && isMatchingType(type, test.type);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function equalSubset(subset, full) {
|
|
202
|
+
return Object.keys(subset).every(key => key in full && full[key] === subset[key]);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function getDescendants(element) {
|
|
206
|
+
const descendants = []; // eslint-disable-next-line @typescript-eslint/prefer-for-of
|
|
207
|
+
|
|
208
|
+
for (let i = 0; i < element.allChildren.length; i++) {
|
|
209
|
+
const child = element.allChildren[i];
|
|
210
|
+
|
|
211
|
+
if (typeof child !== 'string') {
|
|
212
|
+
descendants.push(child); // eslint-disable-next-line prefer-spread
|
|
213
|
+
|
|
214
|
+
descendants.push.apply(descendants, child.elementDescendants);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return descendants;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export { Element };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { matcherHint, RECEIVED_COLOR, EXPECTED_COLOR, printExpected } from 'jest-matcher-utils';
|
|
2
|
+
import { assertIsNode, assertIsType, printType, diffs, pluralize } from './utilities.mjs';
|
|
3
|
+
|
|
4
|
+
function toContainReactComponent(node, type, props) {
|
|
5
|
+
assertIsNode(node, {
|
|
6
|
+
expectation: 'toContainReactComponent',
|
|
7
|
+
isNot: this.isNot
|
|
8
|
+
});
|
|
9
|
+
assertIsType(type, {
|
|
10
|
+
expectation: 'toContainReactComponent',
|
|
11
|
+
isNot: this.isNot
|
|
12
|
+
});
|
|
13
|
+
const foundByType = node.findAll(type);
|
|
14
|
+
const foundByProps = props == null ? foundByType : foundByType.filter(element => Object.keys(props).every(key => this.equals(props[key], element.props[key])));
|
|
15
|
+
const pass = foundByProps.length > 0;
|
|
16
|
+
const message = pass ? () => `${matcherHint('.not.toContainReactComponent')}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `Not to contain component:\n ${EXPECTED_COLOR(printType(type))}\n${props ? `With props matching:\n ${printExpected(props)}\n` : ''}` + `But ${foundByProps.length} matching ${printType(type)} ${foundByProps.length === 1 ? 'elements were' : 'element was'} found.\n` : () => `${`${matcherHint('.toContainReactComponent')}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `To contain component:\n ${EXPECTED_COLOR(printType(type))}\n${props ? `With props matching:\n ${printExpected(props)}\n` : ''}`}${foundByType.length === 0 ? `But no matching ${printType(type)} elements were found.\n` : `But the ${foundByType.length === 1 ? 'found element has' : 'found elements have'} the following prop differences:\n\n${diffs(foundByType, props, this.expand)}`}`;
|
|
17
|
+
return {
|
|
18
|
+
pass,
|
|
19
|
+
message
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function toContainReactComponentTimes(node, type, times, props) {
|
|
23
|
+
assertIsNode(node, {
|
|
24
|
+
expectation: 'toContainReactComponentTimes',
|
|
25
|
+
isNot: this.isNot
|
|
26
|
+
});
|
|
27
|
+
assertIsType(type, {
|
|
28
|
+
expectation: 'toContainReactComponent',
|
|
29
|
+
isNot: this.isNot
|
|
30
|
+
});
|
|
31
|
+
const foundByType = node.findAll(type);
|
|
32
|
+
const foundByProps = props == null ? foundByType : foundByType.filter(element => Object.keys(props).every(key => this.equals(props[key], element.props[key])));
|
|
33
|
+
const pass = foundByProps.length === times;
|
|
34
|
+
const message = pass ? () => [`${matcherHint('.not.toContainReactComponentTimes')}\n`, `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}`, `Not to contain component:\n ${EXPECTED_COLOR(printType(type))}`, `${times} ${pluralize('time', times)}, but it did.`].join('\n') : () => [`${matcherHint('.toContainReactComponentTimes')}\n`, `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}`, `To contain component:\n ${EXPECTED_COLOR(printType(type))}`, `${times} ${pluralize('time', times)}, but it was found ${foundByProps.length}.`].join('\n');
|
|
35
|
+
return {
|
|
36
|
+
pass,
|
|
37
|
+
message
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { toContainReactComponent, toContainReactComponentTimes };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { matcherHint, RECEIVED_COLOR, EXPECTED_COLOR, printExpected } from 'jest-matcher-utils';
|
|
2
|
+
import { assertIsNode, printType, diffs } from './utilities.mjs';
|
|
3
|
+
|
|
4
|
+
function toProvideReactContext(node, Context, value) {
|
|
5
|
+
assertIsNode(node, {
|
|
6
|
+
expectation: 'toProvideReactContext',
|
|
7
|
+
isNot: this.isNot
|
|
8
|
+
});
|
|
9
|
+
const foundByType = node.findAll(Context.Provider);
|
|
10
|
+
const foundByValue = value == null ? foundByType : foundByType.filter(element => this.equals(value, element.prop('value')));
|
|
11
|
+
const pass = foundByValue.length > 0;
|
|
12
|
+
const message = pass ? () => `${matcherHint('.not.toProvideReactContext')}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `Not to contain context provider:\n ${EXPECTED_COLOR(printType(Context.Provider))}\n${value ? `With value matching:\n ${printExpected(value)}\n` : ''}` + `But ${foundByValue.length} matching ${printType(Context.Provider)}${foundByValue.length === 1 ? 's were' : ' was'} found.\n` : () => `${`${matcherHint('.toProvideReactContext')}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `To contain context provider:\n ${EXPECTED_COLOR(printType(Context.Provider))}\n${value ? `With value matching:\n ${printExpected(value)}\n` : ''}`}${foundByType.length === 0 ? `But no matching ${printType(Context.Provider)}s were found.\n` : `But the ${foundByType.length === 1 ? 'found provider has' : 'found provider have'} had different values:\n\n${diffs(foundByType, {
|
|
13
|
+
value
|
|
14
|
+
}, this.expand)}`}`;
|
|
15
|
+
return {
|
|
16
|
+
pass,
|
|
17
|
+
message
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { toProvideReactContext };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { toHaveReactProps, toHaveReactDataProps } from './props.mjs';
|
|
2
|
+
import { toContainReactComponent, toContainReactComponentTimes } from './components.mjs';
|
|
3
|
+
import { toProvideReactContext } from './context.mjs';
|
|
4
|
+
import { toContainReactText, toContainReactHtml } from './strings.mjs';
|
|
5
|
+
|
|
6
|
+
expect.extend({
|
|
7
|
+
toHaveReactProps,
|
|
8
|
+
toHaveReactDataProps,
|
|
9
|
+
toContainReactComponent,
|
|
10
|
+
toContainReactComponentTimes,
|
|
11
|
+
toContainReactText,
|
|
12
|
+
toContainReactHtml,
|
|
13
|
+
toProvideReactContext
|
|
14
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { matcherHint, RECEIVED_COLOR, printExpected, printReceived } from 'jest-matcher-utils';
|
|
2
|
+
import { assertIsNode, diffPropsForNode } from './utilities.mjs';
|
|
3
|
+
|
|
4
|
+
function toHaveReactProps(node, props) {
|
|
5
|
+
assertIsNode(node, {
|
|
6
|
+
expectation: 'toHaveReactProps',
|
|
7
|
+
isNot: this.isNot
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
if (props == null || typeof props !== 'object') {
|
|
11
|
+
return {
|
|
12
|
+
pass: false,
|
|
13
|
+
message: () => `You passed ${props == null ? String(props) : `a ${typeof props}`} as props, but it must be an object.`
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const pass = Object.keys(props).every(key => this.equals(props[key], node.props[key]));
|
|
18
|
+
const message = pass ? () => `${matcherHint('.not.toHaveReactProps', node.toString())}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `Not to have props:\n ${printExpected(props)}\n` + `Received:\n ${printReceived(node.props)}\n` : () => {
|
|
19
|
+
const diffString = diffPropsForNode(node, props, {
|
|
20
|
+
expand: this.expand
|
|
21
|
+
});
|
|
22
|
+
return `${matcherHint('.toHaveReactProps', node.toString())}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `To have props:\n ${printExpected(props)}\n` + `Received:\n ${printReceived(node.props)}\n${diffString ? `Difference:\n${diffString}\n` : ''}`;
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
pass,
|
|
26
|
+
message
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function toHaveReactDataProps(node, data) {
|
|
30
|
+
return toHaveReactProps.call(this, node, data);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { toHaveReactDataProps, toHaveReactProps };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { matcherHint, RECEIVED_COLOR, printExpected, INVERTED_COLOR, printReceived } from 'jest-matcher-utils';
|
|
2
|
+
import { assertIsNode } from './utilities.mjs';
|
|
3
|
+
|
|
4
|
+
function toContainReactText(node, text) {
|
|
5
|
+
assertIsNode(node, {
|
|
6
|
+
expectation: 'toContainReactText',
|
|
7
|
+
isNot: this.isNot
|
|
8
|
+
});
|
|
9
|
+
const nodeText = node.text();
|
|
10
|
+
const matchIndex = nodeText.indexOf(text);
|
|
11
|
+
const pass = matchIndex >= 0;
|
|
12
|
+
const message = pass ? () => `${matcherHint('.not.toContainReactText', node.toString())}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `Not to contain text:\n ${printExpected(text)}\n` + `But it did:\n ${printReceivedWithHighlight(nodeText, matchIndex, text.length)}\n` : () => `${matcherHint('.not.toContainReactText', node.toString())}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `With text content:\n ${printReceived(nodeText)}\n` + `To contain string:\n ${printExpected(text)}\n`;
|
|
13
|
+
return {
|
|
14
|
+
pass,
|
|
15
|
+
message
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function toContainReactHtml(node, text) {
|
|
19
|
+
assertIsNode(node, {
|
|
20
|
+
expectation: 'toContainReactHtml',
|
|
21
|
+
isNot: this.isNot
|
|
22
|
+
});
|
|
23
|
+
const nodeHtml = node.html();
|
|
24
|
+
const matchIndex = nodeHtml.indexOf(text);
|
|
25
|
+
const pass = matchIndex >= 0;
|
|
26
|
+
const message = pass ? () => `${matcherHint('.not.toContainReactHtml', node.toString())}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `Not to contain HTML:\n ${printExpected(text)}\n` + `But it did:\n ${printReceivedWithHighlight(nodeHtml, matchIndex, text.length)}\n` : () => `${matcherHint('.not.toContainReactHtml', node.toString())}\n\n` + `Expected the React element:\n ${RECEIVED_COLOR(node.toString())}\n` + `With HTML content:\n ${printReceived(nodeHtml)}\n` + `To contain HTML:\n ${printExpected(text)}\n`;
|
|
27
|
+
return {
|
|
28
|
+
pass,
|
|
29
|
+
message
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function printReceivedWithHighlight(text, start, length) {
|
|
34
|
+
return RECEIVED_COLOR(`"${text.slice(0, start)}${INVERTED_COLOR(text.slice(start, start + length))}${text.slice(start + length)}"`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { toContainReactHtml, toContainReactText };
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { diff, matcherErrorMessage, matcherHint, RECEIVED_COLOR, printWithType, printReceived, printExpected } from 'jest-matcher-utils';
|
|
2
|
+
import { Root } from '../root.mjs';
|
|
3
|
+
import { Element } from '../element.mjs';
|
|
4
|
+
|
|
5
|
+
function assertIsNode(node, {
|
|
6
|
+
expectation,
|
|
7
|
+
isNot
|
|
8
|
+
}) {
|
|
9
|
+
if (node == null) {
|
|
10
|
+
throw new Error(matcherErrorMessage(matcherHint(`.${expectation}`, undefined, undefined, {
|
|
11
|
+
isNot
|
|
12
|
+
}), `${RECEIVED_COLOR('received')} value must be an @shopify/react-testing Root or Element object`, `Received ${RECEIVED_COLOR('null')}.\nThis usually means that your \`.findX\` method failed to find any matching elements.`));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (Array.isArray(node) && node.length > 1 && (node[0] instanceof Root || node[0] instanceof Element)) {
|
|
16
|
+
throw new Error(matcherErrorMessage(matcherHint(`.${expectation}`, undefined, undefined, {
|
|
17
|
+
isNot
|
|
18
|
+
}), `${RECEIVED_COLOR('received')} value must be an @shopify/react-testing Root or Element object`, `Received an ${RECEIVED_COLOR('array of Root or Element objects')}.\nThis usually means that you passed in the result of \`.findAllX\`. Pass the result of \`.findX\` instead.`));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!(node instanceof Root) && !(node instanceof Element)) {
|
|
22
|
+
throw new Error(matcherErrorMessage(matcherHint(`.${expectation}`, undefined, undefined, {
|
|
23
|
+
isNot
|
|
24
|
+
}), `${RECEIVED_COLOR('received')} value must be an @shopify/react-testing Root or Element object`, printWithType('Received', node, printReceived)));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function assertIsType(type, {
|
|
28
|
+
expectation,
|
|
29
|
+
isNot
|
|
30
|
+
}) {
|
|
31
|
+
if (type == null) {
|
|
32
|
+
throw new Error(matcherErrorMessage(matcherHint(`.${expectation}`, undefined, undefined, {
|
|
33
|
+
isNot
|
|
34
|
+
}), `${RECEIVED_COLOR('expected')} value must be a string or a valid React component.`, printWithType('Expected', type, printExpected)));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function diffs(element, props, expand) {
|
|
38
|
+
return element.reduce((diffs, element, index) => {
|
|
39
|
+
const separator = index === 0 ? '' : '\n\n';
|
|
40
|
+
return `${diffs}${separator}${normalizedDiff(element, props, {
|
|
41
|
+
expand,
|
|
42
|
+
showLegend: index === 0
|
|
43
|
+
})}`;
|
|
44
|
+
}, '');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function normalizedDiff(element, props, {
|
|
48
|
+
expand = false,
|
|
49
|
+
showLegend = false
|
|
50
|
+
}) {
|
|
51
|
+
const result = diffPropsForNode(element, props, {
|
|
52
|
+
expand
|
|
53
|
+
}) || '';
|
|
54
|
+
return showLegend ? result : result.split('\n\n')[1];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function printType(type) {
|
|
58
|
+
if (typeof type === 'object' && '_context' in type) {
|
|
59
|
+
const context = type._context;
|
|
60
|
+
const componentName = type === context.Provider ? 'Provider' : 'Consumer';
|
|
61
|
+
|
|
62
|
+
const _displayName = context.displayName || 'Context';
|
|
63
|
+
|
|
64
|
+
return `<${_displayName}.${componentName} />`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const displayName = typeof type === 'string' ? type : type.displayName || type.name || 'Component';
|
|
68
|
+
return `<${displayName} />`;
|
|
69
|
+
}
|
|
70
|
+
function diffPropsForNode(node, props, {
|
|
71
|
+
expand = false
|
|
72
|
+
}) {
|
|
73
|
+
return diff(props, getObjectSubset(node.props, props), {
|
|
74
|
+
expand
|
|
75
|
+
});
|
|
76
|
+
} // Original from https://github.com/facebook/jest/blob/master/packages/expect/src/utils.ts#L107
|
|
77
|
+
|
|
78
|
+
function getObjectSubset(object, subset) {
|
|
79
|
+
if (Array.isArray(object)) {
|
|
80
|
+
if (Array.isArray(subset) && subset.length === object.length) {
|
|
81
|
+
return subset.map((sub, i) => getObjectSubset(object[i], sub));
|
|
82
|
+
}
|
|
83
|
+
} else if (object instanceof Date) {
|
|
84
|
+
return object;
|
|
85
|
+
} else if (typeof object === 'object' && object !== null && typeof subset === 'object' && subset !== null) {
|
|
86
|
+
const trimmed = {};
|
|
87
|
+
Object.keys(subset).filter(key => Reflect.has(object, key)).forEach(key => trimmed[key] = getObjectSubset(object[key], subset[key]));
|
|
88
|
+
|
|
89
|
+
if (Object.keys(trimmed).length > 0) {
|
|
90
|
+
return trimmed;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return object;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function pluralize(word, count) {
|
|
98
|
+
return count === 1 ? word : `${word}s`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export { assertIsNode, assertIsType, diffPropsForNode, diffs, pluralize, printType };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { objectSpread2 as _objectSpread2 } from './_virtual/_rollupPluginBabelHelpers.mjs';
|
|
2
|
+
import { Root } from './root.mjs';
|
|
3
|
+
export { Root } from './root.mjs';
|
|
4
|
+
|
|
5
|
+
function mount(element) {
|
|
6
|
+
return new Root(element);
|
|
7
|
+
}
|
|
8
|
+
class CustomRoot extends Root {
|
|
9
|
+
constructor(tree, context, options) {
|
|
10
|
+
super(tree, options);
|
|
11
|
+
this.context = context;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
}
|
|
15
|
+
function createMount({
|
|
16
|
+
render,
|
|
17
|
+
context: createContext = defaultContext,
|
|
18
|
+
afterMount = defaultAfterMount,
|
|
19
|
+
cleanup
|
|
20
|
+
}) {
|
|
21
|
+
function mount(element, options = {}) {
|
|
22
|
+
const context = createContext(options);
|
|
23
|
+
const wrapper = new CustomRoot(element, context, {
|
|
24
|
+
render: element => render(element, context, options),
|
|
25
|
+
resolveRoot: root => root.find(element.type)
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
if (cleanup) {
|
|
29
|
+
const originalDestroy = wrapper.destroy.bind(wrapper);
|
|
30
|
+
|
|
31
|
+
wrapper.destroy = () => {
|
|
32
|
+
cleanup(wrapper, options);
|
|
33
|
+
originalDestroy();
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const afterMountResult = afterMount(wrapper, options);
|
|
38
|
+
return afterMountResult != null && 'then' in afterMountResult ? afterMountResult.then(() => wrapper) : wrapper;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Reflect.defineProperty(mount, 'extend', {
|
|
42
|
+
writable: false,
|
|
43
|
+
value: ({
|
|
44
|
+
context: createAdditionalContext = defaultContext,
|
|
45
|
+
render: additionalRender,
|
|
46
|
+
afterMount: additionalAfterMount = defaultAfterMount
|
|
47
|
+
}) => {
|
|
48
|
+
return createMount({
|
|
49
|
+
context: options => _objectSpread2(_objectSpread2({}, createContext(options)), createAdditionalContext(options)),
|
|
50
|
+
render: (element, context, options) => render(additionalRender(element, context, options), context, options),
|
|
51
|
+
afterMount: (wrapper, options) => {
|
|
52
|
+
const result = additionalAfterMount(wrapper, options);
|
|
53
|
+
|
|
54
|
+
const finalResult = () => afterMount(wrapper, options);
|
|
55
|
+
|
|
56
|
+
return result != null && 'then' in result ? result.then(finalResult) : finalResult();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return mount;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function defaultContext() {
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function defaultAfterMount() {}
|
|
69
|
+
|
|
70
|
+
export { CustomRoot, createMount, mount };
|