Skip to content

Plugin doesn't respect optional peerDependencies #2

@anbraten

Description

@anbraten

I have a project using this plugin and mongodb (mongoose) as a dependencies.
Mongodb has mongodb-client-encryption and aws4 as optional peerDependencies:

[...]
 "peerOptionalDependencies": {
    [...]
    "mongodb-client-encryption": "^1.0.0",
     [...]
  },
"peerDependenciesMeta": {
    [...]
    "mongodb-client-encryption": {
      "optional": true
    },
   [...]
    "aws4": {
      "optional": true
    }
  },
[...]

and tries to require them inside a try / catch, so esbuild sends them to this plugin via build.onResolve().

It fails with the following errors:
 > pnp:/home/anton/Projects/pnp-bug/.yarn/$$virtual/ws-virtual-535d9b46ac/0/cache/ws-npm-7.4.3-0b722707c3-493655b7c4.zip/node_modules/ws/lib/buffer-util.js: error: [pnp-plugin] ws tried to access bufferutil (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.

Required package: bufferutil (via "bufferutil")
Required by: ws@virtual:d28d90fcce8f835b192578396e8f5173b2b8b328b7cfef0576840b7a542ac690165edbef41106c1d84e3785afed3d0e0f75720e95cf3e9fc4449f815cf17d425#npm:7.4.3 (via /home/anton/Projects/pnp-bug/.yarn/$$virtual/ws-virtual-535d9b46ac/0/cache/ws-npm-7.4.3-0b722707c3-493655b7c4.zip/node_modules/ws/lib/)
Ancestor breaking the chain: engine.io@npm:4.1.1
Ancestor breaking the chain: jsdom@virtual:51b2d3db5940cbda81797992a2f896453e18927005ba88742e0fe2eeb71cfb090b53a8594298c25967a351a8b709cd58d3612e5feba8c79a7b59ae3338b0722b#npm:16.4.0


    105 │   const bufferUtil = require('bufferutil');
        ╵                              ~~~~~~~~~~~~

 > pnp:/home/anton/Projects/pnp-bug/.yarn/$$virtual/mongodb-virtual-1a6d487e1f/0/cache/mongodb-npm-3.6.3-3206384cb1-85a8064180.zip/node_modules/mongodb/lib/operations/connect.js: error: [pnp-plugin] mongodb tried to access mongodb-client-encryption (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.

Required package: mongodb-client-encryption (via "mongodb-client-encryption")
Required by: mongodb@virtual:4aa8df445eee8963fd8c1f58ef19305d83825503b1218ced8747fba919196c60e8a0029dc817a11e9c3f061c3db32887f679974bfcd5f68685331fd0236da61f#npm:3.6.3 (via /home/anton/Projects/pnp-bug/.yarn/$$virtual/mongodb-virtual-1a6d487e1f/0/cache/mongodb-npm-3.6.3-3206384cb1-85a8064180.zip/node_modules/mongodb/lib/operations/)
Ancestor breaking the chain: mongoose@https://github.com/raphaelschwinger/mongoose.git#commit=734e82191feb2f9b51a946c5b2589f4f55ff61af


    501 │       require.resolve('mongodb-client-encryption');
        ╵                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~

 > pnp:/home/anton/Projects/pnp-bug/.yarn/$$virtual/mongodb-virtual-1a6d487e1f/0/cache/mongodb-npm-3.6.3-3206384cb1-85a8064180.zip/node_modules/mongodb/lib/operations/connect.js: error: [pnp-plugin] mongodb tried to access mongodb-client-encryption (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.

Required package: mongodb-client-encryption (via "mongodb-client-encryption")
Required by: mongodb@virtual:4aa8df445eee8963fd8c1f58ef19305d83825503b1218ced8747fba919196c60e8a0029dc817a11e9c3f061c3db32887f679974bfcd5f68685331fd0236da61f#npm:3.6.3 (via /home/anton/Projects/pnp-bug/.yarn/$$virtual/mongodb-virtual-1a6d487e1f/0/cache/mongodb-npm-3.6.3-3206384cb1-85a8064180.zip/node_modules/mongodb/lib/operations/)
Ancestor breaking the chain: mongoose@https://github.com/raphaelschwinger/mongoose.git#commit=734e82191feb2f9b51a946c5b2589f4f55ff61af


    512 │       let mongodbClientEncryption = require('mongodb-client-encryption');
        ╵                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~

 > pnp:/home/anton/Projects/pnp-bug/.yarn/$$virtual/mongodb-virtual-1a6d487e1f/0/cache/mongodb-npm-3.6.3-3206384cb1-85a8064180.zip/node_modules/mongodb/lib/core/auth/mongodb_aws.js: error: [pnp-plugin] mongodb tried to access aws4 (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.

Required package: aws4 (via "aws4")
Required by: mongodb@virtual:4aa8df445eee8963fd8c1f58ef19305d83825503b1218ced8747fba919196c60e8a0029dc817a11e9c3f061c3db32887f679974bfcd5f68685331fd0236da61f#npm:3.6.3 (via /home/anton/Projects/pnp-bug/.yarn/$$virtual/mongodb-virtual-1a6d487e1f/0/cache/mongodb-npm-3.6.3-3206384cb1-85a8064180.zip/node_modules/mongodb/lib/core/auth/)
Ancestor breaking the chain: mongoose@https://github.com/raphaelschwinger/mongoose.git#commit=734e82191feb2f9b51a946c5b2589f4f55ff61af

    12 │   aws4 = require('aws4');

I currently worked around it by defining mongodb-client-encryption and aws4 as externals for this plugin, but IMO this should be somehow handled by the plugin automatically. Maybe some check like is this dependency optional then just show a warning instead of throwing an error would be a solution.

Hope this helps.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions