npm-update-package 0.56.0 → 0.58.1
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 +65 -0
- package/dist/package.json +4 -4
- package/dist/src/core/Create.js +62 -0
- package/dist/src/core/OutdatedPackageProcessor.js +0 -74
- package/dist/src/core/OutdatedPackageProcessorCreator.js +47 -0
- package/dist/src/core/OutdatedPullRequestStrategy.js +11 -0
- package/dist/src/core/Recreate.js +67 -0
- package/dist/src/core/Skip.js +72 -0
- package/dist/src/core/index.js +2 -0
- package/dist/src/git/GitTransaction.js +33 -0
- package/dist/src/git/index.js +1 -0
- package/dist/src/github/pull-request/creator/PullRequestCreator.js +5 -5
- package/dist/src/github/pull-request/creator/ReviewersAdder.js +23 -0
- package/dist/src/github/pull-request/creator/index.js +1 -0
- package/dist/src/main.js +8 -2
- package/dist/src/options/Options.js +8 -1
- package/dist/src/options/cliOptions.js +19 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -26,11 +26,13 @@ CLI tool for creating pull requests to update npm packages
|
|
|
26
26
|
- [githubToken](#githubtoken)
|
|
27
27
|
- [ignorePackages](#ignorepackages)
|
|
28
28
|
- [logLevel](#loglevel)
|
|
29
|
+
- [outdatedPrStrategy](#outdatedprstrategy)
|
|
29
30
|
- [packageManager](#packagemanager)
|
|
30
31
|
- [prBodyGithubHost](#prbodygithubhost)
|
|
31
32
|
- [prBodyNotes](#prbodynotes)
|
|
32
33
|
- [prTitle](#prtitle)
|
|
33
34
|
- [reviewers](#reviewers)
|
|
35
|
+
- [reviewersSampleSize](#reviewerssamplesize)
|
|
34
36
|
- [GitHub token](#github-token)
|
|
35
37
|
- [Examples](#examples)
|
|
36
38
|
- [Use token of GitHub Actions](#use-token-of-github-actions)
|
|
@@ -75,6 +77,7 @@ User names to assign to pull request.
|
|
|
75
77
|
|cli|`--assignees`|
|
|
76
78
|
|type|string[]|
|
|
77
79
|
|required|false|
|
|
80
|
+
|added version|v0.46.0|
|
|
78
81
|
|
|
79
82
|
Example:
|
|
80
83
|
|
|
@@ -93,6 +96,7 @@ How many members to be assigned to assignees.
|
|
|
93
96
|
|cli|`--assignees-sample-size`|
|
|
94
97
|
|type|number|
|
|
95
98
|
|required|false|
|
|
99
|
+
|added version|v0.56.0|
|
|
96
100
|
|
|
97
101
|
Example:
|
|
98
102
|
|
|
@@ -113,6 +117,7 @@ Commit message template.
|
|
|
113
117
|
|type|string|
|
|
114
118
|
|required|false|
|
|
115
119
|
|default|`chore(deps): {{{level}}} update {{{packageName}}} to v{{{newVersion}}}`|
|
|
120
|
+
|added version|v0.5.0|
|
|
116
121
|
|
|
117
122
|
Available variables:
|
|
118
123
|
|
|
@@ -142,6 +147,7 @@ Whether to fetch release notes.
|
|
|
142
147
|
|type|boolean|
|
|
143
148
|
|required|false|
|
|
144
149
|
|default|`true`|
|
|
150
|
+
|added version|v0.51.0|
|
|
145
151
|
|
|
146
152
|
Example:
|
|
147
153
|
|
|
@@ -161,6 +167,7 @@ Sleep time between fetching (ms).
|
|
|
161
167
|
|type|number|
|
|
162
168
|
|required|false|
|
|
163
169
|
|default|`1000`|
|
|
170
|
+
|added version|v0.50.0|
|
|
164
171
|
|
|
165
172
|
Example:
|
|
166
173
|
|
|
@@ -179,6 +186,7 @@ Git user email.
|
|
|
179
186
|
|cli|`--git-user-email`|
|
|
180
187
|
|type|string|
|
|
181
188
|
|required|false|
|
|
189
|
+
|added version|v0.53.0|
|
|
182
190
|
|
|
183
191
|
Example:
|
|
184
192
|
|
|
@@ -197,6 +205,7 @@ Git user name.
|
|
|
197
205
|
|cli|`--git-user-name`|
|
|
198
206
|
|type|string|
|
|
199
207
|
|required|false|
|
|
208
|
+
|added version|v0.53.0|
|
|
200
209
|
|
|
201
210
|
Example:
|
|
202
211
|
|
|
@@ -215,6 +224,7 @@ npx npm-update-package \
|
|
|
215
224
|
|cli|`--github-token`|
|
|
216
225
|
|type|string|
|
|
217
226
|
|required|true|
|
|
227
|
+
|added version|v0.1.0|
|
|
218
228
|
|
|
219
229
|
### ignorePackages
|
|
220
230
|
|
|
@@ -225,6 +235,7 @@ Package names to ignore.
|
|
|
225
235
|
|cli|`--ignore-packages`|
|
|
226
236
|
|type|string[]|
|
|
227
237
|
|required|false|
|
|
238
|
+
|added version|v0.43.0|
|
|
228
239
|
|
|
229
240
|
Example:
|
|
230
241
|
|
|
@@ -244,6 +255,7 @@ Log level to show.
|
|
|
244
255
|
|type|string|
|
|
245
256
|
|required|false|
|
|
246
257
|
|default|`info`|
|
|
258
|
+
|added version|v0.1.0|
|
|
247
259
|
|
|
248
260
|
Allowed values:
|
|
249
261
|
|
|
@@ -265,6 +277,34 @@ npx npm-update-package \
|
|
|
265
277
|
--log-level debug
|
|
266
278
|
```
|
|
267
279
|
|
|
280
|
+
### outdatedPrStrategy
|
|
281
|
+
|
|
282
|
+
What to do when outdated pull requests exist.
|
|
283
|
+
|
|
284
|
+
|Name|Value|
|
|
285
|
+
|---|---|
|
|
286
|
+
|cli|`--outdated-pr-strategy`|
|
|
287
|
+
|type|string|
|
|
288
|
+
|required|false|
|
|
289
|
+
|default|`recreate`|
|
|
290
|
+
|added version|v0.58.0|
|
|
291
|
+
|
|
292
|
+
Allowed values:
|
|
293
|
+
|
|
294
|
+
|Value|Description|
|
|
295
|
+
|---|---|
|
|
296
|
+
|`create`|Create new pull request.|
|
|
297
|
+
|`recreate`|Close old pull requests and create new pull request.|
|
|
298
|
+
|`skip`|Skip creating pull request.|
|
|
299
|
+
|
|
300
|
+
Example:
|
|
301
|
+
|
|
302
|
+
```sh
|
|
303
|
+
npx npm-update-package \
|
|
304
|
+
--github-token $GITHUB_TOKEN \
|
|
305
|
+
--outdated-pr-strategy create
|
|
306
|
+
```
|
|
307
|
+
|
|
268
308
|
### packageManager
|
|
269
309
|
|
|
270
310
|
Package manager of your project.
|
|
@@ -275,6 +315,7 @@ Since npm-update-package automatically determines which package manager to use,
|
|
|
275
315
|
|cli|`--package-manager`|
|
|
276
316
|
|type|string|
|
|
277
317
|
|required|false|
|
|
318
|
+
|added version|v0.1.0|
|
|
278
319
|
|
|
279
320
|
Allowed values:
|
|
280
321
|
|
|
@@ -301,6 +342,7 @@ GitHub host of pull request body.
|
|
|
301
342
|
|type|string|
|
|
302
343
|
|required|false|
|
|
303
344
|
|default|`togithub.com`|
|
|
345
|
+
|added version|v0.55.0|
|
|
304
346
|
|
|
305
347
|
Example:
|
|
306
348
|
|
|
@@ -319,6 +361,7 @@ Additional notes for Pull request body.
|
|
|
319
361
|
|cli|`--pr-body-notes`|
|
|
320
362
|
|type|string|
|
|
321
363
|
|required|false|
|
|
364
|
+
|added version|v0.45.0|
|
|
322
365
|
|
|
323
366
|
Example:
|
|
324
367
|
|
|
@@ -338,6 +381,7 @@ Pull request title template.
|
|
|
338
381
|
|type|string|
|
|
339
382
|
|required|false|
|
|
340
383
|
|default|`chore(deps): {{{level}}} update {{{packageName}}} to v{{{newVersion}}}`|
|
|
384
|
+
|added version|v0.44.0|
|
|
341
385
|
|
|
342
386
|
Available variables:
|
|
343
387
|
|
|
@@ -366,6 +410,7 @@ User names to request reviews.
|
|
|
366
410
|
|cli|`--reviewers`|
|
|
367
411
|
|type|string[]|
|
|
368
412
|
|required|false|
|
|
413
|
+
|added version|v0.26.0|
|
|
369
414
|
|
|
370
415
|
Example:
|
|
371
416
|
|
|
@@ -375,6 +420,26 @@ npx npm-update-package \
|
|
|
375
420
|
--reviewers alice bob
|
|
376
421
|
```
|
|
377
422
|
|
|
423
|
+
### reviewersSampleSize
|
|
424
|
+
|
|
425
|
+
How many members to be assigned to reviewers.
|
|
426
|
+
|
|
427
|
+
|Name|Value|
|
|
428
|
+
|---|---|
|
|
429
|
+
|cli|`--reviewers-sample-size`|
|
|
430
|
+
|type|number|
|
|
431
|
+
|required|false|
|
|
432
|
+
|added version|v0.57.0|
|
|
433
|
+
|
|
434
|
+
Example:
|
|
435
|
+
|
|
436
|
+
```sh
|
|
437
|
+
npx npm-update-package \
|
|
438
|
+
--github-token $GITHUB_TOKEN \
|
|
439
|
+
--reviewers alice bob \
|
|
440
|
+
--reviewers-sample-size 1
|
|
441
|
+
```
|
|
442
|
+
|
|
378
443
|
## GitHub token
|
|
379
444
|
|
|
380
445
|
GitHub token is required to run npm-update-package.
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "npm-update-package",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.58.1",
|
|
4
4
|
"description": "CLI tool for creating pull requests to update npm packages",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsc --project tsconfig.build.json",
|
|
@@ -41,13 +41,13 @@
|
|
|
41
41
|
"@types/parse-github-url": "1.0.0",
|
|
42
42
|
"@types/semver": "7.3.9",
|
|
43
43
|
"@typescript-eslint/eslint-plugin": "5.18.0",
|
|
44
|
-
"eslint": "8.
|
|
44
|
+
"eslint": "8.13.0",
|
|
45
45
|
"eslint-config-standard-with-typescript": "21.0.1",
|
|
46
46
|
"eslint-plugin-import": "2.26.0",
|
|
47
|
-
"eslint-plugin-jest": "26.1.
|
|
47
|
+
"eslint-plugin-jest": "26.1.4",
|
|
48
48
|
"eslint-plugin-node": "11.1.0",
|
|
49
49
|
"eslint-plugin-promise": "6.0.0",
|
|
50
|
-
"eslint-plugin-tsdoc": "0.2.
|
|
50
|
+
"eslint-plugin-tsdoc": "0.2.16",
|
|
51
51
|
"husky": "7.0.4",
|
|
52
52
|
"jest": "27.4.7",
|
|
53
53
|
"lint-staged": "12.3.7",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Create = void 0;
|
|
4
|
+
const Either_1 = require("fp-ts/lib/Either");
|
|
5
|
+
const git_1 = require("../git");
|
|
6
|
+
const logger_1 = require("../logger");
|
|
7
|
+
// TODO: Add test
|
|
8
|
+
class Create {
|
|
9
|
+
constructor({ git, packageManager, pullRequestCreator, branchFinder, commitMessageCreator, packageUpdater }) {
|
|
10
|
+
this.git = git;
|
|
11
|
+
this.packageManager = packageManager;
|
|
12
|
+
this.pullRequestCreator = pullRequestCreator;
|
|
13
|
+
this.branchFinder = branchFinder;
|
|
14
|
+
this.commitMessageCreator = commitMessageCreator;
|
|
15
|
+
this.packageUpdater = packageUpdater;
|
|
16
|
+
}
|
|
17
|
+
async process(outdatedPackage) {
|
|
18
|
+
const branchName = (0, git_1.createBranchName)(outdatedPackage);
|
|
19
|
+
logger_1.logger.trace(`branchName=${branchName}`);
|
|
20
|
+
if (this.branchFinder.findByName(branchName) !== undefined) {
|
|
21
|
+
logger_1.logger.info(`Skip ${outdatedPackage.name} because ${branchName} branch already exists on remote.`);
|
|
22
|
+
return (0, Either_1.right)({
|
|
23
|
+
outdatedPackage,
|
|
24
|
+
skipped: true
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const transaction = new git_1.GitTransaction({
|
|
28
|
+
git: this.git,
|
|
29
|
+
branchName,
|
|
30
|
+
files: [this.packageManager.packageFile, this.packageManager.lockFile]
|
|
31
|
+
});
|
|
32
|
+
return await transaction.run(async ({ git, branchName }) => {
|
|
33
|
+
try {
|
|
34
|
+
await this.packageUpdater.update(outdatedPackage);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
logger_1.logger.error(error);
|
|
38
|
+
return (0, Either_1.left)({
|
|
39
|
+
outdatedPackage,
|
|
40
|
+
error
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
logger_1.logger.info(`${outdatedPackage.name} has updated from v${outdatedPackage.currentVersion.version} to v${outdatedPackage.newVersion.version}`);
|
|
44
|
+
await git.add(this.packageManager.packageFile, this.packageManager.lockFile);
|
|
45
|
+
const message = this.commitMessageCreator.create(outdatedPackage);
|
|
46
|
+
logger_1.logger.trace(`message=${message}`);
|
|
47
|
+
await git.commit(message);
|
|
48
|
+
await git.push(branchName);
|
|
49
|
+
const pullRequest = await this.pullRequestCreator.create({
|
|
50
|
+
outdatedPackage,
|
|
51
|
+
branchName
|
|
52
|
+
});
|
|
53
|
+
logger_1.logger.trace(`pullRequest=${JSON.stringify(pullRequest)}`);
|
|
54
|
+
logger_1.logger.info(`Pull request for ${outdatedPackage.name} has created. ${pullRequest.html_url}`);
|
|
55
|
+
return (0, Either_1.right)({
|
|
56
|
+
outdatedPackage,
|
|
57
|
+
created: true
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.Create = Create;
|
|
@@ -1,76 +1,2 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OutdatedPackageProcessor = void 0;
|
|
4
|
-
const Either_1 = require("fp-ts/lib/Either");
|
|
5
|
-
const git_1 = require("../git");
|
|
6
|
-
const logger_1 = require("../logger");
|
|
7
|
-
// TODO: Add test
|
|
8
|
-
// TODO: Split into multiple classes and functions
|
|
9
|
-
class OutdatedPackageProcessor {
|
|
10
|
-
constructor({ git, packageManager, pullRequestCreator, branchFinder, commitMessageCreator, pullRequestFinder, pullRequestsCloser, packageUpdater }) {
|
|
11
|
-
this.git = git;
|
|
12
|
-
this.packageManager = packageManager;
|
|
13
|
-
this.pullRequestCreator = pullRequestCreator;
|
|
14
|
-
this.branchFinder = branchFinder;
|
|
15
|
-
this.commitMessageCreator = commitMessageCreator;
|
|
16
|
-
this.pullRequestFinder = pullRequestFinder;
|
|
17
|
-
this.pullRequestsCloser = pullRequestsCloser;
|
|
18
|
-
this.packageUpdater = packageUpdater;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Don't run in parallel because it includes file operations.
|
|
22
|
-
*/
|
|
23
|
-
async process(outdatedPackage) {
|
|
24
|
-
const branchName = (0, git_1.createBranchName)(outdatedPackage);
|
|
25
|
-
logger_1.logger.debug(`branchName=${branchName}`);
|
|
26
|
-
if (this.branchFinder.findByName(branchName) !== undefined) {
|
|
27
|
-
logger_1.logger.info(`Skip ${outdatedPackage.name} because ${branchName} branch already exists on remote.`);
|
|
28
|
-
return (0, Either_1.right)({
|
|
29
|
-
outdatedPackage,
|
|
30
|
-
skipped: true
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
await this.git.createBranch(branchName);
|
|
34
|
-
logger_1.logger.info(`${branchName} branch has created.`);
|
|
35
|
-
try {
|
|
36
|
-
try {
|
|
37
|
-
await this.packageUpdater.update(outdatedPackage);
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
logger_1.logger.error(error);
|
|
41
|
-
return (0, Either_1.left)({
|
|
42
|
-
outdatedPackage,
|
|
43
|
-
error
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
logger_1.logger.info(`${outdatedPackage.name} has updated from v${outdatedPackage.currentVersion.version} to v${outdatedPackage.newVersion.version}`);
|
|
47
|
-
await this.git.add(this.packageManager.packageFile, this.packageManager.lockFile);
|
|
48
|
-
const message = this.commitMessageCreator.create(outdatedPackage);
|
|
49
|
-
logger_1.logger.debug(`message=${message}`);
|
|
50
|
-
await this.git.commit(message);
|
|
51
|
-
await this.git.push(branchName);
|
|
52
|
-
const pullRequest = await this.pullRequestCreator.create({
|
|
53
|
-
outdatedPackage,
|
|
54
|
-
branchName
|
|
55
|
-
});
|
|
56
|
-
logger_1.logger.info(`Pull request for ${outdatedPackage.name} has created. ${pullRequest.html_url}`);
|
|
57
|
-
await this.closeOldPullRequests(outdatedPackage);
|
|
58
|
-
return (0, Either_1.right)({
|
|
59
|
-
outdatedPackage,
|
|
60
|
-
created: true
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
finally {
|
|
64
|
-
await this.git.restore(this.packageManager.packageFile, this.packageManager.lockFile);
|
|
65
|
-
await this.git.switch('-');
|
|
66
|
-
await this.git.removeBranch(branchName);
|
|
67
|
-
logger_1.logger.info(`${branchName} branch has removed.`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
async closeOldPullRequests(outdatedPackage) {
|
|
71
|
-
const pullRequests = this.pullRequestFinder.findByPackageName(outdatedPackage.name);
|
|
72
|
-
logger_1.logger.debug(`pullRequests=${JSON.stringify(pullRequests)}`);
|
|
73
|
-
await this.pullRequestsCloser.close(pullRequests);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
exports.OutdatedPackageProcessor = OutdatedPackageProcessor;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OutdatedPackageProcessorCreator = void 0;
|
|
4
|
+
const Create_1 = require("./Create");
|
|
5
|
+
const OutdatedPullRequestStrategy_1 = require("./OutdatedPullRequestStrategy");
|
|
6
|
+
const Recreate_1 = require("./Recreate");
|
|
7
|
+
const Skip_1 = require("./Skip");
|
|
8
|
+
class OutdatedPackageProcessorCreator {
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
create({ git, packageManager, pullRequestCreator, branchFinder, commitMessageCreator, pullRequestFinder, pullRequestsCloser, packageUpdater }) {
|
|
13
|
+
switch (this.options.outdatedPrStrategy) {
|
|
14
|
+
case OutdatedPullRequestStrategy_1.OutdatedPullRequestStrategy.Create:
|
|
15
|
+
return new Create_1.Create({
|
|
16
|
+
git,
|
|
17
|
+
packageManager,
|
|
18
|
+
pullRequestCreator,
|
|
19
|
+
branchFinder,
|
|
20
|
+
commitMessageCreator,
|
|
21
|
+
packageUpdater
|
|
22
|
+
});
|
|
23
|
+
case OutdatedPullRequestStrategy_1.OutdatedPullRequestStrategy.Recreate:
|
|
24
|
+
return new Recreate_1.Recreate({
|
|
25
|
+
git,
|
|
26
|
+
packageManager,
|
|
27
|
+
pullRequestCreator,
|
|
28
|
+
branchFinder,
|
|
29
|
+
commitMessageCreator,
|
|
30
|
+
pullRequestFinder,
|
|
31
|
+
pullRequestsCloser,
|
|
32
|
+
packageUpdater
|
|
33
|
+
});
|
|
34
|
+
case OutdatedPullRequestStrategy_1.OutdatedPullRequestStrategy.Skip:
|
|
35
|
+
return new Skip_1.Skip({
|
|
36
|
+
git,
|
|
37
|
+
packageManager,
|
|
38
|
+
pullRequestCreator,
|
|
39
|
+
branchFinder,
|
|
40
|
+
commitMessageCreator,
|
|
41
|
+
pullRequestFinder,
|
|
42
|
+
packageUpdater
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.OutdatedPackageProcessorCreator = OutdatedPackageProcessorCreator;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isOutdatedPullRequestStrategy = exports.OutdatedPullRequestStrategy = void 0;
|
|
4
|
+
exports.OutdatedPullRequestStrategy = {
|
|
5
|
+
Create: 'create',
|
|
6
|
+
Recreate: 'recreate',
|
|
7
|
+
Skip: 'skip'
|
|
8
|
+
};
|
|
9
|
+
const outdatedPullRequestStrategies = Object.values(exports.OutdatedPullRequestStrategy);
|
|
10
|
+
const isOutdatedPullRequestStrategy = (value) => outdatedPullRequestStrategies.includes(value);
|
|
11
|
+
exports.isOutdatedPullRequestStrategy = isOutdatedPullRequestStrategy;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Recreate = void 0;
|
|
4
|
+
const Either_1 = require("fp-ts/lib/Either");
|
|
5
|
+
const git_1 = require("../git");
|
|
6
|
+
const logger_1 = require("../logger");
|
|
7
|
+
// TODO: Add test
|
|
8
|
+
class Recreate {
|
|
9
|
+
constructor({ git, packageManager, pullRequestCreator, branchFinder, commitMessageCreator, packageUpdater, pullRequestFinder, pullRequestsCloser }) {
|
|
10
|
+
this.git = git;
|
|
11
|
+
this.packageManager = packageManager;
|
|
12
|
+
this.pullRequestCreator = pullRequestCreator;
|
|
13
|
+
this.branchFinder = branchFinder;
|
|
14
|
+
this.commitMessageCreator = commitMessageCreator;
|
|
15
|
+
this.packageUpdater = packageUpdater;
|
|
16
|
+
this.pullRequestFinder = pullRequestFinder;
|
|
17
|
+
this.pullRequestsCloser = pullRequestsCloser;
|
|
18
|
+
}
|
|
19
|
+
async process(outdatedPackage) {
|
|
20
|
+
const branchName = (0, git_1.createBranchName)(outdatedPackage);
|
|
21
|
+
logger_1.logger.trace(`branchName=${branchName}`);
|
|
22
|
+
if (this.branchFinder.findByName(branchName) !== undefined) {
|
|
23
|
+
logger_1.logger.info(`Skip ${outdatedPackage.name} because ${branchName} branch already exists on remote.`);
|
|
24
|
+
return (0, Either_1.right)({
|
|
25
|
+
outdatedPackage,
|
|
26
|
+
skipped: true
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const transaction = new git_1.GitTransaction({
|
|
30
|
+
git: this.git,
|
|
31
|
+
branchName,
|
|
32
|
+
files: [this.packageManager.packageFile, this.packageManager.lockFile]
|
|
33
|
+
});
|
|
34
|
+
return await transaction.run(async ({ git, branchName }) => {
|
|
35
|
+
try {
|
|
36
|
+
await this.packageUpdater.update(outdatedPackage);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
logger_1.logger.error(error);
|
|
40
|
+
return (0, Either_1.left)({
|
|
41
|
+
outdatedPackage,
|
|
42
|
+
error
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
logger_1.logger.info(`${outdatedPackage.name} has updated from v${outdatedPackage.currentVersion.version} to v${outdatedPackage.newVersion.version}`);
|
|
46
|
+
await git.add(this.packageManager.packageFile, this.packageManager.lockFile);
|
|
47
|
+
const message = this.commitMessageCreator.create(outdatedPackage);
|
|
48
|
+
logger_1.logger.trace(`message=${message}`);
|
|
49
|
+
await git.commit(message);
|
|
50
|
+
await git.push(branchName);
|
|
51
|
+
const pullRequest = await this.pullRequestCreator.create({
|
|
52
|
+
outdatedPackage,
|
|
53
|
+
branchName
|
|
54
|
+
});
|
|
55
|
+
logger_1.logger.trace(`pullRequest=${JSON.stringify(pullRequest)}`);
|
|
56
|
+
logger_1.logger.info(`Pull request for ${outdatedPackage.name} has created. ${pullRequest.html_url}`);
|
|
57
|
+
const pullRequests = this.pullRequestFinder.findByPackageName(outdatedPackage.name);
|
|
58
|
+
logger_1.logger.trace(`pullRequests=${JSON.stringify(pullRequests)}`);
|
|
59
|
+
await this.pullRequestsCloser.close(pullRequests);
|
|
60
|
+
return (0, Either_1.right)({
|
|
61
|
+
outdatedPackage,
|
|
62
|
+
created: true
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.Recreate = Recreate;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Skip = void 0;
|
|
4
|
+
const Either_1 = require("fp-ts/lib/Either");
|
|
5
|
+
const git_1 = require("../git");
|
|
6
|
+
const logger_1 = require("../logger");
|
|
7
|
+
// TODO: Add test
|
|
8
|
+
class Skip {
|
|
9
|
+
constructor({ git, packageManager, pullRequestCreator, branchFinder, commitMessageCreator, packageUpdater, pullRequestFinder }) {
|
|
10
|
+
this.git = git;
|
|
11
|
+
this.packageManager = packageManager;
|
|
12
|
+
this.pullRequestCreator = pullRequestCreator;
|
|
13
|
+
this.branchFinder = branchFinder;
|
|
14
|
+
this.commitMessageCreator = commitMessageCreator;
|
|
15
|
+
this.packageUpdater = packageUpdater;
|
|
16
|
+
this.pullRequestFinder = pullRequestFinder;
|
|
17
|
+
}
|
|
18
|
+
async process(outdatedPackage) {
|
|
19
|
+
const branchName = (0, git_1.createBranchName)(outdatedPackage);
|
|
20
|
+
logger_1.logger.trace(`branchName=${branchName}`);
|
|
21
|
+
if (this.branchFinder.findByName(branchName) !== undefined) {
|
|
22
|
+
logger_1.logger.info(`Skip ${outdatedPackage.name} because ${branchName} branch already exists on remote.`);
|
|
23
|
+
return (0, Either_1.right)({
|
|
24
|
+
outdatedPackage,
|
|
25
|
+
skipped: true
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const pullRequests = this.pullRequestFinder.findByPackageName(outdatedPackage.name);
|
|
29
|
+
logger_1.logger.trace(`pullRequests=${JSON.stringify(pullRequests)}`);
|
|
30
|
+
if (pullRequests.length > 0) {
|
|
31
|
+
logger_1.logger.info(`Skip ${outdatedPackage.name} because outdated pull requests exist.`);
|
|
32
|
+
return (0, Either_1.right)({
|
|
33
|
+
outdatedPackage,
|
|
34
|
+
skipped: true
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const transaction = new git_1.GitTransaction({
|
|
38
|
+
git: this.git,
|
|
39
|
+
branchName,
|
|
40
|
+
files: [this.packageManager.packageFile, this.packageManager.lockFile]
|
|
41
|
+
});
|
|
42
|
+
return await transaction.run(async ({ git, branchName }) => {
|
|
43
|
+
try {
|
|
44
|
+
await this.packageUpdater.update(outdatedPackage);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
logger_1.logger.error(error);
|
|
48
|
+
return (0, Either_1.left)({
|
|
49
|
+
outdatedPackage,
|
|
50
|
+
error
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
logger_1.logger.info(`${outdatedPackage.name} has updated from v${outdatedPackage.currentVersion.version} to v${outdatedPackage.newVersion.version}`);
|
|
54
|
+
await git.add(this.packageManager.packageFile, this.packageManager.lockFile);
|
|
55
|
+
const message = this.commitMessageCreator.create(outdatedPackage);
|
|
56
|
+
logger_1.logger.trace(`message=${message}`);
|
|
57
|
+
await git.commit(message);
|
|
58
|
+
await git.push(branchName);
|
|
59
|
+
const pullRequest = await this.pullRequestCreator.create({
|
|
60
|
+
outdatedPackage,
|
|
61
|
+
branchName
|
|
62
|
+
});
|
|
63
|
+
logger_1.logger.trace(`pullRequest=${JSON.stringify(pullRequest)}`);
|
|
64
|
+
logger_1.logger.info(`Pull request for ${outdatedPackage.name} has created. ${pullRequest.html_url}`);
|
|
65
|
+
return (0, Either_1.right)({
|
|
66
|
+
outdatedPackage,
|
|
67
|
+
created: true
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.Skip = Skip;
|
package/dist/src/core/index.js
CHANGED
|
@@ -17,6 +17,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./FailedResult"), exports);
|
|
18
18
|
__exportStar(require("./OutdatedPackage"), exports);
|
|
19
19
|
__exportStar(require("./OutdatedPackageProcessor"), exports);
|
|
20
|
+
__exportStar(require("./OutdatedPackageProcessorCreator"), exports);
|
|
20
21
|
__exportStar(require("./OutdatedPackagesProcessor"), exports);
|
|
22
|
+
__exportStar(require("./OutdatedPullRequestStrategy"), exports);
|
|
21
23
|
__exportStar(require("./PackageUpdater"), exports);
|
|
22
24
|
__exportStar(require("./SucceededResult"), exports);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GitTransaction = void 0;
|
|
4
|
+
const logger_1 = require("../logger");
|
|
5
|
+
// TODO: Add test
|
|
6
|
+
class GitTransaction {
|
|
7
|
+
constructor({ git, branchName, files }) {
|
|
8
|
+
this.git = git;
|
|
9
|
+
this.branchName = branchName;
|
|
10
|
+
this.files = files;
|
|
11
|
+
}
|
|
12
|
+
async run(operation) {
|
|
13
|
+
await this.git.createBranch(this.branchName);
|
|
14
|
+
logger_1.logger.info(`${this.branchName} branch has created.`);
|
|
15
|
+
try {
|
|
16
|
+
return await operation({
|
|
17
|
+
git: this.git,
|
|
18
|
+
branchName: this.branchName,
|
|
19
|
+
files: this.files
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
await this.rollback();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async rollback() {
|
|
27
|
+
await this.git.restore(...this.files);
|
|
28
|
+
await this.git.switch('-');
|
|
29
|
+
await this.git.removeBranch(this.branchName);
|
|
30
|
+
logger_1.logger.info(`${this.branchName} branch has removed.`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.GitTransaction = GitTransaction;
|
package/dist/src/git/index.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.PullRequestCreator = void 0;
|
|
4
4
|
const logger_1 = require("../../../logger");
|
|
5
5
|
class PullRequestCreator {
|
|
6
|
-
constructor({ options, github, gitRepo, githubRepo, pullRequestTitleCreator, pullRequestBodyCreator, assigneesAdder }) {
|
|
6
|
+
constructor({ options, github, gitRepo, githubRepo, pullRequestTitleCreator, pullRequestBodyCreator, assigneesAdder, reviewersAdder }) {
|
|
7
7
|
this.options = options;
|
|
8
8
|
this.github = github;
|
|
9
9
|
this.gitRepo = gitRepo;
|
|
@@ -11,6 +11,7 @@ class PullRequestCreator {
|
|
|
11
11
|
this.pullRequestTitleCreator = pullRequestTitleCreator;
|
|
12
12
|
this.pullRequestBodyCreator = pullRequestBodyCreator;
|
|
13
13
|
this.assigneesAdder = assigneesAdder;
|
|
14
|
+
this.reviewersAdder = reviewersAdder;
|
|
14
15
|
}
|
|
15
16
|
async create({ outdatedPackage, branchName }) {
|
|
16
17
|
const title = this.pullRequestTitleCreator.create(outdatedPackage);
|
|
@@ -40,11 +41,10 @@ class PullRequestCreator {
|
|
|
40
41
|
});
|
|
41
42
|
}
|
|
42
43
|
if (this.options.reviewers !== undefined) {
|
|
43
|
-
await this.
|
|
44
|
-
owner: this.gitRepo.owner,
|
|
45
|
-
repo: this.gitRepo.name,
|
|
44
|
+
await this.reviewersAdder.add({
|
|
46
45
|
pullNumber: pullRequest.number,
|
|
47
|
-
reviewers: this.options.reviewers
|
|
46
|
+
reviewers: this.options.reviewers,
|
|
47
|
+
sampleSize: this.options.reviewersSampleSize
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
return pullRequest;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ReviewersAdder = void 0;
|
|
7
|
+
const shuffle_1 = __importDefault(require("lodash/shuffle"));
|
|
8
|
+
// TODO: Add test
|
|
9
|
+
class ReviewersAdder {
|
|
10
|
+
constructor({ github, gitRepo }) {
|
|
11
|
+
this.github = github;
|
|
12
|
+
this.gitRepo = gitRepo;
|
|
13
|
+
}
|
|
14
|
+
async add({ pullNumber, reviewers, sampleSize }) {
|
|
15
|
+
await this.github.requestReviewers({
|
|
16
|
+
owner: this.gitRepo.owner,
|
|
17
|
+
repo: this.gitRepo.name,
|
|
18
|
+
pullNumber,
|
|
19
|
+
reviewers: sampleSize !== undefined ? (0, shuffle_1.default)(reviewers).slice(0, sampleSize) : reviewers
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.ReviewersAdder = ReviewersAdder;
|
|
@@ -21,3 +21,4 @@ __exportStar(require("./PullRequestBodyCreator"), exports);
|
|
|
21
21
|
__exportStar(require("./PullRequestCreator"), exports);
|
|
22
22
|
__exportStar(require("./PullRequestTitleCreator"), exports);
|
|
23
23
|
__exportStar(require("./ReleaseNotesSectionCreator"), exports);
|
|
24
|
+
__exportStar(require("./ReviewersAdder"), exports);
|
package/dist/src/main.js
CHANGED
|
@@ -80,6 +80,10 @@ const main = async (options) => {
|
|
|
80
80
|
github,
|
|
81
81
|
gitRepo
|
|
82
82
|
});
|
|
83
|
+
const reviewersAdder = new github_1.ReviewersAdder({
|
|
84
|
+
github,
|
|
85
|
+
gitRepo
|
|
86
|
+
});
|
|
83
87
|
const pullRequestCreator = new github_1.PullRequestCreator({
|
|
84
88
|
options,
|
|
85
89
|
github,
|
|
@@ -87,7 +91,8 @@ const main = async (options) => {
|
|
|
87
91
|
githubRepo,
|
|
88
92
|
pullRequestTitleCreator,
|
|
89
93
|
pullRequestBodyCreator,
|
|
90
|
-
assigneesAdder
|
|
94
|
+
assigneesAdder,
|
|
95
|
+
reviewersAdder
|
|
91
96
|
});
|
|
92
97
|
const commitMessageCreator = new git_1.CommitMessageCreator(options.commitMessage);
|
|
93
98
|
const pullRequestFinder = new github_1.PullRequestFinder(pullRequests);
|
|
@@ -97,7 +102,8 @@ const main = async (options) => {
|
|
|
97
102
|
packageManager,
|
|
98
103
|
ncu
|
|
99
104
|
});
|
|
100
|
-
const
|
|
105
|
+
const outdatedPackageProcessorCreator = new core_1.OutdatedPackageProcessorCreator(options);
|
|
106
|
+
const outdatedPackageProcessor = outdatedPackageProcessorCreator.create({
|
|
101
107
|
git,
|
|
102
108
|
packageManager,
|
|
103
109
|
pullRequestCreator,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isOptions = void 0;
|
|
4
4
|
const io_ts_1 = require("io-ts");
|
|
5
|
+
const core_1 = require("../core");
|
|
5
6
|
const logger_1 = require("../logger");
|
|
6
7
|
const package_manager_1 = require("../package-manager");
|
|
7
8
|
const Options = (0, io_ts_1.intersection)([
|
|
@@ -19,6 +20,11 @@ const Options = (0, io_ts_1.intersection)([
|
|
|
19
20
|
(0, io_ts_1.literal)(logger_1.LogLevel.Debug),
|
|
20
21
|
(0, io_ts_1.literal)(logger_1.LogLevel.Trace)
|
|
21
22
|
]),
|
|
23
|
+
outdatedPrStrategy: (0, io_ts_1.union)([
|
|
24
|
+
(0, io_ts_1.literal)(core_1.OutdatedPullRequestStrategy.Create),
|
|
25
|
+
(0, io_ts_1.literal)(core_1.OutdatedPullRequestStrategy.Recreate),
|
|
26
|
+
(0, io_ts_1.literal)(core_1.OutdatedPullRequestStrategy.Skip)
|
|
27
|
+
]),
|
|
22
28
|
prBodyGithubHost: io_ts_1.string,
|
|
23
29
|
prTitle: io_ts_1.string
|
|
24
30
|
}),
|
|
@@ -33,7 +39,8 @@ const Options = (0, io_ts_1.intersection)([
|
|
|
33
39
|
(0, io_ts_1.literal)(package_manager_1.PackageManagerName.Yarn)
|
|
34
40
|
]),
|
|
35
41
|
prBodyNotes: io_ts_1.string,
|
|
36
|
-
reviewers: (0, io_ts_1.array)(io_ts_1.string)
|
|
42
|
+
reviewers: (0, io_ts_1.array)(io_ts_1.string),
|
|
43
|
+
reviewersSampleSize: io_ts_1.number
|
|
37
44
|
})
|
|
38
45
|
]);
|
|
39
46
|
exports.isOptions = Options.is;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.cliOptions = void 0;
|
|
4
|
+
const core_1 = require("../core");
|
|
4
5
|
const logger_1 = require("../logger");
|
|
5
6
|
const package_manager_1 = require("../package-manager");
|
|
6
7
|
const OptionType_1 = require("./OptionType");
|
|
@@ -78,6 +79,18 @@ exports.cliOptions = [
|
|
|
78
79
|
],
|
|
79
80
|
default: logger_1.LogLevel.Info
|
|
80
81
|
},
|
|
82
|
+
{
|
|
83
|
+
name: 'outdated-pr-strategy',
|
|
84
|
+
description: 'What to do when outdated pull requests exist',
|
|
85
|
+
type: OptionType_1.OptionType.String,
|
|
86
|
+
required: false,
|
|
87
|
+
choices: [
|
|
88
|
+
core_1.OutdatedPullRequestStrategy.Create,
|
|
89
|
+
core_1.OutdatedPullRequestStrategy.Recreate,
|
|
90
|
+
core_1.OutdatedPullRequestStrategy.Skip
|
|
91
|
+
],
|
|
92
|
+
default: core_1.OutdatedPullRequestStrategy.Recreate
|
|
93
|
+
},
|
|
81
94
|
{
|
|
82
95
|
name: 'package-manager',
|
|
83
96
|
description: 'Package manager of your project',
|
|
@@ -113,5 +126,11 @@ exports.cliOptions = [
|
|
|
113
126
|
description: 'User names to request reviews',
|
|
114
127
|
type: OptionType_1.OptionType.StringArray,
|
|
115
128
|
required: false
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: 'reviewers-sample-size',
|
|
132
|
+
description: 'How many members to be assigned to reviewers',
|
|
133
|
+
type: OptionType_1.OptionType.Number,
|
|
134
|
+
required: false
|
|
116
135
|
}
|
|
117
136
|
];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "npm-update-package",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.58.1",
|
|
4
4
|
"description": "CLI tool for creating pull requests to update npm packages",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsc --project tsconfig.build.json",
|
|
@@ -41,13 +41,13 @@
|
|
|
41
41
|
"@types/parse-github-url": "1.0.0",
|
|
42
42
|
"@types/semver": "7.3.9",
|
|
43
43
|
"@typescript-eslint/eslint-plugin": "5.18.0",
|
|
44
|
-
"eslint": "8.
|
|
44
|
+
"eslint": "8.13.0",
|
|
45
45
|
"eslint-config-standard-with-typescript": "21.0.1",
|
|
46
46
|
"eslint-plugin-import": "2.26.0",
|
|
47
|
-
"eslint-plugin-jest": "26.1.
|
|
47
|
+
"eslint-plugin-jest": "26.1.4",
|
|
48
48
|
"eslint-plugin-node": "11.1.0",
|
|
49
49
|
"eslint-plugin-promise": "6.0.0",
|
|
50
|
-
"eslint-plugin-tsdoc": "0.2.
|
|
50
|
+
"eslint-plugin-tsdoc": "0.2.16",
|
|
51
51
|
"husky": "7.0.4",
|
|
52
52
|
"jest": "27.4.7",
|
|
53
53
|
"lint-staged": "12.3.7",
|