create-vike 0.0.4 → 0.0.304

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 (134) hide show
  1. package/.testRun.ts +118 -0
  2. package/boilerplate-react/.eslintrc.cjs +17 -0
  3. package/boilerplate-react/.test-dev.test.ts +2 -0
  4. package/boilerplate-react/.test-prod.test.ts +2 -0
  5. package/boilerplate-react/.testCiJob.json +1 -0
  6. package/boilerplate-react/_gitignore +2 -0
  7. package/boilerplate-react/package.json +27 -0
  8. package/boilerplate-react/pages/about/code.css +6 -0
  9. package/boilerplate-react/pages/about/index.page.jsx +14 -0
  10. package/{files/js/react → boilerplate-react}/pages/index/Counter.jsx +4 -4
  11. package/{files/js/react → boilerplate-react}/pages/index/index.page.jsx +3 -4
  12. package/boilerplate-react/renderer/Link.jsx +14 -0
  13. package/boilerplate-react/renderer/PageShell.css +19 -0
  14. package/{files/js/react/renderer/PageWrapper.jsx → boilerplate-react/renderer/PageShell.jsx} +36 -21
  15. package/boilerplate-react/renderer/PropTypeValues.js +3 -0
  16. package/boilerplate-react/renderer/_default.page.client.jsx +22 -0
  17. package/boilerplate-react/renderer/_default.page.server.jsx +45 -0
  18. package/{files/js/react → boilerplate-react}/renderer/_error.page.jsx +8 -5
  19. package/boilerplate-react/renderer/logo.svg +36 -0
  20. package/boilerplate-react/renderer/usePageContext.jsx +25 -0
  21. package/boilerplate-react/server/index.js +74 -0
  22. package/boilerplate-react/server/root.js +8 -0
  23. package/boilerplate-react/vite.config.js +6 -0
  24. package/boilerplate-react-ts/.eslintrc.cjs +19 -0
  25. package/boilerplate-react-ts/.test-dev.test.ts +2 -0
  26. package/boilerplate-react-ts/.test-prod.test.ts +2 -0
  27. package/boilerplate-react-ts/.testCiJob.json +1 -0
  28. package/boilerplate-react-ts/_gitignore +2 -0
  29. package/boilerplate-react-ts/package.json +36 -0
  30. package/boilerplate-react-ts/pages/about/code.css +6 -0
  31. package/boilerplate-react-ts/pages/about/index.page.tsx +14 -0
  32. package/{files/ts/react → boilerplate-react-ts}/pages/index/Counter.tsx +4 -4
  33. package/{files/ts/react → boilerplate-react-ts}/pages/index/index.page.tsx +3 -4
  34. package/boilerplate-react-ts/renderer/Link.tsx +9 -0
  35. package/{files/ts/react/renderer/PageWrapper.tsx → boilerplate-react-ts/renderer/PageShell.tsx} +22 -28
  36. package/boilerplate-react-ts/renderer/_default.page.client.tsx +23 -0
  37. package/boilerplate-react-ts/renderer/_default.page.server.tsx +46 -0
  38. package/{files/ts/react → boilerplate-react-ts}/renderer/_error.page.tsx +4 -6
  39. package/boilerplate-react-ts/renderer/types.ts +35 -0
  40. package/boilerplate-react-ts/renderer/usePageContext.tsx +20 -0
  41. package/boilerplate-react-ts/server/index.ts +74 -0
  42. package/boilerplate-react-ts/server/root.ts +8 -0
  43. package/boilerplate-react-ts/server/tsconfig.json +9 -0
  44. package/boilerplate-react-ts/tsconfig.json +22 -0
  45. package/boilerplate-react-ts/vite.config.ts +9 -0
  46. package/boilerplate-vue/.test-dev.test.ts +2 -0
  47. package/boilerplate-vue/.test-prod.test.ts +2 -0
  48. package/boilerplate-vue/.testCiJob.json +1 -0
  49. package/boilerplate-vue/_gitignore +2 -0
  50. package/boilerplate-vue/package.json +22 -0
  51. package/boilerplate-vue/pages/about/index.page.vue +13 -0
  52. package/boilerplate-vue/pages/index/Counter.vue +8 -0
  53. package/{files/js/vue → boilerplate-vue}/pages/index/index.page.vue +1 -1
  54. package/{files/js/vue → boilerplate-vue}/renderer/Link.vue +2 -2
  55. package/{files/js/vue/renderer/PageWrapper.vue → boilerplate-vue/renderer/PageShell.vue} +1 -1
  56. package/boilerplate-vue/renderer/_default.page.client.js +15 -0
  57. package/boilerplate-vue/renderer/_default.page.server.js +54 -0
  58. package/{files/js/vue → boilerplate-vue}/renderer/_error.page.vue +2 -2
  59. package/boilerplate-vue/renderer/app.js +28 -0
  60. package/boilerplate-vue/renderer/logo.svg +36 -0
  61. package/boilerplate-vue/renderer/usePageContext.js +18 -0
  62. package/boilerplate-vue/server/index.js +74 -0
  63. package/boilerplate-vue/server/root.js +8 -0
  64. package/boilerplate-vue/vite.config.js +6 -0
  65. package/boilerplate-vue-ts/.test-dev.test.ts +2 -0
  66. package/boilerplate-vue-ts/.test-prod.test.ts +2 -0
  67. package/boilerplate-vue-ts/.testCiJob.json +1 -0
  68. package/boilerplate-vue-ts/_gitignore +2 -0
  69. package/boilerplate-vue-ts/package.json +28 -0
  70. package/boilerplate-vue-ts/pages/about/index.page.vue +13 -0
  71. package/boilerplate-vue-ts/pages/index/Counter.vue +8 -0
  72. package/{files/ts/vue → boilerplate-vue-ts}/pages/index/index.page.vue +1 -1
  73. package/{files/ts/vue → boilerplate-vue-ts}/renderer/Link.vue +2 -2
  74. package/{files/ts/vue/renderer/PageWrapper.vue → boilerplate-vue-ts/renderer/PageShell.vue} +1 -1
  75. package/boilerplate-vue-ts/renderer/_default.page.client.ts +16 -0
  76. package/boilerplate-vue-ts/renderer/_default.page.server.ts +56 -0
  77. package/{files/ts/vue → boilerplate-vue-ts}/renderer/_error.page.vue +2 -2
  78. package/boilerplate-vue-ts/renderer/app.ts +29 -0
  79. package/boilerplate-vue-ts/renderer/logo.svg +36 -0
  80. package/boilerplate-vue-ts/renderer/types.ts +38 -0
  81. package/boilerplate-vue-ts/renderer/usePageContext.ts +21 -0
  82. package/boilerplate-vue-ts/server/index.ts +74 -0
  83. package/boilerplate-vue-ts/server/root.ts +8 -0
  84. package/boilerplate-vue-ts/server/tsconfig.json +9 -0
  85. package/boilerplate-vue-ts/tsconfig.json +21 -0
  86. package/boilerplate-vue-ts/vite.config.ts +9 -0
  87. package/boilerplate-vue-ts/vue.d.ts +4 -0
  88. package/index.js +222 -0
  89. package/package.json +13 -52
  90. package/README.md +0 -30
  91. package/create-vike.js +0 -2
  92. package/dist/index.js +0 -402
  93. package/files/js/react/pages/about/index.page.jsx +0 -13
  94. package/files/js/react/renderer/Link.jsx +0 -15
  95. package/files/js/react/renderer/_default.page.client.jsx +0 -19
  96. package/files/js/react/renderer/_default.page.server.jsx +0 -47
  97. package/files/js/react/renderer/usePageContext.jsx +0 -18
  98. package/files/js/react+client-router/renderer/_default.page.client.jsx +0 -43
  99. package/files/js/react+client-router/renderer/types.js +0 -1
  100. package/files/js/vike/server/index.js +0 -40
  101. package/files/js/vue/pages/about/index.page.vue +0 -11
  102. package/files/js/vue/pages/index/Counter.vue +0 -10
  103. package/files/js/vue/renderer/_default.page.client.js +0 -12
  104. package/files/js/vue/renderer/_default.page.server.js +0 -41
  105. package/files/js/vue/renderer/app.js +0 -29
  106. package/files/js/vue/renderer/usePageContext.js +0 -18
  107. package/files/js/vue+client-router/renderer/_default.page.client.js +0 -23
  108. package/files/js/vue+client-router/renderer/app.js +0 -36
  109. package/files/js/vue+client-router/renderer/types.js +0 -1
  110. package/files/shared/.prettierrc +0 -1
  111. package/files/shared/react/pages/about/index.css +0 -4
  112. package/files/shared/vike/_gitignore +0 -121
  113. package/files/ts/react/pages/about/index.page.tsx +0 -13
  114. package/files/ts/react/renderer/Link.tsx +0 -19
  115. package/files/ts/react/renderer/_default.page.client.tsx +0 -21
  116. package/files/ts/react/renderer/_default.page.server.tsx +0 -49
  117. package/files/ts/react/renderer/types.ts +0 -11
  118. package/files/ts/react/renderer/usePageContext.tsx +0 -25
  119. package/files/ts/react+client-router/renderer/_default.page.client.tsx +0 -44
  120. package/files/ts/react+client-router/renderer/types.ts +0 -12
  121. package/files/ts/vike/server/index.ts +0 -40
  122. package/files/ts/vue/pages/about/index.page.vue +0 -11
  123. package/files/ts/vue/pages/index/Counter.vue +0 -10
  124. package/files/ts/vue/renderer/_default.page.client.ts +0 -14
  125. package/files/ts/vue/renderer/_default.page.server.ts +0 -43
  126. package/files/ts/vue/renderer/app.ts +0 -30
  127. package/files/ts/vue/renderer/types.ts +0 -10
  128. package/files/ts/vue/renderer/usePageContext.ts +0 -20
  129. package/files/ts/vue/vue.d.ts +0 -4
  130. package/files/ts/vue+client-router/renderer/_default.page.client.ts +0 -24
  131. package/files/ts/vue+client-router/renderer/app.ts +0 -37
  132. package/files/ts/vue+client-router/renderer/types.ts +0 -11
  133. /package/{files/shared/react/renderer/PageWrapper.css → boilerplate-react-ts/renderer/PageShell.css} +0 -0
  134. /package/{files/shared/vike → boilerplate-react-ts}/renderer/logo.svg +0 -0
