mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-31 14:26:30 +02:00
84 lines
3.0 KiB
JavaScript
84 lines
3.0 KiB
JavaScript
import fs from "node:fs";
|
|
import path from "node:path";
|
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
import { copyBundledPluginMetadata } from "./copy-bundled-plugin-metadata.mjs";
|
|
import { copyPluginSdkRootAlias } from "./copy-plugin-sdk-root-alias.mjs";
|
|
import { writeTextFileIfChanged } from "./runtime-postbuild-shared.mjs";
|
|
import { stageBundledPluginRuntimeDeps } from "./stage-bundled-plugin-runtime-deps.mjs";
|
|
import { stageBundledPluginRuntime } from "./stage-bundled-plugin-runtime.mjs";
|
|
import { writeOfficialChannelCatalog } from "./write-official-channel-catalog.mjs";
|
|
|
|
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
const ROOT_RUNTIME_ALIAS_PATTERN = /^(?<base>.+\.(?:runtime|contract))-[A-Za-z0-9_-]+\.js$/u;
|
|
|
|
/**
|
|
* Copy static (non-transpiled) runtime assets that are referenced by their
|
|
* source-relative path inside bundled extension code.
|
|
*
|
|
* Each entry: { src: repo-root-relative source, dest: dist-relative dest }
|
|
*/
|
|
export const STATIC_EXTENSION_ASSETS = [
|
|
// acpx MCP proxy — co-deployed alongside the acpx index bundle so that
|
|
// `path.resolve(dirname(import.meta.url), "mcp-proxy.mjs")` resolves correctly
|
|
// at runtime (see extensions/acpx/src/runtime-internals/mcp-agent-command.ts).
|
|
{
|
|
src: "extensions/acpx/src/runtime-internals/mcp-proxy.mjs",
|
|
dest: "dist/extensions/acpx/mcp-proxy.mjs",
|
|
},
|
|
];
|
|
|
|
export function copyStaticExtensionAssets(params = {}) {
|
|
const rootDir = params.rootDir ?? ROOT;
|
|
const assets = params.assets ?? STATIC_EXTENSION_ASSETS;
|
|
const fsImpl = params.fs ?? fs;
|
|
const warn = params.warn ?? console.warn;
|
|
for (const { src, dest } of assets) {
|
|
const srcPath = path.join(rootDir, src);
|
|
const destPath = path.join(rootDir, dest);
|
|
if (fsImpl.existsSync(srcPath)) {
|
|
fsImpl.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
fsImpl.copyFileSync(srcPath, destPath);
|
|
} else {
|
|
warn(`[runtime-postbuild] static asset not found, skipping: ${src}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
export function writeStableRootRuntimeAliases(params = {}) {
|
|
const rootDir = params.rootDir ?? ROOT;
|
|
const distDir = path.join(rootDir, "dist");
|
|
const fsImpl = params.fs ?? fs;
|
|
let entries = [];
|
|
try {
|
|
entries = fsImpl.readdirSync(distDir, { withFileTypes: true });
|
|
} catch {
|
|
return;
|
|
}
|
|
|
|
for (const entry of entries) {
|
|
if (!entry.isFile()) {
|
|
continue;
|
|
}
|
|
const match = entry.name.match(ROOT_RUNTIME_ALIAS_PATTERN);
|
|
if (!match?.groups?.base) {
|
|
continue;
|
|
}
|
|
const aliasPath = path.join(distDir, `${match.groups.base}.js`);
|
|
writeTextFileIfChanged(aliasPath, `export * from "./${entry.name}";\n`);
|
|
}
|
|
}
|
|
|
|
export function runRuntimePostBuild(params = {}) {
|
|
copyPluginSdkRootAlias(params);
|
|
copyBundledPluginMetadata(params);
|
|
writeOfficialChannelCatalog(params);
|
|
stageBundledPluginRuntimeDeps(params);
|
|
stageBundledPluginRuntime(params);
|
|
writeStableRootRuntimeAliases(params);
|
|
copyStaticExtensionAssets(params);
|
|
}
|
|
|
|
if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) {
|
|
runRuntimePostBuild();
|
|
}
|