@webiny/app 6.3.0 → 6.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/App.js +70 -77
  2. package/App.js.map +1 -1
  3. package/AppContainer.js +3 -6
  4. package/AppContainer.js.map +1 -1
  5. package/apollo-client/InMemoryCache.js +11 -13
  6. package/apollo-client/InMemoryCache.js.map +1 -1
  7. package/apollo-client/IntrospectionFragmentMatcher.js +26 -38
  8. package/apollo-client/IntrospectionFragmentMatcher.js.map +1 -1
  9. package/components/Image.js +11 -17
  10. package/components/Image.js.map +1 -1
  11. package/components/index.js +0 -2
  12. package/config/RouterConfig/Route.js +23 -28
  13. package/config/RouterConfig/Route.js.map +1 -1
  14. package/config/RouterConfig.js +11 -10
  15. package/config/RouterConfig.js.map +1 -1
  16. package/config.js +19 -20
  17. package/config.js.map +1 -1
  18. package/contexts/Ui/index.js +26 -28
  19. package/contexts/Ui/index.js.map +1 -1
  20. package/core/Plugin.js +7 -9
  21. package/core/Plugin.js.map +1 -1
  22. package/core/Plugins.js +15 -34
  23. package/core/Plugins.js.map +1 -1
  24. package/core/Provider.js +5 -13
  25. package/core/Provider.js.map +1 -1
  26. package/core/createProvider.js +3 -6
  27. package/core/createProvider.js.map +1 -1
  28. package/core/createProviderPlugin.js +8 -13
  29. package/core/createProviderPlugin.js.map +1 -1
  30. package/errors/AuthenticationErrorEvent.js +8 -5
  31. package/errors/AuthenticationErrorEvent.js.map +1 -1
  32. package/errors/NetworkErrorEvent.js +8 -5
  33. package/errors/NetworkErrorEvent.js.map +1 -1
  34. package/errors/abstractions.js +3 -2
  35. package/errors/abstractions.js.map +1 -1
  36. package/errors/index.js +1 -4
  37. package/exports/admin/env-config.js +0 -2
  38. package/exports/admin/graphql-client.js +0 -2
  39. package/exports/admin/local-storage.js +0 -2
  40. package/exports/admin/router.js +0 -2
  41. package/exports/admin/security.js +0 -2
  42. package/exports/admin.js +0 -2
  43. package/features/envConfig/EnvConfig.js +12 -13
  44. package/features/envConfig/EnvConfig.js.map +1 -1
  45. package/features/envConfig/abstractions.js +2 -1
  46. package/features/envConfig/abstractions.js.map +1 -1
  47. package/features/envConfig/feature.js +9 -8
  48. package/features/envConfig/feature.js.map +1 -1
  49. package/features/envConfig/index.js +0 -2
  50. package/features/eventPublisher/EventPublisher.js +13 -21
  51. package/features/eventPublisher/EventPublisher.js.map +1 -1
  52. package/features/eventPublisher/abstractions.js +7 -9
  53. package/features/eventPublisher/abstractions.js.map +1 -1
  54. package/features/eventPublisher/feature.js +13 -12
  55. package/features/eventPublisher/feature.js.map +1 -1
  56. package/features/eventPublisher/index.js +1 -3
  57. package/features/graphqlClient/AuthenticationErrorPublishing.js +26 -26
  58. package/features/graphqlClient/AuthenticationErrorPublishing.js.map +1 -1
  59. package/features/graphqlClient/BatchingGraphQLClient.js +104 -149
  60. package/features/graphqlClient/BatchingGraphQLClient.js.map +1 -1
  61. package/features/graphqlClient/FetchGraphQLClient.js +41 -48
  62. package/features/graphqlClient/FetchGraphQLClient.js.map +1 -1
  63. package/features/graphqlClient/NetworkErrorPublishing.js +35 -42
  64. package/features/graphqlClient/NetworkErrorPublishing.js.map +1 -1
  65. package/features/graphqlClient/RequestValue.js +42 -41
  66. package/features/graphqlClient/RequestValue.js.map +1 -1
  67. package/features/graphqlClient/RetryGraphQLClient.js +36 -45
  68. package/features/graphqlClient/RetryGraphQLClient.js.map +1 -1
  69. package/features/graphqlClient/__tests__/GraphQLClient.test.js +383 -356
  70. package/features/graphqlClient/__tests__/GraphQLClient.test.js.map +1 -1
  71. package/features/graphqlClient/abstractions.js +2 -1
  72. package/features/graphqlClient/abstractions.js.map +1 -1
  73. package/features/graphqlClient/feature.js +14 -20
  74. package/features/graphqlClient/feature.js.map +1 -1
  75. package/features/graphqlClient/index.js +0 -2
  76. package/features/graphqlClient/types.js +0 -3
  77. package/features/localStorage/BrowserLocalStorageGateway.js +56 -63
  78. package/features/localStorage/BrowserLocalStorageGateway.js.map +1 -1
  79. package/features/localStorage/LocalStorage.js +27 -24
  80. package/features/localStorage/LocalStorage.js.map +1 -1
  81. package/features/localStorage/LocalStorageRepository.js +75 -88
  82. package/features/localStorage/LocalStorageRepository.js.map +1 -1
  83. package/features/localStorage/abstractions.js +5 -16
  84. package/features/localStorage/abstractions.js.map +1 -1
  85. package/features/localStorage/feature.js +17 -28
  86. package/features/localStorage/feature.js.map +1 -1
  87. package/features/localStorage/index.js +1 -3
  88. package/features/mainGraphQLClient/MainGraphQLClient.js +18 -14
  89. package/features/mainGraphQLClient/MainGraphQLClient.js.map +1 -1
  90. package/features/mainGraphQLClient/abstractions.js +2 -1
  91. package/features/mainGraphQLClient/abstractions.js.map +1 -1
  92. package/features/mainGraphQLClient/feature.js +11 -10
  93. package/features/mainGraphQLClient/feature.js.map +1 -1
  94. package/features/mainGraphQLClient/index.js +0 -2
  95. package/features/router/HistoryRouterGateway.js +75 -105
  96. package/features/router/HistoryRouterGateway.js.map +1 -1
  97. package/features/router/HistoryRouterGateway.test.js +184 -193
  98. package/features/router/HistoryRouterGateway.test.js.map +1 -1
  99. package/features/router/Route.js +38 -54
  100. package/features/router/Route.js.map +1 -1
  101. package/features/router/RouteUrl.js +84 -217
  102. package/features/router/RouteUrl.js.map +1 -1
  103. package/features/router/Router.js +67 -124
  104. package/features/router/Router.js.map +1 -1
  105. package/features/router/RouterPresenter.js +44 -49
  106. package/features/router/RouterPresenter.js.map +1 -1
  107. package/features/router/RouterRepository.js +103 -111
  108. package/features/router/RouterRepository.js.map +1 -1
  109. package/features/router/RouterRepository.test.js +119 -150
  110. package/features/router/RouterRepository.test.js.map +1 -1
  111. package/features/router/abstractions.js +4 -14
  112. package/features/router/abstractions.js.map +1 -1
  113. package/features/router/feature.js +13 -12
  114. package/features/router/feature.js.map +1 -1
  115. package/features/router/index.js +1 -3
  116. package/helpers/InterfaceGenerator/date.js +0 -3
  117. package/helpers/InterfaceGenerator/id.js +0 -3
  118. package/helpers/InterfaceGenerator/identity.js +0 -3
  119. package/helpers/InterfaceGenerator/index.js +0 -3
  120. package/helpers/InterfaceGenerator/numeric.js +0 -3
  121. package/helpers/InterfaceGenerator/truthful.js +0 -3
  122. package/hooks/useAutocomplete/index.js +0 -2
  123. package/hooks/useAutocomplete/useAutocomplete.js +12 -15
  124. package/hooks/useAutocomplete/useAutocomplete.js.map +1 -1
  125. package/hooks/useDataList/functions/getData.js +2 -1
  126. package/hooks/useDataList/functions/getData.js.map +1 -1
  127. package/hooks/useDataList/functions/getError.js +2 -1
  128. package/hooks/useDataList/functions/getError.js.map +1 -1
  129. package/hooks/useDataList/functions/getMeta.js +2 -1
  130. package/hooks/useDataList/functions/getMeta.js.map +1 -1
  131. package/hooks/useDataList/functions/index.js +0 -2
  132. package/hooks/useDataList/functions/searchDataByKey.js +9 -14
  133. package/hooks/useDataList/functions/searchDataByKey.js.map +1 -1
  134. package/hooks/useDataList/index.js +0 -2
  135. package/hooks/useDataList/useDataList.js +131 -152
  136. package/hooks/useDataList/useDataList.js.map +1 -1
  137. package/hooks/useDataList/utils/index.js +0 -2
  138. package/hooks/useDataList/utils/prepareLoadListParams.js +25 -34
  139. package/hooks/useDataList/utils/prepareLoadListParams.js.map +1 -1
  140. package/hooks/useHandler.js +12 -16
  141. package/hooks/useHandler.js.map +1 -1
  142. package/hooks/useHandlers.js +18 -20
  143. package/hooks/useHandlers.js.map +1 -1
  144. package/hooks/useRegisterLegacyPlugin.js +7 -6
  145. package/hooks/useRegisterLegacyPlugin.js.map +1 -1
  146. package/hooks/useUi.js +2 -3
  147. package/hooks/useUi.js.map +1 -1
  148. package/i18n/i18n.js +8 -4
  149. package/i18n/i18n.js.map +1 -1
  150. package/i18n/index.js +0 -2
  151. package/index.js +6 -11
  152. package/package.json +13 -13
  153. package/plugins/AddQuerySelectionPlugin.js +36 -61
  154. package/plugins/AddQuerySelectionPlugin.js.map +1 -1
  155. package/plugins/ApolloCacheObjectIdPlugin.js +12 -11
  156. package/plugins/ApolloCacheObjectIdPlugin.js.map +1 -1
  157. package/plugins/ApolloDynamicLink.js +20 -22
  158. package/plugins/ApolloDynamicLink.js.map +1 -1
  159. package/plugins/ApolloLinkPlugin.js +16 -15
  160. package/plugins/ApolloLinkPlugin.js.map +1 -1
  161. package/plugins/ConsoleLinkPlugin.js +19 -21
  162. package/plugins/ConsoleLinkPlugin.js.map +1 -1
  163. package/plugins/NetworkErrorLinkPlugin/ErrorOverlay.js +39 -45
  164. package/plugins/NetworkErrorLinkPlugin/ErrorOverlay.js.map +1 -1
  165. package/plugins/NetworkErrorLinkPlugin/GqlErrorOverlay.js +18 -22
  166. package/plugins/NetworkErrorLinkPlugin/GqlErrorOverlay.js.map +1 -1
  167. package/plugins/NetworkErrorLinkPlugin/LocalAwsLambdaTimeoutMessage.js +21 -29
  168. package/plugins/NetworkErrorLinkPlugin/LocalAwsLambdaTimeoutMessage.js.map +1 -1
  169. package/plugins/NetworkErrorLinkPlugin/StyledComponents.js +6 -15
  170. package/plugins/NetworkErrorLinkPlugin/StyledComponents.js.map +1 -1
  171. package/plugins/NetworkErrorLinkPlugin/Typography.js +9 -14
  172. package/plugins/NetworkErrorLinkPlugin/Typography.js.map +1 -1
  173. package/plugins/NetworkErrorLinkPlugin/assets/close_24px.js +19 -0
  174. package/plugins/NetworkErrorLinkPlugin/assets/close_24px.js.map +1 -0
  175. package/plugins/NetworkErrorLinkPlugin/createErrorOverlay.js +11 -18
  176. package/plugins/NetworkErrorLinkPlugin/createErrorOverlay.js.map +1 -1
  177. package/plugins/NetworkErrorLinkPlugin.js +41 -58
  178. package/plugins/NetworkErrorLinkPlugin.js.map +1 -1
  179. package/plugins/OmitTypenameLinkPlugin.js +9 -14
  180. package/plugins/OmitTypenameLinkPlugin.js.map +1 -1
  181. package/plugins/TenantHeaderLinkPlugin.js +23 -32
  182. package/plugins/TenantHeaderLinkPlugin.js.map +1 -1
  183. package/plugins/components/Image.js +8 -15
  184. package/plugins/components/Image.js.map +1 -1
  185. package/plugins/image.js +94 -133
  186. package/plugins/image.js.map +1 -1
  187. package/plugins/index.js +35 -59
  188. package/plugins/index.js.map +1 -1
  189. package/presentation/envConfig/useEnvConfig.js +4 -8
  190. package/presentation/envConfig/useEnvConfig.js.map +1 -1
  191. package/presentation/localStorage/index.js +0 -2
  192. package/presentation/localStorage/useLocalStorage.js +10 -16
  193. package/presentation/localStorage/useLocalStorage.js.map +1 -1
  194. package/presentation/localStorage/useLocalStorageValue.js +15 -13
  195. package/presentation/localStorage/useLocalStorageValue.js.map +1 -1
  196. package/presentation/localStorage/useLocalStorageValues.js +23 -30
  197. package/presentation/localStorage/useLocalStorageValues.js.map +1 -1
  198. package/presentation/router/RouteElementRegistry.js +22 -25
  199. package/presentation/router/RouteElementRegistry.js.map +1 -1
  200. package/presentation/router/abstractions.js +2 -1
  201. package/presentation/router/abstractions.js.map +1 -1
  202. package/presentation/router/components/Redirect.js +8 -10
  203. package/presentation/router/components/Redirect.js.map +1 -1
  204. package/presentation/router/components/RouteContent.js +14 -17
  205. package/presentation/router/components/RouteContent.js.map +1 -1
  206. package/presentation/router/components/RouteLink.js +11 -16
  207. package/presentation/router/components/RouteLink.js.map +1 -1
  208. package/presentation/router/components/SimpleLink.js +18 -24
  209. package/presentation/router/components/SimpleLink.js.map +1 -1
  210. package/presentation/router/hooks/useRoute.js +15 -23
  211. package/presentation/router/hooks/useRoute.js.map +1 -1
  212. package/presentation/router/hooks/useRouter.js +22 -23
  213. package/presentation/router/hooks/useRouter.js.map +1 -1
  214. package/presentation/router/index.js +0 -2
  215. package/presentation/router/types.js +0 -3
  216. package/react-butterfiles/Files.js +148 -217
  217. package/react-butterfiles/Files.js.map +1 -1
  218. package/react-butterfiles/index.js +2 -1
  219. package/react-butterfiles/index.js.map +1 -1
  220. package/react-butterfiles/utils/generateId.js +2 -3
  221. package/react-butterfiles/utils/generateId.js.map +1 -1
  222. package/react-butterfiles/utils/readFileContent.js +9 -13
  223. package/react-butterfiles/utils/readFileContent.js.map +1 -1
  224. package/renderApp.js +7 -6
  225. package/renderApp.js.map +1 -1
  226. package/router.js +0 -3
  227. package/rslib-runtime.js +14 -0
  228. package/rslib-runtime.js.map +1 -0
  229. package/shared/di/DiContainerProvider.js +8 -12
  230. package/shared/di/DiContainerProvider.js.map +1 -1
  231. package/shared/di/createFeature.js +7 -8
  232. package/shared/di/createFeature.js.map +1 -1
  233. package/shared/di/useFeature.js +7 -3
  234. package/shared/di/useFeature.js.map +1 -1
  235. package/static/svg/close_24px.33adaadc.svg +1 -0
  236. package/types.js +0 -3
  237. package/utils/createGenericContext.js +17 -21
  238. package/utils/createGenericContext.js.map +1 -1
  239. package/utils/createHashing.js +13 -16
  240. package/utils/createHashing.js.map +1 -1
  241. package/utils/index.js +0 -2
  242. package/utils/legacyPluginToReactComponent.js +11 -10
  243. package/utils/legacyPluginToReactComponent.js.map +1 -1
  244. package/components/index.js.map +0 -1
  245. package/errors/index.js.map +0 -1
  246. package/exports/admin/env-config.js.map +0 -1
  247. package/exports/admin/graphql-client.js.map +0 -1
  248. package/exports/admin/local-storage.js.map +0 -1
  249. package/exports/admin/router.js.map +0 -1
  250. package/exports/admin/security.js.map +0 -1
  251. package/exports/admin.js.map +0 -1
  252. package/features/envConfig/index.js.map +0 -1
  253. package/features/eventPublisher/index.js.map +0 -1
  254. package/features/graphqlClient/index.js.map +0 -1
  255. package/features/graphqlClient/types.js.map +0 -1
  256. package/features/localStorage/index.js.map +0 -1
  257. package/features/mainGraphQLClient/index.js.map +0 -1
  258. package/features/router/index.js.map +0 -1
  259. package/helpers/InterfaceGenerator/date.js.map +0 -1
  260. package/helpers/InterfaceGenerator/id.js.map +0 -1
  261. package/helpers/InterfaceGenerator/identity.js.map +0 -1
  262. package/helpers/InterfaceGenerator/index.js.map +0 -1
  263. package/helpers/InterfaceGenerator/numeric.js.map +0 -1
  264. package/helpers/InterfaceGenerator/truthful.js.map +0 -1
  265. package/hooks/useAutocomplete/index.js.map +0 -1
  266. package/hooks/useDataList/functions/index.js.map +0 -1
  267. package/hooks/useDataList/index.js.map +0 -1
  268. package/hooks/useDataList/utils/index.js.map +0 -1
  269. package/i18n/index.js.map +0 -1
  270. package/index.js.map +0 -1
  271. package/presentation/localStorage/index.js.map +0 -1
  272. package/presentation/router/index.js.map +0 -1
  273. package/presentation/router/types.js.map +0 -1
  274. package/router.js.map +0 -1
  275. package/types.js.map +0 -1
  276. package/utils/index.js.map +0 -1
