create-vike 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -54
- package/readme.md +3 -0
- package/README.md +0 -30
- package/create-vike.js +0 -2
- package/dist/index.js +0 -405
- package/files/js/react/pages/about/index.page.jsx +0 -13
- package/files/js/react/pages/index/Counter.jsx +0 -12
- package/files/js/react/pages/index/index.page.jsx +0 -19
- package/files/js/react/renderer/Link.jsx +0 -15
- package/files/js/react/renderer/PageWrapper.jsx +0 -89
- package/files/js/react/renderer/_default.page.client.jsx +0 -19
- package/files/js/react/renderer/_default.page.server.jsx +0 -47
- package/files/js/react/renderer/_error.page.jsx +0 -21
- package/files/js/react/renderer/usePageContext.jsx +0 -18
- package/files/js/react+client-router/renderer/_default.page.client.jsx +0 -43
- package/files/js/react+client-router/renderer/types.js +0 -1
- package/files/js/vike/server/index.js +0 -40
- package/files/js/vue/pages/about/index.page.vue +0 -11
- package/files/js/vue/pages/index/Counter.vue +0 -10
- package/files/js/vue/pages/index/index.page.vue +0 -12
- package/files/js/vue/renderer/Link.vue +0 -17
- package/files/js/vue/renderer/PageWrapper.vue +0 -55
- package/files/js/vue/renderer/_default.page.client.js +0 -12
- package/files/js/vue/renderer/_default.page.server.js +0 -41
- package/files/js/vue/renderer/_error.page.vue +0 -14
- package/files/js/vue/renderer/app.js +0 -29
- package/files/js/vue/renderer/usePageContext.js +0 -18
- package/files/js/vue+client-router/renderer/_default.page.client.js +0 -23
- package/files/js/vue+client-router/renderer/app.js +0 -36
- package/files/js/vue+client-router/renderer/types.js +0 -1
- package/files/shared/.prettierrc +0 -1
- package/files/shared/react/pages/about/index.css +0 -4
- package/files/shared/react/renderer/PageWrapper.css +0 -19
- package/files/shared/vike/_gitignore +0 -121
- package/files/shared/vike/renderer/logo.svg +0 -36
- package/files/ts/react/pages/about/index.page.tsx +0 -13
- package/files/ts/react/pages/index/Counter.tsx +0 -12
- package/files/ts/react/pages/index/index.page.tsx +0 -19
- package/files/ts/react/renderer/Link.tsx +0 -19
- package/files/ts/react/renderer/PageWrapper.tsx +0 -96
- package/files/ts/react/renderer/_default.page.client.tsx +0 -21
- package/files/ts/react/renderer/_default.page.server.tsx +0 -49
- package/files/ts/react/renderer/_error.page.tsx +0 -21
- package/files/ts/react/renderer/types.ts +0 -11
- package/files/ts/react/renderer/usePageContext.tsx +0 -25
- package/files/ts/react+client-router/renderer/_default.page.client.tsx +0 -44
- package/files/ts/react+client-router/renderer/types.ts +0 -12
- package/files/ts/vike/server/index.ts +0 -40
- package/files/ts/vue/pages/about/index.page.vue +0 -11
- package/files/ts/vue/pages/index/Counter.vue +0 -10
- package/files/ts/vue/pages/index/index.page.vue +0 -12
- package/files/ts/vue/renderer/Link.vue +0 -17
- package/files/ts/vue/renderer/PageWrapper.vue +0 -55
- package/files/ts/vue/renderer/_default.page.client.ts +0 -14
- package/files/ts/vue/renderer/_default.page.server.ts +0 -43
- package/files/ts/vue/renderer/_error.page.vue +0 -14
- package/files/ts/vue/renderer/app.ts +0 -30
- package/files/ts/vue/renderer/types.ts +0 -10
- package/files/ts/vue/renderer/usePageContext.ts +0 -20
- package/files/ts/vue/vue.d.ts +0 -4
- package/files/ts/vue+client-router/renderer/_default.page.client.ts +0 -24
- package/files/ts/vue+client-router/renderer/app.ts +0 -37
- package/files/ts/vue+client-router/renderer/types.ts +0 -11
package/package.json
CHANGED
|
@@ -1,56 +1,4 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-vike",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"bin": "create-vike.js",
|
|
7
|
-
"files": [
|
|
8
|
-
"dist/**/*",
|
|
9
|
-
"files/**/*"
|
|
10
|
-
],
|
|
11
|
-
"dependencies": {
|
|
12
|
-
"commander": "^8.3.0",
|
|
13
|
-
"prettier": "^2.4.1",
|
|
14
|
-
"walk": "^2.3.15"
|
|
15
|
-
},
|
|
16
|
-
"devDependencies": {
|
|
17
|
-
"@types/jest": "^27.0.2",
|
|
18
|
-
"@types/rimraf": "^3.0.2",
|
|
19
|
-
"@types/walk": "^2.3.1",
|
|
20
|
-
"@typescript-eslint/eslint-plugin": "^5.3.1",
|
|
21
|
-
"@typescript-eslint/parser": "^5.3.1",
|
|
22
|
-
"chalk": "^4.1.2",
|
|
23
|
-
"detype": "^0.4.1",
|
|
24
|
-
"esbuild": "^0.13.13",
|
|
25
|
-
"esbuild-jest": "^0.5.0",
|
|
26
|
-
"esbuild-node-externals": "^1.3.0",
|
|
27
|
-
"eslint": "^8.2.0",
|
|
28
|
-
"eslint-config-prettier": "^8.3.0",
|
|
29
|
-
"eslint-import-resolver-typescript": "^2.5.0",
|
|
30
|
-
"eslint-plugin-import": "^2.25.2",
|
|
31
|
-
"eslint-plugin-no-only-tests": "^2.6.0",
|
|
32
|
-
"eslint-plugin-only-warn": "^1.0.3",
|
|
33
|
-
"eslint-plugin-ssr-friendly": "^1.0.5",
|
|
34
|
-
"fast-glob": "^3.2.7",
|
|
35
|
-
"jest": "^27.3.1",
|
|
36
|
-
"npm-run-all": "^4.1.5",
|
|
37
|
-
"rimraf": "^3.0.2",
|
|
38
|
-
"semver": "^7.3.5",
|
|
39
|
-
"typescript": "^4.4.4"
|
|
40
|
-
},
|
|
41
|
-
"repository": {
|
|
42
|
-
"type": "git",
|
|
43
|
-
"url": "git+https://github.com/cyco130/create-.git"
|
|
44
|
-
},
|
|
45
|
-
"author": "Fatih Aygün <cyco130@gmail.com>",
|
|
46
|
-
"license": "MIT",
|
|
47
|
-
"scripts": {
|
|
48
|
-
"build": "node build.mjs",
|
|
49
|
-
"generate-files": "./generate-files",
|
|
50
|
-
"test": "run-p 'test:*'",
|
|
51
|
-
"test:unit": "jest --passWithNoTests",
|
|
52
|
-
"test:typecheck": "tsc -p tsconfig.json --noEmit",
|
|
53
|
-
"test:lint": "eslint src --max-warnings 0",
|
|
54
|
-
"format": "prettier . --write"
|
|
55
|
-
}
|
|
56
|
-
}
|
|
3
|
+
"version": "0.0.5"
|
|
4
|
+
}
|
package/readme.md
ADDED
package/README.md
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# Vike Project Generator
|
|
2
|
-
|
|
3
|
-
Generates Vike application boilerplate
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
```
|
|
7
|
-
create-vike [options] <output-dir>
|
|
8
|
-
|
|
9
|
-
Arguments:
|
|
10
|
-
output-dir Output directory
|
|
11
|
-
|
|
12
|
-
Options:
|
|
13
|
-
-V, --version output the version number
|
|
14
|
-
-f, --framework <framework> Frontend framework (choices: "react", "vue")
|
|
15
|
-
-l, --language <language> Programming language (choices: "js", "ts")
|
|
16
|
-
-h, --help display help for command
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## How it works
|
|
20
|
-
- Generates TypeScript and JavaScript files from the templates in `input-files` via `detype`.
|
|
21
|
-
- Copies files from `files/<language>/<feature>` where:
|
|
22
|
-
- `<language>` is `shared`, `ts`, or `js`
|
|
23
|
-
- `<feature>` is any combination of `vike` (default), `react`, `vue`, and `client-router` combined with a plus sign
|
|
24
|
-
- Configuration files (`package.json`, `tsconfig.json`, and `vite.config.{js,ts}`) are generated programmatically.
|
|
25
|
-
- Boilerplate package versions are kept in `src/config-generators/package-versions.json`, `check-deps.mjs` can be used to review package updates.
|
|
26
|
-
|
|
27
|
-
## TODO
|
|
28
|
-
- Add integration tests
|
|
29
|
-
- Create an interactive frontend
|
|
30
|
-
- Resolve user's default prettier config if any and use it instead of the default
|
package/create-vike.js
DELETED
package/dist/index.js
DELETED
|
@@ -1,405 +0,0 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __defProps = Object.defineProperties;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
9
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
11
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
-
var __spreadValues = (a, b) => {
|
|
13
|
-
for (var prop in b || (b = {}))
|
|
14
|
-
if (__hasOwnProp.call(b, prop))
|
|
15
|
-
__defNormalProp(a, prop, b[prop]);
|
|
16
|
-
if (__getOwnPropSymbols)
|
|
17
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
18
|
-
if (__propIsEnum.call(b, prop))
|
|
19
|
-
__defNormalProp(a, prop, b[prop]);
|
|
20
|
-
}
|
|
21
|
-
return a;
|
|
22
|
-
};
|
|
23
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
24
|
-
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
|
25
|
-
var __reExport = (target, module2, desc) => {
|
|
26
|
-
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
27
|
-
for (let key of __getOwnPropNames(module2))
|
|
28
|
-
if (!__hasOwnProp.call(target, key) && key !== "default")
|
|
29
|
-
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
|
30
|
-
}
|
|
31
|
-
return target;
|
|
32
|
-
};
|
|
33
|
-
var __toModule = (module2) => {
|
|
34
|
-
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
// src/index.ts
|
|
38
|
-
var import_commander = __toModule(require("commander"));
|
|
39
|
-
|
|
40
|
-
// src/generate.ts
|
|
41
|
-
var import_path = __toModule(require("path"));
|
|
42
|
-
var import_promises = __toModule(require("fs/promises"));
|
|
43
|
-
var import_prettier = __toModule(require("prettier"));
|
|
44
|
-
|
|
45
|
-
// src/config-generators/package-versions.json
|
|
46
|
-
var _types_express = "4.17.13";
|
|
47
|
-
var _types_node = "16.11.7";
|
|
48
|
-
var _types_react_dom = "17.0.11";
|
|
49
|
-
var _types_react = "17.0.34";
|
|
50
|
-
var _vitejs_plugin_react_refresh = "1.3.6";
|
|
51
|
-
var _vitejs_plugin_vue = "1.9.4";
|
|
52
|
-
var _vue_compiler_sfc = "3.2.21";
|
|
53
|
-
var _vue_server_renderer = "3.2.21";
|
|
54
|
-
var cross_env = "7.0.3";
|
|
55
|
-
var express = "4.17.1";
|
|
56
|
-
var react_dom = "17.0.2";
|
|
57
|
-
var react = "17.0.2";
|
|
58
|
-
var ts_node = "10.4.0";
|
|
59
|
-
var typescript = "4.4.4";
|
|
60
|
-
var vite_plugin_ssr = "0.3.27";
|
|
61
|
-
var vite = "2.6.14";
|
|
62
|
-
var vue = "^3.2.21";
|
|
63
|
-
var package_versions_default = {
|
|
64
|
-
"@types/express": _types_express,
|
|
65
|
-
"@types/node": _types_node,
|
|
66
|
-
"@types/react-dom": _types_react_dom,
|
|
67
|
-
"@types/react": _types_react,
|
|
68
|
-
"@vitejs/plugin-react-refresh": _vitejs_plugin_react_refresh,
|
|
69
|
-
"@vitejs/plugin-vue": _vitejs_plugin_vue,
|
|
70
|
-
"@vue/compiler-sfc": _vue_compiler_sfc,
|
|
71
|
-
"@vue/server-renderer": _vue_server_renderer,
|
|
72
|
-
"cross-env": cross_env,
|
|
73
|
-
express,
|
|
74
|
-
"react-dom": react_dom,
|
|
75
|
-
react,
|
|
76
|
-
"ts-node": ts_node,
|
|
77
|
-
typescript,
|
|
78
|
-
"vite-plugin-ssr": vite_plugin_ssr,
|
|
79
|
-
vite,
|
|
80
|
-
vue
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
// src/config-generators/common.ts
|
|
84
|
-
var ConfigGenerator = class {
|
|
85
|
-
constructor(language) {
|
|
86
|
-
this.language = language;
|
|
87
|
-
}
|
|
88
|
-
generateTsConfig() {
|
|
89
|
-
const config = deepClone(TS_CONFIG);
|
|
90
|
-
this.modifyTsConfig(config);
|
|
91
|
-
return JSON.stringify(config, void 0, 2);
|
|
92
|
-
}
|
|
93
|
-
generatePackageJson() {
|
|
94
|
-
const pkg = deepClone(PACKAGE_JSON);
|
|
95
|
-
if (this.language === "ts") {
|
|
96
|
-
pkg.scripts = __spreadValues(__spreadValues({}, pkg.scripts), TS_PACKAGE_JSON_OVERRIDES.scripts);
|
|
97
|
-
pkg.dependencies = [
|
|
98
|
-
...pkg.dependencies,
|
|
99
|
-
...TS_PACKAGE_JSON_OVERRIDES.dependencies
|
|
100
|
-
];
|
|
101
|
-
}
|
|
102
|
-
this.modifyPackageJson(pkg);
|
|
103
|
-
pkg.dependencies = pkg.dependencies.sort();
|
|
104
|
-
const output = __spreadProps(__spreadValues({}, pkg), {
|
|
105
|
-
dependencies: Object.fromEntries(pkg.dependencies.map((dep) => {
|
|
106
|
-
if (!(dep in package_versions_default)) {
|
|
107
|
-
throw new Error("Unknown package " + dep);
|
|
108
|
-
}
|
|
109
|
-
return [dep, package_versions_default[dep]];
|
|
110
|
-
}))
|
|
111
|
-
});
|
|
112
|
-
return output;
|
|
113
|
-
}
|
|
114
|
-
generateViteConfig() {
|
|
115
|
-
const config = this.getViteConfig();
|
|
116
|
-
let out = `import ${config.frameworkImportName} from ${JSON.stringify(config.frameworkImportPackage)};
|
|
117
|
-
`;
|
|
118
|
-
out += `import ssr from "vite-plugin-ssr/plugin";
|
|
119
|
-
`;
|
|
120
|
-
if (this.language === "ts") {
|
|
121
|
-
out += `import { UserConfig } from "vite";
|
|
122
|
-
`;
|
|
123
|
-
}
|
|
124
|
-
out += "\n";
|
|
125
|
-
if (this.language === "ts") {
|
|
126
|
-
out += `const config: UserConfig = `;
|
|
127
|
-
} else {
|
|
128
|
-
out += `export default `;
|
|
129
|
-
}
|
|
130
|
-
out += `{
|
|
131
|
-
plugins: [${config.frameworkImportName}(), ssr()],
|
|
132
|
-
};
|
|
133
|
-
`;
|
|
134
|
-
if (this.language === "ts") {
|
|
135
|
-
out += `
|
|
136
|
-
export default config;
|
|
137
|
-
`;
|
|
138
|
-
}
|
|
139
|
-
return out;
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
function deepClone(original) {
|
|
143
|
-
return JSON.parse(JSON.stringify(original));
|
|
144
|
-
}
|
|
145
|
-
var TS_CONFIG = {
|
|
146
|
-
compilerOptions: {
|
|
147
|
-
strict: true,
|
|
148
|
-
module: "ES2020",
|
|
149
|
-
moduleResolution: "Node",
|
|
150
|
-
target: "ES2017",
|
|
151
|
-
lib: ["DOM", "DOM.Iterable", "ESNext"],
|
|
152
|
-
types: ["vite/client"],
|
|
153
|
-
jsx: "react",
|
|
154
|
-
skipLibCheck: true,
|
|
155
|
-
esModuleInterop: true
|
|
156
|
-
},
|
|
157
|
-
"ts-node": { transpileOnly: true, compilerOptions: { module: "CommonJS" } }
|
|
158
|
-
};
|
|
159
|
-
var PACKAGE_JSON = {
|
|
160
|
-
scripts: {
|
|
161
|
-
dev: "npm run server",
|
|
162
|
-
prod: "npm run build && npm run server:prod",
|
|
163
|
-
build: "vite build && vite build --ssr",
|
|
164
|
-
server: "node ./server",
|
|
165
|
-
"server:prod": "cross-env NODE_ENV=production node ./server"
|
|
166
|
-
},
|
|
167
|
-
dependencies: ["cross-env", "express", "vite", "vite-plugin-ssr"]
|
|
168
|
-
};
|
|
169
|
-
var TS_PACKAGE_JSON_OVERRIDES = {
|
|
170
|
-
scripts: {
|
|
171
|
-
server: "ts-node ./server",
|
|
172
|
-
"server:prod": "cross-env NODE_ENV=production ts-node ./server"
|
|
173
|
-
},
|
|
174
|
-
dependencies: ["@types/express", "@types/node", "ts-node", "typescript"]
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
// src/config-generators/react.ts
|
|
178
|
-
var ReactConfigGenerator = class extends ConfigGenerator {
|
|
179
|
-
modifyTsConfig() {
|
|
180
|
-
}
|
|
181
|
-
modifyPackageJson(pkg) {
|
|
182
|
-
pkg.dependencies.push(...REACT_DEPENDENCIES);
|
|
183
|
-
if (this.language === "ts") {
|
|
184
|
-
pkg.dependencies.push(...REACT_TS_DEPENDENCIES);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
getViteConfig() {
|
|
188
|
-
return {
|
|
189
|
-
frameworkImportName: "reactRefresh",
|
|
190
|
-
frameworkImportPackage: "@vitejs/plugin-react-refresh"
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
var REACT_DEPENDENCIES = [
|
|
195
|
-
"@vitejs/plugin-react-refresh",
|
|
196
|
-
"react",
|
|
197
|
-
"react-dom"
|
|
198
|
-
];
|
|
199
|
-
var REACT_TS_DEPENDENCIES = ["@types/react", "@types/react-dom"];
|
|
200
|
-
|
|
201
|
-
// src/config-generators/vue.ts
|
|
202
|
-
var VueConfigGenerator = class extends ConfigGenerator {
|
|
203
|
-
modifyTsConfig(config) {
|
|
204
|
-
delete config.compilerOptions.jsx;
|
|
205
|
-
}
|
|
206
|
-
modifyPackageJson(pkg) {
|
|
207
|
-
pkg.dependencies.push(...VUE_DEPENDENCIES);
|
|
208
|
-
}
|
|
209
|
-
getViteConfig() {
|
|
210
|
-
return {
|
|
211
|
-
frameworkImportName: "vue",
|
|
212
|
-
frameworkImportPackage: "@vitejs/plugin-vue"
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
var VUE_DEPENDENCIES = [
|
|
217
|
-
"@vitejs/plugin-vue",
|
|
218
|
-
"@vue/compiler-sfc",
|
|
219
|
-
"@vue/server-renderer",
|
|
220
|
-
"vue"
|
|
221
|
-
];
|
|
222
|
-
|
|
223
|
-
// src/detect-package-manager.ts
|
|
224
|
-
function detectPackageManager() {
|
|
225
|
-
const agent = process.env.npm_config_user_agent;
|
|
226
|
-
if (agent) {
|
|
227
|
-
const [program2] = agent.split("/");
|
|
228
|
-
if (program2 === "yarn")
|
|
229
|
-
return "yarn";
|
|
230
|
-
if (program2 === "pnpm")
|
|
231
|
-
return "pnpm";
|
|
232
|
-
if (program2 === "npm")
|
|
233
|
-
return "npm";
|
|
234
|
-
}
|
|
235
|
-
if (process.platform !== "win32") {
|
|
236
|
-
const parent = process.env._;
|
|
237
|
-
if (parent) {
|
|
238
|
-
if (parent.endsWith("pnpx") || parent.endsWith("pnpm"))
|
|
239
|
-
return "pnpm";
|
|
240
|
-
if (parent.endsWith("yarn"))
|
|
241
|
-
return "yarn";
|
|
242
|
-
if (parent.endsWith("npx") || parent.endsWith("npm"))
|
|
243
|
-
return "npm";
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
return null;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// src/run-command.ts
|
|
250
|
-
var import_child_process = __toModule(require("child_process"));
|
|
251
|
-
async function runCommand(command, ...args) {
|
|
252
|
-
return new Promise((resolve, reject) => {
|
|
253
|
-
const child = (0, import_child_process.spawn)(command, args, { stdio: "inherit" });
|
|
254
|
-
child.on("close", (code) => {
|
|
255
|
-
if (code === 0) {
|
|
256
|
-
resolve();
|
|
257
|
-
} else {
|
|
258
|
-
reject();
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// src/generate.ts
|
|
265
|
-
var import_walk = __toModule(require("walk"));
|
|
266
|
-
var FILES_DIR = import_path.default.resolve(__dirname, "../files");
|
|
267
|
-
async function generate({
|
|
268
|
-
outputDir,
|
|
269
|
-
typescript: typescript2,
|
|
270
|
-
react: react2,
|
|
271
|
-
vue: vue2,
|
|
272
|
-
clientRouter,
|
|
273
|
-
skipDependencies,
|
|
274
|
-
npm,
|
|
275
|
-
yarn,
|
|
276
|
-
pnpm,
|
|
277
|
-
initGitRepo,
|
|
278
|
-
createInitialCommit
|
|
279
|
-
}) {
|
|
280
|
-
let error = false;
|
|
281
|
-
if (Number(npm) + Number(pnpm) + Number(yarn) > 1) {
|
|
282
|
-
process.stderr.write("Only one of npm, pnpm, or yarn can be specified\n");
|
|
283
|
-
error = true;
|
|
284
|
-
}
|
|
285
|
-
let packageManager = npm ? "npm" : pnpm ? "pnpm" : yarn ? "yarn" : void 0;
|
|
286
|
-
if (!packageManager) {
|
|
287
|
-
const detected = detectPackageManager();
|
|
288
|
-
packageManager = detected || "npm";
|
|
289
|
-
}
|
|
290
|
-
if (vue2 && react2) {
|
|
291
|
-
process.stderr.write("Cannot use both react and vue\n");
|
|
292
|
-
error = true;
|
|
293
|
-
} else if (!vue2 && !react2) {
|
|
294
|
-
process.stderr.write("Please specify either --react or --vue\n");
|
|
295
|
-
error = true;
|
|
296
|
-
}
|
|
297
|
-
if (error) {
|
|
298
|
-
process.exit(1);
|
|
299
|
-
}
|
|
300
|
-
const framework = vue2 ? "vue" : "react";
|
|
301
|
-
const features = ["vike", framework];
|
|
302
|
-
if (clientRouter)
|
|
303
|
-
features.push("client-router");
|
|
304
|
-
const language = typescript2 ? "ts" : "js";
|
|
305
|
-
async function findDirs(dir) {
|
|
306
|
-
return (await import_promises.default.readdir(import_path.default.join(FILES_DIR, dir), {
|
|
307
|
-
withFileTypes: true
|
|
308
|
-
})).filter((x) => x.isDirectory()).map((x) => ({
|
|
309
|
-
name: import_path.default.join(dir, x.name),
|
|
310
|
-
features: x.name.split("+")
|
|
311
|
-
})).sort((a, b) => a.features.length - b.features.length);
|
|
312
|
-
}
|
|
313
|
-
const dirs = [...await findDirs("shared"), ...await findDirs(language)].filter((x) => x.features.every((f) => features.includes(f))).map((x) => x.name);
|
|
314
|
-
console.log("Copying files");
|
|
315
|
-
const toBeCopied = {};
|
|
316
|
-
for (const dir of dirs) {
|
|
317
|
-
const files = await getFiles(dir);
|
|
318
|
-
files.forEach((x) => {
|
|
319
|
-
let targetName = x.slice(dir.length + 1);
|
|
320
|
-
if (targetName === "_gitignore")
|
|
321
|
-
targetName = ".gitignore";
|
|
322
|
-
toBeCopied[targetName] = x;
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
for (const [targetName, sourcePath] of Object.entries(toBeCopied)) {
|
|
326
|
-
const targetPath = import_path.default.join(outputDir, targetName);
|
|
327
|
-
const dirName = import_path.default.dirname(targetPath);
|
|
328
|
-
await import_promises.default.mkdir(dirName, { recursive: true });
|
|
329
|
-
await import_promises.default.copyFile(import_path.default.join(FILES_DIR, sourcePath), targetPath);
|
|
330
|
-
}
|
|
331
|
-
const generators = {
|
|
332
|
-
react: ReactConfigGenerator,
|
|
333
|
-
vue: VueConfigGenerator
|
|
334
|
-
};
|
|
335
|
-
console.log("Generating configutation files");
|
|
336
|
-
const generator = new generators[framework](language);
|
|
337
|
-
const prettierConfig = {};
|
|
338
|
-
const packageJson = generator.generatePackageJson();
|
|
339
|
-
if (yarn) {
|
|
340
|
-
packageJson.scripts.dev = "yarn server";
|
|
341
|
-
packageJson.scripts.prod = "yarn build && yarn server:prod";
|
|
342
|
-
} else if (pnpm) {
|
|
343
|
-
packageJson.scripts.dev = "pnpm run server";
|
|
344
|
-
packageJson.scripts.prod = "pnpm build && pnpm server:prod";
|
|
345
|
-
}
|
|
346
|
-
const packageJsonfileName = import_path.default.join(outputDir, "package.json");
|
|
347
|
-
await import_promises.default.writeFile(packageJsonfileName, (0, import_prettier.format)(JSON.stringify(packageJson), __spreadProps(__spreadValues({}, prettierConfig), {
|
|
348
|
-
filepath: packageJsonfileName
|
|
349
|
-
})));
|
|
350
|
-
if (language === "ts") {
|
|
351
|
-
const fn = import_path.default.join(outputDir, "tsconfig.json");
|
|
352
|
-
await import_promises.default.writeFile(fn, (0, import_prettier.format)(generator.generateTsConfig(), __spreadProps(__spreadValues({}, prettierConfig), { filepath: fn })));
|
|
353
|
-
}
|
|
354
|
-
const viteConfigFileName = import_path.default.join(outputDir, "vite.config." + language);
|
|
355
|
-
await import_promises.default.writeFile(viteConfigFileName, (0, import_prettier.format)(generator.generateViteConfig(), __spreadProps(__spreadValues({}, prettierConfig), {
|
|
356
|
-
filepath: viteConfigFileName
|
|
357
|
-
})));
|
|
358
|
-
process.chdir(outputDir);
|
|
359
|
-
if (!skipDependencies) {
|
|
360
|
-
console.log("Installing dependencies with", packageManager);
|
|
361
|
-
await runCommand(packageManager, "install");
|
|
362
|
-
}
|
|
363
|
-
if (initGitRepo) {
|
|
364
|
-
console.log("Initializing git repository");
|
|
365
|
-
await runCommand("git", "init");
|
|
366
|
-
if (initGitRepo === true)
|
|
367
|
-
initGitRepo = "main";
|
|
368
|
-
if (initGitRepo !== "master") {
|
|
369
|
-
await runCommand("git", "checkout", "-b", initGitRepo);
|
|
370
|
-
}
|
|
371
|
-
if (createInitialCommit) {
|
|
372
|
-
console.log("Creating initial commit");
|
|
373
|
-
if (createInitialCommit === true)
|
|
374
|
-
createInitialCommit = `Initialized Vike ${typescript2 ? "TypeScript" : "vanilla JavaScript"} boilerplate for ${react2 ? "React" : "Vue"}`;
|
|
375
|
-
await runCommand("git", "add", ".");
|
|
376
|
-
await runCommand("git", "commit", "-m", createInitialCommit);
|
|
377
|
-
}
|
|
378
|
-
} else if (createInitialCommit) {
|
|
379
|
-
console.warn("Ignoring initial commit because no git repo was initialized");
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
async function getFiles(dir) {
|
|
383
|
-
const files = [];
|
|
384
|
-
const walker = (0, import_walk.walk)(import_path.default.join(FILES_DIR, dir));
|
|
385
|
-
walker.on("file", (root, fileStats, next) => {
|
|
386
|
-
files.push(import_path.default.relative(FILES_DIR, import_path.default.join(root, fileStats.name)));
|
|
387
|
-
next();
|
|
388
|
-
});
|
|
389
|
-
await new Promise((resolve, reject) => {
|
|
390
|
-
walker.on("end", resolve);
|
|
391
|
-
walker.on("errors", (_, statsArr) => {
|
|
392
|
-
const errors = statsArr.map((stat) => stat.error);
|
|
393
|
-
reject(new Error(`Failed to walk ${dir}: ${errors.join(", ")}`));
|
|
394
|
-
});
|
|
395
|
-
});
|
|
396
|
-
return files;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// package.json
|
|
400
|
-
var version = "0.0.3";
|
|
401
|
-
|
|
402
|
-
// src/index.ts
|
|
403
|
-
import_commander.program.description("Generates Vike application boilerplate").version(version).argument("<output-dir>", "Output directory").option("-t, --typescript", "use TypeScript", false).option("-n, --npm", "use npm package manager", false).option("-y, --yarn", "use yarn package manager", false).option("-p, --pnpm", "use pnpm package manager", false).option("-v, --vue", "use Vue", false).option("-r, --react", "use React", false).option("-c, --client-router", "use client router", false).option("-s, --skip-dependencies", "skip installing dependencies", false).option("-i, --init-git-repo [branch]", "initialize git repo", false).option("-m, --create-initial-commit [message]", "create initial commit", false).action((outputDir, options) => {
|
|
404
|
-
generate(__spreadValues({ outputDir }, options));
|
|
405
|
-
}).parse();
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Counter } from "./Counter";
|
|
3
|
-
|
|
4
|
-
export { Page };
|
|
5
|
-
|
|
6
|
-
function Page() {
|
|
7
|
-
return (
|
|
8
|
-
<>
|
|
9
|
-
<h1>Welcome</h1>
|
|
10
|
-
This page is:
|
|
11
|
-
<ul>
|
|
12
|
-
<li>Rendered to HTML.</li>
|
|
13
|
-
<li>
|
|
14
|
-
Interactive. <Counter />
|
|
15
|
-
</li>
|
|
16
|
-
</ul>
|
|
17
|
-
</>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { usePageContext } from "./usePageContext";
|
|
3
|
-
|
|
4
|
-
export { Link };
|
|
5
|
-
|
|
6
|
-
function Link(props) {
|
|
7
|
-
const pageContext = usePageContext();
|
|
8
|
-
const className = [
|
|
9
|
-
props.className,
|
|
10
|
-
pageContext.urlPathname === props.href && "is-active",
|
|
11
|
-
]
|
|
12
|
-
.filter(Boolean)
|
|
13
|
-
.join(" ");
|
|
14
|
-
return <a {...props} className={className} />;
|
|
15
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
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
|
-
|
|
7
|
-
export { PageWrapper };
|
|
8
|
-
|
|
9
|
-
function PageWrapper({ children, pageContext }) {
|
|
10
|
-
return (
|
|
11
|
-
<React.StrictMode>
|
|
12
|
-
<PageContextProvider pageContext={pageContext}>
|
|
13
|
-
<Layout>
|
|
14
|
-
<Sidebar>
|
|
15
|
-
<Logo />
|
|
16
|
-
<Link className="navitem" href="/">
|
|
17
|
-
Home
|
|
18
|
-
</Link>
|
|
19
|
-
<Link className="navitem" href="/about">
|
|
20
|
-
About
|
|
21
|
-
</Link>
|
|
22
|
-
</Sidebar>
|
|
23
|
-
<Content>{children}</Content>
|
|
24
|
-
</Layout>
|
|
25
|
-
</PageContextProvider>
|
|
26
|
-
</React.StrictMode>
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function Layout({ children }) {
|
|
31
|
-
return (
|
|
32
|
-
<div
|
|
33
|
-
style={{
|
|
34
|
-
display: "flex",
|
|
35
|
-
maxWidth: 900,
|
|
36
|
-
margin: "auto",
|
|
37
|
-
}}
|
|
38
|
-
>
|
|
39
|
-
{children}
|
|
40
|
-
</div>
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function Sidebar({ children }) {
|
|
45
|
-
return (
|
|
46
|
-
<div
|
|
47
|
-
style={{
|
|
48
|
-
padding: 20,
|
|
49
|
-
flexShrink: 0,
|
|
50
|
-
display: "flex",
|
|
51
|
-
flexDirection: "column",
|
|
52
|
-
alignItems: "center",
|
|
53
|
-
lineHeight: "1.8em",
|
|
54
|
-
}}
|
|
55
|
-
>
|
|
56
|
-
{children}
|
|
57
|
-
</div>
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function Content({ children }) {
|
|
62
|
-
return (
|
|
63
|
-
<div
|
|
64
|
-
style={{
|
|
65
|
-
padding: 20,
|
|
66
|
-
paddingBottom: 50,
|
|
67
|
-
borderLeft: "2px solid #eee",
|
|
68
|
-
minHeight: "100vh",
|
|
69
|
-
}}
|
|
70
|
-
>
|
|
71
|
-
{children}
|
|
72
|
-
</div>
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function Logo() {
|
|
77
|
-
return (
|
|
78
|
-
<div
|
|
79
|
-
style={{
|
|
80
|
-
marginTop: 20,
|
|
81
|
-
marginBottom: 10,
|
|
82
|
-
}}
|
|
83
|
-
>
|
|
84
|
-
<a href="/">
|
|
85
|
-
<img src={logo} height={64} width={64} alt="logo" />
|
|
86
|
-
</a>
|
|
87
|
-
</div>
|
|
88
|
-
);
|
|
89
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import ReactDOM from "react-dom";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { getPage } from "vite-plugin-ssr/client";
|
|
4
|
-
import { PageWrapper } from "./PageWrapper";
|
|
5
|
-
|
|
6
|
-
hydrate();
|
|
7
|
-
|
|
8
|
-
async function hydrate() {
|
|
9
|
-
// We do Server Routing, but we can also do Client Routing by using `useClientRouter()`
|
|
10
|
-
// instead of `getPage()`, see https://vite-plugin-ssr.com/useClientRouter
|
|
11
|
-
const pageContext = await getPage();
|
|
12
|
-
const { Page, pageProps } = pageContext;
|
|
13
|
-
ReactDOM.hydrate(
|
|
14
|
-
<PageWrapper pageContext={pageContext}>
|
|
15
|
-
<Page {...pageProps} />
|
|
16
|
-
</PageWrapper>,
|
|
17
|
-
document.getElementById("page-view")
|
|
18
|
-
);
|
|
19
|
-
}
|