fix (cli): harden daemon compat shim for minimal bundle exports

This commit is contained in:
Vignesh Natarajan
2026-02-14 20:53:17 -08:00
parent beee14db14
commit 277b2de491
3 changed files with 50 additions and 19 deletions

View File

@@ -51,13 +51,23 @@ if (!resolved?.accessors) {
const target = resolved.entry;
const relPath = `../${target}`;
const { accessors } = resolved;
const missingExportError = (name: string) =>
`Legacy daemon CLI export "${name}" is unavailable in this build. Please upgrade OpenClaw.`;
const buildExportLine = (name: (typeof LEGACY_DAEMON_CLI_EXPORTS)[number]) => {
const accessor = accessors[name];
if (accessor) {
return `export const ${name} = daemonCli.${accessor};`;
}
if (name === "registerDaemonCli") {
return `export const ${name} = () => { throw new Error(${JSON.stringify(missingExportError(name))}); };`;
}
return `export const ${name} = async () => { throw new Error(${JSON.stringify(missingExportError(name))}); };`;
};
const contents =
"// Legacy shim for pre-tsdown update-cli imports.\n" +
`import * as daemonCli from "${relPath}";\n` +
LEGACY_DAEMON_CLI_EXPORTS.map(
(name) => `export const ${name} = daemonCli.${accessors[name]};`,
).join("\n") +
LEGACY_DAEMON_CLI_EXPORTS.map(buildExportLine).join("\n") +
"\n";
fs.mkdirSync(cliDir, { recursive: true });

View File

@@ -25,6 +25,18 @@ describe("resolveLegacyDaemonCliAccessors", () => {
export { runDaemonRestart as r, daemon_cli_exports as t };
`;
expect(resolveLegacyDaemonCliAccessors(bundle)).toEqual({
registerDaemonCli: "t.registerDaemonCli",
runDaemonRestart: "r",
});
});
it("returns null when the required restart alias is missing", () => {
const bundle = `
var daemon_cli_exports = /* @__PURE__ */ __exportAll({ registerDaemonCli: () => registerDaemonCli });
export { daemon_cli_exports as t };
`;
expect(resolveLegacyDaemonCliAccessors(bundle)).toBeNull();
});
});

View File

@@ -9,6 +9,12 @@ export const LEGACY_DAEMON_CLI_EXPORTS = [
] as const;
type LegacyDaemonCliExport = (typeof LEGACY_DAEMON_CLI_EXPORTS)[number];
export type LegacyDaemonCliAccessors = {
registerDaemonCli: string;
runDaemonRestart: string;
} & Partial<
Record<Exclude<LegacyDaemonCliExport, "registerDaemonCli" | "runDaemonRestart">, string>
>;
const EXPORT_SPEC_RE = /^([A-Za-z_$][\w$]*)(?:\s+as\s+([A-Za-z_$][\w$]*))?$/;
const REGISTER_CONTAINER_RE =
@@ -48,7 +54,7 @@ function findRegisterContainerSymbol(bundleSource: string): string | null {
export function resolveLegacyDaemonCliAccessors(
bundleSource: string,
): Record<LegacyDaemonCliExport, string> | null {
): LegacyDaemonCliAccessors | null {
const aliases = parseExportAliases(bundleSource);
if (!aliases) {
return null;
@@ -64,27 +70,30 @@ export function resolveLegacyDaemonCliAccessors(
const runDaemonStatus = aliases.get("runDaemonStatus");
const runDaemonStop = aliases.get("runDaemonStop");
const runDaemonUninstall = aliases.get("runDaemonUninstall");
if (
!(registerContainerAlias || registerDirectAlias) ||
!runDaemonInstall ||
!runDaemonRestart ||
!runDaemonStart ||
!runDaemonStatus ||
!runDaemonStop ||
!runDaemonUninstall
) {
if (!(registerContainerAlias || registerDirectAlias) || !runDaemonRestart) {
return null;
}
return {
const accessors: LegacyDaemonCliAccessors = {
registerDaemonCli: registerContainerAlias
? `${registerContainerAlias}.registerDaemonCli`
: registerDirectAlias!,
runDaemonInstall,
runDaemonRestart,
runDaemonStart,
runDaemonStatus,
runDaemonStop,
runDaemonUninstall,
};
if (runDaemonInstall) {
accessors.runDaemonInstall = runDaemonInstall;
}
if (runDaemonStart) {
accessors.runDaemonStart = runDaemonStart;
}
if (runDaemonStatus) {
accessors.runDaemonStatus = runDaemonStatus;
}
if (runDaemonStop) {
accessors.runDaemonStop = runDaemonStop;
}
if (runDaemonUninstall) {
accessors.runDaemonUninstall = runDaemonUninstall;
}
return accessors;
}