Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

skipLibCheck and exclude do not work under monorepos project #38538

Closed
WeijieZhu0204 opened this issue May 13, 2020 · 30 comments
Closed

skipLibCheck and exclude do not work under monorepos project #38538

WeijieZhu0204 opened this issue May 13, 2020 · 30 comments
Labels
Question An issue which isn't directly actionable in code

Comments

@WeijieZhu0204
Copy link

TypeScript Version: 3.8.3

Search Terms:

Code

// ./packages/visual-editor/tsconfig.json

{
  "compilerOptions": {
    "skipLibCheck": true,
    /* Basic Options */
    // "incremental": true,                   /* Enable incremental compilation */
    "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
    "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
    "lib": [
      "DOM",
      "ES2015",
      "ES2016",
      "ES2017",
      "ES2018"
    ] /* Specify library files to be included in the compilation. */,
    "allowJs": true /* Allow javascript files to be compiled. */,
    // "checkJs": true,                       /* Report errors in .js files. */
    "jsx": "preserve" /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */,
    // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
    // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */
    // "sourceMap": true,                     /* Generates corresponding '.map' file. */
    // "outFile": "./",                       /* Concatenate and emit output to single file. */
    // "outDir": "./",                        /* Redirect output structure to the directory. */
    // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    // "composite": true,                     /* Enable project compilation */
    // "tsBuildInfoFile": "./",               /* Specify file to store incremental compilation information */
    // "removeComments": true,                /* Do not emit comments to output. */
    // "noEmit": true,                        /* Do not emit outputs. */
    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
    // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
    // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */

    /* Strict Type-Checking Options */
    "strict": true /* Enable all strict type-checking options. */,
    "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
    "strictNullChecks": true /* Enable strict null checks. */,
    // "strictFunctionTypes": true,           /* Enable strict checking of function types. */
    // "strictBindCallApply": true,           /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
    // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */
    // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
    // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */

    /* Additional Checks */
    // "noUnusedLocals": true,                /* Report errors on unused locals. */
    // "noUnusedParameters": true,            /* Report errors on unused parameters. */
    // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
    // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */

    /* Module Resolution Options */
    "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */,
    "baseUrl": "./src",
    "paths": {
      "actions/*": ["./actions/*"],
      "apis/*": ["./apis/*"],
      "components/*": ["./components/*"],
      "constants/*": ["./constants/*"],
      "helpers/*": ["./helpers/*"],
      "hooks/*": ["./hooks/*"],
      "reducers/*": ["./reducers/*"],
      "types/*": ["./types/*"],
      "models/*": ["./models/*"]
    },
    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    // "typeRoots": [],                       /* List of folders to include type definitions from. */
    // "types": [],                           /* Type declaration files to be included in compilation. */
    // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
    // 与webpack resolve symlinks保持一致
    // "preserveSymlinks": true /* Do not resolve the real path of symlinks. */,
    // "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */

    /* Source Map Options */
    // "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
    // "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */

    /* Experimental Options */
    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */

    /* Advanced Options */
    "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
  },
  "include": ["./src"],
  "exclude": ["node_modules"]
}
// list my project structure

├── lerna.json
├── node_modules
├── package.json
├── packages
   ├── visual-editor
      ├── dist
      ├── example.config.js
      ├── favicon.ico
      ├── node_modules
      ├── package.json
      ├── readme.md
      ├── src
      ├── tsconfig.json
      └── webpack.config.js
   └── ....
├── readme.md
└── yarn.lock


// Execute tsc in the root directory of the project
tsc -p ./packages/visual-editor/tsconfig.json --noEmit --pretty

Expected behavior:
Hope that i can ignore the syntax check of the node_modules module through exclude and skipLibCheck configuration.But these configurations did not work.

Actual behavior:

Tsc throws errors about node_modules ,as follows :

Note : The @tencent/visual-material-wesing module was promoted to the root node_modules directory by lerna hosit.


9   extends BackgroundDataSetField,
            ~~~~~~~~~~~~~~~~~~~~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:10:5 - error TS2304: Cannot find name 'FontColorDataSetField'.

10     FontColorDataSetField,
       ~~~~~~~~~~~~~~~~~~~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:11:5 - error TS2304: Cannot find name 'PositionDataSetField'.

