fix: forward TResponse generic through SDK Options type for SSE endpo… by bilby91 · Pull Request #3466 · hey-api/openapi-ts
@mrlubos Let me review this again. There is so much autogeneration here is kind of hard sometimes. This is the patch that I'm currently running in my project to fix the three bugs I reported yesterday.
This patch on top of 0.92.3 is working fine for me.
diff --git a/dist/clients/fetch/client.ts b/dist/clients/fetch/client.ts
index 1b05a0ffdc77c2c0c24ab69119417f1329db9694..65519b66e45071dc5d918e35662e53c6aaa8b84b 100644
--- a/dist/clients/fetch/client.ts
+++ b/dist/clients/fetch/client.ts
@@ -239,7 +239,7 @@ export const createClient = (config: Config = {}): Client => {
const { opts, url } = await beforeRequest(options);
return createSseClient({
...opts,
- body: opts.body as BodyInit | null | undefined,
+ body: opts.serializedBody as BodyInit | null | undefined,
headers: opts.headers as unknown as Record<string, string>,
method,
onRequest: async (url, init) => {
diff --git a/dist/init-W7OZahc5.mjs b/dist/init-W7OZahc5.mjs
index ea4d72b9c856c5221730235d591b1f0c0672b9b3..e9bb3972d61af7128f1ed0aba9dded4c0acba66f 100644
--- a/dist/init-W7OZahc5.mjs
+++ b/dist/init-W7OZahc5.mjs
@@ -4472,6 +4472,7 @@ const createResponseValidator = ({ operation, plugin }) => {
/** TODO: needs complete refactor */
const operationOptionsType = ({ isDataAllowed = true, operation, plugin, throwOnError }) => {
const isNuxtClient = getClientPlugin(getTypedConfig(plugin)).name === "@hey-api/client-nuxt";
+ const isSse = hasOperationSse({ operation });
const symbolDataType = isDataAllowed ? plugin.querySymbol({
category: "type",
resource: "operation",
@@ -4493,6 +4494,16 @@ const operationOptionsType = ({ isDataAllowed = true, operation, plugin, throwOn
});
return $.type(symbolOptions).generic(nuxtTypeComposable).generic(isDataAllowed ? symbolDataType ?? "unknown" : "never").generic(symbolResponseType ?? "unknown").generic(nuxtTypeDefault);
}
+ if (isSse) {
+ const symbolResponseType = plugin.querySymbol({
+ category: "type",
+ resource: "operation",
+ resourceId: operation.id,
+ role: "response"
+ });
+ if (throwOnError) return $.type(symbolOptions).generic(isDataAllowed ? symbolDataType ?? "unknown" : "never").generic(throwOnError).generic(symbolResponseType ?? "unknown");
+ return $.type(symbolOptions).generic(isDataAllowed ? symbolDataType ?? "unknown" : "never").generic("boolean").generic(symbolResponseType ?? "unknown");
+ }
if (throwOnError) return $.type(symbolOptions).generic(isDataAllowed ? symbolDataType ?? "unknown" : "never").generic(throwOnError);
return $.type(symbolOptions).$if(!isDataAllowed || symbolDataType, (t) => t.generic(isDataAllowed ? symbolDataType : "never"));
};
@@ -4559,11 +4570,12 @@ const getResponseType = (contentType) => {
function operationStatements({ isRequiredOptions, opParameters, operation, plugin }) {
const client = getClientPlugin(getTypedConfig(plugin));
const isNuxtClient = client.name === "@hey-api/client-nuxt";
+ const isSse = hasOperationSse({ operation });
const symbolResponseType = plugin.querySymbol({
category: "type",
resource: "operation",
resourceId: operation.id,
- role: isNuxtClient ? "response" : "responses"
+ role: (isNuxtClient || isSse) ? "response" : "responses"
});
const symbolErrorType = plugin.querySymbol({
category: "type",
@@ -6107,7 +6119,7 @@ const createTypeOptions = ({ plugin }) => {
resource: "client-options",
tool: "sdk"
} });
- const typeOptions = $.type.alias(symbolOptions).export().$if(isNuxtClient, (t) => t.generic("TComposable", (g) => g.extends(plugin.external("client.Composable")).default($.type.literal("$fetch"))).generic("TData", (g) => g.extends(symbolTDataShape).default(symbolTDataShape)).generic(nuxtTypeResponse, (g) => g.default("unknown")).generic(nuxtTypeDefault, (g) => g.default("undefined")), (t) => t.generic("TData", (g) => g.extends(symbolTDataShape).default(symbolTDataShape)).generic("ThrowOnError", (g) => g.extends("boolean").default("boolean"))).type($.type.and($.type(symbolClientOptions).$if(isNuxtClient, (t) => t.generic("TComposable").generic("TData").generic(nuxtTypeResponse).generic(nuxtTypeDefault), (t) => t.generic("TData").generic("ThrowOnError")), $.type.object().prop("client", (p) => p.doc([
+ const typeOptions = $.type.alias(symbolOptions).export().$if(isNuxtClient, (t) => t.generic("TComposable", (g) => g.extends(plugin.external("client.Composable")).default($.type.literal("$fetch"))).generic("TData", (g) => g.extends(symbolTDataShape).default(symbolTDataShape)).generic(nuxtTypeResponse, (g) => g.default("unknown")).generic(nuxtTypeDefault, (g) => g.default("undefined")), (t) => t.generic("TData", (g) => g.extends(symbolTDataShape).default(symbolTDataShape)).generic("ThrowOnError", (g) => g.extends("boolean").default("boolean")).generic("TResponse", (g) => g.default("unknown"))).type($.type.and($.type(symbolClientOptions).$if(isNuxtClient, (t) => t.generic("TComposable").generic("TData").generic(nuxtTypeResponse).generic(nuxtTypeDefault), (t) => t.generic("TData").generic("ThrowOnError").generic("TResponse")), $.type.object().prop("client", (p) => p.doc([
"You can provide a client instance returned by `createClient()` instead of",
"individual options. This might be also useful if you want to implement a",
"custom client."
@@ -7814,6 +7826,7 @@ const createInfiniteQueryOptions = ({ operation, plugin }) => {
//#endregion
//#region src/plugins/@tanstack/query-core/v5/mutationOptions.ts
const createMutationOptions = ({ operation, plugin }) => {
+ if (hasOperationSse({ operation })) return;
const symbolMutationOptionsType = plugin.external(`${plugin.name}.MutationOptions`);
const typeData = useTypeData({
operation,