From b66e71fec5270f88a3fcd7cfd2f989bcc330481d Mon Sep 17 00:00:00 2001 From: gchust Date: Sat, 15 Aug 2026 10:51:01 +0000 Subject: [PATCH] fix(runjs): resolve source exports in subprocesses --- packages/core/runjs/.npmignore | 1 + packages/core/runjs/package.json | 4 +++- packages/core/runjs/register-source.cjs | 14 ++++++++++++++ .../src/server/__tests__/compiler.unit.test.ts | 3 ++- .../src/server/__tests__/plugin-bootstrap.test.ts | 3 +++ .../server/services/JsTemplateCompileWorkerPool.ts | 12 +++++++++++- 6 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 packages/core/runjs/register-source.cjs diff --git a/packages/core/runjs/.npmignore b/packages/core/runjs/.npmignore index ef10b384cb1..b552852d68d 100644 --- a/packages/core/runjs/.npmignore +++ b/packages/core/runjs/.npmignore @@ -5,3 +5,4 @@ !/es/** /src/completion-catalog/generated.ts /src/generated/ +/register-source.cjs diff --git a/packages/core/runjs/package.json b/packages/core/runjs/package.json index d43fa46cdb6..0e6c4b0e1c7 100644 --- a/packages/core/runjs/package.json +++ b/packages/core/runjs/package.json @@ -161,6 +161,8 @@ }, "devDependencies": { "ajv": "^6.12.6", - "cross-spawn": "^7.0.6" + "cross-spawn": "^7.0.6", + "tsconfig-paths": "^4.2.0", + "tsx": "^4.19.0" } } diff --git a/packages/core/runjs/register-source.cjs b/packages/core/runjs/register-source.cjs new file mode 100644 index 00000000000..f0f372b0be5 --- /dev/null +++ b/packages/core/runjs/register-source.cjs @@ -0,0 +1,14 @@ +const path = require('node:path'); + +require('tsx/cjs'); + +const { register } = require('tsconfig-paths'); + +register({ + baseUrl: path.resolve(__dirname, 'src'), + paths: { + '@nocobase/runjs': ['index.ts'], + '@nocobase/runjs/package.json': ['../package.json'], + '@nocobase/runjs/*': ['*'], + }, +}); diff --git a/packages/plugins/@nocobase/plugin-js-template/src/server/__tests__/compiler.unit.test.ts b/packages/plugins/@nocobase/plugin-js-template/src/server/__tests__/compiler.unit.test.ts index 5ffcc647c61..30a48ffbc9d 100644 --- a/packages/plugins/@nocobase/plugin-js-template/src/server/__tests__/compiler.unit.test.ts +++ b/packages/plugins/@nocobase/plugin-js-template/src/server/__tests__/compiler.unit.test.ts @@ -137,7 +137,8 @@ function registerCompileContractTests() { }); function readCompilerBuildId(script: string): string { - return execFileSync(process.execPath, ['--import', 'tsx', '--eval', script], { + const runJSSourceRegisterPath = path.resolve(__dirname, '../../../../../../core/runjs/register-source.cjs'); + return execFileSync(process.execPath, ['--require', runJSSourceRegisterPath, '--import', 'tsx', '--eval', script], { cwd: process.cwd(), encoding: 'utf8', }).trim(); diff --git a/packages/plugins/@nocobase/plugin-js-template/src/server/__tests__/plugin-bootstrap.test.ts b/packages/plugins/@nocobase/plugin-js-template/src/server/__tests__/plugin-bootstrap.test.ts index 817978cde26..50565ea6370 100644 --- a/packages/plugins/@nocobase/plugin-js-template/src/server/__tests__/plugin-bootstrap.test.ts +++ b/packages/plugins/@nocobase/plugin-js-template/src/server/__tests__/plugin-bootstrap.test.ts @@ -30,10 +30,13 @@ import PluginJsTemplateServer from '../plugin'; describe('plugin-js-template bootstrap', () => { it('keeps the RunJS compiler unloaded until the first compile', () => { const serverEntryUrl = pathToFileURL(path.resolve(__dirname, '../index.ts')).href; + const runJSSourceRegisterPath = path.resolve(__dirname, '../../../../../../core/runjs/register-source.cjs'); expect(() => execFileSync( process.execPath, [ + '--require', + runJSSourceRegisterPath, '--import', 'tsx', '--input-type=module', diff --git a/packages/plugins/@nocobase/plugin-js-template/src/server/services/JsTemplateCompileWorkerPool.ts b/packages/plugins/@nocobase/plugin-js-template/src/server/services/JsTemplateCompileWorkerPool.ts index 45bb0e4630e..117d57bc60b 100644 --- a/packages/plugins/@nocobase/plugin-js-template/src/server/services/JsTemplateCompileWorkerPool.ts +++ b/packages/plugins/@nocobase/plugin-js-template/src/server/services/JsTemplateCompileWorkerPool.ts @@ -8,6 +8,7 @@ */ import path from 'node:path'; +import { createRequire } from 'node:module'; import { performance } from 'node:perf_hooks'; import { deserialize, serialize } from 'node:v8'; import { Worker } from 'node:worker_threads'; @@ -798,9 +799,18 @@ function assertIntegerLimit(label: string, value: number, minimum: number, maxim function createDefaultWorker(): JsTemplateCompileWorkerHandle { const isTypeScriptRuntime = __filename.endsWith('.ts'); const workerPath = path.join(__dirname, `JsTemplateCompileWorker.${isTypeScriptRuntime ? 'ts' : 'js'}`); + const sourceRuntimeExecArgv = isTypeScriptRuntime + ? [ + '--require', + path.join( + path.dirname(createRequire(__filename).resolve('@nocobase/runjs/package.json')), + 'register-source.cjs', + ), + ] + : undefined; return new NodeCompileWorkerHandle( new Worker(workerPath, { - execArgv: isTypeScriptRuntime ? ['--require', 'tsx/cjs'] : undefined, + execArgv: sourceRuntimeExecArgv, }), ); }