This commit is contained in:
Gregor Lohaus
2026-04-08 01:05:23 +02:00
commit 0e552ec4f5
21 changed files with 1121 additions and 0 deletions

47
parser.ts Normal file
View File

@@ -0,0 +1,47 @@
import { readdirSync, statSync, readFileSync } from "node:fs"
import { join } from "node:path"
export type TemplateVariable = {
path: string
type: string
}
const IF_RE = /<@if\(context\.(.+?)\)>/g
const VAR_RE = /<@var\(context\.(.+?)(?::(\w+))?\)>/g
function extractFromString(text: string, vars: TemplateVariable[]) {
for (const match of text.matchAll(IF_RE)) {
vars.push({ path: match[1]!, type: "boolean" })
}
for (const match of text.matchAll(VAR_RE)) {
vars.push({ path: match[1]!, type: match[2] ?? "string" })
}
}
function walkDir(dirPath: string, vars: TemplateVariable[]) {
const entries = readdirSync(dirPath).sort()
for (const entry of entries) {
const fullPath = join(dirPath, entry)
extractFromString(entry, vars)
const stat = statSync(fullPath)
if (stat.isDirectory()) {
walkDir(fullPath, vars)
} else if (stat.isFile()) {
const content = readFileSync(fullPath, "utf-8")
extractFromString(content, vars)
}
}
}
export function parse(dirPath: string): TemplateVariable[] {
const vars: TemplateVariable[] = []
walkDir(dirPath, vars)
const seen = new Set<string>()
return vars.filter(v => {
const key = `${v.path}:${v.type}`
if (seen.has(key)) return false
seen.add(key)
return true
})
}