diff --git a/.changeset/witty-kiwis-divide.md b/.changeset/witty-kiwis-divide.md new file mode 100644 index 000000000..dbdf36c19 --- /dev/null +++ b/.changeset/witty-kiwis-divide.md @@ -0,0 +1,5 @@ +--- +'svelte2tsx': patch +--- + +fix: respect moduleResolution setting in emitDts diff --git a/.gitignore b/.gitignore index dce9dc14c..c9b203571 100644 --- a/.gitignore +++ b/.gitignore @@ -33,7 +33,7 @@ bower_components build/Release # Dependency directories -node_modules/ +/node_modules/ jspm_packages/ # TypeScript v1 declaration files diff --git a/packages/svelte2tsx/.gitignore b/packages/svelte2tsx/.gitignore index 0603455f4..2aff21825 100644 --- a/packages/svelte2tsx/.gitignore +++ b/packages/svelte2tsx/.gitignore @@ -1,5 +1,6 @@ .DS_Store -node_modules +/node_modules +/test/emitDts/samples/cross-package-generic-types/node_modules/.svelte2tsx-language-server-files /index.js /index.js.map /index.mjs diff --git a/packages/svelte2tsx/src/emitDts.ts b/packages/svelte2tsx/src/emitDts.ts index fb312a36d..9c41a4e60 100644 --- a/packages/svelte2tsx/src/emitDts.ts +++ b/packages/svelte2tsx/src/emitDts.ts @@ -112,8 +112,11 @@ function loadTsconfig(config: EmitDtsConfig, svelteMap: SvelteMap) { ...options, noEmit: false, // Set to true in case of jsconfig, force false, else nothing is emitted moduleResolution: - // NodeJS: up to 4.9, Node10: since 5.0 - (ts.ModuleResolutionKind as any).NodeJs ?? ts.ModuleResolutionKind.Node10, // Classic if not set, which gives wrong results + options.moduleResolution && + options.moduleResolution !== ts.ModuleResolutionKind.Classic + ? options.moduleResolution + : // NodeJS: up to 4.9, Node10: since 5.0 + ((ts.ModuleResolutionKind as any).NodeJs ?? ts.ModuleResolutionKind.Node10), // Classic if not set, which gives wrong results declaration: true, // Needed for d.ts file generation emitDeclarationOnly: true, // We only want d.ts file generation declarationDir: config.declarationDir, // Where to put the declarations diff --git a/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/expected/consumer.d.ts b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/expected/consumer.d.ts new file mode 100644 index 000000000..1645e48b6 --- /dev/null +++ b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/expected/consumer.d.ts @@ -0,0 +1,13 @@ +import { GenericToken } from 'test-package'; +export declare class MyService { + private name; + constructor(name: string); + getName(): string; +} +export declare const SERVICE_TOKEN: GenericToken; +export declare const ANNOTATED_TOKEN: GenericToken; +export declare const ASSERTION_TOKEN: GenericToken; +export declare class AnotherService { + value: number; +} +export declare const ANOTHER_TOKEN: GenericToken; diff --git a/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/expected/index.d.ts b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/expected/index.d.ts new file mode 100644 index 000000000..7baccd565 --- /dev/null +++ b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/expected/index.d.ts @@ -0,0 +1 @@ +export * from './consumer.js'; diff --git a/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/node_modules/test-package/not-at-root/index.d.ts b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/node_modules/test-package/not-at-root/index.d.ts new file mode 100644 index 000000000..5e1c39b8e --- /dev/null +++ b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/node_modules/test-package/not-at-root/index.d.ts @@ -0,0 +1,4 @@ +export class GenericToken { + constructor(name: string); + t: T +} \ No newline at end of file diff --git a/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/node_modules/test-package/package.json b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/node_modules/test-package/package.json new file mode 100644 index 000000000..6889da7bc --- /dev/null +++ b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/node_modules/test-package/package.json @@ -0,0 +1,10 @@ +{ + "name": "test-package", + "version": "1.0.0", + "type": "module", + "exports": { + ".": { + "types": "./not-at-root/index.d.ts" + } + } +} diff --git a/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/package.json b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/package.json new file mode 100644 index 000000000..057c14fd3 --- /dev/null +++ b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/package.json @@ -0,0 +1,8 @@ +{ + "name": "test-cross-package-generics", + "version": "0.0.1", + "type": "module", + "dependencies": { + "test-package": "1.0.0" + } +} diff --git a/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/src/consumer.ts b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/src/consumer.ts new file mode 100644 index 000000000..8422175e5 --- /dev/null +++ b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/src/consumer.ts @@ -0,0 +1,21 @@ +import { GenericToken } from 'test-package'; + +export class MyService { + constructor(private name: string) {} + getName() { return this.name; } +} + +// This should preserve the generic type as GenericToken +// Before the fix, this would be compiled as 'any' due to module resolution issues +export const SERVICE_TOKEN = new GenericToken('MyService'); + +// These explicit annotations should work regardless +export const ANNOTATED_TOKEN: GenericToken = new GenericToken('MyService'); +export const ASSERTION_TOKEN = new GenericToken('MyService') as GenericToken; + +// Test with different generic types +export class AnotherService { + value = 42; +} + +export const ANOTHER_TOKEN = new GenericToken('AnotherService'); diff --git a/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/src/index.ts b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/src/index.ts new file mode 100644 index 000000000..420f99b48 --- /dev/null +++ b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/src/index.ts @@ -0,0 +1,2 @@ +export * from './consumer.js'; + diff --git a/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/tsconfig.json b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/tsconfig.json new file mode 100644 index 000000000..e6d389435 --- /dev/null +++ b/packages/svelte2tsx/test/emitDts/samples/cross-package-generic-types/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM"], + "module": "ESNext", + "moduleResolution": "bundler", + "declaration": true, + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true + }, + "include": ["src/**/*"] +}