fix: handle circular references in diff command (fixes #2093)#2113
Open
armorbreak001 wants to merge 1 commit intoasyncapi:masterfrom
Open
fix: handle circular references in diff command (fixes #2093)#2113armorbreak001 wants to merge 1 commit intoasyncapi:masterfrom
armorbreak001 wants to merge 1 commit intoasyncapi:masterfrom
Conversation
The diff command crashed with TypeError when documents contained circular references (e.g., schemas referencing themselves via anyOf + $ref cycles). Added safeJson() helper that traverses the document graph and replaces circular refs with [Circular] placeholders, preventing JSON.stringify from throwing. - Add safeJson() and safeValue() internal helpers - Wrap .json() calls in diff command with safeJson() - Add 5 unit tests for circular reference handling Fixes asyncapi#2093
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Description
Closes #2093
The diff command crashed with
TypeError: Converting circular structure to JSONwhen AsyncAPI documents contained circular references (e.g., schemas referencing themselves viaanyOf+$refcycles).Root Cause
When parsed documents contain circular object references, calling
.json()and passing the result todiff.diff()eventually triggersJSON.stringify()on the circular structure, which throws a TypeError.Solution
Added internal helper functions
safeJson()andsafeValue()that:WeakSetto detect already-visited objects[Circular]placeholder stringChanges
src/apps/cli/commands/diff.ts
safeJson()/safeValue()helpers (~30 lines).json()calls indiff.diff()withsafeJson()test/unit/commands/diff-circular.test.ts (new)
Test Reproduction
```yaml
circular.yml
asyncapi: 3.1.0
info:
title: Testing
version: 1.0.0
components:
schemas:
filters:
type: array
items:
anyOf:
- $ref: "#/components/schemas/filters"
- type: string
entity-created:
type: object
properties:
filters:
$ref: "#/components/schemas/filters"
```
Before:
TypeError: Converting circular structure to JSONAfter: Diff completes successfully with
[Circular]placeholders in output