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

Cannot use composite tsconfig.json setting #7147

Open
osdiab opened this issue Jun 1, 2019 · 36 comments · May be fixed by #12983
Open

Cannot use composite tsconfig.json setting #7147

osdiab opened this issue Jun 1, 2019 · 36 comments · May be fixed by #12983

Comments

@osdiab
Copy link

osdiab commented Jun 1, 2019

Is this a bug report?

Yes

Did you try recovering your dependencies?

Yes

Which terms did you search for in User Guide?

typescript composite isolatedModules

Environment

  System:    OS: macOS 10.14.2
    CPU: (4) x64 Intel(R) Core(TM) i5-8210Y CPU @ 1.60GHz
  Binaries:
    Node: 11.4.0 - ~/.nvm/versions/node/v11.4.0/bin/node
    Yarn: 1.16.0 - /usr/local/bin/yarn
    npm: 6.4.1 - ~/.nvm/versions/node/v11.4.0/bin/npm
  Browsers:
    Chrome: Not Found
    Firefox: Not Found
    Safari: Not Found
  npmPackages:
    react: Not Found
    react-dom: Not Found
    react-scripts: Not Found
  npmGlobalPackages:
    create-react-app: Not Found

Steps to Reproduce

  1. Run yarn create react-app my-app --typescript
  2. add composite: true to tsconfig.json
  3. run yarn start, get Option 'composite' cannot be specified with option 'isolatedModules'. TS5053
  4. Remove isolatedModules line from tsconfig
  5. run yarn start, create-react-app re-adds isolatedModules and you get the same error

Expected Behavior

I could use the composite flag

Actual Behavior

I can't use the composite flag

Reproducible Demo

Above steps will reproduce this, pretty trivial.

This is potentially equally as much a typescript issue, though this is not really big to me—i just want to be able to build all my packages in my monorepo in one command, rather than having a separate invocation of tsc --build for my website package. But thought I'd log the issue here.

@bfricka
Copy link

bfricka commented Jun 28, 2019

This is not a bug report, it's a feature request. Using CRA + TS for anything but the most basic project setup is not supported currently. For composite projects in particular, there really isn't much support in Webpack at all ATM (@ts-tools/webpack-loader, ts-loader, awesome-typescript-loader, etc.). It's a complicated feature and no one has done the work to properly integrate it yet. So unless you're using tsc, you're out of luck.

Some other loaders can handle more complicated setups. E.g. @ts-tools/webpack-loader can do monorepos, but it has it's own drawbacks that make it problematic (e.g. doesn't play nice w/ downstream loaders).

It's all a bit of a clustf*ck at this point and I'm hoping the TS build landscape looks a bit better in the next year.

@osdiab
Copy link
Author

osdiab commented Jul 1, 2019

I'm finding in my CRA project that uses tsc -b to reference other shared modules, that it seems to be incorporated into the CRA build just fine - I'll try to make a simple repo that demonstrates it, but both my development server and output production app seem to work fully with project references in a Yarn monorepo. Though maybe I'm missing the incompatibility you're speaking of.

Though yes, I agree that it's a pretty hairy system at the moment.

@bfricka
Copy link

bfricka commented Jul 1, 2019

@osdiab The monorepo issue occurs with nested linked imports:

Say you have monorepo, with modules a, b, c

a imports b and/or c works fine.
a imports b imports c, does not work (cannot find module c). Even though, a can import c, if b imports c, the module resolution doesn't know how to handle it.

ts-tools/webpack-loader handles this by parsing multiple config files as required.

I'm still trying to find a way to make this work w/ CRA that isn't nasty. E.g. I've setup a sample monorepo that demonstrates the issue. The current roadblock is that babel-loader rule limits include to appSrc. If you instead try to pass an array, you'll get errors from modules.js, which does a dumb parse of tsconfig.json / jsconfig.json, and tells you that you cannot set your baseUrl to something outside src.

To get to this point I use typescript to parse the config file properly (ts.readJsonConfigFile, ts.parseJsonSourceFileConfigFileContent), which then derives the baseUrl properly from the project root (b/c this parsing actually handles "extends", instead of just JSON.parse and pulling out compilerOptions).

I've had to move on to other stuff for a bit, but I'll come back to this to figure out why this is the case and if I can work around it.

@stale
Copy link

stale bot commented Jul 31, 2019

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Jul 31, 2019
@tommedema
Copy link

This is still an issue and should not be closed

@stale stale bot removed the stale label Jul 31, 2019
@matyasfodor
Copy link

I am also looking for a solution to this issue. Current workaround: npm link the shared lib. Drawback: you need to manually compile the lib every time the code changes.

@stale
Copy link

stale bot commented Sep 13, 2019

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Sep 13, 2019
@tommedema
Copy link

This is still an issue and should not be closed

@stale stale bot removed the stale label Sep 14, 2019
@stale
Copy link

stale bot commented Oct 14, 2019

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Oct 14, 2019
@matyasfodor
Copy link

This is still an issue, and would really like if this could be solved 🙏 !

@stale stale bot removed the stale label Oct 14, 2019
@stale
Copy link

stale bot commented Nov 13, 2019

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Nov 13, 2019
@ArashMotamedi
Copy link

Shouldn't be closed.

@stale stale bot removed the stale label Nov 13, 2019
@stale
Copy link

stale bot commented Dec 13, 2019

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Dec 13, 2019
@matyasfodor
Copy link

The issue still persist, it would be really nice to have the feature!

@stale stale bot removed the stale label Dec 16, 2019
@stale
Copy link

