Skip to content

Commit 0ed8796

Browse files
committed
refactor: use valueToObject to construct parser object
1 parent 9a2fcca commit 0ed8796

File tree

4 files changed

+135
-99
lines changed

4 files changed

+135
-99
lines changed

packages/openapi-ts-tests/main/test/openapi-ts.config.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,17 +143,17 @@ export default defineConfig(() => {
143143
// version: () => '3.1.1',
144144
},
145145
transforms: {
146-
enums: {
147-
enabled: false,
148-
mode: 'root',
149-
// name: '{{name}}',
150-
},
146+
// enums: {
147+
// enabled: false,
148+
// mode: 'root',
149+
// // name: '{{name}}',
150+
// },
151151
propertiesRequiredByDefault: true,
152-
readWrite: {
153-
// enabled: false,
154-
requests: '{{name}}Writable',
155-
responses: '{{name}}',
156-
},
152+
// readWrite: {
153+
// // enabled: false,
154+
// requests: '{{name}}Writable',
155+
// responses: '{{name}}',
156+
// },
157157
},
158158
validate_EXPERIMENTAL: true,
159159
},

packages/openapi-ts/src/config/parser.ts

Lines changed: 120 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -10,108 +10,144 @@ export const defaultPaginationKeywords = [
1010
'start',
1111
] as const;
1212

