vike 0.4.144-commit-f7ab002 → 0.4.144-commit-de18325
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/cjs/__internal/index.js +6 -2
- package/dist/cjs/node/plugin/plugins/commonConfig.js +0 -3
- package/dist/cjs/node/plugin/plugins/devConfig/index.js +1 -0
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +58 -40
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +1 -0
- package/dist/cjs/node/plugin/plugins/previewConfig.js +5 -0
- package/dist/cjs/node/prerender/runPrerender.js +10 -11
- package/dist/cjs/node/prerender/utils.js +1 -1
- package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +1 -0
- package/dist/cjs/node/runtime/renderPage/debugPageFiles.js +5 -5
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +1 -1
- package/dist/cjs/node/runtime/renderPage.js +3 -3
- package/dist/cjs/node/runtime/utils.js +1 -1
- package/dist/cjs/shared/addUrlComputedProps.js +24 -12
- package/dist/cjs/shared/route/executeOnBeforeRouteHook.js +41 -15
- package/dist/cjs/shared/route/index.js +22 -32
- package/dist/cjs/shared/route/resolveRouteFunction.js +1 -1
- package/dist/cjs/shared/utils.js +1 -1
- package/dist/cjs/utils/{hasPropertyGetter.js → isPropertyGetter.js} +3 -3
- package/dist/cjs/utils/projectInfo.js +1 -1
- package/dist/esm/__internal/index.d.ts +6 -3
- package/dist/esm/__internal/index.js +8 -3
- package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +2 -3
- package/dist/esm/client/client-routing-runtime/createPageContext.js +3 -3
- package/dist/esm/client/client-routing-runtime/entry.js +2 -2
- package/dist/esm/client/client-routing-runtime/getPageContext.d.ts +0 -1
- package/dist/esm/client/client-routing-runtime/getPageContext.js +6 -9
- package/dist/esm/client/client-routing-runtime/history.d.ts +3 -1
- package/dist/esm/client/client-routing-runtime/history.js +26 -8
- package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +21 -0
- package/dist/esm/client/client-routing-runtime/{useClientRouter.js → installClientRouter.js} +248 -242
- package/dist/esm/client/client-routing-runtime/isClientSideRoutable.d.ts +8 -0
- package/dist/esm/client/client-routing-runtime/isClientSideRoutable.js +15 -0
- package/dist/esm/client/client-routing-runtime/navigate.d.ts +0 -2
- package/dist/esm/client/client-routing-runtime/navigate.js +10 -8
- package/dist/esm/client/client-routing-runtime/prefetch.js +54 -28
- package/dist/esm/client/client-routing-runtime/skipLink.d.ts +0 -1
- package/dist/esm/client/client-routing-runtime/skipLink.js +1 -2
- package/dist/esm/client/server-routing-runtime/getPageContext.js +1 -1
- package/dist/esm/client/shared/executeOnRenderClientHook.js +6 -5
- package/dist/esm/client/shared/getPageContextProxyForUser.js +13 -7
- package/dist/esm/client/shared/loadPageFilesClientSide.d.ts +8 -3
- package/dist/esm/client/shared/loadPageFilesClientSide.js +5 -5
- package/dist/esm/node/plugin/plugins/commonConfig.js +0 -3
- package/dist/esm/node/plugin/plugins/devConfig/index.js +1 -0
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +58 -40
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +1 -0
- package/dist/esm/node/plugin/plugins/previewConfig.js +5 -0
- package/dist/esm/node/prerender/runPrerender.js +11 -12
- package/dist/esm/node/prerender/utils.d.ts +1 -1
- package/dist/esm/node/prerender/utils.js +1 -1
- package/dist/esm/node/runtime/html/serializePageContextClientSide.js +1 -0
- package/dist/esm/node/runtime/renderPage/debugPageFiles.d.ts +5 -5
- package/dist/esm/node/runtime/renderPage/debugPageFiles.js +5 -5
- package/dist/esm/node/runtime/renderPage/loadPageFilesServerSide.d.ts +2 -2
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +1 -1
- package/dist/esm/node/runtime/renderPage.js +3 -3
- package/dist/esm/node/runtime/utils.d.ts +1 -1
- package/dist/esm/node/runtime/utils.js +1 -1
- package/dist/esm/shared/addUrlComputedProps.d.ts +1 -0
- package/dist/esm/shared/addUrlComputedProps.js +25 -13
- package/dist/esm/shared/route/executeOnBeforeRouteHook.d.ts +5 -8
- package/dist/esm/shared/route/executeOnBeforeRouteHook.js +41 -15
- package/dist/esm/shared/route/index.d.ts +12 -10
- package/dist/esm/shared/route/index.js +23 -33
- package/dist/esm/shared/route/resolveRouteFunction.js +1 -1
- package/dist/esm/shared/utils.d.ts +1 -1
- package/dist/esm/shared/utils.js +1 -1
- package/dist/esm/utils/isPropertyGetter.d.ts +1 -0
- package/dist/esm/utils/{hasPropertyGetter.js → isPropertyGetter.js} +1 -1
- package/dist/esm/utils/projectInfo.d.ts +1 -1
- package/dist/esm/utils/projectInfo.js +1 -1
- package/package.json +1 -1
- package/dist/esm/client/client-routing-runtime/getPageId.d.ts +0 -10
- package/dist/esm/client/client-routing-runtime/getPageId.js +0 -17
- package/dist/esm/client/client-routing-runtime/skipLink/isClientSideRoutable.d.ts +0 -2
- package/dist/esm/client/client-routing-runtime/skipLink/isClientSideRoutable.js +0 -15
- package/dist/esm/client/client-routing-runtime/useClientRouter.d.ts +0 -6
- package/dist/esm/utils/hasPropertyGetter.d.ts +0 -1
|
@@ -54,6 +54,7 @@ function serializePageContextClientSide(pageContext) {
|
|
|
54
54
|
msg = `${msg} Serialization error: ${err.messageCore}.`;
|
|
55
55
|
}
|
|
56
56
|
else {
|
|
57
|
+
// When a property getter throws an error
|
|
57
58
|
console.warn('Serialization error:');
|
|
58
59
|
console.warn(err);
|
|
59
60
|
msg = `${msg} The serialization failed because of the error printed above.`;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export { debugPageFiles };
|
|
2
|
-
export type {
|
|
3
|
-
import { RouteMatches } from '../../../shared/route/index.js';
|
|
2
|
+
export type { PageContextDebugRouteMatches };
|
|
3
|
+
import type { RouteMatches } from '../../../shared/route/index.js';
|
|
4
4
|
import type { ClientDependency } from '../../../shared/getPageFiles/analyzePageClientSide/ClientDependency.js';
|
|
5
5
|
import type { PageFile } from '../../../shared/getPageFiles.js';
|
|
6
6
|
import type { PageConfigRuntime } from '../../../shared/page-configs/PageConfig.js';
|
|
7
|
-
type
|
|
8
|
-
|
|
7
|
+
type PageContextDebugRouteMatches = {
|
|
8
|
+
_debugRouteMatches: 'ROUTING_ERROR' | RouteMatches;
|
|
9
9
|
};
|
|
10
10
|
declare function debugPageFiles({ pageContext, isHtmlOnly, isClientRouting, pageFilesLoaded, pageFilesServerSide, pageFilesClientSide, clientEntries, clientDependencies }: {
|
|
11
11
|
pageContext: {
|
|
@@ -13,7 +13,7 @@ declare function debugPageFiles({ pageContext, isHtmlOnly, isClientRouting, page
|
|
|
13
13
|
_pageId: string;
|
|
14
14
|
_pageFilesAll: PageFile[];
|
|
15
15
|
_pageConfigs: PageConfigRuntime[];
|
|
16
|
-
} &
|
|
16
|
+
} & PageContextDebugRouteMatches;
|
|
17
17
|
isHtmlOnly: boolean;
|
|
18
18
|
isClientRouting: boolean;
|
|
19
19
|
pageFilesLoaded: PageFile[];
|
|
@@ -6,7 +6,7 @@ function debugPageFiles({ pageContext, isHtmlOnly, isClientRouting, pageFilesLoa
|
|
|
6
6
|
const padding = ' - ';
|
|
7
7
|
debug('All page files:', printPageFiles(pageContext._pageFilesAll, true)); // TODO
|
|
8
8
|
debug(`URL:`, pageContext.urlOriginal);
|
|
9
|
-
debug.options({ serialization: { emptyArray: 'No match' } })(`Routing:`, printRouteMatches(pageContext.
|
|
9
|
+
debug.options({ serialization: { emptyArray: 'No match' } })(`Routing:`, printRouteMatches(pageContext._debugRouteMatches));
|
|
10
10
|
debug(`pageId:`, pageContext._pageId);
|
|
11
11
|
debug('Page type:', isHtmlOnly ? 'HTML-only' : 'SSR/SPA');
|
|
12
12
|
debug(`Routing type:`, !isHtmlOnly && isClientRouting ? 'Client Routing' : 'Server Routing');
|
|
@@ -16,14 +16,14 @@ function debugPageFiles({ pageContext, isHtmlOnly, isClientRouting, pageFilesLoa
|
|
|
16
16
|
debug('Client-side entries:', clientEntries);
|
|
17
17
|
debug('Client-side dependencies:', clientDependencies);
|
|
18
18
|
return;
|
|
19
|
-
function printRouteMatches(
|
|
20
|
-
if (
|
|
19
|
+
function printRouteMatches(debugRouteMatches) {
|
|
20
|
+
if (debugRouteMatches === 'ROUTING_ERROR') {
|
|
21
21
|
return 'Routing Failed';
|
|
22
22
|
}
|
|
23
|
-
if (
|
|
23
|
+
if (debugRouteMatches === 'CUSTOM_ROUTING') {
|
|
24
24
|
return 'Custom Routing';
|
|
25
25
|
}
|
|
26
|
-
return
|
|
26
|
+
return debugRouteMatches;
|
|
27
27
|
}
|
|
28
28
|
function printPageFiles(pageFiles, genericPageFilesLast = false) {
|
|
29
29
|
if (pageFiles.length === 0) {
|
|
@@ -4,9 +4,9 @@ export type { PageContext_loadPageFilesServerSide };
|
|
|
4
4
|
import { type PageFile } from '../../../shared/getPageFiles.js';
|
|
5
5
|
import { PromiseType } from '../utils.js';
|
|
6
6
|
import { PageContextGetPageAssets, type PageAsset } from './getPageAssets.js';
|
|
7
|
-
import { type
|
|
7
|
+
import { type PageContextDebugRouteMatches } from './debugPageFiles.js';
|
|
8
8
|
import type { PageConfigRuntime } from '../../../shared/page-configs/PageConfig.js';
|
|
9
|
-
type PageContext_loadPageFilesServerSide = PageContextGetPageAssets &
|
|
9
|
+
type PageContext_loadPageFilesServerSide = PageContextGetPageAssets & PageContextDebugRouteMatches & {
|
|
10
10
|
urlOriginal: string;
|
|
11
11
|
_pageFilesAll: PageFile[];
|
|
12
12
|
_pageConfigs: PageConfigRuntime[];
|
|
@@ -102,7 +102,7 @@ async function prerender404Page(renderContext, pageContextInit_) {
|
|
|
102
102
|
routeParams: {},
|
|
103
103
|
// `prerender404Page()` is about generating `dist/client/404.html` for static hosts; there is no Client Routing.
|
|
104
104
|
_usesClientRouter: false,
|
|
105
|
-
|
|
105
|
+
_debugRouteMatches: []
|
|
106
106
|
};
|
|
107
107
|
const pageContextInit = {
|
|
108
108
|
urlOriginal: '/fake-404-url',
|
|
@@ -240,8 +240,8 @@ async function renderPageNominal(pageContext) {
|
|
|
240
240
|
}
|
|
241
241
|
// Route
|
|
242
242
|
{
|
|
243
|
-
const
|
|
244
|
-
objectAssign(pageContext,
|
|
243
|
+
const pageContextFromRoute = await route(pageContext);
|
|
244
|
+
objectAssign(pageContext, pageContextFromRoute);
|
|
245
245
|
objectAssign(pageContext, { is404: pageContext._pageId ? null : true });
|
|
246
246
|
if (pageContext._pageId === null) {
|
|
247
247
|
const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs);
|
|
@@ -268,7 +268,7 @@ async function getPageContextErrorPageInit(pageContextInit, errNominalPage, page
|
|
|
268
268
|
routeParams: {}
|
|
269
269
|
};
|
|
270
270
|
objectAssign(pageContext, {
|
|
271
|
-
|
|
271
|
+
_debugRouteMatches: pageContextNominalPagePartial._debugRouteMatches || 'ROUTING_ERROR'
|
|
272
272
|
});
|
|
273
273
|
assert(pageContext.errorWhileRendering);
|
|
274
274
|
return pageContext;
|
|
@@ -25,7 +25,7 @@ export * from '../../utils/capitalizeFirstLetter.js';
|
|
|
25
25
|
export * from '../../utils/debugGlob.js';
|
|
26
26
|
export * from '../../utils/isEquivalentError.js';
|
|
27
27
|
export * from '../../utils/styleFileRE.js';
|
|
28
|
-
export * from '../../utils/
|
|
28
|
+
export * from '../../utils/isPropertyGetter.js';
|
|
29
29
|
export * from '../../utils/debug.js';
|
|
30
30
|
export * from '../../utils/urlToFile.js';
|
|
31
31
|
export * from '../../utils/getGlobalObject.js';
|
|
@@ -28,7 +28,7 @@ export * from '../../utils/capitalizeFirstLetter.js';
|
|
|
28
28
|
export * from '../../utils/debugGlob.js';
|
|
29
29
|
export * from '../../utils/isEquivalentError.js';
|
|
30
30
|
export * from '../../utils/styleFileRE.js';
|
|
31
|
-
export * from '../../utils/
|
|
31
|
+
export * from '../../utils/isPropertyGetter.js';
|
|
32
32
|
export * from '../../utils/debug.js';
|
|
33
33
|
export * from '../../utils/urlToFile.js';
|
|
34
34
|
export * from '../../utils/getGlobalObject.js';
|
|
@@ -55,6 +55,7 @@ type PageContextUrlComputedPropsServer = PageContextUrlComputedPropsClient & {
|
|
|
55
55
|
declare function addUrlComputedProps<PageContext extends Record<string, unknown> & PageContextUrlSources>(pageContext: PageContext, enumerable?: boolean): asserts pageContext is PageContext & PageContextUrlComputedPropsInternal;
|
|
56
56
|
type PageContextUrlSources = {
|
|
57
57
|
urlOriginal: string;
|
|
58
|
+
urlLogical?: string;
|
|
58
59
|
_urlRewrite: string | null;
|
|
59
60
|
_baseServer: string;
|
|
60
61
|
_urlHandler: null | ((url: string) => string);
|
|
@@ -1,28 +1,40 @@
|
|
|
1
1
|
// URLs props need to be computed props, because the user can modify the URL e.g. with onBeforeRoute() for i18n
|
|
2
2
|
export { addUrlComputedProps };
|
|
3
3
|
export { assertPageContextUrlComputedProps };
|
|
4
|
-
import { assert, parseUrl, assertWarning, isPlainObject,
|
|
4
|
+
import { assert, parseUrl, assertWarning, isPlainObject, isPropertyGetter, isBrowser } from './utils.js';
|
|
5
5
|
function addUrlComputedProps(pageContext, enumerable = true) {
|
|
6
6
|
assert(pageContext.urlOriginal);
|
|
7
7
|
if ('urlPathname' in pageContext) {
|
|
8
|
-
assert(
|
|
8
|
+
assert(typeof pageContext.urlPathname === 'string');
|
|
9
|
+
/* If this assert() fails then it's most likely because Object.assign() was used instead of objectAssign(), i.e.:
|
|
10
|
+
```js
|
|
11
|
+
// Add property getters such as pageContext.urlPathname to pageContext
|
|
12
|
+
addUrlComputedProps(pageContext)
|
|
13
|
+
// ❌ Breaks the property getters of pageContext set by addUrlComputedProps() such as pageContext.urlPathname
|
|
14
|
+
Object.assign(pageContext2, pageContext)
|
|
15
|
+
// ❌ Also breaks the property getters
|
|
16
|
+
const pageContext3 = { ...pageContext }
|
|
17
|
+
// ✅ Preserves property getters of pageContext (see objectAssign() implementation)
|
|
18
|
+
objectAssign(pageContext2, pageContext)
|
|
19
|
+
```
|
|
20
|
+
*/
|
|
21
|
+
assert(isPropertyGetter(pageContext, 'urlPathname'));
|
|
9
22
|
}
|
|
23
|
+
if ('urlParsed' in pageContext)
|
|
24
|
+
assert(isPropertyGetter(pageContext, 'urlParsed'));
|
|
25
|
+
// TODO/v1-release: move pageContext.urlParsed to pageContext.url
|
|
26
|
+
if ('url' in pageContext)
|
|
27
|
+
assert(isPropertyGetter(pageContext, 'url'));
|
|
10
28
|
Object.defineProperty(pageContext, 'urlPathname', {
|
|
11
29
|
get: urlPathnameGetter,
|
|
12
30
|
enumerable,
|
|
13
31
|
configurable: true
|
|
14
32
|
});
|
|
15
|
-
// TODO/v1-release: move pageContext.urlParsed to pageContext.url
|
|
16
|
-
if ('url' in pageContext)
|
|
17
|
-
assert(hasPropertyGetter(pageContext, 'url'));
|
|
18
33
|
Object.defineProperty(pageContext, 'url', {
|
|
19
34
|
get: urlGetter,
|
|
20
35
|
enumerable: false,
|
|
21
36
|
configurable: true
|
|
22
37
|
});
|
|
23
|
-
if ('urlParsed' in pageContext) {
|
|
24
|
-
assert(hasPropertyGetter(pageContext, 'urlParsed'));
|
|
25
|
-
}
|
|
26
38
|
Object.defineProperty(pageContext, 'urlParsed', {
|
|
27
39
|
get: urlParsedGetter,
|
|
28
40
|
enumerable,
|
|
@@ -30,17 +42,17 @@ function addUrlComputedProps(pageContext, enumerable = true) {
|
|
|
30
42
|
});
|
|
31
43
|
}
|
|
32
44
|
function getUrlParsed(pageContext) {
|
|
33
|
-
// We
|
|
45
|
+
// We need a url handler function because the onBeforeRoute() hook may set pageContext.urlLogical (typically for i18n)
|
|
34
46
|
let urlHandler = pageContext._urlHandler;
|
|
35
47
|
if (!urlHandler) {
|
|
36
48
|
urlHandler = (url) => url;
|
|
37
49
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const urlLogical = urlHandler(url);
|
|
50
|
+
let urlResolved = pageContext._urlRewrite ?? pageContext.urlLogical ?? pageContext.urlOriginal;
|
|
51
|
+
urlResolved = urlHandler(urlResolved);
|
|
41
52
|
const baseServer = pageContext._baseServer;
|
|
53
|
+
assert(urlResolved && typeof urlResolved === 'string');
|
|
42
54
|
assert(baseServer.startsWith('/'));
|
|
43
|
-
return parseUrl(
|
|
55
|
+
return parseUrl(urlResolved, baseServer);
|
|
44
56
|
}
|
|
45
57
|
function urlPathnameGetter() {
|
|
46
58
|
const { pathname } = getUrlParsed(this);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PageContextForRoute, PageContextFromRoute } from './index.js';
|
|
1
2
|
export { executeOnBeforeRouteHook };
|
|
2
3
|
export type { OnBeforeRouteHook };
|
|
3
4
|
type OnBeforeRouteHook = {
|
|
@@ -6,12 +7,8 @@ type OnBeforeRouteHook = {
|
|
|
6
7
|
urlOriginal: string;
|
|
7
8
|
} & Record<string, unknown>) => unknown;
|
|
8
9
|
};
|
|
9
|
-
declare function executeOnBeforeRouteHook(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
urlOriginal?: string;
|
|
14
|
-
_urlOriginalPristine?: string;
|
|
15
|
-
_pageId?: string | null;
|
|
16
|
-
routeParams?: Record<string, string>;
|
|
10
|
+
declare function executeOnBeforeRouteHook(pageContext: PageContextForRoute): Promise<null | ({
|
|
11
|
+
_routingProvidedByOnBeforeRouteHook: true;
|
|
12
|
+
} & PageContextFromRoute) | {
|
|
13
|
+
_routingProvidedByOnBeforeRouteHook: false;
|
|
17
14
|
}>;
|
|
@@ -1,11 +1,40 @@
|
|
|
1
1
|
import { assertPageContextProvidedByUser } from '../assertPageContextProvidedByUser.js';
|
|
2
|
-
import { assertUsage, hasProp, isObjectWithKeys, objectAssign, assertWarning, assertUsageUrl, joinEnglish } from './utils.js';
|
|
2
|
+
import { assertUsage, hasProp, isObjectWithKeys, objectAssign, assertWarning, assertUsageUrl, joinEnglish, assert } from './utils.js';
|
|
3
3
|
import { assertRouteParams, assertSyncRouting } from './resolveRouteFunction.js';
|
|
4
4
|
import pc from '@brillout/picocolors';
|
|
5
5
|
export { executeOnBeforeRouteHook };
|
|
6
|
-
async function executeOnBeforeRouteHook(
|
|
6
|
+
async function executeOnBeforeRouteHook(pageContext) {
|
|
7
|
+
const pageContextFromOnBeforeRouteHook = {};
|
|
8
|
+
if (!pageContext._onBeforeRouteHook)
|
|
9
|
+
return null;
|
|
10
|
+
const pageContextFromHook = await executeHook(pageContext._onBeforeRouteHook, pageContext);
|
|
11
|
+
if (pageContextFromHook) {
|
|
12
|
+
objectAssign(pageContextFromOnBeforeRouteHook, pageContextFromHook);
|
|
13
|
+
if (hasProp(pageContextFromOnBeforeRouteHook, '_pageId', 'string') ||
|
|
14
|
+
hasProp(pageContextFromOnBeforeRouteHook, '_pageId', 'null')) {
|
|
15
|
+
// We bypass Vike's routing
|
|
16
|
+
if (!hasProp(pageContextFromOnBeforeRouteHook, 'routeParams')) {
|
|
17
|
+
objectAssign(pageContextFromOnBeforeRouteHook, { routeParams: {} });
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
assert(hasProp(pageContextFromOnBeforeRouteHook, 'routeParams', 'object'));
|
|
21
|
+
}
|
|
22
|
+
objectAssign(pageContextFromOnBeforeRouteHook, {
|
|
23
|
+
_routingProvidedByOnBeforeRouteHook: true,
|
|
24
|
+
_debugRouteMatches: 'CUSTOM_ROUTING'
|
|
25
|
+
});
|
|
26
|
+
return pageContextFromOnBeforeRouteHook;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
objectAssign(pageContextFromOnBeforeRouteHook, {
|
|
30
|
+
_routingProvidedByOnBeforeRouteHook: false
|
|
31
|
+
});
|
|
32
|
+
return pageContextFromOnBeforeRouteHook;
|
|
33
|
+
}
|
|
34
|
+
async function executeHook(onBeforeRouteHook, pageContext) {
|
|
7
35
|
let hookReturn = onBeforeRouteHook.onBeforeRoute(pageContext);
|
|
8
36
|
assertSyncRouting(hookReturn, `The onBeforeRoute() hook ${onBeforeRouteHook.hookFilePath}`);
|
|
37
|
+
// TODO/v1-release: make executeOnBeforeRouteHook() and route() sync
|
|
9
38
|
hookReturn = await hookReturn;
|
|
10
39
|
const errPrefix = `The onBeforeRoute() hook defined by ${onBeforeRouteHook.hookFilePath}`;
|
|
11
40
|
assertUsage(hookReturn === null ||
|
|
@@ -23,28 +52,25 @@ async function executeOnBeforeRouteHook(onBeforeRouteHook, pageContext) {
|
|
|
23
52
|
if (hasProp(hookReturn.pageContext, 'routeParams')) {
|
|
24
53
|
assertRouteParams(hookReturn.pageContext, `${errPrefix} returned ${pc.cyan('{ pageContext: { routeParams } }')} but routeParams should`);
|
|
25
54
|
}
|
|
26
|
-
const
|
|
55
|
+
const deprecatedReturn = (prop) => `${errPrefix} returned ${pc.cyan(`{ pageContext: { ${prop} } }`)} which is deprecated. Return ${pc.cyan('{ pageContext: { urlLogical } }')} instead.`;
|
|
27
56
|
if (hasProp(hookReturn.pageContext, 'url')) {
|
|
28
|
-
assertWarning(false,
|
|
29
|
-
hookReturn.pageContext.
|
|
57
|
+
assertWarning(false, deprecatedReturn('url'), { onlyOnce: true });
|
|
58
|
+
hookReturn.pageContext.urlLogical = hookReturn.pageContext.url;
|
|
30
59
|
delete hookReturn.pageContext.url;
|
|
31
60
|
}
|
|
32
61
|
if (hasProp(hookReturn.pageContext, 'urlOriginal')) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// pageContext.urlReal / pageContext.urlModified
|
|
40
|
-
// VS
|
|
41
|
-
// pageContext.urlOriginal / pageContext.urlModified
|
|
42
|
-
objectAssign(pageContextAddendumHook, { _urlOriginalPristine: pageContext.urlOriginal });
|
|
62
|
+
assertWarning(false, deprecatedReturn('urlOriginal'), { onlyOnce: true });
|
|
63
|
+
hookReturn.pageContext.urlLogical = hookReturn.pageContext.urlOriginal;
|
|
64
|
+
delete hookReturn.pageContext.urlOriginal;
|
|
65
|
+
}
|
|
66
|
+
if (hasProp(hookReturn.pageContext, 'urlLogical')) {
|
|
67
|
+
assertUsageUrl(hookReturn.pageContext.urlLogical, `${errPrefix} returned ${pc.cyan('{ pageContext: { urlLogical } }')} but ${pc.cyan('urlLogical')}`);
|
|
43
68
|
}
|
|
44
69
|
assertPageContextProvidedByUser(hookReturn.pageContext, {
|
|
45
70
|
hookFilePath: onBeforeRouteHook.hookFilePath,
|
|
46
71
|
hookName: 'onBeforeRoute'
|
|
47
72
|
});
|
|
73
|
+
const pageContextAddendumHook = {};
|
|
48
74
|
objectAssign(pageContextAddendumHook, hookReturn.pageContext);
|
|
49
75
|
return pageContextAddendumHook;
|
|
50
76
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export { route };
|
|
2
|
-
export type {
|
|
2
|
+
export type { PageContextForRoute };
|
|
3
|
+
export type { PageContextFromRoute };
|
|
4
|
+
export type { PageRoutes };
|
|
5
|
+
export type { RouteMatches };
|
|
3
6
|
import type { PageFile } from '../getPageFiles.js';
|
|
4
7
|
import { PageContextUrlComputedPropsInternal, PageContextUrlSources } from '../addUrlComputedProps.js';
|
|
5
8
|
import { type OnBeforeRouteHook } from './executeOnBeforeRouteHook.js';
|
|
@@ -13,6 +16,12 @@ type PageContextForRoute = PageContextUrlComputedPropsInternal & {
|
|
|
13
16
|
_pageRoutes: PageRoutes;
|
|
14
17
|
_onBeforeRouteHook: OnBeforeRouteHook | null;
|
|
15
18
|
} & PageContextUrlSources;
|
|
19
|
+
type PageContextFromRoute = {
|
|
20
|
+
_pageId: string | null;
|
|
21
|
+
routeParams: Record<string, string>;
|
|
22
|
+
_routingProvidedByOnBeforeRouteHook?: boolean;
|
|
23
|
+
_debugRouteMatches: RouteMatches;
|
|
24
|
+
};
|
|
16
25
|
type RouteMatch = {
|
|
17
26
|
pageId: string;
|
|
18
27
|
routeString?: string;
|
|
@@ -20,12 +29,5 @@ type RouteMatch = {
|
|
|
20
29
|
routeType: RouteType;
|
|
21
30
|
routeParams: Record<string, string>;
|
|
22
31
|
};
|
|
23
|
-
type RouteMatches = '
|
|
24
|
-
declare function route(
|
|
25
|
-
pageContextAddendum: {
|
|
26
|
-
_pageId: string | null;
|
|
27
|
-
routeParams: Record<string, string>;
|
|
28
|
-
_routingProvidedByOnBeforeRouteHook: boolean;
|
|
29
|
-
_routeMatches: RouteMatches;
|
|
30
|
-
} & Record<string, unknown>;
|
|
31
|
-
}>;
|
|
32
|
+
type RouteMatches = 'CUSTOM_ROUTING' | RouteMatch[];
|
|
33
|
+
declare function route(pageContextForRoute: PageContextForRoute): Promise<PageContextFromRoute>;
|
|
@@ -5,7 +5,7 @@ import { isBrowser } from '../../utils/isBrowser.js';
|
|
|
5
5
|
if (isBrowser()) {
|
|
6
6
|
assertClientRouting();
|
|
7
7
|
}
|
|
8
|
-
import { assert, assertUsage,
|
|
8
|
+
import { assert, assertUsage, isPlainObject, objectAssign } from './utils.js';
|
|
9
9
|
import { addUrlComputedProps } from '../addUrlComputedProps.js';
|
|
10
10
|
import { resolvePrecendence } from './resolvePrecedence.js';
|
|
11
11
|
import { resolveRouteString } from './resolveRouteString.js';
|
|
@@ -13,35 +13,25 @@ import { resolveRouteFunction } from './resolveRouteFunction.js';
|
|
|
13
13
|
import { executeOnBeforeRouteHook } from './executeOnBeforeRouteHook.js';
|
|
14
14
|
import { debug } from './debug.js';
|
|
15
15
|
import pc from '@brillout/picocolors';
|
|
16
|
-
async function route(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
else {
|
|
30
|
-
assert(hasProp(pageContextAddendum, 'routeParams', 'object'));
|
|
31
|
-
}
|
|
32
|
-
objectAssign(pageContextAddendum, {
|
|
33
|
-
_routingProvidedByOnBeforeRouteHook: true,
|
|
34
|
-
_routeMatches: 'CUSTOM_ROUTE'
|
|
35
|
-
});
|
|
36
|
-
return { pageContextAddendum };
|
|
37
|
-
}
|
|
38
|
-
// We already assign so that `pageContext.urlOriginal === pageContextAddendum.urlOriginal`; enabling the `onBeforeRoute()` hook to mutate `pageContext.urlOriginal` before routing.
|
|
39
|
-
objectAssign(pageContext, pageContextAddendum);
|
|
16
|
+
async function route(pageContextForRoute) {
|
|
17
|
+
debug('Pages routes:', pageContextForRoute._pageRoutes);
|
|
18
|
+
addUrlComputedProps(pageContextForRoute);
|
|
19
|
+
const pageContextFromRoute = {};
|
|
20
|
+
// onBeforeRoute()
|
|
21
|
+
const pageContextFromOnBeforeRouteHook = await executeOnBeforeRouteHook(pageContextForRoute);
|
|
22
|
+
if (pageContextFromOnBeforeRouteHook) {
|
|
23
|
+
if (pageContextFromOnBeforeRouteHook._routingProvidedByOnBeforeRouteHook) {
|
|
24
|
+
assert(pageContextFromOnBeforeRouteHook._pageId);
|
|
25
|
+
return pageContextFromOnBeforeRouteHook;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
objectAssign(pageContextFromRoute, pageContextFromOnBeforeRouteHook);
|
|
40
29
|
}
|
|
41
30
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
// We take into account pageContext.urlLogical set by onBeforeRoute()
|
|
32
|
+
const pageContext = {};
|
|
33
|
+
objectAssign(pageContext, pageContextForRoute);
|
|
34
|
+
objectAssign(pageContext, pageContextFromOnBeforeRouteHook);
|
|
45
35
|
// Vike's routing
|
|
46
36
|
const allPageIds = pageContext._allPageIds;
|
|
47
37
|
assert(allPageIds.length >= 0);
|
|
@@ -93,21 +83,21 @@ async function route(pageContext) {
|
|
|
93
83
|
resolvePrecendence(routeMatches);
|
|
94
84
|
const winner = routeMatches[0];
|
|
95
85
|
debug(`Route matches for URL ${pc.cyan(urlPathname)} (in precedence order):`, routeMatches);
|
|
96
|
-
objectAssign(
|
|
86
|
+
objectAssign(pageContextFromRoute, { _debugRouteMatches: routeMatches });
|
|
97
87
|
if (!winner) {
|
|
98
|
-
objectAssign(
|
|
88
|
+
objectAssign(pageContextFromRoute, {
|
|
99
89
|
_pageId: null,
|
|
100
90
|
routeParams: {}
|
|
101
91
|
});
|
|
102
|
-
return
|
|
92
|
+
return pageContextFromRoute;
|
|
103
93
|
}
|
|
104
94
|
{
|
|
105
95
|
const { routeParams } = winner;
|
|
106
96
|
assert(isPlainObject(routeParams));
|
|
107
|
-
objectAssign(
|
|
97
|
+
objectAssign(pageContextFromRoute, {
|
|
108
98
|
_pageId: winner.pageId,
|
|
109
99
|
routeParams: winner.routeParams
|
|
110
100
|
});
|
|
111
101
|
}
|
|
112
|
-
return
|
|
102
|
+
return pageContextFromRoute;
|
|
113
103
|
}
|
|
@@ -9,7 +9,7 @@ async function resolveRouteFunction(routeFunction, pageContext, routeDefinedAt)
|
|
|
9
9
|
assertPageContextUrlComputedProps(pageContext);
|
|
10
10
|
let result = routeFunction(pageContext);
|
|
11
11
|
assertSyncRouting(result, `The Route Function ${routeDefinedAt}`);
|
|
12
|
-
// TODO/v1-release
|
|
12
|
+
// TODO/v1-release: make resolveRouteFunction() and route() sync
|
|
13
13
|
//* We disallow asynchronous routing, because we need to check whether a link is a Vike link in a synchronous fashion before calling ev.preventDefault() in the 'click' event listener
|
|
14
14
|
result = await result;
|
|
15
15
|
//*/
|
|
@@ -15,7 +15,7 @@ export * from '../utils/stringifyStringArray.js';
|
|
|
15
15
|
export * from '../utils/filesystemPathHandling.js';
|
|
16
16
|
export * from '../utils/cast.js';
|
|
17
17
|
export * from '../utils/projectInfo.js';
|
|
18
|
-
export * from '../utils/
|
|
18
|
+
export * from '../utils/isPropertyGetter.js';
|
|
19
19
|
export * from '../utils/isPromise.js';
|
|
20
20
|
export * from '../utils/checkType.js';
|
|
21
21
|
export * from '../utils/objectEntries.js';
|
package/dist/esm/shared/utils.js
CHANGED
|
@@ -19,7 +19,7 @@ export * from '../utils/stringifyStringArray.js';
|
|
|
19
19
|
export * from '../utils/filesystemPathHandling.js';
|
|
20
20
|
export * from '../utils/cast.js';
|
|
21
21
|
export * from '../utils/projectInfo.js';
|
|
22
|
-
export * from '../utils/
|
|
22
|
+
export * from '../utils/isPropertyGetter.js';
|
|
23
23
|
export * from '../utils/isPromise.js';
|
|
24
24
|
export * from '../utils/checkType.js';
|
|
25
25
|
export * from '../utils/objectEntries.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isPropertyGetter(obj: Object, prop: string): boolean;
|
|
@@ -5,7 +5,7 @@ type ProjectVersion = typeof projectInfo.projectVersion;
|
|
|
5
5
|
type ProjectTag = `[${PackageName}]` | `[${PackageName}@${ProjectVersion}]`;
|
|
6
6
|
declare const projectInfo: {
|
|
7
7
|
projectName: "Vike";
|
|
8
|
-
projectVersion: "0.4.144-commit-
|
|
8
|
+
projectVersion: "0.4.144-commit-de18325";
|
|
9
9
|
npmPackageName: "vike";
|
|
10
10
|
githubRepository: "https://github.com/vikejs/vike";
|
|
11
11
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { projectInfo };
|
|
2
2
|
import { onProjectInfo } from './assertSingleInstance.js';
|
|
3
|
-
const PROJECT_VERSION = '0.4.144-commit-
|
|
3
|
+
const PROJECT_VERSION = '0.4.144-commit-de18325';
|
|
4
4
|
const projectInfo = {
|
|
5
5
|
projectName: 'Vike',
|
|
6
6
|
projectVersion: PROJECT_VERSION,
|
package/package.json
CHANGED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export { getPageId };
|
|
2
|
-
declare function getPageId(url: string): Promise<{
|
|
3
|
-
pageId: null;
|
|
4
|
-
pageFilesAll: import("../../shared/getPageFiles/getPageFileObject.js").PageFile[];
|
|
5
|
-
pageConfigs: import("../../shared/page-configs/PageConfig.js").PageConfigRuntime[];
|
|
6
|
-
} | {
|
|
7
|
-
pageId: string;
|
|
8
|
-
pageFilesAll: import("../../shared/getPageFiles/getPageFileObject.js").PageFile[];
|
|
9
|
-
pageConfigs: import("../../shared/page-configs/PageConfig.js").PageConfigRuntime[];
|
|
10
|
-
}>;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export { getPageId };
|
|
2
|
-
import { route } from '../../shared/route/index.js';
|
|
3
|
-
import { createPageContext } from './createPageContext.js';
|
|
4
|
-
async function getPageId(url) {
|
|
5
|
-
const pageContext = await createPageContext({ urlOriginal: url });
|
|
6
|
-
const routeContext = await route(pageContext);
|
|
7
|
-
const pageFilesAll = pageContext._pageFilesAll;
|
|
8
|
-
const pageConfigs = pageContext._pageConfigs;
|
|
9
|
-
if (!('pageContextAddendum' in routeContext)) {
|
|
10
|
-
return { pageId: null, pageFilesAll, pageConfigs };
|
|
11
|
-
}
|
|
12
|
-
const pageId = routeContext.pageContextAddendum._pageId;
|
|
13
|
-
if (!pageId) {
|
|
14
|
-
return { pageId: null, pageFilesAll, pageConfigs };
|
|
15
|
-
}
|
|
16
|
-
return { pageId, pageFilesAll, pageConfigs };
|
|
17
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export { isClientSideRoutable };
|
|
2
|
-
import { getPageId } from '../getPageId.js';
|
|
3
|
-
import { analyzePageClientSideInit } from '../../../shared/getPageFiles/analyzePageClientSide.js';
|
|
4
|
-
import { findPageConfig } from '../../../shared/page-configs/findPageConfig.js';
|
|
5
|
-
import { analyzeClientSide } from '../../../shared/getPageFiles/analyzeClientSide.js';
|
|
6
|
-
async function isClientSideRoutable(url) {
|
|
7
|
-
const { pageId, pageFilesAll, pageConfigs } = await getPageId(url);
|
|
8
|
-
if (!pageId) {
|
|
9
|
-
return false;
|
|
10
|
-
}
|
|
11
|
-
await analyzePageClientSideInit(pageFilesAll, pageId, { sharedPageFilesAlreadyLoaded: false });
|
|
12
|
-
const pageConfig = findPageConfig(pageConfigs, pageId);
|
|
13
|
-
const { isClientSideRenderable, isClientRouting } = analyzeClientSide(pageConfig, pageFilesAll, pageId);
|
|
14
|
-
return isClientSideRenderable && isClientRouting;
|
|
15
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { useClientRouter };
|
|
2
|
-
export { disableClientRouting };
|
|
3
|
-
export { isDisableAutomaticLinkInterception };
|
|
4
|
-
declare function disableClientRouting(err: unknown, log: boolean): void;
|
|
5
|
-
declare function useClientRouter(): void;
|
|
6
|
-
declare function isDisableAutomaticLinkInterception(): boolean;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function hasPropertyGetter(obj: Object, prop: string): boolean;
|