Skip to content

Commit a378cfa

Browse files
committed
chore: consistent response type
1 parent 599c844 commit a378cfa

5 files changed

Lines changed: 43 additions & 35 deletions

File tree

dev/inputs.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export const inputs = {
77
full: path.resolve(specsPath, '3.1.x', 'full.yaml'),
88
heyapi: 'hey-api/backend',
99
local: 'http://localhost:8000/openapi.json',
10+
mockers: path.resolve(specsPath, '3.1.x', 'mockers.yaml'),
1011
opencode: path.resolve(specsPath, '3.1.x', 'opencode.yaml'),
1112
petstore:
1213
'https://raw.githubusercontent.com/swagger-api/swagger-petstore/master/src/main/resources/openapi.yaml',

dev/playground.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ const server = setupServer(
3636
// }),
3737
...handlers.all({
3838
pick: {
39-
// get(info) {
40-
// console.log('Received request for projectUpdate with info:', info);
41-
// },
39+
// ...
4240
},
4341
}),
4442
);
@@ -47,9 +45,6 @@ server.listen();
4745
async function run() {
4846
// const { client, server } = await createOpencode();
4947
// console.log(client, server);
50-
client.setConfig({
51-
baseUrl: 'https://api.heyapi.dev/',
52-
});
5348
const sdk = new Sdk({ client });
5449
// const published = await sdk.tui.publish({
5550
// body: {
@@ -62,7 +57,7 @@ async function run() {
6257
// directory: 'main',
6358
// });
6459
// console.log('Published:', published.data, published.error);
65-
const project = await sdk.get({
60+
const project = await sdk.getFoo({
6661
// ...
6762
});
6863
console.log('Updated Project:', project.data, project.error);

packages/openapi-ts/src/plugins/msw/shared/handler.ts

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type { MswPlugin } from '../types';
77
import { computeDominantResponse, type DominantResponse } from './computeDominantResponse';
88
import { getOperationComment } from './operation';
99
import { sanitizeParamName, sanitizePath } from './path';
10-
import { createHandlerResponse } from './response';
10+
import { createHttpResponse } from './response';
1111

1212
const emitToResponseUnion = (plugin: MswPlugin['Instance']) => {
1313
const symbol = plugin.symbol('ToResponseUnion', {
@@ -42,21 +42,19 @@ const emitToResponseUnion = (plugin: MswPlugin['Instance']) => {
4242
function createHandlerNode({
4343
baseUrl,
4444
bodyType,
45-
method,
4645
operation,
4746
paramsType,
4847
plugin,
4948
response,
50-
responseOrResolverType,
49+
responseParamType,
5150
}: {
5251
baseUrl: string | undefined;
5352
bodyType: ReturnType<typeof $.type.idx | typeof $.type>;
54-
method: string;
5553
operation: IR.OperationObject;
5654
paramsType: ReturnType<typeof $.type | typeof $.type.object>;
5755
plugin: MswPlugin['Instance'];
5856
response: DominantResponse;
59-
responseOrResolverType: ReturnType<typeof $.type | typeof $.type.or>;
57+
responseParamType: ReturnType<typeof $.type | typeof $.type.or>;
6058
}): Symbol {
6159
const symbolHttp = plugin.external('msw.http');
6260
const symbolResponse = plugin.symbol('response');
@@ -82,7 +80,7 @@ function createHandlerNode({
8280
const handlerFunc = $.func(symbol)
8381
.export()
8482
.$if(plugin.config.comments && getOperationComment(operation), (f, v) => f.doc(v))
85-
.param(symbolResponse, (p) => p.optional().type(responseOrResolverType))
83+
.param(symbolResponse, (p) => p.optional().type(responseParamType))
8684
.param(symbolOptions, (p) =>
8785
p.optional().type(
8886
plugin.referenceSymbol({
@@ -95,7 +93,7 @@ function createHandlerNode({
9593
.returns(plugin.external('msw.HttpHandler'))
9694
.do(
9795
$(symbolHttp)
98-
.attr(method)
96+
.attr(operation.method)
9997
.call(
10098
$.template(
10199
$(symbolOptions)
@@ -116,7 +114,7 @@ function createHandlerNode({
116114
.$if(hasResponse, (c) => c.coalesce($.fromValue(response.example))),
117115
),
118116
$.if($('body').neq($('undefined'))).do(
119-
createHandlerResponse({
117+
createHttpResponse({
120118
plugin,
121119
response,
122120
symbol: symbolResponse,
@@ -227,30 +225,43 @@ export function getHandler({
227225
response.example = undefined;
228226
}
229227

230-
let responseOrResolverType: ReturnType<typeof $.type | typeof $.type.or>;
231-
if (response.statusCode != null && symbolResponsesType) {
232-
const responseType = $.type
233-
.object()
234-
.prop('body', (p) =>
235-
p.type($.type(symbolResponsesType).idx($.type.literal(response.statusCode!))),
236-
)
237-
.prop('status', (p) => p.optional().type($.type.literal(response.statusCode!)));
238-
responseOrResolverType = $.type.or(
239-
responseType,
240-
responsesOverrideType ? $.type.or(responsesOverrideType, resolverType) : resolverType,
228+
const responseType = $.type
229+
.object()
230+
.prop('body', (p) =>
231+
p.type(
232+
response.statusCode !== undefined && symbolResponsesType
233+
? $.type(symbolResponsesType).idx($.type.literal(response.statusCode))
234+
: $.type(plugin.external('msw.DefaultBodyType')),
235+
),
236+
)
237+
.prop('status', (p) =>
238+
p
239+
.optional()
240+
.type(
241+
response.statusCode !== undefined
242+
? $.type.literal(response.statusCode)
243+
: $.type('number'),
244+
),
241245
);
242-
} else {
243-
responseOrResolverType = resolverType;
244-
}
246+
const symbolResponseType = plugin.symbol(
247+
applyNaming(`handle-${operation.id}-response`, {
248+
casing: 'PascalCase', // TODO: expose as a config option
249+
}),
250+
);
251+
plugin.node($.type.alias(symbolResponseType).export().type(responseType));
252+
253+
const responseParamType = $.type.or(
254+
symbolResponseType,
255+
responsesOverrideType ? $.type.or(responsesOverrideType, resolverType) : resolverType,
256+
);
245257

246258
return createHandlerNode({
247259
baseUrl,
248260
bodyType,
249-
method: operation.method,
250261
operation,
251262
paramsType,
252263
plugin,
253264
response,
254-
responseOrResolverType,
265+
responseParamType,
255266
});
256267
}

packages/openapi-ts/src/plugins/msw/shared/response.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ import { $ } from '../../../ts-dsl';
44
import type { MswPlugin } from '../types';
55
import type { DominantResponse } from './computeDominantResponse';
66

7-
/**
8-
* Builds the response override expression for the `res` parameter.
9-
*/
10-
export function createHandlerResponse({
7+
export function createHttpResponse({
118
plugin,
129
response,
1310
symbol,

packages/openapi-ts/src/plugins/msw/v2/plugin.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ export const handlerV2: MswPlugin['Handler'] = ({ plugin }) => {
1111
plugin.symbol('http', {
1212
external: 'msw',
1313
});
14+
plugin.symbol('DefaultBodyType', {
15+
external: 'msw',
16+
kind: 'type',
17+
});
1418
const symbolHttpHandler = plugin.symbol('HttpHandler', {
1519
external: 'msw',
1620
kind: 'type',

0 commit comments

Comments
 (0)