Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions internal/module/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -1810,9 +1810,16 @@ func (r *resolutionState) getPackageId(resolvedFileName string, packageInfo *pac
packageJsonContent := packageInfo.Contents
if name, ok := packageJsonContent.Name.GetValue(); ok {
if version, ok := packageJsonContent.Version.GetValue(); ok {
if !tspath.ContainsPath(packageInfo.PackageDirectory, resolvedFileName, tspath.ComparePathsOptions{
UseCaseSensitiveFileNames: r.resolver.host.FS().UseCaseSensitiveFileNames(),
CurrentDirectory: r.resolver.host.GetCurrentDirectory(),
}) {
return PackageId{}
}
packageDirectory := tspath.RemoveTrailingDirectorySeparator(packageInfo.PackageDirectory)
var subModuleName string
if len(resolvedFileName) > len(packageInfo.PackageDirectory) {
subModuleName = resolvedFileName[len(packageInfo.PackageDirectory)+1:]
if len(resolvedFileName) > len(packageDirectory) {
subModuleName = resolvedFileName[len(packageDirectory)+1:]
}
return PackageId{
Name: name,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
error TS5055: Cannot write file '/dist/get.d.ts' because it would overwrite input file.
Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig.
error TS5055: Cannot write file '/dist/set.d.ts' because it would overwrite input file.
Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig.
/main.ts(6,1): error TS2554: Expected 3 arguments, but got 2.


!!! error TS5055: Cannot write file '/dist/get.d.ts' because it would overwrite input file.
!!! error TS5055: Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig.
!!! error TS5055: Cannot write file '/dist/set.d.ts' because it would overwrite input file.
!!! error TS5055: Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig.
==== /dist/get.d.ts (0 errors) ====
export declare function get(object: any, path: string, defaultValue?: any): any;

==== /dist/set.d.ts (0 errors) ====
export declare function set<T>(object: T, path: string, value: any): T;

==== /get.ts (0 errors) ====
export function get(object: any, path: string, defaultValue?: any): any {
return defaultValue;
}

==== /set.ts (0 errors) ====
export function set<T>(object: T, path: string, value: any): T {
return object;
}

==== /main.ts (1 errors) ====
import { get } from "self/get";
import { set } from "self/set";

declare const obj: { a: { b: number } };
get(obj, "a.b");
set(obj, "a.b");
~~~
!!! error TS2554: Expected 3 arguments, but got 2.
!!! related TS6210 /set.ts:1:49: An argument for 'value' was not provided.

==== /package.json (0 errors) ====
{
"name": "self",
"version": "1.0.0",
"exports": {
"./get": "./dist/get.d.ts",
"./set": "./dist/set.d.ts"
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//// [tests/cases/compiler/packageSelfNameSubpathExportsPackageIdCollision.ts] ////

//// [get.d.ts]
export declare function get(object: any, path: string, defaultValue?: any): any;

//// [set.d.ts]
export declare function set<T>(object: T, path: string, value: any): T;

//// [get.ts]
export function get(object: any, path: string, defaultValue?: any): any {
return defaultValue;
}

//// [set.ts]
export function set<T>(object: T, path: string, value: any): T {
return object;
}

//// [main.ts]
import { get } from "self/get";
import { set } from "self/set";

declare const obj: { a: { b: number } };
get(obj, "a.b");
set(obj, "a.b");

//// [package.json]
{
"name": "self",
"version": "1.0.0",
"exports": {
"./get": "./dist/get.d.ts",
"./set": "./dist/set.d.ts"
}
}


//// [get.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.get = get;
function get(object, path, defaultValue) {
return defaultValue;
}
//// [set.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.set = set;
function set(object, path, value) {
return object;
}
//// [main.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const get_1 = require("self/get");
const set_1 = require("self/set");
(0, get_1.get)(obj, "a.b");
(0, set_1.set)(obj, "a.b");


//// [main.d.ts]
export {};
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//// [tests/cases/compiler/packageSelfNameSubpathExportsPackageIdCollision.ts] ////

=== /dist/get.d.ts ===
export declare function get(object: any, path: string, defaultValue?: any): any;
>get : Symbol(get, Decl(get.d.ts, 0, 0))
>object : Symbol(object, Decl(get.d.ts, 0, 28))
>path : Symbol(path, Decl(get.d.ts, 0, 40))
>defaultValue : Symbol(defaultValue, Decl(get.d.ts, 0, 54))

=== /dist/set.d.ts ===
export declare function set<T>(object: T, path: string, value: any): T;
>set : Symbol(set, Decl(set.d.ts, 0, 0))
>T : Symbol(T, Decl(set.d.ts, 0, 28))
>object : Symbol(object, Decl(set.d.ts, 0, 31))
>T : Symbol(T, Decl(set.d.ts, 0, 28))
>path : Symbol(path, Decl(set.d.ts, 0, 41))
>value : Symbol(value, Decl(set.d.ts, 0, 55))
>T : Symbol(T, Decl(set.d.ts, 0, 28))

=== /get.ts ===
export function get(object: any, path: string, defaultValue?: any): any {
>get : Symbol(get, Decl(get.ts, 0, 0))
>object : Symbol(object, Decl(get.ts, 0, 20))
>path : Symbol(path, Decl(get.ts, 0, 32))
>defaultValue : Symbol(defaultValue, Decl(get.ts, 0, 46))

return defaultValue;
>defaultValue : Symbol(defaultValue, Decl(get.ts, 0, 46))
}

=== /set.ts ===
export function set<T>(object: T, path: string, value: any): T {
>set : Symbol(set, Decl(set.ts, 0, 0))
>T : Symbol(T, Decl(set.ts, 0, 20))
>object : Symbol(object, Decl(set.ts, 0, 23))
>T : Symbol(T, Decl(set.ts, 0, 20))
>path : Symbol(path, Decl(set.ts, 0, 33))
>value : Symbol(value, Decl(set.ts, 0, 47))
>T : Symbol(T, Decl(set.ts, 0, 20))

return object;
>object : Symbol(object, Decl(set.ts, 0, 23))
}

=== /main.ts ===
import { get } from "self/get";
>get : Symbol(get, Decl(main.ts, 0, 8))

import { set } from "self/set";
>set : Symbol(set, Decl(main.ts, 1, 8))

declare const obj: { a: { b: number } };
>obj : Symbol(obj, Decl(main.ts, 3, 13))
>a : Symbol(a, Decl(main.ts, 3, 20))
>b : Symbol(b, Decl(main.ts, 3, 25))

get(obj, "a.b");
>get : Symbol(get, Decl(main.ts, 0, 8))
>obj : Symbol(obj, Decl(main.ts, 3, 13))

set(obj, "a.b");
>set : Symbol(set, Decl(main.ts, 1, 8))
>obj : Symbol(obj, Decl(main.ts, 3, 13))

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
======== Resolving module 'self/get' from '/main.ts'. ========
Module resolution kind is not specified, using 'NodeNext'.
Resolving in CJS mode with conditions 'require', 'types', 'node'.
Found 'package.json' at '/package.json'.
Using 'exports' subpath './get' with target './dist/get.d.ts'.
File '/get.ts' exists - use it as a name resolution result.
'package.json' does not have a 'peerDependencies' field.
======== Module name 'self/get' was successfully resolved to '/get.ts' with Package ID 'self/get.ts@1.0.0'. ========
======== Resolving module 'self/set' from '/main.ts'. ========
Module resolution kind is not specified, using 'NodeNext'.
Resolving in CJS mode with conditions 'require', 'types', 'node'.
File '/package.json' exists according to earlier cached lookups.
Using 'exports' subpath './set' with target './dist/set.d.ts'.
File '/set.ts' exists - use it as a name resolution result.
'package.json' does not have a 'peerDependencies' field.
======== Module name 'self/set' was successfully resolved to '/set.ts' with Package ID 'self/set.ts@1.0.0'. ========
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//// [tests/cases/compiler/packageSelfNameSubpathExportsPackageIdCollision.ts] ////

=== /dist/get.d.ts ===
export declare function get(object: any, path: string, defaultValue?: any): any;
>get : (object: any, path: string, defaultValue?: any) => any
>object : any
>path : string
>defaultValue : any

=== /dist/set.d.ts ===
export declare function set<T>(object: T, path: string, value: any): T;
>set : <T>(object: T, path: string, value: any) => T
>object : T
>path : string
>value : any

=== /get.ts ===
export function get(object: any, path: string, defaultValue?: any): any {
>get : (object: any, path: string, defaultValue?: any) => any
>object : any
>path : string
>defaultValue : any

return defaultValue;
>defaultValue : any
}

=== /set.ts ===
export function set<T>(object: T, path: string, value: any): T {
>set : <T>(object: T, path: string, value: any) => T
>object : T
>path : string
>value : any

return object;
>object : T
}

=== /main.ts ===
import { get } from "self/get";
>get : (object: any, path: string, defaultValue?: any) => any

import { set } from "self/set";
>set : <T>(object: T, path: string, value: any) => T

declare const obj: { a: { b: number } };
>obj : { a: { b: number; }; }
>a : { b: number; }
>b : number

get(obj, "a.b");
>get(obj, "a.b") : any
>get : (object: any, path: string, defaultValue?: any) => any
>obj : { a: { b: number; }; }
>"a.b" : "a.b"

set(obj, "a.b");
>set(obj, "a.b") : { a: { b: number; }; }
>set : <T>(object: T, path: string, value: any) => T
>obj : { a: { b: number; }; }
>"a.b" : "a.b"

Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
error TS5055: Cannot write file '/very/long/package/dist/get.d.ts' because it would overwrite input file.
Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig.
error TS5055: Cannot write file '/very/long/package/dist/set.d.ts' because it would overwrite input file.
Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig.
error TS6059: File '/very/long/package/main.ts' is not under 'rootDir' '/src'. 'rootDir' is expected to contain all source files.
The file is in the program because:
Root file specified for compilation
File is CommonJS module because '/very/long/package/package.json' does not have field "type"
/very/long/package/main.ts(6,1): error TS2554: Expected 3 arguments, but got 2.


!!! error TS5055: Cannot write file '/very/long/package/dist/get.d.ts' because it would overwrite input file.
!!! error TS5055: Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig.
!!! error TS5055: Cannot write file '/very/long/package/dist/set.d.ts' because it would overwrite input file.
!!! error TS5055: Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig.
!!! error TS6059: File '/very/long/package/main.ts' is not under 'rootDir' '/src'. 'rootDir' is expected to contain all source files.
!!! error TS6059: The file is in the program because:
!!! error TS6059: Root file specified for compilation
!!! error TS6059: File is CommonJS module because '/very/long/package/package.json' does not have field "type"
==== /very/long/package/dist/get.d.ts (0 errors) ====
export declare function get(object: any, path: string, defaultValue?: any): any;

==== /very/long/package/dist/set.d.ts (0 errors) ====
export declare function set<T>(object: T, path: string, value: any): T;

==== /src/get.ts (0 errors) ====
export function get(object: any, path: string, defaultValue?: any): any {
return defaultValue;
}

==== /src/set.ts (0 errors) ====
export function set<T>(object: T, path: string, value: any): T {
return object;
}

==== /very/long/package/main.ts (1 errors) ====
import { get } from "self/get";
import { set } from "self/set";

declare const obj: { a: { b: number } };
get(obj, "a.b");
set(obj, "a.b");
~~~
!!! error TS2554: Expected 3 arguments, but got 2.
!!! related TS6210 /src/set.ts:1:49: An argument for 'value' was not provided.

==== /very/long/package/package.json (0 errors) ====
{
"name": "self",
"version": "1.0.0",
"exports": {
"./get": "./dist/get.d.ts",
"./set": "./dist/set.d.ts"
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//// [tests/cases/compiler/packageSelfNameSubpathExportsPackageIdOutsidePackage.ts] ////

//// [get.d.ts]
export declare function get(object: any, path: string, defaultValue?: any): any;

//// [set.d.ts]
export declare function set<T>(object: T, path: string, value: any): T;

//// [get.ts]
export function get(object: any, path: string, defaultValue?: any): any {
return defaultValue;
}

//// [set.ts]
export function set<T>(object: T, path: string, value: any): T {
return object;
}

//// [main.ts]
import { get } from "self/get";
import { set } from "self/set";

declare const obj: { a: { b: number } };
get(obj, "a.b");
set(obj, "a.b");

//// [package.json]
{
"name": "self",
"version": "1.0.0",
"exports": {
"./get": "./dist/get.d.ts",
"./set": "./dist/set.d.ts"
}
}


//// [get.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.get = get;
function get(object, path, defaultValue) {
return defaultValue;
}
//// [set.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.set = set;
function set(object, path, value) {
return object;
}
//// [main.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const get_1 = require("self/get");
const set_1 = require("self/set");
(0, get_1.get)(obj, "a.b");
(0, set_1.set)(obj, "a.b");


//// [main.d.ts]
export {};
Loading