Browse Source

feat: add create command

zhangyuhan 3 years ago
parent
commit
7e6ca6f7af
8 changed files with 94 additions and 45 deletions
  1. 0 3
      bin/dev
  2. 4 2
      package.json
  3. 37 0
      src/commands/create/index.ts
  4. 9 14
      src/commands/init/index.ts
  5. 0 15
      src/global.d.ts
  6. 0 2
      src/index.ts
  7. 20 0
      src/template.ts
  8. 24 9
      yarn.lock

+ 0 - 3
bin/dev

@@ -4,13 +4,10 @@ const oclif = require('@oclif/core')
 
 const path = require('path')
 const project = path.join(__dirname, '..', 'tsconfig.json')
-const TEMPLATES = require(path.join(__dirname, '..', '.template.json'))
 
 // In dev mode -> use ts-node and dev plugins
 process.env.NODE_ENV = 'development'
 
-global.TEMPLATES = TEMPLATES
-
 require('ts-node').register({project})
 
 // In dev mode, always show stack traces

+ 4 - 2
package.json

@@ -20,15 +20,17 @@
     "/oclif.manifest.json"
   ],
   "dependencies": {
-    "@jianyu/dl-template": "^0.2.1",
+    "@jianyu/dl-template": "^0.2.2",
     "@oclif/core": "^1",
     "@oclif/plugin-help": "^5",
     "@oclif/plugin-plugins": "^2.0.1",
-    "@oclif/plugin-update": "^3.0.0"
+    "@oclif/plugin-update": "^3.0.0",
+    "inquirer": "^8.2.1"
   },
   "devDependencies": {
     "@oclif/test": "^2",
     "@types/chai": "^4",
+    "@types/inquirer": "^8.2.1",
     "@types/mocha": "^9.0.0",
     "@types/node": "^16.9.4",
     "chai": "^4",

+ 37 - 0
src/commands/create/index.ts

@@ -0,0 +1,37 @@
+import { Command } from '@oclif/core'
+import { TEMPLATES, TemplateNames } from "../../template";
+import * as inquirer from 'inquirer'
+import Init from "../init";
+
+export default class Create extends Command {
+  static description = '创建项目-命令行交互式'
+
+  static examples = [
+    `$ jianyu create`
+  ]
+
+  async run(): Promise<void> {
+    await this.parse(Create)
+
+    const config = await inquirer.prompt([
+      {
+        type: 'input',
+        name: 'name',
+        default: 'new-project',
+        message: '输入项目名称(同时用于目录名)'
+      },
+      {
+        type: 'list',
+        name: 'template',
+        default: TemplateNames[0],
+        choices: TemplateNames.map(v => ({
+          name: `${v}  ${TEMPLATES[v].title}`,
+          value: v
+        })),
+        message: '选择项目模板'
+      }
+    ])
+
+    await Init.run(['-f', config.template, config.name])
+  }
+}

+ 9 - 14
src/commands/init/index.ts

@@ -1,12 +1,8 @@
 import { Command, Flags } from '@oclif/core'
+import { TEMPLATES, TemplateNames } from "../../template";
 import DownloadRemoteProjectTemplate, { FormatParams } from '@jianyu/dl-template'
-import { Templates } from '../../global'
 const path = require('path')
 
-declare global {
-  var TEMPLATES: Templates
-}
-
 export default class Init extends Command {
   static description = '初始化项目'
 
@@ -24,7 +20,7 @@ export default class Init extends Command {
 
   async run(): Promise<void> {
     const { args, flags } = await this.parse(Init)
-    const TemplateNames = Object.keys(TEMPLATES)
+
     const canNext = TemplateNames.includes(flags.from)
 
     if (!canNext) {
@@ -40,16 +36,15 @@ export default class Init extends Command {
       getTransformLinks: (params: FormatParams) => {
         let url = ''
         switch (params.type) {
-        case 'gitlab-jh': {
-          url = `http://192.168.3.207:20080/${params.group}/${params.name}/-/archive/${params.checkout}/${params.name}-${params.checkout}.zip`
-          if (params.path) {
-            url += `?path=${params.path}`
-          }
+          case 'gitlab-jh': {
+            url = `http://192.168.3.207:20080/${params.group}/${params.name}/-/archive/${params.checkout}/${params.name}-${params.checkout}.zip`
+            if (params.path) {
+              url += `?path=${params.path}`
+            }
 
-          break
-        }
+            break
+          }
         }
-
         return url
       },
     })

+ 0 - 15
src/global.d.ts

@@ -1,15 +0,0 @@
-export interface RepoTemplate {
-  title: string
-  'git-server': string
-  repo: string
-  branch?: string
-  assets?: string
-}
-
-export interface Templates {
-  [propName: string]: RepoTemplate
-}
-
-declare global {
-  var TEMPLATES: Templates
-}

+ 0 - 2
src/index.ts

@@ -1,3 +1 @@
-import './global'
-
 export { run } from '@oclif/core'

+ 20 - 0
src/template.ts

@@ -0,0 +1,20 @@
+import * as path from 'path'
+
+export interface RepoTemplate {
+  title: string
+  repo: string
+  assets?: string
+}
+
+export interface Templates {
+  [propName: string]: RepoTemplate
+}
+
+const TEMPLATES: Templates = require(path.resolve(__dirname, '../.template.json'))
+
+const TemplateNames = Object.keys(TEMPLATES)
+
+export {
+  TEMPLATES,
+  TemplateNames
+}

+ 24 - 9
yarn.lock

@@ -275,10 +275,10 @@
   resolved "https://registry.npmmirror.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz"
   integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==
 
-"@jianyu/dl-template@^0.2.1":
-  version "0.2.1"
-  resolved "http://192.168.3.207:4873/@jianyu%2fdl-template/-/dl-template-0.2.1.tgz#3db2f10c3032c2988c48e34a051b1f747c8c0217"
-  integrity sha512-/6GgUusmUpqtSiG30P7zUzlHnEqxATABOuacffwS+miGF6ZFxnIQY/UngApmcm5IGkofp8W6OFPNSUIf1o4ZLg==
+"@jianyu/dl-template@^0.2.2":
+  version "0.2.2"
+  resolved "http://192.168.3.207:4873/@jianyu%2fdl-template/-/dl-template-0.2.2.tgz#11a93b98e650ac1bd70de5320217eeabfb2a7a1d"
+  integrity sha512-oFTV7PXunq0J7PTPk2mpHi5EkC3cDqWcMfjKLdyal0cIqNAChyg0La/h6dBXmgzNQKBm6FE0n2xTWaIWTDuU2w==
   dependencies:
     decompress "^4.2.1"
     i18next "^21.8.14"
@@ -789,6 +789,14 @@
     "@types/minimatch" "*"
     "@types/node" "*"
 
+"@types/inquirer@^8.2.1":
+  version "8.2.1"
+  resolved "http://192.168.3.207:4873/@types%2finquirer/-/inquirer-8.2.1.tgz#28a139be3105a1175e205537e8ac10830e38dbf4"
+  integrity sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw==
+  dependencies:
+    "@types/through" "*"
+    rxjs "^7.2.0"
+
 "@types/json-schema@^7.0.7":
   version "7.0.9"
   resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz"
@@ -831,6 +839,13 @@
   dependencies:
     "@sinonjs/fake-timers" "^7.1.0"
 
+"@types/through@*":
+  version "0.0.30"
+  resolved "http://192.168.3.207:4873/@types%2fthrough/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895"
+  integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==
+  dependencies:
+    "@types/node" "*"
+
 "@types/vinyl@^2.0.4":
   version "2.0.6"
   resolved "https://registry.npmmirror.com/@types/vinyl/-/vinyl-2.0.6.tgz"
@@ -1351,9 +1366,9 @@ camelcase@^6.0.0:
   integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==
 
 caniuse-lite@^1.0.30001280:
-  version "1.0.30001286"
-  resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz"
-  integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==
+  version "1.0.30001367"
+  resolved "http://192.168.3.207:4873/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz"
+  integrity sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==
 
 cardinal@^2.1.1:
   version "2.1.1"
@@ -2962,7 +2977,7 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
   resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-inquirer@^8.0.0, inquirer@^8.2.0:
+inquirer@^8.0.0, inquirer@^8.2.0, inquirer@^8.2.1:
   version "8.2.4"
   resolved "https://registry.npmmirror.com/inquirer/-/inquirer-8.2.4.tgz"
   integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==
@@ -4468,7 +4483,7 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
-rxjs@^7.0.0, rxjs@^7.5.5:
+rxjs@^7.0.0, rxjs@^7.2.0, rxjs@^7.5.5:
   version "7.5.6"
   resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.6.tgz"
   integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==