11     PositionDataSetField {
       ~~~~~~~~~~~~~~~~~~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:18:5 - error TS2339: Property 'top' does not exist on type 'Data'.

18     top,
       ~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:20:5 - error TS2339: Property 'left' does not exist on type 'Data'.

20     left,
       ~~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:21:5 - error TS2339: Property 'color' does not exist on type 'Data'.

21     color,
       ~~~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:23:5 - error TS2339: Property 'backgroundColor' does not exist on type 'Data'.

23     backgroundColor,
       ~~~~~~~~~~~~~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:24:5 - error TS2339: Property 'backgroundImage' does not exist on type 'Data'.

24     backgroundImage,
       ~~~~~~~~~~~~~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:25:5 - error TS2339: Property 'backgroundRepeat' does not exist on type 'Data'.

25     backgroundRepeat,
       ~~~~~~~~~~~~~~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:26:5 - error TS2339: Property 'backgroundSize' does not exist on type 'Data'.

26     backgroundSize,
       ~~~~~~~~~~~~~~

node_modules/@tencent/visual-material-wesing/src/components/ranking/definition.ts:12:34 - error TS2304: Cannot find name 'Theme'.

12 export const THEME_MAP = new Map<Theme, ThemeInfo>([
                                    ~~~~~

Playground Link:

Related Issues:

@RyanCavanaugh RyanCavanaugh added the Needs Investigation This issue needs a team member to investigate its status. label May 14, 2020
@RyanCavanaugh RyanCavanaugh added this to the Backlog milestone May 14, 2020
@abhijithvijayan
Copy link

abhijithvijayan commented Jun 14, 2020

I get these errors

error TS2403: Subsequent variable declarations must have the same type.

error TS2300: Duplicate identifier ...

in a yarn workspace monorepo.

The project root has a base configuration and the workspace folders have extended this configuration.

As a workaround, I had to set

  "compilerOptions": {
    // overrides
    "skipLibCheck": true
  },

in the root config file

@jsbroks
Copy link

jsbroks commented Oct 16, 2020

Im running tsc in a monorepo with the --skipLibCheck and --listFiles flags, my output still contains node_module d.ts files.

...
/node_modules/aws-sdk/lib/credentials/shared_ini_file_credentials.d.ts
/node_modules/aws-sdk/lib/credentials/process_credentials.d.ts
/node_modules/aws-sdk/lib/credentials/temporary_credentials.d.ts
/node_modules/aws-sdk/lib/credentials/chainable_temporary_credentials.d.ts
/node_modules/aws-sdk/lib/credentials/web_identity_credentials.d.ts
/node_modules/aws-sdk/lib/credentials/token_file_web_identity_credentials.d.ts
...

Is this related?

@lukas1994
Copy link

Same issue here. It takes ages to load all the node_modules d.ts files.

1 similar comment
@wzxinchen
Copy link

Same issue here. It takes ages to load all the node_modules d.ts files.

@PhilippMolitor
Copy link

Any update on this? This sadly is completely blocking any sort of builds for my projects.

@mizchi
Copy link

mizchi commented Jan 7, 2021

I have same error. I doubt .ts(x) under node_modules with skipLibCheck.

@uberbinge
Copy link

we are running into same issue after updating our aws-javascript-library to v3. Any pointers to how can we keep using new library and still be able to compile things?

@tylerthecoder
Copy link

Having the same issue. Blocking me on a bunch of projects. --listFiles shows .d.ts files in node_modules

@kamranayub
Copy link

Using explicit types helps greatly, we reduced monorepo build time by about 2X (with --skipLibCheck) by specifying types packages to load instead of letting tsc detect them within our monorepo.

@borekb
Copy link

borekb commented May 3, 2021

I think that the example in the issue description is, at its core, #41883 – TypeScript does not apply skipLibCheck to .ts files – and note how all the example errors are from .ts(x) files:

9   extends BackgroundDataSetField,
            ~~~~~~~~~~~~~~~~~~~~~~

node_modules/@tencent/visual-material-wesing/src/components/head-module/head-module.tsx:10:5 - error TS2304: Cannot find name 'FontColorDataSetField'.

BTW we're not seeing issues like above that .d.ts would be included when we set skipLibCheck; that works reliably for us.

@ahtokca
Copy link

ahtokca commented Jul 20, 2021

Same here, skipLibCheck is ignored and tsc checking files in node_modules folder

Any ideas how to solve it?

@elisalimli
Copy link

Same issue

@lll000111
Copy link

lll000111 commented Jul 22, 2021

@ahtokca @alisalim17

According to explanatory blogposts for this skip option the .d.ts are not completely ignored. Checks that lead there from your source files still take place. It's just that any internal issues in the .d.ts files are ignored.

Example blog post: https://dd.engineering/blog/typescript-the-skiplibcheck-option-explained

But this doesn't mean TypeScript won't check your code against the declaration files (it doesn't check the declaration files as a whole). When you use a type from a declaration file, TypeScript still checks your code against that type as far as it can trace that type in that declaration file.

For me, that's actually almost exactly what I would like to see. Completely disregarding any type info is too extreme. I want my code checked, I just don't care about those internal issues that many such files have. Pretty much exactly what this option filters out.


EDIT:

Looking at the "types" section of tsconfig, that could also help?

https://www.typescriptlang.org/tsconfig#types

If "types" is specified, only packages listed will be included in the global scope.

@dengnan123
Copy link

Has anyone solved it?

@Vict0rd
Copy link

Vict0rd commented Aug 4, 2021

@dengnan123 There is some magic workaround

package.json

{
  "scripts": {
    "prebuild": "node add-ts-nocheck",
    "build": "tsc"
  }
}

add-ts-nocheck.js

const fs = require('fs')

const ADDED_STR = '// @ts-nocheck\n\n'
const FILES = [
  'node_modules/some-package/some-file.ts',
  ...
]

Promise.allSettled(FILES.map(addTsNoCheck)).then(results => {
  let hasErrors = false

  for (const result of results) {
    if (result.status === 'rejected') {
      hasErrors = true
      console.error(result.reason)
    }
  }

  if (hasErrors) {
    process.exit(1)
  }
})

async function addTsNoCheck(file) {
  const content = fs.readFileSync(file).toString()

  if (content.includes(ADDED_STR)) {
    console.log(JSON.stringify(ADDED_STR), 'is already in', file)
  } else {
    fs.writeFileSync(file, ADDED_STR + content)
    console.log(JSON.stringify(ADDED_STR), 'added into', file)
  }
}

@borekb
Copy link

borekb commented Aug 4, 2021

@Vict0rd Wow, what a workaround 😄.

@Limuyang1013
Copy link

same error when i use typescript with lerna,how can i fix it on development mode

@tonhao-dev
Copy link

Any update on this?

@xgqfrms
Copy link

xgqfrms commented Nov 2, 2021

TypeScript skipLibCheck and exclude not work under single project, too

#46634

@Ai01
Copy link

Ai01 commented Jan 18, 2022

@dengnan123 There is some magic workaround

package.json

{
  "scripts": {
    "prebuild": "node add-ts-nocheck",
    "build": "tsc"
  }
}

add-ts-nocheck.js

const fs = require('fs')

const ADDED_STR = '// @ts-nocheck\n\n'
const FILES = [
  'node_modules/some-package/some-file.ts',
  ...
]

Promise.allSettled(FILES.map(addTsNoCheck)).then(results => {
  let hasErrors = false

  for (const result of results) {
    if (result.status === 'rejected') {
      hasErrors = true
      console.error(result.reason)
    }
  }

  if (hasErrors) {
    process.exit(1)
  }
})

async function addTsNoCheck(file) {
  const content = fs.readFileSync(file).toString()

  if (content.includes(ADDED_STR)) {
    console.log(JSON.stringify(ADDED_STR), 'is already in', file)
  } else {
    fs.writeFileSync(file, ADDED_STR + content)
    console.log(JSON.stringify(ADDED_STR), 'added into', file)
  }
}

good job bro

@RyanCavanaugh RyanCavanaugh removed the Needs Investigation This issue needs a team member to investigate its status. label Jan 20, 2022
@RyanCavanaugh RyanCavanaugh removed this from the Backlog milestone Jan 20, 2022
@RyanCavanaugh RyanCavanaugh added the Question An issue which isn't directly actionable in code label Jan 20, 2022
@RyanCavanaugh
Copy link
Member

It looks like a lot of people have landed in this thread thinking that skipLibCheck can cause files to not be included in the program -- this is not what skipLibCheck does. If you have a file in your compilation that you don't want to be there, use --explainListFiles to see how it got there.

@ipmcc
Copy link

ipmcc commented Mar 22, 2022

error TS5023: Unknown compiler option '--explainListFiles'.
I'm using TypeScript v4.5.5. This is very recent. Am I missing something here? This is epically frustrating.

@RyanCavanaugh
Copy link
Member

Sorry, misremembered the name - it's explainFiles https://www.typescriptlang.org/tsconfig/#explainFiles

@weagle08
Copy link

So this still occurs. For some reason when "strict": true in the tsconfig.json it makes the tsc compilier completely ignore the skipLibCheck and skipDefaultLibCheck settings. Set strict to false and you should be good to go (other than the complaint about this in your tsconfig, the typescript team should fix this)

@neotan
Copy link

neotan commented Jan 3, 2023

In case someone ended up landing here for a workaround, the point is just to include my ts/tsx files specifically when working with Next.js v13. Btw, skipLibCheck can eighter be true or false as it's not related here.

tsconfig.json (required parts)

{
  "compilerOptions": {
    "strict": true,
    "skipLibCheck": false, 
    "include": [
      "next-env.d.ts",
      "app/**/*.ts",
      "app/**/*.tsx",
      "src/**/*.ts",
      "src/**/*.tsx",
      "components/**/*.ts",
      "components/**/*.tsx",
      "icons/**/*.ts",
      "icons/**/*.tsx"
    ],
    "exclude": [
      "node_modules"
    ]
}

@sneko
Copy link

sneko commented Jan 5, 2023

On my side my storybook package was looking for types specific to another workspace package. I tried tons of "solutions" but none worked.

The only one working was to tell my package to look for types of the other package (since it's a monorepo, relative path going back is not an issue):

{
  ...
  "include": ["**/*.ts", "**/*.tsx", "../../apps/main/@types"],
  "exclude": ["node_modules"]
}

Hope this helps :)

@LoserAntbear
Copy link

LoserAntbear commented Jan 17, 2023

So I see that there's no 'official' solution but in my case non of the suggested variants worked.
I've got monorepo (react-native + typescript, just in case). And I want to utilise typescript solely for static type checking. Although it renders me unable to do that.

Description.

Technologies:

  • react-native
  • typescript
  • yarn workspaces

Project structure:
./packages
--./projectA
--./projectB
--./projectC

B depends on A. C depends on A+B.
All of them have own tsconfig's, which extend the root one.

I need to perform type-check on git hooks (pre-push) only for the single project (e.g. working on project C type check to be performed only for projectC files). I need no .js outputs.

For some reasons, when I run tsc --project . --skipLibCheck in projectC folder, it still performs type-check for packageA and packageB, despite these projects are stated in 'package.json' dependencies. That means, that projectA and projectB are lying in root/node_modules/projectA and root/node_modules/projectB respectively. Thus, flag skipLibCheck should exclude them from type-check stage, shouldn't it?
The issue is that packageA and packageB have their path aliases and typescript throws an error that modules cannot be found for these paths aliases. And typescript states that e.g. 'cannot find module @projectA/utils in node_modules/projectA/index.ts' for all the files with path aliases.

There are next questions:

  1. Why typescript looks in node_modules even if I supplied skipLibCheck
  2. Why typescript looks in node_modules even when node_modules is set in exclude
  3. Even if it looks here, why it is unable to parse path aliases, despite they are set in config and should be working?
  4. Am I completely nuts and did everything wrong or do not see some obvious things?

What have I tried:

  • Setting unique path aliases for each project (eg. "projectA:@assets/": ["./assets/"] | "projectB:@utils/": ["./utils/"]) in root tsconfig and own tsconfigs.
  • Adding project references (with composite: true, declaration: true, emitDeclarationOnly: true (I do not need js output))

Non of this worked and I beg you guys for the help with the solution of the problem, since it blocks us from having a proper type handling on the project.

Fun fact is that VSCode handles all the types correctly and produces no type errors, while TSC does.

UPD:
Since --skipLibCheck only disables reading of .d.ts files, is it any way to exclude .ts files to be parsed?

@nterraza
Copy link

I am also having this issue with lerna. All instructions given to the tsconfig.json are ignored. Is there any way at least to diagnose which library is overwriting the explicit instruction I am giving ?

The way I understand the purpose of tsconfig is that it overwrites the parent tsconfig. But other libraries installed apparently can also overwrite it ?

It feels like I have no control typescript config, rather other dependencies do. Is this something particular of lerna forcefully overwriting ?

@foloinfo
Copy link

foloinfo commented Jun 1, 2023

It happens to me with wagmi (nextjs 13.x config) and I've already set "skipLibCheck": true and it didn't help.
wagmi-dev/wagmi#344

I don't know why, but I just upgraded typescript to 5.0.4 and now the error is gone.
Now I only need "skipLibCheck": true (I didn't need "exclude": ["node_modules"]) and it works fine.

It might be worth trying to upgrade the ts version if you can.

Added: I needed to set "include": ["**/*.ts", "**/*.tsx", "types.d.ts"] for my expo project, and "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "types.d.ts"], for nextjs project.

@sesh92
Copy link

sesh92 commented Sep 22, 2023

I guess I got stuck with the same problem:

monorepo:

  • packages/app/tsconfig.json
    "noUnusedLocals": true,
    "noUnusedParameters": true,
  • packages/some-typegen-package/tsconfig.json
    "noUnusedLocals": false,
    "noUnusedParameters": false,

error TS6196: '<variable>' is declared but never used.

cli tsc --noEmit in app is ignoring tsconfig in some-package
but after adding to app/tsconfig.json

"references": [
    {
      "path": "../some-typegen-package"
    }
  ]

the problem was solved

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Question An issue which isn't directly actionable in code
Projects
None yet
Development

No branches or pull requests