@oktis-works/web 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,14 +2,18 @@
2
2
  // @oktis-works/web - Theme Engine Runtime
3
3
  // Renders sites via themes using Theme SDK
4
4
  import { Hono } from 'hono';
5
+ import { existsSync, readFileSync, statSync } from 'node:fs';
5
6
  import { join } from 'node:path';
6
7
  import { serve } from '@hono/node-server';
7
8
  import { bootstrap } from '@oktis-works/core';
8
9
  import { establishTenantContext } from '@oktis-works/core';
9
10
  import { getConnection } from '@oktis-works/database';
10
- import { createRouter, wireThemeHooks } from './rendering.js';
11
+ import { createRouter, wireThemeHooks, renderContentPage, fetchSiteSettings, resolveThemeAssetPath, contentTypeForAsset, } from './rendering.js';
11
12
  import { resolveTenantFromHost } from './tenant-resolver.js';
12
13
  import { setCurrentContent } from '@oktis-works/theme-sdk';
14
+ function bodyOf(row) {
15
+ return (row['body'] ?? {});
16
+ }
13
17
  async function main() {
14
18
  const lifecycle = await bootstrap();
15
19
  wireThemeHooks();
@@ -35,7 +39,22 @@ async function main() {
35
39
  timestamp: new Date().toISOString(),
36
40
  });
37
41
  });
