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,19 @@
1
+ module.exports = {
2
+ rules: {
3
+ 'react-refresh/only-export-components': 'warn'
4
+ },
5
+ reportUnusedDisableDirectives: true,
6
+ ignorePatterns: ['dist/*'],
7
+ env: { browser: true, es2020: true, node: true },
8
+ parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
9
+ settings: { react: { version: 'detect' } },
10
+ plugins: ['react-refresh'],
11
+ extends: [
12
+ 'eslint:recommended',
13
+ 'plugin:react/recommended',
14
+ 'plugin:react/jsx-runtime',
15
+ 'plugin:react-hooks/recommended',
16
+ 'plugin:@typescript-eslint/recommended'
17
+ ],
18
+ parser: '@typescript-eslint/parser'
19
+ }
@@ -0,0 +1,2 @@
1
+ import { testRun } from '../.testRun'
2
+ testRun('npm run dev', { uiFramewok: 'react', lang: 'ts' })
@@ -0,0 +1,2 @@
1
+ import { testRun } from '../.testRun'
2
+ testRun('npm run prod', { uiFramewok: 'react', lang: 'ts' })
@@ -0,0 +1 @@
1
+ { "name": "Boilerplates" }
@@ -0,0 +1,2 @@
1
+ node_modules/
2
+ dist/
@@ -0,0 +1,36 @@
1
+ {
2
+ "scripts": {
3
+ "dev": "npm run server:dev",
4
+ "prod": "npm run lint && 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
+ "lint": "eslint . --max-warnings 0"
10
+ },
11
+ "dependencies": {
12
+ "@types/compression": "^1.7.2",
13
+ "@types/express": "^4.17.17",
14
+ "@types/node": "^20.4.10",
15
+ "@types/react": "^18.2.20",
16
+ "@types/react-dom": "^18.2.7",
17
+ "@typescript-eslint/eslint-plugin": "^6.3.0",
18
+ "@typescript-eslint/parser": "^6.3.0",
19
+ "@vitejs/plugin-react": "^4.0.4",
20
+ "compression": "^1.7.4",
21
+ "cross-env": "^7.0.3",
22
+ "eslint": "^8.47.0",
23
+ "eslint-plugin-react": "^7.33.1",
24
+ "eslint-plugin-react-hooks": "^4.6.0",
25
+ "eslint-plugin-react-refresh": "^0.4.3",
26
+ "express": "^4.18.2",
27
+ "react": "^18.2.0",
28
+ "react-dom": "^18.2.0",
29
+ "sirv": "^2.0.3",
30
+ "ts-node": "^10.9.1",
31
+ "typescript": "^5.1.6",
32
+ "vite": "^4.4.9",
33
+ "vike": "^0.4.142"
34
+ },
35
+ "type": "module"
36
+ }
@@ -0,0 +1,6 @@
1
+ code {
2
+ font-family: monospace;
3
+ background-color: #eaeaea;
4
+ padding: 3px 5px;
5
+ border-radius: 4px;
6
+ }
@@ -0,0 +1,14 @@
1
+ import './code.css'
2
+
3
+ export { Page }
4
+
5
+ function Page() {
6
+ return (
7
+ <>
8
+ <h1>About</h1>
9
+ <p>
10
+ Example of using Vike.
11
+ </p>
12
+ </>
13
+ )
14
+ }
@@ -1,12 +1,12 @@
1
- import React, { useState } from "react";
1
+ import { useState } from 'react'
2
2
 
3
- export { Counter };
3
+ export { Counter }
4
4
 
5
5
  function Counter() {
6
- const [count, setCount] = useState(0);
6
+ const [count, setCount] = useState(0)
7
7
  return (
8
8
  <button type="button" onClick={() => setCount((count) => count + 1)}>
9
9
  Counter {count}
10
10
  </button>
11
- );
11
+ )
12
12
  }
@@ -1,7 +1,6 @@
1
- import React from "react";
2
- import { Counter } from "./Counter";
1
+ import { Counter } from './Counter'
3
2
 
4
- export { Page };
3
+ export { Page }
5
4
 
6
5
  function Page() {
7
6
  return (
@@ -15,5 +14,5 @@ function Page() {
15
14
  </li>
16
15
  </ul>
17
16
  </>
18
- );
17
+ )
19
18
  }
