gazetta 0.0.1
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/admin-dist/assets/index-CWxPBgs-.css +1 -0
- package/admin-dist/assets/index-o6Ikobnh.js +1938 -0
- package/admin-dist/index.html +14 -0
- package/dist/admin-api/index.d.ts +13 -0
- package/dist/admin-api/index.d.ts.map +1 -0
- package/dist/admin-api/index.js +27 -0
- package/dist/admin-api/index.js.map +1 -0
- package/dist/admin-api/middleware/auth.d.ts +2 -0
- package/dist/admin-api/middleware/auth.d.ts.map +1 -0
- package/dist/admin-api/middleware/auth.js +14 -0
- package/dist/admin-api/middleware/auth.js.map +1 -0
- package/dist/admin-api/routes/components.d.ts +4 -0
- package/dist/admin-api/routes/components.d.ts.map +1 -0
- package/dist/admin-api/routes/components.js +49 -0
- package/dist/admin-api/routes/components.js.map +1 -0
- package/dist/admin-api/routes/fragments.d.ts +4 -0
- package/dist/admin-api/routes/fragments.d.ts.map +1 -0
- package/dist/admin-api/routes/fragments.js +71 -0
- package/dist/admin-api/routes/fragments.js.map +1 -0
- package/dist/admin-api/routes/pages.d.ts +4 -0
- package/dist/admin-api/routes/pages.d.ts.map +1 -0
- package/dist/admin-api/routes/pages.js +83 -0
- package/dist/admin-api/routes/pages.js.map +1 -0
- package/dist/admin-api/routes/preview.d.ts +4 -0
- package/dist/admin-api/routes/preview.d.ts.map +1 -0
- package/dist/admin-api/routes/preview.js +59 -0
- package/dist/admin-api/routes/preview.js.map +1 -0
- package/dist/admin-api/routes/publish.d.ts +4 -0
- package/dist/admin-api/routes/publish.d.ts.map +1 -0
- package/dist/admin-api/routes/publish.js +119 -0
- package/dist/admin-api/routes/publish.js.map +1 -0
- package/dist/admin-api/routes/site.d.ts +4 -0
- package/dist/admin-api/routes/site.d.ts.map +1 -0
- package/dist/admin-api/routes/site.js +11 -0
- package/dist/admin-api/routes/site.js.map +1 -0
- package/dist/admin-api/routes/templates.d.ts +4 -0
- package/dist/admin-api/routes/templates.d.ts.map +1 -0
- package/dist/admin-api/routes/templates.js +29 -0
- package/dist/admin-api/routes/templates.js.map +1 -0
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +17 -0
- package/dist/app.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +404 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/editor/mount.d.ts +3 -0
- package/dist/editor/mount.d.ts.map +1 -0
- package/dist/editor/mount.js +74 -0
- package/dist/editor/mount.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +6 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +64 -0
- package/dist/manifest.js.map +1 -0
- package/dist/providers/azure-blob.d.ts +9 -0
- package/dist/providers/azure-blob.d.ts.map +1 -0
- package/dist/providers/azure-blob.js +91 -0
- package/dist/providers/azure-blob.js.map +1 -0
- package/dist/providers/filesystem.d.ts +3 -0
- package/dist/providers/filesystem.d.ts.map +1 -0
- package/dist/providers/filesystem.js +71 -0
- package/dist/providers/filesystem.js.map +1 -0
- package/dist/providers/s3.d.ts +13 -0
- package/dist/providers/s3.d.ts.map +1 -0
- package/dist/providers/s3.js +101 -0
- package/dist/providers/s3.js.map +1 -0
- package/dist/publish-rendered.d.ts +43 -0
- package/dist/publish-rendered.d.ts.map +1 -0
- package/dist/publish-rendered.js +161 -0
- package/dist/publish-rendered.js.map +1 -0
- package/dist/publish.d.ts +26 -0
- package/dist/publish.d.ts.map +1 -0
- package/dist/publish.js +115 -0
- package/dist/publish.js.map +1 -0
- package/dist/renderer.d.ts +4 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +47 -0
- package/dist/renderer.js.map +1 -0
- package/dist/resolver.d.ts +12 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +67 -0
- package/dist/resolver.js.map +1 -0
- package/dist/scope.d.ts +13 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +31 -0
- package/dist/scope.js.map +1 -0
- package/dist/site-loader.d.ts +14 -0
- package/dist/site-loader.d.ts.map +1 -0
- package/dist/site-loader.js +67 -0
- package/dist/site-loader.js.map +1 -0
- package/dist/targets.d.ts +4 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +68 -0
- package/dist/targets.js.map +1 -0
- package/dist/template-loader.d.ts +11 -0
- package/dist/template-loader.d.ts.map +1 -0
- package/dist/template-loader.js +51 -0
- package/dist/template-loader.js.map +1 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { StorageProvider } from './types.js';
|
|
2
|
+
export interface PublishRequest {
|
|
3
|
+
source: string;
|
|
4
|
+
targets: string[];
|
|
5
|
+
items: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface PublishResult {
|
|
8
|
+
target: string;
|
|
9
|
+
success: boolean;
|
|
10
|
+
error?: string;
|
|
11
|
+
copiedFiles: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Copy items from source storage to target storage.
|
|
15
|
+
* Items are relative paths like "pages/home" or "fragments/header".
|
|
16
|
+
* All files under each item directory are copied recursively.
|
|
17
|
+
*/
|
|
18
|
+
export declare function publishItems(sourceStorage: StorageProvider, sourceBase: string, targetStorage: StorageProvider, targetBase: string, items: string[]): Promise<{
|
|
19
|
+
copiedFiles: number;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve dependencies for published items.
|
|
23
|
+
* Given a list of items (pages/fragments), find all referenced templates and fragments.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveDependencies(storage: StorageProvider, siteBase: string, items: string[]): Promise<string[]>;
|
|
26
|
+
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,eAAe,EAC9B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,eAAe,EAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBlC;AA+CD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CASnB"}
|
package/dist/publish.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Copy items from source storage to target storage.
|
|
4
|
+
* Items are relative paths like "pages/home" or "fragments/header".
|
|
5
|
+
* All files under each item directory are copied recursively.
|
|
6
|
+
*/
|
|
7
|
+
export async function publishItems(sourceStorage, sourceBase, targetStorage, targetBase, items) {
|
|
8
|
+
let copiedFiles = 0;
|
|
9
|
+
for (const item of items) {
|
|
10
|
+
const sourcePath = join(sourceBase, item);
|
|
11
|
+
const targetPath = join(targetBase, item);
|
|
12
|
+
copiedFiles += await copyRecursive(sourceStorage, sourcePath, targetStorage, targetPath);
|
|
13
|
+
}
|
|
14
|
+
// Also copy site.yaml
|
|
15
|
+
try {
|
|
16
|
+
const siteYaml = await sourceStorage.readFile(join(sourceBase, 'site.yaml'));
|
|
17
|
+
await targetStorage.writeFile(join(targetBase, 'site.yaml'), siteYaml);
|
|
18
|
+
copiedFiles++;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// site.yaml may not need copying if target already has it
|
|
22
|
+
}
|
|
23
|
+
return { copiedFiles };
|
|
24
|
+
}
|
|
25
|
+
async function copyRecursive(source, sourcePath, target, targetPath) {
|
|
26
|
+
let count = 0;
|
|
27
|
+
// Check if sourcePath is a file
|
|
28
|
+
try {
|
|
29
|
+
const content = await source.readFile(sourcePath);
|
|
30
|
+
await target.mkdir(dirname(targetPath));
|
|
31
|
+
await target.writeFile(targetPath, content);
|
|
32
|
+
return 1;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Not a file — try as directory
|
|
36
|
+
}
|
|
37
|
+
// Try as directory
|
|
38
|
+
if (!await source.exists(sourcePath))
|
|
39
|
+
return 0;
|
|
40
|
+
const entries = await source.readDir(sourcePath);
|
|
41
|
+
await target.mkdir(targetPath);
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
const childSource = join(sourcePath, entry.name);
|
|
44
|
+
const childTarget = join(targetPath, entry.name);
|
|
45
|
+
if (entry.isDirectory) {
|
|
46
|
+
count += await copyRecursive(source, childSource, target, childTarget);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const content = await source.readFile(childSource);
|
|
50
|
+
await target.writeFile(childTarget, content);
|
|
51
|
+
count++;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return count;
|
|
55
|
+
}
|
|
56
|
+
function dirname(path) {
|
|
57
|
+
const parts = path.split('/');
|
|
58
|
+
parts.pop();
|
|
59
|
+
return parts.join('/');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Resolve dependencies for published items.
|
|
63
|
+
* Given a list of items (pages/fragments), find all referenced templates and fragments.
|
|
64
|
+
*/
|
|
65
|
+
export async function resolveDependencies(storage, siteBase, items) {
|
|
66
|
+
const allItems = new Set(items);
|
|
67
|
+
const visited = new Set();
|
|
68
|
+
for (const item of items) {
|
|
69
|
+
await collectDependencies(storage, siteBase, item, allItems, visited);
|
|
70
|
+
}
|
|
71
|
+
return [...allItems];
|
|
72
|
+
}
|
|
73
|
+
async function collectDependencies(storage, siteBase, item, allItems, visited) {
|
|
74
|
+
if (visited.has(item))
|
|
75
|
+
return;
|
|
76
|
+
visited.add(item);
|
|
77
|
+
const manifestNames = ['page.yaml', 'fragment.yaml', 'component.yaml'];
|
|
78
|
+
let manifestContent = null;
|
|
79
|
+
const itemPath = join(siteBase, item);
|
|
80
|
+
for (const name of manifestNames) {
|
|
81
|
+
try {
|
|
82
|
+
manifestContent = await storage.readFile(join(itemPath, name));
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (!manifestContent)
|
|
90
|
+
return;
|
|
91
|
+
// Parse template reference
|
|
92
|
+
const templateMatch = manifestContent.match(/template:\s*(.+)/);
|
|
93
|
+
if (templateMatch) {
|
|
94
|
+
const templateName = templateMatch[1].trim();
|
|
95
|
+
allItems.add(`templates/${templateName}`);
|
|
96
|
+
}
|
|
97
|
+
// Parse component references
|
|
98
|
+
const componentsMatch = manifestContent.match(/components:\n((?:\s+-\s+.+\n?)+)/);
|
|
99
|
+
if (componentsMatch) {
|
|
100
|
+
const lines = componentsMatch[1].split('\n').map(l => l.trim()).filter(l => l.startsWith('-'));
|
|
101
|
+
for (const line of lines) {
|
|
102
|
+
const name = line.replace(/^-\s+/, '').replace(/^["']|["']$/g, '');
|
|
103
|
+
if (name.startsWith('@')) {
|
|
104
|
+
const fragName = name.slice(1);
|
|
105
|
+
allItems.add(`fragments/${fragName}`);
|
|
106
|
+
await collectDependencies(storage, siteBase, `fragments/${fragName}`, allItems, visited);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const childPath = `${item}/${name}`;
|
|
110
|
+
await collectDependencies(storage, siteBase, childPath, allItems, visited);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RenderOutput, ResolvedComponent } from './types.js';
|
|
2
|
+
export declare function renderComponent(component: ResolvedComponent, routeParams?: Record<string, string>): Promise<RenderOutput>;
|
|
3
|
+
export declare function renderPage(component: ResolvedComponent, metadata?: Record<string, unknown>, routeParams?: Record<string, string>): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAGjE,wBAAsB,eAAe,CAAC,SAAS,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAgB/H;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,MAAM,CAAC,CAgCjB"}
|
package/dist/renderer.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { generateScopeId, scopeHtml, scopeCss, resetScopeCounter } from './scope.js';
|
|
2
|
+
export async function renderComponent(component, routeParams) {
|
|
3
|
+
const children = await Promise.all(component.children.map(c => renderComponent(c, routeParams)));
|
|
4
|
+
const output = await component.template({ content: component.content, children, params: routeParams });
|
|
5
|
+
const scopeId = generateScopeId();
|
|
6
|
+
const headParts = [
|
|
7
|
+
...children.map(c => c.head).filter(Boolean),
|
|
8
|
+
output.head,
|
|
9
|
+
].filter(Boolean);
|
|
10
|
+
return {
|
|
11
|
+
html: scopeHtml(output.html, scopeId),
|
|
12
|
+
css: scopeCss(output.css, scopeId),
|
|
13
|
+
js: output.js,
|
|
14
|
+
head: headParts.length ? headParts.join('\n') : undefined,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export async function renderPage(component, metadata, routeParams) {
|
|
18
|
+
resetScopeCounter();
|
|
19
|
+
const children = await Promise.all(component.children.map(c => renderComponent(c, routeParams)));
|
|
20
|
+
const output = await component.template({ content: component.content, children, params: routeParams });
|
|
21
|
+
const title = metadata?.title ?? 'Gazetta';
|
|
22
|
+
const description = metadata?.description;
|
|
23
|
+
const componentHead = [
|
|
24
|
+
...children.map(c => c.head).filter(Boolean),
|
|
25
|
+
output.head,
|
|
26
|
+
].filter(Boolean).join('\n ');
|
|
27
|
+
const metaHead = [
|
|
28
|
+
description ? `<meta name="description" content="${description}">` : '',
|
|
29
|
+
description ? `<meta property="og:description" content="${description}">` : '',
|
|
30
|
+
title ? `<meta property="og:title" content="${title}">` : '',
|
|
31
|
+
].filter(Boolean).join('\n ');
|
|
32
|
+
return `<!DOCTYPE html>
|
|
33
|
+
<html lang="en">
|
|
34
|
+
<head>
|
|
35
|
+
<meta charset="UTF-8">
|
|
36
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
37
|
+
<title>${title}</title>
|
|
38
|
+
${metaHead}
|
|
39
|
+
${componentHead}
|
|
40
|
+
<style>${output.css}</style>
|
|
41
|
+
</head>
|
|
42
|
+
<body>
|
|
43
|
+
${output.html}${output.js ? `\n<script type="module">${output.js}</script>` : ''}
|
|
44
|
+
</body>
|
|
45
|
+
</html>`;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEpF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAA4B,EAAE,WAAoC;IACtG,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;IAChG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IAEtG,MAAM,OAAO,GAAG,eAAe,EAAE,CAAA;IACjC,MAAM,SAAS,GAAG;QAChB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAC5C,MAAM,CAAC,IAAI;KACZ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAEjB,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;QACrC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC;QAClC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC1D,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAA4B,EAC5B,QAAkC,EAClC,WAAoC;IAEpC,iBAAiB,EAAE,CAAA;IACnB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;IAChG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IACtG,MAAM,KAAK,GAAI,QAAQ,EAAE,KAAgB,IAAI,SAAS,CAAA;IACtD,MAAM,WAAW,GAAG,QAAQ,EAAE,WAAiC,CAAA;IAE/D,MAAM,aAAa,GAAG;QACpB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAC5C,MAAM,CAAC,IAAI;KACZ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAE9B,MAAM,QAAQ,GAAG;QACf,WAAW,CAAC,CAAC,CAAC,qCAAqC,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE;QACvE,WAAW,CAAC,CAAC,CAAC,4CAA4C,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE;QAC9E,KAAK,CAAC,CAAC,CAAC,sCAAsC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE;KAC7D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAE9B,OAAO;;;;;WAKE,KAAK;IACZ,QAAQ;IACR,aAAa;WACN,MAAM,CAAC,GAAG;;;EAGnB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE;;QAExE,CAAA;AACR,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ResolvedComponent } from './types.js';
|
|
2
|
+
import type { Site } from './site-loader.js';
|
|
3
|
+
interface ResolveContext {
|
|
4
|
+
site: Site;
|
|
5
|
+
templatesDir: string;
|
|
6
|
+
visited: Set<string>;
|
|
7
|
+
path: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function resolveComponent(name: string, parentDir: string, ctx: ResolveContext): Promise<ResolvedComponent>;
|
|
10
|
+
export declare function resolvePage(pageName: string, site: Site): Promise<ResolvedComponent>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,YAAY,CAAA;AAGtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAE5C,UAAU,cAAc;IACtB,IAAI,EAAE,IAAI,CAAA;IACV,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpB,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAwD5B;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuB1F"}
|
package/dist/resolver.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { parseComponentManifest } from './manifest.js';
|
|
3
|
+
import { loadTemplate } from './template-loader.js';
|
|
4
|
+
export async function resolveComponent(name, parentDir, ctx) {
|
|
5
|
+
const isFragment = name.startsWith('@');
|
|
6
|
+
const key = isFragment ? name : `${parentDir}/${name}`;
|
|
7
|
+
if (ctx.visited.has(key)) {
|
|
8
|
+
throw new Error(`Circular reference detected: ${key}\n` +
|
|
9
|
+
` Resolution path: ${ctx.path.join(' → ')} → ${name}`);
|
|
10
|
+
}
|
|
11
|
+
ctx.visited.add(key);
|
|
12
|
+
ctx.path.push(name);
|
|
13
|
+
let manifest;
|
|
14
|
+
let componentDir;
|
|
15
|
+
const { storage } = ctx.site;
|
|
16
|
+
if (isFragment) {
|
|
17
|
+
const fragmentName = name.slice(1);
|
|
18
|
+
const fragment = ctx.site.fragments.get(fragmentName);
|
|
19
|
+
if (!fragment) {
|
|
20
|
+
const available = [...ctx.site.fragments.keys()];
|
|
21
|
+
throw new Error(`Fragment "@${fragmentName}" not found.\n` +
|
|
22
|
+
` Referenced in: ${ctx.path.slice(0, -1).join(' → ') || 'page root'}\n` +
|
|
23
|
+
` Available fragments: ${available.length > 0 ? available.join(', ') : '(none)'}`);
|
|
24
|
+
}
|
|
25
|
+
manifest = fragment;
|
|
26
|
+
componentDir = fragment.dir;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
componentDir = join(parentDir, name);
|
|
30
|
+
const manifestPath = join(componentDir, 'component.yaml');
|
|
31
|
+
if (!await storage.exists(manifestPath)) {
|
|
32
|
+
throw new Error(`Component "${name}" not found. Expected manifest at ${manifestPath}\n` +
|
|
33
|
+
` Referenced in: ${ctx.path.slice(0, -1).join(' → ') || 'page root'}\n` +
|
|
34
|
+
` Parent directory: ${parentDir}`);
|
|
35
|
+
}
|
|
36
|
+
manifest = await parseComponentManifest(storage, manifestPath);
|
|
37
|
+
}
|
|
38
|
+
const loaded = await loadTemplate(storage, ctx.templatesDir, manifest.template);
|
|
39
|
+
const children = [];
|
|
40
|
+
if (manifest.components) {
|
|
41
|
+
for (const childName of manifest.components) {
|
|
42
|
+
children.push(await resolveComponent(childName, componentDir, ctx));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
ctx.path.pop();
|
|
46
|
+
ctx.visited.delete(key);
|
|
47
|
+
return { template: loaded.render, content: manifest.content, children, path: componentDir };
|
|
48
|
+
}
|
|
49
|
+
export async function resolvePage(pageName, site) {
|
|
50
|
+
const page = site.pages.get(pageName);
|
|
51
|
+
if (!page) {
|
|
52
|
+
const available = [...site.pages.keys()];
|
|
53
|
+
throw new Error(`Page "${pageName}" not found.\n` +
|
|
54
|
+
` Available pages: ${available.length > 0 ? available.join(', ') : '(none)'}`);
|
|
55
|
+
}
|
|
56
|
+
const templatesDir = join(site.siteDir, 'templates');
|
|
57
|
+
const ctx = { site, templatesDir, visited: new Set(), path: [pageName] };
|
|
58
|
+
const loaded = await loadTemplate(site.storage, templatesDir, page.template);
|
|
59
|
+
const children = [];
|
|
60
|
+
if (page.components) {
|
|
61
|
+
for (const childName of page.components) {
|
|
62
|
+
children.push(await resolveComponent(childName, page.dir, ctx));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { template: loaded.render, content: page.content, children, path: page.dir };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/scope.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function generateScopeId(): string;
|
|
2
|
+
export declare function resetScopeCounter(): void;
|
|
3
|
+
/**
|
|
4
|
+
* Wraps HTML in a scoped container with a data-gz attribute.
|
|
5
|
+
*/
|
|
6
|
+
export declare function scopeHtml(html: string, scopeId: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Prefixes CSS selectors with a scope attribute selector using PostCSS.
|
|
9
|
+
* Handles all CSS edge cases: @-rules, combinators, pseudo-elements,
|
|
10
|
+
* content strings, CSS nesting, attribute selectors.
|
|
11
|
+
*/
|
|
12
|
+
export declare function scopeCss(css: string, scopeId: string): string;
|
|
13
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAS7D"}
|
package/dist/scope.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import postcss from 'postcss';
|
|
2
|
+
// @ts-expect-error no type declarations available
|
|
3
|
+
import prefixer from 'postcss-prefix-selector';
|
|
4
|
+
let counter = 0;
|
|
5
|
+
export function generateScopeId() {
|
|
6
|
+
return 'gz' + (counter++).toString(36);
|
|
7
|
+
}
|
|
8
|
+
export function resetScopeCounter() {
|
|
9
|
+
counter = 0;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Wraps HTML in a scoped container with a data-gz attribute.
|
|
13
|
+
*/
|
|
14
|
+
export function scopeHtml(html, scopeId) {
|
|
15
|
+
return `<div data-gz="${scopeId}">${html}</div>`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Prefixes CSS selectors with a scope attribute selector using PostCSS.
|
|
19
|
+
* Handles all CSS edge cases: @-rules, combinators, pseudo-elements,
|
|
20
|
+
* content strings, CSS nesting, attribute selectors.
|
|
21
|
+
*/
|
|
22
|
+
export function scopeCss(css, scopeId) {
|
|
23
|
+
if (!css.trim())
|
|
24
|
+
return '';
|
|
25
|
+
const prefix = `[data-gz="${scopeId}"]`;
|
|
26
|
+
const result = postcss([
|
|
27
|
+
prefixer({ prefix, transform: (_prefix, selector) => `${prefix} ${selector}` }),
|
|
28
|
+
]).process(css).css;
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,kDAAkD;AAClD,OAAO,QAAQ,MAAM,yBAAyB,CAAA;AAE9C,IAAI,OAAO,GAAG,CAAC,CAAA;AAEf,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAAG,CAAC,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAAe;IACrD,OAAO,iBAAiB,OAAO,KAAK,IAAI,QAAQ,CAAA;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,OAAe;IACnD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAA;IAE1B,MAAM,MAAM,GAAG,aAAa,OAAO,IAAI,CAAA;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,OAAe,EAAE,QAAgB,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,EAAE,CAAC;KAChG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAA;IAEnB,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PageManifest, FragmentManifest, SiteManifest, StorageProvider } from './types.js';
|
|
2
|
+
export interface Site {
|
|
3
|
+
manifest: SiteManifest;
|
|
4
|
+
pages: Map<string, PageManifest & {
|
|
5
|
+
dir: string;
|
|
6
|
+
}>;
|
|
7
|
+
fragments: Map<string, FragmentManifest & {
|
|
8
|
+
dir: string;
|
|
9
|
+
}>;
|
|
10
|
+
siteDir: string;
|
|
11
|
+
storage: StorageProvider;
|
|
12
|
+
}
|
|
13
|
+
export declare function loadSite(siteDir: string, storage: StorageProvider): Promise<Site>;
|
|
14
|
+
//# sourceMappingURL=site-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-loader.d.ts","sourceRoot":"","sources":["../src/site-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAG/F,MAAM,WAAW,IAAI;IACnB,QAAQ,EAAE,YAAY,CAAA;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,eAAe,CAAA;CACzB;AA+DD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { parseSiteManifest, parsePageManifest, parseFragmentManifest } from './manifest.js';
|
|
3
|
+
async function discoverPages(storage, pagesDir, pages = new Map(), prefix = '') {
|
|
4
|
+
if (!await storage.exists(pagesDir)) {
|
|
5
|
+
if (!prefix)
|
|
6
|
+
console.warn(` Warning: pages/ directory not found at ${pagesDir}`);
|
|
7
|
+
return pages;
|
|
8
|
+
}
|
|
9
|
+
const entries = await storage.readDir(pagesDir);
|
|
10
|
+
for (const entry of entries) {
|
|
11
|
+
if (!entry.isDirectory)
|
|
12
|
+
continue;
|
|
13
|
+
const dir = join(pagesDir, entry.name);
|
|
14
|
+
const name = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
15
|
+
const manifestPath = join(dir, 'page.yaml');
|
|
16
|
+
if (await storage.exists(manifestPath)) {
|
|
17
|
+
try {
|
|
18
|
+
const manifest = await parsePageManifest(storage, manifestPath);
|
|
19
|
+
pages.set(name, { ...manifest, dir });
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
console.warn(` Warning: skipping page "${name}": ${err.message}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Recurse into subdirectories to find nested pages (e.g., blog/[slug])
|
|
26
|
+
await discoverPages(storage, dir, pages, name);
|
|
27
|
+
}
|
|
28
|
+
return pages;
|
|
29
|
+
}
|
|
30
|
+
async function discoverFragments(storage, fragmentsDir) {
|
|
31
|
+
const fragments = new Map();
|
|
32
|
+
if (!await storage.exists(fragmentsDir)) {
|
|
33
|
+
console.warn(` Warning: fragments/ directory not found at ${fragmentsDir}`);
|
|
34
|
+
return fragments;
|
|
35
|
+
}
|
|
36
|
+
const entries = await storage.readDir(fragmentsDir);
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
if (!entry.isDirectory)
|
|
39
|
+
continue;
|
|
40
|
+
const fragDir = join(fragmentsDir, entry.name);
|
|
41
|
+
const manifestPath = join(fragDir, 'fragment.yaml');
|
|
42
|
+
if (!await storage.exists(manifestPath))
|
|
43
|
+
continue;
|
|
44
|
+
try {
|
|
45
|
+
const manifest = await parseFragmentManifest(storage, manifestPath);
|
|
46
|
+
fragments.set(entry.name, { ...manifest, dir: fragDir });
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
console.warn(` Warning: skipping fragment "${entry.name}": ${err.message}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return fragments;
|
|
53
|
+
}
|
|
54
|
+
export async function loadSite(siteDir, storage) {
|
|
55
|
+
const siteYaml = join(siteDir, 'site.yaml');
|
|
56
|
+
if (!await storage.exists(siteYaml)) {
|
|
57
|
+
throw new Error(`No site.yaml found at ${siteDir}. Is this a Gazetta site directory?`);
|
|
58
|
+
}
|
|
59
|
+
const manifest = await parseSiteManifest(storage, siteYaml);
|
|
60
|
+
const pages = await discoverPages(storage, join(siteDir, 'pages'));
|
|
61
|
+
const fragments = await discoverFragments(storage, join(siteDir, 'fragments'));
|
|
62
|
+
if (pages.size === 0) {
|
|
63
|
+
console.warn(` Warning: no pages found in ${join(siteDir, 'pages')}`);
|
|
64
|
+
}
|
|
65
|
+
return { manifest, pages, fragments, siteDir, storage };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=site-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-loader.js","sourceRoot":"","sources":["../src/site-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { StorageProvider, TargetConfig } from './types.js';
|
|
2
|
+
export declare function createTargetProvider(config: TargetConfig, siteDir: string): Promise<StorageProvider>;
|
|
3
|
+
export declare function createTargetRegistry(targets: Record<string, TargetConfig>, siteDir: string): Promise<Map<string, StorageProvider>>;
|
|
4
|
+
//# sourceMappingURL=targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAQ/D,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAoC1G;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAcxI"}
|
package/dist/targets.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { createFilesystemProvider } from './providers/filesystem.js';
|
|
3
|
+
function resolveEnvVars(value) {
|
|
4
|
+
if (!value)
|
|
5
|
+
return value;
|
|
6
|
+
return value.replace(/\$\{(\w+)\}/g, (_, name) => process.env[name] ?? '');
|
|
7
|
+
}
|
|
8
|
+
export async function createTargetProvider(config, siteDir) {
|
|
9
|
+
switch (config.type) {
|
|
10
|
+
case 'filesystem':
|
|
11
|
+
if (!config.path)
|
|
12
|
+
throw new Error('Filesystem target requires "path"');
|
|
13
|
+
return createFilesystemProvider(resolve(siteDir, config.path));
|
|
14
|
+
case 'azure-blob': {
|
|
15
|
+
const connectionString = resolveEnvVars(config.connectionString);
|
|
16
|
+
if (!connectionString)
|
|
17
|
+
throw new Error('Azure Blob target requires "connectionString"');
|
|
18
|
+
if (!config.container)
|
|
19
|
+
throw new Error('Azure Blob target requires "container"');
|
|
20
|
+
try {
|
|
21
|
+
const { createAzureBlobProvider } = await import('./providers/azure-blob.js');
|
|
22
|
+
return createAzureBlobProvider({ connectionString, container: config.container });
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new Error('Azure Blob target requires @azure/storage-blob. Install it: npm install @azure/storage-blob');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
case 's3': {
|
|
29
|
+
const endpoint = resolveEnvVars(config.endpoint);
|
|
30
|
+
if (!endpoint)
|
|
31
|
+
throw new Error('S3 target requires "endpoint"');
|
|
32
|
+
if (!config.bucket)
|
|
33
|
+
throw new Error('S3 target requires "bucket"');
|
|
34
|
+
try {
|
|
35
|
+
const { createS3Provider } = await import('./providers/s3.js');
|
|
36
|
+
return createS3Provider({
|
|
37
|
+
endpoint,
|
|
38
|
+
bucket: config.bucket,
|
|
39
|
+
accessKeyId: resolveEnvVars(config.accessKeyId) ?? 'minioadmin',
|
|
40
|
+
secretAccessKey: resolveEnvVars(config.secretAccessKey) ?? 'minioadmin',
|
|
41
|
+
region: config.region,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new Error('S3 target requires @aws-sdk/client-s3. Install it: npm install @aws-sdk/client-s3');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
default:
|
|
49
|
+
throw new Error(`Unknown target type: ${config.type}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function createTargetRegistry(targets, siteDir) {
|
|
53
|
+
const registry = new Map();
|
|
54
|
+
for (const [name, config] of Object.entries(targets)) {
|
|
55
|
+
try {
|
|
56
|
+
const provider = await createTargetProvider(config, siteDir);
|
|
57
|
+
if ('init' in provider && typeof provider.init === 'function') {
|
|
58
|
+
await provider.init();
|
|
59
|
+
}
|
|
60
|
+
registry.set(name, provider);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
console.warn(` Warning: target "${name}" failed to initialize: ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return registry;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TemplateFunction, TemplateModule, StorageProvider } from './types.js';
|
|
2
|
+
interface LoadedTemplate {
|
|
3
|
+
render: TemplateFunction;
|
|
4
|
+
schema: unknown;
|
|
5
|
+
editor?: TemplateModule['editor'];
|
|
6
|
+
}
|
|
7
|
+
export declare function loadTemplate(storage: StorageProvider, templatesDir: string, templateName: string): Promise<LoadedTemplate>;
|
|
8
|
+
export declare function invalidateTemplate(templateName: string): void;
|
|
9
|
+
export declare function invalidateAllTemplates(): void;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=template-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-loader.d.ts","sourceRoot":"","sources":["../src/template-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEnF,UAAU,cAAc;IACtB,MAAM,EAAE,gBAAgB,CAAA;IACxB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;CAClC;AAcD,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA4ChI;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
const cache = new Map();
|
|
3
|
+
const TEMPLATE_FILES = ['index.ts', 'index.tsx'];
|
|
4
|
+
async function findTemplateFile(storage, templatesDir, templateName) {
|
|
5
|
+
for (const file of TEMPLATE_FILES) {
|
|
6
|
+
const path = join(templatesDir, templateName, file);
|
|
7
|
+
if (await storage.exists(path))
|
|
8
|
+
return path;
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
export async function loadTemplate(storage, templatesDir, templateName) {
|
|
13
|
+
const cached = cache.get(templateName);
|
|
14
|
+
if (cached)
|
|
15
|
+
return cached;
|
|
16
|
+
const templatePath = await findTemplateFile(storage, templatesDir, templateName);
|
|
17
|
+
if (!templatePath) {
|
|
18
|
+
throw new Error(`Template "${templateName}" not found. Expected index.ts or index.tsx in ${join(templatesDir, templateName)}\n` +
|
|
19
|
+
` Available templates are in ${templatesDir}`);
|
|
20
|
+
}
|
|
21
|
+
let mod;
|
|
22
|
+
try {
|
|
23
|
+
mod = await import(`${templatePath}?t=${Date.now()}`);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
throw new Error(`Failed to import template "${templateName}" from ${templatePath}: ${err.message}`);
|
|
27
|
+
}
|
|
28
|
+
const render = mod.default;
|
|
29
|
+
if (typeof render !== 'function') {
|
|
30
|
+
throw new Error(`Template "${templateName}" at ${templatePath} does not export a default function. ` +
|
|
31
|
+
`Got ${typeof render}. Templates must: export default (params) => ({ html, css, js })`);
|
|
32
|
+
}
|
|
33
|
+
if (!mod.schema) {
|
|
34
|
+
throw new Error(`Template "${templateName}" at ${templatePath} does not export a schema. ` +
|
|
35
|
+
`Templates must: export const schema = z.object({ ... })`);
|
|
36
|
+
}
|
|
37
|
+
const loaded = {
|
|
38
|
+
render,
|
|
39
|
+
schema: mod.schema,
|
|
40
|
+
editor: mod.editor,
|
|
41
|
+
};
|
|
42
|
+
cache.set(templateName, loaded);
|
|
43
|
+
return loaded;
|
|
44
|
+
}
|
|
45
|
+
export function invalidateTemplate(templateName) {
|
|
46
|
+
cache.delete(templateName);
|
|
47
|
+
}
|
|
48
|
+
export function invalidateAllTemplates() {
|
|
49
|
+
cache.clear();
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=template-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-loader.js","sourceRoot":"","sources":["../src/template-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAShC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAA;AAE/C,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;AAEhD,KAAK,UAAU,gBAAgB,CAAC,OAAwB,EAAE,YAAoB,EAAE,YAAoB;IAClG,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;QACnD,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;IAC7C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAwB,EAAE,YAAoB,EAAE,YAAoB;IACrG,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACtC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;IAChF,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,kDAAkD,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,IAAI;YAC/G,gCAAgC,YAAY,EAAE,CAC/C,CAAA;IACH,CAAC;IAED,IAAI,GAA4B,CAAA;IAChC,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,YAAY,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,8BAA8B,YAAY,UAAU,YAAY,KAAM,GAAa,CAAC,OAAO,EAAE,CAC9F,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,OAA2B,CAAA;IAC9C,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,QAAQ,YAAY,uCAAuC;YACpF,OAAO,OAAO,MAAM,kEAAkE,CACvF,CAAA;IACH,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,QAAQ,YAAY,6BAA6B;YAC1E,yDAAyD,CAC1D,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAmB;QAC7B,MAAM;QACN,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,GAAG,CAAC,MAAkC;KAC/C,CAAA;IAED,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IAC/B,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAAoB;IACrD,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,KAAK,CAAC,KAAK,EAAE,CAAA;AACf,CAAC"}
|