13-
// TODO: use valueToObject for the whole parser config
1413
export const getParser = (userConfig: UserConfig): Config['parser'] => {
15-
const parser: Config['parser'] = {
16-
...userConfig.parser,
17-
hooks: {},
18-
pagination: {
19-
keywords: defaultPaginationKeywords,
20-
},
21-
transforms: {
22-
enums: {
23-
case: 'PascalCase',
24-
enabled: false,
25-
mode: 'root',
26-
name: '{{name}}Enum',
14+
const parser = valueToObject({
15+
defaultValue: {
16+
hooks: {},
17+
pagination: {
18+
keywords: defaultPaginationKeywords,
2719
},
28-
propertiesRequiredByDefault: false,
29-
readWrite: {
30-
enabled: true,
31-
requests: {
32-
case: 'preserve',
33-
name: '{{name}}Writable',
20+
transforms: {
21+
enums: {
22+
case: 'PascalCase',
23+
enabled: false,
24+
mode: 'root',
25+
name: '{{name}}Enum',
3426
},
35-
responses: {
36-
case: 'preserve',
37-
name: '{{name}}',
27+
propertiesRequiredByDefault: false,
28+
readWrite: {
29+
enabled: true,
30+
requests: {
31+
case: 'preserve',
32+
name: '{{name}}Writable',
33+
},
34+
responses: {
35+
case: 'preserve',
36+
name: '{{name}}',
37+
},
3838
},
3939
},
40+
validate_EXPERIMENTAL: false,
4041
},
41-
validate_EXPERIMENTAL: false,
42-
};
43-
44-
if (userConfig.parser) {
45-
if (userConfig.parser.hooks) {
46-
parser.hooks = userConfig.parser.hooks;
47-
}
48-
49-
if (userConfig.parser.pagination?.keywords) {
50-
parser.pagination.keywords = userConfig.parser.pagination.keywords;
51-
}
52-
53-
if (userConfig.parser.transforms) {
54-
if (userConfig.parser.transforms.enums !== undefined) {
55-
parser.transforms.enums = valueToObject({
42+
mappers: {
43+
object: (fields, defaultValue) => ({
44+
...fields,
45+
pagination: valueToObject({
5646
defaultValue: {
57-
...parser.transforms.enums,
58-
enabled: Boolean(userConfig.parser.transforms.enums),
59-
},
60-
mappers: {
61-
boolean: (enabled) => ({ enabled }),
62-
string: (mode) => ({ mode }),
47+
...(defaultValue.pagination as Extract<
48+
typeof defaultValue.pagination,
49+
Record<string, unknown>
50+
>),
6351
},
64-
value: userConfig.parser.transforms.enums,
65-
}) as typeof parser.transforms.enums;
66-
}
67-
68-
if (
69-
userConfig.parser.transforms.propertiesRequiredByDefault !== undefined
70-
) {
71-
parser.transforms.propertiesRequiredByDefault =
72-
userConfig.parser.transforms.propertiesRequiredByDefault;
73-
}
74-
75-
if (userConfig.parser.transforms.readWrite !== undefined) {
76-
parser.transforms.readWrite = valueToObject({
52+
value: fields.pagination,
53+
}),
54+
transforms: valueToObject({
7755
defaultValue: {
78-
...parser.transforms.readWrite,
79-
enabled: Boolean(userConfig.parser.transforms.readWrite),
56+
...(defaultValue.transforms as Extract<
57+
typeof defaultValue.transforms,
58+
Record<string, unknown>
59+
>),
8060
},
8161
mappers: {
82-
boolean: (enabled) => ({ enabled }),
83-
object: (fields) => ({
62+
object: (fields, defaultValue) => ({
8463
...fields,
85-
requests: valueToObject({
86-
defaultValue: parser.transforms.readWrite.requests,
64+
enums: valueToObject({
65+
defaultValue: {
66+
...(defaultValue.enums as Extract<
67+
typeof defaultValue.enums,
68+
Record<string, unknown>
69+
>),
70+
enabled:
71+
fields.enums !== undefined
72+
? Boolean(fields.enums)
73+
: (
74+
defaultValue.enums as Extract<
75+
typeof defaultValue.enums,
76+
Record<string, unknown>
77+
>
78+
).enabled,
79+
},
8780
mappers: {
88-
function: (name) => ({ name }),
89-
string: (name) => ({ name }),
81+
boolean: (enabled) => ({ enabled }),
82+
string: (mode) => ({ mode }),
9083
},
91-
value: fields.requests,
84+
value: fields.enums,
9285
}),
93-
responses: valueToObject({
94-
defaultValue: parser.transforms.readWrite.responses,
86+
propertiesRequiredByDefault:
87+
fields.propertiesRequiredByDefault !== undefined
88+
? fields.propertiesRequiredByDefault
89+
: defaultValue.propertiesRequiredByDefault,
90+
readWrite: valueToObject({
91+
defaultValue: {
92+
...(defaultValue.readWrite as Extract<
93+
typeof defaultValue.readWrite,
94+
Record<string, unknown>
95+
>),
96+
enabled:
97+
fields.readWrite !== undefined
98+
? Boolean(fields.readWrite)
99+
: (
100+
defaultValue.readWrite as Extract<
101+
typeof defaultValue.readWrite,
102+
Record<string, unknown>
103+
>
104+
).enabled,
105+
},
95106
mappers: {
96-
function: (name) => ({ name }),
97-
string: (name) => ({ name }),
107+
boolean: (enabled) => ({ enabled }),
108+
object: (fields, defaultValue) => ({
109+
...fields,
110+
requests: valueToObject({
111+
defaultValue: {
112+
...(defaultValue.requests as Extract<
113+
typeof defaultValue.requests,
114+
Record<string, unknown>
115+
>),
116+
},
117+
mappers: {
118+
function: (name) => ({ name }),
119+
string: (name) => ({ name }),
120+
},
121+
value: fields.requests,
122+
}),
123+
responses: valueToObject({
124+
defaultValue: {
125+
...(defaultValue.responses as Extract<
126+
typeof defaultValue.responses,
127+
Record<string, unknown>
128+
>),
129+
},
130+
mappers: {
131+
function: (name) => ({ name }),
132+
string: (name) => ({ name }),
133+
},
134+
value: fields.responses,
135+
}),
136+
}),
98137
},
99-
value: fields.responses,
138+
value: fields.readWrite,
100139
}),
101140
}),
102141
},
103-
value: userConfig.parser.transforms.readWrite,
104-
}) as typeof parser.transforms.readWrite;
105-
}
106-
}
107-
108-
if (userConfig.parser.validate_EXPERIMENTAL) {
109-
parser.validate_EXPERIMENTAL =
110-
userConfig.parser.validate_EXPERIMENTAL === true
111-
? 'warn'
112-
: userConfig.parser.validate_EXPERIMENTAL;
113-
}
114-
}
115-
116-
return parser;
142+
value: fields.transforms,
143+
}),
144+
validate_EXPERIMENTAL:
145+
fields.validate_EXPERIMENTAL === true
146+
? 'warn'
147+
: fields.validate_EXPERIMENTAL,
148+
}),
149+
},
150+
value: userConfig.parser,
151+
});
152+
return parser as Config['parser'];
117153
};

packages/openapi-ts/src/types/config.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { Plugin, PluginNames } from '../plugins/types';
33
import type { Input, Watch } from './input';
44
import type { Logs } from './logs';
55
import type { Output, UserOutput } from './output';
6-
import type { Parser, ResolvedParser } from './parser';
6+
import type { Parser, UserParser } from './parser';
77

88
export interface UserConfig {
99
/**
@@ -58,7 +58,7 @@ export interface UserConfig {
5858
* Customize how the input is parsed and transformed before it's passed to
5959
* plugins.
6060
*/
61-
parser?: Parser;
61+
parser?: UserParser;
6262
/**
6363
* Plugins generate artifacts from `input`. By default, we generate SDK
6464
* functions and TypeScript interfaces. If you manually define `plugins`,
@@ -150,7 +150,7 @@ export type Config = Omit<
150150
* Customize how the input is parsed and transformed before it's passed to
151151
* plugins.
152152
*/
153-
parser: ResolvedParser;
153+
parser: Parser;
154154
pluginOrder: ReadonlyArray<keyof PluginConfigMap>;
155155
plugins: {
156156
[K in PluginNames]?: Plugin.ConfigWithName<PluginConfigMap[K]>;

packages/openapi-ts/src/types/parser.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import type { StringCase, StringName } from './case';
1111

1212
type EnumsMode = 'inline' | 'root';
1313

14-
export type Parser = {
14+
export type UserParser = {
1515
/**
1616
* Filters can be used to select a subset of your input before it's passed
1717
* to plugins.
@@ -193,7 +193,7 @@ export type Parser = {
193193
validate_EXPERIMENTAL?: boolean | 'strict' | 'warn';
194194
};
195195

196-
export type ResolvedParser = {
196+
export type Parser = {
197197
/**
198198
* Filters can be used to select a subset of your input before it's passed
199199
* to plugins.

0 commit comments

Comments
 (0)