plugins icon indicating copy to clipboard operation
plugins copied to clipboard

[@rollup/plugin-node-resolve] Not adding `.js` suffix while importing from an external library's subpath without `exports` field

Open satouriko opened this issue 1 year ago • 0 comments

  • Rollup Plugin Name: @rollup/plugin-node-resolve
  • Rollup Plugin Version: 16.0.1
  • Rollup Version: 4.36.0
  • Operating System (or Browser):
  • Node Version: 22.14.0
  • Link to reproduction (⚠️ read below): https://stackblitz.com/edit/stackblitz-starters-facgs1lr
import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import json from '@rollup/plugin-json';
import typescript from '@rollup/plugin-typescript';
import del from 'rollup-plugin-delete';

export default {
  input: './src/index.ts',
  output: {
    dir: './lib',
    preserveModules: true,
    preserveModulesRoot: 'src',
    sourcemap: true,
  },
  external: [/node_modules/],
  plugins: [
    commonjs(),
    resolve({ preferBuiltins: true }),
    json(),
    typescript(),
    del({
      targets: 'lib/*',
      runOnce: true,
    }),
  ],
};

Given an import like, with node_modules set external,

import stringify from 'qs/lib/stringify';

Expected Behavior

Since this is an esm output, and the library qs doesn't have an exports field in its package.json. To mimic and comply with node's behavior, I believe an expected output should be

import stringify from 'qs/lib/stringify.js';

Actual Behavior

it produces, which would fail on node execution

import stringify from 'qs/lib/stringify';

Additional Information

satouriko avatar Mar 21 '25 04:03 satouriko