You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Building composite project with resolveJsonModule fails #25636
With composite: true and resolveJsonModule: true set in tsconfig.json, JSON modules are resolved in the compilation like they are when the composite compiler option is not set.
Actual behavior:
Running tsc gives the following error:
error TS6307: File '/src/hello.json' is not in project file list. Projects must list all files or use an 'include' pattern.
In addition, trying to include src/hello.json in the files property fails with
error TS6054: File '/src/hello.json' has unsupported extension. The only supported extensions are '.ts', '.tsx', '.d.ts'.
Hiroki Kato (@cockscomb) you need to have files clause to have the json file("files": ["src/hello.json"] in the tsconfig file). The issue here was it reported unsupported extension (which is not what you are seeing)
In your
cc: Ryan Cavanaugh (@RyanCavanaugh)
If I am reading the tests added as part of 49ac60f correctly, then yes, JSON files must be explicitly listed in files section of tsconfig.
Sheetal Nandi (@sheetalkamat) what is the reasoning behind this requirement/limitation? Would you accept a pull request modifying the behavior of include to cover JSON files too? (I.e. change the test "with resolveJsonModule and include only" to expect a successful compilation.)
Let me explain my use case. In LoopBack, we have a concept of a data source - a class providing access to a database, web service, etc. An application (a LoopBack/TypeScript project) can have multiple datasources. Each datasource is implemented in two files: a JSON file with the configuration (to make it easy to edit programmatically) and a TypeScript file exporting the datasource class.
The TypeScript code in src/datasources/db.datasource.ts (full version):
When the project is not composite and compiler is running in the "classic" mode (without -b), it correctly understands that db.datasource.ts is importing db.datasource.json and therefore the JSON file needs to be included in the compilation too.
I find it confusing that composite/build mode changes this behavior.
When the project is switched to composite mode (the only change being adding composite: true to compilerConfig), the compilation starts failing with error TS6307. Despite this error, the actual JSON file is correctly copied to the output directory.
I find it confusing that the compiler understands that a JSON file is imported and thus needs to be copied to the output directory, yet it complains that it was not explicitly listed in tsconfig's files section.
I find the requirement to explicitly add all JSON files one by one as a poor user experience. For applications (projects) containing many JSON files, the tsconfig content can become large and difficult to maintain.
If my first two arguments above are not convincing enough and/or there are other reasons explaining why JSON files must be treated differently in composite vs. non-composite projects: Can we at least allow JSON files to be specified via an explicit pattern in include, e.g. src/datasources/*.datasource.json? By explicit I mean that the pattern must match JSON files only (i.e. the pattern string must end with .json).
pattern
file
match?
**/*
src/foo.ts
✔️
**/*
src/data.json
✖️
src/*.json
src/foo.ts
✖️
src/*.json
src/data.json
✔️
Reacted by Michael, TorbenTigges, Mike Rodrigues De Lima, Marco and Treycos
Reacted by Nicolas Scozzaro, Bernardo Sunderhus, Gago, Duc Anh Trinh, Andrew Pearson, Amila Welihinda, Dmytro Maretskyi, Nick Mitchell, Nico Jansen, MJLHThomassen-Sorama and 7 more
My main entry configuration file is src/tsconfig.json which only have references to other sub projects localized in src/main, src/worker and src/utils and in the main project I'm trying to access the src/consts.json file and I'm getting the error:
File '/workspace/src/consts.json' is not listed within the file list of project '/workspace/src/main/tsconfig.json'. Projects must list all files or use an 'include' pattern.
Although I've listed it explicitly through files in src/main/tsconfig
The addition of the new composite attribute sounds reasonable and justified to allow nested config but seriously, guys, I think you are breaking a lot of projects right now!!
[ZE] (@zerubeus) & anyone reading this in the future - I just checked after running into this issue now, it seem like Tsai-Chieh (@TsaiTsaiChieh) 's PR above fixes the issue by allowing a glob pattern in tsconfig's include property:
This issue should be re-opened. The "closed" status probably will direct people away from this post, and make them waste many more hours where the solution is just in here.
For me, I have spent a few hours, and nearly tear down all the tsconfig settings in a mono-repo to try to solve this. I wish I had come to this issue and saw Joe Pea (@trusktr) 's comment earlier.
So just re-confirm,
"include": [ "src/**/*" ] does NOT include json,
must use "include": [ "src/**/*", "src/**/*.json"]
Maybe the reason this issue was closed, is because the initial issue report, while described the sympton correctly, had a misleading interpretation
Expected behavior:
With composite: true and resolveJsonModule: true set in tsconfig.json, JSON modules are resolved in the compilation like they are when the composite compiler option is not set.
Actually, composite and resolveJsonModule does not change the behaviour whether or not JSON is included in the INITIAL set of files - this can be confirmed by invoking tsc with --showConfig option
With or without composite and resolveJsonModule settings, the JSON files are not in the calculated "files" list.
However, when composite is false, even the JSON files are not in the initial file list, tsc does not care, as long as the files can be resolved eventually.
When composite is true, to achieve composite build, tsc requires all imported file must be included in the INITIAL set of files. Then the issue becomes an error.
The the root cause, "*/**" does not include JSON, is always there, not solved. Only when composite is true, it suffaces and become a problem. Otherwise it's under the water.
Activity
mhegazy commentedon Jul 13, 2018
we should allow
.jsonin files list if--resolveJsonModulesis enabled.sheetalkamat commentedon Jul 13, 2018
Mohamed Hegazy (@mhegazy) Is assumption that we shouldnt include them through include pattern of config file though?
Support resolveJsonModule option when files contain the json file
mhegazy commentedon Jul 13, 2018
yeah. i think that would be a bigger breaking change.
cockscomb commentedon Oct 2, 2018
Sami Kukkonen (@strax) Sheetal Nandi (@sheetalkamat) Mohamed Hegazy (@mhegazy) Is this problem fixed in TypeScript 3.1.1?
I have tried to use TypeScript 3.1.1 in the repro project, TypeScript gives the following error:
It seems to this problem is still exist.
sheetalkamat commentedon Oct 2, 2018
Hiroki Kato (@cockscomb) you need to have files clause to have the json file(
"files": ["src/hello.json"]in the tsconfig file). The issue here was it reported unsupported extension (which is not what you are seeing)In your
cc: Ryan Cavanaugh (@RyanCavanaugh)
raymondfeng commentedon Oct 8, 2018
Sheetal Nandi (@sheetalkamat) We ran into a similar issue as Hiroki Kato (@cockscomb).
tsccomplains about json files not in project file list no matter how we tweaktsconfig.json:{ "$schema": "http://json.schemastore.org/tsconfig", "compilerOptions": { "rootDir": "src", "composite": true, "target": "es2017", "outDir": "dist" }, "references": [ ... ], "include": [ "**/*" ] }None of the following works:
"include": ["**/*"]"include": ["**/*.json", "**/*.ts"]Do we have to use
filesto include json files?bajtos commentedon Oct 9, 2018
If I am reading the tests added as part of 49ac60f correctly, then yes, JSON files must be explicitly listed in
filessection oftsconfig.Sheetal Nandi (@sheetalkamat) what is the reasoning behind this requirement/limitation? Would you accept a pull request modifying the behavior of
includeto cover JSON files too? (I.e. change the test "with resolveJsonModule and include only" to expect a successful compilation.)https://github.com/Microsoft/TypeScript/blob/49ac60f286972f0349a1f39365bcc6403b3772e5/src/testRunner/unittests/tsbuild.ts#L256-L258
sheetalkamat commentedon Oct 9, 2018
We do not want to add json files in compilation accidently and want users to explicitly specify them instead of using the include/exclude pattern.
bajtos commentedon Oct 11, 2018
Sheetal Nandi (@sheetalkamat) Thank you for the comment, I see your point.
Let me explain my use case. In LoopBack, we have a concept of a data source - a class providing access to a database, web service, etc. An application (a LoopBack/TypeScript project) can have multiple datasources. Each datasource is implemented in two files: a JSON file with the configuration (to make it easy to edit programmatically) and a TypeScript file exporting the datasource class.
The TypeScript code in
src/datasources/db.datasource.ts(full version):JSON config in
src/datasources/db.datasource.json(full version):Relevant parts of tsconfig (we are not using project references yet):
Now back to the topic of this issue:
When the project is not composite and compiler is running in the "classic" mode (without
-b), it correctly understands thatdb.datasource.tsis importingdb.datasource.jsonand therefore the JSON file needs to be included in the compilation too.I find it confusing that composite/build mode changes this behavior.
When the project is switched to composite mode (the only change being adding
composite: truetocompilerConfig), the compilation starts failing with errorTS6307. Despite this error, the actual JSON file is correctly copied to the output directory.I find it confusing that the compiler understands that a JSON file is imported and thus needs to be copied to the output directory, yet it complains that it was not explicitly listed in tsconfig's
filessection.I find the requirement to explicitly add all JSON files one by one as a poor user experience. For applications (projects) containing many JSON files, the
tsconfigcontent can become large and difficult to maintain.If my first two arguments above are not convincing enough and/or there are other reasons explaining why JSON files must be treated differently in composite vs. non-composite projects: Can we at least allow JSON files to be specified via an explicit pattern in
include, e.g.src/datasources/*.datasource.json? By explicit I mean that the pattern must match JSON files only (i.e. the pattern string must end with.json).**/*src/foo.ts**/*src/data.jsonsrc/*.jsonsrc/foo.tssrc/*.jsonsrc/data.json5 remaining items
DylanVann commentedon Mar 5, 2019
There is still the issue of JSON files in
node_modulesnot working.Enable composite builds.
StrongerSY commentedon Jun 18, 2019
Listing JSON files in files section of tsconfig works for me ~ Thx Miroslav Bajtoš (@bajtos)
xtianus79 commentedon Oct 23, 2019
This is still an issue
bsunderhus commentedon Dec 11, 2019
I'm experiencing the same issue my project is setup as followed:
My main entry configuration file is
src/tsconfig.jsonwhich only have references to other sub projects localized insrc/main,src/workerandsrc/utilsand in themainproject I'm trying to access thesrc/consts.jsonfile and I'm getting the error:Although I've listed it explicitly through
filesinsrc/main/tsconfig{ "extends": "../../tsconfig.base.json", "files": [ "./index.ts", "../consts.json", ], "references": [ {"path": "../worker"}, {"path": "../utils"} ] }trusktr commentedon May 12, 2020
I was spending time fiddling around with this until I realized it was a TS issue.
It is confusing and not intuitive to have to write something like
{ "include": ["./src/**/*", "./src/**/*.json"], }PaulRBerg commentedon Jun 3, 2020
Joe Pea (@trusktr)'s solution worked, but I had to restart my IDE.
Why is this issue closed?
asm2025 commentedon Aug 21, 2020
The addition of the new composite attribute sounds reasonable and justified to allow nested config but seriously, guys, I think you are breaking a lot of projects right now!!
amerllica commentedon Jan 9, 2021
Just add this to the root of
tsconfig.json:zerubeus commentedon Dec 20, 2021
this still an issue 2021 ... why this been closed?
🔧 include json file, ref from microsoft/TypeScript#25636
jpgupta commentedon May 14, 2022
[ZE] (@zerubeus) & anyone reading this in the future - I just checked after running into this issue now, it seem like Tsai-Chieh (@TsaiTsaiChieh) 's PR above fixes the issue by allowing a glob pattern in tsconfig's include property:
include: ["**/*.json"]
TsaiTsaiChieh/never-stray@ac22f38
Confirmed working on typescript 4.5.4
SalahAdDin commentedon Feb 9, 2023
No any of the given solutions works for us.
bingtimren commentedon Sep 13, 2025
This issue should be re-opened. The "closed" status probably will direct people away from this post, and make them waste many more hours where the solution is just in here.
For me, I have spent a few hours, and nearly tear down all the tsconfig settings in a mono-repo to try to solve this. I wish I had come to this issue and saw Joe Pea (@trusktr) 's comment earlier.
So just re-confirm,
"include": [ "src/**/*" ]does NOT include json,"include": [ "src/**/*", "src/**/*.json"]Maybe the reason this issue was closed, is because the initial issue report, while described the sympton correctly, had a misleading interpretation
Actually, composite and resolveJsonModule does not change the behaviour whether or not JSON is included in the INITIAL set of files - this can be confirmed by invoking tsc with --showConfig option
With or without composite and resolveJsonModule settings, the JSON files are not in the calculated "files" list.
However, when composite is false, even the JSON files are not in the initial file list, tsc does not care, as long as the files can be resolved eventually.
When composite is true, to achieve composite build, tsc requires all imported file must be included in the INITIAL set of files. Then the issue becomes an error.
The the root cause, "*/**" does not include JSON, is always there, not solved. Only when composite is true, it suffaces and become a problem. Otherwise it's under the water.