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.
Files changed (109) hide show
  1. package/dist/cjs/node/plugin/index.js +4 -4
  2. package/dist/cjs/node/plugin/plugins/assertFileEnv.js +107 -0
  3. package/dist/cjs/node/plugin/plugins/autoFullBuild.js +3 -2
  4. package/dist/cjs/node/plugin/plugins/baseUrls.js +2 -2
  5. package/dist/cjs/node/plugin/plugins/buildConfig.js +17 -36
  6. package/dist/cjs/node/plugin/plugins/commonConfig.js +1 -1
  7. package/dist/cjs/node/plugin/plugins/config/resolveExtensions.js +1 -1
  8. package/dist/cjs/node/plugin/plugins/config/stemUtils.js +1 -1
  9. package/dist/cjs/node/plugin/plugins/devConfig/determineFsAllowList.js +1 -1
  10. package/dist/cjs/node/plugin/plugins/importBuild/getVikeManifest.js +38 -0
  11. package/dist/cjs/node/plugin/plugins/importBuild/index.js +57 -19
  12. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -0
  13. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +46 -28
  14. package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwc.js +5 -5
  15. package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwcBig.js +4 -4
  16. package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueCss.js +7 -7
  17. package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueHtml.js +2 -2
  18. package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueJavascript.js +3 -3
  19. package/dist/cjs/node/plugin/shared/loggerNotProd/errorWithCodeSnippet.js +1 -1
  20. package/dist/cjs/node/plugin/shared/loggerVite.js +1 -1
  21. package/dist/cjs/node/plugin/utils.js +1 -0
  22. package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +2 -0
  23. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +2 -1
  24. package/dist/cjs/node/runtime/index-deprecated.js +3 -2
  25. package/dist/cjs/node/runtime/index.js +3 -2
  26. package/dist/cjs/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +20 -0
  27. package/dist/cjs/node/runtime/renderPage/createHttpResponseObject.js +8 -1
  28. package/dist/cjs/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +33 -0
  29. package/dist/cjs/node/runtime/renderPage/getPageAssets.js +1 -1
  30. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -5
  31. package/dist/cjs/node/runtime/renderPage.js +21 -9
  32. package/dist/cjs/shared/getPageFiles/getExports.js +1 -1
  33. package/dist/cjs/shared/route/resolveRedirects.js +3 -11
  34. package/dist/cjs/shared/route/resolveUrlPathname.js +48 -0
  35. package/dist/cjs/utils/debug.js +35 -21
  36. package/dist/cjs/utils/getDependencyPackageJson.js +1 -1
  37. package/dist/cjs/utils/getFilePathAbsolute.js +1 -1
  38. package/dist/cjs/utils/getOutDirs.js +11 -1
  39. package/dist/cjs/utils/injectRollupInputs.js +29 -0
  40. package/dist/cjs/utils/isPlainObject.js +1 -1
  41. package/dist/cjs/utils/projectInfo.js +1 -1
  42. package/dist/cjs/utils/requireResolve.js +1 -1
  43. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +105 -66
  44. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +1 -1
  45. package/dist/esm/node/plugin/index.js +4 -4
  46. package/dist/esm/node/plugin/plugins/assertFileEnv.d.ts +3 -0
  47. package/dist/esm/node/plugin/plugins/assertFileEnv.js +101 -0
  48. package/dist/esm/node/plugin/plugins/autoFullBuild.js +3 -2
  49. package/dist/esm/node/plugin/plugins/baseUrls.js +2 -2
  50. package/dist/esm/node/plugin/plugins/buildConfig.js +17 -36
  51. package/dist/esm/node/plugin/plugins/commonConfig.js +1 -1
  52. package/dist/esm/node/plugin/plugins/config/resolveExtensions.js +1 -1
  53. package/dist/esm/node/plugin/plugins/config/stemUtils.js +1 -1
  54. package/dist/esm/node/plugin/plugins/devConfig/determineFsAllowList.js +1 -1
  55. package/dist/esm/node/plugin/plugins/importBuild/getVikeManifest.d.ts +5 -0
  56. package/dist/esm/node/plugin/plugins/importBuild/getVikeManifest.js +32 -0
  57. package/dist/esm/node/plugin/plugins/importBuild/index.js +59 -21
  58. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/debug.d.ts +1 -1
  59. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -0
  60. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +47 -29
  61. package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwc.js +5 -5
  62. package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errSwcBig.js +4 -4
  63. package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueCss.js +7 -7
  64. package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueHtml.js +2 -2
  65. package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet/fixture-errors/errVueJavascript.js +3 -3
  66. package/dist/esm/node/plugin/shared/loggerNotProd/errorWithCodeSnippet.js +1 -1
  67. package/dist/esm/node/plugin/shared/loggerVite.js +1 -1
  68. package/dist/esm/node/plugin/utils.d.ts +1 -0
  69. package/dist/esm/node/plugin/utils.js +1 -0
  70. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +2 -0
  71. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +2 -1
  72. package/dist/esm/node/runtime/index-deprecated.js +3 -2
  73. package/dist/esm/node/runtime/index.js +3 -2
  74. package/dist/esm/node/runtime/renderPage/createHttpResponseObject/getCacheControl.d.ts +3 -0
  75. package/dist/esm/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +17 -0
  76. package/dist/esm/node/runtime/renderPage/createHttpResponseObject.js +8 -1
  77. package/dist/esm/node/runtime/renderPage/{executeOnBeforeRenderHook.d.ts → executeOnBeforeRenderAndDataHooks.d.ts} +2 -2
  78. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +30 -0
  79. package/dist/esm/node/runtime/renderPage/getPageAssets.js +1 -1
  80. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -5
  81. package/dist/esm/node/runtime/renderPage.js +22 -10
  82. package/dist/esm/shared/VikeNamespace.d.ts +5 -1
  83. package/dist/esm/shared/getPageFiles/getExports.js +1 -1
  84. package/dist/esm/shared/page-configs/Config/PageContextConfig.d.ts +4 -4
  85. package/dist/esm/shared/page-configs/Config/helpers.d.ts +2 -2
  86. package/dist/esm/shared/page-configs/Config.d.ts +33 -7
  87. package/dist/esm/shared/route/resolveRedirects.js +3 -11
  88. package/dist/esm/shared/route/resolveUrlPathname.d.ts +12 -0
  89. package/dist/esm/shared/route/resolveUrlPathname.js +45 -0
  90. package/dist/esm/shared/types.d.ts +5 -0
  91. package/dist/esm/types/index.d.ts +1 -1
  92. package/dist/esm/utils/debug.d.ts +4 -4
  93. package/dist/esm/utils/debug.js +35 -21
  94. package/dist/esm/utils/debugGlob.d.ts +1 -1
  95. package/dist/esm/utils/getDependencyPackageJson.js +1 -1
  96. package/dist/esm/utils/getFilePathAbsolute.js +1 -1
  97. package/dist/esm/utils/getOutDirs.js +11 -1
  98. package/dist/esm/utils/injectRollupInputs.d.ts +7 -0
  99. package/dist/esm/utils/injectRollupInputs.js +26 -0
  100. package/dist/esm/utils/isPlainObject.js +1 -1
  101. package/dist/esm/utils/projectInfo.d.ts +2 -2
  102. package/dist/esm/utils/projectInfo.js +1 -1
  103. package/dist/esm/utils/requireResolve.js +1 -1
  104. package/package.json +38 -19
  105. package/dist/cjs/node/plugin/plugins/manifest.js +0 -59
  106. package/dist/cjs/node/runtime/renderPage/executeOnBeforeRenderHook.js +0 -23
  107. package/dist/esm/node/plugin/plugins/manifest.d.ts +0 -3
  108. package/dist/esm/node/plugin/plugins/manifest.js +0 -53
  109. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderHook.js +0 -20