@@ -0,0 +1,9 @@
1
+ import { usePageContext } from './usePageContext'
2
+
3
+ export { Link }
4
+
5
+ function Link(props: { href?: string; className?: string; children: React.ReactNode }) {
6
+ const pageContext = usePageContext()
7
+ const className = [props.className, pageContext.urlPathname === props.href && 'is-active'].filter(Boolean).join(' ')
8
+ return <a {...props} className={className} />
9
+ }
@@ -1,19 +1,13 @@
1
- import React from "react";
2
- import logo from "./logo.svg";
3
- import { PageContextProvider } from "./usePageContext";
4
- import "./PageWrapper.css";
5
- import { Link } from "./Link";
6
- import type { PageContext } from "./types";
1
+ import React from 'react'
2
+ import logo from './logo.svg'
3
+ import { PageContextProvider } from './usePageContext'
4
+ import type { PageContext } from './types'
5
+ import './PageShell.css'
6
+ import { Link } from './Link'
7
7
 
8
- export { PageWrapper };
8
+ export { PageShell }
9
9
 
10
- function PageWrapper({
11
- children,
12
- pageContext,
13
- }: {
14
- children: React.ReactNode;
15
- pageContext: PageContext;
16
- }) {
10
+ function PageShell({ children, pageContext }: { children: React.ReactNode; pageContext: PageContext }) {
17
11
  return (
18
12
  <React.StrictMode>
19
13
  <PageContextProvider pageContext={pageContext}>
@@ -31,21 +25,21 @@ function PageWrapper({
31
25
  </Layout>
32
26
  </PageContextProvider>
33
27
  </React.StrictMode>
34
- );
28
+ )
35
29
  }
36
30
 
37
31
  function Layout({ children }: { children: React.ReactNode }) {
38
32
  return (
39
33
  <div
40
34
  style={{
41
- display: "flex",
35
+ display: 'flex',
42
36
  maxWidth: 900,
43
- margin: "auto",
37
+ margin: 'auto'
44
38
  }}
45
39
  >
46
40
  {children}
47
41
  </div>
48
- );
42
+ )
49
43
  }
50
44
 
51
45
  function Sidebar({ children }: { children: React.ReactNode }) {
@@ -54,15 +48,15 @@ function Sidebar({ children }: { children: React.ReactNode }) {
54
48
  style={{
55
49
  padding: 20,
56
50
  flexShrink: 0,
57
- display: "flex",
58
- flexDirection: "column",
59
- alignItems: "center",
60
- lineHeight: "1.8em",
51
+ display: 'flex',
52
+ flexDirection: 'column',
53
+ alignItems: 'center',
54
+ lineHeight: '1.8em'
61
55
  }}
62
56
  >
63
57
  {children}
64
58
  </div>
65
- );
59
+ )
66
60
  }
67
61
 
68
62
  function Content({ children }: { children: React.ReactNode }) {
@@ -71,13 +65,13 @@ function Content({ children }: { children: React.ReactNode }) {
71
65
  style={{
72
66
  padding: 20,
73
67
  paddingBottom: 50,
74
- borderLeft: "2px solid #eee",
75
- minHeight: "100vh",
68
+ borderLeft: '2px solid #eee',
69
+ minHeight: '100vh'
76
70
  }}
77
71
  >
78
72
  {children}
79
73
  </div>
80
- );
74
+ )
81
75
  }
82
76
 
83
77
  function Logo() {
@@ -85,12 +79,12 @@ function Logo() {
85
79
  <div
86
80
  style={{
87
81
  marginTop: 20,
88
- marginBottom: 10,
82
+ marginBottom: 10
89
83
  }}
90
84
  >
91
85
  <a href="/">
92
86
  <img src={logo} height={64} width={64} alt="logo" />
93
87
  </a>
94
88
  </div>
95
- );
89
+ )
96
90
  }
