From be5492e3bf9454c551f84000ed9ea3ac85b173bc Mon Sep 17 00:00:00 2001 From: cpojer Date: Thu, 5 Jun 2025 23:22:55 +0900 Subject: [PATCH] chore: make requiring from outside the Jest VM harder w/out a Babel plugin. --- babel.config.js | 1 - packages/jest-snapshot/src/InlineSnapshots.ts | 9 ++-- packages/jest-snapshot/src/utils.ts | 18 ++++--- packages/jest-snapshot/src/worker.ts | 8 ++- .../babel-plugin-jest-require-outside-vm.js | 53 ------------------- 5 files changed, 24 insertions(+), 65 deletions(-) delete mode 100644 scripts/babel-plugin-jest-require-outside-vm.js diff --git a/babel.config.js b/babel.config.js index e76a50e0708e..9c689457183b 100644 --- a/babel.config.js +++ b/babel.config.js @@ -37,7 +37,6 @@ module.exports = { ], plugins: [ ['@babel/plugin-transform-modules-commonjs', {allowTopLevelThis: true}], - require.resolve('./scripts/babel-plugin-jest-require-outside-vm'), ], presets: [ [ diff --git a/packages/jest-snapshot/src/InlineSnapshots.ts b/packages/jest-snapshot/src/InlineSnapshots.ts index f00860f93c4d..8c5514874236 100644 --- a/packages/jest-snapshot/src/InlineSnapshots.ts +++ b/packages/jest-snapshot/src/InlineSnapshots.ts @@ -44,9 +44,12 @@ export function saveInlineSnapshots( : undefined; if (prettierPath && !prettier) { try { - prettier = - // @ts-expect-error requireOutside - requireOutside(prettierPath) as Prettier; + prettier = require( + require.resolve(prettierPath, { + [Symbol.for('jest-resolve-outside-vm-option')]: true, + }), + ) as Prettier; + cachedPrettier.set(`module|${prettierPath}`, prettier); if (semver.gte(prettier.version, '3.0.0')) { diff --git a/packages/jest-snapshot/src/utils.ts b/packages/jest-snapshot/src/utils.ts index 29d80d4a31de..c03b9fcdaa48 100644 --- a/packages/jest-snapshot/src/utils.ts +++ b/packages/jest-snapshot/src/utils.ts @@ -169,14 +169,20 @@ const indent = ( .join('\n'); }; -const generate = // @ts-expect-error requireOutside Babel transform - (requireOutside('@babel/generator') as typeof import('@babel/generator')) - .default; +const generate = ( + require( + require.resolve('@babel/generator', { + [Symbol.for('jest-resolve-outside-vm-option')]: true, + }), + ) as typeof import('@babel/generator') +).default; -// @ts-expect-error requireOutside Babel transform -const {parseSync, types} = requireOutside( - '@babel/core', +const {parseSync, types} = require( + require.resolve('@babel/core', { + [Symbol.for('jest-resolve-outside-vm-option')]: true, + }), ) as typeof import('@babel/core'); + const { isAwaitExpression, templateElement, diff --git a/packages/jest-snapshot/src/worker.ts b/packages/jest-snapshot/src/worker.ts index 027d498ddd60..ef83f8c8bc1d 100644 --- a/packages/jest-snapshot/src/worker.ts +++ b/packages/jest-snapshot/src/worker.ts @@ -23,8 +23,12 @@ runAsWorker( sourceFileWithSnapshots: string, snapshotMatcherNames: Array, ) => { - // @ts-expect-error requireOutside - prettier ??= requireOutside(/*webpackIgnore: true*/ prettierPath); + prettier ??= require( + /*webpackIgnore: true*/ + require.resolve(prettierPath, { + [Symbol.for('jest-resolve-outside-vm-option')]: true, + }), + ); const config = await prettier.resolveConfig(filepath, { editorconfig: true, diff --git a/scripts/babel-plugin-jest-require-outside-vm.js b/scripts/babel-plugin-jest-require-outside-vm.js deleted file mode 100644 index 45f60112a6e3..000000000000 --- a/scripts/babel-plugin-jest-require-outside-vm.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -'use strict'; - -const assert = require('assert'); - -/* -Replace - -requireOutside('package') - -with - -require(require.resolve('package', { - [Symbol.for('jest-resolve-outside-vm-option')]: true, -})); -*/ - -const REQUIRE_OUTSIDE_FUNCTION_NAME = 'requireOutside'; - -module.exports = ({template, types: t}) => { - const replacement = template(` - require(require.resolve(IMPORT_PATH, { - [(globalThis['jest-symbol-do-not-touch'] || globalThis.Symbol).for('jest-resolve-outside-vm-option')]: true, - })); - `); - return { - name: 'jest-require-outside-vm', - visitor: { - CallExpression(path) { - const {callee, arguments: args} = path.node; - if ( - t.isIdentifier(callee) && - callee.name === REQUIRE_OUTSIDE_FUNCTION_NAME && - !path.scope.hasBinding(REQUIRE_OUTSIDE_FUNCTION_NAME) - ) { - assert.strictEqual( - args.length, - 1, - 'requireOutside must be called with exactly one argument', - ); - const importPath = args[0]; - path.replaceWith(replacement({IMPORT_PATH: importPath})); - } - }, - }, - }; -};