@deot/dev-cli 1.0.6 → 1.0.8

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.
@@ -0,0 +1,1210 @@
1
+ 'use strict';
2
+
3
+ var commander = require('commander');
4
+ var node_module = require('node:module');
5
+ var chalk = require('chalk');
6
+ var ora = require('ora');
7
+ var devShared = require('@deot/dev-shared');
8
+ var path = require('node:path');
9
+ var fs = require('fs-extra');
10
+ var inquirer = require('inquirer');
11
+ var autocomplete = require('inquirer-autocomplete-prompt');
12
+ var typescript = require('@rollup/plugin-typescript');
13
+ var pluginNodeResolve = require('@rollup/plugin-node-resolve');
14
+ var commonjs = require('@rollup/plugin-commonjs');
15
+ var replace = require('@rollup/plugin-replace');
16
+ var rollup = require('rollup');
17
+ var apiExtractor = require('@microsoft/api-extractor');
18
+ var parser = require('conventional-commits-parser');
19
+ var semver = require('semver');
20
+
21
+ function _interopNamespaceDefault(e) {
22
+ var n = Object.create(null);
23
+ if (e) {
24
+ Object.keys(e).forEach(function (k) {
25
+ if (k !== 'default') {
26
+ var d = Object.getOwnPropertyDescriptor(e, k);
27
+ Object.defineProperty(n, k, d.get ? d : {
28
+ enumerable: true,
29
+ get: function () { return e[k]; }
30
+ });
31
+ }
32
+ });
33
+ }
34
+ n.default = e;
35
+ return Object.freeze(n);
36
+ }
37
+
38
+ var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
39
+
40
+ const cwd = process.cwd();
41
+ const require$$2 = node_module.createRequire(cwd);
42
+ class Shared {
43
+ static config;
44
+ static getNormalizePackage = (dataMap) => {
45
+ Object.keys(dataMap).forEach(packageName => {
46
+ const relations = dataMap[packageName];
47
+ relations.forEach((packageName$) => {
48
+ if (dataMap[packageName$].includes(packageName)) {
49
+ throw new Error(`${packageName} ${packageName$} deps loop`);
50
+ }
51
+ });
52
+ });
53
+ const needUseMap = Object.keys(dataMap).reduce((pre, key) => (pre[key] = 0, pre), {});
54
+ const queue = [];
55
+ for (let key in dataMap) {
56
+ const dependencies = dataMap[key];
57
+ dependencies.forEach((dependency) => {
58
+ needUseMap[dependency] += 1;
59
+ });
60
+ }
61
+ for (let key in needUseMap) {
62
+ if (needUseMap[key] === 0) {
63
+ queue.push(key);
64
+ }
65
+ }
66
+ const result = [];
67
+ while (queue.length > 0) {
68
+ const node = queue.shift();
69
+ if (!node)
70
+ return [];
71
+ result.push(node);
72
+ const dependencies = dataMap[node];
73
+ for (let i = 0; i < dependencies.length; i++) {
74
+ const dependency = dependencies[i];
75
+ needUseMap[dependency] -= 1;
76
+ if (needUseMap[dependency] === 0) {
77
+ queue.push(dependency);
78
+ }
79
+ }
80
+ }
81
+ return result.reverse();
82
+ };
83
+ static getPackageName = (packageFolderName$) => {
84
+ const { workspace, packageFolderName, packageName } = Shared.impl();
85
+ if (!workspace
86
+ || !packageFolderName$
87
+ || packageFolderName$ === packageFolderName) {
88
+ return packageName;
89
+ }
90
+ else {
91
+ return `${packageName}-${packageFolderName$.replace(new RegExp(`${packageName}-?`), '')}`;
92
+ }
93
+ };
94
+ static getPackageFolderName = (packageName$) => {
95
+ const { workspace, packageFolderName, packageName } = Shared.impl();
96
+ if (!workspace)
97
+ return '';
98
+ if (packageName$ === packageName)
99
+ return packageFolderName;
100
+ return packageName$?.replace(new RegExp(`${packageName}-?`), '');
101
+ };
102
+ static impl() {
103
+ if (Shared.config)
104
+ return Shared.config;
105
+ const rootPackageOptions = require$$2(`${cwd}/package.json`);
106
+ let workspace = 'packages';
107
+ let isMonorepo = fs.existsSync(path__namespace.resolve(cwd, workspace));
108
+ workspace = isMonorepo ? workspace : '';
109
+ const packageFolderName = isMonorepo ? 'index' : '';
110
+ const packageDir = path__namespace.resolve(cwd, workspace);
111
+ const packageOptions = require$$2(path__namespace.resolve(packageDir, packageFolderName, 'package.json'));
112
+ const packageName = packageOptions.name;
113
+ const packageVersion = packageOptions.version;
114
+ const packageFolderNames = !isMonorepo ? [] : fs
115
+ .readdirSync(packageDir)
116
+ .reduce((pre, file) => {
117
+ const fullpath = path__namespace.resolve(packageDir, file);
118
+ const stat = fs.statSync(fullpath);
119
+ if (!(/(^_|tpl)/.test(file))
120
+ && stat.isDirectory()) {
121
+ pre.push(file);
122
+ }
123
+ return pre;
124
+ }, []);
125
+ const packageOptionsMap = packageFolderNames.reduce((pre, packageFolderName$) => {
126
+ pre[packageFolderName$] = require$$2(path__namespace.resolve(packageDir, packageFolderName$, 'package.json'));
127
+ return pre;
128
+ }, {});
129
+ const packageDirsMap = packageFolderNames.reduce((pre, packageFolderName$) => {
130
+ pre[packageFolderName$] = path__namespace.resolve(packageDir, packageFolderName$);
131
+ return pre;
132
+ }, {});
133
+ const packageRelation = packageFolderNames.reduce((pre, packageFolderName$) => {
134
+ let packagesOptions = packageOptionsMap[packageFolderName$];
135
+ let deps = {
136
+ ...(packagesOptions.dependencies || {}),
137
+ ...(packagesOptions.devDependencies || {}),
138
+ };
139
+ pre[packagesOptions.name] = Object.keys(deps).filter(i => new RegExp(`${packageName}`).test(i));
140
+ return pre;
141
+ }, {});
142
+ const normalizePackageNames = Shared.getNormalizePackage(packageRelation);
143
+ const normalizePackageFolderNames = normalizePackageNames
144
+ .map(i => i.replace(new RegExp(`${packageName}-?`), '') || packageFolderName);
145
+ const homepage = (rootPackageOptions.repository || packageOptions.repository || {}).url || '';
146
+ const config = {
147
+ cwd,
148
+ workspace,
149
+ homepage: homepage.replace(/(.*)(https?:\/\/.*)(#|\.git)/, '$2'),
150
+ packageFolderName,
151
+ packageDir,
152
+ packageOptions,
153
+ packageName,
154
+ packageVersion,
155
+ packageFolderNames,
156
+ packageOptionsMap,
157
+ packageDirsMap,
158
+ packageRelation,
159
+ normalizePackageNames,
160
+ normalizePackageFolderNames
161
+ };
162
+ Shared.config = config;
163
+ return config;
164
+ }
165
+ }
166
+
167
+ const run$5 = (options) => devShared.Utils.autoCatch(async () => {
168
+ const locals = Shared.impl();
169
+ const { workspace, packageFolderNames } = locals;
170
+ if (!workspace) {
171
+ return devShared.Logger.log(`<link> Monorepo Supported Only.`);
172
+ }
173
+ if (typeof options.dryRun === 'undefined') {
174
+ options.dryRun = process.env.NODE_ENV === 'UNIT';
175
+ }
176
+ const command = `npx pnpm link ./${workspace}/`;
177
+ if (options.dryRun)
178
+ return devShared.Shell.spawn(`echo ${command}`);
179
+ const spinner = ora(`Links ...\n`);
180
+ spinner.start();
181
+ await Promise.all(packageFolderNames.map(i => {
182
+ return devShared.Shell.spawn(`${command}${i}`);
183
+ }));
184
+ spinner.stop();
185
+ devShared.Logger.log(`${chalk.green('Links Success')}`);
186
+ });
187
+
188
+ const { prompt: prompt$2, registerPrompt: registerPrompt$1, Separator } = inquirer;
189
+ const getOptions$1 = async () => {
190
+ const { packageFolderNames } = Shared.impl();
191
+ const question = [
192
+ {
193
+ type: 'list',
194
+ name: 'mode',
195
+ message: 'Select Mode:',
196
+ choices: [
197
+ new Separator('选择添加的类型:'),
198
+ 'dependent',
199
+ 'package'
200
+ ],
201
+ default: 'package'
202
+ },
203
+ {
204
+ type: 'autocomplete',
205
+ message: 'Select Package To Install:',
206
+ when: (answers) => answers.mode === 'dependent',
207
+ name: 'packageFolderName',
208
+ default: 'index',
209
+ source: (_, input) => {
210
+ input = input || '';
211
+ return new Promise(($resolve => {
212
+ let filter = input
213
+ ? packageFolderNames.filter(item => item.includes(input))
214
+ : packageFolderNames;
215
+ $resolve(filter);
216
+ }));
217
+ }
218
+ },
219
+ {
220
+ type: 'input',
221
+ name: 'dependentName',
222
+ message: 'Input Dependent Name',
223
+ default: '',
224
+ when: (answers) => answers.mode === 'dependent',
225
+ validate: (answer) => {
226
+ if (!answer) {
227
+ return '请输入需要添加的模块名';
228
+ }
229
+ return true;
230
+ }
231
+ },
232
+ {
233
+ type: 'list',
234
+ name: 'args',
235
+ when: (answers) => answers.mode === 'dependent',
236
+ message: 'Select Install Mode:',
237
+ choices: [
238
+ '-S',
239
+ '-D',
240
+ '-O'
241
+ ]
242
+ },
243
+ {
244
+ type: 'input',
245
+ name: 'packageFolderName',
246
+ message: 'Input Package Name',
247
+ default: '',
248
+ when: (answers) => answers.mode === 'package',
249
+ validate: (answer) => {
250
+ if (!answer) {
251
+ return '请输入需要添加的包名';
252
+ }
253
+ if (packageFolderNames.includes(answer) || answer === 'dev') {
254
+ return '包名已存在';
255
+ }
256
+ return true;
257
+ }
258
+ }
259
+ ];
260
+ registerPrompt$1('autocomplete', autocomplete);
261
+ let result = await prompt$2(question);
262
+ if (result.mode == 'dependent') {
263
+ result.packageName = Shared.getPackageName(result.packageFolderName);
264
+ }
265
+ if (result.mode == 'package') {
266
+ result.packageName = Shared.getPackageName(result.packageFolderName);
267
+ }
268
+ result.args = [result.args];
269
+ return result;
270
+ };
271
+
272
+ const run$4 = (options) => devShared.Utils.autoCatch(async () => {
273
+ const locals = Shared.impl();
274
+ const { workspace, packageDir } = locals;
275
+ if (!workspace) {
276
+ return devShared.Logger.log(`<add> Monorepo Supported Only.`);
277
+ }
278
+ if (typeof options.dryRun === 'undefined') {
279
+ options.dryRun = process.env.NODE_ENV === 'UNIT';
280
+ }
281
+ const { mode, dependentName, args, packageFolderName, packageName } = await getOptions$1();
282
+ let command = mode === 'dependent'
283
+ ? `npx pnpm add --filter ${packageName} ${dependentName} ${args.join(' ')}`
284
+ : `npx pnpm link ./${workspace}/${packageFolderName}`;
285
+ if (options.dryRun)
286
+ return devShared.Shell.spawn(`echo "${command}"`);
287
+ const spinner = ora(`${command}\n`).start();
288
+ await devShared.Shell.spawn(command);
289
+ spinner.stop();
290
+ if (mode === 'package') {
291
+ let dir = path.resolve(packageDir);
292
+ fs.outputFileSync(`${dir}/${packageFolderName}/README.md`, '// TODO');
293
+ fs.outputFileSync(`${dir}/${packageFolderName}/src/index.ts`, '// TODO');
294
+ fs.outputFileSync(`${dir}/${packageFolderName}/__tests__/index.spec.ts`, '// TODO');
295
+ fs.outputFileSync(`${dir}/${packageFolderName}/package.json`, JSON.stringify({
296
+ name: packageName,
297
+ version: '1.0.0',
298
+ main: 'dist/index.js',
299
+ types: "dist/index.d.ts",
300
+ type: "module",
301
+ files: [
302
+ "dist"
303
+ ],
304
+ license: 'MIT',
305
+ publishConfig: {
306
+ access: 'public'
307
+ },
308
+ dependencies: {}
309
+ }, null, 2));
310
+ fs.outputFileSync(`${dir}/${packageFolderName}/api-extractor.json`, JSON.stringify({
311
+ extends: "../../api-extractor.json",
312
+ mainEntryPointFilePath: `./dist/${workspace}/${packageFolderName}/src/index.d.ts`,
313
+ dtsRollup: {
314
+ publicTrimmedFilePath: "./dist/index.d.ts"
315
+ }
316
+ }, null, 2));
317
+ }
318
+ await devShared.Shell.spawn(command);
319
+ });
320
+
321
+ const ALL_PACKAGE = 'All Packages';
322
+ const { prompt: prompt$1, registerPrompt } = inquirer;
323
+ const getOptions = async () => {
324
+ const isDev = process.env.NODE_ENV === 'development';
325
+ const { packageFolderNames } = Shared.impl();
326
+ const packages$ = [ALL_PACKAGE, ...packageFolderNames];
327
+ const question = [
328
+ {
329
+ type: 'autocomplete',
330
+ message: `Select Package To ${isDev ? 'Develop' : 'Test'}:`,
331
+ name: 'packageFolderName',
332
+ default: 'cli',
333
+ source: (_, input) => {
334
+ input = input || '';
335
+ return new Promise(($resolve => {
336
+ let filter = input
337
+ ? packages$.filter(item => item.includes(input))
338
+ : packages$;
339
+ $resolve(filter);
340
+ }));
341
+ }
342
+ },
343
+ {
344
+ type: 'confirm',
345
+ message: 'Watch Mode?',
346
+ name: 'watch',
347
+ when: () => !isDev,
348
+ default: (answers) => {
349
+ return answers.packageFolderName !== ALL_PACKAGE;
350
+ }
351
+ }
352
+ ];
353
+ registerPrompt('autocomplete', autocomplete);
354
+ let result = await prompt$1(question);
355
+ result.packageFolderName = result.packageFolderName == ALL_PACKAGE
356
+ ? undefined
357
+ : result.packageFolderName;
358
+ result.watch = result.watch || isDev;
359
+ return result;
360
+ };
361
+
362
+ const run$3 = (options) => devShared.Utils.autoCatch(async () => {
363
+ const locals = Shared.impl();
364
+ if (typeof options.dryRun === 'undefined') {
365
+ options.dryRun = process.env.NODE_ENV === 'UNIT';
366
+ }
367
+ if (locals.workspace && !options.packageName) {
368
+ const promptOptions = await getOptions();
369
+ options = {
370
+ ...options,
371
+ ...promptOptions
372
+ };
373
+ }
374
+ const { cwd, workspace, packageOptionsMap, packageDirsMap } = locals;
375
+ const { packageName, watch, dryRun } = options;
376
+ options.packageFolderName = Shared.getPackageFolderName(options.packageName) || options.packageFolderName;
377
+ options.workspace = workspace;
378
+ const packageOptions = packageOptionsMap[options.packageFolderName];
379
+ const packageDir = packageDirsMap[options.packageFolderName];
380
+ if (workspace
381
+ && cwd !== packageDir
382
+ && packageOptions?.scripts?.['test']) {
383
+ await devShared.Shell.spawn(`npm`, ['run', 'test']);
384
+ return;
385
+ }
386
+ if (!options.packageFolderName)
387
+ delete options.packageFolderName;
388
+ if (!options.workspace)
389
+ delete options.workspace;
390
+ delete options.packageName;
391
+ const command = `cross-env NODE_ENV=${process.env.NODE_ENV || 'TEST'} TEST_OPTIONS=${encodeURIComponent(JSON.stringify(options))} jest `
392
+ + ([
393
+ '--passWithNoTests',
394
+ `${watch ? '--watchAll' : ''}`
395
+ ].join(' '));
396
+ if (dryRun)
397
+ return devShared.Shell.spawn(`echo ${command}`);
398
+ await devShared.Shell.spawn(command);
399
+ if (!watch)
400
+ return;
401
+ devShared.Logger.log(packageName || '', '测试已通过');
402
+ }, {
403
+ onError: (e) => {
404
+ if (typeof e === 'number' && e === 1) {
405
+ devShared.Logger.error('测试未通过');
406
+ }
407
+ else {
408
+ devShared.Logger.error(e);
409
+ }
410
+ process.exit(1);
411
+ }
412
+ });
413
+
414
+ const run$2 = (options) => devShared.Utils.autoCatch(async () => {
415
+ const locals = Shared.impl();
416
+ if (typeof options.dryRun === 'undefined') {
417
+ options.dryRun = process.env.NODE_ENV === 'UNIT';
418
+ }
419
+ if (options.dryRun)
420
+ return devShared.Shell.spawn(`echo development`);
421
+ const { cwd, workspace, packageOptionsMap, packageDirsMap } = locals;
422
+ const { packageName } = options;
423
+ const getPackageFolderName = Shared.getPackageFolderName(packageName);
424
+ const packageOptions = packageOptionsMap[getPackageFolderName];
425
+ const packageDir = packageDirsMap[getPackageFolderName];
426
+ options.watch = true;
427
+ if (!workspace
428
+ && packageName
429
+ && packageName !== '**'
430
+ && cwd !== packageDir
431
+ && packageOptions?.scripts?.['dev']) {
432
+ await devShared.Shell.spawn(`npm`, ['run', 'dev']);
433
+ return;
434
+ }
435
+ await devShared.Shell.spawn(`cross-env`, [
436
+ 'NODE_ENV=development',
437
+ 'npm',
438
+ 'run',
439
+ 'test',
440
+ '--',
441
+ packageName ? `--package-name ${packageName}` : ''
442
+ ]);
443
+ });
444
+
445
+ const require$$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (document.currentScript && document.currentScript.src || new URL('index.cjs.js', document.baseURI).href)));
446
+ class Builder {
447
+ packageDir;
448
+ packageName;
449
+ packageOptions;
450
+ config;
451
+ commandOptions;
452
+ constructor(config, commandOptions) {
453
+ const { workspace, packageDir, packageName } = Shared.impl();
454
+ if (typeof config === 'string') {
455
+ let packageFolderName = config;
456
+ let packageDir$ = path__namespace.resolve(packageDir, packageFolderName);
457
+ config = {
458
+ dir: packageDir$,
459
+ name: packageFolderName || 'index',
460
+ input: packageDir$ + '/src/index.ts',
461
+ output: [
462
+ {
463
+ file: packageDir$ + '/dist/index.es.js',
464
+ format: 'es',
465
+ exports: 'named',
466
+ sourcemap: false
467
+ },
468
+ {
469
+ file: packageDir$ + '/dist/index.iife.js',
470
+ format: 'iife',
471
+ name: packageName,
472
+ },
473
+ {
474
+ file: packageDir$ + '/dist/index.cjs.js',
475
+ format: 'cjs'
476
+ }
477
+ ].filter(i => {
478
+ return commandOptions.output.includes(i.format);
479
+ })
480
+ };
481
+ }
482
+ this.packageDir = path__namespace.resolve(packageDir, workspace ? `./${config.name}` : '');
483
+ this.packageName = config.name === 'index'
484
+ ? packageName
485
+ : `${packageName}-${config.name}`;
486
+ this.packageOptions = require$$1(`${this.packageDir}/package.json`);
487
+ this.config = config;
488
+ this.commandOptions = commandOptions;
489
+ }
490
+ async process() {
491
+ const { cwd, workspace } = Shared.impl();
492
+ const { packageOptions, packageName, packageDir } = this;
493
+ if (workspace
494
+ && packageOptions?.scripts?.build
495
+ && packageDir !== cwd) {
496
+ await devShared.Shell.spawn(`npm`, ['run', 'build'], {
497
+ cwd: packageDir
498
+ });
499
+ return;
500
+ }
501
+ const spinner = ora(`${packageName} Build ...`);
502
+ try {
503
+ spinner.start();
504
+ await fs.emptyDir(`${packageDir}/dist`);
505
+ const stats = await this.buildSources();
506
+ await this.buildTypes();
507
+ spinner.stop();
508
+ devShared.Logger.log(`${chalk.cyan(`${packageName}`)}: ${chalk.green('Success')}`);
509
+ stats.forEach((stat) => {
510
+ devShared.Logger.log(`${chalk.green(stat.format.toUpperCase())}: ${devShared.Utils.formatBytes(stat.size)}`);
511
+ });
512
+ }
513
+ catch (e) {
514
+ devShared.Logger.log('Error!', e);
515
+ throw e;
516
+ }
517
+ }
518
+ async buildSources() {
519
+ const { workspace } = Shared.impl();
520
+ const { name, input, output } = this.config;
521
+ const { packageOptions } = this;
522
+ const external = Object
523
+ .keys({
524
+ ...packageOptions.dependencies,
525
+ ...packageOptions.peerDependencies
526
+ })
527
+ .map(i => new RegExp(`^${i}$`));
528
+ const source = workspace ? `${workspace}/${name}/**/*` : 'src/**/*';
529
+ const shims = workspace ? `${workspace}/shims.d.ts` : 'shims.d.ts';
530
+ const outDir = workspace ? `${workspace}/${name}/dist` : 'dist';
531
+ const builder = await rollup.rollup({
532
+ input,
533
+ external: [
534
+ /^node:/,
535
+ /^[a-zA-Z@]/,
536
+ ...external
537
+ ],
538
+ plugins: [
539
+ typescript({
540
+ include: [source, shims],
541
+ exclude: ['dist'],
542
+ compilerOptions: {
543
+ rootDir: '.',
544
+ outDir,
545
+ declaration: true
546
+ }
547
+ }),
548
+ commonjs({ extensions: ['.js', '.ts'] }),
549
+ pluginNodeResolve.nodeResolve(),
550
+ replace({
551
+ '1.0.6': `'${packageOptions.version}'`,
552
+ false: 'false',
553
+ true: true
554
+ })
555
+ ]
556
+ });
557
+ await Promise.all(output.map(builder.write));
558
+ const stats = [];
559
+ await output.reduce((pre, cur, index) => {
560
+ pre
561
+ .then(() => fs.stat(cur.file))
562
+ .then((stat) => {
563
+ stats[index] = {
564
+ format: cur.format,
565
+ size: stat.size
566
+ };
567
+ });
568
+ return pre;
569
+ }, Promise.resolve());
570
+ return stats;
571
+ }
572
+ async buildTypes() {
573
+ const { workspace } = Shared.impl();
574
+ const { packageDir, packageOptions } = this;
575
+ if (workspace && packageOptions?.scripts?.['build:types']) {
576
+ await devShared.Shell.spawn(`npm`, ['run', 'build:types'], {
577
+ cwd: packageDir
578
+ });
579
+ return;
580
+ }
581
+ const config = path__namespace.resolve(packageDir, `api-extractor.json`);
582
+ if (fs.existsSync(config)) {
583
+ const result = apiExtractor.Extractor.invoke(apiExtractor.ExtractorConfig.loadFileAndPrepare(config), {
584
+ localBuild: true,
585
+ showVerboseMessages: false
586
+ });
587
+ if (!result.succeeded) {
588
+ devShared.Logger.error(`API Extractor completed with ${result.errorCount} errors and ${result.warningCount} warnings`);
589
+ process.exitCode = 1;
590
+ }
591
+ }
592
+ await fs.remove(`${packageDir}/dist/${workspace || 'src'}`);
593
+ }
594
+ }
595
+ const builder = (options, commandOptions) => {
596
+ return new Builder(options, commandOptions);
597
+ };
598
+
599
+ const run$1 = (options) => devShared.Utils.autoCatch(async () => {
600
+ const locals = Shared.impl();
601
+ if (typeof options.dryRun === 'undefined') {
602
+ options.dryRun = process.env.NODE_ENV === 'UNIT';
603
+ }
604
+ const { normalizePackageFolderNames } = Shared.impl();
605
+ let packageFolderName = Shared.getPackageFolderName(options.packageName || '**');
606
+ let inputs = [];
607
+ if (locals.workspace && packageFolderName === '**') {
608
+ inputs = normalizePackageFolderNames;
609
+ }
610
+ else {
611
+ inputs = [packageFolderName];
612
+ }
613
+ if (options.dryRun)
614
+ return devShared.Shell.spawn(`echo ${inputs.join(' ')}`);
615
+ await inputs
616
+ .reduce((preProcess, packageFolderName$) => {
617
+ preProcess = preProcess.then(() => builder(packageFolderName$, options).process());
618
+ return preProcess;
619
+ }, Promise.resolve());
620
+ }, {
621
+ onError: (e) => {
622
+ if (typeof e === 'number' && e === 1) {
623
+ devShared.Logger.error('编译未通过');
624
+ }
625
+ else {
626
+ devShared.Logger.error(e);
627
+ }
628
+ process.exit(1);
629
+ }
630
+ });
631
+
632
+ const require$ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (document.currentScript && document.currentScript.src || new URL('index.cjs.js', document.baseURI).href)));
633
+ const { prompt } = inquirer;
634
+ const HASH = '-hash-';
635
+ const SUFFIX = '🐒💨🙊';
636
+ const parserOptions = {
637
+ noteKeywords: ['BREAKING CHANGE', 'Breaking Change']
638
+ };
639
+ const reBreaking = new RegExp(`(${parserOptions.noteKeywords.join(')|(')})`);
640
+ class Releaser {
641
+ packageDir;
642
+ packageName;
643
+ packageFolderName;
644
+ packageOptions;
645
+ packageRelation;
646
+ config;
647
+ changeLog;
648
+ version;
649
+ commits;
650
+ commandOptions;
651
+ constructor(config, commandOptions) {
652
+ const { packageDir, packageRelation } = Shared.impl();
653
+ if (typeof config === 'string') {
654
+ let packageFolderName = config;
655
+ let packageDir$ = path__namespace.resolve(packageDir, packageFolderName);
656
+ config = {
657
+ dir: packageDir$,
658
+ name: packageFolderName
659
+ };
660
+ }
661
+ this.packageDir = config.dir;
662
+ this.packageName = Shared.getPackageName(config.name);
663
+ this.packageFolderName = config.name;
664
+ this.packageOptions = require$(`${this.packageDir}/package.json`);
665
+ this.packageRelation = packageRelation[this.packageName] || [];
666
+ this.config = config;
667
+ this.commits = [];
668
+ this.changeLog = '';
669
+ this.version = '';
670
+ this.commandOptions = commandOptions;
671
+ }
672
+ async parseCommits() {
673
+ const { workspace } = Shared.impl();
674
+ const { packageFolderName, packageName, commandOptions } = this;
675
+ let params = ['tag', '--list', `'${packageName}@*'`, '--sort', '-v:refname'];
676
+ const { stdout: tags } = await devShared.Shell.exec('git', params);
677
+ const [latestTag] = tags.split('\n');
678
+ devShared.Logger.log(chalk.yellow(`Last Release Tag`) + `: ${latestTag || '<none>'}`);
679
+ params = ['--no-pager', 'log', `${latestTag}..HEAD`, `--format=%B%n${HASH}%n%H${SUFFIX}`];
680
+ let { stdout } = await devShared.Shell.exec('git', params);
681
+ let skipGetLog = false;
682
+ if (latestTag) {
683
+ const log1 = await devShared.Shell.exec('git', ['rev-parse', latestTag]);
684
+ const log2 = await devShared.Shell.exec('git', ['--no-pager', 'log', '-1', '--format=%H']);
685
+ if (log1.stdout === log2.stdout) {
686
+ skipGetLog = true;
687
+ }
688
+ }
689
+ if (!skipGetLog && !stdout) {
690
+ if (latestTag) {
691
+ params.splice(2, 1, `${latestTag}`);
692
+ }
693
+ else {
694
+ params.splice(2, 1, 'HEAD');
695
+ }
696
+ ({ stdout } = await devShared.Shell.exec('git', params));
697
+ }
698
+ const allowTypes = ['feat', `fix`, `break change`, `style`, `perf`, `types`, `refactor`, `chore`];
699
+ const rePlugin = new RegExp(`^(${allowTypes.join('|')})${workspace ? `\\(${packageFolderName}\\)` : '(\\(.+\\))?'}: .*`, 'i');
700
+ const allCommits = stdout.split(SUFFIX);
701
+ const commits = allCommits
702
+ .filter((commit) => {
703
+ const chunk = commit.trim();
704
+ return chunk && rePlugin.test(chunk);
705
+ })
706
+ .map((commit) => {
707
+ const node = parser.sync(commit);
708
+ const body = (node.body || node.footer);
709
+ if (!node.type)
710
+ node.type = parser.sync(node.header?.replace(/\(.+\)!?:/, ':') || '').type;
711
+ if (!node.hash)
712
+ node.hash = commit.split(HASH).pop()?.trim();
713
+ node.breaking = reBreaking.test(body) || /!:/.test(node.header);
714
+ node.effect = false;
715
+ node.custom = false;
716
+ return node;
717
+ });
718
+ if (!commits.length) {
719
+ devShared.Logger.log(chalk.red(`No Commits Found.`));
720
+ }
721
+ else {
722
+ devShared.Logger.log(chalk.yellow(`Found `)
723
+ + chalk.bold(`${allCommits.length}`)
724
+ + ` Commits, `
725
+ + chalk.bold(`${commits.length}`)
726
+ + ' Commits Valid');
727
+ }
728
+ const { skipUpdatePackage } = commandOptions;
729
+ if (commits.length && skipUpdatePackage) {
730
+ let skip = false;
731
+ if (typeof skipUpdatePackage === 'boolean' && skipUpdatePackage) {
732
+ let result = await prompt([
733
+ {
734
+ type: 'confirm',
735
+ name: 'skip',
736
+ message: `Skip Update(${this.packageName}@${this.packageOptions.version}):`,
737
+ default: true
738
+ }
739
+ ]);
740
+ skip = result.skip;
741
+ }
742
+ else if (typeof skipUpdatePackage === 'string'
743
+ && (skipUpdatePackage === '**'
744
+ || skipUpdatePackage.split(',').includes(this.packageName))) {
745
+ skip = true;
746
+ }
747
+ if (skip) {
748
+ devShared.Logger.log(chalk.red(`Skipping Update\n`));
749
+ return;
750
+ }
751
+ }
752
+ await this.updateVersion();
753
+ await this.updateCommits(commits);
754
+ const { forceUpdatePackage } = commandOptions;
755
+ if (!commits.length && forceUpdatePackage) {
756
+ let force = false;
757
+ if (typeof forceUpdatePackage === 'boolean' && forceUpdatePackage) {
758
+ let result = await prompt([
759
+ {
760
+ type: 'confirm',
761
+ name: 'force',
762
+ message: `Force Update(${this.packageName}@${this.packageOptions.version}):`,
763
+ default: true
764
+ }
765
+ ]);
766
+ force = result.force;
767
+ }
768
+ else if (typeof forceUpdatePackage === 'string'
769
+ && (forceUpdatePackage === '**'
770
+ || forceUpdatePackage.split(',').includes(this.packageName))) {
771
+ force = true;
772
+ }
773
+ if (force) {
774
+ const oldVersion = this.packageOptions.version;
775
+ const versionChanged = `\`${oldVersion}\` -> \`${this.version}\``;
776
+ this.commits = [
777
+ {
778
+ type: 'chore',
779
+ header: `chore(${this.packageFolderName || 'release'}): force-publish ${versionChanged}`,
780
+ hash: '',
781
+ effect: false,
782
+ breaking: false,
783
+ custom: true
784
+ }
785
+ ];
786
+ this.changeLog = `### Force Update Package\n\n- ${versionChanged}`.trim();
787
+ }
788
+ }
789
+ }
790
+ rebuildChangeLog(commits) {
791
+ const { packageDir } = this;
792
+ const { homepage, workspace } = Shared.impl();
793
+ const logPath = path__namespace.resolve(packageDir, './CHANGELOG.md');
794
+ const logFile = fs.existsSync(logPath) ? fs.readFileSync(logPath, 'utf-8') : '';
795
+ const notes = {
796
+ breaking: [],
797
+ features: [],
798
+ fixes: [],
799
+ updates: []
800
+ };
801
+ const closeRegxp = /\(?(closes? )\(?#((\d+))\)/ig;
802
+ const pullRegxp = /(?<!closes? )\((#(\d+))\)/ig;
803
+ for (const commit of commits) {
804
+ const { effect, breaking, hash, header, type } = commit;
805
+ const ref = !hash || pullRegxp.test(header)
806
+ ? ''
807
+ : ` ([${hash?.substring(0, 7)}](${homepage}/commit/${hash}))`;
808
+ let message = header?.trim();
809
+ if (workspace && !effect) {
810
+ message = message.replace(/\(.+\)!?:/, ':');
811
+ }
812
+ message = message
813
+ .replace(pullRegxp, `[$1](${homepage}/pull/$2)`)
814
+ .replace(closeRegxp, `[$1$2](${homepage}/issues/$2)`) + ref;
815
+ if (breaking) {
816
+ notes.breaking.push(message);
817
+ }
818
+ else if (type === 'fix') {
819
+ notes.fixes.push(message);
820
+ }
821
+ else if (type === 'feat') {
822
+ notes.features.push(message);
823
+ }
824
+ else {
825
+ notes.updates.push(message);
826
+ }
827
+ }
828
+ Object.keys(notes).forEach(i => {
829
+ notes[i] = notes[i].filter((j) => {
830
+ return !logFile.includes(j);
831
+ });
832
+ });
833
+ const parts = [
834
+ notes.breaking.length ? `### Breaking Changes\n\n- ${notes.breaking.join('\n- ')}`.trim() : '',
835
+ notes.fixes.length ? `### Bugfixes\n\n- ${notes.fixes.join('\n- ')}`.trim() : '',
836
+ notes.features.length ? `### Features\n\n- ${notes.features.join('\n- ')}`.trim() : '',
837
+ notes.updates.length ? `### Updates\n\n- ${notes.updates.join('\n- ')}`.trim() : ''
838
+ ].filter(Boolean);
839
+ const newLog = parts.join('\n\n');
840
+ return !parts.length || logFile.includes(newLog)
841
+ ? ''
842
+ : newLog;
843
+ }
844
+ async updateVersion() {
845
+ const { packageOptions, commits, commandOptions } = this;
846
+ const { version } = packageOptions;
847
+ let newVersion = '';
848
+ if (commandOptions.customVersion) {
849
+ newVersion = commandOptions.customVersion;
850
+ if (!(/\d+.\d+.\d+/.test(newVersion)) || version === newVersion) {
851
+ let result = await prompt([
852
+ {
853
+ type: 'input',
854
+ name: 'version',
855
+ message: `Custom Update Version(${this.packageName}@${version}):`,
856
+ default: '',
857
+ validate: (answer) => {
858
+ if (!(/\d+.\d+.\d+/.test(answer))) {
859
+ return 'Version Should Be Like x.x.x';
860
+ }
861
+ if (answer === version) {
862
+ return 'Version Should Be Diff Than Before';
863
+ }
864
+ return true;
865
+ }
866
+ }
867
+ ]);
868
+ newVersion = result.version;
869
+ }
870
+ }
871
+ else {
872
+ const intersection = [
873
+ commandOptions.major && 'major',
874
+ commandOptions.minor && 'minor',
875
+ commandOptions.patch && 'patch'
876
+ ].filter(i => !!i);
877
+ if (intersection.length) {
878
+ newVersion = semver.inc(version, intersection[0]) || '';
879
+ }
880
+ else {
881
+ const types = new Set(commits.map(({ type }) => type));
882
+ const breaking = commits.some((commit) => !!commit.breaking);
883
+ const level = breaking
884
+ ? 'major'
885
+ : types.has('feat')
886
+ ? 'minor'
887
+ : 'patch';
888
+ newVersion = semver.inc(version, level) || '';
889
+ }
890
+ }
891
+ this.version = newVersion;
892
+ }
893
+ isChanged() {
894
+ return !!this.commits.length;
895
+ }
896
+ async updateCommits(commits, source) {
897
+ if (!commits.length)
898
+ return;
899
+ const { packageName } = this;
900
+ const olds = this.commits.map(i => JSON.stringify(i));
901
+ const newCommits = commits
902
+ .filter(i => {
903
+ return !olds.includes(JSON.stringify(i));
904
+ })
905
+ .map(j => {
906
+ return {
907
+ ...j,
908
+ effect: !!source
909
+ };
910
+ });
911
+ if (newCommits.length && this.commits.length) {
912
+ this.commits = this.commits.filter(i => !i.custom);
913
+ }
914
+ const commits$ = this.commits.concat(newCommits);
915
+ if (source) {
916
+ devShared.Logger.log(chalk.magenta(`MERGE COMMITS: `)
917
+ + chalk.bold(`${commits.length}`) + ` Commits. `
918
+ + 'merge ' + chalk.yellow(source) + ' into ' + chalk.green(packageName));
919
+ }
920
+ else {
921
+ devShared.Logger.log(``);
922
+ }
923
+ const changeLog = this.rebuildChangeLog(commits$);
924
+ if (changeLog) {
925
+ this.commits = commits$;
926
+ this.changeLog = changeLog;
927
+ }
928
+ else if (commits.length) {
929
+ devShared.Logger.log(chalk.red(`${commits.length} Commits Already Exists.`));
930
+ }
931
+ }
932
+ async updatePackageOptions(relationVerisons = {}) {
933
+ if (!this.isChanged())
934
+ return;
935
+ const { packageDir, packageOptions, commandOptions } = this;
936
+ const { dependencies, devDependencies } = packageOptions;
937
+ const newVersion = this.version;
938
+ devShared.Logger.log(chalk.yellow(`New Version: `) + `${newVersion}`);
939
+ packageOptions.version = newVersion;
940
+ if (Object.keys(this.packageRelation).length) {
941
+ for (let packageName$ in relationVerisons) {
942
+ let newVersion$ = relationVerisons[packageName$];
943
+ if (dependencies?.[packageName$]) {
944
+ dependencies[packageName$] = newVersion$;
945
+ }
946
+ if (devDependencies?.[packageName$]) {
947
+ devDependencies[packageName$] = newVersion$;
948
+ }
949
+ }
950
+ }
951
+ if (commandOptions.dryRun) {
952
+ devShared.Logger.log(chalk.yellow(`Skipping package.json Update`));
953
+ return;
954
+ }
955
+ devShared.Logger.log(chalk.yellow(`Updating `) + 'package.json');
956
+ fs.outputFileSync(`${packageDir}/package.json`, JSON.stringify(packageOptions, null, 2));
957
+ }
958
+ async updateChangelog() {
959
+ if (!this.isChanged())
960
+ return;
961
+ const { packageName, packageDir, packageOptions, commandOptions } = this;
962
+ const title = `# ${packageName} ChangeLog`;
963
+ const [date] = new Date().toISOString().split('T');
964
+ const logPath = path__namespace.resolve(packageDir, './CHANGELOG.md');
965
+ const logFile = fs.existsSync(logPath) ? fs.readFileSync(logPath, 'utf-8') : '';
966
+ const oldNotes = logFile.startsWith(title) ? logFile.slice(title.length).trim() : logFile;
967
+ const parts = [
968
+ `## v${packageOptions.version}`,
969
+ `_${date}_`,
970
+ this.changeLog
971
+ ].filter(Boolean);
972
+ const newLog = parts.join('\n\n');
973
+ if (commandOptions.dryRun) {
974
+ devShared.Logger.log(chalk.yellow(`New ChangeLog:`) + `\n${newLog}`);
975
+ return;
976
+ }
977
+ devShared.Logger.log(chalk.yellow(`Updating `) + `CHANGELOG.md`);
978
+ let content = [title, newLog, oldNotes].filter(Boolean).join('\n\n');
979
+ if (!content.endsWith('\n'))
980
+ content += '\n';
981
+ fs.writeFileSync(logPath, content, 'utf-8');
982
+ }
983
+ async test() {
984
+ if (!this.isChanged())
985
+ return;
986
+ const { commandOptions } = this;
987
+ if (commandOptions.dryRun) {
988
+ devShared.Logger.log(chalk.yellow('Skipping Test'));
989
+ return;
990
+ }
991
+ else {
992
+ devShared.Logger.log(chalk.yellow('Test...'));
993
+ }
994
+ await devShared.Shell.exec(`npm run test -- --package-name ${this.packageName}`);
995
+ }
996
+ async build() {
997
+ if (!this.isChanged())
998
+ return;
999
+ const { commandOptions } = this;
1000
+ if (commandOptions.dryRun) {
1001
+ devShared.Logger.log(chalk.yellow('Skipping Build'));
1002
+ return;
1003
+ }
1004
+ else {
1005
+ devShared.Logger.log(chalk.yellow('Build...'));
1006
+ }
1007
+ await devShared.Shell.exec(`npm run build -- --package-name ${this.packageName}`);
1008
+ }
1009
+ async publish() {
1010
+ if (!this.isChanged())
1011
+ return;
1012
+ const { commandOptions, packageDir } = this;
1013
+ if (commandOptions.dryRun || !commandOptions.publish) {
1014
+ devShared.Logger.log(chalk.yellow(`Skipping Publish`));
1015
+ return;
1016
+ }
1017
+ devShared.Logger.log(chalk.cyan(`\n Publishing to NPM`));
1018
+ await devShared.Shell.spawn('npm', ['publish', '--no-git-checks', '--access', 'public'], {
1019
+ cwd: packageDir
1020
+ });
1021
+ }
1022
+ async tag() {
1023
+ if (!this.isChanged())
1024
+ return;
1025
+ const { commandOptions, packageDir } = this;
1026
+ const { packageName, packageOptions } = this;
1027
+ if (commandOptions.dryRun || !commandOptions.tag) {
1028
+ devShared.Logger.log(chalk.yellow(`Skipping Git Tag`));
1029
+ return;
1030
+ }
1031
+ const tagName = `${packageName}@${packageOptions.version}`;
1032
+ devShared.Logger.log(chalk.blue(`\n Tagging`) + chalk.grey(`${tagName}`));
1033
+ await devShared.Shell.spawn('git', ['tag', tagName], {
1034
+ cwd: packageDir
1035
+ });
1036
+ }
1037
+ async process() {
1038
+ const { workspace } = Shared.impl();
1039
+ const { packageName, packageDir, packageFolderName } = this;
1040
+ if (!packageDir || !fs.pathExists(packageDir)) {
1041
+ throw new RangeError(`Could not find directory for package: ${packageFolderName}`);
1042
+ }
1043
+ devShared.Logger.log(chalk.cyan(`Releasing ${packageName}`) + ' from ' + chalk.grey(`${workspace}/${packageFolderName}`));
1044
+ await this.parseCommits();
1045
+ return this;
1046
+ }
1047
+ }
1048
+ const releaser = (options, commandOptions) => {
1049
+ return new Releaser(options, commandOptions);
1050
+ };
1051
+
1052
+ const run = (options) => devShared.Utils.autoCatch(async () => {
1053
+ const locals = Shared.impl();
1054
+ if (options.dryRun) {
1055
+ devShared.Logger.log(chalk.magenta(`DRY RUN: `)
1056
+ + 'No files will be modified.');
1057
+ }
1058
+ let inputs = [];
1059
+ if (locals.workspace) {
1060
+ inputs = locals.normalizePackageFolderNames;
1061
+ }
1062
+ else {
1063
+ inputs = [''];
1064
+ }
1065
+ const instances = {};
1066
+ await inputs
1067
+ .reduce((preProcess, packageFolderName) => {
1068
+ preProcess = preProcess
1069
+ .then(() => releaser(packageFolderName, options).process())
1070
+ .then((instance) => {
1071
+ instances[packageFolderName] = instance;
1072
+ });
1073
+ return preProcess;
1074
+ }, Promise.resolve());
1075
+ devShared.Logger.log(chalk.blue(`---------------------\n`));
1076
+ let message = `chore(release): publish\n\n`;
1077
+ let relationVerisons = {};
1078
+ await inputs.reduce((preProcess, packageFolderName) => {
1079
+ const instance = instances[packageFolderName];
1080
+ instance.packageRelation.forEach(i => {
1081
+ let packageFolderName$ = Shared.getPackageFolderName(i);
1082
+ let instance$ = instances[packageFolderName$];
1083
+ if (instance$.commits.length > 0) {
1084
+ instance.updateCommits(instance$.commits, instance$.packageName);
1085
+ }
1086
+ });
1087
+ if (instance.commits.length) {
1088
+ preProcess = preProcess
1089
+ .then(() => devShared.Logger.log(chalk.magenta(`CHANGED: `) + instance.packageName))
1090
+ .then(() => instance.test())
1091
+ .then(() => instance.build())
1092
+ .then(() => instance.updatePackageOptions(relationVerisons))
1093
+ .then(() => instance.updateChangelog())
1094
+ .then(() => {
1095
+ message += `- ${instance.packageName}@${instance.packageOptions.version}\n`;
1096
+ relationVerisons[instance.packageName] = `^${instance.packageOptions.version}`;
1097
+ });
1098
+ }
1099
+ return preProcess;
1100
+ }, Promise.resolve());
1101
+ devShared.Logger.log(chalk.blue(`\n---------------------\n`));
1102
+ const isChanged = Object.keys(relationVerisons).length;
1103
+ if (!isChanged) {
1104
+ devShared.Logger.log(chalk.magenta(`COMMIT: `) + 'Nothing Chanaged Found.');
1105
+ }
1106
+ else if (options.dryRun || !options.commit) {
1107
+ devShared.Logger.log(chalk.magenta(`COMMIT: `) + chalk.yellow(`Skipping Git Commit`) + `\n${message}`);
1108
+ }
1109
+ else {
1110
+ devShared.Logger.log(chalk.magenta(`CHANGED: `) + `pnpm-lock.yaml`);
1111
+ await devShared.Shell.spawn('npx', ['pnpm', 'install', '--lockfile-only']);
1112
+ devShared.Logger.log(chalk.magenta(`COMMIT: `) + `CHANGELOG.md, package.json, pnpm-lock.yaml`);
1113
+ await devShared.Shell.spawn('git', ['add', process.cwd()]);
1114
+ await devShared.Shell.spawn('git', ['commit', '--m', `'${message}'`]);
1115
+ }
1116
+ await inputs
1117
+ .reduce((preProcess, packageFolderName) => {
1118
+ const instance = instances[packageFolderName];
1119
+ preProcess = preProcess
1120
+ .then(() => instance.publish())
1121
+ .then(() => instance.tag());
1122
+ return preProcess;
1123
+ }, Promise.resolve());
1124
+ devShared.Logger.log(chalk.blue(`\n---------------------\n`));
1125
+ if (options.dryRun || !options.push) {
1126
+ devShared.Logger.log(chalk.magenta(`FINISH: `) + 'Skipping Git Push');
1127
+ }
1128
+ else if (!isChanged) {
1129
+ devShared.Logger.log(chalk.magenta(`FINISH: `) + 'Nothing Chanaged.');
1130
+ }
1131
+ else {
1132
+ await devShared.Shell.spawn('git', ['push']);
1133
+ await devShared.Shell.spawn('git', ['push', '--tags']);
1134
+ }
1135
+ if (options.dryRun) {
1136
+ devShared.Logger.log(chalk.green('NO DRY RUN WAY: ')
1137
+ + chalk.grey(`npm run release -- --no-dry-run\n`));
1138
+ }
1139
+ }, {
1140
+ onError: (e) => {
1141
+ if (typeof e === 'number' && e === 1) {
1142
+ devShared.Logger.error('发布失败');
1143
+ }
1144
+ else {
1145
+ devShared.Logger.error(e);
1146
+ }
1147
+ process.exit(1);
1148
+ }
1149
+ });
1150
+
1151
+ const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (document.currentScript && document.currentScript.src || new URL('index.cjs.js', document.baseURI).href)));
1152
+ commander.program
1153
+ .version(require$1('../package.json').version);
1154
+ commander.program
1155
+ .usage('<cmd>');
1156
+ commander.program
1157
+ .command('link')
1158
+ .alias('l')
1159
+ .description('pnpm link')
1160
+ .option('--dry-run [boolean]', 'Dry Run')
1161
+ .action(run$5);
1162
+ commander.program
1163
+ .command('add')
1164
+ .alias('a')
1165
+ .description('add dep or create package')
1166
+ .option('--dry-run [boolean]', 'Dry Run')
1167
+ .action(run$4);
1168
+ commander.program
1169
+ .command('dev')
1170
+ .alias('d')
1171
+ .description('dev')
1172
+ .option('-p, --package-name <string>', 'Select PackageName')
1173
+ .option('--dry-run [boolean]', 'Dry Run')
1174
+ .action(run$2);
1175
+ commander.program
1176
+ .command('build')
1177
+ .alias('b')
1178
+ .description('build')
1179
+ .option('-p, --package-name <string>', 'Select packageName')
1180
+ .option('--output <string>', 'Output', 'es,cjs')
1181
+ .option('--dry-run [boolean]', 'Dry Run')
1182
+ .action(run$1);
1183
+ commander.program
1184
+ .command('release')
1185
+ .alias('r')
1186
+ .description('release')
1187
+ .option('--no-dry-run [boolean]', 'No Dry Run')
1188
+ .option('--no-tag [boolean]', 'No Tag')
1189
+ .option('--no-publish [boolean]', 'No Publish')
1190
+ .option('--no-commit [boolean]', 'No Commit')
1191
+ .option('--no-push [boolean]', 'No Push')
1192
+ .option('--force-update-package [string]', 'Force Update Package')
1193
+ .option('--skip-update-package [string]', 'Skip Update Package')
1194
+ .option('--custom-version [string]', 'Dry Run')
1195
+ .option('--patch [boolean]', 'Patch')
1196
+ .option('--major [boolean]', 'Major')
1197
+ .option('--minor [boolean]', 'Minor')
1198
+ .action(run);
1199
+ commander.program
1200
+ .command('test')
1201
+ .alias('t')
1202
+ .description('unit-test')
1203
+ .option('-p, --package-name <string>', 'Select PackageName')
1204
+ .option('-w, --watch [boolean]', 'Watch Test')
1205
+ .option('--dry-run [boolean]', 'Dry Run')
1206
+ .action(run$3);
1207
+ commander.program.parse(process.argv);
1208
+ if (!commander.program.args.length) {
1209
+ commander.program.help();
1210
+ }