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
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update an asset's metadata (alt today; tags, focalPoint, title,
|
|
3
|
+
* description as those land).
|
|
4
|
+
*
|
|
5
|
+
* Single responsibility: merge a metadata patch into the existing
|
|
6
|
+
* default manifest, validate, persist, record history. Doesn't touch
|
|
7
|
+
* bytes, doesn't enumerate paths, doesn't scan refs.
|
|
8
|
+
*
|
|
9
|
+
* Three-state alt semantics (per design-media.md):
|
|
10
|
+
* - patch.alt === undefined → leave alt unchanged (caller didn't send it)
|
|
11
|
+
* - patch.alt === "string" → meaningful description
|
|
12
|
+
* - patch.alt === "" → intentionally decorative
|
|
13
|
+
* - patch.alt === null → not set (resolver falls back to '')
|
|
14
|
+
*
|
|
15
|
+
* The discriminator is `'alt' in patch` vs `patch.alt`. JS-level distinct
|
|
16
|
+
* meaning of "absent" vs "explicit null". The HTTP layer translates
|
|
17
|
+
* between JSON's `null` (explicit) and field-not-present (absent) so the
|
|
18
|
+
* three-state contract survives the wire.
|
|
19
|
+
*/
|
|
20
|
+
import type { ContentRoot } from '../content-root.js';
|
|
21
|
+
import type { HistoryProvider } from '../history.js';
|
|
22
|
+
import type { AssetManifest } from '../schema/types.js';
|
|
23
|
+
import type { StorageProvider } from '../types.js';
|
|
24
|
+
/**
|
|
25
|
+
* Patch shape — every field optional; only present fields are applied.
|
|
26
|
+
* Undefined = "don't change," explicit `null` = "set to null state."
|
|
27
|
+
*/
|
|
28
|
+
export interface AssetMetadataPatch {
|
|
29
|
+
/** Three-state alt (string | "" | null). Absent in patch = unchanged. */
|
|
30
|
+
alt?: string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Focal point in normalized coordinates (0–1). Two-state:
|
|
33
|
+
* - `{ x, y }` → set it
|
|
34
|
+
* - `null` → clear (manifest field becomes absent, falls back
|
|
35
|
+
* to center at render time)
|
|
36
|
+
* - omitted → unchanged
|
|
37
|
+
*/
|
|
38
|
+
focalPoint?: {
|
|
39
|
+
x: number;
|
|
40
|
+
y: number;
|
|
41
|
+
} | null;
|
|
42
|
+
}
|
|
43
|
+
export interface UpdateAssetMetadataInput {
|
|
44
|
+
storage: StorageProvider;
|
|
45
|
+
assetsRoot: string;
|
|
46
|
+
assetName: string;
|
|
47
|
+
patch: AssetMetadataPatch;
|
|
48
|
+
history?: HistoryProvider;
|
|
49
|
+
contentRoot?: ContentRoot;
|
|
50
|
+
author?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Apply a metadata patch to the asset's default manifest. Throws:
|
|
54
|
+
* - `AssetManifestNotFoundError` — asset doesn't exist
|
|
55
|
+
* - `AssetStorageError` — manifest write failed
|
|
56
|
+
*
|
|
57
|
+
* Returns the updated manifest so callers can re-summarize for the
|
|
58
|
+
* client without an extra round-trip.
|
|
59
|
+
*/
|
|
60
|
+
export declare function updateAssetMetadata(input: UpdateAssetMetadataInput): Promise<AssetManifest>;
|
|
61
|
+
//# sourceMappingURL=update-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-metadata.d.ts","sourceRoot":"","sources":["../../src/assets/update-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAE7C;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,eAAe,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,kBAAkB,CAAA;IACzB,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAyDjG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { recordWrite } from '../history-recorder.js';
|
|
2
|
+
import { manifestPath, readManifest, writeManifest } from './manifest.js';
|
|
3
|
+
import { AssetStorageError } from './errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Apply a metadata patch to the asset's default manifest. Throws:
|
|
6
|
+
* - `AssetManifestNotFoundError` — asset doesn't exist
|
|
7
|
+
* - `AssetStorageError` — manifest write failed
|
|
8
|
+
*
|
|
9
|
+
* Returns the updated manifest so callers can re-summarize for the
|
|
10
|
+
* client without an extra round-trip.
|
|
11
|
+
*/
|
|
12
|
+
export async function updateAssetMetadata(input) {
|
|
13
|
+
const current = await readManifest(input.storage, input.assetsRoot, input.assetName);
|
|
14
|
+
// Apply patch: only fields explicitly present in the patch object
|
|
15
|
+
// overwrite the manifest. Each new metadata field adds one
|
|
16
|
+
// `'field' in input.patch` clause here.
|
|
17
|
+
const next = { ...current };
|
|
18
|
+
if ('alt' in input.patch) {
|
|
19
|
+
next.alt = input.patch.alt ?? null;
|
|
20
|
+
}
|
|
21
|
+
if ('focalPoint' in input.patch) {
|
|
22
|
+
const fp = input.patch.focalPoint;
|
|
23
|
+
if (fp === null) {
|
|
24
|
+
// Clear → remove the field so the manifest serializes without it.
|
|
25
|
+
delete next.focalPoint;
|
|
26
|
+
}
|
|
27
|
+
else if (fp !== undefined) {
|
|
28
|
+
// Range-check (0–1 inclusive). Invalid input is a programmer
|
|
29
|
+
// error at this layer — the route validator should reject before
|
|
30
|
+
// calling. Defensive throw rather than silent clamp.
|
|
31
|
+
if (fp.x < 0 || fp.x > 1 || fp.y < 0 || fp.y > 1) {
|
|
32
|
+
throw new Error(`Focal point out of range: x=${fp.x}, y=${fp.y} (must be 0–1)`);
|
|
33
|
+
}
|
|
34
|
+
next.focalPoint = { x: fp.x, y: fp.y };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Short-circuit no-op patches: identical manifest = identical history
|
|
38
|
+
// entry, but the recorder doesn't dedup entries that produce the same
|
|
39
|
+
// snapshot, so we'd accumulate empty revisions. Skip if nothing changed.
|
|
40
|
+
if (sameManifest(current, next))
|
|
41
|
+
return current;
|
|
42
|
+
const path = `${input.assetsRoot}/${manifestPath(next.name)}`;
|
|
43
|
+
const serialized = `${JSON.stringify(next, null, 2)}\n`;
|
|
44
|
+
// Record history BEFORE the write — same pattern as ingest/replace.
|
|
45
|
+
// First-time baseline scan must capture pre-op state.
|
|
46
|
+
if (input.history) {
|
|
47
|
+
if (!input.contentRoot) {
|
|
48
|
+
throw new Error('updateAssetMetadata: history requires contentRoot');
|
|
49
|
+
}
|
|
50
|
+
const items = [{ path, content: serialized }];
|
|
51
|
+
await recordWrite({
|
|
52
|
+
history: input.history,
|
|
53
|
+
contentRoot: input.contentRoot,
|
|
54
|
+
operation: 'save',
|
|
55
|
+
author: input.author,
|
|
56
|
+
items,
|
|
57
|
+
message: `Update metadata for ${input.assetName}`,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
await writeManifest(input.storage, input.assetsRoot, next);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
throw new AssetStorageError('write', path, err);
|
|
65
|
+
}
|
|
66
|
+
return next;
|
|
67
|
+
}
|
|
68
|
+
function sameManifest(a, b) {
|
|
69
|
+
// Cheap deep-equal for the fields a metadata patch can change. Avoids
|
|
70
|
+
// a full JSON.stringify compare for the hot no-op path.
|
|
71
|
+
if (a.alt !== b.alt)
|
|
72
|
+
return false;
|
|
73
|
+
return sameFocalPoint(a.focalPoint, b.focalPoint);
|
|
74
|
+
}
|
|
75
|
+
function sameFocalPoint(a, b) {
|
|
76
|
+
if (a === undefined && b === undefined)
|
|
77
|
+
return true;
|
|
78
|
+
if (a === undefined || b === undefined)
|
|
79
|
+
return false;
|
|
80
|
+
return a.x === b.x && a.y === b.y;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=update-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-metadata.js","sourceRoot":"","sources":["../../src/assets/update-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset URL construction — pure function from (siteUrl, asset manifest
|
|
3
|
+
* fields, extension) to the URL the template emits.
|
|
4
|
+
*
|
|
5
|
+
* Kept separate from `resolve.ts` because:
|
|
6
|
+
* - The resolver composes manifest I/O + URL construction + override merging.
|
|
7
|
+
* URL construction is the only piece that's purely computational.
|
|
8
|
+
* - Future transform adapters (Cloudflare Images, imgproxy) build URLs too —
|
|
9
|
+
* they share the `{name}-{hash}.{ext}` origin-URL shape and wrap it. Having
|
|
10
|
+
* that builder in one place means adapters compose rather than duplicate.
|
|
11
|
+
*
|
|
12
|
+
* Output is root-relative when `siteUrl` is absent, absolute when present.
|
|
13
|
+
* Root-relative works anywhere; absolute is needed for targets that live on
|
|
14
|
+
* a different origin from the admin (CDN-split deployments).
|
|
15
|
+
*/
|
|
16
|
+
/** Path prefix (relative to storage root) where internal asset bytes live. */
|
|
17
|
+
export declare const ASSETS_URL_PREFIX = "/assets";
|
|
18
|
+
import { type Selector } from '../schema/dimensions.js';
|
|
19
|
+
export interface BuildAssetUrlInput {
|
|
20
|
+
/** Asset name (the canonical identifier). */
|
|
21
|
+
name: string;
|
|
22
|
+
/**
|
|
23
|
+
* 8-char SHA-256 prefix of the bytes (matches the manifest `hash`).
|
|
24
|
+
* For locale-bytes overrides this is the OVERRIDE's hash, distinct
|
|
25
|
+
* from the default's hash.
|
|
26
|
+
*/
|
|
27
|
+
hash: string;
|
|
28
|
+
/** File extension without the dot (e.g., `"jpg"`). */
|
|
29
|
+
ext: string;
|
|
30
|
+
/**
|
|
31
|
+
* Optional site URL — absolute URL prefix for targets served from a separate
|
|
32
|
+
* origin (e.g., `"https://cdn.example.com"`). When absent, the returned URL
|
|
33
|
+
* is root-relative.
|
|
34
|
+
*/
|
|
35
|
+
siteUrl?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Optional selector — when set, builds the URL for a locale/theme override.
|
|
38
|
+
* Path becomes `/assets/{name}-{hash}.{locale}[.{theme}].{ext}`. Null/omitted
|
|
39
|
+
* = default-bytes URL.
|
|
40
|
+
*/
|
|
41
|
+
selector?: Selector | null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Construct the public URL for an internal asset. Path pattern is
|
|
45
|
+
* `{ASSETS_URL_PREFIX}/{name}-{hash}[.{locale}][.{theme}].{ext}`, optionally
|
|
46
|
+
* prefixed with `siteUrl`.
|
|
47
|
+
*
|
|
48
|
+
* Normalizes trailing slashes — `siteUrl: "https://cdn.example.com/"` and
|
|
49
|
+
* `siteUrl: "https://cdn.example.com"` both produce the same URL.
|
|
50
|
+
*/
|
|
51
|
+
export declare function buildAssetUrl(input: BuildAssetUrlInput): string;
|
|
52
|
+
/**
|
|
53
|
+
* Construct the public URL for a variant whose filename is already
|
|
54
|
+
* known (from the manifest's `variants[].path`). The filename is
|
|
55
|
+
* already hash-encoded and width-suffixed at ingest time, so this
|
|
56
|
+
* helper is just a prefix composer — keeps siteUrl normalization in
|
|
57
|
+
* one place.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildVariantUrl(variantPath: string, siteUrl?: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Build the responsive `srcset` string from a manifest's variant list.
|
|
62
|
+
* Each variant contributes one `<url> <width>w` descriptor; the browser
|
|
63
|
+
* picks the best match for the viewport. Joined with `", "` per the
|
|
64
|
+
* HTML `srcset` spec.
|
|
65
|
+
*
|
|
66
|
+
* Lives here (not in `resolve.ts`) because URL composition — including
|
|
67
|
+
* this multi-variant flavor — is the `url.ts` module's single
|
|
68
|
+
* responsibility. Future transform adapters (Cloudflare Images,
|
|
69
|
+
* imgproxy) that build their own srcset ladders will compose this or
|
|
70
|
+
* substitute their own from the same module.
|
|
71
|
+
*/
|
|
72
|
+
export declare function buildSrcset(variants: readonly {
|
|
73
|
+
width: number;
|
|
74
|
+
path: string;
|
|
75
|
+
}[], siteUrl?: string): string;
|
|
76
|
+
/**
|
|
77
|
+
* Derive a file extension from a MIME type for the v1 allowlist.
|
|
78
|
+
* Returns `null` for unknown MIMEs — callers should already have validated
|
|
79
|
+
* MIME before reaching URL construction, so this is a defensive fallback.
|
|
80
|
+
*/
|
|
81
|
+
export declare function extFromMime(mime: string): string | null;
|
|
82
|
+
//# sourceMappingURL=url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/assets/url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,YAAY,CAAA;AAE1C,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,yBAAyB,CAAA;AAEvE,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAQ/D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1G;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgCvD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset URL construction — pure function from (siteUrl, asset manifest
|
|
3
|
+
* fields, extension) to the URL the template emits.
|
|
4
|
+
*
|
|
5
|
+
* Kept separate from `resolve.ts` because:
|
|
6
|
+
* - The resolver composes manifest I/O + URL construction + override merging.
|
|
7
|
+
* URL construction is the only piece that's purely computational.
|
|
8
|
+
* - Future transform adapters (Cloudflare Images, imgproxy) build URLs too —
|
|
9
|
+
* they share the `{name}-{hash}.{ext}` origin-URL shape and wrap it. Having
|
|
10
|
+
* that builder in one place means adapters compose rather than duplicate.
|
|
11
|
+
*
|
|
12
|
+
* Output is root-relative when `siteUrl` is absent, absolute when present.
|
|
13
|
+
* Root-relative works anywhere; absolute is needed for targets that live on
|
|
14
|
+
* a different origin from the admin (CDN-split deployments).
|
|
15
|
+
*/
|
|
16
|
+
/** Path prefix (relative to storage root) where internal asset bytes live. */
|
|
17
|
+
export const ASSETS_URL_PREFIX = '/assets';
|
|
18
|
+
import { selectorSuffix } from '../schema/dimensions.js';
|
|
19
|
+
/**
|
|
20
|
+
* Construct the public URL for an internal asset. Path pattern is
|
|
21
|
+
* `{ASSETS_URL_PREFIX}/{name}-{hash}[.{locale}][.{theme}].{ext}`, optionally
|
|
22
|
+
* prefixed with `siteUrl`.
|
|
23
|
+
*
|
|
24
|
+
* Normalizes trailing slashes — `siteUrl: "https://cdn.example.com/"` and
|
|
25
|
+
* `siteUrl: "https://cdn.example.com"` both produce the same URL.
|
|
26
|
+
*/
|
|
27
|
+
export function buildAssetUrl(input) {
|
|
28
|
+
const suffix = selectorSuffix(input.selector ?? null);
|
|
29
|
+
const path = `${ASSETS_URL_PREFIX}/${input.name}-${input.hash}${suffix}.${input.ext}`;
|
|
30
|
+
if (!input.siteUrl)
|
|
31
|
+
return path;
|
|
32
|
+
// Strip trailing slash from siteUrl before appending the root-relative path.
|
|
33
|
+
const base = input.siteUrl.endsWith('/') ? input.siteUrl.slice(0, -1) : input.siteUrl;
|
|
34
|
+
return `${base}${path}`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Construct the public URL for a variant whose filename is already
|
|
38
|
+
* known (from the manifest's `variants[].path`). The filename is
|
|
39
|
+
* already hash-encoded and width-suffixed at ingest time, so this
|
|
40
|
+
* helper is just a prefix composer — keeps siteUrl normalization in
|
|
41
|
+
* one place.
|
|
42
|
+
*/
|
|
43
|
+
export function buildVariantUrl(variantPath, siteUrl) {
|
|
44
|
+
const path = `${ASSETS_URL_PREFIX}/${variantPath}`;
|
|
45
|
+
if (!siteUrl)
|
|
46
|
+
return path;
|
|
47
|
+
const base = siteUrl.endsWith('/') ? siteUrl.slice(0, -1) : siteUrl;
|
|
48
|
+
return `${base}${path}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build the responsive `srcset` string from a manifest's variant list.
|
|
52
|
+
* Each variant contributes one `<url> <width>w` descriptor; the browser
|
|
53
|
+
* picks the best match for the viewport. Joined with `", "` per the
|
|
54
|
+
* HTML `srcset` spec.
|
|
55
|
+
*
|
|
56
|
+
* Lives here (not in `resolve.ts`) because URL composition — including
|
|
57
|
+
* this multi-variant flavor — is the `url.ts` module's single
|
|
58
|
+
* responsibility. Future transform adapters (Cloudflare Images,
|
|
59
|
+
* imgproxy) that build their own srcset ladders will compose this or
|
|
60
|
+
* substitute their own from the same module.
|
|
61
|
+
*/
|
|
62
|
+
export function buildSrcset(variants, siteUrl) {
|
|
63
|
+
return variants.map(v => `${buildVariantUrl(v.path, siteUrl)} ${v.width}w`).join(', ');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Derive a file extension from a MIME type for the v1 allowlist.
|
|
67
|
+
* Returns `null` for unknown MIMEs — callers should already have validated
|
|
68
|
+
* MIME before reaching URL construction, so this is a defensive fallback.
|
|
69
|
+
*/
|
|
70
|
+
export function extFromMime(mime) {
|
|
71
|
+
switch (mime) {
|
|
72
|
+
// Images
|
|
73
|
+
case 'image/jpeg':
|
|
74
|
+
return 'jpg';
|
|
75
|
+
case 'image/png':
|
|
76
|
+
return 'png';
|
|
77
|
+
case 'image/svg+xml':
|
|
78
|
+
return 'svg';
|
|
79
|
+
case 'image/gif':
|
|
80
|
+
return 'gif';
|
|
81
|
+
// Audio
|
|
82
|
+
case 'audio/mpeg':
|
|
83
|
+
return 'mp3';
|
|
84
|
+
case 'audio/wav':
|
|
85
|
+
case 'audio/x-wav':
|
|
86
|
+
return 'wav';
|
|
87
|
+
case 'audio/flac':
|
|
88
|
+
case 'audio/x-flac':
|
|
89
|
+
return 'flac';
|
|
90
|
+
case 'audio/ogg':
|
|
91
|
+
return 'ogg';
|
|
92
|
+
case 'audio/opus':
|
|
93
|
+
return 'opus';
|
|
94
|
+
case 'audio/aac':
|
|
95
|
+
return 'aac';
|
|
96
|
+
case 'audio/mp4':
|
|
97
|
+
case 'audio/x-m4a':
|
|
98
|
+
return 'm4a';
|
|
99
|
+
default:
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/assets/url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAA;AAE1C,OAAO,EAAiB,cAAc,EAAE,MAAM,yBAAyB,CAAA;AA2BvE;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAA;IACrD,MAAM,IAAI,GAAG,GAAG,iBAAiB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAA;IACrF,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAE/B,6EAA6E;IAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;IACrF,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AACzB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,OAAgB;IACnE,MAAM,IAAI,GAAG,GAAG,iBAAiB,IAAI,WAAW,EAAE,CAAA;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACnE,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AACzB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,QAAoD,EAAE,OAAgB;IAChG,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACxF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,QAAQ,IAAI,EAAE,CAAC;QACb,SAAS;QACT,KAAK,YAAY;YACf,OAAO,KAAK,CAAA;QACd,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,KAAK,eAAe;YAClB,OAAO,KAAK,CAAA;QACd,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,QAAQ;QACR,KAAK,YAAY;YACf,OAAO,KAAK,CAAA;QACd,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,KAAK,CAAA;QACd,KAAK,YAAY,CAAC;QAClB,KAAK,cAAc;YACjB,OAAO,MAAM,CAAA;QACf,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,KAAK,YAAY;YACf,OAAO,MAAM,CAAA;QACf,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,KAAK,CAAA;QACd;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default per-asset upload size cap — 50 MB. Sites override per target
|
|
3
|
+
* via `targets.{name}.assets.maxBytes` in `site.yaml`. Targets that
|
|
4
|
+
* don't override get this value.
|
|
5
|
+
*
|
|
6
|
+
* Why a default at all (per Q5):
|
|
7
|
+
* - DoS / OOM bound: ingest buffers the full upload in memory today
|
|
8
|
+
* (`collectBytes` in ingest.ts). Concurrent uploads × cap = peak
|
|
9
|
+
* memory; without a cap, one careless or malicious client can
|
|
10
|
+
* exhaust the admin process.
|
|
11
|
+
* - Storage-cost protection: a 200 MB raw photo × variant ladder ×
|
|
12
|
+
* locale overrides quickly compounds. The cap forces explicit
|
|
13
|
+
* opt-in for unusual sizes.
|
|
14
|
+
* - Worker-tier ceiling: Cloudflare Workers Free/Pro have a 100 MB
|
|
15
|
+
* response body limit — a target on that tier can't serve assets
|
|
16
|
+
* above it via the worker. Sites should lower the cap below the
|
|
17
|
+
* worker tier they're on.
|
|
18
|
+
*
|
|
19
|
+
* 50 MB is conservative for image-only v1. Sites with raw-photo
|
|
20
|
+
* workflows (24-48 MP camera output) have headroom; sites on free
|
|
21
|
+
* worker tiers should reduce explicitly.
|
|
22
|
+
*/
|
|
23
|
+
export declare const DEFAULT_ASSET_MAX_BYTES: number;
|
|
24
|
+
/**
|
|
25
|
+
* @deprecated Renamed to `DEFAULT_ASSET_MAX_BYTES`. Use the per-target
|
|
26
|
+
* config (`targets.{name}.assets.maxBytes`) for site-specific limits;
|
|
27
|
+
* this constant is the fallback default. Kept exported until the next
|
|
28
|
+
* major version so external callers (tests, integrations) don't break.
|
|
29
|
+
*/
|
|
30
|
+
export declare const ASSET_MAX_BYTES: number;
|
|
31
|
+
/**
|
|
32
|
+
* v1 MIME allowlist. Image side: JPEG, PNG, SVG, GIF. Audio side:
|
|
33
|
+
* MP3, WAV, FLAC, Opus, AAC, M4A, OGG.
|
|
34
|
+
*
|
|
35
|
+
* - SVG is sanitized before persistence (`svg-sanitize.ts`)
|
|
36
|
+
* - GIF is checked for animation by `animatedImageAnalyzer`
|
|
37
|
+
* - Audio MIMEs are analyzed by `audioAnalyzer` for duration
|
|
38
|
+
* (`music-metadata`); personal-metadata stripping is a v1.5
|
|
39
|
+
* opt-in via a future preprocessor surface
|
|
40
|
+
*
|
|
41
|
+
* Animated WebP/AVIF, video, and documents widen via this set in
|
|
42
|
+
* v1.1+. The analyzer/preprocessor abstractions accommodate each
|
|
43
|
+
* format-specific need without orchestrator edits.
|
|
44
|
+
*/
|
|
45
|
+
export declare const ALLOWED_MIMES: Set<string>;
|
|
46
|
+
export interface UploadCandidate {
|
|
47
|
+
/** Desired asset name (what the author chose, pre-slug). */
|
|
48
|
+
name: string;
|
|
49
|
+
/** Bytes received so far; the stream is still flowing. */
|
|
50
|
+
claimedSize: number;
|
|
51
|
+
/** MIME sniffed from the bytes. Null when sniffing failed. */
|
|
52
|
+
sniffedMime: string | null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Per-target validation policy. Today carries the size cap; future
|
|
56
|
+
* fields (allowed MIMEs subset, name pattern overrides) extend this
|
|
57
|
+
* interface without changing the validator's signature.
|
|
58
|
+
*/
|
|
59
|
+
export interface UploadPolicy {
|
|
60
|
+
/** Override the default per-target. When undefined, uses DEFAULT_ASSET_MAX_BYTES. */
|
|
61
|
+
maxBytes?: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate an upload candidate against the per-target policy. Throws
|
|
65
|
+
* the specific `AssetValidationError` subclass for the first failure
|
|
66
|
+
* encountered — policy enforces fail-fast so the HTTP route returns a
|
|
67
|
+
* single, specific reason to the client.
|
|
68
|
+
*
|
|
69
|
+
* `policy` is optional — callers that haven't migrated to per-target
|
|
70
|
+
* config get the default size cap. Once asset routes thread the
|
|
71
|
+
* target config through, `policy` is always present.
|
|
72
|
+
*/
|
|
73
|
+
export declare function validateUpload(candidate: UploadCandidate, policy?: UploadPolicy): void;
|
|
74
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/assets/validate.ts"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,uBAAuB,QAAmB,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAA0B,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,aAiBxB,CAAA;AAWF,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAA;IACnB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,GAAE,YAAiB,GAAG,IAAI,CAI1F"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset-upload validation policy. Pure — takes a candidate (name, claimed
|
|
3
|
+
* size, claimed MIME, sniffed MIME) and throws a typed validation error on
|
|
4
|
+
* the first failure. No I/O, no storage, no network.
|
|
5
|
+
*
|
|
6
|
+
* Keeping this pure means:
|
|
7
|
+
* - Tests are trivial: pass candidate data in, assert the thrown class
|
|
8
|
+
* - The same policy applies whether the caller is the HTTP route, a CLI
|
|
9
|
+
* import command, or the future paste-URL handler
|
|
10
|
+
* - Policy evolves in one place
|
|
11
|
+
*
|
|
12
|
+
* Each validation failure throws a distinct `AssetValidationError`
|
|
13
|
+
* subclass (`AssetNameInvalidError`, `AssetPathTraversalError`, etc.).
|
|
14
|
+
* Callers that want to group all input-validation failures uniformly can
|
|
15
|
+
* still pattern-match on the base `AssetValidationError`.
|
|
16
|
+
*/
|
|
17
|
+
import { AssetMimeMismatchError, AssetNameInvalidError, AssetNameReservedError, AssetPathTraversalError, AssetSizeExceededError, } from './errors.js';
|
|
18
|
+
/**
|
|
19
|
+
* Default per-asset upload size cap — 50 MB. Sites override per target
|
|
20
|
+
* via `targets.{name}.assets.maxBytes` in `site.yaml`. Targets that
|
|
21
|
+
* don't override get this value.
|
|
22
|
+
*
|
|
23
|
+
* Why a default at all (per Q5):
|
|
24
|
+
* - DoS / OOM bound: ingest buffers the full upload in memory today
|
|
25
|
+
* (`collectBytes` in ingest.ts). Concurrent uploads × cap = peak
|
|
26
|
+
* memory; without a cap, one careless or malicious client can
|
|
27
|
+
* exhaust the admin process.
|
|
28
|
+
* - Storage-cost protection: a 200 MB raw photo × variant ladder ×
|
|
29
|
+
* locale overrides quickly compounds. The cap forces explicit
|
|
30
|
+
* opt-in for unusual sizes.
|
|
31
|
+
* - Worker-tier ceiling: Cloudflare Workers Free/Pro have a 100 MB
|
|
32
|
+
* response body limit — a target on that tier can't serve assets
|
|
33
|
+
* above it via the worker. Sites should lower the cap below the
|
|
34
|
+
* worker tier they're on.
|
|
35
|
+
*
|
|
36
|
+
* 50 MB is conservative for image-only v1. Sites with raw-photo
|
|
37
|
+
* workflows (24-48 MP camera output) have headroom; sites on free
|
|
38
|
+
* worker tiers should reduce explicitly.
|
|
39
|
+
*/
|
|
40
|
+
export const DEFAULT_ASSET_MAX_BYTES = 50 * 1024 * 1024;
|
|
41
|
+
/**
|
|
42
|
+
* @deprecated Renamed to `DEFAULT_ASSET_MAX_BYTES`. Use the per-target
|
|
43
|
+
* config (`targets.{name}.assets.maxBytes`) for site-specific limits;
|
|
44
|
+
* this constant is the fallback default. Kept exported until the next
|
|
45
|
+
* major version so external callers (tests, integrations) don't break.
|
|
46
|
+
*/
|
|
47
|
+
export const ASSET_MAX_BYTES = DEFAULT_ASSET_MAX_BYTES;
|
|
48
|
+
/**
|
|
49
|
+
* v1 MIME allowlist. Image side: JPEG, PNG, SVG, GIF. Audio side:
|
|
50
|
+
* MP3, WAV, FLAC, Opus, AAC, M4A, OGG.
|
|
51
|
+
*
|
|
52
|
+
* - SVG is sanitized before persistence (`svg-sanitize.ts`)
|
|
53
|
+
* - GIF is checked for animation by `animatedImageAnalyzer`
|
|
54
|
+
* - Audio MIMEs are analyzed by `audioAnalyzer` for duration
|
|
55
|
+
* (`music-metadata`); personal-metadata stripping is a v1.5
|
|
56
|
+
* opt-in via a future preprocessor surface
|
|
57
|
+
*
|
|
58
|
+
* Animated WebP/AVIF, video, and documents widen via this set in
|
|
59
|
+
* v1.1+. The analyzer/preprocessor abstractions accommodate each
|
|
60
|
+
* format-specific need without orchestrator edits.
|
|
61
|
+
*/
|
|
62
|
+
export const ALLOWED_MIMES = new Set([
|
|
63
|
+
// Images
|
|
64
|
+
'image/jpeg',
|
|
65
|
+
'image/png',
|
|
66
|
+
'image/svg+xml',
|
|
67
|
+
'image/gif',
|
|
68
|
+
// Audio
|
|
69
|
+
'audio/mpeg',
|
|
70
|
+
'audio/wav',
|
|
71
|
+
'audio/x-wav',
|
|
72
|
+
'audio/flac',
|
|
73
|
+
'audio/x-flac',
|
|
74
|
+
'audio/ogg',
|
|
75
|
+
'audio/opus',
|
|
76
|
+
'audio/aac',
|
|
77
|
+
'audio/mp4',
|
|
78
|
+
'audio/x-m4a',
|
|
79
|
+
]);
|
|
80
|
+
/** Asset-name validation: lowercase ASCII-safe characters. */
|
|
81
|
+
const VALID_NAME = /^[a-z0-9][a-z0-9\-_]*(?:\.[a-z0-9]+)?$/;
|
|
82
|
+
/** Max chars per asset name. */
|
|
83
|
+
const MAX_NAME_LENGTH = 200;
|
|
84
|
+
/** Reserved name patterns — authors can't upload anything that would collide with internals. */
|
|
85
|
+
const RESERVED_PREFIXES = ['.', '_refs/', '.gazetta/'];
|
|
86
|
+
const RESERVED_SUFFIXES = ['.asset.json'];
|
|
87
|
+
/**
|
|
88
|
+
* Validate an upload candidate against the per-target policy. Throws
|
|
89
|
+
* the specific `AssetValidationError` subclass for the first failure
|
|
90
|
+
* encountered — policy enforces fail-fast so the HTTP route returns a
|
|
91
|
+
* single, specific reason to the client.
|
|
92
|
+
*
|
|
93
|
+
* `policy` is optional — callers that haven't migrated to per-target
|
|
94
|
+
* config get the default size cap. Once asset routes thread the
|
|
95
|
+
* target config through, `policy` is always present.
|
|
96
|
+
*/
|
|
97
|
+
export function validateUpload(candidate, policy = {}) {
|
|
98
|
+
assertName(candidate.name);
|
|
99
|
+
assertSize(candidate.claimedSize, policy.maxBytes ?? DEFAULT_ASSET_MAX_BYTES);
|
|
100
|
+
assertMime(candidate.sniffedMime);
|
|
101
|
+
}
|
|
102
|
+
function assertName(name) {
|
|
103
|
+
if (name.length === 0 || name.length > MAX_NAME_LENGTH) {
|
|
104
|
+
throw new AssetNameInvalidError(name, `Asset name must be 1–${MAX_NAME_LENGTH} characters (got ${name.length})`);
|
|
105
|
+
}
|
|
106
|
+
// Path-traversal: `..`, leading `/`, or backslash anywhere
|
|
107
|
+
if (name.includes('..') || name.startsWith('/') || name.includes('\\')) {
|
|
108
|
+
throw new AssetPathTraversalError(name);
|
|
109
|
+
}
|
|
110
|
+
// Reserved prefixes and suffixes
|
|
111
|
+
for (const prefix of RESERVED_PREFIXES) {
|
|
112
|
+
if (name.startsWith(prefix)) {
|
|
113
|
+
throw new AssetNameReservedError(name, prefix, 'prefix');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const suffix of RESERVED_SUFFIXES) {
|
|
117
|
+
if (name.endsWith(suffix)) {
|
|
118
|
+
throw new AssetNameReservedError(name, suffix, 'suffix');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Character rules (lowercase ASCII, digits, hyphens, underscores, optional extension)
|
|
122
|
+
if (!VALID_NAME.test(name)) {
|
|
123
|
+
throw new AssetNameInvalidError(name, `Asset name must be lowercase ASCII letters/digits/hyphens/underscores with optional extension: ${name}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function assertSize(claimedSize, maxBytes) {
|
|
127
|
+
if (claimedSize <= 0 || claimedSize > maxBytes) {
|
|
128
|
+
throw new AssetSizeExceededError(claimedSize, maxBytes);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function assertMime(sniffedMime) {
|
|
132
|
+
if (!sniffedMime || !ALLOWED_MIMES.has(sniffedMime)) {
|
|
133
|
+
throw new AssetMimeMismatchError(sniffedMime, [...ALLOWED_MIMES]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/assets/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** The v1 srcset ladder. Ordered ascending — callers rely on this. */
|
|
2
|
+
export declare const VARIANT_WIDTHS: readonly number[];
|
|
3
|
+
export interface GeneratedVariant {
|
|
4
|
+
/** Target width this variant was rendered at. */
|
|
5
|
+
width: number;
|
|
6
|
+
/** The resized image bytes. */
|
|
7
|
+
bytes: Uint8Array;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Generate responsive variants from a source image buffer. Produces one
|
|
11
|
+
* variant per `VARIANT_WIDTHS` entry that is ≤ the source image's width.
|
|
12
|
+
*
|
|
13
|
+
* Same output format as the input (JPEG stays JPEG, PNG stays PNG) —
|
|
14
|
+
* re-compression is implicit via sharp's encoder, which applies its
|
|
15
|
+
* quality defaults. Explicit quality/compression tuning is deferred to
|
|
16
|
+
* a future image-pipeline config module.
|
|
17
|
+
*
|
|
18
|
+
* Throws whatever sharp throws on unreadable input — the caller is
|
|
19
|
+
* responsible for treating that as a hard ingest failure (per v1
|
|
20
|
+
* contract: rollback + fail the upload).
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateVariants(source: Uint8Array): Promise<GeneratedVariant[]>;
|
|
23
|
+
//# sourceMappingURL=variants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../src/assets/variants.ts"],"names":[],"mappings":"AAkBA,sEAAsE;AACtE,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA2B,CAAA;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,KAAK,EAAE,UAAU,CAAA;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsBtF"}
|