microsoft / microsoft/TypeScript

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

Ouverte
#40,400 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Needs Investigation
Langage dominant
Go
Étoiles
111k
Forks
14.4k
Merge moyen
1 j 19 h
PR mergées (30 j)
117

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.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par les exemples de tsconfig.json parent, client et server présentés dans l’issue, en vous concentrant sur declarationDir, baseUrl, rootDir, paths et project references. Reproduisez la structure du répertoire de sortie de TypeScript 4.0 et comparez-la à la structure attendue. Le travail est terminé lorsque vous expliquez ou corrigez pourquoi le serveur émet des déclarations Client et imbrique les fichiers, avec une couverture de la configuration signalée.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
compilers
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.