Webpack plugin errors when using universal native node modules on macOS
- Dominant language
- TypeScript
- Stars
- 7.1k
- Forks
- 641
- Avg merge
- 3d 1h
- Merged PRs (30d)
- 30
Description
### Pre-flight checklist
- [X] I have read the [contribution documentation](https://github.com/electron/forge/blob/main/CONTRIBUTING.md) for this project.
- [X] I agree to follow the [code of conduct](https://github.com/electron/electron/blob/main/CODE_OF_CONDUCT.md) that this project uses.
- [X] I have searched the issue tracker for a bug that matches the one I want to file, without success.
### Electron Forge version
7.3.0
### Electron version
27.3.5
### Operating system
macOS 14.3.1 (23D60)
### Last known working Electron Forge version
7.2.0
### Expected behavior
A universal (`arm64` and `x86`) native node module should not cause the error:
```
An unhandled rejection has occurred inside Forge:
Error: Could not find originating native module for "main/native_modules/build/Release/nsUbiquitousKeyValueStore.node"
at Task.task (/Users/matt/Projects/turnip-timer/node_modules/@electron-forge/plugin-webpack/src/WebpackPlugin.ts:211:33)
```
I suspect this is related to the "magic native module mapping" done in #3437.
### Actual behavior
The webpack build should not error when a native node module that is a universal binary is used.
### Steps to reproduce
I don't have good steps to reproduce because it's a private repo, but using `node-mac-icloud-keyvalue` as a node dependency (which is publicly available) is what triggers the issue, since it's built as a universal binary.
Using electron forge `7.2.0` does not exhibit the issue.
### Additional information
Relevant parts of my `forge.config.ts` look like this:
```typescript
const config: ForgeConfig = {
makers: [new MakerPKG({})],
packagerConfig: {
// App metadata trimmed for readability, but this part is probably relevant:
osxUniversal: {
x64ArchFiles: 'Contents/Resources/app/.webpack/**/*.node',
},
},
plugins: [
new WebpackPlugin({
devContentSecurityPolicy: `default-src * self blob: data: gap:; style-src * self 'unsafe-inline' blob: data: gap:; script-src * 'self' 'unsafe-eval' 'unsafe-inline' blob: data: gap:; object-src * 'self' blob: data: gap:; img-src * self 'unsafe-inline' blob: data: gap:; connect-src self * 'unsafe-inline' blob: data: gap:; frame-src * self blob: data: gap:;`,
devServer: {
// Disable error overlays; we use our own Error boundaries.
client: {
overlay: {
errors: false,
runtimeErrors: false,
warnings: false,
},
},
// Disable dev server live reload so React Refresh works.
liveReload: false,
},
// Config includes recommended use of `@vercel/webpack-asset-relocator-loader` from https://www.electronforge.io/config/plugins/webpack#native-node-modules
mainConfig,
renderer: {
config: rendererConfig,
entryPoints: [
{
html: './src/renderer/index.html',
js: `./src/renderer/entryPoint.ts`,
name: 'react_app',
nodeIntegration: true,
preload: {
config: preloadConfig,
js: './src/preload/index.ts',
},
},
],
nodeIntegration: true,
},
}),
],
rebuildConfig: {},
};
export default config;
```
Contributor guide
Assessment
This issue has not been assessed yet.