@@ -0,0 +1,54 @@
1
+ export { render }
2
+ // See https://vike.dev/data-fetching
3
+ export const passToClient = ['pageProps', 'urlPathname']
4
+
5
+ import { renderToString as renderToString_ } from '@vue/server-renderer'
6
+ import { escapeInject, dangerouslySkipEscape } from 'vike/server'
7
+ import { createApp } from './app'
8
+ import logoUrl from './logo.svg'
9
+
10
+ async function render(pageContext) {
11
+ const { Page, pageProps } = pageContext
12
+ // This render() hook only supports SSR, see https://vike.dev/render-modes for how to modify render() to support SPA
13
+ if (!Page) throw new Error('My render() hook expects pageContext.Page to be defined')
14
+ const app = createApp(Page, pageProps, pageContext)
15
+
16
+ const appHtml = await renderToString(app)
17
+
18
+ // See https://vike.dev/head
19
+ const { documentProps } = pageContext.exports
20
+ const title = (documentProps && documentProps.title) || 'Vite SSR app'
21
+ const desc = (documentProps && documentProps.description) || 'App using Vite + Vike'
22
+
23
+ const documentHtml = escapeInject`<!DOCTYPE html>
24
+ <html lang="en">
25
+ <head>
26
+ <meta charset="UTF-8" />
27
+ <link rel="icon" href="${logoUrl}" />
28
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
29
+ <meta name="description" content="${desc}" />
30
+ <title>${title}</title>
31
+ </head>
32
+ <body>
33
+ <div id="app">${dangerouslySkipEscape(appHtml)}</div>
34
+ </body>
35
+ </html>`
36
+
37
+ return {
38
+ documentHtml,
39
+ pageContext: {
40
+ // We can add some `pageContext` here, which is useful if we want to do page redirection https://vike.dev/page-redirection
41
+ }
42
+ }
43
+ }
44
+
45
+ async function renderToString(app) {
46
+ let err
47
+ // Workaround: renderToString_() swallows errors in production, see https://github.com/vuejs/core/issues/7876
48
+ app.config.errorHandler = (err_) => {
49
+ err = err_
50
+ }
51
+ const appHtml = await renderToString_(app)
52
+ if (err) throw err
53
+ return appHtml
54
+ }
@@ -4,11 +4,11 @@
4
4
  <p>This page could not be found.</p>
