Properly support scoped package self name lookups (#46212)

This commit is contained in:
Wesley Wigham 2021-10-05 12:41:44 -07:00 committed by GitHub
parent 47cd4d3ecf
commit 1cee9731d2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 298 additions and 3 deletions

View file

@ -1724,11 +1724,15 @@ namespace ts {
if (!scope || !scope.packageJsonContent.exports) {
return undefined;
}
const parts = getPathComponents(moduleName); // unrooted paths should have `""` as their 0th entry
if (scope.packageJsonContent.name !== parts[1]) {
if (typeof scope.packageJsonContent.name !== "string") {
return undefined;
}
const trailingParts = parts.slice(2);
const parts = getPathComponents(moduleName); // unrooted paths should have `""` as their 0th entry
const nameParts = getPathComponents(scope.packageJsonContent.name);
if (!every(nameParts, (p, i) => parts[i] === p)) {
return undefined;
}
const trailingParts = parts.slice(nameParts.length);
return loadModuleFromExports(scope, extensions, !length(trailingParts) ? "." : `.${directorySeparator}${trailingParts.join(directorySeparator)}`, state, cache, redirectedReference);
}

View file

@ -0,0 +1,24 @@
tests/cases/conformance/node/index.cts(2,23): error TS1471: Module '@scope/package' cannot be imported using this construct. The specifier only resolves to an ES module, which cannot be imported synchronously. Use dynamic import instead.
==== tests/cases/conformance/node/index.ts (0 errors) ====
// esm format file
import * as self from "@scope/package";
self;
==== tests/cases/conformance/node/index.mts (0 errors) ====
// esm format file
import * as self from "@scope/package";
self;
==== tests/cases/conformance/node/index.cts (1 errors) ====
// cjs format file
import * as self from "@scope/package";
~~~~~~~~~~~~~~~~
!!! error TS1471: Module '@scope/package' cannot be imported using this construct. The specifier only resolves to an ES module, which cannot be imported synchronously. Use dynamic import instead.
self;
==== tests/cases/conformance/node/package.json (0 errors) ====
{
"name": "@scope/package",
"private": true,
"type": "module",
"exports": "./index.js"
}

View file

@ -0,0 +1,63 @@
//// [tests/cases/conformance/node/nodePackageSelfNameScoped.ts] ////
//// [index.ts]
// esm format file
import * as self from "@scope/package";
self;
//// [index.mts]
// esm format file
import * as self from "@scope/package";
self;
//// [index.cts]
// cjs format file
import * as self from "@scope/package";
self;
//// [package.json]
{
"name": "@scope/package",
"private": true,
"type": "module",
"exports": "./index.js"
}
//// [index.js]
// esm format file
import * as self from "@scope/package";
self;
//// [index.mjs]
// esm format file
import * as self from "@scope/package";
self;
//// [index.cjs]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
// cjs format file
const self = __importStar(require("@scope/package"));
self;
//// [index.d.ts]
export {};
//// [index.d.mts]
export {};
//// [index.d.cts]
export {};

View file

@ -0,0 +1,24 @@
=== tests/cases/conformance/node/index.ts ===
// esm format file
import * as self from "@scope/package";
>self : Symbol(self, Decl(index.ts, 1, 6))
self;
>self : Symbol(self, Decl(index.ts, 1, 6))
=== tests/cases/conformance/node/index.mts ===
// esm format file
import * as self from "@scope/package";
>self : Symbol(self, Decl(index.mts, 1, 6))
self;
>self : Symbol(self, Decl(index.mts, 1, 6))
=== tests/cases/conformance/node/index.cts ===
// cjs format file
import * as self from "@scope/package";
>self : Symbol(self, Decl(index.cts, 1, 6))
self;
>self : Symbol(self, Decl(index.cts, 1, 6))

View file

@ -0,0 +1,24 @@
=== tests/cases/conformance/node/index.ts ===
// esm format file
import * as self from "@scope/package";
>self : typeof self
self;
>self : typeof self
=== tests/cases/conformance/node/index.mts ===
// esm format file
import * as self from "@scope/package";
>self : typeof self
self;
>self : typeof self
=== tests/cases/conformance/node/index.cts ===
// cjs format file
import * as self from "@scope/package";
>self : typeof self
self;
>self : typeof self

View file

@ -0,0 +1,24 @@
tests/cases/conformance/node/index.cts(2,23): error TS1471: Module '@scope/package' cannot be imported using this construct. The specifier only resolves to an ES module, which cannot be imported synchronously. Use dynamic import instead.
==== tests/cases/conformance/node/index.ts (0 errors) ====
// esm format file
import * as self from "@scope/package";
self;
==== tests/cases/conformance/node/index.mts (0 errors) ====
// esm format file
import * as self from "@scope/package";
self;
==== tests/cases/conformance/node/index.cts (1 errors) ====
// cjs format file
import * as self from "@scope/package";
~~~~~~~~~~~~~~~~
!!! error TS1471: Module '@scope/package' cannot be imported using this construct. The specifier only resolves to an ES module, which cannot be imported synchronously. Use dynamic import instead.
self;
==== tests/cases/conformance/node/package.json (0 errors) ====
{
"name": "@scope/package",
"private": true,
"type": "module",
"exports": "./index.js"
}

View file

@ -0,0 +1,63 @@
//// [tests/cases/conformance/node/nodePackageSelfNameScoped.ts] ////
//// [index.ts]
// esm format file
import * as self from "@scope/package";
self;
//// [index.mts]
// esm format file
import * as self from "@scope/package";
self;
//// [index.cts]
// cjs format file
import * as self from "@scope/package";
self;
//// [package.json]
{
"name": "@scope/package",
"private": true,
"type": "module",
"exports": "./index.js"
}
//// [index.js]
// esm format file
import * as self from "@scope/package";
self;
//// [index.mjs]
// esm format file
import * as self from "@scope/package";
self;
//// [index.cjs]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
// cjs format file
const self = __importStar(require("@scope/package"));
self;
//// [index.d.ts]
export {};
//// [index.d.mts]
export {};
//// [index.d.cts]
export {};

View file

@ -0,0 +1,24 @@
=== tests/cases/conformance/node/index.ts ===
// esm format file
import * as self from "@scope/package";
>self : Symbol(self, Decl(index.ts, 1, 6))
self;
>self : Symbol(self, Decl(index.ts, 1, 6))
=== tests/cases/conformance/node/index.mts ===
// esm format file
import * as self from "@scope/package";
>self : Symbol(self, Decl(index.mts, 1, 6))
self;
>self : Symbol(self, Decl(index.mts, 1, 6))
=== tests/cases/conformance/node/index.cts ===
// cjs format file
import * as self from "@scope/package";
>self : Symbol(self, Decl(index.cts, 1, 6))
self;
>self : Symbol(self, Decl(index.cts, 1, 6))

View file

@ -0,0 +1,24 @@
=== tests/cases/conformance/node/index.ts ===
// esm format file
import * as self from "@scope/package";
>self : typeof self
self;
>self : typeof self
=== tests/cases/conformance/node/index.mts ===
// esm format file
import * as self from "@scope/package";
>self : typeof self
self;
>self : typeof self
=== tests/cases/conformance/node/index.cts ===
// cjs format file
import * as self from "@scope/package";
>self : typeof self
self;
>self : typeof self

View file

@ -0,0 +1,21 @@
// @module: node12,nodenext
// @declaration: true
// @filename: index.ts
// esm format file
import * as self from "@scope/package";
self;
// @filename: index.mts
// esm format file
import * as self from "@scope/package";
self;
// @filename: index.cts
// cjs format file
import * as self from "@scope/package";
self;
// @filename: package.json
{
"name": "@scope/package",
"private": true,
"type": "module",
"exports": "./index.js"
}