release-please 13.19.7 → 13.20.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,28 @@
4
4
 
5
5
  [1]: https://www.npmjs.com/package/release-please?activeTab=versions
6
6
 
7
+ ## [13.20.0](https://github.com/googleapis/release-please/compare/v13.19.9...v13.20.0) (2022-08-08)
8
+
9
+
10
+ ### Features
11
+
12
+ * allow plugins to skip merging in-scope pull requests ([#1550](https://github.com/googleapis/release-please/issues/1550)) ([354b1dc](https://github.com/googleapis/release-please/commit/354b1dc89c468e44b59507b4bb2f15d6723110ed))
13
+ * allow skipping snapshots for java strategies ([#1555](https://github.com/googleapis/release-please/issues/1555)) ([3430693](https://github.com/googleapis/release-please/commit/34306932e5fe21c89020b184a527c220d10c8390))
14
+
15
+ ## [13.19.9](https://github.com/googleapis/release-please/compare/v13.19.8...v13.19.9) (2022-08-08)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * php root-composer-update-packages version replace ([#1553](https://github.com/googleapis/release-please/issues/1553)) ([41127e6](https://github.com/googleapis/release-please/commit/41127e688597a0af6502957d85ba8cd6214e9008))
21
+
22
+ ## [13.19.8](https://github.com/googleapis/release-please/compare/v13.19.7...v13.19.8) (2022-08-03)
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * convert ReleaserConfig JSON keys when bootstrapping ([#1535](https://github.com/googleapis/release-please/issues/1535)) ([64c267e](https://github.com/googleapis/release-please/commit/64c267e1c986029b6c483b924950135c138c510f)), closes [#1522](https://github.com/googleapis/release-please/issues/1522)
28
+
7
29
  ## [13.19.7](https://github.com/googleapis/release-please/compare/v13.19.6...v13.19.7) (2022-08-03)
8
30
 
9
31
 
package/README.md CHANGED
@@ -206,6 +206,8 @@ This library follows [Semantic Versioning](http://semver.org/).
206
206
 
207
207
  Contributions welcome! See the [Contributing Guide](https://github.com/googleapis/release-please/blob/main/CONTRIBUTING.md).
208
208
 
209
+ For more information on the design of the library, see [design](https://github.com/googleapis/release-please/blob/main/docs/design.md).
210
+
209
211
  ## License
210
212
 
211
213
  Apache Version 2.0
@@ -29,7 +29,10 @@ function buildPlugin(options) {
29
29
  if (typeof options.type === 'object') {
30
30
  const builder = pluginFactories[options.type.type];
31
31
  if (builder) {
32
- return builder(options);
32
+ return builder({
33
+ ...options.type,
34
+ ...options,
35
+ });
33
36
  }
34
37
  throw new errors_1.ConfigurationError(`Unknown plugin type: ${options.type.type}`, 'core', `${options.github.repository.owner}/${options.github.repository.repo}`);
35
38
  }
@@ -45,6 +45,8 @@ export interface ReleaserConfig {
45
45
  pullRequestTitlePattern?: string;
46
46
  tagSeparator?: string;
47
47
  separatePullRequests?: boolean;
48
+ labels?: string[];
49
+ releaseLabels?: string[];
48
50
  changelogSections?: ChangelogSection[];
49
51
  changelogPath?: string;
50
52
  changelogType?: ChangelogNotesType;
@@ -52,6 +54,7 @@ export interface ReleaserConfig {
52
54
  versionFile?: string;
53
55
  extraFiles?: ExtraFile[];
54
56
  snapshotLabels?: string[];
57
+ skipSnapshot?: boolean;
55
58
  }
56
59
  export interface CandidateReleasePullRequest {
57
60
  path: string;
@@ -83,9 +86,10 @@ interface ReleaserConfigJson {
83
86
  'pull-request-title-pattern'?: string;
84
87
  'separate-pull-requests'?: boolean;
85
88
  'tag-separator'?: string;
86
- 'extra-files'?: string[];
89
+ 'extra-files'?: ExtraFile[];
87
90
  'version-file'?: string;
88
91
  'snapshot-label'?: string;
92
+ 'skip-snapshot'?: boolean;
89
93
  }
90
94
  export interface ManifestOptions {
91
95
  bootstrapSha?: string;
@@ -108,7 +112,7 @@ export interface ManifestOptions {
108
112
  releaseSearchDepth?: number;
109
113
  commitSearchDepth?: number;
110
114
  }
111
- interface ReleaserPackageConfig extends ReleaserConfigJson {
115
+ export interface ReleaserPackageConfig extends ReleaserConfigJson {
112
116
  'package-name'?: string;
113
117
  component?: string;
114
118
  'changelog-path'?: string;
@@ -121,8 +125,12 @@ export interface LinkedVersionPluginConfig extends ConfigurablePluginType {
121
125
  type: 'linked-versions';
122
126
  groupName: string;
123
127
  components: string[];
128
+ merge?: boolean;
129
+ }
130
+ export interface WorkspacePluginConfig extends ConfigurablePluginType {
131
+ merge?: boolean;
124
132
  }
125
- export declare type PluginType = DirectPluginType | ConfigurablePluginType | LinkedVersionPluginConfig;
133
+ export declare type PluginType = DirectPluginType | ConfigurablePluginType | LinkedVersionPluginConfig | WorkspacePluginConfig;
126
134
  /**
127
135
  * This is the schema of the manifest config json
128
136
  */
@@ -365,6 +365,7 @@ class Manifest {
365
365
  plugins.push(new merge_1.Merge(this.github, this.targetBranch, this.repositoryConfig, this.groupPullRequestTitlePattern));
366
366
  }
367
367
  for (const plugin of plugins) {
368
+ logger_1.logger.debug(`running plugin: ${plugin.constructor.name}`);
368
369
  newReleasePullRequests = await plugin.run(newReleasePullRequests);
369
370
  }
370
371
  return newReleasePullRequests.map(pullRequestWithConfig => pullRequestWithConfig.pullRequest);
@@ -707,6 +708,7 @@ exports.Manifest = Manifest;
707
708
  * @returns {ReleaserConfig}
708
709
  */
709
710
  function extractReleaserConfig(config) {
711
+ var _a, _b;
710
712
  return {
711
713
  releaseType: config['release-type'],
712
714
  bumpMinorPreMajor: config['bump-minor-pre-major'],
@@ -729,6 +731,9 @@ function extractReleaserConfig(config) {
729
731
  pullRequestTitlePattern: config['pull-request-title-pattern'],
730
732
  tagSeparator: config['tag-separator'],
731
733
  separatePullRequests: config['separate-pull-requests'],
734
+ labels: (_a = config['label']) === null || _a === void 0 ? void 0 : _a.split(','),
735
+ releaseLabels: (_b = config['release-label']) === null || _b === void 0 ? void 0 : _b.split(','),
736
+ skipSnapshot: config['skip-snapshot'],
732
737
  };
733
738
  }
734
739
  /**
@@ -763,9 +768,9 @@ async function parseConfig(github, configFile, branch, onlyPath, releaseAs) {
763
768
  separatePullRequests: config['separate-pull-requests'],
764
769
  groupPullRequestTitlePattern: config['group-pull-request-title-pattern'],
765
770
  plugins: config['plugins'],
766
- labels: configLabel === undefined ? undefined : [configLabel],
767
- releaseLabels: configReleaseLabel === undefined ? undefined : [configReleaseLabel],
768
- snapshotLabels: configSnapshotLabel === undefined ? undefined : [configSnapshotLabel],
771
+ labels: configLabel === null || configLabel === void 0 ? void 0 : configLabel.split(','),
772
+ releaseLabels: configReleaseLabel === null || configReleaseLabel === void 0 ? void 0 : configReleaseLabel.split(','),
773
+ snapshotLabels: configSnapshotLabel === null || configSnapshotLabel === void 0 ? void 0 : configSnapshotLabel.split(','),
769
774
  releaseSearchDepth: config['release-search-depth'],
770
775
  commitSearchDepth: config['commit-search-depth'],
771
776
  sequentialCalls: config['sequential-calls'],
@@ -933,7 +938,7 @@ async function latestReleaseVersion(github, targetBranch, releaseFilter, config,
933
938
  return candidateTagVersion.sort((a, b) => b.compare(a))[0];
934
939
  }
935
940
  function mergeReleaserConfig(defaultConfig, pathConfig) {
936
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
941
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;
937
942
  return {
938
943
  releaseType: (_b = (_a = pathConfig.releaseType) !== null && _a !== void 0 ? _a : defaultConfig.releaseType) !== null && _b !== void 0 ? _b : 'node',
939
944
  bumpMinorPreMajor: (_c = pathConfig.bumpMinorPreMajor) !== null && _c !== void 0 ? _c : defaultConfig.bumpMinorPreMajor,
@@ -955,6 +960,7 @@ function mergeReleaserConfig(defaultConfig, pathConfig) {
955
960
  tagSeparator: (_u = pathConfig.tagSeparator) !== null && _u !== void 0 ? _u : defaultConfig.tagSeparator,
956
961
  pullRequestTitlePattern: (_v = pathConfig.pullRequestTitlePattern) !== null && _v !== void 0 ? _v : defaultConfig.pullRequestTitlePattern,
957
962
  separatePullRequests: (_w = pathConfig.separatePullRequests) !== null && _w !== void 0 ? _w : defaultConfig.separatePullRequests,
963
+ skipSnapshot: (_x = pathConfig.skipSnapshot) !== null && _x !== void 0 ? _x : defaultConfig.skipSnapshot,
958
964
  };
959
965
  }
960
966
  /**
@@ -178,10 +178,16 @@ class CargoWorkspace extends workspace_1.WorkspacePlugin {
178
178
  };
179
179
  }
180
180
  postProcessCandidates(candidates, updatedVersions) {
181
- const rootCandidate = candidates.find(c => c.path === manifest_1.ROOT_PROJECT_PATH);
181
+ let rootCandidate = candidates.find(c => c.path === manifest_1.ROOT_PROJECT_PATH);
182
182
  if (!rootCandidate) {
183
- throw Error('Unable to find root candidate pull request');
183
+ logger_1.logger.warn('Unable to find root candidate pull request');
184
+ rootCandidate = candidates.find(c => c.config.releaseType === 'rust');
184
185
  }
186
+ if (!rootCandidate) {
187
+ logger_1.logger.warn('Unable to find a rust candidate pull request');
188
+ return candidates;
189
+ }
190
+ // Update the root Cargo.lock if it exists
185
191
  rootCandidate.pullRequest.updates.push({
186
192
  path: 'Cargo.lock',
187
193
  createIfMissing: false,
@@ -4,6 +4,9 @@ import { GitHub } from '../github';
4
4
  import { Strategy } from '../strategy';
5
5
  import { Commit } from '../commit';
6
6
  import { Release } from '../release';
7
+ interface LinkedVersionsPluginOptions {
8
+ merge?: boolean;
9
+ }
7
10
  /**
8
11
  * This plugin reconfigures strategies by linking multiple components
9
12
  * together.
@@ -13,7 +16,8 @@ import { Release } from '../release';
13
16
  export declare class LinkedVersions extends ManifestPlugin {
14
17
  private groupName;
15
18
  private components;
16
- constructor(github: GitHub, targetBranch: string, repositoryConfig: RepositoryConfig, groupName: string, components: string[]);
19
+ private merge;
20
+ constructor(github: GitHub, targetBranch: string, repositoryConfig: RepositoryConfig, groupName: string, components: string[], options?: LinkedVersionsPluginOptions);
17
21
  /**
18
22
  * Pre-configure strategies.
19
23
  * @param {Record<string, Strategy>} strategiesByPath Strategies indexed by path
@@ -27,3 +31,4 @@ export declare class LinkedVersions extends ManifestPlugin {
27
31
  */
28
32
  run(candidates: CandidateReleasePullRequest[]): Promise<CandidateReleasePullRequest[]>;
29
33
  }
34
+ export {};
@@ -25,10 +25,12 @@ const merge_1 = require("./merge");
25
25
  * Release notes are broken up using `<summary>`/`<details>` blocks.
26
26
  */
27
27
  class LinkedVersions extends plugin_1.ManifestPlugin {
28
- constructor(github, targetBranch, repositoryConfig, groupName, components) {
28
+ constructor(github, targetBranch, repositoryConfig, groupName, components, options = {}) {
29
+ var _a;
29
30
  super(github, targetBranch, repositoryConfig);
30
31
  this.groupName = groupName;
31
32
  this.components = new Set(components);
33
+ this.merge = (_a = options.merge) !== null && _a !== void 0 ? _a : true;
32
34
  }
33
35
  /**
34
36
  * Pre-configure strategies.
@@ -99,6 +101,9 @@ class LinkedVersions extends plugin_1.ManifestPlugin {
99
101
  * @returns {CandidateReleasePullRequest[]} Updated pull requests
100
102
  */
101
103
  async run(candidates) {
104
+ if (!this.merge) {
105
+ return candidates;
106
+ }
102
107
  const [inScopeCandidates, outOfScopeCandidates] = candidates.reduce((collection, candidate) => {
103
108
  if (!candidate.pullRequest.version) {
104
109
  logger_1.logger.warn('pull request missing version', candidate);
@@ -10,6 +10,7 @@ export interface DependencyNode<T> {
10
10
  export interface WorkspacePluginOptions {
11
11
  manifestPath?: string;
12
12
  updateAllPackages?: boolean;
13
+ merge?: boolean;
13
14
  }
14
15
  export interface AllPackages<T> {
15
16
  allPackages: T[];
@@ -29,6 +30,7 @@ export interface AllPackages<T> {
29
30
  export declare abstract class WorkspacePlugin<T> extends ManifestPlugin {
30
31
  private updateAllPackages;
31
32
  private manifestPath;
33
+ private merge;
32
34
  constructor(github: GitHub, targetBranch: string, repositoryConfig: RepositoryConfig, options?: WorkspacePluginOptions);
33
35
  run(candidates: CandidateReleasePullRequest[]): Promise<CandidateReleasePullRequest[]>;
34
36
  /**
@@ -32,10 +32,11 @@ const release_please_manifest_1 = require("../updaters/release-please-manifest")
32
32
  */
33
33
  class WorkspacePlugin extends plugin_1.ManifestPlugin {
34
34
  constructor(github, targetBranch, repositoryConfig, options = {}) {
35
- var _a, _b;
35
+ var _a, _b, _c;
36
36
  super(github, targetBranch, repositoryConfig);
37
37
  this.manifestPath = (_a = options.manifestPath) !== null && _a !== void 0 ? _a : manifest_1.DEFAULT_RELEASE_PLEASE_MANIFEST;
38
38
  this.updateAllPackages = (_b = options.updateAllPackages) !== null && _b !== void 0 ? _b : false;
39
+ this.merge = (_c = options.merge) !== null && _c !== void 0 ? _c : true;
39
40
  }
40
41
  async run(candidates) {
41
42
  logger_1.logger.info('Running workspace plugin');
@@ -100,23 +101,20 @@ class WorkspacePlugin extends plugin_1.ManifestPlugin {
100
101
  newCandidates.push(newCandidate);
101
102
  }
102
103
  }
103
- logger_1.logger.info(`Merging ${newCandidates.length} in-scope candidates`);
104
- const mergePlugin = new merge_1.Merge(this.github, this.targetBranch, this.repositoryConfig);
105
- newCandidates = await mergePlugin.run(newCandidates);
106
- if (newCandidates.length === 1) {
107
- const newUpdates = newCandidates[0].pullRequest.updates;
108
- newUpdates.push({
109
- path: this.manifestPath,
110
- createIfMissing: false,
111
- updater: new release_please_manifest_1.ReleasePleaseManifest({
112
- version: newCandidates[0].pullRequest.version,
113
- versionsMap: updatedPathVersions,
114
- }),
115
- });
116
- }
117
- else {
118
- logger_1.logger.warn(`Expected 1 merged candidate, got ${newCandidates.length}`);
104
+ if (this.merge) {
105
+ logger_1.logger.info(`Merging ${newCandidates.length} in-scope candidates`);
106
+ const mergePlugin = new merge_1.Merge(this.github, this.targetBranch, this.repositoryConfig);
107
+ newCandidates = await mergePlugin.run(newCandidates);
119
108
  }
109
+ const newUpdates = newCandidates[0].pullRequest.updates;
110
+ newUpdates.push({
111
+ path: this.manifestPath,
112
+ createIfMissing: false,
113
+ updater: new release_please_manifest_1.ReleasePleaseManifest({
114
+ version: newCandidates[0].pullRequest.version,
115
+ versionsMap: updatedPathVersions,
116
+ }),
117
+ });
120
118
  logger_1.logger.info(`Post-processing ${newCandidates.length} in-scope candidates`);
121
119
  newCandidates = this.postProcessCandidates(newCandidates, updatedVersions);
122
120
  return [...outOfScopeCandidates, ...newCandidates];
@@ -43,6 +43,7 @@ export interface BaseStrategyOptions {
43
43
  extraFiles?: ExtraFile[];
44
44
  versionFile?: string;
45
45
  snapshotLabels?: string[];
46
+ skipSnapshot?: boolean;
46
47
  }
47
48
  /**
48
49
  * A strategy is responsible for determining which files are
@@ -16,6 +16,7 @@ export interface JavaBuildUpdatesOption extends BuildUpdatesOptions {
16
16
  export declare class Java extends BaseStrategy {
17
17
  protected readonly snapshotVersioning: VersioningStrategy;
18
18
  protected readonly snapshotLabels: string[];
19
+ readonly skipSnapshot: boolean;
19
20
  constructor(options: BaseStrategyOptions);
20
21
  buildReleasePullRequest(commits: Commit[], latestRelease?: Release, draft?: boolean, labels?: string[]): Promise<ReleasePullRequest | undefined>;
21
22
  protected buildSnapshotPullRequest(latestRelease?: Release, draft?: boolean, labels?: string[]): Promise<ReleasePullRequest>;
@@ -47,7 +47,7 @@ const CHANGELOG_SECTIONS = [
47
47
  */
48
48
  class Java extends base_1.BaseStrategy {
49
49
  constructor(options) {
50
- var _a;
50
+ var _a, _b;
51
51
  options.changelogSections = (_a = options.changelogSections) !== null && _a !== void 0 ? _a : CHANGELOG_SECTIONS;
52
52
  // wrap the configured versioning strategy with snapshotting
53
53
  const parentVersioningStrategy = options.versioningStrategy || new default_1.DefaultVersioningStrategy();
@@ -55,6 +55,7 @@ class Java extends base_1.BaseStrategy {
55
55
  super(options);
56
56
  this.snapshotVersioning = new java_add_snapshot_1.JavaAddSnapshot(parentVersioningStrategy);
57
57
  this.snapshotLabels = options.snapshotLabels || manifest_1.DEFAULT_SNAPSHOT_LABELS;
58
+ this.skipSnapshot = (_b = options.skipSnapshot) !== null && _b !== void 0 ? _b : false;
58
59
  }
59
60
  async buildReleasePullRequest(commits, latestRelease, draft, labels = []) {
60
61
  if (await this.needsSnapshot(commits, latestRelease)) {
@@ -107,6 +108,9 @@ class Java extends base_1.BaseStrategy {
107
108
  }
108
109
  async needsSnapshot(commits, latestRelease) {
109
110
  var _a;
111
+ if (this.skipSnapshot) {
112
+ return false;
113
+ }
110
114
  const component = await this.getComponent();
111
115
  logger_1.logger.debug('component:', component);
112
116
  const version = (_a = latestRelease === null || latestRelease === void 0 ? void 0 : latestRelease.tag) === null || _a === void 0 ? void 0 : _a.version;
@@ -33,11 +33,18 @@ class RootComposerUpdatePackages extends default_1.DefaultUpdater {
33
33
  }
34
34
  const parsed = JSON.parse(content);
35
35
  if (this.versionsMap) {
36
- // eslint-disable-next-line prefer-const
37
- for (let [key, version] of this.versionsMap.entries()) {
38
- version = version || '1.0.0';
39
- logger_1.logger.info(`updating ${key} from ${parsed.replace[key]} to ${version}`);
40
- parsed.replace[key] = version.toString();
36
+ for (const [key, version] of this.versionsMap.entries()) {
37
+ const toVersion = version.toString() || '1.0.0';
38
+ let fromVersion;
39
+ if (parsed.replace) {
40
+ fromVersion = parsed.replace[key];
41
+ parsed.replace[key] = toVersion;
42
+ }
43
+ if (parsed[key]) {
44
+ fromVersion !== null && fromVersion !== void 0 ? fromVersion : (fromVersion = parsed[key]);
45
+ parsed[key] = toVersion;
46
+ }
47
+ logger_1.logger.info(`updating ${key} from ${fromVersion} to ${toVersion}`);
41
48
  }
42
49
  }
43
50
  return (0, json_stringify_1.jsonStringify)(parsed, content);
@@ -28,7 +28,7 @@ class ReleasePleaseConfig {
28
28
  else {
29
29
  parsed = { packages: {} };
30
30
  }
31
- parsed.packages[this.path] = this.config;
31
+ parsed.packages[this.path] = releaserConfigToJsonConfig(this.config);
32
32
  if (content) {
33
33
  return (0, json_stringify_1.jsonStringify)(parsed, content);
34
34
  }
@@ -38,4 +38,34 @@ class ReleasePleaseConfig {
38
38
  }
39
39
  }
40
40
  exports.ReleasePleaseConfig = ReleasePleaseConfig;
41
+ function releaserConfigToJsonConfig(config) {
42
+ var _a, _b, _c;
43
+ const jsonConfig = {
44
+ 'package-name': config.packageName,
45
+ component: config.component,
46
+ 'changelog-path': config.changelogPath,
47
+ 'release-type': config.releaseType,
48
+ 'bump-minor-pre-major': config.bumpMinorPreMajor,
49
+ 'bump-patch-for-minor-pre-major': config.bumpPatchForMinorPreMajor,
50
+ 'changelog-sections': config.changelogSections,
51
+ 'release-as': config.releaseAs,
52
+ 'skip-github-release': config.skipGithubRelease,
53
+ draft: config.draft,
54
+ prerelease: config.prerelease,
55
+ 'draft-pull-request': config.draftPullRequest,
56
+ label: (_a = config.labels) === null || _a === void 0 ? void 0 : _a.join(','),
57
+ 'release-label': (_b = config.releaseLabels) === null || _b === void 0 ? void 0 : _b.join(','),
58
+ 'include-component-in-tag': config.includeComponentInTag,
59
+ 'include-v-in-tag': config.includeVInTag,
60
+ 'changelog-type': config.changelogType,
61
+ 'changelog-host': config.changelogHost,
62
+ 'pull-request-title-pattern': config.pullRequestTitlePattern,
63
+ 'separate-pull-requests': config.separatePullRequests,
64
+ 'tag-separator': config.tagSeparator,
65
+ 'extra-files': config.extraFiles,
66
+ 'version-file': config.versionFile,
67
+ 'snapshot-label': (_c = config.snapshotLabels) === null || _c === void 0 ? void 0 : _c.join(','), // Java-only
68
+ };
69
+ return jsonConfig;
70
+ }
41
71
  //# sourceMappingURL=release-please-config.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-please",
3
- "version": "13.19.7",
3
+ "version": "13.20.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",
@@ -171,6 +171,10 @@
171
171
  "snapshot-label": {
172
172
  "description": "Label to add to snapshot pull request. Used by `java` strategies.",
173
173
  "type": "string"
174
+ },
175
+ "skip-snapshot": {
176
+ "description": "If set, do not propose snapshot pull requests. Used by `java` strategies.",
177
+ "type": "boolean"
174
178
  }
175
179
  }
176
180
  }
@@ -228,10 +232,33 @@
228
232
  "items": {
229
233
  "type": "string"
230
234
  }
235
+ },
236
+ "merge": {
237
+ "description": "Whether to merge in-scope pull requests into a combined release pull request. Defaults to `true`.",
238
+ "type": "boolean"
231
239
  }
232
240
  },
233
241
  "required": ["type", "groupName", "components"]
234
242
  },
243
+ {
244
+ "description": "Configuration for various `workspace` plugins.",
245
+ "type": "object",
246
+ "properties": {
247
+ "type": {
248
+ "description": "The name of the plugin.",
249
+ "type": "string",
250
+ "enum": ["cargo-workspace", "maven-workspace", "node-workspace"]
251
+ },
252
+ "updateAllPackages": {
253
+ "description": "Whether to force updating all packages regardless of the dependency tree. Defaults to `false`.",
254
+ "type": "boolean"
255
+ },
256
+ "merge": {
257
+ "description": "Whether to merge in-scope pull requests into a combined release pull request. Defaults to `true`.",
258
+ "type": "boolean"
259
+ }
260
+ }
261
+ },
235
262
  {
236
263
  "description": "Other plugins",
237
264
  "type": "object",