5
5
  </div>
6
6
  <div v-else>
7
- <h1>500 Internal Server Error</h1>
7
+ <h1>500 Internal Error</h1>
8
8
  <p>Something went wrong.</p>
9
9
  </div>
10
10
  </template>
11
11
 
12
12
  <script setup>
13
- defineProps(["is404"]);
13
+ defineProps(['is404'])
14
14
  </script>
@@ -0,0 +1,28 @@
1
+ import { createSSRApp, h } from 'vue'
2
+ import PageShell from './PageShell.vue'
3
+ import { setPageContext } from './usePageContext'
4
+
5
+ export { createApp }
6
+
7
+ function createApp(Page, pageProps, pageContext) {
8
+ const PageWithLayout = {
9
+ render() {
10
+ return h(
11
+ PageShell,
12
+ {},
13
+ {
14
+ default() {
15
+ return h(Page, pageProps || {})
16
+ }
17
+ }
18
+ )
19
+ }
20
+ }
21
+
22
+ const app = createSSRApp(PageWithLayout)
23
+
24
+ // We make pageContext available from any Vue component
25
+ setPageContext(app, pageContext)
26
+
27
+ return app
28
+ }
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="175" height="175" fill="none" version="1.1" viewBox="0 0 175 175" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
3
+ <metadata>
4
+ <rdf:RDF>
5
+ <cc:Work rdf:about="">
6
+ <dc:format>image/svg+xml</dc:format>
7
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
8
+ <dc:title/>
9
+ </cc:Work>
10
+ </rdf:RDF>
11
+ </metadata>
12
+ <defs>
13
+ <linearGradient id="linearGradient880" x1="108.64" x2="115.51" y1="88.726" y2="136.2" gradientTransform="matrix(1.0498 0 0 1.0498 -2.9171 -2.9658)" gradientUnits="userSpaceOnUse">
14
+ <stop stop-color="#ffea83" offset="0"/>
15
+ <stop stop-color="#FFDD35" offset=".083333"/>
16
+ <stop stop-color="#FFA800" offset="1"/>
17
+ </linearGradient>
18
+ <linearGradient id="paint2_linear" x1="48.975" x2="61.299" y1="3.9232" y2="158.04" gradientTransform="translate(-2.832e-5)" gradientUnits="userSpaceOnUse">
19
+ <stop stop-color="#FFEA83" offset="0"/>
20
+ <stop stop-color="#FFDD35" offset=".083333"/>
21
+ <stop stop-color="#FFA800" offset="1"/>
22
+ </linearGradient>
23
+ <linearGradient id="paint0_linear-6" x1="-1.4492" x2="116.62" y1="-5.8123" y2="137.08" gradientTransform="translate(-2.832e-5)" gradientUnits="userSpaceOnUse">
24
+ <stop stop-color="#41D1FF" offset="0"/>
25
+ <stop stop-color="#BD34FE" offset="1"/>
26
+ </linearGradient>
27
+ </defs>
28
+ <circle cx="87.5" cy="87.5" r="87.5" fill="#c4c4c4"/>
29
+ <circle cx="87.5" cy="87.5" r="87.5" fill="url(#paint0_linear-6)"/>
30
+ <g transform="translate(632.92 54.355)" fill="#d38787" stroke-width="1.0614">
31
+ <path d="m-549.75 68.457c-5.7533-3.1217-6.1166-5.2295-6.1166-35.489 0-30.458 0.35464-32.448 6.3339-35.54 3.9943-2.0655 24.279-2.2805 26.735-0.28333 0.89718 0.72974 6.7203 6.6637 12.94 13.187l11.309 11.86v19.575c0 18.473-0.12956 19.74-2.3011 22.5-4.0223 5.1136-7.558 5.8565-27.65 5.8099-14.15-0.03287-19.008-0.40294-21.25-1.6191zm42.473-6.3594c2.27-1.59 2.359-2.2909 2.359-18.575v-16.923h-6.9521c-12.443 0-16.4-4.0845-16.4-16.93v-7.4828h-8.9464c-6.7178 0-9.3619 0.41549-10.614 1.668-2.5031 2.5031-2.5031 55.724 0 58.228 2.4502 2.4502 37.058 2.4636 40.553 0.01609zm-1.8867-42.165c0-0.16422-2.8659-3.1346-6.3686-6.6008l-6.3686-6.3022v4.9328c0 6.3185 1.8955 8.2687 8.0366 8.2687 2.5854 0 4.7007-0.13434 4.7007-0.29859zm-57.57 44.279c-5.6185-3.0486-6.1166-5.593-6.1166-31.243 0-18.891 0.31331-24.063 1.6101-26.571 1.809-3.4981 6.5048-6.3339 10.489-6.3339 2.4847 0 2.5814 0.19984 1.541 3.1843-0.61054 1.7514-1.7457 3.1843-2.5226 3.1843-0.77686 0-2.1631 0.75059-3.0805 1.668-2.4923 2.4923-2.4923 47.244 0 49.736 0.91739 0.9174 2.3036 1.668 3.0805 1.668 0.77688 0 1.912 1.4329 2.5226 3.1843 1.0562 3.0298 0.97108 3.1822-1.7537 3.1418-1.575-0.02331-4.1713-0.75194-5.7694-1.6191zm-16.983-4.2458c-5.4392-2.9512-6.1166-5.9415-6.1166-26.997 0-15.096 0.345-19.878 1.6101-22.325 1.7476-3.3796 6.4758-6.3339 10.137-6.3339 1.8666 0 2.1789 0.44955 1.6594 2.3882-0.35184 1.3135-0.64655 2.7465-0.65453 3.1843-8e-3 0.43784-0.69682 0.79608-1.5308 0.79608-0.83399 0-2.2669 0.75059-3.1843 1.668-2.4767 2.4767-2.4767 38.768 0 41.244 0.91741 0.91739 2.2946 1.668 3.0605 1.668 1.196 0 2.6402 2.995 2.6871 5.5726 0.0241 1.3294-4.5804 0.80962-7.6676-0.8655z" style="mix-blend-mode:lighten"/>
32
+ <path d="m-552.2 68.911c-5.7533-3.1217-6.1166-5.2295-6.1166-35.489 0-30.458 0.35463-32.448 6.3339-35.54 3.9943-2.0655 24.279-2.2805 26.735-0.28333 0.89718 0.72974 6.7203 6.6637 12.94 13.187l11.309 11.86v19.575c0 18.473-0.12957 19.74-2.3011 22.5-4.0223 5.1136-7.558 5.8565-27.65 5.8099-14.15-0.03287-19.008-0.40294-21.25-1.6191zm42.473-6.3594c2.27-1.59 2.359-2.2909 2.359-18.575v-16.923h-6.952c-12.443 0-16.4-4.0845-16.4-16.93v-7.4828h-8.9464c-6.7179 0-9.3619 0.41549-10.614 1.668-2.5031 2.5031-2.5031 55.724 0 58.228 2.4502 2.4502 37.058 2.4636 40.553 0.01609zm-1.8867-42.165c0-0.16422-2.8659-3.1346-6.3686-6.6008l-6.3686-6.3022v4.9328c0 6.3185 1.8955 8.2688 8.0366 8.2688 2.5854 0 4.7007-0.13434 4.7007-0.29859zm-57.57 44.279c-5.6185-3.0486-6.1166-5.593-6.1166-31.243 0-18.891 0.31331-24.063 1.6101-26.571 1.809-3.4981 6.5048-6.3339 10.489-6.3339 2.4847 0 2.5814 0.19984 1.541 3.1843-0.61054 1.7514-1.7457 3.1843-2.5226 3.1843-0.77687 0-2.1631 0.75059-3.0805 1.668-2.4923 2.4923-2.4923 47.244 0 49.736 0.91741 0.91739 2.3036 1.668 3.0805 1.668 0.77686 0 1.912 1.4329 2.5226 3.1843 1.0562 3.0298 0.97107 3.1822-1.7537 3.1418-1.575-0.02331-4.1713-0.75194-5.7694-1.6191zm-16.983-4.2458c-5.4392-2.9512-6.1166-5.9415-6.1166-26.997 0-15.096 0.34502-19.878 1.6101-22.325 1.7476-3.3796 6.4758-6.3339 10.137-6.3339 1.8666 0 2.1789 0.44955 1.6594 2.3882-0.35182 1.3135-0.64653 2.7465-0.65452 3.1843-8e-3 0.43784-0.69683 0.79608-1.5308 0.79608-0.83397 0-2.2669 0.75059-3.1843 1.668-2.4767 2.4767-2.4767 38.768 0 41.245 0.9174 0.91739 2.2946 1.668 3.0605 1.668 1.196 0 2.6402 2.995 2.6871 5.5726 0.0241 1.3294-4.5804 0.80962-7.6676-0.8655z" fill-opacity=".47466" style="mix-blend-mode:lighten"/>
33
+ </g>
34
+ <path d="m128.48 88.913-24.027 4.6784c-0.39475 0.07685-0.68766 0.40944-0.71076 0.80849l-1.4782 24.805c-0.0347 0.58371 0.50497 1.0372 1.0792 0.90602l6.6886-1.5338c0.62676-0.14383 1.1916 0.40419 1.0635 1.0299l-1.9874 9.6702c-0.13438 0.65091 0.48084 1.2073 1.1202 1.0142l4.1322-1.2472c0.64041-0.19317 1.2556 0.36535 1.1202 1.0162l-3.158 15.191c-0.19842 0.95011 1.074 1.4677 1.6042 0.653l0.35485-0.54382 19.578-38.827c0.32755-0.64985-0.23727-1.391-0.95641-1.2535l-6.8849 1.3207c-0.6467 0.12389-1.1979-0.47453-1.0152-1.1034l4.4944-15.482c0.18266-0.63012-0.36955-1.2295-1.0173-1.1034z" fill="url(#linearGradient880)" stroke-width="1.0498"/>
35
+ <rect x="3" y="3" width="169" height="169" rx="84.5" stroke="url(#paint2_linear)" stroke-width="6" style="mix-blend-mode:soft-light"/>
36
+ </svg>
@@ -0,0 +1,18 @@
1
+ // `usePageContext` allows us to access `pageContext` in any Vue component.
2
+ // See https://vike.dev/pageContext-anywhere
3
+
4
+ import { inject } from 'vue'
5
+
6
+ export { usePageContext }
7
+ export { setPageContext }
8
+
9
+ const key = Symbol()
10
+
11
+ function usePageContext() {
12
+ const pageContext = inject(key)
13
+ return pageContext
14
+ }
15
+
16
+ function setPageContext(app, pageContext) {
17
+ app.provide(key, pageContext)
18
+ }
@@ -0,0 +1,74 @@
1
+ // This file isn't processed by Vite, see https://github.com/vikejs/vike/issues/562
2
+ // Consequently:
3
+ // - When changing this file, you needed to manually restart your server for your changes to take effect.
4
+ // - To use your environment variables defined in your .env files, you need to install dotenv, see https://vike.dev/env
5
+ // - To use your path aliases defined in your vite.config.js, you need to tell Node.js about them, see https://vike.dev/path-aliases
6
+
7
+ // If you want Vite to process your server code then use one of these:
8
+ // - vavite (https://github.com/cyco130/vavite)
9
+ // - See vavite + Vike examples at https://github.com/cyco130/vavite/tree/main/examples
10
+ // - vite-node (https://github.com/antfu/vite-node)
11
+ // - HatTip (https://github.com/hattipjs/hattip)
12
+ // - You can use Bati (https://batijs.github.io/) to scaffold a vike + HatTip app. Note that Bati generates apps that use the V1 design (https://vike.dev/migration/v1-design) and Vike packages (https://vike.dev/vike-packages)
13
+
14
+ import express from 'express'
15
+ import compression from 'compression'
16
+ import { renderPage } from 'vike/server'
17
+ import { root } from './root.js'
18
+ const isProduction = process.env.NODE_ENV === 'production'
19
+
20
+ startServer()
21
+
22
+ async function startServer() {
23
+ const app = express()
24
+
25
+ app.use(compression())
26
+
27
+ // Vite integration
28
+ if (isProduction) {
29
+ // In production, we need to serve our static assets ourselves.
30
+ // (In dev, Vite's middleware serves our static assets.)
31
+ const sirv = (await import('sirv')).default
32
+ app.use(sirv(`${root}/dist/client`))
33
+ } else {
34
+ // We instantiate Vite's development server and integrate its middleware to our server.
35
+ // ⚠️ We instantiate it only in development. (It isn't needed in production and it
36
+ // would unnecessarily bloat our production server.)
37
+ const vite = await import('vite')
38
+ const viteDevMiddleware = (
39
+ await vite.createServer({
40
+ root,
41
+ server: { middlewareMode: true }
42
+ })
43
+ ).middlewares
44
+ app.use(viteDevMiddleware)
45
+ }
46
+
47
+ // ...
48
+ // Other middlewares (e.g. some RPC middleware such as Telefunc)
49
+ // ...
50
+
51
+ // Vike middleware. It should always be our last middleware (because it's a
52
+ // catch-all middleware superseding any middleware placed after it).
53
+ app.get('*', async (req, res, next) => {
54
+ const pageContextInit = {
55
+ urlOriginal: req.originalUrl
56
+ }
57
+ const pageContext = await renderPage(pageContextInit)
58
+ const { httpResponse } = pageContext
59
+ if (!httpResponse) {
60
+ return next()
61
+ } else {
62
+ const { body, statusCode, headers, earlyHints } = httpResponse
63
+ if (res.writeEarlyHints) res.writeEarlyHints({ link: earlyHints.map((e) => e.earlyHintLink) })
64
+ headers.forEach(([name, value]) => res.setHeader(name, value))
65
+ res.status(statusCode)
66
+ // For HTTP streams use httpResponse.pipe() instead, see https://vike.dev/stream
67
+ res.send(body)
68
+ }
69
+ })
70
+
71
+ const port = process.env.PORT || 3000
72
+ app.listen(port)
73
+ console.log(`Server running at http://localhost:${port}`)
74
+ }
@@ -0,0 +1,8 @@
1
+ export { root }
2
+
3
+ // https://stackoverflow.com/questions/46745014/alternative-for-dirname-in-node-when-using-the-experimental-modules-flag/50052194#50052194
4
+
5
+ import { dirname } from 'path'
6
+ import { fileURLToPath } from 'url'
7
+ const __dirname = dirname(fileURLToPath(import.meta.url))
8
+ const root = `${__dirname}/..`
@@ -0,0 +1,6 @@
1
+ import vue from '@vitejs/plugin-vue'
2
+ import ssr from 'vike/plugin'
3
+
4
+ export default {
5
+ plugins: [vue(), ssr()]
6
+ }
@@ -0,0 +1,2 @@
1
+ import { testRun } from '../.testRun'
2
+ testRun('npm run dev', { uiFramewok: 'vue' })
@@ -0,0 +1,2 @@
1
+ import { testRun } from '../.testRun'
2
+ testRun('npm run prod', { uiFramewok: 'vue' })
@@ -0,0 +1 @@
1
+ { "name": "Boilerplates" }
@@ -0,0 +1,2 @@
1
+ node_modules/
2
+ dist/
@@ -0,0 +1,28 @@
1
+ {
2
+ "scripts": {
3
+ "dev": "npm run server:dev",
4
+ "prod": "npm run build && npm run server:prod",
5
+ "build": "vite build",
6
+ "server": "node --loader ts-node/esm ./server/index.ts",
7
+ "server:dev": "npm run server",
8
+ "server:prod": "cross-env NODE_ENV=production npm run server"
9
+ },
10
+ "dependencies": {
11
+ "@types/compression": "^1.7.2",
12
+ "@types/express": "^4.17.17",
13
+ "@types/node": "^20.4.10",
14
+ "@vitejs/plugin-vue": "^4.2.3",
15
+ "@vue/compiler-sfc": "^3.3.4",
16
+ "@vue/server-renderer": "^3.3.4",
17
+ "compression": "^1.7.4",
18
+ "cross-env": "^7.0.3",
19
+ "express": "^4.18.2",
20
+ "sirv": "^2.0.3",
21
+ "ts-node": "^10.9.1",
22
+ "typescript": "^5.1.6",
23
+ "vite": "^4.4.9",
24
+ "vike": "^0.4.142",
25
+ "vue": "^3.3.4"
26
+ },
27
+ "type": "module"
28
+ }
@@ -0,0 +1,13 @@
1
+ <template>
2
+ <h1>About</h1>
3
+ <p>Example of app using Vike.</p>
4
+ </template>
5
+
6
+ <style>
7
+ code {
8
+ font-family: monospace;
9
+ background-color: #eaeaea;
10
+ padding: 3px 5px;
11
+ border-radius: 4px;
12
+ }
13
+ </style>
@@ -0,0 +1,8 @@
1
+ <template>
2
+ <button type="button" @click="state.count++">Counter {{ state.count }}</button>
3
+ </template>
4
+
5
+ <script lang="ts" setup>
6
+ import { reactive } from 'vue'
7
+ const state = reactive({ count: 0 })
8
+ </script>
@@ -8,5 +8,5 @@
8
8
  </template>
