diff --git a/extensions/matrix/package.json b/extensions/matrix/package.json index 59b32f8574b..52ff337eec3 100644 --- a/extensions/matrix/package.json +++ b/extensions/matrix/package.json @@ -7,7 +7,6 @@ "@matrix-org/matrix-sdk-crypto-nodejs": "^0.5.1", "@matrix-org/matrix-sdk-crypto-wasm": "18.2.0", "fake-indexeddb": "^6.2.5", - "jiti": "^2.6.1", "markdown-it": "14.1.1", "matrix-js-sdk": "41.4.0", "music-metadata": "^11.12.3", diff --git a/extensions/matrix/src/plugin-entry.runtime.js b/extensions/matrix/src/plugin-entry.runtime.js index 82c6d852b3e..016051e9ec3 100644 --- a/extensions/matrix/src/plugin-entry.runtime.js +++ b/extensions/matrix/src/plugin-entry.runtime.js @@ -4,10 +4,9 @@ import fs from "node:fs"; import { createRequire } from "node:module"; import path from "node:path"; -import { fileURLToPath } from "node:url"; +import { fileURLToPath, pathToFileURL } from "node:url"; const require = createRequire(import.meta.url); -const { createJiti } = require("jiti"); const PLUGIN_ID = "matrix"; const OPENCLAW_PLUGIN_SDK_PACKAGE_NAMES = [ @@ -17,6 +16,7 @@ const OPENCLAW_PLUGIN_SDK_PACKAGE_NAMES = [ const PLUGIN_SDK_EXPORT_PREFIX = "./plugin-sdk/"; const PLUGIN_SDK_SOURCE_EXTENSIONS = [".ts", ".mts", ".js", ".mjs", ".cts", ".cjs"]; const PLUGIN_ENTRY_RUNTIME_BASENAME = "plugin-entry.handlers.runtime"; +const NATIVE_RUNTIME_EXTENSIONS = [".js", ".mjs", ".cjs"]; const JITI_EXTENSIONS = [ ".ts", ".tsx", @@ -169,14 +169,21 @@ function resolveBundledPluginRuntimeModulePath(moduleUrl, params) { ); } -const jiti = createJiti(import.meta.url, { - alias: buildPluginSdkAliasMap(import.meta.url), - interopDefault: true, - tryNative: false, - extensions: JITI_EXTENSIONS, -}); +async function loadRuntimeModule(modulePath) { + if (NATIVE_RUNTIME_EXTENSIONS.includes(path.extname(modulePath))) { + return import(pathToFileURL(modulePath).href); + } + const { createJiti } = require("jiti"); + const jiti = createJiti(import.meta.url, { + alias: buildPluginSdkAliasMap(import.meta.url), + interopDefault: true, + tryNative: false, + extensions: JITI_EXTENSIONS, + }); + return jiti(modulePath); +} -const mod = jiti( +const mod = await loadRuntimeModule( resolveBundledPluginRuntimeModulePath(import.meta.url, { pluginId: PLUGIN_ID, runtimeBasename: PLUGIN_ENTRY_RUNTIME_BASENAME, diff --git a/extensions/matrix/src/plugin-entry.runtime.test.ts b/extensions/matrix/src/plugin-entry.runtime.test.ts index 5a1ce753510..95894de4c47 100644 --- a/extensions/matrix/src/plugin-entry.runtime.test.ts +++ b/extensions/matrix/src/plugin-entry.runtime.test.ts @@ -1,5 +1,4 @@ import fs from "node:fs"; -import { createRequire } from "node:module"; import os from "node:os"; import path from "node:path"; import { pathToFileURL } from "node:url"; @@ -7,8 +6,6 @@ import { afterEach, expect, it } from "vitest"; const tempDirs: string[] = []; const REPO_ROOT = process.cwd(); -const require = createRequire(import.meta.url); -const JITI_ENTRY_PATH = require.resolve("jiti"); const matrixWrapperGlobal = globalThis as typeof globalThis & { __openclawMatrixWrapperJitiOptions?: unknown; }; @@ -40,14 +37,6 @@ function writeFixtureFile(fixtureRoot: string, relativePath: string, value: stri fs.writeFileSync(fullPath, value, "utf8"); } -function writeJitiFixture(fixtureRoot: string) { - writeFixtureFile( - fixtureRoot, - "node_modules/jiti/index.js", - `module.exports = require(${JSON.stringify(JITI_ENTRY_PATH)});\n`, - ); -} - function writeCapturingJitiFixture(fixtureRoot: string) { writeFixtureFile( fixtureRoot, @@ -143,7 +132,11 @@ function writeTrustedOpenClawBinFixture( writeFixtureFile(fixtureRoot, "dist/plugin-sdk/group-access.js", "export {};\n"); } -function writeSourceRuntimeWrapperFixture(fixtureRoot: string) { +function writeSourceRuntimeWrapperFixture( + fixtureRoot: string, + options: { runtimeExtension?: ".js" | ".ts" } = {}, +) { + const runtimeExtension = options.runtimeExtension ?? ".js"; writeFixtureFile( fixtureRoot, "extensions/matrix/src/plugin-entry.runtime.js", @@ -151,7 +144,7 @@ function writeSourceRuntimeWrapperFixture(fixtureRoot: string) { ); writeFixtureFile( fixtureRoot, - "extensions/matrix/plugin-entry.handlers.runtime.js", + `extensions/matrix/plugin-entry.handlers.runtime${runtimeExtension}`, PACKAGED_RUNTIME_STUB, ); } @@ -174,7 +167,7 @@ function writeCapturingSourceRuntimeWrapperFixture(fixtureRoot: string) { delete matrixWrapperGlobal.__openclawMatrixWrapperJitiOptions; writeOpenClawAliasFixture(fixtureRoot); writeCapturingJitiFixture(fixtureRoot); - writeSourceRuntimeWrapperFixture(fixtureRoot); + writeSourceRuntimeWrapperFixture(fixtureRoot, { runtimeExtension: ".ts" }); } function expectSourcePluginSdkAliases(fixtureRoot: string) { @@ -198,7 +191,6 @@ it("loads the source-checkout runtime wrapper through native ESM import", async const fixtureRoot = makeFixtureRoot(".tmp-matrix-source-runtime-"); writeOpenClawPackageFixture(fixtureRoot); - writeJitiFixture(fixtureRoot); writeSourceRuntimeWrapperFixture(fixtureRoot); expectRuntimeWrapperExports( @@ -210,7 +202,6 @@ it("loads the packaged runtime wrapper without recursing through the stable root const fixtureRoot = makeFixtureRoot(".tmp-matrix-runtime-"); writeOpenClawPackageFixture(fixtureRoot); - writeJitiFixture(fixtureRoot); writeFixtureFile( fixtureRoot, "dist/plugin-entry.runtime-C88YIa_v.js", @@ -267,7 +258,7 @@ it("keeps wrapper plugin-sdk aliases deterministic and ignores unsafe subpaths", writeFixtureFile(fixtureRoot, "src/plugin-sdk/alpha.ts", "export {};\n"); writeFixtureFile(fixtureRoot, "src/plugin-sdk/zeta.ts", "export {};\n"); writeCapturingJitiFixture(fixtureRoot); - writeSourceRuntimeWrapperFixture(fixtureRoot); + writeSourceRuntimeWrapperFixture(fixtureRoot, { runtimeExtension: ".ts" }); await importFixtureModule(fixtureRoot, "extensions/matrix/src/plugin-entry.runtime.js"); const aliasKeys = Object.keys( @@ -317,7 +308,7 @@ it("ignores nearby untrusted openclaw package stubs when resolving the wrapper r ); writeFixtureFile(fixtureRoot, "extensions/src/plugin-sdk/group-access.ts", "export {};\n"); writeCapturingJitiFixture(fixtureRoot); - writeSourceRuntimeWrapperFixture(fixtureRoot); + writeSourceRuntimeWrapperFixture(fixtureRoot, { runtimeExtension: ".ts" }); await importFixtureModule(fixtureRoot, "extensions/matrix/src/plugin-entry.runtime.js"); expectSourcePluginSdkAliases(fixtureRoot); @@ -329,7 +320,7 @@ it("treats string bin hints case-insensitively when trusting wrapper package roo delete matrixWrapperGlobal.__openclawMatrixWrapperJitiOptions; writeTrustedOpenClawBinFixture(fixtureRoot, "OpenClaw.MJS"); writeCapturingJitiFixture(fixtureRoot); - writeSourceRuntimeWrapperFixture(fixtureRoot); + writeSourceRuntimeWrapperFixture(fixtureRoot, { runtimeExtension: ".ts" }); await importFixtureModule(fixtureRoot, "extensions/matrix/src/plugin-entry.runtime.js"); expect(matrixWrapperGlobal.__openclawMatrixWrapperJitiOptions).toMatchObject({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8966251b20..b425b7082f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -802,9 +802,6 @@ importers: fake-indexeddb: specifier: ^6.2.5 version: 6.2.5 - jiti: - specifier: ^2.6.1 - version: 2.6.1 markdown-it: specifier: 14.1.1 version: 14.1.1