microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
100.2k stars 12.38k forks source link

Module resolution: Imported files are missing from emit when imported via `package.json#imports` #59843

Open jkrems opened 1 week ago

jkrems commented 1 week ago

Demo Repo

https://github.com/jkrems/ts-imports-emit

Which of the following problems are you reporting?

Something else more complicated which I'll explain in more detail

Demonstrate the defect described above with a code sample.

import {indirect} from "#indirect"; // should pull the target module into the emit, just like a direct import would

Run tsc --showConfig and paste its output here

{
    "compilerOptions": {
        "module": "preserve",
        "moduleResolution": "bundler",
        "rootDir": "./src",
        "outDir": "./dist",
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "resolvePackageJsonExports": true,
        "resolvePackageJsonImports": true,
        "resolveJsonModule": true
    },
    "files": [
        "./src/main.ts"
    ],
    "exclude": [
        "/Users/jankrems/code/src/github.com/jkrems/imports-emit/dist"
    ]
}

Run tsc --traceResolution and paste its output here

======== Resolving module './direct' from '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/main.ts'. ========
Explicitly specified module resolution kind: 'Bundler'.
Resolving in CJS mode with conditions 'import', 'types'.
Loading module as file / folder, candidate module location '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/direct', target file types: TypeScript, JavaScript, Declaration, JSON.
File '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/direct.ts' exists - use it as a name resolution result.
======== Module name './direct' was successfully resolved to '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/direct.ts'. ========
======== Resolving module '#indirect' from '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/main.ts'. ========
Explicitly specified module resolution kind: 'Bundler'.
Resolving in CJS mode with conditions 'import', 'types'.
File '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/package.json' does not exist.
Found 'package.json' at '/Users/jankrems/code/src/github.com/jkrems/imports-emit/package.json'.
Using 'imports' subpath '#indirect' with target './src/indirect.js'.
File name '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/indirect.js' has a '.js' extension - stripping it.
File '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/indirect.ts' exists - use it as a name resolution result.
'package.json' does not have a 'peerDependencies' field.
Resolving real path for '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/indirect.ts', result '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/indirect.ts'.
======== Module name '#indirect' was successfully resolved to '/Users/jankrems/code/src/github.com/jkrems/imports-emit/src/indirect.ts' with Package ID 'imports-emit/src/indirect.ts@1.0.0'. ========
======== Resolving module '@typescript/lib-es5' from '/Users/jankrems/code/src/github.com/jkrems/imports-emit/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========
Explicitly specified module resolution kind: 'Node10'.
Loading module '@typescript/lib-es5' from 'node_modules' folder, target file types: TypeScript, Declaration.
Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.
Directory '/Users/jankrems/code/src/github.com/jkrems/imports-emit/node_modules/@types' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-es5'
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-es5'
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-es5'
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-es5'
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-es5'
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-es5'
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-es5'
Directory '/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-es5'
Loading module '@typescript/lib-es5' from 'node_modules' folder, target file types: JavaScript.
Searching all ancestor node_modules directories for fallback extensions: JavaScript.
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Directory '/node_modules' does not exist, skipping all lookups in it.
======== Module name '@typescript/lib-es5' was not resolved. ========
======== Resolving module '@typescript/lib-decorators' from '/Users/jankrems/code/src/github.com/jkrems/imports-emit/__lib_node_modules_lookup_lib.decorators.d.ts__.ts'. ========
Explicitly specified module resolution kind: 'Node10'.
Loading module '@typescript/lib-decorators' from 'node_modules' folder, target file types: TypeScript, Declaration.
Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.
Directory '/Users/jankrems/code/src/github.com/jkrems/imports-emit/node_modules/@types' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators'
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators'
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators'
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators'
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators'
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators'
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators'
Directory '/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators'
Loading module '@typescript/lib-decorators' from 'node_modules' folder, target file types: JavaScript.
Searching all ancestor node_modules directories for fallback extensions: JavaScript.
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Directory '/node_modules' does not exist, skipping all lookups in it.
======== Module name '@typescript/lib-decorators' was not resolved. ========
======== Resolving module '@typescript/lib-decorators/legacy' from '/Users/jankrems/code/src/github.com/jkrems/imports-emit/__lib_node_modules_lookup_lib.decorators.legacy.d.ts__.ts'. ========
Explicitly specified module resolution kind: 'Node10'.
Loading module '@typescript/lib-decorators/legacy' from 'node_modules' folder, target file types: TypeScript, Declaration.
Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.
Directory '/Users/jankrems/code/src/github.com/jkrems/imports-emit/node_modules/@types' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators/legacy'
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators/legacy'
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators/legacy'
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators/legacy'
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators/legacy'
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators/legacy'
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators/legacy'
Directory '/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-decorators/legacy'
Loading module '@typescript/lib-decorators/legacy' from 'node_modules' folder, target file types: JavaScript.
Searching all ancestor node_modules directories for fallback extensions: JavaScript.
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Directory '/node_modules' does not exist, skipping all lookups in it.
======== Module name '@typescript/lib-decorators/legacy' was not resolved. ========
======== Resolving module '@typescript/lib-dom' from '/Users/jankrems/code/src/github.com/jkrems/imports-emit/__lib_node_modules_lookup_lib.dom.d.ts__.ts'. ========
Explicitly specified module resolution kind: 'Node10'.
Loading module '@typescript/lib-dom' from 'node_modules' folder, target file types: TypeScript, Declaration.
Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.
Directory '/Users/jankrems/code/src/github.com/jkrems/imports-emit/node_modules/@types' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Loading module '@typescript/lib-dom' from 'node_modules' folder, target file types: JavaScript.
Searching all ancestor node_modules directories for fallback extensions: JavaScript.
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Directory '/node_modules' does not exist, skipping all lookups in it.
======== Module name '@typescript/lib-dom' was not resolved. ========
======== Resolving module '@typescript/lib-webworker/importscripts' from '/Users/jankrems/code/src/github.com/jkrems/imports-emit/__lib_node_modules_lookup_lib.webworker.importscripts.d.ts__.ts'. ========
Explicitly specified module resolution kind: 'Node10'.
Loading module '@typescript/lib-webworker/importscripts' from 'node_modules' folder, target file types: TypeScript, Declaration.
Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.
Directory '/Users/jankrems/code/src/github.com/jkrems/imports-emit/node_modules/@types' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-webworker/importscripts'
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-webworker/importscripts'
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-webworker/importscripts'
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-webworker/importscripts'
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-webworker/importscripts'
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-webworker/importscripts'
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-webworker/importscripts'
Directory '/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-webworker/importscripts'
Loading module '@typescript/lib-webworker/importscripts' from 'node_modules' folder, target file types: JavaScript.
Searching all ancestor node_modules directories for fallback extensions: JavaScript.
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Directory '/node_modules' does not exist, skipping all lookups in it.
======== Module name '@typescript/lib-webworker/importscripts' was not resolved. ========
======== Resolving module '@typescript/lib-scripthost' from '/Users/jankrems/code/src/github.com/jkrems/imports-emit/__lib_node_modules_lookup_lib.scripthost.d.ts__.ts'. ========
Explicitly specified module resolution kind: 'Node10'.
Loading module '@typescript/lib-scripthost' from 'node_modules' folder, target file types: TypeScript, Declaration.
Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.
Directory '/Users/jankrems/code/src/github.com/jkrems/imports-emit/node_modules/@types' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-scripthost'
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-scripthost'
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-scripthost'
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-scripthost'
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-scripthost'
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-scripthost'
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-scripthost'
Directory '/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-scripthost'
Loading module '@typescript/lib-scripthost' from 'node_modules' folder, target file types: JavaScript.
Searching all ancestor node_modules directories for fallback extensions: JavaScript.
Directory '/Users/jankrems/code/src/github.com/jkrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/github.com/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/src/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/code/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/jankrems/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Directory '/node_modules' does not exist, skipping all lookups in it.
======== Module name '@typescript/lib-scripthost' was not resolved. ========

Paste the package.json of the importing module, if it exists

{
  "name": "imports-emit",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "imports": {
    "#indirect": "./src/indirect.js"
  },
  "keywords": [],
  "author": "",
  "license": "MIT",
  "description": "",
  "devDependencies": {
    "typescript": "^5.5.4"
  }
}

Paste the package.json of the target module, if it exists

n/a

Any other comments can go here

I would expect that adding indirection via "imports": {...} would not affect the emit. But I'm not sure if that's WAI.

RyanCavanaugh commented 1 week ago

explainFiles output:

src/direct.ts
  Imported via './direct' from file 'src/main.ts'
src/indirect.ts
  Imported via "#indirect" from file 'src/main.ts' with packageId 'imports-emit/src/indirect.ts@1.0.0'
src/main.ts
  Part of 'files' list in tsconfig.json