From e16fc8b482ef525f8e80e98cfa97a1ff9adfa535 Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Sun, 24 May 2026 15:05:22 +0200 Subject: [PATCH] verison bump, new files need to include var tokens --- index.test.ts | 6 ++++-- package.json | 2 +- render.ts | 17 +++++++++++++++++ reverse.ts | 22 +++++++++++++++++++++- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/index.test.ts b/index.test.ts index 9f8132d..75de98c 100644 --- a/index.test.ts +++ b/index.test.ts @@ -229,19 +229,21 @@ test("reverseDir only includes new rendered files matching include globs", () => dir: "components" }, header: { - render: false, + render: true, text: "test" } }, { reverseMap: true }) writeFileSync(join(renderedOut, "components", "new.ts"), "export const value = 1\n") + writeFileSync(join(renderedOut, "components", "title.ts"), "export const title = 'test'\n") writeFileSync(join(renderedOut, "components", "debug.tmp"), "debug\n") reverseDir(renderedOut, ignoredOut) expect(existsSync(join(ignoredOut, "<@if(context.web.create)><@var(context.web.dir)>", "new.ts"))).toBe(false) const result = reverseDir(renderedOut, templateOut, { include: ["components/**/*.ts"] }) - expect(result.filesWritten).toBe(2) + expect(result.filesWritten).toBe(3) expect(existsSync(join(templateOut, "<@if(context.web.create)><@var(context.web.dir)>", "new.ts"))).toBe(true) + expect(readFileSync(join(templateOut, "<@if(context.web.create)><@var(context.web.dir)>", "title.ts"), "utf-8")).toContain("<@var(context.header.text)>") expect(existsSync(join(templateOut, "<@if(context.web.create)><@var(context.web.dir)>", "debug.tmp"))).toBe(false) }) diff --git a/package.json b/package.json index 157d34a..25cb3dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gregorlohaus/tdir", - "version": "0.1.6", + "version": "0.1.7", "license": "MIT", "type": "module", "main": "./dist/index.js", diff --git a/render.ts b/render.ts index 280f8f8..d032263 100644 --- a/render.ts +++ b/render.ts @@ -139,6 +139,17 @@ function addReverseMapToken( state.manifest.tokens[token.result] = tokens } +function addFlatToken( + state: RenderState | undefined, + result: string, + token: string, +) { + if (!state?.manifest) return + const tokens = state.manifest.tokens[result] ?? [] + if (!tokens.includes(token)) tokens.push(token) + state.manifest.tokens[result] = tokens +} + function getReverseMapPath(destRoot: string, reverseMap: true | string): string { if (reverseMap === true) return resolveOutputPath(destRoot, ".tdir-map.json") return resolveOutputPath(destRoot, reverseMap) @@ -384,6 +395,12 @@ function renderContentWithMap( state?: RenderState, file?: ReverseMapFile, ): string { + for (const match of content.matchAll(VAR_RE)) { + const token = match[0] + const path = match[1]! + addFlatToken(state, String(resolveContext(context, path) ?? ""), token) + } + const processedResult = processIfBlocksWithMap(content, context) const processed = processedResult.content for (const token of processedResult.conditionalTokens) { diff --git a/reverse.ts b/reverse.ts index 8e2ed0e..47c8363 100644 --- a/reverse.ts +++ b/reverse.ts @@ -245,6 +245,19 @@ function writeSkippedTemplate( return 1 } +function replaceFlatTokens(content: string, manifest: ReverseMapManifest): string { + const entries = Object.entries(manifest.tokens) + .filter(([, tokens]) => tokens.length > 0) + .sort(([a], [b]) => b.length - a.length) + + let result = content + for (const [rendered, tokens] of entries) { + if (rendered === "") continue + result = result.split(rendered).join(tokens[0]!) + } + return result +} + function dirnamePath(path: string): string { const normalized = normalizePath(path) const index = normalized.lastIndexOf("/") @@ -340,6 +353,7 @@ function copyIncludedRenderedFiles( templateRoot: string, includedOutputPaths: string[], directoryMap: Map, + manifest: ReverseMapManifest, ): number { let filesWritten = 0 @@ -347,7 +361,12 @@ function copyIncludedRenderedFiles( const renderedPath = resolveInside(renderedRoot, outputPath) const templatePath = resolveInside(templateRoot, inferTemplatePath(outputPath, directoryMap)) mkdirSync(dirname(templatePath), { recursive: true }) - copyFileSync(renderedPath, templatePath) + const content = readFileSync(renderedPath) + if (isUtf8Text(content)) { + writeFileSync(templatePath, replaceFlatTokens(content.toString("utf-8"), manifest)) + } else { + copyFileSync(renderedPath, templatePath) + } filesWritten += 1 } @@ -440,6 +459,7 @@ export function reverseDir( templateRoot, includedOutputPaths, directoryMap, + manifest, ) return { filesWritten, warnings }