uuidjs/uuid

Bundling for Node.js fails with @rollup/plugin-node-resolve>=11.0.0

josias-r opened this issue ยท 6 comments

Describe the bug

Your source code checks for something like this: typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); to find out whether crypto is available.

I'm not sure exactly where it goes wrong, but this package inside a compiled js file with rollup, will never import crypto and only check the globals like mentioned above.

How to reproduce

With rollup and the following rollup.config, compile a file that uses "uuid":

import typescript from "@rollup/plugin-typescript";
import commonjs from "@rollup/plugin-commonjs";
import nodeResolve from "@rollup/plugin-node-resolve";
import json from "@rollup/plugin-json";

export default {
  input: ["myfile.ts"],
  output: {
    dir: "dist",
    format: "cjs",
  },
  plugins: [
    commonjs(),
    nodeResolve(),
    json(),
    typescript(),
  ],
};

myfile.ts

import { v4 as uuidv4 } from "uuid";
console.log(uuidv4());

Expected behavior

The example should have something like const crypto = require("crypto") somewhere in the compiled code. Currently, it only checks whether it is available globally, but in my use case I'm not in a browser environment, but a nodejs environment, so it would need to get imported to work.

As a note: I can see from the source that rng.js seems to be set-up correctly, but rng-browser.js is doing the unsupported check in a node environment. So the question really is, why I'm getting the browser package instead of the node one. Can I control this? (rollup is already set-up for node, aka cjs)

@josias-r seems like you discovered a bug with the most recent version of @rollup/plugin-node-resolve, see rollup/plugins#695

I suggest you watch that issue for updates. Until then you can downgrade to @rollup/plugin-node-resolve@10.0.0 and should be good to go.

You need to specify nodeResolve({exportConditions: ["node"]}) as node is not one of the default conditions, see the documentation: https://github.com/rollup/plugins/tree/master/packages/node-resolve#exportconditions

@ctavan @lukastaegert Thank you guys, this resolved my issue! The docs you linked don't really show node as an option, so I would have never thought of that.

Why exactly this was not the behaviour in an old version/what exactly is going on I still don't fully understand, but I'll watch the other issue for that sake ๐Ÿ˜„

Keeping this open until rollup/plugins#695 has settled.

I got bit by this issue as well, when bundling uuid for Node.js with @rollup/plugin-node-resolve>=11.0.0.

You need to specify nodeResolve({exportConditions: ["node"]}) as node is not one of the default conditions, see the documentation: https://github.com/rollup/plugins/tree/master/packages/node-resolve#exportconditions

"node" isn't listed as a value in those docs (at least at the time of writing; sounds like the docs will be updated soon) but I can confirm this fix worked for me, so thank you!

Great to see that this has been resolved. I've proposed a PR to clarify the solution in the rollup plugin docs: rollup/plugins#884

I'll already close this one since it is not a problem with the uuid library.