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 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.56.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.12.0",
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.3",
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.14",
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;
@@ -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;
@@ -19,3 +19,4 @@ __exportStar(require("./createBranchName"), exports);
19
19
  __exportStar(require("./Git"), exports);
20
20
  __exportStar(require("./GitConfigInitializer"), exports);
21
21
  __exportStar(require("./GitRepository"), exports);
22
+ __exportStar(require("./GitTransaction"), exports);
@@ -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.github.requestReviewers({
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 outdatedPackageProcessor = new core_1.OutdatedPackageProcessor({
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.56.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.12.0",
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.3",
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.14",
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",