Files
openclaw/ui/config/control-ui-chunking.ts
2026-08-11 10:22:01 -07:00

92 lines
2.8 KiB
TypeScript

// Control UI config module wires control ui chunking behavior.
function normalizeModuleId(id: string): string {
return id.replace(/\\/g, "/");
}
function moduleIdIncludesPackage(id: string, packageName: string): boolean {
const normalized = normalizeModuleId(id);
return (
normalized.includes(`/node_modules/${packageName}/`) ||
normalized.includes(`/openclaw-pnpm-node-modules/${packageName}/`)
);
}
export function controlUiStableChunkName(id: string): string | undefined {
const normalized = normalizeModuleId(id);
// These entry-and-route helpers must stay together; separate shared chunks
// turn small route-graph changes into extra startup preload requests.
if (
normalized.endsWith("/ui/src/components/config-form.shared.ts") ||
normalized.endsWith("/ui/src/lib/clipboard.ts") ||
normalized.endsWith("/ui/src/build-info-normalizers.ts") ||
normalized.endsWith("/ui/src/build-info.ts")
) {
return "control-ui-shared";
}
if (normalized.endsWith("/ui/src/lib/gateway-methods.ts")) {
return "gateway-runtime";
}
if (
moduleIdIncludesPackage(id, "lit") ||
moduleIdIncludesPackage(id, "lit-html") ||
moduleIdIncludesPackage(id, "@lit/reactive-element")
) {
return "lit-runtime";
}
if (
moduleIdIncludesPackage(id, "highlight.js") ||
moduleIdIncludesPackage(id, "markdown-it") ||
moduleIdIncludesPackage(id, "markdown-it-task-lists") ||
moduleIdIncludesPackage(id, "dompurify") ||
moduleIdIncludesPackage(id, "entities") ||
moduleIdIncludesPackage(id, "linkify-it") ||
moduleIdIncludesPackage(id, "mdurl") ||
moduleIdIncludesPackage(id, "punycode.js") ||
moduleIdIncludesPackage(id, "uc.micro")
) {
return "markdown-runtime";
}
if (
moduleIdIncludesPackage(id, "zod") ||
moduleIdIncludesPackage(id, "json5") ||
moduleIdIncludesPackage(id, "libphonenumber-js")
) {
return "config-runtime";
}
if (
moduleIdIncludesPackage(id, "@noble/ed25519") ||
moduleIdIncludesPackage(id, "@noble/hashes") ||
moduleIdIncludesPackage(id, "ipaddr.js")
) {
return "gateway-runtime";
}
return undefined;
}
export const controlUiCodeSplitting = {
includeDependenciesRecursively: false,
groups: [
{
name: (id: string) => controlUiStableChunkName(id) ?? null,
test: (id: string) => controlUiStableChunkName(id) !== undefined,
priority: 20,
},
{
name: (id: string) =>
normalizeModuleId(id).includes("/ui/src/") ? "control-ui-core" : "control-ui-foundation",
tags: ["$initial"] as ["$initial"],
priority: 10,
// 576 KiB keeps the shared normalization graph in one chunk; the previous
// 512 KiB boundary split it in two, adding a startup request and ~700 B gzip.
maxSize: 576 * 1024,
},
],
};