38
- // Content rendering routes (FEAT-095: runtime routing catch-all)
42
+ // B2 — assets do tema: GET /themes/<tema>/<path> → serveStatic do diretório
43
+ // themes/ com traversal guard (resolveThemeAssetPath nega qualquer escape).
44
+ app.get('/themes/*', async (c) => {
45
+ const wildcard = c.req.path.replace(/^\/themes\//, '');
46
+ const [themeName, ...rest] = wildcard.split('/');
47
+ const assetPath = rest.join('/');
48
+ const target = resolveThemeAssetPath(themesRoot, themeName ?? '', assetPath);
49
+ if (!target || !existsSync(target) || !statSync(target).isFile()) {
50
+ return c.notFound();
51
+ }
52
+ return c.body(new Uint8Array(readFileSync(target)), 200, {
53
+ 'Content-Type': contentTypeForAsset(target),
54
+ 'Cache-Control': 'public, max-age=3600',
55
+ });
56
+ });
57
+ // Content rendering routes (FEAT-095: runtime routing catch-all) — render REAL
39
58
  app.get('*', async (c) => {
40
59
  const path = c.req.path;
41
60
  try {
@@ -43,30 +62,47 @@ async function main() {
43
62
  if (!resolution.matched) {
44
63
  return c.notFound();
45
64
  }
65
+ // B1 — conteúdo real: row publicada do slug resolvido
66
+ let contentRow = null;
67
+ let data = {};
46
68
  if (resolution.slug && resolution.contentType) {
47
69
  const rows = await getConnection().unsafe("SELECT * FROM content WHERE slug = $1 AND type = $2 AND status = 'PUBLISHED' LIMIT 1", [resolution.slug, resolution.contentType]);
48
- const row = rows[0];
49
- if (row)
50
- setCurrentContent(row);
70
+ contentRow = rows[0] ?? null;
71
+ if (contentRow) {
72
+ setCurrentContent(contentRow);
73
+ data = bodyOf(contentRow);
74
+ }
75
+ }
76
+ // B1 — archives/home: itens publicados recentes do tipo resolvido
77
+ const items = [];
78
+ if (!resolution.slug) {
79
+ const typeFilter = resolution.contentType
80
+ ? 'WHERE type = $1 AND status = \'PUBLISHED\''
81
+ : "WHERE status = 'PUBLISHED'";
82
+ const params = resolution.contentType ? [resolution.contentType] : [];
83
+ const rows = await getConnection().unsafe(`SELECT * FROM content ${typeFilter} ORDER BY published_at DESC NULLS LAST, updated_at DESC LIMIT 20`, params);
84
+ items.push(...rows.map((row) => ({
85
+ ...bodyOf(row),
86
+ title: row['title'],
87
+ slug: row['slug'],
88
+ type: row['type'],
89
+ excerpt: row['excerpt'],
90
+ published_at: row['published_at'],
91
+ updated_at: row['updated_at'],
92
+ })));
51
93
  }
52
- const escapeAttr = (value) => value.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
53
- const template = escapeAttr(resolution.template ?? '');
54
- const contentType = escapeAttr(resolution.contentType ?? '');
55
- const themeAttr = escapeAttr(activeTheme);
56
- return c.html(`<!DOCTYPE html>
57
- <html lang="en">
58
- <head>
59
- <meta charset="UTF-8">
60
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
61
- <title>OkCMS</title>
62
- <link rel="stylesheet" href="/themes/${themeAttr}/dist/theme.css" data-theme-style="${themeAttr}" />
63
- </head>
64
- <body>
65
- <main data-theme="${themeAttr}" data-template="${template}" data-type="${contentType}">
66
- <!-- Rendered by theme template (isolado via [data-theme="${themeAttr}"]) -->
67
- </main>
68
- </body>
69
- </html>`);
94
+ // B1 — título/meta das settings (fim do "OkCMS" hardcoded)
95
+ const settings = await fetchSiteSettings(getConnection());
96
+ const html = renderContentPage({
97
+ resolution,
98
+ contentRow,
99
+ data,
100
+ items,
101
+ settings,
102
+ activeTheme,
103
+ themesRoot,
104
+ });
105
+ return c.html(html);
70
106
  }
71
107
  catch (error) {
72
108
  console.error('[web] Falha ao resolver rota:', error);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=render-page.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-page.test.d.ts","sourceRoot":"","sources":["../src/render-page.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,186 @@
1
+ // @oktis-works/web - B3: renderização real do site público (template + settings + assets)
2
+ import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest';
3
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+ vi.mock('@oktis-works/database', () => ({
7
+ getConnection: vi.fn(() => ({
8
+ unsafe: vi.fn(async () => []),
9
+ })),
10
+ }));
11
+ vi.mock('@oktis-works/plugin-runtime', () => ({
12
+ getHookRegistry: vi.fn(() => ({ addFilter: vi.fn(), doAction: vi.fn() })),
13
+ }));
14
+ vi.mock('@oktis-works/core', () => ({
15
+ postTypeRegistry: { list: vi.fn(async () => []) },
16
+ HOOK_POINTS: {},
17
+ }));
18
+ import { loadTemplateSource, renderContentPage, fetchSiteSettings, resolveThemeAssetPath, contentTypeForAsset, } from './rendering.js';
19
+ let themesRoot;
20
+ beforeAll(() => {
21
+ themesRoot = mkdtempSync(join(tmpdir(), 'okcms-themes-'));
22
+ // Tema "mytheme": template específico + fallback no tema default
23
+ mkdirSync(join(themesRoot, 'mytheme'), { recursive: true });
24
+ writeFileSync(join(themesRoot, 'mytheme', 'post.astro'), `<main data-theme="{{site.theme}}"><h1>{{content.title}}</h1><div class="body">{{{content.html}}}</div></main>`);
25
+ mkdirSync(join(themesRoot, 'default', 'dist'), { recursive: true });
26
+ writeFileSync(join(themesRoot, 'default', 'single.astro'), `<main data-theme="{{site.theme}}"><h1>{{content.title}}</h1><p>{{site.description}}</p></main>`);
27
+ writeFileSync(join(themesRoot, 'default', 'home.astro'), `<main><h1>{{site.title}}</h1>{{#if site.description}}<p>{{site.description}}</p>{{/if}}{{#if items}}<ul>{{#each items}}<li><a href="/{{slug}}">{{title}}</a></li>{{/each}}</ul>{{/if}}</main>`);
28
+ writeFileSync(join(themesRoot, 'default', 'dist', 'theme.css'), '[data-theme="default"] main { color: red; }');
29
+ });
30
+ afterAll(() => {
31
+ rmSync(themesRoot, { recursive: true, force: true });
32
+ });
33
+ const settings = { siteTitle: 'Meu Site', siteDescription: 'Descrição do site' };
34
+ const resolution = { matched: true, template: 'single.astro', contentType: 'page', slug: 'sobre' };
35
+ const contentRow = { id: 'c1', title: 'Sobre nós', slug: 'sobre', type: 'page', body: { html: '<p>Conteúdo</p>' } };
36
+ describe('renderContentPage — B1 render real', () => {
37
+ it('renderiza o conteúdo no template do tema ativo (body/campos)', () => {
38
+ const html = renderContentPage({
39
+ resolution: { matched: true, template: 'post.astro', contentType: 'post', slug: 'ola' },
40
+ contentRow,
41
+ data: contentRow['body'],
42
+ settings,
43
+ activeTheme: 'mytheme',
44
+ themesRoot,
45
+ });
46
+ expect(html).toContain('<h1>Sobre nós</h1>');
47
+ expect(html).toContain('<div class="body"><p>Conteúdo</p></div>');
48
+ expect(html).toContain('data-theme="mytheme"');
49
+ });
50
+ it('título da página usa siteTitle das settings (fim do OkCMS hardcoded)', () => {
51
+ const html = renderContentPage({
52
+ resolution: { matched: true, template: 'home.astro' },
53
+ contentRow: null,
54
+ data: {},
55
+ settings,
56
+ activeTheme: 'default',
57
+ themesRoot,
58
+ });
59
+ expect(html).toContain('<h1>Meu Site</h1>');
60
+ expect(html).not.toContain('OkCMS');
61
+ expect(html).toContain('Descrição do site');
62
+ });
63
+ it('meta description = siteDescription nas settings', () => {
64
+ const html = renderContentPage({
65
+ resolution: { matched: true, template: 'home.astro' },
66
+ contentRow: null,
67
+ data: {},
68
+ settings,
69
+ activeTheme: 'default',
70
+ themesRoot,
71
+ });
72
+ expect(html).toContain('Descrição do site');
73
+ });
74
+ it('fallback: template default quando o específico não existe no tema ativo', () => {
75
+ // mytheme não tem single.astro — cai no default
76
+ const html = renderContentPage({
77
+ resolution,
78
+ contentRow,
79
+ data: {},
80
+ settings,
81
+ activeTheme: 'mytheme',
82
+ themesRoot,
83
+ });
84
+ expect(html).toContain('<h1>Sobre nós</h1>');
85
+ expect(html).toContain('Descrição do site');
86
+ });
87
+ it('escapa variáveis interpoladas ({{var}}) e mantém raw ({{{var}}})', () => {
88
+ const html = renderContentPage({
89
+ resolution: { matched: true, template: 'post.astro', contentType: 'post', slug: 'ola' },
90
+ contentRow: { ...contentRow, title: '<script>x</script>' },
91
+ data: { html: '<p>ok</p>' },
92
+ settings,
93
+ activeTheme: 'mytheme',
94
+ themesRoot,
95
+ });
96
+ expect(html).toContain('&lt;script&gt;x&lt;/script&gt;');
97
+ expect(html).toContain('<p>ok</p>');
98
+ });
99
+ it('archive/home lista itens reais', () => {
100
+ const html = renderContentPage({
101
+ resolution: { matched: true, template: 'home.astro' },
102
+ contentRow: null,
103
+ data: {},
104
+ items: [
105
+ { title: 'Primeiro post', slug: 'primeiro' },
106
+ { title: 'Segundo post', slug: 'segundo' },
107
+ ],
108
+ settings,
109
+ activeTheme: 'default',
110
+ themesRoot,
111
+ });
112
+ expect(html).toContain('Primeiro post');
113
+ expect(html).toContain('href="/primeiro"');
114
+ expect(html).toContain('href="/segundo"');
115
+ });
116
+ it('lista vazia não renderiza a section de itens', () => {
117
+ const html = renderContentPage({
118
+ resolution: { matched: true, template: 'home.astro' },
119
+ contentRow: null,
120
+ data: {},
121
+ items: [],
122
+ settings,
123
+ activeTheme: 'default',
124
+ themesRoot,
125
+ });
126
+ expect(html).not.toContain('<ul>');
127
+ });
128
+ });
129
+ describe('loadTemplateSource — B1 cadeia de fallback', () => {
130
+ it('tema ativo → default', () => {
131
+ expect(loadTemplateSource(themesRoot, 'mytheme', 'single.astro')).toContain('data-theme');
132
+ expect(loadTemplateSource(themesRoot, 'inexistente', 'single.astro')).toContain('data-theme');
133
+ });
134
+ it('arquivo inexistente → null', () => {
135
+ expect(loadTemplateSource(themesRoot, 'mytheme', 'nao-existe.astro')).toBeNull();
136
+ });
137
+ });
138
+ describe('fetchSiteSettings — B1 settings do site', () => {
139
+ it('lê siteTitle/siteDescription das settings', async () => {
140
+ const { getConnection } = await import('@oktis-works/database');
141
+ const sql = {
142
+ unsafe: vi.fn(async () => [
143
+ { key: 'siteTitle', value: 'Título do Banco' },
144
+ { key: 'siteDescription', value: 'Descrição do Banco' },
145
+ ]),
146
+ };
147
+ getConnection.mockReturnValueOnce(sql);
148
+ const result = await fetchSiteSettings(sql);
149
+ expect(result.siteTitle).toBe('Título do Banco');
150
+ expect(result.siteDescription).toBe('Descrição do Banco');
151
+ });
152
+ it('falha de banco → fallbacks locais', async () => {
153
+ const sql = {
154
+ unsafe: vi.fn(async () => {
155
+ throw new Error('db down');
156
+ }),
157
+ };
158
+ const result = await fetchSiteSettings(sql);
159
+ expect(result.siteTitle).toBe('OkCMS');
160
+ expect(result.siteDescription).toBe('');
161
+ });
162
+ });
163
+ describe('resolveThemeAssetPath — B2 traversal guard', () => {
164
+ it('asset dentro do tema resolve', () => {
165
+ const target = resolveThemeAssetPath(themesRoot, 'default', 'dist/theme.css');
166
+ expect(target).toContain(join('default', 'dist', 'theme.css'));
167
+ });
168
+ it('.. que escapa do tema é negado', () => {
169
+ expect(resolveThemeAssetPath(themesRoot, 'default', '../../../etc/passwd')).toBeNull();
170
+ expect(resolveThemeAssetPath(themesRoot, 'default', 'dist/../../secrets.json')).toBeNull();
171
+ });
172
+ it('nome de tema inválido é negado', () => {
173
+ expect(resolveThemeAssetPath(themesRoot, '../outside', 'x.css')).toBeNull();
174
+ expect(resolveThemeAssetPath(themesRoot, '', 'x.css')).toBeNull();
175
+ });
176
+ });
177
+ describe('contentTypeForAsset — B2 mime types', () => {
178
+ it('mapeia extensões comuns', () => {
179
+ expect(contentTypeForAsset('theme.css')).toContain('text/css');
180
+ expect(contentTypeForAsset('app.js')).toContain('text/javascript');
181
+ expect(contentTypeForAsset('logo.svg')).toContain('image/svg');
182
+ expect(contentTypeForAsset('font.woff2')).toContain('font/woff2');
183
+ expect(contentTypeForAsset('arquivo.desconhecido')).toBe('application/octet-stream');
184
+ });
185
+ });
186
+ //# sourceMappingURL=render-page.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-page.test.js","sourceRoot":"","sources":["../src/render-page.test.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1B,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5C,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;CAC1E,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,gBAAgB,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE;IACjD,WAAW,EAAE,EAAE;CAChB,CAAC,CAAC,CAAC;AAEJ,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,IAAI,UAAkB,CAAC;AAEvB,SAAS,CAAC,GAAG,EAAE;IACb,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAE1D,iEAAiE;IACjE,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,aAAa,CACX,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,EACzC,+GAA+G,CAChH,CAAC;IAEF,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,aAAa,CACX,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC,EAC3C,gGAAgG,CACjG,CAAC;IACF,aAAa,CACX,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,EACzC,+LAA+L,CAChM,CAAC;IACF,aAAa,CACX,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAChD,6CAA6C,CAC9C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,GAAG,EAAE;IACZ,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AACjF,MAAM,UAAU,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACnG,MAAM,UAAU,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,CAAC;AAEpH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;YACvF,UAAU;YACV,IAAI,EAAE,UAAU,CAAC,MAAM,CAA4B;YACnD,QAAQ;YACR,WAAW,EAAE,SAAS;YACtB,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE;YACrD,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,EAAE;YACR,QAAQ;YACR,WAAW,EAAE,SAAS;YACtB,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE;YACrD,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,EAAE;YACR,QAAQ;YACR,WAAW,EAAE,SAAS;YACtB,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,gDAAgD;QAChD,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,UAAU;YACV,UAAU;YACV,IAAI,EAAE,EAAE;YACR,QAAQ;YACR,WAAW,EAAE,SAAS;YACtB,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;YACvF,UAAU,EAAE,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,oBAAoB,EAAE;YAC1D,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;YAC3B,QAAQ;YACR,WAAW,EAAE,SAAS;YACtB,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE;YACrD,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,EAAE;YACR,KAAK,EAAE;gBACL,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE;gBAC5C,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE;aAC3C;YACD,QAAQ;YACR,WAAW,EAAE,SAAS;YACtB,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE;YACrD,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,QAAQ;YACR,WAAW,EAAE,SAAS;YACtB,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC1F,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG;YACV,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;gBACxB,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE;gBAC9C,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,oBAAoB,EAAE;aACxD,CAAC;SACH,CAAC;QACD,aAA0C,CAAC,mBAAmB,CAAC,GAAY,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAY,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,GAAG,GAAG;YACV,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACvB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC,CAAC;SACH,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAY,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACvF,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5E,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACnE,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC/D,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClE,MAAM,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,5 +1,59 @@
1
- import { RuntimeRouter, type ContentLookup, type TemplateFileChecker } from '@oktis-works/theme-runtime';
1
+ import { getConnection } from '@oktis-works/database';
2
+ import { RuntimeRouter, ThemeRenderer, type ContentLookup, type TemplateFileChecker } from '@oktis-works/theme-runtime';
2
3
  export declare function createTemplateChecker(themesRoot: string, activeTheme: string): TemplateFileChecker;
4
+ /**
5
+ * B1 — carrega o ARQUIVO do template do tema ativo (fallback _shared → default).
6
+ * Retorna null quando nenhum candidato existe (rota cai no 404 do tema).
7
+ */
8
+ export declare function loadTemplateSource(themesRoot: string, activeTheme: string, file: string): string | null;
9
+ export interface SiteSettings {
10
+ siteTitle: string;
11
+ siteDescription: string;
12
+ }
13
+ /**
14
+ * B1 — título/descrição do site vêm das settings (fim do "OkCMS" hardcoded).
15
+ * Falha de leitura nunca derruba o render (fallbacks locais).
16
+ */
17
+ export declare function fetchSiteSettings(sql: ReturnType<typeof getConnection>): Promise<SiteSettings>;
18
+ export declare const themeRenderer: ThemeRenderer;
19
+ export interface ContentPageRenderInput {
20
+ resolution: {
21
+ template?: string;
22
+ contentType?: string;
23
+ slug?: string;
24
+ matched: boolean;
25
+ };
26
+ contentRow?: Record<string, unknown> | null;
27
+ data: Record<string, unknown>;
28
+ /** Itens de archive/home (conteúdo publicado recente do tipo). */
29
+ items?: Array<Record<string, unknown>>;
30
+ settings: SiteSettings;
31
+ activeTheme: string;
32
+ themesRoot: string;
33
+ }
34
+ /**
35
+ * B1 — render real: injeta `content.body`/campos no template do tema.
36
+ * Contexto exposto ao template:
37
+ * site.title / site.description — settings (siteTitle/siteDescription)
38
+ * content.* — colunas da row + campos do body
39
+ * page.title / page.description — título da página (SEO) e meta description
40
+ * settings — settings cruas (avançado)
41
+ */
42
+ export declare function renderContentPage(input: ContentPageRenderInput): string;
43
+ /**
44
+ * B1 — envolve o fragmento do template num documento completo com title/meta
45
+ * das settings + CSS do tema. Template que já emite documento completo passa
46
+ * intocado (temas headless/full-control).
47
+ */
48
+ export declare function wrapDocument(body: string, pageTitle: string, settings: SiteSettings, activeTheme: string): string;
49
+ export declare function escapeHtml(value: string): string;
50
+ /**
51
+ * B2 — resolução segura de asset do tema: `/themes/<tema>/<path>`.
52
+ * Traversal guard: o caminho resolvido PRECISA continuar dentro do diretório
53
+ * do tema (nega `..`, symlinks fora da raiz e paths absolutos).
54
+ */
55
+ export declare function resolveThemeAssetPath(themesRoot: string, themeName: string, assetPath: string): string | null;
56
+ export declare function contentTypeForAsset(assetPath: string): string;
3
57
  export declare function createContentLookup(): ContentLookup;
4
58
  export declare function createRouter(themesRoot: string, activeTheme: string): RuntimeRouter;
5
59
  /** Helper para web: obtém atributo de isolamento para template */
@@ -1 +1 @@
1
- {"version":3,"file":"rendering.d.ts","sourceRoot":"","sources":["../src/rendering.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,mBAAmB,EAGzB,MAAM,4BAA4B,CAAC;AAEpC,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAWlG;AAqFD,wBAAgB,mBAAmB,IAAI,aAAa,CAqCnD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAGnF;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,2EAA2E;AAC3E,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,wBAAwB,EAAE,aAAa;;;;;GAE9H;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAOrC"}
1
+ {"version":3,"file":"rendering.d.ts","sourceRoot":"","sources":["../src/rendering.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAEL,aAAa,EACb,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,mBAAmB,EAGzB,MAAM,4BAA4B,CAAC;AAEpC,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAMlG;AAWD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvG;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAepG;AASD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAEjD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,kEAAkE;IAClE,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CA+BvE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,MAAM,GAClB,MAAM,CAoBR;AAkCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY7G;AAqBD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI7D;AAqFD,wBAAgB,mBAAmB,IAAI,aAAa,CAqCnD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAGnF;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,2EAA2E;AAC3E,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,wBAAwB,EAAE,aAAa;;;;;GAE9H;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAOrC"}
package/dist/rendering.js CHANGED
@@ -1,22 +1,198 @@
1
1
  // @oktis-works/web - Runtime Rendering (catch-all SSR com hierarquia de templates)
2
- import { existsSync } from 'node:fs';
3
- import { join } from 'node:path';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { join, resolve, sep } from 'node:path';
4
4
  import { getConnection } from '@oktis-works/database';
5
5
  import { getHookRegistry } from '@oktis-works/plugin-runtime';
6
6
  import { postTypeRegistry, HOOK_POINTS } from '@oktis-works/core';
7
- import { TemplateHierarchyResolver, RuntimeRouter, buildThemeStyles, getThemeScopeAttribute, } from '@oktis-works/theme-runtime';
7
+ import { TemplateHierarchyResolver, RuntimeRouter, ThemeRenderer, buildThemeStyles, getThemeScopeAttribute, } from '@oktis-works/theme-runtime';
8
8
  export function createTemplateChecker(themesRoot, activeTheme) {
9
9
  return {
10
10
  exists(file) {
11
- const candidates = [
12
- join(themesRoot, activeTheme, file),
13
- join(themesRoot, '_shared', file),
14
- join(themesRoot, 'default', file),
15
- ];
16
- return candidates.some((candidate) => existsSync(candidate));
11
+ return templateCandidates(themesRoot, activeTheme, file).some((candidate) => existsSync(candidate));
17
12
  },
18
13
  };
19
14
  }
15
+ /** Cadeia de busca do arquivo de template: tema ativo → _shared → default. */
16
+ function templateCandidates(themesRoot, activeTheme, file) {
17
+ return [
18
+ join(themesRoot, activeTheme, file),
19
+ join(themesRoot, '_shared', file),
20
+ join(themesRoot, 'default', file),
21
+ ];
22
+ }
23
+ /**
24
+ * B1 — carrega o ARQUIVO do template do tema ativo (fallback _shared → default).
25
+ * Retorna null quando nenhum candidato existe (rota cai no 404 do tema).
26
+ */
27
+ export function loadTemplateSource(themesRoot, activeTheme, file) {
28
+ for (const candidate of templateCandidates(themesRoot, activeTheme, file)) {
29
+ if (existsSync(candidate)) {
30
+ return readFileSync(candidate, 'utf-8');
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * B1 — título/descrição do site vêm das settings (fim do "OkCMS" hardcoded).
37
+ * Falha de leitura nunca derruba o render (fallbacks locais).
38
+ */
39
+ export async function fetchSiteSettings(sql) {
40
+ try {
41
+ const rows = await sql.unsafe("SELECT key, value FROM settings WHERE key IN ('siteTitle', 'siteDescription')");
42
+ const byKey = new Map(rows.map((r) => [r.key, r.value]));
43
+ return {
44
+ siteTitle: toText(byKey.get('siteTitle')) || 'OkCMS',
45
+ siteDescription: toText(byKey.get('siteDescription')) || '',
46
+ };
47
+ }
48
+ catch {
49
+ return { siteTitle: 'OkCMS', siteDescription: '' };
50
+ }
51
+ }
52
+ function toText(value) {
53
+ if (value == null)
54
+ return '';
55
+ if (typeof value === 'string')
56
+ return value;
57
+ if (typeof value === 'number' || typeof value === 'boolean')
58
+ return String(value);
59
+ return '';
60
+ }
61
+ export const themeRenderer = new ThemeRenderer();
62
+ /**
63
+ * B1 — render real: injeta `content.body`/campos no template do tema.
64
+ * Contexto exposto ao template:
65
+ * site.title / site.description — settings (siteTitle/siteDescription)
66
+ * content.* — colunas da row + campos do body
67
+ * page.title / page.description — título da página (SEO) e meta description
68
+ * settings — settings cruas (avançado)
69
+ */
70
+ export function renderContentPage(input) {
71
+ const file = input.resolution.template ?? 'index.astro';
72
+ const template = loadTemplateSource(input.themesRoot, input.activeTheme, file);
73
+ if (!template) {
74
+ return renderFallbackPage(input);
75
+ }
76
+ const row = input.contentRow ?? {};
77
+ const title = toText(row['title']) || input.settings.siteTitle;
78
+ const context = {
79
+ site: {
80
+ title: input.settings.siteTitle,
81
+ description: input.settings.siteDescription,
82
+ theme: input.activeTheme,
83
+ },
84
+ page: {
85
+ title,
86
+ description: input.settings.siteDescription,
87
+ template: input.resolution.template ?? '',
88
+ type: input.resolution.contentType ?? '',
89
+ slug: input.resolution.slug ?? '',
90
+ },
91
+ content: { ...input.data, ...plainColumns(row) },
92
+ fields: input.data,
93
+ items: input.items ?? [],
94
+ settings: input.settings,
95
+ };
96
+ const body = themeRenderer.renderString(template, context, row);
97
+ return wrapDocument(body, title, input.settings, input.activeTheme);
98
+ }
99
+ /**
100
+ * B1 — envolve o fragmento do template num documento completo com title/meta
101
+ * das settings + CSS do tema. Template que já emite documento completo passa
102
+ * intocado (temas headless/full-control).
103
+ */
104
+ export function wrapDocument(body, pageTitle, settings, activeTheme) {
105
+ if (body.includes('<html') || body.includes('<!DOCTYPE')) {
106
+ return body;
107
+ }
108
+ const title = pageTitle && pageTitle !== settings.siteTitle ? `${pageTitle} | ${settings.siteTitle}` : settings.siteTitle;
109
+ return `<!DOCTYPE html>
110
+ <html lang="pt-BR">
111
+ <head>
112
+ <meta charset="UTF-8">
113
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
114
+ <title>${escapeHtml(title)}</title>
115
+ <meta name="description" content="${escapeHtml(settings.siteDescription)}">
116
+ <link rel="stylesheet" href="/themes/${escapeHtml(activeTheme)}/dist/theme.css" data-theme-style="${escapeHtml(activeTheme)}" />
117
+ </head>
118
+ <body>
119
+ ${body}
120
+ </body>
121
+ </html>`;
122
+ }
123
+ /** Colunas da row sem `body` (o body já foi mesclado como campos). */
124
+ function plainColumns(row) {
125
+ const out = {};
126
+ for (const [key, value] of Object.entries(row)) {
127
+ if (key === 'body')
128
+ continue;
129
+ out[key] = value;
130
+ }
131
+ return out;
132
+ }
133
+ /** Tema sem template para a rota: HTML mínimo com os dados reais (nunca stub). */
134
+ function renderFallbackPage(input) {
135
+ const title = toText((input.contentRow ?? {})['title']) || input.settings.siteTitle;
136
+ return `<!DOCTYPE html>
137
+ <html lang="pt-BR">
138
+ <head>
139
+ <meta charset="UTF-8">
140
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
141
+ <title>${escapeHtml(title)} | ${escapeHtml(input.settings.siteTitle)}</title>
142
+ <meta name="description" content="${escapeHtml(input.settings.siteDescription)}">
143
+ </head>
144
+ <body>
145
+ <main data-theme="${escapeHtml(input.activeTheme)}">
146
+ <article>
147
+ <h1>${escapeHtml(title)}</h1>
148
+ <div class="entry__body">${escapeHtml(JSON.stringify(input.data))}</div>
149
+ </article>
150
+ </main>
151
+ </body>
152
+ </html>`;
153
+ }
154
+ export function escapeHtml(value) {
155
+ return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
156
+ }
157
+ /**
158
+ * B2 — resolução segura de asset do tema: `/themes/<tema>/<path>`.
159
+ * Traversal guard: o caminho resolvido PRECISA continuar dentro do diretório
160
+ * do tema (nega `..`, symlinks fora da raiz e paths absolutos).
161
+ */
162
+ export function resolveThemeAssetPath(themesRoot, themeName, assetPath) {
163
+ if (!themeName || !/^[A-Za-z0-9_-]+$/.test(themeName))
164
+ return null;
165
+ const themeRoot = resolve(themesRoot, themeName);
166
+ const target = resolve(themeRoot, assetPath);
167
+ // resolve() já normalizou `..` — basta garantir que segue dentro do tema.
168
+ if (target !== themeRoot && !target.startsWith(themeRoot + sep)) {
169
+ return null;
170
+ }
171
+ return target;
172
+ }
173
+ const CONTENT_TYPE_BY_EXT = {
174
+ '.css': 'text/css; charset=utf-8',
175
+ '.js': 'text/javascript; charset=utf-8',
176
+ '.mjs': 'text/javascript; charset=utf-8',
177
+ '.json': 'application/json; charset=utf-8',
178
+ '.svg': 'image/svg+xml',
179
+ '.png': 'image/png',
180
+ '.jpg': 'image/jpeg',
181
+ '.jpeg': 'image/jpeg',
182
+ '.gif': 'image/gif',
183
+ '.webp': 'image/webp',
184
+ '.avif': 'image/avif',
185
+ '.ico': 'image/x-icon',
186
+ '.woff': 'font/woff',
187
+ '.woff2': 'font/woff2',
188
+ '.ttf': 'font/ttf',
189
+ '.txt': 'text/plain; charset=utf-8',
190
+ };
191
+ export function contentTypeForAsset(assetPath) {
192
+ const dot = assetPath.lastIndexOf('.');
193
+ const ext = dot === -1 ? '' : assetPath.slice(dot).toLowerCase();
194
+ return CONTENT_TYPE_BY_EXT[ext] ?? 'application/octet-stream';
195
+ }
20
196
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
21
197
  const MEDIA_KEY_RE = /media|image|thumb|cover|gallery/i;
22
198
  function collectMediaIds(value, out, depth = 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"rendering.js","sourceRoot":"","sources":["../src/rendering.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rendering.js","sourceRoot":"","sources":["../src/rendering.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oktis-works/web",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -18,15 +18,15 @@
18
18
  "clean": "rm -rf dist tsconfig.tsbuildinfo"
19
19
  },
20
20
  "dependencies": {
21
- "@oktis-works/core": "^0.1.13",
22
- "@oktis-works/config": "^0.1.13",
23
- "@oktis-works/database": "^0.1.13",
24
- "@oktis-works/types": "^0.1.13",
25
- "@oktis-works/theme-sdk": "^0.1.13",
26
- "@oktis-works/theme-runtime": "^0.1.13",
21
+ "@oktis-works/core": "^0.1.14",
22
+ "@oktis-works/config": "^0.1.14",
23
+ "@oktis-works/database": "^0.1.14",
24
+ "@oktis-works/types": "^0.1.14",
25
+ "@oktis-works/theme-sdk": "^0.1.14",
26
+ "@oktis-works/theme-runtime": "^0.1.14",
27
27
  "hono": "4.13.12",
28
28
  "@hono/node-server": "1.8.0",
29
- "@oktis-works/plugin-runtime": "^0.1.13"
29
+ "@oktis-works/plugin-runtime": "^0.1.14"
30
30
  },
31
31
  "devDependencies": {
32
32
  "typescript": "5.7.3",