rollup-plugin-typescript2 icon indicating copy to clipboard operation
rollup-plugin-typescript2 copied to clipboard

Cannot build when `composite: true` in tsconfig.json

Open hassankhan opened this issue 6 years ago • 8 comments

What happens and why it is wrong

This bug is occurring in a monorepo project managed with Yarn Workspaces. I've recently upgraded it to TypeScript 3 and was looking to take advantage of Project References. To do this, I set composite: true under compilerOptions in tsconfig.json for each subpackage. If I set it to false, then everything works fine.

Interestingly, builds using tsc work fine, only when using Rollup does this issue occur.

Environment

  • macOS: 10.13.6
  • node: 8.11.1
  • typescript: 3.0.1

Versions

  • typescript: 3.0.1
  • rollup: 0.65.0
  • rollup-plugin-typescript2: 0.17.0

rollup.config.js

I use a script to generate a Rollup configuration, the results of which are below:

Generated Rollup Config
{
  "external": [],
  "plugins": [
    {
      "name": "json"
    },
    {
      "name": "rpt2"
    },
    {
      "name": "commonjs"
    },
    {
      "name": "node-resolve"
    },
    {
      "name": "sourcemaps"
    }
  ],
  "watch": {
    "include": "src/**"
  },
  "input": "src/index.ts",
  "output": [
    {
      "file": "dist/lambda.umd.js",
      "name": "lambda",
      "format": "umd",
      "sourcemap": true
    },
    {
      "file": "dist/lambda.es5.js",
      "format": "es",
      "sourcemap": true
    }
  ]
}

tsconfig.json

Root
{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "baseUrl": "./packages",
    "composite": true,
    "declaration": true,
    "emitDecoratorMetadata": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "forceConsistentCasingInFileNames": true,
    "importHelpers": true,
    "lib": [
      "es2015",
      "es2016",
      "es2017",
      "esnext.asynciterable"
    ],
    "module":"commonjs",
    "moduleResolution": "node",
    "paths": {
      "@serverlize/*": ["./*/src"]
    },
    "sourceMap": true,
    "strict": true,
    "target": "es2015",
    "typeRoots": [
      "node_modules/@types",
      "../../node_modules/@types"
    ]
  },
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}
Project
{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "declarationDir": "dist/types",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "outDir": "dist/lib"
  },
  "include": [
    "src"
  ],
  "references": [
    { "path": "../cdk" },
    { "path": "../support" }
  ]
}

package.json

plugin output with verbosity 3

Output
$ rollup -c

