create-aomex 0.0.26 → 0.0.28

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 CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  mkdir,
9
9
  readdir,
10
10
  readFile,
11
+ rename,
11
12
  stat,
12
13
  writeFile
13
14
  } from "node:fs/promises";
@@ -168,6 +169,10 @@ var { error } = await terminal3.runTasks([
168
169
  });
169
170
  await writeFile(fileAbsolutePath, fileContent);
170
171
  }
172
+ await rename(
173
+ path2.join(targetDir, "gitignore"),
174
+ path2.join(targetDir, ".gitignore")
175
+ );
171
176
  await setTimeout(500);
172
177
  }
173
178
  },
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 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 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 kebabCase from 'lodash.kebabcase';\nimport path from 'path';\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 }\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-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 kebabCase from 'lodash.kebabcase';\nimport path from 'path';\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 }\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":";;;AAEA,OAAOA,WAAU;AACjB,OAAO,iBAAiB;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,YAAAC,iBAAgB;AACzB,SAAS,YAAAC,WAAU,aAAa;AAChC,SAAS,kBAAkB;;;ACf3B,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,YAAY,mBAAmB;AACxC,OAAO,eAAe;AACtB,OAAO,UAAU;AAEV,IAAM,eAAe,OAAOC,UAA8B;AAC/D,MAAIC,eAAsBD,MAAK,SAAS;AACxC,MAAIC,cAAa;AACf,IAAAA,eAAc,UAAUA,YAAW;AACnC,UAAM,YAAY,sBAAsBA,YAAW;AACnD,QAAI,OAAO,cAAc,UAAU;AACjC,eAAS,WAAW,SAAS;AAC7B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,OAAO;AACL,IAAAA,eAAc,MAAM,MAAM;AAAA,MACxB,SAAS;AAAA,MACT,SAAS,OAAO;AACd,eAAO,sBAAsB,KAAK;AAAA,MACpC;AAAA,MACA,YAAY,OAAO;AACjB,eAAO,UAAU,KAAK;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAOA;AACT;AAEA,IAAM,wBAAwB,CAACA,iBAAuC;AACpE,EAAAA,eAAcA,aAAY,KAAK;AAC/B,MAAI,CAACA,aAAY,KAAK,EAAG,QAAO;AAChC,QAAMC,aAAY,KAAK,QAAQD,YAAW;AAC1C,MAAI,CAAC,WAAWC,UAAS,EAAG,QAAO;AACnC,MAAI,CAAC,YAAYA,UAAS,EAAE,OAAQ,QAAO;AAC3C,SAAO,iBAAOA,UAAS;AACzB;;;ACrCA,SAAS,cAAc;AACvB,SAAS,gBAAgB;AAEzB,IAAM,kBAAyB,CAAC,QAAQ,OAAO,MAAM;AAE9C,IAAM,uBAAuB,OAAOC,UAA8B;AACvE,MAAIC;AACJ,aAAW,QAAe,CAAC,QAAQ,OAAO,MAAM,GAAG;AACjD,QAAID,MAAK,IAAI,GAAG;AACd,MAAAC,kBAAiB;AACjB;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAACA,iBAAgB;AACnB,IAAAA,kBAAiB,MAAM,OAAO;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAMC,yBACJ;AAAA,IACED,oBAAmB,QACf,WACA,YAAYA,eAAc;AAAA,IAC9B,EAAE,UAAU,OAAO;AAAA,EACrB,EAAE,WAAW,MAAM,EAAE,KAAK;AAE5B,SAAO,EAAE,gBAAAA,iBAAgB,uBAAAC,uBAAsB;AACjD;;;AC9BA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,UAAAC,eAAc;AAEhB,IAAM,oBAAoB,OAAOC,UAA8B;AACpE,MAAIC,eAAsBD,MAAK,MAAM;AACrC,MAAI,CAACC,cAAa;AAChB,UAAM,QAAQ,MAAM;AACpB,IAAAA,eAAc,MAAMF,QAAO;AAAA,MACzB,SAAS;AAAA,MACT,SAAS,MAAM,IAAI,CAAC,SAAS;AAC3B,eAAO;AAAA,UACL,MAAM,GAAG,KAAK,OAAO,IAAID,UAAS,MAAM,CAAC,QAAQ,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,UACnE,OAAO,KAAK;AAAA,UACZ,OAAO,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AAAA,MACD,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAOG,aAAY,QAAQ,MAAM,EAAE;AACrC;AAEA,IAAM,aAAa,YAAY;AAC7B,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,EACF;AACA,QAAM,QAAS,MAAM,SAAS,KAAK;AAMnC,SAAO,MACJ,IAAI,CAAC,SAAS;AACb,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,KAAK,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAAA,IAKvD;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAAS;AAChB,QAAI,CAAC,KAAK,IAAK,QAAO;AACtB,QAAI,KAAK,SAAS,CAAC,MAAM,MAAM,KAAK,SAAS,CAAC,KAAK,GAAI,QAAO;AAC9D,QAAI,KAAK,SAAS,CAAC,KAAK,GAAI,QAAO;AACnC,WAAO;AAAA,EACT,CAAC;AACL;AAEA,IAAM,UAAU,WAAW;;;AHhC3B,IAAM,WAAW,OAAO,YAAoB;AAC1C,QAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AACrC,UAAM,SAAS,MAAM,SAAS;AAAA,MAC5B,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,OAAO;AAAA,IACT,CAAC;AACD,WAAO,GAAG,SAAS,OAAO;AAC1B,WAAO,GAAG,SAAS,MAAM;AAAA,EAC3B,CAAC;AACH;AAEA,IAAM,OAAO,YAAY,QAAQ,KAAK,MAAM,CAAC,CAAC;AAC9C,IAAM,cAAcC,MAAK,KAAK,YAAY,SAAS,MAAM,WAAW;AACpE,IAAM,cAAc,MAAM,aAAa,IAAI;AAC3C,IAAM,EAAE,gBAAgB,sBAAsB,IAAI,MAAM;AAAA,EACtD;AACF;AACA,IAAM,cAAc,MAAM,kBAAkB,IAAI;AAChD,IAAM,YAAYA,MAAK,QAAQ,WAAW;AAE1C,IAAM,EAAE,MAAM,IAAI,MAAMC,UAAS,SAAS;AAAA,EACxC;AAAA,IACE,OAAO;AAAA,IACP,MAAM,YAAY;AAChB,YAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,cAAQ,MAAM,SAAS;AACvB,YAAM,WAAW,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM,YAAY;AAChB,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,GAAG,aAAa,WAAW,EAAE,WAAW,KAAK,CAAC;AACpD,YAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1D,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAU,MAAM,KAAKD,MAAK,KAAK,WAAW,IAAI,CAAC,GAAG,OAAO;AAC/D,YAAI,CAAC,OAAQ;AACb,cAAM,mBAAmBA,MAAK,QAAQ,IAAI;AAC1C,YAAI,cAAc,MAAM,SAAS,kBAAkB,MAAM;AACzD,eAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAClD,wBAAc,YAAY,WAAW,KAAK,GAAG,MAAM,KAAK;AAAA,QAC1D,CAAC;AACD,cAAM,UAAU,kBAAkB,WAAW;AAAA,MAC/C;AAEA,YAAM;AAAA,QACJA,MAAK,KAAK,WAAW,WAAW;AAAA,QAChCA,MAAK,KAAK,WAAW,YAAY;AAAA,MACnC;AACA,YAAM,WAAW,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM,YAAY;AAChB,aAAO,CAAC,SAAS,KAAKE,UAAS,UAAU,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IAChE;AAAA,IACA,MAAM,YAAY;AAChB,YAAM,SAAS,UAAU;AACzB,YAAM,WAAW,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM,YAAY;AAChB,aAAO,CAAC,SAAS,KAAKA,UAAS,YAAY,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IAClE;AAAA,IACA,MAAM,YAAY;AAChB,YAAM,SAAS,kBAAkB,WAAW,EAAE;AAC9C,UAAI,mBAAmB,OAAO;AAC5B,cAAM,SAAS,aAAa,cAAc,IAAI,qBAAqB,EAAE;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM,OAAO,GAAG,SAAS;AACvB,YAAM,WAA+D;AAAA,QACnE;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,KAAK;AAAA,QACP;AAAA,MACF;AACA,YAAM,SAAS,mBAAmB,QAAQ,YAAY;AACtD,YAAM,YAAY,mBAAmB,QAAQ,eAAe;AAE5D,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,EAAE,GAAG;AACxC,cAAM,EAAE,MAAM,KAAK,MAAM,IAAI,SAAS,CAAC;AACvC,aAAK,SAASD,UAAS,MAAM,QAAQ,KAAK;AAC1C,cAAM;AAAA,UACJ,GAAG,cAAc,IAAI,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC,IAC3C,MAAM,YAAY,EACpB;AAAA,QACF;AAAA,MACF;AACA,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM,YAAY;AAChB,YAAM,SAAS,qBAAqB;AAAA,IACtC;AAAA,EACF;AACF,CAAC;AAED,IAAI,MAAO,SAAQ,KAAK,CAAC;AAEzB,QAAQ;AAAA,EACN,iDACEA,UAAS,MAAM,CAAC,QAAQ,WAAW,GAAG,QAAQ,IAAI,CAAC,IACnD,mFAGAA,UAAS,MAAM,SAAS,MAAM,WAAW,OAAO,cAAc,QAAQ,IACtE;AACJ;","names":["path","terminal","execSync","argv","projectName","targetDir","argv","packageManager","packageManagerVersion","terminal","select","argv","nodeVersion","path","terminal","execSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-aomex",
3
- "version": "0.0.26",
3
+ "version": "0.0.28",
4
4
  "repository": "git@github.com:aomex/create-aomex.git",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -23,7 +23,6 @@
