vike 0.4.150 → 0.4.151-commit-19bc995
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 +4 -4
- package/dist/cjs/node/plugin/plugins/assertFileEnv.js +107 -0
- package/dist/cjs/node/plugin/plugins/autoFullBuild.js +3 -2
- package/dist/cjs/node/plugin/plugins/baseUrls.js +2 -2
- package/dist/cjs/node/plugin/plugins/buildConfig.js +17 -36
- package/dist/cjs/node/plugin/plugins/commonConfig.js +1 -1
- package/dist/cjs/node/plugin/plugins/config/resolveExtensions.js +1 -1
- package/dist/cjs/node/plugin/plugins/config/stemUtils.js +1 -1
- package/dist/cjs/node/plugin/plugins/devConfig/determineFsAllowList.js +1 -1
- package/dist/cjs/node/plugin/plugins/importBuild/getVikeManifest.js +38 -0
- package/dist/cjs/node/plugin/plugins/importBuild/index.js +57 -19
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -0
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +46 -28
- package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwc.js +5 -5
- package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwcBig.js +4 -4
- package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueCss.js +7 -7
- package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueHtml.js +2 -2
- package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueJavascript.js +3 -3
- package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet.js +1 -1
- package/dist/cjs/node/plugin/shared/loggerVite.js +1 -1
- package/dist/cjs/node/plugin/utils.js +1 -0
- package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +2 -0
- package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +2 -1
- package/dist/cjs/node/runtime/index-deprecated.js +3 -2
- package/dist/cjs/node/runtime/index.js +3 -2
- package/dist/cjs/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +20 -0
- package/dist/cjs/node/runtime/renderPage/createHttpResponseObject.js +8 -1
- package/dist/cjs/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +33 -0
- package/dist/cjs/node/runtime/renderPage/getPageAssets.js +1 -1
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -5
- package/dist/cjs/node/runtime/renderPage.js +21 -9
- package/dist/cjs/shared/getPageFiles/getExports.js +1 -1
- package/dist/cjs/shared/route/resolveRedirects.js +3 -11
- package/dist/cjs/shared/route/resolveUrlPathname.js +48 -0
- package/dist/cjs/utils/debug.js +35 -21
- package/dist/cjs/utils/getDependencyPackageJson.js +1 -1
- package/dist/cjs/utils/getFilePathAbsolute.js +1 -1
- package/dist/cjs/utils/getOutDirs.js +11 -1
- package/dist/cjs/utils/injectRollupInputs.js +29 -0
- package/dist/cjs/utils/isPlainObject.js +1 -1
- package/dist/cjs/utils/projectInfo.js +1 -1
- package/dist/cjs/utils/requireResolve.js +1 -1
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +105 -66
- package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +1 -1
- package/dist/esm/node/plugin/index.js +4 -4
- package/dist/esm/node/plugin/plugins/assertFileEnv.d.ts +3 -0
- package/dist/esm/node/plugin/plugins/assertFileEnv.js +101 -0
- package/dist/esm/node/plugin/plugins/autoFullBuild.js +3 -2
- package/dist/esm/node/plugin/plugins/baseUrls.js +2 -2
- package/dist/esm/node/plugin/plugins/buildConfig.js +17 -36
- package/dist/esm/node/plugin/plugins/commonConfig.js +1 -1
- package/dist/esm/node/plugin/plugins/config/resolveExtensions.js +1 -1
- package/dist/esm/node/plugin/plugins/config/stemUtils.js +1 -1
- package/dist/esm/node/plugin/plugins/devConfig/determineFsAllowList.js +1 -1
- package/dist/esm/node/plugin/plugins/importBuild/getVikeManifest.d.ts +5 -0
- package/dist/esm/node/plugin/plugins/importBuild/getVikeManifest.js +32 -0
- package/dist/esm/node/plugin/plugins/importBuild/index.js +59 -21
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/debug.d.ts +1 -1
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -0
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +47 -29
- package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwc.js +5 -5
- package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwcBig.js +4 -4
- package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueCss.js +7 -7
- package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueHtml.js +2 -2
- package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueJavascript.js +3 -3
- package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet.js +1 -1
- package/dist/esm/node/plugin/shared/loggerVite.js +1 -1
- package/dist/esm/node/plugin/utils.d.ts +1 -0
- package/dist/esm/node/plugin/utils.js +1 -0
- package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +2 -0
- package/dist/esm/node/runtime/html/serializePageContextClientSide.js +2 -1
- package/dist/esm/node/runtime/index-deprecated.js +3 -2
- package/dist/esm/node/runtime/index.js +3 -2
- package/dist/esm/node/runtime/renderPage/createHttpResponseObject/getCacheControl.d.ts +3 -0
- package/dist/esm/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +17 -0
- package/dist/esm/node/runtime/renderPage/createHttpResponseObject.js +8 -1
- package/dist/esm/node/runtime/renderPage/{executeOnBeforeRenderHook.d.ts → executeOnBeforeRenderAndDataHooks.d.ts} +2 -2
- package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +30 -0
- package/dist/esm/node/runtime/renderPage/getPageAssets.js +1 -1
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -5
- package/dist/esm/node/runtime/renderPage.js +22 -10
- package/dist/esm/shared/VikeNamespace.d.ts +5 -1
- package/dist/esm/shared/getPageFiles/getExports.js +1 -1
- package/dist/esm/shared/page-configs/Config/PageContextConfig.d.ts +4 -4
- package/dist/esm/shared/page-configs/Config/helpers.d.ts +2 -2
- package/dist/esm/shared/page-configs/Config.d.ts +33 -7
- package/dist/esm/shared/route/resolveRedirects.js +3 -11
- package/dist/esm/shared/route/resolveUrlPathname.d.ts +12 -0
- package/dist/esm/shared/route/resolveUrlPathname.js +45 -0
- package/dist/esm/shared/types.d.ts +5 -0
- package/dist/esm/types/index.d.ts +1 -1
- package/dist/esm/utils/debug.d.ts +4 -4
- package/dist/esm/utils/debug.js +35 -21
- package/dist/esm/utils/debugGlob.d.ts +1 -1
- package/dist/esm/utils/getDependencyPackageJson.js +1 -1
- package/dist/esm/utils/getFilePathAbsolute.js +1 -1
- package/dist/esm/utils/getOutDirs.js +11 -1
- package/dist/esm/utils/injectRollupInputs.d.ts +7 -0
- package/dist/esm/utils/injectRollupInputs.js +26 -0
- package/dist/esm/utils/isPlainObject.js +1 -1
- package/dist/esm/utils/projectInfo.d.ts +2 -2
- package/dist/esm/utils/projectInfo.js +1 -1
- package/dist/esm/utils/requireResolve.js +1 -1
- package/package.json +38 -19
- package/dist/cjs/node/plugin/plugins/manifest.js +0 -59
- package/dist/cjs/node/runtime/renderPage/executeOnBeforeRenderHook.js +0 -23
- package/dist/esm/node/plugin/plugins/manifest.d.ts +0 -3
- package/dist/esm/node/plugin/plugins/manifest.js +0 -53
- package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderHook.js +0 -20
package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwc.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
export const errSwc = {
|
|
2
|
-
stack: "Error: \n \u001b[38;2;255;30;30m×\u001b[0m Expected ';', '}' or <eof>\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full
|
|
2
|
+
stack: "Error: \n \u001b[38;2;255;30;30m×\u001b[0m Expected ';', '}' or <eof>\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full/pages/hello/+Page.tsx\u001b[0m:1:1]\n \u001b[2m1\u001b[0m │ export default Page\n \u001b[2m2\u001b[0m │ \n \u001b[2m3\u001b[0m │ impeort React from 'react'\n · \u001b[38;2;246;87;248m───┬───\u001b[0m\u001b[38;2;30;201;212m ─────\u001b[0m\n · \u001b[38;2;246;87;248m╰── \u001b[38;2;246;87;248mThis is the expression part of an expression statement\u001b[0m\u001b[0m\n \u001b[2m4\u001b[0m │ \n \u001b[2m5\u001b[0m │ function Page({ name }: { name: string }) {\n \u001b[2m6\u001b[0m │ return (\n ╰────\n\n\nCaused by:\n Syntax Error",
|
|
3
3
|
code: 'GenericFailure',
|
|
4
4
|
line: '1',
|
|
5
5
|
column: '1',
|
|
6
6
|
plugin: 'vite:react-swc',
|
|
7
|
-
id: '/home/rom/code/vike/examples/react-full
|
|
7
|
+
id: '/home/rom/code/vike/examples/react-full/pages/hello/+Page.tsx',
|
|
8
8
|
pluginCode: 'export default Page\n\nimpeort React from \'react\'\n\nfunction Page({ name }: { name: string }) {\n return (\n <>\n <h1>Hello</h1>\n <p>\n Hi <b>{name}</b>.\n </p>\n <ul>\n <li>\n <a href="/hello/eli">/hello/eli</a>\n </li>\n <li>\n <a href="/hello/jon">/hello/jon</a>\n </li>\n </ul>\n <p>\n Parameterized routes can be defined by exporting a route string in <code>*.page.route.js</code>.\n </p>\n </>\n )\n}\n',
|
|
9
9
|
loc: {
|
|
10
|
-
file: '/home/rom/code/vike/examples/react-full
|
|
10
|
+
file: '/home/rom/code/vike/examples/react-full/pages/hello/+Page.tsx',
|
|
11
11
|
line: '1',
|
|
12
12
|
column: '1'
|
|
13
13
|
},
|
|
14
|
-
frame: '1 | /home/rom/code/vike/examples/react-full
|
|
15
|
-
message: "\n \u001b[38;2;255;30;30m×\u001b[0m Expected ';', '}' or <eof>\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full
|
|
14
|
+
frame: '1 | /home/rom/code/vike/examples/react-full/pages/hello/+Page.tsx\n | ^',
|
|
15
|
+
message: "\n \u001b[38;2;255;30;30m×\u001b[0m Expected ';', '}' or <eof>\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full/pages/hello/+Page.tsx\u001b[0m:1:1]\n \u001b[2m1\u001b[0m │ export default Page\n \u001b[2m2\u001b[0m │ \n \u001b[2m3\u001b[0m │ impeort React from 'react'\n · \u001b[38;2;246;87;248m───┬───\u001b[0m\u001b[38;2;30;201;212m ─────\u001b[0m\n · \u001b[38;2;246;87;248m╰── \u001b[38;2;246;87;248mThis is the expression part of an expression statement\u001b[0m\u001b[0m\n \u001b[2m4\u001b[0m │ \n \u001b[2m5\u001b[0m │ function Page({ name }: { name: string }) {\n \u001b[2m6\u001b[0m │ return (\n ╰────\n\n\nCaused by:\n Syntax Error"
|
|
16
16
|
};
|
package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwcBig.js
CHANGED
|
@@ -3,14 +3,14 @@ export const errSwcBig = {
|
|
|
3
3
|
line: '6',
|
|
4
4
|
column: '1',
|
|
5
5
|
plugin: 'vite:react-swc',
|
|
6
|
-
id: '/home/rom/code/vike/examples/react-full
|
|
6
|
+
id: '/home/rom/code/vike/examples/react-full/pages/index/+Page.tsx',
|
|
7
7
|
pluginCode: "export default Page\n\nimport React from 'react'\nimport { navigate } from 'vike/client/router'\nimport { Counter } from '../../components/Counter'\n\nfunction Page() {\n return (\n <>\n <h1>\n Welcome to Vike\n <h1>\n This page is:\n <ul>\n <li>Rendered to HTML.</li>\n <li>\n Interactive. <Counter />\n </li>\n </ul>\n <p>\n <button\n onClick={() => {\n const randomIndex = Math.floor(Math.random() * 3)\n navigate(['/markdown', '/star-wars', '/hello/alice.js'][randomIndex])\n }}\n >\n Random Page\n </button>\n </p>\n </>\n )\n}\n",
|
|
8
8
|
loc: {
|
|
9
|
-
file: '/home/rom/code/vike/examples/react-full
|
|
9
|
+
file: '/home/rom/code/vike/examples/react-full/pages/index/+Page.tsx',
|
|
10
10
|
line: '6',
|
|
11
11
|
column: '1'
|
|
12
12
|
},
|
|
13
13
|
frame: '',
|
|
14
|
-
message: "\n \u001b[38;2;255;30;30m×\u001b[0m Expression expected\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full
|
|
15
|
-
stack: "Error: \n \u001b[38;2;255;30;30m×\u001b[0m Expression expected\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full
|
|
14
|
+
message: "\n \u001b[38;2;255;30;30m×\u001b[0m Expression expected\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full/pages/index/+Page.tsx\u001b[0m:6:1]\n \u001b[2m 6\u001b[0m │ \n \u001b[2m 7\u001b[0m │ function Page() {\n \u001b[2m 8\u001b[0m │ return (\n \u001b[2m 9\u001b[0m │ <>\n · \u001b[38;2;246;87;248m ─\u001b[0m\n \u001b[2m10\u001b[0m │ <h1>\n \u001b[2m11\u001b[0m │ Welcome to Vike\n \u001b[2m12\u001b[0m │ <h1>\n ╰────\n\n \u001b[38;2;255;30;30m×\u001b[0m Unexpected token. Did you mean `{'}'}` or `}`?\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full/pages/index/+Page.tsx\u001b[0m:29:1]\n \u001b[2m29\u001b[0m │ </p>\n \u001b[2m30\u001b[0m │ </>\n \u001b[2m31\u001b[0m │ )\n \u001b[2m32\u001b[0m │ }\n · \u001b[38;2;246;87;248m▲\u001b[0m\n ╰────\n\n \u001b[38;2;255;30;30m×\u001b[0m Unterminated JSX contents\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full/pages/index/+Page.tsx\u001b[0m:27:1]\n \u001b[2m27\u001b[0m │ Random Page\n \u001b[2m28\u001b[0m │ </button>\n \u001b[2m29\u001b[0m │ </p>\n \u001b[2m30\u001b[0m │ \u001b[38;2;246;87;248m╭\u001b[0m\u001b[38;2;246;87;248m─\u001b[0m\u001b[38;2;246;87;248m▶\u001b[0m </>\n \u001b[2m31\u001b[0m │ \u001b[38;2;246;87;248m│\u001b[0m )\n \u001b[2m32\u001b[0m │ \u001b[38;2;246;87;248m╰\u001b[0m\u001b[38;2;246;87;248m─\u001b[0m\u001b[38;2;246;87;248m▶\u001b[0m }\n ╰────\n\n\nCaused by:\n Syntax Error",
|
|
15
|
+
stack: "Error: \n \u001b[38;2;255;30;30m×\u001b[0m Expression expected\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full/pages/index/+Page.tsx\u001b[0m:6:1]\n \u001b[2m 6\u001b[0m │ \n \u001b[2m 7\u001b[0m │ function Page() {\n \u001b[2m 8\u001b[0m │ return (\n \u001b[2m 9\u001b[0m │ <>\n · \u001b[38;2;246;87;248m ─\u001b[0m\n \u001b[2m10\u001b[0m │ <h1>\n \u001b[2m11\u001b[0m │ Welcome to Vike\n \u001b[2m12\u001b[0m │ <h1>\n ╰────\n\n \u001b[38;2;255;30;30m×\u001b[0m Unexpected token. Did you mean `{'}'}` or `}`?\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full/pages/index/+Page.tsx\u001b[0m:29:1]\n \u001b[2m29\u001b[0m │ </p>\n \u001b[2m30\u001b[0m │ </>\n \u001b[2m31\u001b[0m │ )\n \u001b[2m32\u001b[0m │ }\n · \u001b[38;2;246;87;248m▲\u001b[0m\n ╰────\n\n \u001b[38;2;255;30;30m×\u001b[0m Unterminated JSX contents\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full/pages/index/+Page.tsx\u001b[0m:27:1]\n \u001b[2m27\u001b[0m │ Random Page\n \u001b[2m28\u001b[0m │ </button>\n \u001b[2m29\u001b[0m │ </p>\n \u001b[2m30\u001b[0m │ \u001b[38;2;246;87;248m╭\u001b[0m\u001b[38;2;246;87;248m─\u001b[0m\u001b[38;2;246;87;248m▶\u001b[0m </>\n \u001b[2m31\u001b[0m │ \u001b[38;2;246;87;248m│\u001b[0m )\n \u001b[2m32\u001b[0m │ \u001b[38;2;246;87;248m╰\u001b[0m\u001b[38;2;246;87;248m─\u001b[0m\u001b[38;2;246;87;248m▶\u001b[0m }\n ╰────\n\n\nCaused by:\n Syntax Error"
|
|
16
16
|
};
|
package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueCss.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const errVueCss = {
|
|
2
2
|
name: 'CssSyntaxError',
|
|
3
3
|
reason: 'Unexpected }',
|
|
4
|
-
file: '/home/rom/code/vike/examples/vue-full
|
|
4
|
+
file: '/home/rom/code/vike/examples/vue-full/renderer/PageShell.vue',
|
|
5
5
|
source: '\n.layout {\n display: flex;\n max-width: 900px;\n margin: auto;\n}}\n.content {\n padding: 20px;\n padding-bottom: 50px;\n min-height: 100vh;\n}\n.navigation {\n padding: 20px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n line-height: 1.8em;\n border-right: 2px solid #eee;\n}\n.logo {\n margin-top: 20px;\n margin-bottom: 10px;\n}\n.content {\n transition: opacity 0.1s ease-in;\n}\n.content.page-transition {\n opacity: 0;\n}\n',
|
|
6
6
|
line: 6,
|
|
7
7
|
column: 2,
|
|
@@ -13,14 +13,14 @@ export const errVueCss = {
|
|
|
13
13
|
endLine: 6,
|
|
14
14
|
endColumn: 3,
|
|
15
15
|
source: '\n.layout {\n display: flex;\n max-width: 900px;\n margin: auto;\n}}\n.content {\n padding: 20px;\n padding-bottom: 50px;\n min-height: 100vh;\n}\n.navigation {\n padding: 20px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n line-height: 1.8em;\n border-right: 2px solid #eee;\n}\n.logo {\n margin-top: 20px;\n margin-bottom: 10px;\n}\n.content {\n transition: opacity 0.1s ease-in;\n}\n.content.page-transition {\n opacity: 0;\n}\n',
|
|
16
|
-
url: 'file:///home/rom/code/vike/examples/vue-full
|
|
17
|
-
file: '/home/rom/code/vike/examples/vue-full
|
|
16
|
+
url: 'file:///home/rom/code/vike/examples/vue-full/renderer/PageShell.vue',
|
|
17
|
+
file: '/home/rom/code/vike/examples/vue-full/renderer/PageShell.vue'
|
|
18
18
|
},
|
|
19
|
-
loc: { file: '/home/rom/code/vike/examples/vue-full
|
|
20
|
-
id: '/home/rom/code/vike/examples/vue-full
|
|
19
|
+
loc: { file: '/home/rom/code/vike/examples/vue-full/renderer/PageShell.vue', line: 45, column: 2 },
|
|
20
|
+
id: '/home/rom/code/vike/examples/vue-full/renderer/PageShell.vue',
|
|
21
21
|
plugin: 'vite:vue',
|
|
22
22
|
pluginCode: '\n.layout {\n display: flex;\n max-width: 900px;\n margin: auto;\n}}\n.content {\n padding: 20px;\n padding-bottom: 50px;\n min-height: 100vh;\n}\n.navigation {\n padding: 20px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n line-height: 1.8em;\n border-right: 2px solid #eee;\n}\n.logo {\n margin-top: 20px;\n margin-bottom: 10px;\n}\n.content {\n transition: opacity 0.1s ease-in;\n}\n.content.page-transition {\n opacity: 0;\n}\n',
|
|
23
23
|
frame: '43 | margin: auto;\n44 | }}\n45 | .content {\n | ^\n46 | padding: 20px;\n47 | padding-bottom: 50px;',
|
|
24
|
-
message: '/home/rom/code/vike/examples/vue-full
|
|
25
|
-
stack: 'CssSyntaxError: /home/rom/code/vike/examples/vue-full
|
|
24
|
+
message: '/home/rom/code/vike/examples/vue-full/renderer/PageShell.vue:6:2: Unexpected }',
|
|
25
|
+
stack: 'CssSyntaxError: /home/rom/code/vike/examples/vue-full/renderer/PageShell.vue:6:2: Unexpected }\n at Input.error (/home/rom/code/vike/node_modules/.pnpm/postcss@8.4.23/node_modules/postcss/lib/input.js:148:16)\n at Parser.unexpectedClose (/home/rom/code/vike/node_modules/.pnpm/postcss@8.4.23/node_modules/postcss/lib/parser.js:548:22)\n at Parser.end (/home/rom/code/vike/node_modules/.pnpm/postcss@8.4.23/node_modules/postcss/lib/parser.js:379:12)\n at Parser.parse (/home/rom/code/vike/node_modules/.pnpm/postcss@8.4.23/node_modules/postcss/lib/parser.js:56:16)\n at parse (/home/rom/code/vike/node_modules/.pnpm/postcss@8.4.23/node_modules/postcss/lib/parse.js:11:12)\n at new LazyResult (/home/rom/code/vike/node_modules/.pnpm/postcss@8.4.23/node_modules/postcss/lib/lazy-result.js:133:16)\n at Processor.process (/home/rom/code/vike/node_modules/.pnpm/postcss@8.4.23/node_modules/postcss/lib/processor.js:28:14)\n at doCompileStyle (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-sfc@3.2.33/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js:17246:45)\n at Object.compileStyleAsync (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-sfc@3.2.33/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js:17188:12)\n at transformStyle (/home/rom/code/vike/node_modules/.pnpm/@vitejs+plugin-vue@4.2.1_vite@4.3.5_vue@3.2.33/node_modules/@vitejs/plugin-vue/dist/index.cjs:2622:41)'
|
|
26
26
|
};
|
package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueHtml.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export const errVueHtml = {
|
|
2
|
-
id: '/home/rom/code/vike/examples/vue-full
|
|
2
|
+
id: '/home/rom/code/vike/examples/vue-full/pages/index/+Page.vue',
|
|
3
3
|
plugin: 'vite:vue',
|
|
4
4
|
message: 'Element is missing end tag.',
|
|
5
5
|
name: 'SyntaxError',
|
|
6
6
|
stack: 'SyntaxError: Element is missing end tag.\n at createCompilerError (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-core@3.2.33/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js:19:19)\n at emitError (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-core@3.2.33/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js:1594:29)\n at parseElement (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-core@3.2.33/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js:1146:9)\n at parseChildren (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-core@3.2.33/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js:937:28)\n at parseElement (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-core@3.2.33/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js:1125:22)\n at parseChildren (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-core@3.2.33/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js:937:28)\n at parseElement (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-core@3.2.33/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js:1125:22)\n at parseChildren (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-core@3.2.33/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js:937:28)\n at Object.baseParse (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-core@3.2.33/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js:852:23)\n at Object.parse (/home/rom/code/vike/node_modules/.pnpm/@vue+compiler-dom@3.2.33/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.js:3077:25)',
|
|
7
|
-
loc: { file: '/home/rom/code/vike/examples/vue-full
|
|
7
|
+
loc: { file: '/home/rom/code/vike/examples/vue-full/pages/index/+Page.vue', line: 2, column: 46 },
|
|
8
8
|
pluginCode: "<template>\n <h1>Welcome to Vike<h1>\n This page is:\n <ul>\n <li>Rendered to HTML.</li>\n <li>Interactive. <Counter /></li>\n </ul>\n <p>\n <button @click=\"randomNavigation\">Random Page</button>\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport Counter from '../../components/Counter.vue'\nimport { navigate } from 'vike/client/router'\n\nconst randomNavigation = () => {\n const randomIndex = Math.floor(Math.random() * 3)\n navigate(['/markdown', '/star-wars', '/hello/alice.js'][randomIndex])\n}\n</script>\n",
|
|
9
9
|
frame: '1 | <template>\n2 | <h1>Welcome to Vike<h1>\n | ^\n3 | This page is:\n4 | <ul>'
|
|
10
10
|
};
|
|
@@ -4,9 +4,9 @@ export const errVueJavascript = {
|
|
|
4
4
|
loc: { line: 2, column: 7, index: 8 },
|
|
5
5
|
pos: 8,
|
|
6
6
|
plugin: 'vite:vue',
|
|
7
|
-
id: '/home/rom/code/vike/examples/vue-full
|
|
7
|
+
id: '/home/rom/code/vike/examples/vue-full/pages/index/+Page.vue',
|
|
8
8
|
pluginCode: "<template>\n <h1>Welcome to Vike</h1>\n This page is:\n <ul>\n <li>Rendered to HTML.</li>\n <li>Interactive. <Counter /></li>\n </ul>\n <p>\n <button @click=\"randomNavigation\">Random Page</button>\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimeport Counter from '../../components/Counter.vue'\nimport { navigate } from 'vike/client/router'\n\nconst randomNavigation = () => {\n const randomIndex = Math.floor(Math.random() * 3)\n navigate(['/markdown', '/star-wars', '/hello/alice.js'][randomIndex])\n}\n</script>\n",
|
|
9
9
|
frame: '1 | <template>\n | ^\n2 | <h1>Welcome to Vike</h1>\n3 | This page is:',
|
|
10
|
-
message: "[@vue/compiler-sfc] Missing semicolon. (2:7)\n\n/home/rom/code/vike/examples/vue-full
|
|
11
|
-
stack: "SyntaxError: [@vue/compiler-sfc] Missing semicolon. (2:7)\n\n/home/rom/code/vike/examples/vue-full
|
|
10
|
+
message: "[@vue/compiler-sfc] Missing semicolon. (2:7)\n\n/home/rom/code/vike/examples/vue-full/pages/index/+Page.vue\n12 | \n13 | <script lang=\"ts\" setup>\n14 | imeport Counter from '../../components/Counter.vue'\n | ^\n15 | import { navigate } from 'vike/client/router.js'\n16 | ",
|
|
11
|
+
stack: "SyntaxError: [@vue/compiler-sfc] Missing semicolon. (2:7)\n\n/home/rom/code/vike/examples/vue-full/pages/index/+Page.vue\n12 | \n13 | <script lang=\"ts\" setup>\n14 | imeport Counter from '../../components/Counter.vue'\n | ^\n15 | import { navigate } from 'vike/client/router.js'\n16 | \n at instantiate (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/parse-error/credentials.ts:62:21)\n at toParseError (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/parse-error.ts:60:12)\n at TypeScriptParserMixin.raise (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/tokenizer/index.ts:1490:19)\n at TypeScriptParserMixin.semicolon (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/parser/util.ts:138:10)\n at TypeScriptParserMixin.parseExpressionStatement (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/parser/statement.ts:1279:10)\n at TypeScriptParserMixin.parseExpressionStatement (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/plugins/typescript/index.ts:3044:28)\n at TypeScriptParserMixin.parseStatementContent (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/parser/statement.ts:643:19)\n at TypeScriptParserMixin.parseStatementContent (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/plugins/typescript/index.ts:2887:20)\n at TypeScriptParserMixin.parseStatementLike (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/parser/statement.ts:417:17)\n at TypeScriptParserMixin.parseModuleItem (/home/rom/code/vike/node_modules/.pnpm/@babel+parser@7.21.8/node_modules/@babel/parser/src/parser/statement.ts:354:17)"
|
|
12
12
|
};
|
|
@@ -82,7 +82,7 @@ function getPrettyErrMessage(err) {
|
|
|
82
82
|
const trail = /(?:\:|)(?:\s|$)/;
|
|
83
83
|
// Remove "Transform failed with 1 error:" (redundant since we already print an intro message)
|
|
84
84
|
errMsg = errMsg.split(reg([/Transform failed with \d* error(?:s|)/, trail], 'gi')).join('');
|
|
85
|
-
// Remove "/home/rom/code/vike/examples/react-full
|
|
85
|
+
// Remove "/home/rom/code/vike/examples/react-full/components/Counter.tsx:1:8:" (redundant since we already print the filename)
|
|
86
86
|
const pos = /(?:\:\d+|)/;
|
|
87
87
|
errMsg = errMsg.split(reg([id, pos, pos, trail], 'gi')).join('');
|
|
88
88
|
errMsg = errMsg.split(reg([normalizeId(id), pos, pos, trail], 'gi')).join('');
|
|
@@ -28,7 +28,7 @@ function intercept(logType, config) {
|
|
|
28
28
|
if (options.error && store?.shouldErrorBeSwallowed(options.error)) {
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
|
-
// Remove this once https://github.com/vitejs/vite/pull/13495 is released
|
|
31
|
+
// Remove this once https://github.com/vitejs/vite/pull/13495 is released and widely used
|
|
32
32
|
if (msg.startsWith('Transform failed with ') && store && logType === 'error') {
|
|
33
33
|
store.markErrorMessageAsLogged(msg);
|
|
34
34
|
return;
|
|
@@ -16,7 +16,8 @@ const PASS_TO_CLIENT = [
|
|
|
16
16
|
'_abortCaller',
|
|
17
17
|
*/
|
|
18
18
|
'_pageContextInitHasClientData',
|
|
19
|
-
'_pageId'
|
|
19
|
+
'_pageId',
|
|
20
|
+
'data' // for data() hook
|
|
20
21
|
];
|
|
21
22
|
const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404', '_isError'];
|
|
22
23
|
function serializePageContextClientSide(pageContext) {
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
// TODO/v1-release: replace this with:
|
|
2
2
|
// assertUsage(false, "`import { something } from 'vike'` doesn't exist: instead import from 'vike/server', 'vike/client', 'vike/plugin', ...")
|
|
3
|
+
import { isBrowser } from '../../utils/isBrowser.js';
|
|
4
|
+
import { assertUsage } from '../../utils/assert.js';
|
|
5
|
+
assertUsage(!isBrowser(), "It's forbidden to `import { something } from 'vike'` on the client-side: the module 'vike' is a server-only module.", { showStackTrace: true });
|
|
3
6
|
export * from './index-common.js';
|
|
4
7
|
export * from '../../types/index-dreprecated.js';
|
|
5
8
|
import { assertWarning } from './utils.js';
|
|
@@ -36,5 +39,3 @@ assertWarning(false, [
|
|
|
36
39
|
pc.green(" import type { something } from 'vike/types'"),
|
|
37
40
|
"Make sure to import renderPage(), escapeInject, html, dangerouslySkipEscape(), pipeWebStream(), pipeNodeStream(), pipeStream(), stampPipe() from 'vike/server'. (Or inspect the error stack below to find the import causing this warning.)"
|
|
38
41
|
].join('\n'), { showStackTrace: true, onlyOnce: true });
|
|
39
|
-
import { isBrowser, assertUsage } from './utils.js';
|
|
40
|
-
assertUsage(!isBrowser(), "It's forbidden to `import { something } from 'vike'` in code loaded in the browser: the module 'vike' is a server-only module.", { showStackTrace: true });
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isBrowser } from '../../utils/isBrowser.js';
|
|
2
|
+
import { assertUsage } from '../../utils/assert.js';
|
|
3
|
+
assertUsage(!isBrowser(), "It's forbidden to `import { something } from 'vike/server'` on the client-side: the module 'vike/server' is a server-only module.", { showStackTrace: true });
|
|
1
4
|
export * from './index-common.js';
|
|
2
|
-
import { isBrowser, assertUsage } from './utils.js';
|
|
3
|
-
assertUsage(!isBrowser(), "It's forbidden to `import { something } from 'vike/server'` in code loaded on the client-side: the module 'vike/server' is a server-only module.", { showStackTrace: true });
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { getCacheControl };
|
|
2
|
+
import { getConfigValue, getPageConfig } from '../../../../shared/page-configs/helpers.js';
|
|
3
|
+
const defaultValue = 'no-store, max-age=0';
|
|
4
|
+
function getCacheControl(pageId, pageConfigs) {
|
|
5
|
+
// TODO/v1-release: remove
|
|
6
|
+
if (pageConfigs.length === 0)
|
|
7
|
+
return defaultValue;
|
|
8
|
+
const pageConfig = getPageConfig(pageId, pageConfigs);
|
|
9
|
+
const configValue = getConfigValue(pageConfig, 'cacheControl', 'string');
|
|
10
|
+
const value = configValue?.value;
|
|
11
|
+
if (value)
|
|
12
|
+
return value;
|
|
13
|
+
// - Disabling caching by default is the safest strategy, because caching is problematic with authentication as described in https://github.com/vikejs/vike/issues/1275#issuecomment-1824366875
|
|
14
|
+
// - Are there use cases when we don't need to disable caching?
|
|
15
|
+
// - When there isn't any <script id="vike_pageContext" type="application/json"> then we can safely have caching. (We don't implement this exception because we're lazy and it's quite a rare situation.)
|
|
16
|
+
return defaultValue;
|
|
17
|
+
}
|
|
@@ -5,6 +5,7 @@ import { assert, assertWarning } from '../utils.js';
|
|
|
5
5
|
import { isErrorPage } from '../../../shared/error-page.js';
|
|
6
6
|
import { getHttpResponseBody, getHttpResponseBodyStreamHandlers } from './getHttpResponseBody.js';
|
|
7
7
|
import { getEarlyHints } from './getEarlyHints.js';
|
|
8
|
+
import { getCacheControl } from './createHttpResponseObject/getCacheControl.js';
|
|
8
9
|
import { assertNoInfiniteHttpRedirect } from './createHttpResponseObject/assertNoInfiniteHttpRedirect.js';
|
|
9
10
|
async function createHttpResponseObject(htmlRender, renderHook, pageContext) {
|
|
10
11
|
if (htmlRender === null) {
|
|
@@ -26,7 +27,13 @@ async function createHttpResponseObject(htmlRender, renderHook, pageContext) {
|
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
const earlyHints = getEarlyHints(await pageContext.__getPageAssets());
|
|
29
|
-
|
|
30
|
+
const headers = [];
|
|
31
|
+
assert(pageContext._pageId);
|
|
32
|
+
const cacheControl = getCacheControl(pageContext._pageId, pageContext._pageConfigs);
|
|
33
|
+
if (cacheControl) {
|
|
34
|
+
headers.push(['Cache-Control', cacheControl]);
|
|
35
|
+
}
|
|
36
|
+
return getHttpResponse(statusCode, 'text/html;charset=utf-8', headers, htmlRender, earlyHints, renderHook);
|
|
30
37
|
}
|
|
31
38
|
async function createHttpResponsePageContextJson(pageContextSerialized) {
|
|
32
39
|
const httpResponse = getHttpResponse(200, 'application/json', [], pageContextSerialized, [], null);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { executeOnBeforeRenderAndDataHooks };
|
|
2
2
|
import { type PageContextExports } from '../../../shared/getPageFiles.js';
|
|
3
3
|
import { type PageContextForUserConsumptionServerSide } from './preparePageContextForUserConsumptionServerSide.js';
|
|
4
|
-
declare function
|
|
4
|
+
declare function executeOnBeforeRenderAndDataHooks(pageContext: {
|
|
5
5
|
_pageId: string;
|
|
6
6
|
_pageContextAlreadyProvidedByOnPrerenderHook?: true;
|
|
7
7
|
} & PageContextExports & PageContextForUserConsumptionServerSide): Promise<void>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export { executeOnBeforeRenderAndDataHooks };
|
|
2
|
+
import { getHook } from '../../../shared/hooks/getHook.js';
|
|
3
|
+
import { preparePageContextForUserConsumptionServerSide } from './preparePageContextForUserConsumptionServerSide.js';
|
|
4
|
+
import { executeHook } from '../utils.js';
|
|
5
|
+
import { assertOnBeforeRenderHookReturn } from '../../../shared/assertOnBeforeRenderHookReturn.js';
|
|
6
|
+
async function executeOnBeforeRenderAndDataHooks(pageContext) {
|
|
7
|
+
if (pageContext._pageContextAlreadyProvidedByOnPrerenderHook) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const dataHook = getHook(pageContext, 'data');
|
|
11
|
+
const onBeforeRenderHook = getHook(pageContext, 'onBeforeRender');
|
|
12
|
+
if (!dataHook && !onBeforeRenderHook) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
preparePageContextForUserConsumptionServerSide(pageContext);
|
|
16
|
+
if (dataHook) {
|
|
17
|
+
const hookResult = await executeHook(() => dataHook.hookFn(pageContext), dataHook);
|
|
18
|
+
// Note: hookResult can be anything (e.g. an object) and is to be assigned to pageContext.data
|
|
19
|
+
const pageContextFromHook = {
|
|
20
|
+
data: hookResult
|
|
21
|
+
};
|
|
22
|
+
Object.assign(pageContext, pageContextFromHook);
|
|
23
|
+
}
|
|
24
|
+
if (onBeforeRenderHook) {
|
|
25
|
+
const hookResult = await executeHook(() => onBeforeRenderHook.hookFn(pageContext), onBeforeRenderHook);
|
|
26
|
+
assertOnBeforeRenderHookReturn(hookResult, onBeforeRenderHook.hookFilePath);
|
|
27
|
+
const pageContextFromHook = hookResult?.pageContext;
|
|
28
|
+
Object.assign(pageContext, pageContextFromHook);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -82,7 +82,7 @@ async function resolveClientEntriesDev(clientEntry, viteDevServer, configVike) {
|
|
|
82
82
|
const { createRequire } = (await import_('module')).default;
|
|
83
83
|
const { dirname } = (await import_('path')).default;
|
|
84
84
|
const { fileURLToPath } = (await import_('url')).default;
|
|
85
|
-
// @ts-ignore
|
|
85
|
+
// @ts-ignore Shimmed by dist-cjs-fixup.js for CJS build.
|
|
86
86
|
const importMetaUrl = import.meta.url;
|
|
87
87
|
const require_ = createRequire(importMetaUrl);
|
|
88
88
|
const __dirname_ = dirname(fileURLToPath(importMetaUrl));
|
|
@@ -13,7 +13,7 @@ import { getGlobalContext } from '../globalContext.js';
|
|
|
13
13
|
import { createHttpResponseObject, createHttpResponsePageContextJson } from './createHttpResponseObject.js';
|
|
14
14
|
import { loadPageFilesServerSide } from './loadPageFilesServerSide.js';
|
|
15
15
|
import { executeOnRenderHtmlHook } from './executeOnRenderHtmlHook.js';
|
|
16
|
-
import {
|
|
16
|
+
import { executeOnBeforeRenderAndDataHooks } from './executeOnBeforeRenderAndDataHooks.js';
|
|
17
17
|
import { logRuntimeError } from './loggerRuntime.js';
|
|
18
18
|
import { isNewError } from './isNewError.js';
|
|
19
19
|
import { preparePageContextForUserConsumptionServerSide } from './preparePageContextForUserConsumptionServerSide.js';
|
|
@@ -33,11 +33,11 @@ async function renderPageAlreadyRouted(pageContext) {
|
|
|
33
33
|
await executeGuardHook(pageContext, (pageContext) => preparePageContextForUserConsumptionServerSide(pageContext));
|
|
34
34
|
}
|
|
35
35
|
if (!isError) {
|
|
36
|
-
await
|
|
36
|
+
await executeOnBeforeRenderAndDataHooks(pageContext);
|
|
37
37
|
}
|
|
38
38
|
else {
|
|
39
39
|
try {
|
|
40
|
-
await
|
|
40
|
+
await executeOnBeforeRenderAndDataHooks(pageContext);
|
|
41
41
|
}
|
|
42
42
|
catch (err) {
|
|
43
43
|
if (isNewError(err, pageContext.errorWhileRendering)) {
|
|
@@ -75,7 +75,7 @@ async function prerenderPage(pageContext) {
|
|
|
75
75
|
* - It isn't trivial to implement, as it requires to duplicate / factor out the isAbortError() handling
|
|
76
76
|
await executeGuardHook(pageContext, (pageContext) => preparePageContextForUserConsumptionServerSide(pageContext))
|
|
77
77
|
*/
|
|
78
|
-
await
|
|
78
|
+
await executeOnBeforeRenderAndDataHooks(pageContext);
|
|
79
79
|
const { htmlRender, renderHook } = await executeOnRenderHtmlHook(pageContext);
|
|
80
80
|
assertUsage(htmlRender !== null, `Cannot pre-render ${pc.cyan(pageContext.urlOriginal)} because the ${renderHook.hookName}() hook defined by ${renderHook.hookFilePath} didn't return an HTML string.`);
|
|
81
81
|
assert(pageContext.isClientSideNavigation === false);
|
|
@@ -105,7 +105,7 @@ async function prerender404Page(renderContext, pageContextInit_) {
|
|
|
105
105
|
_debugRouteMatches: []
|
|
106
106
|
};
|
|
107
107
|
const pageContextInit = {
|
|
108
|
-
urlOriginal: '/fake-404-url',
|
|
108
|
+
urlOriginal: '/fake-404-url', // A URL is needed for `applyViteHtmlTransform`
|
|
109
109
|
...pageContextInit_
|
|
110
110
|
};
|
|
111
111
|
{
|
|
@@ -2,7 +2,7 @@ export { renderPage };
|
|
|
2
2
|
export { renderPage_addWrapper };
|
|
3
3
|
import { getRenderContext, getPageContextInitEnhanced, renderPageAlreadyRouted } from './renderPage/renderPageAlreadyRouted.js';
|
|
4
4
|
import { route } from '../../shared/route/index.js';
|
|
5
|
-
import { assert, hasProp, objectAssign, isParsable, parseUrl, assertEnv, assertWarning, getGlobalObject, checkType, assertUsage, normalizeUrlPathname, removeBaseServer, modifyUrlPathname, prependBase, removeUrlOrigin, addUrlOrigin, createUrlFromComponents } from './utils.js';
|
|
5
|
+
import { assert, hasProp, objectAssign, isParsable, parseUrl, assertEnv, assertWarning, getGlobalObject, checkType, assertUsage, normalizeUrlPathname, removeBaseServer, modifyUrlPathname, prependBase, removeUrlOrigin, addUrlOrigin, createUrlFromComponents, isUriWithProtocol } from './utils.js';
|
|
6
6
|
import { assertNoInfiniteAbortLoop, getPageContextFromAllRewrites, isAbortError, logAbortErrorHandled } from '../../shared/route/abort.js';
|
|
7
7
|
import { getGlobalContext, initGlobalContext } from './globalContext.js';
|
|
8
8
|
import { handlePageContextRequestUrl } from './renderPage/handlePageContextRequestUrl.js';
|
|
@@ -337,21 +337,33 @@ function getPermanentRedirect(pageContextInit, httpRequestId) {
|
|
|
337
337
|
const { redirects, baseServer } = getGlobalContext();
|
|
338
338
|
const urlWithoutBase = removeBaseServer(pageContextInit.urlOriginal, baseServer);
|
|
339
339
|
let origin = null;
|
|
340
|
+
let urlTargetExternal = null;
|
|
340
341
|
let urlTarget = modifyUrlPathname(urlWithoutBase, (urlPathname) => {
|
|
341
|
-
const
|
|
342
|
-
if (
|
|
342
|
+
const urlTarget = resolveRedirects(redirects, urlPathname);
|
|
343
|
+
if (urlTarget === null)
|
|
343
344
|
return null;
|
|
344
|
-
|
|
345
|
+
if (!isParsable(urlTarget)) {
|
|
346
|
+
// E.g. `urlTarget === 'mailto:some@example.com'`
|
|
347
|
+
assert(isUriWithProtocol(urlTarget) && !urlTarget.startsWith('http'));
|
|
348
|
+
urlTargetExternal = urlTarget;
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
const { urlModified, origin: origin_ } = removeUrlOrigin(urlTarget);
|
|
345
352
|
origin = origin_;
|
|
346
353
|
return urlModified;
|
|
347
354
|
});
|
|
348
|
-
if (
|
|
349
|
-
urlTarget =
|
|
350
|
-
|
|
351
|
-
|
|
355
|
+
if (urlTargetExternal) {
|
|
356
|
+
urlTarget = urlTargetExternal;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
if (origin)
|
|
360
|
+
urlTarget = addUrlOrigin(urlTarget, origin);
|
|
361
|
+
if (urlTarget === urlWithoutBase)
|
|
362
|
+
return null;
|
|
363
|
+
urlTarget = prependBase(urlTarget, baseServer);
|
|
364
|
+
assert(urlTarget !== pageContextInit.urlOriginal);
|
|
365
|
+
}
|
|
352
366
|
logRuntimeInfo?.(`Permanent redirect defined by your config.redirects (https://vike.dev/redirects)`, httpRequestId, 'info');
|
|
353
|
-
urlTarget = prependBase(urlTarget, baseServer);
|
|
354
|
-
assert(urlTarget !== pageContextInit.urlOriginal);
|
|
355
367
|
const httpResponse = createHttpResponseObjectRedirect({ url: urlTarget, statusCode: 301 }, urlWithoutBase);
|
|
356
368
|
const pageContextHttpResponse = { ...pageContextInit, httpResponse };
|
|
357
369
|
return pageContextHttpResponse;
|
|
@@ -15,9 +15,10 @@ declare global {
|
|
|
15
15
|
/** Extend and/or refine the `PageContext` type (`import type { PageContext } from 'vike/types'`).
|
|
16
16
|
*
|
|
17
17
|
* For example:
|
|
18
|
-
* - You can define the type of fetched data, e.g. `PageContext['movies']`.
|
|
19
18
|
* - You can refine the type of `PageContext['Page']`.
|
|
19
|
+
* - You can define the type of custom `pageContext` values such as `pageContext.user`, see https://vike.dev/pageContext#custom
|
|
20
20
|
*
|
|
21
|
+
* https://vike.dev/pageContext#typescript
|
|
21
22
|
*/
|
|
22
23
|
interface PageContext {
|
|
23
24
|
}
|
|
@@ -27,6 +28,7 @@ declare global {
|
|
|
27
28
|
* - `vike-vue`
|
|
28
29
|
* - `vike-solid`
|
|
29
30
|
* - `vike-svelte`
|
|
31
|
+
* - `vike-angular`
|
|
30
32
|
*
|
|
31
33
|
* As a Vike user, you can ignore this.
|
|
32
34
|
*/
|
|
@@ -39,5 +41,7 @@ declare global {
|
|
|
39
41
|
}
|
|
40
42
|
interface ConfigVikeSvelte {
|
|
41
43
|
}
|
|
44
|
+
interface ConfigVikeAngular {
|
|
45
|
+
}
|
|
42
46
|
}
|
|
43
47
|
}
|
|
@@ -20,7 +20,7 @@ function getExports(pageFiles, pageConfig) {
|
|
|
20
20
|
exportValue,
|
|
21
21
|
exportSource: `${pageFile.filePath} > ${isFromDefaultExport ? `\`export default { ${exportName} }\`` : `\`export { ${exportName} }\``}`,
|
|
22
22
|
filePath: pageFile.filePath,
|
|
23
|
-
_filePath: pageFile.filePath,
|
|
23
|
+
_filePath: pageFile.filePath, // TODO/next-major-release: remove
|
|
24
24
|
_fileType: pageFile.fileType,
|
|
25
25
|
_isFromDefaultExport: isFromDefaultExport
|
|
26
26
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export type { PageContextConfig };
|
|
2
2
|
import type { VikePackages } from '../../VikeNamespace.js';
|
|
3
3
|
import type { ConfigBuiltIn } from '../Config.js';
|
|
4
|
-
import type { Combine, IsNotEmpty,
|
|
4
|
+
import type { Combine, IsNotEmpty, XOR5 } from './helpers.ts';
|
|
5
5
|
type PageContextConfig = ConfigBuiltIn & (ConfigVikePackagesNotEmptyXor extends true ? ConfigVikePackagesIntersection : ConfigVikePackagesCombined);
|
|
6
|
-
type ConfigVikePackagesIntersection = VikePackages.ConfigVikeReact & VikePackages.ConfigVikeVue & VikePackages.ConfigVikeSolid & VikePackages.ConfigVikeSvelte;
|
|
7
|
-
type ConfigVikePackagesCombined = Combine<VikePackages.ConfigVikeReact, Combine<VikePackages.ConfigVikeVue, Combine<VikePackages.ConfigVikeSolid, VikePackages.ConfigVikeSvelte
|
|
8
|
-
type ConfigVikePackagesNotEmptyXor =
|
|
6
|
+
type ConfigVikePackagesIntersection = VikePackages.ConfigVikeReact & VikePackages.ConfigVikeVue & VikePackages.ConfigVikeSolid & VikePackages.ConfigVikeSvelte & VikePackages.ConfigVikeAngular;
|
|
7
|
+
type ConfigVikePackagesCombined = Combine<VikePackages.ConfigVikeReact, Combine<VikePackages.ConfigVikeVue, Combine<VikePackages.ConfigVikeSolid, Combine<VikePackages.ConfigVikeSvelte, VikePackages.ConfigVikeAngular>>>>;
|
|
8
|
+
type ConfigVikePackagesNotEmptyXor = XOR5<IsNotEmpty<VikePackages.ConfigVikeReact>, IsNotEmpty<VikePackages.ConfigVikeVue>, IsNotEmpty<VikePackages.ConfigVikeSolid>, IsNotEmpty<VikePackages.ConfigVikeSvelte>, IsNotEmpty<VikePackages.ConfigVikeAngular>>;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export type { IsNotEmpty };
|
|
2
|
-
export type {
|
|
2
|
+
export type { XOR5 };
|
|
3
3
|
export type { Combine };
|
|
4
4
|
type IsNotEmpty<T> = Not<IsEmpty<T>>;
|
|
5
5
|
type IsEmpty<T> = keyof T extends never ? true : false;
|
|
6
6
|
type Combine<T1, T2> = {
|
|
7
7
|
[K in keyof T1 | keyof T2]?: (K extends keyof T1 ? T1[K] : never) | (K extends keyof T2 ? T2[K] : never);
|
|
8
8
|
};
|
|
9
|
-
type
|
|
9
|
+
type XOR5<T1 extends boolean, T2 extends boolean, T3 extends boolean, T4 extends boolean, T5 extends boolean> = (T1 extends true ? T2 extends true ? false : T3 extends true ? false : T4 extends true ? false : Not<T5> : T2 extends true ? T3 extends true ? false : T4 extends true ? false : Not<T5> : T3 extends true ? T4 extends true ? false : Not<T5> : T4 extends true ? Not<T5> : T5);
|
|
10
10
|
type Not<T extends boolean> = T extends true ? false : true;
|
|
@@ -5,6 +5,8 @@ export type { ConfigMeta };
|
|
|
5
5
|
export type { HookName };
|
|
6
6
|
export type { HookNamePage };
|
|
7
7
|
export type { HookNameGlobal };
|
|
8
|
+
export type { DataAsync };
|
|
9
|
+
export type { DataSync };
|
|
8
10
|
export type { GuardAsync };
|
|
9
11
|
export type { GuardSync };
|
|
10
12
|
export type { OnBeforePrerenderStartAsync };
|
|
@@ -35,11 +37,21 @@ import type { Vike, VikePackages } from '../VikeNamespace.js';
|
|
|
35
37
|
import type { HooksTimeoutProvidedByUser } from '../hooks/getHook.js';
|
|
36
38
|
import type { PageContextClient, PageContextServer } from '../types.js';
|
|
37
39
|
type HookName = HookNamePage | HookNameGlobal | HookNameOldDesign;
|
|
38
|
-
type HookNamePage = 'onHydrationEnd' | 'onBeforePrerenderStart' | 'onBeforeRender' | 'onPageTransitionStart' | 'onPageTransitionEnd' | 'onRenderHtml' | 'onRenderClient' | 'guard';
|
|
40
|
+
type HookNamePage = 'onHydrationEnd' | 'onBeforePrerenderStart' | 'onBeforeRender' | 'onPageTransitionStart' | 'onPageTransitionEnd' | 'onRenderHtml' | 'onRenderClient' | 'guard' | 'data';
|
|
39
41
|
type HookNameGlobal = 'onBeforePrerender' | 'onBeforeRoute' | 'onPrerenderStart';
|
|
40
42
|
type HookNameOldDesign = 'render' | 'prerender';
|
|
41
|
-
type ConfigNameBuiltIn = Exclude<keyof Config, keyof ConfigVikeUserProvided | 'onBeforeRoute' | 'onPrerenderStart'> | 'prerender' | 'isClientSideRenderable' | 'onBeforeRenderEnv' | 'hooksTimeout';
|
|
42
|
-
type Config = ConfigBuiltIn & Vike.Config & (VikePackages.ConfigVikeReact | VikePackages.ConfigVikeVue | VikePackages.ConfigVikeSolid | VikePackages.ConfigVikeSvelte);
|
|
43
|
+
type ConfigNameBuiltIn = Exclude<keyof Config, keyof ConfigVikeUserProvided | 'onBeforeRoute' | 'onPrerenderStart'> | 'prerender' | 'isClientSideRenderable' | 'onBeforeRenderEnv' | 'dataEnv' | 'hooksTimeout';
|
|
44
|
+
type Config = ConfigBuiltIn & Vike.Config & (VikePackages.ConfigVikeReact | VikePackages.ConfigVikeVue | VikePackages.ConfigVikeSolid | VikePackages.ConfigVikeSvelte | VikePackages.ConfigVikeAngular);
|
|
45
|
+
/** Hook for fetching data.
|
|
46
|
+
*
|
|
47
|
+
* https://vike.dev/data
|
|
48
|
+
*/
|
|
49
|
+
type DataAsync<Data> = (pageContext: PageContextServer) => Promise<Data>;
|
|
50
|
+
/** Hook for fetching data.
|
|
51
|
+
*
|
|
52
|
+
* https://vike.dev/data
|
|
53
|
+
*/
|
|
54
|
+
type DataSync<Data> = (pageContext: PageContextServer) => Data;
|
|
43
55
|
/** Protect page(s), e.g. forbid unauthorized access.
|
|
44
56
|
*
|
|
45
57
|
* https://vike.dev/guard
|
|
@@ -66,14 +78,14 @@ type OnBeforePrerenderStartSync = () => (string | {
|
|
|
66
78
|
url: string;
|
|
67
79
|
pageContext: Partial<Vike.PageContext>;
|
|
68
80
|
})[];
|
|
69
|
-
/** Hook called before the page is rendered
|
|
81
|
+
/** Hook called before the page is rendered.
|
|
70
82
|
*
|
|
71
83
|
* https://vike.dev/onBeforeRender
|
|
72
84
|
*/
|
|
73
85
|
type OnBeforeRenderAsync = (pageContext: PageContextServer) => Promise<{
|
|
74
86
|
pageContext: Partial<Vike.PageContext>;
|
|
75
87
|
} | void>;
|
|
76
|
-
/** Hook called before the page is rendered
|
|
88
|
+
/** Hook called before the page is rendered.
|
|
77
89
|
*
|
|
78
90
|
* https://vike.dev/onBeforeRender
|
|
79
91
|
*/
|
|
@@ -234,11 +246,16 @@ type ConfigBuiltIn = {
|
|
|
234
246
|
* https://vike.dev/extends
|
|
235
247
|
*/
|
|
236
248
|
extends?: Config | Config[] | ImportString | ImportString[];
|
|
237
|
-
/** Hook called before the page is rendered
|
|
249
|
+
/** Hook called before the page is rendered.
|
|
238
250
|
*
|
|
239
251
|
* https://vike.dev/onBeforeRender
|
|
240
252
|
*/
|
|
241
253
|
onBeforeRender?: OnBeforeRenderAsync | OnBeforeRenderSync | ImportString | null;
|
|
254
|
+
/** Hook for fetching data.
|
|
255
|
+
*
|
|
256
|
+
* https://vike.dev/data
|
|
257
|
+
*/
|
|
258
|
+
data?: DataAsync<unknown> | DataSync<unknown> | ImportString | null;
|
|
242
259
|
/** Determines what pageContext properties are sent to the client-side.
|
|
243
260
|
*
|
|
244
261
|
* https://vike.dev/passToClient
|
|
@@ -319,8 +336,17 @@ type ConfigBuiltIn = {
|
|
|
319
336
|
* https://vike.dev/prefetchStaticAssets
|
|
320
337
|
*/
|
|
321
338
|
prefetchStaticAssets?: PrefetchStaticAssets | ImportString;
|
|
322
|
-
/** Modify the
|
|
339
|
+
/** Modify the timeouts of hooks. */
|
|
323
340
|
hooksTimeout?: HooksTimeoutProvidedByUser;
|
|
341
|
+
/** `Cache-Control` HTTP header value.
|
|
342
|
+
*
|
|
343
|
+
* Default: `no-store, max-age=0`
|
|
344
|
+
*
|
|
345
|
+
* Set to an empty string to not send the header.
|
|
346
|
+
*
|
|
347
|
+
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
|
|
348
|
+
*/
|
|
349
|
+
cacheControl?: string;
|
|
324
350
|
};
|
|
325
351
|
type ConfigMeta = Record<string, ConfigDefinition>;
|
|
326
352
|
type ImportString = `import:${string}`;
|