@argon-router/paths 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +24 -1
- package/dist/index.js +159 -152
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";function e(e){return r=>{const n=r.split("/").map(e=>e.trim()).filter(e=>""!==e);let t=null;function a(e,r){t||(t={}),t[e]=r}if(0===e.length)return 0===n.length?{path:r,params:null}:null;for(let i=0;i<e.length;i++){const r=e[i];switch(r.type){case"const":if(r.name!==n.shift())return null;continue;case"parameter":{const{arrayProps:t,genericProps:o,required:s}=r.payload;if(t){const s=[];let l;for(;l=n.shift(),l;){switch(null==o?void 0:o.type){case"number":if(isNaN(+l))return null;s.push(+l);break;case"union":if(!o.items.includes(l))return null;s.push(l);break;default:s.push(l)}if(s.length>=(t.max??1/0))break}if(s.length<(t.min??0))return null;if(n.length>0&&!e[i+1])return null;a(r.name,s);break}const l=n.shift();if(s&&!l)return null;if(!l){a(r.name,void 0);continue}switch(null==o?void 0:o.type){case"number":if(isNaN(+l))return null;a(r.name,+l);break;case"union":if(!o.items.includes(l))return null;a(r.name,l);break;default:a(r.name,l)}}}}return n.length>0?null:{path:r,params:t}}}function r(e){if(!e)return null;const r=e[1];let n,t,a;for(const i of e.slice(2))i&&(i.includes("<")?n=i.replaceAll(/\s/g,"").replace("<","").replace(">",""):(i.includes("{")&&(t=i.replace("{","").replace("}","").split(",").map(e=>parseInt(e))),["*","?","+"].includes(i)&&(a=i)));return{name:r,genericProps:n,arrayProps:t,modificator:a}}function n(e){return r=>{const n=[];if(0===e.length)return"/";for(const t of e)switch(t.type){case"const":n.push(t.name);break;case"parameter":if(!r[t.name])continue;if(Array.isArray(r[t.name]))for(const e of r[t.name])n.push(e.toString());else n.push(r[t.name].toString())}return`/${n.join("/")}`}}Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),exports.compile=function(t){const a=[],i=/:(\w+)(<[\s?\w|]+>)?({\d+\,\d+})?([+*?])?/,o=t.split("/").filter(Boolean);for(let e=0;e<o.length;e++){const n=o[e];if(!n)continue;const s=r(n.match(i));if(!s){a.push({type:"const",name:n,payload:void 0});continue}const{arrayProps:l,genericProps:u,modificator:c,name:p}=s;if(!p)throw new Error(`Invalid path: "${t}". Name for argument must be provided`);const f={type:"parameter",name:p,payload:{required:!0}};switch(u&&"number"===u&&(f.payload.genericProps={type:"number"}),u&&u.includes("|")&&(f.payload.genericProps={type:"union",items:u.split("|")}),c){case"*":f.payload.arrayProps={};break;case"+":f.payload.arrayProps={min:1};break;case"?":f.payload.required=!1}l&&(f.payload.arrayProps={...f.payload.arrayProps,min:l[0],max:l[1]}),a.push(f)}return{parse:e(a),build:n(a)}};
|
package/dist/index.d.ts
CHANGED
|
@@ -37,7 +37,11 @@ export declare type Builder<T> = (params: T) => string;
|
|
|
37
37
|
build: Builder<Params>;
|
|
38
38
|
};
|
|
39
39
|
|
|
40
|
-
declare type GenericType<T extends string> = T extends `number` ? number :
|
|
40
|
+
declare type GenericType<T extends string> = ReplaceAll<T, ' ', ''> extends infer Trimmed ? Trimmed extends `number` ? number : Trimmed extends `${infer A}|${infer B}` ? Union<Trimmed> : Trimmed : never;
|
|
41
|
+
|
|
42
|
+
declare type Join<T extends any[]> = T['length'] extends 0 ? never : T extends [infer F, ...infer Rest] ? Join<Rest> extends infer Tail ? [Tail] extends [never] ? `${F & string}` : `${F & string}/${Tail & string}` : never : never;
|
|
43
|
+
|
|
44
|
+
declare type JoinPath<T extends any[]> = `/${Join<T>}`;
|
|
41
45
|
|
|
42
46
|
declare type Parameter<Name extends string, Payload> = {
|
|
43
47
|
[k in Name]: Payload;
|
|
@@ -84,6 +88,10 @@ export declare type Builder<T> = (params: T) => string;
|
|
|
84
88
|
*/
|
|
85
89
|
export declare type ParseUrlParams<T extends string> = Unwrap<UrlParams<T>>;
|
|
86
90
|
|
|
91
|
+
declare type ReplaceAll<S, From extends string, To extends string> = From extends '' ? S : S extends `${infer R1}${From}${infer R2}` ? `${R1}${To}${ReplaceAll<R2, From, To>}` : S;
|
|
92
|
+
|
|
93
|
+
declare type SplitPath<S> = string extends S ? string[] : S extends `${infer Head}/${infer Tail}` ? Head extends '' ? SplitPath<Tail> : Tail extends '' ? [Head] : [Head, ...SplitPath<Tail>] : [S];
|
|
94
|
+
|
|
87
95
|
declare type Union<T extends string, Result = void> = T extends `${infer Start}|${infer Type}` ? Union<Type, Result extends void ? Start : Result | Start> : Result extends void ? T : Result | T;
|
|
88
96
|
|
|
89
97
|
declare type Unwrap<Result extends UrlParams<any, void>> = {
|
|
@@ -94,6 +102,21 @@ export declare type Builder<T> = (params: T) => string;
|
|
|
94
102
|
|
|
95
103
|
declare type UrlParams<T extends string, Result = void> = T extends `/:${infer Parameter}/${infer Route}` ? Result extends void ? UrlParams<`/${Route}`, UrlParameter<`:${Parameter}`>> : UrlParams<`/${Route}`, Result & UrlParameter<`:${Parameter}`>> : T extends `/:${infer Parameter}` ? Result extends void ? UrlParameter<`:${Parameter}`> : Result & UrlParameter<`:${Parameter}`> : T extends `/${infer Static}/${infer Next}` ? UrlParams<`/${Next}`, Result> : Result;
|
|
96
104
|
|
|
105
|
+
export declare type ValidatePath<Path> = ValidateTokens<Path, SplitPath<Path>>;
|
|
106
|
+
|
|
107
|
+
declare type ValidateRange<Range> = Range extends `${infer L},${infer R}` ? L extends `${number}` ? R extends `${number}` ? ['valid', `{${Range}`] : ['invalid', `{${L},number}`] : R extends `${number}` ? ['invalid', `{number,${R}}`] : ['invalid', `{number,number}`] : ['invalid', `{number,number}`];
|
|
108
|
+
|
|
109
|
+
declare type ValidateToken<Token> = Token extends `:${infer RawParam}` ? RawParam extends `${infer WithoutModifier}${'*' | '?' | '+'}` ? RawParam extends `${WithoutModifier}${infer Modifier}` ? ValidateTokenBase<WithoutModifier, Modifier> : never : ValidateTokenBase<RawParam> : 'valid';
|
|
110
|
+
|
|
111
|
+
declare type ValidateTokenBase<Token extends string, PostFix extends string = ''> = Token extends `${infer Param}<${infer Types}>{${infer Range}}` ? ValidateTypes<Types> extends ['invalid', infer TypesReplacer] ? ['invalid', `:${Param}${TypesReplacer & string}{${Range}}${PostFix}`] : ValidateRange<Range> extends ['invalid', infer RangeReplacer] ? ['invalid', `:${Param}<${Types}>${RangeReplacer & string}${PostFix}`] : 'valid' : Token extends `${infer Param}<${infer Types}>` ? ValidateTypes<Types> extends ['invalid', infer TypesReplacer] ? ['invalid', `:${Param}${TypesReplacer & string}${PostFix}`] : 'valid' : Token extends `${infer Param}{${infer Range}}` ? ValidateRange<Range> extends ['invalid', infer RangeReplacer] ? ['invalid', `:${Param}${RangeReplacer & string}${PostFix}`] : 'valid' : 'valid';
|
|
112
|
+
|
|
113
|
+
declare type ValidateTokens<Path, Current, Res extends string[] = []> = Current extends [infer Token, ...infer Rest] ? ValidateToken<ReplaceAll<Token, ' ', ''>> extends [
|
|
114
|
+
'invalid',
|
|
115
|
+
infer TokenReplacer
|
|
116
|
+
] ? ['invalid', JoinPath<[...Res, TokenReplacer, ...Rest]>] : ValidateTokens<Path, Rest, [...Res, Token & string]> : Path;
|
|
117
|
+
|
|
118
|
+
declare type ValidateTypes<GenTypes> = GenTypes extends 'number' ? 'valid' : GenTypes extends '' ? ['invalid', `<number,union>`] : GenTypes extends string | `${string}|${string}` ? 'valid' : ['invalid', `<number,union>`];
|
|
119
|
+
|
|
97
120
|
declare type WithModificator<Type, T extends string> = T extends `${infer K}{${infer Start},${infer End}}+` ? Type[] : T extends `${infer K}{${infer Start},${infer End}}*` ? Type[] : T extends `${infer K}{${infer Start},${infer End}}?` ? Type[] | undefined : T extends `${infer K}{${infer Start},${infer End}}` ? Type[] : T extends `${infer K}+` ? Type[] : T extends `${infer K}*` ? Type[] : T extends `${infer K}?` ? Type | undefined : Type;
|
|
98
121
|
|
|
99
122
|
declare type WithoutModificator<T extends string> = T extends `${infer K}{${infer Start},${infer End}}${infer Modificator}` ? K : T extends `${infer K}{${infer Start},${infer End}}` ? K : T extends `${infer K}?` ? K : T extends `${infer K}*` ? K : T extends `${infer K}+` ? K : T;
|
package/dist/index.js
CHANGED
|
@@ -1,252 +1,259 @@
|
|
|
1
|
-
function
|
|
2
|
-
return (
|
|
3
|
-
const
|
|
4
|
-
let
|
|
5
|
-
function
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
function prepareParser(tokens) {
|
|
2
|
+
return (input) => {
|
|
3
|
+
const rawTokens = input.split("/").map((part) => part.trim()).filter((part) => part !== "");
|
|
4
|
+
let params = null;
|
|
5
|
+
function setKey(key, value) {
|
|
6
|
+
if (!params) {
|
|
7
|
+
params = {};
|
|
8
|
+
}
|
|
9
|
+
params[key] = value;
|
|
10
|
+
}
|
|
11
|
+
if (tokens.length === 0) {
|
|
12
|
+
return rawTokens.length === 0 ? {
|
|
13
|
+
path: input,
|
|
11
14
|
params: null
|
|
12
15
|
} : null;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
}
|
|
17
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
18
|
+
const token = tokens[i];
|
|
19
|
+
switch (token.type) {
|
|
16
20
|
case "const": {
|
|
17
|
-
if (
|
|
21
|
+
if (token.name !== rawTokens.shift()) {
|
|
18
22
|
return null;
|
|
23
|
+
}
|
|
19
24
|
continue;
|
|
20
25
|
}
|
|
21
26
|
case "parameter": {
|
|
22
27
|
const {
|
|
23
|
-
arrayProps
|
|
24
|
-
genericProps
|
|
25
|
-
required
|
|
26
|
-
} =
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (f = n.shift(), !f)
|
|
28
|
+
arrayProps,
|
|
29
|
+
genericProps,
|
|
30
|
+
required
|
|
31
|
+
} = token.payload;
|
|
32
|
+
if (arrayProps) {
|
|
33
|
+
const array = [];
|
|
34
|
+
let rawToken2;
|
|
35
|
+
while (true) {
|
|
36
|
+
rawToken2 = rawTokens.shift();
|
|
37
|
+
if (!rawToken2) {
|
|
34
38
|
break;
|
|
35
|
-
|
|
39
|
+
}
|
|
40
|
+
switch (genericProps == null ? void 0 : genericProps.type) {
|
|
36
41
|
case "number": {
|
|
37
|
-
if (isNaN(+
|
|
42
|
+
if (isNaN(+rawToken2)) {
|
|
38
43
|
return null;
|
|
39
|
-
|
|
44
|
+
}
|
|
45
|
+
array.push(+rawToken2);
|
|
40
46
|
break;
|
|
41
47
|
}
|
|
42
48
|
case "union": {
|
|
43
|
-
if (!
|
|
49
|
+
if (!genericProps.items.includes(rawToken2)) {
|
|
44
50
|
return null;
|
|
45
|
-
|
|
51
|
+
}
|
|
52
|
+
array.push(rawToken2);
|
|
46
53
|
break;
|
|
47
54
|
}
|
|
48
55
|
default: {
|
|
49
|
-
|
|
56
|
+
array.push(rawToken2);
|
|
50
57
|
break;
|
|
51
58
|
}
|
|
52
59
|
}
|
|
53
|
-
if (
|
|
60
|
+
if (array.length >= (arrayProps.max ?? Infinity)) {
|
|
54
61
|
break;
|
|
62
|
+
}
|
|
55
63
|
}
|
|
56
|
-
if (
|
|
64
|
+
if (array.length < (arrayProps.min ?? 0)) {
|
|
57
65
|
return null;
|
|
58
|
-
|
|
66
|
+
}
|
|
67
|
+
if (rawTokens.length > 0 && !tokens[i + 1]) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
setKey(token.name, array);
|
|
59
71
|
break;
|
|
60
72
|
}
|
|
61
|
-
const
|
|
62
|
-
if (
|
|
73
|
+
const rawToken = rawTokens.shift();
|
|
74
|
+
if (required && !rawToken) {
|
|
63
75
|
return null;
|
|
64
|
-
|
|
65
|
-
|
|
76
|
+
}
|
|
77
|
+
if (!rawToken) {
|
|
78
|
+
setKey(token.name, void 0);
|
|
66
79
|
continue;
|
|
67
80
|
}
|
|
68
|
-
switch (
|
|
81
|
+
switch (genericProps == null ? void 0 : genericProps.type) {
|
|
69
82
|
case "number": {
|
|
70
|
-
if (isNaN(+
|
|
83
|
+
if (isNaN(+rawToken)) {
|
|
71
84
|
return null;
|
|
72
|
-
|
|
85
|
+
}
|
|
86
|
+
setKey(token.name, +rawToken);
|
|
73
87
|
break;
|
|
74
88
|
}
|
|
75
89
|
case "union": {
|
|
76
|
-
if (!
|
|
90
|
+
if (!genericProps.items.includes(rawToken)) {
|
|
77
91
|
return null;
|
|
78
|
-
|
|
92
|
+
}
|
|
93
|
+
setKey(token.name, rawToken);
|
|
79
94
|
break;
|
|
80
95
|
}
|
|
81
96
|
default: {
|
|
82
|
-
|
|
97
|
+
setKey(token.name, rawToken);
|
|
83
98
|
break;
|
|
84
99
|
}
|
|
85
100
|
}
|
|
86
101
|
}
|
|
87
102
|
}
|
|
88
103
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
104
|
+
if (rawTokens.length > 0) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
path: input,
|
|
109
|
+
params
|
|
92
110
|
};
|
|
93
111
|
};
|
|
94
112
|
}
|
|
95
|
-
function
|
|
96
|
-
if (!
|
|
113
|
+
function getTokenParameters(params) {
|
|
114
|
+
if (!params) {
|
|
97
115
|
return null;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
116
|
+
}
|
|
117
|
+
const name = params[1];
|
|
118
|
+
let genericProps;
|
|
119
|
+
let arrayProps;
|
|
120
|
+
let modificator;
|
|
121
|
+
for (const parameter of params.slice(2)) {
|
|
122
|
+
if (!parameter) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (parameter.includes("<")) {
|
|
126
|
+
genericProps = parameter.replaceAll(/\s/g, "").replace("<", "").replace(">", "");
|
|
127
|
+
continue;
|
|
110
128
|
}
|
|
129
|
+
if (parameter.includes("{")) {
|
|
130
|
+
arrayProps = parameter.replace("{", "").replace("}", "").split(",").map((item) => parseInt(item));
|
|
131
|
+
}
|
|
132
|
+
if (["*", "?", "+"].includes(parameter)) {
|
|
133
|
+
modificator = parameter;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
111
137
|
return {
|
|
112
|
-
name
|
|
113
|
-
genericProps
|
|
114
|
-
arrayProps
|
|
115
|
-
modificator
|
|
138
|
+
name,
|
|
139
|
+
genericProps,
|
|
140
|
+
arrayProps,
|
|
141
|
+
modificator
|
|
116
142
|
};
|
|
117
143
|
}
|
|
118
|
-
function
|
|
119
|
-
return (
|
|
120
|
-
const
|
|
121
|
-
if (
|
|
144
|
+
function prepareBuilder(tokens) {
|
|
145
|
+
return (params) => {
|
|
146
|
+
const result = [];
|
|
147
|
+
if (tokens.length === 0) {
|
|
122
148
|
return "/";
|
|
123
|
-
|
|
124
|
-
|
|
149
|
+
}
|
|
150
|
+
for (const token of tokens) {
|
|
151
|
+
switch (token.type) {
|
|
125
152
|
case "const": {
|
|
126
|
-
|
|
153
|
+
result.push(token.name);
|
|
127
154
|
break;
|
|
128
155
|
}
|
|
129
156
|
case "parameter": {
|
|
130
|
-
if (!
|
|
157
|
+
if (!params[token.name]) {
|
|
131
158
|
continue;
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
159
|
+
}
|
|
160
|
+
if (Array.isArray(params[token.name])) {
|
|
161
|
+
for (const param of params[token.name]) {
|
|
162
|
+
result.push(param.toString());
|
|
163
|
+
}
|
|
164
|
+
} else {
|
|
165
|
+
result.push(params[token.name].toString());
|
|
166
|
+
}
|
|
137
167
|
break;
|
|
138
168
|
}
|
|
139
169
|
}
|
|
140
|
-
|
|
170
|
+
}
|
|
171
|
+
return `/${result.join("/")}`;
|
|
141
172
|
};
|
|
142
173
|
}
|
|
143
|
-
function
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
return n;
|
|
152
|
-
}
|
|
153
|
-
function b(e) {
|
|
154
|
-
for (var r = 1; r < arguments.length; r++) {
|
|
155
|
-
var n = arguments[r] != null ? arguments[r] : {};
|
|
156
|
-
r % 2 ? d(Object(n), !0).forEach(function(t) {
|
|
157
|
-
P(e, t, n[t]);
|
|
158
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : d(Object(n)).forEach(function(t) {
|
|
159
|
-
Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
return e;
|
|
163
|
-
}
|
|
164
|
-
function P(e, r, n) {
|
|
165
|
-
return (r = w(r)) in e ? Object.defineProperty(e, r, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = n, e;
|
|
166
|
-
}
|
|
167
|
-
function w(e) {
|
|
168
|
-
var r = k(e, "string");
|
|
169
|
-
return typeof r == "symbol" ? r : r + "";
|
|
170
|
-
}
|
|
171
|
-
function k(e, r) {
|
|
172
|
-
if (typeof e != "object" || !e) return e;
|
|
173
|
-
var n = e[Symbol.toPrimitive];
|
|
174
|
-
if (n !== void 0) {
|
|
175
|
-
var t = n.call(e, r);
|
|
176
|
-
if (typeof t != "object") return t;
|
|
177
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
178
|
-
}
|
|
179
|
-
return (r === "string" ? String : Number)(e);
|
|
180
|
-
}
|
|
181
|
-
function O(e) {
|
|
182
|
-
const r = [], n = /:(\w+)(<[\w|]+>)?({\d+\,\d+})?([+*?])?/, t = e.split("/").filter(Boolean);
|
|
183
|
-
for (let i = 0; i < t.length; i++) {
|
|
184
|
-
const a = t[i];
|
|
185
|
-
if (!a)
|
|
174
|
+
function compile(path) {
|
|
175
|
+
const tokens = [];
|
|
176
|
+
const regexp = /:(\w+)(<[\s?\w|]+>)?({\d+\,\d+})?([+*?])?/;
|
|
177
|
+
const parsedTokens = path.split("/").filter(Boolean);
|
|
178
|
+
for (let i = 0; i < parsedTokens.length; i++) {
|
|
179
|
+
const parsedToken = parsedTokens[i];
|
|
180
|
+
if (!parsedToken) {
|
|
186
181
|
continue;
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
182
|
+
}
|
|
183
|
+
const parameters = getTokenParameters(parsedToken.match(regexp));
|
|
184
|
+
if (!parameters) {
|
|
185
|
+
tokens.push({
|
|
190
186
|
type: "const",
|
|
191
|
-
name:
|
|
187
|
+
name: parsedToken,
|
|
192
188
|
payload: void 0
|
|
193
189
|
});
|
|
194
190
|
continue;
|
|
195
191
|
}
|
|
196
192
|
const {
|
|
197
|
-
arrayProps
|
|
198
|
-
genericProps
|
|
199
|
-
modificator
|
|
200
|
-
name
|
|
201
|
-
} =
|
|
202
|
-
if (!
|
|
203
|
-
throw new Error(
|
|
204
|
-
|
|
193
|
+
arrayProps,
|
|
194
|
+
genericProps,
|
|
195
|
+
modificator,
|
|
196
|
+
name
|
|
197
|
+
} = parameters;
|
|
198
|
+
if (!name) {
|
|
199
|
+
throw new Error(`Invalid path: "${path}". Name for argument must be provided`);
|
|
200
|
+
}
|
|
201
|
+
const token = {
|
|
205
202
|
type: "parameter",
|
|
206
|
-
name
|
|
203
|
+
name,
|
|
207
204
|
payload: {
|
|
208
|
-
required:
|
|
205
|
+
required: true
|
|
209
206
|
}
|
|
210
207
|
};
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
208
|
+
if (genericProps && genericProps === "number") {
|
|
209
|
+
token.payload.genericProps = {
|
|
210
|
+
type: "number"
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
if (genericProps && genericProps.includes("|")) {
|
|
214
|
+
token.payload.genericProps = {
|
|
215
|
+
type: "union",
|
|
216
|
+
items: genericProps.split("|")
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
switch (modificator) {
|
|
217
220
|
case "*": {
|
|
218
|
-
|
|
221
|
+
token.payload.arrayProps = {};
|
|
219
222
|
break;
|
|
220
223
|
}
|
|
221
224
|
case "+": {
|
|
222
|
-
|
|
225
|
+
token.payload.arrayProps = {
|
|
223
226
|
min: 1
|
|
224
227
|
};
|
|
225
228
|
break;
|
|
226
229
|
}
|
|
227
230
|
case "?": {
|
|
228
|
-
|
|
231
|
+
token.payload.required = false;
|
|
229
232
|
break;
|
|
230
233
|
}
|
|
231
234
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
235
|
+
if (arrayProps) {
|
|
236
|
+
token.payload.arrayProps = {
|
|
237
|
+
...token.payload.arrayProps,
|
|
238
|
+
min: arrayProps[0],
|
|
239
|
+
max: arrayProps[1]
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
tokens.push(token);
|
|
236
243
|
}
|
|
237
244
|
return {
|
|
238
245
|
/**
|
|
239
246
|
* @param input Input path
|
|
240
247
|
* @returns `{ path: string; params: Params }` | `null`
|
|
241
248
|
*/
|
|
242
|
-
parse:
|
|
249
|
+
parse: prepareParser(tokens),
|
|
243
250
|
/**
|
|
244
251
|
* @param params Route parameters
|
|
245
252
|
* @returns string
|
|
246
253
|
*/
|
|
247
|
-
build:
|
|
254
|
+
build: prepareBuilder(tokens)
|
|
248
255
|
};
|
|
249
256
|
}
|
|
250
257
|
export {
|
|
251
|
-
|
|
258
|
+
compile
|
|
252
259
|
};
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"registry": "https://registry.npmjs.org/"
|
|
6
6
|
},
|
|
7
7
|
"private": false,
|
|
8
|
-
"version": "0.
|
|
8
|
+
"version": "0.10.0",
|
|
9
9
|
"description": "Paths with power of effector",
|
|
10
10
|
"keywords": [
|
|
11
11
|
"paths",
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"bugs": {
|
|
42
42
|
"url": "https://github.com/movpushmov/argon-router/issues"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "7f8d946c9b6d11a4a828bdf2bafcf012970aa4d7"
|
|
45
45
|
}
|