From f58485edfc4e64347aeb2b828ab82e2f92e9580a Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Mon, 20 Jul 2026 18:00:18 -0400 Subject: [PATCH] fix(core): preserve JSON Schema enum case order (#1289) ConvenienceRenderer.forEachEnumCase always alphabetized enum cases by their rendered name before handing them to every language renderer's emitEnum, so C++ (and other languages) generated enums in alphabetical order instead of the order declared in the source JSON Schema/JSON. Stop sorting and let the existing insertion order (already preserved by the underlying case-names map) flow through unchanged. Co-Authored-By: gpt-5.6-sol via pi --- .../quicktype-core/src/ConvenienceRenderer.ts | 5 +-- test/unit/enum-order.test.ts | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 test/unit/enum-order.test.ts diff --git a/packages/quicktype-core/src/ConvenienceRenderer.ts b/packages/quicktype-core/src/ConvenienceRenderer.ts index de5901e6e2..af8ff16031 100644 --- a/packages/quicktype-core/src/ConvenienceRenderer.ts +++ b/packages/quicktype-core/src/ConvenienceRenderer.ts @@ -995,10 +995,7 @@ export abstract class ConvenienceRenderer extends Renderer { f: (name: Name, jsonName: string, position: ForEachPosition) => void, ): void { const caseNames = defined(this._caseNamesStoreView).get(e); - const sortedCaseNames = mapSortBy(caseNames, (n) => - defined(this.names.get(n)), - ); - this.forEachWithBlankLines(sortedCaseNames, blankLocations, f); + this.forEachWithBlankLines(caseNames, blankLocations, f); } protected forEachTransformation( diff --git a/test/unit/enum-order.test.ts b/test/unit/enum-order.test.ts new file mode 100644 index 0000000000..da930ac15c --- /dev/null +++ b/test/unit/enum-order.test.ts @@ -0,0 +1,32 @@ +import { + InputData, + JSONSchemaInput, + quicktype, +} from "../../packages/quicktype-core/src/index.js"; +import { expect, test } from "vitest"; + +const schema = JSON.stringify({ + $schema: "http://json-schema.org/draft-04/schema#", + title: "Test", + type: "object", + properties: { + errorCode: { + type: "string", + enum: ["B", "A", "E"], + }, + }, +}); + +test("preserves JSON Schema enum case order", async () => { + const schemaInput = new JSONSchemaInput(undefined); + await schemaInput.addSource({ name: "Test", schema }); + + const inputData = new InputData(); + inputData.addInput(schemaInput); + + const result = await quicktype({ inputData, lang: "c++" }); + + expect(result.lines).toContain( + " enum class ErrorCode : int { B, A, E };", + ); +});