@shopify/ui-extensions-server-kit 5.3.1 → 5.4.1

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.
Files changed (244) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +3 -2
  3. package/dist/ExtensionServerClient/ExtensionServerClient.d.ts +3 -5
  4. package/dist/ExtensionServerClient/server-types.d.ts +31 -7
  5. package/dist/_virtual/jsx-runtime.cjs.js +1 -0
  6. package/dist/_virtual/jsx-runtime.cjs2.js +1 -0
  7. package/dist/_virtual/jsx-runtime.es.js +5 -0
  8. package/dist/_virtual/jsx-runtime.es2.js +4 -0
  9. package/dist/_virtual/react-jsx-runtime.development.cjs.js +1 -0
  10. package/dist/_virtual/react-jsx-runtime.development.es.js +4 -0
  11. package/dist/_virtual/react-jsx-runtime.production.min.cjs.js +1 -0
  12. package/dist/_virtual/react-jsx-runtime.production.min.es.js +4 -0
  13. package/dist/context/ExtensionServerProvider.d.ts +2 -1
  14. package/dist/i18n.d.ts +2 -8
  15. package/dist/index.cjs.js +1 -1
  16. package/dist/index.cjs2.js +1 -1
  17. package/dist/index.es.js +18 -18
  18. package/dist/index.es2.js +3 -3
  19. package/dist/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.development.cjs.js +22 -0
  20. package/dist/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.development.es.js +604 -0
  21. package/dist/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.production.min.cjs.js +9 -0
  22. package/dist/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.production.min.es.js +28 -0
  23. package/dist/node_modules/.pnpm/react@18.3.1/node_modules/react/jsx-runtime.cjs.js +1 -0
  24. package/dist/node_modules/.pnpm/react@18.3.1/node_modules/react/jsx-runtime.es.js +10 -0
  25. package/dist/packages/ui-extensions-server-kit/src/ExtensionServerClient/ExtensionServerClient.cjs.js +1 -0
  26. package/dist/{ExtensionServerClient → packages/ui-extensions-server-kit/src/ExtensionServerClient}/ExtensionServerClient.es.js +21 -18
  27. package/dist/packages/ui-extensions-server-kit/src/context/ExtensionServerProvider.cjs.js +1 -0
  28. package/dist/packages/ui-extensions-server-kit/src/context/ExtensionServerProvider.es.js +30 -0
  29. package/dist/{context → packages/ui-extensions-server-kit/src/context}/constants.cjs.js +1 -1
  30. package/dist/packages/ui-extensions-server-kit/src/hooks/useExtensionServerContext.cjs.js +1 -0
  31. package/dist/{hooks → packages/ui-extensions-server-kit/src/hooks}/useExtensionServerContext.es.js +3 -2
  32. package/dist/packages/ui-extensions-server-kit/src/testing/MockExtensionServerProvider.cjs.js +1 -0
  33. package/dist/packages/ui-extensions-server-kit/src/testing/MockExtensionServerProvider.es.js +25 -0
  34. package/dist/{testing → packages/ui-extensions-server-kit/src/testing}/extensions.cjs.js +1 -1
  35. package/dist/{testing → packages/ui-extensions-server-kit/src/testing}/extensions.es.js +3 -2
  36. package/dist/packages/ui-extensions-server-kit/src/utilities/isUIExtension.cjs.js +1 -0
  37. package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/isUIExtension.es.js +3 -2
  38. package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/isValidSurface.cjs.js +1 -1
  39. package/dist/packages/ui-extensions-server-kit/src/utilities/isValidSurface.es.js +7 -0
  40. package/dist/testing/MockExtensionServerProvider.d.ts +2 -1
  41. package/dist/types.d.ts +14 -7
  42. package/dist/utilities/isUIExtension.d.ts +1 -1
  43. package/dist/utilities/isValidSurface.d.ts +1 -1
  44. package/dist/utilities/set.d.ts +1 -1
  45. package/node_modules/{@shopify/react-testing/LICENSE.md → @testing-library/react/LICENSE} +2 -3
  46. package/node_modules/@testing-library/react/README.md +692 -0
  47. package/node_modules/@testing-library/react/dist/@testing-library/react.cjs.js +537 -0
  48. package/node_modules/@testing-library/react/dist/@testing-library/react.esm.js +497 -0
  49. package/node_modules/@testing-library/react/dist/@testing-library/react.pure.cjs.js +501 -0
  50. package/node_modules/@testing-library/react/dist/@testing-library/react.pure.esm.js +461 -0
  51. package/node_modules/@testing-library/react/dist/@testing-library/react.pure.umd.js +502 -0
  52. package/node_modules/@testing-library/react/dist/@testing-library/react.pure.umd.js.map +1 -0
  53. package/node_modules/@testing-library/react/dist/@testing-library/react.pure.umd.min.js +2 -0
  54. package/node_modules/@testing-library/react/dist/@testing-library/react.pure.umd.min.js.map +1 -0
  55. package/node_modules/@testing-library/react/dist/@testing-library/react.umd.js +538 -0
  56. package/node_modules/@testing-library/react/dist/@testing-library/react.umd.js.map +1 -0
  57. package/node_modules/@testing-library/react/dist/@testing-library/react.umd.min.js +2 -0
  58. package/node_modules/@testing-library/react/dist/@testing-library/react.umd.min.js.map +1 -0
  59. package/node_modules/@testing-library/react/dist/act-compat.js +80 -0
  60. package/node_modules/@testing-library/react/dist/config.js +33 -0
  61. package/node_modules/@testing-library/react/dist/fire-event.js +70 -0
  62. package/node_modules/@testing-library/react/dist/index.js +52 -0
  63. package/node_modules/@testing-library/react/dist/pure.js +356 -0
  64. package/node_modules/@testing-library/react/dont-cleanup-after-each.js +1 -0
  65. package/node_modules/@testing-library/react/package.json +116 -0
  66. package/node_modules/@testing-library/react/pure.d.ts +1 -0
  67. package/node_modules/@testing-library/react/pure.js +2 -0
  68. package/node_modules/@testing-library/react/types/index.d.ts +287 -0
  69. package/node_modules/@testing-library/react/types/pure.d.ts +1 -0
  70. package/node_modules/@types/react/README.md +4 -5
  71. package/node_modules/@types/react/canary.d.ts +166 -0
  72. package/node_modules/@types/react/experimental.d.ts +21 -86
  73. package/node_modules/@types/react/global.d.ts +146 -137
  74. package/node_modules/@types/react/index.d.ts +2738 -1370
  75. package/node_modules/@types/react/jsx-dev-runtime.d.ts +45 -2
  76. package/node_modules/@types/react/jsx-runtime.d.ts +36 -2
  77. package/node_modules/@types/react/package.json +111 -54
  78. package/node_modules/@types/react/ts5.0/canary.d.ts +166 -0
  79. package/node_modules/@types/react/ts5.0/experimental.d.ts +127 -0
  80. package/node_modules/@types/react/ts5.0/global.d.ts +160 -0
  81. package/node_modules/@types/react/ts5.0/index.d.ts +4530 -0
  82. package/node_modules/@types/react/ts5.0/jsx-dev-runtime.d.ts +44 -0
  83. package/node_modules/@types/react/ts5.0/jsx-runtime.d.ts +35 -0
  84. package/node_modules/@vitejs/plugin-react/README.md +159 -0
  85. package/node_modules/@vitejs/plugin-react/dist/index.d.ts +75 -0
  86. package/node_modules/@vitejs/plugin-react/dist/index.js +401 -0
  87. package/node_modules/@vitejs/plugin-react/dist/refresh-runtime.js +663 -0
  88. package/node_modules/@vitejs/plugin-react/package.json +77 -0
  89. package/node_modules/@vitejs/plugin-react/types/preamble.d.ts +1 -0
  90. package/package.json +9 -10
  91. package/project.json +1 -1
  92. package/src/ExtensionServerClient/ExtensionServerClient.test.ts +6 -5
  93. package/src/ExtensionServerClient/ExtensionServerClient.ts +27 -19
  94. package/src/ExtensionServerClient/server-types.ts +17 -7
  95. package/src/ExtensionServerClient/types.ts +0 -2
  96. package/src/context/ExtensionServerProvider.test.tsx +55 -73
  97. package/src/context/ExtensionServerProvider.tsx +1 -0
  98. package/src/i18n.ts +2 -5
  99. package/src/state/reducers/extensionServerReducer.test.ts +2 -2
  100. package/src/testing/extensions.ts +1 -0
  101. package/src/types.ts +15 -5
  102. package/src/utilities/assetToString.ts +0 -1
  103. package/src/utilities/isUIExtension.ts +5 -4
  104. package/src/utilities/isValidSurface.ts +2 -3
  105. package/src/utilities/replaceUpdated.ts +0 -2
  106. package/src/utilities/set.ts +10 -5
  107. package/tests/setup.ts +1 -4
  108. package/vite.config.mts +57 -0
  109. package/dist/ExtensionServerClient/ExtensionServerClient.cjs.js +0 -1
  110. package/dist/context/ExtensionServerProvider.cjs.js +0 -1
  111. package/dist/context/ExtensionServerProvider.es.js +0 -29
  112. package/dist/hooks/useExtensionServerContext.cjs.js +0 -1
  113. package/dist/testing/MockExtensionServerProvider.cjs.js +0 -1
  114. package/dist/testing/MockExtensionServerProvider.es.js +0 -24
  115. package/dist/utilities/isUIExtension.cjs.js +0 -1
  116. package/dist/utilities/isValidSurface.es.js +0 -7
  117. package/node_modules/@shopify/react-testing/README.md +0 -711
  118. package/node_modules/@shopify/react-testing/build/cjs/TestWrapper.js +0 -52
  119. package/node_modules/@shopify/react-testing/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -47
  120. package/node_modules/@shopify/react-testing/build/cjs/compat.js +0 -14
  121. package/node_modules/@shopify/react-testing/build/cjs/destroy.js +0 -13
  122. package/node_modules/@shopify/react-testing/build/cjs/element.js +0 -225
  123. package/node_modules/@shopify/react-testing/build/cjs/index.js +0 -21
  124. package/node_modules/@shopify/react-testing/build/cjs/matchers/components.js +0 -46
  125. package/node_modules/@shopify/react-testing/build/cjs/matchers/context.js +0 -25
  126. package/node_modules/@shopify/react-testing/build/cjs/matchers/index.js +0 -16
  127. package/node_modules/@shopify/react-testing/build/cjs/matchers/props.js +0 -38
  128. package/node_modules/@shopify/react-testing/build/cjs/matchers/strings.js +0 -42
  129. package/node_modules/@shopify/react-testing/build/cjs/matchers/utilities.js +0 -110
  130. package/node_modules/@shopify/react-testing/build/cjs/mount.js +0 -76
  131. package/node_modules/@shopify/react-testing/build/cjs/root.js +0 -284
  132. package/node_modules/@shopify/react-testing/build/cjs/toReactString.js +0 -86
  133. package/node_modules/@shopify/react-testing/build/cjs/types.js +0 -28
  134. package/node_modules/@shopify/react-testing/build/esm/TestWrapper.mjs +0 -44
  135. package/node_modules/@shopify/react-testing/build/esm/_virtual/_rollupPluginBabelHelpers.mjs +0 -42
  136. package/node_modules/@shopify/react-testing/build/esm/compat.mjs +0 -10
  137. package/node_modules/@shopify/react-testing/build/esm/destroy.mjs +0 -9
  138. package/node_modules/@shopify/react-testing/build/esm/element.mjs +0 -221
  139. package/node_modules/@shopify/react-testing/build/esm/index.mjs +0 -5
  140. package/node_modules/@shopify/react-testing/build/esm/matchers/components.mjs +0 -41
  141. package/node_modules/@shopify/react-testing/build/esm/matchers/context.mjs +0 -21
  142. package/node_modules/@shopify/react-testing/build/esm/matchers/index.mjs +0 -14
  143. package/node_modules/@shopify/react-testing/build/esm/matchers/props.mjs +0 -33
  144. package/node_modules/@shopify/react-testing/build/esm/matchers/strings.mjs +0 -37
  145. package/node_modules/@shopify/react-testing/build/esm/matchers/utilities.mjs +0 -101
  146. package/node_modules/@shopify/react-testing/build/esm/mount.mjs +0 -70
  147. package/node_modules/@shopify/react-testing/build/esm/root.mjs +0 -275
  148. package/node_modules/@shopify/react-testing/build/esm/toReactString.mjs +0 -80
  149. package/node_modules/@shopify/react-testing/build/esm/types.mjs +0 -26
  150. package/node_modules/@shopify/react-testing/build/esnext/TestWrapper.esnext +0 -44
  151. package/node_modules/@shopify/react-testing/build/esnext/compat.esnext +0 -10
  152. package/node_modules/@shopify/react-testing/build/esnext/destroy.esnext +0 -9
  153. package/node_modules/@shopify/react-testing/build/esnext/element.esnext +0 -221
  154. package/node_modules/@shopify/react-testing/build/esnext/index.esnext +0 -5
  155. package/node_modules/@shopify/react-testing/build/esnext/matchers/components.esnext +0 -41
  156. package/node_modules/@shopify/react-testing/build/esnext/matchers/context.esnext +0 -21
  157. package/node_modules/@shopify/react-testing/build/esnext/matchers/index.esnext +0 -14
  158. package/node_modules/@shopify/react-testing/build/esnext/matchers/props.esnext +0 -33
  159. package/node_modules/@shopify/react-testing/build/esnext/matchers/strings.esnext +0 -37
  160. package/node_modules/@shopify/react-testing/build/esnext/matchers/utilities.esnext +0 -99
  161. package/node_modules/@shopify/react-testing/build/esnext/mount.esnext +0 -71
  162. package/node_modules/@shopify/react-testing/build/esnext/root.esnext +0 -275
  163. package/node_modules/@shopify/react-testing/build/esnext/toReactString.esnext +0 -80
  164. package/node_modules/@shopify/react-testing/build/esnext/types.esnext +0 -26
  165. package/node_modules/@shopify/react-testing/build/ts/TestWrapper.d.ts +0 -17
  166. package/node_modules/@shopify/react-testing/build/ts/TestWrapper.d.ts.map +0 -1
  167. package/node_modules/@shopify/react-testing/build/ts/compat.d.ts +0 -3
  168. package/node_modules/@shopify/react-testing/build/ts/compat.d.ts.map +0 -1
  169. package/node_modules/@shopify/react-testing/build/ts/destroy.d.ts +0 -2
  170. package/node_modules/@shopify/react-testing/build/ts/destroy.d.ts.map +0 -1
  171. package/node_modules/@shopify/react-testing/build/ts/element.d.ts +0 -42
  172. package/node_modules/@shopify/react-testing/build/ts/element.d.ts.map +0 -1
  173. package/node_modules/@shopify/react-testing/build/ts/index.d.ts +0 -7
  174. package/node_modules/@shopify/react-testing/build/ts/index.d.ts.map +0 -1
  175. package/node_modules/@shopify/react-testing/build/ts/matchers/components.d.ts +0 -12
  176. package/node_modules/@shopify/react-testing/build/ts/matchers/components.d.ts.map +0 -1
  177. package/node_modules/@shopify/react-testing/build/ts/matchers/context.d.ts +0 -8
  178. package/node_modules/@shopify/react-testing/build/ts/matchers/context.d.ts.map +0 -1
  179. package/node_modules/@shopify/react-testing/build/ts/matchers/index.d.ts +0 -20
  180. package/node_modules/@shopify/react-testing/build/ts/matchers/index.d.ts.map +0 -1
  181. package/node_modules/@shopify/react-testing/build/ts/matchers/props.d.ts +0 -10
  182. package/node_modules/@shopify/react-testing/build/ts/matchers/props.d.ts.map +0 -1
  183. package/node_modules/@shopify/react-testing/build/ts/matchers/strings.d.ts +0 -11
  184. package/node_modules/@shopify/react-testing/build/ts/matchers/strings.d.ts.map +0 -1
  185. package/node_modules/@shopify/react-testing/build/ts/matchers/utilities.d.ts +0 -17
  186. package/node_modules/@shopify/react-testing/build/ts/matchers/utilities.d.ts.map +0 -1
  187. package/node_modules/@shopify/react-testing/build/ts/mount.d.ts +0 -39
  188. package/node_modules/@shopify/react-testing/build/ts/mount.d.ts.map +0 -1
  189. package/node_modules/@shopify/react-testing/build/ts/root.d.ts +0 -55
  190. package/node_modules/@shopify/react-testing/build/ts/root.d.ts.map +0 -1
  191. package/node_modules/@shopify/react-testing/build/ts/toReactString.d.ts +0 -5
  192. package/node_modules/@shopify/react-testing/build/ts/toReactString.d.ts.map +0 -1
  193. package/node_modules/@shopify/react-testing/build/ts/types.d.ts +0 -89
  194. package/node_modules/@shopify/react-testing/build/ts/types.d.ts.map +0 -1
  195. package/node_modules/@shopify/react-testing/index.esnext +0 -1
  196. package/node_modules/@shopify/react-testing/index.js +0 -1
  197. package/node_modules/@shopify/react-testing/index.mjs +0 -1
  198. package/node_modules/@shopify/react-testing/matchers.esnext +0 -1
  199. package/node_modules/@shopify/react-testing/matchers.js +0 -1
  200. package/node_modules/@shopify/react-testing/matchers.mjs +0 -1
  201. package/node_modules/@shopify/react-testing/package.json +0 -69
  202. package/node_modules/@shopify/ui-extensions-test-utils/CHANGELOG.md +0 -66
  203. package/node_modules/@shopify/ui-extensions-test-utils/dist/index.d.ts +0 -3
  204. package/node_modules/@shopify/ui-extensions-test-utils/dist/index.js +0 -3
  205. package/node_modules/@shopify/ui-extensions-test-utils/dist/render.d.ts +0 -2
  206. package/node_modules/@shopify/ui-extensions-test-utils/dist/render.js +0 -5
  207. package/node_modules/@shopify/ui-extensions-test-utils/dist/renderHook.d.ts +0 -17
  208. package/node_modules/@shopify/ui-extensions-test-utils/dist/renderHook.js +0 -20
  209. package/node_modules/@shopify/ui-extensions-test-utils/dist/withProviders.d.ts +0 -9
  210. package/node_modules/@shopify/ui-extensions-test-utils/dist/withProviders.js +0 -7
  211. package/node_modules/@shopify/ui-extensions-test-utils/package.json +0 -40
  212. package/node_modules/@shopify/ui-extensions-test-utils/project.json +0 -39
  213. package/node_modules/@vitejs/plugin-react-refresh/README.md +0 -73
  214. package/node_modules/@vitejs/plugin-react-refresh/index.d.ts +0 -14
  215. package/node_modules/@vitejs/plugin-react-refresh/index.js +0 -239
  216. package/node_modules/@vitejs/plugin-react-refresh/package.json +0 -35
  217. /package/dist/{ExtensionServerClient → packages/ui-extensions-server-kit/src/ExtensionServerClient}/types.cjs.js +0 -0
  218. /package/dist/{ExtensionServerClient → packages/ui-extensions-server-kit/src/ExtensionServerClient}/types.es.js +0 -0
  219. /package/dist/{context → packages/ui-extensions-server-kit/src/context}/constants.es.js +0 -0
  220. /package/dist/{hooks → packages/ui-extensions-server-kit/src/hooks}/useExtensionServerState.cjs.js +0 -0
  221. /package/dist/{hooks → packages/ui-extensions-server-kit/src/hooks}/useExtensionServerState.es.js +0 -0
  222. /package/dist/{hooks → packages/ui-extensions-server-kit/src/hooks}/useIsomorphicLayoutEffect.cjs.js +0 -0
  223. /package/dist/{hooks → packages/ui-extensions-server-kit/src/hooks}/useIsomorphicLayoutEffect.es.js +0 -0
  224. /package/dist/{i18n.cjs.js → packages/ui-extensions-server-kit/src/i18n.cjs.js} +0 -0
  225. /package/dist/{i18n.es.js → packages/ui-extensions-server-kit/src/i18n.es.js} +0 -0
  226. /package/dist/{state → packages/ui-extensions-server-kit/src/state}/actions/actions.cjs.js +0 -0
  227. /package/dist/{state → packages/ui-extensions-server-kit/src/state}/actions/actions.es.js +0 -0
  228. /package/dist/{state → packages/ui-extensions-server-kit/src/state}/reducers/constants.cjs.js +0 -0
  229. /package/dist/{state → packages/ui-extensions-server-kit/src/state}/reducers/constants.es.js +0 -0
  230. /package/dist/{state → packages/ui-extensions-server-kit/src/state}/reducers/extensionServerReducer.cjs.js +0 -0
  231. /package/dist/{state → packages/ui-extensions-server-kit/src/state}/reducers/extensionServerReducer.es.js +0 -0
  232. /package/dist/{testing → packages/ui-extensions-server-kit/src/testing}/app.cjs.js +0 -0
  233. /package/dist/{testing → packages/ui-extensions-server-kit/src/testing}/app.es.js +0 -0
  234. /package/dist/{types.cjs.js → packages/ui-extensions-server-kit/src/types.cjs.js} +0 -0
  235. /package/dist/{types.es.js → packages/ui-extensions-server-kit/src/types.es.js} +0 -0
  236. /package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/assetToString.cjs.js +0 -0
  237. /package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/assetToString.es.js +0 -0
  238. /package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/noop.cjs.js +0 -0
  239. /package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/noop.es.js +0 -0
  240. /package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/replaceUpdated.cjs.js +0 -0
  241. /package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/replaceUpdated.es.js +0 -0
  242. /package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/set.cjs.js +0 -0
  243. /package/dist/{utilities → packages/ui-extensions-server-kit/src/utilities}/set.es.js +0 -0
  244. /package/node_modules/@vitejs/{plugin-react-refresh → plugin-react}/LICENSE +0 -0