@@ -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-v1/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",
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-v1/pages/hello/+Page.tsx',
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-v1/pages/hello/+Page.tsx',
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-v1/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-v1/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"
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
  };
@@ -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-v1/pages/index/+Page.tsx',
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-v1/pages/index/+Page.tsx',
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-v1/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 `&rbrace;`?\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full-v1/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-v1/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-v1/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 `&rbrace;`?\n ╭─[\u001b[38;2;92;157;255;1;4m/home/rom/code/vike/examples/react-full-v1/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-v1/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"
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 `&rbrace;`?\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 `&rbrace;`?\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
  };
@@ -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-v1/renderer/PageShell.vue',
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-v1/renderer/PageShell.vue',
17
- file: '/home/rom/code/vike/examples/vue-full-v1/renderer/PageShell.vue'
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-v1/renderer/PageShell.vue', line: 45, column: 2 },
20
- id: '/home/rom/code/vike/examples/vue-full-v1/renderer/PageShell.vue',
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-v1/renderer/PageShell.vue:6:2: Unexpected }',
25
- stack: 'CssSyntaxError: /home/rom/code/vike/examples/vue-full-v1/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)'
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
  };
@@ -1,10 +1,10 @@
1
1
  export const errVueHtml = {
2
- id: '/home/rom/code/vike/examples/vue-full-v1/pages/index/+Page.vue',
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-v1/pages/index/+Page.vue', line: 2, column: 46 },
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-v1/pages/index/+Page.vue',
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-v1/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-v1/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)"
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-v1/components/Counter.tsx:1:8:" (redundant since we already print the filename)
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;
@@ -18,3 +18,4 @@ export * from '../../utils/getPropAccessNotation.js';
18
18
  export * from '../../utils/mergeCumulativeValues.js';
