Skip to content

Commit 0440b2b

Browse files
committed
refactor: add ?: to get optional parameters instead of having to set those to undefined
1 parent ecd1ce7 commit 0440b2b

File tree

9 files changed

+81
-64
lines changed

9 files changed

+81
-64
lines changed

.changeset/puny-toys-flash.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"typed-openapi": minor
3+
---
4+
5+
add `?:` to get optional parameters instead of having to set those to undefined

packages/typed-openapi/src/generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ const parameterObjectToString = (parameters: Box<AnyBoxDef> | Record<string, Any
122122

123123
let str = "{";
124124
for (const [key, box] of Object.entries(parameters)) {
125-
str += `${wrapWithQuotesIfNeeded(key)}: ${box.value},\n`;
125+
str += `${wrapWithQuotesIfNeeded(key)}${box.type === "optional" ? "?" : ""}: ${box.value},\n`;
126126
}
127127
return str + "}";
128128
};

packages/typed-openapi/tests/generator.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ describe("generator", () => {
816816
`);
817817
});
818818

819-
test.only("optional query param", async ({ expect }) => {
819+
test("optional query param", async ({ expect }) => {
820820
expect(await prettify(generateFile(mapOpenApiEndpoints({
821821
"openapi": "3.0.0",
822822
"info": {
@@ -890,7 +890,7 @@ describe("generator", () => {
890890
path: "/demo";
891891
requestFormat: "json";
892892
parameters: {
893-
query: { organizationId: string; searchQuery: string | undefined };
893+
query: { organizationId: string; searchQuery?: string | undefined };
894894
path: Partial<{ optionalInPath1: string; optionalInPath2: string }>;
895895
};
896896
response: string;

packages/typed-openapi/tests/snapshots/docker.openapi.client.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,7 +1136,7 @@ export namespace Endpoints {
11361136
path: "/containers/{id}/archive";
11371137
requestFormat: "binary";
11381138
parameters: {
1139-
query: { path: string; noOverwriteDirNonDir: string | undefined; copyUIDGID: string | undefined };
1139+
query: { path: string; noOverwriteDirNonDir?: string | undefined; copyUIDGID?: string | undefined };
11401140
path: { id: string };
11411141

11421142
body: string;
@@ -1298,7 +1298,7 @@ export namespace Endpoints {
12981298
path: "/images/search";
12991299
requestFormat: "json";
13001300
parameters: {
1301-
query: { term: string; limit: number | undefined; filters: string | undefined };
1301+
query: { term: string; limit?: number | undefined; filters?: string | undefined };
13021302
};
13031303
response: Array<
13041304
Partial<{ description: string; is_official: boolean; is_automated: boolean; name: string; star_count: number }>
@@ -1645,7 +1645,7 @@ export namespace Endpoints {
16451645
path: "/plugins/pull";
16461646
requestFormat: "json";
16471647
parameters: {
1648-
query: { remote: string; name: string | undefined };
1648+
query: { remote: string; name?: string | undefined };
16491649

16501650
header: Partial<{ "X-Registry-Auth": string }>;
16511651
body: Array<Schemas.PluginPrivilege>;
@@ -1828,9 +1828,9 @@ export namespace Endpoints {
18281828
parameters: {
18291829
query: {
18301830
version: number;
1831-
rotateWorkerToken: boolean | undefined;
1832-
rotateManagerToken: boolean | undefined;
1833-
rotateManagerUnlockKey: boolean | undefined;
1831+
rotateWorkerToken?: boolean | undefined;
1832+
rotateManagerToken?: boolean | undefined;
1833+
rotateManagerUnlockKey?: boolean | undefined;
18341834
};
18351835

18361836
body: Schemas.SwarmSpec;
@@ -1898,8 +1898,8 @@ export namespace Endpoints {
18981898
parameters: {
18991899
query: {
19001900
version: number;
1901-
registryAuthFrom: ("spec" | "previous-spec") | undefined;
1902-
rollback: string | undefined;
1901+
registryAuthFrom?: ("spec" | "previous-spec") | undefined;
1902+
rollback?: string | undefined;
19031903
};
19041904
path: { id: string };
19051905
header: Partial<{ "X-Registry-Auth": string }>;

packages/typed-openapi/tests/snapshots/docker.openapi.io-ts.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2141,8 +2141,8 @@ export const put_PutContainerArchive = t.type({
21412141
parameters: t.type({
21422142
query: t.type({
21432143
path: t.string,
2144-
noOverwriteDirNonDir: t.union([t.string, t.undefined]),
2145-
copyUIDGID: t.union([t.string, t.undefined]),
2144+
noOverwriteDirNonDir: t.union([t.undefined, t.union([t.string, t.undefined])]),
2145+
copyUIDGID: t.union([t.undefined, t.union([t.string, t.undefined])]),
21462146
}),
21472147
path: t.type({
21482148
id: t.string,
@@ -2378,8 +2378,8 @@ export const get_ImageSearch = t.type({
23782378
parameters: t.type({
23792379
query: t.type({
23802380
term: t.string,
2381-
limit: t.union([t.number, t.undefined]),
2382-
filters: t.union([t.string, t.undefined]),
2381+
limit: t.union([t.undefined, t.union([t.number, t.undefined])]),
2382+
filters: t.union([t.undefined, t.union([t.string, t.undefined])]),
23832383
}),
23842384
}),
23852385
response: t.array(
@@ -2877,7 +2877,7 @@ export const post_PluginPull = t.type({
28772877
parameters: t.type({
28782878
query: t.type({
28792879
remote: t.string,
2880-
name: t.union([t.string, t.undefined]),
2880+
name: t.union([t.undefined, t.union([t.string, t.undefined])]),
28812881
}),
28822882
header: t.type({
28832883
"X-Registry-Auth": t.union([t.undefined, t.string]),
@@ -3134,9 +3134,9 @@ export const post_SwarmUpdate = t.type({
31343134
parameters: t.type({
31353135
query: t.type({
31363136
version: t.number,
3137-
rotateWorkerToken: t.union([t.boolean, t.undefined]),
3138-
rotateManagerToken: t.union([t.boolean, t.undefined]),
3139-
rotateManagerUnlockKey: t.union([t.boolean, t.undefined]),
3137+
rotateWorkerToken: t.union([t.undefined, t.union([t.boolean, t.undefined])]),
3138+
rotateManagerToken: t.union([t.undefined, t.union([t.boolean, t.undefined])]),
3139+
rotateManagerUnlockKey: t.union([t.undefined, t.union([t.boolean, t.undefined])]),
31403140
}),
31413141
body: SwarmSpec,
31423142
}),
@@ -3235,8 +3235,11 @@ export const post_ServiceUpdate = t.type({
32353235
parameters: t.type({
32363236
query: t.type({
32373237
version: t.number,
3238-
registryAuthFrom: t.union([t.union([t.literal("spec"), t.literal("previous-spec")]), t.undefined]),
3239-
rollback: t.union([t.string, t.undefined]),
3238+
registryAuthFrom: t.union([
3239+
t.undefined,
3240+
t.union([t.union([t.literal("spec"), t.literal("previous-spec")]), t.undefined]),
3241+
]),
3242+
rollback: t.union([t.undefined, t.union([t.string, t.undefined])]),
32403243
}),
32413244
path: t.type({
32423245
id: t.string,

packages/typed-openapi/tests/snapshots/docker.openapi.typebox.ts

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2267,8 +2267,8 @@ export const put_PutContainerArchive = Type.Object({
22672267
parameters: Type.Object({
22682268
query: Type.Object({
22692269
path: Type.String(),
2270-
noOverwriteDirNonDir: Type.Union([Type.String(), Type.Undefined()]),
2271-
copyUIDGID: Type.Union([Type.String(), Type.Undefined()]),
2270+
noOverwriteDirNonDir: Type.Optional(Type.Union([Type.String(), Type.Undefined()])),
2271+
copyUIDGID: Type.Optional(Type.Union([Type.String(), Type.Undefined()])),
22722272
}),
22732273
path: Type.Object({
22742274
id: Type.String(),
@@ -2528,8 +2528,8 @@ export const get_ImageSearch = Type.Object({
25282528
parameters: Type.Object({
25292529
query: Type.Object({
25302530
term: Type.String(),
2531-
limit: Type.Union([Type.Number(), Type.Undefined()]),
2532-
filters: Type.Union([Type.String(), Type.Undefined()]),
2531+
limit: Type.Optional(Type.Union([Type.Number(), Type.Undefined()])),
2532+
filters: Type.Optional(Type.Union([Type.String(), Type.Undefined()])),
25332533
}),
25342534
}),
25352535
response: Type.Array(
@@ -3083,7 +3083,7 @@ export const post_PluginPull = Type.Object({
30833083
parameters: Type.Object({
30843084
query: Type.Object({
30853085
remote: Type.String(),
3086-
name: Type.Union([Type.String(), Type.Undefined()]),
3086+
name: Type.Optional(Type.Union([Type.String(), Type.Undefined()])),
30873087
}),
30883088
header: Type.Partial(
30893089
Type.Object({
@@ -3360,9 +3360,9 @@ export const post_SwarmUpdate = Type.Object({
33603360
parameters: Type.Object({
33613361
query: Type.Object({
33623362
version: Type.Number(),
3363-
rotateWorkerToken: Type.Union([Type.Boolean(), Type.Undefined()]),
3364-
rotateManagerToken: Type.Union([Type.Boolean(), Type.Undefined()]),
3365-
rotateManagerUnlockKey: Type.Union([Type.Boolean(), Type.Undefined()]),
3363+
rotateWorkerToken: Type.Optional(Type.Union([Type.Boolean(), Type.Undefined()])),
3364+
rotateManagerToken: Type.Optional(Type.Union([Type.Boolean(), Type.Undefined()])),
3365+
rotateManagerUnlockKey: Type.Optional(Type.Union([Type.Boolean(), Type.Undefined()])),
33663366
}),
33673367
body: SwarmSpec,
33683368
}),
@@ -3473,11 +3473,10 @@ export const post_ServiceUpdate = Type.Object({
34733473
parameters: Type.Object({
34743474
query: Type.Object({
34753475
version: Type.Number(),
3476-
registryAuthFrom: Type.Union([
3477-
Type.Union([Type.Literal("spec"), Type.Literal("previous-spec")]),
3478-
Type.Undefined(),
3479-
]),
3480-
rollback: Type.Union([Type.String(), Type.Undefined()]),
3476+
registryAuthFrom: Type.Optional(
3477+
Type.Union([Type.Union([Type.Literal("spec"), Type.Literal("previous-spec")]), Type.Undefined()]),
3478+
),
3479+
rollback: Type.Optional(Type.Union([Type.String(), Type.Undefined()])),
34813480
}),
34823481
path: Type.Object({
34833482
id: Type.String(),

packages/typed-openapi/tests/snapshots/docker.openapi.valibot.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2057,8 +2057,8 @@ export const put_PutContainerArchive = v.object({
20572057
parameters: v.object({
20582058
query: v.object({
20592059
path: v.string(),
2060-
noOverwriteDirNonDir: v.union([v.string(), v.undefined()]),
2061-
copyUIDGID: v.union([v.string(), v.undefined()]),
2060+
noOverwriteDirNonDir: v.optional(v.union([v.string(), v.undefined()])),
2061+
copyUIDGID: v.optional(v.union([v.string(), v.undefined()])),
20622062
}),
20632063
path: v.object({
20642064
id: v.string(),
@@ -2294,8 +2294,8 @@ export const get_ImageSearch = v.object({
22942294
parameters: v.object({
22952295
query: v.object({
22962296
term: v.string(),
2297-
limit: v.union([v.number(), v.undefined()]),
2298-
filters: v.union([v.string(), v.undefined()]),
2297+
limit: v.optional(v.union([v.number(), v.undefined()])),
2298+
filters: v.optional(v.union([v.string(), v.undefined()])),
22992299
}),
23002300
}),
23012301
response: v.array(
@@ -2792,7 +2792,7 @@ export const post_PluginPull = v.object({
27922792
parameters: v.object({
27932793
query: v.object({
27942794
remote: v.string(),
2795-
name: v.union([v.string(), v.undefined()]),
2795+
name: v.optional(v.union([v.string(), v.undefined()])),
27962796
}),
27972797
header: v.object({
27982798
"X-Registry-Auth": v.optional(v.string()),
@@ -3049,9 +3049,9 @@ export const post_SwarmUpdate = v.object({
30493049
parameters: v.object({
30503050
query: v.object({
30513051
version: v.number(),
3052-
rotateWorkerToken: v.union([v.boolean(), v.undefined()]),
3053-
rotateManagerToken: v.union([v.boolean(), v.undefined()]),
3054-
rotateManagerUnlockKey: v.union([v.boolean(), v.undefined()]),
3052+
rotateWorkerToken: v.optional(v.union([v.boolean(), v.undefined()])),
3053+
rotateManagerToken: v.optional(v.union([v.boolean(), v.undefined()])),
3054+
rotateManagerUnlockKey: v.optional(v.union([v.boolean(), v.undefined()])),
30553055
}),
30563056
body: SwarmSpec,
30573057
}),
@@ -3150,8 +3150,8 @@ export const post_ServiceUpdate = v.object({
31503150
parameters: v.object({
31513151
query: v.object({
31523152
version: v.number(),
3153-
registryAuthFrom: v.union([v.union([v.literal("spec"), v.literal("previous-spec")]), v.undefined()]),
3154-
rollback: v.union([v.string(), v.undefined()]),
3153+
registryAuthFrom: v.optional(v.union([v.union([v.literal("spec"), v.literal("previous-spec")]), v.undefined()])),
3154+
rollback: v.optional(v.union([v.string(), v.undefined()])),
31553155
}),
31563156
path: v.object({
31573157
id: v.string(),

packages/typed-openapi/tests/snapshots/docker.openapi.yup.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2441,14 +2441,16 @@ export const put_PutContainerArchive = {
24412441
y.string().required(),
24422442
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
24432443
])
2444-
.required(),
2444+
.required()
2445+
.optional(),
24452446
copyUIDGID: y
24462447
.mixed()
24472448
.oneOf([
24482449
y.string().required(),
24492450
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
24502451
])
2451-
.required(),
2452+
.required()
2453+
.optional(),
24522454
}),
24532455
path: y.object({
24542456
id: y.string().required(),
@@ -2693,14 +2695,16 @@ export const get_ImageSearch = {
26932695
y.number().required(),
26942696
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
26952697
])
2696-
.required(),
2698+
.required()
2699+
.optional(),
26972700
filters: y
26982701
.mixed()
26992702
.oneOf([
27002703
y.string().required(),
27012704
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
27022705
])
2703-
.required(),
2706+
.required()
2707+
.optional(),
27042708
}),
27052709
}),
27062710
response: y.array(
@@ -3275,7 +3279,8 @@ export const post_PluginPull = {
32753279
y.string().required(),
32763280
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
32773281
])
3278-
.required(),
3282+
.required()
3283+
.optional(),
32793284
}),
32803285
header: y.object({
32813286
"X-Registry-Auth": y.string().required().optional(),
@@ -3538,21 +3543,24 @@ export const post_SwarmUpdate = {
35383543
y.boolean().required(),
35393544
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
35403545
])
3541-
.required(),
3546+
.required()
3547+
.optional(),
35423548
rotateManagerToken: y
35433549
.mixed()
35443550
.oneOf([
35453551
y.boolean().required(),
35463552
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
35473553
])
3548-
.required(),
3554+
.required()
3555+
.optional(),
35493556
rotateManagerUnlockKey: y
35503557
.mixed()
35513558
.oneOf([
35523559
y.boolean().required(),
35533560
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
35543561
])
3555-
.required(),
3562+
.required()
3563+
.optional(),
35563564
}),
35573565
body: SwarmSpec,
35583566
}),
@@ -3657,14 +3665,16 @@ export const post_ServiceUpdate = {
36573665
y.mixed().oneOf(["spec", "previous-spec"]).required(),
36583666
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
36593667
])
3660-
.required(),
3668+
.required()
3669+
.optional(),
36613670
rollback: y
36623671
.mixed()
36633672
.oneOf([
36643673
y.string().required(),
36653674
y.mixed((value): value is any => value === undefined) as y.MixedSchema<undefined>,
36663675
])
3667-
.required(),
3676+
.required()
3677+
.optional(),
36683678
}),
36693679
path: y.object({
36703680
id: y.string().required(),

0 commit comments

Comments
 (0)