From ccd8b1d27ed22d0a451fbddab3004da1c618b697 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 15 Jun 2022 11:23:26 -0700 Subject: [PATCH] Allow exports map entries to point at `.ts` source files (#48563) * Probably works * Add tests * Update baselines for module option rename --- ...sExportsSourceTs(module=node16).errors.txt | 34 ++++++++++++++ ...deModulesExportsSourceTs(module=node16).js | 44 +++++++++++++++++++ ...ulesExportsSourceTs(module=node16).symbols | 29 ++++++++++++ ...odulesExportsSourceTs(module=node16).types | 32 ++++++++++++++ ...xportsSourceTs(module=nodenext).errors.txt | 34 ++++++++++++++ ...ModulesExportsSourceTs(module=nodenext).js | 44 +++++++++++++++++++ ...esExportsSourceTs(module=nodenext).symbols | 29 ++++++++++++ ...ulesExportsSourceTs(module=nodenext).types | 32 ++++++++++++++ .../node/nodeModulesExportsSourceTs.ts | 28 ++++++++++++ 9 files changed, 306 insertions(+) create mode 100644 tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).errors.txt create mode 100644 tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).js create mode 100644 tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).symbols create mode 100644 tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).types create mode 100644 tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).errors.txt create mode 100644 tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).js create mode 100644 tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).symbols create mode 100644 tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).types create mode 100644 tests/cases/conformance/node/nodeModulesExportsSourceTs.ts diff --git a/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).errors.txt b/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).errors.txt new file mode 100644 index 0000000000000..959e802d2b54a --- /dev/null +++ b/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).errors.txt @@ -0,0 +1,34 @@ +tests/cases/conformance/node/index.ts(2,23): error TS2307: Cannot find module 'inner/other' or its corresponding type declarations. +tests/cases/conformance/node/index.ts(3,14): error TS2742: The inferred type of 'a' cannot be named without a reference to './node_modules/inner/other.js'. This is likely not portable. A type annotation is necessary. + + +==== tests/cases/conformance/node/index.ts (2 errors) ==== + // esm format file + import { Thing } from "inner/other"; + ~~~~~~~~~~~~~ +!!! error TS2307: Cannot find module 'inner/other' or its corresponding type declarations. + export const a = (await import("inner")).x(); + ~ +!!! error TS2742: The inferred type of 'a' cannot be named without a reference to './node_modules/inner/other.js'. This is likely not portable. A type annotation is necessary. + import {a as a2} from "package"; +==== tests/cases/conformance/node/node_modules/inner/index.ts (0 errors) ==== + // esm format file + export { x } from "./other.js"; +==== tests/cases/conformance/node/node_modules/inner/other.ts (0 errors) ==== + // esm format file + export interface Thing {} + export const x: () => Thing = null as any; +==== tests/cases/conformance/node/package.json (0 errors) ==== + { + "name": "package", + "private": true, + "type": "module", + "exports": "./index.ts" + } +==== tests/cases/conformance/node/node_modules/inner/package.json (0 errors) ==== + { + "name": "inner", + "private": true, + "type": "module", + "exports": "./index.ts" + } \ No newline at end of file diff --git a/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).js b/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).js new file mode 100644 index 0000000000000..b6f1adda8d33c --- /dev/null +++ b/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).js @@ -0,0 +1,44 @@ +//// [tests/cases/conformance/node/nodeModulesExportsSourceTs.ts] //// + +//// [index.ts] +// esm format file +import { Thing } from "inner/other"; +export const a = (await import("inner")).x(); +import {a as a2} from "package"; +//// [index.ts] +// esm format file +export { x } from "./other.js"; +//// [other.ts] +// esm format file +export interface Thing {} +export const x: () => Thing = null as any; +//// [package.json] +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.ts" +} +//// [package.json] +{ + "name": "inner", + "private": true, + "type": "module", + "exports": "./index.ts" +} + +//// [other.js] +export const x = null; +//// [index.js] +// esm format file +export { x } from "./other.js"; +//// [index.js] +export const a = (await import("inner")).x(); + + +//// [other.d.ts] +export interface Thing { +} +export declare const x: () => Thing; +//// [index.d.ts] +export { x } from "./other.js"; diff --git a/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).symbols b/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).symbols new file mode 100644 index 0000000000000..e6baff945e816 --- /dev/null +++ b/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).symbols @@ -0,0 +1,29 @@ +=== tests/cases/conformance/node/index.ts === +// esm format file +import { Thing } from "inner/other"; +>Thing : Symbol(Thing, Decl(index.ts, 1, 8)) + +export const a = (await import("inner")).x(); +>a : Symbol(a, Decl(index.ts, 2, 12)) +>(await import("inner")).x : Symbol(x, Decl(index.ts, 1, 8)) +>"inner" : Symbol("tests/cases/conformance/node/node_modules/inner/index", Decl(index.ts, 0, 0)) +>x : Symbol(x, Decl(index.ts, 1, 8)) + +import {a as a2} from "package"; +>a : Symbol(a, Decl(index.ts, 2, 12)) +>a2 : Symbol(a2, Decl(index.ts, 3, 8)) + +=== tests/cases/conformance/node/node_modules/inner/index.ts === +// esm format file +export { x } from "./other.js"; +>x : Symbol(x, Decl(index.ts, 1, 8)) + +=== tests/cases/conformance/node/node_modules/inner/other.ts === +// esm format file +export interface Thing {} +>Thing : Symbol(Thing, Decl(other.ts, 0, 0)) + +export const x: () => Thing = null as any; +>x : Symbol(x, Decl(other.ts, 2, 12)) +>Thing : Symbol(Thing, Decl(other.ts, 0, 0)) + diff --git a/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).types b/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).types new file mode 100644 index 0000000000000..ad5bbe0a26fdc --- /dev/null +++ b/tests/baselines/reference/nodeModulesExportsSourceTs(module=node16).types @@ -0,0 +1,32 @@ +=== tests/cases/conformance/node/index.ts === +// esm format file +import { Thing } from "inner/other"; +>Thing : any + +export const a = (await import("inner")).x(); +>a : import("tests/cases/conformance/node/node_modules/inner/other").Thing +>(await import("inner")).x() : import("tests/cases/conformance/node/node_modules/inner/other").Thing +>(await import("inner")).x : () => import("tests/cases/conformance/node/node_modules/inner/other").Thing +>(await import("inner")) : typeof import("tests/cases/conformance/node/node_modules/inner/index") +>await import("inner") : typeof import("tests/cases/conformance/node/node_modules/inner/index") +>import("inner") : Promise +>"inner" : "inner" +>x : () => import("tests/cases/conformance/node/node_modules/inner/other").Thing + +import {a as a2} from "package"; +>a : import("tests/cases/conformance/node/node_modules/inner/other").Thing +>a2 : import("tests/cases/conformance/node/node_modules/inner/other").Thing + +=== tests/cases/conformance/node/node_modules/inner/index.ts === +// esm format file +export { x } from "./other.js"; +>x : () => import("tests/cases/conformance/node/node_modules/inner/other").Thing + +=== tests/cases/conformance/node/node_modules/inner/other.ts === +// esm format file +export interface Thing {} +export const x: () => Thing = null as any; +>x : () => Thing +>null as any : any +>null : null + diff --git a/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).errors.txt b/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).errors.txt new file mode 100644 index 0000000000000..959e802d2b54a --- /dev/null +++ b/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).errors.txt @@ -0,0 +1,34 @@ +tests/cases/conformance/node/index.ts(2,23): error TS2307: Cannot find module 'inner/other' or its corresponding type declarations. +tests/cases/conformance/node/index.ts(3,14): error TS2742: The inferred type of 'a' cannot be named without a reference to './node_modules/inner/other.js'. This is likely not portable. A type annotation is necessary. + + +==== tests/cases/conformance/node/index.ts (2 errors) ==== + // esm format file + import { Thing } from "inner/other"; + ~~~~~~~~~~~~~ +!!! error TS2307: Cannot find module 'inner/other' or its corresponding type declarations. + export const a = (await import("inner")).x(); + ~ +!!! error TS2742: The inferred type of 'a' cannot be named without a reference to './node_modules/inner/other.js'. This is likely not portable. A type annotation is necessary. + import {a as a2} from "package"; +==== tests/cases/conformance/node/node_modules/inner/index.ts (0 errors) ==== + // esm format file + export { x } from "./other.js"; +==== tests/cases/conformance/node/node_modules/inner/other.ts (0 errors) ==== + // esm format file + export interface Thing {} + export const x: () => Thing = null as any; +==== tests/cases/conformance/node/package.json (0 errors) ==== + { + "name": "package", + "private": true, + "type": "module", + "exports": "./index.ts" + } +==== tests/cases/conformance/node/node_modules/inner/package.json (0 errors) ==== + { + "name": "inner", + "private": true, + "type": "module", + "exports": "./index.ts" + } \ No newline at end of file diff --git a/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).js b/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).js new file mode 100644 index 0000000000000..b6f1adda8d33c --- /dev/null +++ b/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).js @@ -0,0 +1,44 @@ +//// [tests/cases/conformance/node/nodeModulesExportsSourceTs.ts] //// + +//// [index.ts] +// esm format file +import { Thing } from "inner/other"; +export const a = (await import("inner")).x(); +import {a as a2} from "package"; +//// [index.ts] +// esm format file +export { x } from "./other.js"; +//// [other.ts] +// esm format file +export interface Thing {} +export const x: () => Thing = null as any; +//// [package.json] +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.ts" +} +//// [package.json] +{ + "name": "inner", + "private": true, + "type": "module", + "exports": "./index.ts" +} + +//// [other.js] +export const x = null; +//// [index.js] +// esm format file +export { x } from "./other.js"; +//// [index.js] +export const a = (await import("inner")).x(); + + +//// [other.d.ts] +export interface Thing { +} +export declare const x: () => Thing; +//// [index.d.ts] +export { x } from "./other.js"; diff --git a/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).symbols b/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).symbols new file mode 100644 index 0000000000000..e6baff945e816 --- /dev/null +++ b/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).symbols @@ -0,0 +1,29 @@ +=== tests/cases/conformance/node/index.ts === +// esm format file +import { Thing } from "inner/other"; +>Thing : Symbol(Thing, Decl(index.ts, 1, 8)) + +export const a = (await import("inner")).x(); +>a : Symbol(a, Decl(index.ts, 2, 12)) +>(await import("inner")).x : Symbol(x, Decl(index.ts, 1, 8)) +>"inner" : Symbol("tests/cases/conformance/node/node_modules/inner/index", Decl(index.ts, 0, 0)) +>x : Symbol(x, Decl(index.ts, 1, 8)) + +import {a as a2} from "package"; +>a : Symbol(a, Decl(index.ts, 2, 12)) +>a2 : Symbol(a2, Decl(index.ts, 3, 8)) + +=== tests/cases/conformance/node/node_modules/inner/index.ts === +// esm format file +export { x } from "./other.js"; +>x : Symbol(x, Decl(index.ts, 1, 8)) + +=== tests/cases/conformance/node/node_modules/inner/other.ts === +// esm format file +export interface Thing {} +>Thing : Symbol(Thing, Decl(other.ts, 0, 0)) + +export const x: () => Thing = null as any; +>x : Symbol(x, Decl(other.ts, 2, 12)) +>Thing : Symbol(Thing, Decl(other.ts, 0, 0)) + diff --git a/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).types b/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).types new file mode 100644 index 0000000000000..ad5bbe0a26fdc --- /dev/null +++ b/tests/baselines/reference/nodeModulesExportsSourceTs(module=nodenext).types @@ -0,0 +1,32 @@ +=== tests/cases/conformance/node/index.ts === +// esm format file +import { Thing } from "inner/other"; +>Thing : any + +export const a = (await import("inner")).x(); +>a : import("tests/cases/conformance/node/node_modules/inner/other").Thing +>(await import("inner")).x() : import("tests/cases/conformance/node/node_modules/inner/other").Thing +>(await import("inner")).x : () => import("tests/cases/conformance/node/node_modules/inner/other").Thing +>(await import("inner")) : typeof import("tests/cases/conformance/node/node_modules/inner/index") +>await import("inner") : typeof import("tests/cases/conformance/node/node_modules/inner/index") +>import("inner") : Promise +>"inner" : "inner" +>x : () => import("tests/cases/conformance/node/node_modules/inner/other").Thing + +import {a as a2} from "package"; +>a : import("tests/cases/conformance/node/node_modules/inner/other").Thing +>a2 : import("tests/cases/conformance/node/node_modules/inner/other").Thing + +=== tests/cases/conformance/node/node_modules/inner/index.ts === +// esm format file +export { x } from "./other.js"; +>x : () => import("tests/cases/conformance/node/node_modules/inner/other").Thing + +=== tests/cases/conformance/node/node_modules/inner/other.ts === +// esm format file +export interface Thing {} +export const x: () => Thing = null as any; +>x : () => Thing +>null as any : any +>null : null + diff --git a/tests/cases/conformance/node/nodeModulesExportsSourceTs.ts b/tests/cases/conformance/node/nodeModulesExportsSourceTs.ts new file mode 100644 index 0000000000000..5ca23c1526a0e --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesExportsSourceTs.ts @@ -0,0 +1,28 @@ +// @module: node16,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import { Thing } from "inner/other"; +export const a = (await import("inner")).x(); +import {a as a2} from "package"; +// @filename: node_modules/inner/index.ts +// esm format file +export { x } from "./other.js"; +// @filename: node_modules/inner/other.ts +// esm format file +export interface Thing {} +export const x: () => Thing = null as any; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.ts" +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "type": "module", + "exports": "./index.ts" +} \ No newline at end of file