@webiny/app 6.3.0 → 6.4.0-beta.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 (281) 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 +14 -16
  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/renderApp.js +7 -6
  217. package/renderApp.js.map +1 -1
  218. package/router.js +0 -3
  219. package/rslib-runtime.js +14 -0
  220. package/rslib-runtime.js.map +1 -0
  221. package/shared/di/DiContainerProvider.js +8 -12
  222. package/shared/di/DiContainerProvider.js.map +1 -1
  223. package/shared/di/createFeature.js +7 -8
  224. package/shared/di/createFeature.js.map +1 -1
  225. package/shared/di/useFeature.js +7 -3
  226. package/shared/di/useFeature.js.map +1 -1
  227. package/static/svg/close_24px.33adaadc.svg +1 -0
  228. package/types.js +0 -3
  229. package/utils/createGenericContext.js +17 -21
  230. package/utils/createGenericContext.js.map +1 -1
  231. package/utils/createHashing.js +13 -16
  232. package/utils/createHashing.js.map +1 -1
  233. package/utils/index.js +0 -2
  234. package/utils/legacyPluginToReactComponent.js +11 -10
  235. package/utils/legacyPluginToReactComponent.js.map +1 -1
  236. package/components/index.js.map +0 -1
  237. package/errors/index.js.map +0 -1
  238. package/exports/admin/env-config.js.map +0 -1
  239. package/exports/admin/graphql-client.js.map +0 -1
  240. package/exports/admin/local-storage.js.map +0 -1
  241. package/exports/admin/router.js.map +0 -1
  242. package/exports/admin/security.js.map +0 -1
  243. package/exports/admin.js.map +0 -1
  244. package/features/envConfig/index.js.map +0 -1
  245. package/features/eventPublisher/index.js.map +0 -1
  246. package/features/graphqlClient/index.js.map +0 -1
  247. package/features/graphqlClient/types.js.map +0 -1
  248. package/features/localStorage/index.js.map +0 -1
  249. package/features/mainGraphQLClient/index.js.map +0 -1
  250. package/features/router/index.js.map +0 -1
  251. package/helpers/InterfaceGenerator/date.js.map +0 -1
  252. package/helpers/InterfaceGenerator/id.js.map +0 -1
  253. package/helpers/InterfaceGenerator/identity.js.map +0 -1
  254. package/helpers/InterfaceGenerator/index.js.map +0 -1
  255. package/helpers/InterfaceGenerator/numeric.js.map +0 -1
  256. package/helpers/InterfaceGenerator/truthful.js.map +0 -1
  257. package/hooks/useAutocomplete/index.js.map +0 -1
  258. package/hooks/useDataList/functions/index.js.map +0 -1
  259. package/hooks/useDataList/index.js.map +0 -1
  260. package/hooks/useDataList/utils/index.js.map +0 -1
  261. package/i18n/index.js.map +0 -1
  262. package/index.js.map +0 -1
  263. package/presentation/localStorage/index.js.map +0 -1
  264. package/presentation/router/index.js.map +0 -1
  265. package/presentation/router/types.js.map +0 -1
  266. package/react-butterfiles/Files.d.ts +0 -69
  267. package/react-butterfiles/Files.js +0 -227
  268. package/react-butterfiles/Files.js.map +0 -1
  269. package/react-butterfiles/file.todo +0 -1
  270. package/react-butterfiles/index.d.ts +0 -2
  271. package/react-butterfiles/index.js +0 -4
  272. package/react-butterfiles/index.js.map +0 -1
  273. package/react-butterfiles/utils/generateId.d.ts +0 -1
  274. package/react-butterfiles/utils/generateId.js +0 -5
  275. package/react-butterfiles/utils/generateId.js.map +0 -1
  276. package/react-butterfiles/utils/readFileContent.d.ts +0 -1
  277. package/react-butterfiles/utils/readFileContent.js +0 -15
  278. package/react-butterfiles/utils/readFileContent.js.map +0 -1
  279. package/router.js.map +0 -1
  280. package/types.js.map +0 -1
  281. package/utils/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["makeAutoObservable","runInAction","LocalStorageRepository","LocalStorageRepositoryAbstraction","LocalStorageConfig","LocalStorageGateway","createImplementation","LocalStorageRepositoryImpl","store","Map","constructor","gateway","config","prefix","bootstrap","subscribeToChanges","withPrefix","key","stripPrefix","replace","RegExp","all","getAll","value","Object","entries","startsWith","set","unsubscribe","subscribe","ev","StorageEvent","cleanKey","newValue","JSON","parse","delete","CustomEvent","action","detail","clear","destroy","has","get","remove","keys","Array","from","abstraction","implementation","dependencies"],"sources":["LocalStorageRepository.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport {\n LocalStorageRepository as LocalStorageRepositoryAbstraction,\n LocalStorageConfig,\n LocalStorageGateway\n} from \"./abstractions.js\";\nimport { createImplementation } from \"@webiny/di\";\n\nexport class LocalStorageRepositoryImpl implements LocalStorageRepositoryAbstraction.Interface {\n private readonly prefix: string;\n private store = new Map<string, unknown>();\n private unsubscribe?: () => void;\n\n constructor(\n private gateway: LocalStorageGateway.Interface,\n config: LocalStorageConfig.Interface\n ) {\n this.prefix = config.prefix || \"\";\n makeAutoObservable(this);\n\n this.bootstrap();\n this.subscribeToChanges();\n }\n\n private withPrefix(key: string): string {\n return this.prefix ? `${this.prefix}:${key}` : key;\n }\n\n private stripPrefix(key: string): string {\n return this.prefix ? key.replace(new RegExp(`^${this.prefix}:`), \"\") : key;\n }\n\n private bootstrap() {\n const all = this.gateway.getAll();\n for (const [key, value] of Object.entries(all)) {\n if (!this.prefix || key.startsWith(this.prefix + \":\")) {\n this.store.set(this.stripPrefix(key), value);\n }\n }\n }\n\n private subscribeToChanges() {\n this.unsubscribe = this.gateway.subscribe(ev => {\n runInAction(() => {\n if (ev instanceof StorageEvent && ev.key) {\n if (!this.prefix || ev.key.startsWith(this.prefix + \":\")) {\n const cleanKey = this.stripPrefix(ev.key);\n if (ev.newValue !== null) {\n try {\n this.store.set(cleanKey, JSON.parse(ev.newValue));\n } catch {\n this.store.set(cleanKey, ev.newValue);\n }\n } else {\n this.store.delete(cleanKey);\n }\n }\n }\n if (ev instanceof CustomEvent) {\n const { key, value, action } = ev.detail;\n if (!this.prefix || key.startsWith(this.prefix + \":\")) {\n const cleanKey = this.stripPrefix(key);\n if (action === \"set\") {\n this.store.set(cleanKey, value);\n }\n if (action === \"remove\") {\n this.store.delete(cleanKey);\n }\n if (action === \"clear\") {\n this.store.clear();\n }\n }\n }\n });\n });\n }\n\n destroy() {\n this.unsubscribe?.();\n }\n\n has(key: string) {\n return this.store.has(key);\n }\n get<T = string>(key: string) {\n return this.store.get(key) as T | undefined;\n }\n set<T = string>(key: string, value: T) {\n this.gateway.set(this.withPrefix(key), value);\n }\n remove(key: string) {\n this.gateway.remove(this.withPrefix(key));\n }\n clear() {\n this.gateway.clear();\n this.store.clear();\n }\n keys(): string[] {\n return Array.from(this.store.keys());\n }\n}\n\nexport const LocalStorageRepository = createImplementation({\n abstraction: LocalStorageRepositoryAbstraction,\n implementation: LocalStorageRepositoryImpl,\n dependencies: [LocalStorageGateway, LocalStorageConfig]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"features/localStorage/LocalStorageRepository.js","sources":["../../../src/features/localStorage/LocalStorageRepository.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport {\n LocalStorageRepository as LocalStorageRepositoryAbstraction,\n LocalStorageConfig,\n LocalStorageGateway\n} from \"./abstractions.js\";\nimport { createImplementation } from \"@webiny/di\";\n\nexport class LocalStorageRepositoryImpl implements LocalStorageRepositoryAbstraction.Interface {\n private readonly prefix: string;\n private store = new Map<string, unknown>();\n private unsubscribe?: () => void;\n\n constructor(\n private gateway: LocalStorageGateway.Interface,\n config: LocalStorageConfig.Interface\n ) {\n this.prefix = config.prefix || \"\";\n makeAutoObservable(this);\n\n this.bootstrap();\n this.subscribeToChanges();\n }\n\n private withPrefix(key: string): string {\n return this.prefix ? `${this.prefix}:${key}` : key;\n }\n\n private stripPrefix(key: string): string {\n return this.prefix ? key.replace(new RegExp(`^${this.prefix}:`), \"\") : key;\n }\n\n private bootstrap() {\n const all = this.gateway.getAll();\n for (const [key, value] of Object.entries(all)) {\n if (!this.prefix || key.startsWith(this.prefix + \":\")) {\n this.store.set(this.stripPrefix(key), value);\n }\n }\n }\n\n private subscribeToChanges() {\n this.unsubscribe = this.gateway.subscribe(ev => {\n runInAction(() => {\n if (ev instanceof StorageEvent && ev.key) {\n if (!this.prefix || ev.key.startsWith(this.prefix + \":\")) {\n const cleanKey = this.stripPrefix(ev.key);\n if (ev.newValue !== null) {\n try {\n this.store.set(cleanKey, JSON.parse(ev.newValue));\n } catch {\n this.store.set(cleanKey, ev.newValue);\n }\n } else {\n this.store.delete(cleanKey);\n }\n }\n }\n if (ev instanceof CustomEvent) {\n const { key, value, action } = ev.detail;\n if (!this.prefix || key.startsWith(this.prefix + \":\")) {\n const cleanKey = this.stripPrefix(key);\n if (action === \"set\") {\n this.store.set(cleanKey, value);\n }\n if (action === \"remove\") {\n this.store.delete(cleanKey);\n }\n if (action === \"clear\") {\n this.store.clear();\n }\n }\n }\n });\n });\n }\n\n destroy() {\n this.unsubscribe?.();\n }\n\n has(key: string) {\n return this.store.has(key);\n }\n get<T = string>(key: string) {\n return this.store.get(key) as T | undefined;\n }\n set<T = string>(key: string, value: T) {\n this.gateway.set(this.withPrefix(key), value);\n }\n remove(key: string) {\n this.gateway.remove(this.withPrefix(key));\n }\n clear() {\n this.gateway.clear();\n this.store.clear();\n }\n keys(): string[] {\n return Array.from(this.store.keys());\n }\n}\n\nexport const LocalStorageRepository = createImplementation({\n abstraction: LocalStorageRepositoryAbstraction,\n implementation: LocalStorageRepositoryImpl,\n dependencies: [LocalStorageGateway, LocalStorageConfig]\n});\n"],"names":["LocalStorageRepositoryImpl","gateway","config","Map","makeAutoObservable","key","RegExp","all","value","Object","ev","runInAction","StorageEvent","cleanKey","JSON","CustomEvent","action","Array","LocalStorageRepository","createImplementation","LocalStorageRepositoryAbstraction","LocalStorageGateway","LocalStorageConfig"],"mappings":"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"}
