Skip to content

Commit 5b97fb8

Browse files
authored
Fix immutable arrays (#1643)
1 parent c7a930c commit 5b97fb8

File tree

8 files changed

+2150
-2112
lines changed

8 files changed

+2150
-2112
lines changed

packages/openapi-fetch/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,6 @@
7474
"openapi-typescript-fetch": "^1.1.3",
7575
"superagent": "^9.0.0",
7676
"typescript": "^5.4.5",
77-
"vitest": "^1.5.0"
77+
"vitest": "^1.5.2"
7878
}
7979
}

packages/openapi-typescript/examples/github-api-export-type-immutable.ts

+1,027-1,027
Large diffs are not rendered by default.

packages/openapi-typescript/examples/github-api-immutable.ts

+1,027-1,027
Large diffs are not rendered by default.

packages/openapi-typescript/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
"typescript": "^5.x"
6161
},
6262
"dependencies": {
63-
"@redocly/openapi-core": "^1.11.0",
63+
"@redocly/openapi-core": "^1.12.0",
6464
"ansi-colors": "^4.1.3",
6565
"supports-color": "^9.4.0",
6666
"yargs-parser": "^21.1.1"
@@ -74,7 +74,7 @@
7474
"esbuild": "^0.20.2",
7575
"execa": "^7.2.0",
7676
"typescript": "^5.4.5",
77-
"vite-node": "^1.5.0",
78-
"vitest": "^1.5.0"
77+
"vite-node": "^1.5.2",
78+
"vitest": "^1.5.2"
7979
}
8080
}

packages/openapi-typescript/src/transform/schema-object.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,14 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor
323323
}
324324
}
325325

326-
return ts.isTupleTypeNode(itemType) || ts.isArrayTypeNode(itemType)
327-
? itemType
328-
: ts.factory.createArrayTypeNode(itemType); // wrap itemType in array type, but only if not a tuple or array already
326+
const finalType =
327+
ts.isTupleTypeNode(itemType) || ts.isArrayTypeNode(itemType)
328+
? itemType
329+
: ts.factory.createArrayTypeNode(itemType); // wrap itemType in array type, but only if not a tuple or array already
330+
331+
return options.ctx.immutable
332+
? ts.factory.createTypeOperatorNode(ts.SyntaxKind.ReadonlyKeyword, finalType)
333+
: finalType;
329334
}
330335

331336
// polymorphic, or 3.1 nullable

packages/openapi-typescript/test/transform/schema-object/array.test.ts

+21-2
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,28 @@ describe("transformSchemaObject > array", () => {
151151
{
152152
given: {
153153
type: "array",
154-
items: { type: "array", items: { type: "string" } },
154+
items: { type: "string" },
155155
},
156-
want: "string[][]",
156+
want: "readonly string[]",
157+
options: {
158+
...DEFAULT_OPTIONS,
159+
ctx: { ...DEFAULT_OPTIONS.ctx, immutable: true },
160+
},
161+
},
162+
],
163+
[
164+
"options > immutable: true (tuple)",
165+
{
166+
given: {
167+
type: "array",
168+
items: { type: "number" },
169+
prefixItems: [{ type: "number" }, { type: "number" }, { type: "number" }],
170+
},
171+
want: `readonly [
172+
number,
173+
number,
174+
number
175+
]`,
157176
options: {
158177
...DEFAULT_OPTIONS,
159178
ctx: { ...DEFAULT_OPTIONS.ctx, immutable: true },

packages/openapi-typescript/test/transform/schema-object/object.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ describe("transformSchemaObject > object", () => {
308308
},
309309
},
310310
want: `{
311-
readonly array?: {
311+
readonly array?: readonly {
312312
readonly [key: string]: unknown;
313313
}[] | null;
314314
}`,

pnpm-lock.yaml

+62-48
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)