one 1.1.473 → 1.1.475

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 (245) hide show
  1. package/dist/cjs/Root.cjs +5 -1
  2. package/dist/cjs/Root.js +2 -2
  3. package/dist/cjs/Root.js.map +1 -1
  4. package/dist/cjs/Root.native.js +5 -2
  5. package/dist/cjs/Root.native.js.map +2 -2
  6. package/dist/cjs/createApp.cjs +2 -0
  7. package/dist/cjs/createApp.js +16 -2
  8. package/dist/cjs/createApp.js.map +1 -1
  9. package/dist/cjs/createApp.native.js +1 -0
  10. package/dist/cjs/createApp.native.js.map +2 -2
  11. package/dist/cjs/fork/__tests__/getPathFromState.test.cjs +1440 -0
  12. package/dist/cjs/fork/__tests__/getPathFromState.test.js +1559 -0
  13. package/dist/cjs/fork/__tests__/getPathFromState.test.js.map +6 -0
  14. package/dist/cjs/fork/__tests__/getPathFromState.test.native.js +1726 -0
  15. package/dist/cjs/fork/__tests__/getPathFromState.test.native.js.map +6 -0
  16. package/dist/cjs/fork/__tests__/getStateFromPath.test.cjs +2565 -0
  17. package/dist/cjs/fork/__tests__/getStateFromPath.test.js +2702 -0
  18. package/dist/cjs/fork/__tests__/getStateFromPath.test.js.map +6 -0
  19. package/dist/cjs/fork/__tests__/getStateFromPath.test.native.js +2861 -0
  20. package/dist/cjs/fork/__tests__/getStateFromPath.test.native.js.map +6 -0
  21. package/dist/cjs/fork/getPathFromState.cjs +2 -1
  22. package/dist/cjs/fork/getPathFromState.js +1 -1
  23. package/dist/cjs/fork/getPathFromState.js.map +1 -1
  24. package/dist/cjs/fork/getPathFromState.native.js +10 -5
  25. package/dist/cjs/fork/getPathFromState.native.js.map +1 -1
  26. package/dist/cjs/fork/getPathFromState.test.cjs +113 -0
  27. package/dist/cjs/fork/getPathFromState.test.js +122 -0
  28. package/dist/cjs/fork/getPathFromState.test.js.map +6 -0
  29. package/dist/cjs/fork/getPathFromState.test.native.js +135 -0
  30. package/dist/cjs/fork/getPathFromState.test.native.js.map +6 -0
  31. package/dist/cjs/fork/getStateFromPath.test.cjs +229 -0
  32. package/dist/cjs/fork/getStateFromPath.test.js +290 -0
  33. package/dist/cjs/fork/getStateFromPath.test.js.map +6 -0
  34. package/dist/cjs/fork/getStateFromPath.test.native.js +374 -0
  35. package/dist/cjs/fork/getStateFromPath.test.native.js.map +6 -0
  36. package/dist/cjs/render.cjs +1 -1
  37. package/dist/cjs/render.js +1 -1
  38. package/dist/cjs/render.js.map +1 -1
  39. package/dist/cjs/router/FlagsContext.cjs +27 -0
  40. package/dist/cjs/router/FlagsContext.js +22 -0
  41. package/dist/cjs/router/FlagsContext.js.map +6 -0
  42. package/dist/cjs/router/FlagsContext.native.js +26 -0
  43. package/dist/cjs/router/FlagsContext.native.js.map +6 -0
  44. package/dist/cjs/router/getRoutes.cjs +11 -1
  45. package/dist/cjs/router/getRoutes.js +11 -1
  46. package/dist/cjs/router/getRoutes.js.map +1 -1
  47. package/dist/cjs/router/getRoutes.native.js +11 -1
  48. package/dist/cjs/router/getRoutes.native.js.map +2 -2
  49. package/dist/cjs/router/matchers.test.cjs +38 -0
  50. package/dist/cjs/router/matchers.test.js +42 -0
  51. package/dist/cjs/router/matchers.test.js.map +6 -0
  52. package/dist/cjs/router/matchers.test.native.js +39 -0
  53. package/dist/cjs/router/matchers.test.native.js.map +6 -0
  54. package/dist/cjs/router/router.cjs +3 -35
  55. package/dist/cjs/router/router.js +2 -26
  56. package/dist/cjs/router/router.js.map +1 -1
  57. package/dist/cjs/router/router.native.js +2 -33
  58. package/dist/cjs/router/router.native.js.map +2 -2
  59. package/dist/cjs/router/utils/getNavigateAction.cjs +61 -0
  60. package/dist/cjs/router/utils/getNavigateAction.js +46 -0
  61. package/dist/cjs/router/utils/getNavigateAction.js.map +6 -0
  62. package/dist/cjs/router/utils/getNavigateAction.native.js +58 -0
  63. package/dist/cjs/router/utils/getNavigateAction.native.js.map +6 -0
  64. package/dist/cjs/router/utils/getNavigateAction.test.cjs +259 -0
  65. package/dist/cjs/router/utils/getNavigateAction.test.js +295 -0
  66. package/dist/cjs/router/utils/getNavigateAction.test.js.map +6 -0
  67. package/dist/cjs/router/utils/getNavigateAction.test.native.js +330 -0
  68. package/dist/cjs/router/utils/getNavigateAction.test.native.js.map +6 -0
  69. package/dist/cjs/testing-utils.cjs +63 -0
  70. package/dist/cjs/testing-utils.js +55 -0
  71. package/dist/cjs/testing-utils.js.map +6 -0
  72. package/dist/cjs/testing-utils.native.js +79 -0
  73. package/dist/cjs/testing-utils.native.js.map +6 -0
  74. package/dist/cjs/views/Navigator.cjs +8 -1
  75. package/dist/cjs/views/Navigator.js +25 -11
  76. package/dist/cjs/views/Navigator.js.map +1 -1
  77. package/dist/cjs/views/Navigator.native.js +7 -4
  78. package/dist/cjs/views/Navigator.native.js.map +2 -2
  79. package/dist/cjs/vite/one.cjs +6 -1
  80. package/dist/cjs/vite/one.js +6 -1
  81. package/dist/cjs/vite/one.js.map +1 -1
  82. package/dist/cjs/vite/one.native.js +7 -2
  83. package/dist/cjs/vite/one.native.js.map +2 -2
  84. package/dist/cjs/vite/plugins/virtualEntryPlugin.cjs +2 -0
  85. package/dist/cjs/vite/plugins/virtualEntryPlugin.js +2 -0
  86. package/dist/cjs/vite/plugins/virtualEntryPlugin.js.map +1 -1
  87. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js +2 -0
  88. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +2 -2
  89. package/dist/esm/Root.js +2 -1
  90. package/dist/esm/Root.js.map +1 -1
  91. package/dist/esm/Root.mjs +5 -1
  92. package/dist/esm/Root.mjs.map +1 -1
  93. package/dist/esm/Root.native.js +5 -1
  94. package/dist/esm/Root.native.js.map +1 -1
  95. package/dist/esm/createApp.js +16 -2
  96. package/dist/esm/createApp.js.map +1 -1
  97. package/dist/esm/createApp.mjs +2 -0
  98. package/dist/esm/createApp.mjs.map +1 -1
  99. package/dist/esm/createApp.native.js +1 -0
  100. package/dist/esm/createApp.native.js.map +1 -1
  101. package/dist/esm/fork/__tests__/getPathFromState.test.js +1561 -0
  102. package/dist/esm/fork/__tests__/getPathFromState.test.js.map +6 -0
  103. package/dist/esm/fork/__tests__/getPathFromState.test.mjs +1441 -0
  104. package/dist/esm/fork/__tests__/getPathFromState.test.mjs.map +1 -0
  105. package/dist/esm/fork/__tests__/getPathFromState.test.native.js +1580 -0
  106. package/dist/esm/fork/__tests__/getPathFromState.test.native.js.map +1 -0
  107. package/dist/esm/fork/__tests__/getStateFromPath.test.js +2706 -0
  108. package/dist/esm/fork/__tests__/getStateFromPath.test.js.map +6 -0
  109. package/dist/esm/fork/__tests__/getStateFromPath.test.mjs +2566 -0
  110. package/dist/esm/fork/__tests__/getStateFromPath.test.mjs.map +1 -0
  111. package/dist/esm/fork/__tests__/getStateFromPath.test.native.js +2636 -0
  112. package/dist/esm/fork/__tests__/getStateFromPath.test.native.js.map +1 -0
  113. package/dist/esm/fork/getPathFromState.js +1 -1
  114. package/dist/esm/fork/getPathFromState.js.map +1 -1
  115. package/dist/esm/fork/getPathFromState.mjs +2 -1
  116. package/dist/esm/fork/getPathFromState.mjs.map +1 -1
  117. package/dist/esm/fork/getPathFromState.native.js +9 -5
  118. package/dist/esm/fork/getPathFromState.native.js.map +1 -1
  119. package/dist/esm/fork/getPathFromState.test.js +123 -0
  120. package/dist/esm/fork/getPathFromState.test.js.map +6 -0
  121. package/dist/esm/fork/getPathFromState.test.mjs +114 -0
  122. package/dist/esm/fork/getPathFromState.test.mjs.map +1 -0
  123. package/dist/esm/fork/getPathFromState.test.native.js +122 -0
  124. package/dist/esm/fork/getPathFromState.test.native.js.map +1 -0
  125. package/dist/esm/fork/getStateFromPath.test.js +294 -0
  126. package/dist/esm/fork/getStateFromPath.test.js.map +6 -0
  127. package/dist/esm/fork/getStateFromPath.test.mjs +230 -0
  128. package/dist/esm/fork/getStateFromPath.test.mjs.map +1 -0
  129. package/dist/esm/fork/getStateFromPath.test.native.js +233 -0
  130. package/dist/esm/fork/getStateFromPath.test.native.js.map +1 -0
  131. package/dist/esm/render.js +1 -1
  132. package/dist/esm/render.js.map +1 -1
  133. package/dist/esm/render.mjs +1 -1
  134. package/dist/esm/render.mjs.map +1 -1
  135. package/dist/esm/router/FlagsContext.js +6 -0
  136. package/dist/esm/router/FlagsContext.js.map +6 -0
  137. package/dist/esm/router/FlagsContext.mjs +4 -0
  138. package/dist/esm/router/FlagsContext.mjs.map +1 -0
  139. package/dist/esm/router/FlagsContext.native.js +4 -0
  140. package/dist/esm/router/FlagsContext.native.js.map +1 -0
  141. package/dist/esm/router/getRoutes.js +11 -1
  142. package/dist/esm/router/getRoutes.js.map +1 -1
  143. package/dist/esm/router/getRoutes.mjs +11 -1
  144. package/dist/esm/router/getRoutes.mjs.map +1 -1
  145. package/dist/esm/router/getRoutes.native.js +11 -1
  146. package/dist/esm/router/getRoutes.native.js.map +1 -1
  147. package/dist/esm/router/matchers.test.js +50 -0
  148. package/dist/esm/router/matchers.test.js.map +6 -0
  149. package/dist/esm/router/matchers.test.mjs +39 -0
  150. package/dist/esm/router/matchers.test.mjs.map +1 -0
  151. package/dist/esm/router/matchers.test.native.js +39 -0
  152. package/dist/esm/router/matchers.test.native.js.map +1 -0
  153. package/dist/esm/router/router.js +1 -26
  154. package/dist/esm/router/router.js.map +1 -1
  155. package/dist/esm/router/router.mjs +1 -33
  156. package/dist/esm/router/router.mjs.map +1 -1
  157. package/dist/esm/router/router.native.js +1 -37
  158. package/dist/esm/router/router.native.js.map +1 -1
  159. package/dist/esm/router/utils/getNavigateAction.js +32 -0
  160. package/dist/esm/router/utils/getNavigateAction.js.map +6 -0
  161. package/dist/esm/router/utils/getNavigateAction.mjs +38 -0
  162. package/dist/esm/router/utils/getNavigateAction.mjs.map +1 -0
  163. package/dist/esm/router/utils/getNavigateAction.native.js +42 -0
  164. package/dist/esm/router/utils/getNavigateAction.native.js.map +1 -0
  165. package/dist/esm/router/utils/getNavigateAction.test.js +296 -0
  166. package/dist/esm/router/utils/getNavigateAction.test.js.map +6 -0
  167. package/dist/esm/router/utils/getNavigateAction.test.mjs +260 -0
  168. package/dist/esm/router/utils/getNavigateAction.test.mjs.map +1 -0
  169. package/dist/esm/router/utils/getNavigateAction.test.native.js +273 -0
  170. package/dist/esm/router/utils/getNavigateAction.test.native.js.map +1 -0
  171. package/dist/esm/testing-utils.js +33 -0
  172. package/dist/esm/testing-utils.js.map +6 -0
  173. package/dist/esm/testing-utils.mjs +27 -0
  174. package/dist/esm/testing-utils.mjs.map +1 -0
  175. package/dist/esm/testing-utils.native.js +38 -0
  176. package/dist/esm/testing-utils.native.js.map +1 -0
  177. package/dist/esm/views/Navigator.js +29 -11
  178. package/dist/esm/views/Navigator.js.map +1 -1
  179. package/dist/esm/views/Navigator.mjs +8 -1
  180. package/dist/esm/views/Navigator.mjs.map +1 -1
  181. package/dist/esm/views/Navigator.native.js +8 -2
  182. package/dist/esm/views/Navigator.native.js.map +1 -1
  183. package/dist/esm/vite/one.js +6 -1
  184. package/dist/esm/vite/one.js.map +1 -1
  185. package/dist/esm/vite/one.mjs +6 -1
  186. package/dist/esm/vite/one.mjs.map +1 -1
  187. package/dist/esm/vite/one.native.js +9 -2
  188. package/dist/esm/vite/one.native.js.map +1 -1
  189. package/dist/esm/vite/plugins/virtualEntryPlugin.js +2 -0
  190. package/dist/esm/vite/plugins/virtualEntryPlugin.js.map +1 -1
  191. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs +2 -0
  192. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs.map +1 -1
  193. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js +2 -0
  194. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  195. package/package.json +13 -10
  196. package/src/Root.tsx +12 -2
  197. package/src/createApp.native.tsx +8 -2
  198. package/src/createApp.tsx +18 -3
  199. package/src/fork/__tests__/README.md +8 -0
  200. package/src/fork/__tests__/getPathFromState.test.tsx +1809 -0
  201. package/src/fork/__tests__/getStateFromPath.test.tsx +3188 -0
  202. package/src/fork/getPathFromState.test.ts +146 -0
  203. package/src/fork/getPathFromState.ts +1 -1
  204. package/src/fork/getStateFromPath.test.ts +345 -0
  205. package/src/render.tsx +3 -3
  206. package/src/router/FlagsContext.ts +4 -0
  207. package/src/router/getRoutes.ts +14 -2
  208. package/src/router/matchers.test.ts +120 -0
  209. package/src/router/router.ts +1 -113
  210. package/src/router/utils/getNavigateAction.test.ts +334 -0
  211. package/src/router/utils/getNavigateAction.ts +120 -0
  212. package/src/testing-utils.ts +56 -0
  213. package/src/views/Navigator.tsx +34 -10
  214. package/src/vite/one.ts +5 -0
  215. package/src/vite/plugins/virtualEntryPlugin.ts +4 -1
  216. package/src/vite/types.ts +18 -0
  217. package/types/Root.d.ts +1 -0
  218. package/types/Root.d.ts.map +1 -1
  219. package/types/createApp.d.ts +2 -0
  220. package/types/createApp.d.ts.map +1 -1
  221. package/types/createApp.native.d.ts +2 -0
  222. package/types/createApp.native.d.ts.map +1 -1
  223. package/types/fork/getPathFromState.test.d.ts +2 -0
  224. package/types/fork/getPathFromState.test.d.ts.map +1 -0
  225. package/types/fork/getStateFromPath.test.d.ts +2 -0
  226. package/types/fork/getStateFromPath.test.d.ts.map +1 -0
  227. package/types/router/FlagsContext.d.ts +3 -0
  228. package/types/router/FlagsContext.d.ts.map +1 -0
  229. package/types/router/getRoutes.d.ts.map +1 -1
  230. package/types/router/matchers.test.d.ts +2 -0
  231. package/types/router/matchers.test.d.ts.map +1 -0
  232. package/types/router/router.d.ts.map +1 -1
  233. package/types/router/utils/getNavigateAction.d.ts +17 -0
  234. package/types/router/utils/getNavigateAction.d.ts.map +1 -0
  235. package/types/router/utils/getNavigateAction.test.d.ts +2 -0
  236. package/types/router/utils/getNavigateAction.test.d.ts.map +1 -0
  237. package/types/testing-utils.d.ts +26 -0
  238. package/types/testing-utils.d.ts.map +1 -0
  239. package/types/views/Navigator.d.ts +1 -1
  240. package/types/views/Navigator.d.ts.map +1 -1
  241. package/types/vite/one.d.ts.map +1 -1
  242. package/types/vite/plugins/virtualEntryPlugin.d.ts +2 -0
  243. package/types/vite/plugins/virtualEntryPlugin.d.ts.map +1 -1
  244. package/types/vite/types.d.ts +16 -0
  245. package/types/vite/types.d.ts.map +1 -1
