From 999efeba9258642dd85a1a544801f7218f21426f Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Wed, 6 May 2026 11:48:25 -0700 Subject: [PATCH 1/2] module: exclude node:ffi from builtinModules when flag is disabled Module.builtinModules is supposed to only list modules that are accessible to user code. node:ffi requires --experimental-ffi to be required, so filter it out when the flag is not set, mirroring the existing handling for --experimental-quic. Refs: https://github.com/nodejs/node/pull/63137#issuecomment-4390371187 Signed-off-by: Jordan Harband --- lib/internal/modules/cjs/loader.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 0b59d7e7a0f911..c9cf6a0f82bb86 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -490,6 +490,9 @@ function initializeCJS() { if (!getOptionValue('--experimental-quic')) { modules = modules.filter((i) => i !== 'node:quic'); } + if (!getOptionValue('--experimental-ffi')) { + modules = modules.filter((i) => i !== 'node:ffi'); + } Module.builtinModules = ObjectFreeze(modules); initializeCjsConditions(); From cc2a34658b7e300cafd71cc83cab46d8a4c46505 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Wed, 6 May 2026 21:33:12 +0200 Subject: [PATCH 2/2] fixup! module: exclude node:ffi from builtinModules when flag is disabled --- test/ffi/test-ffi-module.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/ffi/test-ffi-module.js b/test/ffi/test-ffi-module.js index 1cd2b840097d6b..573c5e7ce5947b 100644 --- a/test/ffi/test-ffi-module.js +++ b/test/ffi/test-ffi-module.js @@ -1,6 +1,7 @@ // Flags: --experimental-ffi 'use strict'; const common = require('../common'); +const { spawnSyncAndAssert } = require('../common/child_process'); const assert = require('node:assert'); const { spawnSync } = require('node:child_process'); const { test } = require('node:test'); @@ -32,17 +33,16 @@ test('ffi builtin is unavailable when disabled', () => { }); test('ffi builtin is listed', () => { - const { stdout, stderr, status, signal } = spawnSync(process.execPath, [ - '-p', - 'require("node:module").builtinModules.includes("node:ffi")', - ], { - encoding: 'utf8', - }); - - assert.strictEqual(stdout.trim(), 'true'); - assert.strictEqual(stderr, ''); - assert.strictEqual(status, 0); - assert.strictEqual(signal, null); + for (const [flag, stdout] of Object.entries({ + '--experimental-ffi': 'true\n', + '--no-experimental-ffi': 'false\n', + })) { + spawnSyncAndAssert(process.execPath, [ + flag, + '-p', + 'require("node:module").builtinModules.includes("node:ffi")', + ], { stdout }); + } }); test('ffi can be imported from ESM', () => {