@webiny/app 6.3.0-beta.4 → 6.4.0-beta.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.
Files changed (276) hide show
  1. package/App.js +70 -77
  2. package/App.js.map +1 -1
  3. package/AppContainer.js +3 -6
  4. package/AppContainer.js.map +1 -1
  5. package/apollo-client/InMemoryCache.js +11 -13
  6. package/apollo-client/InMemoryCache.js.map +1 -1
  7. package/apollo-client/IntrospectionFragmentMatcher.js +26 -38
  8. package/apollo-client/IntrospectionFragmentMatcher.js.map +1 -1
  9. package/components/Image.js +11 -17
  10. package/components/Image.js.map +1 -1
  11. package/components/index.js +0 -2
  12. package/config/RouterConfig/Route.js +23 -28
  13. package/config/RouterConfig/Route.js.map +1 -1
  14. package/config/RouterConfig.js +11 -10
  15. package/config/RouterConfig.js.map +1 -1
  16. package/config.js +19 -20
  17. package/config.js.map +1 -1
  18. package/contexts/Ui/index.js +26 -28
  19. package/contexts/Ui/index.js.map +1 -1
  20. package/core/Plugin.js +7 -9
  21. package/core/Plugin.js.map +1 -1
  22. package/core/Plugins.js +15 -34
  23. package/core/Plugins.js.map +1 -1
  24. package/core/Provider.js +5 -13
  25. package/core/Provider.js.map +1 -1
  26. package/core/createProvider.js +3 -6
  27. package/core/createProvider.js.map +1 -1
  28. package/core/createProviderPlugin.js +8 -13
  29. package/core/createProviderPlugin.js.map +1 -1
  30. package/errors/AuthenticationErrorEvent.js +8 -5
  31. package/errors/AuthenticationErrorEvent.js.map +1 -1
  32. package/errors/NetworkErrorEvent.js +8 -5
  33. package/errors/NetworkErrorEvent.js.map +1 -1
  34. package/errors/abstractions.js +3 -2
  35. package/errors/abstractions.js.map +1 -1
  36. package/errors/index.js +1 -4
  37. package/exports/admin/env-config.js +0 -2
  38. package/exports/admin/graphql-client.js +0 -2
  39. package/exports/admin/local-storage.js +0 -2
  40. package/exports/admin/router.js +0 -2
  41. package/exports/admin/security.js +0 -2
  42. package/exports/admin.js +0 -2
  43. package/features/envConfig/EnvConfig.js +12 -13
  44. package/features/envConfig/EnvConfig.js.map +1 -1
  45. package/features/envConfig/abstractions.js +2 -1
  46. package/features/envConfig/abstractions.js.map +1 -1
  47. package/features/envConfig/feature.js +9 -8
  48. package/features/envConfig/feature.js.map +1 -1
  49. package/features/envConfig/index.js +0 -2
  50. package/features/eventPublisher/EventPublisher.js +13 -21
  51. package/features/eventPublisher/EventPublisher.js.map +1 -1
  52. package/features/eventPublisher/abstractions.js +7 -9
  53. package/features/eventPublisher/abstractions.js.map +1 -1
  54. package/features/eventPublisher/feature.js +13 -12
  55. package/features/eventPublisher/feature.js.map +1 -1
  56. package/features/eventPublisher/index.js +1 -3
  57. package/features/graphqlClient/AuthenticationErrorPublishing.js +26 -26
  58. package/features/graphqlClient/AuthenticationErrorPublishing.js.map +1 -1
  59. package/features/graphqlClient/BatchingGraphQLClient.js +104 -149
  60. package/features/graphqlClient/BatchingGraphQLClient.js.map +1 -1
  61. package/features/graphqlClient/FetchGraphQLClient.js +41 -48
  62. package/features/graphqlClient/FetchGraphQLClient.js.map +1 -1
  63. package/features/graphqlClient/NetworkErrorPublishing.js +35 -42
  64. package/features/graphqlClient/NetworkErrorPublishing.js.map +1 -1
  65. package/features/graphqlClient/RequestValue.js +42 -41
  66. package/features/graphqlClient/RequestValue.js.map +1 -1
  67. package/features/graphqlClient/RetryGraphQLClient.js +36 -45
  68. package/features/graphqlClient/RetryGraphQLClient.js.map +1 -1
  69. package/features/graphqlClient/__tests__/GraphQLClient.test.js +383 -356
  70. package/features/graphqlClient/__tests__/GraphQLClient.test.js.map +1 -1
  71. package/features/graphqlClient/abstractions.js +2 -1
  72. package/features/graphqlClient/abstractions.js.map +1 -1
  73. package/features/graphqlClient/feature.js +14 -20
  74. package/features/graphqlClient/feature.js.map +1 -1
  75. package/features/graphqlClient/index.js +0 -2
  76. package/features/graphqlClient/types.js +0 -3
  77. package/features/localStorage/BrowserLocalStorageGateway.js +56 -63
  78. package/features/localStorage/BrowserLocalStorageGateway.js.map +1 -1
  79. package/features/localStorage/LocalStorage.js +27 -24
  80. package/features/localStorage/LocalStorage.js.map +1 -1
  81. package/features/localStorage/LocalStorageRepository.js +75 -88
  82. package/features/localStorage/LocalStorageRepository.js.map +1 -1
  83. package/features/localStorage/abstractions.js +5 -16
  84. package/features/localStorage/abstractions.js.map +1 -1
  85. package/features/localStorage/feature.js +17 -28
  86. package/features/localStorage/feature.js.map +1 -1
  87. package/features/localStorage/index.js +1 -3
  88. package/features/mainGraphQLClient/MainGraphQLClient.js +18 -14
  89. package/features/mainGraphQLClient/MainGraphQLClient.js.map +1 -1
  90. package/features/mainGraphQLClient/abstractions.js +2 -1
  91. package/features/mainGraphQLClient/abstractions.js.map +1 -1
  92. package/features/mainGraphQLClient/feature.js +11 -10
  93. package/features/mainGraphQLClient/feature.js.map +1 -1
  94. package/features/mainGraphQLClient/index.js +0 -2
  95. package/features/router/HistoryRouterGateway.js +75 -105
  96. package/features/router/HistoryRouterGateway.js.map +1 -1
  97. package/features/router/HistoryRouterGateway.test.js +184 -193
  98. package/features/router/HistoryRouterGateway.test.js.map +1 -1
  99. package/features/router/Route.js +38 -54
  100. package/features/router/Route.js.map +1 -1
  101. package/features/router/RouteUrl.js +84 -217
  102. package/features/router/RouteUrl.js.map +1 -1
  103. package/features/router/Router.js +67 -124
  104. package/features/router/Router.js.map +1 -1
  105. package/features/router/RouterPresenter.js +44 -49
  106. package/features/router/RouterPresenter.js.map +1 -1
  107. package/features/router/RouterRepository.js +103 -111
  108. package/features/router/RouterRepository.js.map +1 -1
  109. package/features/router/RouterRepository.test.js +119 -150
  110. package/features/router/RouterRepository.test.js.map +1 -1
  111. package/features/router/abstractions.js +4 -14
  112. package/features/router/abstractions.js.map +1 -1
  113. package/features/router/feature.js +13 -12
  114. package/features/router/feature.js.map +1 -1
  115. package/features/router/index.js +1 -3
  116. package/helpers/InterfaceGenerator/date.js +0 -3
  117. package/helpers/InterfaceGenerator/id.js +0 -3
  118. package/helpers/InterfaceGenerator/identity.js +0 -3
  119. package/helpers/InterfaceGenerator/index.js +0 -3
  120. package/helpers/InterfaceGenerator/numeric.js +0 -3
  121. package/helpers/InterfaceGenerator/truthful.js +0 -3
  122. package/hooks/useAutocomplete/index.js +0 -2
  123. package/hooks/useAutocomplete/useAutocomplete.js +12 -15
  124. package/hooks/useAutocomplete/useAutocomplete.js.map +1 -1
  125. package/hooks/useDataList/functions/getData.js +2 -1
  126. package/hooks/useDataList/functions/getData.js.map +1 -1
  127. package/hooks/useDataList/functions/getError.js +2 -1
  128. package/hooks/useDataList/functions/getError.js.map +1 -1
  129. package/hooks/useDataList/functions/getMeta.js +2 -1
  130. package/hooks/useDataList/functions/getMeta.js.map +1 -1
  131. package/hooks/useDataList/functions/index.js +0 -2
  132. package/hooks/useDataList/functions/searchDataByKey.js +9 -14
  133. package/hooks/useDataList/functions/searchDataByKey.js.map +1 -1
  134. package/hooks/useDataList/index.js +0 -2
  135. package/hooks/useDataList/useDataList.js +131 -152
  136. package/hooks/useDataList/useDataList.js.map +1 -1
  137. package/hooks/useDataList/utils/index.js +0 -2
  138. package/hooks/useDataList/utils/prepareLoadListParams.js +25 -34
  139. package/hooks/useDataList/utils/prepareLoadListParams.js.map +1 -1
  140. package/hooks/useHandler.js +12 -16
  141. package/hooks/useHandler.js.map +1 -1
  142. package/hooks/useHandlers.js +18 -20
  143. package/hooks/useHandlers.js.map +1 -1
  144. package/hooks/useRegisterLegacyPlugin.js +7 -6
  145. package/hooks/useRegisterLegacyPlugin.js.map +1 -1
  146. package/hooks/useUi.js +2 -3
  147. package/hooks/useUi.js.map +1 -1
  148. package/i18n/i18n.js +8 -4
  149. package/i18n/i18n.js.map +1 -1
  150. package/i18n/index.js +0 -2
  151. package/index.js +6 -11
  152. package/package.json +13 -13
  153. package/plugins/AddQuerySelectionPlugin.js +36 -61
  154. package/plugins/AddQuerySelectionPlugin.js.map +1 -1
  155. package/plugins/ApolloCacheObjectIdPlugin.js +12 -11
  156. package/plugins/ApolloCacheObjectIdPlugin.js.map +1 -1
  157. package/plugins/ApolloDynamicLink.js +20 -22
  158. package/plugins/ApolloDynamicLink.js.map +1 -1
  159. package/plugins/ApolloLinkPlugin.js +16 -15
  160. package/plugins/ApolloLinkPlugin.js.map +1 -1
  161. package/plugins/ConsoleLinkPlugin.js +19 -21
  162. package/plugins/ConsoleLinkPlugin.js.map +1 -1
  163. package/plugins/NetworkErrorLinkPlugin/ErrorOverlay.js +39 -45
  164. package/plugins/NetworkErrorLinkPlugin/ErrorOverlay.js.map +1 -1
  165. package/plugins/NetworkErrorLinkPlugin/GqlErrorOverlay.js +18 -22
  166. package/plugins/NetworkErrorLinkPlugin/GqlErrorOverlay.js.map +1 -1
  167. package/plugins/NetworkErrorLinkPlugin/LocalAwsLambdaTimeoutMessage.js +21 -29
  168. package/plugins/NetworkErrorLinkPlugin/LocalAwsLambdaTimeoutMessage.js.map +1 -1
  169. package/plugins/NetworkErrorLinkPlugin/StyledComponents.js +6 -15
  170. package/plugins/NetworkErrorLinkPlugin/StyledComponents.js.map +1 -1
  171. package/plugins/NetworkErrorLinkPlugin/Typography.js +9 -14
  172. package/plugins/NetworkErrorLinkPlugin/Typography.js.map +1 -1
  173. package/plugins/NetworkErrorLinkPlugin/assets/close_24px.js +19 -0
  174. package/plugins/NetworkErrorLinkPlugin/assets/close_24px.js.map +1 -0
  175. package/plugins/NetworkErrorLinkPlugin/createErrorOverlay.js +11 -18
  176. package/plugins/NetworkErrorLinkPlugin/createErrorOverlay.js.map +1 -1
  177. package/plugins/NetworkErrorLinkPlugin.js +41 -58
  178. package/plugins/NetworkErrorLinkPlugin.js.map +1 -1
  179. package/plugins/OmitTypenameLinkPlugin.js +9 -14
  180. package/plugins/OmitTypenameLinkPlugin.js.map +1 -1
  181. package/plugins/TenantHeaderLinkPlugin.js +23 -32
  182. package/plugins/TenantHeaderLinkPlugin.js.map +1 -1
  183. package/plugins/components/Image.js +8 -15
  184. package/plugins/components/Image.js.map +1 -1
  185. package/plugins/image.js +94 -133
  186. package/plugins/image.js.map +1 -1
  187. package/plugins/index.js +35 -59
  188. package/plugins/index.js.map +1 -1
  189. package/presentation/envConfig/useEnvConfig.js +4 -8
  190. package/presentation/envConfig/useEnvConfig.js.map +1 -1
  191. package/presentation/localStorage/index.js +0 -2
  192. package/presentation/localStorage/useLocalStorage.js +10 -16
  193. package/presentation/localStorage/useLocalStorage.js.map +1 -1
  194. package/presentation/localStorage/useLocalStorageValue.js +15 -13
  195. package/presentation/localStorage/useLocalStorageValue.js.map +1 -1
  196. package/presentation/localStorage/useLocalStorageValues.js +23 -30
  197. package/presentation/localStorage/useLocalStorageValues.js.map +1 -1
  198. package/presentation/router/RouteElementRegistry.js +22 -25
  199. package/presentation/router/RouteElementRegistry.js.map +1 -1
  200. package/presentation/router/abstractions.js +2 -1
  201. package/presentation/router/abstractions.js.map +1 -1
  202. package/presentation/router/components/Redirect.js +8 -10
  203. package/presentation/router/components/Redirect.js.map +1 -1
  204. package/presentation/router/components/RouteContent.js +14 -17
  205. package/presentation/router/components/RouteContent.js.map +1 -1
  206. package/presentation/router/components/RouteLink.js +11 -16
  207. package/presentation/router/components/RouteLink.js.map +1 -1
  208. package/presentation/router/components/SimpleLink.js +18 -24
  209. package/presentation/router/components/SimpleLink.js.map +1 -1
  210. package/presentation/router/hooks/useRoute.js +15 -23
  211. package/presentation/router/hooks/useRoute.js.map +1 -1
  212. package/presentation/router/hooks/useRouter.js +22 -23
  213. package/presentation/router/hooks/useRouter.js.map +1 -1
  214. package/presentation/router/index.js +0 -2
  215. package/presentation/router/types.js +0 -3
  216. package/react-butterfiles/Files.js +148 -217
  217. package/react-butterfiles/Files.js.map +1 -1
  218. package/react-butterfiles/index.js +2 -1
  219. package/react-butterfiles/index.js.map +1 -1
  220. package/react-butterfiles/utils/generateId.js +2 -3
  221. package/react-butterfiles/utils/generateId.js.map +1 -1
  222. package/react-butterfiles/utils/readFileContent.js +9 -13
  223. package/react-butterfiles/utils/readFileContent.js.map +1 -1
  224. package/renderApp.js +7 -6
  225. package/renderApp.js.map +1 -1
  226. package/router.js +0 -3
  227. package/rslib-runtime.js +14 -0
  228. package/rslib-runtime.js.map +1 -0
  229. package/shared/di/DiContainerProvider.js +8 -12
  230. package/shared/di/DiContainerProvider.js.map +1 -1
  231. package/shared/di/createFeature.js +7 -8
  232. package/shared/di/createFeature.js.map +1 -1
  233. package/shared/di/useFeature.js +7 -3
  234. package/shared/di/useFeature.js.map +1 -1
  235. package/static/svg/close_24px.33adaadc.svg +1 -0
  236. package/types.js +0 -3
  237. package/utils/createGenericContext.js +17 -21
  238. package/utils/createGenericContext.js.map +1 -1
  239. package/utils/createHashing.js +13 -16
  240. package/utils/createHashing.js.map +1 -1
  241. package/utils/index.js +0 -2
  242. package/utils/legacyPluginToReactComponent.js +11 -10
  243. package/utils/legacyPluginToReactComponent.js.map +1 -1
  244. package/components/index.js.map +0 -1
  245. package/errors/index.js.map +0 -1
  246. package/exports/admin/env-config.js.map +0 -1
  247. package/exports/admin/graphql-client.js.map +0 -1
  248. package/exports/admin/local-storage.js.map +0 -1
  249. package/exports/admin/router.js.map +0 -1
  250. package/exports/admin/security.js.map +0 -1
  251. package/exports/admin.js.map +0 -1
  252. package/features/envConfig/index.js.map +0 -1
  253. package/features/eventPublisher/index.js.map +0 -1
  254. package/features/graphqlClient/index.js.map +0 -1
  255. package/features/graphqlClient/types.js.map +0 -1
  256. package/features/localStorage/index.js.map +0 -1
  257. package/features/mainGraphQLClient/index.js.map +0 -1
  258. package/features/router/index.js.map +0 -1
  259. package/helpers/InterfaceGenerator/date.js.map +0 -1
  260. package/helpers/InterfaceGenerator/id.js.map +0 -1
  261. package/helpers/InterfaceGenerator/identity.js.map +0 -1
  262. package/helpers/InterfaceGenerator/index.js.map +0 -1
  263. package/helpers/InterfaceGenerator/numeric.js.map +0 -1
  264. package/helpers/InterfaceGenerator/truthful.js.map +0 -1
  265. package/hooks/useAutocomplete/index.js.map +0 -1
  266. package/hooks/useDataList/functions/index.js.map +0 -1
  267. package/hooks/useDataList/index.js.map +0 -1
  268. package/hooks/useDataList/utils/index.js.map +0 -1
  269. package/i18n/index.js.map +0 -1
  270. package/index.js.map +0 -1
  271. package/presentation/localStorage/index.js.map +0 -1
  272. package/presentation/router/index.js.map +0 -1
  273. package/presentation/router/types.js.map +0 -1
  274. package/router.js.map +0 -1
  275. package/types.js.map +0 -1
  276. package/utils/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["describe","it","expect","vi","beforeEach","Container","GraphQLClient","FetchGraphQLClient","BatchingGraphQLClient","RetryGraphQLClient","EnvConfig","container","mockEnvConfig","get","fn","key","undefined","registerInstance","register","inSingletonScope","mockResponse","data","user","id","name","global","fetch","mockResolvedValue","status","json","client","resolve","result","execute","endpoint","query","toEqual","toHaveBeenCalledWith","objectContaining","method","headers","createUser","variables","Authorization","mockRejectedValue","Error","rejects","toThrow","errors","message","registerDecorator","post","title","result1","result2","Promise","all","toHaveBeenCalledTimes","callBody","JSON","parse","mock","calls","body","toHaveLength","toHaveProperty","not","toBeInstanceOf","Array","createPost","promises","mockRejectedValueOnce","mockResolvedValueOnce"],"sources":["GraphQLClient.test.ts"],"sourcesContent":["import { describe, it, expect, vi, beforeEach } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { GraphQLClient } from \"../abstractions.js\";\nimport { FetchGraphQLClient } from \"../FetchGraphQLClient.js\";\nimport { BatchingGraphQLClient } from \"../BatchingGraphQLClient.js\";\nimport { RetryGraphQLClient } from \"../RetryGraphQLClient.js\";\nimport { EnvConfig } from \"~/features/envConfig/index.js\";\n\ndescribe(\"GraphQLClient Feature\", () => {\n let container: Container;\n let mockEnvConfig: EnvConfig.Interface;\n\n beforeEach(() => {\n container = new Container();\n\n mockEnvConfig = {\n get: vi.fn((key: string) => {\n if (key === \"graphqlApiUrl\") {\n return \"https://api.example.com/graphql\";\n }\n return undefined;\n })\n } as any;\n\n container.registerInstance(EnvConfig, mockEnvConfig);\n });\n\n describe(\"FetchGraphQLClient\", () => {\n beforeEach(() => {\n container.register(FetchGraphQLClient).inSingletonScope();\n });\n\n it(\"should execute a query successfully\", async () => {\n const mockResponse = {\n data: { user: { id: \"1\", name: \"John\" } }\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n const result = await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetUser { user { id name } }\"\n });\n\n expect(result).toEqual(mockResponse.data);\n expect(global.fetch).toHaveBeenCalledWith(\n \"https://api.example.com/graphql\",\n expect.objectContaining({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" }\n })\n );\n });\n\n it(\"should execute a mutation successfully\", async () => {\n const mockResponse = {\n data: { createUser: { id: \"2\", name: \"Jane\" } }\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n const result = await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"mutation CreateUser($name: String!) { createUser(name: $name) { id name } }\",\n variables: { name: \"Jane\" }\n });\n\n expect(result).toEqual(mockResponse.data);\n });\n\n it(\"should include custom headers\", async () => {\n const mockResponse = { data: { user: { id: \"1\" } } };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetUser { user { id } }\",\n headers: { \"x-tenant\": \"root\", Authorization: \"Bearer token\" }\n });\n\n expect(global.fetch).toHaveBeenCalledWith(\n \"https://api.example.com/graphql\",\n expect.objectContaining({\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-tenant\": \"root\",\n Authorization: \"Bearer token\"\n }\n })\n );\n });\n\n it(\"should throw on network error\", async () => {\n global.fetch = vi.fn().mockRejectedValue(new Error(\"Network failure\"));\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"Network error: Network failure\");\n });\n\n it(\"should throw on GraphQL errors\", async () => {\n const mockResponse = {\n errors: [{ message: \"User not found\" }],\n data: null\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"GraphQL errors\");\n });\n\n it(\"should throw on invalid JSON response\", async () => {\n global.fetch = vi.fn().mockResolvedValue({\n json: async () => {\n throw new Error(\"Invalid JSON\");\n }\n });\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"Failed to parse GraphQL response as JSON\");\n });\n });\n\n describe(\"BatchingGraphQLClient\", () => {\n beforeEach(() => {\n container.register(FetchGraphQLClient).inSingletonScope();\n container.registerDecorator(BatchingGraphQLClient);\n });\n\n it(\"should batch multiple requests within the batch window\", async () => {\n const mockResponse = [\n { data: { user: { id: \"1\", name: \"John\" } } },\n { data: { post: { id: \"2\", title: \"Hello\" } } }\n ];\n\n global.fetch = vi.fn().mockResolvedValue({\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n const [result1, result2] = await Promise.all([\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetUser { user { id name } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetPost { post { id title } }\"\n })\n ]);\n\n expect(result1).toEqual(mockResponse[0].data);\n expect(result2).toEqual(mockResponse[1].data);\n expect(global.fetch).toHaveBeenCalledTimes(1);\n\n const callBody = JSON.parse((global.fetch as any).mock.calls[0][1].body);\n expect(callBody).toHaveLength(2);\n });\n\n it(\"should execute single request without batching\", async () => {\n const mockResponse = {\n data: { user: { id: \"1\", name: \"John\" } }\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n const result = await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetUser { user { id name } }\"\n });\n\n expect(result).toEqual(mockResponse.data);\n\n // Should use decoratee directly for single request\n const callBody = JSON.parse((global.fetch as any).mock.calls[0][1].body);\n expect(callBody).toHaveProperty(\"query\");\n expect(callBody).not.toBeInstanceOf(Array);\n });\n\n it(\"should handle mixed queries and mutations in batch\", async () => {\n const mockResponse = [\n { data: { user: { id: \"1\" } } },\n { data: { createPost: { id: \"2\" } } }\n ];\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n await Promise.all([\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"mutation { createPost { id } }\"\n })\n ]);\n\n expect(global.fetch).toHaveBeenCalledTimes(1);\n const callBody = JSON.parse((global.fetch as any).mock.calls[0][1].body);\n expect(callBody[0]).toHaveProperty(\"query\");\n expect(callBody[1]).toHaveProperty(\"query\");\n });\n\n it(\"should reject all requests if batch fails\", async () => {\n global.fetch = vi.fn().mockRejectedValue(new Error(\"Network error\"));\n\n const client = container.resolve(GraphQLClient);\n\n const promises = [\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { post { id } }\"\n })\n ];\n\n await expect(Promise.all(promises)).rejects.toThrow(\"Network error\");\n });\n\n it(\"should handle GraphQL errors in batched operations\", async () => {\n const mockResponse = [\n { data: { user: { id: \"1\" } } },\n { errors: [{ message: \"Post not found\" }], data: null }\n ];\n\n global.fetch = vi.fn().mockResolvedValue({\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n const promises = [\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { post { id } }\"\n })\n ];\n\n await expect(Promise.all(promises)).rejects.toThrow(\"GraphQL errors in operation 1\");\n });\n });\n\n describe(\"RetryGraphQLClient\", () => {\n beforeEach(() => {\n container.register(FetchGraphQLClient).inSingletonScope();\n container.registerDecorator(RetryGraphQLClient);\n });\n\n it(\"should retry on network errors\", async () => {\n const mockResponse = { data: { user: { id: \"1\" } } };\n\n global.fetch = vi\n .fn()\n .mockRejectedValueOnce(new Error(\"Network timeout\"))\n .mockRejectedValueOnce(new Error(\"Network timeout\"))\n .mockResolvedValueOnce({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n const result = await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n });\n\n expect(result).toEqual(mockResponse.data);\n expect(global.fetch).toHaveBeenCalledTimes(3);\n });\n\n it(\"should not retry on GraphQL errors\", async () => {\n const mockResponse = {\n errors: [{ message: \"Unauthorized\" }],\n data: null\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"GraphQL errors\");\n\n expect(global.fetch).toHaveBeenCalledTimes(1);\n });\n\n it(\"should give up after max retries\", async () => {\n global.fetch = vi.fn().mockRejectedValue(new Error(\"Network error\"));\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"Network error\");\n\n // Should try 4 times: initial + 3 retries\n expect(global.fetch).toHaveBeenCalledTimes(4);\n });\n });\n\n describe(\"Combined decorators (Retry + Batching)\", () => {\n beforeEach(() => {\n container.register(FetchGraphQLClient).inSingletonScope();\n container.registerDecorator(BatchingGraphQLClient);\n container.registerDecorator(RetryGraphQLClient);\n });\n\n it(\"should retry batched requests on failure\", async () => {\n const mockResponse = [{ data: { user: { id: \"1\" } } }, { data: { post: { id: \"2\" } } }];\n\n global.fetch = vi\n .fn()\n .mockRejectedValueOnce(new Error(\"Network error\"))\n .mockResolvedValueOnce({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n const [result1, result2] = await Promise.all([\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { post { id } }\"\n })\n ]);\n\n expect(result1).toEqual(mockResponse[0].data);\n expect(result2).toEqual(mockResponse[1].data);\n expect(global.fetch).toHaveBeenCalledTimes(2);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"features/graphqlClient/__tests__/GraphQLClient.test.js","sources":["../../../../src/features/graphqlClient/__tests__/GraphQLClient.test.ts"],"sourcesContent":["import { describe, it, expect, vi, beforeEach } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { GraphQLClient } from \"../abstractions.js\";\nimport { FetchGraphQLClient } from \"../FetchGraphQLClient.js\";\nimport { BatchingGraphQLClient } from \"../BatchingGraphQLClient.js\";\nimport { RetryGraphQLClient } from \"../RetryGraphQLClient.js\";\nimport { EnvConfig } from \"~/features/envConfig/index.js\";\n\ndescribe(\"GraphQLClient Feature\", () => {\n let container: Container;\n let mockEnvConfig: EnvConfig.Interface;\n\n beforeEach(() => {\n container = new Container();\n\n mockEnvConfig = {\n get: vi.fn((key: string) => {\n if (key === \"graphqlApiUrl\") {\n return \"https://api.example.com/graphql\";\n }\n return undefined;\n })\n } as any;\n\n container.registerInstance(EnvConfig, mockEnvConfig);\n });\n\n describe(\"FetchGraphQLClient\", () => {\n beforeEach(() => {\n container.register(FetchGraphQLClient).inSingletonScope();\n });\n\n it(\"should execute a query successfully\", async () => {\n const mockResponse = {\n data: { user: { id: \"1\", name: \"John\" } }\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n const result = await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetUser { user { id name } }\"\n });\n\n expect(result).toEqual(mockResponse.data);\n expect(global.fetch).toHaveBeenCalledWith(\n \"https://api.example.com/graphql\",\n expect.objectContaining({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" }\n })\n );\n });\n\n it(\"should execute a mutation successfully\", async () => {\n const mockResponse = {\n data: { createUser: { id: \"2\", name: \"Jane\" } }\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n const result = await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"mutation CreateUser($name: String!) { createUser(name: $name) { id name } }\",\n variables: { name: \"Jane\" }\n });\n\n expect(result).toEqual(mockResponse.data);\n });\n\n it(\"should include custom headers\", async () => {\n const mockResponse = { data: { user: { id: \"1\" } } };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetUser { user { id } }\",\n headers: { \"x-tenant\": \"root\", Authorization: \"Bearer token\" }\n });\n\n expect(global.fetch).toHaveBeenCalledWith(\n \"https://api.example.com/graphql\",\n expect.objectContaining({\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-tenant\": \"root\",\n Authorization: \"Bearer token\"\n }\n })\n );\n });\n\n it(\"should throw on network error\", async () => {\n global.fetch = vi.fn().mockRejectedValue(new Error(\"Network failure\"));\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"Network error: Network failure\");\n });\n\n it(\"should throw on GraphQL errors\", async () => {\n const mockResponse = {\n errors: [{ message: \"User not found\" }],\n data: null\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"GraphQL errors\");\n });\n\n it(\"should throw on invalid JSON response\", async () => {\n global.fetch = vi.fn().mockResolvedValue({\n json: async () => {\n throw new Error(\"Invalid JSON\");\n }\n });\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"Failed to parse GraphQL response as JSON\");\n });\n });\n\n describe(\"BatchingGraphQLClient\", () => {\n beforeEach(() => {\n container.register(FetchGraphQLClient).inSingletonScope();\n container.registerDecorator(BatchingGraphQLClient);\n });\n\n it(\"should batch multiple requests within the batch window\", async () => {\n const mockResponse = [\n { data: { user: { id: \"1\", name: \"John\" } } },\n { data: { post: { id: \"2\", title: \"Hello\" } } }\n ];\n\n global.fetch = vi.fn().mockResolvedValue({\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n const [result1, result2] = await Promise.all([\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetUser { user { id name } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetPost { post { id title } }\"\n })\n ]);\n\n expect(result1).toEqual(mockResponse[0].data);\n expect(result2).toEqual(mockResponse[1].data);\n expect(global.fetch).toHaveBeenCalledTimes(1);\n\n const callBody = JSON.parse((global.fetch as any).mock.calls[0][1].body);\n expect(callBody).toHaveLength(2);\n });\n\n it(\"should execute single request without batching\", async () => {\n const mockResponse = {\n data: { user: { id: \"1\", name: \"John\" } }\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n const result = await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query GetUser { user { id name } }\"\n });\n\n expect(result).toEqual(mockResponse.data);\n\n // Should use decoratee directly for single request\n const callBody = JSON.parse((global.fetch as any).mock.calls[0][1].body);\n expect(callBody).toHaveProperty(\"query\");\n expect(callBody).not.toBeInstanceOf(Array);\n });\n\n it(\"should handle mixed queries and mutations in batch\", async () => {\n const mockResponse = [\n { data: { user: { id: \"1\" } } },\n { data: { createPost: { id: \"2\" } } }\n ];\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n await Promise.all([\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"mutation { createPost { id } }\"\n })\n ]);\n\n expect(global.fetch).toHaveBeenCalledTimes(1);\n const callBody = JSON.parse((global.fetch as any).mock.calls[0][1].body);\n expect(callBody[0]).toHaveProperty(\"query\");\n expect(callBody[1]).toHaveProperty(\"query\");\n });\n\n it(\"should reject all requests if batch fails\", async () => {\n global.fetch = vi.fn().mockRejectedValue(new Error(\"Network error\"));\n\n const client = container.resolve(GraphQLClient);\n\n const promises = [\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { post { id } }\"\n })\n ];\n\n await expect(Promise.all(promises)).rejects.toThrow(\"Network error\");\n });\n\n it(\"should handle GraphQL errors in batched operations\", async () => {\n const mockResponse = [\n { data: { user: { id: \"1\" } } },\n { errors: [{ message: \"Post not found\" }], data: null }\n ];\n\n global.fetch = vi.fn().mockResolvedValue({\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n const promises = [\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { post { id } }\"\n })\n ];\n\n await expect(Promise.all(promises)).rejects.toThrow(\"GraphQL errors in operation 1\");\n });\n });\n\n describe(\"RetryGraphQLClient\", () => {\n beforeEach(() => {\n container.register(FetchGraphQLClient).inSingletonScope();\n container.registerDecorator(RetryGraphQLClient);\n });\n\n it(\"should retry on network errors\", async () => {\n const mockResponse = { data: { user: { id: \"1\" } } };\n\n global.fetch = vi\n .fn()\n .mockRejectedValueOnce(new Error(\"Network timeout\"))\n .mockRejectedValueOnce(new Error(\"Network timeout\"))\n .mockResolvedValueOnce({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n const result = await client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n });\n\n expect(result).toEqual(mockResponse.data);\n expect(global.fetch).toHaveBeenCalledTimes(3);\n });\n\n it(\"should not retry on GraphQL errors\", async () => {\n const mockResponse = {\n errors: [{ message: \"Unauthorized\" }],\n data: null\n };\n\n global.fetch = vi.fn().mockResolvedValue({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"GraphQL errors\");\n\n expect(global.fetch).toHaveBeenCalledTimes(1);\n });\n\n it(\"should give up after max retries\", async () => {\n global.fetch = vi.fn().mockRejectedValue(new Error(\"Network error\"));\n\n const client = container.resolve(GraphQLClient);\n\n await expect(\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n })\n ).rejects.toThrow(\"Network error\");\n\n // Should try 4 times: initial + 3 retries\n expect(global.fetch).toHaveBeenCalledTimes(4);\n });\n });\n\n describe(\"Combined decorators (Retry + Batching)\", () => {\n beforeEach(() => {\n container.register(FetchGraphQLClient).inSingletonScope();\n container.registerDecorator(BatchingGraphQLClient);\n container.registerDecorator(RetryGraphQLClient);\n });\n\n it(\"should retry batched requests on failure\", async () => {\n const mockResponse = [{ data: { user: { id: \"1\" } } }, { data: { post: { id: \"2\" } } }];\n\n global.fetch = vi\n .fn()\n .mockRejectedValueOnce(new Error(\"Network error\"))\n .mockResolvedValueOnce({\n status: 200,\n json: async () => mockResponse\n });\n\n const client = container.resolve(GraphQLClient);\n\n const [result1, result2] = await Promise.all([\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { user { id } }\"\n }),\n client.execute({\n endpoint: \"https://api.example.com/graphql\",\n query: \"query { post { id } }\"\n })\n ]);\n\n expect(result1).toEqual(mockResponse[0].data);\n expect(result2).toEqual(mockResponse[1].data);\n expect(global.fetch).toHaveBeenCalledTimes(2);\n });\n });\n});\n"],"names":["describe","container","mockEnvConfig","beforeEach","Container","vi","key","EnvConfig","FetchGraphQLClient","it","mockResponse","global","client","GraphQLClient","result","expect","Error","BatchingGraphQLClient","result1","result2","Promise","callBody","JSON","Array","promises","RetryGraphQLClient"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/admin";
2
- export const GraphQLClient = createAbstraction("GraphQLClient");
2
+ const GraphQLClient = createAbstraction("GraphQLClient");
3
+ export { GraphQLClient };
3
4
 
4
5
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","GraphQLClient"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { DocumentNode } from \"graphql\";\n\ntype IHeaders = Record<string, string | number | undefined>;\n\ntype GraphQLRequest<TVariables = any> = {\n endpoint: string;\n query: DocumentNode | string;\n variables?: TVariables;\n headers?: IHeaders;\n};\n\nexport interface IGraphQLClient {\n execute<TResult = any, TVariables = any>(params: GraphQLRequest<TVariables>): Promise<TResult>;\n}\nexport const GraphQLClient = createAbstraction<IGraphQLClient>(\"GraphQLClient\");\n\nexport namespace GraphQLClient {\n export type Headers = IHeaders;\n export type Interface = IGraphQLClient;\n export type Request<TVariables = any> = GraphQLRequest<TVariables>;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,uBAAuB;AAezD,OAAO,MAAMC,aAAa,GAAGD,iBAAiB,CAAiB,eAAe,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/graphqlClient/abstractions.js","sources":["../../../src/features/graphqlClient/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { DocumentNode } from \"graphql\";\n\ntype IHeaders = Record<string, string | number | undefined>;\n\ntype GraphQLRequest<TVariables = any> = {\n endpoint: string;\n query: DocumentNode | string;\n variables?: TVariables;\n headers?: IHeaders;\n};\n\nexport interface IGraphQLClient {\n execute<TResult = any, TVariables = any>(params: GraphQLRequest<TVariables>): Promise<TResult>;\n}\nexport const GraphQLClient = createAbstraction<IGraphQLClient>(\"GraphQLClient\");\n\nexport namespace GraphQLClient {\n export type Headers = IHeaders;\n export type Interface = IGraphQLClient;\n export type Request<TVariables = any> = GraphQLRequest<TVariables>;\n}\n"],"names":["GraphQLClient","createAbstraction"],"mappings":";AAeO,MAAMA,gBAAgBC,kBAAkC"}
@@ -5,27 +5,21 @@ import { createFeature } from "../../shared/di/createFeature.js";
5
5
  import { RetryGraphQLClient } from "./RetryGraphQLClient.js";
