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