@@ -0,0 +1,1559 @@
1
+ var import_vitest = require("vitest"), import_getPathFromState = require("../getPathFromState"), import_getStateFromPath = require("../getStateFromPath");
2
+ (0, import_vitest.test)("converts state to path string", () => {
3
+ const state = {
4
+ routes: [
5
+ {
6
+ name: "foo",
7
+ state: {
8
+ index: 1,
9
+ routes: [
10
+ { name: "boo" },
11
+ {
12
+ name: "bar",
13
+ params: { fruit: "apple" },
14
+ state: {
15
+ routes: [
16
+ {
17
+ name: "baz qux",
18
+ params: { author: "jane", valid: !0 }
19
+ }
20
+ ]
21
+ }
22
+ }
23
+ ]
24
+ }
25
+ }
26
+ ]
27
+ }, path = "/foo/bar/baz%20qux?author=jane&valid=true";
28
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)(state)).toBe(path), (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path))).toBe(path);
29
+ });
30
+ (0, import_vitest.test)("converts state to path string with config", () => {
31
+ const path = "/few/bar/sweet/apple/baz/jane?id=x10&valid=true", config = {
32
+ screens: {
33
+ Foo: {
34
+ path: "few",
35
+ screens: {
36
+ Bar: {
37
+ path: "bar/:type/:fruit",
38
+ screens: {
39
+ Baz: {
40
+ path: "baz/:author",
41
+ parse: {
42
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
43
+ id: (id) => Number(id.replace(/^x/, "")),
44
+ valid: Boolean
45
+ },
46
+ stringify: {
47
+ author: (author) => author.toLowerCase(),
48
+ id: (id) => `x${id}`
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ };
57
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
58
+ routes: [
59
+ {
60
+ name: "Foo",
61
+ state: {
62
+ index: 1,
63
+ routes: [
64
+ { name: "boo" },
65
+ {
66
+ name: "Bar",
67
+ params: { fruit: "apple", type: "sweet", avaliable: !1 },
68
+ state: {
69
+ routes: [
70
+ {
71
+ name: "Baz",
72
+ params: {
73
+ author: "Jane",
74
+ id: 10,
75
+ valid: !0
76
+ }
77
+ }
78
+ ]
79
+ }
80
+ }
81
+ ]
82
+ }
83
+ }
84
+ ]
85
+ }, config)).toBe(path), (0, import_vitest.expect)(
86
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
87
+ ).toBe(path);
88
+ });
89
+ (0, import_vitest.test)("prepends trailing slash to path", () => {
90
+ (0, import_vitest.expect)(
91
+ (0, import_getPathFromState.getPathFromState)({
92
+ routes: [
93
+ {
94
+ name: "foo",
95
+ state: {
96
+ routes: [{ name: "bar" }]
97
+ }
98
+ }
99
+ ]
100
+ })
101
+ ).toBe("/foo/bar"), (0, import_vitest.expect)(
102
+ (0, import_getPathFromState.getPathFromState)({
103
+ routes: [
104
+ {
105
+ name: "foo",
106
+ state: {
107
+ routes: [{ name: "bar", path: "foo/bar" }]
108
+ }
109
+ }
110
+ ]
111
+ })
112
+ ).toBe("/foo/bar");
113
+ });
114
+ (0, import_vitest.test)("handles route without param", () => {
115
+ const path = "/foo/bar";
116
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
117
+ routes: [
118
+ {
119
+ name: "foo",
120
+ state: {
121
+ routes: [{ name: "bar" }]
122
+ }
123
+ }
124
+ ]
125
+ })).toBe(path), (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path))).toBe(path);
126
+ });
127
+ (0, import_vitest.test)("doesn't add query param for empty params", () => {
128
+ const path = "/foo";
129
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
130
+ routes: [
131
+ {
132
+ name: "foo",
133
+ params: {}
134
+ }
135
+ ]
136
+ })).toBe(path), (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path))).toBe(path);
137
+ });
138
+ (0, import_vitest.test)("handles state with config with nested screens", () => {
139
+ const path = "/foo/foe/bar/sweet/apple/baz/jane?answer=42&count=10&valid=true", config = {
140
+ screens: {
141
+ Foo: {
142
+ path: "foo",
143
+ screens: {
144
+ Foe: {
145
+ path: "foe",
146
+ screens: {
147
+ Bar: {
148
+ path: "bar/:type/:fruit",
149
+ screens: {
150
+ Baz: {
151
+ path: "baz/:author",
152
+ parse: {
153
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
154
+ count: Number,
155
+ valid: Boolean
156
+ },
157
+ stringify: {
158
+ author: (author) => author.toLowerCase(),
159
+ id: (id) => `x${id}`,
160
+ unknown: (_) => "x"
161
+ }
162
+ }
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ };
171
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
172
+ routes: [
173
+ {
174
+ name: "Foo",
175
+ state: {
176
+ routes: [
177
+ {
178
+ name: "Foe",
179
+ state: {
180
+ routes: [
181
+ {
182
+ name: "Bar",
183
+ params: { fruit: "apple", type: "sweet" },
184
+ state: {
185
+ routes: [
186
+ {
187
+ name: "Baz",
188
+ params: {
189
+ answer: "42",
190
+ author: "Jane",
191
+ count: "10",
192
+ valid: !0
193
+ }
194
+ }
195
+ ]
196
+ }
197
+ }
198
+ ]
199
+ }
200
+ }
201
+ ]
202
+ }
203
+ }
204
+ ]
205
+ }, config)).toBe(path), (0, import_vitest.expect)(
206
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
207
+ ).toBe(path);
208
+ });
209
+ (0, import_vitest.test)("handles state with config with nested screens and exact", () => {
210
+ const path = "/foe/bar/sweet/apple/baz/jane?answer=42&count=10&valid=true", config = {
211
+ screens: {
212
+ Foo: {
213
+ path: "foo",
214
+ screens: {
215
+ Foe: {
216
+ path: "foe",
217
+ exact: !0,
218
+ screens: {
219
+ Bar: {
220
+ path: "bar/:type/:fruit",
221
+ screens: {
222
+ Baz: {
223
+ path: "baz/:author",
224
+ parse: {
225
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
226
+ count: Number,
227
+ valid: Boolean
228
+ },
229
+ stringify: {
230
+ author: (author) => author.toLowerCase(),
231
+ id: (id) => `x${id}`,
232
+ unknown: (_) => "x"
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ };
243
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
244
+ routes: [
245
+ {
246
+ name: "Foo",
247
+ state: {
248
+ routes: [
249
+ {
250
+ name: "Foe",
251
+ state: {
252
+ routes: [
253
+ {
254
+ name: "Bar",
255
+ params: { fruit: "apple", type: "sweet" },
256
+ state: {
257
+ routes: [
258
+ {
259
+ name: "Baz",
260
+ params: {
261
+ answer: "42",
262
+ author: "Jane",
263
+ count: "10",
264
+ valid: !0
265
+ }
266
+ }
267
+ ]
268
+ }
269
+ }
270
+ ]
271
+ }
272
+ }
273
+ ]
274
+ }
275
+ }
276
+ ]
277
+ }, config)).toBe(path), (0, import_vitest.expect)(
278
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
279
+ ).toBe(path);
280
+ });
281
+ (0, import_vitest.test)("handles state with config with nested screens and unused configs", () => {
282
+ const path = "/foo/foe/baz/jane?answer=42&count=10&valid=true", config = {
283
+ screens: {
284
+ Foo: {
285
+ path: "foo",
286
+ screens: {
287
+ Foe: {
288
+ path: "foe",
289
+ screens: {
290
+ Baz: {
291
+ path: "baz/:author",
292
+ parse: {
293
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
294
+ count: Number,
295
+ valid: Boolean
296
+ },
297
+ stringify: {
298
+ author: (author) => author.replace(/^\w/, (c) => c.toLowerCase()),
299
+ unknown: (_) => "x"
300
+ }
301
+ }
302
+ }
303
+ }
304
+ }
305
+ }
306
+ }
307
+ };
308
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
309
+ routes: [
310
+ {
311
+ name: "Foo",
312
+ state: {
313
+ routes: [
314
+ {
315
+ name: "Foe",
316
+ state: {
317
+ routes: [
318
+ {
319
+ name: "Baz",
320
+ params: {
321
+ answer: "42",
322
+ author: "Jane",
323
+ count: 10,
324
+ valid: !0
325
+ }
326
+ }
327
+ ]
328
+ }
329
+ }
330
+ ]
331
+ }
332
+ }
333
+ ]
334
+ }, config)).toBe(path), (0, import_vitest.expect)(
335
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
336
+ ).toBe(path);
337
+ });
338
+ (0, import_vitest.test)("handles state with config with nested screens and unused configs with exact", () => {
339
+ const path = "/foe/baz/jane?answer=42&count=10&valid=true", config = {
340
+ screens: {
341
+ Foo: {
342
+ path: "foo",
343
+ screens: {
344
+ Foe: {
345
+ path: "foe",
346
+ exact: !0,
347
+ screens: {
348
+ Baz: {
349
+ path: "baz/:author",
350
+ parse: {
351
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
352
+ count: Number,
353
+ valid: Boolean
354
+ },
355
+ stringify: {
356
+ author: (author) => author.replace(/^\w/, (c) => c.toLowerCase()),
357
+ unknown: (_) => "x"
358
+ }
359
+ }
360
+ }
361
+ }
362
+ }
363
+ }
364
+ }
365
+ };
366
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
367
+ routes: [
368
+ {
369
+ name: "Foo",
370
+ state: {
371
+ routes: [
372
+ {
373
+ name: "Foe",
374
+ state: {
375
+ routes: [
376
+ {
377
+ name: "Baz",
378
+ params: {
379
+ answer: "42",
380
+ author: "Jane",
381
+ count: 10,
382
+ valid: !0
383
+ }
384
+ }
385
+ ]
386
+ }
387
+ }
388
+ ]
389
+ }
390
+ }
391
+ ]
392
+ }, config)).toBe(path), (0, import_vitest.expect)(
393
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
394
+ ).toBe(path);
395
+ });
396
+ (0, import_vitest.test)("handles nested object with stringify in it", () => {
397
+ const path = "/bar/sweet/apple/foo/bis/jane?answer=42&count=10&valid=true", config = {
398
+ screens: {
399
+ Bar: {
400
+ path: "bar/:type/:fruit",
401
+ screens: {
402
+ Foo: {
403
+ path: "foo",
404
+ screens: {
405
+ Foe: {
406
+ path: "foe"
407
+ },
408
+ Baz: {
409
+ screens: {
410
+ Bos: "bos",
411
+ Bis: {
412
+ path: "bis/:author",
413
+ stringify: {
414
+ author: (author) => author.replace(/^\w/, (c) => c.toLowerCase())
415
+ },
416
+ parse: {
417
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
418
+ count: Number,
419
+ valid: Boolean
420
+ }
421
+ }
422
+ }
423
+ }
424
+ }
425
+ }
426
+ }
427
+ }
428
+ }
429
+ };
430
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
431
+ routes: [
432
+ {
433
+ name: "Bar",
434
+ params: { fruit: "apple", type: "sweet" },
435
+ state: {
436
+ routes: [
437
+ {
438
+ name: "Foo",
439
+ state: {
440
+ routes: [
441
+ {
442
+ name: "Baz",
443
+ state: {
444
+ routes: [
445
+ {
446
+ name: "Bis",
447
+ params: {
448
+ answer: "42",
449
+ author: "Jane",
450
+ count: 10,
451
+ valid: !0
452
+ }
453
+ }
454
+ ]
455
+ }
456
+ }
457
+ ]
458
+ }
459
+ }
460
+ ]
461
+ }
462
+ }
463
+ ]
464
+ }, config)).toBe(path), (0, import_vitest.expect)(
465
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
466
+ ).toBe(path);
467
+ });
468
+ (0, import_vitest.test)("handles nested object with stringify in it with exact", () => {
469
+ const path = "/bis/jane?answer=42&count=10&valid=true", config = {
470
+ screens: {
471
+ Bar: {
472
+ path: "bar/:type/:fruit",
473
+ screens: {
474
+ Foo: {
475
+ path: "foo",
476
+ screens: {
477
+ Foe: {
478
+ path: "foe"
479
+ },
480
+ Baz: {
481
+ path: "baz",
482
+ screens: {
483
+ Bos: "bos",
484
+ Bis: {
485
+ path: "bis/:author",
486
+ exact: !0,
487
+ stringify: {
488
+ author: (author) => author.replace(/^\w/, (c) => c.toLowerCase())
489
+ },
490
+ parse: {
491
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
492
+ count: Number,
493
+ valid: Boolean
494
+ }
495
+ }
496
+ }
497
+ }
498
+ }
499
+ }
500
+ }
501
+ }
502
+ }
503
+ };
504
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
505
+ routes: [
506
+ {
507
+ name: "Bar",
508
+ params: { fruit: "apple", type: "sweet" },
509
+ state: {
510
+ routes: [
511
+ {
512
+ name: "Foo",
513
+ state: {
514
+ routes: [
515
+ {
516
+ name: "Baz",
517
+ state: {
518
+ routes: [
519
+ {
520
+ name: "Bis",
521
+ params: {
522
+ answer: "42",
523
+ author: "Jane",
524
+ count: 10,
525
+ valid: !0
526
+ }
527
+ }
528
+ ]
529
+ }
530
+ }
531
+ ]
532
+ }
533
+ }
534
+ ]
535
+ }
536
+ }
537
+ ]
538
+ }, config)).toBe(path), (0, import_vitest.expect)(
539
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
540
+ ).toBe(path);
541
+ });
542
+ (0, import_vitest.test)("handles nested object for second route depth", () => {
543
+ const path = "/foo/bar/baz", config = {
544
+ screens: {
545
+ Foo: {
546
+ path: "foo",
547
+ screens: {
548
+ Foe: "foe",
549
+ Bar: {
550
+ path: "bar",
551
+ screens: {
552
+ Baz: "baz"
553
+ }
554
+ }
555
+ }
556
+ }
557
+ }
558
+ };
559
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
560
+ routes: [
561
+ {
562
+ name: "Foo",
563
+ state: {
564
+ routes: [
565
+ {
566
+ name: "Bar",
567
+ state: {
568
+ routes: [{ name: "Baz" }]
569
+ }
570
+ }
571
+ ]
572
+ }
573
+ }
574
+ ]
575
+ }, config)).toBe(path), (0, import_vitest.expect)(
576
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
577
+ ).toBe(path);
578
+ });
579
+ (0, import_vitest.test)("handles nested object for second route depth with exact", () => {
580
+ const path = "/baz", config = {
581
+ screens: {
582
+ Foo: {
583
+ path: "foo",
584
+ screens: {
585
+ Foe: "foe",
586
+ Bar: {
587
+ path: "bar",
588
+ screens: {
589
+ Baz: {
590
+ path: "baz",
591
+ exact: !0
592
+ }
593
+ }
594
+ }
595
+ }
596
+ }
597
+ }
598
+ };
599
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
600
+ routes: [
601
+ {
602
+ name: "Foo",
603
+ state: {
604
+ routes: [
605
+ {
606
+ name: "Bar",
607
+ state: {
608
+ routes: [{ name: "Baz" }]
609
+ }
610
+ }
611
+ ]
612
+ }
613
+ }
614
+ ]
615
+ }, config)).toBe(path), (0, import_vitest.expect)(
616
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
617
+ ).toBe(path);
618
+ });
619
+ (0, import_vitest.test)("handles nested object for second route depth and path and stringify in roots", () => {
620
+ const path = "/foo/dathomir/bar/42/baz", config = {
621
+ screens: {
622
+ Foo: {
623
+ path: "foo/:planet",
624
+ stringify: {
625
+ id: (id) => `planet=${id}`
626
+ },
627
+ screens: {
628
+ Foe: "foe",
629
+ Bar: {
630
+ path: "bar/:id",
631
+ parse: {
632
+ id: Number
633
+ },
634
+ screens: {
635
+ Baz: "baz"
636
+ }
637
+ }
638
+ }
639
+ }
640
+ }
641
+ };
642
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
643
+ routes: [
644
+ {
645
+ name: "Foo",
646
+ params: { planet: "dathomir" },
647
+ state: {
648
+ routes: [
649
+ {
650
+ name: "Bar",
651
+ state: {
652
+ routes: [{ name: "Baz", params: { id: 42 } }]
653
+ }
654
+ }
655
+ ]
656
+ }
657
+ }
658
+ ]
659
+ }, config)).toBe(path), (0, import_vitest.expect)(
660
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
661
+ ).toBe(path);
662
+ });
663
+ (0, import_vitest.test)("handles nested object for second route depth and path and stringify in roots with exact", () => {
664
+ const path = "/baz", config = {
665
+ screens: {
666
+ Foo: {
667
+ path: "foo/:id",
668
+ stringify: {
669
+ id: (id) => `id=${id}`
670
+ },
671
+ screens: {
672
+ Foe: "foe",
673
+ Bar: {
674
+ path: "bar/:id",
675
+ stringify: {
676
+ id: (id) => `id=${id}`
677
+ },
678
+ parse: {
679
+ id: Number
680
+ },
681
+ screens: {
682
+ Baz: {
683
+ path: "baz",
684
+ exact: !0
685
+ }
686
+ }
687
+ }
688
+ }
689
+ }
690
+ }
691
+ };
692
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
693
+ routes: [
694
+ {
695
+ name: "Foo",
696
+ state: {
697
+ routes: [
698
+ {
699
+ name: "Bar",
700
+ state: {
701
+ routes: [{ name: "Baz" }]
702
+ }
703
+ }
704
+ ]
705
+ }
706
+ }
707
+ ]
708
+ }, config)).toBe(path), (0, import_vitest.expect)(
709
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
710
+ ).toBe(path);
711
+ });
712
+ (0, import_vitest.test)("ignores empty string paths", () => {
713
+ const path = "/bar", config = {
714
+ screens: {
715
+ Foo: {
716
+ path: "",
717
+ screens: {
718
+ Foe: "foe"
719
+ }
720
+ },
721
+ Bar: "bar"
722
+ }
723
+ };
724
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
725
+ routes: [
726
+ {
727
+ name: "Foo",
728
+ state: {
729
+ routes: [{ name: "Bar" }]
730
+ }
731
+ }
732
+ ]
733
+ }, config)).toBe(path), (0, import_vitest.expect)(
734
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
735
+ ).toBe(path);
736
+ });
737
+ (0, import_vitest.test)("keeps query params if path is empty", () => {
738
+ const path = "/?foo=42", config = {
739
+ screens: {
740
+ Foo: {
741
+ screens: {
742
+ Foe: "foe",
743
+ Bar: {
744
+ screens: {
745
+ Qux: {
746
+ path: "",
747
+ parse: { foo: Number }
748
+ },
749
+ Baz: "baz"
750
+ }
751
+ }
752
+ }
753
+ }
754
+ }
755
+ };
756
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
757
+ routes: [
758
+ {
759
+ name: "Foo",
760
+ state: {
761
+ routes: [
762
+ {
763
+ name: "Bar",
764
+ state: {
765
+ routes: [{ name: "Qux", params: { foo: 42 } }]
766
+ }
767
+ }
768
+ ]
769
+ }
770
+ }
771
+ ]
772
+ }, config)).toBe(path), (0, import_vitest.expect)(
773
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
774
+ ).toEqual(path);
775
+ });
776
+ (0, import_vitest.test)("does not use Object.prototype properties as parsing functions", () => {
777
+ const path = "/?toString=42", config = {
778
+ screens: {
779
+ Foo: {
780
+ screens: {
781
+ Foe: "foe",
782
+ Bar: {
783
+ screens: {
784
+ Qux: {
785
+ path: "",
786
+ parse: {}
787
+ },
788
+ Baz: "baz"
789
+ }
790
+ }
791
+ }
792
+ }
793
+ }
794
+ };
795
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
796
+ routes: [
797
+ {
798
+ name: "Foo",
799
+ state: {
800
+ routes: [
801
+ {
802
+ name: "Bar",
803
+ state: {
804
+ routes: [{ name: "Qux", params: { toString: 42 } }]
805
+ }
806
+ }
807
+ ]
808
+ }
809
+ }
810
+ ]
811
+ }, config)).toBe(path), (0, import_vitest.expect)(
812
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
813
+ ).toEqual(path);
814
+ });
815
+ (0, import_vitest.test)("cuts nested configs too", () => {
816
+ const path = "/foo/baz", config = {
817
+ screens: {
818
+ Foo: {
819
+ path: "foo",
820
+ screens: {
821
+ Bar: {
822
+ path: "",
823
+ screens: {
824
+ Baz: {
825
+ path: "baz"
826
+ }
827
+ }
828
+ }
829
+ }
830
+ }
831
+ }
832
+ };
833
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
834
+ routes: [
835
+ {
836
+ name: "Foo",
837
+ state: {
838
+ routes: [
839
+ {
840
+ name: "Bar",
841
+ state: {
842
+ routes: [{ name: "Baz" }]
843
+ }
844
+ }
845
+ ]
846
+ }
847
+ }
848
+ ]
849
+ }, config)).toBe(path), (0, import_vitest.expect)(
850
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
851
+ ).toBe(path);
852
+ });
853
+ (0, import_vitest.test)("cuts nested configs too with exact", () => {
854
+ const path = "/baz", config = {
855
+ screens: {
856
+ Foo: {
857
+ path: "foo",
858
+ screens: {
859
+ Bar: {
860
+ path: "",
861
+ exact: !0,
862
+ screens: {
863
+ Baz: {
864
+ path: "baz"
865
+ }
866
+ }
867
+ }
868
+ }
869
+ }
870
+ }
871
+ };
872
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
873
+ routes: [
874
+ {
875
+ name: "Foo",
876
+ state: {
877
+ routes: [
878
+ {
879
+ name: "Bar",
880
+ state: {
881
+ routes: [{ name: "Baz" }]
882
+ }
883
+ }
884
+ ]
885
+ }
886
+ }
887
+ ]
888
+ }, config)).toBe(path), (0, import_vitest.expect)(
889
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
890
+ ).toBe(path);
891
+ });
892
+ (0, import_vitest.test)("handles empty path at the end", () => {
893
+ const path = "/foo/bar", config = {
894
+ screens: {
895
+ Foo: {
896
+ path: "foo",
897
+ screens: {
898
+ Bar: "bar"
899
+ }
900
+ },
901
+ Baz: { path: "" }
902
+ }
903
+ };
904
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
905
+ routes: [
906
+ {
907
+ name: "Foo",
908
+ state: {
909
+ routes: [
910
+ {
911
+ name: "Bar",
912
+ state: {
913
+ routes: [{ name: "Baz" }]
914
+ }
915
+ }
916
+ ]
917
+ }
918
+ }
919
+ ]
920
+ }, config)).toBe(path), (0, import_vitest.expect)(
921
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
922
+ ).toBe(path);
923
+ });
924
+ (0, import_vitest.test)('returns "/" for empty path', () => {
925
+ const path = "/", config = {
926
+ screens: {
927
+ Foo: {
928
+ path: "",
929
+ screens: {
930
+ Bar: ""
931
+ }
932
+ }
933
+ }
934
+ };
935
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
936
+ routes: [
937
+ {
938
+ name: "Foo",
939
+ state: {
940
+ routes: [
941
+ {
942
+ name: "Bar"
943
+ }
944
+ ]
945
+ }
946
+ }
947
+ ]
948
+ }, config)).toBe(path), (0, import_vitest.expect)(
949
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
950
+ ).toBe(path);
951
+ });
952
+ (0, import_vitest.test)("parses no path specified", () => {
953
+ const path = "/bar", config = {
954
+ screens: {
955
+ Foo: {
956
+ screens: {
957
+ Foe: {},
958
+ Bar: "bar"
959
+ }
960
+ }
961
+ }
962
+ };
963
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
964
+ routes: [
965
+ {
966
+ name: "Foo",
967
+ state: {
968
+ routes: [{ name: "Bar" }]
969
+ }
970
+ }
971
+ ]
972
+ }, config)).toBe(path), (0, import_vitest.expect)(
973
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
974
+ ).toBe(path);
975
+ });
976
+ (0, import_vitest.test)("strips undefined query params", () => {
977
+ const path = "/bar/sweet/apple/foo/bis/jane?count=10&valid=true", config = {
978
+ screens: {
979
+ Bar: {
980
+ path: "bar/:type/:fruit",
981
+ screens: {
982
+ Foo: {
983
+ path: "foo",
984
+ screens: {
985
+ Foe: {
986
+ path: "foe"
987
+ },
988
+ Baz: {
989
+ screens: {
990
+ Bos: "bos",
991
+ Bis: {
992
+ path: "bis/:author",
993
+ stringify: {
994
+ author: (author) => author.replace(/^\w/, (c) => c.toLowerCase())
995
+ },
996
+ parse: {
997
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
998
+ count: Number,
999
+ valid: Boolean
1000
+ }
1001
+ }
1002
+ }
1003
+ }
1004
+ }
1005
+ }
1006
+ }
1007
+ }
1008
+ }
1009
+ };
1010
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1011
+ routes: [
1012
+ {
1013
+ name: "Bar",
1014
+ params: { fruit: "apple", type: "sweet" },
1015
+ state: {
1016
+ routes: [
1017
+ {
1018
+ name: "Foo",
1019
+ state: {
1020
+ routes: [
1021
+ {
1022
+ name: "Baz",
1023
+ state: {
1024
+ routes: [
1025
+ {
1026
+ name: "Bis",
1027
+ params: {
1028
+ author: "Jane",
1029
+ count: 10,
1030
+ valid: !0
1031
+ }
1032
+ }
1033
+ ]
1034
+ }
1035
+ }
1036
+ ]
1037
+ }
1038
+ }
1039
+ ]
1040
+ }
1041
+ }
1042
+ ]
1043
+ }, config)).toBe(path), (0, import_vitest.expect)(
1044
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1045
+ ).toBe(path);
1046
+ });
1047
+ (0, import_vitest.test)("strips undefined query params with exact", () => {
1048
+ const path = "/bis/jane?count=10&valid=true", config = {
1049
+ screens: {
1050
+ Bar: {
1051
+ path: "bar/:type/:fruit",
1052
+ screens: {
1053
+ Foo: {
1054
+ path: "foo",
1055
+ screens: {
1056
+ Foe: {
1057
+ path: "foe"
1058
+ },
1059
+ Baz: {
1060
+ screens: {
1061
+ Bos: "bos",
1062
+ Bis: {
1063
+ path: "bis/:author",
1064
+ exact: !0,
1065
+ stringify: {
1066
+ author: (author) => author.replace(/^\w/, (c) => c.toLowerCase())
1067
+ },
1068
+ parse: {
1069
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
1070
+ count: Number,
1071
+ valid: Boolean
1072
+ }
1073
+ }
1074
+ }
1075
+ }
1076
+ }
1077
+ }
1078
+ }
1079
+ }
1080
+ }
1081
+ };
1082
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1083
+ routes: [
1084
+ {
1085
+ name: "Bar",
1086
+ params: { fruit: "apple", type: "sweet" },
1087
+ state: {
1088
+ routes: [
1089
+ {
1090
+ name: "Foo",
1091
+ state: {
1092
+ routes: [
1093
+ {
1094
+ name: "Baz",
1095
+ state: {
1096
+ routes: [
1097
+ {
1098
+ name: "Bis",
1099
+ params: {
1100
+ author: "Jane",
1101
+ count: 10,
1102
+ valid: !0
1103
+ }
1104
+ }
1105
+ ]
1106
+ }
1107
+ }
1108
+ ]
1109
+ }
1110
+ }
1111
+ ]
1112
+ }
1113
+ }
1114
+ ]
1115
+ }, config)).toBe(path), (0, import_vitest.expect)(
1116
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1117
+ ).toBe(path);
1118
+ });
1119
+ (0, import_vitest.test)("handles stripping all query params", () => {
1120
+ const path = "/bar/sweet/apple/foo/bis/jane", config = {
1121
+ screens: {
1122
+ Bar: {
1123
+ path: "bar/:type/:fruit",
1124
+ screens: {
1125
+ Foo: {
1126
+ path: "foo",
1127
+ screens: {
1128
+ Foe: {
1129
+ path: "foe"
1130
+ },
1131
+ Baz: {
1132
+ screens: {
1133
+ Bos: "bos",
1134
+ Bis: {
1135
+ path: "bis/:author",
1136
+ stringify: {
1137
+ author: (author) => author.replace(/^\w/, (c) => c.toLowerCase())
1138
+ },
1139
+ parse: {
1140
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
1141
+ count: Number,
1142
+ valid: Boolean
1143
+ }
1144
+ }
1145
+ }
1146
+ }
1147
+ }
1148
+ }
1149
+ }
1150
+ }
1151
+ }
1152
+ };
1153
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1154
+ routes: [
1155
+ {
1156
+ name: "Bar",
1157
+ params: { fruit: "apple", type: "sweet" },
1158
+ state: {
1159
+ routes: [
1160
+ {
1161
+ name: "Foo",
1162
+ state: {
1163
+ routes: [
1164
+ {
1165
+ name: "Baz",
1166
+ state: {
1167
+ routes: [
1168
+ {
1169
+ name: "Bis",
1170
+ params: {
1171
+ author: "Jane"
1172
+ }
1173
+ }
1174
+ ]
1175
+ }
1176
+ }
1177
+ ]
1178
+ }
1179
+ }
1180
+ ]
1181
+ }
1182
+ }
1183
+ ]
1184
+ }, config)).toBe(path), (0, import_vitest.expect)(
1185
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1186
+ ).toBe(path);
1187
+ });
1188
+ (0, import_vitest.test)("handles stripping all query params with exact", () => {
1189
+ const path = "/bis/jane", config = {
1190
+ screens: {
1191
+ Bar: {
1192
+ path: "bar/:type/:fruit",
1193
+ screens: {
1194
+ Foo: {
1195
+ path: "foo",
1196
+ screens: {
1197
+ Foe: {
1198
+ path: "foe"
1199
+ },
1200
+ Baz: {
1201
+ path: "baz",
1202
+ screens: {
1203
+ Bos: "bos",
1204
+ Bis: {
1205
+ path: "bis/:author",
1206
+ exact: !0,
1207
+ stringify: {
1208
+ author: (author) => author.replace(/^\w/, (c) => c.toLowerCase())
1209
+ },
1210
+ parse: {
1211
+ author: (author) => author.replace(/^\w/, (c) => c.toUpperCase()),
1212
+ count: Number,
1213
+ valid: Boolean
1214
+ }
1215
+ }
1216
+ }
1217
+ }
1218
+ }
1219
+ }
1220
+ }
1221
+ }
1222
+ }
1223
+ };
1224
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1225
+ routes: [
1226
+ {
1227
+ name: "Bar",
1228
+ params: { fruit: "apple", type: "sweet" },
1229
+ state: {
1230
+ routes: [
1231
+ {
1232
+ name: "Foo",
1233
+ state: {
1234
+ routes: [
1235
+ {
1236
+ name: "Baz",
1237
+ state: {
1238
+ routes: [
1239
+ {
1240
+ name: "Bis",
1241
+ params: {
1242
+ author: "Jane"
1243
+ }
1244
+ }
1245
+ ]
1246
+ }
1247
+ }
1248
+ ]
1249
+ }
1250
+ }
1251
+ ]
1252
+ }
1253
+ }
1254
+ ]
1255
+ }, config)).toBe(path), (0, import_vitest.expect)(
1256
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1257
+ ).toBe(path);
1258
+ });
1259
+ (0, import_vitest.test)("replaces undefined query params", () => {
1260
+ const path = "/bar/undefined/apple", config = {
1261
+ screens: {
1262
+ Bar: "bar/:type/:fruit"
1263
+ }
1264
+ };
1265
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1266
+ routes: [
1267
+ {
1268
+ name: "Bar",
1269
+ params: { fruit: "apple" }
1270
+ }
1271
+ ]
1272
+ }, config)).toBe(path), (0, import_vitest.expect)(
1273
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1274
+ ).toBe(path);
1275
+ });
1276
+ import_vitest.test.skip("matches wildcard patterns at root", () => {
1277
+ const path = "/test/bar/42/whatever", config = {
1278
+ screens: {
1279
+ 404: "*",
1280
+ Foo: {
1281
+ screens: {
1282
+ Bar: {
1283
+ path: "/bar/:id/"
1284
+ }
1285
+ }
1286
+ }
1287
+ }
1288
+ };
1289
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1290
+ routes: [{ name: "404" }]
1291
+ }, config)).toBe("/404"), (0, import_vitest.expect)(
1292
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1293
+ ).toBe("/404");
1294
+ });
1295
+ import_vitest.test.skip("matches wildcard patterns at nested level", () => {
1296
+ const path = "/bar/42/whatever/baz/initt", config = {
1297
+ screens: {
1298
+ Foo: {
1299
+ screens: {
1300
+ Bar: {
1301
+ path: "/bar/:id/",
1302
+ screens: {
1303
+ 404: "*"
1304
+ }
1305
+ }
1306
+ }
1307
+ }
1308
+ }
1309
+ };
1310
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1311
+ routes: [
1312
+ {
1313
+ name: "Foo",
1314
+ state: {
1315
+ routes: [
1316
+ {
1317
+ name: "Bar",
1318
+ params: { id: "42" },
1319
+ state: {
1320
+ routes: [{ name: "404" }]
1321
+ }
1322
+ }
1323
+ ]
1324
+ }
1325
+ }
1326
+ ]
1327
+ }, config)).toBe("/bar/42/404"), (0, import_vitest.expect)(
1328
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1329
+ ).toBe("/bar/42/404");
1330
+ });
1331
+ import_vitest.test.skip("matches wildcard patterns at nested level with exact", () => {
1332
+ const path = "/whatever", config = {
1333
+ screens: {
1334
+ Foo: {
1335
+ screens: {
1336
+ Bar: {
1337
+ path: "/bar/:id/",
1338
+ screens: {
1339
+ 404: {
1340
+ path: "*",
1341
+ exact: !0
1342
+ }
1343
+ }
1344
+ },
1345
+ Baz: {}
1346
+ }
1347
+ }
1348
+ }
1349
+ };
1350
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1351
+ routes: [
1352
+ {
1353
+ name: "Foo",
1354
+ state: {
1355
+ routes: [
1356
+ {
1357
+ name: "Bar",
1358
+ state: {
1359
+ routes: [{ name: "404" }]
1360
+ }
1361
+ }
1362
+ ]
1363
+ }
1364
+ }
1365
+ ]
1366
+ }, config)).toBe("/404"), (0, import_vitest.expect)(
1367
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1368
+ ).toBe("/404");
1369
+ });
1370
+ (0, import_vitest.test)("tries to match wildcard patterns at the end", () => {
1371
+ const path = "/bar/42/test", config = {
1372
+ screens: {
1373
+ Foo: {
1374
+ screens: {
1375
+ Bar: {
1376
+ path: "/bar/:id/",
1377
+ screens: {
1378
+ 404: "*",
1379
+ Test: "test"
1380
+ }
1381
+ }
1382
+ }
1383
+ }
1384
+ }
1385
+ };
1386
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1387
+ routes: [
1388
+ {
1389
+ name: "Foo",
1390
+ state: {
1391
+ routes: [
1392
+ {
1393
+ name: "Bar",
1394
+ params: { id: "42" },
1395
+ state: {
1396
+ routes: [{ name: "Test" }]
1397
+ }
1398
+ }
1399
+ ]
1400
+ }
1401
+ }
1402
+ ]
1403
+ }, config)).toBe(path), (0, import_vitest.expect)(
1404
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1405
+ ).toBe(path);
1406
+ });
1407
+ import_vitest.test.skip("uses nearest parent wildcard match for unmatched paths", () => {
1408
+ const path = "/bar/42/baz/test", config = {
1409
+ screens: {
1410
+ Foo: {
1411
+ screens: {
1412
+ Bar: {
1413
+ path: "/bar/:id/",
1414
+ screens: {
1415
+ Baz: "baz"
1416
+ }
1417
+ },
1418
+ 404: "*"
1419
+ }
1420
+ }
1421
+ }
1422
+ };
1423
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1424
+ routes: [
1425
+ {
1426
+ name: "Foo",
1427
+ state: {
1428
+ routes: [{ name: "404" }]
1429
+ }
1430
+ }
1431
+ ]
1432
+ }, config)).toBe("/404"), (0, import_vitest.expect)(
1433
+ (0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)
1434
+ ).toBe("/404");
1435
+ });
1436
+ import_vitest.test.skip("handles path at top level", () => {
1437
+ const path = "foo/fruits/apple", config = {
1438
+ path: "foo",
1439
+ screens: {
1440
+ Foo: {
1441
+ screens: {
1442
+ Fruits: "fruits/:fruit"
1443
+ }
1444
+ }
1445
+ }
1446
+ };
1447
+ (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)({
1448
+ routes: [
1449
+ {
1450
+ name: "Foo",
1451
+ state: {
1452
+ routes: [
1453
+ {
1454
+ name: "Fruits",
1455
+ params: { fruit: "apple" }
1456
+ }
1457
+ ]
1458
+ }
1459
+ }
1460
+ ]
1461
+ }, config)).toBe(`/${path}`), (0, import_vitest.expect)((0, import_getPathFromState.getPathFromState)((0, import_getStateFromPath.getStateFromPath)(path, config), config)).toBe(
1462
+ `/${path}`
1463
+ );
1464
+ });
1465
+ import_vitest.test.skip("ignores regexp patterns when provided", () => {
1466
+ const config = {
1467
+ screens: {
1468
+ Foo: {
1469
+ path: "foo/:id(\\d+)",
1470
+ parse: {
1471
+ id: Number
1472
+ }
1473
+ },
1474
+ Bar: {
1475
+ path: "foo/:id([a-z]+)"
1476
+ },
1477
+ Baz: {
1478
+ path: "foo/:id(\\d+)/:name([a-z]+)"
1479
+ },
1480
+ Qux: {
1481
+ path: "foo/:id(@[a-z]+)",
1482
+ stringify: {
1483
+ id: (id) => `@${id}`
1484
+ }
1485
+ }
1486
+ }
1487
+ };
1488
+ (0, import_vitest.expect)(
1489
+ (0, import_getPathFromState.getPathFromState)(
1490
+ {
1491
+ routes: [
1492
+ {
1493
+ name: "Foo",
1494
+ params: { id: 42 }
1495
+ }
1496
+ ]
1497
+ },
1498
+ config
1499
+ )
1500
+ ).toBe("/foo/42"), (0, import_vitest.expect)(
1501
+ (0, import_getPathFromState.getPathFromState)(
1502
+ {
1503
+ routes: [
1504
+ {
1505
+ name: "Bar",
1506
+ params: { id: "bar" }
1507
+ }
1508
+ ]
1509
+ },
1510
+ config
1511
+ )
1512
+ ).toBe("/foo/bar"), (0, import_vitest.expect)(
1513
+ (0, import_getPathFromState.getPathFromState)(
1514
+ {
1515
+ routes: [
1516
+ {
1517
+ name: "Baz",
1518
+ params: { id: 42, name: "bar" }
1519
+ }
1520
+ ]
1521
+ },
1522
+ config
1523
+ )
1524
+ ).toBe("/foo/42/bar"), (0, import_vitest.expect)(
1525
+ (0, import_getPathFromState.getPathFromState)(
1526
+ {
1527
+ routes: [
1528
+ {
1529
+ name: "Qux",
1530
+ params: { id: "bar" }
1531
+ }
1532
+ ]
1533
+ },
1534
+ config
1535
+ )
1536
+ ).toBe("/foo/@bar");
1537
+ });
1538
+ import_vitest.test.skip("correctly handles regex pattern with slash", () => {
1539
+ (0, import_vitest.expect)(
1540
+ (0, import_getPathFromState.getPathFromState)(
1541
+ {
1542
+ routes: [
1543
+ {
1544
+ name: "Foo",
1545
+ params: { id: "bar" }
1546
+ }
1547
+ ]
1548
+ },
1549
+ {
1550
+ screens: {
1551
+ Foo: {
1552
+ path: "foo/:id([a-z]+\\/)"
1553
+ }
1554
+ }
1555
+ }
1556
+ )
1557
+ ).toBe("/foo/bar");
1558
+ });
1559
+ //# sourceMappingURL=getPathFromState.test.js.map