diff --git a/src/createImports.mts b/src/createImports.mts index ac887ec..b39c87d 100644 --- a/src/createImports.mts +++ b/src/createImports.mts @@ -92,6 +92,11 @@ export const createImports = ({ undefined, ts.factory.createIdentifier("UseQueryOptions"), ), + ts.factory.createImportSpecifier( + false, + undefined, + ts.factory.createIdentifier("UseSuspenseQueryOptions"), + ), ts.factory.createImportSpecifier( false, undefined, diff --git a/src/createUseQuery.mts b/src/createUseQuery.mts index f626641..d3b899c 100644 --- a/src/createUseQuery.mts +++ b/src/createUseQuery.mts @@ -266,7 +266,9 @@ function createQueryHook({ ts.factory.createIdentifier( isInfiniteQuery ? "UseInfiniteQueryOptions" - : "UseQueryOptions", + : queryString === "useSuspenseQuery" + ? "UseSuspenseQueryOptions" + : "UseQueryOptions", ), [ ts.factory.createTypeReferenceNode(TData), diff --git a/tests/__snapshots__/createSource.test.ts.snap b/tests/__snapshots__/createSource.test.ts.snap index eb73615..f90f2d9 100644 --- a/tests/__snapshots__/createSource.test.ts.snap +++ b/tests/__snapshots__/createSource.test.ts.snap @@ -12,7 +12,7 @@ exports[`createSource > createSource - @hey-api/client-axios 2`] = ` "// generated with @7nohe/openapi-react-query-codegen@1.0.0 import { type Options } from "@hey-api/client-axios"; -import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; +import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseSuspenseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; import { client, findPets, addPet, getNotDefined, postNotDefined, findPetById, deletePet, findPaginatedPets } from "../requests/services.gen"; import { Pet, NewPet, Error, FindPetsData, FindPetsResponse, FindPetsError, AddPetData, AddPetResponse, AddPetError, GetNotDefinedResponse, GetNotDefinedError, PostNotDefinedResponse, PostNotDefinedError, FindPetByIdData, FindPetByIdResponse, FindPetByIdError, DeletePetData, DeletePetResponse, DeletePetError, FindPaginatedPetsData, FindPaginatedPetsResponse, FindPaginatedPetsError } from "../requests/types.gen"; import { AxiosError } from "axios"; @@ -49,7 +49,7 @@ exports[`createSource > createSource - @hey-api/client-axios 3`] = ` import * as Common from "./common"; import { type Options } from "@hey-api/client-axios"; -import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; +import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseSuspenseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; import { client, findPets, addPet, getNotDefined, postNotDefined, findPetById, deletePet, findPaginatedPets } from "../requests/services.gen"; import { Pet, NewPet, Error, FindPetsData, FindPetsResponse, FindPetsError, AddPetData, AddPetResponse, AddPetError, GetNotDefinedResponse, GetNotDefinedError, PostNotDefinedResponse, PostNotDefinedError, FindPetByIdData, FindPetByIdResponse, FindPetByIdError, DeletePetData, DeletePetResponse, DeletePetError, FindPaginatedPetsData, FindPaginatedPetsResponse, FindPaginatedPetsError } from "../requests/types.gen"; import { AxiosError } from "axios"; @@ -68,14 +68,14 @@ exports[`createSource > createSource - @hey-api/client-axios 4`] = ` import * as Common from "./common"; import { type Options } from "@hey-api/client-axios"; -import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; +import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseSuspenseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; import { client, findPets, addPet, getNotDefined, postNotDefined, findPetById, deletePet, findPaginatedPets } from "../requests/services.gen"; import { Pet, NewPet, Error, FindPetsData, FindPetsResponse, FindPetsError, AddPetData, AddPetResponse, AddPetError, GetNotDefinedResponse, GetNotDefinedError, PostNotDefinedResponse, PostNotDefinedError, FindPetByIdData, FindPetByIdResponse, FindPetByIdError, DeletePetData, DeletePetResponse, DeletePetError, FindPaginatedPetsData, FindPaginatedPetsResponse, FindPaginatedPetsError } from "../requests/types.gen"; import { AxiosError } from "axios"; -export const useFindPetsSuspense = , TQueryKey extends Array = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPetsKeyFn(clientOptions, queryKey), queryFn: () => findPets({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); -export const useGetNotDefinedSuspense = , TQueryKey extends Array = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseGetNotDefinedKeyFn(clientOptions, queryKey), queryFn: () => getNotDefined({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); -export const useFindPetByIdSuspense = , TQueryKey extends Array = unknown[]>(clientOptions: Options, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPetByIdKeyFn(clientOptions, queryKey), queryFn: () => findPetById({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); -export const useFindPaginatedPetsSuspense = , TQueryKey extends Array = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPaginatedPetsKeyFn(clientOptions, queryKey), queryFn: () => findPaginatedPets({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); +export const useFindPetsSuspense = , TQueryKey extends Array = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPetsKeyFn(clientOptions, queryKey), queryFn: () => findPets({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); +export const useGetNotDefinedSuspense = , TQueryKey extends Array = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseGetNotDefinedKeyFn(clientOptions, queryKey), queryFn: () => getNotDefined({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); +export const useFindPetByIdSuspense = , TQueryKey extends Array = unknown[]>(clientOptions: Options, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPetByIdKeyFn(clientOptions, queryKey), queryFn: () => findPetById({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); +export const useFindPaginatedPetsSuspense = , TQueryKey extends Array = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPaginatedPetsKeyFn(clientOptions, queryKey), queryFn: () => findPaginatedPets({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); " `; @@ -84,7 +84,7 @@ exports[`createSource > createSource - @hey-api/client-axios 5`] = ` import * as Common from "./common"; import { type Options } from "@hey-api/client-axios"; -import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; +import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseSuspenseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; import { client, findPets, addPet, getNotDefined, postNotDefined, findPetById, deletePet, findPaginatedPets } from "../requests/services.gen"; import { Pet, NewPet, Error, FindPetsData, FindPetsResponse, FindPetsError, AddPetData, AddPetResponse, AddPetError, GetNotDefinedResponse, GetNotDefinedError, PostNotDefinedResponse, PostNotDefinedError, FindPetByIdData, FindPetByIdResponse, FindPetByIdError, DeletePetData, DeletePetResponse, DeletePetError, FindPaginatedPetsData, FindPaginatedPetsResponse, FindPaginatedPetsError } from "../requests/types.gen"; import { AxiosError } from "axios"; @@ -107,7 +107,7 @@ exports[`createSource > createSource - @hey-api/client-fetch 2`] = ` "// generated with @7nohe/openapi-react-query-codegen@1.0.0 import { type Options } from "@hey-api/client-fetch"; -import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; +import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseSuspenseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; import { client, findPets, addPet, getNotDefined, postNotDefined, findPetById, deletePet, findPaginatedPets } from "../requests/services.gen"; import { Pet, NewPet, Error, FindPetsData, FindPetsResponse, FindPetsError, AddPetData, AddPetResponse, AddPetError, GetNotDefinedResponse, GetNotDefinedError, PostNotDefinedResponse, PostNotDefinedError, FindPetByIdData, FindPetByIdResponse, FindPetByIdError, DeletePetData, DeletePetResponse, DeletePetError, FindPaginatedPetsData, FindPaginatedPetsResponse, FindPaginatedPetsError } from "../requests/types.gen"; export type FindPetsDefaultResponse = Awaited>["data"]; @@ -143,7 +143,7 @@ exports[`createSource > createSource - @hey-api/client-fetch 3`] = ` import * as Common from "./common"; import { type Options } from "@hey-api/client-fetch"; -import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; +import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseSuspenseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; import { client, findPets, addPet, getNotDefined, postNotDefined, findPetById, deletePet, findPaginatedPets } from "../requests/services.gen"; import { Pet, NewPet, Error, FindPetsData, FindPetsResponse, FindPetsError, AddPetData, AddPetResponse, AddPetError, GetNotDefinedResponse, GetNotDefinedError, PostNotDefinedResponse, PostNotDefinedError, FindPetByIdData, FindPetByIdResponse, FindPetByIdError, DeletePetData, DeletePetResponse, DeletePetError, FindPaginatedPetsData, FindPaginatedPetsResponse, FindPaginatedPetsError } from "../requests/types.gen"; export const useFindPets = = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useQuery({ queryKey: Common.UseFindPetsKeyFn(clientOptions, queryKey), queryFn: () => findPets({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); @@ -161,13 +161,13 @@ exports[`createSource > createSource - @hey-api/client-fetch 4`] = ` import * as Common from "./common"; import { type Options } from "@hey-api/client-fetch"; -import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; +import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseSuspenseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; import { client, findPets, addPet, getNotDefined, postNotDefined, findPetById, deletePet, findPaginatedPets } from "../requests/services.gen"; import { Pet, NewPet, Error, FindPetsData, FindPetsResponse, FindPetsError, AddPetData, AddPetResponse, AddPetError, GetNotDefinedResponse, GetNotDefinedError, PostNotDefinedResponse, PostNotDefinedError, FindPetByIdData, FindPetByIdResponse, FindPetByIdError, DeletePetData, DeletePetResponse, DeletePetError, FindPaginatedPetsData, FindPaginatedPetsResponse, FindPaginatedPetsError } from "../requests/types.gen"; -export const useFindPetsSuspense = = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPetsKeyFn(clientOptions, queryKey), queryFn: () => findPets({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); -export const useGetNotDefinedSuspense = = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseGetNotDefinedKeyFn(clientOptions, queryKey), queryFn: () => getNotDefined({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); -export const useFindPetByIdSuspense = = unknown[]>(clientOptions: Options, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPetByIdKeyFn(clientOptions, queryKey), queryFn: () => findPetById({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); -export const useFindPaginatedPetsSuspense = = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPaginatedPetsKeyFn(clientOptions, queryKey), queryFn: () => findPaginatedPets({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); +export const useFindPetsSuspense = = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPetsKeyFn(clientOptions, queryKey), queryFn: () => findPets({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); +export const useGetNotDefinedSuspense = = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseGetNotDefinedKeyFn(clientOptions, queryKey), queryFn: () => getNotDefined({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); +export const useFindPetByIdSuspense = = unknown[]>(clientOptions: Options, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPetByIdKeyFn(clientOptions, queryKey), queryFn: () => findPetById({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); +export const useFindPaginatedPetsSuspense = = unknown[]>(clientOptions: Options = {}, queryKey?: TQueryKey, options?: Omit, "queryKey" | "queryFn">) => useSuspenseQuery({ queryKey: Common.UseFindPaginatedPetsKeyFn(clientOptions, queryKey), queryFn: () => findPaginatedPets({ ...clientOptions }).then(response => response.data as TData) as TData, ...options }); " `; @@ -176,7 +176,7 @@ exports[`createSource > createSource - @hey-api/client-fetch 5`] = ` import * as Common from "./common"; import { type Options } from "@hey-api/client-fetch"; -import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; +import { type QueryClient, useQuery, useSuspenseQuery, useMutation, UseQueryResult, UseQueryOptions, UseSuspenseQueryOptions, UseMutationOptions, UseMutationResult } from "@tanstack/react-query"; import { client, findPets, addPet, getNotDefined, postNotDefined, findPetById, deletePet, findPaginatedPets } from "../requests/services.gen"; import { Pet, NewPet, Error, FindPetsData, FindPetsResponse, FindPetsError, AddPetData, AddPetResponse, AddPetError, GetNotDefinedResponse, GetNotDefinedError, PostNotDefinedResponse, PostNotDefinedError, FindPetByIdData, FindPetByIdResponse, FindPetByIdError, DeletePetData, DeletePetResponse, DeletePetError, FindPaginatedPetsData, FindPaginatedPetsResponse, FindPaginatedPetsError } from "../requests/types.gen"; export const prefetchUseFindPets = (queryClient: QueryClient, clientOptions: Options = {}) => queryClient.prefetchQuery({ queryKey: Common.UseFindPetsKeyFn(clientOptions), queryFn: () => findPets({ ...clientOptions }).then(response => response.data) }); diff --git a/tests/__snapshots__/generate.test.ts.snap b/tests/__snapshots__/generate.test.ts.snap index 082275f..69878b5 100644 --- a/tests/__snapshots__/generate.test.ts.snap +++ b/tests/__snapshots__/generate.test.ts.snap @@ -416,7 +416,10 @@ exports[`generate > suspense.ts 1`] = ` "// generated with @7nohe/openapi-react-query-codegen@1.0.0 import type { Options } from "@hey-api/client-fetch"; -import { type UseQueryOptions, useSuspenseQuery } from "@tanstack/react-query"; +import { + useSuspenseQuery, + type UseSuspenseQueryOptions, +} from "@tanstack/react-query"; import { findPaginatedPets, findPetById, @@ -440,7 +443,10 @@ export const useFindPetsSuspense = < >( clientOptions: Options = {}, queryKey?: TQueryKey, - options?: Omit, "queryKey" | "queryFn">, + options?: Omit< + UseSuspenseQueryOptions, + "queryKey" | "queryFn" + >, ) => useSuspenseQuery({ queryKey: Common.UseFindPetsKeyFn(clientOptions, queryKey), @@ -457,7 +463,10 @@ export const useGetNotDefinedSuspense = < >( clientOptions: Options = {}, queryKey?: TQueryKey, - options?: Omit, "queryKey" | "queryFn">, + options?: Omit< + UseSuspenseQueryOptions, + "queryKey" | "queryFn" + >, ) => useSuspenseQuery({ queryKey: Common.UseGetNotDefinedKeyFn(clientOptions, queryKey), @@ -474,7 +483,10 @@ export const useFindPetByIdSuspense = < >( clientOptions: Options, queryKey?: TQueryKey, - options?: Omit, "queryKey" | "queryFn">, + options?: Omit< + UseSuspenseQueryOptions, + "queryKey" | "queryFn" + >, ) => useSuspenseQuery({ queryKey: Common.UseFindPetByIdKeyFn(clientOptions, queryKey), @@ -491,7 +503,10 @@ export const useFindPaginatedPetsSuspense = < >( clientOptions: Options = {}, queryKey?: TQueryKey, - options?: Omit, "queryKey" | "queryFn">, + options?: Omit< + UseSuspenseQueryOptions, + "queryKey" | "queryFn" + >, ) => useSuspenseQuery({ queryKey: Common.UseFindPaginatedPetsKeyFn(clientOptions, queryKey), diff --git a/tests/issue-181.test.ts b/tests/issue-181.test.ts new file mode 100644 index 0000000..3e480e5 --- /dev/null +++ b/tests/issue-181.test.ts @@ -0,0 +1,167 @@ +import { Project, SyntaxKind } from "ts-morph"; +import { afterAll, beforeAll, describe, expect, test } from "vitest"; +import { createSource } from "../src/createSource.mjs"; +import { cleanOutputs, generateTSClients, outputPath } from "./utils"; + +/** + * Test for Issue #181: useSuspenseQuery must not contain undefined type for data + * + * This test uses ts-morph to parse the generated code and verify the actual TypeScript types. + * + * According to TanStack Query docs: + * "This works nicely in TypeScript, because data is guaranteed to be defined + * (as errors and loading states are handled by Suspense- and ErrorBoundaries)." + * + * Reference: https://tanstack.com/query/latest/docs/framework/react/guides/suspense + */ +describe("Issue #181: useSuspenseQuery data type should not include undefined", () => { + const fileName = "issue-181"; + + beforeAll(async () => await generateTSClients(fileName)); + afterAll(async () => await cleanOutputs(fileName)); + + test("useFindPetsSuspense return type data should not include undefined", async () => { + const source = await createSource({ + outputPath: outputPath(fileName), + version: "1.0.0", + pageParam: "page", + nextPageParam: "nextPage", + initialPageParam: "1", + client: "@hey-api/client-axios", + }); + + const suspenseTs = source.find((s) => s.name === "suspense.ts"); + expect(suspenseTs).toBeDefined(); + + // Parse with ts-morph to get TypeScript type information + const project = new Project({ + useInMemoryFileSystem: true, + compilerOptions: { + strict: true, + }, + }); + + // Add TanStack Query types (mock definitions for type resolution) + project.createSourceFile( + "node_modules/@tanstack/react-query/index.d.ts", + ` + export type UseSuspenseQueryResult = { + data: TData; + error: TError | null; + }; + export type UseQueryResult = { + data: TData | undefined; + error: TError | null; + }; + export declare function useSuspenseQuery(options: any): UseSuspenseQueryResult; + export type UseQueryOptions = any; + export type UseSuspenseQueryOptions = any; + `, + ); + + const sourceFile = project.createSourceFile( + "suspense.ts", + suspenseTs!.content, + ); + + // Get useFindPetsSuspense variable declaration + const hookDeclaration = sourceFile + .getVariableDeclarations() + .find((v) => v.getName() === "useFindPetsSuspense"); + + expect(hookDeclaration).toBeDefined(); + + // Get the arrow function initializer + const initializer = hookDeclaration!.getInitializer(); + expect(initializer).toBeDefined(); + + // Get return type by looking at the arrow function's return type + const arrowFunction = initializer!.asKind(SyntaxKind.ArrowFunction); + expect(arrowFunction).toBeDefined(); + + const returnType = arrowFunction!.getReturnType(); + const returnTypeText = returnType.getText(); + + console.log("\n=== Issue #181 Type Check ==="); + console.log("Hook return type:", returnTypeText); + + // Get the 'data' property from the return type + const dataProperty = returnType.getProperty("data"); + expect(dataProperty).toBeDefined(); + + const dataValueDeclaration = dataProperty!.getValueDeclaration(); + const dataType = dataValueDeclaration + ? dataValueDeclaration.getType() + : dataProperty!.getTypeAtLocation(sourceFile); + const dataTypeText = dataType.getText(); + + console.log("Data property type:", dataTypeText); + console.log("===========================\n"); + + // BEFORE FIX: This assertion SHOULD FAIL because data includes undefined + // AFTER FIX: This assertion should PASS because data won't include undefined + expect(dataTypeText).not.toContain("undefined"); + }); + + test("options parameter should use UseSuspenseQueryOptions type", async () => { + const source = await createSource({ + outputPath: outputPath(fileName), + version: "1.0.0", + pageParam: "page", + nextPageParam: "nextPage", + initialPageParam: "1", + client: "@hey-api/client-axios", + }); + + const suspenseTs = source.find((s) => s.name === "suspense.ts"); + expect(suspenseTs).toBeDefined(); + + // Simply check the generated code string for the correct type usage + // This is more reliable than trying to resolve complex generic types + + // BEFORE FIX: Uses UseQueryOptions (incorrect) + const hasUseQueryOptions = suspenseTs!.content.match( + /options\?:\s*Omit/, + ); + + // AFTER FIX: Uses UseSuspenseQueryOptions (correct) + const hasUseSuspenseQueryOptions = suspenseTs!.content.match( + /options\?:\s*Omit/, + ); + + console.log("\n=== Issue #181 Options Type Check ==="); + console.log("Has UseQueryOptions:", !!hasUseQueryOptions); + console.log("Has UseSuspenseQueryOptions:", !!hasUseSuspenseQueryOptions); + console.log("=====================================\n"); + + // BEFORE FIX: This assertion SHOULD FAIL + // AFTER FIX: This assertion should PASS + expect(hasUseSuspenseQueryOptions).toBeTruthy(); + expect(hasUseQueryOptions).toBeFalsy(); + }); + + test("suspense.ts should import UseSuspenseQueryOptions", async () => { + const source = await createSource({ + outputPath: outputPath(fileName), + version: "1.0.0", + pageParam: "page", + nextPageParam: "nextPage", + initialPageParam: "1", + client: "@hey-api/client-axios", + }); + + const suspenseTs = source.find((s) => s.name === "suspense.ts"); + expect(suspenseTs).toBeDefined(); + + // Check if UseSuspenseQueryOptions is imported + const hasImport = suspenseTs!.content.includes("UseSuspenseQueryOptions"); + + console.log("\n=== Issue #181 Import Check ==="); + console.log("Has UseSuspenseQueryOptions import:", hasImport); + console.log("===============================\n"); + + // BEFORE FIX: This assertion SHOULD FAIL + // AFTER FIX: This assertion should PASS + expect(hasImport).toBeTruthy(); + }); +});