fix(typescript-input): preserve declared property order (#898)#3067
Merged
Conversation
typescript-json-schema was invoked without propOrder enabled, so generated JSON Schemas had no property-order metadata and downstream languages (e.g. Swift) alphabetized fields instead of preserving the TypeScript declaration order. Enable propOrder in the typescript-json-schema settings and copy the resulting propertyOrder metadata onto quicktype's existing quicktypePropertyOrder field, which JSONSchemaInput already honors. Covered by a new unit test in test/unit/typescript-input.test.ts that compiles a TypeScript class through to Swift output and asserts property order is preserved; this path (TypeScript source as input) isn't reachable through the JSON/JSON Schema fixture harness, which starts from JSON/schema files rather than TS sources. Co-Authored-By: gpt-5.6-sol via pi <noreply@openai.com>
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.
Bug
Given TypeScript class input:
quicktype's Swift output alphabetized the fields instead of preserving
declaration order:
This breaks the generated memberwise initializer's parameter order and,
more generally, silently reorders any output that's sensitive to property
order.
Root cause
packages/quicktype-typescript-input/src/index.tsinvokestypescript-json-schemato convert TypeScript sources into a JSON Schema,but never passed the
propOrdersetting. Without it,typescript-json-schemaemits no
propertyOrdermetadata on schema definitions, so downstreamJSONSchemaInputhas no order information to work with and falls back toalphabetical/insertion order from the schema object.
quicktype already has a mechanism for this:
JSONSchemaInputreads anoptional
quicktypePropertyOrderfield off each schema definition(
packages/quicktype-core/src/input/JSONSchemaInput.ts), it just was neverpopulated for TypeScript-source input.
Fix
propOrder: truein thetypescript-json-schemasettings.propertyOrderarray from each schema definition ontoquicktypePropertyOrder, whichJSONSchemaInputalready consumes.Tests
Added a regression test in
test/unit/typescript-input.test.tsthat compilesa TypeScript class through
schemaForTypeScriptSourcesand then throughquicktypeto Swift, assertingnameis emitted beforeage, matchingdeclaration order.
This bug is specific to the "TypeScript source as input" path
(
--src-lang typescript), which starts from.tsfiles rather than JSON orJSON Schema fixtures, so it isn't expressible via the repo's JSON/JSON Schema
fixture harness (
test/inputs/json,test/inputs/schema) — a unit test isthe appropriate coverage here per repo conventions.
Verification
npm run buildpasses.npx vitest run— all 171 unit tests pass (26 files), including the newregression test.
node dist/index.js --lang swift --src-lang typescript A.tswith the class above now emits
namebeforeagein the generatedSwift struct.
Fixes #898
🤖 Generated with Claude Code