JetBrains / js-graphql-intellij-plugin

GraphQL language support for WebStorm, IntelliJ IDEA and other IDEs based on the IntelliJ Platform.
https://jimkyndemeyer.github.io/js-graphql-intellij-plugin/
MIT License
879 stars 97 forks source link

Failed to evaluate config in TS-based project with ESM imports #690

Open jkazimierczak opened 9 months ago

jkazimierczak commented 9 months ago

Describe the bug I tried adding this plugin to a codebase with .graphqlrc.ts config - this result in "Failed to evaluate config" message. The same config works wine without TS. I configured TS as described in: README.

Error:

java.lang.Throwable: 
node:internal/process/esm_loader:48
      internalBinding('errors').triggerUncaughtException(
                                ^
[Object: null prototype] {
  []: 
}

Node.js v20.7.0

    at com.intellij.lang.jsgraphql.javascript.config.GraphQLJavaScriptConfigLoader.completeExceptionally(GraphQLJavaScriptConfigLoader.kt:96)
    at com.intellij.lang.jsgraphql.javascript.config.GraphQLJavaScriptConfigLoader.load(GraphQLJavaScriptConfigLoader.kt:81)
    at com.intellij.lang.jsgraphql.ide.config.loader.GraphQLConfigLoader.readJs(GraphQLConfigLoader.kt:167)
    at com.intellij.lang.jsgraphql.ide.config.loader.GraphQLConfigLoader.readData(GraphQLConfigLoader.kt:127)
    at com.intellij.lang.jsgraphql.ide.config.loader.GraphQLConfigLoader.load(GraphQLConfigLoader.kt:29)
    at com.intellij.lang.jsgraphql.ide.config.GraphQLConfigProvider.reload(GraphQLConfigProvider.kt:380)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:186)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$13(CoreProgressManager.java:604)
    at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:679)
    at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:635)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:603)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:61)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:173)
    at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:360)
    at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:338)
    at com.intellij.lang.jsgraphql.ide.config.GraphQLConfigProvider.scheduleConfigurationReload$lambda$22(GraphQLConfigProvider.kt:351)
    at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:254)
    at com.intellij.util.Alarm$Request.runSafely(Alarm.java:373)
    at com.intellij.util.Alarm$Request.run(Alarm.java:360)
    at com.intellij.util.concurrency.Propagation.contextAwareCallable$lambda$2(propagation.kt:328)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at com.intellij.util.concurrency.SchedulingWrapper$MyScheduledFutureTask.run(SchedulingWrapper.java:272)
    at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:249)
    at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:31)
    at com.intellij.util.concurrency.BoundedTaskExecutor$1.executeFirstTaskAndHelpQueue(BoundedTaskExecutor.java:227)
    at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:218)
    at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:215)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
    at java.base/java.lang.Thread.run(Thread.java:833)

.graphqlrc.ts (Fails):

import { loadEnvConfig } from "@next/env";
import type { CodegenConfig } from "@graphql-codegen/cli";

loadEnvConfig(process.cwd());

const config: CodegenConfig = {
    schema: process.env.GRAPHQL_URL,
    overwrite: true,
    ignoreNoDocuments: true,
    documents: "src/graphql/**/*.graphql",
    generates: {
        "src/gql/": {
            preset: "client",
            // plugins: [],
            presetConfig: {
                fragmentMasking: false,
            },
            config: {
                useTypeImports: true,
                enumsAsTypes: true,
                defaultScalarType: "unknown",
                // strictScalars: true,  // throw if not all scalars mapping are defined
                skipTypename: true,
                documentMode: "string",
            },
        },
    },
};

export default config;

.graphqlrc.ts (works):

const nextEnv = require("@next/env");

nextEnv.loadEnvConfig(process.cwd());

const config = {
    schema: process.env.GRAPHQL_URL,
    overwrite: true,
    ignoreNoDocuments: true,
    documents: "src/graphql/**/*.graphql",
    generates: {
        "src/gql/": {
            preset: "client",
            // plugins: [],
            presetConfig: {
                fragmentMasking: false,
            },
            config: {
                useTypeImports: true,
                enumsAsTypes: true,
                defaultScalarType: "unknown",
                // strictScalars: true,  // throw if not all scalars mapping are defined
                skipTypename: true,
                documentMode: "string",
            },
        },
    },
};

// export default config;
module.exports = config;

To Reproduce Link to Repo with Reproduction or Steps to Reproduce:

  1. Clone: https://github.com/jkazimierczak/intellij-graphql-bug-report
  2. npm i
  3. Open .graphqlrc.ts and see the notification.

Expected behavior TS config with ESM imports is read correctly by the plugin.

Version and Environment Details

WebStorm 2023.2.2
Build #WS-232.9921.42, built on September 12, 2023
Licensed to Jakub Kazimierczak
Subscription is active until November 4, 2023.
For educational use only.
Runtime version: 17.0.8+7-b1000.22 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Linux 5.19.16-200.fc36.x86_64
GC: G1 Young Generation, G1 Old Generation
Memory: 2996M
Cores: 4
Non-Bundled Plugins:
    com.intellij.lang.jsgraphql (4.0.2)

Current Desktop: GNOME
TRUSTMEIMJEDI commented 8 months ago

I have similar issue.

This is my config file:

import type { CodegenConfig } from '@graphql-codegen/cli';
require('dotenv').config();

const scalars = {
  JSON: '{ [key: string]: any }',
  Date: 'string',
  Datetime: 'string',
  Time: 'string',
  UUID: 'string',
  BigInt: 'string',
};

