@yyp92-cli/create 0.1.1 → 0.2.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @yyp92-cli/create
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 实现 create 命令
8
+
3
9
  ## 0.1.1
4
10
 
5
11
  ### Patch Changes
package/dist/index.js CHANGED
@@ -7,9 +7,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { select, input } from '@inquirer/prompts';
10
+ import { select, input, confirm } from '@inquirer/prompts';
11
11
  import os from 'node:os';
12
- // import ora from 'ora';
12
+ import path from 'node:path';
13
+ import fse from 'fs-extra';
14
+ import ora from 'ora';
15
+ import { NpmPackage } from '@yyp92-cli/utils';
16
+ import ejs from 'ejs';
17
+ import { glob } from 'glob';
18
+ function sleep(timeout) {
19
+ return new Promise((resolve => {
20
+ setTimeout(resolve, timeout);
21
+ }));
22
+ }
13
23
  function create() {
14
24
  return __awaiter(this, void 0, void 0, function* () {
15
25
  const projectTemplate = yield select({
@@ -33,17 +43,87 @@ function create() {
33
43
  }
34
44
  ]
35
45
  });
46
+ let layout = null;
47
+ if (projectTemplate.indexOf('-pc') > -1) {
48
+ layout = yield select({
49
+ message: '请选择导航菜单的布局方式',
50
+ choices: [
51
+ {
52
+ name: '左侧',
53
+ value: 'vertical'
54
+ },
55
+ {
56
+ name: '顶部',
57
+ value: 'horizontal'
58
+ }
59
+ ]
60
+ });
61
+ }
62
+ // 为保证 projectName 不能为空,用 while 循环来问
36
63
  let projectName = '';
37
64
  while (!projectName) {
38
65
  projectName = yield input({ message: '请输入项目名' });
39
66
  }
40
- // const pkg = new NpmPackage({
41
- // name: projectTemplate,
42
- // targetPath: path.join(os.homedir(), '.yyp92-cli-tenplate')
43
- // })
44
- console.log(projectTemplate, projectName, os.homedir());
67
+ // 填完项目名之后,如果该目录不为空,可以让用户选择是否清空
68
+ const targetProjectPath = path.join(process.cwd(), projectName);
69
+ if (fse.existsSync(targetProjectPath)) {
70
+ const isEmpty = yield confirm({ message: '该目录不为空,是否清空' });
71
+ if (isEmpty) {
72
+ fse.emptyDirSync(targetProjectPath);
73
+ }
74
+ else {
75
+ process.exit(0);
76
+ }
77
+ }
78
+ // 把它下载到 home 目录的一个临时目录下
79
+ const pkg = new NpmPackage({
80
+ name: projectTemplate,
81
+ targetPath: path.join(os.homedir(), '/.yyp92-cli-template')
82
+ });
83
+ if (!(yield pkg.exists())) {
84
+ const spinner = ora('下载模板中...').start();
85
+ yield sleep(1000);
86
+ yield pkg.install();
87
+ spinner.stop();
88
+ }
89
+ else {
90
+ const spinner = ora('更新模板中...').start();
91
+ yield sleep(1000);
92
+ yield pkg.update();
93
+ spinner.stop();
94
+ }
95
+ // 把下载好的模版复制到目标目录
96
+ const spinner = ora('创建项目中...').start();
97
+ yield sleep(1000);
98
+ const templatePath = path.join(pkg.npmFilePath, 'template');
99
+ const targetPath = path.join(process.cwd(), projectName);
100
+ fse.copySync(templatePath, targetPath);
101
+ // 清除多余的布局文件夹
102
+ if (layout === 'horizontal') {
103
+ const targetDir = path.join(targetPath, '/src/components/layout');
104
+ const targetDir1 = path.join(targetPath, '/src/components/layout-horizontal');
105
+ fse.emptyDirSync(targetDir);
106
+ fse.copySync(targetDir1, targetDir);
107
+ fse.removeSync(targetDir1);
108
+ }
109
+ else if (layout === 'vertical') {
110
+ const targetDir = path.join(targetPath, '/src/components/layout-horizontal');
111
+ fse.removeSync(targetDir);
112
+ }
113
+ spinner.stop();
114
+ // 依次渲染模版,并把渲染结果写到文件里
115
+ const files = yield glob('**', {
116
+ cwd: targetPath,
117
+ nodir: true,
118
+ ignore: 'node_modules/**'
119
+ });
120
+ for (let i = 0; i < files.length; i++) {
121
+ const filePath = path.join(targetPath, files[i]);
122
+ const renderResult = yield ejs.renderFile(filePath, { projectName });
123
+ fse.writeFileSync(filePath, renderResult);
124
+ }
125
+ console.log(`项目创建成功: ${targetPath}`);
45
126
  });
46
127
  }
47
- create();
48
128
  export default create;
49
129
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAC,MAAM,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,yBAAyB;AAEzB,SAAe,MAAM;;QACjB,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC;YACjC,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,8BAA8B;iBACxC;gBACD;oBACI,IAAI,EAAE,iBAAiB;oBACvB,KAAK,EAAE,kCAAkC;iBAC5C;gBACD;oBACI,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,4BAA4B;iBACtC;gBACD;oBACI,IAAI,EAAE,eAAe;oBACrB,KAAK,EAAE,gCAAgC;iBAC1C;aACJ;SACJ,CAAC,CAAA;QAEF,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,OAAM,CAAC,WAAW,EAAE,CAAC;YACjB,WAAW,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,+BAA+B;QAC/B,6BAA6B;QAC7B,iEAAiE;QACjE,KAAK;QAEL,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;IAC3D,CAAC;CAAA;AAED,MAAM,EAAE,CAAC;AAET,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yyp92-cli/create",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -13,8 +13,16 @@
13
13
  "description": "",
