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.
- 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 +19 -4
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +154 -18
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/routes/compare.d.ts +2 -1
- package/dist/admin-api/routes/compare.d.ts.map +1 -1
- package/dist/admin-api/routes/compare.js +33 -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 -3
- package/dist/admin-api/routes/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +92 -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 -3
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +118 -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 +2 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +213 -66
- 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 +630 -115
- package/dist/cli/index.js.map +1 -1
- package/dist/compare.d.ts +8 -5
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +53 -14
- package/dist/compare.js.map +1 -1
- 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 +34 -3
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +64 -7
- 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 +16 -5
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +89 -36
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish.d.ts +5 -7
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +21 -12
- 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 +9 -5
- package/dist/sidecars.d.ts.map +1 -1
- package/dist/sidecars.js +112 -22
- package/dist/sidecars.js.map +1 -1
- package/dist/site-loader.d.ts +74 -6
- package/dist/site-loader.d.ts.map +1 -1
- package/dist/site-loader.js +138 -28
- 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 +21 -2
- package/dist/source-sidecars.d.ts.map +1 -1
- package/dist/source-sidecars.js +51 -5
- package/dist/source-sidecars.js.map +1 -1
- 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-BZAFKsUp.js +0 -608
- package/admin-dist/assets/index-BpRotMuK.css +0 -1
- package/admin-dist/assets/vendor-vue-DSjyxCX6.js +0 -1
package/dist/providers/r2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../../src/providers/r2.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,GAAG,sCAAsC,CAAA;AAErD,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAC/C,MAAM,IAAI,GAAG,GAAG,MAAM,aAAa,SAAS,eAAe,MAAM,UAAU,CAAA;IAE3E,SAAS,OAAO,CAAC,KAA8B;QAC7C,OAAO,EAAE,aAAa,EAAE,UAAU,QAAQ,EAAE,EAAE,GAAG,KAAK,EAAE,CAAA;IAC1D,CAAC;IAED,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,IAAY;YACzB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACrG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;gBAClE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YACzE,CAAC;YACD,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,IAAY;YACxB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;YAClC,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAClD,MAAM,GAAG,GAAG,GAAG,MAAM,aAAa,SAAS,eAAe,MAAM,mBAAmB,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAA;YACxH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACpD,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;YAClE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../../src/providers/r2.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,GAAG,sCAAsC,CAAA;AAErD,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAC/C,MAAM,IAAI,GAAG,GAAG,MAAM,aAAa,SAAS,eAAe,MAAM,UAAU,CAAA;IAE3E,SAAS,OAAO,CAAC,KAA8B;QAC7C,OAAO,EAAE,aAAa,EAAE,UAAU,QAAQ,EAAE,EAAE,GAAG,KAAK,EAAE,CAAA;IAC1D,CAAC;IAED,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,IAAY;YACzB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACrG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;gBAClE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YACzE,CAAC;YACD,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,IAAY;YACxB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;YAClC,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAClD,MAAM,GAAG,GAAG,GAAG,MAAM,aAAa,SAAS,eAAe,MAAM,mBAAmB,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAA;YACxH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACpD,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;YAClE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuC,CAAA;YACrE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAA;YAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACpC,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;gBAC1D,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC/C,IAAI,CAAC,YAAY;oBAAE,SAAQ;gBAC3B,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;oBAAE,SAAQ;gBACpE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;YACxC,CAAC;YACD,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QACrF,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,IAAY;YACvB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE;gBAC5E,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,OAAO,EAAE;aACnB,CAAC,CAAA;YACF,IAAI,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAA;YACvB,4BAA4B;YAC5B,MAAM,GAAG,GAAG,GAAG,MAAM,aAAa,SAAS,eAAe,MAAM,mBAAmB,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,aAAa,CAAA;YAC7I,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACxD,IAAI,CAAC,OAAO,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAA;YAC7B,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAA0B,CAAA;YAC5D,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACvC,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,OAAe;YAC3C,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAC9C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE;gBAC5E,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC;gBACjE,IAAI;aACL,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;QACvF,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,KAAa;YACvB,qDAAqD;QACvD,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,IAAY;YACnB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;YAC/B,gCAAgC;YAChC,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YAC3F,sCAAsC;YACtC,MAAM,GAAG,GAAG,GAAG,MAAM,aAAa,SAAS,eAAe,MAAM,mBAAmB,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAA;YAC5G,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACxD,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAuC,CAAA;gBACzE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;oBACpC,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;gBACjG,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;AACxC,CAAC"}
|
|
@@ -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,
|
|
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"}
|
package/dist/providers/s3.js
CHANGED
|
@@ -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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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 {
|
|
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 ?? []) {
|
package/dist/providers/s3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/providers/s3.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAY3B,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACzD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;QAChC,WAAW,EAAE;YACX,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,eAAe,EAAE,OAAO,CAAC,eAAe;SACzC;QACD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;KAC/C,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAE7B,OAAO;QACL,KAAK,CAAC,IAAI;YACR,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YAChE,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAA;gBAC5C,IAAI,IAAI,KAAK,yBAAyB,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;oBACzE,oCAAoC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,IAAY;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACtG,OAAO,MAAM,QAAQ,CAAC,IAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;YACxD,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAA;gBAC5C,IAAI,IAAI,KAAK,WAAW;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;gBACpE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAA;YACnE,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,IAAY;YACxB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;YAClC,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAClD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAA;YAE1C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,
|
|
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,
|
|
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,
|
|
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,
|
|
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(
|
|
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(
|
|
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;
|
|
1
|
+
{"version":3,"file":"publish-rendered.d.ts","sourceRoot":"","sources":["../src/publish-rendered.ts"],"names":[],"mappings":"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"}
|
package/dist/publish-rendered.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
import { loadSite } from './site-loader.js';
|
|
3
|
-
import { resolvePage,
|
|
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 {
|
|
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,
|
|
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({
|
|
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
|
|
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
|
|
78
|
-
const
|
|
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
|
-
]
|
|
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="
|
|
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}
|
|
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,
|
|
156
|
-
|
|
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
|
-
|
|
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,
|
|
186
|
-
|
|
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
|
|
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}
|
|
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(
|
|
244
|
-
const site = preloadedSite ?? await loadSite({
|
|
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(
|
|
253
|
-
const site = preloadedSite ?? await loadSite({
|
|
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',
|
|
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 {
|
|
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
|
|
323
|
-
const
|
|
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(
|
|
380
|
+
await publishFragmentIndex(sourceRoot, targetStorage);
|
|
328
381
|
return { ...result, purgedUrls: page ? [page.route] : [] };
|
|
329
382
|
}
|
|
330
383
|
//# sourceMappingURL=publish-rendered.js.map
|