crelte 0.1.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/LICENSE.md +41 -0
- package/dist/Crelte.d.ts +55 -0
- package/dist/Crelte.d.ts.map +1 -0
- package/dist/Crelte.js +106 -0
- package/dist/CrelteBase.d.ts +16 -0
- package/dist/CrelteBase.d.ts.map +1 -0
- package/dist/CrelteBase.js +1 -0
- package/dist/CrelteRouted.d.ts +50 -0
- package/dist/CrelteRouted.d.ts.map +1 -0
- package/dist/CrelteRouted.js +88 -0
- package/dist/blocks/Blocks.d.ts +35 -0
- package/dist/blocks/Blocks.d.ts.map +1 -0
- package/dist/blocks/Blocks.js +100 -0
- package/dist/blocks/Blocks.svelte +21 -0
- package/dist/blocks/Blocks.svelte.d.ts +24 -0
- package/dist/blocks/Blocks.svelte.d.ts.map +1 -0
- package/dist/blocks/index.d.ts +5 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/blocks/index.js +3 -0
- package/dist/cookies/ClientCookies.d.ts +9 -0
- package/dist/cookies/ClientCookies.d.ts.map +1 -0
- package/dist/cookies/ClientCookies.js +22 -0
- package/dist/cookies/ServerCookies.d.ts +13 -0
- package/dist/cookies/ServerCookies.d.ts.map +1 -0
- package/dist/cookies/ServerCookies.js +31 -0
- package/dist/cookies/index.d.ts +20 -0
- package/dist/cookies/index.d.ts.map +1 -0
- package/dist/cookies/index.js +1 -0
- package/dist/cookies/utils.d.ts +12 -0
- package/dist/cookies/utils.d.ts.map +1 -0
- package/dist/cookies/utils.js +32 -0
- package/dist/graphql/GraphQl.d.ts +60 -0
- package/dist/graphql/GraphQl.d.ts.map +1 -0
- package/dist/graphql/GraphQl.js +197 -0
- package/dist/graphql/gql.test.d.ts +2 -0
- package/dist/graphql/gql.test.d.ts.map +1 -0
- package/dist/graphql/gql.test.js +80 -0
- package/dist/graphql/index.d.ts +3 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +2 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/init/client.d.ts +13 -0
- package/dist/init/client.d.ts.map +1 -0
- package/dist/init/client.js +129 -0
- package/dist/init/server.d.ts +38 -0
- package/dist/init/server.d.ts.map +1 -0
- package/dist/init/server.js +95 -0
- package/dist/init/shared.d.ts +29 -0
- package/dist/init/shared.d.ts.map +1 -0
- package/dist/init/shared.js +154 -0
- package/dist/loadData/Globals.d.ts +33 -0
- package/dist/loadData/Globals.d.ts.map +1 -0
- package/dist/loadData/Globals.js +119 -0
- package/dist/loadData/index.d.ts +25 -0
- package/dist/loadData/index.d.ts.map +1 -0
- package/dist/loadData/index.js +39 -0
- package/dist/plugins/Events.d.ts +11 -0
- package/dist/plugins/Events.d.ts.map +1 -0
- package/dist/plugins/Events.js +29 -0
- package/dist/plugins/Plugins.d.ts +12 -0
- package/dist/plugins/Plugins.d.ts.map +1 -0
- package/dist/plugins/Plugins.js +12 -0
- package/dist/plugins/index.d.ts +5 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +2 -0
- package/dist/routing/History.d.ts +22 -0
- package/dist/routing/History.d.ts.map +1 -0
- package/dist/routing/History.js +36 -0
- package/dist/routing/InnerRouter.d.ts +111 -0
- package/dist/routing/InnerRouter.d.ts.map +1 -0
- package/dist/routing/InnerRouter.js +397 -0
- package/dist/routing/PageLoader.d.ts +37 -0
- package/dist/routing/PageLoader.d.ts.map +1 -0
- package/dist/routing/PageLoader.js +72 -0
- package/dist/routing/Route.d.ts +82 -0
- package/dist/routing/Route.d.ts.map +1 -0
- package/dist/routing/Route.js +134 -0
- package/dist/routing/Router.d.ts +162 -0
- package/dist/routing/Router.d.ts.map +1 -0
- package/dist/routing/Router.js +333 -0
- package/dist/routing/Site.d.ts +47 -0
- package/dist/routing/Site.d.ts.map +1 -0
- package/dist/routing/Site.js +48 -0
- package/dist/routing/index.d.ts +5 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +4 -0
- package/dist/ssr/SsrCache.d.ts +12 -0
- package/dist/ssr/SsrCache.d.ts.map +1 -0
- package/dist/ssr/SsrCache.js +50 -0
- package/dist/ssr/SsrComponents.d.ts +7 -0
- package/dist/ssr/SsrComponents.d.ts.map +1 -0
- package/dist/ssr/SsrComponents.js +30 -0
- package/dist/ssr/index.d.ts +4 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +3 -0
- package/package.json +79 -0
- package/src/Crelte.ts +135 -0
- package/src/CrelteBase.ts +24 -0
- package/src/CrelteRouted.ts +128 -0
- package/src/blocks/Blocks.svelte +68 -0
- package/src/blocks/Blocks.ts +155 -0
- package/src/blocks/index.ts +14 -0
- package/src/cookies/ClientCookies.ts +30 -0
- package/src/cookies/ServerCookies.ts +42 -0
- package/src/cookies/index.ts +24 -0
- package/src/cookies/utils.ts +53 -0
- package/src/graphql/GraphQl.ts +281 -0
- package/src/graphql/gql.test.ts +123 -0
- package/src/graphql/index.ts +8 -0
- package/src/index.ts +109 -0
- package/src/init/client.ts +190 -0
- package/src/init/server.ts +177 -0
- package/src/init/shared.ts +221 -0
- package/src/loadData/Globals.ts +150 -0
- package/src/loadData/index.ts +67 -0
- package/src/plugins/Events.ts +50 -0
- package/src/plugins/Plugins.ts +23 -0
- package/src/plugins/index.ts +5 -0
- package/src/routing/History.ts +52 -0
- package/src/routing/InnerRouter.ts +469 -0
- package/src/routing/PageLoader.ts +112 -0
- package/src/routing/Route.ts +184 -0
- package/src/routing/Router.ts +476 -0
- package/src/routing/Site.ts +65 -0
- package/src/routing/index.ts +5 -0
- package/src/ssr/SsrCache.ts +61 -0
- package/src/ssr/SsrComponents.ts +34 -0
- package/src/ssr/index.ts +4 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import Route from './Route.js';
|
|
2
|
+
import Site from './Site.js';
|
|
3
|
+
export type PageLoaderOptions = {
|
|
4
|
+
debugTiming: boolean;
|
|
5
|
+
};
|
|
6
|
+
export type LoadResponse = {
|
|
7
|
+
success: boolean;
|
|
8
|
+
data: any;
|
|
9
|
+
};
|
|
10
|
+
export type LoadFn = (route: Route, site: Site, opts: LoadOptions) => Promise<any> | any;
|
|
11
|
+
export type LoadOptions = {
|
|
12
|
+
setProgress: (num: number) => void;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The PageLoader which is responsible for loading page Data
|
|
16
|
+
*/
|
|
17
|
+
export default class PageLoader<More> {
|
|
18
|
+
private debugTiming;
|
|
19
|
+
private preloadedUrls;
|
|
20
|
+
private loadingVersion;
|
|
21
|
+
onLoaded: (resp: LoadResponse, route: Route, site: Site, more: More) => void;
|
|
22
|
+
onProgress: (loading: boolean, progress?: number) => void;
|
|
23
|
+
loadFn: LoadFn;
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new PageLoader
|
|
26
|
+
*
|
|
27
|
+
* @param {Object} options `{debugTiming}`
|
|
28
|
+
*/
|
|
29
|
+
constructor(options: PageLoaderOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Discard the current page load if one is happening
|
|
32
|
+
*/
|
|
33
|
+
discard(): void;
|
|
34
|
+
load(route: Route, site: Site, more: More): Promise<void>;
|
|
35
|
+
preload(route: Route, site: Site): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=PageLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageLoader.d.ts","sourceRoot":"","sources":["../../../../src/routing/PageLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,MAAM,iBAAiB,GAAG;IAC/B,WAAW,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC;CACV,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,CACpB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,WAAW,KACb,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAExB,MAAM,MAAM,WAAW,GAAG;IACzB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,IAAI;IACnC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,aAAa,CAAc;IAEnC,OAAO,CAAC,cAAc,CAAS;IAE/B,QAAQ,EAAE,CACT,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,KACN,IAAI,CAAC;IACV,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;gBACS,OAAO,EAAE,iBAAiB;IAWtC;;OAEG;IACH,OAAO;IAKD,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAiCzC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI;CActC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The PageLoader which is responsible for loading page Data
|
|
3
|
+
*/
|
|
4
|
+
export default class PageLoader {
|
|
5
|
+
debugTiming;
|
|
6
|
+
preloadedUrls;
|
|
7
|
+
loadingVersion;
|
|
8
|
+
onLoaded;
|
|
9
|
+
onProgress;
|
|
10
|
+
loadFn;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new PageLoader
|
|
13
|
+
*
|
|
14
|
+
* @param {Object} options `{debugTiming}`
|
|
15
|
+
*/
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.debugTiming = options.debugTiming;
|
|
18
|
+
this.preloadedUrls = new Set();
|
|
19
|
+
this.loadingVersion = 0;
|
|
20
|
+
this.onLoaded = () => null;
|
|
21
|
+
this.onProgress = () => null;
|
|
22
|
+
this.loadFn = () => null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Discard the current page load if one is happening
|
|
26
|
+
*/
|
|
27
|
+
discard() {
|
|
28
|
+
this.loadingVersion++;
|
|
29
|
+
this.onProgress(false);
|
|
30
|
+
}
|
|
31
|
+
async load(route, site, more) {
|
|
32
|
+
this.onProgress(true);
|
|
33
|
+
const version = ++this.loadingVersion;
|
|
34
|
+
const startTime = this.debugTiming ? Date.now() : null;
|
|
35
|
+
const setProgress = (num) => {
|
|
36
|
+
if (this.loadingVersion !== version)
|
|
37
|
+
return;
|
|
38
|
+
this.onProgress(true, num);
|
|
39
|
+
};
|
|
40
|
+
const resp = { success: false, data: null };
|
|
41
|
+
try {
|
|
42
|
+
resp.data = await this.loadFn(route, site, { setProgress });
|
|
43
|
+
resp.success = true;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
resp.success = false;
|
|
47
|
+
resp.data = e;
|
|
48
|
+
}
|
|
49
|
+
if (startTime)
|
|
50
|
+
console.log('page load took ' + (Date.now() - startTime) + 'ms');
|
|
51
|
+
// if were the last that called loading, trigger the loaded event
|
|
52
|
+
if (this.loadingVersion !== version)
|
|
53
|
+
return console.log('route changed quickly, ignoring response');
|
|
54
|
+
this.onProgress(false);
|
|
55
|
+
this.onLoaded(resp, route, site, more);
|
|
56
|
+
}
|
|
57
|
+
// you don't need to wait on this call
|
|
58
|
+
async preload(route, site) {
|
|
59
|
+
const url = route.url.origin + route.url.pathname;
|
|
60
|
+
if (this.preloadedUrls.has(url))
|
|
61
|
+
return;
|
|
62
|
+
this.preloadedUrls.add(url);
|
|
63
|
+
try {
|
|
64
|
+
await this.loadFn(route, site, { setProgress: () => null });
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
console.log('preload failed');
|
|
68
|
+
// retry at another time
|
|
69
|
+
this.preloadedUrls.delete(url);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import Site from './Site.js';
|
|
2
|
+
export type RouteOpts = {
|
|
3
|
+
scrollY?: number;
|
|
4
|
+
index?: number;
|
|
5
|
+
origin?: RouteOrigin;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* RouteOrigin represents the origin of a route.
|
|
9
|
+
* This type is non-exhaustive and might expand in the future.
|
|
10
|
+
*
|
|
11
|
+
* - `'init'`: is set on the first page load
|
|
12
|
+
* - `'manual'`: is set when a route is triggered manually via `Router.open`
|
|
13
|
+
* - `'live-preview-init'`: is set on the first page load in live preview mode
|
|
14
|
+
* - `'click'`: is set when a route is triggered by a click event
|
|
15
|
+
* - `'pop'`: is set when a route is triggered by a popstate event (back/forward)
|
|
16
|
+
*/
|
|
17
|
+
export type RouteOrigin = 'init' | 'live-preview-init' | 'manual' | 'click' | 'pop';
|
|
18
|
+
/**
|
|
19
|
+
* A Route contains information about the current page for example the url and
|
|
20
|
+
* the site id
|
|
21
|
+
*
|
|
22
|
+
* ## Note
|
|
23
|
+
* Never update the route directly, clone it before
|
|
24
|
+
*/
|
|
25
|
+
export default class Route {
|
|
26
|
+
/**
|
|
27
|
+
* The url of the route
|
|
28
|
+
*/
|
|
29
|
+
url: URL;
|
|
30
|
+
/**
|
|
31
|
+
* The site of the route if it could be defined
|
|
32
|
+
*/
|
|
33
|
+
site: Site | null;
|
|
34
|
+
/**
|
|
35
|
+
* The scroll position of the current route
|
|
36
|
+
*/
|
|
37
|
+
scrollY: number | null;
|
|
38
|
+
/**
|
|
39
|
+
* the position in the browser history of this route
|
|
40
|
+
* this allows to find out if we can go back
|
|
41
|
+
*/
|
|
42
|
+
index: number;
|
|
43
|
+
/**
|
|
44
|
+
* The origin of this route
|
|
45
|
+
*
|
|
46
|
+
* Might pop, click or init (non exclusive)
|
|
47
|
+
*/
|
|
48
|
+
origin: RouteOrigin;
|
|
49
|
+
/**
|
|
50
|
+
* Creates a new Route
|
|
51
|
+
*/
|
|
52
|
+
constructor(url: string | URL, site: Site | null, opts?: RouteOpts);
|
|
53
|
+
/**
|
|
54
|
+
* Returns the uri of the route
|
|
55
|
+
*
|
|
56
|
+
* Never ends with a slash
|
|
57
|
+
*/
|
|
58
|
+
get uri(): string;
|
|
59
|
+
/**
|
|
60
|
+
* Never ends with a slash
|
|
61
|
+
*/
|
|
62
|
+
get baseUrl(): string;
|
|
63
|
+
get search(): URLSearchParams;
|
|
64
|
+
get hash(): string;
|
|
65
|
+
eq(route: Route): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Checks if there are previous routes which would allow it to go back
|
|
68
|
+
*/
|
|
69
|
+
canGoBack(): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Gets the search param
|
|
72
|
+
*/
|
|
73
|
+
getSearchParam(key: string): string | null;
|
|
74
|
+
/**
|
|
75
|
+
* Sets the search param or removes it if the value is null or undefined
|
|
76
|
+
*/
|
|
77
|
+
setSearchParam(key: string, value?: string | number | null): void;
|
|
78
|
+
clone(): Route;
|
|
79
|
+
_fillFromState(state: any): void;
|
|
80
|
+
_toState(): any;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=Route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Route.d.ts","sourceRoot":"","sources":["../../../../src/routing/Route.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,MAAM,SAAS,GAAG;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GACpB,MAAM,GACN,mBAAmB,GACnB,QAAQ,GACR,OAAO,GACP,KAAK,CAAC;AAET;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,KAAK;IACzB;;OAEG;IACH,GAAG,EAAE,GAAG,CAAC;IAET;;OAEG;IACH,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,MAAM,EAAE,WAAW,CAAC;IAEpB;;OAEG;gBACS,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAE,SAAc;IAStE;;;;OAIG;IACH,IAAI,GAAG,IAAI,MAAM,CAShB;IAGD;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAIpB;IAED,IAAI,MAAM,IAAI,eAAe,CAE5B;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,EAAE,CAAC,KAAK,EAAE,KAAK;IAwBf;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI1C;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ1D,KAAK;IASL,cAAc,CAAC,KAAK,EAAE,GAAG;IASzB,QAAQ,IAAI,GAAG;CAQf"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { trimSlashEnd } from './Router.js';
|
|
2
|
+
/**
|
|
3
|
+
* A Route contains information about the current page for example the url and
|
|
4
|
+
* the site id
|
|
5
|
+
*
|
|
6
|
+
* ## Note
|
|
7
|
+
* Never update the route directly, clone it before
|
|
8
|
+
*/
|
|
9
|
+
export default class Route {
|
|
10
|
+
/**
|
|
11
|
+
* The url of the route
|
|
12
|
+
*/
|
|
13
|
+
url;
|
|
14
|
+
/**
|
|
15
|
+
* The site of the route if it could be defined
|
|
16
|
+
*/
|
|
17
|
+
site;
|
|
18
|
+
/**
|
|
19
|
+
* The scroll position of the current route
|
|
20
|
+
*/
|
|
21
|
+
scrollY;
|
|
22
|
+
/**
|
|
23
|
+
* the position in the browser history of this route
|
|
24
|
+
* this allows to find out if we can go back
|
|
25
|
+
*/
|
|
26
|
+
index;
|
|
27
|
+
/**
|
|
28
|
+
* The origin of this route
|
|
29
|
+
*
|
|
30
|
+
* Might pop, click or init (non exclusive)
|
|
31
|
+
*/
|
|
32
|
+
origin;
|
|
33
|
+
/**
|
|
34
|
+
* Creates a new Route
|
|
35
|
+
*/
|
|
36
|
+
constructor(url, site, opts = {}) {
|
|
37
|
+
this.url = new URL(url);
|
|
38
|
+
this.site = site;
|
|
39
|
+
this.scrollY = opts.scrollY ?? null;
|
|
40
|
+
this.index = opts.index ?? 0;
|
|
41
|
+
this.origin = opts.origin ?? 'manual';
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Returns the uri of the route
|
|
45
|
+
*
|
|
46
|
+
* Never ends with a slash
|
|
47
|
+
*/
|
|
48
|
+
get uri() {
|
|
49
|
+
// todo check if this is correct
|
|
50
|
+
if (this.site) {
|
|
51
|
+
return trimSlashEnd(this.url.pathname.substring(this.site.uri.length));
|
|
52
|
+
}
|
|
53
|
+
return trimSlashEnd(this.url.pathname);
|
|
54
|
+
}
|
|
55
|
+
// todo is this correct and do we wan't it?
|
|
56
|
+
/**
|
|
57
|
+
* Never ends with a slash
|
|
58
|
+
*/
|
|
59
|
+
get baseUrl() {
|
|
60
|
+
if (this.site)
|
|
61
|
+
return trimSlashEnd(this.site.url.href);
|
|
62
|
+
return this.url.origin;
|
|
63
|
+
}
|
|
64
|
+
get search() {
|
|
65
|
+
return this.url.searchParams;
|
|
66
|
+
}
|
|
67
|
+
get hash() {
|
|
68
|
+
return this.url.hash;
|
|
69
|
+
}
|
|
70
|
+
eq(route) {
|
|
71
|
+
const searchEq = (a, b) => {
|
|
72
|
+
if (a.size !== b.size)
|
|
73
|
+
return false;
|
|
74
|
+
a.sort();
|
|
75
|
+
b.sort();
|
|
76
|
+
const aEntries = Array.from(a.entries());
|
|
77
|
+
const bEntries = Array.from(b.entries());
|
|
78
|
+
return aEntries
|
|
79
|
+
.map((a, i) => [a, bEntries[i]])
|
|
80
|
+
.every(([[ak, av], [bk, bv]]) => ak === bk && av === bv);
|
|
81
|
+
};
|
|
82
|
+
return (route &&
|
|
83
|
+
this.url.pathname === route.url.pathname &&
|
|
84
|
+
this.url.origin === route.url.origin &&
|
|
85
|
+
searchEq(this.search, route.search) &&
|
|
86
|
+
this.hash === route.hash);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Checks if there are previous routes which would allow it to go back
|
|
90
|
+
*/
|
|
91
|
+
canGoBack() {
|
|
92
|
+
return !!this.index;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Gets the search param
|
|
96
|
+
*/
|
|
97
|
+
getSearchParam(key) {
|
|
98
|
+
return this.search.get(key);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Sets the search param or removes it if the value is null or undefined
|
|
102
|
+
*/
|
|
103
|
+
setSearchParam(key, value) {
|
|
104
|
+
if (typeof value !== 'undefined' && value !== null) {
|
|
105
|
+
this.search.set(key, value);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.search.delete(key);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
clone() {
|
|
112
|
+
return new Route(this.url.href, this.site, {
|
|
113
|
+
scrollY: this.scrollY ?? undefined,
|
|
114
|
+
index: this.index,
|
|
115
|
+
origin: this.origin,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// internal function
|
|
119
|
+
_fillFromState(state) {
|
|
120
|
+
if (typeof state?.route?.scrollY === 'number')
|
|
121
|
+
this.scrollY = state.route.scrollY;
|
|
122
|
+
if (typeof state?.route?.index === 'number')
|
|
123
|
+
this.index = state.route.index;
|
|
124
|
+
}
|
|
125
|
+
// internal function
|
|
126
|
+
_toState() {
|
|
127
|
+
return {
|
|
128
|
+
route: {
|
|
129
|
+
scrollY: this.scrollY,
|
|
130
|
+
index: this.index,
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import Route from './Route.js';
|
|
2
|
+
import Site, { SiteFromGraphQl } from './Site.js';
|
|
3
|
+
import { LoadFn } from './PageLoader.js';
|
|
4
|
+
import { Readable } from 'crelte-std/stores';
|
|
5
|
+
export type RouterOpts = {
|
|
6
|
+
preloadOnMouseOver?: boolean;
|
|
7
|
+
debugTiming?: boolean;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* internal only
|
|
11
|
+
*/
|
|
12
|
+
type Internal = {
|
|
13
|
+
onLoaded: (success: boolean, route: Route, site: Site, ready: () => any) => void;
|
|
14
|
+
onLoad: LoadFn;
|
|
15
|
+
domReady: (route: Route) => void;
|
|
16
|
+
initClient: () => void;
|
|
17
|
+
initServer: (url: string, acceptLang?: string) => Promise<ServerInited>;
|
|
18
|
+
};
|
|
19
|
+
type ServerInited = {
|
|
20
|
+
success: boolean;
|
|
21
|
+
redirect: boolean;
|
|
22
|
+
route: Route;
|
|
23
|
+
site: Site;
|
|
24
|
+
props: any;
|
|
25
|
+
};
|
|
26
|
+
export declare function trimSlashEnd(str: string): string;
|
|
27
|
+
export type OnNextRouteOpts = {
|
|
28
|
+
/**
|
|
29
|
+
* If you call delayRender you need to call ready or the render will never happen
|
|
30
|
+
*/
|
|
31
|
+
delayRender: () => DelayRender;
|
|
32
|
+
};
|
|
33
|
+
export default class Router {
|
|
34
|
+
/**
|
|
35
|
+
* The current route
|
|
36
|
+
*/
|
|
37
|
+
private _route;
|
|
38
|
+
/**
|
|
39
|
+
* The current site
|
|
40
|
+
*/
|
|
41
|
+
private _site;
|
|
42
|
+
/**
|
|
43
|
+
* The next route which is currently being loaded
|
|
44
|
+
*/
|
|
45
|
+
private _nextRoute;
|
|
46
|
+
/**
|
|
47
|
+
* The next site which is currently being loaded
|
|
48
|
+
*/
|
|
49
|
+
private _nextSite;
|
|
50
|
+
/**
|
|
51
|
+
* The loading flag, specifies if a page is currently
|
|
52
|
+
* getting loaded
|
|
53
|
+
*/
|
|
54
|
+
private _loading;
|
|
55
|
+
/**
|
|
56
|
+
* The loading progress, the value is between 0 and 1
|
|
57
|
+
*/
|
|
58
|
+
private _loadingProgress;
|
|
59
|
+
private _onRouteEv;
|
|
60
|
+
private _onNextRoute;
|
|
61
|
+
private _renderBarrier;
|
|
62
|
+
_internal: Internal;
|
|
63
|
+
private inner;
|
|
64
|
+
private pageLoader;
|
|
65
|
+
constructor(sites: SiteFromGraphQl[], opts?: RouterOpts);
|
|
66
|
+
/**
|
|
67
|
+
* The current route
|
|
68
|
+
*
|
|
69
|
+
* this is a svelte store
|
|
70
|
+
*/
|
|
71
|
+
get route(): Readable<Route>;
|
|
72
|
+
/**
|
|
73
|
+
* The current site
|
|
74
|
+
*/
|
|
75
|
+
get site(): Readable<Site>;
|
|
76
|
+
/**
|
|
77
|
+
* The next route which is currently being loaded
|
|
78
|
+
*/
|
|
79
|
+
get nextRoute(): Readable<Route>;
|
|
80
|
+
/**
|
|
81
|
+
* The next site which is currently being loaded
|
|
82
|
+
*/
|
|
83
|
+
get nextSite(): Readable<Site>;
|
|
84
|
+
/**
|
|
85
|
+
* The sites which are available
|
|
86
|
+
*/
|
|
87
|
+
get sites(): Site[];
|
|
88
|
+
/**
|
|
89
|
+
* The loading flag, specifies if a page is currently
|
|
90
|
+
* getting loaded
|
|
91
|
+
*/
|
|
92
|
+
get loading(): Readable<boolean>;
|
|
93
|
+
/**
|
|
94
|
+
* The loading progress, the value is between 0 and 1
|
|
95
|
+
*/
|
|
96
|
+
get loadingProgress(): Readable<number>;
|
|
97
|
+
/**
|
|
98
|
+
* Open a new route
|
|
99
|
+
*
|
|
100
|
+
* @param target the target to open can be an url or a route
|
|
101
|
+
* the url needs to start with http or with a / which will be considered as
|
|
102
|
+
* the site baseUrl
|
|
103
|
+
*/
|
|
104
|
+
open(target: string | URL | Route): void;
|
|
105
|
+
/**
|
|
106
|
+
* This pushes the state of the route without triggering an event
|
|
107
|
+
*
|
|
108
|
+
* You can use this when using pagination for example change the route object
|
|
109
|
+
* (search argument) and then call pushState
|
|
110
|
+
*
|
|
111
|
+
* @param route
|
|
112
|
+
*/
|
|
113
|
+
pushState(route: Route): void;
|
|
114
|
+
/**
|
|
115
|
+
* This replaces the state of the route without triggering an event
|
|
116
|
+
*
|
|
117
|
+
* @param route
|
|
118
|
+
*/
|
|
119
|
+
replaceState(route: Route): void;
|
|
120
|
+
/**
|
|
121
|
+
* Checks if there are previous routes which would allow it to go back
|
|
122
|
+
*/
|
|
123
|
+
canGoBack(): boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Go back in the history
|
|
126
|
+
*/
|
|
127
|
+
back(): void;
|
|
128
|
+
/**
|
|
129
|
+
* Preload a url
|
|
130
|
+
*/
|
|
131
|
+
preload(target: string | URL | Route): void;
|
|
132
|
+
/**
|
|
133
|
+
* Add a listener for the onRoute event
|
|
134
|
+
*
|
|
135
|
+
* This differs from router.route.subscribe in the way that
|
|
136
|
+
* it will only trigger if a new render / load will occur
|
|
137
|
+
*/
|
|
138
|
+
onRoute(fn: (route: Route, site: Site) => void): () => void;
|
|
139
|
+
onNextRoute(fn: (route: Route, site: Site, opts: OnNextRouteOpts) => void): () => void;
|
|
140
|
+
private setNewRoute;
|
|
141
|
+
private _initClient;
|
|
142
|
+
private _initServer;
|
|
143
|
+
private _onRoute;
|
|
144
|
+
private _onPreload;
|
|
145
|
+
private _onLoaded;
|
|
146
|
+
private _onProgress;
|
|
147
|
+
}
|
|
148
|
+
export type DelayRender = {
|
|
149
|
+
/**
|
|
150
|
+
* Call this when you're ready for the render to happen
|
|
151
|
+
* the promise will resolve when the render is done or was cancelled
|
|
152
|
+
*
|
|
153
|
+
* @returns if the render was cancelled
|
|
154
|
+
*/
|
|
155
|
+
ready: () => Promise<boolean>;
|
|
156
|
+
/**
|
|
157
|
+
* If youre not interested in the render anymore
|
|
158
|
+
*/
|
|
159
|
+
remove: () => void;
|
|
160
|
+
};
|
|
161
|
+
export {};
|
|
162
|
+
//# sourceMappingURL=Router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../../../src/routing/Router.ts"],"names":[],"mappings":"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"}
|