gazetta 0.5.0 → 0.7.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-BO9-CXmW.css +1 -0
- package/admin-dist/assets/index-Ufu8zZH_.js +668 -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/error-response.d.ts +21 -0
- package/dist/admin-api/error-response.d.ts.map +1 -0
- package/dist/admin-api/error-response.js +12 -0
- package/dist/admin-api/error-response.js.map +1 -0
- package/dist/admin-api/index.d.ts +19 -6
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +137 -21
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/routes/assets.d.ts +16 -0
- package/dist/admin-api/routes/assets.d.ts.map +1 -0
- package/dist/admin-api/routes/assets.js +433 -0
- package/dist/admin-api/routes/assets.js.map +1 -0
- 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 +120 -21
- 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 +153 -22
- 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 +259 -79
- 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/assets.d.ts +48 -0
- package/dist/admin-api/schemas/assets.d.ts.map +1 -0
- package/dist/admin-api/schemas/assets.js +44 -0
- package/dist/admin-api/schemas/assets.js.map +1 -0
- 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 +34 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -0
- package/dist/admin-api/schemas/index.js +34 -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 +158 -0
- package/dist/admin-api/source-context.d.ts.map +1 -0
- package/dist/admin-api/source-context.js +92 -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/assets/analyze-audio.d.ts +3 -0
- package/dist/assets/analyze-audio.d.ts.map +1 -0
- package/dist/assets/analyze-audio.js +80 -0
- package/dist/assets/analyze-audio.js.map +1 -0
- package/dist/assets/analyze-image.d.ts +19 -0
- package/dist/assets/analyze-image.d.ts.map +1 -0
- package/dist/assets/analyze-image.js +123 -0
- package/dist/assets/analyze-image.js.map +1 -0
- package/dist/assets/analyze.d.ts +94 -0
- package/dist/assets/analyze.d.ts.map +1 -0
- package/dist/assets/analyze.js +45 -0
- package/dist/assets/analyze.js.map +1 -0
- package/dist/assets/asset-deps.d.ts +30 -0
- package/dist/assets/asset-deps.d.ts.map +1 -0
- package/dist/assets/asset-deps.js +42 -0
- package/dist/assets/asset-deps.js.map +1 -0
- package/dist/assets/asset-paths.d.ts +155 -0
- package/dist/assets/asset-paths.d.ts.map +1 -0
- package/dist/assets/asset-paths.js +197 -0
- package/dist/assets/asset-paths.js.map +1 -0
- package/dist/assets/delete.d.ts +75 -0
- package/dist/assets/delete.d.ts.map +1 -0
- package/dist/assets/delete.js +82 -0
- package/dist/assets/delete.js.map +1 -0
- package/dist/assets/errors.d.ts +241 -0
- package/dist/assets/errors.d.ts.map +1 -0
- package/dist/assets/errors.js +300 -0
- package/dist/assets/errors.js.map +1 -0
- package/dist/assets/find-refs.d.ts +37 -0
- package/dist/assets/find-refs.d.ts.map +1 -0
- package/dist/assets/find-refs.js +35 -0
- package/dist/assets/find-refs.js.map +1 -0
- package/dist/assets/hash.d.ts +13 -0
- package/dist/assets/hash.d.ts.map +1 -0
- package/dist/assets/hash.js +43 -0
- package/dist/assets/hash.js.map +1 -0
- package/dist/assets/image-metadata.d.ts +11 -0
- package/dist/assets/image-metadata.d.ts.map +1 -0
- package/dist/assets/image-metadata.js +31 -0
- package/dist/assets/image-metadata.js.map +1 -0
- package/dist/assets/ingest-locale.d.ts +86 -0
- package/dist/assets/ingest-locale.d.ts.map +1 -0
- package/dist/assets/ingest-locale.js +209 -0
- package/dist/assets/ingest-locale.js.map +1 -0
- package/dist/assets/ingest.d.ts +96 -0
- package/dist/assets/ingest.d.ts.map +1 -0
- package/dist/assets/ingest.js +308 -0
- package/dist/assets/ingest.js.map +1 -0
- package/dist/assets/kind-compat.d.ts +34 -0
- package/dist/assets/kind-compat.d.ts.map +1 -0
- package/dist/assets/kind-compat.js +33 -0
- package/dist/assets/kind-compat.js.map +1 -0
- package/dist/assets/list.d.ts +46 -0
- package/dist/assets/list.d.ts.map +1 -0
- package/dist/assets/list.js +102 -0
- package/dist/assets/list.js.map +1 -0
- package/dist/assets/manifest-default.d.ts +56 -0
- package/dist/assets/manifest-default.d.ts.map +1 -0
- package/dist/assets/manifest-default.js +120 -0
- package/dist/assets/manifest-default.js.map +1 -0
- package/dist/assets/manifest-filename.d.ts +52 -0
- package/dist/assets/manifest-filename.d.ts.map +1 -0
- package/dist/assets/manifest-filename.js +104 -0
- package/dist/assets/manifest-filename.js.map +1 -0
- package/dist/assets/manifest-locale.d.ts +60 -0
- package/dist/assets/manifest-locale.d.ts.map +1 -0
- package/dist/assets/manifest-locale.js +206 -0
- package/dist/assets/manifest-locale.js.map +1 -0
- package/dist/assets/manifest-merge.d.ts +66 -0
- package/dist/assets/manifest-merge.d.ts.map +1 -0
- package/dist/assets/manifest-merge.js +82 -0
- package/dist/assets/manifest-merge.js.map +1 -0
- package/dist/assets/manifest.d.ts +83 -0
- package/dist/assets/manifest.d.ts.map +1 -0
- package/dist/assets/manifest.js +93 -0
- package/dist/assets/manifest.js.map +1 -0
- package/dist/assets/mime-sniff.d.ts +18 -0
- package/dist/assets/mime-sniff.d.ts.map +1 -0
- package/dist/assets/mime-sniff.js +84 -0
- package/dist/assets/mime-sniff.js.map +1 -0
- package/dist/assets/preprocess-svg.d.ts +3 -0
- package/dist/assets/preprocess-svg.d.ts.map +1 -0
- package/dist/assets/preprocess-svg.js +49 -0
- package/dist/assets/preprocess-svg.js.map +1 -0
- package/dist/assets/preprocess.d.ts +62 -0
- package/dist/assets/preprocess.d.ts.map +1 -0
- package/dist/assets/preprocess.js +86 -0
- package/dist/assets/preprocess.js.map +1 -0
- package/dist/assets/publish-plan.d.ts +41 -0
- package/dist/assets/publish-plan.d.ts.map +1 -0
- package/dist/assets/publish-plan.js +49 -0
- package/dist/assets/publish-plan.js.map +1 -0
- package/dist/assets/publish.d.ts +33 -0
- package/dist/assets/publish.d.ts.map +1 -0
- package/dist/assets/publish.js +81 -0
- package/dist/assets/publish.js.map +1 -0
- package/dist/assets/refs.d.ts +37 -0
- package/dist/assets/refs.d.ts.map +1 -0
- package/dist/assets/refs.js +33 -0
- package/dist/assets/refs.js.map +1 -0
- package/dist/assets/remove-override.d.ts +42 -0
- package/dist/assets/remove-override.d.ts.map +1 -0
- package/dist/assets/remove-override.js +53 -0
- package/dist/assets/remove-override.js.map +1 -0
- package/dist/assets/rename.d.ts +43 -0
- package/dist/assets/rename.d.ts.map +1 -0
- package/dist/assets/rename.js +271 -0
- package/dist/assets/rename.js.map +1 -0
- package/dist/assets/replace.d.ts +37 -0
- package/dist/assets/replace.d.ts.map +1 -0
- package/dist/assets/replace.js +195 -0
- package/dist/assets/replace.js.map +1 -0
- package/dist/assets/resolve.d.ts +141 -0
- package/dist/assets/resolve.d.ts.map +1 -0
- package/dist/assets/resolve.js +381 -0
- package/dist/assets/resolve.js.map +1 -0
- package/dist/assets/rewrite-manifest-asset-ref.d.ts +44 -0
- package/dist/assets/rewrite-manifest-asset-ref.d.ts.map +1 -0
- package/dist/assets/rewrite-manifest-asset-ref.js +51 -0
- package/dist/assets/rewrite-manifest-asset-ref.js.map +1 -0
- package/dist/assets/scan-manifest-for-asset.d.ts +63 -0
- package/dist/assets/scan-manifest-for-asset.d.ts.map +1 -0
- package/dist/assets/scan-manifest-for-asset.js +105 -0
- package/dist/assets/scan-manifest-for-asset.js.map +1 -0
- package/dist/assets/serve-route.d.ts +45 -0
- package/dist/assets/serve-route.d.ts.map +1 -0
- package/dist/assets/serve-route.js +123 -0
- package/dist/assets/serve-route.js.map +1 -0
- package/dist/assets/svg-sanitize.d.ts +38 -0
- package/dist/assets/svg-sanitize.d.ts.map +1 -0
- package/dist/assets/svg-sanitize.js +209 -0
- package/dist/assets/svg-sanitize.js.map +1 -0
- package/dist/assets/update-metadata.d.ts +61 -0
- package/dist/assets/update-metadata.d.ts.map +1 -0
- package/dist/assets/update-metadata.js +82 -0
- package/dist/assets/update-metadata.js.map +1 -0
- package/dist/assets/url.d.ts +82 -0
- package/dist/assets/url.d.ts.map +1 -0
- package/dist/assets/url.js +103 -0
- package/dist/assets/url.js.map +1 -0
- package/dist/assets/validate.d.ts +74 -0
- package/dist/assets/validate.d.ts.map +1 -0
- package/dist/assets/validate.js +136 -0
- package/dist/assets/validate.js.map +1 -0
- package/dist/assets/variants.d.ts +23 -0
- package/dist/assets/variants.d.ts.map +1 -0
- package/dist/assets/variants.js +74 -0
- package/dist/assets/variants.js.map +1 -0
- package/dist/cli/assets-cli.d.ts +58 -0
- package/dist/cli/assets-cli.d.ts.map +1 -0
- package/dist/cli/assets-cli.js +233 -0
- package/dist/cli/assets-cli.js.map +1 -0
- package/dist/cli/assets-display.d.ts +112 -0
- package/dist/cli/assets-display.d.ts.map +1 -0
- package/dist/cli/assets-display.js +106 -0
- package/dist/cli/assets-display.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +46 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +84 -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 +689 -128
- 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 +62 -20
- 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/dep-sidecars.d.ts +127 -0
- package/dist/dep-sidecars.d.ts.map +1 -0
- package/dist/dep-sidecars.js +122 -0
- package/dist/dep-sidecars.js.map +1 -0
- package/dist/editor/AssetEmbeddedWidget.d.ts +3 -0
- package/dist/editor/AssetEmbeddedWidget.d.ts.map +1 -0
- package/dist/editor/AssetEmbeddedWidget.js +146 -0
- package/dist/editor/AssetEmbeddedWidget.js.map +1 -0
- package/dist/editor/mount.d.ts +12 -1
- package/dist/editor/mount.d.ts.map +1 -1
- package/dist/editor/mount.js +96 -33
- package/dist/editor/mount.js.map +1 -1
- package/dist/format.d.ts +44 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +65 -0
- package/dist/format.js.map +1 -0
- package/dist/fragment-deps.d.ts +24 -0
- package/dist/fragment-deps.d.ts.map +1 -0
- package/dist/fragment-deps.js +20 -0
- package/dist/fragment-deps.js.map +1 -0
- package/dist/hash.d.ts +34 -9
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +60 -21
- 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 +248 -0
- package/dist/history-provider.js.map +1 -0
- package/dist/history-recorder.d.ts +102 -0
- package/dist/history-recorder.d.ts.map +1 -0
- package/dist/history-recorder.js +168 -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 +137 -0
- package/dist/history-restorer.js.map +1 -0
- package/dist/history.d.ts +129 -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 +27 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +94 -0
- package/dist/locale.d.ts.map +1 -0
- package/dist/locale.js +188 -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/_atomic-write.d.ts +9 -0
- package/dist/providers/_atomic-write.d.ts.map +1 -0
- package/dist/providers/_atomic-write.js +72 -0
- package/dist/providers/_atomic-write.js.map +1 -0
- package/dist/providers/_rm-ignore-missing.d.ts +31 -0
- package/dist/providers/_rm-ignore-missing.d.ts.map +1 -0
- package/dist/providers/_rm-ignore-missing.js +12 -0
- package/dist/providers/_rm-ignore-missing.js.map +1 -0
- package/dist/providers/_stream-interop.d.ts +23 -0
- package/dist/providers/_stream-interop.d.ts.map +1 -0
- package/dist/providers/_stream-interop.js +21 -0
- package/dist/providers/_stream-interop.js.map +1 -0
- package/dist/providers/azure-blob.d.ts.map +1 -1
- package/dist/providers/azure-blob.js +60 -0
- package/dist/providers/azure-blob.js.map +1 -1
- package/dist/providers/filesystem.d.ts +4 -0
- package/dist/providers/filesystem.d.ts.map +1 -1
- package/dist/providers/filesystem.js +63 -2
- package/dist/providers/filesystem.js.map +1 -1
- package/dist/providers/s3.d.ts.map +1 -1
- package/dist/providers/s3.js +107 -16
- 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 +52 -21
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +144 -87
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish.d.ts +18 -19
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +41 -56
- 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 +17 -2
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +112 -16
- 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/schema/dimensions.d.ts +78 -0
- package/dist/schema/dimensions.d.ts.map +1 -0
- package/dist/schema/dimensions.js +97 -0
- package/dist/schema/dimensions.js.map +1 -0
- package/dist/schema/helpers.d.ts +108 -0
- package/dist/schema/helpers.d.ts.map +1 -0
- package/dist/schema/helpers.js +133 -0
- package/dist/schema/helpers.js.map +1 -0
- package/dist/schema/index.d.ts +27 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +25 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/types.d.ts +390 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +25 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/selector-chain.d.ts +63 -0
- package/dist/selector-chain.d.ts.map +1 -0
- package/dist/selector-chain.js +58 -0
- package/dist/selector-chain.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 +26 -21
- package/dist/sidecars.d.ts.map +1 -1
- package/dist/sidecars.js +143 -45
- 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/targets.d.ts +47 -1
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +83 -36
- 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/themes.d.ts +69 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +85 -0
- package/dist/themes.js.map +1 -0
- package/dist/transforms/adapter.d.ts +115 -0
- package/dist/transforms/adapter.d.ts.map +1 -0
- package/dist/transforms/adapter.js +2 -0
- package/dist/transforms/adapter.js.map +1 -0
- package/dist/transforms/cloudflare.d.ts +17 -0
- package/dist/transforms/cloudflare.d.ts.map +1 -0
- package/dist/transforms/cloudflare.js +110 -0
- package/dist/transforms/cloudflare.js.map +1 -0
- package/dist/transforms/index.d.ts +24 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +30 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/sharp.d.ts +3 -0
- package/dist/transforms/sharp.d.ts.map +1 -0
- package/dist/transforms/sharp.js +43 -0
- package/dist/transforms/sharp.js.map +1 -0
- package/dist/types.d.ts +241 -10
- 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 +30 -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.d.ts +0 -8
- package/dist/providers/r2.d.ts.map +0 -1
- package/dist/providers/r2.js +0 -83
- package/dist/providers/r2.js.map +0 -1
- package/dist/source-sidecars.d.ts +0 -13
- package/dist/source-sidecars.d.ts.map +0 -1
- package/dist/source-sidecars.js +0 -52
- package/dist/source-sidecars.js.map +0 -1
package/dist/types.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export type TemplateFunction<T extends Record<string, unknown> = Record<string,
|
|
|
10
10
|
content?: T;
|
|
11
11
|
children?: RenderOutput[];
|
|
12
12
|
params?: Record<string, string>;
|
|
13
|
+
/** Active locale code (e.g. 'fr', 'en'). Always provided by the renderer — defaults to site's locale or 'en'. */
|
|
14
|
+
locale: string;
|
|
13
15
|
}) => RenderOutput | Promise<RenderOutput>;
|
|
14
16
|
/** Mount function for framework-agnostic custom editors */
|
|
15
17
|
export interface EditorMount {
|
|
@@ -20,6 +22,20 @@ export interface EditorMount {
|
|
|
20
22
|
onChange: (content: Record<string, unknown>) => void;
|
|
21
23
|
/** Base URL for loading custom field modules (dev mode: /@fs/ path) */
|
|
22
24
|
fieldsBaseUrl?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Asset picker callback — used by embedded-asset field widgets to
|
|
27
|
+
* open a "select one asset" modal. Admin supplies its own
|
|
28
|
+
* implementation (Vue-rendered in the admin); the editor package
|
|
29
|
+
* depends only on the abstract Promise-returning shape.
|
|
30
|
+
*
|
|
31
|
+
* Returns `{ _asset: name }` on confirm, `null` on cancel.
|
|
32
|
+
*/
|
|
33
|
+
onPickAsset?: (options: {
|
|
34
|
+
accept?: string[];
|
|
35
|
+
currentAssetName?: string | null;
|
|
36
|
+
}) => Promise<{
|
|
37
|
+
_asset: string;
|
|
38
|
+
} | null>;
|
|
23
39
|
}): void;
|
|
24
40
|
unmount(el: HTMLElement): void;
|
|
25
41
|
}
|
|
@@ -73,14 +89,32 @@ export interface CacheConfig {
|
|
|
73
89
|
/** CDN cache purge configuration */
|
|
74
90
|
purge?: PurgeConfig;
|
|
75
91
|
}
|
|
92
|
+
/** SEO metadata for a page — surfaced in <head> and used by sitemap generation. */
|
|
93
|
+
export interface PageMetadata {
|
|
94
|
+
title?: string;
|
|
95
|
+
description?: string;
|
|
96
|
+
ogImage?: string;
|
|
97
|
+
canonical?: string;
|
|
98
|
+
/** Robots directive — e.g. "noindex", "nofollow", "noindex, nofollow".
|
|
99
|
+
* When set, emitted as `<meta name="robots" content="...">`.
|
|
100
|
+
* When absent, the tag is omitted (default: allow indexing). */
|
|
101
|
+
robots?: string;
|
|
102
|
+
}
|
|
76
103
|
/** Page manifest (routable component) */
|
|
77
104
|
export interface PageManifest extends ComponentManifest {
|
|
78
105
|
route: string;
|
|
106
|
+
metadata?: PageMetadata;
|
|
79
107
|
cache?: CacheConfig;
|
|
80
108
|
}
|
|
81
109
|
/** Storage configuration */
|
|
82
110
|
export interface StorageConfig {
|
|
83
111
|
type: 'filesystem' | 'azure-blob' | 's3' | 'r2';
|
|
112
|
+
/**
|
|
113
|
+
* Filesystem storage directory, relative to the site directory.
|
|
114
|
+
* Defaults to `./targets/<target-key>` when unset — the target's key in
|
|
115
|
+
* site.yaml maps to a subdirectory under `targets/`. Override for shared
|
|
116
|
+
* drives, external mounts, or existing custom layouts.
|
|
117
|
+
*/
|
|
84
118
|
path?: string;
|
|
85
119
|
connectionString?: string;
|
|
86
120
|
container?: string;
|
|
@@ -97,33 +131,185 @@ export interface WorkerConfig {
|
|
|
97
131
|
name?: string;
|
|
98
132
|
}
|
|
99
133
|
export type TargetEnvironment = 'local' | 'staging' | 'production';
|
|
134
|
+
export type TargetType = 'static' | 'dynamic';
|
|
100
135
|
/** Target configuration in site.yaml */
|
|
101
136
|
export interface TargetConfig {
|
|
102
137
|
storage: StorageConfig;
|
|
103
138
|
worker?: WorkerConfig;
|
|
104
|
-
/**
|
|
105
|
-
|
|
139
|
+
/**
|
|
140
|
+
* Rendering model:
|
|
141
|
+
* - `static`: pre-rendered at publish time, served from edge (no SSR at request)
|
|
142
|
+
* - `dynamic`: composed/SSR'd at request time on Node/Bun server (ESI-style assembly)
|
|
143
|
+
* Default: `dynamic` if worker configured, `static` otherwise.
|
|
144
|
+
*/
|
|
145
|
+
type?: TargetType;
|
|
106
146
|
/**
|
|
107
147
|
* Semantic intent of this target — drives UI treatment (confirmation
|
|
108
|
-
* prompts, badges) and ops decisions. Default: 'local'
|
|
109
|
-
*
|
|
110
|
-
*
|
|
148
|
+
* prompts, badges) and ops decisions. Default: 'local'. Production
|
|
149
|
+
* targets must be marked explicitly — the default is safe, not
|
|
150
|
+
* alarming; prod opt-in prevents accidental prod chrome on dev targets.
|
|
111
151
|
*/
|
|
112
152
|
environment?: TargetEnvironment;
|
|
153
|
+
/**
|
|
154
|
+
* Whether the author can save form-edits to this target and whether it
|
|
155
|
+
* can receive publishes from the CMS. Default: `true` for `environment:
|
|
156
|
+
* local` (or unset — local is the env default), `false` for `staging`
|
|
157
|
+
* and `production`.
|
|
158
|
+
* Override explicitly for hotfix-tolerant staging/prod setups
|
|
159
|
+
* (`editable: true`) or locked-down local targets (`editable: false`).
|
|
160
|
+
*/
|
|
161
|
+
editable?: boolean;
|
|
113
162
|
/** Base URL of the site (e.g. https://gazetta.studio) */
|
|
114
163
|
siteUrl?: string;
|
|
164
|
+
/**
|
|
165
|
+
* Locale subset this target serves. Inherits site-level `locales.supported`
|
|
166
|
+
* when absent. A single-entry list (e.g. `[fr]`) makes the target
|
|
167
|
+
* single-language — no URL prefix, no locale switching.
|
|
168
|
+
*/
|
|
169
|
+
locales?: string[];
|
|
170
|
+
/**
|
|
171
|
+
* Default locale for this target. Inherits site-level `locale` when absent.
|
|
172
|
+
* The default locale has no URL prefix (unless `defaultPrefix` is true).
|
|
173
|
+
* For single-locale targets, auto-inferred from the `locales` list.
|
|
174
|
+
*/
|
|
175
|
+
locale?: string;
|
|
176
|
+
/**
|
|
177
|
+
* Override site-level `locales.defaultPrefix` for this target.
|
|
178
|
+
*/
|
|
179
|
+
defaultPrefix?: boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Override site-level `locales.detection` for this target.
|
|
182
|
+
*/
|
|
183
|
+
detection?: boolean;
|
|
115
184
|
cache?: CacheConfig;
|
|
185
|
+
/**
|
|
186
|
+
* Per-target history / revisions (undo, rollback). Default: enabled
|
|
187
|
+
* with 50-revision retention. Set `{ enabled: false }` to disable
|
|
188
|
+
* entirely (no `.gazetta/history/` writes on save/publish) for
|
|
189
|
+
* targets where the storage cost isn't worth it (e.g., ephemeral CI
|
|
190
|
+
* preview targets).
|
|
191
|
+
*/
|
|
192
|
+
history?: HistoryConfig;
|
|
193
|
+
/**
|
|
194
|
+
* Image-transform delivery strategy. When unset, `sharp` adapter is
|
|
195
|
+
* used — bytes serve from origin with the immutable cache headers
|
|
196
|
+
* the v1 slice ships. Set to `cloudflare` (or future adapters) to
|
|
197
|
+
* route URLs through a CDN's transform pipeline.
|
|
198
|
+
*/
|
|
199
|
+
transforms?: TransformConfig;
|
|
200
|
+
/**
|
|
201
|
+
* Per-target asset upload policy. Today carries the size cap; future
|
|
202
|
+
* fields (MIME allowlist subset, name policy overrides) extend this
|
|
203
|
+
* block additively. Default cap when unset: 50 MB
|
|
204
|
+
* (DEFAULT_ASSET_MAX_BYTES in assets/validate.ts).
|
|
205
|
+
*
|
|
206
|
+
* Example use cases:
|
|
207
|
+
* - Cloudflare Workers Free tier: cap below 100 MB worker body limit
|
|
208
|
+
* - Self-hosted with nginx + S3: raise to 500 MB for raw-photo
|
|
209
|
+
* workflows
|
|
210
|
+
* - Locked-down prod target: cap at the smallest sensible value
|
|
211
|
+
* for the site's content
|
|
212
|
+
*/
|
|
213
|
+
assets?: AssetUploadConfig;
|
|
214
|
+
}
|
|
215
|
+
/** Per-target asset upload policy. */
|
|
216
|
+
export interface AssetUploadConfig {
|
|
217
|
+
/**
|
|
218
|
+
* Per-asset upload size cap in bytes. Validates against the bytes
|
|
219
|
+
* actually received (sniffed at ingest time, not the client's
|
|
220
|
+
* Content-Length claim). Default: 50 MB.
|
|
221
|
+
*/
|
|
222
|
+
maxBytes?: number;
|
|
116
223
|
}
|
|
117
|
-
/**
|
|
118
|
-
export
|
|
119
|
-
/**
|
|
224
|
+
/** Per-target transform-adapter configuration. */
|
|
225
|
+
export interface TransformConfig {
|
|
226
|
+
/**
|
|
227
|
+
* Adapter name. v1 ships:
|
|
228
|
+
* - `sharp` (default): origin bytes + pre-generated variant ladder
|
|
229
|
+
* - `cloudflare`: `/cdn-cgi/image/...` URL builder against a zone
|
|
230
|
+
*/
|
|
231
|
+
adapter: 'sharp' | 'cloudflare';
|
|
232
|
+
/**
|
|
233
|
+
* Cloudflare adapter only: the zone (hostname) where `/cdn-cgi/image/`
|
|
234
|
+
* is served. Required when adapter is `cloudflare`.
|
|
235
|
+
*/
|
|
236
|
+
zone?: string;
|
|
237
|
+
}
|
|
238
|
+
/** Per-target history configuration. */
|
|
239
|
+
export interface HistoryConfig {
|
|
240
|
+
/** Record revisions on save/publish. Default: true. */
|
|
241
|
+
enabled?: boolean;
|
|
242
|
+
/**
|
|
243
|
+
* Keep at most N most-recent revisions; oldest evicted on write.
|
|
244
|
+
* Default: 50.
|
|
245
|
+
*/
|
|
246
|
+
retention?: number;
|
|
247
|
+
}
|
|
248
|
+
/** Determine rendering type for a target — centralised logic used by CLI and admin API */
|
|
249
|
+
export declare function getType(target: TargetConfig): TargetType;
|
|
250
|
+
/** Resolve a target's environment. Defaults to 'local' — production must be explicit. */
|
|
120
251
|
export declare function getEnvironment(target: TargetConfig): TargetEnvironment;
|
|
252
|
+
/**
|
|
253
|
+
* Whether the author can save and receive publishes on this target from the CMS.
|
|
254
|
+
* Default: true for `environment: local`, false for `staging` / `production`.
|
|
255
|
+
*/
|
|
256
|
+
export declare function isEditable(target: TargetConfig): boolean;
|
|
257
|
+
/** Default retention: keep the last 50 revisions. Matches design-publishing.md. */
|
|
258
|
+
export declare const DEFAULT_HISTORY_RETENTION = 50;
|
|
259
|
+
/** Whether this target records history on save/publish. Default: true. */
|
|
260
|
+
export declare function isHistoryEnabled(target: TargetConfig): boolean;
|
|
261
|
+
/**
|
|
262
|
+
* Effective retention (max revisions) for this target. Defaults to
|
|
263
|
+
* `DEFAULT_HISTORY_RETENTION`. Values ≤ 0 are clamped to 1 — retaining
|
|
264
|
+
* zero revisions would mean every write evicts itself, which is
|
|
265
|
+
* confusing; use `enabled: false` to disable entirely.
|
|
266
|
+
*/
|
|
267
|
+
export declare function getHistoryRetention(target: TargetConfig): number;
|
|
268
|
+
/**
|
|
269
|
+
* i18n configuration. Opt-in: absent = single-locale site.
|
|
270
|
+
* Adding `locales` enables multi-locale support.
|
|
271
|
+
*/
|
|
272
|
+
export interface LocalesConfig {
|
|
273
|
+
/** All supported locale codes (BCP 47). First entry is the default if `locale` is not set. */
|
|
274
|
+
supported: string[];
|
|
275
|
+
/** Locale-specific fallback chains. E.g. `{ 'pt-BR': 'pt' }` → pt-BR falls back to pt before default. */
|
|
276
|
+
fallbacks?: Record<string, string>;
|
|
277
|
+
/** Whether the default locale gets a URL prefix. Default: false (no prefix for default). */
|
|
278
|
+
defaultPrefix?: boolean;
|
|
279
|
+
/** Enable Accept-Language detection and redirect. Default: false. */
|
|
280
|
+
detection?: boolean;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Theme configuration. Opt-in: absent = single-theme site (no theme overrides
|
|
284
|
+
* on assets). Themes are a peer override dimension to locales — assets can
|
|
285
|
+
* declare locale-specific bytes, theme-specific bytes, or both.
|
|
286
|
+
*
|
|
287
|
+
* v1 enables themes on **assets only**. Page/fragment theme variants are
|
|
288
|
+
* deferred; templates emit theme-aware CSS via PrimeVue tokens / class-based
|
|
289
|
+
* cascade. See design-media.md and css-theming.md.
|
|
290
|
+
*/
|
|
291
|
+
export interface ThemesConfig {
|
|
292
|
+
/** Supported theme names (lowercase ASCII, no dots). Conventionally `['light', 'dark']`. */
|
|
293
|
+
supported: string[];
|
|
294
|
+
/** Default theme name. Falls back to first in `supported`. */
|
|
295
|
+
default?: string;
|
|
296
|
+
}
|
|
121
297
|
/** Site manifest (site.yaml) */
|
|
122
298
|
export interface SiteManifest {
|
|
123
299
|
name: string;
|
|
124
300
|
version?: string;
|
|
301
|
+
/** Default locale code (BCP 47). Falls back to first in `locales.supported`, then 'en'. */
|
|
125
302
|
locale?: string;
|
|
126
|
-
|
|
303
|
+
/** i18n configuration. Absent = single-locale site. */
|
|
304
|
+
locales?: LocalesConfig;
|
|
305
|
+
/**
|
|
306
|
+
* Theme configuration for asset overrides. Absent = no theme dimension
|
|
307
|
+
* (assets are theme-agnostic). When set, assets can carry per-theme
|
|
308
|
+
* byte overrides, and the resolver picks variants per render context.
|
|
309
|
+
*/
|
|
310
|
+
themes?: ThemesConfig;
|
|
311
|
+
/** Default Open Graph image for pages that don't specify their own. */
|
|
312
|
+
defaultOgImage?: string;
|
|
127
313
|
systemPages?: string[];
|
|
128
314
|
targets?: Record<string, TargetConfig>;
|
|
129
315
|
}
|
|
@@ -132,7 +318,38 @@ export interface DirEntry {
|
|
|
132
318
|
name: string;
|
|
133
319
|
isDirectory: boolean;
|
|
134
320
|
}
|
|
135
|
-
/**
|
|
321
|
+
/**
|
|
322
|
+
* Byte range for `StorageProvider.readStream`.
|
|
323
|
+
* Both `start` and `end` are inclusive (matches HTTP Range and Node `fs.createReadStream`).
|
|
324
|
+
*/
|
|
325
|
+
export interface ByteRange {
|
|
326
|
+
start: number;
|
|
327
|
+
end: number;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Storage abstraction — filesystem, S3, R2, Azure Blob.
|
|
331
|
+
*
|
|
332
|
+
* Implementations must provide atomic writes from a reader's perspective
|
|
333
|
+
* (filesystem uses write-then-rename; cloud PUT is naturally atomic per
|
|
334
|
+
* object; multipart uploads commit atomically). `readStream` must honor
|
|
335
|
+
* the optional `range` argument for video/audio seek.
|
|
336
|
+
*
|
|
337
|
+
* Three I/O patterns, each with a use case:
|
|
338
|
+
* - **Text** (`readFile` / `writeFile`): small string content
|
|
339
|
+
* (manifests, YAML, HTML). Encodes/decodes UTF-8 internally.
|
|
340
|
+
* - **Bytes** (`readBytes` / `writeBytes`): small binary content
|
|
341
|
+
* (asset bytes, history blobs). Buffer-shaped — bytes in, bytes
|
|
342
|
+
* out. No string round-trip.
|
|
343
|
+
* - **Stream** (`readStream` / `writeStream`): unbounded content
|
|
344
|
+
* (large uploads, range-served videos). Used by ingest and the
|
|
345
|
+
* asset-serve route.
|
|
346
|
+
*
|
|
347
|
+
* All three are part of the base contract, not separate capabilities —
|
|
348
|
+
* every provider Gazetta ships supports them, and custom providers
|
|
349
|
+
* must too. Authors writing a non-conforming provider get a compile-
|
|
350
|
+
* time error rather than a runtime capability check that surfaces
|
|
351
|
+
* at publish time.
|
|
352
|
+
*/
|
|
136
353
|
export interface StorageProvider {
|
|
137
354
|
readFile(path: string): Promise<string>;
|
|
138
355
|
readDir(path: string): Promise<DirEntry[]>;
|
|
@@ -140,6 +357,20 @@ export interface StorageProvider {
|
|
|
140
357
|
writeFile(path: string, content: string): Promise<void>;
|
|
141
358
|
mkdir(path: string): Promise<void>;
|
|
142
359
|
rm(path: string): Promise<void>;
|
|
360
|
+
/**
|
|
361
|
+
* Read the full byte content of `path`. Bounded — for unbounded /
|
|
362
|
+
* range-served reads, use `readStream`. Used by history-blob reads.
|
|
363
|
+
*/
|
|
364
|
+
readBytes(path: string): Promise<Uint8Array>;
|
|
365
|
+
/**
|
|
366
|
+
* Write `content` to `path` atomically. Bounded — for unbounded
|
|
367
|
+
* uploads, use `writeStream`. Used by history-blob writes (and any
|
|
368
|
+
* future write path that has bytes-in-hand and doesn't need
|
|
369
|
+
* streaming).
|
|
370
|
+
*/
|
|
371
|
+
writeBytes(path: string, content: Uint8Array): Promise<void>;
|
|
372
|
+
readStream(path: string, range?: ByteRange): Promise<ReadableStream<Uint8Array>>;
|
|
373
|
+
writeStream(path: string, stream: ReadableStream<Uint8Array>): Promise<void>;
|
|
143
374
|
}
|
|
144
375
|
/** Resolved component ready for rendering */
|
|
145
376
|
export interface ResolvedComponent {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;IACnG,OAAO,CAAC,EAAE,CAAC,CAAA;IACX,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -1,9 +1,32 @@
|
|
|
1
|
-
/** Determine
|
|
2
|
-
export function
|
|
3
|
-
return target.
|
|
1
|
+
/** Determine rendering type for a target — centralised logic used by CLI and admin API */
|
|
2
|
+
export function getType(target) {
|
|
3
|
+
return target.type ?? (target.worker ? 'dynamic' : 'static');
|
|
4
4
|
}
|
|
5
|
-
/** Resolve a target's environment
|
|
5
|
+
/** Resolve a target's environment. Defaults to 'local' — production must be explicit. */
|
|
6
6
|
export function getEnvironment(target) {
|
|
7
|
-
return target.environment ??
|
|
7
|
+
return target.environment ?? 'local';
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Whether the author can save and receive publishes on this target from the CMS.
|
|
11
|
+
* Default: true for `environment: local`, false for `staging` / `production`.
|
|
12
|
+
*/
|
|
13
|
+
export function isEditable(target) {
|
|
14
|
+
return target.editable ?? getEnvironment(target) === 'local';
|
|
15
|
+
}
|
|
16
|
+
/** Default retention: keep the last 50 revisions. Matches design-publishing.md. */
|
|
17
|
+
export const DEFAULT_HISTORY_RETENTION = 50;
|
|
18
|
+
/** Whether this target records history on save/publish. Default: true. */
|
|
19
|
+
export function isHistoryEnabled(target) {
|
|
20
|
+
return target.history?.enabled ?? true;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Effective retention (max revisions) for this target. Defaults to
|
|
24
|
+
* `DEFAULT_HISTORY_RETENTION`. Values ≤ 0 are clamped to 1 — retaining
|
|
25
|
+
* zero revisions would mean every write evicts itself, which is
|
|
26
|
+
* confusing; use `enabled: false` to disable entirely.
|
|
27
|
+
*/
|
|
28
|
+
export function getHistoryRetention(target) {
|
|
29
|
+
const raw = target.history?.retention ?? DEFAULT_HISTORY_RETENTION;
|
|
30
|
+
return raw > 0 ? raw : 1;
|
|
8
31
|
}
|
|
9
32
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA+QA,0FAA0F;AAC1F,MAAM,UAAU,OAAO,CAAC,MAAoB;IAC1C,OAAO,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO,MAAM,CAAC,WAAW,IAAI,OAAO,CAAA;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,OAAO,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,OAAO,CAAA;AAC9D,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAA;AAE3C,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,CAAA;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,yBAAyB,CAAA;IAClE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1B,CAAC"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Reads pre-rendered pages and fragments from an R2 bucket,
|
|
5
5
|
* assembles them using ESI-style composition, and serves with
|
|
6
|
-
* Cache API + ETag support.
|
|
6
|
+
* Cache API + ETag support. Locale-aware: extracts locale prefix
|
|
7
|
+
* from URL, reads locale-suffixed files, falls back to default.
|
|
7
8
|
*
|
|
8
9
|
* Usage: import and re-export from your worker entry point:
|
|
9
10
|
*
|
|
@@ -13,13 +14,21 @@
|
|
|
13
14
|
* Or customize:
|
|
14
15
|
*
|
|
15
16
|
* import { createWorker } from 'gazetta/workers/cloudflare-r2'
|
|
16
|
-
* const worker = createWorker({
|
|
17
|
+
* const worker = createWorker({
|
|
18
|
+
* bucketBinding: 'SITE_BUCKET',
|
|
19
|
+
* locales: ['en', 'fr', 'de'],
|
|
20
|
+
* defaultLocale: 'en',
|
|
21
|
+
* })
|
|
17
22
|
* export default worker
|
|
18
23
|
*/
|
|
19
24
|
import { Hono } from 'hono';
|
|
20
25
|
export interface CloudflareR2WorkerOptions {
|
|
21
26
|
/** R2 bucket binding name (default: 'SITE_BUCKET') */
|
|
22
27
|
bucketBinding?: string;
|
|
28
|
+
/** Supported locale codes (lowercase). Enables locale-prefix routing. */
|
|
29
|
+
locales?: string[];
|
|
30
|
+
/** Default locale — no URL prefix. Falls back to first in `locales`. */
|
|
31
|
+
defaultLocale?: string;
|
|
23
32
|
/** Custom middleware to add before page serving */
|
|
24
33
|
middleware?: (app: Hono<{
|
|
25
34
|
Bindings: Record<string, R2Bucket>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-r2.d.ts","sourceRoot":"","sources":["../../src/workers/cloudflare-r2.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"cloudflare-r2.d.ts","sourceRoot":"","sources":["../../src/workers/cloudflare-r2.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,MAAM,WAAW,yBAAyB;IACxC,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mDAAmD;IACnD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;KAAE,CAAC,KAAK,IAAI,CAAA;CACzE;AA0FD,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,yBAAyB;cAK7B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;0CAuF1D"}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Reads pre-rendered pages and fragments from an R2 bucket,
|
|
6
6
|
* assembles them using ESI-style composition, and serves with
|
|
7
|
-
* Cache API + ETag support.
|
|
7
|
+
* Cache API + ETag support. Locale-aware: extracts locale prefix
|
|
8
|
+
* from URL, reads locale-suffixed files, falls back to default.
|
|
8
9
|
*
|
|
9
10
|
* Usage: import and re-export from your worker entry point:
|
|
10
11
|
*
|
|
@@ -14,13 +15,97 @@
|
|
|
14
15
|
* Or customize:
|
|
15
16
|
*
|
|
16
17
|
* import { createWorker } from 'gazetta/workers/cloudflare-r2'
|
|
17
|
-
* const worker = createWorker({
|
|
18
|
+
* const worker = createWorker({
|
|
19
|
+
* bucketBinding: 'SITE_BUCKET',
|
|
20
|
+
* locales: ['en', 'fr', 'de'],
|
|
21
|
+
* defaultLocale: 'en',
|
|
22
|
+
* })
|
|
18
23
|
* export default worker
|
|
19
24
|
*/
|
|
20
25
|
import { Hono } from 'hono';
|
|
21
26
|
import { assembleEsi, parseCacheComment, splitFragment, findEsiPaths } from '../assemble.js';
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Locale extraction (same logic as serve.ts — SRP)
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
function extractLocale(requestPath, locales) {
|
|
31
|
+
if (locales.length === 0)
|
|
32
|
+
return { locale: undefined, path: requestPath };
|
|
33
|
+
const parts = requestPath.split('/').filter(Boolean);
|
|
34
|
+
if (parts.length > 0 && locales.includes(parts[0])) {
|
|
35
|
+
return { locale: parts[0], path: '/' + parts.slice(1).join('/') || '/' };
|
|
36
|
+
}
|
|
37
|
+
return { locale: undefined, path: requestPath };
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Fragment fetching with locale fallback (SRP)
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
async function fetchFragment(bucket, path) {
|
|
43
|
+
const key = path.slice(1);
|
|
44
|
+
const obj = await bucket.get(key);
|
|
45
|
+
if (obj)
|
|
46
|
+
return [path, splitFragment(await obj.text())];
|
|
47
|
+
// Locale fallback: index.fr.html → index.html
|
|
48
|
+
const localeFallback = key.replace(/\/index\.[a-z-]+\.html$/, '/index.html');
|
|
49
|
+
if (localeFallback !== key) {
|
|
50
|
+
const fallbackObj = await bucket.get(localeFallback);
|
|
51
|
+
if (fallbackObj)
|
|
52
|
+
return [path, splitFragment(await fallbackObj.text())];
|
|
53
|
+
}
|
|
54
|
+
return [path, { head: '', body: `<!-- fragment not found: ${path} -->` }];
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Page lookup with locale support (SRP)
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
async function findPage(bucket, requestPath, locales) {
|
|
60
|
+
const { locale, path: resolvedPath } = locales?.length
|
|
61
|
+
? extractLocale(requestPath, locales)
|
|
62
|
+
: { locale: undefined, path: requestPath };
|
|
63
|
+
const indexFile = locale ? `index.${locale}.html` : 'index.html';
|
|
64
|
+
// Try exact page path
|
|
65
|
+
const pagePath = resolvedPath === '/' ? `pages/home/${indexFile}` : `pages${resolvedPath}/${indexFile}`;
|
|
66
|
+
const obj = await bucket.get(pagePath);
|
|
67
|
+
if (obj)
|
|
68
|
+
return { html: await obj.text(), locale };
|
|
69
|
+
// Locale fallback to default
|
|
70
|
+
if (locale) {
|
|
71
|
+
const fallback = resolvedPath === '/' ? 'pages/home/index.html' : `pages${resolvedPath}/index.html`;
|
|
72
|
+
const fallbackObj = await bucket.get(fallback);
|
|
73
|
+
if (fallbackObj)
|
|
74
|
+
return { html: await fallbackObj.text(), locale };
|
|
75
|
+
}
|
|
76
|
+
// Dynamic segments — list parent directory, find [param] entries
|
|
77
|
+
const parts = resolvedPath.split('/').filter(Boolean);
|
|
78
|
+
for (let i = parts.length - 1; i >= 0; i--) {
|
|
79
|
+
const parentDir = parts.slice(0, i).join('/');
|
|
80
|
+
const prefix = parentDir ? `pages/${parentDir}/` : 'pages/';
|
|
81
|
+
const listed = await bucket.list({ prefix, delimiter: '/' });
|
|
82
|
+
for (const item of listed.delimitedPrefixes) {
|
|
83
|
+
const segment = item.replace(prefix, '').replace(/\/$/, '');
|
|
84
|
+
if (segment.startsWith('[') && segment.endsWith(']')) {
|
|
85
|
+
const dynamicParts = [...parts];
|
|
86
|
+
dynamicParts[i] = segment;
|
|
87
|
+
const dynamicPath = `pages/${dynamicParts.join('/')}/${indexFile}`;
|
|
88
|
+
const dynObj = await bucket.get(dynamicPath);
|
|
89
|
+
if (dynObj)
|
|
90
|
+
return { html: await dynObj.text(), locale };
|
|
91
|
+
// Dynamic route locale fallback
|
|
92
|
+
if (locale) {
|
|
93
|
+
const dynFallback = await bucket.get(`pages/${dynamicParts.join('/')}/index.html`);
|
|
94
|
+
if (dynFallback)
|
|
95
|
+
return { html: await dynFallback.text(), locale };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Worker composition
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
22
105
|
export function createWorker(options) {
|
|
23
106
|
const bindingName = options?.bucketBinding ?? 'SITE_BUCKET';
|
|
107
|
+
const locales = options?.locales;
|
|
108
|
+
const nonDefaultLocales = locales?.filter(l => l !== (options?.defaultLocale ?? locales?.[0])) ?? [];
|
|
24
109
|
const app = new Hono();
|
|
25
110
|
// Custom middleware (e.g., www redirect, auth)
|
|
26
111
|
if (options?.middleware)
|
|
@@ -32,6 +117,23 @@ export function createWorker(options) {
|
|
|
32
117
|
const fragments = await bucket.list({ prefix: 'fragments/', delimiter: '/' });
|
|
33
118
|
return c.json({ ok: true, pages: pages.delimitedPrefixes.length, fragments: fragments.delimitedPrefixes.length });
|
|
34
119
|
});
|
|
120
|
+
// Root-level files (sitemap.xml, robots.txt) — served from R2
|
|
121
|
+
app.get('/sitemap.xml', async (c) => {
|
|
122
|
+
const obj = await c.env[bindingName].get('sitemap.xml');
|
|
123
|
+
if (!obj)
|
|
124
|
+
return c.notFound();
|
|
125
|
+
return new Response(obj.body, {
|
|
126
|
+
headers: { 'Content-Type': 'application/xml; charset=utf-8', 'Cache-Control': 'public, max-age=3600' },
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
app.get('/robots.txt', async (c) => {
|
|
130
|
+
const obj = await c.env[bindingName].get('robots.txt');
|
|
131
|
+
if (!obj)
|
|
132
|
+
return c.notFound();
|
|
133
|
+
return new Response(obj.body, {
|
|
134
|
+
headers: { 'Content-Type': 'text/plain; charset=utf-8', 'Cache-Control': 'public, max-age=3600' },
|
|
135
|
+
});
|
|
136
|
+
});
|
|
35
137
|
// Static assets (CSS, JS) — immutable cache
|
|
36
138
|
app.get('/pages/*', async (c) => serveStatic(c, c.env[bindingName]));
|
|
37
139
|
app.get('/fragments/*', async (c) => serveStatic(c, c.env[bindingName]));
|
|
@@ -44,47 +146,36 @@ export function createWorker(options) {
|
|
|
44
146
|
return cached;
|
|
45
147
|
const bucket = c.env[bindingName];
|
|
46
148
|
const requestPath = new URL(c.req.url).pathname;
|
|
47
|
-
const
|
|
48
|
-
if (!
|
|
49
|
-
const
|
|
50
|
-
if (
|
|
51
|
-
const { html: raw404 } = parseCacheComment(
|
|
52
|
-
const
|
|
53
|
-
const fragEntries = await Promise.all(fragPaths.map(async (p) => {
|
|
54
|
-
const obj = await bucket.get(p.slice(1));
|
|
55
|
-
if (!obj)
|
|
56
|
-
return [p, { head: '', body: '' }];
|
|
57
|
-
return [p, splitFragment(await obj.text())];
|
|
58
|
-
}));
|
|
149
|
+
const result = await findPage(bucket, requestPath, locales);
|
|
150
|
+
if (!result) {
|
|
151
|
+
const notFound = await findPage(bucket, '/404');
|
|
152
|
+
if (notFound) {
|
|
153
|
+
const { html: raw404 } = parseCacheComment(notFound.html);
|
|
154
|
+
const fragEntries = await Promise.all(findEsiPaths(raw404).map(p => fetchFragment(bucket, p)));
|
|
59
155
|
return c.html(assembleEsi(raw404, new Map(fragEntries)), 404);
|
|
60
156
|
}
|
|
61
157
|
return c.html('<h1>404 — Page not found</h1>', 404);
|
|
62
158
|
}
|
|
63
|
-
const { html: rawHtml, browser, edge } = parseCacheComment(
|
|
64
|
-
// Read all fragments in parallel
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
const key = path.slice(1);
|
|
68
|
-
const obj = await bucket.get(key);
|
|
69
|
-
if (!obj)
|
|
70
|
-
return [path, { head: '', body: `<!-- fragment not found: ${path} -->` }];
|
|
71
|
-
return [path, splitFragment(await obj.text())];
|
|
72
|
-
}));
|
|
73
|
-
const fragments = new Map(fragmentEntries);
|
|
74
|
-
const assembled = assembleEsi(rawHtml, fragments);
|
|
159
|
+
const { html: rawHtml, browser, edge } = parseCacheComment(result.html);
|
|
160
|
+
// Read all fragments in parallel (with locale fallback)
|
|
161
|
+
const fragEntries = await Promise.all(findEsiPaths(rawHtml).map(p => fetchFragment(bucket, p)));
|
|
162
|
+
const assembled = assembleEsi(rawHtml, new Map(fragEntries));
|
|
75
163
|
// Compute ETag
|
|
76
164
|
const encoder = new TextEncoder();
|
|
77
165
|
const hashBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(assembled));
|
|
78
|
-
const etag = `"${[...new Uint8Array(hashBuffer)]
|
|
166
|
+
const etag = `"${[...new Uint8Array(hashBuffer)]
|
|
167
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
168
|
+
.join('')
|
|
169
|
+
.slice(0, 16)}"`;
|
|
79
170
|
if (c.req.header('If-None-Match') === etag) {
|
|
80
|
-
return new Response(null, { status: 304, headers: {
|
|
171
|
+
return new Response(null, { status: 304, headers: { ETag: etag } });
|
|
81
172
|
}
|
|
82
173
|
const response = new Response(assembled, {
|
|
83
174
|
status: 200,
|
|
84
175
|
headers: {
|
|
85
176
|
'Content-Type': 'text/html; charset=utf-8',
|
|
86
177
|
'Cache-Control': `public, max-age=${browser}, s-maxage=${edge}`,
|
|
87
|
-
|
|
178
|
+
ETag: etag,
|
|
88
179
|
},
|
|
89
180
|
});
|
|
90
181
|
c.executionCtx.waitUntil(cache.put(request, response.clone()));
|
|
@@ -106,30 +197,4 @@ async function serveStatic(c, bucket) {
|
|
|
106
197
|
},
|
|
107
198
|
});
|
|
108
199
|
}
|
|
109
|
-
async function findPage(bucket, requestPath) {
|
|
110
|
-
const pagePath = requestPath === '/' ? 'pages/home/index.html'
|
|
111
|
-
: `pages${requestPath}/index.html`;
|
|
112
|
-
const obj = await bucket.get(pagePath);
|
|
113
|
-
if (obj)
|
|
114
|
-
return await obj.text();
|
|
115
|
-
// Try dynamic segments — list parent directory, find [param] entries
|
|
116
|
-
const parts = requestPath.split('/').filter(Boolean);
|
|
117
|
-
for (let i = parts.length - 1; i >= 0; i--) {
|
|
118
|
-
const parentDir = parts.slice(0, i).join('/');
|
|
119
|
-
const prefix = parentDir ? `pages/${parentDir}/` : 'pages/';
|
|
120
|
-
const listed = await bucket.list({ prefix, delimiter: '/' });
|
|
121
|
-
for (const item of listed.delimitedPrefixes) {
|
|
122
|
-
const segment = item.replace(prefix, '').replace(/\/$/, '');
|
|
123
|
-
if (segment.startsWith('[') && segment.endsWith(']')) {
|
|
124
|
-
const dynamicParts = [...parts];
|
|
125
|
-
dynamicParts[i] = segment;
|
|
126
|
-
const dynamicPath = `pages/${dynamicParts.join('/')}/index.html`;
|
|
127
|
-
const dynObj = await bucket.get(dynamicPath);
|
|
128
|
-
if (dynObj)
|
|
129
|
-
return await dynObj.text();
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
200
|
//# sourceMappingURL=cloudflare-r2.js.map
|