9
9
 
10
10
  <script lang="ts" setup>
11
- import Counter from "./Counter.vue";
11
+ import Counter from './Counter.vue'
12
12
  </script>
@@ -12,6 +12,6 @@ a.active {
12
12
  }
13
13
  </style>
14
14
  <script lang="ts" setup>
15
- import { usePageContext } from "./usePageContext";
16
- const pageContext = usePageContext();
15
+ import { usePageContext } from './usePageContext'
16
+ const pageContext = usePageContext()
17
17
  </script>
@@ -12,7 +12,7 @@
12
12
  </template>
13
13
 
14
14
  <script lang="ts" setup>
15
- import Link from "./Link.vue";
15
+ import Link from './Link.vue'
16
16
  </script>
17
17
 
18
18
  <style>
@@ -0,0 +1,16 @@
1
+ export { render }
2
+
3
+ import { createApp } from './app'
4
+ import type { PageContextClient } from './types'
5
+
6
+ // This render() hook only supports SSR, see https://vike.dev/render-modes for how to modify render() to support SPA
7
+ async function render(pageContext: PageContextClient) {
8
+ const { Page, pageProps } = pageContext
9
+ if (!Page) throw new Error('Client-side render() hook expects pageContext.Page to be defined')
10
+ const app = createApp(Page, pageProps, pageContext)
11
+ app.mount('#app')
12
+ }
13
+
14
+ /* To enable Client-side Routing:
15
+ export const clientRouting = true
16
+ // !! WARNING !! Before doing so, read https://vike.dev/clientRouting */
@@ -0,0 +1,56 @@
1
+ export { render }
2
+ // See https://vike.dev/data-fetching
3
+ export const passToClient = ['pageProps', 'urlPathname']
4
+
5
+ import { renderToString as renderToString_ } from '@vue/server-renderer'
6
+ import type { App } from 'vue'
7
+ import { escapeInject, dangerouslySkipEscape } from 'vike/server'
8
+ import { createApp } from './app'
9
+ import logoUrl from './logo.svg'
10
+ import type { PageContextServer } from './types'
11
+
12
+ async function render(pageContext: PageContextServer) {
13
+ const { Page, pageProps } = pageContext
14
+ // This render() hook only supports SSR, see https://vike.dev/render-modes for how to modify render() to support SPA
15
+ if (!Page) throw new Error('My render() hook expects pageContext.Page to be defined')
16
+ const app = createApp(Page, pageProps, pageContext)
17
+
18
+ const appHtml = await renderToString(app)
19
+
20
+ // See https://vike.dev/head
21
+ const { documentProps } = pageContext.exports
22
+ const title = (documentProps && documentProps.title) || 'Vite SSR app'
23
+ const desc = (documentProps && documentProps.description) || 'App using Vite + Vike'
24
+
25
+ const documentHtml = escapeInject`<!DOCTYPE html>
26
+ <html lang="en">
27
+ <head>
28
+ <meta charset="UTF-8" />
29
+ <link rel="icon" href="${logoUrl}" />
30
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
31
+ <meta name="description" content="${desc}" />
32
+ <title>${title}</title>
33
+ </head>
34
+ <body>
35
+ <div id="app">${dangerouslySkipEscape(appHtml)}</div>
36
+ </body>
37
+ </html>`
38
+
39
+ return {
40
+ documentHtml,
41
+ pageContext: {
42
+ // We can add some `pageContext` here, which is useful if we want to do page redirection https://vike.dev/page-redirection
43
+ }
44
+ }
45
+ }
46
+
47
+ async function renderToString(app: App) {
48
+ let err: unknown
49
+ // Workaround: renderToString_() swallows errors in production, see https://github.com/vuejs/core/issues/7876
50
+ app.config.errorHandler = (err_) => {
51
+ err = err_
52
+ }
53
+ const appHtml = await renderToString_(app)
54
+ if (err) throw err
55
+ return appHtml
56
+ }
@@ -4,11 +4,11 @@
4
4
  <p>This page could not be found.</p>