@@ -0,0 +1,23 @@
1
+ export { render }
2
+
3
+ import { hydrateRoot } from 'react-dom/client'
4
+ import { PageShell } from './PageShell'
5
+ import type { PageContextClient } from './types'
6
+
7
+ // This render() hook only supports SSR, see https://vike.dev/render-modes for how to modify render() to support SPA
8
+ async function render(pageContext: PageContextClient) {
9
+ const { Page, pageProps } = pageContext
10
+ if (!Page) throw new Error('Client-side render() hook expects pageContext.Page to be defined')
11
+ const root = document.getElementById('react-root')
12
+ if (!root) throw new Error('DOM element #react-root not found')
13
+ hydrateRoot(
14
+ root,
15
+ <PageShell pageContext={pageContext}>
16
+ <Page {...pageProps} />
17
+ </PageShell>
18
+ )
19
+ }
20
+
21
+ /* To enable Client-side Routing:
22
+ export const clientRouting = true
23
+ // !! WARNING !! Before doing so, read https://vike.dev/clientRouting */
@@ -0,0 +1,46 @@
1
+ export { render }
2
+ // See https://vike.dev/data-fetching
3
+ export const passToClient = ['pageProps', 'urlPathname']
4
+
5
+ import ReactDOMServer from 'react-dom/server'
6
+ import { PageShell } from './PageShell'
7
+ import { escapeInject, dangerouslySkipEscape } from 'vike/server'
8
+ import logoUrl from './logo.svg'
9
+ import type { PageContextServer } from './types'
10
+
11
+ async function render(pageContext: PageContextServer) {
12
+ const { Page, pageProps } = pageContext
13
+ // This render() hook only supports SSR, see https://vike.dev/render-modes for how to modify render() to support SPA
14
+ if (!Page) throw new Error('My render() hook expects pageContext.Page to be defined')
15
+ const pageHtml = ReactDOMServer.renderToString(
16
+ <PageShell pageContext={pageContext}>
17
+ <Page {...pageProps} />
18
+ </PageShell>
19
+ )
20
+
21
+ // See https://vike.dev/head
22
+ const { documentProps } = pageContext.exports
23
+ const title = (documentProps && documentProps.title) || 'Vite SSR app'
24
+ const desc = (documentProps && documentProps.description) || 'App using Vite + Vike'
25
+
26
+ const documentHtml = escapeInject`<!DOCTYPE html>
27
+ <html lang="en">
28
+ <head>
29
+ <meta charset="UTF-8" />
30
+ <link rel="icon" href="${logoUrl}" />
31
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
32
+ <meta name="description" content="${desc}" />
33
+ <title>${title}</title>
34
+ </head>
35
+ <body>
36
+ <div id="react-root">${dangerouslySkipEscape(pageHtml)}</div>
37
+ </body>
38
+ </html>`
39
+
40
+ return {
41
+ documentHtml,
42
+ pageContext: {
43
+ // We can add some `pageContext` here, which is useful if we want to do page redirection https://vike.dev/page-redirection
44
+ }
45
+ }
46
+ }
@@ -1,6 +1,4 @@
1
- import React from "react";
2
-
3
- export { Page };
1
+ export { Page }
4
2
 
5
3
  function Page({ is404 }: { is404: boolean }) {
6
4
  if (is404) {
@@ -9,13 +7,13 @@ function Page({ is404 }: { is404: boolean }) {
9
7
  <h1>404 Page Not Found</h1>
10
8
  <p>This page could not be found.</p>
11
9
  </>
12
- );
10
+ )
13
11
  } else {
14
12
  return (
15
13
  <>
16
- <h1>500 Internal Server Error</h1>
14
+ <h1>500 Internal Error</h1>
17
15
  <p>Something went wrong.</p>
18
16
  </>
19
- );
17
+ )
20
18
  }
21
19
  }
