@devp0nt/route0 1.0.0-next.8 → 1.0.0-next.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.test.ts DELETED
@@ -1,206 +0,0 @@
1
- import { describe, expect, expectTypeOf, it } from 'bun:test'
2
- import { Route0 } from './index.js'
3
-
4
- describe('route0', () => {
5
- it('simple', () => {
6
- const route0 = Route0.create('/')
7
- const path = route0.get()
8
- expect(route0).toBeInstanceOf(Route0)
9
- expectTypeOf<typeof path>().toEqualTypeOf<'/'>()
10
- expect(path).toBe('/')
11
- })
12
-
13
- it('simple, callable', () => {
14
- const route0 = Route0.create('/')
15
- const path = route0()
16
- expect(route0).toBeInstanceOf(Route0)
17
- expectTypeOf<typeof path>().toEqualTypeOf<'/'>()
18
- expect(path).toBe('/')
19
- })
20
-
21
- it('simple any query', () => {
22
- const route0 = Route0.create('/')
23
- const path = route0.get({ query: { q: '1' } })
24
- expectTypeOf<typeof path>().toEqualTypeOf<`/?${string}`>()
25
- expect(path).toBe('/?q=1')
26
- })
27
-
28
- it('params', () => {
29
- const route0 = Route0.create('/prefix/:x/some/:y/:z')
30
- const path = route0.get({ x: '1', y: 2, z: '3' })
31
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix/${string}/some/${string}/${string}`>()
32
- expect(path).toBe('/prefix/1/some/2/3')
33
- })
34
-
35
- it('params and any query', () => {
36
- const route0 = Route0.create('/prefix/:x/some/:y/:z')
37
- const path = route0.get({ x: '1', y: 2, z: '3', query: { q: '1' } })
38
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix/${string}/some/${string}/${string}?${string}`>()
39
- expect(path).toBe('/prefix/1/some/2/3?q=1')
40
- })
41
-
42
- it('query', () => {
43
- const route0 = Route0.create('/prefix&y&z')
44
- expectTypeOf<(typeof route0)['queryDefinition']>().toEqualTypeOf<{ y: true; z: true }>()
45
- const path = route0.get({ query: { y: '1', z: '2' } })
46
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix?${string}`>()
47
- expect(path).toBe('/prefix?y=1&z=2')
48
- })
49
-
50
- it('params and query', () => {
51
- const route0 = Route0.create('/prefix/:x/some/:y/:z&z&c')
52
- const path = route0.get({ x: '1', y: '2', z: '3', query: { z: '4', c: '5' } })
53
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix/${string}/some/${string}/${string}?${string}`>()
54
- expect(path).toBe('/prefix/1/some/2/3?z=4&c=5')
55
- })
56
-
57
- it('params and query and any query', () => {
58
- const route0 = Route0.create('/prefix/:x/some/:y/:z&z&c')
59
- const path = route0.get({ x: '1', y: '2', z: '3', query: { z: '4', c: '5', o: '6' } })
60
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix/${string}/some/${string}/${string}?${string}`>()
61
- expect(path).toBe('/prefix/1/some/2/3?z=4&c=5&o=6')
62
- })
63
-
64
- it('simple extend', () => {
65
- const route0 = Route0.create('/prefix')
66
- const route1 = route0.extend('/suffix')
67
- const path = route1.get()
68
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix/suffix`>()
69
- expect(path).toBe('/prefix/suffix')
70
- })
71
-
72
- it('simple extend double slash', () => {
73
- const route0 = Route0.create('/')
74
- const route1 = route0.extend('/suffix1/')
75
- const route2 = route1.extend('/suffix2')
76
- const path = route2.get()
77
- expectTypeOf<typeof path>().toEqualTypeOf<`/suffix1/suffix2`>()
78
- expect(path).toBe('/suffix1/suffix2')
79
- })
80
-
81
- it('simple extend no slash', () => {
82
- const route0 = Route0.create('/')
83
- const route1 = route0.extend('suffix1')
84
- const route2 = route1.extend('suffix2')
85
- const path = route2.get()
86
- expectTypeOf<typeof path>().toEqualTypeOf<`/suffix1/suffix2`>()
87
- expect(path).toBe('/suffix1/suffix2')
88
- })
89
-
90
- it('extend with params', () => {
91
- const route0 = Route0.create('/prefix/:x')
92
- const route1 = route0.extend('/suffix/:y')
93
- const path = route1.get({ x: '1', y: '2' })
94
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix/${string}/suffix/${string}`>()
95
- expect(path).toBe('/prefix/1/suffix/2')
96
- })
97
-
98
- it('extend with search params', () => {
99
- const route0 = Route0.create('/prefix&y&z')
100
- const route1 = route0.extend('/suffix&z&c')
101
- const path = route1.get({ query: { y: '2', c: '3', a: '4' } })
102
- expectTypeOf<(typeof route1)['queryDefinition']>().toEqualTypeOf<{
103
- z: true
104
- c: true
105
- }>()
106
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix/suffix?${string}`>()
107
- expect(path).toBe('/prefix/suffix?y=2&c=3&a=4')
108
- const path1 = route1.get()
109
- expectTypeOf<typeof path1>().toEqualTypeOf<`/prefix/suffix`>()
110
- expect(path1).toBe('/prefix/suffix')
111
- })
112
-
113
- it('extend with params and query', () => {
114
- const route0 = Route0.create('/prefix/:id&y&z')
115
- const route1 = route0.extend('/:sn/suffix&z&c')
116
- const path = route1.get({ id: 'myid', sn: 'mysn', query: { y: '2', c: '3', a: '4' } })
117
- expectTypeOf<(typeof route1)['queryDefinition']>().toEqualTypeOf<{
118
- z: true
119
- c: true
120
- }>()
121
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix/${string}/${string}/suffix?${string}`>()
122
- expect(path).toBe('/prefix/myid/mysn/suffix?y=2&c=3&a=4')
123
- const path1 = route1.get({ id: 'myid', sn: 'mysn' })
124
- expectTypeOf<typeof path1>().toEqualTypeOf<`/prefix/${string}/${string}/suffix`>()
125
- expect(path1).toBe('/prefix/myid/mysn/suffix')
126
- })
127
-
128
- it('extend with params and query, callable', () => {
129
- const route0 = Route0.create('/prefix/:id&y&z')
130
- const route1 = route0.extend('/:sn/suffix&z&c')
131
- const path = route1({ id: 'myid', sn: 'mysn', query: { y: '2', c: '3', a: '4' } })
132
- expectTypeOf<(typeof route1)['queryDefinition']>().toEqualTypeOf<{
133
- z: true
134
- c: true
135
- }>()
136
- expectTypeOf<typeof path>().toEqualTypeOf<`/prefix/${string}/${string}/suffix?${string}`>()
137
- expect(path).toBe('/prefix/myid/mysn/suffix?y=2&c=3&a=4')
138
- const path1 = route1({ id: 'myid', sn: 'mysn' })
139
- expectTypeOf<typeof path1>().toEqualTypeOf<`/prefix/${string}/${string}/suffix`>()
140
- expect(path1).toBe('/prefix/myid/mysn/suffix')
141
- })
142
-
143
- it('abs default', () => {
144
- const route0 = Route0.create('/path')
145
- const path = route0.get({ abs: true })
146
- expectTypeOf<typeof path>().toEqualTypeOf<`${string}/path`>()
147
- expect(path).toBe('https://example.com/path')
148
- })
149
-
150
- it('abs set', () => {
151
- const route0 = Route0.create('/path', { baseUrl: 'https://x.com' })
152
- const path = route0.get({ abs: true })
153
- expectTypeOf<typeof path>().toEqualTypeOf<`${string}/path`>()
154
- expect(path).toBe('https://x.com/path')
155
- })
156
-
157
- it('abs override', () => {
158
- const route0 = Route0.create('/path', { baseUrl: 'https://x.com' })
159
- route0.baseUrl = 'https://y.com'
160
- const path = route0.get({ abs: true })
161
- expectTypeOf<typeof path>().toEqualTypeOf<`${string}/path`>()
162
- expect(path).toBe('https://y.com/path')
163
- })
164
-
165
- it('abs override extend', () => {
166
- const route0 = Route0.create('/path', { baseUrl: 'https://x.com' })
167
- route0.baseUrl = 'https://y.com'
168
- const route1 = route0.extend('/suffix')
169
- const path = route1.get({ abs: true })
170
- expectTypeOf<typeof path>().toEqualTypeOf<`${string}/path/suffix`>()
171
- expect(path).toBe('https://y.com/path/suffix')
172
- })
173
-
174
- it('abs override many', () => {
175
- const route0 = Route0.create('/path', { baseUrl: 'https://x.com' })
176
- const route1 = route0.extend('/suffix')
177
- const routes = {
178
- r0: route0,
179
- r1: route1,
180
- }
181
- const routes2 = Route0.overrideMany(routes, { baseUrl: 'https://z.com' })
182
- const path = routes2.r1.get({ abs: true })
183
- expectTypeOf<typeof path>().toEqualTypeOf<`${string}/path/suffix`>()
184
- expect(path).toBe('https://z.com/path/suffix')
185
- })
186
-
187
- it('type errors: require params when defined', () => {
188
- const rWith = Route0.create('/a/:id')
189
- // @ts-expect-error missing required path params
190
- expect(rWith.get()).toBe('/a/undefined')
191
-
192
- // @ts-expect-error missing required path params
193
- expect(rWith.get({})).toBe('/a/undefined')
194
- // @ts-expect-error missing required path params (object form abs)
195
- expect(rWith.get({ abs: true })).toBe('https://example.com/a/undefined')
196
- // @ts-expect-error missing required path params (object form query)
197
- expect(rWith.get({ query: { q: '1' } })).toBe('/a/undefined?q=1')
198
-
199
- // @ts-expect-error params can not be sent as object value it should be argument
200
- rWith.get({ params: { id: '1' } }) // not throw becouse this will not used
201
-
202
- const rNo = Route0.create('/b')
203
- // @ts-expect-error no path params allowed for this route (shorthand)
204
- expect(rNo.get({ id: '1' })).toBe('/b')
205
- })
206
- })
package/src/index.ts DELETED
@@ -1,365 +0,0 @@
1
- // TODO: use splats in param definition "*"
2
- // TODO: ? check extend for query only .extend('&x&z')
3
- // TODO: .create(route, {useQuery, useParams})
4
- // TODO: Из пас экзакт, из пасвизквери экзает, из чилдрен, из парент, из экзактОр
5
- // TODO: isEqual, isChildren, isParent
6
- // TODO: extractParams, extractQuery
7
- // TODO: getPathDefinition respecting definitionParamPrefix, definitionQueryPrefix
8
- // TODO: prepend
9
- // TODO: Route0.createTree({base:{self: x, children: ...})
10
- // TODO: overrideTree
11
- // TODO: .create(route, {baseUrl, useLocation})
12
- // TODO: ? optional path params as @
13
- // TODO: prependMany, extendMany, overrideMany, with types
14
-
15
- // page0
16
- // TODO: Сделать чисто фронтовую штуку, которая сама вызывает лоадер, сама вызывает нужные мета и title, и отдаёт в компонент нужные штуки
17
-
18
- // ssr0
19
- // TODO: ССР работает просто поверх любого роутера, который поддерживает асинхронную загрузку страниц
20
-
21
- export class Route0<
22
- TPathOriginalDefinition extends string,
23
- TPathDefinition extends Route0._PathDefinition<TPathOriginalDefinition>,
24
- TParamsDefinition extends Route0._ParamsDefinition<TPathOriginalDefinition>,
25
- TQueryDefinition extends Route0._QueryDefinition<TPathOriginalDefinition>,
26
- > {
27
- pathOriginalDefinition: TPathOriginalDefinition
28
- private readonly pathDefinition: TPathDefinition
29
- paramsDefinition: TParamsDefinition
30
- queryDefinition: TQueryDefinition
31
- baseUrl: string
32
-
33
- private constructor(definition: TPathOriginalDefinition, config: Route0.RouteConfigInput = {}) {
34
- this.pathOriginalDefinition = definition
35
- this.pathDefinition = Route0._getPathDefinitionByOriginalDefinition(definition) as TPathDefinition
36
- this.paramsDefinition = Route0._getParamsDefinitionByRouteDefinition(definition) as TParamsDefinition
37
- this.queryDefinition = Route0._getQueryDefinitionByRouteDefinition(definition) as TQueryDefinition
38
-
39
- const { baseUrl } = config
40
- if (baseUrl && typeof baseUrl === 'string' && baseUrl.length) {
41
- this.baseUrl = baseUrl
42
- } else {
43
- const g = globalThis as unknown as { location?: { origin?: string } }
44
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
45
- if (g?.location?.origin) {
46
- this.baseUrl = g.location.origin
47
- } else {
48
- this.baseUrl = 'https://example.com'
49
- }
50
- }
51
- }
52
-
53
- static create<
54
- TPathOriginalDefinition extends string,
55
- TPathDefinition extends Route0._PathDefinition<TPathOriginalDefinition>,
56
- TParamsDefinition extends Route0._ParamsDefinition<TPathOriginalDefinition>,
57
- TQueryDefinition extends Route0._QueryDefinition<TPathOriginalDefinition>,
58
- >(
59
- definition: TPathOriginalDefinition,
60
- config?: Route0.RouteConfigInput,
61
- ): Route0.Callable<Route0<TPathOriginalDefinition, TPathDefinition, TParamsDefinition, TQueryDefinition>> {
62
- const original = new Route0<TPathOriginalDefinition, TPathDefinition, TParamsDefinition, TQueryDefinition>(
63
- definition,
64
- config,
65
- )
66
- const callable = original.get.bind(original)
67
- const proxy = new Proxy(callable, {
68
- get(_target, prop, receiver) {
69
- const value = (original as any)[prop]
70
- if (typeof value === 'function') {
71
- return value.bind(original)
72
- }
73
- return value
74
- },
75
- set(_target, prop, value, receiver) {
76
- ;(original as any)[prop] = value
77
- return true
78
- },
79
- has(_target, prop) {
80
- return prop in original
81
- },
82
- })
83
- Object.setPrototypeOf(proxy, Route0.prototype)
84
- return proxy as never
85
- }
86
-
87
- private static _splitPathDefinitionAndQueryTailDefinition(pathOriginalDefinition: string) {
88
- const i = pathOriginalDefinition.indexOf('&')
89
- if (i === -1) return { pathDefinition: pathOriginalDefinition, queryTailDefinition: '' }
90
- return {
91
- pathDefinition: pathOriginalDefinition.slice(0, i),
92
- queryTailDefinition: pathOriginalDefinition.slice(i),
93
- }
94
- }
95
-
96
- private static _getAbsPath(baseUrl: string, pathWithQuery: string) {
97
- return new URL(pathWithQuery, baseUrl).toString().replace(/\/$/, '')
98
- }
99
-
100
- private static _getPathDefinitionByOriginalDefinition<TPathOriginalDefinition extends string>(
101
- pathOriginalDefinition: TPathOriginalDefinition,
102
- ) {
103
- const { pathDefinition } = Route0._splitPathDefinitionAndQueryTailDefinition(pathOriginalDefinition)
104
- return pathDefinition as Route0._PathDefinition<TPathOriginalDefinition>
105
- }
106
-
107
- private static _getParamsDefinitionByRouteDefinition<TPathOriginalDefinition extends string>(
108
- pathOriginalDefinition: TPathOriginalDefinition,
109
- ) {
110
- const { pathDefinition } = Route0._splitPathDefinitionAndQueryTailDefinition(pathOriginalDefinition)
111
- const matches = Array.from(pathDefinition.matchAll(/:([A-Za-z0-9_]+)/g))
112
- const paramsDefinition = Object.fromEntries(matches.map((m) => [m[1], true]))
113
- return paramsDefinition as Route0._ParamsDefinition<TPathOriginalDefinition>
114
- }
115
-
116
- private static _getQueryDefinitionByRouteDefinition<TPathOriginalDefinition extends string>(
117
- pathOriginalDefinition: TPathOriginalDefinition,
118
- ) {
119
- const { queryTailDefinition } = Route0._splitPathDefinitionAndQueryTailDefinition(pathOriginalDefinition)
120
- if (!queryTailDefinition) {
121
- return {} as Route0._QueryDefinition<TPathOriginalDefinition>
122
- }
123
- const keys = queryTailDefinition.split('&').map(Boolean)
124
- const queryDefinition = Object.fromEntries(keys.map((k) => [k, true]))
125
- return queryDefinition as Route0._QueryDefinition<TPathOriginalDefinition>
126
- }
127
-
128
- static overrideMany<T extends Record<string, Route0<any, any, any, any>>>(
129
- routes: T,
130
- config: Route0.RouteConfigInput,
131
- ): T {
132
- const result = {} as T
133
- for (const [key, value] of Object.entries(routes)) {
134
- ;(result as any)[key] = value.clone(config)
135
- }
136
- return result
137
- }
138
-
139
- extend<TSuffixDefinition extends string>(
140
- suffixDefinition: TSuffixDefinition,
141
- ): Route0.Callable<
142
- Route0<
143
- Route0._RoutePathOriginalDefinitionExtended<TPathOriginalDefinition, TSuffixDefinition>,
144
- Route0._PathDefinition<Route0._RoutePathOriginalDefinitionExtended<TPathOriginalDefinition, TSuffixDefinition>>,
145
- Route0._ParamsDefinition<Route0._RoutePathOriginalDefinitionExtended<TPathOriginalDefinition, TSuffixDefinition>>,
146
- Route0._QueryDefinition<Route0._RoutePathOriginalDefinitionExtended<TPathOriginalDefinition, TSuffixDefinition>>
147
- >
148
- > {
149
- const { pathDefinition: parentPathDefinition } = Route0._splitPathDefinitionAndQueryTailDefinition(
150
- this.pathOriginalDefinition,
151
- )
152
- const { pathDefinition: suffixPathDefinition, queryTailDefinition: suffixQueryTailDefinition } =
153
- Route0._splitPathDefinitionAndQueryTailDefinition(suffixDefinition)
154
- const pathDefinition = `${parentPathDefinition}/${suffixPathDefinition}`.replace(/\/{2,}/g, '/')
155
- const pathOriginalDefinition =
156
- `${pathDefinition}${suffixQueryTailDefinition}` as Route0._RoutePathOriginalDefinitionExtended<
157
- TPathOriginalDefinition,
158
- TSuffixDefinition
159
- >
160
- return Route0.create<
161
- Route0._RoutePathOriginalDefinitionExtended<TPathOriginalDefinition, TSuffixDefinition>,
162
- Route0._PathDefinition<Route0._RoutePathOriginalDefinitionExtended<TPathOriginalDefinition, TSuffixDefinition>>,
163
- Route0._ParamsDefinition<Route0._RoutePathOriginalDefinitionExtended<TPathOriginalDefinition, TSuffixDefinition>>,
164
- Route0._QueryDefinition<Route0._RoutePathOriginalDefinitionExtended<TPathOriginalDefinition, TSuffixDefinition>>
165
- >(pathOriginalDefinition, { baseUrl: this.baseUrl })
166
- }
167
-
168
- // has params
169
- get(
170
- input: Route0._OnlyIfHasParams<
171
- TParamsDefinition,
172
- Route0._WithParamsInput<TParamsDefinition, { query?: undefined; abs?: false }>
173
- >,
174
- ): Route0._OnlyIfHasParams<TParamsDefinition, Route0._PathOnlyRouteValue<TPathOriginalDefinition>>
175
- get(
176
- input: Route0._OnlyIfHasParams<
177
- TParamsDefinition,
178
- Route0._WithParamsInput<TParamsDefinition, { query: Route0._QueryInput<TQueryDefinition>; abs?: false }>
179
- >,
180
- ): Route0._OnlyIfHasParams<TParamsDefinition, Route0._WithQueryRouteValue<TPathOriginalDefinition>>
181
- get(
182
- input: Route0._OnlyIfHasParams<
183
- TParamsDefinition,
184
- Route0._WithParamsInput<TParamsDefinition, { query?: undefined; abs: true }>
185
- >,
186
- ): Route0._OnlyIfHasParams<TParamsDefinition, Route0._AbsolutePathOnlyRouteValue<TPathOriginalDefinition>>
187
- get(
188
- input: Route0._OnlyIfHasParams<
189
- TParamsDefinition,
190
- Route0._WithParamsInput<TParamsDefinition, { query: Route0._QueryInput<TQueryDefinition>; abs: true }>
191
- >,
192
- ): Route0._OnlyIfHasParams<TParamsDefinition, Route0._AbsoluteWithQueryRouteValue<TPathOriginalDefinition>>
193
-
194
- // no params
195
- get(
196
- ...args: Route0._OnlyIfNoParams<TParamsDefinition, [], [never]>
197
- ): Route0._PathOnlyRouteValue<TPathOriginalDefinition>
198
- get(
199
- input: Route0._OnlyIfNoParams<TParamsDefinition, { query?: undefined; abs?: false }>,
200
- ): Route0._OnlyIfNoParams<TParamsDefinition, Route0._PathOnlyRouteValue<TPathOriginalDefinition>>
201
- get(
202
- input: Route0._OnlyIfNoParams<TParamsDefinition, { query: Route0._QueryInput<TQueryDefinition>; abs?: false }>,
203
- ): Route0._OnlyIfNoParams<TParamsDefinition, Route0._WithQueryRouteValue<TPathOriginalDefinition>>
204
- get(
205
- input: Route0._OnlyIfNoParams<TParamsDefinition, { query?: undefined; abs: true }>,
206
- ): Route0._OnlyIfNoParams<TParamsDefinition, Route0._AbsolutePathOnlyRouteValue<TPathOriginalDefinition>>
207
- get(
208
- input: Route0._OnlyIfNoParams<TParamsDefinition, { query: Route0._QueryInput<TQueryDefinition>; abs: true }>,
209
- ): Route0._OnlyIfNoParams<TParamsDefinition, Route0._AbsoluteWithQueryRouteValue<TPathOriginalDefinition>>
210
-
211
- // implementation
212
- get(...args: any[]): string {
213
- const { queryInput, paramsInput, absInput } = ((): {
214
- queryInput: Record<string, string | number>
215
- paramsInput: Record<string, string | number>
216
- absInput: boolean
217
- } => {
218
- if (args.length === 0) {
219
- return { queryInput: {}, paramsInput: {}, absInput: false }
220
- }
221
- const input = args[0]
222
- if (typeof input !== 'object' || input === null) {
223
- // throw new Error("Invalid get route input: expected object")
224
- return { queryInput: {}, paramsInput: {}, absInput: false }
225
- }
226
- const { query, abs, ...params } = input
227
- return { queryInput: query || {}, paramsInput: params, absInput: abs ?? false }
228
- })()
229
-
230
- // validate params
231
- const neededParamsKeys = Object.keys(this.paramsDefinition)
232
- const providedParamsKeys = Object.keys(paramsInput)
233
- const notProvidedKeys = neededParamsKeys.filter((k) => !providedParamsKeys.includes(k))
234
- if (notProvidedKeys.length) {
235
- // throw new Error(`Missing params: not defined keys ${notProvidedKeys.map((k) => `"${k}"`).join(", ")}.`)
236
- Object.assign(paramsInput, Object.fromEntries(notProvidedKeys.map((k) => [k, 'undefined'])))
237
- }
238
-
239
- // create url
240
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-conversion
241
- let url = String(this.pathDefinition)
242
- // replace params
243
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
244
- url = url.replace(/:([A-Za-z0-9_]+)/g, (_m, k) => encodeURIComponent(String(paramsInput?.[k] ?? '')))
245
- // query params
246
- const queryInputStringified = Object.fromEntries(Object.entries(queryInput).map(([k, v]) => [k, String(v)]))
247
- url = [url, new URLSearchParams(queryInputStringified).toString()].filter(Boolean).join('?')
248
- // dedupe slashes
249
- url = url.replace(/\/{2,}/g, '/')
250
- // absolute
251
- url = absInput ? Route0._getAbsPath(this.baseUrl, url) : url
252
-
253
- return url
254
- }
255
-
256
- getDefinition() {
257
- return this.pathDefinition
258
- }
259
-
260
- clone(config?: Route0.RouteConfigInput) {
261
- return new Route0(this.pathOriginalDefinition, config)
262
- }
263
- }
264
-
265
- export namespace Route0 {
266
- export type Callable<T extends Route0<any, any, any, any>> = T & T['get']
267
- export type RouteConfigInput = {
268
- baseUrl?: string
269
- }
270
- export type Params<TRoute0 extends Route0<any, any, any, any>> = {
271
- [K in keyof TRoute0['paramsDefinition']]: string
272
- }
273
- export type Query<TRoute0 extends Route0<any, any, any, any>> = Partial<
274
- {
275
- [K in keyof TRoute0['queryDefinition']]: string | undefined
276
- } & Record<string, string | undefined>
277
- >
278
-
279
- export type _TrimQueryTailDefinition<S extends string> = S extends `${infer P}&${string}` ? P : S
280
- export type _QueryTailDefinitionWithoutFirstAmp<S extends string> = S extends `${string}&${infer T}` ? T : ''
281
- export type _QueryTailDefinitionWithFirstAmp<S extends string> = S extends `${string}&${infer T}` ? `&${T}` : ''
282
- export type _AmpSplit<S extends string> = S extends `${infer A}&${infer B}` ? A | _AmpSplit<B> : S
283
- // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
284
- export type _NonEmpty<T> = [T] extends ['' | never] ? never : T
285
- export type _ExtractPathParams<S extends string> = S extends `${string}:${infer After}`
286
- ? After extends `${infer Name}/${infer Rest}`
287
- ? Name | _ExtractPathParams<`/${Rest}`>
288
- : After
289
- : never
290
- export type _ReplacePathParams<S extends string> = S extends `${infer Head}:${infer Tail}`
291
- ? // eslint-disable-next-line @typescript-eslint/no-unused-vars
292
- Tail extends `${infer _Param}/${infer Rest}`
293
- ? _ReplacePathParams<`${Head}${string}/${Rest}`>
294
- : `${Head}${string}`
295
- : S
296
- export type _DedupeSlashes<S extends string> = S extends `${infer A}//${infer B}` ? _DedupeSlashes<`${A}/${B}`> : S
297
- export type _EmptyRecord = Record<never, never>
298
- export type _JoinPath<Parent extends string, Suffix extends string> = _DedupeSlashes<
299
- _PathDefinition<Parent> extends infer A extends string
300
- ? _PathDefinition<Suffix> extends infer B extends string
301
- ? A extends ''
302
- ? B extends ''
303
- ? ''
304
- : B extends `/${string}`
305
- ? B
306
- : `/${B}`
307
- : B extends ''
308
- ? A
309
- : A extends `${string}/`
310
- ? `${A}${B}`
311
- : B extends `/${string}`
312
- ? `${A}${B}`
313
- : `${A}/${B}`
314
- : never
315
- : never
316
- >
317
-
318
- export type _OnlyIfNoParams<TParams extends object, Yes, No = never> = keyof TParams extends never ? Yes : No
319
- export type _OnlyIfHasParams<TParams extends object, Yes, No = never> = keyof TParams extends never ? No : Yes
320
-
321
- export type _PathDefinition<TPathOriginalDefinition extends string> =
322
- _TrimQueryTailDefinition<TPathOriginalDefinition>
323
- export type _ParamsDefinition<TPathOriginalDefinition extends string> =
324
- _ExtractPathParams<_PathDefinition<TPathOriginalDefinition>> extends infer U
325
- ? [U] extends [never]
326
- ? _EmptyRecord
327
- : { [K in Extract<U, string>]: true }
328
- : _EmptyRecord
329
- export type _QueryDefinition<TPathOriginalDefinition extends string> =
330
- _NonEmpty<_QueryTailDefinitionWithoutFirstAmp<TPathOriginalDefinition>> extends infer Tail extends string
331
- ? _AmpSplit<Tail> extends infer U
332
- ? [U] extends [never]
333
- ? _EmptyRecord
334
- : { [K in Extract<U, string>]: true }
335
- : _EmptyRecord
336
- : _EmptyRecord
337
- export type _RoutePathOriginalDefinitionExtended<
338
- TSourcePathOriginalDefinition extends string,
339
- TSuffixPathOriginalDefinition extends string,
340
- > = `${_JoinPath<TSourcePathOriginalDefinition, TSuffixPathOriginalDefinition>}${_QueryTailDefinitionWithFirstAmp<TSuffixPathOriginalDefinition>}`
341
-
342
- export type _ParamsInput<TParamsDefinition extends object> = {
343
- [K in keyof TParamsDefinition]: string | number
344
- }
345
- export type _QueryInput<TQueryDefinition extends object> = Partial<{
346
- [K in keyof TQueryDefinition]: string | number
347
- }> &
348
- Record<string, string | number>
349
- export type _WithParamsInput<
350
- TParamsDefinition extends object,
351
- T extends {
352
- query?: _QueryInput<any>
353
- abs?: boolean
354
- },
355
- > = _ParamsInput<TParamsDefinition> & T
356
-
357
- export type _PathOnlyRouteValue<TPathOriginalDefinition extends string> =
358
- `${_ReplacePathParams<_PathDefinition<TPathOriginalDefinition>>}`
359
- export type _WithQueryRouteValue<TPathOriginalDefinition extends string> =
360
- `${_ReplacePathParams<_PathDefinition<TPathOriginalDefinition>>}?${string}`
361
- export type _AbsolutePathOnlyRouteValue<TPathOriginalDefinition extends string> =
362
- `${string}${_PathOnlyRouteValue<TPathOriginalDefinition>}`
363
- export type _AbsoluteWithQueryRouteValue<TPathOriginalDefinition extends string> =
364
- `${string}${_WithQueryRouteValue<TPathOriginalDefinition>}`
365
- }