vike 0.4.146 → 0.4.147-commit-f9a91f3
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/index.js +6 -4
- package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +3 -4
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +76 -0
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +61 -40
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +104 -0
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +62 -75
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +43 -17
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +12 -70
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +11 -8
- package/dist/cjs/node/plugin/shared/{getConfigValueSourcesRelevant.js → getConfigValueSourcesNotOverriden.js} +3 -3
- package/dist/cjs/node/plugin/utils.js +2 -0
- package/dist/cjs/node/prerender/runPrerender.js +75 -67
- package/dist/cjs/node/runtime/html/injectAssets/injectAssets__public.js +1 -1
- package/dist/cjs/node/runtime/index-common.js +3 -1
- package/dist/cjs/node/runtime/renderPage/analyzePage.js +2 -2
- package/dist/cjs/node/runtime/renderPage/createHttpResponseObject/assertNoInfiniteHttpRedirect.js +12 -12
- package/dist/cjs/node/runtime/renderPage/createHttpResponseObject.js +3 -3
- package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +1 -2
- package/dist/cjs/node/runtime/renderPage/getHttpResponseBody.js +1 -1
- package/dist/cjs/node/runtime/renderPage.js +75 -51
- package/dist/cjs/shared/getPageFiles/analyzePageClientSide/determineClientEntry.js +1 -0
- package/dist/cjs/shared/page-configs/loadConfigValues.js +12 -3
- package/dist/cjs/shared/page-configs/serialize/parseConfigValuesSerialized.js +19 -0
- package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +3 -12
- package/dist/cjs/shared/route/resolveRedirects.js +8 -5
- package/dist/cjs/utils/assertKeys.js +28 -0
- package/dist/cjs/utils/joinEnglish.js +3 -3
- package/dist/cjs/utils/parseUrl-extras.js +22 -8
- package/dist/cjs/utils/parseUrl.js +24 -16
- package/dist/cjs/utils/projectInfo.js +3 -2
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +25 -11
- package/dist/esm/client/client-routing-runtime/index.d.ts +1 -0
- package/dist/esm/client/client-routing-runtime/index.js +1 -0
- package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +2 -2
- package/dist/esm/client/shared/getPageContextSerializedInHtml.js +1 -1
- package/dist/esm/node/plugin/index.d.ts +1 -0
- package/dist/esm/node/plugin/index.js +1 -0
- package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +3 -4
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.d.ts +5 -0
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +70 -0
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +58 -37
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.d.ts +5 -0
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +98 -0
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +63 -76
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +43 -17
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.d.ts +0 -3
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +13 -68
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +11 -8
- package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.d.ts +5 -0
- package/dist/esm/node/plugin/shared/{getConfigValueSourcesRelevant.js → getConfigValueSourcesNotOverriden.js} +2 -2
- package/dist/esm/node/plugin/utils.d.ts +2 -0
- package/dist/esm/node/plugin/utils.js +2 -0
- package/dist/esm/node/prerender/runPrerender.js +75 -67
- package/dist/esm/node/runtime/html/injectAssets/injectAssets__public.js +1 -1
- package/dist/esm/node/runtime/index-common.d.ts +1 -0
- package/dist/esm/node/runtime/index-common.js +1 -0
- package/dist/esm/node/runtime/renderPage/analyzePage.js +2 -2
- package/dist/esm/node/runtime/renderPage/createHttpResponseObject/assertNoInfiniteHttpRedirect.d.ts +1 -1
- package/dist/esm/node/runtime/renderPage/createHttpResponseObject/assertNoInfiniteHttpRedirect.js +13 -13
- package/dist/esm/node/runtime/renderPage/createHttpResponseObject.d.ts +1 -1
- package/dist/esm/node/runtime/renderPage/createHttpResponseObject.js +3 -3
- package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +1 -2
- package/dist/esm/node/runtime/renderPage/getHttpResponseBody.js +1 -1
- package/dist/esm/node/runtime/renderPage.js +76 -52
- package/dist/esm/shared/getPageFiles/analyzePageClientSide/determineClientEntry.js +1 -0
- package/dist/esm/shared/page-configs/PageConfig.d.ts +14 -4
- package/dist/esm/shared/page-configs/loadConfigValues.js +12 -3
- package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.d.ts +4 -0
- package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.js +16 -0
- package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +4 -13
- package/dist/esm/shared/route/resolveRedirects.js +8 -5
- package/dist/esm/utils/assertKeys.d.ts +4 -0
- package/dist/esm/utils/assertKeys.js +22 -0
- package/dist/esm/utils/joinEnglish.d.ts +1 -1
- package/dist/esm/utils/joinEnglish.js +3 -3
- package/dist/esm/utils/parseUrl-extras.d.ts +3 -1
- package/dist/esm/utils/parseUrl-extras.js +21 -7
- package/dist/esm/utils/parseUrl.js +24 -16
- package/dist/esm/utils/projectInfo.d.ts +3 -1
- package/dist/esm/utils/projectInfo.js +2 -1
- package/package.json +3 -3
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/helpers.js +0 -28
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/helpers.d.ts +0 -5
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/helpers.js +0 -25
- package/dist/esm/node/plugin/shared/getConfigValueSourcesRelevant.d.ts +0 -5
|
@@ -11,7 +11,7 @@ const picocolors_1 = __importDefault(require("@brillout/picocolors"));
|
|
|
11
11
|
const streamDocs = 'See https://vike.dev/stream for more information.';
|
|
12
12
|
function getHttpResponseBody(htmlRender, renderHook) {
|
|
13
13
|
if (typeof htmlRender !== 'string') {
|
|
14
|
-
(0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'body', `Use ${picocolors_1.default.cyan('pageContext.httpResponse.pipe()')}
|
|
14
|
+
(0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'body', `Use ${picocolors_1.default.cyan('pageContext.httpResponse.pipe()')} instead`));
|
|
15
15
|
}
|
|
16
16
|
const body = htmlRender;
|
|
17
17
|
return body;
|
|
@@ -39,17 +39,17 @@ async function renderPage(pageContextInit) {
|
|
|
39
39
|
(0, assertArguments_js_1.assertArguments)(...arguments);
|
|
40
40
|
(0, utils_js_1.assert)((0, utils_js_1.hasProp)(pageContextInit, 'urlOriginal', 'string'));
|
|
41
41
|
(0, utils_js_1.assertEnv)();
|
|
42
|
-
if (
|
|
43
|
-
const
|
|
44
|
-
(0, utils_js_1.checkType)(
|
|
45
|
-
return
|
|
42
|
+
if (isIgnoredUrl(pageContextInit.urlOriginal)) {
|
|
43
|
+
const pageContextHttpResponseNull = getPageContextHttpResponseNull(pageContextInit);
|
|
44
|
+
(0, utils_js_1.checkType)(pageContextHttpResponseNull);
|
|
45
|
+
return pageContextHttpResponseNull;
|
|
46
46
|
}
|
|
47
47
|
const httpRequestId = getRequestId();
|
|
48
|
-
const
|
|
49
|
-
logHttpRequest(
|
|
48
|
+
const { urlOriginal } = pageContextInit;
|
|
49
|
+
logHttpRequest(urlOriginal, httpRequestId);
|
|
50
50
|
globalObject.pendingRequestsCount++;
|
|
51
51
|
const { pageContextReturn, onRequestDone } = await renderPage_wrapper(httpRequestId, () => renderPageAndPrepare(pageContextInit, httpRequestId));
|
|
52
|
-
logHttpResponse(
|
|
52
|
+
logHttpResponse(urlOriginal, httpRequestId, pageContextReturn);
|
|
53
53
|
globalObject.pendingRequestsCount--;
|
|
54
54
|
onRequestDone();
|
|
55
55
|
(0, utils_js_1.checkType)(pageContextReturn);
|
|
@@ -60,8 +60,8 @@ async function renderPageAndPrepare(pageContextInit, httpRequestId) {
|
|
|
60
60
|
// Invalid config
|
|
61
61
|
const handleInvalidConfig = () => {
|
|
62
62
|
(0, loggerRuntime_js_1.logRuntimeInfo)?.(picocolors_1.default.bold(picocolors_1.default.red("Couldn't load configuration: see error above.")), httpRequestId, 'error');
|
|
63
|
-
const
|
|
64
|
-
return
|
|
63
|
+
const pageContextHttpResponseNull = getPageContextHttpResponseNull(pageContextInit);
|
|
64
|
+
return pageContextHttpResponseNull;
|
|
65
65
|
};
|
|
66
66
|
if (isConfigInvalid_js_1.isConfigInvalid) {
|
|
67
67
|
return handleInvalidConfig();
|
|
@@ -77,8 +77,8 @@ async function renderPageAndPrepare(pageContextInit, httpRequestId) {
|
|
|
77
77
|
// initGlobalContext() and getRenderContext() don't call any user hooks => err isn't thrown from user code
|
|
78
78
|
(0, utils_js_1.assert)(!(0, abort_js_1.isAbortError)(err));
|
|
79
79
|
(0, loggerRuntime_js_1.logRuntimeError)(err, httpRequestId);
|
|
80
|
-
const
|
|
81
|
-
return
|
|
80
|
+
const pageContextHttpResponseNull = getPageContextHttpResponseNullWithError(err, pageContextInit);
|
|
81
|
+
return pageContextHttpResponseNull;
|
|
82
82
|
}
|
|
83
83
|
if (isConfigInvalid_js_1.isConfigInvalid) {
|
|
84
84
|
return handleInvalidConfig();
|
|
@@ -86,15 +86,23 @@ async function renderPageAndPrepare(pageContextInit, httpRequestId) {
|
|
|
86
86
|
else {
|
|
87
87
|
// From now on, renderContext.pageConfigs contains all the configuration data; getVikeConfig() isn't called anymore for this request
|
|
88
88
|
}
|
|
89
|
+
// Check Base URL
|
|
90
|
+
{
|
|
91
|
+
const pageContextHttpResponse = checkBaseUrl(pageContextInit, httpRequestId);
|
|
92
|
+
if (pageContextHttpResponse)
|
|
93
|
+
return pageContextHttpResponse;
|
|
94
|
+
}
|
|
95
|
+
// Normalize URL
|
|
89
96
|
{
|
|
90
|
-
const
|
|
91
|
-
if (
|
|
92
|
-
return
|
|
97
|
+
const pageContextHttpResponse = normalizeUrl(pageContextInit, httpRequestId);
|
|
98
|
+
if (pageContextHttpResponse)
|
|
99
|
+
return pageContextHttpResponse;
|
|
93
100
|
}
|
|
101
|
+
// Permanent redirects (HTTP status code `301`)
|
|
94
102
|
{
|
|
95
|
-
const
|
|
96
|
-
if (
|
|
97
|
-
return
|
|
103
|
+
const pageContextHttpResponse = getPermanentRedirect(pageContextInit, httpRequestId);
|
|
104
|
+
if (pageContextHttpResponse)
|
|
105
|
+
return pageContextHttpResponse;
|
|
98
106
|
}
|
|
99
107
|
return await renderPageAlreadyPrepared(pageContextInit, httpRequestId, renderContext, []);
|
|
100
108
|
}
|
|
@@ -177,8 +185,8 @@ async function renderPageAlreadyPrepared(pageContextInit, httpRequestId, renderC
|
|
|
177
185
|
if (!handled.pageContextReturn) {
|
|
178
186
|
const pageContextAbort = errErrorPage._pageContextAbort;
|
|
179
187
|
(0, utils_js_1.assertWarning)(false, `Failed to render error page because ${picocolors_1.default.cyan(pageContextAbort._abortCall)} was called: make sure ${picocolors_1.default.cyan(pageContextAbort._abortCaller)} doesn't occur while the error page is being rendered.`, { onlyOnce: false });
|
|
180
|
-
const
|
|
181
|
-
return
|
|
188
|
+
const pageContextHttpResponseNull = getPageContextHttpResponseNullWithError(errNominalPage, pageContextInit);
|
|
189
|
+
return pageContextHttpResponseNull;
|
|
182
190
|
}
|
|
183
191
|
// `throw redirect()` / `throw render(url)`
|
|
184
192
|
return handled.pageContextReturn;
|
|
@@ -186,18 +194,28 @@ async function renderPageAlreadyPrepared(pageContextInit, httpRequestId, renderC
|
|
|
186
194
|
if ((0, isNewError_js_1.isNewError)(errErrorPage, errNominalPage)) {
|
|
187
195
|
(0, loggerRuntime_js_1.logRuntimeError)(errErrorPage, httpRequestId);
|
|
188
196
|
}
|
|
189
|
-
const
|
|
190
|
-
return
|
|
197
|
+
const pageContextHttpResponseNull = getPageContextHttpResponseNullWithError(errNominalPage, pageContextInit);
|
|
198
|
+
return pageContextHttpResponseNull;
|
|
191
199
|
}
|
|
192
200
|
return pageContextErrorPage;
|
|
193
201
|
}
|
|
194
202
|
}
|
|
195
|
-
function logHttpRequest(
|
|
203
|
+
function logHttpRequest(urlOriginal, httpRequestId) {
|
|
196
204
|
const clearErrors = globalObject.pendingRequestsCount === 0;
|
|
197
|
-
(0, loggerRuntime_js_1.logRuntimeInfo)?.(
|
|
205
|
+
(0, loggerRuntime_js_1.logRuntimeInfo)?.(getRequestInfoMessage(urlOriginal), httpRequestId, 'info', clearErrors);
|
|
198
206
|
}
|
|
199
|
-
function
|
|
207
|
+
function getRequestInfoMessage(urlOriginal) {
|
|
208
|
+
return `HTTP request: ${picocolors_1.default.bold(urlOriginal)}`;
|
|
209
|
+
}
|
|
210
|
+
function logHttpResponse(urlOriginal, httpRequestId, pageContextReturn) {
|
|
200
211
|
const statusCode = pageContextReturn.httpResponse?.statusCode ?? null;
|
|
212
|
+
{
|
|
213
|
+
// If URL doesn't include Base URL
|
|
214
|
+
const { errorWhileRendering } = pageContextReturn;
|
|
215
|
+
const isSkipped = statusCode === null && (errorWhileRendering === null || errorWhileRendering === undefined);
|
|
216
|
+
if (isSkipped)
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
201
219
|
const isSuccess = statusCode !== null && statusCode >= 200 && statusCode <= 399;
|
|
202
220
|
const isNominal = isSuccess || statusCode === 404;
|
|
203
221
|
const color = (s) => picocolors_1.default.bold(isSuccess ? picocolors_1.default.green(String(s)) : picocolors_1.default.red(String(s)));
|
|
@@ -211,39 +229,30 @@ function logHttpResponse(urlToShowToUser, httpRequestId, pageContextReturn) {
|
|
|
211
229
|
.find((header) => header[0] === 'Location');
|
|
212
230
|
(0, utils_js_1.assert)(headerRedirect);
|
|
213
231
|
const urlRedirect = headerRedirect[1];
|
|
214
|
-
|
|
232
|
+
urlOriginal = urlRedirect;
|
|
215
233
|
}
|
|
216
|
-
(0, loggerRuntime_js_1.logRuntimeInfo)?.(`HTTP ${type} ${picocolors_1.default.bold(
|
|
234
|
+
(0, loggerRuntime_js_1.logRuntimeInfo)?.(`HTTP ${type} ${picocolors_1.default.bold(urlOriginal)} ${color(statusCode ?? 'ERR')}`, httpRequestId, isNominal ? 'info' : 'error');
|
|
217
235
|
}
|
|
218
236
|
function getPageContextHttpResponseNullWithError(err, pageContextInit) {
|
|
219
|
-
const
|
|
220
|
-
(0, utils_js_1.objectAssign)(
|
|
221
|
-
(0, utils_js_1.objectAssign)(
|
|
237
|
+
const pageContextHttpResponseNull = {};
|
|
238
|
+
(0, utils_js_1.objectAssign)(pageContextHttpResponseNull, pageContextInit);
|
|
239
|
+
(0, utils_js_1.objectAssign)(pageContextHttpResponseNull, {
|
|
222
240
|
httpResponse: null,
|
|
223
241
|
errorWhileRendering: err
|
|
224
242
|
});
|
|
225
|
-
return
|
|
243
|
+
return pageContextHttpResponseNull;
|
|
226
244
|
}
|
|
227
245
|
function getPageContextHttpResponseNull(pageContextInit) {
|
|
228
|
-
const
|
|
229
|
-
(0, utils_js_1.objectAssign)(
|
|
230
|
-
(0, utils_js_1.objectAssign)(
|
|
246
|
+
const pageContextHttpResponseNull = {};
|
|
247
|
+
(0, utils_js_1.objectAssign)(pageContextHttpResponseNull, pageContextInit);
|
|
248
|
+
(0, utils_js_1.objectAssign)(pageContextHttpResponseNull, {
|
|
231
249
|
httpResponse: null,
|
|
232
250
|
errorWhileRendering: null
|
|
233
251
|
});
|
|
234
|
-
return
|
|
252
|
+
return pageContextHttpResponseNull;
|
|
235
253
|
}
|
|
236
254
|
async function renderPageNominal(pageContext) {
|
|
237
255
|
(0, utils_js_1.objectAssign)(pageContext, { errorWhileRendering: null });
|
|
238
|
-
// Check Base URL
|
|
239
|
-
{
|
|
240
|
-
const { urlWithoutPageContextRequestSuffix } = (0, handlePageContextRequestUrl_js_1.handlePageContextRequestUrl)(pageContext.urlOriginal);
|
|
241
|
-
const hasBaseServer = (0, utils_js_1.parseUrl)(urlWithoutPageContextRequestSuffix, pageContext._baseServer).hasBaseServer || !!pageContext._urlRewrite;
|
|
242
|
-
if (!hasBaseServer) {
|
|
243
|
-
(0, utils_js_1.objectAssign)(pageContext, { httpResponse: null });
|
|
244
|
-
return pageContext;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
256
|
// Route
|
|
248
257
|
{
|
|
249
258
|
const pageContextFromRoute = await (0, index_js_1.route)(pageContext);
|
|
@@ -309,7 +318,7 @@ function getRequestId() {
|
|
|
309
318
|
(0, utils_js_1.assert)(httpRequestId >= 1);
|
|
310
319
|
return httpRequestId;
|
|
311
320
|
}
|
|
312
|
-
function
|
|
321
|
+
function isIgnoredUrl(urlOriginal) {
|
|
313
322
|
const isViteClientRequest = urlOriginal.endsWith('/@vite/client') || urlOriginal.startsWith('/@fs/');
|
|
314
323
|
(0, utils_js_1.assertWarning)(!isViteClientRequest, `The vike middleware renderPage() was called with the URL ${urlOriginal} which is unexpected because the HTTP request should have already been handled by Vite's development middleware. Make sure to 1. install Vite's development middleware and 2. add Vite's middleware *before* Vike's middleware, see https://vike.dev/renderPage`, { onlyOnce: true });
|
|
315
324
|
return (urlOriginal.endsWith('/__vite_ping') ||
|
|
@@ -318,11 +327,11 @@ function skipRequest(urlOriginal) {
|
|
|
318
327
|
isViteClientRequest);
|
|
319
328
|
}
|
|
320
329
|
function normalizeUrl(pageContextInit, httpRequestId) {
|
|
321
|
-
const { trailingSlash, disableUrlNormalization } = (0, globalContext_js_1.getGlobalContext)();
|
|
330
|
+
const { trailingSlash, disableUrlNormalization, baseServer } = (0, globalContext_js_1.getGlobalContext)();
|
|
322
331
|
if (disableUrlNormalization)
|
|
323
332
|
return null;
|
|
324
333
|
const { urlOriginal } = pageContextInit;
|
|
325
|
-
const urlNormalized = (0, utils_js_1.normalizeUrlPathname)(urlOriginal, trailingSlash);
|
|
334
|
+
const urlNormalized = (0, utils_js_1.normalizeUrlPathname)(urlOriginal, trailingSlash, baseServer);
|
|
326
335
|
if (!urlNormalized)
|
|
327
336
|
return null;
|
|
328
337
|
(0, loggerRuntime_js_1.logRuntimeInfo)?.(`URL normalized from ${picocolors_1.default.cyan(urlOriginal)} to ${picocolors_1.default.cyan(urlNormalized)} (https://vike.dev/url-normalization)`, httpRequestId, 'info');
|
|
@@ -333,10 +342,8 @@ function normalizeUrl(pageContextInit, httpRequestId) {
|
|
|
333
342
|
function getPermanentRedirect(pageContextInit, httpRequestId) {
|
|
334
343
|
const { redirects, baseServer } = (0, globalContext_js_1.getGlobalContext)();
|
|
335
344
|
const urlWithoutBase = (0, utils_js_1.removeBaseServer)(pageContextInit.urlOriginal, baseServer);
|
|
336
|
-
let urlOriginalPathnameWithouBase;
|
|
337
345
|
let origin = null;
|
|
338
346
|
let urlTarget = (0, utils_js_1.modifyUrlPathname)(urlWithoutBase, (urlPathname) => {
|
|
339
|
-
urlOriginalPathnameWithouBase = urlPathname;
|
|
340
347
|
const urlTargetWithOrigin = (0, resolveRedirects_js_1.resolveRedirects)(redirects, urlPathname);
|
|
341
348
|
if (urlTargetWithOrigin === null)
|
|
342
349
|
return null;
|
|
@@ -346,13 +353,12 @@ function getPermanentRedirect(pageContextInit, httpRequestId) {
|
|
|
346
353
|
});
|
|
347
354
|
if (origin)
|
|
348
355
|
urlTarget = (0, utils_js_1.addUrlOrigin)(urlTarget, origin);
|
|
349
|
-
(0, utils_js_1.assert)(urlOriginalPathnameWithouBase);
|
|
350
356
|
if (urlTarget === urlWithoutBase)
|
|
351
357
|
return null;
|
|
352
358
|
(0, loggerRuntime_js_1.logRuntimeInfo)?.(`Permanent redirect defined by your config.redirects (https://vike.dev/redirects)`, httpRequestId, 'info');
|
|
353
359
|
urlTarget = (0, utils_js_1.prependBase)(urlTarget, baseServer);
|
|
354
360
|
(0, utils_js_1.assert)(urlTarget !== pageContextInit.urlOriginal);
|
|
355
|
-
const httpResponse = (0, createHttpResponseObject_js_1.createHttpResponseObjectRedirect)({ url: urlTarget, statusCode: 301 },
|
|
361
|
+
const httpResponse = (0, createHttpResponseObject_js_1.createHttpResponseObjectRedirect)({ url: urlTarget, statusCode: 301 }, urlWithoutBase);
|
|
356
362
|
const pageContextHttpResponse = { ...pageContextInit, httpResponse };
|
|
357
363
|
return pageContextHttpResponse;
|
|
358
364
|
}
|
|
@@ -396,10 +402,28 @@ async function handleAbortError(errAbort, pageContextsFromRewrite, pageContextIn
|
|
|
396
402
|
...pageContextInit,
|
|
397
403
|
...pageContextAbort
|
|
398
404
|
};
|
|
399
|
-
const httpResponse = (0, createHttpResponseObject_js_1.createHttpResponseObjectRedirect)(pageContextAbort._urlRedirect,
|
|
405
|
+
const httpResponse = (0, createHttpResponseObject_js_1.createHttpResponseObjectRedirect)(pageContextAbort._urlRedirect, (() => {
|
|
406
|
+
const { pathname, searchOriginal } = pageContextNominalPageInit.urlParsed;
|
|
407
|
+
const urlLogical = (0, utils_js_1.createUrlFromComponents)(null, pathname, searchOriginal,
|
|
408
|
+
// The server-side doesn't have access to the hash
|
|
409
|
+
null);
|
|
410
|
+
return urlLogical;
|
|
411
|
+
})());
|
|
400
412
|
(0, utils_js_1.objectAssign)(pageContextReturn, { httpResponse });
|
|
401
413
|
return { pageContextReturn };
|
|
402
414
|
}
|
|
403
415
|
(0, utils_js_1.assert)(pageContextAbort.abortStatusCode);
|
|
404
416
|
return { pageContextAbort };
|
|
405
417
|
}
|
|
418
|
+
function checkBaseUrl(pageContextInit, httpRequestId) {
|
|
419
|
+
const { baseServer } = (0, globalContext_js_1.getGlobalContext)();
|
|
420
|
+
const { urlOriginal } = pageContextInit;
|
|
421
|
+
const { urlWithoutPageContextRequestSuffix } = (0, handlePageContextRequestUrl_js_1.handlePageContextRequestUrl)(urlOriginal);
|
|
422
|
+
const { hasBaseServer } = (0, utils_js_1.parseUrl)(urlWithoutPageContextRequestSuffix, baseServer);
|
|
423
|
+
if (!hasBaseServer) {
|
|
424
|
+
(0, loggerRuntime_js_1.logRuntimeInfo)?.(`${getRequestInfoMessage(urlOriginal)} skipped because URL ${picocolors_1.default.bold(urlOriginal)} doesn't start with Base URL ${picocolors_1.default.bold(baseServer)} (https://vike.dev/base-url)`, httpRequestId, 'info');
|
|
425
|
+
const pageContextHttpResponseNull = getPageContextHttpResponseNull(pageContextInit);
|
|
426
|
+
return pageContextHttpResponseNull;
|
|
427
|
+
}
|
|
428
|
+
return null;
|
|
429
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// TODO/v1-release: remove
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
4
|
exports.getVikeClientEntry = exports.determineClientEntry = void 0;
|
|
4
5
|
function determineClientEntry({ pageFilesClientSide, pageFilesServerSide, isHtmlOnly, isClientRouting }) {
|
|
@@ -3,15 +3,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.loadConfigValues = void 0;
|
|
4
4
|
const utils_js_1 = require("../utils.js");
|
|
5
5
|
const parseConfigValuesImported_js_1 = require("./serialize/parseConfigValuesImported.js");
|
|
6
|
+
const parseConfigValuesSerialized_js_1 = require("./serialize/parseConfigValuesSerialized.js");
|
|
6
7
|
async function loadConfigValues(pageConfig, isDev) {
|
|
7
8
|
if ('isAllLoaded' in pageConfig &&
|
|
8
9
|
// We don't need to cache in dev, since Vite already caches the virtual module
|
|
9
10
|
!isDev) {
|
|
10
11
|
return pageConfig;
|
|
11
12
|
}
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
const configValuesLoaded = await pageConfig.loadConfigValuesAll();
|
|
14
|
+
{
|
|
15
|
+
const { configValuesImported } = configValuesLoaded;
|
|
16
|
+
const configValuesAddendum = (0, parseConfigValuesImported_js_1.parseConfigValuesImported)(configValuesImported);
|
|
17
|
+
Object.assign(pageConfig.configValues, configValuesAddendum);
|
|
18
|
+
}
|
|
19
|
+
{
|
|
20
|
+
const { configValuesSerialized } = configValuesLoaded;
|
|
21
|
+
const configValuesAddendum = (0, parseConfigValuesSerialized_js_1.parseConfigValuesSerialized)(configValuesSerialized);
|
|
22
|
+
Object.assign(pageConfig.configValues, configValuesAddendum);
|
|
23
|
+
}
|
|
15
24
|
(0, utils_js_1.objectAssign)(pageConfig, { isAllLoaded: true });
|
|
16
25
|
return pageConfig;
|
|
17
26
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseConfigValuesSerialized = void 0;
|
|
4
|
+
const utils_js_1 = require("../../utils.js");
|
|
5
|
+
const parse_1 = require("@brillout/json-serializer/parse");
|
|
6
|
+
function parseConfigValuesSerialized(configValuesSerialized) {
|
|
7
|
+
const configValues = {};
|
|
8
|
+
Object.entries(configValuesSerialized).forEach(([configName, configValueSeriliazed]) => {
|
|
9
|
+
const { valueSerialized, definedAt } = configValueSeriliazed;
|
|
10
|
+
(0, utils_js_1.assert)(valueSerialized);
|
|
11
|
+
(0, utils_js_1.assert)(!configValues[configName]);
|
|
12
|
+
configValues[configName] = {
|
|
13
|
+
value: (0, parse_1.parse)(valueSerialized),
|
|
14
|
+
definedAt
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
return configValues;
|
|
18
|
+
}
|
|
19
|
+
exports.parseConfigValuesSerialized = parseConfigValuesSerialized;
|
|
@@ -1,26 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parsePageConfigs = void 0;
|
|
4
|
-
const parse_1 = require("@brillout/json-serializer/parse");
|
|
5
4
|
const parseConfigValuesImported_js_1 = require("./parseConfigValuesImported.js");
|
|
6
5
|
const utils_js_1 = require("../../utils.js");
|
|
7
6
|
const helpers_js_1 = require("../helpers.js");
|
|
7
|
+
const parseConfigValuesSerialized_js_1 = require("./parseConfigValuesSerialized.js");
|
|
8
8
|
function parsePageConfigs(pageConfigsSerialized, pageConfigGlobalSerialized) {
|
|
9
9
|
const pageConfigs = pageConfigsSerialized.map((pageConfigSerialized) => {
|
|
10
10
|
const configValues = {};
|
|
11
11
|
{
|
|
12
12
|
const { configValuesSerialized } = pageConfigSerialized;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const { valueSerialized, definedAt } = configValueSeriliazed;
|
|
16
|
-
(0, utils_js_1.assert)(valueSerialized);
|
|
17
|
-
(0, utils_js_1.assert)(!configValues[configName]);
|
|
18
|
-
configValues[configName] = {
|
|
19
|
-
value: (0, parse_1.parse)(valueSerialized),
|
|
20
|
-
definedAt
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
});
|
|
13
|
+
const configValuesAddendum = (0, parseConfigValuesSerialized_js_1.parseConfigValuesSerialized)(configValuesSerialized);
|
|
14
|
+
Object.assign(configValues, configValuesAddendum);
|
|
24
15
|
}
|
|
25
16
|
{
|
|
26
17
|
const { configValuesImported } = pageConfigSerialized;
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.resolveRouteStringRedirect = exports.resolveRedirects = void 0;
|
|
7
7
|
const assertIsNotBrowser_js_1 = require("../../utils/assertIsNotBrowser.js");
|
|
8
|
+
const parseUrl_extras_js_1 = require("../../utils/parseUrl-extras.js");
|
|
8
9
|
const utils_js_1 = require("../utils.js");
|
|
9
10
|
const resolveRouteString_js_1 = require("./resolveRouteString.js");
|
|
10
11
|
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
|
|
@@ -23,9 +24,9 @@ exports.resolveRedirects = resolveRedirects;
|
|
|
23
24
|
function resolveRouteStringRedirect(urlSource, urlTarget, urlPathname) {
|
|
24
25
|
(0, resolveRouteString_js_1.assertRouteString)(urlSource, `${configSrc} Invalid`);
|
|
25
26
|
(0, utils_js_1.assertUsage)(urlTarget.startsWith('/') ||
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
urlTarget === '*', `${configSrc} Invalid redirection target URL ${picocolors_1.default.cyan(urlTarget)}: the target URL should start with ${picocolors_1.default.cyan('/')}, ${picocolors_1.default.cyan('http
|
|
27
|
+
// Is allowing any protocol a safety issue? https://github.com/vikejs/vike/pull/1292#issuecomment-1828043917
|
|
28
|
+
(0, parseUrl_extras_js_1.isUriWithProtocol)(urlTarget) ||
|
|
29
|
+
urlTarget === '*', `${configSrc} Invalid redirection target URL ${picocolors_1.default.cyan(urlTarget)}: the target URL should start with ${picocolors_1.default.cyan('/')}, a valid protocol (${picocolors_1.default.cyan('https:')}, ${picocolors_1.default.cyan('http:')}, ${picocolors_1.default.cyan('ipfs:')}, ${picocolors_1.default.cyan('magnet:')}, ...), or be ${picocolors_1.default.cyan('*')}`);
|
|
29
30
|
assertParams(urlSource, urlTarget);
|
|
30
31
|
const match = (0, resolveRouteString_js_1.resolveRouteString)(urlSource, urlPathname);
|
|
31
32
|
if (!match)
|
|
@@ -37,10 +38,12 @@ function resolveRouteStringRedirect(urlSource, urlTarget, urlPathname) {
|
|
|
37
38
|
}
|
|
38
39
|
urlResolved = urlResolved.replaceAll(key, val);
|
|
39
40
|
});
|
|
40
|
-
|
|
41
|
+
if (!urlResolved.startsWith('mailto:')) {
|
|
42
|
+
(0, utils_js_1.assertUsage)(!urlResolved.includes('@'), 'URL should not contain "@" unless it is a mailto link.');
|
|
43
|
+
}
|
|
41
44
|
if (urlResolved === urlPathname)
|
|
42
45
|
return null;
|
|
43
|
-
(0, utils_js_1.assert)(
|
|
46
|
+
(0, utils_js_1.assert)(urlResolved.startsWith('/') || (0, parseUrl_extras_js_1.isUriWithProtocol)(urlResolved));
|
|
44
47
|
return urlResolved;
|
|
45
48
|
}
|
|
46
49
|
exports.resolveRouteStringRedirect = resolveRouteStringRedirect;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.assertKeys = void 0;
|
|
7
|
+
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
|
|
8
|
+
const assert_js_1 = require("./assert.js");
|
|
9
|
+
const joinEnglish_js_1 = require("./joinEnglish.js");
|
|
10
|
+
function assertKeys(obj, keysExpected, errPrefix) {
|
|
11
|
+
const keysUnknown = [];
|
|
12
|
+
const keys = Object.keys(obj);
|
|
13
|
+
for (const key of keys) {
|
|
14
|
+
if (!keysExpected.includes(key)) {
|
|
15
|
+
keysUnknown.push(key);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (keysUnknown.length !== 0) {
|
|
19
|
+
(0, assert_js_1.assertUsage)(false, [
|
|
20
|
+
errPrefix,
|
|
21
|
+
`unknown key${keysUnknown.length === 1 ? '' : 's'}`,
|
|
22
|
+
(0, joinEnglish_js_1.joinEnglish)(keysUnknown, 'and', picocolors_1.default.cyan) + '.',
|
|
23
|
+
'Only following keys are allowed:',
|
|
24
|
+
(0, joinEnglish_js_1.joinEnglish)(keysExpected, 'and', picocolors_1.default.cyan) + '.'
|
|
25
|
+
].join(' '));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.assertKeys = assertKeys;
|
|
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.joinEnglish = void 0;
|
|
4
4
|
const assert_js_1 = require("./assert.js");
|
|
5
5
|
// https://stackoverflow.com/questions/53879088/join-an-array-by-commas-and-and/53879103#53879103
|
|
6
|
-
function joinEnglish(arr, conjunction) {
|
|
6
|
+
function joinEnglish(arr, conjunction, colorizer = (s) => s) {
|
|
7
7
|
(0, assert_js_1.assert)(arr.length > 0);
|
|
8
8
|
if (arr.length === 1)
|
|
9
|
-
return arr[0];
|
|
9
|
+
return colorizer(arr[0]);
|
|
10
10
|
const firsts = arr.slice(0, arr.length - 1);
|
|
11
11
|
const last = arr[arr.length - 1];
|
|
12
|
-
return firsts.join(', ') + ` ${conjunction} ` + last;
|
|
12
|
+
return firsts.map(colorizer).join(', ') + ` ${conjunction} ` + colorizer(last);
|
|
13
13
|
}
|
|
14
14
|
exports.joinEnglish = joinEnglish;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.addUrlOrigin = exports.removeUrlOrigin = exports.modifyUrlPathname = exports.removeBaseServer = exports.normalizeUrlPathname = exports.isBaseAssets = exports.prependBase = void 0;
|
|
3
|
+
exports.isUriWithProtocol = exports.addUrlOrigin = exports.removeUrlOrigin = exports.modifyUrlPathname = exports.removeBaseServer = exports.normalizeUrlPathname = exports.isBaseAssets = exports.prependBase = void 0;
|
|
4
4
|
const parseUrl_js_1 = require("./parseUrl.js");
|
|
5
5
|
const assert_js_1 = require("./assert.js");
|
|
6
6
|
const slice_js_1 = require("./slice.js");
|
|
@@ -52,15 +52,20 @@ function isBaseAssets(base) {
|
|
|
52
52
|
return base.startsWith('/') || base.startsWith('http://') || base.startsWith('https://');
|
|
53
53
|
}
|
|
54
54
|
exports.isBaseAssets = isBaseAssets;
|
|
55
|
-
function normalizeUrlPathname(urlOriginal, trailingSlash) {
|
|
55
|
+
function normalizeUrlPathname(urlOriginal, trailingSlash, baseServer) {
|
|
56
56
|
const urlNormalized = modifyUrlPathname(urlOriginal, (urlPathname) => {
|
|
57
57
|
(0, assert_js_1.assert)(urlPathname.startsWith('/'));
|
|
58
|
-
let urlPathnameNormalized =
|
|
59
|
-
if (urlPathnameNormalized
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
let urlPathnameNormalized = normalize(urlPathname);
|
|
59
|
+
if (urlPathnameNormalized === '/') {
|
|
60
|
+
return urlPathnameNormalized;
|
|
61
|
+
}
|
|
62
|
+
// If the Base URL has a trailing slash, then Vite (as of vite@5.0.0-beta.19) expects the root URL to also have a trailing slash, see https://github.com/vikejs/vike/issues/1258#issuecomment-1812226260
|
|
63
|
+
if (baseServer.endsWith('/') && baseServer !== '/' && normalize(baseServer) === urlPathnameNormalized) {
|
|
64
|
+
trailingSlash = true;
|
|
65
|
+
}
|
|
66
|
+
(0, assert_js_1.assert)(!urlPathnameNormalized.endsWith('/'));
|
|
67
|
+
if (trailingSlash) {
|
|
68
|
+
urlPathnameNormalized = urlPathnameNormalized + '/';
|
|
64
69
|
}
|
|
65
70
|
return urlPathnameNormalized;
|
|
66
71
|
});
|
|
@@ -69,6 +74,10 @@ function normalizeUrlPathname(urlOriginal, trailingSlash) {
|
|
|
69
74
|
return urlNormalized;
|
|
70
75
|
}
|
|
71
76
|
exports.normalizeUrlPathname = normalizeUrlPathname;
|
|
77
|
+
function normalize(urlPathname) {
|
|
78
|
+
(0, assert_js_1.assert)(urlPathname.startsWith('/'));
|
|
79
|
+
return '/' + urlPathname.split('/').filter(Boolean).join('/');
|
|
80
|
+
}
|
|
72
81
|
function modifyUrlPathname(url, modifier) {
|
|
73
82
|
const { origin, pathnameOriginal, searchOriginal, hashOriginal } = (0, parseUrl_js_1.parseUrl)(url, '/');
|
|
74
83
|
const pathnameModified = modifier(pathnameOriginal);
|
|
@@ -94,3 +103,8 @@ function addUrlOrigin(url, origin) {
|
|
|
94
103
|
return urlModified;
|
|
95
104
|
}
|
|
96
105
|
exports.addUrlOrigin = addUrlOrigin;
|
|
106
|
+
function isUriWithProtocol(uri) {
|
|
107
|
+
// https://en.wikipedia.org/wiki/List_of_URI_schemes
|
|
108
|
+
return /^[a-z0-9][a-z0-9\.\+\-]*:/i.test(uri);
|
|
109
|
+
}
|
|
110
|
+
exports.isUriWithProtocol = isUriWithProtocol;
|
|
@@ -55,7 +55,7 @@ function parseUrl(url, baseServer) {
|
|
|
55
55
|
searchAll[key] = [...(searchAll.hasOwnProperty(key) ? searchAll[key] : []), val];
|
|
56
56
|
});
|
|
57
57
|
// Origin + pathname
|
|
58
|
-
const { origin, pathname: pathnameResolved } =
|
|
58
|
+
const { origin, pathname: pathnameResolved } = getPathname(urlWithoutHashNorSearch, baseServer);
|
|
59
59
|
(0, assert_js_1.assert)(origin === null || origin === decodeSafe(origin)); // AFAICT decoding the origin is useless
|
|
60
60
|
(0, assert_js_1.assert)(pathnameResolved.startsWith('/'));
|
|
61
61
|
(0, assert_js_1.assert)(origin === null || url.startsWith(origin));
|
|
@@ -91,35 +91,43 @@ function decodeSafe(urlComponent) {
|
|
|
91
91
|
return urlComponent;
|
|
92
92
|
}
|
|
93
93
|
function decodePathname(urlPathname) {
|
|
94
|
+
urlPathname = urlPathname.replace(/\s+$/, '');
|
|
94
95
|
urlPathname = urlPathname
|
|
95
96
|
.split('/')
|
|
96
97
|
.map((dir) => decodeSafe(dir).split('/').join('%2F'))
|
|
97
98
|
.join('/');
|
|
98
|
-
urlPathname = urlPathname.replace(/\s/g, '');
|
|
99
99
|
return urlPathname;
|
|
100
100
|
}
|
|
101
|
-
function
|
|
101
|
+
function getPathname(url, baseServer) {
|
|
102
|
+
// Search and hash already extracted
|
|
103
|
+
(0, assert_js_1.assert)(!url.includes('?') && !url.includes('#'));
|
|
104
|
+
// url has origin
|
|
102
105
|
{
|
|
103
|
-
const { origin, pathname } = parseOrigin(
|
|
106
|
+
const { origin, pathname } = parseOrigin(url);
|
|
104
107
|
if (origin) {
|
|
105
108
|
return { origin, pathname };
|
|
106
109
|
}
|
|
107
|
-
(0, assert_js_1.assert)(pathname ===
|
|
110
|
+
(0, assert_js_1.assert)(pathname === url);
|
|
108
111
|
}
|
|
109
|
-
|
|
110
|
-
|
|
112
|
+
// url doesn't have origin
|
|
113
|
+
if (url.startsWith('/')) {
|
|
114
|
+
return { origin: null, pathname: url };
|
|
111
115
|
}
|
|
112
116
|
else {
|
|
113
|
-
//
|
|
117
|
+
// url is a relative path
|
|
118
|
+
// In the browser, this is the Base URL of the current URL.
|
|
114
119
|
// Safe access `window?.document?.baseURI` for users who shim `window` in Node.js
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
const baseURI = typeof window !== 'undefined' ? window?.document?.baseURI : undefined;
|
|
121
|
+
let base;
|
|
122
|
+
if (baseURI) {
|
|
123
|
+
const baseURIPathaname = parseOrigin(baseURI.split('?')[0]).pathname;
|
|
124
|
+
base = baseURIPathaname;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
base = baseServer;
|
|
128
|
+
}
|
|
129
|
+
const pathname = resolveUrlPathnameRelative(url, base);
|
|
130
|
+
return { origin: null, pathname };
|
|
123
131
|
}
|
|
124
132
|
}
|
|
125
133
|
function parseOrigin(url) {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.projectInfo = void 0;
|
|
3
|
+
exports.PROJECT_VERSION = exports.projectInfo = void 0;
|
|
4
4
|
const assertSingleInstance_js_1 = require("./assertSingleInstance.js");
|
|
5
|
-
const PROJECT_VERSION = '0.4.
|
|
5
|
+
const PROJECT_VERSION = '0.4.147-commit-f9a91f3';
|
|
6
|
+
exports.PROJECT_VERSION = PROJECT_VERSION;
|
|
6
7
|
const projectInfo = {
|
|
7
8
|
projectName: 'Vike',
|
|
8
9
|
projectVersion: PROJECT_VERSION,
|