jasonkuhrt / graphql-request

Minimal GraphQL client
MIT License
5.75k stars 307 forks source link

Cannot find module 'graphql-request' or its corresponding type declarations. #880

Closed tofsjonas closed 1 month ago

tofsjonas commented 1 month ago

Screenshot VS Code

Screenshot 2024-05-23 at 09 47 21

Screenshot npx tsc --noEmit

Screenshot 2024-05-23 at 09 51 43

Description

When installing 7.0.1 typescript fails. 6.1.0 works as expected.

I have tried with both pnpm and npm. I haven't tried with yarn.

tsconfig.json
{
  "compilerOptions": {
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "ES2021",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "skipLibCheck": true,
    "strictNullChecks": false,
    "noImplicitAny": false,
    "strictBindCallApply": false,
    "forceConsistentCasingInFileNames": false,
    "noFallthroughCasesInSwitch": false
  }
}

(I have tried with other tsconfig setups, but they all fail.)

Reproduction Steps/Repo Link

Repo: https://github.com/tofsjonas/graphql-request-test Install and run

tofsjonas commented 1 month ago

Ok, so if I set "type":"module" in package.json it works.

Everything ELSE breaks though... 😭

Is there any way to make "type":"module" not a requirement? 🤞

jasonkuhrt commented 1 month ago

@tofsjonas unfortunately not, this is an ESM project. Are you stuck in the CJS world? https://github.com/jasonkuhrt/graphql-request?tab=readme-ov-file#typescript-setup

tofsjonas commented 1 month ago

Haha, well, I wish I wasn't.

The repo I shared was a completely fresh nest.js project. (Sure, nest.js doesn't have as many downloads as graphql-request, but it's still a significant package)

If I add "type":"module" to this tiny, tiny hello-world project I get

Screenshot 2024-05-24 at 09 45 15

(In my actual project, I have hundreds of files with thousands of imports.)

To fix it I have to go into every single file that imports from another file and alter

import { AppService } from './app.service';

to

import { AppService } from './app.service.js';

Either that or figure out some bundler magic with babel or what have you.

It would be so, so very nice not to have to do that... 🥺🐶

mrbfrank commented 1 month ago

@tofsjonas if you use "moduleResolution": "bundler" in .tsconfig.json you won't have to add file extensions https://www.typescriptlang.org/tsconfig/#moduleResolution

I've gotten that far updating my project, now trying to get Jest working with ESM.. So I agree this brings a challenge for some established projects.

tofsjonas commented 1 month ago

"moduleResolution": "bundler" fixes that particular problem, thanks for that (I was sure I had tried that already, but I guess I messed it up somehow)

Now I just have to get the ci pipeline to work again. But I guess that can wait until Monday..

Thank you both for your time! 🙏

jasonkuhrt commented 1 month ago

This poll might be relevant for you https://github.com/jasonkuhrt/graphql-request/discussions/863

tofsjonas commented 1 month ago

Er, I take it back.

When using "moduleResolution": "bundler" I didn't get any errors when running linting and tsc, so I moved on with my life. But when I tried to actually run the project I got the same error as before

Cannot find module '/Users/jonas/graphql-request-test/dist/app.module'
imported from /Users/jonas/graphql-request-test/dist/main.js

If I add .js to the import it works as expected, but I can't do that in my actual project 😞

kolya182 commented 1 month ago

Eventually this combination worked from me: tsconfig.json

{
  "compilerOptions": {
    "lib": ["ES2019"],
    "module": "ES6",
    "target": "ES6",
    "esModuleInterop": true,
    "moduleResolution": "bundler",
  }
}

Screenshot 2024-06-06 at 4 13 10 PM

danzho commented 1 month ago

Here's how you can migrate your Typescript + Node application from commonjs to ESM:

I think that's it. That last step is most of the pain but if you're lucky it only affects a couple libraries you're using.

If you wonder why your Node project needs to be forced to use ESM even though everything on NPM supports commonjs except this one library, you're not alone. ;)

nort3x commented 1 month ago

could be a good lightweight library, shame

jasonkuhrt commented 1 month ago

Going to lock this issue now to keep my notification noise down. If you have comments about the library you can leave that in the discussions forum. There is also a poll I'm looking at occasionally to help gauge the impact of not supporting CJS linked to above. Sorry for users feeling the pain of CJS/ESM. Ultimately the way out of this is everyone dropping support for CJS and users upgrading their projects. Our Python 2/3 moment.