14
14
  "dependencies": {
15
15
  "@inquirer/prompts": "^7.8.4",
16
+ "ejs": "^3.1.10",
17
+ "fs-extra": "^11.3.1",
18
+ "glob": "^11.0.3",
19
+ "ora": "^8.2.0",
16
20
  "@yyp92-cli/utils": "0.0.3"
17
21
  },
22
+ "devDependencies": {
23
+ "@types/ejs": "^3.1.5",
24
+ "@types/fs-extra": "^11.0.4"
25
+ },
18
26
  "scripts": {
19
27
  "test": "echo \"Error: no test specified\" && exit 1"
20
28
  }
package/src/index.ts CHANGED
@@ -1,8 +1,17 @@
1
- import {select, input} from '@inquirer/prompts';
1
+ import {select, input, confirm} from '@inquirer/prompts';
2
2
  import os from 'node:os';
3
- import { NpmPackage } from '@yyp92-cli/utils';
4
3
  import path from 'node:path';
4
+ import fse from 'fs-extra'
5
5
  import ora from 'ora';
6
+ import { NpmPackage } from '@yyp92-cli/utils';
7
+ import ejs from 'ejs';
8
+ import { glob } from 'glob';
9
+
10
+ function sleep(timeout: number) {
11
+ return new Promise((resolve => {
12
+ setTimeout(resolve, timeout);
13
+ }));
14
+ }
6
15
 
7
16
  async function create() {
8
17
  const projectTemplate = await select({
@@ -27,19 +36,103 @@ async function create() {
27
36
  ]
28
37
  })
29
38
 
39
+ let layout = null
40
+ if (projectTemplate.indexOf('-pc') > -1) {
41
+ layout = await select({
42
+ message: '请选择导航菜单的布局方式',
43
+ choices: [
44
+ {
45
+ name: '左侧',
46
+ value: 'vertical'
47
+ },
48
+ {
49
+ name: '顶部',
50
+ value: 'horizontal'
51
+ }
52
+ ]
53
+ })
54
+ }
55
+
56
+
57
+ // 为保证 projectName 不能为空,用 while 循环来问
30
58
  let projectName = '';
31
59
  while(!projectName) {
32
60
  projectName = await input({ message: '请输入项目名' });
33
61
  }
34
62
 
63
+
64
+ // 填完项目名之后,如果该目录不为空,可以让用户选择是否清空
65
+ const targetProjectPath = path.join(process.cwd(), projectName)
66
+ if (fse.existsSync(targetProjectPath)) {
67
+ const isEmpty = await confirm({message: '该目录不为空,是否清空'})
68
+
69
+ if (isEmpty) {
70
+ fse.emptyDirSync(targetProjectPath)
71
+ }
72
+ else {
73
+ process.exit(0)
74
+ }
75
+ }
76
+
77
+
78
+ // 把它下载到 home 目录的一个临时目录下
35
79
  const pkg = new NpmPackage({
36
80
  name: projectTemplate,
37
- targetPath: path.join(os.homedir(), '/desktop/.yyp92-cli-tenplate')
81
+ targetPath: path.join(os.homedir(), '/.yyp92-cli-template')
38
82
  })
39
83
 
40
- console.log(projectTemplate, projectName, os.homedir())
41
- }
84
+ if (!await pkg.exists()) {
85
+ const spinner = ora('下载模板中...').start()
86
+ await sleep(1000)
87
+ await pkg.install()
88
+ spinner.stop()
89
+ }
90
+ else {
91
+ const spinner = ora('更新模板中...').start()
92
+ await sleep(1000)
93
+ await pkg.update()
94
+ spinner.stop()
95
+ }
96
+
97
+
98
+ // 把下载好的模版复制到目标目录
99
+ const spinner = ora('创建项目中...').start()
100
+ await sleep(1000)
101
+
102
+ const templatePath = path.join(pkg.npmFilePath, 'template')
103
+ const targetPath = path.join(process.cwd(), projectName)
104
+ fse.copySync(templatePath, targetPath)
105
+
106
+ // 清除多余的布局文件夹
107
+ if (layout === 'horizontal') {
108
+ const targetDir = path.join(targetPath, '/src/components/layout')
109
+ const targetDir1 = path.join(targetPath, '/src/components/layout-horizontal')
110
+ fse.emptyDirSync(targetDir)
111
+ fse.copySync(targetDir1, targetDir)
112
+ fse.removeSync(targetDir1)
113
+ }
114
+ else if (layout === 'vertical') {
115
+ const targetDir = path.join(targetPath, '/src/components/layout-horizontal')
116
+ fse.removeSync(targetDir)
117
+ }
118
+ spinner.stop()
42
119
 
43
- create();
120
+
121
+ // 依次渲染模版,并把渲染结果写到文件里
122
+ const files = await glob('**', {
123
+ cwd: targetPath,
124
+ nodir: true,
125
+ ignore: 'node_modules/**'
126
+ })
127
+
128
+ for (let i = 0; i < files.length; i++) {
129
+ const filePath = path.join(targetPath, files[i])
130
+ const renderResult = await ejs.renderFile(filePath, {projectName})
131
+
132
+ fse.writeFileSync(filePath, renderResult)
133
+ }
134
+
135
+ console.log(`项目创建成功: ${targetPath}`)
136
+ }
44
137
 
45
138
  export default create;
package/tsconfig.json CHANGED
@@ -11,5 +11,8 @@
11
11
  "strict": true,
12
12
  "skipLibCheck": true,
13
13
  "sourceMap": true
14
- }
14
+ },
15
+ "include": [
16
+ "src/**/*"
17
+ ]
15
18
  }