David Sykes
David Sykes

Reputation: 7269

How can I specify multiple source folders in my tsconfig.json?

I currently have the following project structure:

project/
  tsconfig.json
  webpack.config.js
  package.json
  node_modules/
    ...lots of dependencies
  typings/
    ...lots of .d.ts files for the dependencies
  src/
    ...folders for files for my projects

My tsonfig.json looks like:

{
"compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "noImplicitAny": false,
    "outDir": "./js",
    "rootDir": "./src",
    "sourceMap": true,
    "jsx": "react"
},
"exclude": [
    "typings/main.d.ts",
    "typings/main",
    "node_modules"
    ]
}

This all works very well and I can happily develop my application and run it in a browser.

I would now like to add some unit tests to my project and coming from a Java background my initial instinct is to place the tests in a separate folder:

project/
  test/
    ...all of my test cases

Of course, the files in the test/ folder need to reference the code in my src/ folder. How do I set that up?

Or is it "better" to place the tests inline in the src/ folder and have a separate webpack.config.js file for them?

Really confused about how this works in practice in larger TypeScript projects.

Note: I have seen this but found the answer less than illuminating. It seems that the referenced feature discussion about filesGlob would help me, but I just wonder how people are doing this today?

Upvotes: 19

Views: 14434

Answers (3)

Hongbo Miao
Hongbo Miao

Reputation: 49804

Now other than rootDir, you can use rootDirs

"rootDirs": ["./scripts", "./src"],

for multiple folders.

Here is the API doc: https://www.typescriptlang.org/docs/handbook/module-resolution.html#virtual-directories-with-rootdirs

Upvotes: 19

lex82
lex82

Reputation: 11317

I think you are looking for path mapping. With the paths compiler option, you can specify not only a mapping to a single location but to several. This is the example from the documentation:

"compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "*": [
        "*",
        "generated/*"
      ]
    }
}

If the compiler does not find a module in the expected location, it repeats module resolution in the "generated" subfolder. The baseUrl setting seems redundant but it is mandatory.

Upvotes: 5

basarat
basarat

Reputation: 275867

Or is it "better" to place the tests inline in the src/ folder and have a separate webpack.config.js file for them?

That is what I do. Do not use the TypeScript compiler as a module bundler (Especially if you are not using modules https://github.com/TypeStrong/atom-typescript/blob/master/docs/out.md). Just let it do the compile and bundle for browser using webpack and use as it is (if using module commonjs) for backend (nodejs).

Upvotes: 1

Related Questions