@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.
- package/App.js +70 -77
- package/App.js.map +1 -1
- package/AppContainer.js +3 -6
- package/AppContainer.js.map +1 -1
- package/apollo-client/InMemoryCache.js +11 -13
- package/apollo-client/InMemoryCache.js.map +1 -1
- package/apollo-client/IntrospectionFragmentMatcher.js +26 -38
- package/apollo-client/IntrospectionFragmentMatcher.js.map +1 -1
- package/components/Image.js +11 -17
- package/components/Image.js.map +1 -1
- package/components/index.js +0 -2
- package/config/RouterConfig/Route.js +23 -28
- package/config/RouterConfig/Route.js.map +1 -1
- package/config/RouterConfig.js +11 -10
- package/config/RouterConfig.js.map +1 -1
- package/config.js +19 -20
- package/config.js.map +1 -1
- package/contexts/Ui/index.js +26 -28
- package/contexts/Ui/index.js.map +1 -1
- package/core/Plugin.js +7 -9
- package/core/Plugin.js.map +1 -1
- package/core/Plugins.js +15 -34
- package/core/Plugins.js.map +1 -1
- package/core/Provider.js +5 -13
- package/core/Provider.js.map +1 -1
- package/core/createProvider.js +3 -6
- package/core/createProvider.js.map +1 -1
- package/core/createProviderPlugin.js +8 -13
- package/core/createProviderPlugin.js.map +1 -1
- package/errors/AuthenticationErrorEvent.js +8 -5
- package/errors/AuthenticationErrorEvent.js.map +1 -1
- package/errors/NetworkErrorEvent.js +8 -5
- package/errors/NetworkErrorEvent.js.map +1 -1
- package/errors/abstractions.js +3 -2
- package/errors/abstractions.js.map +1 -1
- package/errors/index.js +1 -4
- package/exports/admin/env-config.js +0 -2
- package/exports/admin/graphql-client.js +0 -2
- package/exports/admin/local-storage.js +0 -2
- package/exports/admin/router.js +0 -2
- package/exports/admin/security.js +0 -2
- package/exports/admin.js +0 -2
- package/features/envConfig/EnvConfig.js +12 -13
- package/features/envConfig/EnvConfig.js.map +1 -1
- package/features/envConfig/abstractions.js +2 -1
- package/features/envConfig/abstractions.js.map +1 -1
- package/features/envConfig/feature.js +9 -8
- package/features/envConfig/feature.js.map +1 -1
- package/features/envConfig/index.js +0 -2
- package/features/eventPublisher/EventPublisher.js +13 -21
- package/features/eventPublisher/EventPublisher.js.map +1 -1
- package/features/eventPublisher/abstractions.js +7 -9
- package/features/eventPublisher/abstractions.js.map +1 -1
- package/features/eventPublisher/feature.js +13 -12
- package/features/eventPublisher/feature.js.map +1 -1
- package/features/eventPublisher/index.js +1 -3
- package/features/graphqlClient/AuthenticationErrorPublishing.js +26 -26
- package/features/graphqlClient/AuthenticationErrorPublishing.js.map +1 -1
- package/features/graphqlClient/BatchingGraphQLClient.js +104 -149
- package/features/graphqlClient/BatchingGraphQLClient.js.map +1 -1
- package/features/graphqlClient/FetchGraphQLClient.js +41 -48
- package/features/graphqlClient/FetchGraphQLClient.js.map +1 -1
- package/features/graphqlClient/NetworkErrorPublishing.js +35 -42
- package/features/graphqlClient/NetworkErrorPublishing.js.map +1 -1
- package/features/graphqlClient/RequestValue.js +42 -41
- package/features/graphqlClient/RequestValue.js.map +1 -1
- package/features/graphqlClient/RetryGraphQLClient.js +36 -45
- package/features/graphqlClient/RetryGraphQLClient.js.map +1 -1
- package/features/graphqlClient/__tests__/GraphQLClient.test.js +383 -356
- package/features/graphqlClient/__tests__/GraphQLClient.test.js.map +1 -1
- package/features/graphqlClient/abstractions.js +2 -1
- package/features/graphqlClient/abstractions.js.map +1 -1
- package/features/graphqlClient/feature.js +14 -20
- package/features/graphqlClient/feature.js.map +1 -1
- package/features/graphqlClient/index.js +0 -2
- package/features/graphqlClient/types.js +0 -3
- package/features/localStorage/BrowserLocalStorageGateway.js +56 -63
- package/features/localStorage/BrowserLocalStorageGateway.js.map +1 -1
- package/features/localStorage/LocalStorage.js +27 -24
- package/features/localStorage/LocalStorage.js.map +1 -1
- package/features/localStorage/LocalStorageRepository.js +75 -88
- package/features/localStorage/LocalStorageRepository.js.map +1 -1
- package/features/localStorage/abstractions.js +5 -16
- package/features/localStorage/abstractions.js.map +1 -1
- package/features/localStorage/feature.js +17 -28
- package/features/localStorage/feature.js.map +1 -1
- package/features/localStorage/index.js +1 -3
- package/features/mainGraphQLClient/MainGraphQLClient.js +18 -14
- package/features/mainGraphQLClient/MainGraphQLClient.js.map +1 -1
- package/features/mainGraphQLClient/abstractions.js +2 -1
- package/features/mainGraphQLClient/abstractions.js.map +1 -1
- package/features/mainGraphQLClient/feature.js +11 -10
- package/features/mainGraphQLClient/feature.js.map +1 -1
- package/features/mainGraphQLClient/index.js +0 -2
- package/features/router/HistoryRouterGateway.js +75 -105
- package/features/router/HistoryRouterGateway.js.map +1 -1
- package/features/router/HistoryRouterGateway.test.js +184 -193
- package/features/router/HistoryRouterGateway.test.js.map +1 -1
- package/features/router/Route.js +38 -54
- package/features/router/Route.js.map +1 -1
- package/features/router/RouteUrl.js +84 -217
- package/features/router/RouteUrl.js.map +1 -1
- package/features/router/Router.js +67 -124
- package/features/router/Router.js.map +1 -1
- package/features/router/RouterPresenter.js +44 -49
- package/features/router/RouterPresenter.js.map +1 -1
- package/features/router/RouterRepository.js +103 -111
- package/features/router/RouterRepository.js.map +1 -1
- package/features/router/RouterRepository.test.js +119 -150
- package/features/router/RouterRepository.test.js.map +1 -1
- package/features/router/abstractions.js +4 -14
- package/features/router/abstractions.js.map +1 -1
- package/features/router/feature.js +13 -12
- package/features/router/feature.js.map +1 -1
- package/features/router/index.js +1 -3
- package/helpers/InterfaceGenerator/date.js +0 -3
- package/helpers/InterfaceGenerator/id.js +0 -3
- package/helpers/InterfaceGenerator/identity.js +0 -3
- package/helpers/InterfaceGenerator/index.js +0 -3
- package/helpers/InterfaceGenerator/numeric.js +0 -3
- package/helpers/InterfaceGenerator/truthful.js +0 -3
- package/hooks/useAutocomplete/index.js +0 -2
- package/hooks/useAutocomplete/useAutocomplete.js +12 -15
- package/hooks/useAutocomplete/useAutocomplete.js.map +1 -1
- package/hooks/useDataList/functions/getData.js +2 -1
- package/hooks/useDataList/functions/getData.js.map +1 -1
- package/hooks/useDataList/functions/getError.js +2 -1
- package/hooks/useDataList/functions/getError.js.map +1 -1
- package/hooks/useDataList/functions/getMeta.js +2 -1
- package/hooks/useDataList/functions/getMeta.js.map +1 -1
- package/hooks/useDataList/functions/index.js +0 -2
- package/hooks/useDataList/functions/searchDataByKey.js +9 -14
- package/hooks/useDataList/functions/searchDataByKey.js.map +1 -1
- package/hooks/useDataList/index.js +0 -2
- package/hooks/useDataList/useDataList.js +131 -152
- package/hooks/useDataList/useDataList.js.map +1 -1
- package/hooks/useDataList/utils/index.js +0 -2
- package/hooks/useDataList/utils/prepareLoadListParams.js +25 -34
- package/hooks/useDataList/utils/prepareLoadListParams.js.map +1 -1
- package/hooks/useHandler.js +12 -16
- package/hooks/useHandler.js.map +1 -1
- package/hooks/useHandlers.js +18 -20
- package/hooks/useHandlers.js.map +1 -1
- package/hooks/useRegisterLegacyPlugin.js +7 -6
- package/hooks/useRegisterLegacyPlugin.js.map +1 -1
- package/hooks/useUi.js +2 -3
- package/hooks/useUi.js.map +1 -1
- package/i18n/i18n.js +8 -4
- package/i18n/i18n.js.map +1 -1
- package/i18n/index.js +0 -2
- package/index.js +6 -11
- package/package.json +14 -16
- package/plugins/AddQuerySelectionPlugin.js +36 -61
- package/plugins/AddQuerySelectionPlugin.js.map +1 -1
- package/plugins/ApolloCacheObjectIdPlugin.js +12 -11
- package/plugins/ApolloCacheObjectIdPlugin.js.map +1 -1
- package/plugins/ApolloDynamicLink.js +20 -22
- package/plugins/ApolloDynamicLink.js.map +1 -1
- package/plugins/ApolloLinkPlugin.js +16 -15
- package/plugins/ApolloLinkPlugin.js.map +1 -1
- package/plugins/ConsoleLinkPlugin.js +19 -21
- package/plugins/ConsoleLinkPlugin.js.map +1 -1
- package/plugins/NetworkErrorLinkPlugin/ErrorOverlay.js +39 -45
- package/plugins/NetworkErrorLinkPlugin/ErrorOverlay.js.map +1 -1
- package/plugins/NetworkErrorLinkPlugin/GqlErrorOverlay.js +18 -22
- package/plugins/NetworkErrorLinkPlugin/GqlErrorOverlay.js.map +1 -1
- package/plugins/NetworkErrorLinkPlugin/LocalAwsLambdaTimeoutMessage.js +21 -29
- package/plugins/NetworkErrorLinkPlugin/LocalAwsLambdaTimeoutMessage.js.map +1 -1
- package/plugins/NetworkErrorLinkPlugin/StyledComponents.js +6 -15
- package/plugins/NetworkErrorLinkPlugin/StyledComponents.js.map +1 -1
- package/plugins/NetworkErrorLinkPlugin/Typography.js +9 -14
- package/plugins/NetworkErrorLinkPlugin/Typography.js.map +1 -1
- package/plugins/NetworkErrorLinkPlugin/assets/close_24px.js +19 -0
- package/plugins/NetworkErrorLinkPlugin/assets/close_24px.js.map +1 -0
- package/plugins/NetworkErrorLinkPlugin/createErrorOverlay.js +11 -18
- package/plugins/NetworkErrorLinkPlugin/createErrorOverlay.js.map +1 -1
- package/plugins/NetworkErrorLinkPlugin.js +41 -58
- package/plugins/NetworkErrorLinkPlugin.js.map +1 -1
- package/plugins/OmitTypenameLinkPlugin.js +9 -14
- package/plugins/OmitTypenameLinkPlugin.js.map +1 -1
- package/plugins/TenantHeaderLinkPlugin.js +23 -32
- package/plugins/TenantHeaderLinkPlugin.js.map +1 -1
- package/plugins/components/Image.js +8 -15
- package/plugins/components/Image.js.map +1 -1
- package/plugins/image.js +94 -133
- package/plugins/image.js.map +1 -1
- package/plugins/index.js +35 -59
- package/plugins/index.js.map +1 -1
- package/presentation/envConfig/useEnvConfig.js +4 -8
- package/presentation/envConfig/useEnvConfig.js.map +1 -1
- package/presentation/localStorage/index.js +0 -2
- package/presentation/localStorage/useLocalStorage.js +10 -16
- package/presentation/localStorage/useLocalStorage.js.map +1 -1
- package/presentation/localStorage/useLocalStorageValue.js +15 -13
- package/presentation/localStorage/useLocalStorageValue.js.map +1 -1
- package/presentation/localStorage/useLocalStorageValues.js +23 -30
- package/presentation/localStorage/useLocalStorageValues.js.map +1 -1
- package/presentation/router/RouteElementRegistry.js +22 -25
- package/presentation/router/RouteElementRegistry.js.map +1 -1
- package/presentation/router/abstractions.js +2 -1
- package/presentation/router/abstractions.js.map +1 -1
- package/presentation/router/components/Redirect.js +8 -10
- package/presentation/router/components/Redirect.js.map +1 -1
- package/presentation/router/components/RouteContent.js +14 -17
- package/presentation/router/components/RouteContent.js.map +1 -1
- package/presentation/router/components/RouteLink.js +11 -16
- package/presentation/router/components/RouteLink.js.map +1 -1
- package/presentation/router/components/SimpleLink.js +18 -24
- package/presentation/router/components/SimpleLink.js.map +1 -1
- package/presentation/router/hooks/useRoute.js +15 -23
- package/presentation/router/hooks/useRoute.js.map +1 -1
- package/presentation/router/hooks/useRouter.js +22 -23
- package/presentation/router/hooks/useRouter.js.map +1 -1
- package/presentation/router/index.js +0 -2
- package/presentation/router/types.js +0 -3
- package/renderApp.js +7 -6
- package/renderApp.js.map +1 -1
- package/router.js +0 -3
- package/rslib-runtime.js +14 -0
- package/rslib-runtime.js.map +1 -0
- package/shared/di/DiContainerProvider.js +8 -12
- package/shared/di/DiContainerProvider.js.map +1 -1
- package/shared/di/createFeature.js +7 -8
- package/shared/di/createFeature.js.map +1 -1
- package/shared/di/useFeature.js +7 -3
- package/shared/di/useFeature.js.map +1 -1
- package/static/svg/close_24px.33adaadc.svg +1 -0
- package/types.js +0 -3
- package/utils/createGenericContext.js +17 -21
- package/utils/createGenericContext.js.map +1 -1
- package/utils/createHashing.js +13 -16
- package/utils/createHashing.js.map +1 -1
- package/utils/index.js +0 -2
- package/utils/legacyPluginToReactComponent.js +11 -10
- package/utils/legacyPluginToReactComponent.js.map +1 -1
- package/components/index.js.map +0 -1
- package/errors/index.js.map +0 -1
- package/exports/admin/env-config.js.map +0 -1
- package/exports/admin/graphql-client.js.map +0 -1
- package/exports/admin/local-storage.js.map +0 -1
- package/exports/admin/router.js.map +0 -1
- package/exports/admin/security.js.map +0 -1
- package/exports/admin.js.map +0 -1
- package/features/envConfig/index.js.map +0 -1
- package/features/eventPublisher/index.js.map +0 -1
- package/features/graphqlClient/index.js.map +0 -1
- package/features/graphqlClient/types.js.map +0 -1
- package/features/localStorage/index.js.map +0 -1
- package/features/mainGraphQLClient/index.js.map +0 -1
- package/features/router/index.js.map +0 -1
- package/helpers/InterfaceGenerator/date.js.map +0 -1
- package/helpers/InterfaceGenerator/id.js.map +0 -1
- package/helpers/InterfaceGenerator/identity.js.map +0 -1
- package/helpers/InterfaceGenerator/index.js.map +0 -1
- package/helpers/InterfaceGenerator/numeric.js.map +0 -1
- package/helpers/InterfaceGenerator/truthful.js.map +0 -1
- package/hooks/useAutocomplete/index.js.map +0 -1
- package/hooks/useDataList/functions/index.js.map +0 -1
- package/hooks/useDataList/index.js.map +0 -1
- package/hooks/useDataList/utils/index.js.map +0 -1
- package/i18n/index.js.map +0 -1
- package/index.js.map +0 -1
- package/presentation/localStorage/index.js.map +0 -1
- package/presentation/router/index.js.map +0 -1
- package/presentation/router/types.js.map +0 -1
- package/react-butterfiles/Files.d.ts +0 -69
- package/react-butterfiles/Files.js +0 -227
- package/react-butterfiles/Files.js.map +0 -1
- package/react-butterfiles/file.todo +0 -1
- package/react-butterfiles/index.d.ts +0 -2
- package/react-butterfiles/index.js +0 -4
- package/react-butterfiles/index.js.map +0 -1
- package/react-butterfiles/utils/generateId.d.ts +0 -1
- package/react-butterfiles/utils/generateId.js +0 -5
- package/react-butterfiles/utils/generateId.js.map +0 -1
- package/react-butterfiles/utils/readFileContent.d.ts +0 -1
- package/react-butterfiles/utils/readFileContent.js +0 -15
- package/react-butterfiles/utils/readFileContent.js.map +0 -1
- package/router.js.map +0 -1
- package/types.js.map +0 -1
- 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 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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,"
|
|
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,68 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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,"
|
|
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
|
|
2
|
+
import { LocalStorage, LocalStorageRepository } from "./abstractions.js";
|
|
3
3
|
import { createImplementation } from "@webiny/di";
|
|
4
4
|
class LocalStorageImpl {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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,"
|
|
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 {
|
|
2
|
+
import { LocalStorageConfig, LocalStorageGateway, LocalStorageRepository } from "./abstractions.js";
|
|
3
3
|
import { createImplementation } from "@webiny/di";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|