@@ -0,0 +1,35 @@
1
+ export type { PageContextServer }
2
+ export type { PageContextClient }
3
+ export type { PageContext }
4
+ export type { PageProps }
5
+
6
+ import type {
7
+ PageContextBuiltInServer,
8
+ /*
9
+ // When using Client Routing https://vike.dev/clientRouting
10
+ PageContextBuiltInClientWithClientRouting as PageContextBuiltInClient
11
+ /*/
12
+ // When using Server Routing
13
+ PageContextBuiltInClientWithServerRouting as PageContextBuiltInClient
14
+ //*/
15
+ } from 'vike/types'
16
+
17
+ type Page = (pageProps: PageProps) => React.ReactElement
18
+ type PageProps = Record<string, unknown>
19
+
20
+ export type PageContextCustom = {
21
+ Page: Page
22
+ pageProps?: PageProps
23
+ urlPathname: string
24
+ exports: {
25
+ documentProps?: {
26
+ title?: string
27
+ description?: string
28
+ }
29
+ }
30
+ }
31
+
32
+ type PageContextServer = PageContextBuiltInServer<Page> & PageContextCustom
33
+ type PageContextClient = PageContextBuiltInClient<Page> & PageContextCustom
34
+
35
+ type PageContext = PageContextClient | PageContextServer
@@ -0,0 +1,20 @@
1
+ // `usePageContext` allows us to access `pageContext` in any React component.
2
+ // See https://vike.dev/pageContext-anywhere
3
+
4
+ import React, { useContext } from 'react'
5
+ import type { PageContext } from './types'
6
+
7
+ export { PageContextProvider }
8
+ // eslint-disable-next-line react-refresh/only-export-components
9
+ export { usePageContext }
10
+
11
+ const Context = React.createContext<PageContext>(undefined as unknown as PageContext)
12
+
13
+ function PageContextProvider({ pageContext, children }: { pageContext: PageContext; children: React.ReactNode }) {
14
+ return <Context.Provider value={pageContext}>{children}</Context.Provider>
15
+ }
16
+
17
+ function usePageContext() {
18
+ const pageContext = useContext(Context)
19
+ return pageContext
20
+ }
@@ -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,9 @@
1
+ {
2
+ "extends": "../tsconfig.json",
3
+ // Make IDEs complain about missing file extension .js in import paths.
4
+ // Alternatively, we could always set "module" to "Node16" and add the file extension .js to import paths everywhere.
5
+ "compilerOptions": {
6
+ "module": "Node16",
7
+ "moduleResolution": "Node16"
8
+ }
9
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "strict": true,
4
+ "module": "ES2020",
5
+ "target": "ES2020",
6
+ // Doesn't apply to server/, see ts-node config down below and server/tsconfig.json
7
+ "moduleResolution": "Bundler",
8
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
9
+ "types": ["vite/client"],
10
+ "jsx": "react-jsx",
11
+ "skipLibCheck": true,
12
+ "esModuleInterop": true
13
+ },
14
+ "ts-node": {
15
+ "transpileOnly": true,
16
+ "esm": true,
17
+ "compilerOptions": {
18
+ "module": "Node16",
19
+ "moduleResolution": "Node16"
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,9 @@
1
+ import react from '@vitejs/plugin-react'
2
+ import ssr from 'vike/plugin'
3
+ import { UserConfig } from 'vite'
4
+
5
+ const config: UserConfig = {
6
+ plugins: [react(), ssr()]
7
+ }
8
+
9
+ export default config
@@ -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,22 @@
1
+ {
2
+ "scripts": {
3
+ "dev": "npm run server:dev",
4
+ "prod": "npm run build && npm run server:prod",
5
+ "build": "vite build",
6
+ "server:dev": "node ./server",
7
+ "server:prod": "cross-env NODE_ENV=production node ./server"
8
+ },
9
+ "dependencies": {
10
+ "@vitejs/plugin-vue": "^4.2.3",
11
+ "@vue/compiler-sfc": "^3.3.4",
12
+ "@vue/server-renderer": "^3.3.4",
13
+ "compression": "^1.7.4",
14
+ "cross-env": "^7.0.3",
15
+ "express": "^4.18.2",
16
+ "sirv": "^2.0.3",
17
+ "vite": "^4.4.9",
18
+ "vike": "^0.4.142",
19
+ "vue": "^3.3.4"
20
+ },
21
+ "type": "module"
22
+ }
@@ -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 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 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 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 setup>
15
- import Link from "./Link.vue";
15
+ import Link from './Link.vue'
16
16
  </script>
17
17
 
18
18
  <style>
@@ -0,0 +1,15 @@
1
+ export { render }
2
+
3
+ import { createApp } from './app'
4
+
5
+ // This render() hook only supports SSR, see https://vike.dev/render-modes for how to modify render() to support SPA
6
+ async function render(pageContext) {
7
+ const { Page, pageProps } = pageContext
8
+ if (!Page) throw new Error('Client-side render() hook expects pageContext.Page to be defined')
9
+ const app = createApp(Page, pageProps, pageContext)
10
+ app.mount('#app')
11
+ }
12
+
13
+ /* To enable Client-side Routing:
14
+ export const clientRouting = true
15
+ // !! WARNING !! Before doing so, read https://vike.dev/clientRouting */