vike 0.4.171-commit-bb72501 → 0.4.171-commit-f9548df
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/node/plugin/shared/addSsrMiddleware.js +12 -4
- package/dist/cjs/node/prerender/runPrerender.js +30 -11
- package/dist/cjs/node/prerender/utils.js +1 -0
- package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
- package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
- package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +22 -3
- package/dist/cjs/node/runtime/utils.js +1 -0
- package/dist/cjs/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +50 -42
- package/dist/cjs/shared/route/index.js +2 -2
- package/dist/cjs/shared/route/resolveRouteFunction.js +2 -2
- package/dist/cjs/shared/utils.js +2 -0
- package/dist/cjs/utils/assert.js +1 -1
- package/dist/cjs/utils/assertNodeVersion.js +1 -1
- package/dist/cjs/utils/changeEnumerable.js +9 -0
- package/dist/cjs/utils/normalizeHeaders.js +13 -0
- package/dist/cjs/utils/objectAssign.js +1 -1
- package/dist/cjs/utils/objectDefineProperty.js +8 -0
- package/dist/cjs/utils/projectInfo.js +1 -1
- package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +4 -2
- package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +11 -7
- package/dist/esm/client/shared/loadUserFilesClientSide.js +4 -4
- package/dist/esm/node/plugin/shared/addSsrMiddleware.js +9 -4
- package/dist/esm/node/prerender/runPrerender.js +31 -12
- package/dist/esm/node/prerender/utils.d.ts +1 -0
- package/dist/esm/node/prerender/utils.js +1 -0
- package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
- package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -9
- package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
- package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
- package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +55 -46
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +23 -4
- package/dist/esm/node/runtime/utils.d.ts +1 -0
- package/dist/esm/node/runtime/utils.js +1 -0
- package/dist/esm/shared/{addUrlComputedProps.d.ts → getPageContextUrlComputed.d.ts} +23 -21
- package/dist/esm/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +50 -42
- package/dist/esm/shared/route/index.d.ts +3 -3
- package/dist/esm/shared/route/index.js +2 -2
- package/dist/esm/shared/route/resolveRouteFunction.d.ts +2 -2
- package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
- package/dist/esm/shared/types.d.ts +24 -4
- package/dist/esm/shared/utils.d.ts +2 -0
- package/dist/esm/shared/utils.js +2 -0
- package/dist/esm/types/index.d.ts +1 -1
- package/dist/esm/utils/assert.js +1 -1
- package/dist/esm/utils/assertNodeVersion.js +1 -1
- package/dist/esm/utils/changeEnumerable.d.ts +2 -0
- package/dist/esm/utils/changeEnumerable.js +5 -0
- package/dist/esm/utils/normalizeHeaders.d.ts +1 -0
- package/dist/esm/utils/normalizeHeaders.js +9 -0
- package/dist/esm/utils/objectAssign.js +1 -1
- package/dist/esm/utils/objectDefineProperty.d.ts +4 -0
- package/dist/esm/utils/objectDefineProperty.js +4 -0
- package/dist/esm/utils/projectInfo.d.ts +2 -2
- package/dist/esm/utils/projectInfo.js +1 -1
- package/package.json +2 -2
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.addSsrMiddleware = void 0;
|
|
4
7
|
const renderPage_js_1 = require("../../runtime/renderPage.js");
|
|
5
8
|
const utils_js_1 = require("../utils.js");
|
|
9
|
+
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
|
|
6
10
|
function addSsrMiddleware(middlewares) {
|
|
7
11
|
middlewares.use(async (req, res, next) => {
|
|
8
12
|
if (res.headersSent)
|
|
@@ -13,15 +17,19 @@ function addSsrMiddleware(middlewares) {
|
|
|
13
17
|
const { headers } = req;
|
|
14
18
|
const pageContextInit = {
|
|
15
19
|
urlOriginal: url,
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
headersOriginal: headers
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(pageContextInit, 'userAgent', {
|
|
23
|
+
get() {
|
|
24
|
+
// TODO/next-major-release: assertUsage() instead of assertWarning()
|
|
25
|
+
(0, utils_js_1.assertWarning)(false, `${picocolors_1.default.cyan('pageContext.userAgent')} is deprecated: use ${picocolors_1.default.cyan("pageContext.headers['user-agent']")} instead.`, {
|
|
18
26
|
showStackTrace: true,
|
|
19
27
|
onlyOnce: true
|
|
20
28
|
});
|
|
21
29
|
return headers['user-agent'];
|
|
22
30
|
},
|
|
23
|
-
|
|
24
|
-
};
|
|
31
|
+
enumerable: false
|
|
32
|
+
});
|
|
25
33
|
let pageContext;
|
|
26
34
|
try {
|
|
27
35
|
pageContext = await (0, renderPage_js_1.renderPage)(pageContextInit);
|
|
@@ -44,7 +44,7 @@ const helpers_js_1 = require("../../shared/page-configs/helpers.js");
|
|
|
44
44
|
const getConfigValue_js_1 = require("../../shared/page-configs/getConfigValue.js");
|
|
45
45
|
const loadConfigValues_js_1 = require("../../shared/page-configs/loadConfigValues.js");
|
|
46
46
|
const error_page_js_1 = require("../../shared/error-page.js");
|
|
47
|
-
const
|
|
47
|
+
const getPageContextUrlComputed_js_1 = require("../../shared/getPageContextUrlComputed.js");
|
|
48
48
|
const abort_js_1 = require("../../shared/route/abort.js");
|
|
49
49
|
const loadUserFilesServerSide_js_1 = require("../runtime/renderPage/loadUserFilesServerSide.js");
|
|
50
50
|
const getHook_js_1 = require("../../shared/hooks/getHook.js");
|
|
@@ -268,9 +268,9 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
|
|
|
268
268
|
prerenderContext.pageContexts.push(pageContextNew);
|
|
269
269
|
if (pageContext) {
|
|
270
270
|
(0, utils_js_1.objectAssign)(pageContextNew, {
|
|
271
|
-
_pageContextAlreadyProvidedByOnPrerenderHook: true
|
|
272
|
-
...pageContext
|
|
271
|
+
_pageContextAlreadyProvidedByOnPrerenderHook: true
|
|
273
272
|
});
|
|
273
|
+
(0, utils_js_1.objectAssign)(pageContextNew, pageContext);
|
|
274
274
|
}
|
|
275
275
|
});
|
|
276
276
|
})));
|
|
@@ -328,14 +328,11 @@ function createPageContext(urlOriginal, renderContext, prerenderContext) {
|
|
|
328
328
|
_prerenderContext: prerenderContext
|
|
329
329
|
};
|
|
330
330
|
const pageContextInit = {
|
|
331
|
-
urlOriginal
|
|
332
|
-
...prerenderContext.pageContextInit
|
|
331
|
+
urlOriginal
|
|
333
332
|
};
|
|
333
|
+
(0, utils_js_1.objectAssign)(pageContextInit, prerenderContext.pageContextInit);
|
|
334
334
|
{
|
|
335
|
-
const pageContextInitEnhanced = (0, renderPageAlreadyRouted_js_1.getPageContextInitEnhanced)(pageContextInit, renderContext
|
|
336
|
-
// We set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in a onPrerenderStart() hook, e.g. /examples/i18n/
|
|
337
|
-
urlComputedPropsNonEnumerable: true
|
|
338
|
-
});
|
|
335
|
+
const pageContextInitEnhanced = (0, renderPageAlreadyRouted_js_1.getPageContextInitEnhanced)(pageContextInit, renderContext);
|
|
339
336
|
(0, utils_js_1.objectAssign)(pageContext, pageContextInitEnhanced);
|
|
340
337
|
}
|
|
341
338
|
return pageContext;
|
|
@@ -410,6 +407,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
|
|
|
410
407
|
pageContext._urlOriginalBeforeHook = pageContext.urlOriginal;
|
|
411
408
|
});
|
|
412
409
|
const docLink = 'https://vike.dev/i18n#pre-rendering';
|
|
410
|
+
// Set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in onPrerenderStart() hook, e.g. /examples/i18n/
|
|
411
|
+
const { restoreEnumerable, addPageContextComputedUrl } = makePageContextComputedUrlNonEnumerable(prerenderContext.pageContexts);
|
|
413
412
|
let result = await (0, executeHook_js_1.executeHook)(() => hookFn({
|
|
414
413
|
pageContexts: prerenderContext.pageContexts,
|
|
415
414
|
// TODO/v1-release: remove warning
|
|
@@ -421,6 +420,7 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
|
|
|
421
420
|
return prerenderContext.pageContexts;
|
|
422
421
|
}
|
|
423
422
|
}), onPrerenderStartHook, null);
|
|
423
|
+
restoreEnumerable();
|
|
424
424
|
if (result === null || result === undefined) {
|
|
425
425
|
return;
|
|
426
426
|
}
|
|
@@ -458,9 +458,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
|
|
|
458
458
|
hookName
|
|
459
459
|
};
|
|
460
460
|
}
|
|
461
|
-
// Restore as URL computed props are lost when user makes a pageContext copy
|
|
462
|
-
(0, addUrlComputedProps_js_1.addUrlComputedProps)(pageContext);
|
|
463
461
|
});
|
|
462
|
+
addPageContextComputedUrl(prerenderContext.pageContexts);
|
|
464
463
|
}
|
|
465
464
|
async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete) {
|
|
466
465
|
const globalContext = (0, globalContext_js_1.getGlobalContext)();
|
|
@@ -743,3 +742,23 @@ function assertIsNotAbort(err, urlOr404) {
|
|
|
743
742
|
(0, utils_js_1.assert)(abortCall);
|
|
744
743
|
(0, utils_js_1.assertUsage)(false, `${picocolors_1.default.cyan(abortCall)} thrown${thrownBy} while pre-rendering ${urlOr404} but ${picocolors_1.default.cyan(abortCaller)} isn't supported for pre-rendered pages`);
|
|
745
744
|
}
|
|
745
|
+
function makePageContextComputedUrlNonEnumerable(pageContexts) {
|
|
746
|
+
change(false);
|
|
747
|
+
return { restoreEnumerable, addPageContextComputedUrl };
|
|
748
|
+
function restoreEnumerable() {
|
|
749
|
+
change(true);
|
|
750
|
+
}
|
|
751
|
+
function addPageContextComputedUrl(pageContexts) {
|
|
752
|
+
// Add URL computed props to the user-generated pageContext copies
|
|
753
|
+
pageContexts.forEach((pageContext) => {
|
|
754
|
+
const pageContextUrlComputed = (0, getPageContextUrlComputed_js_1.getPageContextUrlComputed)(pageContext);
|
|
755
|
+
(0, utils_js_1.objectAssign)(pageContext, pageContextUrlComputed);
|
|
756
|
+
});
|
|
757
|
+
}
|
|
758
|
+
function change(enumerable) {
|
|
759
|
+
pageContexts.forEach((pageContext) => {
|
|
760
|
+
(0, utils_js_1.changeEnumerable)(pageContext, 'urlPathname', enumerable);
|
|
761
|
+
(0, utils_js_1.changeEnumerable)(pageContext, 'urlParsed', enumerable);
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
}
|
|
@@ -31,3 +31,4 @@ __exportStar(require("../../utils/assertNodeEnv.js"), exports);
|
|
|
31
31
|
__exportStar(require("../../utils/pLimit.js"), exports);
|
|
32
32
|
__exportStar(require("../../utils/assertPathFilesystemAbsolute.js"), exports);
|
|
33
33
|
__exportStar(require("../../utils/isArray.js"), exports);
|
|
34
|
+
__exportStar(require("../../utils/changeEnumerable.js"), exports);
|
|
@@ -69,13 +69,13 @@ function getRenderHook(pageContext) {
|
|
|
69
69
|
(0, utils_js_1.assertUsage)(false, [
|
|
70
70
|
`No ${hookName}() hook found, see https://vike.dev/${hookName}`
|
|
71
71
|
/*
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
72
|
+
'See https://vike.dev/render-modes for more information.',
|
|
73
|
+
[
|
|
74
|
+
// 'Loaded config files (none of them define the onRenderHtml() hook):',
|
|
75
|
+
'Loaded server-side page files (none of them `export { render }`):',
|
|
76
|
+
...pageContext._pageFilePathsLoaded.map((f, i) => ` (${i + 1}): ${f}`)
|
|
77
|
+
].join('\n')
|
|
78
|
+
*/
|
|
79
79
|
].join(' '));
|
|
80
80
|
}
|
|
81
81
|
return hookFound;
|
|
@@ -12,7 +12,7 @@ const globalContext_js_1 = require("../globalContext.js");
|
|
|
12
12
|
const loadConfigValues_js_1 = require("../../../shared/page-configs/loadConfigValues.js");
|
|
13
13
|
async function loadUserFilesServerSide(pageContext) {
|
|
14
14
|
const pageConfig = (0, findPageConfig_js_1.findPageConfig)(pageContext._pageConfigs, pageContext._pageId); // Make pageConfig globally available as pageContext._pageConfig?
|
|
15
|
-
const [{ pageFilesLoaded,
|
|
15
|
+
const [{ pageFilesLoaded, pageContextExports }] = await Promise.all([
|
|
16
16
|
loadPageUserFiles(pageContext._pageFilesAll, pageConfig, pageContext._pageId, !(0, globalContext_js_1.getGlobalContext)().isProduction),
|
|
17
17
|
(0, analyzePageClientSide_js_1.analyzePageClientSideInit)(pageContext._pageFilesAll, pageContext._pageId, { sharedPageFilesAlreadyLoaded: true })
|
|
18
18
|
]);
|
|
@@ -37,8 +37,8 @@ async function loadUserFilesServerSide(pageContext) {
|
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
const pageContextAddendum = {};
|
|
40
|
+
(0, utils_js_1.objectAssign)(pageContextAddendum, pageContextExports);
|
|
40
41
|
(0, utils_js_1.objectAssign)(pageContextAddendum, {
|
|
41
|
-
...pageContextExports,
|
|
42
42
|
Page: pageContextExports.exports.Page,
|
|
43
43
|
_isHtmlOnly: isHtmlOnly,
|
|
44
44
|
_passToClient: passToClient,
|
|
@@ -104,8 +104,7 @@ async function loadPageUserFiles(pageFilesAll, pageConfig, pageId, isDev) {
|
|
|
104
104
|
await Promise.all(pageFilesServerSide.map((p) => p.loadFile?.()));
|
|
105
105
|
const pageContextExports = (0, getPageFiles_js_1.getPageContextExports)(pageFilesServerSide, pageConfigLoaded);
|
|
106
106
|
return {
|
|
107
|
-
|
|
108
|
-
pageFilesLoaded: pageFilesServerSide
|
|
109
|
-
pageConfigLoaded
|
|
107
|
+
pageContextExports,
|
|
108
|
+
pageFilesLoaded: pageFilesServerSide
|
|
110
109
|
};
|
|
111
110
|
}
|
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.preparePageContextForUserConsumptionServerSide = void 0;
|
|
4
4
|
const utils_js_1 = require("../utils.js");
|
|
5
5
|
const sortPageContext_js_1 = require("../../../shared/sortPageContext.js");
|
|
6
|
-
const
|
|
6
|
+
const getPageContextUrlComputed_js_1 = require("../../../shared/getPageContextUrlComputed.js");
|
|
7
7
|
const addIs404ToPageProps_js_1 = require("../../../shared/addIs404ToPageProps.js");
|
|
8
8
|
function preparePageContextForUserConsumptionServerSide(pageContext) {
|
|
9
|
-
(0,
|
|
9
|
+
(0, getPageContextUrlComputed_js_1.assertPageContextUrl)(pageContext);
|
|
10
10
|
(0, utils_js_1.assert)((0, utils_js_1.isPlainObject)(pageContext.routeParams));
|
|
11
11
|
(0, utils_js_1.assert)('Page' in pageContext);
|
|
12
12
|
(0, utils_js_1.assert)((0, utils_js_1.isObject)(pageContext.pageExports));
|
|
@@ -9,7 +9,7 @@ const renderHtml_js_1 = require("../html/renderHtml.js");
|
|
|
9
9
|
const getPageFiles_js_1 = require("../../../shared/getPageFiles.js");
|
|
10
10
|
const utils_js_1 = require("../utils.js");
|
|
11
11
|
const serializePageContextClientSide_js_1 = require("../html/serializePageContextClientSide.js");
|
|
12
|
-
const
|
|
12
|
+
const getPageContextUrlComputed_js_1 = require("../../../shared/getPageContextUrlComputed.js");
|
|
13
13
|
const globalContext_js_1 = require("../globalContext.js");
|
|
14
14
|
const createHttpResponseObject_js_1 = require("./createHttpResponseObject.js");
|
|
15
15
|
const loadUserFilesServerSide_js_1 = require("./loadUserFilesServerSide.js");
|
|
@@ -120,7 +120,7 @@ async function prerender404Page(renderContext, pageContextInit_) {
|
|
|
120
120
|
return prerenderPage(pageContext);
|
|
121
121
|
}
|
|
122
122
|
exports.prerender404Page = prerender404Page;
|
|
123
|
-
function getPageContextInitEnhanced(pageContextInit, renderContext, {
|
|
123
|
+
function getPageContextInitEnhanced(pageContextInit, renderContext, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
|
|
124
124
|
urlRewrite: null,
|
|
125
125
|
urlHandler: null,
|
|
126
126
|
isClientSideNavigation: false
|
|
@@ -147,7 +147,26 @@ function getPageContextInitEnhanced(pageContextInit, renderContext, { urlCompute
|
|
|
147
147
|
_urlHandler: urlHandler,
|
|
148
148
|
isClientSideNavigation
|
|
149
149
|
});
|
|
150
|
-
|
|
150
|
+
// pageContext.urlParsed
|
|
151
|
+
const pageContextUrlComputed = (0, getPageContextUrlComputed_js_1.getPageContextUrlComputed)(pageContextInitEnhanced);
|
|
152
|
+
(0, utils_js_1.objectAssign)(pageContextInitEnhanced, pageContextUrlComputed);
|
|
153
|
+
// pageContext.headers
|
|
154
|
+
{
|
|
155
|
+
let headers;
|
|
156
|
+
if (pageContextInit.headersOriginal) {
|
|
157
|
+
headers = (0, utils_js_1.normalizeHeaders)(pageContextInit.headersOriginal);
|
|
158
|
+
(0, utils_js_1.assertUsage)(!('headers' in pageContextInit), "You're defining pageContextInit.headersOriginal as well as pageContextInit.headers but you should only define pageContextInit.headersOriginal instead, see https://vike.dev/headers");
|
|
159
|
+
}
|
|
160
|
+
else if (pageContextInit.headers) {
|
|
161
|
+
headers = pageContextInit.headers;
|
|
162
|
+
// TODO/next-major-release: assertUsage() instead of assertWarning()
|
|
163
|
+
(0, utils_js_1.assertWarning)(false, 'Setting pageContextInit.headers is deprecated: set pageContextInit.headersOriginal instead, see https://vike.dev/headers', { onlyOnce: true });
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
headers = null;
|
|
167
|
+
}
|
|
168
|
+
(0, utils_js_1.objectAssign)(pageContextInitEnhanced, { headers });
|
|
169
|
+
}
|
|
151
170
|
return pageContextInitEnhanced;
|
|
152
171
|
}
|
|
153
172
|
exports.getPageContextInitEnhanced = getPageContextInitEnhanced;
|
|
@@ -69,3 +69,4 @@ __exportStar(require("../../utils/formatHintLog.js"), exports);
|
|
|
69
69
|
__exportStar(require("../../utils/joinEnglish.js"), exports);
|
|
70
70
|
__exportStar(require("../../utils/isArrayOfStrings.js"), exports);
|
|
71
71
|
__exportStar(require("../../utils/escapeHtml.js"), exports);
|
|
72
|
+
__exportStar(require("../../utils/normalizeHeaders.js"), exports);
|
|
@@ -1,48 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// URLs props need to be computed props, because the user can modify the URL e.g. with onBeforeRoute() for i18n
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
3
|
+
exports.assertPageContextUrl = exports.getPageContextUrlComputed = void 0;
|
|
4
|
+
// =====================
|
|
5
|
+
// File determining the URL logic.
|
|
6
|
+
// URLs need to be computed, because the user can modify the URL e.g. with onBeforeRoute() for i18n.
|
|
7
|
+
// =====================
|
|
8
|
+
const objectDefineProperty_js_1 = require("../utils/objectDefineProperty.js");
|
|
5
9
|
const utils_js_1 = require("./utils.js");
|
|
6
|
-
function
|
|
7
|
-
(0, utils_js_1.assert)(pageContext.urlOriginal);
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
```js
|
|
12
|
-
// Add property getters such as pageContext.urlPathname to pageContext
|
|
13
|
-
addUrlComputedProps(pageContext)
|
|
14
|
-
// ❌ Breaks the property getters of pageContext set by addUrlComputedProps() such as pageContext.urlPathname
|
|
15
|
-
Object.assign(pageContext2, pageContext)
|
|
16
|
-
// ❌ Also breaks the property getters
|
|
17
|
-
const pageContext3 = { ...pageContext }
|
|
18
|
-
// ✅ Preserves property getters of pageContext (see objectAssign() implementation)
|
|
19
|
-
objectAssign(pageContext2, pageContext)
|
|
20
|
-
```
|
|
21
|
-
*/
|
|
22
|
-
(0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'urlPathname'));
|
|
23
|
-
}
|
|
24
|
-
if ('urlParsed' in pageContext)
|
|
25
|
-
(0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'urlParsed'));
|
|
26
|
-
// TODO/v1-release: move pageContext.urlParsed to pageContext.url
|
|
27
|
-
if ('url' in pageContext)
|
|
28
|
-
(0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'url'));
|
|
29
|
-
Object.defineProperty(pageContext, 'urlPathname', {
|
|
10
|
+
function getPageContextUrlComputed(pageContext) {
|
|
11
|
+
(0, utils_js_1.assert)(typeof pageContext.urlOriginal === 'string');
|
|
12
|
+
assertPageContextUrlComputed(pageContext);
|
|
13
|
+
const pageContextUrlComputed = {};
|
|
14
|
+
(0, objectDefineProperty_js_1.objectDefineProperty)(pageContextUrlComputed, 'urlPathname', {
|
|
30
15
|
get: urlPathnameGetter,
|
|
31
|
-
enumerable,
|
|
16
|
+
enumerable: true,
|
|
32
17
|
configurable: true
|
|
33
18
|
});
|
|
34
|
-
|
|
19
|
+
(0, objectDefineProperty_js_1.objectDefineProperty)(pageContextUrlComputed, 'url', {
|
|
35
20
|
get: urlGetter,
|
|
36
21
|
enumerable: false,
|
|
37
22
|
configurable: true
|
|
38
23
|
});
|
|
39
|
-
|
|
24
|
+
(0, objectDefineProperty_js_1.objectDefineProperty)(pageContextUrlComputed, 'urlParsed', {
|
|
40
25
|
get: urlParsedGetter,
|
|
41
|
-
enumerable,
|
|
26
|
+
enumerable: true,
|
|
42
27
|
configurable: true
|
|
43
28
|
});
|
|
29
|
+
return pageContextUrlComputed;
|
|
44
30
|
}
|
|
45
|
-
exports.
|
|
31
|
+
exports.getPageContextUrlComputed = getPageContextUrlComputed;
|
|
46
32
|
function getUrlParsed(pageContext) {
|
|
47
33
|
// We need a url handler function because the onBeforeRoute() hook may set pageContext.urlLogical (typically for i18n)
|
|
48
34
|
let urlHandler = pageContext._urlHandler;
|
|
@@ -92,7 +78,7 @@ function urlParsedGetter() {
|
|
|
92
78
|
const { origin, pathname, pathnameOriginal, search, searchAll, searchOriginal, hash, hashOriginal } = urlParsedOriginal;
|
|
93
79
|
const hashIsAvailable = (0, utils_js_1.isBrowser)();
|
|
94
80
|
const warnHashNotAvailable = (prop) => {
|
|
95
|
-
(0, utils_js_1.assertWarning)(hashIsAvailable, `pageContext.urlParsed.${prop} isn't available on the server-side (HTTP requests don't include the URL hash
|
|
81
|
+
(0, utils_js_1.assertWarning)(hashIsAvailable, `pageContext.urlParsed.${prop} isn't available on the server-side (HTTP requests don't include the URL hash)`, { onlyOnce: true, showStackTrace: true });
|
|
96
82
|
};
|
|
97
83
|
const urlParsed = {
|
|
98
84
|
origin,
|
|
@@ -122,22 +108,44 @@ function urlParsedGetter() {
|
|
|
122
108
|
return searchOriginal;
|
|
123
109
|
}
|
|
124
110
|
};
|
|
125
|
-
|
|
126
|
-
|
|
111
|
+
(0, utils_js_1.changeEnumerable)(urlParsed, 'hashString', false);
|
|
112
|
+
(0, utils_js_1.changeEnumerable)(urlParsed, 'searchString', false);
|
|
127
113
|
if (!hashIsAvailable) {
|
|
128
|
-
|
|
129
|
-
|
|
114
|
+
(0, utils_js_1.changeEnumerable)(urlParsed, 'hash', false);
|
|
115
|
+
(0, utils_js_1.changeEnumerable)(urlParsed, 'hashOriginal', false);
|
|
130
116
|
}
|
|
131
117
|
return urlParsed;
|
|
132
118
|
}
|
|
133
|
-
function
|
|
134
|
-
const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
135
|
-
Object.defineProperty(obj, prop, { ...descriptor, enumerable: false });
|
|
136
|
-
}
|
|
137
|
-
function assertPageContextUrlComputedProps(pageContext) {
|
|
119
|
+
function assertPageContextUrl(pageContext) {
|
|
138
120
|
(0, utils_js_1.assert)(typeof pageContext.urlOriginal === 'string');
|
|
139
121
|
(0, utils_js_1.assert)(typeof pageContext.urlPathname === 'string');
|
|
140
122
|
(0, utils_js_1.assert)((0, utils_js_1.isPlainObject)(pageContext.urlParsed));
|
|
141
123
|
(0, utils_js_1.assert)(pageContext.urlPathname === pageContext.urlParsed.pathname);
|
|
124
|
+
assertPageContextUrlComputed(pageContext);
|
|
125
|
+
}
|
|
126
|
+
exports.assertPageContextUrl = assertPageContextUrl;
|
|
127
|
+
function assertPageContextUrlComputed(pageContext) {
|
|
128
|
+
/*
|
|
129
|
+
If the isPropertyGetter() assertions fail then it's most likely because Object.assign() was used instead of `objectAssign()`:
|
|
130
|
+
```js
|
|
131
|
+
const PageContextUrlComputed = getPageContextUrlComputed(pageContext)
|
|
132
|
+
|
|
133
|
+
// ❌ Breaks the property getters of pageContext set by getPageContextUrlComputed() such as pageContext.urlPathname
|
|
134
|
+
Object.assign(pageContext, pageContextUrlComputed)
|
|
135
|
+
|
|
136
|
+
// ❌ Also breaks property getters
|
|
137
|
+
const pageContext = { ...pageContextUrlComputed }
|
|
138
|
+
|
|
139
|
+
// ✅ Preserves property getters of pageContext (see objectAssign() implementation)
|
|
140
|
+
objectAssign(pageContext, pageContextUrlComputed)
|
|
141
|
+
```
|
|
142
|
+
*/
|
|
143
|
+
if ('urlPathname' in pageContext) {
|
|
144
|
+
(0, utils_js_1.assert)(typeof pageContext.urlPathname === 'string');
|
|
145
|
+
(0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'urlPathname'));
|
|
146
|
+
}
|
|
147
|
+
if ('urlParsed' in pageContext)
|
|
148
|
+
(0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'urlParsed'));
|
|
149
|
+
if ('url' in pageContext)
|
|
150
|
+
(0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'url'));
|
|
142
151
|
}
|
|
143
|
-
exports.assertPageContextUrlComputedProps = assertPageContextUrlComputedProps;
|
|
@@ -11,7 +11,7 @@ if ((0, isBrowser_js_1.isBrowser)()) {
|
|
|
11
11
|
(0, assertRoutingType_js_1.assertClientRouting)();
|
|
12
12
|
}
|
|
13
13
|
const utils_js_1 = require("./utils.js");
|
|
14
|
-
const
|
|
14
|
+
const getPageContextUrlComputed_js_1 = require("../getPageContextUrlComputed.js");
|
|
15
15
|
const resolvePrecedence_js_1 = require("./resolvePrecedence.js");
|
|
16
16
|
const resolveRouteString_js_1 = require("./resolveRouteString.js");
|
|
17
17
|
const resolveRouteFunction_js_1 = require("./resolveRouteFunction.js");
|
|
@@ -20,7 +20,7 @@ const debug_js_1 = require("./debug.js");
|
|
|
20
20
|
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
|
|
21
21
|
async function route(pageContextForRoute) {
|
|
22
22
|
(0, debug_js_1.debug)('Pages routes:', pageContextForRoute._pageRoutes);
|
|
23
|
-
(0,
|
|
23
|
+
(0, getPageContextUrlComputed_js_1.assertPageContextUrl)(pageContextForRoute);
|
|
24
24
|
const pageContextFromRoute = {};
|
|
25
25
|
// onBeforeRoute()
|
|
26
26
|
const pageContextFromOnBeforeRouteHook = await (0, executeOnBeforeRouteHook_js_1.executeOnBeforeRouteHook)(pageContextForRoute);
|
|
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.warnDeprecatedAllowKey = exports.assertSyncRouting = exports.assertRouteParams = exports.resolveRouteFunction = void 0;
|
|
7
|
-
const
|
|
7
|
+
const getPageContextUrlComputed_js_1 = require("../getPageContextUrlComputed.js");
|
|
8
8
|
const utils_js_1 = require("./utils.js");
|
|
9
9
|
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
|
|
10
10
|
async function resolveRouteFunction(routeFunction, pageContext, routeDefinedAtString) {
|
|
11
|
-
(0,
|
|
11
|
+
(0, getPageContextUrlComputed_js_1.assertPageContextUrl)(pageContext);
|
|
12
12
|
let result = routeFunction(pageContext);
|
|
13
13
|
assertSyncRouting(result, `The Route Function ${routeDefinedAtString}`);
|
|
14
14
|
// TODO/v1-release: make resolveRouteFunction() and route() sync
|
package/dist/cjs/shared/utils.js
CHANGED
|
@@ -41,3 +41,5 @@ __exportStar(require("../utils/checkType.js"), exports);
|
|
|
41
41
|
__exportStar(require("../utils/getValuePrintable.js"), exports);
|
|
42
42
|
__exportStar(require("../utils/escapeRegex.js"), exports);
|
|
43
43
|
__exportStar(require("../utils/isArray.js"), exports);
|
|
44
|
+
__exportStar(require("../utils/changeEnumerable.js"), exports);
|
|
45
|
+
__exportStar(require("../utils/objectDefineProperty.js"), exports);
|
package/dist/cjs/utils/assert.js
CHANGED
|
@@ -92,7 +92,7 @@ function assertWarning(condition, msg, { onlyOnce, showStackTrace }) {
|
|
|
92
92
|
}
|
|
93
93
|
globalObject.onBeforeLog?.();
|
|
94
94
|
if (showStackTrace) {
|
|
95
|
-
const err =
|
|
95
|
+
const err = (0, createErrorWithCleanStackTrace_js_1.createErrorWithCleanStackTrace)(msg, numberOfStackTraceLinesToRemove);
|
|
96
96
|
globalObject.showStackTraceList.add(err);
|
|
97
97
|
globalObject.logger(err, 'warn');
|
|
98
98
|
}
|
|
@@ -8,6 +8,6 @@ function assertNodeVersion() {
|
|
|
8
8
|
if (!(0, isNodeJS_js_1.isNodeJS)())
|
|
9
9
|
return;
|
|
10
10
|
const version = process.versions.node;
|
|
11
|
-
(0, assertVersion_js_1.assertVersion)('Node.js', version, '
|
|
11
|
+
(0, assertVersion_js_1.assertVersion)('Node.js', version, '18.0.0');
|
|
12
12
|
}
|
|
13
13
|
exports.assertNodeVersion = assertNodeVersion;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.changeEnumerable = void 0;
|
|
4
|
+
/** Change enumerability of an object property. */
|
|
5
|
+
function changeEnumerable(obj, prop, enumerable) {
|
|
6
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
7
|
+
Object.defineProperty(obj, prop, { ...descriptor, enumerable });
|
|
8
|
+
}
|
|
9
|
+
exports.changeEnumerable = changeEnumerable;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeHeaders = void 0;
|
|
4
|
+
function normalizeHeaders(
|
|
5
|
+
/* This type is precise, too precise which can be annoying: e.g. cannot pass a string[][] argument because it doesn't match the more precise [string,string][] type.
|
|
6
|
+
headersOriginal ConstructorParameters<typeof Headers>[0]
|
|
7
|
+
*/
|
|
8
|
+
headersOriginal) {
|
|
9
|
+
const headersStandard = new Headers(headersOriginal);
|
|
10
|
+
const headers = Object.fromEntries(headersStandard.entries());
|
|
11
|
+
return headers;
|
|
12
|
+
}
|
|
13
|
+
exports.normalizeHeaders = normalizeHeaders;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.objectAssign = void 0;
|
|
4
4
|
// Same as Object.assign() but:
|
|
5
5
|
// - With type inference
|
|
6
|
-
// - Preserves property descriptors, which we need for preserving the getters added by
|
|
6
|
+
// - Preserves property descriptors, which we need for preserving the getters added by getPageContextUrlComputed()
|
|
7
7
|
function objectAssign(obj, objAddendum) {
|
|
8
8
|
if (objAddendum) {
|
|
9
9
|
Object.defineProperties(obj, Object.getOwnPropertyDescriptors(objAddendum));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.objectDefineProperty = void 0;
|
|
4
|
+
/** Like Object.defineProperty() but with type inference */
|
|
5
|
+
function objectDefineProperty(obj, prop, { get, ...args }) {
|
|
6
|
+
Object.defineProperty(obj, prop, { ...args, get });
|
|
7
|
+
}
|
|
8
|
+
exports.objectDefineProperty = objectDefineProperty;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PROJECT_VERSION = exports.projectInfo = void 0;
|
|
4
|
-
const PROJECT_VERSION = '0.4.171-commit-
|
|
4
|
+
const PROJECT_VERSION = '0.4.171-commit-f9548df';
|
|
5
5
|
exports.PROJECT_VERSION = PROJECT_VERSION;
|
|
6
6
|
const projectInfo = {
|
|
7
7
|
projectName: 'Vike',
|
|
@@ -11,6 +11,8 @@ declare function createPageContext(urlOriginal: string): Promise<{
|
|
|
11
11
|
_allPageIds: string[];
|
|
12
12
|
_pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
|
|
13
13
|
_onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
|
|
14
|
-
} &
|
|
15
|
-
|
|
14
|
+
} & {
|
|
15
|
+
urlParsed: import("../../shared/getPageContextUrlComputed.js").Url;
|
|
16
|
+
urlPathname: string;
|
|
17
|
+
url: string;
|
|
16
18
|
}>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export { createPageContext };
|
|
2
|
-
import {
|
|
2
|
+
import { getPageContextUrlComputed } from '../../shared/getPageContextUrlComputed.js';
|
|
3
3
|
import { getPageFilesAll } from '../../shared/getPageFiles.js';
|
|
4
4
|
import { loadPageRoutes } from '../../shared/route/loadPageRoutes.js';
|
|
5
5
|
import { getBaseServer } from './getBaseServer.js';
|
|
6
|
-
import { assert, isBaseServer, getGlobalObject } from './utils.js';
|
|
6
|
+
import { assert, isBaseServer, getGlobalObject, objectAssign } from './utils.js';
|
|
7
7
|
const globalObject = getGlobalObject('createPageContext.ts', {});
|
|
8
8
|
async function createPageContext(urlOriginal) {
|
|
9
9
|
if (!globalObject.pageFilesData) {
|
|
@@ -26,6 +26,7 @@ async function createPageContext(urlOriginal) {
|
|
|
26
26
|
_pageRoutes: pageRoutes,
|
|
27
27
|
_onBeforeRouteHook: onBeforeRouteHook
|
|
28
28
|
};
|
|
29
|
-
|
|
29
|
+
const pageContextUrlComputed = getPageContextUrlComputed(pageContext);
|
|
30
|
+
objectAssign(pageContext, pageContextUrlComputed);
|
|
30
31
|
return pageContext;
|
|
31
32
|
}
|
|
@@ -32,7 +32,9 @@ async function getPageContextFromHooks_isHydration(pageContext) {
|
|
|
32
32
|
_hasPageContextFromServer: true
|
|
33
33
|
};
|
|
34
34
|
for (const hookName of ['data', 'onBeforeRender']) {
|
|
35
|
-
const pageContextForHook = {
|
|
35
|
+
const pageContextForHook = {};
|
|
36
|
+
objectAssign(pageContextForHook, pageContext);
|
|
37
|
+
objectAssign(pageContextForHook, pageContextFromHooks);
|
|
36
38
|
if (hookClientOnlyExists(hookName, pageContextForHook)) {
|
|
37
39
|
const pageContextFromHook = await executeHookClientSide(hookName, pageContextForHook);
|
|
38
40
|
Object.assign(pageContextFromHooks, pageContextFromHook);
|
|
@@ -45,6 +47,9 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
|
|
|
45
47
|
isHydration: false,
|
|
46
48
|
_hasPageContextFromClient: false
|
|
47
49
|
};
|
|
50
|
+
const pageContextForCondition = {};
|
|
51
|
+
objectAssign(pageContextForCondition, pageContext);
|
|
52
|
+
objectAssign(pageContextForCondition, pageContextFromHooks);
|
|
48
53
|
let hasPageContextFromServer = false;
|
|
49
54
|
// If pageContextInit has some client data or if one of the hooks guard(), data() or onBeforeRender() is server-side
|
|
50
55
|
// only, then we need to fetch pageContext from the server.
|
|
@@ -53,7 +58,7 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
|
|
|
53
58
|
// For the error page, we cannot fetch pageContext from the server because the pageContext JSON request is based on the URL
|
|
54
59
|
!isErrorPage &&
|
|
55
60
|
// true if pageContextInit has some client data or at least one of the data() and onBeforeRender() hooks is server-side only:
|
|
56
|
-
(await hasPageContextServer(
|
|
61
|
+
(await hasPageContextServer(pageContextForCondition))) {
|
|
57
62
|
const res = await fetchPageContextFromServer(pageContext);
|
|
58
63
|
if ('is404ServerSideRouted' in res)
|
|
59
64
|
return { is404ServerSideRouted: true };
|
|
@@ -70,11 +75,10 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
|
|
|
70
75
|
// Note: for the error page, we also execute the client-side data() and onBeforeRender() hooks, but maybe we
|
|
71
76
|
// shouldn't? The server-side does it as well (but maybe it shouldn't).
|
|
72
77
|
for (const hookName of ['guard', 'data', 'onBeforeRender']) {
|
|
73
|
-
const pageContextForHook = {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
};
|
|
78
|
+
const pageContextForHook = {};
|
|
79
|
+
objectAssign(pageContextForHook, { _hasPageContextFromServer: hasPageContextFromServer });
|
|
80
|
+
objectAssign(pageContextForHook, pageContext);
|
|
81
|
+
objectAssign(pageContextForHook, pageContextFromHooks);
|
|
78
82
|
if (hookName === 'guard') {
|
|
79
83
|
if (!isErrorPage &&
|
|
80
84
|
// We don't need to call guard() on the client-side if we fetch pageContext from the server side. (Because the `${url}.pageContext.json` HTTP request will already trigger the routing and guard() hook on the server-side.)
|
|
@@ -3,6 +3,7 @@ export { isErrorFetchingStaticAssets };
|
|
|
3
3
|
import { getPageFilesClientSide, getPageContextExports } from '../../shared/getPageFiles.js';
|
|
4
4
|
import { findPageConfig } from '../../shared/page-configs/findPageConfig.js';
|
|
5
5
|
import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
|
|
6
|
+
import { objectAssign } from '../server-routing-runtime/utils.js';
|
|
6
7
|
const stamp = '__whileFetchingAssets';
|
|
7
8
|
async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs) {
|
|
8
9
|
const pageFilesClientSide = getPageFilesClientSide(pageFilesAll, pageId);
|
|
@@ -29,10 +30,9 @@ async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs) {
|
|
|
29
30
|
throw err;
|
|
30
31
|
}
|
|
31
32
|
const pageContextExports = getPageContextExports(pageFilesClientSide, pageConfigLoaded);
|
|
32
|
-
const pageContextAddendum = {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
33
|
+
const pageContextAddendum = {};
|
|
34
|
+
objectAssign(pageContextAddendum, pageContextExports);
|
|
35
|
+
objectAssign(pageContextAddendum, { _pageFilesLoaded: pageFilesClientSide });
|
|
36
36
|
return pageContextAddendum;
|
|
37
37
|
}
|
|
38
38
|
function isErrorFetchingStaticAssets(err) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { addSsrMiddleware };
|
|
2
2
|
import { renderPage } from '../../runtime/renderPage.js';
|
|
3
3
|
import { assertWarning } from '../utils.js';
|
|
4
|
+
import pc from '@brillout/picocolors';
|
|
4
5
|
function addSsrMiddleware(middlewares) {
|
|
5
6
|
middlewares.use(async (req, res, next) => {
|
|
6
7
|
if (res.headersSent)
|
|
@@ -11,15 +12,19 @@ function addSsrMiddleware(middlewares) {
|
|
|
11
12
|
const { headers } = req;
|
|
12
13
|
const pageContextInit = {
|
|
13
14
|
urlOriginal: url,
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
headersOriginal: headers
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(pageContextInit, 'userAgent', {
|
|
18
|
+
get() {
|
|
19
|
+
// TODO/next-major-release: assertUsage() instead of assertWarning()
|
|
20
|
+
assertWarning(false, `${pc.cyan('pageContext.userAgent')} is deprecated: use ${pc.cyan("pageContext.headers['user-agent']")} instead.`, {
|
|
16
21
|
showStackTrace: true,
|
|
17
22
|
onlyOnce: true
|
|
18
23
|
});
|
|
19
24
|
return headers['user-agent'];
|
|
20
25
|
},
|
|
21
|
-
|
|
22
|
-
};
|
|
26
|
+
enumerable: false
|
|
27
|
+
});
|
|
23
28
|
let pageContext;
|
|
24
29
|
try {
|
|
25
30
|
pageContext = await renderPage(pageContextInit);
|