60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
import path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
import { resolveOpenClawPackageRoot } from "../infra/openclaw-root.js";
|
|
import { pathExists } from "../utils.js";
|
|
|
|
const FALLBACK_TEMPLATE_DIR = path.resolve(
|
|
path.dirname(fileURLToPath(import.meta.url)),
|
|
"../../docs/reference/templates",
|
|
);
|
|
|
|
let cachedTemplateDir: string | undefined;
|
|
let resolvingTemplateDir: Promise<string> | undefined;
|
|
|
|
export async function resolveWorkspaceTemplateDir(opts?: {
|
|
cwd?: string;
|
|
argv1?: string;
|
|
moduleUrl?: string;
|
|
}): Promise<string> {
|
|
if (cachedTemplateDir) {
|
|
return cachedTemplateDir;
|
|
}
|
|
if (resolvingTemplateDir) {
|
|
return resolvingTemplateDir;
|
|
}
|
|
|
|
resolvingTemplateDir = (async () => {
|
|
const moduleUrl = opts?.moduleUrl ?? import.meta.url;
|
|
const argv1 = opts?.argv1 ?? process.argv[1];
|
|
const cwd = opts?.cwd ?? process.cwd();
|
|
|
|
const packageRoot = await resolveOpenClawPackageRoot({ moduleUrl, argv1, cwd });
|
|
const candidates = [
|
|
packageRoot ? path.join(packageRoot, "docs", "reference", "templates") : null,
|
|
cwd ? path.resolve(cwd, "docs", "reference", "templates") : null,
|
|
FALLBACK_TEMPLATE_DIR,
|
|
].filter(Boolean) as string[];
|
|
|
|
for (const candidate of candidates) {
|
|
if (await pathExists(candidate)) {
|
|
cachedTemplateDir = candidate;
|
|
return candidate;
|
|
}
|
|
}
|
|
|
|
cachedTemplateDir = candidates[0] ?? FALLBACK_TEMPLATE_DIR;
|
|
return cachedTemplateDir;
|
|
})();
|
|
|
|
try {
|
|
return await resolvingTemplateDir;
|
|
} finally {
|
|
resolvingTemplateDir = undefined;
|
|
}
|
|
}
|
|
|
|
export function resetWorkspaceTemplateDirCache() {
|
|
cachedTemplateDir = undefined;
|
|
resolvingTemplateDir = undefined;
|
|
}
|