@farris/cli 1.0.27 → 2.0.0-beta.7

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.
Files changed (46) hide show
  1. package/bin/index.js +2 -0
  2. package/lib/commands/build-components.js +36 -0
  3. package/lib/commands/build-css.js +11 -0
  4. package/lib/commands/build-lib.js +16 -0
  5. package/lib/commands/build.js +10 -0
  6. package/lib/commands/create-app.js +54 -0
  7. package/lib/commands/dev-serve.js +23 -0
  8. package/lib/commands/preview-serve.js +16 -0
  9. package/lib/common/constant.js +18 -0
  10. package/lib/common/generate-app.js +44 -0
  11. package/lib/common/get-dependencies.js +9 -0
  12. package/lib/common/get-farris-config.js +11 -0
  13. package/lib/common/get-version.js +6 -0
  14. package/lib/common/get-vite-config.js +38 -0
  15. package/lib/config/vite-app.js +14 -0
  16. package/lib/config/vite-lib.js +35 -0
  17. package/lib/index.js +54 -0
  18. package/lib/plugins/dts.js +8 -0
  19. package/lib/plugins/gen-component-style.js +43 -0
  20. package/lib/plugins/html-system.js +11 -0
  21. package/lib/plugins/replace.js +13 -0
  22. package/package.json +30 -18
  23. package/templates/lib/.eslintrc.cjs +15 -0
  24. package/templates/lib/.prettierrc.json +8 -0
  25. package/templates/lib/farris.config.mjs +35 -0
  26. package/templates/lib/index.html +12 -0
  27. package/templates/lib/package.json +29 -0
  28. package/templates/lib/packages/button/src/index.vue +4 -0
  29. package/templates/lib/packages/index.ts +7 -0
  30. package/templates/lib/src/App.vue +5 -0
  31. package/templates/lib/src/main.ts +9 -0
  32. package/templates/lib/tsconfig.json +18 -0
  33. package/templates/mobile/.eslintrc.cjs +15 -0
  34. package/templates/mobile/.prettierrc.json +8 -0
  35. package/templates/mobile/farris.config.mjs +24 -0
  36. package/templates/mobile/index.html +12 -0
  37. package/templates/mobile/package.json +29 -0
  38. package/templates/mobile/src/App.vue +80 -0
  39. package/templates/mobile/src/components/TheButton.vue +3 -0
  40. package/templates/mobile/src/main.ts +12 -0
  41. package/templates/mobile/src/router/index.ts +23 -0
  42. package/templates/mobile/src/views/AboutView.vue +15 -0
  43. package/templates/mobile/src/views/HomeView.vue +9 -0
  44. package/templates/mobile/tsconfig.json +18 -0
  45. package/README.md +0 -2
  46. package/ci/cli.js +0 -542
