open-design/tools/pack/src/resources.ts

72 lines
2.4 KiB
TypeScript
Raw Normal View History

import { readFileSync } from "node:fs";
import { cp } from "node:fs/promises";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
function resolveToolsPackRoot(startDir: string): string {
const maxDepth = 6;
let current = startDir;
for (let depth = 0; depth < maxDepth; depth += 1) {
try {
const raw = readFileSync(join(current, "package.json"), "utf8");
const parsed = JSON.parse(raw) as { name?: unknown };
if (parsed.name === "@open-design/tools-pack") {
return current;
}
} catch {
// Keep walking until we find the tools-pack package root.
}
const parent = dirname(current);
if (parent === current) break;
current = parent;
}
throw new Error(`tools-pack: unable to resolve package root from ${startDir}`);
}
export const toolsPackRoot = resolveToolsPackRoot(dirname(fileURLToPath(import.meta.url)));
export const resourcesRoot = join(toolsPackRoot, "resources");
export const macResources = {
entitlements: join(resourcesRoot, "mac", "entitlements.mac.plist"),
entitlementsInherit: join(resourcesRoot, "mac", "entitlements.mac.inherit.plist"),
icon: join(resourcesRoot, "mac", "icon.icns"),
iconPng: join(resourcesRoot, "mac", "icon.png"),
notarizeHook: join(resourcesRoot, "mac", "notarize.cjs"),
webStandaloneAfterPackHook: join(resourcesRoot, "mac", "web-standalone-after-pack.cjs"),
} as const;
export const winResources = {
icon: join(resourcesRoot, "win", "icon.ico"),
} as const;
export const linuxResources = {
icon: join(resourcesRoot, "linux", "icon.png"),
desktopTemplate: join(resourcesRoot, "linux", "open-design.desktop.template"),
} as const;
const BUNDLED_RESOURCE_TREES = [
{ from: "skills", to: "skills" },
{ from: "design-systems", to: "design-systems" },
{ from: "craft", to: "craft" },
{ from: join("assets", "frames"), to: "frames" },
{ from: join("assets", "community-pets"), to: "community-pets" },
{ from: "prompt-templates", to: "prompt-templates" },
] as const;
export async function copyBundledResourceTrees({
workspaceRoot,
resourceRoot,
}: {
workspaceRoot: string;
resourceRoot: string;
}): Promise<void> {
for (const entry of BUNDLED_RESOURCE_TREES) {
await cp(join(workspaceRoot, entry.from), join(resourceRoot, entry.to), {
recursive: true,
});
}
}