@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.
- package/README.md +2 -2
- package/config/commit-lint.js +3 -1
- package/dist/index.cjs.js +1210 -0
- package/dist/{index.js → index.es.js} +114 -29
- package/package.json +3 -2
|
@@ -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
|
+
}
|