Fix self-name input linking for --allowJs --declaration projects (#54819)

Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com>
This commit is contained in:
Andrew Branch
2023-07-03 11:17:07 -07:00
committed by GitHub
co-authored by Jake Bailey
parent 88cb76d314
commit 5932420b0f
8 changed files with 110 additions and 7 deletions
+1
View File
@@ -657,6 +657,7 @@ const commandOptionsWithoutBuild: CommandLineOption[] = [
{
name: "checkJs",
type: "boolean",
affectsModuleResolution: true,
showInSimplifiedHelpView: true,
category: Diagnostics.JavaScript_Support,
description: Diagnostics.Enable_error_reporting_in_type_checked_JavaScript_files,
+11 -1
View File
@@ -35,6 +35,7 @@ import {
forEach,
forEachAncestorDirectory,
formatMessage,
getAllowJSCompilerOption,
getBaseFileName,
GetCanonicalFileName,
getCommonSourceDirectory,
@@ -2420,7 +2421,16 @@ function loadModuleFromSelfNameReference(extensions: Extensions, moduleName: str
// in order to be consistent with (non-self) library-name loading in
// `loadModuleFromNearestNodeModulesDirectoryWorker`, which uses two passes in order
// to prioritize `@types` packages higher up the directory tree over untyped
// implementation packages.
// implementation packages. See the selfNameModuleAugmentation.ts test for why this
// matters.
//
// However, there's an exception. If the user has `allowJs` and `declaration`, we need
// to ensure that self-name imports of their own package can resolve back to their
// input JS files via `tryLoadInputFileForPath` at a higher priority than their output
// declaration files, so we need to do a single pass with all extensions for that case.
if (getAllowJSCompilerOption(state.compilerOptions) && !pathContainsNodeModules(directory)) {
return loadModuleFromExports(scope, extensions, subpath, state, cache, redirectedReference);
}
const priorityExtensions = extensions & (Extensions.TypeScript | Extensions.Declaration);
const secondaryExtensions = extensions & ~(Extensions.TypeScript | Extensions.Declaration);
return loadModuleFromExports(scope, priorityExtensions, subpath, state, cache, redirectedReference)
@@ -0,0 +1,33 @@
//// [tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName2.ts] ////
//// [package.json]
{
"name": "js-self-name-import",
"type": "module",
"exports": {
"./*": {
"types": "./types/src/*",
"default": "./src/*"
}
}
}
//// [foo.d.ts]
export const foo: 1;
//// [foo.d.ts]
export {};
//// [foo.js]
export const foo = 1;
//// [foo.js]
import { foo } from "js-self-name-import/foo.js";
//// [foo.d.ts]
export const foo: 1;
//// [foo.d.ts]
export {};
@@ -0,0 +1,10 @@
//// [tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName2.ts] ////
=== /src/foo.js ===
export const foo = 1;
>foo : Symbol(foo, Decl(foo.js, 0, 12))
=== /test/foo.js ===
import { foo } from "js-self-name-import/foo.js";
>foo : Symbol(foo, Decl(foo.js, 0, 8))
@@ -0,0 +1,11 @@
//// [tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName2.ts] ////
=== /src/foo.js ===
export const foo = 1;
>foo : 1
>1 : 1
=== /test/foo.js ===
import { foo } from "js-self-name-import/foo.js";
>foo : 1
@@ -69,7 +69,7 @@ Info seq [hh:mm:ss:mss] Open files:
Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/index.ts ProjectRootPath: undefined
Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json
DocumentRegistry::
Key:: undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
Key:: undefined|undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
/user/username/projects/myproject/index.ts: TS 1
/user/username/projects/myproject/module1.d.ts: TS 1
/a/lib/lib.d.ts: TS 1
@@ -88,7 +88,7 @@ Info seq [hh:mm:ss:mss] Files (2)
Info seq [hh:mm:ss:mss] -----------------------------------------------
DocumentRegistry::
Key:: undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
Key:: undefined|undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
/user/username/projects/myproject/index.ts: TS 1
/a/lib/lib.d.ts: TS 1
Info seq [hh:mm:ss:mss] FileWatcher:: Triggered with /user/username/projects/myproject/module1.d.ts 1:: WatchInfo: /user/username/projects/myproject/module1.d.ts 500 undefined WatchType: Closed Script info
@@ -111,7 +111,7 @@ Info seq [hh:mm:ss:mss] Files (3)
Info seq [hh:mm:ss:mss] -----------------------------------------------
DocumentRegistry::
Key:: undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
Key:: undefined|undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
/user/username/projects/myproject/index.ts: TS 1
/a/lib/lib.d.ts: TS 1
/user/username/projects/myproject/module1.d.ts: TS 1
@@ -69,7 +69,7 @@ Info seq [hh:mm:ss:mss] Open files:
Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/index.ts ProjectRootPath: undefined
Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json
DocumentRegistry::
Key:: undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
Key:: undefined|undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
/user/username/projects/myproject/index.ts: TS 1
/user/username/projects/myproject/module1.d.ts: TS 1
/a/lib/lib.d.ts: TS 1
@@ -88,7 +88,7 @@ Info seq [hh:mm:ss:mss] Files (2)
Info seq [hh:mm:ss:mss] -----------------------------------------------
DocumentRegistry::
Key:: undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
Key:: undefined|undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
/user/username/projects/myproject/index.ts: TS 1
/a/lib/lib.d.ts: TS 1
Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json
@@ -109,7 +109,7 @@ Info seq [hh:mm:ss:mss] Files (3)
Info seq [hh:mm:ss:mss] -----------------------------------------------
DocumentRegistry::
Key:: undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
Key:: undefined|undefined|undefined|undefined|undefined|false|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined|undefined
/user/username/projects/myproject/index.ts: TS 1
/a/lib/lib.d.ts: TS 1
/user/username/projects/myproject/module1.d.ts: TS 1
@@ -0,0 +1,38 @@
// @Filename: /tsconfig.json
{
"compilerOptions": {
"module": "nodenext",
"target": "esnext",
"emitDeclarationOnly": true,
"declaration": true,
"declarationDir": "./types",
"checkJs": true,
"rootDir": ".",
"strict": true,
},
"include": ["src", "test"]
}
// @Filename: /package.json
{
"name": "js-self-name-import",
"type": "module",
"exports": {
"./*": {
"types": "./types/src/*",
"default": "./src/*"
}
}
}
// @Filename: /types/src/foo.d.ts
export const foo: 1;
// @Filename: /types/test/foo.d.ts
export {};
// @Filename: /src/foo.js
export const foo = 1;
// @Filename: /test/foo.js
import { foo } from "js-self-name-import/foo.js";