From 28ff08f4191d439acbcadc791cff54f1766b28c7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:31:22 +0000 Subject: [PATCH 1/3] Initial plan From 7a274f5a157d3d972dd69d696402534806a6af99 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:41:10 +0000 Subject: [PATCH 2/3] Add regression coverage for resolved scripts and ambient wildcard modules Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- ...nAmbientModuleResolvedNonModule.errors.txt | 54 ++++++++++++++++++ ...ternAmbientModuleResolvedNonModule.symbols | 57 +++++++++++++++++++ ...atternAmbientModuleResolvedNonModule.types | 57 +++++++++++++++++++ .../patternAmbientModuleResolvedNonModule.ts | 45 +++++++++++++++ 4 files changed, 213 insertions(+) create mode 100644 tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.errors.txt create mode 100644 tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.symbols create mode 100644 tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.types create mode 100644 tsc/testdata/tests/cases/compiler/patternAmbientModuleResolvedNonModule.ts diff --git a/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.errors.txt b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.errors.txt new file mode 100644 index 0000000000000..0f78712d8b755 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.errors.txt @@ -0,0 +1,54 @@ +/src/main.ts(2,7): error TS2322: Type 'number' is not assignable to type 'string'. +/src/main.ts(5,7): error TS2322: Type 'number' is not assignable to type 'string'. + + +==== /tsconfig.json (0 errors) ==== + { + "compilerOptions": { + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "types": [], + "paths": { + "script.svelte": ["./stub.d.ts"], + "module.svelte": ["./module.d.ts"] + }, + "rootDirs": ["./src", "./generated"] + }, + "files": ["ambient.d.ts", "src/main.ts"] + } + +==== /ambient.d.ts (0 errors) ==== + declare module "*.svelte" { + const c: number; + export default c; + } + +==== /src/main.ts (2 errors) ==== + import script from "script.svelte"; + const scriptValue: string = script; + ~~~~~~~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'string'. + + import relative from "./relative.svelte"; + const relativeValue: string = relative; + ~~~~~~~~~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'string'. + + import resolved from "module.svelte"; + const resolvedValue: string = resolved; + + import missing from "missing.svelte"; + const missingValue: number = missing; + +==== /stub.d.ts (0 errors) ==== + // A script, not a module. + +==== /generated/relative.svelte.d.ts (0 errors) ==== + // A script, not a module. + +==== /module.d.ts (0 errors) ==== + declare const c: string; + export default c; + \ No newline at end of file diff --git a/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.symbols b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.symbols new file mode 100644 index 0000000000000..f535dfa61c5f0 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.symbols @@ -0,0 +1,57 @@ +//// [tests/cases/compiler/patternAmbientModuleResolvedNonModule.ts] //// + +=== /ambient.d.ts === +declare module "*.svelte" { +>"*.svelte" : Symbol("*.svelte", Decl(ambient.d.ts, 0, 0)) + + const c: number; +>c : Symbol(c, Decl(ambient.d.ts, 1, 9)) + + export default c; +>c : Symbol(c, Decl(ambient.d.ts, 1, 9)) +} + +=== /src/main.ts === +import script from "script.svelte"; +>script : Symbol(script, Decl(main.ts, 0, 6)) + +const scriptValue: string = script; +>scriptValue : Symbol(scriptValue, Decl(main.ts, 1, 5)) +>script : Symbol(script, Decl(main.ts, 0, 6)) + +import relative from "./relative.svelte"; +>relative : Symbol(relative, Decl(main.ts, 3, 6)) + +const relativeValue: string = relative; +>relativeValue : Symbol(relativeValue, Decl(main.ts, 4, 5)) +>relative : Symbol(relative, Decl(main.ts, 3, 6)) + +import resolved from "module.svelte"; +>resolved : Symbol(resolved, Decl(main.ts, 6, 6)) + +const resolvedValue: string = resolved; +>resolvedValue : Symbol(resolvedValue, Decl(main.ts, 7, 5)) +>resolved : Symbol(resolved, Decl(main.ts, 6, 6)) + +import missing from "missing.svelte"; +>missing : Symbol(missing, Decl(main.ts, 9, 6)) + +const missingValue: number = missing; +>missingValue : Symbol(missingValue, Decl(main.ts, 10, 5)) +>missing : Symbol(missing, Decl(main.ts, 9, 6)) + +=== /stub.d.ts === + +// A script, not a module. + +=== /generated/relative.svelte.d.ts === + +// A script, not a module. + +=== /module.d.ts === +declare const c: string; +>c : Symbol(c, Decl(module.d.ts, 0, 13)) + +export default c; +>c : Symbol(c, Decl(module.d.ts, 0, 13)) + diff --git a/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.types b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.types new file mode 100644 index 0000000000000..704fc85e9f6fa --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.types @@ -0,0 +1,57 @@ +//// [tests/cases/compiler/patternAmbientModuleResolvedNonModule.ts] //// + +=== /ambient.d.ts === +declare module "*.svelte" { +>"*.svelte" : typeof import("*.svelte") + + const c: number; +>c : number + + export default c; +>c : number +} + +=== /src/main.ts === +import script from "script.svelte"; +>script : number + +const scriptValue: string = script; +>scriptValue : string +>script : number + +import relative from "./relative.svelte"; +>relative : number + +const relativeValue: string = relative; +>relativeValue : string +>relative : number + +import resolved from "module.svelte"; +>resolved : string + +const resolvedValue: string = resolved; +>resolvedValue : string +>resolved : string + +import missing from "missing.svelte"; +>missing : number + +const missingValue: number = missing; +>missingValue : number +>missing : number + +=== /stub.d.ts === + +// A script, not a module. + +=== /generated/relative.svelte.d.ts === + +// A script, not a module. + +=== /module.d.ts === +declare const c: string; +>c : string + +export default c; +>c : string + diff --git a/tsc/testdata/tests/cases/compiler/patternAmbientModuleResolvedNonModule.ts b/tsc/testdata/tests/cases/compiler/patternAmbientModuleResolvedNonModule.ts new file mode 100644 index 0000000000000..33bb907a30eeb --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/patternAmbientModuleResolvedNonModule.ts @@ -0,0 +1,45 @@ +// @filename: /tsconfig.json +{ + "compilerOptions": { + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "types": [], + "paths": { + "script.svelte": ["./stub.d.ts"], + "module.svelte": ["./module.d.ts"] + }, + "rootDirs": ["./src", "./generated"] + }, + "files": ["ambient.d.ts", "src/main.ts"] +} + +// @filename: /ambient.d.ts +declare module "*.svelte" { + const c: number; + export default c; +} + +// @filename: /stub.d.ts +// A script, not a module. + +// @filename: /generated/relative.svelte.d.ts +// A script, not a module. + +// @filename: /module.d.ts +declare const c: string; +export default c; + +// @filename: /src/main.ts +import script from "script.svelte"; +const scriptValue: string = script; + +import relative from "./relative.svelte"; +const relativeValue: string = relative; + +import resolved from "module.svelte"; +const resolvedValue: string = resolved; + +import missing from "missing.svelte"; +const missingValue: number = missing; From a77c8dfe5e1502d42335766d32d8fb1c1f4a004c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:45:10 +0000 Subject: [PATCH 3/3] Preserve TS2306 for resolved non-module files before wildcard fallback Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- tsc/internal/checker/checker.go | 4 ---- .../patternAmbientModuleResolvedNonModule.errors.txt | 12 ++++++------ .../patternAmbientModuleResolvedNonModule.types | 8 ++++---- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/tsc/internal/checker/checker.go b/tsc/internal/checker/checker.go index 10ddb3c0c88b4..acea094205ac5 100644 --- a/tsc/internal/checker/checker.go +++ b/tsc/internal/checker/checker.go @@ -15695,10 +15695,6 @@ func (c *Checker) resolveExternalModule( } return c.tryResolvePatternAmbientModule(c.getMergedSymbol(sourceFile.Symbol), moduleReference, importAttributesType) } - patternAmbientModule := c.tryResolvePatternAmbientModule(nil /*resolvedSymbol*/, moduleReference, importAttributesType) - if patternAmbientModule != nil { - return patternAmbientModule - } if errorNode != nil && moduleNotFoundError != nil && !isSideEffectImport(errorNode) { c.error(errorNode, diagnostics.File_0_is_not_a_module, resolvedModule.ResolvedFileName) } diff --git a/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.errors.txt b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.errors.txt index 0f78712d8b755..8edf3449ff885 100644 --- a/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.errors.txt +++ b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.errors.txt @@ -1,5 +1,5 @@ -/src/main.ts(2,7): error TS2322: Type 'number' is not assignable to type 'string'. -/src/main.ts(5,7): error TS2322: Type 'number' is not assignable to type 'string'. +/src/main.ts(1,20): error TS2306: File '/stub.d.ts' is not a module. +/src/main.ts(4,22): error TS2306: File '/generated/relative.svelte.d.ts' is not a module. ==== /tsconfig.json (0 errors) ==== @@ -27,14 +27,14 @@ ==== /src/main.ts (2 errors) ==== import script from "script.svelte"; + ~~~~~~~~~~~~~~~ +!!! error TS2306: File '/stub.d.ts' is not a module. const scriptValue: string = script; - ~~~~~~~~~~~ -!!! error TS2322: Type 'number' is not assignable to type 'string'. import relative from "./relative.svelte"; + ~~~~~~~~~~~~~~~~~~~ +!!! error TS2306: File '/generated/relative.svelte.d.ts' is not a module. const relativeValue: string = relative; - ~~~~~~~~~~~~~ -!!! error TS2322: Type 'number' is not assignable to type 'string'. import resolved from "module.svelte"; const resolvedValue: string = resolved; diff --git a/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.types b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.types index 704fc85e9f6fa..d740bb708900d 100644 --- a/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.types +++ b/tsc/testdata/baselines/reference/compiler/patternAmbientModuleResolvedNonModule.types @@ -13,18 +13,18 @@ declare module "*.svelte" { === /src/main.ts === import script from "script.svelte"; ->script : number +>script : any const scriptValue: string = script; >scriptValue : string ->script : number +>script : any import relative from "./relative.svelte"; ->relative : number +>relative : any const relativeValue: string = relative; >relativeValue : string ->relative : number +>relative : any import resolved from "module.svelte"; >resolved : string