Files
openclaw/src/config/plugin-install-config-migration.ts
Peter Steinberger 00d8d7ead0 refactor: extract normalization core package
Extract shared normalization/coercion helpers into private @openclaw/normalization-core workspace package while preserving existing plugin SDK helper subpaths.\n\nAlso keeps direct normalization-core imports internal, wires UI/build/loader resolution, and replaces the slow PR network CodeQL lane with a fast added-line boundary scan while retaining full CodeQL for scheduled/manual runs.\n\nVerification: local moved tests, plugin SDK boundary tests, extension loader tests, agents-support shard, UI build/test, build artifacts, lint, workflow guards, autoreview, and GitHub CI passed on PR head 963d893715.
2026-05-31 01:33:00 +01:00

36 lines
1.3 KiB
TypeScript

import { isRecord } from "@openclaw/normalization-core/record-coerce";
import { z } from "zod";
import type { PluginInstallRecord } from "./types.plugins.js";
import { PluginInstallRecordShape } from "./zod-schema.installs.js";
const PluginInstallRecordsSchema = z.record(
z.string(),
z.object(PluginInstallRecordShape).passthrough(),
);
function pruneEmptyPluginsObject(plugins: Record<string, unknown>): unknown {
const { installs: _installs, ...rest } = plugins;
return Object.keys(rest).length === 0 ? undefined : rest;
}
export function extractShippedPluginInstallConfigRecords(
config: unknown,
): Record<string, PluginInstallRecord> {
if (!isRecord(config) || !isRecord(config.plugins)) {
return {};
}
const parsed = PluginInstallRecordsSchema.safeParse(config.plugins.installs);
return parsed.success
? (structuredClone(parsed.data) as Record<string, PluginInstallRecord>)
: {};
}
export function stripShippedPluginInstallConfigRecords(config: unknown): unknown {
if (!isRecord(config) || !isRecord(config.plugins) || !("installs" in config.plugins)) {
return config;
}
const plugins = pruneEmptyPluginsObject(config.plugins);
const { plugins: _plugins, ...rest } = config;
return plugins === undefined ? rest : { ...rest, plugins };
}