crelte 0.5.13 → 0.5.14
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/queries/Queries.d.ts +3 -0
- package/dist/queries/Queries.d.ts.map +1 -1
- package/dist/queries/Queries.js +3 -0
- package/dist/queries/index.d.ts +21 -0
- package/dist/queries/index.d.ts.map +1 -1
- package/dist/queries/vars.d.ts +25 -2
- package/dist/queries/vars.d.ts.map +1 -1
- package/dist/queries/vars.js +42 -1
- package/dist/routing/route/BaseRoute.d.ts.map +1 -1
- package/dist/routing/route/BaseRoute.js +4 -17
- package/dist/server/queries/QueryGqlRoute.d.ts +3 -1
- package/dist/server/queries/QueryGqlRoute.d.ts.map +1 -1
- package/dist/server/queries/QueryGqlRoute.js +4 -2
- package/dist/server/queries/QueryHandleRoute.d.ts +3 -2
- package/dist/server/queries/QueryHandleRoute.d.ts.map +1 -1
- package/dist/server/queries/QueryHandleRoute.js +4 -2
- package/dist/server/queries/queries.d.ts.map +1 -1
- package/dist/server/queries/queries.js +12 -2
- package/dist/server/queries/routes.d.ts +3 -2
- package/dist/server/queries/routes.d.ts.map +1 -1
- package/dist/server/queries/routes.js +9 -3
- package/dist/std/index.d.ts +1 -0
- package/dist/std/index.d.ts.map +1 -1
- package/dist/std/index.js +1 -0
- package/dist/std/url/index.d.ts +40 -0
- package/dist/std/url/index.d.ts.map +1 -0
- package/dist/std/url/index.js +65 -0
- package/dist/std/url/utils.d.ts +19 -0
- package/dist/std/url/utils.d.ts.map +1 -0
- package/dist/std/url/utils.js +40 -0
- package/dist/vite/index.js +3 -2
- package/package.json +5 -1
- package/src/queries/Queries.ts +3 -0
- package/src/queries/index.ts +25 -0
- package/src/queries/vars.ts +58 -3
- package/src/routing/route/BaseRoute.ts +8 -22
- package/src/server/queries/QueryGqlRoute.ts +17 -2
- package/src/server/queries/QueryHandleRoute.ts +5 -2
- package/src/server/queries/queries.ts +29 -3
- package/src/server/queries/routes.ts +17 -3
- package/src/std/index.ts +1 -0
- package/src/std/url/index.ts +78 -0
- package/src/std/url/utils.ts +48 -0
- package/src/vite/index.ts +4 -2
|
@@ -41,6 +41,9 @@ export type NamedQuery = {
|
|
|
41
41
|
* Create a NamedQuery for the given server query name.
|
|
42
42
|
*
|
|
43
43
|
* Prefer importing a graphql file instead.
|
|
44
|
+
*
|
|
45
|
+
* #### Note
|
|
46
|
+
* This needs to match the name of the js/ts file.
|
|
44
47
|
*/
|
|
45
48
|
export declare function namedQuery(name: string): NamedQuery;
|
|
46
49
|
/** Returns true if the passed object is a GraphQlQuery */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Queries.d.ts","sourceRoot":"","sources":["../../src/queries/Queries.ts"],"names":[],"mappings":"AAAA,OAAO,QAAwC,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAa,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAE7C;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C
|
|
1
|
+
{"version":3,"file":"Queries.d.ts","sourceRoot":"","sources":["../../src/queries/Queries.ts"],"names":[],"mappings":"AAAA,OAAO,QAAwC,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAa,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAE7C;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAI9C;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG;IAC1B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAAgC;IAE7C,OAAO,CAAC,OAAO,CAAiB;IAEhC,OAAO;IAUP;;;;;;;;OAQG;IACH,MAAM,CAAC,GAAG,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,QAAQ,GAAE,QAAyB,EACnC,IAAI,GAAE,cAAmB,GACvB,OAAO;IAQV;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO;IAQnE;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,KAAK,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,IAAI,GAAE,YAAiB,GACrB,OAAO,CAAC,OAAO,CAAC;IA0BnB;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO;CAGxB"}
|
package/dist/queries/Queries.js
CHANGED
|
@@ -4,6 +4,9 @@ import QueryError from './QueryError.js';
|
|
|
4
4
|
* Create a NamedQuery for the given server query name.
|
|
5
5
|
*
|
|
6
6
|
* Prefer importing a graphql file instead.
|
|
7
|
+
*
|
|
8
|
+
* #### Note
|
|
9
|
+
* This needs to match the name of the js/ts file.
|
|
7
10
|
*/
|
|
8
11
|
export function namedQuery(name) {
|
|
9
12
|
return { queryName: name };
|
package/dist/queries/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Queries, { InlineQuery, isQuery, namedQuery, NamedQuery, QueriesOptions, Query, QueryOptions } from '../queries/Queries.js';
|
|
2
2
|
import type CrelteServerRequest from '../server/CrelteServer.js';
|
|
3
|
+
import ServerRouter from '../server/ServerRouter.js';
|
|
3
4
|
import { gql } from './gql.js';
|
|
4
5
|
import QueryError, { QueryErrorResponse } from './QueryError.js';
|
|
5
6
|
import { QueryVar, ValidIf, vars, varsIdsEqual } from './vars.js';
|
|
@@ -10,6 +11,26 @@ export type InferQueryVarType<T> = T extends QueryVar<infer U> ? U : never;
|
|
|
10
11
|
export type InferVariableTypes<T> = {
|
|
11
12
|
[K in keyof T]: InferQueryVarType<T[K]>;
|
|
12
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* Defines wether the query variables are valid.
|
|
16
|
+
*
|
|
17
|
+
* Either throw or return a boolean.
|
|
18
|
+
*
|
|
19
|
+
* #### Example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { vars, ValidVars } from 'crelte/queries';
|
|
22
|
+
*
|
|
23
|
+
* export const variables = {
|
|
24
|
+
* siteId: vars.siteId(),
|
|
25
|
+
* category: vars.id()
|
|
26
|
+
* };
|
|
27
|
+
*
|
|
28
|
+
* export const validVars: ValidVars<typeof variables> = (vars, sr) => {
|
|
29
|
+
* if (!vars.category === 5) throw new Error('category needs to be 5');
|
|
30
|
+
* };
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export type ValidVars<T extends Record<string, QueryVar<any>>> = (vars: InferVariableTypes<T>, sr: ServerRouter) => void | boolean;
|
|
13
34
|
/**
|
|
14
35
|
* Defines when a query can safely be cached.
|
|
15
36
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queries/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queries/index.ts"],"names":[],"mappings":"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"}
|
package/dist/queries/vars.d.ts
CHANGED
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
import ServerRouter from '../server/ServerRouter.js';
|
|
2
2
|
export declare const vars: {
|
|
3
|
+
/**
|
|
4
|
+
* Any is not validated except for nullability
|
|
5
|
+
*/
|
|
3
6
|
any: () => QueryVar<any>;
|
|
7
|
+
/**
|
|
8
|
+
* Number is a number, but will also parse strings to numbers
|
|
9
|
+
*/
|
|
4
10
|
number: () => QueryVar<number>;
|
|
11
|
+
/**
|
|
12
|
+
* String is a string, but will not parse numbers to strings
|
|
13
|
+
*/
|
|
5
14
|
string: () => QueryVar<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Strings is an array of strings, but will also convert a single string to
|
|
17
|
+
* an array with one element
|
|
18
|
+
*
|
|
19
|
+
* #### Note
|
|
20
|
+
* The returned array will **never be empty**, but might be null if allowed.
|
|
21
|
+
* It is not deduped or sorted.
|
|
22
|
+
* If you have ids you should use `vars.ids()` instead.
|
|
23
|
+
*/
|
|
24
|
+
strings: () => QueryVar<string[]>;
|
|
6
25
|
/**
|
|
7
26
|
* Id is almost the same as number but will also parse
|
|
8
27
|
* strings, but only allow non negative integers
|
|
@@ -33,9 +52,12 @@ export declare const vars: {
|
|
|
33
52
|
* ids in the field, and check if the return matches the length.
|
|
34
53
|
*/
|
|
35
54
|
ids: () => QueryVar<number[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Checks for a valid site id which exists
|
|
57
|
+
*/
|
|
36
58
|
siteId: () => QueryVar<number>;
|
|
37
59
|
};
|
|
38
|
-
export type ValidIf<T> = (v: T,
|
|
60
|
+
export type ValidIf<T> = (v: T, sr: ServerRouter) => boolean;
|
|
39
61
|
export declare class QueryVar<T = any> {
|
|
40
62
|
private name;
|
|
41
63
|
private type;
|
|
@@ -44,6 +66,7 @@ export declare class QueryVar<T = any> {
|
|
|
44
66
|
private validIfFn;
|
|
45
67
|
constructor();
|
|
46
68
|
string(): QueryVar<string>;
|
|
69
|
+
strings(): QueryVar<string[]>;
|
|
47
70
|
number(): QueryVar<number>;
|
|
48
71
|
id(): QueryVar<number>;
|
|
49
72
|
ids(): QueryVar<number[]>;
|
|
@@ -53,7 +76,7 @@ export declare class QueryVar<T = any> {
|
|
|
53
76
|
* Set a validation function for this variable
|
|
54
77
|
*
|
|
55
78
|
* If the value is allowed to be null and it is null
|
|
56
|
-
*
|
|
79
|
+
* the passed function will not be called.
|
|
57
80
|
*/
|
|
58
81
|
validIf(fn: ValidIf<T>): QueryVar<T>;
|
|
59
82
|
validValue(v: any, cs: ServerRouter): T | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vars.d.ts","sourceRoot":"","sources":["../../src/queries/vars.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,2BAA2B,CAAC;AAErD,eAAO,MAAM,IAAI;
|
|
1
|
+
{"version":3,"file":"vars.d.ts","sourceRoot":"","sources":["../../src/queries/vars.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,2BAA2B,CAAC;AAErD,eAAO,MAAM,IAAI;IAChB;;OAEG;eACM,QAAQ,CAAC,GAAG,CAAC;IAEtB;;OAEG;kBACS,QAAQ,CAAC,MAAM,CAAC;IAE5B;;OAEG;kBACS,QAAQ,CAAC,MAAM,CAAC;IAE5B;;;;;;;;OAQG;mBACU,QAAQ,CAAC,MAAM,EAAE,CAAC;IAE/B;;;;;;;;OAQG;cACK,QAAQ,CAAC,MAAM,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;eACM,QAAQ,CAAC,MAAM,EAAE,CAAC;IAE3B;;OAEG;kBACS,QAAQ,CAAC,MAAM,CAAC;CAM5B,CAAC;AAIF,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,KAAK,OAAO,CAAC;AAE7D,qBAAa,QAAQ,CAAC,CAAC,GAAG,GAAG;IAC5B,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,IAAI,CAAyD;IACrE,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAAa;;IAU9B,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC;IAK1B,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;IAK7B,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC;IAK1B,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC;IAKtB,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,IAAI,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC;IAK9B,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAK9B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAKpC,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,GAAG,CAAC,GAAG,IAAI;IAoG9C;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;IAKpC,YAAY;CACZ;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,QAAQ,CAMhD;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,YAAY,CAC3B,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAC9B,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,GACvC,OAAO,CAWT"}
|
package/dist/queries/vars.js
CHANGED
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
export const vars = {
|
|
2
|
+
/**
|
|
3
|
+
* Any is not validated except for nullability
|
|
4
|
+
*/
|
|
2
5
|
any: () => new QueryVar(),
|
|
6
|
+
/**
|
|
7
|
+
* Number is a number, but will also parse strings to numbers
|
|
8
|
+
*/
|
|
3
9
|
number: () => new QueryVar().number(),
|
|
10
|
+
/**
|
|
11
|
+
* String is a string, but will not parse numbers to strings
|
|
12
|
+
*/
|
|
4
13
|
string: () => new QueryVar().string(),
|
|
14
|
+
/**
|
|
15
|
+
* Strings is an array of strings, but will also convert a single string to
|
|
16
|
+
* an array with one element
|
|
17
|
+
*
|
|
18
|
+
* #### Note
|
|
19
|
+
* The returned array will **never be empty**, but might be null if allowed.
|
|
20
|
+
* It is not deduped or sorted.
|
|
21
|
+
* If you have ids you should use `vars.ids()` instead.
|
|
22
|
+
*/
|
|
23
|
+
strings: () => new QueryVar().strings(),
|
|
5
24
|
/**
|
|
6
25
|
* Id is almost the same as number but will also parse
|
|
7
26
|
* strings, but only allow non negative integers
|
|
@@ -32,6 +51,9 @@ export const vars = {
|
|
|
32
51
|
* ids in the field, and check if the return matches the length.
|
|
33
52
|
*/
|
|
34
53
|
ids: () => new QueryVar().ids(),
|
|
54
|
+
/**
|
|
55
|
+
* Checks for a valid site id which exists
|
|
56
|
+
*/
|
|
35
57
|
siteId: () => new QueryVar()
|
|
36
58
|
.number()
|
|
37
59
|
.validIf((num, router) => !!router.sites.find(site => site.id === num)),
|
|
@@ -53,6 +75,10 @@ export class QueryVar {
|
|
|
53
75
|
this.type = 'string';
|
|
54
76
|
return this;
|
|
55
77
|
}
|
|
78
|
+
strings() {
|
|
79
|
+
this.type = 'strings';
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
56
82
|
number() {
|
|
57
83
|
this.type = 'number';
|
|
58
84
|
return this;
|
|
@@ -77,7 +103,7 @@ export class QueryVar {
|
|
|
77
103
|
* Set a validation function for this variable
|
|
78
104
|
*
|
|
79
105
|
* If the value is allowed to be null and it is null
|
|
80
|
-
*
|
|
106
|
+
* the passed function will not be called.
|
|
81
107
|
*/
|
|
82
108
|
validIf(fn) {
|
|
83
109
|
this.validIfFn = fn;
|
|
@@ -101,6 +127,21 @@ export class QueryVar {
|
|
|
101
127
|
if (typeof v !== 'string')
|
|
102
128
|
throw new Error(`variable ${this.name} is not a string`);
|
|
103
129
|
break;
|
|
130
|
+
case 'strings':
|
|
131
|
+
if (typeof v === 'string')
|
|
132
|
+
v = [v];
|
|
133
|
+
if (!Array.isArray(v))
|
|
134
|
+
throw new Error(`variable ${this.name} is not a string or a list of strings`);
|
|
135
|
+
if (v.length <= 0) {
|
|
136
|
+
if (this.defaultValue !== undefined)
|
|
137
|
+
return this.defaultValue;
|
|
138
|
+
if (this.flagNullable)
|
|
139
|
+
return null;
|
|
140
|
+
throw new Error(`variable ${this.name} is not allowed to be empty`);
|
|
141
|
+
}
|
|
142
|
+
if (!v.every(s => typeof s === 'string'))
|
|
143
|
+
throw new Error(`variable ${this.name} is not a list of strings`);
|
|
144
|
+
break;
|
|
104
145
|
case 'number':
|
|
105
146
|
if (typeof v !== 'number')
|
|
106
147
|
throw new Error(`variable ${this.name} is not a number`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseRoute.d.ts","sourceRoot":"","sources":["../../../src/routing/route/BaseRoute.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseRoute.d.ts","sourceRoot":"","sources":["../../../src/routing/route/BaseRoute.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { deleteSearchParam, pathnameEq, searchEq, } from '../../std/url/utils.js';
|
|
1
2
|
import { objClone } from '../../utils.js';
|
|
2
3
|
import { trimSlashEnd } from '../utils.js';
|
|
3
4
|
/**
|
|
@@ -185,10 +186,7 @@ export default class BaseRoute {
|
|
|
185
186
|
* ```
|
|
186
187
|
*/
|
|
187
188
|
setSearchParam(key, value) {
|
|
188
|
-
|
|
189
|
-
value === null ||
|
|
190
|
-
(typeof value === 'string' && value === '');
|
|
191
|
-
if (!deleteValue) {
|
|
189
|
+
if (!deleteSearchParam(value)) {
|
|
192
190
|
this.search.set(key, value);
|
|
193
191
|
}
|
|
194
192
|
else {
|
|
@@ -281,24 +279,13 @@ export default class BaseRoute {
|
|
|
281
279
|
*/
|
|
282
280
|
eqUrl(route) {
|
|
283
281
|
return (route &&
|
|
284
|
-
this.url.
|
|
285
|
-
this.url.
|
|
282
|
+
this.url.origin === route.url.origin &&
|
|
283
|
+
pathnameEq(this.url.pathname, route.url.pathname));
|
|
286
284
|
}
|
|
287
285
|
/**
|
|
288
286
|
* Checks if the search params are equal to another route
|
|
289
287
|
*/
|
|
290
288
|
eqSearch(route) {
|
|
291
|
-
const searchEq = (a, b) => {
|
|
292
|
-
if (a.size !== b.size)
|
|
293
|
-
return false;
|
|
294
|
-
a.sort();
|
|
295
|
-
b.sort();
|
|
296
|
-
const aEntries = Array.from(a.entries());
|
|
297
|
-
const bEntries = Array.from(b.entries());
|
|
298
|
-
return aEntries
|
|
299
|
-
.map((a, i) => [a, bEntries[i]])
|
|
300
|
-
.every(([[ak, av], [bk, bv]]) => ak === bk && av === bv);
|
|
301
|
-
};
|
|
302
289
|
return route && searchEq(this.search, route.search);
|
|
303
290
|
}
|
|
304
291
|
/**
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import CrelteServerRequest from '../CrelteServer.js';
|
|
2
2
|
import QueriesCaching from './QueriesCaching.js';
|
|
3
3
|
import { QueryVar } from '../../queries/vars.js';
|
|
4
|
-
import { CacheIfFn, TransformFn } from './routes.js';
|
|
4
|
+
import { CacheIfFn, TransformFn, ValidIfFn } from './routes.js';
|
|
5
5
|
export type QueryGqlArgs = {
|
|
6
6
|
vars: Record<string, QueryVar> | null;
|
|
7
|
+
validIfFn: ValidIfFn | null;
|
|
7
8
|
cacheIfFn: CacheIfFn | null;
|
|
8
9
|
preventCaching: boolean;
|
|
9
10
|
transformFn: TransformFn | null;
|
|
@@ -12,6 +13,7 @@ export default class QueryGqlRoute {
|
|
|
12
13
|
name: string;
|
|
13
14
|
query: string;
|
|
14
15
|
vars: Record<string, QueryVar> | null;
|
|
16
|
+
validIfFn: ValidIfFn | null;
|
|
15
17
|
cacheIfFn: CacheIfFn | null;
|
|
16
18
|
transformFn: TransformFn | null;
|
|
17
19
|
constructor(name: string, query: string, args: QueryGqlArgs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryGqlRoute.d.ts","sourceRoot":"","sources":["../../../src/server/queries/QueryGqlRoute.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,cAAc,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AAGvD,OAAO,
|
|
1
|
+
{"version":3,"file":"QueryGqlRoute.d.ts","sourceRoot":"","sources":["../../../src/server/queries/QueryGqlRoute.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,cAAc,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EACN,SAAS,EAET,WAAW,EAEX,SAAS,EACT,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,aAAa;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;gBAEpB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;IA4B3D,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,kBAAkB;IAO1B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAuBX,SAAS;IAWjB,MAAM,CACX,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC,QAAQ,CAAC;CAwHpB"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { vars } from '../../queries/vars.js';
|
|
2
2
|
import { extractEntry } from '../../loadData/index.js';
|
|
3
3
|
import { calcKey } from '../../ssr/index.js';
|
|
4
|
-
import { newError, validateVars } from './routes.js';
|
|
4
|
+
import { newError, validateVars, } from './routes.js';
|
|
5
5
|
// only internal
|
|
6
6
|
export default class QueryGqlRoute {
|
|
7
7
|
name;
|
|
8
8
|
query;
|
|
9
9
|
vars;
|
|
10
|
+
validIfFn;
|
|
10
11
|
cacheIfFn;
|
|
11
12
|
transformFn;
|
|
12
13
|
constructor(name, query, args) {
|
|
@@ -18,6 +19,7 @@ export default class QueryGqlRoute {
|
|
|
18
19
|
this.name = name;
|
|
19
20
|
this.query = query;
|
|
20
21
|
this.vars = args.vars;
|
|
22
|
+
this.validIfFn = args.validIfFn;
|
|
21
23
|
this.cacheIfFn = args.cacheIfFn;
|
|
22
24
|
this.transformFn = args.transformFn;
|
|
23
25
|
if (args.preventCaching) {
|
|
@@ -87,7 +89,7 @@ export default class QueryGqlRoute {
|
|
|
87
89
|
let vars;
|
|
88
90
|
try {
|
|
89
91
|
const reqVars = await csr.req.json();
|
|
90
|
-
vars = validateVars(this.vars, reqVars, caching.router);
|
|
92
|
+
vars = validateVars(this.vars, reqVars, this.validIfFn, caching.router);
|
|
91
93
|
if ('qName' in vars || 'xCraftSite' in vars)
|
|
92
94
|
throw new Error('qName and xCraftSite are reserved variable names');
|
|
93
95
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { QueryVar } from '../../queries/vars.js';
|
|
2
2
|
import CrelteServerRequest from '../CrelteServer.js';
|
|
3
3
|
import ServerRouter from '../ServerRouter.js';
|
|
4
|
-
import { HandleFn } from './routes.js';
|
|
4
|
+
import { HandleFn, ValidIfFn } from './routes.js';
|
|
5
5
|
export default class QueryHandleRoute {
|
|
6
6
|
name: string;
|
|
7
|
+
validIfFn: ValidIfFn | null;
|
|
7
8
|
handleFn: HandleFn;
|
|
8
9
|
vars: Record<string, QueryVar> | null;
|
|
9
|
-
constructor(name: string, handleFn: HandleFn, vars: Record<string, QueryVar> | null);
|
|
10
|
+
constructor(name: string, validIfFn: ValidIfFn | null, handleFn: HandleFn, vars: Record<string, QueryVar> | null);
|
|
10
11
|
handle(cs: ServerRouter, csr: CrelteServerRequest): Promise<Response>;
|
|
11
12
|
}
|
|
12
13
|
//# sourceMappingURL=QueryHandleRoute.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryHandleRoute.d.ts","sourceRoot":"","sources":["../../../src/server/queries/QueryHandleRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAA0B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"QueryHandleRoute.d.ts","sourceRoot":"","sources":["../../../src/server/queries/QueryHandleRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAA0B,SAAS,EAAE,MAAM,aAAa,CAAC;AAG1E,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;gBAGrC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI;IAQhC,MAAM,CACX,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC,QAAQ,CAAC;CAYpB"}
|
|
@@ -2,10 +2,12 @@ import { newError, validateVars } from './routes.js';
|
|
|
2
2
|
// only internal
|
|
3
3
|
export default class QueryHandleRoute {
|
|
4
4
|
name;
|
|
5
|
+
validIfFn;
|
|
5
6
|
handleFn;
|
|
6
7
|
vars;
|
|
7
|
-
constructor(name, handleFn, vars) {
|
|
8
|
+
constructor(name, validIfFn, handleFn, vars) {
|
|
8
9
|
this.name = name;
|
|
10
|
+
this.validIfFn = validIfFn;
|
|
9
11
|
this.handleFn = handleFn;
|
|
10
12
|
this.vars = vars;
|
|
11
13
|
}
|
|
@@ -13,7 +15,7 @@ export default class QueryHandleRoute {
|
|
|
13
15
|
let vars;
|
|
14
16
|
try {
|
|
15
17
|
const reqVars = await csr.req.json();
|
|
16
|
-
vars = validateVars(this.vars, reqVars, cs);
|
|
18
|
+
vars = validateVars(this.vars, reqVars, this.validIfFn, cs);
|
|
17
19
|
}
|
|
18
20
|
catch (e) {
|
|
19
21
|
return newError(e, 400);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/server/queries/queries.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAI9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/server/queries/queries.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAI9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAmC1C,wBAAsB,eAAe,CACpC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAoHf"}
|
|
@@ -20,6 +20,7 @@ export async function initQueryRoutes(platform, mod, router) {
|
|
|
20
20
|
query: null,
|
|
21
21
|
jsFile: null,
|
|
22
22
|
vars: null,
|
|
23
|
+
validIfFn: null,
|
|
23
24
|
cacheIfFn: null,
|
|
24
25
|
preventCaching: false,
|
|
25
26
|
transformFn: null,
|
|
@@ -40,6 +41,15 @@ export async function initQueryRoutes(platform, mod, router) {
|
|
|
40
41
|
if (mts.variables) {
|
|
41
42
|
routeBuilder.vars = parseVars(mts.variables);
|
|
42
43
|
}
|
|
44
|
+
if (mts.validVariables || mts.validIf) {
|
|
45
|
+
throw new Error(`use the function validVars in ${filename}`);
|
|
46
|
+
}
|
|
47
|
+
if (mts.validVars) {
|
|
48
|
+
if (typeof mts.validVars !== 'function') {
|
|
49
|
+
throw new Error('validVars should be a function');
|
|
50
|
+
}
|
|
51
|
+
routeBuilder.validIfFn = mts.validVars;
|
|
52
|
+
}
|
|
43
53
|
if (mts.caching) {
|
|
44
54
|
routeBuilder.cacheIfFn = parseCaching(mts.caching);
|
|
45
55
|
}
|
|
@@ -59,14 +69,14 @@ export async function initQueryRoutes(platform, mod, router) {
|
|
|
59
69
|
for (const [name, rb] of routeBuilders.entries()) {
|
|
60
70
|
if (rb.query) {
|
|
61
71
|
if (rb.handleFn)
|
|
62
|
-
throw new Error('handle function
|
|
72
|
+
throw new Error('cannot have a handle function if a query is present');
|
|
63
73
|
const route = new QueryGqlRoute(name, rb.query, rb);
|
|
64
74
|
router.post('/queries/' + route.name, csr => route.handle(caching, csr));
|
|
65
75
|
}
|
|
66
76
|
else if (rb.handleFn) {
|
|
67
77
|
if (rb.cacheIfFn || rb.transformFn || rb.preventCaching)
|
|
68
78
|
throw new Error('caching or transform not supported');
|
|
69
|
-
const route = new QueryHandleRoute(name, rb.handleFn, rb.vars);
|
|
79
|
+
const route = new QueryHandleRoute(name, rb.validIfFn, rb.handleFn, rb.vars);
|
|
70
80
|
router.post('/queries/' + route.name, csr => route.handle(caching.router, csr));
|
|
71
81
|
}
|
|
72
82
|
else {
|
|
@@ -2,12 +2,13 @@ import { QueryVar } from '../../queries/vars.js';
|
|
|
2
2
|
import CrelteServerRequest from '../CrelteServer.js';
|
|
3
3
|
import ServerRouter from '../ServerRouter.js';
|
|
4
4
|
export type CacheIfFn = (response: any, vars: Record<string, any>) => boolean;
|
|
5
|
+
export type ValidIfFn = (vars: Record<string, any>, sr: ServerRouter) => void | boolean;
|
|
5
6
|
export type TransformFn = (response: any, vars: Record<string, any>, csr: CrelteServerRequest) => void | any | Promise<void | any>;
|
|
6
7
|
export type HandleFn = (csr: CrelteServerRequest, vars: Record<string, any>) => Promise<any> | any;
|
|
7
8
|
/**
|
|
8
|
-
* Returns the validated variables if some vars
|
|
9
|
+
* Returns the validated variables if some vars were defined
|
|
9
10
|
* else just returns all vars
|
|
10
11
|
*/
|
|
11
|
-
export declare function validateVars(qvars: Record<string, QueryVar> | null, vars: any,
|
|
12
|
+
export declare function validateVars(qvars: Record<string, QueryVar> | null, vars: any, validIfFn: ValidIfFn | null, sr: ServerRouter): Record<string, any>;
|
|
12
13
|
export declare function newError(e: any, status: number): Response;
|
|
13
14
|
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/server/queries/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/server/queries/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC;AAG9E,MAAM,MAAM,SAAS,GAAG,CACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,EAAE,EAAE,YAAY,KACZ,IAAI,GAAG,OAAO,CAAC;AAMpB,MAAM,MAAM,WAAW,GAAG,CACzB,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,GAAG,EAAE,mBAAmB,KACpB,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AAEtC,MAAM,MAAM,QAAQ,GAAG,CACtB,GAAG,EAAE,mBAAmB,EACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACrB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAExB;;;GAGG;AACH,wBAAgB,YAAY,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,EACtC,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,EAAE,EAAE,YAAY,GACd,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAoBrB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEzD"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Returns the validated variables if some vars
|
|
2
|
+
* Returns the validated variables if some vars were defined
|
|
3
3
|
* else just returns all vars
|
|
4
4
|
*/
|
|
5
|
-
export function validateVars(qvars, vars,
|
|
5
|
+
export function validateVars(qvars, vars, validIfFn, sr) {
|
|
6
6
|
if (!vars || typeof vars !== 'object')
|
|
7
7
|
throw new Error('expected an object as vars');
|
|
8
8
|
if (!qvars)
|
|
9
9
|
return vars;
|
|
10
10
|
const nVars = {};
|
|
11
11
|
for (const [k, v] of Object.entries(qvars)) {
|
|
12
|
-
nVars[k] = v.validValue(vars[k],
|
|
12
|
+
nVars[k] = v.validValue(vars[k], sr);
|
|
13
|
+
}
|
|
14
|
+
if (validIfFn) {
|
|
15
|
+
// or throw
|
|
16
|
+
const valid = validIfFn(nVars, sr);
|
|
17
|
+
if (typeof valid === 'boolean' && !valid)
|
|
18
|
+
throw new Error('invalid variables for query');
|
|
13
19
|
}
|
|
14
20
|
return nVars;
|
|
15
21
|
}
|
package/dist/std/index.d.ts
CHANGED
package/dist/std/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/std/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/std/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjD;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,IAAI,IAAI,CAAC;CACd;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC7B,SAAS,GACT,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,CAAC;AAEb;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,oBAAoB,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAIjE"}
|
package/dist/std/index.js
CHANGED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { BaseRoute } from '../../routing/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sets the search params of a URL based on the provided options.
|
|
4
|
+
*
|
|
5
|
+
* If a value is `null`, `undefined`, or an empty string, the corresponding
|
|
6
|
+
* search param will be deleted.
|
|
7
|
+
*
|
|
8
|
+
* #### Example
|
|
9
|
+
* ```js
|
|
10
|
+
* urlWithSearch(entry.url, { p: 1 });
|
|
11
|
+
* // or remove a value
|
|
12
|
+
* urlWithSearch(entry.url, { p: null });
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function urlWithSearch(url: BaseRoute | URL | string | null | undefined, opts: Record<string, string | number | null | undefined>): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Compares two URLs for equality.
|
|
18
|
+
* Normally search and hash are ignored.
|
|
19
|
+
*
|
|
20
|
+
* If either or both url is `null` or `undefined`, the function will return
|
|
21
|
+
* `false`.
|
|
22
|
+
*
|
|
23
|
+
* #### Example
|
|
24
|
+
* ```svelte
|
|
25
|
+
* <script>
|
|
26
|
+
* import { getRoute } from 'crelte';
|
|
27
|
+
*
|
|
28
|
+
* const route = getRoute();
|
|
29
|
+
* </script>
|
|
30
|
+
*
|
|
31
|
+
* <a href={item.url} class:active={urlEq($route, item.url)}>
|
|
32
|
+
* {item.title}
|
|
33
|
+
* </a>
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function urlEq(a: BaseRoute | URL | string | null | undefined, b: BaseRoute | URL | string | null | undefined, opts?: {
|
|
37
|
+
search?: boolean;
|
|
38
|
+
hash?: boolean;
|
|
39
|
+
}): boolean;
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/std/url/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,SAAS,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAChD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GACtD,MAAM,GAAG,IAAI,CAcf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,KAAK,CACpB,CAAC,EAAE,SAAS,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAC9C,CAAC,EAAE,SAAS,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAC9C,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACzC,OAAO,CAkBT"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { deleteSearchParam, pathnameEq, searchEq, toUrl } from './utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sets the search params of a URL based on the provided options.
|
|
4
|
+
*
|
|
5
|
+
* If a value is `null`, `undefined`, or an empty string, the corresponding
|
|
6
|
+
* search param will be deleted.
|
|
7
|
+
*
|
|
8
|
+
* #### Example
|
|
9
|
+
* ```js
|
|
10
|
+
* urlWithSearch(entry.url, { p: 1 });
|
|
11
|
+
* // or remove a value
|
|
12
|
+
* urlWithSearch(entry.url, { p: null });
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export function urlWithSearch(url, opts) {
|
|
16
|
+
if (!url)
|
|
17
|
+
return null;
|
|
18
|
+
url = toUrl(url);
|
|
19
|
+
for (const [k, v] of Object.entries(opts)) {
|
|
20
|
+
if (!deleteSearchParam(v)) {
|
|
21
|
+
url.searchParams.set(k, v);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
url.searchParams.delete(k);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return url.href;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Compares two URLs for equality.
|
|
31
|
+
* Normally search and hash are ignored.
|
|
32
|
+
*
|
|
33
|
+
* If either or both url is `null` or `undefined`, the function will return
|
|
34
|
+
* `false`.
|
|
35
|
+
*
|
|
36
|
+
* #### Example
|
|
37
|
+
* ```svelte
|
|
38
|
+
* <script>
|
|
39
|
+
* import { getRoute } from 'crelte';
|
|
40
|
+
*
|
|
41
|
+
* const route = getRoute();
|
|
42
|
+
* </script>
|
|
43
|
+
*
|
|
44
|
+
* <a href={item.url} class:active={urlEq($route, item.url)}>
|
|
45
|
+
* {item.title}
|
|
46
|
+
* </a>
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function urlEq(a, b, opts) {
|
|
50
|
+
if (!a || !b)
|
|
51
|
+
return false;
|
|
52
|
+
a = toUrl(a);
|
|
53
|
+
b = toUrl(b);
|
|
54
|
+
// check origin and pathname
|
|
55
|
+
const baseMatches = a.origin === b.origin && pathnameEq(a.pathname, b.pathname);
|
|
56
|
+
if (!baseMatches)
|
|
57
|
+
return false;
|
|
58
|
+
// check search
|
|
59
|
+
if (opts?.search && !searchEq(a.searchParams, b.searchParams))
|
|
60
|
+
return false;
|
|
61
|
+
// check hash
|
|
62
|
+
if (opts?.hash && a.hash !== b.hash)
|
|
63
|
+
return false;
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BaseRoute } from '../../routing/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Checks if a search param should be removed.
|
|
4
|
+
* This is the case if the value is `null`, `undefined`, or an empty string.
|
|
5
|
+
*/
|
|
6
|
+
export declare function deleteSearchParam(value: string | number | null | undefined): value is "" | null | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Converts a `BaseRoute`, `URL`, or string to a `URL` object.
|
|
9
|
+
*/
|
|
10
|
+
export declare function toUrl(url: BaseRoute | URL | string): URL;
|
|
11
|
+
/**
|
|
12
|
+
* Compares two `URLSearchParams` objects for equality.
|
|
13
|
+
*/
|
|
14
|
+
export declare function searchEq(a: URLSearchParams, b: URLSearchParams): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Compares two pathnames for equality, ignoring trailing slashes.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pathnameEq(a: string, b: string): boolean;
|
|
19
|
+
//# sourceMappingURL=utils.d.ts.map
|