@@ -1,204 +1,195 @@
1
- import { describe, it, beforeEach, expect, vi } from "vitest";
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
2
  import { createMemoryHistory } from "history";
3
3
  import { HistoryRouterGateway } from "./HistoryRouterGateway.js";
4
4
  import { RouteUrl } from "./RouteUrl.js";
5
- const wait = () => new Promise(resolve => setTimeout(resolve, 10));
6
- describe("Router Gateway", () => {
7
- beforeEach(() => {
8
- vi.clearAllMocks();
9
- });
10
- it("should execute onMatch when history changes", async () => {
11
- const spyHome = vi.fn();
12
- const spyLogin = vi.fn();
13
- const spyDynamic = vi.fn();
14
-
15
- // Create `history` and set the initial pathname to an unknown route
16
- const history = createMemoryHistory();
17
- history.replace("/__unknown__");
18
- const gateway = new HistoryRouterGateway(history, "");
19
- gateway.setRoutes([{
20
- name: "home",
21
- path: "/",
22
- onMatch: spyHome
23
- }, {
24
- name: "login",
25
- path: "/login",
26
- onMatch: spyLogin
27
- }, {
28
- name: "test",
29
- path: "/dynamic-route/:name",
30
- onMatch: spyDynamic
31
- }]);
32
- history.push("/login");
33
- await wait();
34
- history.push("/");
35
- await wait();
36
- history.push("/dynamic-route/cars");
37
- await wait();
38
- history.push("/login");
39
- await wait();
40
- history.push("/dynamic-route/blogs");
41
- await wait();
42
- history.push("/dynamic-route/blogs?search=123");
43
- await wait();
44
- expect(spyLogin).toHaveBeenCalledTimes(2);
45
- expect(spyLogin).toHaveBeenNthCalledWith(1, {
46
- name: "login",
47
- path: "/login",
48
- pathname: "/login",
49
- params: {}
50
- });
51
- expect(spyLogin).toHaveBeenNthCalledWith(2, {
52
- name: "login",
53
- path: "/login",
54
- pathname: "/login",
55
- params: {}
5
+ const wait = ()=>new Promise((resolve)=>setTimeout(resolve, 10));
6
+ describe("Router Gateway", ()=>{
7
+ beforeEach(()=>{
8
+ vi.clearAllMocks();
56
9
  });
57
- expect(spyHome).toHaveBeenCalledTimes(1);
58
- expect(spyHome).toHaveBeenLastCalledWith({
59
- name: "home",
60
- path: "/",
61
- pathname: "/",
62
- params: {}
10
+ it("should execute onMatch when history changes", async ()=>{
11
+ const spyHome = vi.fn();
12
+ const spyLogin = vi.fn();
13
+ const spyDynamic = vi.fn();
14
+ const history = createMemoryHistory();
15
+ history.replace("/__unknown__");
16
+ const gateway = new HistoryRouterGateway(history, "");
17
+ gateway.setRoutes([
18
+ {
19
+ name: "home",
20
+ path: "/",
21
+ onMatch: spyHome
22
+ },
23
+ {
24
+ name: "login",
25
+ path: "/login",
26
+ onMatch: spyLogin
27
+ },
28
+ {
29
+ name: "test",
30
+ path: "/dynamic-route/:name",
31
+ onMatch: spyDynamic
32
+ }
33
+ ]);
34
+ history.push("/login");
35
+ await wait();
36
+ history.push("/");
37
+ await wait();
38
+ history.push("/dynamic-route/cars");
39
+ await wait();
40
+ history.push("/login");
41
+ await wait();
42
+ history.push("/dynamic-route/blogs");
43
+ await wait();
44
+ history.push("/dynamic-route/blogs?search=123");
45
+ await wait();
46
+ expect(spyLogin).toHaveBeenCalledTimes(2);
47
+ expect(spyLogin).toHaveBeenNthCalledWith(1, {
48
+ name: "login",
49
+ path: "/login",
50
+ pathname: "/login",
51
+ params: {}
52
+ });
53
+ expect(spyLogin).toHaveBeenNthCalledWith(2, {
54
+ name: "login",
55
+ path: "/login",
56
+ pathname: "/login",
57
+ params: {}
58
+ });
59
+ expect(spyHome).toHaveBeenCalledTimes(1);
60
+ expect(spyHome).toHaveBeenLastCalledWith({
61
+ name: "home",
62
+ path: "/",
63
+ pathname: "/",
64
+ params: {}
65
+ });
66
+ expect(spyDynamic).toHaveBeenCalledTimes(3);
67
+ expect(spyDynamic).toHaveBeenNthCalledWith(1, {
68
+ name: "test",
69
+ path: "/dynamic-route/:name",
70
+ pathname: "/dynamic-route/cars",
71
+ params: {
72
+ name: "cars"
73
+ }
74
+ });
75
+ expect(spyDynamic).toHaveBeenNthCalledWith(2, {
76
+ name: "test",
77
+ path: "/dynamic-route/:name",
78
+ pathname: "/dynamic-route/blogs",
79
+ params: {
80
+ name: "blogs"
81
+ }
82
+ });
83
+ expect(spyDynamic).toHaveBeenNthCalledWith(3, {
84
+ name: "test",
85
+ path: "/dynamic-route/:name",
86
+ pathname: "/dynamic-route/blogs",
87
+ params: {
88
+ name: "blogs",
89
+ search: "123"
90
+ }
91
+ });
63
92
  });
64
- expect(spyDynamic).toHaveBeenCalledTimes(3);
65
- expect(spyDynamic).toHaveBeenNthCalledWith(1, {
66
- name: "test",
67
- path: "/dynamic-route/:name",
68
- pathname: "/dynamic-route/cars",
69
- params: {
70
- name: "cars"
71
- }
93
+ it("should generate route URLs", async ()=>{
94
+ const urls = [
95
+ RouteUrl.fromPattern("/"),
96
+ RouteUrl.fromPattern("/login", {}),
97
+ RouteUrl.fromPattern("/login", {
98
+ redirect: "/",
99
+ reason: "login"
100
+ }),
101
+ RouteUrl.fromPattern("/dynamic-route/:name", {
102
+ name: "cars"
103
+ }),
104
+ RouteUrl.fromPattern("/dynamic-route", {
105
+ folderId: "696556831e485d00027a1a0b#0001"
106
+ })
107
+ ];
108
+ expect(urls).toEqual([
109
+ "/",
110
+ "/login",
111
+ "/login?redirect=%2F&reason=login",
112
+ "/dynamic-route/cars",
113
+ "/dynamic-route?folderId=696556831e485d00027a1a0b%230001"
114
+ ]);
72
115
  });
73
- expect(spyDynamic).toHaveBeenNthCalledWith(2, {
74
- name: "test",
75
- path: "/dynamic-route/:name",
76
- pathname: "/dynamic-route/blogs",
77
- params: {
78
- name: "blogs"
79
- }
116
+ it("should handle baseUrl for route matching and URL generation", async ()=>{
117
+ const spyFileManager = vi.fn();
118
+ const spyHome = vi.fn();
119
+ const history = createMemoryHistory();
120
+ history.replace("/tenant123/__unknown__");
121
+ const gateway = new HistoryRouterGateway(history, "/tenant123");
122
+ gateway.setRoutes([
123
+ {
124
+ name: "home",
125
+ path: "/",
126
+ onMatch: spyHome
127
+ },
128
+ {
129
+ name: "fileManager",
130
+ path: "/file-manager",
131
+ onMatch: spyFileManager
132
+ }
133
+ ]);
134
+ history.push("/tenant123/file-manager");
135
+ await wait();
136
+ expect(spyFileManager).toHaveBeenCalledTimes(1);
137
+ expect(spyFileManager).toHaveBeenCalledWith({
138
+ name: "fileManager",
139
+ path: "/file-manager",
140
+ pathname: "/tenant123/file-manager",
141
+ params: {}
142
+ });
143
+ const urlWithBase = RouteUrl.fromPattern("/file-manager", {}, "/tenant123");
144
+ expect(urlWithBase).toBe("/tenant123/file-manager");
145
+ const urlWithBaseAndParams = RouteUrl.fromPattern("/file-manager", {
146
+ folder: "abc"
147
+ }, "/tenant123");
148
+ expect(urlWithBaseAndParams).toBe("/tenant123/file-manager?folder=abc");
80
149
  });
81
- expect(spyDynamic).toHaveBeenNthCalledWith(3, {
82
- name: "test",
83
- path: "/dynamic-route/:name",
84
- pathname: "/dynamic-route/blogs",
85
- params: {
86
- name: "blogs",
87
- search: "123"
88
- }
150
+ it("should properly sort routes with wildcards always at the bottom", async ()=>{
151
+ const spyWildcard = vi.fn();
152
+ const spySpecific = vi.fn();
153
+ const spyHome = vi.fn();
154
+ const history = createMemoryHistory();
155
+ history.replace("/initial");
156
+ const gateway = new HistoryRouterGateway(history, "");
157
+ gateway.setRoutes([
158
+ {
159
+ name: "wildcard",
160
+ path: "*",
161
+ onMatch: spyWildcard
162
+ },
163
+ {
164
+ name: "home",
165
+ path: "/",
166
+ onMatch: spyHome
167
+ }
168
+ ]);
169
+ expect(spyWildcard).toHaveBeenCalledTimes(1);
170
+ vi.clearAllMocks();
171
+ gateway.setRoutes([
172
+ {
173
+ name: "specific",
174
+ path: "/specific-route",
175
+ onMatch: spySpecific
176
+ }
177
+ ]);
178
+ expect(spyWildcard).toHaveBeenCalledTimes(1);
179
+ vi.clearAllMocks();
180
+ history.push("/specific-route");
181
+ await wait();
182
+ expect(spySpecific).toHaveBeenCalledTimes(1);
183
+ expect(spyWildcard).toHaveBeenCalledTimes(0);
184
+ expect(spyHome).toHaveBeenCalledTimes(0);
185
+ history.push("/");
186
+ await wait();
187
+ expect(spyHome).toHaveBeenCalledTimes(1);
188
+ expect(spyWildcard).toHaveBeenCalledTimes(0);
189
+ history.push("/unknown");
190
+ await wait();
191
+ expect(spyWildcard).toHaveBeenCalledTimes(1);
89
192
  });
90
- });
91
- it("should generate route URLs", async () => {
92
- const urls = [RouteUrl.fromPattern("/"), RouteUrl.fromPattern("/login", {}), RouteUrl.fromPattern("/login", {
93
- redirect: "/",
94
- reason: "login"
95
- }), RouteUrl.fromPattern("/dynamic-route/:name", {
96
- name: "cars"
97
- }), RouteUrl.fromPattern("/dynamic-route", {
98
- folderId: "696556831e485d00027a1a0b#0001"
99
- })];
100
- expect(urls).toEqual(["/", "/login", "/login?redirect=%2F&reason=login", "/dynamic-route/cars", "/dynamic-route?folderId=696556831e485d00027a1a0b%230001"]);
101
- });
102
- it("should handle baseUrl for route matching and URL generation", async () => {
103
- const spyFileManager = vi.fn();
104
- const spyHome = vi.fn();
105
-
106
- // Create history with a tenant prefix
107
- const history = createMemoryHistory();
108
- history.replace("/tenant123/__unknown__");
109
- const gateway = new HistoryRouterGateway(history, "/tenant123");
110
- gateway.setRoutes([{
111
- name: "home",
112
- path: "/",
113
- onMatch: spyHome
114
- }, {
115
- name: "fileManager",
116
- path: "/file-manager",
117
- onMatch: spyFileManager
118
- }]);
119
-
120
- // Navigate to /tenant123/file-manager
121
- history.push("/tenant123/file-manager");
122
- await wait();
123
-
124
- // Should match the /file-manager route
125
- expect(spyFileManager).toHaveBeenCalledTimes(1);
126
- expect(spyFileManager).toHaveBeenCalledWith({
127
- name: "fileManager",
128
- path: "/file-manager",
129
- pathname: "/tenant123/file-manager",
130
- params: {}
131
- });
132
-
133
- // Test URL generation with baseUrl
134
- const urlWithBase = RouteUrl.fromPattern("/file-manager", {}, "/tenant123");
135
- expect(urlWithBase).toBe("/tenant123/file-manager");
136
- const urlWithBaseAndParams = RouteUrl.fromPattern("/file-manager", {
137
- folder: "abc"
138
- }, "/tenant123");
139
- expect(urlWithBaseAndParams).toBe("/tenant123/file-manager?folder=abc");
140
- });
141
- it("should properly sort routes with wildcards always at the bottom", async () => {
142
- const spyWildcard = vi.fn();
143
- const spySpecific = vi.fn();
144
- const spyHome = vi.fn();
145
- const history = createMemoryHistory();
146
- // Start at a non-matching path to avoid initial route resolution
147
- history.replace("/initial");
148
- const gateway = new HistoryRouterGateway(history, "");
149
-
150
- // Add wildcard first, then home route
151
- // Note: setRoutes will trigger route resolution for current path (/initial)
152
- gateway.setRoutes([{
153
- name: "wildcard",
154
- path: "*",
155
- onMatch: spyWildcard
156
- }, {
157
- name: "home",
158
- path: "/",
159
- onMatch: spyHome
160
- }]);
161
-
162
- // Wildcard should have matched /initial
163
- expect(spyWildcard).toHaveBeenCalledTimes(1);
164
- vi.clearAllMocks();
165
-
166
- // Now add a specific route after the wildcard - this should re-sort and keep wildcard at bottom
167
- // Note: setRoutes will trigger route resolution again for /initial, matching wildcard again
168
- gateway.setRoutes([{
169
- name: "specific",
170
- path: "/specific-route",
171
- onMatch: spySpecific
172
- }]);
173
-
174
- // Wildcard should match /initial again after re-sorting
175
- expect(spyWildcard).toHaveBeenCalledTimes(1);
176
- vi.clearAllMocks();
177
-
178
- // Navigate to the specific route
179
- history.push("/specific-route");
180
- await wait();
181
-
182
- // Should match the specific route, not the wildcard
183
- expect(spySpecific).toHaveBeenCalledTimes(1);
184
- expect(spyWildcard).toHaveBeenCalledTimes(0);
185
- expect(spyHome).toHaveBeenCalledTimes(0);
186
-
187
- // Navigate to home
188
- history.push("/");
189
- await wait();
190
-
191
- // Should match home route
192
- expect(spyHome).toHaveBeenCalledTimes(1);
193
- expect(spyWildcard).toHaveBeenCalledTimes(0);
194
-
195
- // Navigate to unknown route
196
- history.push("/unknown");
197
- await wait();
198
-
199
- // Should match wildcard
200
- expect(spyWildcard).toHaveBeenCalledTimes(1);
201
- });
202
193
  });
203
194
 
204
195
  //# sourceMappingURL=HistoryRouterGateway.test.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["describe","it","beforeEach","expect","vi","createMemoryHistory","HistoryRouterGateway","RouteUrl","wait","Promise","resolve","setTimeout","clearAllMocks","spyHome","fn","spyLogin","spyDynamic","history","replace","gateway","setRoutes","name","path","onMatch","push","toHaveBeenCalledTimes","toHaveBeenNthCalledWith","pathname","params","toHaveBeenLastCalledWith","search","urls","fromPattern","redirect","reason","folderId","toEqual","spyFileManager","toHaveBeenCalledWith","urlWithBase","toBe","urlWithBaseAndParams","folder","spyWildcard","spySpecific"],"sources":["HistoryRouterGateway.test.ts"],"sourcesContent":["import { describe, it, beforeEach, expect, vi } from \"vitest\";\nimport { createMemoryHistory } from \"history\";\nimport { HistoryRouterGateway } from \"./HistoryRouterGateway.js\";\nimport { RouteUrl } from \"./RouteUrl.js\";\n\nconst wait = () => new Promise(resolve => setTimeout(resolve, 10));\n\ndescribe(\"Router Gateway\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should execute onMatch when history changes\", async () => {\n const spyHome = vi.fn();\n const spyLogin = vi.fn();\n const spyDynamic = vi.fn();\n\n // Create `history` and set the initial pathname to an unknown route\n const history = createMemoryHistory();\n history.replace(\"/__unknown__\");\n\n const gateway = new HistoryRouterGateway(history, \"\");\n gateway.setRoutes([\n { name: \"home\", path: \"/\", onMatch: spyHome },\n { name: \"login\", path: \"/login\", onMatch: spyLogin },\n { name: \"test\", path: \"/dynamic-route/:name\", onMatch: spyDynamic }\n ]);\n\n history.push(\"/login\");\n await wait();\n history.push(\"/\");\n await wait();\n history.push(\"/dynamic-route/cars\");\n await wait();\n history.push(\"/login\");\n await wait();\n history.push(\"/dynamic-route/blogs\");\n await wait();\n history.push(\"/dynamic-route/blogs?search=123\");\n await wait();\n\n expect(spyLogin).toHaveBeenCalledTimes(2);\n expect(spyLogin).toHaveBeenNthCalledWith(1, {\n name: \"login\",\n path: \"/login\",\n pathname: \"/login\",\n params: {}\n });\n expect(spyLogin).toHaveBeenNthCalledWith(2, {\n name: \"login\",\n path: \"/login\",\n pathname: \"/login\",\n params: {}\n });\n expect(spyHome).toHaveBeenCalledTimes(1);\n expect(spyHome).toHaveBeenLastCalledWith({\n name: \"home\",\n path: \"/\",\n pathname: \"/\",\n params: {}\n });\n expect(spyDynamic).toHaveBeenCalledTimes(3);\n expect(spyDynamic).toHaveBeenNthCalledWith(1, {\n name: \"test\",\n path: \"/dynamic-route/:name\",\n pathname: \"/dynamic-route/cars\",\n params: {\n name: \"cars\"\n }\n });\n expect(spyDynamic).toHaveBeenNthCalledWith(2, {\n name: \"test\",\n path: \"/dynamic-route/:name\",\n pathname: \"/dynamic-route/blogs\",\n params: {\n name: \"blogs\"\n }\n });\n expect(spyDynamic).toHaveBeenNthCalledWith(3, {\n name: \"test\",\n path: \"/dynamic-route/:name\",\n pathname: \"/dynamic-route/blogs\",\n params: {\n name: \"blogs\",\n search: \"123\"\n }\n });\n });\n\n it(\"should generate route URLs\", async () => {\n const urls = [\n RouteUrl.fromPattern(\"/\"),\n RouteUrl.fromPattern(\"/login\", {}),\n RouteUrl.fromPattern(\"/login\", { redirect: \"/\", reason: \"login\" }),\n RouteUrl.fromPattern(\"/dynamic-route/:name\", { name: \"cars\" }),\n RouteUrl.fromPattern(\"/dynamic-route\", { folderId: \"696556831e485d00027a1a0b#0001\" })\n ];\n expect(urls).toEqual([\n \"/\",\n \"/login\",\n \"/login?redirect=%2F&reason=login\",\n \"/dynamic-route/cars\",\n \"/dynamic-route?folderId=696556831e485d00027a1a0b%230001\"\n ]);\n });\n\n it(\"should handle baseUrl for route matching and URL generation\", async () => {\n const spyFileManager = vi.fn();\n const spyHome = vi.fn();\n\n // Create history with a tenant prefix\n const history = createMemoryHistory();\n history.replace(\"/tenant123/__unknown__\");\n\n const gateway = new HistoryRouterGateway(history, \"/tenant123\");\n gateway.setRoutes([\n { name: \"home\", path: \"/\", onMatch: spyHome },\n { name: \"fileManager\", path: \"/file-manager\", onMatch: spyFileManager }\n ]);\n\n // Navigate to /tenant123/file-manager\n history.push(\"/tenant123/file-manager\");\n await wait();\n\n // Should match the /file-manager route\n expect(spyFileManager).toHaveBeenCalledTimes(1);\n expect(spyFileManager).toHaveBeenCalledWith({\n name: \"fileManager\",\n path: \"/file-manager\",\n pathname: \"/tenant123/file-manager\",\n params: {}\n });\n\n // Test URL generation with baseUrl\n const urlWithBase = RouteUrl.fromPattern(\"/file-manager\", {}, \"/tenant123\");\n expect(urlWithBase).toBe(\"/tenant123/file-manager\");\n\n const urlWithBaseAndParams = RouteUrl.fromPattern(\n \"/file-manager\",\n { folder: \"abc\" },\n \"/tenant123\"\n );\n expect(urlWithBaseAndParams).toBe(\"/tenant123/file-manager?folder=abc\");\n });\n\n it(\"should properly sort routes with wildcards always at the bottom\", async () => {\n const spyWildcard = vi.fn();\n const spySpecific = vi.fn();\n const spyHome = vi.fn();\n\n const history = createMemoryHistory();\n // Start at a non-matching path to avoid initial route resolution\n history.replace(\"/initial\");\n\n const gateway = new HistoryRouterGateway(history, \"\");\n\n // Add wildcard first, then home route\n // Note: setRoutes will trigger route resolution for current path (/initial)\n gateway.setRoutes([\n { name: \"wildcard\", path: \"*\", onMatch: spyWildcard },\n { name: \"home\", path: \"/\", onMatch: spyHome }\n ]);\n\n // Wildcard should have matched /initial\n expect(spyWildcard).toHaveBeenCalledTimes(1);\n vi.clearAllMocks();\n\n // Now add a specific route after the wildcard - this should re-sort and keep wildcard at bottom\n // Note: setRoutes will trigger route resolution again for /initial, matching wildcard again\n gateway.setRoutes([{ name: \"specific\", path: \"/specific-route\", onMatch: spySpecific }]);\n\n // Wildcard should match /initial again after re-sorting\n expect(spyWildcard).toHaveBeenCalledTimes(1);\n vi.clearAllMocks();\n\n // Navigate to the specific route\n history.push(\"/specific-route\");\n await wait();\n\n // Should match the specific route, not the wildcard\n expect(spySpecific).toHaveBeenCalledTimes(1);\n expect(spyWildcard).toHaveBeenCalledTimes(0);\n expect(spyHome).toHaveBeenCalledTimes(0);\n\n // Navigate to home\n history.push(\"/\");\n await wait();\n\n // Should match home route\n expect(spyHome).toHaveBeenCalledTimes(1);\n expect(spyWildcard).toHaveBeenCalledTimes(0);\n\n // Navigate to unknown route\n history.push(\"/unknown\");\n await wait();\n\n // Should match wildcard\n expect(spyWildcard).toHaveBeenCalledTimes(1);\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"features/router/HistoryRouterGateway.test.js","sources":["../../../src/features/router/HistoryRouterGateway.test.ts"],"sourcesContent":["import { describe, it, beforeEach, expect, vi } from \"vitest\";\nimport { createMemoryHistory } from \"history\";\nimport { HistoryRouterGateway } from \"./HistoryRouterGateway.js\";\nimport { RouteUrl } from \"./RouteUrl.js\";\n\nconst wait = () => new Promise(resolve => setTimeout(resolve, 10));\n\ndescribe(\"Router Gateway\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should execute onMatch when history changes\", async () => {\n const spyHome = vi.fn();\n const spyLogin = vi.fn();\n const spyDynamic = vi.fn();\n\n // Create `history` and set the initial pathname to an unknown route\n const history = createMemoryHistory();\n history.replace(\"/__unknown__\");\n\n const gateway = new HistoryRouterGateway(history, \"\");\n gateway.setRoutes([\n { name: \"home\", path: \"/\", onMatch: spyHome },\n { name: \"login\", path: \"/login\", onMatch: spyLogin },\n { name: \"test\", path: \"/dynamic-route/:name\", onMatch: spyDynamic }\n ]);\n\n history.push(\"/login\");\n await wait();\n history.push(\"/\");\n await wait();\n history.push(\"/dynamic-route/cars\");\n await wait();\n history.push(\"/login\");\n await wait();\n history.push(\"/dynamic-route/blogs\");\n await wait();\n history.push(\"/dynamic-route/blogs?search=123\");\n await wait();\n\n expect(spyLogin).toHaveBeenCalledTimes(2);\n expect(spyLogin).toHaveBeenNthCalledWith(1, {\n name: \"login\",\n path: \"/login\",\n pathname: \"/login\",\n params: {}\n });\n expect(spyLogin).toHaveBeenNthCalledWith(2, {\n name: \"login\",\n path: \"/login\",\n pathname: \"/login\",\n params: {}\n });\n expect(spyHome).toHaveBeenCalledTimes(1);\n expect(spyHome).toHaveBeenLastCalledWith({\n name: \"home\",\n path: \"/\",\n pathname: \"/\",\n params: {}\n });\n expect(spyDynamic).toHaveBeenCalledTimes(3);\n expect(spyDynamic).toHaveBeenNthCalledWith(1, {\n name: \"test\",\n path: \"/dynamic-route/:name\",\n pathname: \"/dynamic-route/cars\",\n params: {\n name: \"cars\"\n }\n });\n expect(spyDynamic).toHaveBeenNthCalledWith(2, {\n name: \"test\",\n path: \"/dynamic-route/:name\",\n pathname: \"/dynamic-route/blogs\",\n params: {\n name: \"blogs\"\n }\n });\n expect(spyDynamic).toHaveBeenNthCalledWith(3, {\n name: \"test\",\n path: \"/dynamic-route/:name\",\n pathname: \"/dynamic-route/blogs\",\n params: {\n name: \"blogs\",\n search: \"123\"\n }\n });\n });\n\n it(\"should generate route URLs\", async () => {\n const urls = [\n RouteUrl.fromPattern(\"/\"),\n RouteUrl.fromPattern(\"/login\", {}),\n RouteUrl.fromPattern(\"/login\", { redirect: \"/\", reason: \"login\" }),\n RouteUrl.fromPattern(\"/dynamic-route/:name\", { name: \"cars\" }),\n RouteUrl.fromPattern(\"/dynamic-route\", { folderId: \"696556831e485d00027a1a0b#0001\" })\n ];\n expect(urls).toEqual([\n \"/\",\n \"/login\",\n \"/login?redirect=%2F&reason=login\",\n \"/dynamic-route/cars\",\n \"/dynamic-route?folderId=696556831e485d00027a1a0b%230001\"\n ]);\n });\n\n it(\"should handle baseUrl for route matching and URL generation\", async () => {\n const spyFileManager = vi.fn();\n const spyHome = vi.fn();\n\n // Create history with a tenant prefix\n const history = createMemoryHistory();\n history.replace(\"/tenant123/__unknown__\");\n\n const gateway = new HistoryRouterGateway(history, \"/tenant123\");\n gateway.setRoutes([\n { name: \"home\", path: \"/\", onMatch: spyHome },\n { name: \"fileManager\", path: \"/file-manager\", onMatch: spyFileManager }\n ]);\n\n // Navigate to /tenant123/file-manager\n history.push(\"/tenant123/file-manager\");\n await wait();\n\n // Should match the /file-manager route\n expect(spyFileManager).toHaveBeenCalledTimes(1);\n expect(spyFileManager).toHaveBeenCalledWith({\n name: \"fileManager\",\n path: \"/file-manager\",\n pathname: \"/tenant123/file-manager\",\n params: {}\n });\n\n // Test URL generation with baseUrl\n const urlWithBase = RouteUrl.fromPattern(\"/file-manager\", {}, \"/tenant123\");\n expect(urlWithBase).toBe(\"/tenant123/file-manager\");\n\n const urlWithBaseAndParams = RouteUrl.fromPattern(\n \"/file-manager\",\n { folder: \"abc\" },\n \"/tenant123\"\n );\n expect(urlWithBaseAndParams).toBe(\"/tenant123/file-manager?folder=abc\");\n });\n\n it(\"should properly sort routes with wildcards always at the bottom\", async () => {\n const spyWildcard = vi.fn();\n const spySpecific = vi.fn();\n const spyHome = vi.fn();\n\n const history = createMemoryHistory();\n // Start at a non-matching path to avoid initial route resolution\n history.replace(\"/initial\");\n\n const gateway = new HistoryRouterGateway(history, \"\");\n\n // Add wildcard first, then home route\n // Note: setRoutes will trigger route resolution for current path (/initial)\n gateway.setRoutes([\n { name: \"wildcard\", path: \"*\", onMatch: spyWildcard },\n { name: \"home\", path: \"/\", onMatch: spyHome }\n ]);\n\n // Wildcard should have matched /initial\n expect(spyWildcard).toHaveBeenCalledTimes(1);\n vi.clearAllMocks();\n\n // Now add a specific route after the wildcard - this should re-sort and keep wildcard at bottom\n // Note: setRoutes will trigger route resolution again for /initial, matching wildcard again\n gateway.setRoutes([{ name: \"specific\", path: \"/specific-route\", onMatch: spySpecific }]);\n\n // Wildcard should match /initial again after re-sorting\n expect(spyWildcard).toHaveBeenCalledTimes(1);\n vi.clearAllMocks();\n\n // Navigate to the specific route\n history.push(\"/specific-route\");\n await wait();\n\n // Should match the specific route, not the wildcard\n expect(spySpecific).toHaveBeenCalledTimes(1);\n expect(spyWildcard).toHaveBeenCalledTimes(0);\n expect(spyHome).toHaveBeenCalledTimes(0);\n\n // Navigate to home\n history.push(\"/\");\n await wait();\n\n // Should match home route\n expect(spyHome).toHaveBeenCalledTimes(1);\n expect(spyWildcard).toHaveBeenCalledTimes(0);\n\n // Navigate to unknown route\n history.push(\"/unknown\");\n await wait();\n\n // Should match wildcard\n expect(spyWildcard).toHaveBeenCalledTimes(1);\n });\n});\n"],"names":["wait","Promise","resolve","setTimeout","describe","beforeEach","vi","it","spyHome","spyLogin","spyDynamic","history","createMemoryHistory","gateway","HistoryRouterGateway","expect","urls","RouteUrl","spyFileManager","urlWithBase","urlWithBaseAndParams","spyWildcard","spySpecific"],"mappings":"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"}
@@ -1,59 +1,43 @@
1
1
  import { z } from "zod";
2
- export class Route {
3
- constructor(route) {
4
- this.route = route;
5
- const paramsSchema = route.params ? route.params(z) : undefined;
6
- // @ts-expect-error
7
- this.schema = paramsSchema ? z.looseObject(this.coerceParams(paramsSchema)) : undefined;
8
- }
9
- get name() {
10
- return this.route.name;
11
- }
12
- get path() {
13
- return this.route.path;
14
- }
15
- get params() {
16
- return this.schema;
17
- }
18
- coerceParams(shape) {
19
- const result = {};
20
- for (const [key, schema] of Object.entries(shape)) {
21
- let base = schema;
22
- let isOptional = false;
23
- let isNullable = false;
24
-
25
- // unwrap optional
26
- if (base instanceof z.ZodOptional) {
27
- isOptional = true;
28
- base = base.unwrap();
29
- }
30
-
31
- // unwrap nullable
32
- if (base instanceof z.ZodNullable) {
33
- isNullable = true;
34
- base = base.unwrap();
35
- }
36
-
37
- // replace with coerced
38
- if (base instanceof z.ZodString) {
39
- base = z.coerce.string();
40
- } else if (base instanceof z.ZodNumber) {
41
- base = z.coerce.number();
42
- } else if (base instanceof z.ZodBoolean) {
43
- base = z.coerce.boolean();
44
- }
45
-
46
- // rewrap optional/nullable
47
- if (isNullable) {
48
- base = base.nullable();
49
- }
50
- if (isOptional) {
51
- base = base.optional();
52
- }
53
- result[key] = base;
2
+ class Route {
3
+ constructor(route){
4
+ this.route = route;
5
+ const paramsSchema = route.params ? route.params(z) : void 0;
6
+ this.schema = paramsSchema ? z.looseObject(this.coerceParams(paramsSchema)) : void 0;
7
+ }
8
+ get name() {
9
+ return this.route.name;
10
+ }
11
+ get path() {
12
+ return this.route.path;
13
+ }
14
+ get params() {
15
+ return this.schema;
16
+ }
17
+ coerceParams(shape) {
18
+ const result = {};
19
+ for (const [key, schema] of Object.entries(shape)){
20
+ let base = schema;
21
+ let isOptional = false;
22
+ let isNullable = false;
23
+ if (base instanceof z.ZodOptional) {
24
+ isOptional = true;
25
+ base = base.unwrap();
26
+ }
27
+ if (base instanceof z.ZodNullable) {
28
+ isNullable = true;
29
+ base = base.unwrap();
30
+ }
31
+ if (base instanceof z.ZodString) base = z.coerce.string();
32
+ else if (base instanceof z.ZodNumber) base = z.coerce.number();
33
+ else if (base instanceof z.ZodBoolean) base = z.coerce.boolean();
34
+ if (isNullable) base = base.nullable();
35
+ if (isOptional) base = base.optional();
36
+ result[key] = base;
37
+ }
38
+ return result;
54
39
  }
55
- return result;
56
- }
57
40
  }
41
+ export { Route };
58
42
 
59
43
  //# sourceMappingURL=Route.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["z","Route","constructor","route","paramsSchema","params","undefined","schema","looseObject","coerceParams","name","path","shape","result","key","Object","entries","base","isOptional","isNullable","ZodOptional","unwrap","ZodNullable","ZodString","coerce","string","ZodNumber","number","ZodBoolean","boolean","nullable","optional"],"sources":["Route.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type RouteParamsDefinition = Record<string, z.ZodTypeAny>;\n\nexport type RouteParamsInfer<T extends RouteParamsDefinition | undefined> =\n T extends RouteParamsDefinition ? z.infer<z.ZodObject<T> & { [k: string]: any }> : never;\n\nexport interface RouteParams<TParams extends RouteParamsDefinition | undefined> {\n name: string;\n path: `/${string}` | `*`;\n params?: (zod: typeof z) => TParams;\n}\n\nexport class Route<TParams extends RouteParamsDefinition | undefined = undefined> {\n private readonly route: RouteParams<TParams>;\n private readonly schema: TParams extends RouteParamsDefinition\n ? RouteParamsInfer<TParams>\n : undefined;\n\n constructor(route: RouteParams<TParams>) {\n this.route = route;\n const paramsSchema = route.params ? route.params(z) : undefined;\n // @ts-expect-error\n this.schema = paramsSchema ? z.looseObject(this.coerceParams(paramsSchema)) : undefined;\n }\n\n get name() {\n return this.route.name;\n }\n\n get path() {\n return this.route.path;\n }\n\n get params(): TParams extends RouteParamsDefinition ? RouteParamsInfer<TParams> : undefined {\n return this.schema;\n }\n\n private coerceParams<T extends Record<string, z.ZodTypeAny>>(shape: T) {\n const result: Record<string, z.ZodTypeAny> = {};\n for (const [key, schema] of Object.entries(shape)) {\n let base = schema as z.ZodTypeAny;\n let isOptional = false;\n let isNullable = false;\n\n // unwrap optional\n if (base instanceof z.ZodOptional) {\n isOptional = true;\n base = base.unwrap() as z.ZodTypeAny;\n }\n\n // unwrap nullable\n if (base instanceof z.ZodNullable) {\n isNullable = true;\n base = base.unwrap() as z.ZodTypeAny;\n }\n\n // replace with coerced\n if (base instanceof z.ZodString) {\n base = z.coerce.string();\n } else if (base instanceof z.ZodNumber) {\n base = z.coerce.number();\n } else if (base instanceof z.ZodBoolean) {\n base = z.coerce.boolean();\n }\n\n // rewrap optional/nullable\n if (isNullable) {\n base = base.nullable();\n }\n if (isOptional) {\n base = base.optional();\n }\n\n result[key] = base;\n }\n return result;\n }\n}\n"],"mappings":"AAAA,SAASA,CAAC,QAAQ,KAAK;AAavB,OAAO,MAAMC,KAAK,CAAgE;EAM9EC,WAAWA,CAACC,KAA2B,EAAE;IACrC,IAAI,CAACA,KAAK,GAAGA,KAAK;IAClB,MAAMC,YAAY,GAAGD,KAAK,CAACE,MAAM,GAAGF,KAAK,CAACE,MAAM,CAACL,CAAC,CAAC,GAAGM,SAAS;IAC/D;IACA,IAAI,CAACC,MAAM,GAAGH,YAAY,GAAGJ,CAAC,CAACQ,WAAW,CAAC,IAAI,CAACC,YAAY,CAACL,YAAY,CAAC,CAAC,GAAGE,SAAS;EAC3F;EAEA,IAAII,IAAIA,CAAA,EAAG;IACP,OAAO,IAAI,CAACP,KAAK,CAACO,IAAI;EAC1B;EAEA,IAAIC,IAAIA,CAAA,EAAG;IACP,OAAO,IAAI,CAACR,KAAK,CAACQ,IAAI;EAC1B;EAEA,IAAIN,MAAMA,CAAA,EAAkF;IACxF,OAAO,IAAI,CAACE,MAAM;EACtB;EAEQE,YAAYA,CAAyCG,KAAQ,EAAE;IACnE,MAAMC,MAAoC,GAAG,CAAC,CAAC;IAC/C,KAAK,MAAM,CAACC,GAAG,EAAEP,MAAM,CAAC,IAAIQ,MAAM,CAACC,OAAO,CAACJ,KAAK,CAAC,EAAE;MAC/C,IAAIK,IAAI,GAAGV,MAAsB;MACjC,IAAIW,UAAU,GAAG,KAAK;MACtB,IAAIC,UAAU,GAAG,KAAK;;MAEtB;MACA,IAAIF,IAAI,YAAYjB,CAAC,CAACoB,WAAW,EAAE;QAC/BF,UAAU,GAAG,IAAI;QACjBD,IAAI,GAAGA,IAAI,CAACI,MAAM,CAAC,CAAiB;MACxC;;MAEA;MACA,IAAIJ,IAAI,YAAYjB,CAAC,CAACsB,WAAW,EAAE;QAC/BH,UAAU,GAAG,IAAI;QACjBF,IAAI,GAAGA,IAAI,CAACI,MAAM,CAAC,CAAiB;MACxC;;MAEA;MACA,IAAIJ,IAAI,YAAYjB,CAAC,CAACuB,SAAS,EAAE;QAC7BN,IAAI,GAAGjB,CAAC,CAACwB,MAAM,CAACC,MAAM,CAAC,CAAC;MAC5B,CAAC,MAAM,IAAIR,IAAI,YAAYjB,CAAC,CAAC0B,SAAS,EAAE;QACpCT,IAAI,GAAGjB,CAAC,CAACwB,MAAM,CAACG,MAAM,CAAC,CAAC;MAC5B,CAAC,MAAM,IAAIV,IAAI,YAAYjB,CAAC,CAAC4B,UAAU,EAAE;QACrCX,IAAI,GAAGjB,CAAC,CAACwB,MAAM,CAACK,OAAO,CAAC,CAAC;MAC7B;;MAEA;MACA,IAAIV,UAAU,EAAE;QACZF,IAAI,GAAGA,IAAI,CAACa,QAAQ,CAAC,CAAC;MAC1B;MACA,IAAIZ,UAAU,EAAE;QACZD,IAAI,GAAGA,IAAI,CAACc,QAAQ,CAAC,CAAC;MAC1B;MAEAlB,MAAM,CAACC,GAAG,CAAC,GAAGG,IAAI;IACtB;IACA,OAAOJ,MAAM;EACjB;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"features/router/Route.js","sources":["../../../src/features/router/Route.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type RouteParamsDefinition = Record<string, z.ZodTypeAny>;\n\nexport type RouteParamsInfer<T extends RouteParamsDefinition | undefined> =\n T extends RouteParamsDefinition ? z.infer<z.ZodObject<T> & { [k: string]: any }> : never;\n\nexport interface RouteParams<TParams extends RouteParamsDefinition | undefined> {\n name: string;\n path: `/${string}` | `*`;\n params?: (zod: typeof z) => TParams;\n}\n\nexport class Route<TParams extends RouteParamsDefinition | undefined = undefined> {\n private readonly route: RouteParams<TParams>;\n private readonly schema: TParams extends RouteParamsDefinition\n ? RouteParamsInfer<TParams>\n : undefined;\n\n constructor(route: RouteParams<TParams>) {\n this.route = route;\n const paramsSchema = route.params ? route.params(z) : undefined;\n // @ts-expect-error\n this.schema = paramsSchema ? z.looseObject(this.coerceParams(paramsSchema)) : undefined;\n }\n\n get name() {\n return this.route.name;\n }\n\n get path() {\n return this.route.path;\n }\n\n get params(): TParams extends RouteParamsDefinition ? RouteParamsInfer<TParams> : undefined {\n return this.schema;\n }\n\n private coerceParams<T extends Record<string, z.ZodTypeAny>>(shape: T) {\n const result: Record<string, z.ZodTypeAny> = {};\n for (const [key, schema] of Object.entries(shape)) {\n let base = schema as z.ZodTypeAny;\n let isOptional = false;\n let isNullable = false;\n\n // unwrap optional\n if (base instanceof z.ZodOptional) {\n isOptional = true;\n base = base.unwrap() as z.ZodTypeAny;\n }\n\n // unwrap nullable\n if (base instanceof z.ZodNullable) {\n isNullable = true;\n base = base.unwrap() as z.ZodTypeAny;\n }\n\n // replace with coerced\n if (base instanceof z.ZodString) {\n base = z.coerce.string();\n } else if (base instanceof z.ZodNumber) {\n base = z.coerce.number();\n } else if (base instanceof z.ZodBoolean) {\n base = z.coerce.boolean();\n }\n\n // rewrap optional/nullable\n if (isNullable) {\n base = base.nullable();\n }\n if (isOptional) {\n base = base.optional();\n }\n\n result[key] = base;\n }\n return result;\n }\n}\n"],"names":["Route","route","paramsSchema","z","undefined","shape","result","key","schema","Object","base","isOptional","isNullable"],"mappings":";AAaO,MAAMA;IAMT,YAAYC,KAA2B,CAAE;QACrC,IAAI,CAAC,KAAK,GAAGA;QACb,MAAMC,eAAeD,MAAM,MAAM,GAAGA,MAAM,MAAM,CAACE,KAAKC;QAEtD,IAAI,CAAC,MAAM,GAAGF,eAAeC,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAACD,iBAAiBE;IAClF;IAEA,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI;IAC1B;IAEA,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI;IAC1B;IAEA,IAAI,SAAwF;QACxF,OAAO,IAAI,CAAC,MAAM;IACtB;IAEQ,aAAqDC,KAAQ,EAAE;QACnE,MAAMC,SAAuC,CAAC;QAC9C,KAAK,MAAM,CAACC,KAAKC,OAAO,IAAIC,OAAO,OAAO,CAACJ,OAAQ;YAC/C,IAAIK,OAAOF;YACX,IAAIG,aAAa;YACjB,IAAIC,aAAa;YAGjB,IAAIF,gBAAgBP,EAAE,WAAW,EAAE;gBAC/BQ,aAAa;gBACbD,OAAOA,KAAK,MAAM;YACtB;YAGA,IAAIA,gBAAgBP,EAAE,WAAW,EAAE;gBAC/BS,aAAa;gBACbF,OAAOA,KAAK,MAAM;YACtB;YAGA,IAAIA,gBAAgBP,EAAE,SAAS,EAC3BO,OAAOP,EAAE,MAAM,CAAC,MAAM;iBACnB,IAAIO,gBAAgBP,EAAE,SAAS,EAClCO,OAAOP,EAAE,MAAM,CAAC,MAAM;iBACnB,IAAIO,gBAAgBP,EAAE,UAAU,EACnCO,OAAOP,EAAE,MAAM,CAAC,OAAO;YAI3B,IAAIS,YACAF,OAAOA,KAAK,QAAQ;YAExB,IAAIC,YACAD,OAAOA,KAAK,QAAQ;YAGxBJ,MAAM,CAACC,IAAI,GAAGG;QAClB;QACA,OAAOJ;IACX;AACJ"}