const config: CodegenConfig = {
  schema: [
    {
      'http://localhost:3000/graphql': {
        headers: {
          Authorization: `Bearer ${process.env.APOLLO_CODEGEN_TOKEN}`,
        },
      }
    }
  ],
  documents: 'libs/data-access/**/src/**/!(*.generated).{ts,graphql}',
  generates: {
    'libs/util/global-search/src/lib/__generated__/global-types.ts': {
      plugins: ['typescript'],
      config: {
        immutableTypes: true,
        scalars
      }
    },
    'libs/data-access': {
      preset: 'near-operation-file',
      presetConfig: {
        extension: '.generated.ts',
        baseTypesPath: '../util/global-search/src/lib/__generated__/global-types.ts',
        folder: '__generated__'
      },
      plugins: ['typescript-operations', 'typescript-apollo-angular'],
      config: {
        withHooks: true,
        addExplicitOverride: true,
        immutableTypes: true,
        scalars
      },
    },
  },
  hooks: {
    afterAllFileWrite: ['prettier --write']
  }
};

export default config;

Codę generator is working fine

image

but plugin returns for me this stack trace:

java.lang.Throwable: /my-path/.graphqlrc.ts:50
export default config;
^^^^^^

SyntaxError: Unexpected token 'export'
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1031:15)
    at Module._compile (node:internal/modules/cjs/loader:1065:27)
    at Module.m._compile (/my-path/node_modules/ts-node/src/index.ts:1618:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .ts] (/my-path/node_modules/ts-node/src/index.ts:1621:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)

    at com.intellij.lang.jsgraphql.javascript.config.GraphQLJavaScriptConfigLoader.completeExceptionally(GraphQLJavaScriptConfigLoader.kt:96)
    at com.intellij.lang.jsgraphql.javascript.config.GraphQLJavaScriptConfigLoader.load(GraphQLJavaScriptConfigLoader.kt:81)
    at com.intellij.lang.jsgraphql.ide.config.loader.GraphQLConfigLoader.readJs(GraphQLConfigLoader.kt:167)
    at com.intellij.lang.jsgraphql.ide.config.loader.GraphQLConfigLoader.readData(GraphQLConfigLoader.kt:127)
    at com.intellij.lang.jsgraphql.ide.config.loader.GraphQLConfigLoader.load(GraphQLConfigLoader.kt:29)
    at com.intellij.lang.jsgraphql.ide.config.GraphQLConfigProvider.reload(GraphQLConfigProvider.kt:380)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:186)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$13(CoreProgressManager.java:604)
    at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:679)
    at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:635)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:603)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:61)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:173)
    at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:360)
    at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:338)
    at com.intellij.lang.jsgraphql.ide.config.GraphQLConfigProvider.scheduleConfigurationReload$lambda$22(GraphQLConfigProvider.kt:351)
    at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:254)
    at com.intellij.util.Alarm$Request.runSafely(Alarm.java:373)
    at com.intellij.util.Alarm$Request.run(Alarm.java:360)
    at com.intellij.util.concurrency.Propagation.contextAwareCallable$lambda$2(propagation.kt:328)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at com.intellij.util.concurrency.SchedulingWrapper$MyScheduledFutureTask.run(SchedulingWrapper.java:272)
    at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:249)
    at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:31)
    at com.intellij.util.concurrency.BoundedTaskExecutor$1.executeFirstTaskAndHelpQueue(BoundedTaskExecutor.java:227)
    at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:218)
    at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:215)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
    at java.base/java.lang.Thread.run(Thread.java:833)

Not using ESM imports and TS module export solve the issue:

// import type { CodegenConfig } from '@graphql-codegen/cli';
require('dotenv').config();

const scalars = {
  JSON: '{ [key: string]: any }',
  Date: 'string',
  Datetime: 'string',
  Time: 'string',
  UUID: 'string',
  BigInt: 'string',
};

// const config: CodegenConfig = {
  const config = {
  schema: [
    {
      'http://localhost:3000/graphql': {
        headers: {
          Authorization: `Bearer ${process.env.APOLLO_CODEGEN_TOKEN}`,
        },
      },
    },
  ],
  documents: 'libs/data-access/**/src/**/!(*.generated).{ts,graphql}',
  generates: {
    'libs/util/global-search/src/lib/__generated__/global-types.ts': {
      plugins: ['typescript'],
      config: {
        immutableTypes: true,
        scalars,
      },
    },
    'libs/data-access': {
      preset: 'near-operation-file',
      presetConfig: {
        extension: '.generated.ts',
        baseTypesPath: '../util/global-search/src/lib/__generated__/global-types.ts',
        folder: '__generated__',
      },
      plugins: ['typescript-operations', 'typescript-apollo-angular'],
      config: {
        withHooks: true,
        addExplicitOverride: true,
        immutableTypes: true,
        scalars,
      },
    },
  },
  hooks: {
    afterAllFileWrite: ['prettier --write'],
  },
};

// export default config;
module.exports = config;
vepanimas commented 8 months ago

@jkazimierczak hi! AFAIU you can't import a CJS module like that, try this instead:

import env from "@next/env";
import type {CodegenConfig} from "@graphql-codegen/cli";

const {loadEnvConfig} = env;

More details can be found here https://stackoverflow.com/a/76306331

Also, please note, that ts-node key shouldn't be inside compilerOptions

{
  "$schema": "https://json.schemastore.org/tsconfig",
  "compilerOptions": {
    "target": "ESNext",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    "allowSyntheticDefaultImports": true,
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": [
        "./src/*"
      ]
    }
  },
  "ts-node": {
    "esm": true,
  }
}
vepanimas commented 8 months ago

@TRUSTMEIMJEDI hi! That error means that you probably haven't enabled "type": "module" in package.json.

java.lang.Throwable: /my-path/.graphqlrc.ts:50
export default config;
^^^^^^