fix: report component renaming conflicts for same-name components from different files#2706
Conversation
🦋 Changeset detectedLatest commit: d2f3ee4 The changes in this PR will be included in the next version bump. This PR includes changesets to release 3 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Coverage Report
File Coverage
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
📦 A new experimental 🧪 version v0.0.0-snapshot.1774945843 of Redocly CLI has been published for testing. Install with NPM: npm install @redocly/cli@0.0.0-snapshot.1774945843
# or
npm install @redocly/openapi-core@0.0.0-snapshot.1774945843
# or
npm install @redocly/respect-core@0.0.0-snapshot.1774945843 |
| reportIfRenamed(renameSource, name, ctx); | ||
| return name; | ||
| } | ||
| renameSource ||= name; |
There was a problem hiding this comment.
It's the same as renameSource = renameSource || name or
if (!renameSource) {
renameSource = name;
}
tatomyr
left a comment
There was a problem hiding this comment.
The issue here is that the bundler doesn't apply renaming consistently. If the schema wasn't referenced with a JSON pointer inside the file, it would behave correctly.
…g-conflicts-severity-ignored-the-reference
|
📦 A new experimental 🧪 version v0.0.0-snapshot.1775209981 of Redocly CLI has been published for testing. Install with NPM: npm install @redocly/cli@0.0.0-snapshot.1775209981
# or
npm install @redocly/openapi-core@0.0.0-snapshot.1775209981
# or
npm install @redocly/respect-core@0.0.0-snapshot.1775209981 |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Hardcoded "schemas" in message for all component types
- Updated the conflict report text to use the actual
componentTypeand adjusted tests to assert the correct type-specific wording.
- Updated the conflict report text to use the actual
Or push these changes by commenting:
@cursor push c4dddad26a
Preview (c4dddad26a)
diff --git a/packages/core/src/__tests__/bundle-oas.test.ts b/packages/core/src/__tests__/bundle-oas.test.ts
--- a/packages/core/src/__tests__/bundle-oas.test.ts
+++ b/packages/core/src/__tests__/bundle-oas.test.ts
@@ -50,7 +50,7 @@
expect(problems).toHaveLength(1);
expect(problems[0].severity).toBe('warn');
expect(problems[0].message).toEqual(
- `Two schemas are referenced with the same name but different content. Renamed first to first-2.`
+ `Two examples are referenced with the same name but different content. Renamed first to first-2.`
);
expect(res.parsed).toMatchSnapshot();
});
@@ -62,7 +62,7 @@
});
expect(problems).toHaveLength(1);
expect(problems[0].message).toEqual(
- `Two schemas are referenced with the same name but different content. Renamed param-b to param-b-2.`
+ `Two parameters are referenced with the same name but different content. Renamed param-b to param-b-2.`
);
expect(res.parsed).toMatchSnapshot();
});
diff --git a/packages/core/src/__tests__/bundle.test.ts b/packages/core/src/__tests__/bundle.test.ts
--- a/packages/core/src/__tests__/bundle.test.ts
+++ b/packages/core/src/__tests__/bundle.test.ts
@@ -67,7 +67,7 @@
expect(problems).toHaveLength(1);
expect(problems[0].severity).toBe('warn');
expect(problems[0].message).toEqual(
- `Two schemas are referenced with the same name but different content. Renamed first to first-2.`
+ `Two examples are referenced with the same name but different content. Renamed first to first-2.`
);
expect(res.parsed).toMatchSnapshot();
});
@@ -96,7 +96,7 @@
expect(problems).toHaveLength(1);
expect(problems[0].severity).toBe('warn');
expect(problems[0].message).toEqual(
- `Two schemas are referenced with the same name but different content. Renamed param-b to param-b-2.`
+ `Two parameters are referenced with the same name but different content. Renamed param-b to param-b-2.`
);
expect(res.parsed).toMatchSnapshot();
});
@@ -119,7 +119,7 @@
expect(problems).toHaveLength(1);
expect(problems[0].severity).toBe('error');
expect(problems[0].message).toEqual(
- `Two schemas are referenced with the same name but different content. Renamed param-b to param-b-2.`
+ `Two parameters are referenced with the same name but different content. Renamed param-b to param-b-2.`
);
});
@@ -134,7 +134,7 @@
expect(problems).toHaveLength(1);
expect(problems[0].severity).toBe('warn');
expect(problems[0].message).toEqual(
- `Two schemas are referenced with the same name but different content. Renamed User to User-2.`
+ `Two parameters are referenced with the same name but different content. Renamed User to User-2.`
);
expect(res.parsed).toMatchSnapshot();
});
@@ -163,7 +163,7 @@
expect(problems).toHaveLength(1);
expect(problems[0].severity).toBe('error');
expect(problems[0].message).toEqual(
- `Two schemas are referenced with the same name but different content. Renamed User to User-2.`
+ `Two parameters are referenced with the same name but different content. Renamed User to User-2.`
);
});
diff --git a/packages/core/src/bundle/bundle-visitor.ts b/packages/core/src/bundle/bundle-visitor.ts
--- a/packages/core/src/bundle/bundle-visitor.ts
+++ b/packages/core/src/bundle/bundle-visitor.ts
@@ -287,7 +287,7 @@
if (!componentsGroup[name] && prevName !== name) {
ctx.report({
- message: `Two schemas are referenced with the same name but different content. Renamed ${prevName} to ${name}.`,
+ message: `Two ${componentType} are referenced with the same name but different content. Renamed ${prevName} to ${name}.`,
location: ctx.location,
forceSeverity: componentRenamingConflicts,
});This Bugbot Autofix run was free. To enable autofix for future PRs, go to the Cursor dashboard.
| !componentsGroup[name] || | ||
| isEqualOrEqualRef(componentsGroup[name], target, ctx) | ||
| ) { | ||
| return name; |
There was a problem hiding this comment.
Hardcoded "schemas" in message for all component types
Medium Severity
The conflict message always says "Two schemas are referenced with the same name but different content" regardless of the actual component type. The componentType parameter (e.g., "parameters", "examples") is available in getComponentName but not used. With the simplified naming logic in this PR, the message now fires for examples and parameters conflicts where it previously didn't (e.g., the first → first-2 rename is an examples conflict, the User → User-2 rename is a parameters conflict), making the misleading wording visible to more users.



What/Why/How?
The
bundlecommand now reports component renaming conflicts whenever two external definitions share the same name but have different content.Reference
close #2691
Testing
Without
--component-renaming-conflicts-severityruleWith
--component-renaming-conflicts-severity=errorruleWith
--component-renaming-conflicts-severity=warnruleWith
--component-renaming-conflicts-severity=offruleScreenshots (optional)
Check yourself
Security
Note
Medium Risk
Changes component naming during bundling and when/what warnings/errors are emitted, which can alter generated
$reftargets and potentially break snapshots or downstream expectations.Overview
Fixes
bundle/bundle-oasso component renaming conflicts are detected even when same-named components come from different files (including pointer refs), honoring--component-renaming-conflicts-severity.Updates component name generation to use the JSON pointer basename (with proper unescaping) and consistently suffix (
-2,-3, …) on true content conflicts, which can change bundled$refpaths. Adds new fixtures/tests and updates snapshots to cover pointer-ref conflicts and dotted component keys.Written by Cursor Bugbot for commit d2f3ee4. This will update automatically on new commits. Configure here.