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 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAiBlH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAMzG;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAezG;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAUjH;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAUnH"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import yaml from 'js-yaml';
|
|
2
|
+
function parseYaml(content, filePath) {
|
|
3
|
+
try {
|
|
4
|
+
const parsed = yaml.load(content);
|
|
5
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
6
|
+
throw new Error(`Expected a YAML object in ${filePath}, got ${typeof parsed}`);
|
|
7
|
+
}
|
|
8
|
+
return parsed;
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
if (err instanceof yaml.YAMLException) {
|
|
12
|
+
throw new Error(`YAML parse error in ${filePath}: ${err.message}`);
|
|
13
|
+
}
|
|
14
|
+
throw err;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function parseSiteManifest(storage, filePath) {
|
|
18
|
+
const raw = parseYaml(await storage.readFile(filePath), filePath);
|
|
19
|
+
if (typeof raw.name !== 'string') {
|
|
20
|
+
throw new Error(`Invalid site.yaml at ${filePath}: missing required "name" field`);
|
|
21
|
+
}
|
|
22
|
+
return { name: raw.name, version: raw.version };
|
|
23
|
+
}
|
|
24
|
+
export async function parsePageManifest(storage, filePath) {
|
|
25
|
+
const raw = parseYaml(await storage.readFile(filePath), filePath);
|
|
26
|
+
const missing = [];
|
|
27
|
+
if (typeof raw.route !== 'string')
|
|
28
|
+
missing.push('route');
|
|
29
|
+
if (typeof raw.template !== 'string')
|
|
30
|
+
missing.push('template');
|
|
31
|
+
if (missing.length > 0) {
|
|
32
|
+
throw new Error(`Invalid page.yaml at ${filePath}: missing required field(s): ${missing.join(', ')}`);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
route: raw.route,
|
|
36
|
+
template: raw.template,
|
|
37
|
+
content: raw.content,
|
|
38
|
+
components: raw.components,
|
|
39
|
+
metadata: raw.metadata,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export async function parseFragmentManifest(storage, filePath) {
|
|
43
|
+
const raw = parseYaml(await storage.readFile(filePath), filePath);
|
|
44
|
+
if (typeof raw.template !== 'string') {
|
|
45
|
+
throw new Error(`Invalid fragment.yaml at ${filePath}: missing required "template" field`);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
template: raw.template,
|
|
49
|
+
content: raw.content,
|
|
50
|
+
components: raw.components,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export async function parseComponentManifest(storage, filePath) {
|
|
54
|
+
const raw = parseYaml(await storage.readFile(filePath), filePath);
|
|
55
|
+
if (typeof raw.template !== 'string') {
|
|
56
|
+
throw new Error(`Invalid component.yaml at ${filePath}: missing required "template" field`);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
template: raw.template,
|
|
60
|
+
content: raw.content,
|
|
61
|
+
components: raw.components,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAA;AAG1B,SAAS,SAAS,CAAC,OAAe,EAAE,QAAgB;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACjC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,SAAS,OAAO,MAAM,EAAE,CAAC,CAAA;QAChF,CAAC;QACD,OAAO,MAAiC,CAAA;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,IAAI,CAAC,aAAa,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QACpE,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAwB,EAAE,QAAgB;IAChF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAA;IACjE,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,iCAAiC,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAA6B,EAAE,CAAA;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAwB,EAAE,QAAgB;IAChF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAA;IACjE,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxD,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,gCAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvG,CAAC;IACD,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAe;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAkB;QAChC,OAAO,EAAE,GAAG,CAAC,OAA8C;QAC3D,UAAU,EAAE,GAAG,CAAC,UAAkC;QAClD,QAAQ,EAAE,GAAG,CAAC,QAA+C;KAC9D,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAwB,EAAE,QAAgB;IACpF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAA;IACjE,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,qCAAqC,CAAC,CAAA;IAC5F,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,OAAO,EAAE,GAAG,CAAC,OAA8C;QAC3D,UAAU,EAAE,GAAG,CAAC,UAAkC;KACnD,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAwB,EAAE,QAAgB;IACrF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAA;IACjE,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,qCAAqC,CAAC,CAAA;IAC7F,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,OAAO,EAAE,GAAG,CAAC,OAA8C;QAC3D,UAAU,EAAE,GAAG,CAAC,UAAkC;KACnD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { StorageProvider } from '../types.js';
|
|
2
|
+
export interface AzureBlobProviderOptions {
|
|
3
|
+
connectionString: string;
|
|
4
|
+
container: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function createAzureBlobProvider(options: AzureBlobProviderOptions): StorageProvider & {
|
|
7
|
+
init(): Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=azure-blob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-blob.d.ts","sourceRoot":"","sources":["../../src/providers/azure-blob.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,aAAa,CAAA;AAE5D,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;CAClB;AAWD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,eAAe,GAAG;IAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAiFtH"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { BlobServiceClient } from '@azure/storage-blob';
|
|
2
|
+
async function streamToString(readableStream) {
|
|
3
|
+
return new Promise((resolve, reject) => {
|
|
4
|
+
const chunks = [];
|
|
5
|
+
readableStream.on('data', (data) => chunks.push(data.toString('utf8')));
|
|
6
|
+
readableStream.on('end', () => resolve(chunks.join('')));
|
|
7
|
+
readableStream.on('error', reject);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function createAzureBlobProvider(options) {
|
|
11
|
+
const blobServiceClient = BlobServiceClient.fromConnectionString(options.connectionString);
|
|
12
|
+
const containerClient = blobServiceClient.getContainerClient(options.container);
|
|
13
|
+
return {
|
|
14
|
+
async init() {
|
|
15
|
+
await containerClient.createIfNotExists();
|
|
16
|
+
},
|
|
17
|
+
async readFile(path) {
|
|
18
|
+
const blobClient = containerClient.getBlockBlobClient(normalizePath(path));
|
|
19
|
+
try {
|
|
20
|
+
const response = await blobClient.download();
|
|
21
|
+
if (!response.readableStreamBody)
|
|
22
|
+
throw new Error(`Empty response for ${path}`);
|
|
23
|
+
return await streamToString(response.readableStreamBody);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const statusCode = err.statusCode;
|
|
27
|
+
if (statusCode === 404)
|
|
28
|
+
throw new Error(`File not found: ${path}`);
|
|
29
|
+
throw new Error(`Cannot read ${path}: ${err.message}`);
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
async readDir(path) {
|
|
33
|
+
const prefix = normalizePath(path);
|
|
34
|
+
const prefixWithSlash = prefix ? `${prefix}/` : '';
|
|
35
|
+
const entries = new Map();
|
|
36
|
+
for await (const blob of containerClient.listBlobsFlat({ prefix: prefixWithSlash })) {
|
|
37
|
+
const relativeName = blob.name.slice(prefixWithSlash.length);
|
|
38
|
+
const firstSegment = relativeName.split('/')[0];
|
|
39
|
+
if (!firstSegment)
|
|
40
|
+
continue;
|
|
41
|
+
const isDirectory = relativeName.includes('/');
|
|
42
|
+
// If we've seen this name as a directory, keep it as directory
|
|
43
|
+
if (entries.has(firstSegment) && entries.get(firstSegment))
|
|
44
|
+
continue;
|
|
45
|
+
entries.set(firstSegment, isDirectory);
|
|
46
|
+
}
|
|
47
|
+
return [...entries.entries()].map(([name, isDirectory]) => ({ name, isDirectory }));
|
|
48
|
+
},
|
|
49
|
+
async exists(path) {
|
|
50
|
+
const blobClient = containerClient.getBlockBlobClient(normalizePath(path));
|
|
51
|
+
const exists = await blobClient.exists();
|
|
52
|
+
if (exists)
|
|
53
|
+
return true;
|
|
54
|
+
// Check if it's a "directory" (any blobs with this prefix)
|
|
55
|
+
const prefix = normalizePath(path) + '/';
|
|
56
|
+
for await (const _blob of containerClient.listBlobsFlat({ prefix })) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
},
|
|
61
|
+
async writeFile(path, content) {
|
|
62
|
+
const blobClient = containerClient.getBlockBlobClient(normalizePath(path));
|
|
63
|
+
await blobClient.upload(content, Buffer.byteLength(content), {
|
|
64
|
+
blobHTTPHeaders: { blobContentType: 'text/plain; charset=utf-8' },
|
|
65
|
+
});
|
|
66
|
+
},
|
|
67
|
+
async mkdir(_path) {
|
|
68
|
+
// Azure Blob has no directories — they're implicit from blob name prefixes.
|
|
69
|
+
// Nothing to do.
|
|
70
|
+
},
|
|
71
|
+
async rm(path) {
|
|
72
|
+
const normalized = normalizePath(path);
|
|
73
|
+
// Try deleting as a single blob
|
|
74
|
+
const blobClient = containerClient.getBlockBlobClient(normalized);
|
|
75
|
+
if (await blobClient.exists()) {
|
|
76
|
+
await blobClient.delete();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Delete all blobs with this prefix (directory-like delete)
|
|
80
|
+
const prefix = normalized + '/';
|
|
81
|
+
for await (const blob of containerClient.listBlobsFlat({ prefix })) {
|
|
82
|
+
await containerClient.getBlockBlobClient(blob.name).delete();
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function normalizePath(path) {
|
|
88
|
+
// Remove leading slashes and ./ prefixes
|
|
89
|
+
return path.replace(/^(\.\/|\/)+/, '');
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=azure-blob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-blob.js","sourceRoot":"","sources":["../../src/providers/azure-blob.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/providers/filesystem.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,aAAa,CAAA;AAE5D,wBAAgB,wBAAwB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,eAAe,CAiE3E"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readFile, readdir, writeFile, mkdir, access, rm } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export function createFilesystemProvider(basePath) {
|
|
4
|
+
function resolvePath(path) {
|
|
5
|
+
return basePath ? join(basePath, path) : path;
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
async readFile(path) {
|
|
9
|
+
const fullPath = resolvePath(path);
|
|
10
|
+
try {
|
|
11
|
+
return await readFile(fullPath, 'utf-8');
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
const code = err.code;
|
|
15
|
+
if (code === 'ENOENT')
|
|
16
|
+
throw new Error(`File not found: ${fullPath}`);
|
|
17
|
+
throw new Error(`Cannot read ${fullPath}: ${err.message}`);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
async readDir(path) {
|
|
21
|
+
const fullPath = resolvePath(path);
|
|
22
|
+
try {
|
|
23
|
+
const entries = await readdir(fullPath, { withFileTypes: true });
|
|
24
|
+
return entries.map(e => ({ name: e.name, isDirectory: e.isDirectory() }));
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const code = err.code;
|
|
28
|
+
if (code === 'ENOENT')
|
|
29
|
+
throw new Error(`Directory not found: ${fullPath}`);
|
|
30
|
+
throw new Error(`Cannot read directory ${fullPath}: ${err.message}`);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
async exists(path) {
|
|
34
|
+
try {
|
|
35
|
+
await access(resolvePath(path));
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
async writeFile(path, content) {
|
|
43
|
+
const fullPath = resolvePath(path);
|
|
44
|
+
try {
|
|
45
|
+
await writeFile(fullPath, content, 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
throw new Error(`Cannot write ${fullPath}: ${err.message}`);
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
async mkdir(path) {
|
|
52
|
+
const fullPath = resolvePath(path);
|
|
53
|
+
try {
|
|
54
|
+
await mkdir(fullPath, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
throw new Error(`Cannot create directory ${fullPath}: ${err.message}`);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
async rm(path) {
|
|
61
|
+
const fullPath = resolvePath(path);
|
|
62
|
+
try {
|
|
63
|
+
await rm(fullPath, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
throw new Error(`Cannot delete ${fullPath}: ${err.message}`);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/providers/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { StorageProvider } from '../types.js';
|
|
2
|
+
export interface S3ProviderOptions {
|
|
3
|
+
endpoint: string;
|
|
4
|
+
region?: string;
|
|
5
|
+
bucket: string;
|
|
6
|
+
accessKeyId: string;
|
|
7
|
+
secretAccessKey: string;
|
|
8
|
+
forcePathStyle?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function createS3Provider(options: S3ProviderOptions): StorageProvider & {
|
|
11
|
+
init(): Promise<void>;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=s3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../src/providers/s3.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,aAAa,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,eAAe,GAAG;IAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAkGxG"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { S3Client, GetObjectCommand, PutObjectCommand, ListObjectsV2Command, HeadObjectCommand, DeleteObjectCommand, CreateBucketCommand, } from '@aws-sdk/client-s3';
|
|
2
|
+
export function createS3Provider(options) {
|
|
3
|
+
const client = new S3Client({
|
|
4
|
+
endpoint: options.endpoint,
|
|
5
|
+
region: options.region ?? 'auto',
|
|
6
|
+
credentials: {
|
|
7
|
+
accessKeyId: options.accessKeyId,
|
|
8
|
+
secretAccessKey: options.secretAccessKey,
|
|
9
|
+
},
|
|
10
|
+
forcePathStyle: options.forcePathStyle ?? true,
|
|
11
|
+
});
|
|
12
|
+
const bucket = options.bucket;
|
|
13
|
+
return {
|
|
14
|
+
async init() {
|
|
15
|
+
try {
|
|
16
|
+
await client.send(new CreateBucketCommand({ Bucket: bucket }));
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
const code = err.name;
|
|
20
|
+
if (code !== 'BucketAlreadyOwnedByYou' && code !== 'BucketAlreadyExists') {
|
|
21
|
+
// Ignore — bucket may already exist
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
async readFile(path) {
|
|
26
|
+
try {
|
|
27
|
+
const response = await client.send(new GetObjectCommand({ Bucket: bucket, Key: normalizePath(path) }));
|
|
28
|
+
return await response.Body.transformToString('utf-8');
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const code = err.name;
|
|
32
|
+
if (code === 'NoSuchKey')
|
|
33
|
+
throw new Error(`File not found: ${path}`);
|
|
34
|
+
throw new Error(`Cannot read ${path}: ${err.message}`);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
async readDir(path) {
|
|
38
|
+
const prefix = normalizePath(path);
|
|
39
|
+
const prefixWithSlash = prefix ? `${prefix}/` : '';
|
|
40
|
+
const entries = new Map();
|
|
41
|
+
const response = await client.send(new ListObjectsV2Command({
|
|
42
|
+
Bucket: bucket,
|
|
43
|
+
Prefix: prefixWithSlash,
|
|
44
|
+
}));
|
|
45
|
+
for (const obj of response.Contents ?? []) {
|
|
46
|
+
const relativeName = obj.Key.slice(prefixWithSlash.length);
|
|
47
|
+
const firstSegment = relativeName.split('/')[0];
|
|
48
|
+
if (!firstSegment)
|
|
49
|
+
continue;
|
|
50
|
+
const isDirectory = relativeName.includes('/');
|
|
51
|
+
if (entries.has(firstSegment) && entries.get(firstSegment))
|
|
52
|
+
continue;
|
|
53
|
+
entries.set(firstSegment, isDirectory);
|
|
54
|
+
}
|
|
55
|
+
return [...entries.entries()].map(([name, isDirectory]) => ({ name, isDirectory }));
|
|
56
|
+
},
|
|
57
|
+
async exists(path) {
|
|
58
|
+
try {
|
|
59
|
+
await client.send(new HeadObjectCommand({ Bucket: bucket, Key: normalizePath(path) }));
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Check if it's a "directory"
|
|
64
|
+
const response = await client.send(new ListObjectsV2Command({
|
|
65
|
+
Bucket: bucket,
|
|
66
|
+
Prefix: normalizePath(path) + '/',
|
|
67
|
+
MaxKeys: 1,
|
|
68
|
+
}));
|
|
69
|
+
return (response.Contents?.length ?? 0) > 0;
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
async writeFile(path, content) {
|
|
73
|
+
await client.send(new PutObjectCommand({
|
|
74
|
+
Bucket: bucket,
|
|
75
|
+
Key: normalizePath(path),
|
|
76
|
+
Body: content,
|
|
77
|
+
ContentType: 'text/plain; charset=utf-8',
|
|
78
|
+
}));
|
|
79
|
+
},
|
|
80
|
+
async mkdir(_path) {
|
|
81
|
+
// S3 has no directories — implicit from key prefixes
|
|
82
|
+
},
|
|
83
|
+
async rm(path) {
|
|
84
|
+
const prefix = normalizePath(path);
|
|
85
|
+
// Try deleting as a single object first
|
|
86
|
+
try {
|
|
87
|
+
await client.send(new DeleteObjectCommand({ Bucket: bucket, Key: prefix }));
|
|
88
|
+
}
|
|
89
|
+
catch { /* ignore */ }
|
|
90
|
+
// Delete all objects with this prefix
|
|
91
|
+
const response = await client.send(new ListObjectsV2Command({ Bucket: bucket, Prefix: prefix }));
|
|
92
|
+
for (const obj of response.Contents ?? []) {
|
|
93
|
+
await client.send(new DeleteObjectCommand({ Bucket: bucket, Key: obj.Key }));
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function normalizePath(path) {
|
|
99
|
+
return path.replace(/^(\.\/|\/)+/, '');
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=s3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/providers/s3.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { StorageProvider, PurgeStrategy } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Publish a page: SSR all components and store pre-rendered output + manifest in target.
|
|
4
|
+
*/
|
|
5
|
+
export declare function publishPageRendered(pageName: string, sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider): Promise<{
|
|
6
|
+
files: number;
|
|
7
|
+
}>;
|
|
8
|
+
/**
|
|
9
|
+
* Publish a fragment: SSR it and store pre-rendered output in target.
|
|
10
|
+
* All pages referencing this fragment get the update on next request.
|
|
11
|
+
*/
|
|
12
|
+
export declare function publishFragmentRendered(fragmentName: string, sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider): Promise<{
|
|
13
|
+
files: number;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Publish site.yaml (stripped of targets config — not needed on the target)
|
|
17
|
+
*/
|
|
18
|
+
export declare function publishSiteManifest(sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Build and store reverse fragment index.
|
|
21
|
+
* Maps each fragment to the list of page routes that use it.
|
|
22
|
+
* Used by purge-by-URL strategy to know which pages to invalidate.
|
|
23
|
+
*/
|
|
24
|
+
export declare function publishFragmentIndex(sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider): Promise<Record<string, string[]>>;
|
|
25
|
+
/** Purge via Worker's /purge endpoints */
|
|
26
|
+
export declare function createWorkerPurge(workerUrl: string, token?: string): PurgeStrategy;
|
|
27
|
+
/**
|
|
28
|
+
* Publish a fragment and purge affected pages.
|
|
29
|
+
* - purge: 'all' → purge entire cache (free tier)
|
|
30
|
+
* - purge: 'url' → read reverse index, purge only affected page URLs (pro tier)
|
|
31
|
+
*/
|
|
32
|
+
export declare function publishFragmentWithPurge(fragmentName: string, sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider, purge: PurgeStrategy, purgeMode?: 'all' | 'url'): Promise<{
|
|
33
|
+
files: number;
|
|
34
|
+
purgedUrls: string[];
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Publish a page and purge its URL.
|
|
38
|
+
*/
|
|
39
|
+
export declare function publishPageWithPurge(pageName: string, sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider, purge: PurgeStrategy): Promise<{
|
|
40
|
+
files: number;
|
|
41
|
+
purgedUrls: string[];
|
|
42
|
+
}>;
|
|
43
|
+
//# sourceMappingURL=publish-rendered.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-rendered.d.ts","sourceRoot":"","sources":["../src/publish-rendered.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAA6C,aAAa,EAAE,MAAM,YAAY,CAAA;AAO3G;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,GAC7B,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAsD5B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,GAC7B,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB5B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,GAC7B,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAiBnC;AAGD,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAYlF;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,EAC9B,KAAK,EAAE,aAAa,EACpB,SAAS,GAAE,KAAK,GAAG,KAAa,GAC/B,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAmBlD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,EAC9B,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAWlD"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { loadSite } from './site-loader.js';
|
|
3
|
+
import { resolvePage } from './resolver.js';
|
|
4
|
+
import { renderComponent } from './renderer.js';
|
|
5
|
+
import { resetScopeCounter } from './scope.js';
|
|
6
|
+
/**
|
|
7
|
+
* Publish a page: SSR all components and store pre-rendered output + manifest in target.
|
|
8
|
+
*/
|
|
9
|
+
export async function publishPageRendered(pageName, sourceStorage, sourceDir, targetStorage) {
|
|
10
|
+
const site = await loadSite(sourceDir, sourceStorage);
|
|
11
|
+
const page = site.pages.get(pageName);
|
|
12
|
+
if (!page)
|
|
13
|
+
throw new Error(`Page "${pageName}" not found`);
|
|
14
|
+
resetScopeCounter();
|
|
15
|
+
// Resolve and render the full page tree
|
|
16
|
+
const resolved = await resolvePage(pageName, site);
|
|
17
|
+
// Render each top-level child component and store individually
|
|
18
|
+
const componentKeys = [];
|
|
19
|
+
let fileCount = 0;
|
|
20
|
+
for (let i = 0; i < resolved.children.length; i++) {
|
|
21
|
+
const child = resolved.children[i];
|
|
22
|
+
const childName = page.components[i];
|
|
23
|
+
const key = childName.startsWith('@') ? childName : `${pageName}/${childName}`;
|
|
24
|
+
const rendered = await renderComponent(child);
|
|
25
|
+
const json = {
|
|
26
|
+
html: rendered.html,
|
|
27
|
+
css: rendered.css,
|
|
28
|
+
js: rendered.js,
|
|
29
|
+
head: rendered.head,
|
|
30
|
+
};
|
|
31
|
+
await targetStorage.mkdir('components');
|
|
32
|
+
await targetStorage.writeFile(`components/${key}.json`, JSON.stringify(json));
|
|
33
|
+
componentKeys.push(key);
|
|
34
|
+
fileCount++;
|
|
35
|
+
}
|
|
36
|
+
// Store the page manifest
|
|
37
|
+
const manifest = {
|
|
38
|
+
route: page.route,
|
|
39
|
+
metadata: page.metadata,
|
|
40
|
+
components: componentKeys,
|
|
41
|
+
};
|
|
42
|
+
await targetStorage.mkdir('pages');
|
|
43
|
+
await targetStorage.writeFile(`pages/${pageName}.json`, JSON.stringify(manifest));
|
|
44
|
+
fileCount++;
|
|
45
|
+
// Store the page-level template output (global CSS, etc.)
|
|
46
|
+
const childOutputs = await Promise.all(resolved.children.map(c => renderComponent(c)));
|
|
47
|
+
const pageOutput = await resolved.template({ content: resolved.content, children: childOutputs });
|
|
48
|
+
await targetStorage.writeFile(`pages/${pageName}.layout.json`, JSON.stringify({
|
|
49
|
+
css: pageOutput.css,
|
|
50
|
+
head: pageOutput.head,
|
|
51
|
+
}));
|
|
52
|
+
fileCount++;
|
|
53
|
+
return { files: fileCount };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Publish a fragment: SSR it and store pre-rendered output in target.
|
|
57
|
+
* All pages referencing this fragment get the update on next request.
|
|
58
|
+
*/
|
|
59
|
+
export async function publishFragmentRendered(fragmentName, sourceStorage, sourceDir, targetStorage) {
|
|
60
|
+
const site = await loadSite(sourceDir, sourceStorage);
|
|
61
|
+
const fragment = site.fragments.get(fragmentName);
|
|
62
|
+
if (!fragment)
|
|
63
|
+
throw new Error(`Fragment "${fragmentName}" not found`);
|
|
64
|
+
// Build a minimal resolved component for the fragment
|
|
65
|
+
const { resolveComponent } = await import('./resolver.js');
|
|
66
|
+
const templatesDir = join(sourceDir, 'templates');
|
|
67
|
+
const ctx = { site, templatesDir, visited: new Set(), path: [`@${fragmentName}`] };
|
|
68
|
+
const resolved = await resolveComponent(`@${fragmentName}`, '', ctx);
|
|
69
|
+
resetScopeCounter();
|
|
70
|
+
const rendered = await renderComponent(resolved);
|
|
71
|
+
const json = {
|
|
72
|
+
html: rendered.html,
|
|
73
|
+
css: rendered.css,
|
|
74
|
+
js: rendered.js,
|
|
75
|
+
head: rendered.head,
|
|
76
|
+
};
|
|
77
|
+
await targetStorage.mkdir('components');
|
|
78
|
+
await targetStorage.writeFile(`components/@${fragmentName}.json`, JSON.stringify(json));
|
|
79
|
+
return { files: 1 };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Publish site.yaml (stripped of targets config — not needed on the target)
|
|
83
|
+
*/
|
|
84
|
+
export async function publishSiteManifest(sourceStorage, sourceDir, targetStorage) {
|
|
85
|
+
const site = await loadSite(sourceDir, sourceStorage);
|
|
86
|
+
const manifest = { name: site.manifest.name, version: site.manifest.version };
|
|
87
|
+
await targetStorage.writeFile('site.json', JSON.stringify(manifest));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Build and store reverse fragment index.
|
|
91
|
+
* Maps each fragment to the list of page routes that use it.
|
|
92
|
+
* Used by purge-by-URL strategy to know which pages to invalidate.
|
|
93
|
+
*/
|
|
94
|
+
export async function publishFragmentIndex(sourceStorage, sourceDir, targetStorage) {
|
|
95
|
+
const site = await loadSite(sourceDir, sourceStorage);
|
|
96
|
+
const index = {};
|
|
97
|
+
for (const [_pageName, page] of site.pages) {
|
|
98
|
+
if (!page.components)
|
|
99
|
+
continue;
|
|
100
|
+
for (const comp of page.components) {
|
|
101
|
+
if (comp.startsWith('@')) {
|
|
102
|
+
if (!index[comp])
|
|
103
|
+
index[comp] = [];
|
|
104
|
+
index[comp].push(page.route);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
await targetStorage.mkdir('index');
|
|
109
|
+
await targetStorage.writeFile('index/fragments.json', JSON.stringify(index));
|
|
110
|
+
return index;
|
|
111
|
+
}
|
|
112
|
+
/** Purge via Worker's /purge endpoints */
|
|
113
|
+
export function createWorkerPurge(workerUrl, token) {
|
|
114
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
115
|
+
if (token)
|
|
116
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
117
|
+
return {
|
|
118
|
+
async purgeAll() {
|
|
119
|
+
await fetch(`${workerUrl}/purge/all`, { method: 'POST', headers });
|
|
120
|
+
},
|
|
121
|
+
async purgeUrls(urls) {
|
|
122
|
+
await fetch(`${workerUrl}/purge/urls`, { method: 'POST', headers, body: JSON.stringify({ urls }) });
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Publish a fragment and purge affected pages.
|
|
128
|
+
* - purge: 'all' → purge entire cache (free tier)
|
|
129
|
+
* - purge: 'url' → read reverse index, purge only affected page URLs (pro tier)
|
|
130
|
+
*/
|
|
131
|
+
export async function publishFragmentWithPurge(fragmentName, sourceStorage, sourceDir, targetStorage, purge, purgeMode = 'all') {
|
|
132
|
+
const result = await publishFragmentRendered(fragmentName, sourceStorage, sourceDir, targetStorage);
|
|
133
|
+
if (purgeMode === 'all') {
|
|
134
|
+
await purge.purgeAll();
|
|
135
|
+
return { ...result, purgedUrls: ['*'] };
|
|
136
|
+
}
|
|
137
|
+
// Read reverse index to find affected pages
|
|
138
|
+
let index = {};
|
|
139
|
+
try {
|
|
140
|
+
index = JSON.parse(await targetStorage.readFile('index/fragments.json'));
|
|
141
|
+
}
|
|
142
|
+
catch { /* no index yet */ }
|
|
143
|
+
const urls = index[`@${fragmentName}`] ?? [];
|
|
144
|
+
if (urls.length > 0) {
|
|
145
|
+
await purge.purgeUrls(urls);
|
|
146
|
+
}
|
|
147
|
+
return { ...result, purgedUrls: urls };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Publish a page and purge its URL.
|
|
151
|
+
*/
|
|
152
|
+
export async function publishPageWithPurge(pageName, sourceStorage, sourceDir, targetStorage, purge) {
|
|
153
|
+
const result = await publishPageRendered(pageName, sourceStorage, sourceDir, targetStorage);
|
|
154
|
+
// Read the page manifest to get its route
|
|
155
|
+
const manifest = JSON.parse(await targetStorage.readFile(`pages/${pageName}.json`));
|
|
156
|
+
await purge.purgeUrls([manifest.route]);
|
|
157
|
+
// Update the fragment index
|
|
158
|
+
await publishFragmentIndex(sourceStorage, sourceDir, targetStorage);
|
|
159
|
+
return { ...result, purgedUrls: [manifest.route] };
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=publish-rendered.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-rendered.js","sourceRoot":"","sources":["../src/publish-rendered.ts"],"names":[],"mappings":"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"}
|