stale bot commented Jan 15, 2020

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Jan 15, 2020
@Toub
Copy link

Toub commented Jan 15, 2020

This is not a bug report, it's a feature request. Using CRA + TS for anything but the most basic project setup is not supported currently.

Any chance to enjoy a better CRA typescript support in the near future?

@stale stale bot removed the stale label Jan 15, 2020
@stale
Copy link

stale bot commented Feb 14, 2020

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Feb 14, 2020
@osdiab
Copy link
Author

osdiab commented Apr 17, 2020

ding dong

@stale stale bot removed the stale label Apr 17, 2020
@stale
Copy link

stale bot commented May 17, 2020

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label May 17, 2020
@tommedema
Copy link

tommedema commented May 17, 2020 via email

@stale stale bot removed the stale label May 17, 2020
@stale
Copy link

stale bot commented Jun 17, 2020

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Jun 17, 2020
@osdiab
Copy link
Author

osdiab commented Jun 17, 2020

still a problem

@stale stale bot removed the stale label Jun 17, 2020
@stale
Copy link

stale bot commented Jul 18, 2020

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Jul 18, 2020
@osdiab
Copy link
Author

osdiab commented Jul 18, 2020 via email

@stale stale bot removed the stale label Jul 18, 2020
@tommedema
Copy link

What would it take to get someone assigned to this?

@stale
Copy link

stale bot commented Aug 22, 2020

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Aug 22, 2020
@osdiab
Copy link
Author

osdiab commented Aug 23, 2020 via email

@stale stale bot removed the stale label Aug 23, 2020
@stale
Copy link

stale bot commented Oct 4, 2020

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Oct 4, 2020
@osdiab
Copy link
Author

osdiab commented Oct 5, 2020 via email

@stale stale bot removed the stale label Oct 5, 2020
@stale
Copy link

stale bot commented Dec 25, 2020

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

@stale stale bot added the stale label Dec 25, 2020
@osdiab
Copy link
Author

osdiab commented Dec 26, 2020 via email

@stale stale bot removed the stale label Dec 26, 2020
@gumT3KBZ9zMY7kzv
Copy link

gumT3KBZ9zMY7kzv commented Jul 22, 2022

UPDATE: this might now be an answer since the issue author mentioned a "one command" rather than "tsc --build", but nonetheless for some it might be helpful

this is what worked for me

DISCLAIMER:
the following is specific for Windows, if you are on Linux make appropriate adjustments

So basically the idea is that you need to compile your composite project and have its output saved in your out-dir folder before you run create-react build

├───bin
│   ├───basics
│   ├───components
│   └───data
├───src
│   ├───basics
│   │   └───tsconfig.json
│   ├───components
│   │   └───tsconfig.json
│   ├───data
│   │   └───tsconfig.json
│   └───tsconfig-base.json
├───package.json
└───tsconfig.json

So you need to modify the build script in package.json

before:

  "scripts": {
    "start": "react-scripts start ",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

after:

  "scripts": {
    "start": "react-scripts start ",
    "build": "node ./node_modules/typescript/bin/tsc --build ./tsconfig.json && react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

so what it does it pre-builds your composite project and spits out the results to a local folder (which is bin in my case, set as outDir in all tsconfig.json files involved)

then when create-react compiles the same project the files are already in the bin folder and it doesn't complaint anymore even though it uses --project instead of --build argument

below is the exact configuration

// src/basics/tsconfig.json 
{
    "extends": "../tsconfig-base.json",
    "compilerOptions": {
        "composite": true,
        "outDir": "../../bin/basics"
    },
    "include": [
        "./**/*.ts",
        "./**/*.tsx"
    ]
}
// src/components/tsconfig.json
{
    "extends": "../tsconfig-base.json",
    "compilerOptions": {
        "composite": true,
        "outDir": "../../bin/components"
    },
    "include": [
        "./**/*.ts",
        "./**/*.tsx"
    ],
    "references": [
        {
            "path": "../basics/tsconfig.json"
        },
        {
            "path": "../data/tsconfig.json"
        }
    ]
}
// src/data/tsconfig.json 
{
    "extends": "../tsconfig-base.json",
    "compilerOptions": {
        "composite": true,
        "outDir": "../../bin/data"
    },
    "include": [
        "./**/*.ts",
        "./**/*.tsx"
    ],
    "references": [
        {
            "path": "../basics/tsconfig.json"
        }
    ]
}
// src/tsconfig-base.json 
{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "noImplicitAny": false,
    "strictNullChecks": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "react-jsx"
  }
}
// tsconfig.json
{
    "extends": "./src/tsconfig-base.json",
    "include": [
        "./src/*.ts",
        "./src/*.tsx"
    ],
    "compilerOptions": {
        "noEmit": true
    },
    "references": [
        {
            "path": "./src/basics/tsconfig.json"
        },
        {
            "path": "./src/data/tsconfig.json"
        },
        {
            "path": "./src/components/tsconfig.json"
        }
    ]
}

demurgos added a commit to demurgos/create-react-app that referenced this issue Jan 21, 2023
TypeScript 3.0 introduced project references / composite projects. This allows to split a TypeScript build into sub-projects, while automatically keeping track of dependencies.

Currently `react-scripts` uses the legacy build TypeScript build mode without composite project support. Composite projects are supported for a long time by `fork-ts-checker-webpack-plugin` but wasn't enabled in the Webpack. This commit enables the `build` flag for TypeScript Webpack config, and fixes support for composite projects.

Closes facebook#7147
@demurgos demurgos linked a pull request Jan 21, 2023 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

7 participants