npm-update-package 0.34.0 → 0.37.0

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/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "npm-update-package",
3
- "version": "0.34.0",
3
+ "version": "0.37.0",
4
4
  "description": "CLI tool for creating pull requests to update npm packages",
5
5
  "scripts": {
6
6
  "build": "tsc --project tsconfig.build.json",
@@ -35,7 +35,7 @@
35
35
  "@types/node": "12.20.40",
36
36
  "@types/parse-github-url": "1.0.0",
37
37
  "@types/semver": "7.3.9",
38
- "@typescript-eslint/eslint-plugin": "5.12.0",
38
+ "@typescript-eslint/eslint-plugin": "5.12.1",
39
39
  "eslint": "8.9.0",
40
40
  "eslint-config-standard-with-typescript": "21.0.1",
41
41
  "eslint-plugin-import": "2.25.4",
@@ -4,38 +4,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.GitRepository = void 0;
7
+ const url_1 = require("url");
7
8
  const parse_github_url_1 = __importDefault(require("parse-github-url"));
8
9
  class GitRepository {
9
- constructor({ host, owner, name }) {
10
- this.host = host;
10
+ constructor({ url, owner, name }) {
11
+ this.url = url;
11
12
  this.owner = owner;
12
13
  this.name = name;
13
14
  }
14
- static of(url) {
15
- const parsed = (0, parse_github_url_1.default)(url);
15
+ static of(repository) {
16
+ var _a;
17
+ const parsed = (0, parse_github_url_1.default)(repository);
16
18
  if (parsed === null) {
17
- throw new Error(`Failed to parse url. url=${url}`);
19
+ throw new Error(`Failed to parse repository. repository=${repository}`);
18
20
  }
19
21
  const { host, owner, name } = parsed;
20
22
  if (host === null || owner === null || name === null) {
21
- throw new Error(`Failed to parse url. url=${url}`);
23
+ throw new Error(`Failed to parse repository. repository=${repository}`);
22
24
  }
25
+ const protocol = (_a = parsed.protocol) !== null && _a !== void 0 ? _a : 'https:';
23
26
  return new GitRepository({
24
- host,
27
+ url: new url_1.URL(`${protocol}//${host}/${owner}/${name}`),
25
28
  owner,
26
29
  name
27
30
  });
28
31
  }
29
- get apiEndPoint() {
30
- if (this.isGitHubDotCom) {
31
- return 'https://api.github.com';
32
- }
33
- else {
34
- return `https://${this.host}/api/v3`;
35
- }
36
- }
37
- get isGitHubDotCom() {
38
- return this.host === 'github.com';
39
- }
40
32
  }
41
33
  exports.GitRepository = GitRepository;
@@ -75,6 +75,22 @@ class GitHub {
75
75
  });
76
76
  return data;
77
77
  }
78
+ async fetchReleases({ owner, repo }) {
79
+ const releases = [];
80
+ for (let page = 1;; page++) {
81
+ const { data } = await this.octokit.repos.listReleases({
82
+ owner,
83
+ repo,
84
+ per_page: 100,
85
+ page
86
+ });
87
+ if (data.length === 0) {
88
+ break;
89
+ }
90
+ releases.push(...data);
91
+ }
92
+ return releases;
93
+ }
78
94
  async fetchRepository({ owner, repo }) {
79
95
  const { data } = await this.octokit.repos.get({
80
96
  owner,
@@ -7,9 +7,10 @@ exports.createOctokit = void 0;
7
7
  const rest_1 = require("@octokit/rest");
8
8
  const package_json_1 = __importDefault(require("../../package.json"));
9
9
  const createOctokit = ({ repository, token }) => {
10
+ const { host } = repository.url;
10
11
  const auth = `token ${token}`;
11
12
  const userAgent = `${package_json_1.default.name}/${package_json_1.default.version}`;
12
- if (repository.isGitHubDotCom) {
13
+ if (host === 'github.com') {
13
14
  return new rest_1.Octokit({
14
15
  auth,
15
16
  userAgent
@@ -19,7 +20,7 @@ const createOctokit = ({ repository, token }) => {
19
20
  return new rest_1.Octokit({
20
21
  auth,
21
22
  userAgent,
22
- baseUrl: repository.apiEndPoint
23
+ baseUrl: `https://${host}/api/v3`
23
24
  });
24
25
  }
25
26
  };
@@ -15,3 +15,4 @@ __exportStar(require("./createGitHub"), exports);
15
15
  __exportStar(require("./errors"), exports);
16
16
  __exportStar(require("./label"), exports);
17
17
  __exportStar(require("./pull-request"), exports);
18
+ __exportStar(require("./releases"), exports);
@@ -0,0 +1,103 @@
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.PullRequestBodyCreator = void 0;
7
+ const package_json_1 = __importDefault(require("../../../../package.json"));
8
+ const file_1 = require("../../../file");
9
+ const json_1 = require("../../../json");
10
+ const package_json_2 = require("../../../package-json");
11
+ const metadata_1 = require("../metadata");
12
+ class PullRequestBodyCreator {
13
+ constructor({ releasesFetcher }) {
14
+ this.releasesFetcher = releasesFetcher;
15
+ }
16
+ async create(outdatedPackage) {
17
+ const gitRepo = await this.extractRepository(outdatedPackage);
18
+ const outdatedPackagesTable = this.createOutdatedPackagesTable({
19
+ outdatedPackage,
20
+ gitRepo
21
+ });
22
+ const metadataSection = this.createMetadataSection(outdatedPackage);
23
+ const footer = this.createFooter();
24
+ if (gitRepo === undefined) {
25
+ return `This PR updates these packages:
26
+
27
+ ${outdatedPackagesTable}
28
+
29
+ ---
30
+ ${metadataSection}
31
+
32
+ ---
33
+ ${footer}`;
34
+ }
35
+ const releaseNotesSection = await this.createReleaseNotesSection({
36
+ outdatedPackage,
37
+ gitRepo
38
+ });
39
+ return `This PR updates these packages:
40
+
41
+ ${outdatedPackagesTable}
42
+
43
+ ${releaseNotesSection}
44
+
45
+ ---
46
+ ${metadataSection}
47
+
48
+ ---
49
+ ${footer}`;
50
+ }
51
+ async extractRepository(outdatedPackage) {
52
+ const packageJson = await (0, file_1.readFile)(`node_modules/${outdatedPackage.name}/package.json`);
53
+ const pkg = (0, package_json_2.parsePackageJson)(packageJson);
54
+ return (0, package_json_2.extractRepository)(pkg);
55
+ }
56
+ async createReleaseNotesSection({ outdatedPackage, gitRepo }) {
57
+ const releases = await this.releasesFetcher.fetch({
58
+ gitRepo,
59
+ from: outdatedPackage.currentVersion,
60
+ to: outdatedPackage.newVersion
61
+ });
62
+ const items = releases.map(release => `- [${release.tag_name}](${release.html_url})`);
63
+ return `## Release notes
64
+
65
+ ${items.join('\n')}`;
66
+ }
67
+ createOutdatedPackagesTable({ outdatedPackage, gitRepo }) {
68
+ const packageName = outdatedPackage.name;
69
+ const packageLink = `[${packageName}](https://www.npmjs.com/package/${packageName})`;
70
+ const repositoryLink = gitRepo !== undefined ? `[${gitRepo.owner}/${gitRepo.name}](${gitRepo.url.toString()})` : '-';
71
+ const level = outdatedPackage.level;
72
+ const currentVersion = outdatedPackage.currentVersion.version;
73
+ const currentVersionLink = `[\`${currentVersion}\`](https://www.npmjs.com/package/${packageName}/v/${currentVersion})`;
74
+ const newVersion = outdatedPackage.newVersion.version;
75
+ const newVersionLink = `[\`${newVersion}\`](https://www.npmjs.com/package/${packageName}/v/${newVersion})`;
76
+ const diffLink = `[diff](https://renovatebot.com/diffs/npm/${packageName}/${currentVersion}/${newVersion})`;
77
+ const version = `${currentVersionLink} -> ${newVersionLink} (${diffLink})`;
78
+ return `|Package|Repository|Level|Version|
79
+ |---|---|---|---|
80
+ |${packageLink}|${repositoryLink}|${level}|${version}|`;
81
+ }
82
+ createMetadataSection(outdatedPackage) {
83
+ const metadata = (0, metadata_1.createPullRequestMetadata)([outdatedPackage]);
84
+ const json = (0, json_1.toJSON)(metadata, { pretty: true });
85
+ return `<details>
86
+ <summary>Metadata</summary>
87
+
88
+ **Don't remove or edit this section because it will be used by npm-update-package.**
89
+
90
+ <div id="npm-update-package-metadata">
91
+
92
+ \`\`\`json
93
+ ${json}
94
+ \`\`\`
95
+
96
+ </div>
97
+ </details>`;
98
+ }
99
+ createFooter() {
100
+ return `This PR has been generated by [${package_json_1.default.name}](${package_json_1.default.homepage}) v${package_json_1.default.version}`;
101
+ }
102
+ }
103
+ exports.PullRequestBodyCreator = PullRequestBodyCreator;
@@ -1,20 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PullRequestCreator = void 0;
4
- const createPullRequestBody_1 = require("./createPullRequestBody");
5
4
  class PullRequestCreator {
6
- constructor({ github, gitRepo, githubRepo, pullRequestTitleCreator, logger, reviewers }) {
5
+ constructor({ github, gitRepo, githubRepo, pullRequestTitleCreator, pullRequestBodyCreator, logger, reviewers }) {
7
6
  this.github = github;
8
7
  this.gitRepo = gitRepo;
9
8
  this.githubRepo = githubRepo;
10
9
  this.pullRequestTitleCreator = pullRequestTitleCreator;
10
+ this.pullRequestBodyCreator = pullRequestBodyCreator;
11
11
  this.logger = logger;
12
12
  this.reviewers = reviewers;
13
13
  }
14
14
  async create({ outdatedPackage, branchName }) {
15
15
  const title = this.pullRequestTitleCreator.create(outdatedPackage);
16
16
  this.logger.debug(`title=${title}`);
17
- const body = (0, createPullRequestBody_1.createPullRequestBody)(outdatedPackage);
17
+ const body = await this.pullRequestBodyCreator.create(outdatedPackage);
18
18
  this.logger.debug(`body=${body}`);
19
19
  const pullRequest = await this.github.createPullRequest({
20
20
  owner: this.gitRepo.owner,
@@ -10,5 +10,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
10
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./PullRequestBodyCreator"), exports);
13
14
  __exportStar(require("./PullRequestCreator"), exports);
14
15
  __exportStar(require("./PullRequestTitleCreator"), exports);
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReleasesFetcher = void 0;
4
+ const semver_1 = require("semver");
5
+ // TODO: Add test
6
+ class ReleasesFetcher {
7
+ constructor(github) {
8
+ this.github = github;
9
+ }
10
+ async fetch({ gitRepo, from, to }) {
11
+ const releases = await this.github.fetchReleases({
12
+ owner: gitRepo.owner,
13
+ repo: gitRepo.name
14
+ });
15
+ return releases.filter(({ tag_name: version }) => (0, semver_1.gte)(version, from.version) && (0, semver_1.lte)(version, to.version));
16
+ }
17
+ }
18
+ exports.ReleasesFetcher = ReleasesFetcher;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./ReleasesFetcher"), exports);
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./fetcher"), exports);
package/dist/src/main.js CHANGED
@@ -61,11 +61,16 @@ const main = async ({ options, logger }) => {
61
61
  packageManager: options.packageManager
62
62
  });
63
63
  const pullRequestTitleCreator = new github_1.PullRequestTitleCreator(options.pullRequestTitle);
64
+ const releasesFetcher = new github_1.ReleasesFetcher(github);
65
+ const pullRequestBodyCreator = new github_1.PullRequestBodyCreator({
66
+ releasesFetcher
67
+ });
64
68
  const pullRequestCreator = new github_1.PullRequestCreator({
65
69
  github,
66
70
  gitRepo,
67
71
  githubRepo,
68
72
  pullRequestTitleCreator,
73
+ pullRequestBodyCreator,
69
74
  logger,
70
75
  reviewers: options.reviewers
71
76
  });
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isPackageMetadata = void 0;
4
4
  const io_ts_1 = require("io-ts");
5
5
  const PackageMetadataDependencies_1 = require("./PackageMetadataDependencies");
6
+ const PackageMetadataRepository_1 = require("./PackageMetadataRepository");
6
7
  const PackageMetadata = (0, io_ts_1.intersection)([
7
8
  (0, io_ts_1.type)({
8
9
  name: io_ts_1.string,
@@ -12,7 +13,8 @@ const PackageMetadata = (0, io_ts_1.intersection)([
12
13
  dependencies: PackageMetadataDependencies_1.PackageMetadataDependencies,
13
14
  devDependencies: PackageMetadataDependencies_1.PackageMetadataDependencies,
14
15
  peerDependencies: PackageMetadataDependencies_1.PackageMetadataDependencies,
15
- optionalDependencies: PackageMetadataDependencies_1.PackageMetadataDependencies
16
+ optionalDependencies: PackageMetadataDependencies_1.PackageMetadataDependencies,
17
+ repository: (0, io_ts_1.union)([io_ts_1.string, PackageMetadataRepository_1.PackageMetadataRepository])
16
18
  })
17
19
  ]);
18
20
  exports.isPackageMetadata = PackageMetadata.is;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPackageMetadataRepository = exports.PackageMetadataRepository = void 0;
4
+ const io_ts_1 = require("io-ts");
5
+ exports.PackageMetadataRepository = (0, io_ts_1.type)({
6
+ url: io_ts_1.string
7
+ });
8
+ exports.isPackageMetadataRepository = exports.PackageMetadataRepository.is;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractRepository = void 0;
4
+ const git_1 = require("../git");
5
+ const parseRepositoryString_1 = require("./parseRepositoryString");
6
+ const extractRepository = ({ repository }) => {
7
+ if (repository === undefined) {
8
+ return undefined;
9
+ }
10
+ if (typeof repository === 'string') {
11
+ const { owner, repo, isGitHub } = (0, parseRepositoryString_1.parseRepositoryString)(repository);
12
+ if (!isGitHub) {
13
+ return undefined;
14
+ }
15
+ return git_1.GitRepository.of(`${owner}/${repo}`);
16
+ }
17
+ const { url } = repository;
18
+ return git_1.GitRepository.of(url.replace(/^git\+/, ''));
19
+ };
20
+ exports.extractRepository = extractRepository;
@@ -10,5 +10,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
10
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./extractRepository"), exports);
13
14
  __exportStar(require("./PackageMetadata"), exports);
14
15
  __exportStar(require("./parsePackageJson"), exports);
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRepositoryString = void 0;
4
+ const parseRepositoryString = (repository) => {
5
+ const matched = repository.match(/^((.+):)?(.+)\/(.+)/);
6
+ if (matched === null) {
7
+ throw new Error(`Failed to parse repository. repository=${repository}`);
8
+ }
9
+ const [, , type, owner, repo] = matched;
10
+ /* istanbul ignore if: I can't write a test to reach here. */
11
+ if (owner === undefined || repo === undefined) {
12
+ throw new Error(`Failed to parse repository. repository=${repository}`);
13
+ }
14
+ return {
15
+ owner,
16
+ repo,
17
+ isGitHub: type === undefined || type === 'github'
18
+ };
19
+ };
20
+ exports.parseRepositoryString = parseRepositoryString;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "npm-update-package",
3
- "version": "0.34.0",
3
+ "version": "0.37.0",
4
4
  "description": "CLI tool for creating pull requests to update npm packages",
5
5
  "scripts": {
6
6
  "build": "tsc --project tsconfig.build.json",
@@ -35,7 +35,7 @@
35
35
  "@types/node": "12.20.40",
36
36
  "@types/parse-github-url": "1.0.0",
37
37
  "@types/semver": "7.3.9",
38
- "@typescript-eslint/eslint-plugin": "5.12.0",
38
+ "@typescript-eslint/eslint-plugin": "5.12.1",
39
39
  "eslint": "8.9.0",
40
40
  "eslint-config-standard-with-typescript": "21.0.1",
41
41
  "eslint-plugin-import": "2.25.4",
@@ -1,39 +0,0 @@
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.createPullRequestBody = void 0;
7
- const package_json_1 = __importDefault(require("../../../../package.json"));
8
- const json_1 = require("../../../json");
9
- const metadata_1 = require("../metadata");
10
- const createPullRequestBody = (outdatedPackage) => {
11
- const currentVersion = outdatedPackage.currentVersion.version;
12
- const newVersion = outdatedPackage.newVersion.version;
13
- const packageName = outdatedPackage.name;
14
- const level = outdatedPackage.level;
15
- const metadata = (0, json_1.toJSON)((0, metadata_1.createPullRequestMetadata)([outdatedPackage]), { pretty: true });
16
- return `This PR updates these packages:
17
-
18
- |Package|Level|Current version|New version|
19
- |---|---|---|---|
20
- |[${packageName}](https://www.npmjs.com/package/${packageName})|${level}|\`${currentVersion}\`|\`${newVersion}\`|
21
-
22
- <details>
23
- <summary>Metadata</summary>
24
-
25
- **Don't remove or edit this section because it will be used by npm-update-package.**
26
-
27
- <div id="npm-update-package-metadata">
28
-
29
- \`\`\`json
30
- ${metadata}
31
- \`\`\`
32
-
33
- </div>
34
- </details>
35
-
36
- ---
37
- This PR has been generated by [${package_json_1.default.name}](${package_json_1.default.homepage}) v${package_json_1.default.version}`;
38
- };
39
- exports.createPullRequestBody = createPullRequestBody;