@rollup/plugin-virtual: TS2349: This expression is not callable under modern "moduleResolution": "NodeNext"

Aperta Adatta ai principianti
#2,024 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
82/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
javascript, typescript

Direzione di ricerca

Inizia con packages/virtual/package.json e packages/virtual/types/index.d.ts, quindi esamina l’import NodeNext nel contesto src/index.ts indicato. Verifica le mappature dei tipi import e require del package compilando l’esempio con impostazioni moderne di TypeScript; l’attività è completata quando l’import predefinito viene riconosciuto come chiamabile senza TS2349.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

  • Rollup Plugin Name: @rollup/plugin-virtual
  • Rollup Plugin Version: latest
  • Rollup Version: latest
  • Operating System (or Browser): macOS
  • Node Version: v24.18.0
  • Link to reproduction (⚠️ read below): I'm providing the exact type error context below. This is a static type resolution failure in TypeScript rather than a runtime execution bug.
Expected Behavior

When importing the plugin into a project using modern TypeScript settings ("moduleResolution": "NodeNext" or "Node16"), the default import should be recognized as a callable function:

import virtual from '@rollup/plugin-virtual';

export default {
  plugins: [
    virtual({ 'virtual-module': 'export default "hello";' })
  ]
};
Actual Behavior

The TypeScript compiler throws a compilation error preventing the build from running:

src/index.ts:59:13 - error TS2349: This expression is not callable.
  Type 'typeof import(".../node_modules/@rollup/plugin-virtual/types/index")' has no call signatures.

59             virtual({
               ~~~~~~~
Additional Information

The issue stems from a combination of the package layout configuration inside packages/virtual/package.json and packages/virtual/types/index.d.ts.

Why this happens

The plugin's package.json exports a single top-level typings statement:

"exports": {
  "types": "./types/index.d.ts",
  "import": "./dist/es/index.js",
  "default": "./dist/cjs/index.js"
}

Because the package does not explicitly include "type": "module", TypeScript's NodeNext engine treats ./types/index.d.ts as a CommonJS declaration file.

Under a CommonJS environment interpretation, TypeScript reads export default function virtual as an object property wrapper ({ default: function }) instead of a root-level callable default function export. As a result, the default import resolves to the module namespace object instead of the callable function, breaking execution under strict TypeScript configurations.

Fix

Provide separate type mappings for ESM and CJS hooks within exports so TypeScript evaluates them in their matching format context:

  1. Copy packages/virtual/types/index.d.ts to a dedicated .d.mts version.
  2. Update the exports configuration block in packages/virtual/package.json:
    "exports": {
      "import": {
        "types": "./types/index.d.mts",
        "default": "./dist/es/index.js"
      },
      "require": {
        "types": "./types/index.d.ts",
        "default": "./dist/cjs/index.js"
      }
    }
    
Lingua principale
JavaScript
Stelle
3.8k
Fork
635
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di rollup/plugins

Tutte le issue di rollup/plugins

Issue simili

Altre issue su JavaScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.