@@ -1,19 +1,8 @@
1
1
  import { Abstraction } from "@webiny/di";
2
-
3
- /** Gateway: raw IO into localStorage (or other storage). */
4
-
5
- export const LocalStorageGateway = new Abstraction("LocalStorageGateway");
6
-
7
- /** Repository: reactive state (MobX), synchronized with gateway. */
8
-
9
- export const LocalStorageRepository = new Abstraction("LocalStorageRepository");
10
-
11
- /** Config: configure key prefixes, etc. */
12
-
13
- export const LocalStorageConfig = new Abstraction("LocalStorageConfig");
14
-
15
- /** Service: thin façade, delegates to repository for consumers. */
16
-
17
- export const LocalStorage = new Abstraction("LocalStorage");
2
+ const LocalStorageGateway = new Abstraction("LocalStorageGateway");
3
+ const LocalStorageRepository = new Abstraction("LocalStorageRepository");
4
+ const LocalStorageConfig = new Abstraction("LocalStorageConfig");
5
+ const LocalStorage = new Abstraction("LocalStorage");
6
+ export { LocalStorage, LocalStorageConfig, LocalStorageGateway, LocalStorageRepository };
18
7
 
19
8
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Abstraction","LocalStorageGateway","LocalStorageRepository","LocalStorageConfig","LocalStorage"],"sources":["abstractions.ts"],"sourcesContent":["import { Abstraction } from \"@webiny/di\";\n\n/** Gateway: raw IO into localStorage (or other storage). */\nexport interface ILocalStorageGateway {\n get<T = string>(key: string): T | null;\n set<T = string>(key: string, value: T): void;\n remove(key: string): void;\n clear(): void;\n getAll(): Record<string, unknown>;\n subscribe(listener: (event: StorageEvent | CustomEvent) => void): () => void;\n}\n\nexport const LocalStorageGateway = new Abstraction<ILocalStorageGateway>(\"LocalStorageGateway\");\n\nexport namespace LocalStorageGateway {\n export type Interface = ILocalStorageGateway;\n}\n\n/** Repository: reactive state (MobX), synchronized with gateway. */\nexport interface ILocalStorageRepository {\n has(key: string): boolean;\n get<T = string>(key: string): T | undefined;\n set<T = string>(key: string, value: T): void;\n remove(key: string): void;\n clear(): void;\n keys(): string[];\n destroy(): void;\n}\n\nexport const LocalStorageRepository = new Abstraction<ILocalStorageRepository>(\n \"LocalStorageRepository\"\n);\n\nexport namespace LocalStorageRepository {\n export type Interface = ILocalStorageRepository;\n}\n\n/** Config: configure key prefixes, etc. */\nexport interface ILocalStorageConfig {\n prefix?: string;\n}\n\nexport const LocalStorageConfig = new Abstraction<ILocalStorageConfig>(\"LocalStorageConfig\");\n\nexport namespace LocalStorageConfig {\n export type Interface = ILocalStorageConfig;\n}\n\n/** Service: thin façade, delegates to repository for consumers. */\nexport interface ILocalStorage {\n get<T = string>(key: string): T | undefined;\n set<T = string>(key: string, value: T): void;\n remove(key: string): void;\n clear(): void;\n keys(): string[];\n}\n\nexport const LocalStorage = new Abstraction<ILocalStorage>(\"LocalStorage\");\n\nexport namespace LocalStorage {\n export type Interface = ILocalStorage;\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,YAAY;;AAExC;;AAUA,OAAO,MAAMC,mBAAmB,GAAG,IAAID,WAAW,CAAuB,qBAAqB,CAAC;;AAM/F;;AAWA,OAAO,MAAME,sBAAsB,GAAG,IAAIF,WAAW,CACjD,wBACJ,CAAC;;AAMD;;AAKA,OAAO,MAAMG,kBAAkB,GAAG,IAAIH,WAAW,CAAsB,oBAAoB,CAAC;;AAM5F;;AASA,OAAO,MAAMI,YAAY,GAAG,IAAIJ,WAAW,CAAgB,cAAc,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/localStorage/abstractions.js","sources":["../../../src/features/localStorage/abstractions.ts"],"sourcesContent":["import { Abstraction } from \"@webiny/di\";\n\n/** Gateway: raw IO into localStorage (or other storage). */\nexport interface ILocalStorageGateway {\n get<T = string>(key: string): T | null;\n set<T = string>(key: string, value: T): void;\n remove(key: string): void;\n clear(): void;\n getAll(): Record<string, unknown>;\n subscribe(listener: (event: StorageEvent | CustomEvent) => void): () => void;\n}\n\nexport const LocalStorageGateway = new Abstraction<ILocalStorageGateway>(\"LocalStorageGateway\");\n\nexport namespace LocalStorageGateway {\n export type Interface = ILocalStorageGateway;\n}\n\n/** Repository: reactive state (MobX), synchronized with gateway. */\nexport interface ILocalStorageRepository {\n has(key: string): boolean;\n get<T = string>(key: string): T | undefined;\n set<T = string>(key: string, value: T): void;\n remove(key: string): void;\n clear(): void;\n keys(): string[];\n destroy(): void;\n}\n\nexport const LocalStorageRepository = new Abstraction<ILocalStorageRepository>(\n \"LocalStorageRepository\"\n);\n\nexport namespace LocalStorageRepository {\n export type Interface = ILocalStorageRepository;\n}\n\n/** Config: configure key prefixes, etc. */\nexport interface ILocalStorageConfig {\n prefix?: string;\n}\n\nexport const LocalStorageConfig = new Abstraction<ILocalStorageConfig>(\"LocalStorageConfig\");\n\nexport namespace LocalStorageConfig {\n export type Interface = ILocalStorageConfig;\n}\n\n/** Service: thin façade, delegates to repository for consumers. */\nexport interface ILocalStorage {\n get<T = string>(key: string): T | undefined;\n set<T = string>(key: string, value: T): void;\n remove(key: string): void;\n clear(): void;\n keys(): string[];\n}\n\nexport const LocalStorage = new Abstraction<ILocalStorage>(\"LocalStorage\");\n\nexport namespace LocalStorage {\n export type Interface = ILocalStorage;\n}\n"],"names":["LocalStorageGateway","Abstraction","LocalStorageRepository","LocalStorageConfig","LocalStorage"],"mappings":";AAYO,MAAMA,sBAAsB,IAAIC,YAAkC;AAiBlE,MAAMC,yBAAyB,IAAID,YACtC;AAYG,MAAME,qBAAqB,IAAIF,YAAiC;AAehE,MAAMG,eAAe,IAAIH,YAA2B"}
@@ -1,34 +1,23 @@
1
- import { LocalStorageConfig, LocalStorageGateway, LocalStorage as Abstraction } from "./abstractions.js";
1
+ import { LocalStorage, LocalStorageConfig, LocalStorageGateway } from "./abstractions.js";
2
2
  import { BrowserLocalStorageGateway } from "./BrowserLocalStorageGateway.js";
