89 lines
2.4 KiB
JavaScript
89 lines
2.4 KiB
JavaScript
#!/usr/bin/env node
|
|
import { reverseDir } from "./reverse"
|
|
|
|
function printHelp() {
|
|
console.log(`tdir
|
|
|
|
Usage:
|
|
tdir reverse <rendered-dir> <template-dir> [--map <path>] [--include <glob>...]
|
|
|
|
Commands:
|
|
reverse Rebuild template files from a rendered directory and reverse map
|
|
|
|
Options:
|
|
--map Reverse map path. Defaults to <rendered-dir>/.tdir-map.json.
|
|
Relative paths are resolved from <rendered-dir>.
|
|
--include Include new rendered files matching a glob. Can be repeated.
|
|
--help Show this help message.
|
|
`)
|
|
}
|
|
|
|
function parseReverseArgs(args: string[]) {
|
|
const positional: string[] = []
|
|
const include: string[] = []
|
|
let mapPath: string | undefined
|
|
|
|
for (let i = 0; i < args.length; i++) {
|
|
const arg = args[i]!
|
|
if (arg === "--help" || arg === "-h") {
|
|
return { help: true, positional, mapPath, include }
|
|
}
|
|
if (arg === "--map") {
|
|
const value = args[++i]
|
|
if (!value) throw new Error("Missing value for --map")
|
|
mapPath = value
|
|
continue
|
|
}
|
|
if (arg === "--include") {
|
|
const value = args[++i]
|
|
if (!value) throw new Error("Missing value for --include")
|
|
include.push(value)
|
|
continue
|
|
}
|
|
positional.push(arg)
|
|
}
|
|
|
|
return { help: false, positional, mapPath, include }
|
|
}
|
|
|
|
function main(argv: string[]) {
|
|
const [command, ...args] = argv
|
|
|
|
if (!command || command === "--help" || command === "-h") {
|
|
printHelp()
|
|
return 0
|
|
}
|
|
|
|
if (command !== "reverse") {
|
|
throw new Error(`Unknown command: ${command}`)
|
|
}
|
|
|
|
const parsed = parseReverseArgs(args)
|
|
if (parsed.help) {
|
|
printHelp()
|
|
return 0
|
|
}
|
|
|
|
const [renderedDir, templateDir] = parsed.positional
|
|
if (!renderedDir || !templateDir || parsed.positional.length > 2) {
|
|
throw new Error("Usage: tdir reverse <rendered-dir> <template-dir> [--map <path>] [--include <glob>...]")
|
|
}
|
|
|
|
const result = reverseDir(renderedDir, templateDir, {
|
|
mapPath: parsed.mapPath,
|
|
include: parsed.include,
|
|
})
|
|
console.log(`Wrote ${result.filesWritten} file${result.filesWritten === 1 ? "" : "s"}`)
|
|
for (const warning of result.warnings) {
|
|
console.warn(`Warning: ${warning.outputPath}: ${warning.message}`)
|
|
}
|
|
return result.warnings.length > 0 ? 2 : 0
|
|
}
|
|
|
|
try {
|
|
process.exitCode = main(process.argv.slice(2))
|
|
} catch (error) {
|
|
console.error(error instanceof Error ? error.message : String(error))
|
|
process.exitCode = 1
|
|
}
|