19
19
  export * from '../../utils/deepEqual.js';
20
20
  export * from '../../utils/assertKeys.js';
21
+ export * from '../../utils/injectRollupInputs.js';
@@ -24,3 +24,4 @@ export * from '../../utils/getPropAccessNotation.js';
24
24
  export * from '../../utils/mergeCumulativeValues.js';
25
25
  export * from '../../utils/deepEqual.js';
26
26
  export * from '../../utils/assertKeys.js';
27
+ export * from '../../utils/injectRollupInputs.js';
@@ -34,6 +34,8 @@ async function getHtmlTags(pageContext, injectToStream, injectFilter) {
34
34
  return 'HTML_BEGIN';
35
35
  }
36
36
  if (asset.assetType === 'script') {
37
+ if (isHtmlOnly)
38
+ return false;
37
39
  return 'HTML_END';
38
40
  }
39
41
  return false;
@@ -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,3 @@
1
+ export { getCacheControl };
2
+ import type { PageConfigRuntime } from '../../../../shared/page-configs/PageConfig.js';
3
+ declare function getCacheControl(pageId: string, pageConfigs: PageConfigRuntime[]): string;
@@ -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
- return getHttpResponse(statusCode, 'text/html;charset=utf-8', [], htmlRender, earlyHints, renderHook);
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 { executeOnBeforeRenderHooks };
1
+ export { executeOnBeforeRenderAndDataHooks };
2
2
  import { type PageContextExports } from '../../../shared/getPageFiles.js';
3
3
  import { type PageContextForUserConsumptionServerSide } from './preparePageContextForUserConsumptionServerSide.js';
4
- declare function executeOnBeforeRenderHooks(pageContext: {
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 Shimed by dist-cjs-fixup.js for CJS build.
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 { executeOnBeforeRenderHooks } from './executeOnBeforeRenderHook.js';
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 executeOnBeforeRenderHooks(pageContext);
36
+ await executeOnBeforeRenderAndDataHooks(pageContext);
37
37
  }
38
38
  else {
39
39
  try {
40
- await executeOnBeforeRenderHooks(pageContext);
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 executeOnBeforeRenderHooks(pageContext);
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 urlTargetWithOrigin = resolveRedirects(redirects, urlPathname);
342
- if (urlTargetWithOrigin === null)
342
+ const urlTarget = resolveRedirects(redirects, urlPathname);
343
+ if (urlTarget === null)
343
344
  return null;
344
- const { urlModified, origin: origin_ } = removeUrlOrigin(urlTargetWithOrigin);
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 (origin)
349
- urlTarget = addUrlOrigin(urlTarget, origin);
350
- if (urlTarget === urlWithoutBase)
351
- return null;
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, XOR4 } from './helpers.ts';
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 = XOR4<IsNotEmpty<VikePackages.ConfigVikeReact>, IsNotEmpty<VikePackages.ConfigVikeVue>, IsNotEmpty<VikePackages.ConfigVikeSolid>, IsNotEmpty<VikePackages.ConfigVikeSvelte>>;
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 { XOR4 };
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 XOR4<T1 extends boolean, T2 extends boolean, T3 extends boolean, T4 extends boolean> = (T1 extends true ? T2 extends true ? false : T3 extends true ? false : Not<T4> : T2 extends true ? T3 extends true ? false : Not<T4> : T3 extends true ? Not<T4> : T4);
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, usually for fetching data.
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, usually for fetching data.
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, usually for fetching data.
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 tiemouts of hooks. */
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}`;