package/src/i18n.ts CHANGED
@@ -6,7 +6,7 @@ type Translation = string | {[key: string]: Translation}
6
6
 
7
7
  export interface Localization {
8
8
  defaultLocale: string
9
- translations: {[key: string]: {[key: string]: Translation}}
9
+ translations: Record<string, Record<string, Translation>>
10
10
  lastUpdated: number
11
11
  }
12
12
 
@@ -63,9 +63,7 @@ interface TranslationDictionary {
63
63
  * }
64
64
  * ```
65
65
  */
66
- interface ExtensionTranslationMap {
67
- [key: string]: string
68
- }
66
+ type ExtensionTranslationMap = Record<string, string>
69
67
 
70
68
  export const TRANSLATED_KEYS = ['localization', 'name', 'description']
71
69
  /**
@@ -105,7 +103,6 @@ function traverseDictionary(
105
103
  }
106
104
 
107
105
  if (typeof value === 'string') {
108
- // eslint-disable-next-line node/callback-return
109
106
  callback(translationKey, value)
110
107
  } else {
111
108
  traverseDictionary(value, callback, translationKey)
@@ -103,7 +103,7 @@ describe('extensionServerReducer()', () => {
103
103
  const action = createRefreshAction([{uuid: extension.uuid}])
104
104
 
105
105
  const state1 = extensionServerReducer(previousState, action)
106
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
106
+
107
107
  const url1 = new URL(state1.extensions[0].assets.main.url)
108
108
  const timestamp1 = url1.searchParams.get('lastUpdated') ?? ''
109
109
 
@@ -113,7 +113,7 @@ describe('extensionServerReducer()', () => {
113
113
  await new Promise((resolve) => setTimeout(resolve, 1))
114
114
 
115
115
  const state2 = extensionServerReducer(state1, action)
116
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
116
+
117
117
  const url2 = new URL(state2.extensions[0].assets.main.url)
118
118
  const timestamp2 = url2.searchParams.get('lastUpdated') ?? ''
119
119
 
@@ -54,6 +54,7 @@ export function mockExtension(obj: DeepPartial<ExtensionPayload> = {}): Extensio
54
54
  // in a generalized, non-surprising way
55
55
  extensionPoints: obj.extensionPoints as any,
56
56
  capabilities: obj.capabilities as any,
57
+ supportedFeatures: obj.supportedFeatures as any,
57
58
  localization: obj.localization as any,
58
59
  authenticatedRedirectStartUrl: obj.authenticatedRedirectStartUrl as any,
59
60
  authenticatedRedirectRedirectUrls: obj.authenticatedRedirectRedirectUrls as any,
package/src/types.ts CHANGED
@@ -1,5 +1,3 @@
1
- /* eslint-disable @typescript-eslint/no-invalid-void-type */
2
- /* eslint-disable @shopify/strict-component-boundaries */
3
1
  import {FlattenedLocalization, Localization} from './i18n'
4
2
  import './ExtensionServerClient/types'
5
3
  import type {Surface} from './ExtensionServerClient/types'
@@ -94,7 +92,7 @@ export interface ExtensionPoint {
94
92
  localization?: FlattenedLocalization | Localization | null
95
93
  name: string
96
94
  description?: string
97
- assets?: {[name: string]: Asset}
95
+ assets?: Record<string, Asset>
98
96
  }
99
97
 
100
98
  type ExtensionPoints = string[] | ExtensionPoint[] | null
@@ -119,7 +117,7 @@ interface Capabilities {
119
117
  export interface ExtensionPayload {
120
118
  type: string
121
119
  externalType: string
122
- assets: {[name: string]: Asset}
120
+ assets: Record<string, Asset>
123
121
  development: {
124
122
  hidden: boolean
125
123
  status: Status
@@ -143,6 +141,7 @@ export interface ExtensionPayload {
143
141
  handle: string
144
142
  extensionPoints: ExtensionPoints
145
143
  capabilities?: Capabilities
144
+ supportedFeatures: ExtensionSupportedFeatures
146
145
  authenticatedRedirectStartUrl?: string
147
146
  authenticatedRedirectRedirectUrls?: string[]
148
147
  localization?: FlattenedLocalization | Localization | null
@@ -153,11 +152,15 @@ export interface ExtensionPayload {
153
152
  name?: string
154
153
  description?: string
155
154
  required?: boolean
156
- validations?: any[]
155
+ validations?: unknown[]
157
156
  }[]
158
157
  }
159
158
  }
160
159
 
160
+ export interface ExtensionSupportedFeatures {
161
+ runsOffline: boolean
162
+ }
163
+
161
164
  export enum Status {
162
165
  Success = 'success',
163
166
  }
@@ -179,4 +182,11 @@ export interface App {
179
182
  }
180
183
  supportEmail?: string
181
184
  supportLocales?: string[]
185
+ allowedDomains?: string[]
186
+ assets?: {
187
+ [key: string]: {
188
+ url: string
189
+ lastUpdated: number
190
+ }
191
+ }
182
192
  }
@@ -1,7 +1,6 @@
1
1
  import type {Asset} from '../types'
2
2
 
3
3
  export function assetToString(asset: Asset) {
4
- // eslint-disable-next-line node/no-unsupported-features/node-builtins
5
4
  const url = new URL(asset.url)
6
5
  url.searchParams.set('lastUpdated', String(asset.lastUpdated))
7
6
  return url.toString()
@@ -1,7 +1,8 @@
1
- export function isUIExtension(extension: any): extension is ExtensionServer.UIExtension {
1
+ export function isUIExtension(extension: unknown): extension is ExtensionServer.UIExtension {
2
+ const ext = extension as ExtensionServer.UIExtension
2
3
  return (
3
- extension.type === 'ui_extension' &&
4
- Array.isArray(extension.extensionPoints) &&
5
- extension.extensionPoints.every((extensionPoint: any) => typeof extensionPoint === 'object')
4
+ ext.type === 'ui_extension' &&
5
+ Array.isArray(ext.extensionPoints) &&
6
+ ext.extensionPoints.every((extensionPoint: unknown) => typeof extensionPoint === 'object')
6
7
  )
7
8
  }
@@ -1,7 +1,6 @@
1
- /* eslint-disable @shopify/strict-component-boundaries */
2
1
  import {AVAILABLE_SURFACES} from '../ExtensionServerClient/types'
3
2
  import type {Surface} from '../ExtensionServerClient/types'
4
3
 
5
- export function isValidSurface(surface: any): surface is Surface {
6
- return surface && AVAILABLE_SURFACES.includes(surface)
4
+ export function isValidSurface(surface: unknown): surface is Surface {
5
+ return Boolean(surface) && AVAILABLE_SURFACES.includes(surface as Surface)
7
6
  }
@@ -1,10 +1,8 @@
1
1
  export function replaceUpdated<T>(arr: T[], updates: T[], cb: (v: T) => unknown): T[] {
2
2
  const updatesMap = new Map(updates.map((updated) => [cb(updated), updated]))
3
3
  const updated = arr.map((item) => {
4
- // eslint-disable-next-line node/callback-return
5
4
  const key = cb(item)
6
5
  if (updatesMap.has(key)) {
7
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
8
6
  const updated = updatesMap.get(key)!
9
7
  updatesMap.delete(key)
10
8
  return updated
@@ -1,9 +1,13 @@
1
1
  /**
2
2
  * Deep sets an object in a type-safe way
3
3
  */
4
- export function set<TObject, TValue>(obj: TObject, pathFn: (o: TObject) => TValue, value: TValue) {
4
+ export function set<TObject extends object, TValue>(
5
+ obj: TObject,
6
+ pathFn: (o: TObject) => TValue,
7
+ value: TValue,
8
+ ): TObject {
5
9
  const path: string[] = []
6
- const proxy: any = new Proxy(
10
+ const proxy: unknown = new Proxy(
7
11
  {},
8
12
  {
9
13
  get: (_, prop: string) => {
@@ -12,11 +16,12 @@ export function set<TObject, TValue>(obj: TObject, pathFn: (o: TObject) => TValu
12
16
  },
13
17
  },
14
18
  )
15
- pathFn(proxy)
19
+ pathFn(proxy as TObject)
16
20
 
17
- const newObj: TObject = {...obj}
21
+ const newObj = {...obj}
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
23
  let current: any = newObj
19
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
24
+
20
25
  const lastKey = path.pop()!
21
26
 
22
27
  for (const key of path) {
package/tests/setup.ts CHANGED
@@ -1,6 +1,3 @@
1
- import 'vi-fetch/setup'
2
- import {mockFetch} from 'vi-fetch'
3
-
4
1
  beforeEach(() => {
5
- mockFetch.clearAll()
2
+ vi.restoreAllMocks()
6
3
  })
@@ -0,0 +1,57 @@
1
+ import {createEntryFiles} from './scripts/create-entry-files.js'
2
+ import {defineConfig} from 'vite'
3
+ import react from '@vitejs/plugin-react'
4
+ import path from 'path'
5
+
6
+ // https://vitejs.dev/config/
7
+ export default defineConfig({
8
+ root: path.join(__dirname, 'src'),
9
+ build: {
10
+ outDir: path.join(__dirname, 'dist'),
11
+ lib: {
12
+ name: 'UIExtensionsServerKit',
13
+ entry: path.join(__dirname, 'src/index.ts'),
14
+ formats: ['cjs', 'es'],
15
+ fileName: (type) => `index.${type}.js`,
16
+ },
17
+ rollupOptions: {
18
+ external: ['react'],
19
+ input: {
20
+ index: path.join(__dirname, 'src/index.ts'),
21
+ testing: path.join(__dirname, 'src/testing/index.ts'),
22
+ },
23
+ output: {
24
+ globals: {
25
+ react: 'React',
26
+ },
27
+ preserveModules: true,
28
+ assetFileNames: `[name].[ext]`,
29
+ entryFileNames: ({facadeModuleId}) => {
30
+ return facadeModuleId.endsWith('testing/index.ts') ? 'index.[format].js' : '[name].[format].js'
31
+ },
32
+ },
33
+ },
34
+ },
35
+ test: {
36
+ globals: true,
37
+ environment: 'jsdom',
38
+ setupFiles: [path.resolve(__dirname, './tests/setup.ts')],
39
+ deps: {
40
+ inline: ['@shopify/react-testing'],
41
+ },
42
+ },
43
+ resolve: {
44
+ alias: {
45
+ '@shopify/ui-extensions-test-utils': path.resolve(__dirname, '../ui-extensions-test-utils/src'),
46
+ },
47
+ },
48
+ plugins: [
49
+ react(),
50
+ createEntryFiles({
51
+ files: {
52
+ index: './dist/index',
53
+ testing: './dist/testing/index',
54
+ },
55
+ }),
56
+ ],
57
+ })
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("../i18n.cjs.js"),E=require("../utilities/isValidSurface.cjs.js"),f=require("../utilities/isUIExtension.cjs.js");class g{constructor(n={}){this.EVENT_THAT_WILL_MUTATE_THE_SERVER=["update"],this.listeners={},this.connectionListeners={close:new Set,open:new Set},this.connected=!1,this.uiExtensionsByUuid={},this.id=(Math.random()+1).toString(36).substring(7),this.options=p({...n,connection:{automaticConnect:!0,protocols:[],...n.connection??{}}}),this.setupConnection(this.options.connection.automaticConnect)}connect(n={connection:{}}){const t=S(this.options,n);return JSON.stringify(t)!==JSON.stringify(this.options)&&(this.options=t,this.setupConnection(!0)),()=>{this.closeConnection()}}on(n,t){return this.listeners[n]||(this.listeners[n]=new Set),this.listeners[n].add(t),()=>this.listeners[n].delete(t)}persist(n,t){var s,e,i;if(this.EVENT_THAT_WILL_MUTATE_THE_SERVER.includes(n))return this.options.locales?((e=t.extensions)==null||e.forEach(o=>{h.TRANSLATED_KEYS.forEach(a=>{var c;f.isUIExtension(o)&&((c=o.extensionPoints)==null||c.forEach(l=>{delete l[a]})),delete o[a]})}),(i=this.connection)==null?void 0:i.send(JSON.stringify({event:n,data:t}))):(s=this.connection)==null?void 0:s.send(JSON.stringify({event:n,data:t}));console.warn('You tried to use "persist" with a dispatch event. Please use the "emit" method instead.')}emit(...n){var e;const[t,s]=n;if(this.EVENT_THAT_WILL_MUTATE_THE_SERVER.includes(t))return console.warn(`You tried to use "emit" with a the "${t}" event. Please use the "persist" method instead to persist changes to the server.`);(e=this.connection)==null||e.send(JSON.stringify({event:"dispatch",data:{type:t,payload:s}}))}onConnection(n,t){return this.connectionListeners[n].add(t),()=>this.connectionListeners[n].delete(t)}initializeConnection(){var n;this.connection&&(this.connection.addEventListener("open",t=>{this.connected=!0,this.connectionListeners.open.forEach(s=>s(t))}),this.connection.addEventListener("close",t=>{this.connected=!1,this.connectionListeners.close.forEach(s=>s(t))}),(n=this.connection)==null||n.addEventListener("message",t=>{var s,e;try{const{event:i,data:o}=JSON.parse(t.data);if(i==="dispatch"){const{type:c,payload:l}=o;(s=this.listeners[c])==null||s.forEach(u=>u(l));return}const a=o.extensions?T(o.extensions,this.options.surface):o.extensions;(e=this.listeners[i])==null||e.forEach(c=>{c({...o,extensions:this._getLocalizedExtensions(a)})})}catch(i){console.error("[ExtensionServer] Something went wrong while parsing a server message:",i instanceof Error?i.message:i)}}))}setupConnection(n=!0){this.options.connection.url&&n&&(this.closeConnection(),this.connection=new WebSocket(this.options.connection.url,this.options.connection.protocols),this.initializeConnection())}closeConnection(){var n;this.connected&&((n=this.connection)==null||n.close())}_getLocalizedExtensions(n){return n==null?void 0:n.map(t=>{var a,c,l,u,d;if(!this.options.locales||!f.isUIExtension(t))return t;const e=((c=(a=this.uiExtensionsByUuid[t.uuid])==null?void 0:a.localization)==null?void 0:c.lastUpdated)!==((l=t.localization)==null?void 0:l.lastUpdated)?h.getFlattenedLocalization(t.localization,this.options.locales):((u=this.uiExtensionsByUuid[t.uuid])==null?void 0:u.localization)??t.localization,i=e&&h.isFlattenedTranslations(e)?JSON.parse(e.translations):e,o={...t,localization:e,name:i&&t.name.startsWith("t:")?this._getLocalizedValue(i,t.name):t.name,...t.description&&{description:i&&((d=t.description)!=null&&d.startsWith("t:"))?this._getLocalizedValue(i,t.description):t.description}};return this.uiExtensionsByUuid[t.uuid]={...o,extensionPoints:this._getLocalizedExtensionPoints(e,o)},this.uiExtensionsByUuid[t.uuid]})}_getLocalizedExtensionPoints(n,{extensionPoints:t,name:s,description:e}){return!n||!h.isFlattenedTranslations(n)?t:t==null?void 0:t.map(i=>({...i,localization:n,name:s,...e&&{description:e}}))}_getLocalizedValue(n,t){const s=t.replace("t:","");return n[s]||t}}function S(r,n){return p({...r,...n,connection:{...r.connection,...n.connection}})}function p(r){return E.isValidSurface(r.surface)||delete r.surface,r}function T(r,n){return n?r.filter(t=>t.surface===n?!0:Array.isArray(t.extensionPoints)?t.extensionPoints.filter(i=>typeof i=="string"?!1:i.surface===n).length>0:!1):r}exports.ExtensionServerClient=g;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("./constants.cjs.js"),o=require("../state/actions/actions.cjs.js"),d=require("../ExtensionServerClient/ExtensionServerClient.cjs.js"),a=require("../hooks/useIsomorphicLayoutEffect.cjs.js"),p=require("../hooks/useExtensionServerState.cjs.js"),r=require("react");function x({children:f,options:S}){const[i,n]=p.useExtensionServerState(),[c,v]=r.useState(S),[t]=r.useState(()=>new d.ExtensionServerClient),u=r.useCallback((s=c)=>{v(s)},[c]);a.useIsomorphicLayoutEffect(()=>t.connect(c),[t,c]),a.useIsomorphicLayoutEffect(()=>{const s=[t.on("update",e=>n(o.createUpdateAction(e))),t.on("connected",e=>n(o.createConnectedAction(e))),t.on("refresh",e=>n(o.createRefreshAction(e))),t.on("focus",e=>n(o.createFocusAction(e))),t.on("unfocus",e=>n(o.createUnfocusAction(e)))];return()=>s.forEach(e=>e())},[n]);const l=r.useMemo(()=>({dispatch:n,state:i,connect:u,client:t}),[n,u,i,t]);return r.createElement(E.extensionServerContext.Provider,{value:l},f)}exports.ExtensionServerProvider=x;
@@ -1,29 +0,0 @@
1
- import { extensionServerContext as d } from "./constants.es.js";
2
- import { createUpdateAction as l, createConnectedAction as v, createRefreshAction as x, createFocusAction as E, createUnfocusAction as S } from "../state/actions/actions.es.js";
3
- import { ExtensionServerClient as h } from "../ExtensionServerClient/ExtensionServerClient.es.js";
4
- import { useIsomorphicLayoutEffect as i } from "../hooks/useIsomorphicLayoutEffect.es.js";
5
- import { useExtensionServerState as A } from "../hooks/useExtensionServerState.es.js";
6
- import C, { useState as a, useCallback as P, useMemo as R } from "react";
7
- function I({ children: u, options: f }) {
8
- const [c, o] = A(), [n, m] = a(f), [t] = a(() => new h()), s = P(
9
- (r = n) => {
10
- m(r);
11
- },
12
- [n]
13
- );
14
- i(() => t.connect(n), [t, n]), i(() => {
15
- const r = [
16
- t.on("update", (e) => o(l(e))),
17
- t.on("connected", (e) => o(v(e))),
18
- t.on("refresh", (e) => o(x(e))),
19
- t.on("focus", (e) => o(E(e))),
20
- t.on("unfocus", (e) => o(S(e)))
21
- ];
22
- return () => r.forEach((e) => e());
23
- }, [o]);
24
- const p = R(() => ({ dispatch: o, state: c, connect: s, client: t }), [o, s, c, t]);
25
- return /* @__PURE__ */ C.createElement(d.Provider, { value: p }, u);
26
- }
27
- export {
28
- I as ExtensionServerProvider
29
- };
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../context/constants.cjs.js"),t=require("react"),n=()=>t.useContext(e.extensionServerContext);exports.useExtensionServerContext=n;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../context/ExtensionServerProvider.cjs.js"),c=require("../context/constants.cjs.js"),s=require("../hooks/useExtensionServerContext.cjs.js"),t=require("react");function u({children:n,...e}){const r=s.useExtensionServerContext(),o=t.useMemo(()=>({...r,...e}),[r,e]);return t.createElement(c.extensionServerContext.Provider,{value:o},n)}function v({children:n,options:e={connection:{}},...r}){return t.createElement(i.ExtensionServerProvider,{options:e},t.createElement(u,{...r},n))}exports.MockExtensionServerProvider=v;
@@ -1,24 +0,0 @@
1
- import { ExtensionServerProvider as i } from "../context/ExtensionServerProvider.es.js";
2
- import { extensionServerContext as c } from "../context/constants.es.js";
3
- import { useExtensionServerContext as m } from "../hooks/useExtensionServerContext.es.js";
4
- import n, { useMemo as v } from "react";
5
- function a({ children: t, ...e }) {
6
- const r = m(), o = v(
7
- () => ({
8
- ...r,
9
- ...e
10
- }),
11
- [r, e]
12
- );
13
- return /* @__PURE__ */ n.createElement(c.Provider, { value: o }, t);
14
- }
15
- function l({
16
- children: t,
17
- options: e = { connection: {} },
18
- ...r
19
- }) {
20
- return /* @__PURE__ */ n.createElement(i, { options: e }, /* @__PURE__ */ n.createElement(a, { ...r }, t));
21
- }
22
- export {
23
- l as MockExtensionServerProvider
24
- };
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function i(e){return e.type==="ui_extension"&&Array.isArray(e.extensionPoints)&&e.extensionPoints.every(t=>typeof t=="object")}exports.isUIExtension=i;
@@ -1,7 +0,0 @@
1
- import { AVAILABLE_SURFACES as r } from "../ExtensionServerClient/types.es.js";
2
- function o(i) {
3
- return i && r.includes(i);
4
- }
5
- export {
6
- o as isValidSurface
7
- };