5
5
  </div>
6
6
  <div v-else>
7
- <h1>500 Internal Server Error</h1>
7
+ <h1>500 Internal Error</h1>
8
8
  <p>Something went wrong.</p>
9
9
  </div>
10
10
  </template>
11
11
 
12
12
  <script lang="ts" setup>
13
- defineProps(["is404"]);
13
+ defineProps(['is404'])
14
14
  </script>
@@ -0,0 +1,29 @@
1
+ import { createSSRApp, defineComponent, h } from 'vue'
2
+ import PageShell from './PageShell.vue'
3
+ import { setPageContext } from './usePageContext'
4
+ import type { Component, PageContext, PageProps } from './types'
5
+
6
+ export { createApp }
7
+
8
+ function createApp(Page: Component, pageProps: PageProps | undefined, pageContext: PageContext) {
9
+ const PageWithLayout = defineComponent({
10
+ render() {
11
+ return h(
12
+ PageShell,
13
+ {},
14
+ {
15
+ default() {
16
+ return h(Page, pageProps || {})
17
+ }
18
+ }
19
+ )
20
+ }
21
+ })
22
+
23
+ const app = createSSRApp(PageWithLayout)
24
+
25
+ // Make pageContext available from any Vue component
26
+ setPageContext(app, pageContext)
27
+
28
+ return app
29
+ }
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="175" height="175" fill="none" version="1.1" viewBox="0 0 175 175" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
3
+ <metadata>
4
+ <rdf:RDF>
5
+ <cc:Work rdf:about="">
6
+ <dc:format>image/svg+xml</dc:format>
7
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
8
+ <dc:title/>
9
+ </cc:Work>
10
+ </rdf:RDF>
11
+ </metadata>
12
+ <defs>
13
+ <linearGradient id="linearGradient880" x1="108.64" x2="115.51" y1="88.726" y2="136.2" gradientTransform="matrix(1.0498 0 0 1.0498 -2.9171 -2.9658)" gradientUnits="userSpaceOnUse">
14
+ <stop stop-color="#ffea83" offset="0"/>
15
+ <stop stop-color="#FFDD35" offset=".083333"/>
16
+ <stop stop-color="#FFA800" offset="1"/>
17
+ </linearGradient>
18
+ <linearGradient id="paint2_linear" x1="48.975" x2="61.299" y1="3.9232" y2="158.04" gradientTransform="translate(-2.832e-5)" gradientUnits="userSpaceOnUse">
19
+ <stop stop-color="#FFEA83" offset="0"/>
20
+ <stop stop-color="#FFDD35" offset=".083333"/>
21
+ <stop stop-color="#FFA800" offset="1"/>
22
+ </linearGradient>
23
+ <linearGradient id="paint0_linear-6" x1="-1.4492" x2="116.62" y1="-5.8123" y2="137.08" gradientTransform="translate(-2.832e-5)" gradientUnits="userSpaceOnUse">
24
+ <stop stop-color="#41D1FF" offset="0"/>
25
+ <stop stop-color="#BD34FE" offset="1"/>
26
+ </linearGradient>
27
+ </defs>
28
+ <circle cx="87.5" cy="87.5" r="87.5" fill="#c4c4c4"/>
29
+ <circle cx="87.5" cy="87.5" r="87.5" fill="url(#paint0_linear-6)"/>
30
+ <g transform="translate(632.92 54.355)" fill="#d38787" stroke-width="1.0614">
31
+ <path d="m-549.75 68.457c-5.7533-3.1217-6.1166-5.2295-6.1166-35.489 0-30.458 0.35464-32.448 6.3339-35.54 3.9943-2.0655 24.279-2.2805 26.735-0.28333 0.89718 0.72974 6.7203 6.6637 12.94 13.187l11.309 11.86v19.575c0 18.473-0.12956 19.74-2.3011 22.5-4.0223 5.1136-7.558 5.8565-27.65 5.8099-14.15-0.03287-19.008-0.40294-21.25-1.6191zm42.473-6.3594c2.27-1.59 2.359-2.2909 2.359-18.575v-16.923h-6.9521c-12.443 0-16.4-4.0845-16.4-16.93v-7.4828h-8.9464c-6.7178 0-9.3619 0.41549-10.614 1.668-2.5031 2.5031-2.5031 55.724 0 58.228 2.4502 2.4502 37.058 2.4636 40.553 0.01609zm-1.8867-42.165c0-0.16422-2.8659-3.1346-6.3686-6.6008l-6.3686-6.3022v4.9328c0 6.3185 1.8955 8.2687 8.0366 8.2687 2.5854 0 4.7007-0.13434 4.7007-0.29859zm-57.57 44.279c-5.6185-3.0486-6.1166-5.593-6.1166-31.243 0-18.891 0.31331-24.063 1.6101-26.571 1.809-3.4981 6.5048-6.3339 10.489-6.3339 2.4847 0 2.5814 0.19984 1.541 3.1843-0.61054 1.7514-1.7457 3.1843-2.5226 3.1843-0.77686 0-2.1631 0.75059-3.0805 1.668-2.4923 2.4923-2.4923 47.244 0 49.736 0.91739 0.9174 2.3036 1.668 3.0805 1.668 0.77688 0 1.912 1.4329 2.5226 3.1843 1.0562 3.0298 0.97108 3.1822-1.7537 3.1418-1.575-0.02331-4.1713-0.75194-5.7694-1.6191zm-16.983-4.2458c-5.4392-2.9512-6.1166-5.9415-6.1166-26.997 0-15.096 0.345-19.878 1.6101-22.325 1.7476-3.3796 6.4758-6.3339 10.137-6.3339 1.8666 0 2.1789 0.44955 1.6594 2.3882-0.35184 1.3135-0.64655 2.7465-0.65453 3.1843-8e-3 0.43784-0.69682 0.79608-1.5308 0.79608-0.83399 0-2.2669 0.75059-3.1843 1.668-2.4767 2.4767-2.4767 38.768 0 41.244 0.91741 0.91739 2.2946 1.668 3.0605 1.668 1.196 0 2.6402 2.995 2.6871 5.5726 0.0241 1.3294-4.5804 0.80962-7.6676-0.8655z" style="mix-blend-mode:lighten"/>
32
+ <path d="m-552.2 68.911c-5.7533-3.1217-6.1166-5.2295-6.1166-35.489 0-30.458 0.35463-32.448 6.3339-35.54 3.9943-2.0655 24.279-2.2805 26.735-0.28333 0.89718 0.72974 6.7203 6.6637 12.94 13.187l11.309 11.86v19.575c0 18.473-0.12957 19.74-2.3011 22.5-4.0223 5.1136-7.558 5.8565-27.65 5.8099-14.15-0.03287-19.008-0.40294-21.25-1.6191zm42.473-6.3594c2.27-1.59 2.359-2.2909 2.359-18.575v-16.923h-6.952c-12.443 0-16.4-4.0845-16.4-16.93v-7.4828h-8.9464c-6.7179 0-9.3619 0.41549-10.614 1.668-2.5031 2.5031-2.5031 55.724 0 58.228 2.4502 2.4502 37.058 2.4636 40.553 0.01609zm-1.8867-42.165c0-0.16422-2.8659-3.1346-6.3686-6.6008l-6.3686-6.3022v4.9328c0 6.3185 1.8955 8.2688 8.0366 8.2688 2.5854 0 4.7007-0.13434 4.7007-0.29859zm-57.57 44.279c-5.6185-3.0486-6.1166-5.593-6.1166-31.243 0-18.891 0.31331-24.063 1.6101-26.571 1.809-3.4981 6.5048-6.3339 10.489-6.3339 2.4847 0 2.5814 0.19984 1.541 3.1843-0.61054 1.7514-1.7457 3.1843-2.5226 3.1843-0.77687 0-2.1631 0.75059-3.0805 1.668-2.4923 2.4923-2.4923 47.244 0 49.736 0.91741 0.91739 2.3036 1.668 3.0805 1.668 0.77686 0 1.912 1.4329 2.5226 3.1843 1.0562 3.0298 0.97107 3.1822-1.7537 3.1418-1.575-0.02331-4.1713-0.75194-5.7694-1.6191zm-16.983-4.2458c-5.4392-2.9512-6.1166-5.9415-6.1166-26.997 0-15.096 0.34502-19.878 1.6101-22.325 1.7476-3.3796 6.4758-6.3339 10.137-6.3339 1.8666 0 2.1789 0.44955 1.6594 2.3882-0.35182 1.3135-0.64653 2.7465-0.65452 3.1843-8e-3 0.43784-0.69683 0.79608-1.5308 0.79608-0.83397 0-2.2669 0.75059-3.1843 1.668-2.4767 2.4767-2.4767 38.768 0 41.245 0.9174 0.91739 2.2946 1.668 3.0605 1.668 1.196 0 2.6402 2.995 2.6871 5.5726 0.0241 1.3294-4.5804 0.80962-7.6676-0.8655z" fill-opacity=".47466" style="mix-blend-mode:lighten"/>
33
+ </g>
34
+ <path d="m128.48 88.913-24.027 4.6784c-0.39475 0.07685-0.68766 0.40944-0.71076 0.80849l-1.4782 24.805c-0.0347 0.58371 0.50497 1.0372 1.0792 0.90602l6.6886-1.5338c0.62676-0.14383 1.1916 0.40419 1.0635 1.0299l-1.9874 9.6702c-0.13438 0.65091 0.48084 1.2073 1.1202 1.0142l4.1322-1.2472c0.64041-0.19317 1.2556 0.36535 1.1202 1.0162l-3.158 15.191c-0.19842 0.95011 1.074 1.4677 1.6042 0.653l0.35485-0.54382 19.578-38.827c0.32755-0.64985-0.23727-1.391-0.95641-1.2535l-6.8849 1.3207c-0.6467 0.12389-1.1979-0.47453-1.0152-1.1034l4.4944-15.482c0.18266-0.63012-0.36955-1.2295-1.0173-1.1034z" fill="url(#linearGradient880)" stroke-width="1.0498"/>
35
+ <rect x="3" y="3" width="169" height="169" rx="84.5" stroke="url(#paint2_linear)" stroke-width="6" style="mix-blend-mode:soft-light"/>
36
+ </svg>
@@ -0,0 +1,38 @@
1
+ export type { PageContextServer }
2
+ export type { PageContextClient }
3
+ export type { PageContext }
4
+ export type { PageProps }
5
+ export type { Component }
6
+
7
+ import type {
8
+ PageContextBuiltInServer,
9
+ /*
10
+ // When using Client Routing https://vike.dev/clientRouting
11
+ PageContextBuiltInClientWithClientRouting as PageContextBuiltInClient
12
+ /*/
13
+ // When using Server Routing
14
+ PageContextBuiltInClientWithServerRouting as PageContextBuiltInClient
15
+ //*/
16
+ } from 'vike/types'
17
+ import type { ComponentPublicInstance } from 'vue'
18
+
19
+ type Component = ComponentPublicInstance // https://stackoverflow.com/questions/63985658/how-to-type-vue-instance-out-of-definecomponent-in-vue-3/63986086#63986086
20
+ type Page = Component
21
+ type PageProps = {}
22
+
23
+ export type PageContextCustom = {
24
+ Page: Page
25
+ pageProps?: PageProps
26
+ urlPathname: string
27
+ exports: {
28
+ documentProps?: {
29
+ title?: string
30
+ description?: string
31
+ }
32
+ }
33
+ }
34
+
35
+ type PageContextServer = PageContextBuiltInServer<Page> & PageContextCustom
36
+ type PageContextClient = PageContextBuiltInClient<Page> & PageContextCustom
37
+
38
+ type PageContext = PageContextClient | PageContextServer
@@ -0,0 +1,21 @@
1
+ // `usePageContext` allows us to access `pageContext` in any Vue component.
2
+ // See https://vike.dev/pageContext-anywhere
3
+
4
+ import { inject } from 'vue'
5
+ import type { App, InjectionKey } from 'vue'
6
+ import { PageContext } from './types'
7
+
8
+ export { usePageContext }
9
+ export { setPageContext }
10
+
11
+ const key: InjectionKey<PageContext> = Symbol()
12
+
13
+ function usePageContext() {
14
+ const pageContext = inject(key)
15
+ if (!pageContext) throw new Error('setPageContext() not called in parent')
16
+ return pageContext
17
+ }
18
+
19
+ function setPageContext(app: App, pageContext: PageContext) {
20
+ app.provide(key, pageContext)
21
+ }
@@ -0,0 +1,74 @@
1
+ // This file isn't processed by Vite, see https://github.com/vikejs/vike/issues/562
2
+ // Consequently:
3
+ // - When changing this file, you needed to manually restart your server for your changes to take effect.
4
+ // - To use your environment variables defined in your .env files, you need to install dotenv, see https://vike.dev/env
5
+ // - To use your path aliases defined in your vite.config.js, you need to tell Node.js about them, see https://vike.dev/path-aliases
6
+
7
+ // If you want Vite to process your server code then use one of these:
8
+ // - vavite (https://github.com/cyco130/vavite)
9
+ // - See vavite + Vike examples at https://github.com/cyco130/vavite/tree/main/examples
10
+ // - vite-node (https://github.com/antfu/vite-node)
11
+ // - HatTip (https://github.com/hattipjs/hattip)
12
+ // - You can use Bati (https://batijs.github.io/) to scaffold a vike + HatTip app. Note that Bati generates apps that use the V1 design (https://vike.dev/migration/v1-design) and Vike packages (https://vike.dev/vike-packages)
13
+
14
+ import express from 'express'
15
+ import compression from 'compression'
16
+ import { renderPage } from 'vike/server'
17
+ import { root } from './root.js'
18
+ const isProduction = process.env.NODE_ENV === 'production'
19
+
20
+ startServer()
21
+
22
+ async function startServer() {
23
+ const app = express()
24
+
25
+ app.use(compression())
26
+
27
+ // Vite integration
28
+ if (isProduction) {
29
+ // In production, we need to serve our static assets ourselves.
30
+ // (In dev, Vite's middleware serves our static assets.)
31
+ const sirv = (await import('sirv')).default
32
+ app.use(sirv(`${root}/dist/client`))
33
+ } else {
34
+ // We instantiate Vite's development server and integrate its middleware to our server.
35
+ // ⚠️ We instantiate it only in development. (It isn't needed in production and it
36
+ // would unnecessarily bloat our production server.)
37
+ const vite = await import('vite')
38
+ const viteDevMiddleware = (
39
+ await vite.createServer({
40
+ root,
41
+ server: { middlewareMode: true }
42
+ })
43
+ ).middlewares
44
+ app.use(viteDevMiddleware)
45
+ }
46
+
47
+ // ...
48
+ // Other middlewares (e.g. some RPC middleware such as Telefunc)
49
+ // ...
50
+
51
+ // Vike middleware. It should always be our last middleware (because it's a
52
+ // catch-all middleware superseding any middleware placed after it).
53
+ app.get('*', async (req, res, next) => {
54
+ const pageContextInit = {
55
+ urlOriginal: req.originalUrl
56
+ }
57
+ const pageContext = await renderPage(pageContextInit)
58
+ const { httpResponse } = pageContext
59
+ if (!httpResponse) {
60
+ return next()
61
+ } else {
62
+ const { body, statusCode, headers, earlyHints } = httpResponse
63
+ if (res.writeEarlyHints) res.writeEarlyHints({ link: earlyHints.map((e) => e.earlyHintLink) })
64
+ headers.forEach(([name, value]) => res.setHeader(name, value))
65
+ res.status(statusCode)
66
+ // For HTTP streams use httpResponse.pipe() instead, see https://vike.dev/stream
67
+ res.send(body)
68
+ }
69
+ })
70
+
71
+ const port = process.env.PORT || 3000
72
+ app.listen(port)
73
+ console.log(`Server running at http://localhost:${port}`)
74
+ }