diff --git a/bin/regime b/bin/regime index 794f23c..7732db1 100755 --- a/bin/regime +++ b/bin/regime @@ -3,6 +3,7 @@ import { resolve } from "path" import { check } from "../src/check" import { sync } from "../src/sync" import { promote } from "../src/promote" +import { templates } from "../src/templates" const [command, ...rawArgs] = process.argv.slice(2) const hasYes = rawArgs.includes("--yes") @@ -19,7 +20,10 @@ switch (command) { case "promote": await promote(targetDir, hasYes) break + case "templates": + templates(rawArgs.includes("--full")) + break default: - console.error("Usage: regime [path] [--yes]") + console.error("Usage: regime [path] [--yes] [--full]") process.exit(1) } diff --git a/src/sync.ts b/src/sync.ts index 5c9c444..5c0a87f 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -14,7 +14,6 @@ import { } from "./shared" const green = Bun.color("green", "ansi") -const yellow = Bun.color("orange", "ansi") const red = Bun.color("red", "ansi") const purple = Bun.color("purple", "ansi") const reset = "\x1b[0m" diff --git a/src/templates.ts b/src/templates.ts new file mode 100644 index 0000000..dbbe7c4 --- /dev/null +++ b/src/templates.ts @@ -0,0 +1,61 @@ +import { readdirSync } from "node:fs" +import { join } from "node:path" +import { templatesDir, resolveTemplateConfig, readdirSyncRecursive } from "./shared" + +const purple = Bun.color("green", "ansi") +const reset = "\x1b[0m" + +interface TreeNode { + name: string + children: TreeNode[] + files: string[] +} + +function buildTree(name: string, visited = new Set()): TreeNode { + if (visited.has(name)) return { name, children: [], files: [] } + visited.add(name) + + const config = resolveTemplateConfig(name) + const children = (config.inherits ?? []).map(p => buildTree(p, visited)) + + const dir = join(templatesDir, name) + const files = readdirSyncRecursive(dir).filter(f => f !== ".regime-template.json") + + return { name, children, files } +} + +function printTree(node: TreeNode, full: boolean, prefix = "", isLast = true, isRoot = true) { + const connector = isRoot ? "" : isLast ? "└── " : "├── " + const line = isRoot ? node.name : `${prefix}${connector}${node.name}` + console.log(line) + + const childPrefix = isRoot ? "" : prefix + (isLast ? " " : "│ ") + + if (full && node.files.length > 0) { + const hasChildren = node.children.length > 0 + for (let i = 0; i < node.files.length; i++) { + const fileConnector = hasChildren || i < node.files.length - 1 ? "│ " : " " + const bullet = "·" + console.log(`${childPrefix}${fileConnector}${purple}${bullet} ${node.files[i]}${reset}`) + } + } + + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i] + const last = i === node.children.length - 1 + printTree(child, full, childPrefix, last, false) + } +} + +export function templates(full: boolean) { + const entries = readdirSync(templatesDir, { withFileTypes: true }) + .filter(e => e.isDirectory()) + .map(e => e.name) + .sort() + + for (let i = 0; i < entries.length; i++) { + const tree = buildTree(entries[i]) + printTree(tree, full) + if (i < entries.length - 1) console.log() + } +}