microsoft / microsoft/TypeScript

[Bug] Projects have different output directory structure with same configuration.

Open
#40,400 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Needs Investigation
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

TypeScript Version: 4.0 (npm)

Search Terms:
declarationDir, rootDir, baseURL.

Problem
My app has a circular reference between the client and the server for typing reasons, essentially during prototyping there is a proxy that allows the server and the client to call functions on the remote as though they were local asynchronous functions. This has traditionally worked fine (well, with effort) but lately my server tsconfig seems to want to output files in a different directory structure than it was previously, without warning (I didn't change the tsconfig file). Here's what's happening:

Expected behavior:
The folder structure should look like this:

Project:
    Client/
        tsconfig.json <--"Client tsconfig"
        code.ts
        code.js
    ClientDeclarations/
        code.d.ts
    Common/
        code.ts
        code.d.ts
        code.js
    Server/
        tsconfig.json <-- "Server tsconfig"
        code.ts
        code.js
    ServerDeclarations/
        code.d.ts <-- ! Note server files are meant to be at the root of the output dir
    tsconfig.json <-- "Parent tsconfig"

Actual behavior:
Instead it looks like this:

Project:
    Client/
        tsconfig.json <--"Client tsconfig"
        code.ts
        code.js
    ClientDeclarations/
        code.d.ts
    Common/
        code.ts
        code.d.ts
        code.js
    Server/
        tsconfig.json <-- "Server tsconfig"
        code.ts
        code.js
    ServerDeclarations/
        Client/
             code.d.ts <-- ! This is the client's .d.ts files which shouldn't be output by the server tsproj!
        Server/
             code.d.ts
    tsconfig.json <-- "Parent tsconfig"

Code
This is the "Parent tsconfig" (note I am using ttypescript):

{
  "compileOnSave": false,
  "compilerOptions": {
    "target": "es6",
    "sourceMap": true,
    "strict": true,
    "plugins": [
      { "transform": "../Typescript/SuperTransform.js" },
      { "transform": "../Typescript/Macros.js" }
    ]
  },
  "exclude": [
    "node_modules"
  ]
}

This is the client config (I don't think the references section is used on the client, it's just there to keep the client and server configs similar):

{
  "compileOnSave": false,
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "module": "amd",
    "target": "es6",
    "lib": [ "es6", "dom" ],
    "sourceMap": true,
    "strict": true,
    "build": true,
    "declaration": true,
    "declarationDir": "../ClientDeclarations",
    "baseUrl": "./",
    "paths": {
      "@Common/*": [ "../Common/*" ],
      "@Server/*": [ "../ServerDeclarations/*" ],
      "@Client/*": [ "./*" ]
    }
  },
  "include": [
    "./*",
    "./External/koco.ts",
    "./External/kocss.ts",
    "./External/kopath.ts"
  ],
  "exclude": [
    "node_modules"
  ],
  "references": [
    { "path": "../Common" }
  ]
}

This is the server config (on the server I'm using module-alias):

{
  "compileOnSave": false,
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "lib": [ "es6", "dom" ],
    "sourceMap": true,
    "strict": true,
    "build": true,
    "declaration": true,
    "declarationDir": "../ServerDeclarations",
    "baseUrl": "./",
    "paths": {
      "@Common/*": [ "../Common/*" ],
      "@Client/*": [ "../ClientDeclarations/*" ],
      "@Server/*": [ "./*" ]
    }
  },
  "include": [
    "./*"
  ],
  "exclude": [
    "node_modules",
  ],
  "references": [
    { "path": "../Common" }
  ]
}

Note that the only difference between the client and the server is that they have a different module output type and the client includes a few more files.

I've tried adding "../Client" and "../Client/**" to the list of excludes on the server tsconfig but that didn't do anything. I also tried adding rootDir to be the same as baseUrl but that also didn't do anything. Interestingly removing baseUrl and adding rootDir had the desired effect (although is not usable because I need to use paths).

Playground link
This issue cannot be reproduced on the playground.

Related Issues:
I could not find any related issues.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the parent, client, and server tsconfig.json examples in the issue, focusing on declarationDir, baseUrl, rootDir, paths, and project references. Reproduce the TypeScript 4.0 output directory layout and compare it with the expected structure. Done means explaining or correcting why the server emits Client declarations and nests files, with coverage for the reported configuration.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.