6
6
  import { NetworkErrorPublishing } from "./NetworkErrorPublishing.js";
7
7
  import { AuthenticationErrorPublishing } from "./AuthenticationErrorPublishing.js";
8
- export const GraphQLClientFeature = createFeature({
9
- name: "GraphQLClient",
10
- register(container, options) {
11
- // Base implementation
12
- container.register(FetchGraphQLClient).inSingletonScope();
13
-
14
- // Optional decorators (order matters: retry wraps batching)
15
- if (options.batching) {
16
- container.registerDecorator(BatchingGraphQLClient);
17
- }
18
- if (options.retry) {
19
- container.registerDecorator(RetryGraphQLClient);
8
+ const GraphQLClientFeature = createFeature({
9
+ name: "GraphQLClient",
10
+ register (container, options) {
11
+ container.register(FetchGraphQLClient).inSingletonScope();
12
+ if (options.batching) container.registerDecorator(BatchingGraphQLClient);
13
+ if (options.retry) container.registerDecorator(RetryGraphQLClient);
14
+ container.registerDecorator(NetworkErrorPublishing);
15
+ container.registerDecorator(AuthenticationErrorPublishing);
16
+ },
17
+ resolve (container) {
18
+ return {
19
+ client: container.resolve(GraphQLClient)
20
+ };
20
21
  }
21
- container.registerDecorator(NetworkErrorPublishing);
22
- container.registerDecorator(AuthenticationErrorPublishing);
23
- },
24
- resolve(container) {
25
- return {
26
- client: container.resolve(GraphQLClient)
27
- };
28
- }
29
22
  });
23
+ export { GraphQLClientFeature };
30
24
 
31
25
  //# sourceMappingURL=feature.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["GraphQLClient","BatchingGraphQLClient","FetchGraphQLClient","createFeature","RetryGraphQLClient","NetworkErrorPublishing","AuthenticationErrorPublishing","GraphQLClientFeature","name","register","container","options","inSingletonScope","batching","registerDecorator","retry","resolve","client"],"sources":["feature.ts"],"sourcesContent":["import { GraphQLClient } from \"./abstractions.js\";\nimport { BatchingGraphQLClient } from \"./BatchingGraphQLClient.js\";\nimport { FetchGraphQLClient } from \"./FetchGraphQLClient.js\";\nimport { createFeature } from \"~/shared/di/createFeature.js\";\nimport { RetryGraphQLClient } from \"./RetryGraphQLClient.js\";\nimport { NetworkErrorPublishing } from \"./NetworkErrorPublishing.js\";\nimport { AuthenticationErrorPublishing } from \"./AuthenticationErrorPublishing.js\";\n\nexport const GraphQLClientFeature = createFeature({\n name: \"GraphQLClient\",\n register(\n container,\n options: {\n batching: boolean;\n retry: boolean;\n }\n ) {\n // Base implementation\n container.register(FetchGraphQLClient).inSingletonScope();\n\n // Optional decorators (order matters: retry wraps batching)\n if (options.batching) {\n container.registerDecorator(BatchingGraphQLClient);\n }\n\n if (options.retry) {\n container.registerDecorator(RetryGraphQLClient);\n }\n\n container.registerDecorator(NetworkErrorPublishing);\n container.registerDecorator(AuthenticationErrorPublishing);\n },\n resolve(container) {\n return {\n client: container.resolve(GraphQLClient)\n };\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa;AACtB,SAASC,qBAAqB;AAC9B,SAASC,kBAAkB;AAC3B,SAASC,aAAa;AACtB,SAASC,kBAAkB;AAC3B,SAASC,sBAAsB;AAC/B,SAASC,6BAA6B;AAEtC,OAAO,MAAMC,oBAAoB,GAAGJ,aAAa,CAAC;EAC9CK,IAAI,EAAE,eAAe;EACrBC,QAAQA,CACJC,SAAS,EACTC,OAGC,EACH;IACE;IACAD,SAAS,CAACD,QAAQ,CAACP,kBAAkB,CAAC,CAACU,gBAAgB,CAAC,CAAC;;IAEzD;IACA,IAAID,OAAO,CAACE,QAAQ,EAAE;MAClBH,SAAS,CAACI,iBAAiB,CAACb,qBAAqB,CAAC;IACtD;IAEA,IAAIU,OAAO,CAACI,KAAK,EAAE;MACfL,SAAS,CAACI,iBAAiB,CAACV,kBAAkB,CAAC;IACnD;IAEAM,SAAS,CAACI,iBAAiB,CAACT,sBAAsB,CAAC;IACnDK,SAAS,CAACI,iBAAiB,CAACR,6BAA6B,CAAC;EAC9D,CAAC;EACDU,OAAOA,CAACN,SAAS,EAAE;IACf,OAAO;MACHO,MAAM,EAAEP,SAAS,CAACM,OAAO,CAAChB,aAAa;IAC3C,CAAC;EACL;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/graphqlClient/feature.js","sources":["../../../src/features/graphqlClient/feature.ts"],"sourcesContent":["import { GraphQLClient } from \"./abstractions.js\";\nimport { BatchingGraphQLClient } from \"./BatchingGraphQLClient.js\";\nimport { FetchGraphQLClient } from \"./FetchGraphQLClient.js\";\nimport { createFeature } from \"~/shared/di/createFeature.js\";\nimport { RetryGraphQLClient } from \"./RetryGraphQLClient.js\";\nimport { NetworkErrorPublishing } from \"./NetworkErrorPublishing.js\";\nimport { AuthenticationErrorPublishing } from \"./AuthenticationErrorPublishing.js\";\n\nexport const GraphQLClientFeature = createFeature({\n name: \"GraphQLClient\",\n register(\n container,\n options: {\n batching: boolean;\n retry: boolean;\n }\n ) {\n // Base implementation\n container.register(FetchGraphQLClient).inSingletonScope();\n\n // Optional decorators (order matters: retry wraps batching)\n if (options.batching) {\n container.registerDecorator(BatchingGraphQLClient);\n }\n\n if (options.retry) {\n container.registerDecorator(RetryGraphQLClient);\n }\n\n container.registerDecorator(NetworkErrorPublishing);\n container.registerDecorator(AuthenticationErrorPublishing);\n },\n resolve(container) {\n return {\n client: container.resolve(GraphQLClient)\n };\n }\n});\n"],"names":["GraphQLClientFeature","createFeature","container","options","FetchGraphQLClient","BatchingGraphQLClient","RetryGraphQLClient","NetworkErrorPublishing","AuthenticationErrorPublishing","GraphQLClient"],"mappings":";;;;;;;AAQO,MAAMA,uBAAuBC,cAAc;IAC9C,MAAM;IACN,UACIC,SAAS,EACTC,OAGC;QAGDD,UAAU,QAAQ,CAACE,oBAAoB,gBAAgB;QAGvD,IAAID,QAAQ,QAAQ,EAChBD,UAAU,iBAAiB,CAACG;QAGhC,IAAIF,QAAQ,KAAK,EACbD,UAAU,iBAAiB,CAACI;QAGhCJ,UAAU,iBAAiB,CAACK;QAC5BL,UAAU,iBAAiB,CAACM;IAChC;IACA,SAAQN,SAAS;QACb,OAAO;YACH,QAAQA,UAAU,OAAO,CAACO;QAC9B;IACJ;AACJ"}
@@ -1,3 +1 @@
1
1
  export { GraphQLClient } from "./abstractions.js";
2
-
3
- //# sourceMappingURL=index.js.map
@@ -1,3 +0,0 @@
1
- export {};
2
-
3
- //# sourceMappingURL=types.js.map
@@ -1,68 +1,61 @@
1
- export class BrowserLocalStorageGateway {
2
- get(key) {
3
- const value = window.localStorage.getItem(key);
4
- try {
5
- return value ? JSON.parse(value) : null;
6
- } catch {
7
- return value;
1
+ class BrowserLocalStorageGateway {
2
+ get(key) {
3
+ const value = window.localStorage.getItem(key);
4
+ try {
5
+ return value ? JSON.parse(value) : null;
6
+ } catch {
7
+ return value;
8
+ }
8
9
  }
9
- }
10
- set(key, value) {
11
- const serialized = typeof value === "string" ? value : JSON.stringify(value);
12
- window.localStorage.setItem(key, serialized);
13
-
14
- // Dispatch local event so same-tab listeners are notified.
15
- window.dispatchEvent(new CustomEvent("localstorage:changed", {
16
- detail: {
17
- key,
18
- value,
19
- action: "set"
20
- }
21
- }));
22
- }
23
- remove(key) {
24
- window.localStorage.removeItem(key);
25
- window.dispatchEvent(new CustomEvent("localstorage:changed", {
26
- detail: {
27
- key,
28
- action: "remove"
29
- }
30
- }));
31
- }
32
- clear() {
33
- window.localStorage.clear();
34
- window.dispatchEvent(new CustomEvent("localstorage:changed", {
35
- detail: {
36
- action: "clear"
37
- }
38
- }));
39
- }
40
- getAll() {
41
- const result = {};
42
- for (let i = 0; i < window.localStorage.length; i++) {
43
- const key = window.localStorage.key(i);
44
- const val = this.get(key);
45
- if (val !== null) {
46
- result[key] = val;
47
- }
10
+ set(key, value) {
11
+ const serialized = "string" == typeof value ? value : JSON.stringify(value);
12
+ window.localStorage.setItem(key, serialized);
13
+ window.dispatchEvent(new CustomEvent("localstorage:changed", {
14
+ detail: {
15
+ key,
16
+ value,
17
+ action: "set"
18
+ }
19
+ }));
20
+ }
21
+ remove(key) {
22
+ window.localStorage.removeItem(key);
23
+ window.dispatchEvent(new CustomEvent("localstorage:changed", {
24
+ detail: {
25
+ key,
26
+ action: "remove"
27
+ }
28
+ }));
29
+ }
30
+ clear() {
31
+ window.localStorage.clear();
32
+ window.dispatchEvent(new CustomEvent("localstorage:changed", {
33
+ detail: {
34
+ action: "clear"
35
+ }
36
+ }));
37
+ }
38
+ getAll() {
39
+ const result = {};
40
+ for(let i = 0; i < window.localStorage.length; i++){
41
+ const key = window.localStorage.key(i);
42
+ const val = this.get(key);
43
+ if (null !== val) result[key] = val;
44
+ }
45
+ return result;
46
+ }
47
+ subscribe(listener) {
48
+ const handler = (ev)=>{
49
+ if (ev instanceof StorageEvent || ev instanceof CustomEvent) listener(ev);
50
+ };
51
+ window.addEventListener("storage", handler);
52
+ window.addEventListener("localstorage:changed", handler);
53
+ return ()=>{
54
+ window.removeEventListener("storage", handler);
55
+ window.removeEventListener("localstorage:changed", handler);
56
+ };
48
57
  }
49
- return result;
50
- }
51
-
52
- // Subscribe to changes (cross-tab + same-tab)
53
- subscribe(listener) {
54
- const handler = ev => {
55
- if (ev instanceof StorageEvent || ev instanceof CustomEvent) {
56
- listener(ev);
57
- }
58
- };
59
- window.addEventListener("storage", handler);
60
- window.addEventListener("localstorage:changed", handler);
61
- return () => {
62
- window.removeEventListener("storage", handler);
63
- window.removeEventListener("localstorage:changed", handler);
64
- };
65
- }
66
58
  }
59
+ export { BrowserLocalStorageGateway };
67
60
 
68
61
  //# sourceMappingURL=BrowserLocalStorageGateway.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["BrowserLocalStorageGateway","get","key","value","window","localStorage","getItem","JSON","parse","set","serialized","stringify","setItem","dispatchEvent","CustomEvent","detail","action","remove","removeItem","clear","getAll","result","i","length","val","subscribe","listener","handler","ev","StorageEvent","addEventListener","removeEventListener"],"sources":["BrowserLocalStorageGateway.ts"],"sourcesContent":["import { ILocalStorageGateway } from \"./abstractions.js\";\n\nexport class BrowserLocalStorageGateway implements ILocalStorageGateway {\n get<T = string>(key: string): T | null {\n const value = window.localStorage.getItem(key);\n try {\n return value ? (JSON.parse(value) as T) : null;\n } catch {\n return value as unknown as T;\n }\n }\n\n set<T = string>(key: string, value: T): void {\n const serialized = typeof value === \"string\" ? value : JSON.stringify(value);\n window.localStorage.setItem(key, serialized);\n\n // Dispatch local event so same-tab listeners are notified.\n window.dispatchEvent(\n new CustomEvent(\"localstorage:changed\", {\n detail: { key, value, action: \"set\" }\n })\n );\n }\n\n remove(key: string): void {\n window.localStorage.removeItem(key);\n window.dispatchEvent(\n new CustomEvent(\"localstorage:changed\", {\n detail: { key, action: \"remove\" }\n })\n );\n }\n\n clear(): void {\n window.localStorage.clear();\n window.dispatchEvent(\n new CustomEvent(\"localstorage:changed\", {\n detail: { action: \"clear\" }\n })\n );\n }\n\n getAll(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i)!;\n const val = this.get(key);\n if (val !== null) {\n result[key] = val;\n }\n }\n return result;\n }\n\n // Subscribe to changes (cross-tab + same-tab)\n subscribe(listener: (event: StorageEvent | CustomEvent) => void): () => void {\n const handler = (ev: Event) => {\n if (ev instanceof StorageEvent || ev instanceof CustomEvent) {\n listener(ev);\n }\n };\n window.addEventListener(\"storage\", handler);\n window.addEventListener(\"localstorage:changed\", handler as any);\n\n return () => {\n window.removeEventListener(\"storage\", handler);\n window.removeEventListener(\"localstorage:changed\", handler as any);\n };\n }\n}\n"],"mappings":"AAEA,OAAO,MAAMA,0BAA0B,CAAiC;EACpEC,GAAGA,CAAaC,GAAW,EAAY;IACnC,MAAMC,KAAK,GAAGC,MAAM,CAACC,YAAY,CAACC,OAAO,CAACJ,GAAG,CAAC;IAC9C,IAAI;MACA,OAAOC,KAAK,GAAII,IAAI,CAACC,KAAK,CAACL,KAAK,CAAC,GAAS,IAAI;IAClD,CAAC,CAAC,MAAM;MACJ,OAAOA,KAAK;IAChB;EACJ;EAEAM,GAAGA,CAAaP,GAAW,EAAEC,KAAQ,EAAQ;IACzC,MAAMO,UAAU,GAAG,OAAOP,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAGI,IAAI,CAACI,SAAS,CAACR,KAAK,CAAC;IAC5EC,MAAM,CAACC,YAAY,CAACO,OAAO,CAACV,GAAG,EAAEQ,UAAU,CAAC;;IAE5C;IACAN,MAAM,CAACS,aAAa,CAChB,IAAIC,WAAW,CAAC,sBAAsB,EAAE;MACpCC,MAAM,EAAE;QAAEb,GAAG;QAAEC,KAAK;QAAEa,MAAM,EAAE;MAAM;IACxC,CAAC,CACL,CAAC;EACL;EAEAC,MAAMA,CAACf,GAAW,EAAQ;IACtBE,MAAM,CAACC,YAAY,CAACa,UAAU,CAAChB,GAAG,CAAC;IACnCE,MAAM,CAACS,aAAa,CAChB,IAAIC,WAAW,CAAC,sBAAsB,EAAE;MACpCC,MAAM,EAAE;QAAEb,GAAG;QAAEc,MAAM,EAAE;MAAS;IACpC,CAAC,CACL,CAAC;EACL;EAEAG,KAAKA,CAAA,EAAS;IACVf,MAAM,CAACC,YAAY,CAACc,KAAK,CAAC,CAAC;IAC3Bf,MAAM,CAACS,aAAa,CAChB,IAAIC,WAAW,CAAC,sBAAsB,EAAE;MACpCC,MAAM,EAAE;QAAEC,MAAM,EAAE;MAAQ;IAC9B,CAAC,CACL,CAAC;EACL;EAEAI,MAAMA,CAAA,EAA4B;IAC9B,MAAMC,MAA+B,GAAG,CAAC,CAAC;IAC1C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGlB,MAAM,CAACC,YAAY,CAACkB,MAAM,EAAED,CAAC,EAAE,EAAE;MACjD,MAAMpB,GAAG,GAAGE,MAAM,CAACC,YAAY,CAACH,GAAG,CAACoB,CAAC,CAAE;MACvC,MAAME,GAAG,GAAG,IAAI,CAACvB,GAAG,CAACC,GAAG,CAAC;MACzB,IAAIsB,GAAG,KAAK,IAAI,EAAE;QACdH,MAAM,CAACnB,GAAG,CAAC,GAAGsB,GAAG;MACrB;IACJ;IACA,OAAOH,MAAM;EACjB;;EAEA;EACAI,SAASA,CAACC,QAAqD,EAAc;IACzE,MAAMC,OAAO,GAAIC,EAAS,IAAK;MAC3B,IAAIA,EAAE,YAAYC,YAAY,IAAID,EAAE,YAAYd,WAAW,EAAE;QACzDY,QAAQ,CAACE,EAAE,CAAC;MAChB;IACJ,CAAC;IACDxB,MAAM,CAAC0B,gBAAgB,CAAC,SAAS,EAAEH,OAAO,CAAC;IAC3CvB,MAAM,CAAC0B,gBAAgB,CAAC,sBAAsB,EAAEH,OAAc,CAAC;IAE/D,OAAO,MAAM;MACTvB,MAAM,CAAC2B,mBAAmB,CAAC,SAAS,EAAEJ,OAAO,CAAC;MAC9CvB,MAAM,CAAC2B,mBAAmB,CAAC,sBAAsB,EAAEJ,OAAc,CAAC;IACtE,CAAC;EACL;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"features/localStorage/BrowserLocalStorageGateway.js","sources":["../../../src/features/localStorage/BrowserLocalStorageGateway.ts"],"sourcesContent":["import { ILocalStorageGateway } from \"./abstractions.js\";\n\nexport class BrowserLocalStorageGateway implements ILocalStorageGateway {\n get<T = string>(key: string): T | null {\n const value = window.localStorage.getItem(key);\n try {\n return value ? (JSON.parse(value) as T) : null;\n } catch {\n return value as unknown as T;\n }\n }\n\n set<T = string>(key: string, value: T): void {\n const serialized = typeof value === \"string\" ? value : JSON.stringify(value);\n window.localStorage.setItem(key, serialized);\n\n // Dispatch local event so same-tab listeners are notified.\n window.dispatchEvent(\n new CustomEvent(\"localstorage:changed\", {\n detail: { key, value, action: \"set\" }\n })\n );\n }\n\n remove(key: string): void {\n window.localStorage.removeItem(key);\n window.dispatchEvent(\n new CustomEvent(\"localstorage:changed\", {\n detail: { key, action: \"remove\" }\n })\n );\n }\n\n clear(): void {\n window.localStorage.clear();\n window.dispatchEvent(\n new CustomEvent(\"localstorage:changed\", {\n detail: { action: \"clear\" }\n })\n );\n }\n\n getAll(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i)!;\n const val = this.get(key);\n if (val !== null) {\n result[key] = val;\n }\n }\n return result;\n }\n\n // Subscribe to changes (cross-tab + same-tab)\n subscribe(listener: (event: StorageEvent | CustomEvent) => void): () => void {\n const handler = (ev: Event) => {\n if (ev instanceof StorageEvent || ev instanceof CustomEvent) {\n listener(ev);\n }\n };\n window.addEventListener(\"storage\", handler);\n window.addEventListener(\"localstorage:changed\", handler as any);\n\n return () => {\n window.removeEventListener(\"storage\", handler);\n window.removeEventListener(\"localstorage:changed\", handler as any);\n };\n }\n}\n"],"names":["BrowserLocalStorageGateway","key","value","window","JSON","serialized","CustomEvent","result","i","val","listener","handler","ev","StorageEvent"],"mappings":"AAEO,MAAMA;IACT,IAAgBC,GAAW,EAAY;QACnC,MAAMC,QAAQC,OAAO,YAAY,CAAC,OAAO,CAACF;QAC1C,IAAI;YACA,OAAOC,QAASE,KAAK,KAAK,CAACF,SAAe;QAC9C,EAAE,OAAM;YACJ,OAAOA;QACX;IACJ;IAEA,IAAgBD,GAAW,EAAEC,KAAQ,EAAQ;QACzC,MAAMG,aAAa,AAAiB,YAAjB,OAAOH,QAAqBA,QAAQE,KAAK,SAAS,CAACF;QACtEC,OAAO,YAAY,CAAC,OAAO,CAACF,KAAKI;QAGjCF,OAAO,aAAa,CAChB,IAAIG,YAAY,wBAAwB;YACpC,QAAQ;gBAAEL;gBAAKC;gBAAO,QAAQ;YAAM;QACxC;IAER;IAEA,OAAOD,GAAW,EAAQ;QACtBE,OAAO,YAAY,CAAC,UAAU,CAACF;QAC/BE,OAAO,aAAa,CAChB,IAAIG,YAAY,wBAAwB;YACpC,QAAQ;gBAAEL;gBAAK,QAAQ;YAAS;QACpC;IAER;IAEA,QAAc;QACVE,OAAO,YAAY,CAAC,KAAK;QACzBA,OAAO,aAAa,CAChB,IAAIG,YAAY,wBAAwB;YACpC,QAAQ;gBAAE,QAAQ;YAAQ;QAC9B;IAER;IAEA,SAAkC;QAC9B,MAAMC,SAAkC,CAAC;QACzC,IAAK,IAAIC,IAAI,GAAGA,IAAIL,OAAO,YAAY,CAAC,MAAM,EAAEK,IAAK;YACjD,MAAMP,MAAME,OAAO,YAAY,CAAC,GAAG,CAACK;YACpC,MAAMC,MAAM,IAAI,CAAC,GAAG,CAACR;YACrB,IAAIQ,AAAQ,SAARA,KACAF,MAAM,CAACN,IAAI,GAAGQ;QAEtB;QACA,OAAOF;IACX;IAGA,UAAUG,QAAqD,EAAc;QACzE,MAAMC,UAAU,CAACC;YACb,IAAIA,cAAcC,gBAAgBD,cAAcN,aAC5CI,SAASE;QAEjB;QACAT,OAAO,gBAAgB,CAAC,WAAWQ;QACnCR,OAAO,gBAAgB,CAAC,wBAAwBQ;QAEhD,OAAO;YACHR,OAAO,mBAAmB,CAAC,WAAWQ;YACtCR,OAAO,mBAAmB,CAAC,wBAAwBQ;QACvD;IACJ;AACJ"}
@@ -1,31 +1,34 @@
1
1
  import { makeAutoObservable } from "mobx";
2
- import { LocalStorage as LocalStorageAbstraction, LocalStorageRepository } from "./abstractions.js";
2
+ import { LocalStorage, LocalStorageRepository } from "./abstractions.js";
3
3
  import { createImplementation } from "@webiny/di";
4
4
  class LocalStorageImpl {
5
- constructor(repo) {
6
- this.repo = repo;
7
- makeAutoObservable(this);
8
- }
9
- get(key) {
10
- return this.repo.get(key);
11
- }
12
- set(key, value) {
13
- this.repo.set(key, value);
14
- }
15
- remove(key) {
16
- this.repo.remove(key);
17
- }
18
- clear() {
19
- this.repo.clear();
20
- }
21
- keys() {
22
- return this.repo.keys();
23
- }
5
+ constructor(repo){
6
+ this.repo = repo;
7
+ makeAutoObservable(this);
8
+ }
9
+ get(key) {
10
+ return this.repo.get(key);
11
+ }
12
+ set(key, value) {
13
+ this.repo.set(key, value);
14
+ }
15
+ remove(key) {
16
+ this.repo.remove(key);
17
+ }
18
+ clear() {
19
+ this.repo.clear();
20
+ }
21
+ keys() {
22
+ return this.repo.keys();
23
+ }
24
24
  }
25
- export const LocalStorage = createImplementation({
26
- abstraction: LocalStorageAbstraction,
27
- implementation: LocalStorageImpl,
28
- dependencies: [LocalStorageRepository]
25
+ const LocalStorage_LocalStorage = createImplementation({
26
+ abstraction: LocalStorage,
27
+ implementation: LocalStorageImpl,
28
+ dependencies: [
29
+ LocalStorageRepository
30
+ ]
29
31
  });
32
+ export { LocalStorage_LocalStorage as LocalStorage };
30
33
 
31
34
  //# sourceMappingURL=LocalStorage.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["makeAutoObservable","LocalStorage","LocalStorageAbstraction","LocalStorageRepository","createImplementation","LocalStorageImpl","constructor","repo","get","key","set","value","remove","clear","keys","abstraction","implementation","dependencies"],"sources":["LocalStorage.ts"],"sourcesContent":["import { makeAutoObservable } from \"mobx\";\nimport { LocalStorage as LocalStorageAbstraction, LocalStorageRepository } from \"./abstractions.js\";\nimport { createImplementation } from \"@webiny/di\";\n\nclass LocalStorageImpl implements LocalStorageAbstraction.Interface {\n constructor(private readonly repo: LocalStorageRepository.Interface) {\n makeAutoObservable(this);\n }\n\n get<T = string>(key: string) {\n return this.repo.get<T>(key);\n }\n set<T = string>(key: string, value: T) {\n this.repo.set(key, value);\n }\n remove(key: string) {\n this.repo.remove(key);\n }\n clear() {\n this.repo.clear();\n }\n keys() {\n return this.repo.keys();\n }\n}\n\nexport const LocalStorage = createImplementation({\n abstraction: LocalStorageAbstraction,\n implementation: LocalStorageImpl,\n dependencies: [LocalStorageRepository]\n});\n"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,MAAM;AACzC,SAASC,YAAY,IAAIC,uBAAuB,EAAEC,sBAAsB;AACxE,SAASC,oBAAoB,QAAQ,YAAY;AAEjD,MAAMC,gBAAgB,CAA8C;EAChEC,WAAWA,CAAkBC,IAAsC,EAAE;IAAA,KAAxCA,IAAsC,GAAtCA,IAAsC;IAC/DP,kBAAkB,CAAC,IAAI,CAAC;EAC5B;EAEAQ,GAAGA,CAAaC,GAAW,EAAE;IACzB,OAAO,IAAI,CAACF,IAAI,CAACC,GAAG,CAAIC,GAAG,CAAC;EAChC;EACAC,GAAGA,CAAaD,GAAW,EAAEE,KAAQ,EAAE;IACnC,IAAI,CAACJ,IAAI,CAACG,GAAG,CAACD,GAAG,EAAEE,KAAK,CAAC;EAC7B;EACAC,MAAMA,CAACH,GAAW,EAAE;IAChB,IAAI,CAACF,IAAI,CAACK,MAAM,CAACH,GAAG,CAAC;EACzB;EACAI,KAAKA,CAAA,EAAG;IACJ,IAAI,CAACN,IAAI,CAACM,KAAK,CAAC,CAAC;EACrB;EACAC,IAAIA,CAAA,EAAG;IACH,OAAO,IAAI,CAACP,IAAI,CAACO,IAAI,CAAC,CAAC;EAC3B;AACJ;AAEA,OAAO,MAAMb,YAAY,GAAGG,oBAAoB,CAAC;EAC7CW,WAAW,EAAEb,uBAAuB;EACpCc,cAAc,EAAEX,gBAAgB;EAChCY,YAAY,EAAE,CAACd,sBAAsB;AACzC,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/localStorage/LocalStorage.js","sources":["../../../src/features/localStorage/LocalStorage.ts"],"sourcesContent":["import { makeAutoObservable } from \"mobx\";\nimport { LocalStorage as LocalStorageAbstraction, LocalStorageRepository } from \"./abstractions.js\";\nimport { createImplementation } from \"@webiny/di\";\n\nclass LocalStorageImpl implements LocalStorageAbstraction.Interface {\n constructor(private readonly repo: LocalStorageRepository.Interface) {\n makeAutoObservable(this);\n }\n\n get<T = string>(key: string) {\n return this.repo.get<T>(key);\n }\n set<T = string>(key: string, value: T) {\n this.repo.set(key, value);\n }\n remove(key: string) {\n this.repo.remove(key);\n }\n clear() {\n this.repo.clear();\n }\n keys() {\n return this.repo.keys();\n }\n}\n\nexport const LocalStorage = createImplementation({\n abstraction: LocalStorageAbstraction,\n implementation: LocalStorageImpl,\n dependencies: [LocalStorageRepository]\n});\n"],"names":["LocalStorageImpl","repo","makeAutoObservable","key","value","LocalStorage","createImplementation","LocalStorageAbstraction","LocalStorageRepository"],"mappings":";;;AAIA,MAAMA;IACF,YAA6BC,IAAsC,CAAE;aAAxCA,IAAI,GAAJA;QACzBC,mBAAmB,IAAI;IAC3B;IAEA,IAAgBC,GAAW,EAAE;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAIA;IAC5B;IACA,IAAgBA,GAAW,EAAEC,KAAQ,EAAE;QACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAACD,KAAKC;IACvB;IACA,OAAOD,GAAW,EAAE;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAACA;IACrB;IACA,QAAQ;QACJ,IAAI,CAAC,IAAI,CAAC,KAAK;IACnB;IACA,OAAO;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI;IACzB;AACJ;AAEO,MAAME,4BAAeC,qBAAqB;IAC7C,aAAaC;IACb,gBAAgBP;IAChB,cAAc;QAACQ;KAAuB;AAC1C"}
@@ -1,95 +1,82 @@
1
1
  import { makeAutoObservable, runInAction } from "mobx";
2
- import { LocalStorageRepository as LocalStorageRepositoryAbstraction, LocalStorageConfig, LocalStorageGateway } from "./abstractions.js";
2
+ import { LocalStorageConfig, LocalStorageGateway, LocalStorageRepository } from "./abstractions.js";
3
3
  import { createImplementation } from "@webiny/di";
4
- export class LocalStorageRepositoryImpl {
5
- store = new Map();
6
- constructor(gateway, config) {
7
- this.gateway = gateway;
8
- this.prefix = config.prefix || "";
9
- makeAutoObservable(this);
10
- this.bootstrap();
11
- this.subscribeToChanges();
12
- }
13
- withPrefix(key) {
14
- return this.prefix ? `${this.prefix}:${key}` : key;
15
- }
16
- stripPrefix(key) {
17
- return this.prefix ? key.replace(new RegExp(`^${this.prefix}:`), "") : key;
18
- }
19
- bootstrap() {
20
- const all = this.gateway.getAll();
21
- for (const [key, value] of Object.entries(all)) {
22
- if (!this.prefix || key.startsWith(this.prefix + ":")) {
23
- this.store.set(this.stripPrefix(key), value);
24
- }
4
+ class LocalStorageRepositoryImpl {
5
+ constructor(gateway, config){
6
+ this.gateway = gateway;
7
+ this.store = new Map();
8
+ this.prefix = config.prefix || "";
9
+ makeAutoObservable(this);
10
+ this.bootstrap();
11
+ this.subscribeToChanges();
12
+ }
13
+ withPrefix(key) {
14
+ return this.prefix ? `${this.prefix}:${key}` : key;
15
+ }
16
+ stripPrefix(key) {
17
+ return this.prefix ? key.replace(new RegExp(`^${this.prefix}:`), "") : key;
18
+ }
19
+ bootstrap() {
20
+ const all = this.gateway.getAll();
21
+ for (const [key, value] of Object.entries(all))if (!this.prefix || key.startsWith(this.prefix + ":")) this.store.set(this.stripPrefix(key), value);
22
+ }
23
+ subscribeToChanges() {
24
+ this.unsubscribe = this.gateway.subscribe((ev)=>{
25
+ runInAction(()=>{
26
+ if (ev instanceof StorageEvent && ev.key) {
27
+ if (!this.prefix || ev.key.startsWith(this.prefix + ":")) {
28
+ const cleanKey = this.stripPrefix(ev.key);
29
+ if (null !== ev.newValue) try {
30
+ this.store.set(cleanKey, JSON.parse(ev.newValue));
31
+ } catch {
32
+ this.store.set(cleanKey, ev.newValue);
33
+ }
34
+ else this.store.delete(cleanKey);
35
+ }
36
+ }
37
+ if (ev instanceof CustomEvent) {
38
+ const { key, value, action } = ev.detail;
39
+ if (!this.prefix || key.startsWith(this.prefix + ":")) {
40
+ const cleanKey = this.stripPrefix(key);
41
+ if ("set" === action) this.store.set(cleanKey, value);
42
+ if ("remove" === action) this.store.delete(cleanKey);
43
+ if ("clear" === action) this.store.clear();
44
+ }
45
+ }
46
+ });
47
+ });
48
+ }
49
+ destroy() {
50
+ this.unsubscribe?.();
51
+ }
52
+ has(key) {
53
+ return this.store.has(key);
54
+ }
55
+ get(key) {
56
+ return this.store.get(key);
57
+ }
58
+ set(key, value) {
59
+ this.gateway.set(this.withPrefix(key), value);
60
+ }
61
+ remove(key) {
62
+ this.gateway.remove(this.withPrefix(key));
63
+ }
64
+ clear() {
65
+ this.gateway.clear();
66
+ this.store.clear();
67
+ }
68
+ keys() {
69
+ return Array.from(this.store.keys());
25
70
  }
26
- }
27
- subscribeToChanges() {
28
- this.unsubscribe = this.gateway.subscribe(ev => {
29
- runInAction(() => {
30
- if (ev instanceof StorageEvent && ev.key) {
31
- if (!this.prefix || ev.key.startsWith(this.prefix + ":")) {
32
- const cleanKey = this.stripPrefix(ev.key);
33
- if (ev.newValue !== null) {
34
- try {
35
- this.store.set(cleanKey, JSON.parse(ev.newValue));
36
- } catch {
37
- this.store.set(cleanKey, ev.newValue);
38
- }
39
- } else {
40
- this.store.delete(cleanKey);
41
- }
42
- }
43
- }
44
- if (ev instanceof CustomEvent) {
45
- const {
46
- key,
47
- value,
48
- action
49
- } = ev.detail;
50
- if (!this.prefix || key.startsWith(this.prefix + ":")) {
51
- const cleanKey = this.stripPrefix(key);
52
- if (action === "set") {
53
- this.store.set(cleanKey, value);
54
- }
55
- if (action === "remove") {
56
- this.store.delete(cleanKey);
57
- }
58
- if (action === "clear") {
59
- this.store.clear();
60
- }
61
- }
62
- }
63
- });
64
- });
65
- }
66
- destroy() {
67
- this.unsubscribe?.();
68
- }
69
- has(key) {
70
- return this.store.has(key);
71
- }
72
- get(key) {
73
- return this.store.get(key);
74
- }
75
- set(key, value) {
76
- this.gateway.set(this.withPrefix(key), value);
77
- }
78
- remove(key) {
79
- this.gateway.remove(this.withPrefix(key));
80
- }
81
- clear() {
82
- this.gateway.clear();
83
- this.store.clear();
84
- }
85
- keys() {
86
- return Array.from(this.store.keys());
87
- }
88
71
  }
89
- export const LocalStorageRepository = createImplementation({
90
- abstraction: LocalStorageRepositoryAbstraction,
91
- implementation: LocalStorageRepositoryImpl,
92
- dependencies: [LocalStorageGateway, LocalStorageConfig]
72
+ const LocalStorageRepository_LocalStorageRepository = createImplementation({
73
+ abstraction: LocalStorageRepository,
74
+ implementation: LocalStorageRepositoryImpl,
75
+ dependencies: [
76
+ LocalStorageGateway,
77
+ LocalStorageConfig
78
+ ]
93
79
  });
80
+ export { LocalStorageRepositoryImpl, LocalStorageRepository_LocalStorageRepository as LocalStorageRepository };
94
81
 
95
82
  //# sourceMappingURL=LocalStorageRepository.js.map