electron / electron/forge

Webpack plugin errors when using universal native node modules on macOS

Open
#3,526 9 comments 6 reactions 0 assignees View on GitHub
bug native-modules plugin/webpack
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.