src/index.ts → dist/lambda.umd.js, dist/lambda.es5.js...
rpt2: typescript version: 3.0.1
rpt2: tslib version: 1.9.3
rpt2: rollup-plugin-typescript2 version: 0.17.0
rpt2: plugin options:
{
    "useTsconfigDeclarationDir": true,
    "verbosity": 3,
    "check": true,
    "clean": false,
    "cacheRoot": "/[PROJECT_ROOT]/packages/lambda/.rpt2_cache",
    "include": [
        "*.ts+(|x)",
        "**/*.ts+(|x)"
    ],
    "exclude": [
        "*.d.ts",
        "**/*.d.ts"
    ],
    "abortOnError": true,
    "rollupCommonJSResolveHack": false,
    "typescript": "version 3.0.1",
    "tsconfigOverride": {},
    "transformers": [],
    "tsconfigDefaults": {},
    "objectHashIgnoreUnknownHack": false
}
rpt2: rollup config:
{
    "experimentalCacheExpiry": 10,
    "external": [
        "",
        ""
    ],
    "inlineDynamicImports": false,
    "input": "src/index.ts",
    "chunkGroupingSize": 5000,
    "perf": false,
    "plugins": [
        {
            "name": "json"
        },
        {
            "name": "rpt2"
        },
        {
            "name": "commonjs"
        },
        {
            "name": "node-resolve"
        },
        {
            "name": "sourcemaps"
        }
    ],
    "watch": {
        "include": "src/**"
    },
    "entry": "src/index.ts"
}
rpt2: built-in options overrides: {
    "noEmitHelpers": false,
    "importHelpers": true,
    "noResolve": false,
    "noEmit": false,
    "inlineSourceMap": false,
    "outDir": "/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder",
    "moduleResolution": 2,
    "declarationDir": null,
    "sourceRoot": null
}
rpt2: parsed tsconfig: {
    "options": {
        "allowSyntheticDefaultImports": true,
        "baseUrl": "/[PROJECT_ROOT]/packages",
        "composite": true,
        "declaration": true,
        "emitDecoratorMetadata": true,
        "esModuleInterop": true,
        "experimentalDecorators": true,
        "forceConsistentCasingInFileNames": true,
        "importHelpers": true,
        "lib": [
            "lib.es2015.d.ts",
            "lib.es2016.d.ts",
            "lib.es2017.d.ts",
            "lib.esnext.asynciterable.d.ts"
        ],
        "module": 5,
        "moduleResolution": 2,
        "paths": {
            "@serverlize/*": [
                "./*/src"
            ]
        },
        "sourceMap": true,
        "strict": true,
        "target": 2,
        "typeRoots": [
            "/[PROJECT_ROOT]/node_modules/@types",
            "/Users/hassankhan/Projects/endemolshine/open-source/node_modules/@types"
        ],
        "declarationDir": null,
        "outDir": "/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder",
        "configFilePath": "/[PROJECT_ROOT]/packages/lambda/tsconfig.json",
        "noEmitHelpers": false,
        "noResolve": false,
        "noEmit": false,
        "inlineSourceMap": false,
        "sourceRoot": null
    },
    "fileNames": [
        "/[PROJECT_ROOT]/packages/lambda/src/enhance.ts",
        "/[PROJECT_ROOT]/packages/lambda/src/index.ts",
        "/[PROJECT_ROOT]/packages/lambda/src/types.ts",
        "/[PROJECT_ROOT]/packages/lambda/src/Annotations/Function.ts"
    ],
    "projectReferences": [
        {
            "path": "/[PROJECT_ROOT]/packages/cdk",
            "originalPath": "../cdk"
        },
        {
            "path": "/[PROJECT_ROOT]/packages/support",
            "originalPath": "../support"
        }
    ],
    "typeAcquisition": {
        "enable": false,
        "include": [],
        "exclude": []
    },
    "raw": {
        "compilerOptions": {
            "module": "ES2015",
            "declarationDir": "dist/types",
            "emitDecoratorMetadata": true,
            "experimentalDecorators": true,
            "outDir": "dist/lib"
        },
        "extends": "../../tsconfig.json",
        "include": [
            "src"
        ],
        "references": [
            {
                "path": "../cdk"
            },
            {
                "path": "../support"
            }
        ],
        "compileOnSave": false,
        "exclude": [
            "../../node_modules",
            "../../**/*.spec.ts"
        ]
    },
    "errors": [],
    "wildcardDirectories": {
        "/[PROJECT_ROOT]/packages/lambda/src": 1
    },
    "compileOnSave": false,
    "configFileSpecs": {
        "includeSpecs": [
            "src"
        ],
        "excludeSpecs": [
            "../../node_modules",
            "../../**/*.spec.ts"
        ],
        "validatedIncludeSpecs": [
            "src"
        ],
        "validatedExcludeSpecs": [
            "../../node_modules",
            "../../**/*.spec.ts"
        ],
        "wildcardDirectories": {
            "/[PROJECT_ROOT]/packages/lambda/src": 1
        }
    }
}
rpt2: included:
'[
    "*.ts+(|x)",
    "**/*.ts+(|x)"
]'
rpt2: excluded:
'[
    "*.d.ts",
    "**/*.d.ts"
]'
rpt2: options error TS6059 File '/[PROJECT_ROOT]/packages/cdk/src/index.ts' is not under 'rootDir' '/[PROJECT_ROOT]/packages/lambda'. 'rootDir' is expected to contain all source files.
rpt2: options error TS6307 File '/[PROJECT_ROOT]/packages/cdk/src/index.ts' is not in project file list. Projects must list all files or use an 'include' pattern.
rpt2: Ambient types:
rpt2:     /[PROJECT_ROOT]/node_modules/@types/aws-lambda/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/cosmiconfig/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/estree/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/events/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/execa/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/fs-extra/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/glob/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/handlebars/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/highlight.js/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/jest/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/lodash/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/lodash.find/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/lodash.get/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/lodash.has/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/lodash.isarray/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/lodash.pick/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/marked/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/minimatch/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/node/index.d.ts
rpt2:     /[PROJECT_ROOT]/node_modules/@types/shelljs/index.d.ts
rpt2: transpiling '/[PROJECT_ROOT]/packages/lambda/src/index.ts'
rpt2:     cache: '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/rpt2_b33a1f7fab3e88a4c8f2f4b6aebb7d3309529ba6/code/cache/2f121cf4034321b46ef658bd341dd2c4f6c96d1f'
rpt2:     cache hit
rpt2:     cache: '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/rpt2_b33a1f7fab3e88a4c8f2f4b6aebb7d3309529ba6/syntacticDiagnostics/cache/2f121cf4034321b46ef658bd341dd2c4f6c96d1f'
rpt2:     cache hit
rpt2:     cache: '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/rpt2_b33a1f7fab3e88a4c8f2f4b6aebb7d3309529ba6/semanticDiagnostics/cache/2f121cf4034321b46ef658bd341dd2c4f6c96d1f'
rpt2:     cache hit
rpt2: generated declarations for '/[PROJECT_ROOT]/packages/lambda/src/index.ts'
rpt2: dependency '/[PROJECT_ROOT]/packages/lambda/src/enhance.ts'
rpt2:     imported by '/[PROJECT_ROOT]/packages/lambda/src/index.ts'
rpt2: resolving './enhance'
rpt2:     to '/[PROJECT_ROOT]/packages/lambda/src/enhance.ts'
rpt2: transpiling '/[PROJECT_ROOT]/packages/lambda/src/enhance.ts'
rpt2:     cache: '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/rpt2_b33a1f7fab3e88a4c8f2f4b6aebb7d3309529ba6/code/cache/d250d6bf85931e257b7af5ef161fc4f4384a5df9'
rpt2:     cache hit
rpt2:     cache: '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/rpt2_b33a1f7fab3e88a4c8f2f4b6aebb7d3309529ba6/syntacticDiagnostics/cache/d250d6bf85931e257b7af5ef161fc4f4384a5df9'
rpt2:     cache hit
rpt2:     cache: '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/rpt2_b33a1f7fab3e88a4c8f2f4b6aebb7d3309529ba6/semanticDiagnostics/cache/d250d6bf85931e257b7af5ef161fc4f4384a5df9'
rpt2:     cache hit
rpt2: generated declarations for '/[PROJECT_ROOT]/packages/lambda/src/enhance.ts'
rpt2: resolving './isPromise'
rpt2:     to '/[PROJECT_ROOT]/node_modules/@middy/core/isPromise.js'
rpt2: resolving 'once'
rpt2:     to '/[PROJECT_ROOT]/node_modules/once/once.js'
rpt2: resolving './isPromise'
rpt2:     to '/[PROJECT_ROOT]/node_modules/@middy/core/isPromise.js'
rpt2: resolving 'once'
rpt2:     to '/[PROJECT_ROOT]/node_modules/once/once.js'
rpt2: resolving 'wrappy'
rpt2:     to '/[PROJECT_ROOT]/node_modules/wrappy/wrappy.js'
rpt2: resolving 'wrappy'
rpt2:     to '/[PROJECT_ROOT]/node_modules/wrappy/wrappy.js'
rpt2: resolving '/[PROJECT_ROOT]/node_modules/@middy/core/isPromise.js'
rpt2:     to '/[PROJECT_ROOT]/node_modules/@middy/core/isPromise.js'
rpt2: resolving '/[PROJECT_ROOT]/node_modules/once/once.js'
rpt2:     to '/[PROJECT_ROOT]/node_modules/once/once.js'
rpt2: resolving '/[PROJECT_ROOT]/node_modules/wrappy/wrappy.js'
rpt2:     to '/[PROJECT_ROOT]/node_modules/wrappy/wrappy.js'
rpt2: generating target 1
rpt2: rolling caches
rpt2: generating target 2
rpt2: rolling caches
rpt2: generating missed declarations for '/[PROJECT_ROOT]/packages/lambda/src/types.ts'
rpt2: generating missed declarations for '/[PROJECT_ROOT]/packages/lambda/src/Annotations/Function.ts'
rpt2: writing declarations for '/[PROJECT_ROOT]/packages/lambda/src/index.ts' to '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder/src/index.d.ts'
rpt2: writing declarations for '/[PROJECT_ROOT]/packages/lambda/src/enhance.ts' to '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder/src/enhance.d.ts'
rpt2: writing declarations for '/[PROJECT_ROOT]/packages/lambda/src/types.ts' to '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder/src/types.d.ts'
rpt2: writing declarations for '/[PROJECT_ROOT]/packages/lambda/src/Annotations/Function.ts' to '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder/src/Annotations/Function.d.ts'
rpt2: writing declarations for '/[PROJECT_ROOT]/packages/lambda/src/index.ts' to '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder/src/index.d.ts'
rpt2: writing declarations for '/[PROJECT_ROOT]/packages/lambda/src/enhance.ts' to '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder/src/enhance.d.ts'
rpt2: writing declarations for '/[PROJECT_ROOT]/packages/lambda/src/types.ts' to '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder/src/types.d.ts'
rpt2: writing declarations for '/[PROJECT_ROOT]/packages/lambda/src/Annotations/Function.ts' to '/[PROJECT_ROOT]/packages/lambda/.rpt2_cache/placeholder/src/Annotations/Function.d.ts'
created dist/lambda.umd.js, dist/lambda.es5.js in 1.4s

