gazetta 0.5.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.
Files changed (236) hide show
  1. package/admin-dist/assets/index-B6pVot0Y.css +1 -0
  2. package/admin-dist/assets/index-DniLwxJA.js +609 -0
  3. package/admin-dist/assets/{vendor-primevue-BnR1c_bQ.js → vendor-primevue-C0Q_YTCb.js} +330 -431
  4. package/admin-dist/assets/vendor-vue-D3wBSmDf.js +1 -0
  5. package/admin-dist/index.html +4 -4
  6. package/dist/admin-api/index.d.ts +19 -4
  7. package/dist/admin-api/index.d.ts.map +1 -1
  8. package/dist/admin-api/index.js +154 -18
  9. package/dist/admin-api/index.js.map +1 -1
  10. package/dist/admin-api/routes/compare.d.ts +2 -1
  11. package/dist/admin-api/routes/compare.d.ts.map +1 -1
  12. package/dist/admin-api/routes/compare.js +33 -24
  13. package/dist/admin-api/routes/compare.js.map +1 -1
  14. package/dist/admin-api/routes/fields.d.ts +2 -2
  15. package/dist/admin-api/routes/fields.d.ts.map +1 -1
  16. package/dist/admin-api/routes/fields.js +10 -3
  17. package/dist/admin-api/routes/fields.js.map +1 -1
  18. package/dist/admin-api/routes/fragments.d.ts +2 -3
  19. package/dist/admin-api/routes/fragments.d.ts.map +1 -1
  20. package/dist/admin-api/routes/fragments.js +92 -19
  21. package/dist/admin-api/routes/fragments.js.map +1 -1
  22. package/dist/admin-api/routes/history.d.ts +23 -0
  23. package/dist/admin-api/routes/history.d.ts.map +1 -0
  24. package/dist/admin-api/routes/history.js +143 -0
  25. package/dist/admin-api/routes/history.js.map +1 -0
  26. package/dist/admin-api/routes/pages.d.ts +2 -3
  27. package/dist/admin-api/routes/pages.d.ts.map +1 -1
  28. package/dist/admin-api/routes/pages.js +118 -20
  29. package/dist/admin-api/routes/pages.js.map +1 -1
  30. package/dist/admin-api/routes/preview.d.ts +2 -2
  31. package/dist/admin-api/routes/preview.d.ts.map +1 -1
  32. package/dist/admin-api/routes/preview.js +50 -15
  33. package/dist/admin-api/routes/preview.js.map +1 -1
  34. package/dist/admin-api/routes/publish.d.ts +2 -1
  35. package/dist/admin-api/routes/publish.d.ts.map +1 -1
  36. package/dist/admin-api/routes/publish.js +213 -66
  37. package/dist/admin-api/routes/publish.js.map +1 -1
  38. package/dist/admin-api/routes/site.d.ts +2 -2
  39. package/dist/admin-api/routes/site.d.ts.map +1 -1
  40. package/dist/admin-api/routes/site.js +27 -4
  41. package/dist/admin-api/routes/site.js.map +1 -1
  42. package/dist/admin-api/routes/templates.d.ts +2 -2
  43. package/dist/admin-api/routes/templates.d.ts.map +1 -1
  44. package/dist/admin-api/routes/templates.js +19 -9
  45. package/dist/admin-api/routes/templates.js.map +1 -1
  46. package/dist/admin-api/schemas/compare.d.ts +29 -0
  47. package/dist/admin-api/schemas/compare.d.ts.map +1 -0
  48. package/dist/admin-api/schemas/compare.js +30 -0
  49. package/dist/admin-api/schemas/compare.js.map +1 -0
  50. package/dist/admin-api/schemas/dependents.d.ts +15 -0
  51. package/dist/admin-api/schemas/dependents.d.ts.map +1 -0
  52. package/dist/admin-api/schemas/dependents.js +14 -0
  53. package/dist/admin-api/schemas/dependents.js.map +1 -0
  54. package/dist/admin-api/schemas/fetch.d.ts +12 -0
  55. package/dist/admin-api/schemas/fetch.d.ts.map +1 -0
  56. package/dist/admin-api/schemas/fetch.js +11 -0
  57. package/dist/admin-api/schemas/fetch.js.map +1 -0
  58. package/dist/admin-api/schemas/fields.d.ts +11 -0
  59. package/dist/admin-api/schemas/fields.d.ts.map +1 -0
  60. package/dist/admin-api/schemas/fields.js +11 -0
  61. package/dist/admin-api/schemas/fields.js.map +1 -0
  62. package/dist/admin-api/schemas/fragments.d.ts +27 -0
  63. package/dist/admin-api/schemas/fragments.d.ts.map +1 -0
  64. package/dist/admin-api/schemas/fragments.js +26 -0
  65. package/dist/admin-api/schemas/fragments.js.map +1 -0
  66. package/dist/admin-api/schemas/history.d.ts +73 -0
  67. package/dist/admin-api/schemas/history.d.ts.map +1 -0
  68. package/dist/admin-api/schemas/history.js +35 -0
  69. package/dist/admin-api/schemas/history.js.map +1 -0
  70. package/dist/admin-api/schemas/index.d.ts +32 -0
  71. package/dist/admin-api/schemas/index.d.ts.map +1 -0
  72. package/dist/admin-api/schemas/index.js +32 -0
  73. package/dist/admin-api/schemas/index.js.map +1 -0
  74. package/dist/admin-api/schemas/pages.d.ts +46 -0
  75. package/dist/admin-api/schemas/pages.d.ts.map +1 -0
  76. package/dist/admin-api/schemas/pages.js +47 -0
  77. package/dist/admin-api/schemas/pages.js.map +1 -0
  78. package/dist/admin-api/schemas/publish.d.ts +67 -0
  79. package/dist/admin-api/schemas/publish.d.ts.map +1 -0
  80. package/dist/admin-api/schemas/publish.js +60 -0
  81. package/dist/admin-api/schemas/publish.js.map +1 -0
  82. package/dist/admin-api/schemas/site.d.ts +28 -0
  83. package/dist/admin-api/schemas/site.d.ts.map +1 -0
  84. package/dist/admin-api/schemas/site.js +24 -0
  85. package/dist/admin-api/schemas/site.js.map +1 -0
  86. package/dist/admin-api/schemas/targets.d.ts +36 -0
  87. package/dist/admin-api/schemas/targets.d.ts.map +1 -0
  88. package/dist/admin-api/schemas/targets.js +19 -0
  89. package/dist/admin-api/schemas/targets.js.map +1 -0
  90. package/dist/admin-api/schemas/templates.d.ts +17 -0
  91. package/dist/admin-api/schemas/templates.d.ts.map +1 -0
  92. package/dist/admin-api/schemas/templates.js +16 -0
  93. package/dist/admin-api/schemas/templates.js.map +1 -0
  94. package/dist/admin-api/source-context.d.ts +165 -0
  95. package/dist/admin-api/source-context.d.ts.map +1 -0
  96. package/dist/admin-api/source-context.js +95 -0
  97. package/dist/admin-api/source-context.js.map +1 -0
  98. package/dist/app.js +1 -1
  99. package/dist/app.js.map +1 -1
  100. package/dist/assemble.d.ts.map +1 -1
  101. package/dist/assemble.js +4 -1
  102. package/dist/assemble.js.map +1 -1
  103. package/dist/cli/bootstrap.d.ts +48 -0
  104. package/dist/cli/bootstrap.d.ts.map +1 -0
  105. package/dist/cli/bootstrap.js +85 -0
  106. package/dist/cli/bootstrap.js.map +1 -0
  107. package/dist/cli/history.d.ts +45 -0
  108. package/dist/cli/history.d.ts.map +1 -0
  109. package/dist/cli/history.js +165 -0
  110. package/dist/cli/history.js.map +1 -0
  111. package/dist/cli/index.js +630 -115
  112. package/dist/cli/index.js.map +1 -1
  113. package/dist/compare.d.ts +8 -5
  114. package/dist/compare.d.ts.map +1 -1
  115. package/dist/compare.js +53 -14
  116. package/dist/compare.js.map +1 -1
  117. package/dist/content-root.d.ts +38 -0
  118. package/dist/content-root.d.ts.map +1 -0
  119. package/dist/content-root.js +29 -0
  120. package/dist/content-root.js.map +1 -0
  121. package/dist/editor/mount.d.ts +1 -1
  122. package/dist/editor/mount.d.ts.map +1 -1
  123. package/dist/editor/mount.js +61 -29
  124. package/dist/editor/mount.js.map +1 -1
  125. package/dist/hash.d.ts +34 -3
  126. package/dist/hash.d.ts.map +1 -1
  127. package/dist/hash.js +64 -7
  128. package/dist/hash.js.map +1 -1
  129. package/dist/history-provider.d.ts +49 -0
  130. package/dist/history-provider.d.ts.map +1 -0
  131. package/dist/history-provider.js +226 -0
  132. package/dist/history-provider.js.map +1 -0
  133. package/dist/history-recorder.d.ts +98 -0
  134. package/dist/history-recorder.d.ts.map +1 -0
  135. package/dist/history-recorder.js +160 -0
  136. package/dist/history-recorder.js.map +1 -0
  137. package/dist/history-restorer.d.ts +46 -0
  138. package/dist/history-restorer.d.ts.map +1 -0
  139. package/dist/history-restorer.js +105 -0
  140. package/dist/history-restorer.js.map +1 -0
  141. package/dist/history.d.ts +111 -0
  142. package/dist/history.d.ts.map +1 -0
  143. package/dist/history.js +25 -0
  144. package/dist/history.js.map +1 -0
  145. package/dist/index.d.ts +26 -4
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +16 -3
  148. package/dist/index.js.map +1 -1
  149. package/dist/locale.d.ts +74 -0
  150. package/dist/locale.d.ts.map +1 -0
  151. package/dist/locale.js +150 -0
  152. package/dist/locale.js.map +1 -0
  153. package/dist/manifest.d.ts.map +1 -1
  154. package/dist/manifest.js +16 -1
  155. package/dist/manifest.js.map +1 -1
  156. package/dist/providers/azure-blob.d.ts.map +1 -1
  157. package/dist/providers/azure-blob.js.map +1 -1
  158. package/dist/providers/r2.d.ts.map +1 -1
  159. package/dist/providers/r2.js +7 -4
  160. package/dist/providers/r2.js.map +1 -1
  161. package/dist/providers/s3.d.ts.map +1 -1
  162. package/dist/providers/s3.js +23 -15
  163. package/dist/providers/s3.js.map +1 -1
  164. package/dist/publish-locale.d.ts +44 -0
  165. package/dist/publish-locale.d.ts.map +1 -0
  166. package/dist/publish-locale.js +103 -0
  167. package/dist/publish-locale.js.map +1 -0
  168. package/dist/publish-rendered.d.ts +16 -5
  169. package/dist/publish-rendered.d.ts.map +1 -1
  170. package/dist/publish-rendered.js +89 -36
  171. package/dist/publish-rendered.js.map +1 -1
  172. package/dist/publish.d.ts +5 -7
  173. package/dist/publish.d.ts.map +1 -1
  174. package/dist/publish.js +21 -12
  175. package/dist/publish.js.map +1 -1
  176. package/dist/renderer.d.ts +14 -4
  177. package/dist/renderer.d.ts.map +1 -1
  178. package/dist/renderer.js +35 -23
  179. package/dist/renderer.js.map +1 -1
  180. package/dist/resolver.d.ts +7 -2
  181. package/dist/resolver.d.ts.map +1 -1
  182. package/dist/resolver.js +66 -15
  183. package/dist/resolver.js.map +1 -1
  184. package/dist/robots.d.ts +22 -0
  185. package/dist/robots.d.ts.map +1 -0
  186. package/dist/robots.js +25 -0
  187. package/dist/robots.js.map +1 -0
  188. package/dist/seo.d.ts +56 -0
  189. package/dist/seo.d.ts.map +1 -0
  190. package/dist/seo.js +72 -0
  191. package/dist/seo.js.map +1 -0
  192. package/dist/serve.d.ts +41 -3
  193. package/dist/serve.d.ts.map +1 -1
  194. package/dist/serve.js +206 -65
  195. package/dist/serve.js.map +1 -1
  196. package/dist/sidecars.d.ts +9 -5
  197. package/dist/sidecars.d.ts.map +1 -1
  198. package/dist/sidecars.js +112 -22
  199. package/dist/sidecars.js.map +1 -1
  200. package/dist/site-loader.d.ts +74 -6
  201. package/dist/site-loader.d.ts.map +1 -1
  202. package/dist/site-loader.js +138 -28
  203. package/dist/site-loader.js.map +1 -1
  204. package/dist/sitemap.d.ts +45 -0
  205. package/dist/sitemap.d.ts.map +1 -0
  206. package/dist/sitemap.js +67 -0
  207. package/dist/sitemap.js.map +1 -0
  208. package/dist/source-sidecars.d.ts +21 -2
  209. package/dist/source-sidecars.d.ts.map +1 -1
  210. package/dist/source-sidecars.js +51 -5
  211. package/dist/source-sidecars.js.map +1 -1
  212. package/dist/targets.d.ts +47 -1
  213. package/dist/targets.d.ts.map +1 -1
  214. package/dist/targets.js +78 -9
  215. package/dist/targets.js.map +1 -1
  216. package/dist/template-loader.d.ts +7 -3
  217. package/dist/template-loader.d.ts.map +1 -1
  218. package/dist/template-loader.js +27 -12
  219. package/dist/template-loader.js.map +1 -1
  220. package/dist/templates-scan-worker.js +1 -1
  221. package/dist/templates-scan-worker.js.map +1 -1
  222. package/dist/templates-scan.d.ts.map +1 -1
  223. package/dist/templates-scan.js +1 -1
  224. package/dist/templates-scan.js.map +1 -1
  225. package/dist/types.d.ts +116 -9
  226. package/dist/types.d.ts.map +1 -1
  227. package/dist/types.js +28 -5
  228. package/dist/types.js.map +1 -1
  229. package/dist/workers/cloudflare-r2.d.ts +11 -2
  230. package/dist/workers/cloudflare-r2.d.ts.map +1 -1
  231. package/dist/workers/cloudflare-r2.js +120 -55
  232. package/dist/workers/cloudflare-r2.js.map +1 -1
  233. package/package.json +11 -2
  234. package/admin-dist/assets/index-BZAFKsUp.js +0 -608
  235. package/admin-dist/assets/index-BpRotMuK.css +0 -1
  236. package/admin-dist/assets/vendor-vue-DSjyxCX6.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"r2.js","sourceRoot":"","sources":["../../src/providers/r2.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"r2.js","sourceRoot":"","sources":["../../src/providers/r2.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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,CAiHxG"}
@@ -38,20 +38,26 @@ export function createS3Provider(options) {
38
38
  const prefix = normalizePath(path);
39
39
  const prefixWithSlash = prefix ? `${prefix}/` : '';
40
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
- }
41
+ // Paginate S3/R2 returns max 1000 keys per call
42
+ let continuationToken;
43
+ do {
44
+ const response = await client.send(new ListObjectsV2Command({
45
+ Bucket: bucket,
46
+ Prefix: prefixWithSlash,
47
+ ContinuationToken: continuationToken,
48
+ }));
49
+ for (const obj of response.Contents ?? []) {
50
+ const relativeName = obj.Key.slice(prefixWithSlash.length);
51
+ const firstSegment = relativeName.split('/')[0];
52
+ if (!firstSegment)
53
+ continue;
54
+ const isDirectory = relativeName.includes('/');
55
+ if (entries.has(firstSegment) && entries.get(firstSegment))
56
+ continue;
57
+ entries.set(firstSegment, isDirectory);
58
+ }
59
+ continuationToken = response.IsTruncated ? response.NextContinuationToken : undefined;
60
+ } while (continuationToken);
55
61
  return [...entries.entries()].map(([name, isDirectory]) => ({ name, isDirectory }));
56
62
  },
