create-aomex 0.0.29 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +13 -45
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/templates/README.md +4 -4
- package/templates/package.json +2 -2
- package/templates/src/middleware/auth.md.ts +6 -0
- package/templates/src/middleware/counter.md.ts +8 -0
- package/templates/src/middleware/i18n-provider.md.ts +6 -0
- package/templates/src/middleware/swagger.md.ts +14 -0
- package/templates/src/middleware/trace.md.ts +6 -0
- package/templates/src/routers/hello.router.ts +2 -2
- package/templates/src/web.ts +6 -23
- package/templates/src/middleware/hello.middleware.ts +0 -8
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
writeFile
|
|
14
14
|
} from "node:fs/promises";
|
|
15
15
|
import { terminal as terminal3 } from "@aomex/console";
|
|
16
|
-
import { execSync
|
|
16
|
+
import { execSync, spawn } from "node:child_process";
|
|
17
17
|
import { setTimeout } from "node:timers/promises";
|
|
18
18
|
|
|
19
19
|
// src/input-project.ts
|
|
@@ -60,40 +60,14 @@ var isProjectDirAvailable = (projectName2) => {
|
|
|
60
60
|
return `\u76EE\u5F55 "${targetDir2}" \u5305\u542B\u5176\u5B83\u6587\u4EF6\uFF0C\u8BF7\u624B\u52A8\u5220\u9664\u6216\u9009\u62E9\u65B0\u7684\u9879\u76EE\u540D`;
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
// src/select-package-manager.ts
|
|
64
|
-
import { select } from "@inquirer/prompts";
|
|
65
|
-
import { execSync } from "node:child_process";
|
|
66
|
-
var packageManagers = ["pnpm", "npm", "yarn"];
|
|
67
|
-
var selectPackageManager = async (argv2) => {
|
|
68
|
-
let packageManager2;
|
|
69
|
-
for (const item of ["pnpm", "npm", "yarn"]) {
|
|
70
|
-
if (argv2[item]) {
|
|
71
|
-
packageManager2 = item;
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (!packageManager2) {
|
|
76
|
-
packageManager2 = await select({
|
|
77
|
-
message: "\u8BF7\u9009\u62E9\u5305\u7BA1\u7406\u5668",
|
|
78
|
-
default: "pnpm",
|
|
79
|
-
choices: packageManagers
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
const packageManagerVersion2 = execSync(
|
|
83
|
-
packageManager2 === "npm" ? "npm -v" : `npm view ${packageManager2} version`,
|
|
84
|
-
{ encoding: "utf8" }
|
|
85
|
-
).replaceAll("\n", "") || "0.0.0";
|
|
86
|
-
return { packageManager: packageManager2, packageManagerVersion: packageManagerVersion2 };
|
|
87
|
-
};
|
|
88
|
-
|
|
89
63
|
// src/select-node-version.ts
|
|
90
64
|
import { terminal as terminal2 } from "@aomex/console";
|
|
91
|
-
import { select
|
|
65
|
+
import { select } from "@inquirer/prompts";
|
|
92
66
|
var selectNodeVersion = async (argv2) => {
|
|
93
67
|
let nodeVersion2 = argv2["node"];
|
|
94
68
|
if (!nodeVersion2) {
|
|
95
69
|
const nodes = await promise;
|
|
96
|
-
nodeVersion2 = await
|
|
70
|
+
nodeVersion2 = await select({
|
|
97
71
|
message: "\u8BF7\u9009\u62E9node.js\u7A33\u5B9A\u7248\u672C",
|
|
98
72
|
choices: nodes.map((item) => {
|
|
99
73
|
return {
|
|
@@ -141,9 +115,9 @@ var runShell = async (command) => {
|
|
|
141
115
|
var argv = yargsParser(process.argv.slice(2));
|
|
142
116
|
var templateDir = path2.join(import.meta.dirname, "..", "templates");
|
|
143
117
|
var projectName = await inputProject(argv);
|
|
144
|
-
var
|
|
145
|
-
|
|
146
|
-
);
|
|
118
|
+
var pnpmVersion = execSync(`npm view pnpm version`, {
|
|
119
|
+
encoding: "utf8"
|
|
120
|
+
}).replaceAll("\n", "") || "0.0.0";
|
|
147
121
|
var nodeVersion = await selectNodeVersion(argv);
|
|
148
122
|
var targetDir = path2.resolve(projectName);
|
|
149
123
|
var { error } = await terminal3.runTasks([
|
|
@@ -160,9 +134,8 @@ var { error } = await terminal3.runTasks([
|
|
|
160
134
|
task: async () => {
|
|
161
135
|
const variables = {
|
|
162
136
|
projectName,
|
|
163
|
-
packageManager,
|
|
164
137
|
nodeVersion,
|
|
165
|
-
|
|
138
|
+
pnpmVersion
|
|
166
139
|
};
|
|
167
140
|
await cp(templateDir, targetDir, { recursive: true });
|
|
168
141
|
const files = await readdir(targetDir, { recursive: true });
|
|
@@ -186,7 +159,7 @@ var { error } = await terminal3.runTasks([
|
|
|
186
159
|
{
|
|
187
160
|
title: "git\u521D\u59CB\u5316",
|
|
188
161
|
skip: async () => {
|
|
189
|
-
return !/\d\.\d/.test(
|
|
162
|
+
return !/\d\.\d/.test(execSync("git -v", { encoding: "utf8" }));
|
|
190
163
|
},
|
|
191
164
|
task: async () => {
|
|
192
165
|
await runShell("git init");
|
|
@@ -196,13 +169,11 @@ var { error } = await terminal3.runTasks([
|
|
|
196
169
|
{
|
|
197
170
|
title: "\u589E\u52A0volta\u914D\u7F6E",
|
|
198
171
|
skip: async () => {
|
|
199
|
-
return !/\d\.\d/.test(
|
|
172
|
+
return !/\d\.\d/.test(execSync("volta -v", { encoding: "utf8" }));
|
|
200
173
|
},
|
|
201
174
|
task: async () => {
|
|
202
175
|
await runShell(`volta pin node@${nodeVersion}`);
|
|
203
|
-
|
|
204
|
-
await runShell(`volta pin ${packageManager}@${packageManagerVersion}`);
|
|
205
|
-
}
|
|
176
|
+
await runShell(`volta pin pnpm@${pnpmVersion}`);
|
|
206
177
|
}
|
|
207
178
|
},
|
|
208
179
|
{
|
|
@@ -228,6 +199,7 @@ var { error } = await terminal3.runTasks([
|
|
|
228
199
|
"@prisma/client",
|
|
229
200
|
"@aomex/cache",
|
|
230
201
|
"@aomex/cache-redis-adapter",
|
|
202
|
+
"@aomex/auth",
|
|
231
203
|
"ioredis"
|
|
232
204
|
]
|
|
233
205
|
},
|
|
@@ -251,14 +223,10 @@ var { error } = await terminal3.runTasks([
|
|
|
251
223
|
dev: true
|
|
252
224
|
}
|
|
253
225
|
];
|
|
254
|
-
const action = packageManager === "npm" ? "install" : "add";
|
|
255
|
-
const devSuffix = packageManager === "npm" ? "--save-dev" : "-D";
|
|
256
226
|
for (let i = 0; i < packages.length; ++i) {
|
|
257
227
|
const { pkgs, dev, label } = packages[i];
|
|
258
228
|
task.suffix = terminal3.style("gray", label);
|
|
259
|
-
await runShell(
|
|
260
|
-
`${packageManager} ${action} ${pkgs.join(" ")} ${dev ? devSuffix : ""}`
|
|
261
|
-
);
|
|
229
|
+
await runShell(`pnpm add ${pkgs.join(" ")} ${dev ? "-D" : ""}`);
|
|
262
230
|
}
|
|
263
231
|
task.suffix = "";
|
|
264
232
|
}
|
|
@@ -272,6 +240,6 @@ var { error } = await terminal3.runTasks([
|
|
|
272
240
|
]);
|
|
273
241
|
if (error) process.exit(1);
|
|
274
242
|
console.log(
|
|
275
|
-
"\n\u9879\u76EE\u521B\u5EFA\u6210\u529F\uFF1A" + terminal3.style(["blue", "underline"], process.cwd()) + "\n\u542F\u52A8\u9879\u76EE\u53EF\u6267\u884C\u5982\u4E0B\u6307\u4EE4\uFF1A\n\n" + terminal3.style("green", `cd ${projectName} &&
|
|
243
|
+
"\n\u9879\u76EE\u521B\u5EFA\u6210\u529F\uFF1A" + terminal3.style(["blue", "underline"], process.cwd()) + "\n\u542F\u52A8\u9879\u76EE\u53EF\u6267\u884C\u5982\u4E0B\u6307\u4EE4\uFF1A\n\n" + terminal3.style("green", `cd ${projectName} && pnpm start`) + "\n"
|
|
276
244
|
);
|
|
277
245
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/input-project.ts","../src/select-package-manager.ts","../src/select-node-version.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport path from 'node:path/posix';\nimport yargsParser from 'yargs-parser';\nimport {\n cp,\n mkdir,\n readdir,\n readFile,\n rename,\n stat,\n writeFile,\n} from 'node:fs/promises';\nimport { terminal } from '@aomex/console';\nimport { execSync, spawn } from 'node:child_process';\nimport { setTimeout } from 'node:timers/promises';\nimport { inputProject } from './input-project';\nimport { selectPackageManager } from './select-package-manager';\nimport { selectNodeVersion } from './select-node-version';\n\nconst runShell = async (command: string) => {\n await new Promise((resolve, reject) => {\n const stream = spawn(command, {\n cwd: process.cwd(),\n env: process.env,\n shell: true,\n });\n stream.on('close', resolve);\n stream.on('error', reject);\n });\n};\n\nconst argv = yargsParser(process.argv.slice(2));\nconst templateDir = path.join(import.meta.dirname, '..', 'templates');\nconst projectName = await inputProject(argv);\nconst { packageManager, packageManagerVersion } = await selectPackageManager(\n argv,\n);\nconst nodeVersion = await selectNodeVersion(argv);\nconst targetDir = path.resolve(projectName);\n\nconst { error } = await terminal.runTasks([\n {\n title: '创建目录',\n task: async () => {\n await mkdir(targetDir, { recursive: true });\n process.chdir(targetDir);\n await setTimeout(500);\n },\n },\n {\n title: '复制模板文件',\n task: async () => {\n const variables = {\n projectName,\n packageManager,\n nodeVersion,\n packageManagerVersion,\n };\n await cp(templateDir, targetDir, { recursive: true });\n const files = await readdir(targetDir, { recursive: true });\n for (const file of files) {\n const isFile = (await stat(path.join(targetDir, file))).isFile();\n if (!isFile) continue;\n const fileAbsolutePath = path.resolve(file);\n let fileContent = await readFile(fileAbsolutePath, 'utf8');\n Object.entries(variables).forEach(([key, value]) => {\n fileContent = fileContent.replaceAll(`{{${key}}}`, value);\n });\n await writeFile(fileAbsolutePath, fileContent);\n }\n // .gitignore这个文件在安装的时候总是被忽略\n await rename(\n path.join(targetDir, 'gitignore'),\n path.join(targetDir, '.gitignore'),\n );\n await setTimeout(500);\n },\n },\n {\n title: 'git初始化',\n skip: async () => {\n return !/\\d\\.\\d/.test(execSync('git -v', { encoding: 'utf8' }));\n },\n task: async () => {\n await runShell('git init');\n await setTimeout(500);\n },\n },\n {\n title: '增加volta配置',\n skip: async () => {\n return !/\\d\\.\\d/.test(execSync('volta -v', { encoding: 'utf8' }));\n },\n task: async () => {\n await runShell(`volta pin node@${nodeVersion}`);\n if (packageManager !== 'npm') {\n await runShell(`volta pin ${packageManager}@${packageManagerVersion}`);\n }\n },\n },\n {\n title: '安装插件',\n task: async (_, task) => {\n const packages: { label: string; pkgs: string[]; dev?: boolean }[] = [\n {\n label: 'dependencies',\n pkgs: [\n '@aomex/core',\n '@aomex/web',\n '@aomex/cors',\n '@aomex/etag',\n '@aomex/compress',\n '@aomex/http-logger',\n '@aomex/response-time',\n '@aomex/console',\n '@aomex/cron',\n '@aomex/helmet',\n '@aomex/openapi',\n '@aomex/swagger-ui',\n '@aomex/async-trace',\n '@prisma/client',\n '@aomex/cache',\n '@aomex/cache-redis-adapter',\n 'ioredis',\n ],\n },\n {\n label: 'dev dependencies',\n pkgs: [\n 'prisma',\n 'typescript',\n 'tsx',\n 'tsc-alias',\n '@types/node',\n 'husky',\n 'prettier',\n '@commitlint/cli',\n '@commitlint/config-conventional',\n 'eslint',\n '@typescript-eslint/eslint-plugin',\n '@typescript-eslint/parser',\n 'eslint-plugin-check-file',\n ],\n dev: true,\n },\n ];\n const action = packageManager === 'npm' ? 'install' : 'add';\n const devSuffix = packageManager === 'npm' ? '--save-dev' : '-D';\n\n for (let i = 0; i < packages.length; ++i) {\n const { pkgs, dev, label } = packages[i]!;\n task.suffix = terminal.style('gray', label);\n await runShell(\n `${packageManager} ${action} ${pkgs.join(' ')} ${\n dev ? devSuffix : ''\n }`,\n );\n }\n task.suffix = '';\n },\n },\n {\n title: '生成prisma客户端',\n task: async () => {\n await runShell('npx prisma generate');\n },\n },\n]);\n\nif (error) process.exit(1);\n\nconsole.log(\n '\\n项目创建成功:' +\n terminal.style(['blue', 'underline'], process.cwd()) +\n '\\n' +\n '启动项目可执行如下指令:' +\n '\\n\\n' +\n terminal.style('green', `cd ${projectName} && ${packageManager} start`) +\n '\\n',\n);\n","import { terminal } from '@aomex/console';\nimport { input } from '@inquirer/prompts';\nimport { existsSync, readdirSync } from 'node:fs';\nimport sanitize from 'sanitize-filename';\nimport path from 'path';\n\nconst kebabCase = (value: string) => {\n value = sanitize(value);\n if (!value.length) return '';\n value = value[0]!.toLowerCase() + value.slice(1);\n return value\n .replace(/[A-Z]/g, (i) => '-' + i.toLowerCase())\n .replace(/_/g, '-')\n .replace(/-+/g, '-');\n};\n\nexport const inputProject = async (argv: Record<string, any>) => {\n let projectName: string = argv['project'];\n if (projectName) {\n projectName = kebabCase(projectName);\n const available = isProjectDirAvailable(projectName);\n if (typeof available === 'string') {\n terminal.printError(available);\n process.exit(1);\n }\n } else {\n projectName = await input({\n message: '请输入项目',\n validate(value) {\n return isProjectDirAvailable(value);\n },\n transformer(value) {\n return kebabCase(value);\n },\n });\n projectName = kebabCase(projectName);\n }\n\n return projectName;\n};\n\nconst isProjectDirAvailable = (projectName: string): string | true => {\n projectName = projectName.trim();\n if (!projectName.trim()) return '项目名不能为空';\n const targetDir = path.resolve(projectName);\n if (!existsSync(targetDir)) return true;\n if (!readdirSync(targetDir).length) return true;\n return `目录 \"${targetDir}\" 包含其它文件,请手动删除或选择新的项目名`;\n};\n","import { select } from '@inquirer/prompts';\nimport { execSync } from 'node:child_process';\n\nconst packageManagers = <const>['pnpm', 'npm', 'yarn'];\n\nexport const selectPackageManager = async (argv: Record<string, any>) => {\n let packageManager!: (typeof packageManagers)[number];\n for (const item of <const>['pnpm', 'npm', 'yarn']) {\n if (argv[item]) {\n packageManager = item;\n break;\n }\n }\n if (!packageManager) {\n packageManager = await select({\n message: '请选择包管理器',\n default: 'pnpm',\n choices: packageManagers,\n });\n }\n\n const packageManagerVersion =\n execSync(\n packageManager === 'npm'\n ? 'npm -v'\n : `npm view ${packageManager} version`,\n { encoding: 'utf8' },\n ).replaceAll('\\n', '') || '0.0.0';\n\n return { packageManager, packageManagerVersion };\n};\n","import { terminal } from '@aomex/console';\nimport { select } from '@inquirer/prompts';\n\nexport const selectNodeVersion = async (argv: Record<string, any>) => {\n let nodeVersion: string = argv['node'];\n if (!nodeVersion) {\n const nodes = await promise;\n nodeVersion = await select({\n message: '请选择node.js稳定版本',\n choices: nodes.map((item) => {\n return {\n name: `${item.version} ${terminal.style(['gray', 'dim'], item.date)}`,\n value: item.version,\n short: item.version,\n };\n }),\n loop: false,\n });\n }\n\n return nodeVersion.replace(/^v/, '');\n};\n\nconst fetchNodes = async () => {\n const response = await fetch(\n 'https://nodejs.org/download/release/index.json',\n );\n const nodes = (await response.json()) as {\n version: string;\n lts: boolean;\n date: string;\n }[];\n\n return nodes\n .map((item) => {\n return {\n ...item,\n versions: item.version.slice(1).split('.').map(Number) as [\n number,\n number,\n number,\n ],\n };\n })\n .filter((item) => {\n if (!item.lts) return false;\n if (item.versions[0] === 20 && item.versions[1] >= 13) return true;\n if (item.versions[0] >= 22) return true;\n return false;\n });\n};\n\nconst promise = fetchNodes();\n"],"mappings":"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","names":["path","terminal","execSync","argv","projectName","targetDir","argv","packageManager","packageManagerVersion","terminal","select","argv","nodeVersion","path","terminal","execSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/input-project.ts","../src/select-node-version.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport path from 'node:path/posix';\nimport yargsParser from 'yargs-parser';\nimport {\n cp,\n mkdir,\n readdir,\n readFile,\n rename,\n stat,\n writeFile,\n} from 'node:fs/promises';\nimport { terminal } from '@aomex/console';\nimport { execSync, spawn } from 'node:child_process';\nimport { setTimeout } from 'node:timers/promises';\nimport { inputProject } from './input-project';\nimport { selectNodeVersion } from './select-node-version';\n\nconst runShell = async (command: string) => {\n await new Promise((resolve, reject) => {\n const stream = spawn(command, {\n cwd: process.cwd(),\n env: process.env,\n shell: true,\n });\n stream.on('close', resolve);\n stream.on('error', reject);\n });\n};\n\nconst argv = yargsParser(process.argv.slice(2));\nconst templateDir = path.join(import.meta.dirname, '..', 'templates');\nconst projectName = await inputProject(argv);\nconst pnpmVersion =\n execSync(`npm view pnpm version`, {\n encoding: 'utf8',\n }).replaceAll('\\n', '') || '0.0.0';\n\nconst nodeVersion = await selectNodeVersion(argv);\nconst targetDir = path.resolve(projectName);\n\nconst { error } = await terminal.runTasks([\n {\n title: '创建目录',\n task: async () => {\n await mkdir(targetDir, { recursive: true });\n process.chdir(targetDir);\n await setTimeout(500);\n },\n },\n {\n title: '复制模板文件',\n task: async () => {\n const variables = {\n projectName,\n nodeVersion,\n pnpmVersion,\n };\n await cp(templateDir, targetDir, { recursive: true });\n const files = await readdir(targetDir, { recursive: true });\n for (const file of files) {\n const isFile = (await stat(path.join(targetDir, file))).isFile();\n if (!isFile) continue;\n const fileAbsolutePath = path.resolve(file);\n let fileContent = await readFile(fileAbsolutePath, 'utf8');\n Object.entries(variables).forEach(([key, value]) => {\n fileContent = fileContent.replaceAll(`{{${key}}}`, value);\n });\n await writeFile(fileAbsolutePath, fileContent);\n }\n // .gitignore这个文件在安装的时候总是被忽略\n await rename(\n path.join(targetDir, 'gitignore'),\n path.join(targetDir, '.gitignore'),\n );\n await setTimeout(500);\n },\n },\n {\n title: 'git初始化',\n skip: async () => {\n return !/\\d\\.\\d/.test(execSync('git -v', { encoding: 'utf8' }));\n },\n task: async () => {\n await runShell('git init');\n await setTimeout(500);\n },\n },\n {\n title: '增加volta配置',\n skip: async () => {\n return !/\\d\\.\\d/.test(execSync('volta -v', { encoding: 'utf8' }));\n },\n task: async () => {\n await runShell(`volta pin node@${nodeVersion}`);\n await runShell(`volta pin pnpm@${pnpmVersion}`);\n },\n },\n {\n title: '安装插件',\n task: async (_, task) => {\n const packages: { label: string; pkgs: string[]; dev?: boolean }[] = [\n {\n label: 'dependencies',\n pkgs: [\n '@aomex/core',\n '@aomex/web',\n '@aomex/cors',\n '@aomex/etag',\n '@aomex/compress',\n '@aomex/http-logger',\n '@aomex/response-time',\n '@aomex/console',\n '@aomex/cron',\n '@aomex/helmet',\n '@aomex/openapi',\n '@aomex/swagger-ui',\n '@aomex/async-trace',\n '@prisma/client',\n '@aomex/cache',\n '@aomex/cache-redis-adapter',\n '@aomex/auth',\n 'ioredis',\n ],\n },\n {\n label: 'dev dependencies',\n pkgs: [\n 'prisma',\n 'typescript',\n 'tsx',\n 'tsc-alias',\n '@types/node',\n 'husky',\n 'prettier',\n '@commitlint/cli',\n '@commitlint/config-conventional',\n 'eslint',\n '@typescript-eslint/eslint-plugin',\n '@typescript-eslint/parser',\n 'eslint-plugin-check-file',\n ],\n dev: true,\n },\n ];\n\n for (let i = 0; i < packages.length; ++i) {\n const { pkgs, dev, label } = packages[i]!;\n task.suffix = terminal.style('gray', label);\n await runShell(`pnpm add ${pkgs.join(' ')} ${dev ? '-D' : ''}`);\n }\n task.suffix = '';\n },\n },\n {\n title: '生成prisma客户端',\n task: async () => {\n await runShell('npx prisma generate');\n },\n },\n]);\n\nif (error) process.exit(1);\n\nconsole.log(\n '\\n项目创建成功:' +\n terminal.style(['blue', 'underline'], process.cwd()) +\n '\\n' +\n '启动项目可执行如下指令:' +\n '\\n\\n' +\n terminal.style('green', `cd ${projectName} && pnpm start`) +\n '\\n',\n);\n","import { terminal } from '@aomex/console';\nimport { input } from '@inquirer/prompts';\nimport { existsSync, readdirSync } from 'node:fs';\nimport sanitize from 'sanitize-filename';\nimport path from 'path';\n\nconst kebabCase = (value: string) => {\n value = sanitize(value);\n if (!value.length) return '';\n value = value[0]!.toLowerCase() + value.slice(1);\n return value\n .replace(/[A-Z]/g, (i) => '-' + i.toLowerCase())\n .replace(/_/g, '-')\n .replace(/-+/g, '-');\n};\n\nexport const inputProject = async (argv: Record<string, any>) => {\n let projectName: string = argv['project'];\n if (projectName) {\n projectName = kebabCase(projectName);\n const available = isProjectDirAvailable(projectName);\n if (typeof available === 'string') {\n terminal.printError(available);\n process.exit(1);\n }\n } else {\n projectName = await input({\n message: '请输入项目',\n validate(value) {\n return isProjectDirAvailable(value);\n },\n transformer(value) {\n return kebabCase(value);\n },\n });\n projectName = kebabCase(projectName);\n }\n\n return projectName;\n};\n\nconst isProjectDirAvailable = (projectName: string): string | true => {\n projectName = projectName.trim();\n if (!projectName.trim()) return '项目名不能为空';\n const targetDir = path.resolve(projectName);\n if (!existsSync(targetDir)) return true;\n if (!readdirSync(targetDir).length) return true;\n return `目录 \"${targetDir}\" 包含其它文件,请手动删除或选择新的项目名`;\n};\n","import { terminal } from '@aomex/console';\nimport { select } from '@inquirer/prompts';\n\nexport const selectNodeVersion = async (argv: Record<string, any>) => {\n let nodeVersion: string = argv['node'];\n if (!nodeVersion) {\n const nodes = await promise;\n nodeVersion = await select({\n message: '请选择node.js稳定版本',\n choices: nodes.map((item) => {\n return {\n name: `${item.version} ${terminal.style(['gray', 'dim'], item.date)}`,\n value: item.version,\n short: item.version,\n };\n }),\n loop: false,\n });\n }\n\n return nodeVersion.replace(/^v/, '');\n};\n\nconst fetchNodes = async () => {\n const response = await fetch(\n 'https://nodejs.org/download/release/index.json',\n );\n const nodes = (await response.json()) as {\n version: string;\n lts: boolean;\n date: string;\n }[];\n\n return nodes\n .map((item) => {\n return {\n ...item,\n versions: item.version.slice(1).split('.').map(Number) as [\n number,\n number,\n number,\n ],\n };\n })\n .filter((item) => {\n if (!item.lts) return false;\n if (item.versions[0] === 20 && item.versions[1] >= 13) return true;\n if (item.versions[0] >= 22) return true;\n return false;\n });\n};\n\nconst promise = fetchNodes();\n"],"mappings":"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","names":["path","terminal","argv","projectName","targetDir","terminal","argv","nodeVersion","path","terminal"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-aomex",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.31",
|
|
4
4
|
"repository": "git@github.com:aomex/create-aomex.git",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"cli": "rm -rf hello-aomex && tsx src/index.ts --project=HelloAomex --
|
|
8
|
+
"cli": "rm -rf hello-aomex && tsx src/index.ts --project=HelloAomex --node v20.16.0",
|
|
9
9
|
"release": "release-it --ci",
|
|
10
10
|
"build": "tsup",
|
|
11
11
|
"prepublishOnly": "tsup"
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@aomex/async-trace": "^3.3.0",
|
|
41
|
+
"@aomex/auth": "^3.4.0",
|
|
41
42
|
"@aomex/cache": "^3.3.0",
|
|
42
43
|
"@aomex/cache-redis-adapter": "^3.3.0",
|
|
43
44
|
"@aomex/compress": "^3.3.0",
|
package/templates/README.md
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
## 初始化
|
|
6
6
|
|
|
7
7
|
- 安装 docker 或者 orbstack
|
|
8
|
-
- 执行
|
|
8
|
+
- 执行 pnpm install
|
|
9
9
|
|
|
10
10
|
## 启动服务
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
|
|
13
|
+
pnpm start
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
## Swagger 文档
|
|
@@ -22,13 +22,13 @@
|
|
|
22
22
|
## 在集成环境服务器下部署
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
|
|
25
|
+
pnpm deploy:integration
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
## 在生产环境服务器下部署
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
|
|
31
|
+
pnpm deploy:production
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
## 目录结构
|
package/templates/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"deploy:production": "sh scripts/deploy.sh production",
|
|
12
12
|
"deploy:integration": "sh scripts/deploy.sh integration",
|
|
13
13
|
"prepare": "npx husky",
|
|
14
|
-
"preinstall": "npx only-allow
|
|
14
|
+
"preinstall": "npx only-allow pnpm"
|
|
15
15
|
},
|
|
16
|
-
"packageManager": "
|
|
16
|
+
"packageManager": "pnpm@{{pnpmVersion}}"
|
|
17
17
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { swaggerUI } from '@aomex/swagger-ui';
|
|
2
|
+
import { generateOpenapi } from '@aomex/openapi';
|
|
3
|
+
|
|
4
|
+
// 启动服务后,访问 http://localhost:3000/swagger 可以查看文档
|
|
5
|
+
export const swagger = swaggerUI({
|
|
6
|
+
openapi: () => {
|
|
7
|
+
return generateOpenapi({
|
|
8
|
+
routers: './src/routers',
|
|
9
|
+
docs: {
|
|
10
|
+
servers: [{ url: 'http://localhost:3000', description: 'Local' }],
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
},
|
|
14
|
+
});
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { rule } from '@aomex/core';
|
|
2
2
|
import { response, Router } from '@aomex/web';
|
|
3
|
-
import {
|
|
3
|
+
import { counter } from '@middleware/counter.md';
|
|
4
4
|
import { i18n } from '../i18n';
|
|
5
5
|
|
|
6
6
|
export const router = new Router();
|
|
7
7
|
|
|
8
8
|
router.get('/', {
|
|
9
9
|
mount: [
|
|
10
|
-
|
|
10
|
+
counter,
|
|
11
11
|
response({
|
|
12
12
|
statusCode: 200,
|
|
13
13
|
content: rule.string(),
|
package/templates/src/web.ts
CHANGED
|
@@ -5,38 +5,21 @@ import { httpLogger } from '@aomex/http-logger';
|
|
|
5
5
|
import { etag } from '@aomex/etag';
|
|
6
6
|
import { helmet } from '@aomex/helmet';
|
|
7
7
|
import { responseTime } from '@aomex/response-time';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { I18n, middleware } from '@aomex/core';
|
|
8
|
+
import { swagger } from '@middleware/swagger.md';
|
|
9
|
+
import { i18nProvider } from '@middleware/i18n-provider.md';
|
|
10
|
+
import { trace } from '@middleware/trace.md';
|
|
12
11
|
|
|
13
12
|
export const app = new WebApp({
|
|
14
13
|
language: 'zh_CN',
|
|
15
14
|
mount: [
|
|
16
|
-
|
|
17
|
-
// 动态选择i18n语言包
|
|
18
|
-
return I18n.provider(ctx.request.accept.language()[0] || 'zh_CN', next);
|
|
19
|
-
}),
|
|
15
|
+
i18nProvider,
|
|
20
16
|
httpLogger(),
|
|
21
17
|
responseTime,
|
|
22
|
-
|
|
23
|
-
// 根据 record.delta 上报慢日志
|
|
24
|
-
// console.log(record);
|
|
25
|
-
}),
|
|
18
|
+
trace,
|
|
26
19
|
cors(),
|
|
27
20
|
compress(),
|
|
28
21
|
etag(),
|
|
29
|
-
|
|
30
|
-
swaggerUI({
|
|
31
|
-
openapi: () => {
|
|
32
|
-
return generateOpenapi({
|
|
33
|
-
routers: './src/routers',
|
|
34
|
-
docs: {
|
|
35
|
-
servers: [{ url: 'http://localhost:3000', description: 'Local' }],
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
},
|
|
39
|
-
}),
|
|
22
|
+
swagger,
|
|
40
23
|
helmet(),
|
|
41
24
|
routers('./src/routers'),
|
|
42
25
|
],
|