trpc-openapi icon indicating copy to clipboard operation
trpc-openapi copied to clipboard

bug: inference error when creating OpenApiDocument. The inferred type of 'openApiDocument' cannot be named without a reference to '.pnpm/[email protected]/node_modules/openapi-types'. This is likely not portable. A type annotation is necessary.ts (2742)

Open MiniSuperDev opened this issue 8 months ago • 8 comments

image

The inferred type of 'openApiDocument' cannot be named without a reference to '.pnpm/[email protected]/node_modules/openapi-types'. This is likely not portable. A type annotation is necessary.ts(2742)

You can clone this repo in the linked commit: https://github.com/MiniSuperDev/turbo-trpc-bug/tree/93a6efbce0a9c3a178f411831444ee52104a0c78

The error is in this line: https://github.com/MiniSuperDev/turbo-trpc-bug/blob/93a6efbce0a9c3a178f411831444ee52104a0c78/apps/express-api/src/openapi.ts#L4

I'm using a monorepo with turborepo and pnpm.

Thanks

MiniSuperDev avatar Oct 10 '23 08:10 MiniSuperDev

I have a similar problem, when I try to build my api library form another package using tsup I get the error: ../../node_modules/.pnpm/@[email protected]/node_modules/@trpc/server/src/core/initTRPC.ts(64,3): error TS2742: The inferred type of 'create' cannot be named without a reference to '.pnpm/@[email protected]/node_modules/@trpc/server/src'. This is likely not portable. A type annotation is necessary.

When commenting the openapi meta line:

const t = initTRPC
  // .meta<OpenApiMeta>() // With this line commented the code compiles
  .context<typeof createTRPCContext>().create({
    transformer: superjson,
    errorFormatter({ shape, error }) {
      return {
        ...shape,
        data: {
          ...shape.data,
          zodError:
            error.cause instanceof ZodError ? error.cause.flatten() : null,
        },
      };
    },
  });

MaximilianGaedig avatar Oct 17 '23 07:10 MaximilianGaedig

@MaximilianGaedig Have you found any workaround for this? Im running into the same issue trying to add trpc-openapi to my api package in a pnpm+turborepo codebase

IsaiahByDayah avatar Feb 11 '24 01:02 IsaiahByDayah

Hey @IsaiahByDayah, yea, we're using it in production for a while already, we've just casted it to OpenApiRouter

import { type OpenApiRouter, generateOpenApiDocument } from 'trpc-openapi';

const openApiDocument = generateOpenApiDocument((openApiRouter as OpenApiRouter),{...})

MaximilianGaedig avatar Feb 11 '24 01:02 MaximilianGaedig

Hmmm, @MaximilianGaedig this fixed your issue when adding .meta<OpenApiMeta>() to the initTRPC chain? Was there any other exports you had to do to get that piece working? I never actually ran into any issues with generateOpenApiDocument, but even just adding the meta call throws the "The inferred type of 'create' cannot be named ..." error when I try to build

IsaiahByDayah avatar Feb 11 '24 01:02 IsaiahByDayah

Would you be able to share a link to your codebase? Happy to try and dig through the source myself to figure out if theres anything different between setups

IsaiahByDayah avatar Feb 11 '24 01:02 IsaiahByDayah

Hmmm, @MaximilianGaedig this fixed your issue when adding .meta<OpenApiMeta>() to the initTRPC chain? Was there any other exports you had to do to get that piece working? I never actually ran into any issues with generateOpenApiDocument, but even just adding the meta call throws the "The inferred type of 'create' cannot be named ..." error when I try to build

I just left that commented, about the meta calls, I have not had the same happen

Would you be able to share a link to your codebase? Happy to try and dig through the source myself to figure out if theres anything different between setups

Can't do that, sorry, it's a proprietary product

a part of my tsconfig.json which might help:

{
  "compilerOptions": {
    "incremental": false,
    "module": "node16",
    "moduleResolution": "node16"
  },
  "include": [
    "src/index.ts"
  ],
  "exclude": [
    "node_modules",
    "@trpc/server"
  ]
}

MaximilianGaedig avatar Feb 11 '24 01:02 MaximilianGaedig

Oh, strange 🤔. And you guys are able to still get type inference when you set the meta value for procedures? ie:

export const appRouter = t.router({
  sayHello: t.procedure
    .meta({ openapi: { method: 'GET', path: '/say-hello' } }) // 👈 this line here
    .input(z.object({ name: z.string() }))
    .output(z.object({ greeting: z.string() }))
    .query(({ input }) => {
      return { greeting: `Hello ${input.name}!` };
    });
});

IsaiahByDayah avatar Feb 11 '24 01:02 IsaiahByDayah

Oh, strange 🤔. And you guys are able to still get type inference when you set the meta value for procedures? ie:


export const appRouter = t.router({

  sayHello: t.procedure

    .meta({ openapi: { method: 'GET', path: '/say-hello' } }) // 👈 this line here

    .input(z.object({ name: z.string() }))

    .output(z.object({ greeting: z.string() }))

    .query(({ input }) => {

      return { greeting: `Hello ${input.name}!` };

    });

});

we might be not using a part of this, well we have those meta tags for sure, but we don't use the types from that directly, we generate this openapi file and then use it in another package where we have an openapi-fetch client from that

MaximilianGaedig avatar Feb 11 '24 01:02 MaximilianGaedig