57
63
  async exists(path) {
@@ -86,7 +92,9 @@ export function createS3Provider(options) {
86
92
  try {
87
93
  await client.send(new DeleteObjectCommand({ Bucket: bucket, Key: prefix }));
88
94
  }
89
- catch { /* ignore */ }
95
+ catch {
96
+ /* ignore */
97
+ }
90
98
  // Delete all objects with this prefix
91
99
  const response = await client.send(new ListObjectsV2Command({ Bucket: bucket, Prefix: prefix }));
92
100
  for (const obj of response.Contents ?? []) {
@@ -1 +1 @@
1
- {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/providers/s3.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/providers/s3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Locale-aware publish helpers — renders locale variants alongside defaults.
3
+ *
4
+ * SRP: this module owns the "render all locales for an item" loop.
5
+ * Consumers (admin API publish, CLI publish) call these instead of
6
+ * duplicating the locale iteration logic.
7
+ *
8
+ * When `targetLocales` is provided, only locales in that set are rendered.
9
+ * This supports per-domain deployment where each target serves a locale subset.
10
+ */
11
+ import type { StorageProvider, CacheConfig } from './types.js';
12
+ import type { Site } from './site-loader.js';
13
+ import type { ContentRoot } from './content-root.js';
14
+ import type { SeoContext } from './seo.js';
15
+ import { type HashManifestOptions } from './hash.js';
16
+ export interface PublishLocaleResult {
17
+ files: number;
18
+ removed: number;
19
+ }
20
+ /**
21
+ * Publish a page in all locales — default + locale variants.
22
+ * When `targetLocales` is set, only render locales in that subset.
23
+ */
24
+ export declare function publishPageAllLocales(pageName: string, sourceRoot: ContentRoot, targetStorage: StorageProvider, site: Site, hashOpts: HashManifestOptions, opts: {
25
+ cache?: CacheConfig;
26
+ templatesDir?: string;
27
+ seo?: SeoContext;
28
+ /** When set, only publish locales in this subset. */
29
+ targetLocales?: string[];
30
+ /** Locale keys to skip (already up-to-date). null = default locale. */
31
+ unchangedLocales?: Set<string | null>;
32
+ }): Promise<PublishLocaleResult>;
33
+ /**
34
+ * Publish a fragment in all locales — default + locale variants.
35
+ * When `targetLocales` is set, only render locales in that subset.
36
+ */
37
+ export declare function publishFragmentAllLocales(fragName: string, sourceRoot: ContentRoot, targetStorage: StorageProvider, site: Site, hashOpts: HashManifestOptions, opts: {
38
+ templatesDir?: string;
39
+ /** When set, only publish locales in this subset. */
40
+ targetLocales?: string[];
41
+ /** Locale keys to skip (already up-to-date). null = default locale. */
42
+ unchangedLocales?: Set<string | null>;
43
+ }): Promise<PublishLocaleResult>;
44
+ //# sourceMappingURL=publish-locale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-locale.d.ts","sourceRoot":"","sources":["../src/publish-locale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAGlE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,WAAW,EACvB,aAAa,EAAE,eAAe,EAC9B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,mBAAmB,EAC7B,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;CACtC,GACA,OAAO,CAAC,mBAAmB,CAAC,CAsE9B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,WAAW,EACvB,aAAa,EAAE,eAAe,EAC9B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,mBAAmB,EAC7B,IAAI,EAAE;IACJ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;CACtC,GACA,OAAO,CAAC,mBAAmB,CAAC,CAgD9B"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Locale-aware publish helpers — renders locale variants alongside defaults.
3
+ *
4
+ * SRP: this module owns the "render all locales for an item" loop.
5
+ * Consumers (admin API publish, CLI publish) call these instead of
6
+ * duplicating the locale iteration logic.
7
+ *
8
+ * When `targetLocales` is provided, only locales in that set are rendered.
9
+ * This supports per-domain deployment where each target serves a locale subset.
10
+ */
11
+ import { publishPageRendered, publishFragmentRendered } from './publish-rendered.js';
12
+ import { hashManifest } from './hash.js';
13
+ import { defaultLocaleFor, localeRoutePrefix, resolveSiteLocales } from './locale.js';
14
+ /**
15
+ * Publish a page in all locales — default + locale variants.
16
+ * When `targetLocales` is set, only render locales in that subset.
17
+ */
18
+ export async function publishPageAllLocales(pageName, sourceRoot, targetStorage, site, hashOpts, opts) {
19
+ const page = site.pages.get(pageName);
20
+ if (!page)
21
+ return { files: 0, removed: 0 };
22
+ const localeFilter = opts.targetLocales ? new Set(opts.targetLocales) : null;
23
+ const skipLocales = opts.unchangedLocales ?? new Set();
24
+ const defaultLocale = defaultLocaleFor(site.manifest);
25
+ // Build hreflang alternates for subpath targets (2+ locales on same domain).
26
+ // Each locale variant of this page gets a map of all sibling locale URLs.
27
+ const resolvedLocales = resolveSiteLocales(site.manifest);
28
+ let hreflangAlternates;
29
+ const localeEntry = site.pageLocales.get(pageName);
30
+ if (opts.seo?.siteUrl && resolvedLocales && localeEntry && localeEntry.locales.size > 0) {
31
+ const activeLocales = localeFilter ? [...localeFilter] : [defaultLocale, ...localeEntry.locales.keys()];
32
+ if (activeLocales.length > 1) {
33
+ hreflangAlternates = {};
34
+ for (const loc of activeLocales) {
35
+ const prefix = localeRoutePrefix(loc, resolvedLocales);
36
+ const route = page.route === '/' ? prefix || '/' : `${prefix}${page.route}`;
37
+ hreflangAlternates[loc] = `${opts.seo.siteUrl}${route}`;
38
+ }
39
+ }
40
+ }
41
+ let totalFiles = 0;
42
+ let totalRemoved = 0;
43
+ // Default locale — skip if target doesn't include it or already up-to-date
44
+ if ((!localeFilter || localeFilter.has(defaultLocale)) && !skipLocales.has(null)) {
45
+ const manifestHash = hashManifest(page, hashOpts);
46
+ const seoWithHreflang = opts.seo ? { ...opts.seo, hreflangAlternates, defaultLocale } : undefined;
47
+ const { files, removed } = await publishPageRendered(pageName, sourceRoot, targetStorage, opts.cache, opts.templatesDir, manifestHash, site, seoWithHreflang);
48
+ totalFiles += files;
49
+ totalRemoved += removed;
50
+ }
51
+ // Locale variants — filter by target subset when configured
52
+ if (localeEntry) {
53
+ for (const [locale, localePage] of localeEntry.locales) {
54
+ if (localeFilter && !localeFilter.has(locale))
55
+ continue;
56
+ if (skipLocales.has(locale))
57
+ continue;
58
+ const localeHash = hashManifest(localePage, hashOpts);
59
+ const localeSeo = opts.seo ? { ...opts.seo, locale, hreflangAlternates, defaultLocale } : undefined;
60
+ const { files: lf, removed: lr } = await publishPageRendered(pageName, sourceRoot, targetStorage, opts.cache, opts.templatesDir, localeHash, site, localeSeo, locale);
61
+ totalFiles += lf;
62
+ totalRemoved += lr;
63
+ }
64
+ }
65
+ return { files: totalFiles, removed: totalRemoved };
66
+ }
67
+ /**
68
+ * Publish a fragment in all locales — default + locale variants.
69
+ * When `targetLocales` is set, only render locales in that subset.
70
+ */
71
+ export async function publishFragmentAllLocales(fragName, sourceRoot, targetStorage, site, hashOpts, opts) {
72
+ const frag = site.fragments.get(fragName);
73
+ if (!frag)
74
+ return { files: 0, removed: 0 };
75
+ const localeFilter = opts.targetLocales ? new Set(opts.targetLocales) : null;
76
+ const skipLocales = opts.unchangedLocales ?? new Set();
77
+ const defaultLocale = defaultLocaleFor(site.manifest);
78
+ let totalFiles = 0;
79
+ let totalRemoved = 0;
80
+ // Default locale — skip if target doesn't include it or already up-to-date
81
+ if ((!localeFilter || localeFilter.has(defaultLocale)) && !skipLocales.has(null)) {
82
+ const manifestHash = hashManifest(frag, hashOpts);
83
+ const { files, removed } = await publishFragmentRendered(fragName, sourceRoot, targetStorage, opts.templatesDir, manifestHash, site);
84
+ totalFiles += files;
85
+ totalRemoved += removed;
86
+ }
87
+ // Locale variants — filter by target subset when configured
88
+ const localeEntry = site.fragmentLocales.get(fragName);
89
+ if (localeEntry) {
90
+ for (const [locale, localeFrag] of localeEntry.locales) {
91
+ if (localeFilter && !localeFilter.has(locale))
92
+ continue;
93
+ if (skipLocales.has(locale))
94
+ continue;
95
+ const localeHash = hashManifest(localeFrag, hashOpts);
96
+ const { files: lf, removed: lr } = await publishFragmentRendered(fragName, sourceRoot, targetStorage, opts.templatesDir, localeHash, site, locale);
97
+ totalFiles += lf;
98
+ totalRemoved += lr;
99
+ }
100
+ }
101
+ return { files: totalFiles, removed: totalRemoved };
102
+ }
103
+ //# sourceMappingURL=publish-locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-locale.js","sourceRoot":"","sources":["../src/publish-locale.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,16 @@
1
1
  import type { StorageProvider, PurgeStrategy, CacheConfig } from './types.js';
2
2
  import type { Site } from './site-loader.js';
3
+ import { type ContentRoot } from './content-root.js';
3
4
  /**
4
5
  * Publish a page as HTML with ESI placeholders for fragments.
5
6
  * Local components are baked in. Fragment markup is replaced at request time by the worker.
6
7
  * CSS is stored as separate hashed files for immutable caching.
7
8
  */
8
- export declare function publishPageRendered(pageName: string, sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider, targetCache?: CacheConfig, templatesDir?: string, manifestHash?: string, preloadedSite?: Site): Promise<{
9
+ export declare function publishPageRendered(pageName: string, sourceRoot: ContentRoot, targetStorage: StorageProvider, targetCache?: CacheConfig, templatesDir?: string, manifestHash?: string, preloadedSite?: Site,
10
+ /** SEO context for the fallback chain — caller builds from manifest + target config. */
11
+ seo?: import('./seo.js').SeoContext,
12
+ /** Locale for this render pass. When set, resolves locale-specific fragments. */
13
+ locale?: string): Promise<{
9
14
  files: number;
10
15
  removed: number;
11
16
  }>;
@@ -14,26 +19,32 @@ export declare function publishPageRendered(pageName: string, sourceStorage: Sto
14
19
  * All components (including fragments) are baked in. CSS/JS inline.
15
20
  * For static hosting: GitHub Pages, Netlify, Vercel, any file server.
16
21
  */
17
- export declare function publishPageStatic(pageName: string, sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider, templatesDir?: string, manifestHash?: string, preloadedSite?: Site): Promise<{
22
+ export declare function publishPageStatic(pageName: string, sourceRoot: ContentRoot, targetStorage: StorageProvider, templatesDir?: string, manifestHash?: string, preloadedSite?: Site,
23
+ /** SEO context for the fallback chain — caller builds from manifest + target config. */
24
+ seo?: import('./seo.js').SeoContext,
25
+ /** Locale for this render pass. When set, resolves locale-specific content and writes to locale-prefixed path. */
26
+ locale?: string): Promise<{
18
27
  files: number;
19
28
  }>;
20
29
  /**
21
30
  * Publish a fragment as HTML with a <head> section for CSS/JS.
22
31
  * The worker injects <head> content before </head> and body content at the ESI placeholder.
23
32
  */
24
- export declare function publishFragmentRendered(fragmentName: string, sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider, templatesDir?: string, manifestHash?: string, preloadedSite?: Site): Promise<{
33
+ export declare function publishFragmentRendered(fragmentName: string, sourceRoot: ContentRoot, targetStorage: StorageProvider, templatesDir?: string, manifestHash?: string, preloadedSite?: Site,
34
+ /** Locale for this render pass. When set, resolves locale-specific content and writes to index.{locale}.html. */
35
+ locale?: string): Promise<{
25
36
  files: number;
26
37
  removed: number;
27
38
  }>;
28
39
  /**
29
40
  * Publish site manifest (stripped of targets config).
30
41
  */
31
- export declare function publishSiteManifest(sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider, preloadedSite?: Site): Promise<void>;
42
+ export declare function publishSiteManifest(sourceRoot: ContentRoot, targetStorage: StorageProvider, preloadedSite?: Site): Promise<void>;
32
43
  /**
33
44
  * Build and store reverse fragment index.
34
45
  * Maps each fragment to the list of page routes that use it.
35
46
  */
36
- export declare function publishFragmentIndex(sourceStorage: StorageProvider, sourceDir: string, targetStorage: StorageProvider, preloadedSite?: Site): Promise<Record<string, string[]>>;
47
+ export declare function publishFragmentIndex(sourceRoot: ContentRoot, targetStorage: StorageProvider, preloadedSite?: Site): Promise<Record<string, string[]>>;
37
48
  /** Purge via Cloudflare zone cache API */
38
49
  export declare function createCloudflarePurge(zoneId: string, apiToken: string): PurgeStrategy;
39
50
  /** Look up Cloudflare zone ID from a site URL */
@@ -1 +1 @@
1
- {"version":3,"file":"publish-rendered.d.ts","sourceRoot":"","sources":["../src/publish-rendered.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAmC5C;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,EAC9B,WAAW,CAAC,EAAE,WAAW,EACzB,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,IAAI,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAsH7C;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,EAC9B,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,IAAI,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B5B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,EAC9B,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,IAAI,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgE7C;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,EAC9B,aAAa,CAAC,EAAE,IAAI,GACnB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,eAAe,EAC9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,eAAe,EAC9B,aAAa,CAAC,EAAE,IAAI,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAiBnC;AAED,0CAA0C;AAC1C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAcrF;AAED,iDAAiD;AACjD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQtG;AAED;;GAEG;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,CAkBlD;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,CAUlD"}
1
+ {"version":3,"file":"publish-rendered.d.ts","sourceRoot":"","sources":["../src/publish-rendered.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { loadSite } from './site-loader.js';
3
- import { resolvePage, resolveComponent } from './resolver.js';
3
+ import { resolvePage, resolveFragment } from './resolver.js';
4
4
  import { renderComponent, renderPage } from './renderer.js';
5
5
  import { writeSidecars, collectFragmentRefs } from './sidecars.js';
6
+ import { createContentRoot } from './content-root.js';
7
+ import { resolveSeoTags, escapeAttr } from './seo.js';
6
8
  function contentHash(content) {
7
9
  return createHash('md5').update(content).digest('hex').slice(0, 8);
8
10
  }
@@ -28,7 +30,9 @@ async function cleanupOldFiles(storage, oldFiles, newFiles) {
28
30
  await storage.rm(file);
29
31
  removed++;
30
32
  }
31
- catch { /* already gone */ }
33
+ catch {
34
+ /* already gone */
35
+ }
32
36
  }
33
37
  }
34
38
  return removed;
@@ -38,15 +42,19 @@ async function cleanupOldFiles(storage, oldFiles, newFiles) {
38
42
  * Local components are baked in. Fragment markup is replaced at request time by the worker.
39
43
  * CSS is stored as separate hashed files for immutable caching.
40
44
  */
41
- export async function publishPageRendered(pageName, sourceStorage, sourceDir, targetStorage, targetCache, templatesDir, manifestHash, preloadedSite) {
45
+ export async function publishPageRendered(pageName, sourceRoot, targetStorage, targetCache, templatesDir, manifestHash, preloadedSite,
46
+ /** SEO context for the fallback chain — caller builds from manifest + target config. */
47
+ seo,
48
+ /** Locale for this render pass. When set, resolves locale-specific fragments. */
49
+ locale) {
42
50
  // Reuse a preloaded site when the caller already has one (runPublish loops
43
51
  // over N items; loading per-item was quadratic). loadSite is idempotent.
44
- const site = preloadedSite ?? await loadSite({ siteDir: sourceDir, storage: sourceStorage, templatesDir });
52
+ const site = preloadedSite ?? (await loadSite({ contentRoot: sourceRoot, templatesDir }));
45
53
  const page = site.pages.get(pageName);
46
54
  if (!page)
47
55
  throw new Error(`Page "${pageName}" not found`);
48
56
  // Scope IDs are now deterministic (hash-based), no reset needed
49
- const resolved = await resolvePage(pageName, site);
57
+ const resolved = await resolvePage(pageName, site, locale);
50
58
  // Render each child — fragments become ESI placeholders, local components baked in
51
59
  const bodyParts = [];
52
60
  const localCssParts = [];
@@ -58,7 +66,8 @@ export async function publishPageRendered(pageName, sourceStorage, sourceDir, ta
58
66
  const isFragment = typeof childEntry === 'string' && childEntry.startsWith('@');
59
67
  if (isFragment) {
60
68
  const fragName = childEntry.slice(1);
61
- const fragPath = `fragments/${fragName}/index.html`;
69
+ const fragFile = locale ? `index.${locale}.html` : 'index.html';
70
+ const fragPath = `fragments/${fragName}/${fragFile}`;
62
71
  esiHeadTags.push(`<!--esi-head:/${fragPath}-->`);
63
72
  bodyParts.push(`<!--esi:/${fragPath}-->`);
64
73
  }
@@ -74,8 +83,9 @@ export async function publishPageRendered(pageName, sourceStorage, sourceDir, ta
74
83
  }
75
84
  }
76
85
  // Render page-level template (layout CSS, head tags)
77
- const childOutputs = await Promise.all(resolved.children.map(c => renderComponent(c)));
78
- const pageOutput = await resolved.template({ content: resolved.content, children: childOutputs });
86
+ const lang = seo?.locale || locale || 'en';
87
+ const childOutputs = await Promise.all(resolved.children.map(c => renderComponent(c, undefined, lang)));
88
+ const pageOutput = await resolved.template({ content: resolved.content, children: childOutputs, locale: lang });
79
89
  if (pageOutput.css)
80
90
  localCssParts.unshift(pageOutput.css);
81
91
  if (pageOutput.head)
@@ -110,21 +120,35 @@ export async function publishPageRendered(pageName, sourceStorage, sourceDir, ta
110
120
  pageJsLink = `<script type="module" src="/${jsPath}"></script>`;
111
121
  fileCount++;
112
122
  }
123
+ // SEO tags from the fallback chain — same logic as renderPage uses for
124
+ // static publish. Template head parts are checked for duplicates so the
125
+ // renderer doesn't double-emit tags the template already provides.
126
+ const templateHead = localHeadParts.join('\n');
127
+ const seoHead = resolveSeoTags({
128
+ metadata: page.metadata,
129
+ content: page.content,
130
+ route: page.route,
131
+ seo: seo ?? {},
132
+ templateHead,
133
+ });
113
134
  const headContent = [
114
135
  `<meta charset="UTF-8">`,
115
136
  `<meta name="viewport" content="width=device-width, initial-scale=1.0">`,
137
+ seoHead,
116
138
  ...localHeadParts,
117
139
  pageCssLink,
118
140
  ...esiHeadTags,
119
141
  pageJsLink,
120
- ].filter(Boolean).join('\n ');
142
+ ]
143
+ .filter(Boolean)
144
+ .join('\n ');
121
145
  const bodyContent = bodyParts.join('\n');
122
146
  // Resolve cache config: page → target → defaults
123
147
  const browser = page.cache?.browser ?? targetCache?.browser ?? 0;
124
148
  const edge = page.cache?.edge ?? targetCache?.edge ?? 86400;
125
149
  const cacheComment = `<!--cache:browser=${browser},edge=${edge}-->\n`;
126
150
  const html = `${cacheComment}<!DOCTYPE html>
127
- <html lang="en">
151
+ <html lang="${escapeAttr(lang)}">
128
152
  <head>
129
153
  ${headContent}
130
154
  </head>
@@ -132,16 +156,23 @@ export async function publishPageRendered(pageName, sourceStorage, sourceDir, ta
132
156
  ${bodyContent}
133
157
  </body>
134
158
  </html>`;
159
+ const indexFile = locale ? `index.${locale}.html` : 'index.html';
135
160
  await targetStorage.mkdir(pageDir);
136
- await targetStorage.writeFile(`${pageDir}/index.html`, html);
161
+ await targetStorage.writeFile(`${pageDir}/${indexFile}`, html);
137
162
  fileCount++;
138
- // Write content-hash sidecar + reverse-dep sidecars for compare/dependents
163
+ // Write content-hash sidecar + reverse-dep sidecars for compare/dependents.
164
+ // Locale variants get locale-suffixed sidecars (.hash.fr, .pub.fr);
165
+ // structural sidecars (.uses-*, .tpl-*) are shared (written only for default).
139
166
  if (manifestHash) {
140
167
  await writeSidecars(targetStorage, pageDir, {
141
168
  hash: manifestHash,
142
169
  uses: collectFragmentRefs(page.components),
143
170
  template: page.template,
144
- });
171
+ pub: {
172
+ lastPublished: new Date().toISOString(),
173
+ noindex: !!page.metadata?.robots?.includes('noindex'),
174
+ },
175
+ }, locale);
145
176
  }
146
177
  // Clean up old hashed files
147
178
  const removed = await cleanupOldFiles(targetStorage, oldFiles, newFiles);
@@ -152,16 +183,26 @@ ${bodyContent}
152
183
  * All components (including fragments) are baked in. CSS/JS inline.
153
184
  * For static hosting: GitHub Pages, Netlify, Vercel, any file server.
154
185
  */
155
- export async function publishPageStatic(pageName, sourceStorage, sourceDir, targetStorage, templatesDir, manifestHash, preloadedSite) {
156
- const site = preloadedSite ?? await loadSite({ siteDir: sourceDir, storage: sourceStorage, templatesDir });
186
+ export async function publishPageStatic(pageName, sourceRoot, targetStorage, templatesDir, manifestHash, preloadedSite,
187
+ /** SEO context for the fallback chain caller builds from manifest + target config. */
188
+ seo,
189
+ /** Locale for this render pass. When set, resolves locale-specific content and writes to locale-prefixed path. */
190
+ locale) {
191
+ const site = preloadedSite ?? (await loadSite({ contentRoot: sourceRoot, templatesDir }));
157
192
  const page = site.pages.get(pageName);
158
193
  if (!page)
159
194
  throw new Error(`Page "${pageName}" not found`);
160
195
  // Scope IDs are now deterministic (hash-based), no reset needed
161
- const resolved = await resolvePage(pageName, site);
162
- const html = await renderPage(resolved);
196
+ const resolved = await resolvePage(pageName, site, locale);
197
+ const html = await renderPage(resolved, {
198
+ metadata: page.metadata,
199
+ route: page.route,
200
+ seo,
201
+ });
163
202
  // URL path: / → index.html, /about → about/index.html
164
- const urlPath = page.route === '/' ? '' : page.route.replace(/^\//, '');
203
+ // Locale prefix: /fr/about fr/about/index.html
204
+ const baseUrlPath = page.route === '/' ? '' : page.route.replace(/^\//, '');
205
+ const urlPath = locale ? (baseUrlPath ? `${locale}/${baseUrlPath}` : locale) : baseUrlPath;
165
206
  const outputPath = urlPath ? `${urlPath}/index.html` : 'index.html';
166
207
  const outputDir = urlPath || '.';
167
208
  await targetStorage.mkdir(outputDir);
@@ -174,6 +215,10 @@ export async function publishPageStatic(pageName, sourceStorage, sourceDir, targ
174
215
  hash: manifestHash,
175
216
  uses: collectFragmentRefs(page.components),
176
217
  template: page.template,
218
+ pub: {
219
+ lastPublished: new Date().toISOString(),
220
+ noindex: !!page.metadata?.robots?.includes('noindex'),
221
+ },
177
222
  });
178
223
  }
179
224
  return { files: 1 };
@@ -182,13 +227,14 @@ export async function publishPageStatic(pageName, sourceStorage, sourceDir, targ
182
227
  * Publish a fragment as HTML with a <head> section for CSS/JS.
183
228
  * The worker injects <head> content before </head> and body content at the ESI placeholder.
184
229
  */
185
- export async function publishFragmentRendered(fragmentName, sourceStorage, sourceDir, targetStorage, templatesDir, manifestHash, preloadedSite) {
186
- const site = preloadedSite ?? await loadSite({ siteDir: sourceDir, storage: sourceStorage, templatesDir });
230
+ export async function publishFragmentRendered(fragmentName, sourceRoot, targetStorage, templatesDir, manifestHash, preloadedSite,
231
+ /** Locale for this render pass. When set, resolves locale-specific content and writes to index.{locale}.html. */
232
+ locale) {
233
+ const site = preloadedSite ?? (await loadSite({ contentRoot: sourceRoot, templatesDir }));
187
234
  const fragment = site.fragments.get(fragmentName);
188
235
  if (!fragment)
189
236
  throw new Error(`Fragment "${fragmentName}" not found`);
190
- const ctx = { site, templatesDir: site.templatesDir, visited: new Set(), path: [`@${fragmentName}`] };
191
- const resolved = await resolveComponent(`@${fragmentName}`, ctx);
237
+ const resolved = await resolveFragment(fragmentName, site, locale);
192
238
  // Scope IDs are now deterministic (hash-based), no reset needed
193
239
  const rendered = await renderComponent(resolved);
194
240
  const fragDir = `fragments/${fragmentName}`;
@@ -222,16 +268,20 @@ export async function publishFragmentRendered(fragmentName, sourceStorage, sourc
222
268
  // Build fragment HTML
223
269
  const headSection = headParts.length ? `<head>\n${headParts.join('\n')}\n</head>\n` : '';
224
270
  const fragmentHtml = `${headSection}${rendered.html}`;
271
+ const indexFile = locale ? `index.${locale}.html` : 'index.html';
225
272
  await targetStorage.mkdir(fragDir);
226
- await targetStorage.writeFile(`${fragDir}/index.html`, fragmentHtml);
273
+ await targetStorage.writeFile(`${fragDir}/${indexFile}`, fragmentHtml);
227
274
  fileCount++;
228
- // Write content-hash sidecar + reverse-dep sidecars for compare/dependents
275
+ // Write content-hash sidecar + reverse-dep sidecars for compare/dependents.
276
+ // Locale variants get locale-suffixed sidecars (.hash.fr);
277
+ // structural sidecars (.uses-*, .tpl-*) are shared (written only for default).
229
278
  if (manifestHash) {
230
279
  await writeSidecars(targetStorage, fragDir, {
231
280
  hash: manifestHash,
232
281
  uses: collectFragmentRefs(fragment.components),
233
282
  template: fragment.template,
234
- });
283
+ pub: null,
284
+ }, locale);
235
285
  }
236
286
  // Clean up old hashed files
237
287
  const removed = await cleanupOldFiles(targetStorage, oldFiles, newFiles);
@@ -240,8 +290,8 @@ export async function publishFragmentRendered(fragmentName, sourceStorage, sourc
240
290
  /**
241
291
  * Publish site manifest (stripped of targets config).
242
292
  */
243
- export async function publishSiteManifest(sourceStorage, sourceDir, targetStorage, preloadedSite) {
244
- const site = preloadedSite ?? await loadSite({ siteDir: sourceDir, storage: sourceStorage });
293
+ export async function publishSiteManifest(sourceRoot, targetStorage, preloadedSite) {
294
+ const site = preloadedSite ?? (await loadSite({ contentRoot: sourceRoot }));
245
295
  const manifest = { name: site.manifest.name, version: site.manifest.version };
246
296
  await targetStorage.writeFile('site.json', JSON.stringify(manifest));
247
297
  }
@@ -249,8 +299,8 @@ export async function publishSiteManifest(sourceStorage, sourceDir, targetStorag
249
299
  * Build and store reverse fragment index.
250
300
  * Maps each fragment to the list of page routes that use it.
251
301
  */
252
- export async function publishFragmentIndex(sourceStorage, sourceDir, targetStorage, preloadedSite) {
253
- const site = preloadedSite ?? await loadSite({ siteDir: sourceDir, storage: sourceStorage });
302
+ export async function publishFragmentIndex(sourceRoot, targetStorage, preloadedSite) {
303
+ const site = preloadedSite ?? (await loadSite({ contentRoot: sourceRoot }));
254
304
  const index = {};
255
305
  for (const [_pageName, page] of site.pages) {
256
306
  if (!page.components)
@@ -270,7 +320,7 @@ export async function publishFragmentIndex(sourceStorage, sourceDir, targetStora
270
320
  /** Purge via Cloudflare zone cache API */
271
321
  export function createCloudflarePurge(zoneId, apiToken) {
272
322
  const apiBase = `https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`;
273
- const headers = { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiToken}` };
323
+ const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${apiToken}` };
274
324
  return {
275
325
  async purgeAll() {
276
326
  const res = await fetch(apiBase, { method: 'POST', headers, body: JSON.stringify({ purge_everything: true }) });
@@ -292,14 +342,14 @@ export async function lookupCloudflareZoneId(siteUrl, apiToken) {
292
342
  });
293
343
  if (!res.ok)
294
344
  return null;
295
- const data = await res.json();
345
+ const data = (await res.json());
296
346
  return data.result?.[0]?.id ?? null;
297
347
  }
298
348
  /**
299
349
  * Publish a fragment and purge affected pages.
300
350
  */
301
351
  export async function publishFragmentWithPurge(fragmentName, sourceStorage, sourceDir, targetStorage, purge, purgeMode = 'all') {
302
- const result = await publishFragmentRendered(fragmentName, sourceStorage, sourceDir, targetStorage);
352
+ const result = await publishFragmentRendered(fragmentName, createContentRoot(sourceStorage, sourceDir), targetStorage);
303
353
  if (purgeMode === 'all') {
304
354
  await purge.purgeAll();
305
355
  return { ...result, purgedUrls: ['*'] };
@@ -308,7 +358,9 @@ export async function publishFragmentWithPurge(fragmentName, sourceStorage, sour
308
358
  try {
309
359
  index = JSON.parse(await targetStorage.readFile('index/fragments.json'));
310
360
  }
311
- catch { /* no index yet */ }
361
+ catch {
362
+ /* no index yet */
363
+ }
312
364
  const urls = index[`@${fragmentName}`] ?? [];
313
365
  if (urls.length > 0) {
314
366
  await purge.purgeUrls(urls);
@@ -319,12 +371,13 @@ export async function publishFragmentWithPurge(fragmentName, sourceStorage, sour
319
371
  * Publish a page and purge its URL.
320
372
  */
321
373
  export async function publishPageWithPurge(pageName, sourceStorage, sourceDir, targetStorage, purge) {
322
- const result = await publishPageRendered(pageName, sourceStorage, sourceDir, targetStorage);
323
- const site = await loadSite({ siteDir: sourceDir, storage: sourceStorage });
374
+ const sourceRoot = createContentRoot(sourceStorage, sourceDir);
375
+ const result = await publishPageRendered(pageName, sourceRoot, targetStorage);
376
+ const site = await loadSite({ contentRoot: sourceRoot });
324
377
  const page = site.pages.get(pageName);
325
378
  if (page)
326
379
  await purge.purgeUrls([page.route]);
327
- await publishFragmentIndex(sourceStorage, sourceDir, targetStorage);
380
+ await publishFragmentIndex(sourceRoot, targetStorage);
328
381
  return { ...result, purgedUrls: page ? [page.route] : [] };
329
382
  }
330
383
  //# sourceMappingURL=publish-rendered.js.map