1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-23 15:16:54 -05:00

fix(npm): handle declaration file resolution where packages incorrectly define "types" last in "exports" (#17290)

Closes #17279
This commit is contained in:
David Sherret 2023-01-06 12:57:52 -05:00 committed by David Sherret
parent 4289ba0f77
commit ab07129ee7
12 changed files with 34 additions and 17 deletions

View file

@ -0,0 +1 @@
export function entryA(): 12;

View file

@ -1 +0,0 @@
export function entryC(): 12;

View file

@ -1,2 +0,0 @@
// it will go to this and not the types entry because this entry was first
export function entryB(): string;

View file

@ -0,0 +1 @@
export function entryImport(): "import";

View file

@ -0,0 +1 @@
export function entryTypes(): "types";

View file

@ -8,12 +8,16 @@
},
"import": "./dist/client.mjs"
},
"./entry-b": {
"import": "./entry-b.d.ts",
"types": "./dist/entry-b-wrong.d.ts"
"./entry-import": {
"import": "./entry-import.d.ts",
"types": "./entry-types.d.ts"
},
"./entry-c": {
"import": "./dist/entry-c.js"
"./entry-types-last-no-declaration-before": {
"import": "./entry-js-only.js",
"types": "./entry-types.d.ts"
},
"./entry-a": {
"import": "./dist/entry-a.js"
}
}
}

View file

@ -53,14 +53,19 @@ const valueA: "test1" = getClient();
~~~~~~
at [WILDCARD]/npm/types/main.ts:[WILDCARD]
TS2322 [ERROR]: Type 'string' is not assignable to type '"test2"'.
const valueB: "test2" = entryB();
TS2322 [ERROR]: Type '"import"' is not assignable to type '"test2"'.
const valueB: "test2" = entryImport();
~~~~~~
at [WILDCARD]/types/main.ts:[WILDCARD]
TS2322 [ERROR]: Type '12' is not assignable to type '"test3"'.
const valueC: "test3" = entryC();
const valueC: "test3" = entryA();
~~~~~~
at [WILDCARD]/types/main.ts:[WILDCARD]
Found 8 errors.
TS2322 [ERROR]: Type '"types"' is not assignable to type '"test4"'.
const valueD: "test4" = entryTypes();
~~~~~~
at file:///[WILDCARD]/types/main.ts:[WILDCARD]
Found 9 errors.

View file

@ -2,8 +2,9 @@ import type { Fizzbuzz } from "npm:@denotest/types";
import type { SomeInterface } from "npm:@denotest/types_imported";
import type { Foobar as FooInterface } from "npm:@denotest/types_imported/subpath";
import { getClient } from "npm:@denotest/types-exports-subpaths/client";
import { entryB } from "npm:@denotest/types-exports-subpaths/entry-b";
import { entryC } from "npm:@denotest/types-exports-subpaths/entry-c";
import { entryImport } from "npm:@denotest/types-exports-subpaths/entry-import";
import { entryA } from "npm:@denotest/types-exports-subpaths/entry-a";
import { entryTypes } from "npm:@denotest/types-exports-subpaths/entry-types-last-no-declaration-before";
const foobar: FooInterface = {
foo: "foo",
@ -21,5 +22,6 @@ const fizzbuzz: Fizzbuzz = {
};
const valueA: "test1" = getClient();
const valueB: "test2" = entryB();
const valueC: "test3" = entryC();
const valueB: "test2" = entryImport();
const valueC: "test3" = entryA();
const valueD: "test4" = entryTypes();

View file

@ -445,7 +445,13 @@ fn resolve_package_target(
mode,
npm_resolver,
)
.map(Some);
.map(|path| {
if mode.is_types() {
path_to_declaration_path(path, referrer_kind)
} else {
Some(path)
}
});
} else if let Some(target_arr) = target.as_array() {
if target_arr.is_empty() {
return Ok(None);