23
23
  "files": [
24
24
  "dist",
25
25
  "templates",
26
- "templates/.gitignore",
27
26
  "LICENSE",
28
27
  "package.json",
29
28
  "README.md"
@@ -8,8 +8,8 @@
8
8
  },
9
9
  "scripts": {
10
10
  "start": "node scripts/start.mjs",
11
- "deploy:production": "sh scripts/deploy-production.sh",
12
- "deploy:integration": "sh scripts/deploy-integration.sh",
11
+ "deploy:production": "sh scripts/deploy.sh production",
12
+ "deploy:integration": "sh scripts/deploy.sh integration",
13
13
  "prepare": "npx husky",
14
14
  "preinstall": "npx only-allow {{packageManager}}"
15
15
  },
@@ -8,10 +8,11 @@ generator client {
8
8
  provider = "prisma-client-js"
9
9
  }
10
10
 
11
- model User {
11
+ model user {
12
12
  id Int @id @default(autoincrement())
13
- name String
14
- age Int
15
- created_at DateTime @default(now())
16
- updated_at DateTime @default(now()) @updatedAt()
13
+ name String @unique
14
+ age Int @default(17)
15
+ address String?
16
+ created_at DateTime @default(now()) @db.Timestamp(0)
17
+ updated_at DateTime @default(now()) @updatedAt() @db.Timestamp(0)
17
18
  }
@@ -2,13 +2,15 @@
2
2
 
3
3
  set -ex
4
4
 
5
- sudo docker build --tag {{projectName}}:production --file Dockerfile.production .
5
+ env="$1"
6
6
 
7
- cron_container_name={{projectName}}-cron-production
7
+ sudo docker build --tag "{{projectName}}:$env" --file "Dockerfile.$env" .
8
+
9
+ cron_container_name="{{projectName}}-cron-$env"
8
10
  container_exist=$(sudo docker ps | { grep $cron_container_name || :; })
9
11
  if [ -n "$container_exist" ];
10
12
  then
11
13
  sudo docker exec it $cron_container_name /bin/sh -c "npx aomex cron:stop"
12
14
  fi
13
15
 
14
- sudo docker compose --file docker-compose-production.yml up -d --timeout=1
16
+ sudo docker compose --file "docker-compose-$env.yml" up -d --timeout=1
@@ -1,11 +1,17 @@
1
1
  import { Commander, options } from '@aomex/console';
2
2
  import { rule } from '@aomex/core';
3
+ import { cron } from '@aomex/cron';
4
+ import timers from 'node:timers/promises';
3
5
 
4
6
  export const commander = new Commander();
5
7
 
6
- // npx aomex hello
7
- // npx aomex hello --user World
8
- // npx aomex hello -u aomex.js
8
+ /**
9
+ * 指令示例
10
+ *
11
+ * npx aomex hello
12
+ * npx aomex hello --user World
13
+ * npx aomex hello -u aomex.js
14
+ */
9
15
  commander.create('hello', {
10
16
  mount: [
11
17
  options(
@@ -22,3 +28,30 @@ commander.create('hello', {
22
28
  console.log(`Hello ${user}`);
23
29
  },
24
30
  });
31
+
32
+ /**
33
+ * 定时任务示例
34
+ *
35
+ * npx aomex cron:start 启动
36
+ * npx aomex cron:stop 结束
37
+ * npx aomex cron:stats 运行状态
38
+ * npx aomex cron:eject 查看列表
39
+ */
40
+ commander.create('hello:cron', {
41
+ docs: {
42
+ summary: '执行 npx aomex -h 可以看到我',
43
+ description: '执行 npx aomex hello:cron -h 可以看到我',
44
+ },
45
+ mount: [
46
+ // cron({ second: '*/15' }),
47
+ cron({ minute: '*', args: ['--user', 'Boss'] }),
48
+ options({
49
+ user: rule.string().default('World'),
50
+ }),
51
+ ],
52
+ action: async (ctx) => {
53
+ const { user } = ctx.options;
54
+ console.log(`Hello ${user}`);
55
+ await timers.setTimeout(5_000);
56
+ },
57
+ });
@@ -7,7 +7,7 @@ export const zh = I18n.define({
7
7
  plural: {
8
8
  '1': '这是你第一次访问',
9
9
  '2-4': '你表现的很熟练',
10
- 'n': '你是个老司机',
10
+ '5-n': '去看看其他功能吧',
11
11
  },
12
12
  },
13
13
  }),
@@ -14,6 +14,7 @@ router.get('/', {
14
14
  id: rule.int(),
15
15
  name: rule.string(),
16
16
  age: rule.int(),
17
+ address: rule.string().nullable(),
17
18
  }),
18
19
  }),
19
20
  ],