Similar issues

  • https://github.com/TypeStrong/typedoc/issues/851
  • https://github.com/palantir/tslint/issues/4148

hassankhan avatar Sep 02 '18 18:09 hassankhan

A minimal repo with reproduction will help a lot. @hassankhan

ezolenko avatar Sep 10 '18 17:09 ezolenko

This might be fixed in master now

ezolenko avatar Feb 26 '19 00:02 ezolenko

This happens when using composite: true AND using paths in tsconfig with glob pattern matching.

atifsyedali avatar Oct 09 '19 14:10 atifsyedali

I gave up trying to figure this out. I have a monorepo with a root tsconfig that has paths configured for each sub project, so I can import the project with out a bunch of "../../../". Then, each subproject extends the root tsconfig and has its "references": [] populated to the subprojects they depend on. Running tsc on its own works as expected. When running through Rollup using the same tsconfig, I receive a typescript error that is the same error as if I forgot to add a project to the "references" property.

For example, if I delete a dependency from my references, then I get the error "../../../file.ts is not inside root dir". This error always reminds me to add the project to the "references" of my tsconfig. However, when I run through Rollup, it is as if ALL of references are not passed to the TS compiler.

The typescript API requires you to pass the references explicitly. I'm guessing that is the issue here

TomzBench avatar Mar 05 '21 18:03 TomzBench

