72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
|
|
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,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|