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,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest field-merge primitives. Pure functions; no I/O.
|
|
3
|
+
*
|
|
4
|
+
* Two operations:
|
|
5
|
+
* - `applyLocaleOverrides` — shallow spread of one override on top of a
|
|
6
|
+
* base manifest. The override's non-undefined fields win; everything
|
|
7
|
+
* else falls through to the base.
|
|
8
|
+
* - `foldLocaleChain` — multi-overlay fold: read each chain entry and
|
|
9
|
+
* spread it on the previous, most-specific-LAST so most-specific
|
|
10
|
+
* wins per field.
|
|
11
|
+
*
|
|
12
|
+
* # Why a separate module
|
|
13
|
+
*
|
|
14
|
+
* The merge is the one piece of logic shared between embedded and
|
|
15
|
+
* downloadable kind resolvers (per Q3 lock). Font resolver does NOT
|
|
16
|
+
* use override-merge — it composes a variant union, structurally
|
|
17
|
+
* different. So the merge primitive lives separately and the kinds
|
|
18
|
+
* that share semantics compose it; the one that doesn't, doesn't.
|
|
19
|
+
*
|
|
20
|
+
* # Shallow vs deep
|
|
21
|
+
*
|
|
22
|
+
* The merge is SHALLOW. `focalPoint`, `variants`, `width`, `height` are
|
|
23
|
+
* atomic values from the override's perspective — partial focal-point
|
|
24
|
+
* overrides aren't a concept. If a locale variant carries `focalPoint`,
|
|
25
|
+
* its full {x, y} pair replaces the default's; you don't mix x from one
|
|
26
|
+
* with y from another.
|
|
27
|
+
*
|
|
28
|
+
* # Why use spread of `Partial<M>` instead of typed `LocaleOverrideManifest`
|
|
29
|
+
*
|
|
30
|
+
* Generic over manifest type so the same primitive can serve embedded
|
|
31
|
+
* and downloadable (and any future kind that wants override-wins
|
|
32
|
+
* semantics) without re-implementing per kind.
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* Spread `override`'s non-undefined fields onto `base`. Returns a new
|
|
36
|
+
* object — `base` is not mutated.
|
|
37
|
+
*
|
|
38
|
+
* Fields that are `undefined` in `override` do NOT shadow `base`'s value.
|
|
39
|
+
* That's the whole point: a locale manifest with only `alt` set should
|
|
40
|
+
* keep the default's everything-else.
|
|
41
|
+
*
|
|
42
|
+
* `null` is treated as a value, not "absent". `alt: null` on the override
|
|
43
|
+
* explicitly clears the default's alt — useful for "this locale's image
|
|
44
|
+
* is decorative even though the default has alt text."
|
|
45
|
+
*/
|
|
46
|
+
export function applyLocaleOverrides(base, override) {
|
|
47
|
+
if (override === null)
|
|
48
|
+
return base;
|
|
49
|
+
const out = { ...base };
|
|
50
|
+
for (const [key, value] of Object.entries(override)) {
|
|
51
|
+
if (value === undefined)
|
|
52
|
+
continue;
|
|
53
|
+
out[key] = value;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Fold a chain of overrides onto a base. Chain order is
|
|
59
|
+
* most-specific-LAST so the final fold step replaces fields from
|
|
60
|
+
* less-specific entries.
|
|
61
|
+
*
|
|
62
|
+
* Example for active `pt-BR` with fallback `pt`:
|
|
63
|
+
*
|
|
64
|
+
* chain = [pt-manifest, pt-BR-manifest] // least-specific FIRST
|
|
65
|
+
* foldLocaleChain(default, chain)
|
|
66
|
+
*
|
|
67
|
+
* Step 1: apply pt overrides onto default → pt-effective
|
|
68
|
+
* Step 2: apply pt-BR overrides onto pt-effective → pt-BR-effective
|
|
69
|
+
*
|
|
70
|
+
* Most-specific (pt-BR) wins per field. Entries that are `null` (locale
|
|
71
|
+
* manifest didn't exist) are skipped — same effect as no overrides.
|
|
72
|
+
*
|
|
73
|
+
* Caller responsibility: order the chain correctly. Most-specific LAST.
|
|
74
|
+
*/
|
|
75
|
+
export function foldLocaleChain(base, chain) {
|
|
76
|
+
let current = base;
|
|
77
|
+
for (const overrides of chain) {
|
|
78
|
+
current = applyLocaleOverrides(current, overrides);
|
|
79
|
+
}
|
|
80
|
+
return current;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=manifest-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-merge.js","sourceRoot":"","sources":["../../src/assets/manifest-merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAmB,IAAO,EAAE,QAA2B;IACzF,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,CAAA;IACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS;YAAE,SACxB;QAAC,GAA+B,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IAChD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAAmB,IAAO,EAAE,KAAqC;IAC9F,IAAI,OAAO,GAAG,IAAI,CAAA;IAClB,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,OAAO,GAAG,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset manifest I/O — reading and writing `{name}.asset.json` via a
|
|
3
|
+
* `StorageProvider`. Pure delegation to the storage layer plus JSON
|
|
4
|
+
* (de)serialization; no validation of the manifest itself (that's the
|
|
5
|
+
* writer's job at creation time) and no dependency on the upload pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Separation from the type:
|
|
8
|
+
* - `schema/types.ts` owns the `AssetManifest` type (data shape)
|
|
9
|
+
* - this file owns the I/O primitives (behavior)
|
|
10
|
+
*
|
|
11
|
+
* Separation from `ingest.ts`:
|
|
12
|
+
* - ingest composes hash + manifest + storage during upload
|
|
13
|
+
* - this module is used by ingest, the resolver, the library-list endpoint,
|
|
14
|
+
* and future delete/rename operations. It sits below all of them.
|
|
15
|
+
*/
|
|
16
|
+
import type { StorageProvider } from '../types.js';
|
|
17
|
+
import type { AssetManifest } from '../schema/types.js';
|
|
18
|
+
import { type Selector } from '../schema/dimensions.js';
|
|
19
|
+
import { readDefaultManifest } from './manifest-default.js';
|
|
20
|
+
/**
|
|
21
|
+
* Where asset manifests live, relative to an `assets/` root.
|
|
22
|
+
*
|
|
23
|
+
* Default manifest: `{name}.asset.json`
|
|
24
|
+
* Locale variant: `{name}.asset.{locale}.json`
|
|
25
|
+
* Theme variant: `{name}.asset.{theme}.json`
|
|
26
|
+
* Locale + theme: `{name}.asset.{locale}.{theme}.json`
|
|
27
|
+
*
|
|
28
|
+
* Selector ordering follows `DIMENSION_ORDER` from `schema/dimensions.ts`.
|
|
29
|
+
* Pass `null` (or omit) for the default manifest.
|
|
30
|
+
*/
|
|
31
|
+
export declare function manifestPath(assetName: string, selector?: Selector | null): string;
|
|
32
|
+
/**
|
|
33
|
+
* Where internal asset bytes live, given a name + 8-char hash + extension.
|
|
34
|
+
*
|
|
35
|
+
* Default bytes: `{name}-{hash}.{ext}`
|
|
36
|
+
* Locale bytes: `{name}-{hash}.{locale}.{ext}`
|
|
37
|
+
* Locale + theme bytes: `{name}-{hash}.{locale}.{theme}.{ext}`
|
|
38
|
+
*
|
|
39
|
+
* The hash always describes the bytes at THIS path — locale-bytes overrides
|
|
40
|
+
* have their own hash, distinct from the default's hash.
|
|
41
|
+
*/
|
|
42
|
+
export declare function assetBytesPath(assetName: string, hash: string, ext: string, selector?: Selector | null): string;
|
|
43
|
+
/**
|
|
44
|
+
* Where a variant's bytes live, given name + hash + ext + target width
|
|
45
|
+
* (and optional selector for locale/theme variants).
|
|
46
|
+
*
|
|
47
|
+
* Default variant: `{name}-{hash}-{width}w.{ext}`
|
|
48
|
+
* Locale variant: `{name}-{hash}.{locale}-{width}w.{ext}`
|
|
49
|
+
* Locale + theme variant: `{name}-{hash}.{locale}.{theme}-{width}w.{ext}`
|
|
50
|
+
*
|
|
51
|
+
* Width suffix comes AFTER the selector suffix — the selector segments are
|
|
52
|
+
* part of the file's identity (which override is this), the width is part
|
|
53
|
+
* of the variant ladder for THAT identity. Owned here so the write side
|
|
54
|
+
* (ingest) and read side (asset-paths, URL construction) can't drift —
|
|
55
|
+
* change the scheme in one place.
|
|
56
|
+
*/
|
|
57
|
+
export declare function assetVariantBytesPath(assetName: string, hash: string, ext: string, width: number, selector?: Selector | null): string;
|
|
58
|
+
/**
|
|
59
|
+
* Read an asset's default manifest. Thin alias for `readDefaultManifest`
|
|
60
|
+
* — kept for callers that haven't migrated yet. New code should prefer
|
|
61
|
+
* `readDefaultManifest` from `manifest-default.ts` directly so the
|
|
62
|
+
* default-vs-locale distinction is explicit at the call site.
|
|
63
|
+
*/
|
|
64
|
+
export declare const readManifest: typeof readDefaultManifest;
|
|
65
|
+
/**
|
|
66
|
+
* Write an asset manifest to storage. The storage provider's `writeFile` is
|
|
67
|
+
* already atomic (see providers/_atomic-write.ts) — this function adds no
|
|
68
|
+
* atomicity of its own, just serialization.
|
|
69
|
+
*/
|
|
70
|
+
export declare function writeManifest(storage: StorageProvider, assetsRoot: string, manifest: AssetManifest): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Write a locale-override manifest at `{name}.asset.{...selector}.json`.
|
|
73
|
+
* Same atomicity contract as `writeManifest` (storage provider handles
|
|
74
|
+
* write-then-rename atomicity); this function only serializes + dispatches.
|
|
75
|
+
*
|
|
76
|
+
* The locale manifest type isn't bound here — callers pass any
|
|
77
|
+
* JSON-serializable shape that conforms to `LocaleOverrideManifest` or
|
|
78
|
+
* `FontLocaleAdditiveManifest`. The validators in `manifest-locale.ts`
|
|
79
|
+
* are responsible for read-side shape enforcement; the writer trusts
|
|
80
|
+
* its caller.
|
|
81
|
+
*/
|
|
82
|
+
export declare function writeLocaleManifest(storage: StorageProvider, assetsRoot: string, assetName: string, selector: Selector, manifest: object): Promise<void>;
|
|
83
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/assets/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,yBAAyB,CAAA;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAElF;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAG/G;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GACzB,MAAM,CAGR;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,4BAAsB,CAAA;AAE/C;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { selectorSuffix } from '../schema/dimensions.js';
|
|
2
|
+
import { AssetStorageError } from './errors.js';
|
|
3
|
+
import { readDefaultManifest } from './manifest-default.js';
|
|
4
|
+
/**
|
|
5
|
+
* Where asset manifests live, relative to an `assets/` root.
|
|
6
|
+
*
|
|
7
|
+
* Default manifest: `{name}.asset.json`
|
|
8
|
+
* Locale variant: `{name}.asset.{locale}.json`
|
|
9
|
+
* Theme variant: `{name}.asset.{theme}.json`
|
|
10
|
+
* Locale + theme: `{name}.asset.{locale}.{theme}.json`
|
|
11
|
+
*
|
|
12
|
+
* Selector ordering follows `DIMENSION_ORDER` from `schema/dimensions.ts`.
|
|
13
|
+
* Pass `null` (or omit) for the default manifest.
|
|
14
|
+
*/
|
|
15
|
+
export function manifestPath(assetName, selector) {
|
|
16
|
+
return `${assetName}.asset${selectorSuffix(selector ?? null)}.json`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Where internal asset bytes live, given a name + 8-char hash + extension.
|
|
20
|
+
*
|
|
21
|
+
* Default bytes: `{name}-{hash}.{ext}`
|
|
22
|
+
* Locale bytes: `{name}-{hash}.{locale}.{ext}`
|
|
23
|
+
* Locale + theme bytes: `{name}-{hash}.{locale}.{theme}.{ext}`
|
|
24
|
+
*
|
|
25
|
+
* The hash always describes the bytes at THIS path — locale-bytes overrides
|
|
26
|
+
* have their own hash, distinct from the default's hash.
|
|
27
|
+
*/
|
|
28
|
+
export function assetBytesPath(assetName, hash, ext, selector) {
|
|
29
|
+
const extPart = ext.startsWith('.') ? ext : `.${ext}`;
|
|
30
|
+
return `${assetName}-${hash}${selectorSuffix(selector ?? null)}${extPart}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Where a variant's bytes live, given name + hash + ext + target width
|
|
34
|
+
* (and optional selector for locale/theme variants).
|
|
35
|
+
*
|
|
36
|
+
* Default variant: `{name}-{hash}-{width}w.{ext}`
|
|
37
|
+
* Locale variant: `{name}-{hash}.{locale}-{width}w.{ext}`
|
|
38
|
+
* Locale + theme variant: `{name}-{hash}.{locale}.{theme}-{width}w.{ext}`
|
|
39
|
+
*
|
|
40
|
+
* Width suffix comes AFTER the selector suffix — the selector segments are
|
|
41
|
+
* part of the file's identity (which override is this), the width is part
|
|
42
|
+
* of the variant ladder for THAT identity. Owned here so the write side
|
|
43
|
+
* (ingest) and read side (asset-paths, URL construction) can't drift —
|
|
44
|
+
* change the scheme in one place.
|
|
45
|
+
*/
|
|
46
|
+
export function assetVariantBytesPath(assetName, hash, ext, width, selector) {
|
|
47
|
+
const extPart = ext.startsWith('.') ? ext : `.${ext}`;
|
|
48
|
+
return `${assetName}-${hash}${selectorSuffix(selector ?? null)}-${width}w${extPart}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Read an asset's default manifest. Thin alias for `readDefaultManifest`
|
|
52
|
+
* — kept for callers that haven't migrated yet. New code should prefer
|
|
53
|
+
* `readDefaultManifest` from `manifest-default.ts` directly so the
|
|
54
|
+
* default-vs-locale distinction is explicit at the call site.
|
|
55
|
+
*/
|
|
56
|
+
export const readManifest = readDefaultManifest;
|
|
57
|
+
/**
|
|
58
|
+
* Write an asset manifest to storage. The storage provider's `writeFile` is
|
|
59
|
+
* already atomic (see providers/_atomic-write.ts) — this function adds no
|
|
60
|
+
* atomicity of its own, just serialization.
|
|
61
|
+
*/
|
|
62
|
+
export async function writeManifest(storage, assetsRoot, manifest) {
|
|
63
|
+
const path = `${assetsRoot}/${manifestPath(manifest.name)}`;
|
|
64
|
+
const serialized = `${JSON.stringify(manifest, null, 2)}\n`;
|
|
65
|
+
try {
|
|
66
|
+
await storage.writeFile(path, serialized);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
throw new AssetStorageError('write', path, err);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Write a locale-override manifest at `{name}.asset.{...selector}.json`.
|
|
74
|
+
* Same atomicity contract as `writeManifest` (storage provider handles
|
|
75
|
+
* write-then-rename atomicity); this function only serializes + dispatches.
|
|
76
|
+
*
|
|
77
|
+
* The locale manifest type isn't bound here — callers pass any
|
|
78
|
+
* JSON-serializable shape that conforms to `LocaleOverrideManifest` or
|
|
79
|
+
* `FontLocaleAdditiveManifest`. The validators in `manifest-locale.ts`
|
|
80
|
+
* are responsible for read-side shape enforcement; the writer trusts
|
|
81
|
+
* its caller.
|
|
82
|
+
*/
|
|
83
|
+
export async function writeLocaleManifest(storage, assetsRoot, assetName, selector, manifest) {
|
|
84
|
+
const path = `${assetsRoot}/${manifestPath(assetName, selector)}`;
|
|
85
|
+
const serialized = `${JSON.stringify(manifest, null, 2)}\n`;
|
|
86
|
+
try {
|
|
87
|
+
await storage.writeFile(path, serialized);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
throw new AssetStorageError('write', path, err);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/assets/manifest.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAiB,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,QAA0B;IACxE,OAAO,GAAG,SAAS,SAAS,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAA;AACrE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,IAAY,EAAE,GAAW,EAAE,QAA0B;IACrG,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAA;IACrD,OAAO,GAAG,SAAS,IAAI,IAAI,GAAG,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,OAAO,EAAE,CAAA;AAC5E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,IAAY,EACZ,GAAW,EACX,KAAa,EACb,QAA0B;IAE1B,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAA;IACrD,OAAO,GAAG,SAAS,IAAI,IAAI,GAAG,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,OAAO,EAAE,CAAA;AACtF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAA;AAE/C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAwB,EACxB,UAAkB,EAClB,QAAuB;IAEvB,MAAM,IAAI,GAAG,GAAG,UAAU,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAA;IAC3D,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IACjD,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAwB,EACxB,UAAkB,EAClB,SAAiB,EACjB,QAAkB,EAClB,QAAgB;IAEhB,MAAM,IAAI,GAAG,GAAG,UAAU,IAAI,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAA;IACjE,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface MimeSniffResult {
|
|
2
|
+
/** The stream, replaying all original bytes. */
|
|
3
|
+
stream: ReadableStream<Uint8Array>;
|
|
4
|
+
/** Detected MIME (e.g. `"image/jpeg"`) or null when no magic-byte match. */
|
|
5
|
+
mime: string | null;
|
|
6
|
+
/** Detected canonical extension (e.g. `"jpg"`) or null when no match. */
|
|
7
|
+
ext: string | null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Sniff the MIME type from the head of a stream, returning a pass-through
|
|
11
|
+
* stream that carries the full byte sequence downstream.
|
|
12
|
+
*
|
|
13
|
+
* Returns `{ mime: null, ext: null }` on unknown magic bytes, empty streams,
|
|
14
|
+
* or plain text that doesn't match any format. Callers handle the null
|
|
15
|
+
* case — this module doesn't throw.
|
|
16
|
+
*/
|
|
17
|
+
export declare function sniffMimeFromStream(input: ReadableStream<Uint8Array>): Promise<MimeSniffResult>;
|
|
18
|
+
//# sourceMappingURL=mime-sniff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime-sniff.d.ts","sourceRoot":"","sources":["../../src/assets/mime-sniff.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;IAClC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,yEAAyE;IACzE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAmBrG"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MIME sniffing from a byte stream — detect the type from magic bytes without
|
|
3
|
+
* consuming the stream. The returned stream replays every byte of the input
|
|
4
|
+
* (including the sample bytes used for detection); the detected MIME is
|
|
5
|
+
* attached once sniffing completes.
|
|
6
|
+
*
|
|
7
|
+
* Wraps `file-type`'s `fileTypeStream`, which builds an internal sample
|
|
8
|
+
* buffer (default 4100 bytes) without losing the originals.
|
|
9
|
+
*
|
|
10
|
+
* SVG handling: `file-type` v22+ detects SVG as `application/xml` (not the
|
|
11
|
+
* semantic `image/svg+xml`) because SVG is XML by syntax — magic bytes
|
|
12
|
+
* alone can't distinguish "SVG" from "any XML." This module promotes
|
|
13
|
+
* detected XML to `image/svg+xml` when the root element is `<svg>`. The
|
|
14
|
+
* promotion is conservative: malformed input that happens to start with
|
|
15
|
+
* `<svg` but isn't valid SVG will fail later sanitization, not here.
|
|
16
|
+
*/
|
|
17
|
+
import { fileTypeStream } from 'file-type';
|
|
18
|
+
/**
|
|
19
|
+
* Sniff the MIME type from the head of a stream, returning a pass-through
|
|
20
|
+
* stream that carries the full byte sequence downstream.
|
|
21
|
+
*
|
|
22
|
+
* Returns `{ mime: null, ext: null }` on unknown magic bytes, empty streams,
|
|
23
|
+
* or plain text that doesn't match any format. Callers handle the null
|
|
24
|
+
* case — this module doesn't throw.
|
|
25
|
+
*/
|
|
26
|
+
export async function sniffMimeFromStream(input) {
|
|
27
|
+
const sniffed = await fileTypeStream(input);
|
|
28
|
+
let mime = sniffed.fileType?.mime ?? null;
|
|
29
|
+
let ext = sniffed.fileType?.ext ?? null;
|
|
30
|
+
// SVG promotion. file-type returns `application/xml` for any XML;
|
|
31
|
+
// peek the head of the stream and check for `<svg` near the start.
|
|
32
|
+
if (mime === 'application/xml' || mime === null) {
|
|
33
|
+
const promoted = await tryPromoteSvg(sniffed);
|
|
34
|
+
if (promoted) {
|
|
35
|
+
return { stream: promoted, mime: 'image/svg+xml', ext: 'svg' };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
stream: sniffed,
|
|
40
|
+
mime,
|
|
41
|
+
ext,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Drain a stream into chunks, check if the head looks like SVG
|
|
46
|
+
* (`<svg` near the start, optionally preceded by an XML prolog and/or
|
|
47
|
+
* whitespace), and return a fresh replay stream when so. Returns
|
|
48
|
+
* `null` when the input doesn't start with an `<svg>` root.
|
|
49
|
+
*/
|
|
50
|
+
async function tryPromoteSvg(stream) {
|
|
51
|
+
const reader = stream.getReader();
|
|
52
|
+
const chunks = [];
|
|
53
|
+
let total = 0;
|
|
54
|
+
let head = '';
|
|
55
|
+
for (;;) {
|
|
56
|
+
const { value, done } = await reader.read();
|
|
57
|
+
if (done)
|
|
58
|
+
break;
|
|
59
|
+
if (value) {
|
|
60
|
+
chunks.push(value);
|
|
61
|
+
total += value.byteLength;
|
|
62
|
+
if (head.length < 512) {
|
|
63
|
+
head += new TextDecoder('utf-8', { fatal: false }).decode(value).slice(0, 512 - head.length);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const looksSvg = /^\s*(?:<\?xml[^>]*\?>\s*)?(?:<!--[\s\S]*?-->\s*)?<svg[\s>]/i.test(head);
|
|
68
|
+
if (!looksSvg)
|
|
69
|
+
return null;
|
|
70
|
+
// Replay every byte we drained as a fresh stream.
|
|
71
|
+
const flat = new Uint8Array(total);
|
|
72
|
+
let offset = 0;
|
|
73
|
+
for (const chunk of chunks) {
|
|
74
|
+
flat.set(chunk, offset);
|
|
75
|
+
offset += chunk.byteLength;
|
|
76
|
+
}
|
|
77
|
+
return new ReadableStream({
|
|
78
|
+
start(controller) {
|
|
79
|
+
controller.enqueue(flat);
|
|
80
|
+
controller.close();
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=mime-sniff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime-sniff.js","sourceRoot":"","sources":["../../src/assets/mime-sniff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAW1C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAiC;IACzE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAA;IACzC,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,IAAI,CAAA;IAEvC,kEAAkE;IAClE,mEAAmE;IACnE,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAqC,CAAC,CAAA;QAC3E,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;QAChE,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAqC;QAC7C,IAAI;QACJ,GAAG;KACJ,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAC,MAAkC;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;IACjC,MAAM,MAAM,GAAiB,EAAE,CAAA;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,SAAS,CAAC;QACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QAC3C,IAAI,IAAI;YAAE,MAAK;QACf,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAA;YACzB,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACtB,IAAI,IAAI,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YAC9F,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,6DAA6D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzF,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAE1B,kDAAkD;IAClD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACvB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAA;IAC5B,CAAC;IACD,OAAO,IAAI,cAAc,CAAa;QACpC,KAAK,CAAC,UAAU;YACd,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxB,UAAU,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preprocess-svg.d.ts","sourceRoot":"","sources":["../../src/assets/preprocess-svg.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAuC,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAG9F,eAAO,MAAM,eAAe,EAAE,kBAqB7B,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG upload preprocessor — adapts `sanitizeSvg` to the
|
|
3
|
+
* `UploadPreprocessor` contract.
|
|
4
|
+
*
|
|
5
|
+
* SRP: this module owns the SVG-specific decisions for the preprocess
|
|
6
|
+
* pipeline (which MIMEs trigger it, how to wrap warnings, how to
|
|
7
|
+
* translate sanitization errors). The actual sanitization rules
|
|
8
|
+
* (DOMPurify config, base64 thresholds) live in `svg-sanitize.ts`
|
|
9
|
+
* — that's the format-specific policy module.
|
|
10
|
+
*
|
|
11
|
+
* Adding a new preprocessor follows this exact shape: one module per
|
|
12
|
+
* format, one matcher, one wrapper around the format's pure logic.
|
|
13
|
+
*/
|
|
14
|
+
import { AssetPreprocessError } from './errors.js';
|
|
15
|
+
import { sanitizeSvg, SvgSanitizeError, SVG_MIME_TYPE } from './svg-sanitize.js';
|
|
16
|
+
export const svgPreprocessor = {
|
|
17
|
+
name: 'svg',
|
|
18
|
+
matches(mime) {
|
|
19
|
+
return mime === SVG_MIME_TYPE;
|
|
20
|
+
},
|
|
21
|
+
preprocess(bytes) {
|
|
22
|
+
try {
|
|
23
|
+
const result = sanitizeSvg(bytes);
|
|
24
|
+
return {
|
|
25
|
+
bytes: result.bytes,
|
|
26
|
+
warnings: result.warnings.map(toPreprocessWarning),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
if (err instanceof SvgSanitizeError) {
|
|
31
|
+
throw new AssetPreprocessError('svg', err.code, err);
|
|
32
|
+
}
|
|
33
|
+
// Other errors surface as-is; the registry wraps them into
|
|
34
|
+
// AssetPreprocessError with reason='unexpected'.
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
function toPreprocessWarning(w) {
|
|
40
|
+
switch (w.code) {
|
|
41
|
+
case 'large-base64':
|
|
42
|
+
return { code: 'svg-large-base64', sizeBytes: w.sizeBytes, threshold: w.threshold };
|
|
43
|
+
case 'stripped-element':
|
|
44
|
+
return { code: 'svg-stripped-element', tag: w.tag };
|
|
45
|
+
case 'stripped-attribute':
|
|
46
|
+
return { code: 'svg-stripped-attribute', attr: w.attr, on: w.on };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=preprocess-svg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preprocess-svg.js","sourceRoot":"","sources":["../../src/assets/preprocess-svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAuB;IACjD,IAAI,EAAE,KAAK;IACX,OAAO,CAAC,IAAmB;QACzB,OAAO,IAAI,KAAK,aAAa,CAAA;IAC/B,CAAC;IACD,UAAU,CAAC,KAAiB;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;YACjC,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC;aACnD,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;gBACpC,MAAM,IAAI,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YACtD,CAAC;YACD,2DAA2D;YAC3D,iDAAiD;YACjD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;CACF,CAAA;AAED,SAAS,mBAAmB,CAAC,CAAqD;IAChF,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,cAAc;YACjB,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;QACrF,KAAK,kBAAkB;YACrB,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;QACrD,KAAK,oBAAoB;YACvB,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAA;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-fatal observations about how the bytes were transformed. Today
|
|
3
|
+
* SVG can warn about large embedded base64; future preprocessors may
|
|
4
|
+
* surface "EXIF orientation applied", "metadata stripped", etc.
|
|
5
|
+
*
|
|
6
|
+
* Open shape — preprocessors define their own warning codes via the
|
|
7
|
+
* union of all registered preprocessors. Today only SVG warnings.
|
|
8
|
+
*/
|
|
9
|
+
export type PreprocessWarning = {
|
|
10
|
+
code: 'svg-stripped-element';
|
|
11
|
+
tag: string;
|
|
12
|
+
} | {
|
|
13
|
+
code: 'svg-stripped-attribute';
|
|
14
|
+
attr: string;
|
|
15
|
+
on: string;
|
|
16
|
+
} | {
|
|
17
|
+
code: 'svg-large-base64';
|
|
18
|
+
sizeBytes: number;
|
|
19
|
+
threshold: number;
|
|
20
|
+
};
|
|
21
|
+
export interface PreprocessResult {
|
|
22
|
+
/** Bytes after preprocessing — may be the same reference when no transform applied. */
|
|
23
|
+
bytes: Uint8Array;
|
|
24
|
+
/** Format-specific non-fatal warnings. Empty when nothing to flag. */
|
|
25
|
+
warnings: readonly PreprocessWarning[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* One format's preprocessing contract. Implementations are pure
|
|
29
|
+
* (no I/O, no storage, no history) so they're trivially testable.
|
|
30
|
+
*/
|
|
31
|
+
export interface UploadPreprocessor {
|
|
32
|
+
/** Stable identifier for diagnostics (`'svg'`, `'heic'`, etc.). */
|
|
33
|
+
readonly name: string;
|
|
34
|
+
/** Whether this preprocessor applies to the given MIME. */
|
|
35
|
+
matches(mime: string | null): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Transform the bytes. Return new bytes (may be the same reference
|
|
38
|
+
* if no transformation is needed) plus any warnings. Throw
|
|
39
|
+
* `AssetPreprocessError` for unrecoverable input problems.
|
|
40
|
+
*/
|
|
41
|
+
preprocess(bytes: Uint8Array): PreprocessResult | Promise<PreprocessResult>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The default registry — what ingest uses out of the box. Order
|
|
45
|
+
* matters when more than one preprocessor matches; today only one
|
|
46
|
+
* preprocessor matches any given MIME.
|
|
47
|
+
*
|
|
48
|
+
* Adding a new format-specific preprocessor: implement
|
|
49
|
+
* `UploadPreprocessor`, append it here. Ingest needs no edits.
|
|
50
|
+
*/
|
|
51
|
+
export declare const defaultPreprocessors: readonly UploadPreprocessor[];
|
|
52
|
+
/**
|
|
53
|
+
* Run the matching preprocessor for the given MIME. Returns the
|
|
54
|
+
* (possibly-transformed) bytes + any warnings; pass through unchanged
|
|
55
|
+
* when no preprocessor matches.
|
|
56
|
+
*
|
|
57
|
+
* Thrown errors propagate. Preprocessors throw `AssetPreprocessError`
|
|
58
|
+
* for client-correctable input problems; other thrown errors (e.g.
|
|
59
|
+
* out-of-memory during a large transform) bubble as-is.
|
|
60
|
+
*/
|
|
61
|
+
export declare function runPreprocessors(bytes: Uint8Array, mime: string | null, preprocessors?: readonly UploadPreprocessor[]): Promise<PreprocessResult>;
|
|
62
|
+
//# sourceMappingURL=preprocess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preprocess.d.ts","sourceRoot":"","sources":["../../src/assets/preprocess.ts"],"names":[],"mappings":"AAmDA;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,uFAAuF;IACvF,KAAK,EAAE,UAAU,CAAA;IACjB,sEAAsE;IACtE,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAA;CACvC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2DAA2D;IAC3D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAA;IACrC;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAC5E;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,kBAAkB,EAAsB,CAAA;AAEpF;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,aAAa,GAAE,SAAS,kBAAkB,EAAyB,GAClE,OAAO,CAAC,gBAAgB,CAAC,CAc3B"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format-specific upload preprocessing — the seam where formats register
|
|
3
|
+
* "transform these bytes before storage."
|
|
4
|
+
*
|
|
5
|
+
* # Why
|
|
6
|
+
*
|
|
7
|
+
* Some formats need work between MIME-sniff and storage write:
|
|
8
|
+
*
|
|
9
|
+
* - SVG: strip script tags, event handlers, external hrefs, and
|
|
10
|
+
* oversized embedded base64 (security + bloat — see svg-sanitize.ts)
|
|
11
|
+
* - HEIC: transcode to JPEG (browsers can't display HEIC) — future
|
|
12
|
+
* - Animated GIF: extract first frame as poster, set `animated`
|
|
13
|
+
* manifest flag — future
|
|
14
|
+
* - JPEG with EXIF: apply orientation, strip personal metadata — future
|
|
15
|
+
*
|
|
16
|
+
* Without an abstraction, every new format adds an `if (mime === '...')`
|
|
17
|
+
* branch to `ingestAsset`. The hot path grows with each format; format-
|
|
18
|
+
* specific code lives in the wrong place; tests for one format have
|
|
19
|
+
* to stand up the whole ingest pipeline.
|
|
20
|
+
*
|
|
21
|
+
* # Contract
|
|
22
|
+
*
|
|
23
|
+
* `UploadPreprocessor` is the open extension seam:
|
|
24
|
+
* - `matches(mime)` → does this preprocessor apply?
|
|
25
|
+
* - `preprocess(bytes)` → return new bytes (and optional warnings)
|
|
26
|
+
*
|
|
27
|
+
* Each registered preprocessor handles one MIME (or a small family —
|
|
28
|
+
* a future "EXIF" preprocessor might handle both `image/jpeg` and
|
|
29
|
+
* `image/heic`). The registry is checked in order; the first matching
|
|
30
|
+
* preprocessor runs and its output replaces the buffer.
|
|
31
|
+
*
|
|
32
|
+
* # SOLID lenses
|
|
33
|
+
*
|
|
34
|
+
* - SRP: each preprocessor module owns one format's preprocessing
|
|
35
|
+
* - OCP: adding a format = new module + register; ingest unchanged
|
|
36
|
+
* - LSP: every preprocessor honors the same contract — return bytes
|
|
37
|
+
* or throw `AssetPreprocessError`
|
|
38
|
+
* - ISP: callers (ingest) depend on `runPreprocessors`, not on the
|
|
39
|
+
* individual format modules
|
|
40
|
+
* - DIP: ingest depends on the abstraction; format modules implement
|
|
41
|
+
* it. SVG-specific knowledge lives in `preprocess-svg.ts`.
|
|
42
|
+
*
|
|
43
|
+
* # v1 scope
|
|
44
|
+
*
|
|
45
|
+
* Today's only registered preprocessor is SVG. The default registry
|
|
46
|
+
* (`defaultPreprocessors`) is what `ingestAsset` uses out of the box;
|
|
47
|
+
* tests can construct an empty registry to bypass preprocessing.
|
|
48
|
+
*/
|
|
49
|
+
import { AssetPreprocessError } from './errors.js';
|
|
50
|
+
import { svgPreprocessor } from './preprocess-svg.js';
|
|
51
|
+
/**
|
|
52
|
+
* The default registry — what ingest uses out of the box. Order
|
|
53
|
+
* matters when more than one preprocessor matches; today only one
|
|
54
|
+
* preprocessor matches any given MIME.
|
|
55
|
+
*
|
|
56
|
+
* Adding a new format-specific preprocessor: implement
|
|
57
|
+
* `UploadPreprocessor`, append it here. Ingest needs no edits.
|
|
58
|
+
*/
|
|
59
|
+
export const defaultPreprocessors = [svgPreprocessor];
|
|
60
|
+
/**
|
|
61
|
+
* Run the matching preprocessor for the given MIME. Returns the
|
|
62
|
+
* (possibly-transformed) bytes + any warnings; pass through unchanged
|
|
63
|
+
* when no preprocessor matches.
|
|
64
|
+
*
|
|
65
|
+
* Thrown errors propagate. Preprocessors throw `AssetPreprocessError`
|
|
66
|
+
* for client-correctable input problems; other thrown errors (e.g.
|
|
67
|
+
* out-of-memory during a large transform) bubble as-is.
|
|
68
|
+
*/
|
|
69
|
+
export async function runPreprocessors(bytes, mime, preprocessors = defaultPreprocessors) {
|
|
70
|
+
for (const p of preprocessors) {
|
|
71
|
+
if (p.matches(mime)) {
|
|
72
|
+
try {
|
|
73
|
+
return await p.preprocess(bytes);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err instanceof AssetPreprocessError)
|
|
77
|
+
throw err;
|
|
78
|
+
// Wrap unexpected errors so the caller always sees a typed
|
|
79
|
+
// surface for preprocessing failures.
|
|
80
|
+
throw new AssetPreprocessError(p.name, 'unexpected', err);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { bytes, warnings: [] };
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=preprocess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preprocess.js","sourceRoot":"","sources":["../../src/assets/preprocess.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAuCrD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkC,CAAC,eAAe,CAAC,CAAA;AAEpF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAiB,EACjB,IAAmB,EACnB,gBAA+C,oBAAoB;IAEnE,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,oBAAoB;oBAAE,MAAM,GAAG,CAAA;gBAClD,2DAA2D;gBAC3D,sCAAsC;gBACtC,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Publish-plan — figures out *what* to publish before any bytes move.
|
|
3
|
+
*
|
|
4
|
+
* Single responsibility: turn a set of items being published into either
|
|
5
|
+
* a `Plan` (the asset names to copy + the items that referenced them) or
|
|
6
|
+
* a structured `missing-on-source` failure. No I/O on the destination —
|
|
7
|
+
* actually copying bytes is `publish.ts`'s job.
|
|
8
|
+
*
|
|
9
|
+
* Splitting the planner from the executor lets the validation failure
|
|
10
|
+
* short-circuit before a single stream is opened. It also lets the
|
|
11
|
+
* orchestrator wire publish-assets into the broader publish flow with
|
|
12
|
+
* full knowledge of what's about to happen — useful for ordering writes
|
|
13
|
+
* (assets before pages) and for surfacing per-asset progress.
|
|
14
|
+
*/
|
|
15
|
+
import type { ContentRoot } from '../content-root.js';
|
|
16
|
+
export interface PlanInput {
|
|
17
|
+
/** Source content root (where pages/, fragments/, and assets/ live on the source side). */
|
|
18
|
+
readonly sourceRoot: ContentRoot;
|
|
19
|
+
/** Target content root (where pages/, fragments/, and assets/ will land on the target side). */
|
|
20
|
+
readonly targetRoot: ContentRoot;
|
|
21
|
+
/** Items being published — e.g., `['pages/home', 'fragments/header']`. */
|
|
22
|
+
readonly itemNames: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export type Plan = {
|
|
25
|
+
readonly ok: true;
|
|
26
|
+
readonly assets: readonly string[];
|
|
27
|
+
readonly itemsWithRefs: readonly string[];
|
|
28
|
+
} | {
|
|
29
|
+
readonly ok: false;
|
|
30
|
+
readonly reason: 'missing-on-source';
|
|
31
|
+
readonly missing: readonly string[];
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Compute the set of assets to publish given the items being published,
|
|
35
|
+
* after running the source-existence pre-flight check.
|
|
36
|
+
*
|
|
37
|
+
* Empty refs short-circuit to `ok: true` with no assets — sites without
|
|
38
|
+
* media still publish fine.
|
|
39
|
+
*/
|
|
40
|
+
export declare function planAssetCopy(input: PlanInput): Promise<Plan>;
|
|
41
|
+
//# sourceMappingURL=publish-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-plan.d.ts","sourceRoot":"","sources":["../../src/assets/publish-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAIrD,MAAM,WAAW,SAAS;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAA;IAChC,gGAAgG;IAChG,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAA;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAED,MAAM,MAAM,IAAI,GACZ;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACpG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAErG;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAenE"}
|