microsoft / microsoft/TypeScript

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

オープン
#43,940 コメント 0 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Bug Domain: Module Resolution
主要言語
Go
スター
111k
フォーク
14.3k
平均マージ
1日 19時間
マージ済み PR(30日)
117

説明

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'. ========

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

tsconfig.json、src/index.ts、src/config.json を使って問題を再現し、プロジェクトを node_modules の親ディレクトリ配下に配置します。まず --traceResolution を付けて tsc を実行し、生成された dist ファイルと診断結果を、node_modules の外にあるプロジェクトと比較します。両方の場所で解決された JSON ファイルが dist にコピーされれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
typescript
領域
compilers
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。