From 7c2c184adf28c1292d869c741947309b13c04bbc Mon Sep 17 00:00:00 2001 From: Nanditha264 Date: Thu, 1 Oct 2026 11:17:59 +0530 Subject: [PATCH 1/2] Fix TypeScript 7 workspace package detection --- packages/vscode-typescript/src/session.ts | 31 ++- packages/vscode-typescript/src/tsdkPackage.ts | 5 + packages/vscode-typescript/src/util.ts | 2 +- .../test/tsdkPackage.test.ts | 191 +++++++++++++++++- 4 files changed, 213 insertions(+), 16 deletions(-) diff --git a/packages/vscode-typescript/src/session.ts b/packages/vscode-typescript/src/session.ts index 46303606b836f..96a63091ae756 100644 --- a/packages/vscode-typescript/src/session.ts +++ b/packages/vscode-typescript/src/session.ts @@ -15,11 +15,13 @@ import { import { ProjectStatus } from "./projectStatus"; import { setupStatusBar } from "./statusBar"; import { TelemetryReporter } from "./telemetryReporting"; +import { workspacePackageSubpaths } from "./tsdkPackage"; import { getDefaultExePath, getExe, getWorkspaceTsdkConfigValue, getWorkspaceTsdkForPrompt, + pathHasTsserverJs, readNativePreviewConfig, resolveTsdkPath, resolveTsdkPathToExe, @@ -501,15 +503,22 @@ async function getStradaExtensionVersion(extensionId: string, pathToTypescript: async function findWorkspaceNativePreviewPackages(): Promise { const results: DetectedVersion[] = []; for (const folder of vscode.workspace.workspaceFolders ?? []) { - const packagePath = vscode.Uri.joinPath(folder.uri, "node_modules", "@typescript", "native-preview"); - const resolved = await resolveTsdkPathToExe(path.normalize(packagePath.fsPath)); - if (!resolved) continue; - results.push({ - folder, - version: resolved?.version ?? "unknown", - tsdkPath: path.normalize(packagePath.fsPath), - exePath: resolved?.path ?? "", - }); + for (const candidate of workspacePackageSubpaths) { + const packagePath = vscode.Uri.joinPath(folder.uri, ...candidate); + const normalizedPath = path.normalize(packagePath.fsPath); + if (await pathHasTsserverJs(normalizedPath)) { + continue; + } + const resolved = await resolveTsdkPathToExe(normalizedPath); + if (!resolved) continue; + results.push({ + folder, + version: resolved.version ?? "unknown", + tsdkPath: normalizedPath, + exePath: resolved.path ?? "", + }); + break; + } } return results; } @@ -655,7 +664,7 @@ async function promptSelectVersion(context: vscode.ExtensionContext, client: Cli /** * If the workspace has a tsdk setting pending consent, or has - * `@typescript/typescript` installed in node_modules, prompt the user + * TypeScript 7 installed in node_modules, prompt the user * to allow using it. */ export async function promptUseWorkspaceVersion(context: vscode.ExtensionContext): Promise { @@ -694,7 +703,7 @@ export async function promptUseWorkspaceVersion(context: vscode.ExtensionContext } } else { - // No workspace tsdk config, but check if native-preview is installed + // No workspace tsdk config, but check if TypeScript 7 is installed // in the workspace's node_modules. const workspaceVersions = await findWorkspaceNativePreviewPackages(); if (workspaceVersions.length === 0) return; diff --git a/packages/vscode-typescript/src/tsdkPackage.ts b/packages/vscode-typescript/src/tsdkPackage.ts index 29ddf8974c37d..b029542fc4614 100644 --- a/packages/vscode-typescript/src/tsdkPackage.ts +++ b/packages/vscode-typescript/src/tsdkPackage.ts @@ -1,6 +1,11 @@ import module from "node:module"; import path from "node:path"; +export const workspacePackageSubpaths: readonly (readonly string[])[] = [ + ["node_modules", "typescript"], + ["node_modules", "@typescript", "native-preview"], +]; + export function resolvePackageExecutable(packageJsonPath: string, platformPackage: string, exeName: string): string { const require = module.createRequire(packageJsonPath); const platformPackageJson = require.resolve(`@typescript/${platformPackage}/package.json`); diff --git a/packages/vscode-typescript/src/util.ts b/packages/vscode-typescript/src/util.ts index a299423f81948..4b18a296b667f 100644 --- a/packages/vscode-typescript/src/util.ts +++ b/packages/vscode-typescript/src/util.ts @@ -299,7 +299,7 @@ async function getTsdkCandidates(options?: { nativeOnly?: boolean; filter?: (can return candidates.filter(options?.filter ?? (() => true)).sort(compareExplicitConfigValues); } -async function pathHasTsserverJs(tsdkPath: string): Promise { +export async function pathHasTsserverJs(tsdkPath: string): Promise { const resolved = workspaceResolve(tsdkPath); for (const candidate of [vscode.Uri.joinPath(resolved, "tsserver.js"), vscode.Uri.joinPath(resolved, "lib", "tsserver.js")]) { try { diff --git a/packages/vscode-typescript/test/tsdkPackage.test.ts b/packages/vscode-typescript/test/tsdkPackage.test.ts index 5a96fa1246110..045cd8865ab00 100644 --- a/packages/vscode-typescript/test/tsdkPackage.test.ts +++ b/packages/vscode-typescript/test/tsdkPackage.test.ts @@ -3,21 +3,32 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import test, { describe } from "node:test"; -import { resolvePackageExecutable } from "../src/tsdkPackage"; +import { + resolvePackageExecutable, + workspacePackageSubpaths, +} from "../src/tsdkPackage"; const platformPackage = `typescript-${process.platform}-${process.arch}`; +const nativePlatformPackage = `native-preview-${process.platform}-${process.arch}`; const exeSuffix = process.platform === "win32" ? ".exe" : ""; const exeName = `tsc${exeSuffix}`; const nativeExeName = `tsgo${exeSuffix}`; -function createPackage(root: string, relativePath: string): string { +function createPackage(root: string, relativePath: string, packageJson: object = {}): string { const packagePath = path.join(root, relativePath); fs.mkdirSync(packagePath, { recursive: true }); const packageJsonPath = path.join(packagePath, "package.json"); - fs.writeFileSync(packageJsonPath, "{}"); + fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, undefined, 2)); return packageJsonPath; } +function createFile(root: string, relativePath: string, content: string = ""): string { + const filePath = path.join(root, relativePath); + fs.mkdirSync(path.dirname(filePath), { recursive: true }); + fs.writeFileSync(filePath, content); + return filePath; +} + function linkPackage(root: string, relativePath: string, targetPackageJson: string): void { const packagePath = path.join(root, relativePath); fs.mkdirSync(path.dirname(packagePath), { recursive: true }); @@ -75,7 +86,6 @@ describe("tsdk package resolution", { concurrency: true }, () => { platformPath: `node_modules/@typescript/${platformPackage}`, }); - const nativePlatformPackage = `native-preview-${process.platform}-${process.arch}`; testResolution("resolves the native-preview package", { packagePath: "node_modules/@typescript/typescript", platformPath: `node_modules/@typescript/${nativePlatformPackage}`, @@ -127,3 +137,176 @@ describe("tsdk package resolution", { concurrency: true }, () => { ); }); }); + +function findWorkspacePackage(workspaceRoot: string): { packagePath: string; exePath: string; version: string; } | undefined { + for (const subpath of workspacePackageSubpaths) { + const pkgDir = path.join(workspaceRoot, ...subpath); + const pkgJsonPath = path.join(pkgDir, "package.json"); + if (!fs.existsSync(pkgJsonPath)) { + continue; + } + if (fs.existsSync(path.join(pkgDir, "tsserver.js")) || fs.existsSync(path.join(pkgDir, "lib", "tsserver.js"))) { + continue; + } + const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8")); + const name: string = typeof pkgJson.name === "string" ? pkgJson.name : ""; + const baseName = name.startsWith("@") ? name.split("/")[1] : name; + if (!baseName) continue; + const expectedBin = baseName === "typescript" ? "tsc" : "tsgo"; + const exe = `${expectedBin}${process.platform === "win32" ? ".exe" : ""}`; + const platPkg = `${baseName}-${process.platform}-${process.arch}`; + try { + const exePath = resolvePackageExecutable(pkgJsonPath, platPkg, exe); + return { + packagePath: pkgDir, + exePath, + version: typeof pkgJson.version === "string" ? pkgJson.version : "unknown", + }; + } + catch {} + } + return undefined; +} + +describe("workspace TypeScript package detection", { concurrency: true }, () => { + test("detects TypeScript 7 in node_modules/typescript", t => { + const root = createFixture(t); + createPackage(root, "node_modules/typescript", { + name: "typescript", + version: "7.0.2", + bin: { tsc: "./bin/tsc" }, + }); + const platformPkg = createPackage(root, `node_modules/@typescript/${platformPackage}`, { + name: `@typescript/${platformPackage}`, + version: "7.0.2", + }); + createFile(path.dirname(platformPkg), `lib/${exeName}`); + + const detected = findWorkspacePackage(root); + assert.ok(detected); + assert.equal(detected.packagePath, path.join(root, "node_modules", "typescript")); + assert.equal(detected.version, "7.0.2"); + assert.equal(detected.exePath, path.join(root, "node_modules", "@typescript", platformPackage, "lib", exeName)); + }); + + test("detects TypeScript 7 nightly / next in node_modules/typescript", t => { + const root = createFixture(t); + createPackage(root, "node_modules/typescript", { + name: "typescript", + version: "7.1.0-dev.20261001", + bin: { tsc: "./bin/tsc" }, + }); + const platformPkg = createPackage(root, `node_modules/@typescript/${platformPackage}`, { + name: `@typescript/${platformPackage}`, + version: "7.1.0-dev.20261001", + }); + createFile(path.dirname(platformPkg), `lib/${exeName}`); + + const detected = findWorkspacePackage(root); + assert.ok(detected); + assert.equal(detected.packagePath, path.join(root, "node_modules", "typescript")); + assert.equal(detected.version, "7.1.0-dev.20261001"); + }); + + test("does not incorrectly detect TypeScript 5.x as TypeScript 7", t => { + const root = createFixture(t); + createPackage(root, "node_modules/typescript", { + name: "typescript", + version: "5.8.2", + bin: { tsc: "./bin/tsc", tsserver: "./bin/tsserver" }, + }); + createFile(root, "node_modules/typescript/lib/tsserver.js", "// tsserver"); + + const detected = findWorkspacePackage(root); + assert.equal(detected, undefined); + }); + + test("does not incorrectly detect TypeScript 6.x as TypeScript 7", t => { + const root = createFixture(t); + createPackage(root, "node_modules/typescript", { + name: "typescript", + version: "6.0.3", + bin: { tsc: "./bin/tsc", tsserver: "./bin/tsserver" }, + }); + createFile(root, "node_modules/typescript/lib/tsserver.js", "// tsserver"); + + const detected = findWorkspacePackage(root); + assert.equal(detected, undefined); + }); + + test("detects legacy @typescript/native-preview package", t => { + const root = createFixture(t); + createPackage(root, "node_modules/@typescript/native-preview", { + name: "@typescript/native-preview", + version: "7.0.0-dev.20260707.2", + bin: { tsgo: "./bin/tsgo" }, + }); + const platformPkg = createPackage(root, `node_modules/@typescript/${nativePlatformPackage}`, { + name: `@typescript/${nativePlatformPackage}`, + version: "7.0.0-dev.20260707.2", + }); + createFile(path.dirname(platformPkg), `lib/${nativeExeName}`); + + const detected = findWorkspacePackage(root); + assert.ok(detected); + assert.equal(detected.packagePath, path.join(root, "node_modules", "@typescript", "native-preview")); + assert.equal(detected.version, "7.0.0-dev.20260707.2"); + assert.equal(detected.exePath, path.join(root, "node_modules", "@typescript", nativePlatformPackage, "lib", nativeExeName)); + }); + + test("falls back to legacy @typescript/native-preview when node_modules/typescript is TS 5/6", t => { + const root = createFixture(t); + createPackage(root, "node_modules/typescript", { + name: "typescript", + version: "5.7.2", + bin: { tsc: "./bin/tsc" }, + }); + createFile(root, "node_modules/typescript/lib/tsserver.js", "// tsserver"); + + createPackage(root, "node_modules/@typescript/native-preview", { + name: "@typescript/native-preview", + version: "7.0.0-dev.20260707.2", + bin: { tsgo: "./bin/tsgo" }, + }); + const platformPkg = createPackage(root, `node_modules/@typescript/${nativePlatformPackage}`, { + name: `@typescript/${nativePlatformPackage}`, + version: "7.0.0-dev.20260707.2", + }); + createFile(path.dirname(platformPkg), `lib/${nativeExeName}`); + + const detected = findWorkspacePackage(root); + assert.ok(detected); + assert.equal(detected.packagePath, path.join(root, "node_modules", "@typescript", "native-preview")); + assert.equal(detected.version, "7.0.0-dev.20260707.2"); + }); + + test("prefers TypeScript 7 node_modules/typescript over legacy @typescript/native-preview", t => { + const root = createFixture(t); + createPackage(root, "node_modules/typescript", { + name: "typescript", + version: "7.0.2", + bin: { tsc: "./bin/tsc" }, + }); + const platformPkg = createPackage(root, `node_modules/@typescript/${platformPackage}`, { + name: `@typescript/${platformPackage}`, + version: "7.0.2", + }); + createFile(path.dirname(platformPkg), `lib/${exeName}`); + + createPackage(root, "node_modules/@typescript/native-preview", { + name: "@typescript/native-preview", + version: "7.0.0-dev.20260707.2", + bin: { tsgo: "./bin/tsgo" }, + }); + const legacyPlatformPkg = createPackage(root, `node_modules/@typescript/${nativePlatformPackage}`, { + name: `@typescript/${nativePlatformPackage}`, + version: "7.0.0-dev.20260707.2", + }); + createFile(path.dirname(legacyPlatformPkg), `lib/${nativeExeName}`); + + const detected = findWorkspacePackage(root); + assert.ok(detected); + assert.equal(detected.packagePath, path.join(root, "node_modules", "typescript")); + assert.equal(detected.version, "7.0.2"); + }); +}); From 7d88e3170ea7b22480975d1ff4cda9fe7f35c0f8 Mon Sep 17 00:00:00 2001 From: Nanditha264 Date: Thu, 1 Oct 2026 11:48:12 +0530 Subject: [PATCH 2/2] Fix TypeScript 7 workspace package detection --- packages/vscode-typescript/src/session.ts | 6 +- packages/vscode-typescript/src/tsdkPackage.ts | 5 - .../test/tsdkPackage.test.ts | 194 +----------------- 3 files changed, 14 insertions(+), 191 deletions(-) diff --git a/packages/vscode-typescript/src/session.ts b/packages/vscode-typescript/src/session.ts index 96a63091ae756..a9107f3dbc15c 100644 --- a/packages/vscode-typescript/src/session.ts +++ b/packages/vscode-typescript/src/session.ts @@ -15,7 +15,6 @@ import { import { ProjectStatus } from "./projectStatus"; import { setupStatusBar } from "./statusBar"; import { TelemetryReporter } from "./telemetryReporting"; -import { workspacePackageSubpaths } from "./tsdkPackage"; import { getDefaultExePath, getExe, @@ -500,6 +499,11 @@ async function getStradaExtensionVersion(extensionId: string, pathToTypescript: } } +const workspacePackageSubpaths: readonly (readonly string[])[] = [ + ["node_modules", "typescript"], + ["node_modules", "@typescript", "native-preview"], +]; + async function findWorkspaceNativePreviewPackages(): Promise { const results: DetectedVersion[] = []; for (const folder of vscode.workspace.workspaceFolders ?? []) { diff --git a/packages/vscode-typescript/src/tsdkPackage.ts b/packages/vscode-typescript/src/tsdkPackage.ts index b029542fc4614..29ddf8974c37d 100644 --- a/packages/vscode-typescript/src/tsdkPackage.ts +++ b/packages/vscode-typescript/src/tsdkPackage.ts @@ -1,11 +1,6 @@ import module from "node:module"; import path from "node:path"; -export const workspacePackageSubpaths: readonly (readonly string[])[] = [ - ["node_modules", "typescript"], - ["node_modules", "@typescript", "native-preview"], -]; - export function resolvePackageExecutable(packageJsonPath: string, platformPackage: string, exeName: string): string { const require = module.createRequire(packageJsonPath); const platformPackageJson = require.resolve(`@typescript/${platformPackage}/package.json`); diff --git a/packages/vscode-typescript/test/tsdkPackage.test.ts b/packages/vscode-typescript/test/tsdkPackage.test.ts index 045cd8865ab00..9894ade065a3a 100644 --- a/packages/vscode-typescript/test/tsdkPackage.test.ts +++ b/packages/vscode-typescript/test/tsdkPackage.test.ts @@ -3,10 +3,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import test, { describe } from "node:test"; -import { - resolvePackageExecutable, - workspacePackageSubpaths, -} from "../src/tsdkPackage"; +import { resolvePackageExecutable } from "../src/tsdkPackage"; const platformPackage = `typescript-${process.platform}-${process.arch}`; const nativePlatformPackage = `native-preview-${process.platform}-${process.arch}`; @@ -22,13 +19,6 @@ function createPackage(root: string, relativePath: string, packageJson: object = return packageJsonPath; } -function createFile(root: string, relativePath: string, content: string = ""): string { - const filePath = path.join(root, relativePath); - fs.mkdirSync(path.dirname(filePath), { recursive: true }); - fs.writeFileSync(filePath, content); - return filePath; -} - function linkPackage(root: string, relativePath: string, targetPackageJson: string): void { const packagePath = path.join(root, relativePath); fs.mkdirSync(path.dirname(packagePath), { recursive: true }); @@ -86,13 +76,20 @@ describe("tsdk package resolution", { concurrency: true }, () => { platformPath: `node_modules/@typescript/${platformPackage}`, }); - testResolution("resolves the native-preview package", { + testResolution("resolves the @typescript/typescript native-preview package", { packagePath: "node_modules/@typescript/typescript", platformPath: `node_modules/@typescript/${nativePlatformPackage}`, platformPackage: nativePlatformPackage, exeName: nativeExeName, }); + testResolution("resolves the @typescript/native-preview package", { + packagePath: "node_modules/@typescript/native-preview", + platformPath: `node_modules/@typescript/${nativePlatformPackage}`, + platformPackage: nativePlatformPackage, + exeName: nativeExeName, + }); + testResolution("resolves a non-hoisted platform package", { packagePath: "node_modules/@typescript/native", platformPath: `node_modules/@typescript/native/node_modules/@typescript/${platformPackage}`, @@ -137,176 +134,3 @@ describe("tsdk package resolution", { concurrency: true }, () => { ); }); }); - -function findWorkspacePackage(workspaceRoot: string): { packagePath: string; exePath: string; version: string; } | undefined { - for (const subpath of workspacePackageSubpaths) { - const pkgDir = path.join(workspaceRoot, ...subpath); - const pkgJsonPath = path.join(pkgDir, "package.json"); - if (!fs.existsSync(pkgJsonPath)) { - continue; - } - if (fs.existsSync(path.join(pkgDir, "tsserver.js")) || fs.existsSync(path.join(pkgDir, "lib", "tsserver.js"))) { - continue; - } - const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8")); - const name: string = typeof pkgJson.name === "string" ? pkgJson.name : ""; - const baseName = name.startsWith("@") ? name.split("/")[1] : name; - if (!baseName) continue; - const expectedBin = baseName === "typescript" ? "tsc" : "tsgo"; - const exe = `${expectedBin}${process.platform === "win32" ? ".exe" : ""}`; - const platPkg = `${baseName}-${process.platform}-${process.arch}`; - try { - const exePath = resolvePackageExecutable(pkgJsonPath, platPkg, exe); - return { - packagePath: pkgDir, - exePath, - version: typeof pkgJson.version === "string" ? pkgJson.version : "unknown", - }; - } - catch {} - } - return undefined; -} - -describe("workspace TypeScript package detection", { concurrency: true }, () => { - test("detects TypeScript 7 in node_modules/typescript", t => { - const root = createFixture(t); - createPackage(root, "node_modules/typescript", { - name: "typescript", - version: "7.0.2", - bin: { tsc: "./bin/tsc" }, - }); - const platformPkg = createPackage(root, `node_modules/@typescript/${platformPackage}`, { - name: `@typescript/${platformPackage}`, - version: "7.0.2", - }); - createFile(path.dirname(platformPkg), `lib/${exeName}`); - - const detected = findWorkspacePackage(root); - assert.ok(detected); - assert.equal(detected.packagePath, path.join(root, "node_modules", "typescript")); - assert.equal(detected.version, "7.0.2"); - assert.equal(detected.exePath, path.join(root, "node_modules", "@typescript", platformPackage, "lib", exeName)); - }); - - test("detects TypeScript 7 nightly / next in node_modules/typescript", t => { - const root = createFixture(t); - createPackage(root, "node_modules/typescript", { - name: "typescript", - version: "7.1.0-dev.20261001", - bin: { tsc: "./bin/tsc" }, - }); - const platformPkg = createPackage(root, `node_modules/@typescript/${platformPackage}`, { - name: `@typescript/${platformPackage}`, - version: "7.1.0-dev.20261001", - }); - createFile(path.dirname(platformPkg), `lib/${exeName}`); - - const detected = findWorkspacePackage(root); - assert.ok(detected); - assert.equal(detected.packagePath, path.join(root, "node_modules", "typescript")); - assert.equal(detected.version, "7.1.0-dev.20261001"); - }); - - test("does not incorrectly detect TypeScript 5.x as TypeScript 7", t => { - const root = createFixture(t); - createPackage(root, "node_modules/typescript", { - name: "typescript", - version: "5.8.2", - bin: { tsc: "./bin/tsc", tsserver: "./bin/tsserver" }, - }); - createFile(root, "node_modules/typescript/lib/tsserver.js", "// tsserver"); - - const detected = findWorkspacePackage(root); - assert.equal(detected, undefined); - }); - - test("does not incorrectly detect TypeScript 6.x as TypeScript 7", t => { - const root = createFixture(t); - createPackage(root, "node_modules/typescript", { - name: "typescript", - version: "6.0.3", - bin: { tsc: "./bin/tsc", tsserver: "./bin/tsserver" }, - }); - createFile(root, "node_modules/typescript/lib/tsserver.js", "// tsserver"); - - const detected = findWorkspacePackage(root); - assert.equal(detected, undefined); - }); - - test("detects legacy @typescript/native-preview package", t => { - const root = createFixture(t); - createPackage(root, "node_modules/@typescript/native-preview", { - name: "@typescript/native-preview", - version: "7.0.0-dev.20260707.2", - bin: { tsgo: "./bin/tsgo" }, - }); - const platformPkg = createPackage(root, `node_modules/@typescript/${nativePlatformPackage}`, { - name: `@typescript/${nativePlatformPackage}`, - version: "7.0.0-dev.20260707.2", - }); - createFile(path.dirname(platformPkg), `lib/${nativeExeName}`); - - const detected = findWorkspacePackage(root); - assert.ok(detected); - assert.equal(detected.packagePath, path.join(root, "node_modules", "@typescript", "native-preview")); - assert.equal(detected.version, "7.0.0-dev.20260707.2"); - assert.equal(detected.exePath, path.join(root, "node_modules", "@typescript", nativePlatformPackage, "lib", nativeExeName)); - }); - - test("falls back to legacy @typescript/native-preview when node_modules/typescript is TS 5/6", t => { - const root = createFixture(t); - createPackage(root, "node_modules/typescript", { - name: "typescript", - version: "5.7.2", - bin: { tsc: "./bin/tsc" }, - }); - createFile(root, "node_modules/typescript/lib/tsserver.js", "// tsserver"); - - createPackage(root, "node_modules/@typescript/native-preview", { - name: "@typescript/native-preview", - version: "7.0.0-dev.20260707.2", - bin: { tsgo: "./bin/tsgo" }, - }); - const platformPkg = createPackage(root, `node_modules/@typescript/${nativePlatformPackage}`, { - name: `@typescript/${nativePlatformPackage}`, - version: "7.0.0-dev.20260707.2", - }); - createFile(path.dirname(platformPkg), `lib/${nativeExeName}`); - - const detected = findWorkspacePackage(root); - assert.ok(detected); - assert.equal(detected.packagePath, path.join(root, "node_modules", "@typescript", "native-preview")); - assert.equal(detected.version, "7.0.0-dev.20260707.2"); - }); - - test("prefers TypeScript 7 node_modules/typescript over legacy @typescript/native-preview", t => { - const root = createFixture(t); - createPackage(root, "node_modules/typescript", { - name: "typescript", - version: "7.0.2", - bin: { tsc: "./bin/tsc" }, - }); - const platformPkg = createPackage(root, `node_modules/@typescript/${platformPackage}`, { - name: `@typescript/${platformPackage}`, - version: "7.0.2", - }); - createFile(path.dirname(platformPkg), `lib/${exeName}`); - - createPackage(root, "node_modules/@typescript/native-preview", { - name: "@typescript/native-preview", - version: "7.0.0-dev.20260707.2", - bin: { tsgo: "./bin/tsgo" }, - }); - const legacyPlatformPkg = createPackage(root, `node_modules/@typescript/${nativePlatformPackage}`, { - name: `@typescript/${nativePlatformPackage}`, - version: "7.0.0-dev.20260707.2", - }); - createFile(path.dirname(legacyPlatformPkg), `lib/${nativeExeName}`); - - const detected = findWorkspacePackage(root); - assert.ok(detected); - assert.equal(detected.packagePath, path.join(root, "node_modules", "typescript")); - assert.equal(detected.version, "7.0.2"); - }); -});