diff --git a/src/lib/plugin.ts b/src/lib/plugin.ts index cb8fffa..2675216 100644 --- a/src/lib/plugin.ts +++ b/src/lib/plugin.ts @@ -125,7 +125,20 @@ export const nodeModulesPolyfillPlugin = (options: NodePolyfillsOptions = {}): P if (initialOptions.platform === 'browser') { const packageJson = await loadPackageJSON(args.resolveDir); const browserFieldValue = packageJson?.browser?.[args.path]; - if (browserFieldValue !== undefined) return; + + // This is here to support consumers who have used the + // "external" option to exclude all Node builtins (e.g. + // Remix v1 does this), otherwise the import/require is left + // in the output and throws an error at runtime. Ideally we + // would just return undefined for any browser field value, + // and we can safely switch to this in a major version. + if (browserFieldValue === false) { + return emptyResult; + } + + if (browserFieldValue !== undefined) { + return; + } } const moduleName = normalizeNodeBuiltinPath(args.path); diff --git a/tests/scenarios/__snapshots__/browserFieldFalse.test.ts.snap b/tests/scenarios/__snapshots__/browserFieldFalse.test.ts.snap index 1e428e9..6053bcc 100644 --- a/tests/scenarios/__snapshots__/browserFieldFalse.test.ts.snap +++ b/tests/scenarios/__snapshots__/browserFieldFalse.test.ts.snap @@ -29,9 +29,10 @@ exports[`Browser Field False Test > GIVEN a file in a browser target build that mod )); - // (disabled):constants + // node-modules-polyfills-empty:constants var require_constants = __commonJS({ - \\"(disabled):constants\\"() { + \\"node-modules-polyfills-empty:constants\\"(exports, module) { + module.exports = {}; } });