gazetta 0.4.0 → 0.6.0
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-B6pVot0Y.css +1 -0
- package/admin-dist/assets/index-DniLwxJA.js +609 -0
- package/admin-dist/assets/{vendor-primevue-BnR1c_bQ.js → vendor-primevue-C0Q_YTCb.js} +330 -431
- package/admin-dist/assets/vendor-vue-D3wBSmDf.js +1 -0
- package/admin-dist/index.html +4 -4
- package/dist/admin-api/index.d.ts +26 -5
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +175 -13
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/routes/compare.d.ts +3 -1
- package/dist/admin-api/routes/compare.d.ts.map +1 -1
- package/dist/admin-api/routes/compare.js +34 -24
- package/dist/admin-api/routes/compare.js.map +1 -1
- package/dist/admin-api/routes/fields.d.ts +2 -2
- package/dist/admin-api/routes/fields.d.ts.map +1 -1
- package/dist/admin-api/routes/fields.js +10 -3
- package/dist/admin-api/routes/fields.js.map +1 -1
- package/dist/admin-api/routes/fragments.d.ts +2 -2
- package/dist/admin-api/routes/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +94 -19
- package/dist/admin-api/routes/fragments.js.map +1 -1
- package/dist/admin-api/routes/history.d.ts +23 -0
- package/dist/admin-api/routes/history.d.ts.map +1 -0
- package/dist/admin-api/routes/history.js +143 -0
- package/dist/admin-api/routes/history.js.map +1 -0
- package/dist/admin-api/routes/pages.d.ts +2 -2
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +120 -20
- package/dist/admin-api/routes/pages.js.map +1 -1
- package/dist/admin-api/routes/preview.d.ts +2 -2
- package/dist/admin-api/routes/preview.d.ts.map +1 -1
- package/dist/admin-api/routes/preview.js +50 -15
- package/dist/admin-api/routes/preview.js.map +1 -1
- package/dist/admin-api/routes/publish.d.ts +3 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +306 -65
- package/dist/admin-api/routes/publish.js.map +1 -1
- package/dist/admin-api/routes/site.d.ts +2 -2
- package/dist/admin-api/routes/site.d.ts.map +1 -1
- package/dist/admin-api/routes/site.js +27 -4
- package/dist/admin-api/routes/site.js.map +1 -1
- package/dist/admin-api/routes/templates.d.ts +2 -2
- package/dist/admin-api/routes/templates.d.ts.map +1 -1
- package/dist/admin-api/routes/templates.js +19 -9
- package/dist/admin-api/routes/templates.js.map +1 -1
- package/dist/admin-api/schemas/compare.d.ts +29 -0
- package/dist/admin-api/schemas/compare.d.ts.map +1 -0
- package/dist/admin-api/schemas/compare.js +30 -0
- package/dist/admin-api/schemas/compare.js.map +1 -0
- package/dist/admin-api/schemas/dependents.d.ts +15 -0
- package/dist/admin-api/schemas/dependents.d.ts.map +1 -0
- package/dist/admin-api/schemas/dependents.js +14 -0
- package/dist/admin-api/schemas/dependents.js.map +1 -0
- package/dist/admin-api/schemas/fetch.d.ts +12 -0
- package/dist/admin-api/schemas/fetch.d.ts.map +1 -0
- package/dist/admin-api/schemas/fetch.js +11 -0
- package/dist/admin-api/schemas/fetch.js.map +1 -0
- package/dist/admin-api/schemas/fields.d.ts +11 -0
- package/dist/admin-api/schemas/fields.d.ts.map +1 -0
- package/dist/admin-api/schemas/fields.js +11 -0
- package/dist/admin-api/schemas/fields.js.map +1 -0
- package/dist/admin-api/schemas/fragments.d.ts +27 -0
- package/dist/admin-api/schemas/fragments.d.ts.map +1 -0
- package/dist/admin-api/schemas/fragments.js +26 -0
- package/dist/admin-api/schemas/fragments.js.map +1 -0
- package/dist/admin-api/schemas/history.d.ts +73 -0
- package/dist/admin-api/schemas/history.d.ts.map +1 -0
- package/dist/admin-api/schemas/history.js +35 -0
- package/dist/admin-api/schemas/history.js.map +1 -0
- package/dist/admin-api/schemas/index.d.ts +32 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -0
- package/dist/admin-api/schemas/index.js +32 -0
- package/dist/admin-api/schemas/index.js.map +1 -0
- package/dist/admin-api/schemas/pages.d.ts +46 -0
- package/dist/admin-api/schemas/pages.d.ts.map +1 -0
- package/dist/admin-api/schemas/pages.js +47 -0
- package/dist/admin-api/schemas/pages.js.map +1 -0
- package/dist/admin-api/schemas/publish.d.ts +67 -0
- package/dist/admin-api/schemas/publish.d.ts.map +1 -0
- package/dist/admin-api/schemas/publish.js +60 -0
- package/dist/admin-api/schemas/publish.js.map +1 -0
- package/dist/admin-api/schemas/site.d.ts +28 -0
- package/dist/admin-api/schemas/site.d.ts.map +1 -0
- package/dist/admin-api/schemas/site.js +24 -0
- package/dist/admin-api/schemas/site.js.map +1 -0
- package/dist/admin-api/schemas/targets.d.ts +36 -0
- package/dist/admin-api/schemas/targets.d.ts.map +1 -0
- package/dist/admin-api/schemas/targets.js +19 -0
- package/dist/admin-api/schemas/targets.js.map +1 -0
- package/dist/admin-api/schemas/templates.d.ts +17 -0
- package/dist/admin-api/schemas/templates.d.ts.map +1 -0
- package/dist/admin-api/schemas/templates.js +16 -0
- package/dist/admin-api/schemas/templates.js.map +1 -0
- package/dist/admin-api/source-context.d.ts +165 -0
- package/dist/admin-api/source-context.d.ts.map +1 -0
- package/dist/admin-api/source-context.js +95 -0
- package/dist/admin-api/source-context.js.map +1 -0
- package/dist/app.js +1 -1
- package/dist/app.js.map +1 -1
- package/dist/assemble.d.ts.map +1 -1
- package/dist/assemble.js +4 -1
- package/dist/assemble.js.map +1 -1
- package/dist/cli/bootstrap.d.ts +48 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +85 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/history.d.ts +45 -0
- package/dist/cli/history.d.ts.map +1 -0
- package/dist/cli/history.js +165 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/index.js +691 -113
- package/dist/cli/index.js.map +1 -1
- package/dist/compare.d.ts +15 -5
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +83 -45
- package/dist/compare.js.map +1 -1
- package/dist/concurrency.d.ts +63 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +134 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/content-root.d.ts +38 -0
- package/dist/content-root.d.ts.map +1 -0
- package/dist/content-root.js +29 -0
- package/dist/content-root.js.map +1 -0
- package/dist/editor/mount.d.ts +1 -1
- package/dist/editor/mount.d.ts.map +1 -1
- package/dist/editor/mount.js +61 -29
- package/dist/editor/mount.js.map +1 -1
- package/dist/hash.d.ts +47 -1
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +107 -10
- package/dist/hash.js.map +1 -1
- package/dist/history-provider.d.ts +49 -0
- package/dist/history-provider.d.ts.map +1 -0
- package/dist/history-provider.js +226 -0
- package/dist/history-provider.js.map +1 -0
- package/dist/history-recorder.d.ts +98 -0
- package/dist/history-recorder.d.ts.map +1 -0
- package/dist/history-recorder.js +160 -0
- package/dist/history-recorder.js.map +1 -0
- package/dist/history-restorer.d.ts +46 -0
- package/dist/history-restorer.d.ts.map +1 -0
- package/dist/history-restorer.js +105 -0
- package/dist/history-restorer.js.map +1 -0
- package/dist/history.d.ts +111 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +25 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +26 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +74 -0
- package/dist/locale.d.ts.map +1 -0
- package/dist/locale.js +150 -0
- package/dist/locale.js.map +1 -0
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +16 -1
- package/dist/manifest.js.map +1 -1
- package/dist/providers/azure-blob.d.ts.map +1 -1
- package/dist/providers/azure-blob.js.map +1 -1
- package/dist/providers/r2.d.ts.map +1 -1
- package/dist/providers/r2.js +7 -4
- package/dist/providers/r2.js.map +1 -1
- package/dist/providers/s3.d.ts.map +1 -1
- package/dist/providers/s3.js +23 -15
- package/dist/providers/s3.js.map +1 -1
- package/dist/publish-locale.d.ts +44 -0
- package/dist/publish-locale.d.ts.map +1 -0
- package/dist/publish-locale.js +103 -0
- package/dist/publish-locale.js.map +1 -0
- package/dist/publish-rendered.d.ts +17 -5
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +114 -66
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish.d.ts +39 -3
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +166 -17
- package/dist/publish.js.map +1 -1
- package/dist/renderer.d.ts +14 -4
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +35 -23
- package/dist/renderer.js.map +1 -1
- package/dist/resolver.d.ts +7 -2
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +66 -15
- package/dist/resolver.js.map +1 -1
- package/dist/robots.d.ts +22 -0
- package/dist/robots.d.ts.map +1 -0
- package/dist/robots.js +25 -0
- package/dist/robots.js.map +1 -0
- package/dist/seo.d.ts +56 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +72 -0
- package/dist/seo.js.map +1 -0
- package/dist/serve.d.ts +41 -3
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +206 -65
- package/dist/serve.js.map +1 -1
- package/dist/sidecars.d.ts +60 -0
- package/dist/sidecars.d.ts.map +1 -0
- package/dist/sidecars.js +231 -0
- package/dist/sidecars.js.map +1 -0
- package/dist/site-loader.d.ts +74 -6
- package/dist/site-loader.d.ts.map +1 -1
- package/dist/site-loader.js +149 -36
- package/dist/site-loader.js.map +1 -1
- package/dist/sitemap.d.ts +45 -0
- package/dist/sitemap.d.ts.map +1 -0
- package/dist/sitemap.js +67 -0
- package/dist/sitemap.js.map +1 -0
- package/dist/source-sidecars.d.ts +32 -0
- package/dist/source-sidecars.d.ts.map +1 -0
- package/dist/source-sidecars.js +98 -0
- package/dist/source-sidecars.js.map +1 -0
- package/dist/targets.d.ts +47 -1
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +78 -9
- package/dist/targets.js.map +1 -1
- package/dist/template-loader.d.ts +7 -3
- package/dist/template-loader.d.ts.map +1 -1
- package/dist/template-loader.js +27 -12
- package/dist/template-loader.js.map +1 -1
- package/dist/templates-scan-worker.js +1 -1
- package/dist/templates-scan-worker.js.map +1 -1
- package/dist/templates-scan.d.ts.map +1 -1
- package/dist/templates-scan.js +1 -1
- package/dist/templates-scan.js.map +1 -1
- package/dist/types.d.ts +116 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +28 -5
- package/dist/types.js.map +1 -1
- package/dist/workers/cloudflare-r2.d.ts +11 -2
- package/dist/workers/cloudflare-r2.d.ts.map +1 -1
- package/dist/workers/cloudflare-r2.js +120 -55
- package/dist/workers/cloudflare-r2.js.map +1 -1
- package/package.json +11 -2
- package/admin-dist/assets/index-Bh_y1d_l.css +0 -1
- package/admin-dist/assets/index-DjGNi6yy.js +0 -608
- package/admin-dist/assets/vendor-vue-DSjyxCX6.js +0 -1
package/dist/sidecars.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sidecar file I/O for pages and fragments — one module owning all reads
|
|
3
|
+
* and writes of the three sidecar kinds:
|
|
4
|
+
*
|
|
5
|
+
* .{8hex}.hash — content hash, used by compare-targets
|
|
6
|
+
* .uses-{fragment} — one per @ reference; used by dependents lookup
|
|
7
|
+
* .tpl-{template} — template name; used to flag republish-needed
|
|
8
|
+
*
|
|
9
|
+
* Filenames encode the whole picture — a single readDir returns the full
|
|
10
|
+
* dependency state of an item without any content reads. Scaling goal:
|
|
11
|
+
* listing calls, not GETs, at 10k pages.
|
|
12
|
+
*
|
|
13
|
+
* Publish-rendered.ts, compare.ts, publish.ts all used to inline this
|
|
14
|
+
* logic separately; centralizing here reduces duplication and gives us
|
|
15
|
+
* one place to swap the storage shape (e.g. future single-index file)
|
|
16
|
+
* without touching every caller.
|
|
17
|
+
*/
|
|
18
|
+
import { parseSidecarName, parseSidecarLocale, sidecarNameFor, parseUsesSidecarName, usesSidecarNameFor, parseTemplateSidecarName, templateSidecarNameFor, parsePubSidecarName, parsePubSidecarLocale, pubSidecarNameFor, } from './hash.js';
|
|
19
|
+
import { mapLimit } from './concurrency.js';
|
|
20
|
+
/**
|
|
21
|
+
* Read sidecar filenames for a single item directory. Returns null if
|
|
22
|
+
* the directory doesn't exist or has no hash sidecar. `uses` and
|
|
23
|
+
* `template` default to empty/null when their sidecars are absent —
|
|
24
|
+
* old items published before we started writing them will still work,
|
|
25
|
+
* the caller just won't have dependency info for them.
|
|
26
|
+
*/
|
|
27
|
+
export async function readSidecars(storage, dir) {
|
|
28
|
+
let entries;
|
|
29
|
+
try {
|
|
30
|
+
entries = await storage.readDir(dir);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
let hash = null;
|
|
36
|
+
const uses = [];
|
|
37
|
+
let template = null;
|
|
38
|
+
let pub = null;
|
|
39
|
+
for (const e of entries) {
|
|
40
|
+
if (e.isDirectory)
|
|
41
|
+
continue;
|
|
42
|
+
const h = parseSidecarName(e.name);
|
|
43
|
+
if (h) {
|
|
44
|
+
hash = h;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const u = parseUsesSidecarName(e.name);
|
|
48
|
+
if (u) {
|
|
49
|
+
uses.push(u);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const t = parseTemplateSidecarName(e.name);
|
|
53
|
+
if (t) {
|
|
54
|
+
template = t;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const p = parsePubSidecarName(e.name);
|
|
58
|
+
if (p)
|
|
59
|
+
pub = p;
|
|
60
|
+
}
|
|
61
|
+
if (!hash)
|
|
62
|
+
return null;
|
|
63
|
+
return { hash, uses, template, pub };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Write (or rewrite) sidecars for one item, optionally locale-scoped.
|
|
67
|
+
* When `locale` is set, only locale-specific sidecars (.hash.fr, .pub.fr)
|
|
68
|
+
* are written/cleaned — default-locale sidecars are untouched. Structural
|
|
69
|
+
* sidecars (.uses-*, .tpl-*) are shared across locales (same components).
|
|
70
|
+
*/
|
|
71
|
+
export async function writeSidecars(storage, dir, state, locale) {
|
|
72
|
+
const want = new Set([sidecarNameFor(state.hash, locale)]);
|
|
73
|
+
// Structural sidecars are locale-agnostic — only write for default locale
|
|
74
|
+
if (!locale) {
|
|
75
|
+
for (const frag of state.uses)
|
|
76
|
+
want.add(usesSidecarNameFor(frag));
|
|
77
|
+
if (state.template)
|
|
78
|
+
want.add(templateSidecarNameFor(state.template));
|
|
79
|
+
}
|
|
80
|
+
if (state.pub)
|
|
81
|
+
want.add(pubSidecarNameFor(new Date(state.pub.lastPublished), state.pub.noindex, locale));
|
|
82
|
+
// Remove stale sidecars of the SAME locale scope that aren't in `want`.
|
|
83
|
+
try {
|
|
84
|
+
const entries = await storage.readDir(dir);
|
|
85
|
+
for (const e of entries) {
|
|
86
|
+
if (want.has(e.name))
|
|
87
|
+
continue;
|
|
88
|
+
// Only clean sidecars matching this locale scope
|
|
89
|
+
const hashLocale = parseSidecarLocale(e.name);
|
|
90
|
+
const pubLocale = parsePubSidecarLocale(e.name);
|
|
91
|
+
if (parseSidecarName(e.name) && hashLocale === (locale ?? undefined)) {
|
|
92
|
+
try {
|
|
93
|
+
await storage.rm(`${dir}/${e.name}`);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* already gone */
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (parsePubSidecarName(e.name) && pubLocale === (locale ?? undefined)) {
|
|
100
|
+
try {
|
|
101
|
+
await storage.rm(`${dir}/${e.name}`);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
/* already gone */
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (!locale && (parseUsesSidecarName(e.name) || parseTemplateSidecarName(e.name))) {
|
|
108
|
+
if (!want.has(e.name)) {
|
|
109
|
+
try {
|
|
110
|
+
await storage.rm(`${dir}/${e.name}`);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
/* already gone */
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
/* dir doesn't exist yet — mkdir below */
|
|
121
|
+
}
|
|
122
|
+
await storage.mkdir(dir);
|
|
123
|
+
await Promise.all([...want].map(name => storage.writeFile(`${dir}/${name}`, '')));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Walk a directory tree collecting every sub-directory's sidecar state.
|
|
127
|
+
* Bounded-parallel recursion — flat Promise.all over 10k dirs would blow
|
|
128
|
+
* the fd limit or provider rate limit.
|
|
129
|
+
*
|
|
130
|
+
* Keys are paths relative to `rootDir` (e.g. `home`, `blog/[slug]`). Items
|
|
131
|
+
* without a .hash sidecar are skipped. `writeSidecars` always writes all
|
|
132
|
+
* three kinds together, so partial state doesn't occur in real operation.
|
|
133
|
+
*/
|
|
134
|
+
export async function listSidecars(storage, rootDir) {
|
|
135
|
+
const out = new Map();
|
|
136
|
+
async function walk(dir, relative) {
|
|
137
|
+
let entries;
|
|
138
|
+
try {
|
|
139
|
+
entries = await storage.readDir(dir);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Parse sidecar state directly from the entries we already have —
|
|
145
|
+
// avoids a second readDir per directory (readSidecars would re-read
|
|
146
|
+
// the same dir). At 10k pages this halves the I/O calls.
|
|
147
|
+
if (relative) {
|
|
148
|
+
const parsed = parseSidecarEntries(entries);
|
|
149
|
+
if (parsed.default)
|
|
150
|
+
out.set(relative, parsed.default);
|
|
151
|
+
for (const [loc, locState] of parsed.locales) {
|
|
152
|
+
out.set(`${relative}:${loc}`, locState);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const subdirs = entries.filter(e => e.isDirectory);
|
|
156
|
+
await mapLimit(subdirs, e => walk(`${dir}/${e.name}`, relative ? `${relative}/${e.name}` : e.name));
|
|
157
|
+
}
|
|
158
|
+
await walk(rootDir, '');
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Parse sidecar state from already-read directory entries.
|
|
163
|
+
* Returns the default-locale state plus any locale variants.
|
|
164
|
+
*/
|
|
165
|
+
function parseSidecarEntries(entries) {
|
|
166
|
+
let hash = null;
|
|
167
|
+
const uses = [];
|
|
168
|
+
let template = null;
|
|
169
|
+
let pub = null;
|
|
170
|
+
const localeHashes = new Map();
|
|
171
|
+
const localePubs = new Map();
|
|
172
|
+
for (const e of entries) {
|
|
173
|
+
if (e.isDirectory)
|
|
174
|
+
continue;
|
|
175
|
+
const h = parseSidecarName(e.name);
|
|
176
|
+
if (h) {
|
|
177
|
+
const loc = parseSidecarLocale(e.name);
|
|
178
|
+
if (loc)
|
|
179
|
+
localeHashes.set(loc, h);
|
|
180
|
+
else
|
|
181
|
+
hash = h;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const u = parseUsesSidecarName(e.name);
|
|
185
|
+
if (u) {
|
|
186
|
+
uses.push(u);
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const t = parseTemplateSidecarName(e.name);
|
|
190
|
+
if (t) {
|
|
191
|
+
template = t;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const p = parsePubSidecarName(e.name);
|
|
195
|
+
if (p) {
|
|
196
|
+
const loc = parsePubSidecarLocale(e.name);
|
|
197
|
+
if (loc)
|
|
198
|
+
localePubs.set(loc, p);
|
|
199
|
+
else
|
|
200
|
+
pub = p;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const defaultState = hash ? { hash, uses, template, pub } : null;
|
|
204
|
+
const locales = new Map();
|
|
205
|
+
for (const [loc, lHash] of localeHashes) {
|
|
206
|
+
locales.set(loc, { hash: lHash, uses, template, pub: localePubs.get(loc) ?? null });
|
|
207
|
+
}
|
|
208
|
+
return { default: defaultState, locales };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Walk a component tree and collect every @fragment reference, recursing
|
|
212
|
+
* into inline components' children. Used when building SidecarState from
|
|
213
|
+
* a live manifest (source-side).
|
|
214
|
+
*/
|
|
215
|
+
export function collectFragmentRefs(components) {
|
|
216
|
+
const refs = new Set();
|
|
217
|
+
function walk(entries) {
|
|
218
|
+
if (!Array.isArray(entries))
|
|
219
|
+
return;
|
|
220
|
+
for (const entry of entries) {
|
|
221
|
+
if (typeof entry === 'string' && entry.startsWith('@'))
|
|
222
|
+
refs.add(entry.slice(1));
|
|
223
|
+
else if (typeof entry === 'object' && entry !== null) {
|
|
224
|
+
walk(entry.components);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
walk(components);
|
|
229
|
+
return [...refs];
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=sidecars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidecars.js","sourceRoot":"","sources":["../src/sidecars.ts"],"names":[],"mappings":"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"}
|
package/dist/site-loader.d.ts
CHANGED
|
@@ -1,24 +1,92 @@
|
|
|
1
1
|
import type { PageManifest, FragmentManifest, SiteManifest, StorageProvider } from './types.js';
|
|
2
|
+
import { type ContentRoot } from './content-root.js';
|
|
3
|
+
/** A page entry with its name, manifest, and optional locale. */
|
|
4
|
+
export interface PageEntry {
|
|
5
|
+
name: string;
|
|
6
|
+
page: PageManifest & {
|
|
7
|
+
dir: string;
|
|
8
|
+
};
|
|
9
|
+
locale?: string;
|
|
10
|
+
}
|
|
11
|
+
/** A fragment entry with its name, manifest, and optional locale. */
|
|
12
|
+
export interface FragmentEntry {
|
|
13
|
+
name: string;
|
|
14
|
+
fragment: FragmentManifest & {
|
|
15
|
+
dir: string;
|
|
16
|
+
};
|
|
17
|
+
locale?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Flatten all pages including locale variants into a single list. */
|
|
20
|
+
export declare function allPageEntries(site: Site): PageEntry[];
|
|
21
|
+
/** Flatten all fragments including locale variants into a single list. */
|
|
22
|
+
export declare function allFragmentEntries(site: Site): FragmentEntry[];
|
|
2
23
|
/** Derive route from page folder name: home → /, about → /about, blog/[slug] → /blog/:slug */
|
|
3
24
|
export declare function deriveRoute(pageName: string): string;
|
|
25
|
+
/** A page or fragment with its locale variants. */
|
|
26
|
+
export interface LocalizedEntry<T> {
|
|
27
|
+
/** Default locale manifest (from page.json / fragment.json). */
|
|
28
|
+
default: T;
|
|
29
|
+
/** Locale variants keyed by normalized locale code. Empty if single-locale. */
|
|
30
|
+
locales: Map<string, T>;
|
|
31
|
+
}
|
|
4
32
|
export interface Site {
|
|
5
33
|
manifest: SiteManifest;
|
|
6
34
|
pages: Map<string, PageManifest & {
|
|
7
35
|
dir: string;
|
|
8
36
|
}>;
|
|
37
|
+
/** Locale variants for pages. Only populated when site has `locales` config. */
|
|
38
|
+
pageLocales: Map<string, LocalizedEntry<PageManifest & {
|
|
39
|
+
dir: string;
|
|
40
|
+
}>>;
|
|
9
41
|
fragments: Map<string, FragmentManifest & {
|
|
10
42
|
dir: string;
|
|
11
43
|
}>;
|
|
44
|
+
/** Locale variants for fragments. Only populated when site has `locales` config. */
|
|
45
|
+
fragmentLocales: Map<string, LocalizedEntry<FragmentManifest & {
|
|
46
|
+
dir: string;
|
|
47
|
+
}>>;
|
|
48
|
+
/** Content root — `{storage, rootPath}` pair for accessing site content. */
|
|
49
|
+
contentRoot: ContentRoot;
|
|
50
|
+
/**
|
|
51
|
+
* Storage provider for site content. Equivalent to `contentRoot.storage` —
|
|
52
|
+
* kept as a convenience because resolver and template loading use it directly.
|
|
53
|
+
*/
|
|
54
|
+
storage: StorageProvider;
|
|
55
|
+
/**
|
|
56
|
+
* Rooting prefix for content under `storage`. Equivalent to `contentRoot.rootPath`.
|
|
57
|
+
* Empty string when storage is target-rooted.
|
|
58
|
+
*/
|
|
12
59
|
siteDir: string;
|
|
13
|
-
/** Directory containing template packages.
|
|
60
|
+
/** Directory containing template packages. Project-level, separate from content rooting. */
|
|
14
61
|
templatesDir: string;
|
|
15
|
-
storage: StorageProvider;
|
|
16
62
|
}
|
|
17
63
|
export interface LoadSiteOptions {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
/**
|
|
64
|
+
/** @deprecated Pass `contentRoot` instead (preferred for new code). */
|
|
65
|
+
siteDir?: string;
|
|
66
|
+
/** @deprecated Pass `contentRoot` instead (preferred for new code). */
|
|
67
|
+
storage?: StorageProvider;
|
|
68
|
+
/** Content root — where site content lives. Preferred over siteDir/storage. */
|
|
69
|
+
contentRoot?: ContentRoot;
|
|
70
|
+
/** Override templates directory (default: siteDir/templates). */
|
|
21
71
|
templatesDir?: string;
|
|
72
|
+
/**
|
|
73
|
+
* Pre-parsed site manifest. If provided, site.yaml is not read from the
|
|
74
|
+
* content root. Used when site.yaml is a project-level bootstrap file
|
|
75
|
+
* that lives outside target storage.
|
|
76
|
+
*/
|
|
77
|
+
manifest?: SiteManifest;
|
|
22
78
|
}
|
|
23
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Load a site from a storage provider.
|
|
81
|
+
*
|
|
82
|
+
* Two input shapes are supported:
|
|
83
|
+
* - **Preferred**: `{ contentRoot, templatesDir }` — storage rooting is
|
|
84
|
+
* whatever the caller chose (cwd-rooted with siteDir prefix, or target-
|
|
85
|
+
* rooted with empty prefix). Callers construct the root once; this
|
|
86
|
+
* function doesn't care.
|
|
87
|
+
* - **Legacy**: `{ siteDir, storage, templatesDir? }` — the pair is wrapped
|
|
88
|
+
* in a ContentRoot internally. Retained for callers that haven't
|
|
89
|
+
* migrated yet.
|
|
90
|
+
*/
|
|
91
|
+
export declare function loadSite(opts: LoadSiteOptions): Promise<Site>;
|
|
24
92
|
//# sourceMappingURL=site-loader.d.ts.map
|
|
@@ -1 +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,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,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,
|
|
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,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAGvE,iEAAiE;AACjE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,YAAY,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,gBAAgB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,CAOtD;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,aAAa,EAAE,CAO9D;AAED,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,mDAAmD;AACnD,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,gEAAgE;IAChE,OAAO,EAAE,CAAC,CAAA;IACV,+EAA+E;IAC/E,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;CACxB;AAED,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,gFAAgF;IAChF,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,YAAY,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IACxE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D,oFAAoF;IACpF,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,gBAAgB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IAChF,4EAA4E;IAC5E,WAAW,EAAE,WAAW,CAAA;IACxB;;;OAGG;IACH,OAAO,EAAE,eAAe,CAAA;IACxB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,4FAA4F;IAC5F,YAAY,EAAE,MAAM,CAAA;CACrB;AAmHD,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uEAAuE;IACvE,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDnE"}
|
package/dist/site-loader.js
CHANGED
|
@@ -1,21 +1,47 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
2
|
import { parseSiteManifest, parsePageManifest, parseFragmentManifest } from './manifest.js';
|
|
3
|
+
import { mapLimit } from './concurrency.js';
|
|
4
|
+
import { createContentRoot } from './content-root.js';
|
|
5
|
+
import { localeFromFilename, localeRoutePrefix, resolveSiteLocales } from './locale.js';
|
|
6
|
+
/** Flatten all pages including locale variants into a single list. */
|
|
7
|
+
export function allPageEntries(site) {
|
|
8
|
+
const entries = [];
|
|
9
|
+
for (const [name, page] of site.pages)
|
|
10
|
+
entries.push({ name, page });
|
|
11
|
+
for (const [name, entry] of site.pageLocales) {
|
|
12
|
+
for (const [locale, page] of entry.locales)
|
|
13
|
+
entries.push({ name, page, locale });
|
|
14
|
+
}
|
|
15
|
+
return entries;
|
|
16
|
+
}
|
|
17
|
+
/** Flatten all fragments including locale variants into a single list. */
|
|
18
|
+
export function allFragmentEntries(site) {
|
|
19
|
+
const entries = [];
|
|
20
|
+
for (const [name, fragment] of site.fragments)
|
|
21
|
+
entries.push({ name, fragment });
|
|
22
|
+
for (const [name, entry] of site.fragmentLocales) {
|
|
23
|
+
for (const [locale, fragment] of entry.locales)
|
|
24
|
+
entries.push({ name, fragment, locale });
|
|
25
|
+
}
|
|
26
|
+
return entries;
|
|
27
|
+
}
|
|
3
28
|
/** Derive route from page folder name: home → /, about → /about, blog/[slug] → /blog/:slug */
|
|
4
29
|
export function deriveRoute(pageName) {
|
|
5
30
|
if (pageName === 'home')
|
|
6
31
|
return '/';
|
|
7
32
|
return '/' + pageName.replace(/\[([^\]]+)\]/g, ':$1');
|
|
8
33
|
}
|
|
9
|
-
async function discoverPages(storage, pagesDir,
|
|
10
|
-
if (!await storage.exists(pagesDir)) {
|
|
34
|
+
async function discoverPages(storage, pagesDir, siteManifest, result = { pages: new Map(), pageLocales: new Map() }, prefix = '') {
|
|
35
|
+
if (!(await storage.exists(pagesDir))) {
|
|
11
36
|
if (!prefix)
|
|
12
37
|
console.warn(` Warning: pages/ directory not found at ${pagesDir}`);
|
|
13
|
-
return
|
|
38
|
+
return result;
|
|
14
39
|
}
|
|
15
40
|
const entries = await storage.readDir(pagesDir);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
41
|
+
const subdirs = entries.filter(e => e.isDirectory);
|
|
42
|
+
// Parallelize manifest reads — sequential is untenable at 10k pages.
|
|
43
|
+
// Bounded concurrency protects the fd table and cloud rate limits.
|
|
44
|
+
await mapLimit(subdirs, async (entry) => {
|
|
19
45
|
const dir = join(pagesDir, entry.name);
|
|
20
46
|
const name = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
21
47
|
const manifestPath = join(dir, 'page.json');
|
|
@@ -23,57 +49,144 @@ async function discoverPages(storage, pagesDir, pages = new Map(), prefix = '')
|
|
|
23
49
|
try {
|
|
24
50
|
const manifest = await parsePageManifest(storage, manifestPath);
|
|
25
51
|
const route = deriveRoute(name);
|
|
26
|
-
|
|
52
|
+
const pageWithDir = { ...manifest, route, dir };
|
|
53
|
+
result.pages.set(name, pageWithDir);
|
|
54
|
+
// Discover locale variants (page.fr.json, page.en-gb.json, etc.)
|
|
55
|
+
const locales = new Map();
|
|
56
|
+
const dirEntries = await storage.readDir(dir);
|
|
57
|
+
for (const f of dirEntries) {
|
|
58
|
+
if (f.isDirectory)
|
|
59
|
+
continue;
|
|
60
|
+
const locale = localeFromFilename(f.name, 'page');
|
|
61
|
+
if (!locale)
|
|
62
|
+
continue;
|
|
63
|
+
try {
|
|
64
|
+
const localeManifest = await parsePageManifest(storage, join(dir, f.name));
|
|
65
|
+
const siteLocales = resolveSiteLocales(siteManifest);
|
|
66
|
+
const routePrefix = siteLocales ? localeRoutePrefix(locale, siteLocales) : `/${locale}`;
|
|
67
|
+
const localeRoute = `${routePrefix}${route === '/' ? '' : route}` || '/';
|
|
68
|
+
locales.set(locale, { ...localeManifest, route: localeRoute, dir });
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
console.warn(` Warning: skipping page "${name}" locale "${locale}": ${err.message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (locales.size > 0) {
|
|
75
|
+
result.pageLocales.set(name, { default: pageWithDir, locales });
|
|
76
|
+
}
|
|
27
77
|
}
|
|
28
78
|
catch (err) {
|
|
29
79
|
console.warn(` Warning: skipping page "${name}": ${err.message}`);
|
|
30
80
|
}
|
|
31
81
|
}
|
|
32
|
-
// Recurse into subdirectories to find nested pages (e.g., blog/[slug])
|
|
33
|
-
await discoverPages(storage, dir,
|
|
34
|
-
}
|
|
35
|
-
return
|
|
82
|
+
// Recurse into subdirectories to find nested pages (e.g., blog/[slug]).
|
|
83
|
+
await discoverPages(storage, dir, siteManifest, result, name);
|
|
84
|
+
});
|
|
85
|
+
return result;
|
|
36
86
|
}
|
|
37
87
|
async function discoverFragments(storage, fragmentsDir) {
|
|
38
|
-
const
|
|
39
|
-
if (!await storage.exists(fragmentsDir)) {
|
|
88
|
+
const result = { fragments: new Map(), fragmentLocales: new Map() };
|
|
89
|
+
if (!(await storage.exists(fragmentsDir))) {
|
|
40
90
|
console.warn(` Warning: fragments/ directory not found at ${fragmentsDir}`);
|
|
41
|
-
return
|
|
91
|
+
return result;
|
|
42
92
|
}
|
|
43
93
|
const entries = await storage.readDir(fragmentsDir);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
continue;
|
|
94
|
+
const subdirs = entries.filter(e => e.isDirectory);
|
|
95
|
+
await mapLimit(subdirs, async (entry) => {
|
|
47
96
|
const fragDir = join(fragmentsDir, entry.name);
|
|
48
97
|
const manifestPath = join(fragDir, 'fragment.json');
|
|
49
|
-
if (!await storage.exists(manifestPath))
|
|
50
|
-
|
|
98
|
+
if (!(await storage.exists(manifestPath)))
|
|
99
|
+
return;
|
|
51
100
|
try {
|
|
52
101
|
const manifest = await parseFragmentManifest(storage, manifestPath);
|
|
53
|
-
|
|
102
|
+
const fragWithDir = { ...manifest, dir: fragDir };
|
|
103
|
+
result.fragments.set(entry.name, fragWithDir);
|
|
104
|
+
// Discover locale variants (fragment.fr.json, etc.)
|
|
105
|
+
const locales = new Map();
|
|
106
|
+
const dirEntries = await storage.readDir(fragDir);
|
|
107
|
+
for (const f of dirEntries) {
|
|
108
|
+
if (f.isDirectory)
|
|
109
|
+
continue;
|
|
110
|
+
const locale = localeFromFilename(f.name, 'fragment');
|
|
111
|
+
if (!locale)
|
|
112
|
+
continue;
|
|
113
|
+
try {
|
|
114
|
+
const localeManifest = await parseFragmentManifest(storage, join(fragDir, f.name));
|
|
115
|
+
locales.set(locale, { ...localeManifest, dir: fragDir });
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.warn(` Warning: skipping fragment "${entry.name}" locale "${locale}": ${err.message}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (locales.size > 0) {
|
|
122
|
+
result.fragmentLocales.set(entry.name, { default: fragWithDir, locales });
|
|
123
|
+
}
|
|
54
124
|
}
|
|
55
125
|
catch (err) {
|
|
56
126
|
console.warn(` Warning: skipping fragment "${entry.name}": ${err.message}`);
|
|
57
127
|
}
|
|
58
|
-
}
|
|
59
|
-
return
|
|
128
|
+
});
|
|
129
|
+
return result;
|
|
60
130
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
131
|
+
/**
|
|
132
|
+
* Load a site from a storage provider.
|
|
133
|
+
*
|
|
134
|
+
* Two input shapes are supported:
|
|
135
|
+
* - **Preferred**: `{ contentRoot, templatesDir }` — storage rooting is
|
|
136
|
+
* whatever the caller chose (cwd-rooted with siteDir prefix, or target-
|
|
137
|
+
* rooted with empty prefix). Callers construct the root once; this
|
|
138
|
+
* function doesn't care.
|
|
139
|
+
* - **Legacy**: `{ siteDir, storage, templatesDir? }` — the pair is wrapped
|
|
140
|
+
* in a ContentRoot internally. Retained for callers that haven't
|
|
141
|
+
* migrated yet.
|
|
142
|
+
*/
|
|
143
|
+
export async function loadSite(opts) {
|
|
144
|
+
let contentRoot;
|
|
145
|
+
let siteDir;
|
|
146
|
+
let templatesDir;
|
|
147
|
+
if (opts.contentRoot) {
|
|
148
|
+
// Preferred: caller built the ContentRoot
|
|
149
|
+
contentRoot = opts.contentRoot;
|
|
150
|
+
siteDir = contentRoot.rootPath;
|
|
151
|
+
templatesDir = opts.templatesDir ?? join(siteDir, 'templates');
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Legacy options bag: { siteDir, storage, templatesDir? }
|
|
155
|
+
if (!opts.siteDir || !opts.storage) {
|
|
156
|
+
throw new Error('loadSite: either contentRoot, or both siteDir and storage, must be provided');
|
|
157
|
+
}
|
|
158
|
+
siteDir = opts.siteDir;
|
|
159
|
+
contentRoot = createContentRoot(opts.storage, siteDir);
|
|
160
|
+
templatesDir = opts.templatesDir ?? join(siteDir, 'templates');
|
|
161
|
+
}
|
|
162
|
+
let manifest;
|
|
163
|
+
if (opts.manifest) {
|
|
164
|
+
// Project-level bootstrap passed in the manifest — skip the storage read.
|
|
165
|
+
manifest = opts.manifest;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const siteYamlPath = contentRoot.path('site.yaml');
|
|
169
|
+
if (!(await contentRoot.storage.exists(siteYamlPath))) {
|
|
170
|
+
throw new Error(`No site.yaml found at ${siteYamlPath}. Is this a Gazetta site directory?`);
|
|
171
|
+
}
|
|
172
|
+
manifest = await parseSiteManifest(contentRoot.storage, siteYamlPath);
|
|
70
173
|
}
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
const fragments = await discoverFragments(opts.storage, join(siteDir, 'fragments'));
|
|
174
|
+
const { pages, pageLocales } = await discoverPages(contentRoot.storage, contentRoot.path('pages'), manifest);
|
|
175
|
+
const { fragments, fragmentLocales } = await discoverFragments(contentRoot.storage, contentRoot.path('fragments'));
|
|
74
176
|
if (pages.size === 0) {
|
|
75
|
-
console.warn(` Warning: no pages found in ${
|
|
177
|
+
console.warn(` Warning: no pages found in ${contentRoot.path('pages')}`);
|
|
76
178
|
}
|
|
77
|
-
return {
|
|
179
|
+
return {
|
|
180
|
+
manifest,
|
|
181
|
+
pages,
|
|
182
|
+
pageLocales,
|
|
183
|
+
fragments,
|
|
184
|
+
fragmentLocales,
|
|
185
|
+
contentRoot,
|
|
186
|
+
// backward-compat fields
|
|
187
|
+
siteDir,
|
|
188
|
+
templatesDir,
|
|
189
|
+
storage: contentRoot.storage,
|
|
190
|
+
};
|
|
78
191
|
}
|
|
79
192
|
//# sourceMappingURL=site-loader.js.map
|
package/dist/site-loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-loader.js","sourceRoot":"","sources":["../src/site-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"site-loader.js","sourceRoot":"","sources":["../src/site-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sitemap generation — produces sitemap.xml from target sidecars.
|
|
3
|
+
*
|
|
4
|
+
* SRP: this module owns sitemap XML assembly. It takes the sidecar
|
|
5
|
+
* listing from a target's `pages/` directory (already available via
|
|
6
|
+
* `listSidecars`) and produces the XML string. No I/O — the caller
|
|
7
|
+
* reads sidecars and writes the result to storage.
|
|
8
|
+
*
|
|
9
|
+
* The sitemap reflects what's ACTUALLY published on the target, not
|
|
10
|
+
* what's in the source. A page that exists in source but was never
|
|
11
|
+
* published won't appear. A page that was deleted from source but
|
|
12
|
+
* is still live on the target WILL appear (until the next full
|
|
13
|
+
* publish removes its sidecars).
|
|
14
|
+
*
|
|
15
|
+
* Pages with `.pub-*-noindex` sidecars are excluded. System pages
|
|
16
|
+
* (e.g. 404) are excluded by name.
|
|
17
|
+
*/
|
|
18
|
+
import type { SidecarState } from './sidecars.js';
|
|
19
|
+
/** hreflang alternate for a single page — locale code + absolute URL. */
|
|
20
|
+
export interface HreflangAlternate {
|
|
21
|
+
locale: string;
|
|
22
|
+
url: string;
|
|
23
|
+
}
|
|
24
|
+
export interface GenerateSitemapOptions {
|
|
25
|
+
/** Absolute base URL (e.g. "https://gazetta.studio"). */
|
|
26
|
+
siteUrl: string;
|
|
27
|
+
/** Target sidecar listing — keyed by page name (e.g. "home", "about"). */
|
|
28
|
+
pages: Map<string, SidecarState>;
|
|
29
|
+
/** System page names to exclude (e.g. ["404"]). */
|
|
30
|
+
systemPages?: string[];
|
|
31
|
+
/**
|
|
32
|
+
* hreflang alternates per page — keyed by page name. Each entry lists
|
|
33
|
+
* all locale variants (including self). Only pages with 2+ alternates
|
|
34
|
+
* get hreflang in the sitemap. Noindex variants are excluded by the caller.
|
|
35
|
+
*/
|
|
36
|
+
hreflangGroups?: Map<string, HreflangAlternate[]>;
|
|
37
|
+
/** Default locale code — used for x-default in hreflang. */
|
|
38
|
+
defaultLocale?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Generate sitemap XML from target sidecars. Returns null when no
|
|
42
|
+
* pages qualify (all noindex, or empty target).
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateSitemap(opts: GenerateSitemapOptions): string | null;
|
|
45
|
+
//# sourceMappingURL=sitemap.d.ts.map
|