release-please 13.5.0 → 13.6.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/CHANGELOG.md CHANGED
@@ -4,6 +4,15 @@
4
4
 
5
5
  [1]: https://www.npmjs.com/package/release-please?activeTab=versions
6
6
 
7
+ ## [13.6.0](https://github.com/googleapis/release-please/compare/v13.5.0...v13.6.0) (2022-03-16)
8
+
9
+
10
+ ### Features
11
+
12
+ * add linked-versions plugin for grouping components ([#1327](https://github.com/googleapis/release-please/issues/1327)) ([f398bdf](https://github.com/googleapis/release-please/commit/f398bdffdae69772c61a82cd7158cca3478c2110))
13
+ * introduce generic json updater ([#1332](https://github.com/googleapis/release-please/issues/1332)) ([ecbfcf0](https://github.com/googleapis/release-please/commit/ecbfcf03f7854ced3ace5eafd95f7872ddee1d14))
14
+ * introduce generic xml updater ([#1337](https://github.com/googleapis/release-please/issues/1337)) ([02ef78b](https://github.com/googleapis/release-please/commit/02ef78b4d6a855236ff80fc139fd00a46f88d445))
15
+
7
16
  ## [13.5.0](https://github.com/googleapis/release-please/compare/v13.4.15...v13.5.0) (2022-03-08)
8
17
 
9
18
 
@@ -39,6 +39,7 @@ const node_workspace_1 = require("./plugins/node-workspace");
39
39
  const cargo_workspace_1 = require("./plugins/cargo-workspace");
40
40
  const github_1 = require("./changelog-notes/github");
41
41
  const default_2 = require("./changelog-notes/default");
42
+ const linked_versions_1 = require("./plugins/linked-versions");
42
43
  // Factory shared by GitHub Action and CLI for creating Release PRs
43
44
  // and GitHub Releases:
44
45
  // add any new releasers you create to this type as well as the `releasers`
@@ -191,6 +192,14 @@ function buildVersioningStrategy(options) {
191
192
  }
192
193
  }
193
194
  function buildPlugin(options) {
195
+ if (typeof options.type === 'object') {
196
+ switch (options.type.type) {
197
+ case 'linked-versions':
198
+ return new linked_versions_1.LinkedVersions(options.github, options.targetBranch, options.repositoryConfig, options.type.groupName, options.type.components);
199
+ default:
200
+ throw new Error(`Unknown plugin type: ${options.type}`);
201
+ }
202
+ }
194
203
  switch (options.type) {
195
204
  case 'cargo-workspace':
196
205
  return new cargo_workspace_1.CargoWorkspace(options.github, options.targetBranch, options.repositoryConfig, options);
@@ -5,6 +5,17 @@ import { PullRequest } from './pull-request';
5
5
  import { ReleasePullRequest } from './release-pull-request';
6
6
  import { ReleaseType, VersioningStrategyType, ChangelogNotesType } from './factory';
7
7
  import { Release } from './release';
8
+ declare type ExtraJsonFile = {
9
+ type: 'json';
10
+ path: string;
11
+ jsonpath: string;
12
+ };
13
+ declare type ExtraXmlFile = {
14
+ type: 'xml';
15
+ path: string;
16
+ xpath: string;
17
+ };
18
+ export declare type ExtraFile = string | ExtraJsonFile | ExtraXmlFile;
8
19
  /**
9
20
  * These are configurations provided to each strategy per-path.
10
21
  */
@@ -27,7 +38,7 @@ export interface ReleaserConfig {
27
38
  changelogPath?: string;
28
39
  changelogType?: ChangelogNotesType;
29
40
  versionFile?: string;
30
- extraFiles?: string[];
41
+ extraFiles?: ExtraFile[];
31
42
  }
32
43
  export interface CandidateReleasePullRequest {
33
44
  path: string;
@@ -80,7 +91,13 @@ interface ReleaserPackageConfig extends ReleaserConfigJson {
80
91
  component?: string;
81
92
  'changelog-path'?: string;
82
93
  }
83
- export declare type PluginType = 'node-workspace' | 'cargo-workspace';
94
+ declare type DirectPluginType = 'node-workspace' | 'cargo-workspace';
95
+ interface LinkedVersionPluginConfig {
96
+ type: 'linked-versions';
97
+ groupName: string;
98
+ components: string[];
99
+ }
100
+ export declare type PluginType = DirectPluginType | LinkedVersionPluginConfig;
84
101
  /**
85
102
  * This is the schema of the manifest config json
86
103
  */
@@ -270,33 +270,54 @@ class Manifest {
270
270
  includeEmpty: true,
271
271
  packagePaths: Object.keys(this.repositoryConfig),
272
272
  });
273
- const commitsPerPath = cs.split(commits);
274
- let newReleasePullRequests = [];
273
+ const splitCommits = cs.split(commits);
274
+ // limit paths to ones since the last release
275
+ const commitsPerPath = {};
275
276
  for (const path in this.repositoryConfig) {
276
- const config = this.repositoryConfig[path];
277
- logger_1.logger.info(`Building candidate release pull request for path: ${path}`);
278
- logger_1.logger.debug(`type: ${config.releaseType}`);
279
- logger_1.logger.debug(`targetBranch: ${this.targetBranch}`);
280
- const pathCommits = commitsAfterSha(path === exports.ROOT_PROJECT_PATH ? commits : commitsPerPath[path], releaseShasByPath[path]);
281
- logger_1.logger.debug(`commits: ${pathCommits.length}`);
282
- const latestReleasePullRequest = releasePullRequestsBySha[releaseShasByPath[path]];
283
- if (!latestReleasePullRequest) {
284
- logger_1.logger.warn('No latest release pull request found.');
285
- }
286
- const strategy = strategiesByPath[path];
287
- let latestRelease = releasesByPath[path];
277
+ commitsPerPath[path] = commitsAfterSha(path === exports.ROOT_PROJECT_PATH ? commits : splitCommits[path], releaseShasByPath[path]);
278
+ }
279
+ // backfill latest release tags from manifest
280
+ for (const path in this.repositoryConfig) {
281
+ const latestRelease = releasesByPath[path];
288
282
  if (!latestRelease &&
289
283
  this.releasedVersions[path] &&
290
284
  this.releasedVersions[path].toString() !== '0.0.0') {
291
285
  const version = this.releasedVersions[path];
286
+ const strategy = strategiesByPath[path];
292
287
  const component = await strategy.getComponent();
293
288
  logger_1.logger.info(`No latest release found for path: ${path}, component: ${component}, but a previous version (${version.toString()}) was specified in the manifest.`);
294
- latestRelease = {
289
+ releasesByPath[path] = {
295
290
  tag: new tag_name_1.TagName(version, component),
296
291
  sha: '',
297
292
  notes: '',
298
293
  };
299
294
  }
295
+ }
296
+ // Build plugins
297
+ const plugins = this.plugins.map(pluginType => factory_1.buildPlugin({
298
+ type: pluginType,
299
+ github: this.github,
300
+ targetBranch: this.targetBranch,
301
+ repositoryConfig: this.repositoryConfig,
302
+ }));
303
+ let strategies = strategiesByPath;
304
+ for (const plugin of plugins) {
305
+ strategies = await plugin.preconfigure(strategies, commitsPerPath, releasesByPath);
306
+ }
307
+ let newReleasePullRequests = [];
308
+ for (const path in this.repositoryConfig) {
309
+ const config = this.repositoryConfig[path];
310
+ logger_1.logger.info(`Building candidate release pull request for path: ${path}`);
311
+ logger_1.logger.debug(`type: ${config.releaseType}`);
312
+ logger_1.logger.debug(`targetBranch: ${this.targetBranch}`);
313
+ const pathCommits = commitsPerPath[path];
314
+ logger_1.logger.debug(`commits: ${pathCommits.length}`);
315
+ const latestReleasePullRequest = releasePullRequestsBySha[releaseShasByPath[path]];
316
+ if (!latestReleasePullRequest) {
317
+ logger_1.logger.warn('No latest release pull request found.');
318
+ }
319
+ const strategy = strategies[path];
320
+ const latestRelease = releasesByPath[path];
300
321
  const releasePullRequest = await strategy.buildReleasePullRequest(pathCommits, latestRelease, (_a = config.draftPullRequest) !== null && _a !== void 0 ? _a : this.draftPullRequest, this.labels);
301
322
  if (releasePullRequest) {
302
323
  if (releasePullRequest.version) {
@@ -318,13 +339,6 @@ class Manifest {
318
339
  });
319
340
  }
320
341
  }
321
- // Build plugins
322
- const plugins = this.plugins.map(pluginType => factory_1.buildPlugin({
323
- type: pluginType,
324
- github: this.github,
325
- targetBranch: this.targetBranch,
326
- repositoryConfig: this.repositoryConfig,
327
- }));
328
342
  // Combine pull requests into 1 unless configured for separate
329
343
  // pull requests
330
344
  if (!this.separatePullRequests) {
@@ -1,5 +1,8 @@
1
1
  import { GitHub } from './github';
2
2
  import { CandidateReleasePullRequest, RepositoryConfig } from './manifest';
3
+ import { Strategy } from './strategy';
4
+ import { Commit } from './commit';
5
+ import { Release } from './release';
3
6
  /**
4
7
  * A plugin runs after a repository manifest has built candidate
5
8
  * pull requests and can make updates that span across multiple
@@ -16,5 +19,11 @@ export declare abstract class ManifestPlugin {
16
19
  * @param {CandidateReleasePullRequest[]} pullRequests Candidate pull requests
17
20
  * @returns {CandidateReleasePullRequest[]} Updated pull requests
18
21
  */
19
- abstract run(pullRequests: CandidateReleasePullRequest[]): Promise<CandidateReleasePullRequest[]>;
22
+ run(pullRequests: CandidateReleasePullRequest[]): Promise<CandidateReleasePullRequest[]>;
23
+ /**
24
+ * Pre-configure strategies.
25
+ * @param {Record<string, Strategy>} strategiesByPath Strategies indexed by path
26
+ * @returns {Record<string, Strategy>} Updated strategies indexed by path
27
+ */
28
+ preconfigure(strategiesByPath: Record<string, Strategy>, _commitsByPath: Record<string, Commit[]>, _releasesByPath: Record<string, Release>): Promise<Record<string, Strategy>>;
20
29
  }
@@ -26,6 +26,22 @@ class ManifestPlugin {
26
26
  this.targetBranch = targetBranch;
27
27
  this.repositoryConfig = repositoryConfig;
28
28
  }
29
+ /**
30
+ * Post-process candidate pull requests.
31
+ * @param {CandidateReleasePullRequest[]} pullRequests Candidate pull requests
32
+ * @returns {CandidateReleasePullRequest[]} Updated pull requests
33
+ */
34
+ async run(pullRequests) {
35
+ return pullRequests;
36
+ }
37
+ /**
38
+ * Pre-configure strategies.
39
+ * @param {Record<string, Strategy>} strategiesByPath Strategies indexed by path
40
+ * @returns {Record<string, Strategy>} Updated strategies indexed by path
41
+ */
42
+ async preconfigure(strategiesByPath, _commitsByPath, _releasesByPath) {
43
+ return strategiesByPath;
44
+ }
29
45
  }
30
46
  exports.ManifestPlugin = ManifestPlugin;
31
47
  //# sourceMappingURL=plugin.js.map
@@ -0,0 +1,29 @@
1
+ import { ManifestPlugin } from '../plugin';
2
+ import { RepositoryConfig, CandidateReleasePullRequest } from '../manifest';
3
+ import { GitHub } from '../github';
4
+ import { Strategy } from '../strategy';
5
+ import { Commit } from '../commit';
6
+ import { Release } from '../release';
7
+ /**
8
+ * This plugin reconfigures strategies by linking multiple components
9
+ * together.
10
+ *
11
+ * Release notes are broken up using `<summary>`/`<details>` blocks.
12
+ */
13
+ export declare class LinkedVersions extends ManifestPlugin {
14
+ private groupName;
15
+ private components;
16
+ constructor(github: GitHub, targetBranch: string, repositoryConfig: RepositoryConfig, groupName: string, components: string[]);
17
+ /**
18
+ * Pre-configure strategies.
19
+ * @param {Record<string, Strategy>} strategiesByPath Strategies indexed by path
20
+ * @returns {Record<string, Strategy>} Updated strategies indexed by path
21
+ */
22
+ preconfigure(strategiesByPath: Record<string, Strategy>, commitsByPath: Record<string, Commit[]>, releasesByPath: Record<string, Release>): Promise<Record<string, Strategy>>;
23
+ /**
24
+ * Post-process candidate pull requests.
25
+ * @param {CandidateReleasePullRequest[]} pullRequests Candidate pull requests
26
+ * @returns {CandidateReleasePullRequest[]} Updated pull requests
27
+ */
28
+ run(candidates: CandidateReleasePullRequest[]): Promise<CandidateReleasePullRequest[]>;
29
+ }
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ // Copyright 2022 Google LLC
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.LinkedVersions = void 0;
17
+ const plugin_1 = require("../plugin");
18
+ const logger_1 = require("../util/logger");
19
+ const factory_1 = require("../factory");
20
+ const merge_1 = require("./merge");
21
+ /**
22
+ * This plugin reconfigures strategies by linking multiple components
23
+ * together.
24
+ *
25
+ * Release notes are broken up using `<summary>`/`<details>` blocks.
26
+ */
27
+ class LinkedVersions extends plugin_1.ManifestPlugin {
28
+ constructor(github, targetBranch, repositoryConfig, groupName, components) {
29
+ super(github, targetBranch, repositoryConfig);
30
+ this.groupName = groupName;
31
+ this.components = new Set(components);
32
+ }
33
+ /**
34
+ * Pre-configure strategies.
35
+ * @param {Record<string, Strategy>} strategiesByPath Strategies indexed by path
36
+ * @returns {Record<string, Strategy>} Updated strategies indexed by path
37
+ */
38
+ async preconfigure(strategiesByPath, commitsByPath, releasesByPath) {
39
+ // Find all strategies in the group
40
+ const groupStrategies = {};
41
+ for (const path in strategiesByPath) {
42
+ const strategy = strategiesByPath[path];
43
+ const component = await strategy.getComponent();
44
+ if (!component) {
45
+ continue;
46
+ }
47
+ if (this.components.has(component)) {
48
+ groupStrategies[path] = strategy;
49
+ }
50
+ }
51
+ logger_1.logger.info(`Found ${Object.keys(groupStrategies).length} group components for ${this.groupName}`);
52
+ const groupVersions = {};
53
+ const missingReleasePaths = new Set();
54
+ for (const path in groupStrategies) {
55
+ const strategy = groupStrategies[path];
56
+ const latestRelease = releasesByPath[path];
57
+ const releasePullRequest = await strategy.buildReleasePullRequest(commitsByPath[path], latestRelease);
58
+ if (releasePullRequest === null || releasePullRequest === void 0 ? void 0 : releasePullRequest.version) {
59
+ groupVersions[path] = releasePullRequest.version;
60
+ }
61
+ else {
62
+ missingReleasePaths.add(path);
63
+ }
64
+ }
65
+ const versions = Object.values(groupVersions);
66
+ if (versions.length === 0) {
67
+ return strategiesByPath;
68
+ }
69
+ const primaryVersion = versions.reduce((collector, version) => collector.compare(version) > 0 ? collector : version, versions[0]);
70
+ const newStrategies = {};
71
+ for (const path in strategiesByPath) {
72
+ if (path in groupStrategies) {
73
+ const component = await strategiesByPath[path].getComponent();
74
+ logger_1.logger.info(`Replacing strategy for path ${path} with forced version: ${primaryVersion}`);
75
+ newStrategies[path] = await factory_1.buildStrategy({
76
+ ...this.repositoryConfig[path],
77
+ github: this.github,
78
+ path,
79
+ targetBranch: this.targetBranch,
80
+ releaseAs: primaryVersion.toString(),
81
+ });
82
+ if (missingReleasePaths.has(path)) {
83
+ logger_1.logger.debug(`Appending fake commit for path: ${path}`);
84
+ commitsByPath[path].push({
85
+ sha: '',
86
+ message: `chore(${component}): Synchronize ${this.groupName} versions\n\nRelease-As: ${primaryVersion.toString()}`,
87
+ });
88
+ }
89
+ }
90
+ else {
91
+ newStrategies[path] = strategiesByPath[path];
92
+ }
93
+ }
94
+ return newStrategies;
95
+ }
96
+ /**
97
+ * Post-process candidate pull requests.
98
+ * @param {CandidateReleasePullRequest[]} pullRequests Candidate pull requests
99
+ * @returns {CandidateReleasePullRequest[]} Updated pull requests
100
+ */
101
+ async run(candidates) {
102
+ const [inScopeCandidates, outOfScopeCandidates] = candidates.reduce((collection, candidate) => {
103
+ if (!candidate.pullRequest.version) {
104
+ logger_1.logger.warn('pull request missing version', candidate);
105
+ return collection;
106
+ }
107
+ if (this.components.has(candidate.config.component || '')) {
108
+ collection[0].push(candidate);
109
+ }
110
+ else {
111
+ collection[1].push(candidate);
112
+ }
113
+ return collection;
114
+ }, [[], []]);
115
+ // delegate to the merge plugin and add merged pull request
116
+ if (inScopeCandidates.length > 0) {
117
+ const merge = new merge_1.Merge(this.github, this.targetBranch, this.repositoryConfig, `chore\${branch}: release ${this.groupName} libraries`);
118
+ const merged = await merge.run(inScopeCandidates);
119
+ outOfScopeCandidates.push(...merged);
120
+ }
121
+ return outOfScopeCandidates;
122
+ }
123
+ }
124
+ exports.LinkedVersions = LinkedVersions;
125
+ //# sourceMappingURL=linked-versions.js.map
@@ -3,6 +3,7 @@ import { GitHub } from '../github';
3
3
  import { VersioningStrategy } from '../versioning-strategy';
4
4
  import { Repository } from '../repository';
5
5
  import { ChangelogNotes, ChangelogSection } from '../changelog-notes';
6
+ import { ExtraFile } from '../manifest';
6
7
  import { Update } from '../update';
7
8
  import { ConventionalCommit, Commit } from '../commit';
8
9
  import { Version, VersionsMap } from '../version';
@@ -37,7 +38,7 @@ export interface BaseStrategyOptions {
37
38
  changelogNotes?: ChangelogNotes;
38
39
  includeComponentInTag?: boolean;
39
40
  pullRequestTitlePattern?: string;
40
- extraFiles?: string[];
41
+ extraFiles?: ExtraFile[];
41
42
  }
42
43
  /**
43
44
  * A strategy is responsible for determining which files are
@@ -57,7 +58,7 @@ export declare abstract class BaseStrategy implements Strategy {
57
58
  private releaseAs?;
58
59
  protected includeComponentInTag: boolean;
59
60
  private pullRequestTitlePattern?;
60
- readonly extraFiles: string[];
61
+ readonly extraFiles: ExtraFile[];
61
62
  readonly changelogNotes: ChangelogNotes;
62
63
  protected changelogSections?: ChangelogSection[];
63
64
  constructor(options: BaseStrategyOptions);
@@ -26,6 +26,8 @@ const branch_name_1 = require("../util/branch-name");
26
26
  const pull_request_body_1 = require("../util/pull-request-body");
27
27
  const composite_1 = require("../updaters/composite");
28
28
  const generic_1 = require("../updaters/generic");
29
+ const generic_json_1 = require("../updaters/generic-json");
30
+ const generic_xml_1 = require("../updaters/generic-xml");
29
31
  const DEFAULT_CHANGELOG_PATH = 'CHANGELOG.md';
30
32
  /**
31
33
  * A strategy is responsible for determining which files are
@@ -163,12 +165,31 @@ class BaseStrategy {
163
165
  };
164
166
  }
165
167
  extraFileUpdates(version) {
166
- const genericUpdater = new generic_1.Generic({ version });
167
- return this.extraFiles.map(path => ({
168
- path: this.addPath(path),
169
- createIfMissing: false,
170
- updater: genericUpdater,
171
- }));
168
+ return this.extraFiles.map(extraFile => {
169
+ if (typeof extraFile === 'object') {
170
+ switch (extraFile.type) {
171
+ case 'json':
172
+ return {
173
+ path: this.addPath(extraFile.path),
174
+ createIfMissing: false,
175
+ updater: new generic_json_1.GenericJson(extraFile.jsonpath, version),
176
+ };
177
+ case 'xml':
178
+ return {
179
+ path: this.addPath(extraFile.path),
180
+ createIfMissing: false,
181
+ updater: new generic_xml_1.GenericXml(extraFile.xpath, version),
182
+ };
183
+ default:
184
+ throw new Error(`unsupported extraFile type: ${extraFile.type}`);
185
+ }
186
+ }
187
+ return {
188
+ path: this.addPath(extraFile),
189
+ createIfMissing: false,
190
+ updater: new generic_1.Generic({ version }),
191
+ };
192
+ });
172
193
  }
173
194
  changelogEmpty(changelogEntry) {
174
195
  return changelogEntry.split('\n').length <= 1;
@@ -198,9 +198,12 @@ class JavaYoshi extends base_1.BaseStrategy {
198
198
  }),
199
199
  });
200
200
  });
201
- this.extraFiles.forEach(path => {
201
+ this.extraFiles.forEach(extraFile => {
202
+ if (typeof extraFile === 'object') {
203
+ return;
204
+ }
202
205
  updates.push({
203
- path,
206
+ path: extraFile,
204
207
  createIfMissing: false,
205
208
  updater: new java_update_1.JavaUpdate({
206
209
  version,
@@ -0,0 +1,13 @@
1
+ import { Updater } from '../update';
2
+ import { Version } from '../version';
3
+ export declare class GenericJson implements Updater {
4
+ readonly jsonpath: string;
5
+ readonly version: Version;
6
+ constructor(jsonpath: string, version: Version);
7
+ /**
8
+ * Given initial file contents, return updated contents.
9
+ * @param {string} content The initial content
10
+ * @returns {string} The updated content
11
+ */
12
+ updateContent(content: string): string;
13
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ // Copyright 2022 Google LLC
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.GenericJson = void 0;
17
+ const jp = require("jsonpath");
18
+ const json_stringify_1 = require("../util/json-stringify");
19
+ const logger_1 = require("../util/logger");
20
+ class GenericJson {
21
+ constructor(jsonpath, version) {
22
+ this.jsonpath = jsonpath;
23
+ this.version = version;
24
+ }
25
+ /**
26
+ * Given initial file contents, return updated contents.
27
+ * @param {string} content The initial content
28
+ * @returns {string} The updated content
29
+ */
30
+ updateContent(content) {
31
+ const data = JSON.parse(content);
32
+ const nodes = jp.apply(data, this.jsonpath, _val => {
33
+ return this.version.toString();
34
+ });
35
+ if (!nodes) {
36
+ logger_1.logger.warn(`No entries modified in ${this.jsonpath}`);
37
+ return content;
38
+ }
39
+ return json_stringify_1.jsonStringify(data, content);
40
+ }
41
+ }
42
+ exports.GenericJson = GenericJson;
43
+ //# sourceMappingURL=generic-json.js.map
@@ -0,0 +1,13 @@
1
+ import { Updater } from '../update';
2
+ import { Version } from '../version';
3
+ export declare class GenericXml implements Updater {
4
+ private xpath;
5
+ private version;
6
+ constructor(xpath: string, version: Version);
7
+ /**
8
+ * Given initial file contents, return updated contents.
9
+ * @param {string} content The initial content
10
+ * @returns {string} The updated content
11
+ */
12
+ updateContent(content: string): string;
13
+ }
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ // Copyright 2022 Google LLC
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.GenericXml = void 0;
17
+ const xpath = require("xpath");
18
+ const dom = require("xmldom");
19
+ class GenericXml {
20
+ constructor(xpath, version) {
21
+ this.xpath = xpath;
22
+ this.version = version;
23
+ }
24
+ /**
25
+ * Given initial file contents, return updated contents.
26
+ * @param {string} content The initial content
27
+ * @returns {string} The updated content
28
+ */
29
+ updateContent(content) {
30
+ const document = new dom.DOMParser().parseFromString(content);
31
+ const iterator = xpath.evaluate(this.xpath, document, null, 0, null);
32
+ let node;
33
+ let updated = false;
34
+ while ((node = iterator.iterateNext())) {
35
+ node.textContent = this.version.toString();
36
+ updated = true;
37
+ }
38
+ if (updated) {
39
+ return new dom.XMLSerializer().serializeToString(document);
40
+ }
41
+ else {
42
+ return content;
43
+ }
44
+ }
45
+ }
46
+ exports.GenericXml = GenericXml;
47
+ //# sourceMappingURL=generic-xml.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-please",
3
- "version": "13.5.0",
3
+ "version": "13.6.0",
4
4
  "description": "generate release PRs based on the conventionalcommits.org spec",
5
5
  "main": "./build/src/index.js",
6
6
  "bin": "./build/src/bin/release-please.js",
@@ -41,11 +41,13 @@
41
41
  "@types/chai": "^4.1.7",
42
42
  "@types/iarna__toml": "^2.0.1",
43
43
  "@types/js-yaml": "^4.0.0",
44
+ "@types/jsonpath": "^0.2.0",
44
45
  "@types/mocha": "^9.0.0",
45
46
  "@types/node": "^16.0.0",
46
47
  "@types/pino": "^7.0.0",
47
48
  "@types/semver": "^7.0.0",
48
49
  "@types/sinon": "^10.0.0",
50
+ "@types/xmldom": "^0.1.31",
49
51
  "@types/yargs": "^17.0.0",
50
52
  "c8": "^7.0.0",
51
53
  "chai": "^4.2.0",
@@ -76,6 +78,7 @@
76
78
  "detect-indent": "^6.1.0",
77
79
  "figures": "^3.0.0",
78
80
  "js-yaml": "^4.0.0",
81
+ "jsonpath": "^1.1.1",
79
82
  "node-html-parser": "^5.0.0",
80
83
  "parse-github-repo-url": "^1.4.1",
81
84
  "semver": "^7.0.0",
@@ -83,6 +86,8 @@
83
86
  "typescript": "^3.8.3",
84
87
  "unist-util-visit": "^2.0.3",
85
88
  "unist-util-visit-parents": "^3.1.1",
89
+ "xmldom": "^0.6.0",
90
+ "xpath": "^0.0.32",
86
91
  "yargs": "^17.0.0"
87
92
  },
88
93
  "engines": {