diff --git a/package.json b/package.json index 24b41e7..261739b 100644 --- a/package.json +++ b/package.json @@ -131,6 +131,10 @@ { "from": "drizzle", "to": "drizzle" + }, + { + "from": "src/main/engine/templates", + "to": "templates" } ], "protocols": [ diff --git a/src/main/engine/PageRenderer.ts b/src/main/engine/PageRenderer.ts index d2077dc..75696b0 100644 --- a/src/main/engine/PageRenderer.ts +++ b/src/main/engine/PageRenderer.ts @@ -815,6 +815,28 @@ export function recordToMap(record: unknown): Map { ); } +export function resolvePageRendererTemplateRoots(options?: { + moduleDir?: string; + cwd?: string; + resourcesPath?: string; +}): string[] { + const moduleDir = options?.moduleDir ?? __dirname; + const cwd = options?.cwd ?? process.cwd(); + const resourcesPath = options?.resourcesPath ?? process.resourcesPath; + + const roots = [ + path.resolve(moduleDir, 'templates'), + path.resolve(cwd, 'dist', 'main', 'engine', 'templates'), + path.resolve(cwd, 'src', 'main', 'engine', 'templates'), + ]; + + if (typeof resourcesPath === 'string' && resourcesPath.length > 0) { + roots.unshift(path.resolve(resourcesPath, 'templates')); + } + + return Array.from(new Set(roots)); +} + export class PageRenderer { private readonly mediaEngine: MediaEngineContract; private readonly postMediaEngine: PostMediaEngineContract; @@ -826,11 +848,7 @@ export class PageRenderer { this.postMediaEngine = postMediaEngine; this.postEngineForMacros = postEngineForMacros; - const templateRoots = [ - path.resolve(__dirname, 'templates'), - path.resolve(process.cwd(), 'dist', 'main', 'engine', 'templates'), - path.resolve(process.cwd(), 'src', 'main', 'engine', 'templates'), - ]; + const templateRoots = resolvePageRendererTemplateRoots(); this.liquid = new Liquid({ root: templateRoots, diff --git a/tests/engine/PageRenderer.templateRoots.test.ts b/tests/engine/PageRenderer.templateRoots.test.ts new file mode 100644 index 0000000..4e220b3 --- /dev/null +++ b/tests/engine/PageRenderer.templateRoots.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, it } from 'vitest'; +import { resolvePageRendererTemplateRoots } from '../../src/main/engine/PageRenderer'; + +describe('resolvePageRendererTemplateRoots', () => { + it('includes templates under process resources path for packaged app builds', () => { + const roots = resolvePageRendererTemplateRoots({ + moduleDir: '/Applications/Blogging Desktop Server.app/Contents/Resources/app.asar/dist/main/engine', + cwd: '/tmp/runtime-cwd', + resourcesPath: '/Applications/Blogging Desktop Server.app/Contents/Resources', + }); + + expect(roots).toContain('/Applications/Blogging Desktop Server.app/Contents/Resources/templates'); + }); +}); \ No newline at end of file