From e10d74ca839539a7d6f8b78fc263dd0a6037fcdb Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 23 Jan 2024 13:31:15 -0800 Subject: [PATCH] Deprioritize declaration emit paths from baseUrl containing node_modules (#57145) --- src/compiler/moduleSpecifiers.ts | 11 +++- .../declarationEmitMonorepoBaseUrl.js | 63 +++++++++++++++++++ .../declarationEmitMonorepoBaseUrl.ts | 57 +++++++++++++++++ 3 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/declarationEmitMonorepoBaseUrl.js create mode 100644 tests/cases/compiler/declarationEmitMonorepoBaseUrl.ts diff --git a/src/compiler/moduleSpecifiers.ts b/src/compiler/moduleSpecifiers.ts index 9801e54397c0f..b252e71eb485f 100644 --- a/src/compiler/moduleSpecifiers.ts +++ b/src/compiler/moduleSpecifiers.ts @@ -437,7 +437,16 @@ function computeModuleSpecifiers( redirectPathsSpecifiers = append(redirectPathsSpecifiers, local); } else if (pathIsBareSpecifier(local)) { - pathsSpecifiers = append(pathsSpecifiers, local); + if (pathContainsNodeModules(local)) { + // We could be in this branch due to inappropriate use of `baseUrl`, not intentional `paths` + // usage. It's impossible to reason about where to prioritize baseUrl-generated module + // specifiers, but if they contain `/node_modules/`, they're going to trigger a portability + // error, so *at least* don't prioritize those. + relativeSpecifiers = append(relativeSpecifiers, local); + } + else { + pathsSpecifiers = append(pathsSpecifiers, local); + } } else if (forAutoImport || !importedFileIsInNodeModules || modulePath.isInNodeModules) { // Why this extra conditional, not just an `else`? If some path to the file contained diff --git a/tests/baselines/reference/declarationEmitMonorepoBaseUrl.js b/tests/baselines/reference/declarationEmitMonorepoBaseUrl.js new file mode 100644 index 0000000000000..55e699fc7a2ff --- /dev/null +++ b/tests/baselines/reference/declarationEmitMonorepoBaseUrl.js @@ -0,0 +1,63 @@ +//// [tests/cases/compiler/declarationEmitMonorepoBaseUrl.ts] //// + +//// [package.json] +{ + "name": "@babel/parser", + "version": "7.23.6", + "main": "./lib/index.js", + "types": "./typings/babel-parser.d.ts" +} + +//// [babel-parser.d.ts] +export declare function createPlugin(): PluginConfig; +export declare class PluginConfig {} + +//// [package.json] +{ + "name": "@vue/compiler-core", + "version": "3.0.0", + "main": "./src/index.ts", + "dependencies": { + "@babel/parser": "^7.0.0" + } +} + +//// [package.json] +{ + "name": "@vue/compiler-sfc", + "version": "3.0.0", + "main": "./src/index.ts", + "dependencies": { + "@babel/parser": "^7.0.0", + "@vue/compiler-core": "^3.0.0" + } +} + +//// [index.ts] +import { PluginConfig } from "@babel/parser"; + +//// [index.ts] +import { createPlugin } from "@babel/parser"; +export function resolveParserPlugins() { + return [createPlugin()]; +} + + +//// [index.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//// [index.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.resolveParserPlugins = void 0; +const parser_1 = require("@babel/parser"); +function resolveParserPlugins() { + return [(0, parser_1.createPlugin)()]; +} +exports.resolveParserPlugins = resolveParserPlugins; + + +//// [index.d.ts] +export {}; +//// [index.d.ts] +export declare function resolveParserPlugins(): import("@babel/parser").PluginConfig[]; diff --git a/tests/cases/compiler/declarationEmitMonorepoBaseUrl.ts b/tests/cases/compiler/declarationEmitMonorepoBaseUrl.ts new file mode 100644 index 0000000000000..6c661f33939a4 --- /dev/null +++ b/tests/cases/compiler/declarationEmitMonorepoBaseUrl.ts @@ -0,0 +1,57 @@ +// @noTypesAndSymbols: true + +// @Filename: /tsconfig.json +{ + "compilerOptions": { + "module": "nodenext", + "declaration": true, + "outDir": "temp", + "baseUrl": "." + } +} + +// @Filename: /node_modules/.pnpm/@babel+parser@7.23.6/node_modules/@babel/parser/package.json +{ + "name": "@babel/parser", + "version": "7.23.6", + "main": "./lib/index.js", + "types": "./typings/babel-parser.d.ts" +} + +// @Filename: /node_modules/.pnpm/@babel+parser@7.23.6/node_modules/@babel/parser/typings/babel-parser.d.ts +export declare function createPlugin(): PluginConfig; +export declare class PluginConfig {} + +// @Filename: /packages/compiler-core/package.json +{ + "name": "@vue/compiler-core", + "version": "3.0.0", + "main": "./src/index.ts", + "dependencies": { + "@babel/parser": "^7.0.0" + } +} + +// @Filename: /packages/compiler-core/src/index.ts +import { PluginConfig } from "@babel/parser"; + +// @Filename: /packages/compiler-sfc/package.json +{ + "name": "@vue/compiler-sfc", + "version": "3.0.0", + "main": "./src/index.ts", + "dependencies": { + "@babel/parser": "^7.0.0", + "@vue/compiler-core": "^3.0.0" + } +} + +// @Filename: /packages/compiler-sfc/src/index.ts +import { createPlugin } from "@babel/parser"; +export function resolveParserPlugins() { + return [createPlugin()]; +} + +// @link: /node_modules/.pnpm/@babel+parser@7.23.6/node_modules/@babel/parser -> /node_modules/@babel/parser +// @link: /node_modules/.pnpm/@babel+parser@7.23.6/node_modules/@babel/parser -> /packages/compiler-core/node_modules/@babel/parser +// @link: /node_modules/.pnpm/@babel+parser@7.23.6/node_modules/@babel/parser -> /packages/compiler-sfc/node_modules/@babel/parser \ No newline at end of file