3
3
  import { LocalStorageRepository } from "./LocalStorageRepository.js";
4
- import { LocalStorage } from "./LocalStorage.js";
4
+ import { LocalStorage as external_LocalStorage_js_LocalStorage } from "./LocalStorage.js";
5
5
  import { createFeature } from "../../shared/di/createFeature.js";
6
-
7
- /**
8
- * LocalStorageFeature wires together:
9
- * - BrowserLocalStorageGateway (default gateway)
10
- * - LocalStorageRepository (reactive MobX mirror)
11
- * - LocalStorage (thin consumer-facing facade)
12
- */
13
- export const LocalStorageFeature = createFeature({
14
- name: "LocalStorage",
15
- register(container, config = {}) {
16
- // Register config (tenant prefix, etc.)
17
- container.registerInstance(LocalStorageConfig, config);
18
-
19
- // Gateway: browser localStorage
20
- container.registerInstance(LocalStorageGateway, new BrowserLocalStorageGateway());
21
-
22
- // Repository & Service
23
- container.register(LocalStorageRepository).inSingletonScope();
24
- container.register(LocalStorage).inSingletonScope();
25
- },
26
- resolve(container) {
27
- return {
28
- localStorageService: container.resolve(Abstraction),
29
- localStorageConfig: container.resolve(LocalStorageConfig)
30
- };
31
- }
6
+ const LocalStorageFeature = createFeature({
7
+ name: "LocalStorage",
8
+ register (container, config = {}) {
9
+ container.registerInstance(LocalStorageConfig, config);
10
+ container.registerInstance(LocalStorageGateway, new BrowserLocalStorageGateway());
11
+ container.register(LocalStorageRepository).inSingletonScope();
12
+ container.register(external_LocalStorage_js_LocalStorage).inSingletonScope();
13
+ },
14
+ resolve (container) {
15
+ return {
16
+ localStorageService: container.resolve(LocalStorage),
17
+ localStorageConfig: container.resolve(LocalStorageConfig)
18
+ };
19
+ }
32
20
  });
21
+ export { LocalStorageFeature };
33
22
 
34
23
  //# sourceMappingURL=feature.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["LocalStorageConfig","LocalStorageGateway","LocalStorage","Abstraction","BrowserLocalStorageGateway","LocalStorageRepository","createFeature","LocalStorageFeature","name","register","container","config","registerInstance","inSingletonScope","resolve","localStorageService","localStorageConfig"],"sources":["feature.ts"],"sourcesContent":["import {\n LocalStorageConfig,\n LocalStorageGateway,\n LocalStorage as Abstraction\n} from \"./abstractions.js\";\nimport { BrowserLocalStorageGateway } from \"./BrowserLocalStorageGateway.js\";\nimport { LocalStorageRepository } from \"./LocalStorageRepository.js\";\nimport { LocalStorage } from \"./LocalStorage.js\";\nimport { createFeature } from \"~/shared/di/createFeature.js\";\n\n/**\n * LocalStorageFeature wires together:\n * - BrowserLocalStorageGateway (default gateway)\n * - LocalStorageRepository (reactive MobX mirror)\n * - LocalStorage (thin consumer-facing facade)\n */\nexport const LocalStorageFeature = createFeature({\n name: \"LocalStorage\",\n register(container, config: { prefix?: string } = {}) {\n // Register config (tenant prefix, etc.)\n container.registerInstance(LocalStorageConfig, config);\n\n // Gateway: browser localStorage\n container.registerInstance(LocalStorageGateway, new BrowserLocalStorageGateway());\n\n // Repository & Service\n container.register(LocalStorageRepository).inSingletonScope();\n container.register(LocalStorage).inSingletonScope();\n },\n resolve(container) {\n return {\n localStorageService: container.resolve(Abstraction),\n localStorageConfig: container.resolve(LocalStorageConfig)\n };\n }\n});\n"],"mappings":"AAAA,SACIA,kBAAkB,EAClBC,mBAAmB,EACnBC,YAAY,IAAIC,WAAW;AAE/B,SAASC,0BAA0B;AACnC,SAASC,sBAAsB;AAC/B,SAASH,YAAY;AACrB,SAASI,aAAa;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAGD,aAAa,CAAC;EAC7CE,IAAI,EAAE,cAAc;EACpBC,QAAQA,CAACC,SAAS,EAAEC,MAA2B,GAAG,CAAC,CAAC,EAAE;IAClD;IACAD,SAAS,CAACE,gBAAgB,CAACZ,kBAAkB,EAAEW,MAAM,CAAC;;IAEtD;IACAD,SAAS,CAACE,gBAAgB,CAACX,mBAAmB,EAAE,IAAIG,0BAA0B,CAAC,CAAC,CAAC;;IAEjF;IACAM,SAAS,CAACD,QAAQ,CAACJ,sBAAsB,CAAC,CAACQ,gBAAgB,CAAC,CAAC;IAC7DH,SAAS,CAACD,QAAQ,CAACP,YAAY,CAAC,CAACW,gBAAgB,CAAC,CAAC;EACvD,CAAC;EACDC,OAAOA,CAACJ,SAAS,EAAE;IACf,OAAO;MACHK,mBAAmB,EAAEL,SAAS,CAACI,OAAO,CAACX,WAAW,CAAC;MACnDa,kBAAkB,EAAEN,SAAS,CAACI,OAAO,CAACd,kBAAkB;IAC5D,CAAC;EACL;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/localStorage/feature.js","sources":["../../../src/features/localStorage/feature.ts"],"sourcesContent":["import {\n LocalStorageConfig,\n LocalStorageGateway,\n LocalStorage as Abstraction\n} from \"./abstractions.js\";\nimport { BrowserLocalStorageGateway } from \"./BrowserLocalStorageGateway.js\";\nimport { LocalStorageRepository } from \"./LocalStorageRepository.js\";\nimport { LocalStorage } from \"./LocalStorage.js\";\nimport { createFeature } from \"~/shared/di/createFeature.js\";\n\n/**\n * LocalStorageFeature wires together:\n * - BrowserLocalStorageGateway (default gateway)\n * - LocalStorageRepository (reactive MobX mirror)\n * - LocalStorage (thin consumer-facing facade)\n */\nexport const LocalStorageFeature = createFeature({\n name: \"LocalStorage\",\n register(container, config: { prefix?: string } = {}) {\n // Register config (tenant prefix, etc.)\n container.registerInstance(LocalStorageConfig, config);\n\n // Gateway: browser localStorage\n container.registerInstance(LocalStorageGateway, new BrowserLocalStorageGateway());\n\n // Repository & Service\n container.register(LocalStorageRepository).inSingletonScope();\n container.register(LocalStorage).inSingletonScope();\n },\n resolve(container) {\n return {\n localStorageService: container.resolve(Abstraction),\n localStorageConfig: container.resolve(LocalStorageConfig)\n };\n }\n});\n"],"names":["LocalStorageFeature","createFeature","container","config","LocalStorageConfig","LocalStorageGateway","BrowserLocalStorageGateway","LocalStorageRepository","LocalStorage","Abstraction"],"mappings":";;;;;AAgBO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS,EAAEC,SAA8B,CAAC,CAAC;QAEhDD,UAAU,gBAAgB,CAACE,oBAAoBD;QAG/CD,UAAU,gBAAgB,CAACG,qBAAqB,IAAIC;QAGpDJ,UAAU,QAAQ,CAACK,wBAAwB,gBAAgB;QAC3DL,UAAU,QAAQ,CAACM,uCAAc,gBAAgB;IACrD;IACA,SAAQN,SAAS;QACb,OAAO;YACH,qBAAqBA,UAAU,OAAO,CAACO;YACvC,oBAAoBP,UAAU,OAAO,CAACE;QAC1C;IACJ;AACJ"}
@@ -1,3 +1 @@
1
- export { LocalStorage, LocalStorageGateway, LocalStorageRepository, LocalStorageConfig } from "./abstractions.js";
2
-
3
- //# sourceMappingURL=index.js.map
1
+ export { LocalStorage, LocalStorageConfig, LocalStorageGateway, LocalStorageRepository } from "./abstractions.js";
@@ -3,21 +3,25 @@ import { MainGraphQLClient } from "./abstractions.js";
3
3
  import { GraphQLClient } from "../graphqlClient/abstractions.js";
4
4
  import { EnvConfig } from "../envConfig/index.js";
5
5
  class MainGraphQLClientImpl {
6
- constructor(envConfig, client) {
7
- this.client = client;
8
- this.endpoint = envConfig.get("graphqlApiUrl");
9
- }
10
- async execute(params) {
11
- return this.client.execute({
12
- endpoint: this.endpoint,
13
- ...params
14
- });
15
- }
6
+ constructor(envConfig, client){
7
+ this.client = client;
8
+ this.endpoint = envConfig.get("graphqlApiUrl");
9
+ }
10
+ async execute(params) {
11
+ return this.client.execute({
12
+ endpoint: this.endpoint,
13
+ ...params
14
+ });
15
+ }
16
16
  }
17
- export const DefaultMainGraphQLClient = createImplementation({
18
- abstraction: MainGraphQLClient,
19
- implementation: MainGraphQLClientImpl,
20
- dependencies: [EnvConfig, GraphQLClient]
17
+ const DefaultMainGraphQLClient = createImplementation({
18
+ abstraction: MainGraphQLClient,
19
+ implementation: MainGraphQLClientImpl,
20
+ dependencies: [
21
+ EnvConfig,
22
+ GraphQLClient
23
+ ]
21
24
  });
25
+ export { DefaultMainGraphQLClient };
22
26
 
23
27
  //# sourceMappingURL=MainGraphQLClient.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createImplementation","MainGraphQLClient","GraphQLClient","EnvConfig","MainGraphQLClientImpl","constructor","envConfig","client","endpoint","get","execute","params","DefaultMainGraphQLClient","abstraction","implementation","dependencies"],"sources":["MainGraphQLClient.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport { MainGraphQLClient } from \"./abstractions.js\";\nimport { GraphQLClient } from \"~/features/graphqlClient/abstractions.js\";\nimport { EnvConfig } from \"~/features/envConfig/index.js\";\n\nclass MainGraphQLClientImpl implements MainGraphQLClient.Interface {\n private readonly endpoint: string;\n\n constructor(\n envConfig: EnvConfig.Interface,\n private client: GraphQLClient.Interface\n ) {\n this.endpoint = envConfig.get(\"graphqlApiUrl\");\n }\n\n async execute<TResult = any, TVariables = any>(\n params: MainGraphQLClient.Request<TVariables>\n ): Promise<TResult> {\n return this.client.execute({ endpoint: this.endpoint, ...params });\n }\n}\n\nexport const DefaultMainGraphQLClient = createImplementation({\n abstraction: MainGraphQLClient,\n implementation: MainGraphQLClientImpl,\n dependencies: [EnvConfig, GraphQLClient]\n});\n"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,YAAY;AACjD,SAASC,iBAAiB;AAC1B,SAASC,aAAa;AACtB,SAASC,SAAS;AAElB,MAAMC,qBAAqB,CAAwC;EAG/DC,WAAWA,CACPC,SAA8B,EACtBC,MAA+B,EACzC;IAAA,KADUA,MAA+B,GAA/BA,MAA+B;IAEvC,IAAI,CAACC,QAAQ,GAAGF,SAAS,CAACG,GAAG,CAAC,eAAe,CAAC;EAClD;EAEA,MAAMC,OAAOA,CACTC,MAA6C,EAC7B;IAChB,OAAO,IAAI,CAACJ,MAAM,CAACG,OAAO,CAAC;MAAEF,QAAQ,EAAE,IAAI,CAACA,QAAQ;MAAE,GAAGG;IAAO,CAAC,CAAC;EACtE;AACJ;AAEA,OAAO,MAAMC,wBAAwB,GAAGZ,oBAAoB,CAAC;EACzDa,WAAW,EAAEZ,iBAAiB;EAC9Ba,cAAc,EAAEV,qBAAqB;EACrCW,YAAY,EAAE,CAACZ,SAAS,EAAED,aAAa;AAC3C,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/mainGraphQLClient/MainGraphQLClient.js","sources":["../../../src/features/mainGraphQLClient/MainGraphQLClient.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport { MainGraphQLClient } from \"./abstractions.js\";\nimport { GraphQLClient } from \"~/features/graphqlClient/abstractions.js\";\nimport { EnvConfig } from \"~/features/envConfig/index.js\";\n\nclass MainGraphQLClientImpl implements MainGraphQLClient.Interface {\n private readonly endpoint: string;\n\n constructor(\n envConfig: EnvConfig.Interface,\n private client: GraphQLClient.Interface\n ) {\n this.endpoint = envConfig.get(\"graphqlApiUrl\");\n }\n\n async execute<TResult = any, TVariables = any>(\n params: MainGraphQLClient.Request<TVariables>\n ): Promise<TResult> {\n return this.client.execute({ endpoint: this.endpoint, ...params });\n }\n}\n\nexport const DefaultMainGraphQLClient = createImplementation({\n abstraction: MainGraphQLClient,\n implementation: MainGraphQLClientImpl,\n dependencies: [EnvConfig, GraphQLClient]\n});\n"],"names":["MainGraphQLClientImpl","envConfig","client","params","DefaultMainGraphQLClient","createImplementation","MainGraphQLClient","EnvConfig","GraphQLClient"],"mappings":";;;;AAKA,MAAMA;IAGF,YACIC,SAA8B,EACtBC,MAA+B,CACzC;aADUA,MAAM,GAANA;QAER,IAAI,CAAC,QAAQ,GAAGD,UAAU,GAAG,CAAC;IAClC;IAEA,MAAM,QACFE,MAA6C,EAC7B;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,UAAU,IAAI,CAAC,QAAQ;YAAE,GAAGA,MAAM;QAAC;IACpE;AACJ;AAEO,MAAMC,2BAA2BC,qBAAqB;IACzD,aAAaC;IACb,gBAAgBN;IAChB,cAAc;QAACO;QAAWC;KAAc;AAC5C"}
@@ -1,4 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/admin";
2
- export const MainGraphQLClient = createAbstraction("MainGraphQLClient");
2
+ const MainGraphQLClient = createAbstraction("MainGraphQLClient");
3
+ export { MainGraphQLClient };
3
4
 
4
5
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","MainGraphQLClient"],"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 MainGraphQLRequest<TVariables = any> = {\n query: DocumentNode | string;\n variables?: TVariables;\n headers?: IHeaders;\n};\n\nexport interface IMainGraphQLClient {\n execute<TResult = any, TVariables = any>(\n params: MainGraphQLRequest<TVariables>\n ): Promise<TResult>;\n}\n\nexport const MainGraphQLClient = createAbstraction<IMainGraphQLClient>(\"MainGraphQLClient\");\n\nexport namespace MainGraphQLClient {\n export type Headers = IHeaders;\n export type Interface = IMainGraphQLClient;\n export type Request<TVariables = any> = MainGraphQLRequest<TVariables>;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,uBAAuB;AAiBzD,OAAO,MAAMC,iBAAiB,GAAGD,iBAAiB,CAAqB,mBAAmB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/mainGraphQLClient/abstractions.js","sources":["../../../src/features/mainGraphQLClient/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { DocumentNode } from \"graphql\";\n\ntype IHeaders = Record<string, string | number | undefined>;\n\ntype MainGraphQLRequest<TVariables = any> = {\n query: DocumentNode | string;\n variables?: TVariables;\n headers?: IHeaders;\n};\n\nexport interface IMainGraphQLClient {\n execute<TResult = any, TVariables = any>(\n params: MainGraphQLRequest<TVariables>\n ): Promise<TResult>;\n}\n\nexport const MainGraphQLClient = createAbstraction<IMainGraphQLClient>(\"MainGraphQLClient\");\n\nexport namespace MainGraphQLClient {\n export type Headers = IHeaders;\n export type Interface = IMainGraphQLClient;\n export type Request<TVariables = any> = MainGraphQLRequest<TVariables>;\n}\n"],"names":["MainGraphQLClient","createAbstraction"],"mappings":";AAiBO,MAAMA,oBAAoBC,kBAAsC"}
@@ -1,16 +1,17 @@
1
1
  import { MainGraphQLClient } from "./abstractions.js";
2
2
  import { DefaultMainGraphQLClient } from "./MainGraphQLClient.js";
3
3
  import { createFeature } from "../../shared/di/createFeature.js";
4
- export const MainGraphQLClientFeature = createFeature({
5
- name: "MainGraphQLClient",
6
- register(container) {
7
- container.register(DefaultMainGraphQLClient).inSingletonScope();
8
- },
9
- resolve(container) {
10
- return {
11
- client: container.resolve(MainGraphQLClient)
12
- };
13
- }
4
+ const MainGraphQLClientFeature = createFeature({
5
+ name: "MainGraphQLClient",
6
+ register (container) {
7
+ container.register(DefaultMainGraphQLClient).inSingletonScope();
8
+ },
9
+ resolve (container) {
10
+ return {
11
+ client: container.resolve(MainGraphQLClient)
12
+ };
13
+ }
14
14
  });
15
+ export { MainGraphQLClientFeature };
15
16
 
16
17
  //# sourceMappingURL=feature.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["MainGraphQLClient","DefaultMainGraphQLClient","createFeature","MainGraphQLClientFeature","name","register","container","inSingletonScope","resolve","client"],"sources":["feature.ts"],"sourcesContent":["import { MainGraphQLClient } from \"./abstractions.js\";\nimport { DefaultMainGraphQLClient } from \"./MainGraphQLClient.js\";\nimport { createFeature } from \"~/shared/di/createFeature.js\";\n\nexport const MainGraphQLClientFeature = createFeature({\n name: \"MainGraphQLClient\",\n register(container) {\n container.register(DefaultMainGraphQLClient).inSingletonScope();\n },\n resolve(container) {\n return {\n client: container.resolve(MainGraphQLClient)\n };\n }\n});\n"],"mappings":"AAAA,SAASA,iBAAiB;AAC1B,SAASC,wBAAwB;AACjC,SAASC,aAAa;AAEtB,OAAO,MAAMC,wBAAwB,GAAGD,aAAa,CAAC;EAClDE,IAAI,EAAE,mBAAmB;EACzBC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACJ,wBAAwB,CAAC,CAACM,gBAAgB,CAAC,CAAC;EACnE,CAAC;EACDC,OAAOA,CAACF,SAAS,EAAE;IACf,OAAO;MACHG,MAAM,EAAEH,SAAS,CAACE,OAAO,CAACR,iBAAiB;IAC/C,CAAC;EACL;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/mainGraphQLClient/feature.js","sources":["../../../src/features/mainGraphQLClient/feature.ts"],"sourcesContent":["import { MainGraphQLClient } from \"./abstractions.js\";\nimport { DefaultMainGraphQLClient } from \"./MainGraphQLClient.js\";\nimport { createFeature } from \"~/shared/di/createFeature.js\";\n\nexport const MainGraphQLClientFeature = createFeature({\n name: \"MainGraphQLClient\",\n register(container) {\n container.register(DefaultMainGraphQLClient).inSingletonScope();\n },\n resolve(container) {\n return {\n client: container.resolve(MainGraphQLClient)\n };\n }\n});\n"],"names":["MainGraphQLClientFeature","createFeature","container","DefaultMainGraphQLClient","MainGraphQLClient"],"mappings":";;;AAIO,MAAMA,2BAA2BC,cAAc;IAClD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,0BAA0B,gBAAgB;IACjE;IACA,SAAQD,SAAS;QACb,OAAO;YACH,QAAQA,UAAU,OAAO,CAACE;QAC9B;IACJ;AACJ"}
@@ -1,3 +1 @@
1
1
  export { MainGraphQLClient } from "./abstractions.js";
2
-
3
- //# sourceMappingURL=index.js.map
@@ -1,118 +1,88 @@
1
1
  import { RouteUrl } from "./RouteUrl.js";
2
2
  import { Router } from "./Router.js";
3
- export class HistoryRouterGateway {
4
- guards = new Set();
5
- constructor(history, baseUrl) {
6
- this.history = history;
7
- this.router = new Router(baseUrl);
8
- this.stopListening = history.listen(async ({
9
- location
10
- }) => {
11
- const queryParams = Object.fromEntries(new URLSearchParams(location.search).entries());
12
- this.resolvePathname(location.pathname, queryParams);
13
- });
14
- }
15
- addGuard(config) {
16
- const hadGuards = this.guards.size > 0;
17
- this.guards.add(config);
18
- if (!hadGuards) {
19
- this.installBlocker();
3
+ class HistoryRouterGateway {
4
+ constructor(history, baseUrl){
5
+ this.guards = new Set();
6
+ this.history = history;
7
+ this.router = new Router(baseUrl);
8
+ this.stopListening = history.listen(async ({ location })=>{
9
+ const queryParams = Object.fromEntries(new URLSearchParams(location.search).entries());
10
+ this.resolvePathname(location.pathname, queryParams);
11
+ });
12
+ }
13
+ addGuard(config) {
14
+ const hadGuards = this.guards.size > 0;
15
+ this.guards.add(config);
16
+ if (!hadGuards) this.installBlocker();
17
+ return ()=>{
18
+ this.guards.delete(config);
19
+ if (0 === this.guards.size) this.removeBlocker();
20
+ };
21
+ }
22
+ goToRoute(name, params) {
23
+ const route = this.router.findRoute(name);
24
+ if (!route) return void console.warn(`Route "${name}" not found.`);
25
+ const baseUrl = this.router.getBaseUrl();
26
+ this.history.push(RouteUrl.fromPattern(route.path, params, baseUrl));
20
27
  }
21
- return () => {
22
- this.guards.delete(config);
23
- if (this.guards.size === 0) {
28
+ setRoutes(routes) {
29
+ this.router.setRoutes(routes);
30
+ const queryParams = Object.fromEntries(new URLSearchParams(this.history.location.search).entries());
31
+ const currentPathname = this.history.location.pathname;
32
+ this.resolvePathname(currentPathname, queryParams);
33
+ }
34
+ destroy() {
35
+ this.stopListening();
24
36
  this.removeBlocker();
25
- }
26
- };
27
- }
28
- goToRoute(name, params) {
29
- const route = this.router.findRoute(name);
30
- if (!route) {
31
- console.warn(`Route "${name}" not found.`);
32
- return;
37
+ this.guards.clear();
33
38
  }
34
- const baseUrl = this.router.getBaseUrl();
35
- this.history.push(RouteUrl.fromPattern(route.path, params, baseUrl));
36
- }
37
- setRoutes(routes) {
38
- this.router.setRoutes(routes);
39
- const queryParams = Object.fromEntries(new URLSearchParams(this.history.location.search).entries());
40
- const currentPathname = this.history.location.pathname;
41
- this.resolvePathname(currentPathname, queryParams);
42
- }
43
- destroy() {
44
- this.stopListening();
45
- this.removeBlocker();
46
- this.guards.clear();
47
- }
48
- pushState(url) {
49
- this.history.push(url);
50
- }
51
- async resolvePathname(pathname, queryParams) {
52
- const result = this.router.resolve(pathname, queryParams);
53
- if (!result) {
54
- return;
39
+ pushState(url) {
40
+ this.history.push(url);
55
41
  }
56
- const {
57
- matchedRoute,
58
- onMatch
59
- } = result;
60
- onMatch(matchedRoute);
61
- }
62
- findBlockingGuard() {
63
- for (const config of this.guards) {
64
- if (config.guard()) {
65
- return config;
66
- }
42
+ async resolvePathname(pathname, queryParams) {
43
+ const result = this.router.resolve(pathname, queryParams);
44
+ if (!result) return;
45
+ const { matchedRoute, onMatch } = result;
46
+ onMatch(matchedRoute);
67
47
  }
68
- return undefined;
69
- }
70
- installBlocker() {
71
- if (this.unblock) {
72
- this.unblock();
48
+ findBlockingGuard() {
49
+ for (const config of this.guards)if (config.guard()) return config;
73
50
  }
74
- this.unblock = this.history.block(tx => {
75
- const blockingGuard = this.findBlockingGuard();
76
- if (blockingGuard) {
77
- let resolved = false;
78
- blockingGuard.onBlocked({
79
- continue: () => {
80
- if (!resolved) {
81
- resolved = true;
82
- this.removeBlockerAndRetry(tx);
83
- }
84
- },
85
- cancel: () => {
86
- resolved = true;
87
- // Do nothing — history v5 already reverted the URL.
88
- }
51
+ installBlocker() {
52
+ if (this.unblock) this.unblock();
53
+ this.unblock = this.history.block((tx)=>{
54
+ const blockingGuard = this.findBlockingGuard();
55
+ if (blockingGuard) {
56
+ let resolved = false;
57
+ blockingGuard.onBlocked({
58
+ continue: ()=>{
59
+ if (!resolved) {
60
+ resolved = true;
61
+ this.removeBlockerAndRetry(tx);
62
+ }
63
+ },
64
+ cancel: ()=>{
65
+ resolved = true;
66
+ }
67
+ });
68
+ } else this.removeBlockerAndRetry(tx);
89
69
  });
90
- } else {
91
- this.removeBlockerAndRetry(tx);
92
- }
93
- });
94
- }
95
- removeBlocker() {
96
- if (this.unblock) {
97
- this.unblock();
98
- this.unblock = undefined;
99
70
  }
100
- }
101
- removeBlockerAndRetry(tx) {
102
- // We must remove the blocker before retrying because history v5's
103
- // allowTx() always returns false when any blocker is registered.
104
- this.removeBlocker();
105
-
106
- // Listen for the next navigation to complete, then reinstall the
107
- // blocker only if guards are still active.
108
- const unlisten = this.history.listen(() => {
109
- unlisten();
110
- if (this.guards.size > 0) {
111
- this.installBlocker();
112
- }
113
- });
114
- tx.retry();
115
- }
71
+ removeBlocker() {
72
+ if (this.unblock) {
73
+ this.unblock();
74
+ this.unblock = void 0;
75
+ }
76
+ }
77
+ removeBlockerAndRetry(tx) {
78
+ this.removeBlocker();
79
+ const unlisten = this.history.listen(()=>{
80
+ unlisten();
81
+ if (this.guards.size > 0) this.installBlocker();
82
+ });
83
+ tx.retry();
84
+ }
116
85
  }
86
+ export { HistoryRouterGateway };
117
87
 
118
88
  //# sourceMappingURL=HistoryRouterGateway.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["RouteUrl","Router","HistoryRouterGateway","guards","Set","constructor","history","baseUrl","router","stopListening","listen","location","queryParams","Object","fromEntries","URLSearchParams","search","entries","resolvePathname","pathname","addGuard","config","hadGuards","size","add","installBlocker","delete","removeBlocker","goToRoute","name","params","route","findRoute","console","warn","getBaseUrl","push","fromPattern","path","setRoutes","routes","currentPathname","destroy","clear","pushState","url","result","resolve","matchedRoute","onMatch","findBlockingGuard","guard","undefined","unblock","block","tx","blockingGuard","resolved","onBlocked","continue","removeBlockerAndRetry","cancel","unlisten","retry"],"sources":["HistoryRouterGateway.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport type { History } from \"history\";\nimport type { RouteDefinition, RouteTransitionGuardConfig, GuardDisposer } from \"./abstractions.js\";\nimport { RouterGateway } from \"./abstractions.js\";\nimport { RouteUrl } from \"./RouteUrl.js\";\nimport { Router } from \"./Router.js\";\n\nexport class HistoryRouterGateway implements RouterGateway.Interface {\n private readonly history: History;\n private readonly router: Router;\n private stopListening: () => void;\n private unblock: (() => void) | undefined;\n private guards = new Set<RouteTransitionGuardConfig>();\n\n constructor(history: History, baseUrl: string) {\n this.history = history;\n this.router = new Router(baseUrl);\n\n this.stopListening = history.listen(async ({ location }) => {\n const queryParams = Object.fromEntries(new URLSearchParams(location.search).entries());\n this.resolvePathname(location.pathname, queryParams);\n });\n }\n\n addGuard(config: RouteTransitionGuardConfig): GuardDisposer {\n const hadGuards = this.guards.size > 0;\n this.guards.add(config);\n if (!hadGuards) {\n this.installBlocker();\n }\n return () => {\n this.guards.delete(config);\n if (this.guards.size === 0) {\n this.removeBlocker();\n }\n };\n }\n\n goToRoute(name: string, params: z.ZodTypeAny): void {\n const route = this.router.findRoute(name);\n if (!route) {\n console.warn(`Route \"${name}\" not found.`);\n return;\n }\n\n const baseUrl = this.router.getBaseUrl();\n this.history.push(RouteUrl.fromPattern(route.path, params, baseUrl));\n }\n\n setRoutes(routes: RouteDefinition[]) {\n this.router.setRoutes(routes);\n\n const queryParams = Object.fromEntries(\n new URLSearchParams(this.history.location.search).entries()\n );\n const currentPathname = this.history.location.pathname;\n this.resolvePathname(currentPathname, queryParams);\n }\n\n destroy(): void {\n this.stopListening();\n this.removeBlocker();\n this.guards.clear();\n }\n\n pushState(url: string): void {\n this.history.push(url);\n }\n\n private async resolvePathname(pathname: string, queryParams?: Record<string, unknown>) {\n const result = this.router.resolve(pathname, queryParams);\n if (!result) {\n return;\n }\n\n const { matchedRoute, onMatch } = result;\n\n onMatch(matchedRoute);\n }\n\n private findBlockingGuard(): RouteTransitionGuardConfig | undefined {\n for (const config of this.guards) {\n if (config.guard()) {\n return config;\n }\n }\n return undefined;\n }\n\n private installBlocker(): void {\n if (this.unblock) {\n this.unblock();\n }\n\n this.unblock = this.history.block(tx => {\n const blockingGuard = this.findBlockingGuard();\n if (blockingGuard) {\n let resolved = false;\n\n blockingGuard.onBlocked({\n continue: () => {\n if (!resolved) {\n resolved = true;\n this.removeBlockerAndRetry(tx);\n }\n },\n cancel: () => {\n resolved = true;\n // Do nothing — history v5 already reverted the URL.\n }\n });\n } else {\n this.removeBlockerAndRetry(tx);\n }\n });\n }\n\n private removeBlocker(): void {\n if (this.unblock) {\n this.unblock();\n this.unblock = undefined;\n }\n }\n\n private removeBlockerAndRetry(tx: { retry: () => void }): void {\n // We must remove the blocker before retrying because history v5's\n // allowTx() always returns false when any blocker is registered.\n this.removeBlocker();\n\n // Listen for the next navigation to complete, then reinstall the\n // blocker only if guards are still active.\n const unlisten = this.history.listen(() => {\n unlisten();\n if (this.guards.size > 0) {\n this.installBlocker();\n }\n });\n\n tx.retry();\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"features/router/HistoryRouterGateway.js","sources":["../../../src/features/router/HistoryRouterGateway.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport type { History } from \"history\";\nimport type { RouteDefinition, RouteTransitionGuardConfig, GuardDisposer } from \"./abstractions.js\";\nimport { RouterGateway } from \"./abstractions.js\";\nimport { RouteUrl } from \"./RouteUrl.js\";\nimport { Router } from \"./Router.js\";\n\nexport class HistoryRouterGateway implements RouterGateway.Interface {\n private readonly history: History;\n private readonly router: Router;\n private stopListening: () => void;\n private unblock: (() => void) | undefined;\n private guards = new Set<RouteTransitionGuardConfig>();\n\n constructor(history: History, baseUrl: string) {\n this.history = history;\n this.router = new Router(baseUrl);\n\n this.stopListening = history.listen(async ({ location }) => {\n const queryParams = Object.fromEntries(new URLSearchParams(location.search).entries());\n this.resolvePathname(location.pathname, queryParams);\n });\n }\n\n addGuard(config: RouteTransitionGuardConfig): GuardDisposer {\n const hadGuards = this.guards.size > 0;\n this.guards.add(config);\n if (!hadGuards) {\n this.installBlocker();\n }\n return () => {\n this.guards.delete(config);\n if (this.guards.size === 0) {\n this.removeBlocker();\n }\n };\n }\n\n goToRoute(name: string, params: z.ZodTypeAny): void {\n const route = this.router.findRoute(name);\n if (!route) {\n console.warn(`Route \"${name}\" not found.`);\n return;\n }\n\n const baseUrl = this.router.getBaseUrl();\n this.history.push(RouteUrl.fromPattern(route.path, params, baseUrl));\n }\n\n setRoutes(routes: RouteDefinition[]) {\n this.router.setRoutes(routes);\n\n const queryParams = Object.fromEntries(\n new URLSearchParams(this.history.location.search).entries()\n );\n const currentPathname = this.history.location.pathname;\n this.resolvePathname(currentPathname, queryParams);\n }\n\n destroy(): void {\n this.stopListening();\n this.removeBlocker();\n this.guards.clear();\n }\n\n pushState(url: string): void {\n this.history.push(url);\n }\n\n private async resolvePathname(pathname: string, queryParams?: Record<string, unknown>) {\n const result = this.router.resolve(pathname, queryParams);\n if (!result) {\n return;\n }\n\n const { matchedRoute, onMatch } = result;\n\n onMatch(matchedRoute);\n }\n\n private findBlockingGuard(): RouteTransitionGuardConfig | undefined {\n for (const config of this.guards) {\n if (config.guard()) {\n return config;\n }\n }\n return undefined;\n }\n\n private installBlocker(): void {\n if (this.unblock) {\n this.unblock();\n }\n\n this.unblock = this.history.block(tx => {\n const blockingGuard = this.findBlockingGuard();\n if (blockingGuard) {\n let resolved = false;\n\n blockingGuard.onBlocked({\n continue: () => {\n if (!resolved) {\n resolved = true;\n this.removeBlockerAndRetry(tx);\n }\n },\n cancel: () => {\n resolved = true;\n // Do nothing — history v5 already reverted the URL.\n }\n });\n } else {\n this.removeBlockerAndRetry(tx);\n }\n });\n }\n\n private removeBlocker(): void {\n if (this.unblock) {\n this.unblock();\n this.unblock = undefined;\n }\n }\n\n private removeBlockerAndRetry(tx: { retry: () => void }): void {\n // We must remove the blocker before retrying because history v5's\n // allowTx() always returns false when any blocker is registered.\n this.removeBlocker();\n\n // Listen for the next navigation to complete, then reinstall the\n // blocker only if guards are still active.\n const unlisten = this.history.listen(() => {\n unlisten();\n if (this.guards.size > 0) {\n this.installBlocker();\n }\n });\n\n tx.retry();\n }\n}\n"],"names":["HistoryRouterGateway","history","baseUrl","Set","Router","location","queryParams","Object","URLSearchParams","config","hadGuards","name","params","route","console","RouteUrl","routes","currentPathname","url","pathname","result","matchedRoute","onMatch","tx","blockingGuard","resolved","undefined","unlisten"],"mappings":"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"}