@@ -34,6 +35,7 @@ router.get('/:id', {
34
35
  id: rule.int(),
35
36
  name: rule.string(),
36
37
  age: rule.int(),
38
+ address: rule.string().nullable(),
37
39
  },
38
40
  }),
39
41
  response({
@@ -56,14 +58,14 @@ router.post('/', {
56
58
  body({
57
59
  name: rule.string(),
58
60
  age: rule.number(),
61
+ address: rule.string().optional(),
59
62
  }),
60
63
  response({
61
64
  statusCode: 201,
62
65
  }),
63
66
  ],
64
67
  action: async (ctx) => {
65
- const { name, age } = ctx.body;
66
- await services.user.createUser(name, age);
68
+ await services.user.createUser(ctx.body);
67
69
  ctx.send(201, null);
68
70
  },
69
71
  });
@@ -4,7 +4,7 @@ import { Prisma } from '@prisma/client';
4
4
  import { traceMethod } from '@aomex/async-trace';
5
5
 
6
6
  export class UserService extends Service {
7
- @traceMethod('User.findAll')
7
+ @traceMethod()
8
8
  async findAll() {
9
9
  return prisma.user.findMany({
10
10
  orderBy: [
@@ -20,12 +20,9 @@ export class UserService extends Service {
20
20
  return prisma.user.findUnique({ where: { id: userId } });
21
21
  }
22
22
 
23
- async createUser(name: string, age: number) {
23
+ async createUser(data: Prisma.UserCreateArgs['data']) {
24
24
  await prisma.user.create({
25
- data: {
26
- name,
27
- age,
28
- },
25
+ data: data,
29
26
  });
30
27
  }
31
28
  }
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env sh
2
-
3
- set -ex
4
-
5
- sudo docker build --tag {{projectName}}:integration --file Dockerfile.integration .
6
-
7
- cron_container_name={{projectName}}-cron-integration
8
- container_exist=$(sudo docker ps | { grep $cron_container_name || :; })
9
- if [ -n "$container_exist" ];
10
- then
11
- sudo docker exec it $cron_container_name /bin/sh -c "npx aomex cron:stop"
12
- fi
13
-
14
- sudo docker compose --file docker-compose-integration.yml up -d --timeout=1
@@ -1,31 +0,0 @@
1
- import { Commander, options } from '@aomex/console';
2
- import { rule } from '@aomex/core';
3
- import { cron } from '@aomex/cron';
4
-
5
- export const commander = new Commander();
6
-
7
- commander.create('schedule', {
8
- docs: {
9
- summary: '执行 npx aomex -h 可以看到我',
10
- description: '执行 npx aomex schedule -h 可以看到我',
11
- },
12
- mount: [
13
- // cron({
14
- // second: '*/15',
15
- // }),
16
- cron({
17
- minute: '*/2',
18
- args: ['--user', 'Boss'],
19
- }),
20
- options({
21
- user: rule.string().default('World'),
22
- }),
23
- ],
24
- action: async (ctx) => {
25
- const { user } = ctx.options;
26
- console.log(`Hello ${user}`);
27
- await new Promise((resolve) => {
28
- setTimeout(resolve, 5_000);
29
- });
30
- },
31
- });
File without changes