From 04fc964a927fce40b8a661a97db605b30b19213c Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Sat, 18 Jul 2026 07:08:18 +0800 Subject: [PATCH] test(rn-update): run real Hermes compiler on Windows --- packages/update/scripts/xuqm-rn.test.mjs | 45 +++++++++++++++++------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/packages/update/scripts/xuqm-rn.test.mjs b/packages/update/scripts/xuqm-rn.test.mjs index 55f397c..6bb0e53 100644 --- a/packages/update/scripts/xuqm-rn.test.mjs +++ b/packages/update/scripts/xuqm-rn.test.mjs @@ -1,12 +1,22 @@ import assert from 'node:assert/strict' import { execFileSync } from 'node:child_process' -import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' +import { + chmodSync, + copyFileSync, + mkdirSync, + mkdtempSync, + readFileSync, + rmSync, + writeFileSync, +} from 'node:fs' +import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import path from 'node:path' import test from 'node:test' import { fileURLToPath } from 'node:url' const cli = fileURLToPath(new URL('./xuqm-rn.mjs', import.meta.url)) +const workspaceRequire = createRequire(import.meta.url) test('embed creates a complete versioned manifest from a host fixture', () => { const root = mkdtempSync(path.join(tmpdir(), 'xuqm-cli-')) @@ -139,25 +149,34 @@ test('Android Hermes hosts compile plugin bundles to bytecode', () => { : 'linux64-bin', process.platform === 'win32' ? 'hermesc.exe' : 'hermesc', ) - writeFileSync( - compiler, - `#!/usr/bin/env node -const fs = require('node:fs'); -const args = process.argv.slice(2); -fs.writeFileSync(args[args.indexOf('-out') + 1], 'hermes-bytecode'); -`, - { mode: 0o755 }, + // 使用当前 React Native 实际依赖的 Hermes 编译器。文本脚本即使命名为 + // hermesc.exe 也不是 Windows 可执行文件,会让 CI 只验证到测试替身而非真实链路。 + const workspaceReactNativeManifest = workspaceRequire.resolve('react-native/package.json') + const workspaceReactNativeRequire = createRequire(workspaceReactNativeManifest) + const workspaceCompilerManifest = workspaceReactNativeRequire.resolve( + 'hermes-compiler/package.json', ) + const workspaceCompiler = path.join( + path.dirname(workspaceCompilerManifest), + 'hermesc', + process.platform === 'win32' + ? 'win64-bin' + : process.platform === 'darwin' + ? 'osx-bin' + : 'linux64-bin', + process.platform === 'win32' ? 'hermesc.exe' : 'hermesc', + ) + copyFileSync(workspaceCompiler, compiler) + if (process.platform !== 'win32') chmodSync(compiler, 0o755) execFileSync(process.execPath, [cli, 'embed', 'android'], { cwd: root, stdio: 'pipe', }) - assert.equal( - readFileSync(path.join(root, 'generated', 'common.android.bundle'), 'utf8'), - 'hermes-bytecode', - ) + const bytecode = readFileSync(path.join(root, 'generated', 'common.android.bundle')) + assert.ok(bytecode.length > Buffer.byteLength('javascript')) + assert.notEqual(bytecode.toString('utf8'), 'javascript') const manifest = JSON.parse(readFileSync(path.join(root, 'generated', 'manifest.json'), 'utf8')) assert.equal(manifest.bundleFormat, 'hermes-bytecode') } finally {