package/ci/cli.js DELETED
@@ -1,542 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- 'use strict';
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const log = require("npmlog");
8
- const moment = require("moment");
9
- const childProcess = require("@lerna/child-process");
10
- const { Project } = require("@lerna/project");
11
-
12
-
13
- const yargs = require('yargs/yargs');
14
- const cli = yargs(process.argv.slice(2), process.cwd())
15
-
16
- cli
17
- .command(
18
- 'check',
19
- 'check file changes from last commit.',
20
- (yargs) => {
21
- return yargs;
22
- },
23
- (argv) => {
24
- const projectPath = argv.project;
25
- const lastCommit = getLastCommit();
26
- console.log(`last commit ${lastCommit}`);
27
- checkProjectChanges(projectPath, latestMessage);
28
- }
29
- )
30
- .command(
31
- 'prerelease',
32
- 'Update package prerelease version when package has changed.',
33
- (yargs) => {
34
- return yargs;
35
- },
36
- (argv) => {
37
- // 读取预发布工程路径
38
- const project = argv.project;
39
- // 读取commit url地址
40
- const url = argv.url;
41
- // 读取是否预发布全部工程
42
- const prereleaseAll = argv.all;
43
- if (prereleaseAll) {
44
- console.log('Prerelease all.');
45
- // 发布所有变更的项目
46
- return publish(url, 'prerelease');
47
- } else if (project) {
48
- let chain = Promise.resolve();
49
- const lastCommit = getLastCommit();
50
- console.log(`last commit ${lastCommit}`);
51
- chain = chain.then(() => checkProjectChanges(project, lastCommit));
52
- chain = chain.then((hasChanged) => {
53
- const projectInfo = { 'project': { 'path': project } };
54
- if (hasChanged) {
55
- return updateProjectVersion(projectInfo, 'prerelease')
56
- }
57
- });
58
- } else {
59
- console.log('You must provide param of either --all or --project.')
60
- }
61
- }
62
- )
63
- .command(
64
- 'patch',
65
- 'Update package patch version when package has changed.',
66
- (yargs) => {
67
- return yargs;
68
- },
69
- (argv) => {
70
- const project = argv.project;
71
- const url = argv.url;
72
- const patchAll = argv.all;
73
- if (patchAll) {
74
- return publish(url, 'patch');
75
- } else if (project) {
76
- let chain = Promise.resolve();
77
- const lastCommit = getLastCommit();
78
- console.log(`last commit ${lastCommit}`);
79
- chain = chain.then(() => checkProjectChanges(project, lastCommit));
80
- chain = chain.then((hasChanged) => {
81
- if (hasChanged) {
82
- const projectInfo = { 'project': { 'path': project } };
83
- return updateProjectVersion(projectInfo, 'patch')
84
- }
85
- });
86
- } else {
87
- console.log('You must provide param of either --all or --project.')
88
- }
89
- }
90
- )
91
- .command(
92
- 'publish',
93
- 'Publish package which has changed sence last commit.',
94
- (yargs) => {
95
- return yargs;
96
- },
97
- (argv) => {
98
- const project = argv.project;
99
- let chain = Promise.resolve();
100
- const lastCommit = getLastCommit();
101
- console.log(`last commit ${lastCommit}`);
102
- chain = chain.then(() => checkProjectChanges(project, lastCommit));
103
- chain = chain.then((hasChanged) => {
104
- if (hasChanged) {
105
- return publish(project)
106
- }
107
- });
108
- }
109
- )
110
- .command(
111
- 'publishAll',
112
- 'Publish all packages that have changed sence latst publish.',
113
- (yargs) => {
114
- return yargs;
115
- },
116
- (argv) => {
117
- const projectPath = argv.project;
118
- const url = argv.url;
119
- publishAll(url);
120
- }
121
- )
122
- .argv;
123
-
124
- /**
125
- * @param {import("@lerna/child-process").ExecOpts} execOpts
126
- */
127
- function getLastCommit() {
128
- if (hasTags()) {
129
- console.log("getLastTagInBranch");
130
- return childProcess.execSync("git", ["describe", "--tags", "--abbrev=0"]);
131
- }
132
- console.log("getFirstCommit");
133
- return childProcess.execSync("git", ["rev-list", "--max-parents=0", "HEAD"]);
134
- }
135
-
136
- /**
137
- * @param {import("@lerna/child-process").ExecOpts} opts
138
- */
139
- function hasTags() {
140
- let result = false;
141
- try {
142
- result = !!childProcess.execSync("git", ["tag"]);
143
- } catch (err) {
144
- log.warn("ENOTAGS", "No git tags were reachable from this branch!");
145
- log.verbose("hasTags error", err);
146
- }
147
- log.verbose("hasTags", result);
148
- return result;
149
- }
150
-
151
-
152
- /**
153
- * 检查指定工程目录下是否存在变更文件
154
- * @param {string} projectInfo 目标工程信息
155
- * @param {string} lastCommit 最后提交标识
156
- * @returns 检查结果
157
- */
158
- function checkProjectChanges(projectInfo, lastCommit) {
159
- const projectPath = projectInfo.project.path;
160
- const packageName = projectInfo.package.name || projectPath;
161
- return childProcess
162
- // 使用 git diff 命令查询自上传提交以来,目标工程路径下是否有变更的文件
163
- .exec("git", ["diff", "--name-only", lastCommit, projectPath])
164
- .then((returnValue) => {
165
- // 提取命令输出结果中的文件集合ß
166
- const changedFiles = returnValue.stdout.split("\n").filter(Boolean);
167
- // 根据文件个数确定是否存在变更
168
- const hasChanges = changedFiles.length > 0;
169
- if (hasChanges) {
170
- projectInfo.workspace.hasChanged = hasChanges;
171
- console.log(`${packageName} has changed since latest tag ${lastCommit}.`)
172
- } else {
173
- console.log(`${packageName} has not changed.`)
174
- }
175
- // 返回检测结果
176
- return hasChanges;
177
- });
178
- }
179
-
180
- /**
181
- * 更新指定工程的预发布版本
182
- * @param {string} projectInfo 目标工程信息
183
- * @returns 更新后的版本
184
- */
185
- function updateProjectVersion(projectInfo, updateVersionType) {
186
- let npmCommandArray = [];
187
- const projectPath = projectInfo.project.path;
188
- if (!projectPath) {
189
- throw new Error(`update project version error: you must provide project path by project info object.`)
190
- }
191
- switch (updateVersionType) {
192
- case 'prerelease':
193
- npmCommandArray = ['version', 'prerelease', '--preid=beta', '--prefix', projectPath];
194
- break;
195
- case 'patch':
196
- npmCommandArray = ['version', 'patch', '--prefix', projectPath];
197
- break;
198
- case 'minor':
199
- npmCommandArray = ['version', 'minor', '--prefix', projectPath];
200
- break;
201
- case 'major':
202
- npmCommandArray = ['version', 'major', '--prefix', projectPath];
203
- break;
204
- }
205
- return childProcess
206
- // 使用 npm version prerelease 更新指定工程的预发布版本
207
- .exec('npm', npmCommandArray)
208
- .then((returnValue) => {
209
- // 读取目标工程的package.json文件
210
- const packageJsonFilePath = `${projectPath}/package.json`;
211
- const packageConfig = JSON.parse(fs.readFileSync(packageJsonFilePath, 'utf-8'));
212
- // 提取更新后的版本
213
- const updatedVersion = returnValue.stdout;
214
- console.log(`update ${packageConfig.name} prerelease version to ${updatedVersion}`);
215
- const updateResult = {};
216
- updateResult[packageConfig.name] = updatedVersion;
217
- return updateResult;
218
- })
219
- }
220
-
221
- function updateMonoWorkspaceVersion(monoWorkspace, updateVersionType, commitUrl) {
222
- let npmCommandArray = [];
223
- switch (updateVersionType) {
224
- case 'prerelease':
225
- npmCommandArray = ['version', 'prerelease', '--preid=beta'];
226
- break;
227
- case 'patch':
228
- npmCommandArray = ['version', 'patch'];
229
- break;
230
- case 'minor':
231
- npmCommandArray = ['version', 'minor'];
232
- break;
233
- case 'major':
234
- npmCommandArray = ['version', 'major'];
235
- break;
236
- }
237
- console.log(`executing npm version --${updateVersionType} in root directory.`)
238
- childProcess.execSync('npm', npmCommandArray);
239
- const packageJsonFilePath = `./package.json`;
240
- const packageConfig = JSON.parse(fs.readFileSync(packageJsonFilePath, 'utf-8'));
241
- monoWorkspace.version = packageConfig.version;
242
- // 向git缓冲区中添加变更
243
- childProcess.execSync('git', ['add', '.']);
244
- // 提交变更记录
245
- childProcess.execSync('git', ['commit', '-m', `Update MonoWorkspace version to v${packageConfig.version}. [skip ci]`]);
246
- console.log(`Update MonoWorkspace version to v${packageConfig.version}`);
247
- const branch = childProcess.execSync("git", ["rev-parse", "--abbrev-ref", "HEAD"]);
248
- // 提交变更集
249
- if (commitUrl) {
250
- console.log(`executing git push ${branch} to ${commitUrl}`);
251
- return childProcess.exec("git", ["push", commitUrl]);
252
- } else {
253
- console.log(`executing git push ${branch}`);
254
- return childProcess.exec('git', ['push']);
255
- }
256
- }
257
-
258
- function builderVersionChangeMessage(prefix, updatedVersions, suffix = '') {
259
- const versionMessage = Object.keys(updatedVersions).reduce((latestMessage, packageName, index, originalArray) => {
260
- const version = updatedVersions[packageName];
261
- let message = `${packageName} to ${version}`;
262
- if (index <= originalArray.length - 2) {
263
- message = message + ', ';
264
- }
265
- return latestMessage = latestMessage + message;
266
- }, `${prefix} `)
267
- return `${versionMessage} ${suffix}`;
268
- }
269
-
270
- function commitVersionChanges(updatedVersions, commitUrl, monoWorkspace, updateVersionType) {
271
- const commitMessage = builderVersionChangeMessage('update', updatedVersions, '');
272
- if (commitMessage) {
273
- const updateWorkspaceVersion = ['version', '--force', '--no-git-tag-version', updateVersionType];
274
- if (updateVersionType === 'prerelease') {
275
- updateWorkspaceVersion.push('--preid=beta');
276
- }
277
- // switch (updateVersionType) {
278
- // case 'prerelease':
279
- // updateWorkspaceVersion = ['version', 'prerelease', '--preid=beta', '--force', '--no-git-tag-version'];
280
- // break;
281
- // case 'patch':
282
- // updateWorkspaceVersion = ['version', 'patch', '--force', '--no-git-tag-version'];
283
- // break;
284
- // case 'minor':
285
- // updateWorkspaceVersion = ['version', 'minor', '--force', '--no-git-tag-version'];
286
- // break;
287
- // case 'major':
288
- // updateWorkspaceVersion = ['version', 'major', '--force', '--no-git-tag-version'];
289
- // break;
290
- // }
291
- console.log(`executing npm ${updateWorkspaceVersion.join(' ')} in root directory.`)
292
- childProcess.execSync('npm', updateWorkspaceVersion);
293
-
294
- const packageJsonFilePath = `./package.json`;
295
- const packageConfig = JSON.parse(fs.readFileSync(packageJsonFilePath, 'utf-8'));
296
- monoWorkspace.version = packageConfig.version;
297
-
298
- // 向git缓冲区中添加变更
299
- childProcess.execSync('git', ['add', '.']);
300
- // 提交变更记录
301
- childProcess.execSync('git', ['commit', '-m', `Update workspace version to v${packageConfig.version} for ${commitMessage}. [skip ci]`]);
302
-
303
- // // 向git缓冲区中添加变更
304
- // childProcess.execSync('git', ['add', '.']);
305
- // // // 提交变更记录
306
- // childProcess.execSync('git', ['commit', '-m', `${commitMessage}`]);
307
- const branch = childProcess.execSync("git", ["rev-parse", "--abbrev-ref", "HEAD"]);
308
- // 提交变更集
309
- if (commitUrl) {
310
- console.log(`executing git push ${branch} to ${commitUrl}`);
311
- return childProcess.exec("git", ["push", commitUrl]);
312
- } else {
313
- console.log(`executing git push ${branch}`);
314
- return childProcess.exec('git', ['push']);
315
- }
316
- }
317
- }
318
-
319
- function buildWorkspace(workspace) {
320
- console.log(`executing lerna run build --scope=${workspace.packageName}`)
321
- return childProcess.exec('lerna', ['run', 'build', `--scope=${workspace.packageName}`]);
322
- }
323
-
324
- function addTagToMonoWorkspace(monoWorkspace, commitUrl) {
325
- const monoWorkspaceVersion = monoWorkspace.version;
326
- childProcess.execSync('git', ['tag', monoWorkspaceVersion, '-m', 'Publish npm packages. [skip ci]']);
327
- // 提交变更集
328
- if (commitUrl) {
329
- console.log(`git push --tags ${commitUrl}`);
330
- return childProcess.exec("git", ["push", '--tags', commitUrl]);
331
- } else {
332
- console.log(`git push --tags`);
333
- return childProcess.exec('git', ['push', '--tags',]);
334
- }
335
- }
336
-
337
- /**
338
- * 发布指定路径下的npm包
339
- * @param {string} projectPath 目标工程路径
340
- * @returns 发布结果
341
- */
342
- function publishToNpmRepository(projectPath) {
343
- // 读取目标工程的package.json文件
344
- const ngPackageJsonFilePath = `${projectPath}/ng-package.json`;
345
- const ngPackageConfig = JSON.parse(fs.readFileSync(ngPackageJsonFilePath, 'utf-8'));
346
- const dest = ngPackageConfig.dest;
347
- const packagePath = path.normalize(`${projectPath}/${dest}`);
348
- // 调用 npm publish 发布指定路径下的npm包
349
- return childProcess.exec('npm', ['publish', packagePath])
350
- }
351
-
352
- /**
353
- * 将所有变更发布为新的npm包
354
- * @param {string} commitUrl commit api 地址
355
- */
356
- function publish(commitUrl, updateVersionType) {
357
- // 初始化当前工作目录下的多代码仓库项目
358
- const monoRepoProject = new Project(process.cwd());
359
- let chain = Promise.resolve();
360
- // 1. 提取当前多代码仓库中的所有子项目,创建多项目工作区
361
- chain = chain.then(() => {
362
- // 提取所有子项目
363
- return monoRepoProject.getPackages()
364
- .then(packages => {
365
- // 创建并返回多项目工作区
366
- const monoWorkspace = { packages };
367
- return monoWorkspace;
368
- })
369
- });
370
- // 2. 读取多项目工作区下的Angular工作区和所有Angular项目
371
- chain = chain.then((monoWorkspace) => {
372
- // 提取所有子仓库项目
373
- const packages = monoWorkspace.packages;
374
- // 初始化Angular工作区集合
375
- monoWorkspace.workspaces = [];
376
- // 初始化Angular工程集合
377
- monoWorkspace.projects = [];
378
- // 遍历所有子仓库
379
- packages.forEach(packageJson => {
380
- // 读取Angular工作区路径
381
- const workspacePath = packageJson.location;
382
- // 读取Angular工作区下的angular.json文件内容
383
- const angularJson = readAngularJson(workspacePath)
384
- // 构造Angular工作区
385
- const workspace = readWorkspace(angularJson, packageJson);
386
- // 记录Angular工作区对象
387
- monoWorkspace.workspaces.push(workspace);
388
- // 遍历Angular工作区下的Angular项目,归集到根工作区中
389
- workspace.projects.reduce((monoWorkspace, projectInfo) => {
390
- monoWorkspace.projects.push(projectInfo);
391
- return monoWorkspace;
392
- }, monoWorkspace);
393
- });
394
- return monoWorkspace;
395
- });
396
- // 3. 检查代码提交记录,获取自上次发布以来所有发生变化的Angular工程
397
- chain = chain.then(monoWorkspace => {
398
- const projects = monoWorkspace.projects;
399
- const lastCommit = getLastCommit();
400
- console.log(`last commit ${lastCommit}`);
401
- const checkProjects = projects.map((projectInfo) => {
402
- let checkPromise = checkProjectChanges(projectInfo, lastCommit);
403
- let changedPromise = checkPromise.then(hasChanged => {
404
- projectInfo.hasChanged = hasChanged;
405
- return Promise.resolve(projectInfo);
406
- });
407
- return changedPromise;
408
- });
409
- return Promise.all(checkProjects)
410
- .then((checkResults) => {
411
- monoWorkspace.changedProjects = checkResults.filter((projectInfo) => projectInfo.hasChanged);
412
- return Promise.resolve(monoWorkspace);
413
- });
414
- });
415
- // 4. 更新所有变更项目预发布版本,提交代码仓库,供发布时使用
416
- chain = chain.then(monoWorkspace => {
417
- const changedProjects = monoWorkspace.changedProjects;
418
- const prereleasePromise = changedProjects.map(projectInfo => updateProjectVersion(projectInfo, updateVersionType));
419
- return Promise.all(prereleasePromise)
420
- .then((results) => {
421
- results.reduce((workspace, updateResult) => {
422
- workspace.updateResult = workspace.updateResult || {};
423
- Object.assign(workspace.updateResult, updateResult);
424
- return workspace;
425
- }, monoWorkspace);
426
- const updatedVersions = monoWorkspace.updateResult;
427
- if (updatedVersions) {
428
- return commitVersionChanges(updatedVersions, commitUrl, monoWorkspace, updateVersionType)
429
- // .then((result) => {
430
- // if (result.stderr) {
431
- // console.log(result.stderr);
432
- // }
433
- // if (result.stdout) {
434
- // console.log(result.stdout);
435
- // }
436
- // return updateMonoWorkspaceVersion(monoWorkspace, updateVersionType, commitUrl);
437
- // })
438
- .then((result) => {
439
- if (result.stderr) {
440
- console.log(result.stderr);
441
- }
442
- if (result.stdout) {
443
- console.log(result.stdout);
444
- }
445
- return Promise.resolve(monoWorkspace);
446
- });
447
- } else {
448
- return Promise.resolve(monoWorkspace);
449
- }
450
-
451
- });
452
- });
453
- // 5. 编译所有Angular工作区
454
- chain = chain.then(monoWorkspace => {
455
- const buildPromises = monoWorkspace.workspaces
456
- .filter(workspace => workspace.hasChanged)
457
- .map((workspace) => buildWorkspace(workspace));
458
- if (buildPromises.length) {
459
- return Promise.all(buildPromises)
460
- .then((results) => {
461
- if (results) {
462
- results.map((result) => {
463
- if (result.stderr) {
464
- console.log(result.stderr);
465
- }
466
- if (result.stdout) {
467
- console.log(result.stdout);
468
- }
469
- });
470
- }
471
- return Promise.resolve(monoWorkspace);
472
- });
473
- } else {
474
- return Promise.resolve(monoWorkspace);
475
- }
476
- });
477
- // 6. 将变更项目的内容发布为npm包,并增加发布Tag标签
478
- chain = chain.then(monoWorkspace => {
479
- const changedProjects = monoWorkspace.changedProjects;
480
- if (changedProjects.length) {
481
- const publishPromises = changedProjects.map(projectInfo => publishToNpmRepository(projectInfo.project.path));
482
- Promise.all(publishPromises)
483
- .then(() => {
484
- return addTagToMonoWorkspace(monoWorkspace, commitUrl);
485
- });
486
- } else {
487
- return Promise.resolve(monoWorkspace);
488
- }
489
-
490
- });
491
- }
492
-
493
- function readAngularJson(workspacePath) {
494
- const angularJsonPath = path.normalize(`${workspacePath}/angular.json`);
495
- return JSON.parse(fs.readFileSync(angularJsonPath, 'utf-8'));
496
- }
497
-
498
- function readWorkspace(angularJson, packageJson) {
499
- const projects = angularJson.projects;
500
- const workspacePath = packageJson.location;
501
- const packageName = packageJson.name;
502
- const workspace = {
503
- packageName,
504
- path: workspacePath,
505
- projects: [],
506
- hasChanged: false
507
- };
508
- Object.keys(projects)
509
- .reduce((workspace, projectName) => {
510
- const projectInfo = readProjectInfo(projectName, projects[projectName], workspace);
511
- if (projectInfo) {
512
- workspace.projects.push(projectInfo);
513
- }
514
- return workspace;
515
- }, workspace);
516
- return workspace;
517
- }
518
-
519
- function readProjectInfo(projectName, project, workspace) {
520
- const projectPath = path.normalize(`${workspace.path}/${project.root}`);
521
- const projectType = project.projectType;
522
- if (projectType === 'library') {
523
- const packageJsonPath = path.normalize(`${projectPath}/package.json`);
524
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
525
- const packageName = packageJson.name;
526
- const ngPackagePath = path.normalize(`${projectPath}/ng-package.json`);
527
- const ngPackage = JSON.parse(fs.readFileSync(ngPackagePath, 'utf-8'));
528
- const packagePath = path.normalize(`${projectPath}/${ngPackage.dest}`);
529
- return {
530
- workspace,
531
- project: {
532
- name: projectName,
533
- path: projectPath,
534
- type: projectType
535
- },
536
- package: {
537
- name: packageName,
538
- path: packagePath
539
- }
540
- }
541
- }
542
- }