diff --git a/packages/virtual/package.json b/packages/virtual/package.json index b9ee38b20..e4e109458 100755 --- a/packages/virtual/package.json +++ b/packages/virtual/package.json @@ -16,8 +16,14 @@ "main": "./dist/cjs/index.js", "module": "./dist/es/index.js", "exports": { - "types": "./types/index.d.ts", - "import": "./dist/es/index.js", + "import": { + "types": "./types/index.d.mts", + "default": "./dist/es/index.js" + }, + "require": { + "types": "./types/index.d.ts", + "default": "./dist/cjs/index.js" + }, "default": "./dist/cjs/index.js" }, "engines": { @@ -35,7 +41,7 @@ "pretest": "pnpm build", "release": "pnpm --workspace-root package:release $(pwd)", "test": "vitest --config ../../.config/vitest.config.mts run", - "test:ts": "tsc --noEmit" + "test:ts": "tsc --noEmit && vitest --config ../../.config/vitest.config.mts run test/types.test.js" }, "files": [ "dist", diff --git a/packages/virtual/test/fixtures/types/commonjs.cts b/packages/virtual/test/fixtures/types/commonjs.cts new file mode 100644 index 000000000..a52eb0050 --- /dev/null +++ b/packages/virtual/test/fixtures/types/commonjs.cts @@ -0,0 +1,7 @@ +import type { Plugin } from 'rollup'; +import virtual, { type RollupVirtualOptions } from '@rollup/plugin-virtual'; + +const modules: RollupVirtualOptions = { entry: 'export default 42' }; +const plugin: Plugin = virtual(modules); + +export default plugin; diff --git a/packages/virtual/test/fixtures/types/esm.mts b/packages/virtual/test/fixtures/types/esm.mts new file mode 100644 index 000000000..817747060 --- /dev/null +++ b/packages/virtual/test/fixtures/types/esm.mts @@ -0,0 +1,15 @@ +import type { Plugin } from 'rollup'; +import virtual, { type RollupVirtualOptions } from '@rollup/plugin-virtual'; + +const modules: RollupVirtualOptions = { entry: 'export default 42' }; +const plugin: Plugin = virtual(modules); + +virtual({}); + +// @ts-expect-error Virtual module sources must be strings. +virtual({ entry: 42 }); + +// @ts-expect-error A module map is required. +virtual(); + +export default plugin; diff --git a/packages/virtual/test/fixtures/types/legacy.ts b/packages/virtual/test/fixtures/types/legacy.ts new file mode 100644 index 000000000..1d336c23d --- /dev/null +++ b/packages/virtual/test/fixtures/types/legacy.ts @@ -0,0 +1,8 @@ +import type { Plugin } from 'rollup'; + +import virtual, { type RollupVirtualOptions } from '../../..'; + +const modules: RollupVirtualOptions = { entry: 'export default 42' }; +const plugin: Plugin = virtual(modules); + +export default plugin; diff --git a/packages/virtual/test/types.test.js b/packages/virtual/test/types.test.js new file mode 100644 index 000000000..8f11fd61e --- /dev/null +++ b/packages/virtual/test/types.test.js @@ -0,0 +1,41 @@ +const path = require('path'); + +const ts = require('typescript'); + +const modes = [ + ['Node16', ts.ModuleKind.Node16, ts.ModuleResolutionKind.Node16], + ['NodeNext', ts.ModuleKind.NodeNext, ts.ModuleResolutionKind.NodeNext] +]; + +function diagnostics(fixture, module, moduleResolution) { + const program = ts.createProgram([path.join(__dirname, 'fixtures', 'types', fixture)], { + esModuleInterop: true, + module, + moduleResolution, + noEmit: true, + skipLibCheck: true, + strict: true, + target: ts.ScriptTarget.ES2019, + types: [] + }); + + return ts + .getPreEmitDiagnostics(program) + .map((diagnostic) => ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')); +} + +for (const [name, module, moduleResolution] of modes) { + test(`supports default imports in ${name} ES modules`, () => { + expect(diagnostics('esm.mts', module, moduleResolution)).toEqual([]); + }); + + test(`supports default imports in ${name} CommonJS modules`, () => { + expect(diagnostics('commonjs.cts', module, moduleResolution)).toEqual([]); + }); +} + +test('supports default imports with legacy Node resolution', () => { + expect(diagnostics('legacy.ts', ts.ModuleKind.CommonJS, ts.ModuleResolutionKind.NodeJs)).toEqual( + [] + ); +}); diff --git a/packages/virtual/types/index.d.mts b/packages/virtual/types/index.d.mts new file mode 100644 index 000000000..f4f8ef1e2 --- /dev/null +++ b/packages/virtual/types/index.d.mts @@ -0,0 +1,4 @@ +export type { RollupVirtualOptions } from './index.js'; + +declare const virtual: typeof import('./index.js').default; +export default virtual;