@TomzBench I have the exact same issue on my monorepo now.

Domino9697 avatar Apr 22 '21 20:04 Domino9697

@TomzBench @ezolenko I made a simple repo to reproduce the issue here: https://github.com/Domino9697/rollup-ts-issue-repro

@atifsyedali and @TomzBench summed it up pretty much. Whenever we want to use references along with paths in the tsconfig files, the plugin outputs an error as if the reference was not set anymore.

Domino9697 avatar Apr 22 '21 21:04 Domino9697

+1 I got the same issue, removing "composite": true solving the problem but, it might rise another problem for others

fatihaziz avatar Apr 20 '22 06:04 fatihaziz

So it seems like per the repro above (thank you!), references seems to work fine without paths, as far as I can tell. This plugin does have some specific code around references (c.f. #139 etc)

Since paths are not treated as "true" aliases by the underlying TS API itself, they cause a lot of confusion in the ecosystem and community (c.f. #201 ), so removing them can often solve a variety of issues. Per that issue, could also try a custom transformer to get paths to work differently from the TS API; that may or may not work to get references and paths working together.

If references indeed work without paths (I have not tested thoroughly and don't typically use references myself), then this issue can be closed as duplicative of the two issues I linked above

agilgur5 avatar May 08 '22 04:05 agilgur5

OMG, so much work to get this to work. Going through the thread here shows that it's not working out of the box. Removing the "paths" starts working indeed.

You can make it pass by doing this:

typescript({
  tsconfig: "tsconfig.lib.json",

  // https://github.com/ezolenko/rollup-plugin-typescript2/issues/112
  tsconfigOverride: {
    compilerOptions: { paths: {} },
  },
}),

jsgoupil avatar Sep 28 '23 19:09 jsgoupil

Yes, as I mentioned above, paths are not "true" aliases by the TS compiler. That's not rpt2's behavior, that's TS behavior. Per above, see #201 for more details, links to upstream TS issues, and workarounds for that limitation, such as custom transformers.

Sounds like references works without paths though, so this feature is working. Thanks for confirming that! Closing as duplicate of #201 and #139.

agilgur5 avatar Sep 28 '23 20:09 agilgur5

@agilgur5 sorry that is a lot of lingos that I'm not familiar. Do you have a better fix than my workaround I just posted? Should this work out of the box?

jsgoupil avatar Sep 28 '23 21:09 jsgoupil

paths do not and cannot work out of the box, as TS did not design them to be aliases (they are the inverse, basically).

references do work, as you confirmed.

If you want to use paths, #201 has several workarounds, the main one of which custom transformers (@rollup/plugin-alias works too I believe -- that issue has it all).

agilgur5 avatar Sep 29 '23 00:09 agilgur5

Thanks for the info. May propose to get a warning about the usage of paths, because right now it doesn't point to that direction at all, but only saying it's having trouble with the rootDir.

jsgoupil avatar Sep 29 '23 00:09 jsgoupil

Hmmmm that's a good suggestion as paths are unfortunately very commonly misunderstood, but I'm not sure if we can know for sure that it's not being used correctly 💭 (e.g. if you're using it together with plugin-alias)

We could have a manual flag to turn off that warning I suppose, for when someone knows they're using it correctly. @jsgoupil could you file a separate issue for that so we can track it properly?

agilgur5 avatar Sep 29 '23 01:09 agilgur5

I'm not super proficient in this space, I think it would be better if you create it. I literally inherited a project and used rollup for the first time today. I'm still learning around this.

If I may suggest, maybe a well known variable, when you detect a paths in the configuration you display the warning that's silenceable either by the user, or a plug-in could come in and silence that warning as well?

The paths + references seems to be the way to do monorepos.

jsgoupil avatar Sep 29 '23 03:09 jsgoupil