microsoft / microsoft/TypeScript

`resolveJsonModule` doesn't copy source file when located within `node_modules` subdirectory

Open
#43,940 0 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Bug Domain: Module Resolution
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

Bug Report

🔎 Search Terms

resolveJsonModule json node_modules

🕗 Version & Regression Information

Version 4.2.4
macOS 11.3

The issue seems very old, at least TS v3.4 is also affected.

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about tsconfig.json
💻 Code

tsconfig.json

{
	"compilerOptions": {
		"baseUrl": "src",
		"rootDir": "src",
		"outDir": "dist",
		"resolveJsonModule": true,
	},
}

src/index.ts

import * as json from './config.json';

src/config.json

{}
🙁 Actual behavior

When I run tsc the output in dist contains index.js and config.json. This is good and expected. If any parent directory is named node_modules then the JSON file will no longer be copied. A full terminal session of this phenomenon is included below:

marcel@marcel ~/tmp $ ls -lah
total 0
drwxr-xr-x   3 marcel  staff    96B May  4 02:22 .
drwxr-xr-x  84 marcel  staff   2.6K May  4 02:22 ..
drwxr-xr-x   4 marcel  staff   128B May  4 02:21 test

marcel@marcel ~/tmp $ cd test 

marcel@marcel ~/tmp/test $ ls -lah
total 8
drwxr-xr-x  4 marcel  staff   128B May  4 02:21 .
drwxr-xr-x  3 marcel  staff    96B May  4 02:22 ..
drwxr-xr-x  4 marcel  staff   128B May  4 02:13 src
-rw-r--r--  1 marcel  staff   119B May  4 02:14 tsconfig.json

marcel@marcel ~/tmp/test $ npx tsc

marcel@marcel ~/tmp/test $ cat dist/config.json 
{}

marcel@marcel ~/tmp/test $ cd ..

marcel@marcel ~/tmp $ mkdir node_modules

marcel@marcel ~/tmp $ mv test node_modules 

marcel@marcel ~/tmp $ cd node_modules/test 

marcel@marcel ~/tmp/node_modules/test $ rm -rf dist 

marcel@marcel ~/tmp/node_modules/test $ npx tsc

marcel@marcel ~/tmp/node_modules/test $ cat dist/config.json
cat: dist/config.json: No such file or directory

marcel@marcel ~/tmp/node_modules/test $ ls dist 
index.js
🙂 Expected behavior

It is unexpected that the name of a parent directory would affect the compiler in this manner.

Additional information

If I invoke the compiler with the --traceResolution option the output is almost exactly the same but an additional line is logged in the node_modules parent case. The full log follows and the additional line is annotated inline. This diagnostic message does not appear when node_modules is found in the parent hierarchy.

======== Resolving module './config.json' from '/Users/marcel/tmp/node_modules/hello/test/src/index.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module as file / folder, candidate module location '/Users/marcel/tmp/node_modules/hello/test/src/config.json', target file type 'TypeScript'.
File '/Users/marcel/tmp/node_modules/hello/test/src/config.json.ts' does not exist.
File '/Users/marcel/tmp/node_modules/hello/test/src/config.json.tsx' does not exist.
File '/Users/marcel/tmp/node_modules/hello/test/src/config.json.d.ts' does not exist.
Directory '/Users/marcel/tmp/node_modules/hello/test/src/config.json' does not exist, skipping all lookups in it.
Loading module as file / folder, candidate module location '/Users/marcel/tmp/node_modules/hello/test/src/config.json', target file type 'JavaScript'.
File '/Users/marcel/tmp/node_modules/hello/test/src/config.json.js' does not exist.
File '/Users/marcel/tmp/node_modules/hello/test/src/config.json.jsx' does not exist.
Directory '/Users/marcel/tmp/node_modules/hello/test/src/config.json' does not exist, skipping all lookups in it.
Loading module as file / folder, candidate module location '/Users/marcel/tmp/node_modules/hello/test/src/config.json', target file type 'Json'.
File '/Users/marcel/tmp/node_modules/hello/test/src/config.json' exist - use it as a name resolution result.
File '/Users/marcel/tmp/node_modules/hello/package.json' does not exist.
  ^----- THIS LINE IS ADDED
======== Module name './config.json' was successfully resolved to '/Users/marcel/tmp/node_modules/hello/test/src/config.json'. ========

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

Reproduce the issue with tsconfig.json, src/index.ts, and src/config.json, placing the project under a node_modules parent directory. Start by running tsc with --traceResolution and compare the emitted dist files and diagnostics with the project outside node_modules. Done means the resolved JSON file is copied to dist in both locations.

Written by the indexing model from the issue text.

Assessment

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.