gazetta 0.6.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/index.html +2 -2
- 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 +0 -2
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +4 -24
- 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/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +30 -4
- package/dist/admin-api/routes/fragments.js.map +1 -1
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +37 -4
- package/dist/admin-api/routes/pages.js.map +1 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +68 -35
- package/dist/admin-api/routes/publish.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/index.d.ts +2 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -1
- package/dist/admin-api/schemas/index.js +2 -0
- package/dist/admin-api/schemas/index.js.map +1 -1
- package/dist/admin-api/source-context.d.ts +0 -7
- package/dist/admin-api/source-context.d.ts.map +1 -1
- package/dist/admin-api/source-context.js +0 -3
- package/dist/admin-api/source-context.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 +0 -2
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +0 -1
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/index.js +64 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +15 -12
- package/dist/compare.js.map +1 -1
- 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 +36 -5
- 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 +0 -6
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +0 -18
- package/dist/hash.js.map +1 -1
- package/dist/history-provider.d.ts.map +1 -1
- package/dist/history-provider.js +30 -8
- package/dist/history-provider.js.map +1 -1
- package/dist/history-recorder.d.ts +7 -3
- package/dist/history-recorder.d.ts.map +1 -1
- package/dist/history-recorder.js +9 -1
- package/dist/history-recorder.js.map +1 -1
- package/dist/history-restorer.d.ts.map +1 -1
- package/dist/history-restorer.js +34 -2
- package/dist/history-restorer.js.map +1 -1
- package/dist/history.d.ts +26 -8
- package/dist/history.d.ts.map +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +20 -0
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +38 -0
- package/dist/locale.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 +84 -1
- package/dist/providers/s3.js.map +1 -1
- package/dist/publish-rendered.d.ts +37 -17
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +71 -67
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish.d.ts +13 -12
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +23 -47
- package/dist/publish.js.map +1 -1
- package/dist/resolver.d.ts +12 -2
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +54 -9
- package/dist/resolver.js.map +1 -1
- 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/sidecars.d.ts +19 -18
- package/dist/sidecars.d.ts.map +1 -1
- package/dist/sidecars.js +70 -62
- package/dist/sidecars.js.map +1 -1
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +15 -37
- package/dist/targets.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 +125 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +20 -1
- package/admin-dist/assets/index-B6pVot0Y.css +0 -1
- package/admin-dist/assets/index-DniLwxJA.js +0 -609
- package/dist/providers/r2.d.ts +0 -8
- package/dist/providers/r2.d.ts.map +0 -1
- package/dist/providers/r2.js +0 -86
- package/dist/providers/r2.js.map +0 -1
- package/dist/source-sidecars.d.ts +0 -32
- package/dist/source-sidecars.d.ts.map +0 -1
- package/dist/source-sidecars.js +0 -98
- package/dist/source-sidecars.js.map +0 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas + typed errors for asset-domain HTTP contracts.
|
|
3
|
+
*
|
|
4
|
+
* Thin transport envelopes around the domain-owned shapes. The `AssetRef`
|
|
5
|
+
* schema lives in `../../assets/refs.ts` (domain); this module wraps it
|
|
6
|
+
* in HTTP-shaped responses and re-exports the domain error classes so
|
|
7
|
+
* both server and admin client can import them from a single place.
|
|
8
|
+
*
|
|
9
|
+
* Single source of truth. The server throws `AssetInUseError` from the
|
|
10
|
+
* asset domain; the route adapter serializes via `AssetInUseResponseSchema`;
|
|
11
|
+
* the admin client parses the 409 body into the same `AssetInUseError`
|
|
12
|
+
* class. No parallel client-only copy.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { AssetRefSchema } from '../../assets/refs.js';
|
|
16
|
+
// Re-export the domain schema + type so admin-api consumers can get
|
|
17
|
+
// everything they need from this barrel without reaching into the domain.
|
|
18
|
+
export { AssetRefSchema } from '../../assets/refs.js';
|
|
19
|
+
// Re-export the typed error hierarchy. The admin client imports
|
|
20
|
+
// `AssetInUseError` from here and uses `instanceof` to branch; the server
|
|
21
|
+
// throws the same class. One identity across the wire.
|
|
22
|
+
export { AssetInUseError, AssetKindMismatchError, AssetManifestCorruptError, AssetManifestNotFoundError, AssetMimeMismatchError, AssetMimeUnsupportedError, AssetNameCollisionError, AssetNameInvalidError, AssetNameReservedError, AssetPathTraversalError, AssetPreprocessError, AssetSizeExceededError, AssetStorageError, AssetValidationError, AssetVariantGenerationError, } from '../../assets/errors.js';
|
|
23
|
+
/**
|
|
24
|
+
* Body of a 409 response on DELETE /api/assets/:name — emitted when the
|
|
25
|
+
* asset is still referenced by at least one page or fragment. `refs` is
|
|
26
|
+
* the exact usage list the server found; the client renders it verbatim.
|
|
27
|
+
*/
|
|
28
|
+
export const AssetInUseResponseSchema = z.object({
|
|
29
|
+
code: z.literal('ASSET_IN_USE'),
|
|
30
|
+
message: z.string(),
|
|
31
|
+
assetName: z.string(),
|
|
32
|
+
refs: z.array(AssetRefSchema),
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Body of a 409 response on POST /api/assets/:name/rename-to/:newName —
|
|
36
|
+
* emitted when `newName` already maps to an existing asset. The author
|
|
37
|
+
* either picks a different name or uses replace-and-delete to merge.
|
|
38
|
+
*/
|
|
39
|
+
export const AssetNameCollisionResponseSchema = z.object({
|
|
40
|
+
code: z.literal('ASSET_NAME_COLLISION'),
|
|
41
|
+
message: z.string(),
|
|
42
|
+
newName: z.string(),
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/admin-api/schemas/assets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,oEAAoE;AACpE,0EAA0E;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGrD,gEAAgE;AAChE,0EAA0E;AAC1E,uDAAuD;AACvD,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,2BAA2B,GAE5B,MAAM,wBAAwB,CAAA;AAE/B;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;CAC9B,CAAC,CAAA;AAGF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,MAAM,CAAC;IACvD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAA"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* - POST /api/publish + /api/publish/stream (result + SSE progress union)
|
|
16
16
|
* - GET /api/history + POST /api/history/{undo,restore} (revisions + restore)
|
|
17
17
|
* - POST /api/fetch (cross-target copy)
|
|
18
|
+
* - DELETE /api/assets/:name (AssetRef + 409 AssetInUseResponse)
|
|
18
19
|
*
|
|
19
20
|
* Add new endpoint modules here as they move to schema-validated contracts.
|
|
20
21
|
*/
|
|
@@ -29,4 +30,5 @@ export * from './compare.js';
|
|
|
29
30
|
export * from './publish.js';
|
|
30
31
|
export * from './history.js';
|
|
31
32
|
export * from './fetch.js';
|
|
33
|
+
export * from './assets.js';
|
|
32
34
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin-api/schemas/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin-api/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* - POST /api/publish + /api/publish/stream (result + SSE progress union)
|
|
16
16
|
* - GET /api/history + POST /api/history/{undo,restore} (revisions + restore)
|
|
17
17
|
* - POST /api/fetch (cross-target copy)
|
|
18
|
+
* - DELETE /api/assets/:name (AssetRef + 409 AssetInUseResponse)
|
|
18
19
|
*
|
|
19
20
|
* Add new endpoint modules here as they move to schema-validated contracts.
|
|
20
21
|
*/
|
|
@@ -29,4 +30,5 @@ export * from './compare.js';
|
|
|
29
30
|
export * from './publish.js';
|
|
30
31
|
export * from './history.js';
|
|
31
32
|
export * from './fetch.js';
|
|
33
|
+
export * from './assets.js';
|
|
32
34
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin-api/schemas/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin-api/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA"}
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
import type { StorageProvider, SiteManifest } from '../types.js';
|
|
12
12
|
import { type ContentRoot } from '../content-root.js';
|
|
13
13
|
import { type Site, type LoadSiteOptions } from '../site-loader.js';
|
|
14
|
-
import type { SourceSidecarWriter } from '../source-sidecars.js';
|
|
15
14
|
import type { TargetRegistry } from '../targets.js';
|
|
16
15
|
import type { HistoryProvider } from '../history.js';
|
|
17
16
|
export interface SourceContext {
|
|
@@ -34,8 +33,6 @@ export interface SourceContext {
|
|
|
34
33
|
readonly projectSiteDir: string;
|
|
35
34
|
/** Content root (storage + rooting prefix paired for path construction). */
|
|
36
35
|
readonly contentRoot: ContentRoot;
|
|
37
|
-
/** Optional sidecar writer for write-through hash/dependency tracking. */
|
|
38
|
-
readonly sidecarWriter?: SourceSidecarWriter;
|
|
39
36
|
/**
|
|
40
37
|
* Name of the target this source resolves to, when known. Set by the
|
|
41
38
|
* registry resolver; undefined for the legacy static resolver (which has
|
|
@@ -70,7 +67,6 @@ export interface CreateSourceContextOptions {
|
|
|
70
67
|
siteDir: string;
|
|
71
68
|
/** Absolute project site directory. Defaults to `siteDir` for backward compat. */
|
|
72
69
|
projectSiteDir?: string;
|
|
73
|
-
sidecarWriter?: SourceSidecarWriter;
|
|
74
70
|
history?: HistoryProvider;
|
|
75
71
|
/** Project-level site manifest — passed to loadSite so targets don't need site.yaml. */
|
|
76
72
|
manifest?: SiteManifest;
|
|
@@ -99,7 +95,6 @@ export interface SourceContextFromRegistryOptions {
|
|
|
99
95
|
* This is independent of the target's storage rooting.
|
|
100
96
|
*/
|
|
101
97
|
projectSiteDir: string;
|
|
102
|
-
sidecarWriter?: SourceSidecarWriter;
|
|
103
98
|
/** See BuildHistory — callable decides per-target history provider. */
|
|
104
99
|
buildHistory?: BuildHistory;
|
|
105
100
|
/** Project-level site manifest. */
|
|
@@ -133,8 +128,6 @@ export interface RegistrySourceResolverOptions {
|
|
|
133
128
|
registry: TargetRegistry;
|
|
134
129
|
/** Required — absolute project site directory for the returned context. */
|
|
135
130
|
projectSiteDir: string;
|
|
136
|
-
/** Optional sidecar writer attached to every resolved context. */
|
|
137
|
-
sidecarWriter?: SourceSidecarWriter;
|
|
138
131
|
/**
|
|
139
132
|
* Siteprefix to apply to the target's storage. Typically `''` since
|
|
140
133
|
* registry-sourced storage is already target-rooted.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-context.d.ts","sourceRoot":"","sources":["../../src/admin-api/source-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAY,KAAK,IAAI,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC7E,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"source-context.d.ts","sourceRoot":"","sources":["../../src/admin-api/source-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,6 @@ export function createSourceContext(opts) {
|
|
|
23
23
|
siteDir: opts.siteDir,
|
|
24
24
|
projectSiteDir: opts.projectSiteDir ?? opts.siteDir,
|
|
25
25
|
contentRoot: createContentRoot(opts.storage, opts.siteDir),
|
|
26
|
-
sidecarWriter: opts.sidecarWriter,
|
|
27
26
|
history: opts.history,
|
|
28
27
|
manifest: opts.manifest,
|
|
29
28
|
};
|
|
@@ -41,7 +40,6 @@ export function createSourceContextFromRegistry(opts) {
|
|
|
41
40
|
storage,
|
|
42
41
|
siteDir: opts.siteDir ?? '',
|
|
43
42
|
projectSiteDir: opts.projectSiteDir,
|
|
44
|
-
sidecarWriter: opts.sidecarWriter,
|
|
45
43
|
history: opts.buildHistory?.(name, storage),
|
|
46
44
|
manifest: opts.manifest,
|
|
47
45
|
}),
|
|
@@ -85,7 +83,6 @@ export function registrySourceResolver(opts) {
|
|
|
85
83
|
projectSiteDir: opts.projectSiteDir,
|
|
86
84
|
buildHistory: opts.buildHistory,
|
|
87
85
|
siteDir: opts.siteDir,
|
|
88
|
-
sidecarWriter: opts.sidecarWriter,
|
|
89
86
|
manifest: opts.manifest,
|
|
90
87
|
});
|
|
91
88
|
cache.set(name, ctx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-context.js","sourceRoot":"","sources":["../../src/admin-api/source-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,iBAAiB,EAAoB,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAE,QAAQ,EAAmC,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"source-context.js","sourceRoot":"","sources":["../../src/admin-api/source-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-audio.d.ts","sourceRoot":"","sources":["../../src/assets/analyze-audio.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAiC,cAAc,EAAE,MAAM,cAAc,CAAA;AAoBjF,eAAO,MAAM,aAAa,EAAE,cAuC3B,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio analyzer — extracts duration via the `music-metadata` library.
|
|
3
|
+
*
|
|
4
|
+
* Single responsibility: read audio bytes, return manifest enrichment
|
|
5
|
+
* (`duration` in milliseconds; null when the format technically
|
|
6
|
+
* supports duration but the value couldn't be derived from headers).
|
|
7
|
+
*
|
|
8
|
+
* Design notes (per design-media.md):
|
|
9
|
+
* - Personal-metadata stripping is documented as the default for
|
|
10
|
+
* audio, with opt-in preservation. The analyzer reads metadata
|
|
11
|
+
* non-destructively here; stripping is a *byte-transform* concern
|
|
12
|
+
* (preprocessor surface, not analyzer). Wiring an
|
|
13
|
+
* `audioMetadataPreprocessor` is a v1.5 follow-up — the analyzer
|
|
14
|
+
* reading duration doesn't preclude future stripping.
|
|
15
|
+
* - No supplementary files in v1. Future waveform-image extraction
|
|
16
|
+
* would slot in here (`supplementaryFiles: [{ path: ...waveform.svg }]`).
|
|
17
|
+
* - Format-specific MIME match: MP3, WAV, FLAC, Opus, AAC, M4A, OGG.
|
|
18
|
+
* `music-metadata` v11+ handles all of these natively.
|
|
19
|
+
*
|
|
20
|
+
* SOLID lenses:
|
|
21
|
+
* - SRP: this module owns "audio bytes → duration"
|
|
22
|
+
* - OCP: adding waveform extraction = same module gains a
|
|
23
|
+
* supplementary-file output; no other module changes
|
|
24
|
+
* - LSP: honors the `UploadAnalyzer` contract — match + analyze
|
|
25
|
+
* - ISP / DIP: ingest depends on `runAnalyzers`, not on this module
|
|
26
|
+
*/
|
|
27
|
+
import { parseBuffer } from 'music-metadata';
|
|
28
|
+
/**
|
|
29
|
+
* MIMEs the audio analyzer matches. Mirrors the v1 audio allowlist
|
|
30
|
+
* documented in design-media.md. Adding a new audio MIME here +
|
|
31
|
+
* `ALLOWED_MIMES` admits it; no other code changes.
|
|
32
|
+
*/
|
|
33
|
+
const AUDIO_MIMES = new Set([
|
|
34
|
+
'audio/mpeg', // MP3
|
|
35
|
+
'audio/wav',
|
|
36
|
+
'audio/x-wav',
|
|
37
|
+
'audio/flac',
|
|
38
|
+
'audio/x-flac',
|
|
39
|
+
'audio/ogg',
|
|
40
|
+
'audio/opus',
|
|
41
|
+
'audio/aac',
|
|
42
|
+
'audio/mp4', // M4A
|
|
43
|
+
'audio/x-m4a',
|
|
44
|
+
]);
|
|
45
|
+
export const audioAnalyzer = {
|
|
46
|
+
name: 'audio',
|
|
47
|
+
matches(mime) {
|
|
48
|
+
return !!mime && AUDIO_MIMES.has(mime);
|
|
49
|
+
},
|
|
50
|
+
async analyze(input) {
|
|
51
|
+
let durationSec;
|
|
52
|
+
try {
|
|
53
|
+
// music-metadata accepts a Buffer or Uint8Array; we already have
|
|
54
|
+
// the bytes from the preprocess pass.
|
|
55
|
+
const meta = await parseBuffer(input.bytes, { mimeType: input.mime, size: input.bytes.byteLength }, {
|
|
56
|
+
skipPostHeaders: true,
|
|
57
|
+
});
|
|
58
|
+
durationSec = typeof meta.format.duration === 'number' ? meta.format.duration : undefined;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Malformed audio header — bail out with no enrichment. The
|
|
62
|
+
// upload still succeeds (the user's bytes are valid as far as
|
|
63
|
+
// MIME sniffing was concerned); we just couldn't extract a
|
|
64
|
+
// duration. A future stricter mode could throw here.
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
if (durationSec === undefined) {
|
|
68
|
+
// Format supports duration in principle but we couldn't extract.
|
|
69
|
+
// null distinguishes "not applicable" (static image, document)
|
|
70
|
+
// from "applicable but unknown" (corrupt header, streaming OGG
|
|
71
|
+
// without a length).
|
|
72
|
+
return { manifestPatch: { duration: null } };
|
|
73
|
+
}
|
|
74
|
+
// music-metadata returns seconds; manifest stores milliseconds
|
|
75
|
+
// (matching animated-image duration units, where sharp returns ms).
|
|
76
|
+
const durationMs = Math.round(durationSec * 1000);
|
|
77
|
+
return { manifestPatch: { duration: durationMs } };
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=analyze-audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-audio.js","sourceRoot":"","sources":["../../src/assets/analyze-audio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C;;;;GAIG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,YAAY,EAAE,MAAM;IACpB,WAAW;IACX,aAAa;IACb,YAAY;IACZ,cAAc;IACd,WAAW;IACX,YAAY;IACZ,WAAW;IACX,WAAW,EAAE,MAAM;IACnB,aAAa;CACd,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,OAAO;IACb,OAAO,CAAC,IAAI;QACV,OAAO,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,KAAoB;QAChC,IAAI,WAA+B,CAAA;QACnC,IAAI,CAAC;YACH,iEAAiE;YACjE,sCAAsC;YACtC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,KAAK,CAAC,KAAK,EACX,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,EACtD;gBACE,eAAe,EAAE,IAAI;aACtB,CACF,CAAA;YACD,WAAW,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;YAC5D,8DAA8D;YAC9D,2DAA2D;YAC3D,qDAAqD;YACrD,OAAO,EAAE,CAAA;QACX,CAAC;QAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,iEAAiE;YACjE,+DAA+D;YAC/D,+DAA+D;YAC/D,qBAAqB;YACrB,OAAO,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAA;QAC9C,CAAC;QAED,+DAA+D;QAC/D,oEAAoE;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;QACjD,OAAO,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAA;IACpD,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { UploadAnalyzer } from './analyze.js';
|
|
2
|
+
/**
|
|
3
|
+
* Static-image analyzer — width + height. Runs for any `image/*`
|
|
4
|
+
* MIME except SVG (which has its own dimension path; libvips
|
|
5
|
+
* sometimes mis-reports vector content).
|
|
6
|
+
*/
|
|
7
|
+
export declare const staticImageAnalyzer: UploadAnalyzer;
|
|
8
|
+
/**
|
|
9
|
+
* Animated-image analyzer — `pages > 1` detection, frame count,
|
|
10
|
+
* duration sum, and first-frame poster extraction.
|
|
11
|
+
*
|
|
12
|
+
* Per design-media.md: animated images render as `<img>` in v1
|
|
13
|
+
* (no `<video>` transcoding — that requires ffmpeg). The poster
|
|
14
|
+
* is provided so future UI layers (lazy-load, video-style poster
|
|
15
|
+
* fallback) can use it; v1 templates can also render the poster
|
|
16
|
+
* for reduced-motion preferences.
|
|
17
|
+
*/
|
|
18
|
+
export declare const animatedImageAnalyzer: UploadAnalyzer;
|
|
19
|
+
//# sourceMappingURL=analyze-image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-image.d.ts","sourceRoot":"","sources":["../../src/assets/analyze-image.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAiC,cAAc,EAAE,MAAM,cAAc,CAAA;AASjF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,cAkBjC,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,cA4DnC,CAAA"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image analyzers — read final bytes, contribute manifest fields
|
|
3
|
+
* (and a poster file for animated content). Two analyzers behind
|
|
4
|
+
* the abstraction:
|
|
5
|
+
*
|
|
6
|
+
* - `staticImageAnalyzer` — extracts width + height for any image
|
|
7
|
+
* MIME. Always runs. Animated images also produce dimensions
|
|
8
|
+
* (the canvas size); they get the same width/height treatment.
|
|
9
|
+
* - `animatedImageAnalyzer` — runs for formats that can carry
|
|
10
|
+
* animation (GIF, APNG, animated WebP, animated AVIF). Reads
|
|
11
|
+
* `pages` + `delay[]` from sharp's metadata, sets
|
|
12
|
+
* `animated/frames/duration`, extracts the first frame as a
|
|
13
|
+
* poster PNG.
|
|
14
|
+
*
|
|
15
|
+
* Both analyzers are sharp-backed. SVG bypasses (no analyzer matches
|
|
16
|
+
* `image/svg+xml`) — sharp can metadata SVG via libvips, but the
|
|
17
|
+
* sanitizer-modified bytes are what we want characterized, and the
|
|
18
|
+
* existing inline `extractImageDimensions` already handles SVG dims
|
|
19
|
+
* correctly inside ingest. Kept separate for now; SVG could move into
|
|
20
|
+
* an analyzer when the dimension-extraction call site changes.
|
|
21
|
+
*/
|
|
22
|
+
import sharp from 'sharp';
|
|
23
|
+
const ANIMATED_MIMES = new Set([
|
|
24
|
+
'image/gif',
|
|
25
|
+
'image/png', // APNG; sharp surfaces pages > 1 when animated
|
|
26
|
+
'image/webp', // animated WebP
|
|
27
|
+
'image/avif', // animated AVIF
|
|
28
|
+
]);
|
|
29
|
+
/**
|
|
30
|
+
* Static-image analyzer — width + height. Runs for any `image/*`
|
|
31
|
+
* MIME except SVG (which has its own dimension path; libvips
|
|
32
|
+
* sometimes mis-reports vector content).
|
|
33
|
+
*/
|
|
34
|
+
export const staticImageAnalyzer = {
|
|
35
|
+
name: 'static-image',
|
|
36
|
+
matches(mime) {
|
|
37
|
+
return !!mime && mime.startsWith('image/') && mime !== 'image/svg+xml';
|
|
38
|
+
},
|
|
39
|
+
async analyze(input) {
|
|
40
|
+
try {
|
|
41
|
+
const meta = await sharp(input.bytes).metadata();
|
|
42
|
+
const width = typeof meta.width === 'number' ? meta.width : null;
|
|
43
|
+
const height = typeof meta.height === 'number' ? meta.height : null;
|
|
44
|
+
return { manifestPatch: { width, height } };
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// sharp couldn't decode — return null dims so downstream code
|
|
48
|
+
// doesn't break. This isn't a hard error: a bad image will fail
|
|
49
|
+
// variant generation later with a more specific message.
|
|
50
|
+
return { manifestPatch: { width: null, height: null } };
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Animated-image analyzer — `pages > 1` detection, frame count,
|
|
56
|
+
* duration sum, and first-frame poster extraction.
|
|
57
|
+
*
|
|
58
|
+
* Per design-media.md: animated images render as `<img>` in v1
|
|
59
|
+
* (no `<video>` transcoding — that requires ffmpeg). The poster
|
|
60
|
+
* is provided so future UI layers (lazy-load, video-style poster
|
|
61
|
+
* fallback) can use it; v1 templates can also render the poster
|
|
62
|
+
* for reduced-motion preferences.
|
|
63
|
+
*/
|
|
64
|
+
export const animatedImageAnalyzer = {
|
|
65
|
+
name: 'animated-image',
|
|
66
|
+
matches(mime) {
|
|
67
|
+
return !!mime && ANIMATED_MIMES.has(mime);
|
|
68
|
+
},
|
|
69
|
+
async analyze(input) {
|
|
70
|
+
let pages;
|
|
71
|
+
let delays;
|
|
72
|
+
try {
|
|
73
|
+
const meta = await sharp(input.bytes).metadata();
|
|
74
|
+
pages = typeof meta.pages === 'number' ? meta.pages : undefined;
|
|
75
|
+
// sharp returns delay as `number[]` per frame in milliseconds when
|
|
76
|
+
// animated (some encoders use 0 for "use default" — tolerate).
|
|
77
|
+
delays = Array.isArray(meta.delay) ? meta.delay : undefined;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// sharp couldn't decode — bail out. Static-image analyzer will
|
|
81
|
+
// also fail and we'll fall through with no manifest patch.
|
|
82
|
+
return {};
|
|
83
|
+
}
|
|
84
|
+
// Static (single-frame) — nothing to contribute. The static
|
|
85
|
+
// analyzer already sets width/height; this analyzer skips when
|
|
86
|
+
// there's no animation to describe.
|
|
87
|
+
if (!pages || pages <= 1)
|
|
88
|
+
return {};
|
|
89
|
+
// Animated. Compute total duration (sum of frame delays).
|
|
90
|
+
const duration = delays ? delays.reduce((sum, d) => sum + d, 0) : null;
|
|
91
|
+
const frames = pages;
|
|
92
|
+
// Extract first frame as a PNG poster. PNG keeps alpha lossless;
|
|
93
|
+
// for solid-frame GIFs the size penalty over JPEG is worth the
|
|
94
|
+
// simplicity (no quality knob to tune at this layer).
|
|
95
|
+
let posterBytes;
|
|
96
|
+
try {
|
|
97
|
+
const buf = await sharp(input.bytes, { page: 0 }).png().toBuffer();
|
|
98
|
+
posterBytes = new Uint8Array(buf);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Poster extraction failed — return manifest fields without
|
|
102
|
+
// poster. Better partial enrichment than zero enrichment.
|
|
103
|
+
return {
|
|
104
|
+
manifestPatch: { animated: true, frames, duration, poster: null },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Path is content-addressed alongside the source asset:
|
|
108
|
+
// {name}-{hash}-poster.png. Same-pattern as the variant ladder so
|
|
109
|
+
// delete/rename/path-enumeration logic finds them via filename
|
|
110
|
+
// glob without special-casing.
|
|
111
|
+
const posterPath = `${input.assetName}-${input.hash}-poster.png`;
|
|
112
|
+
return {
|
|
113
|
+
manifestPatch: {
|
|
114
|
+
animated: true,
|
|
115
|
+
frames,
|
|
116
|
+
duration,
|
|
117
|
+
poster: posterPath,
|
|
118
|
+
},
|
|
119
|
+
supplementaryFiles: [{ path: posterPath, bytes: posterBytes }],
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=analyze-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-image.js","sourceRoot":"","sources":["../../src/assets/analyze-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest fields an analyzer is allowed to set. Subset of
|
|
3
|
+
* `AssetManifest` — analyzers can't change identity (`name`, `kind`,
|
|
4
|
+
* `source`, `mime`, `hash`, `size`) or audit (`uploadedAt`,
|
|
5
|
+
* `uploadedBy`). They contribute *characterization* fields:
|
|
6
|
+
* dimensions, animation flags, duration, poster URL, focal point if
|
|
7
|
+
* extractable from EXIF, etc.
|
|
8
|
+
*
|
|
9
|
+
* Listed explicitly (rather than `Partial<AssetManifest>`) so the
|
|
10
|
+
* type system catches an analyzer that tries to override identity
|
|
11
|
+
* fields by accident.
|
|
12
|
+
*/
|
|
13
|
+
export interface ManifestEnrichment {
|
|
14
|
+
/** Width in pixels — null for non-image formats. */
|
|
15
|
+
width?: number | null;
|
|
16
|
+
/** Height in pixels — null for non-image formats. */
|
|
17
|
+
height?: number | null;
|
|
18
|
+
/** Multi-frame indicator (GIF, APNG, animated WebP/AVIF). */
|
|
19
|
+
animated?: boolean;
|
|
20
|
+
/** Frame count for animated content (≥ 1). */
|
|
21
|
+
frames?: number;
|
|
22
|
+
/** Duration in milliseconds — animated images, video, audio. */
|
|
23
|
+
duration?: number | null;
|
|
24
|
+
/** Relative path to the poster bytes (under assetsRoot). */
|
|
25
|
+
poster?: string | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A supplementary file the analyzer wants written alongside the
|
|
29
|
+
* primary asset bytes (and in the manifest's enrichment, where
|
|
30
|
+
* relevant via `poster`/etc. paths). The runner adds these to the
|
|
31
|
+
* write plan so they participate in atomic-rollback.
|
|
32
|
+
*/
|
|
33
|
+
export interface SupplementaryFile {
|
|
34
|
+
/** Path relative to `assetsRoot` — e.g. `hero-{hash}-poster.png`. */
|
|
35
|
+
path: string;
|
|
36
|
+
/** Bytes to write. */
|
|
37
|
+
bytes: Uint8Array;
|
|
38
|
+
}
|
|
39
|
+
export interface AnalysisResult {
|
|
40
|
+
/**
|
|
41
|
+
* Fields to merge into the manifest. The runner validates that no
|
|
42
|
+
* forbidden field is set; analyzers that try to set identity
|
|
43
|
+
* fields are rejected at the type level (the interface excludes
|
|
44
|
+
* them).
|
|
45
|
+
*/
|
|
46
|
+
manifestPatch?: ManifestEnrichment;
|
|
47
|
+
/** Supplementary byte files to write. */
|
|
48
|
+
supplementaryFiles?: readonly SupplementaryFile[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* One format's analysis contract. Implementations are async (sharp
|
|
52
|
+
* I/O is async) but otherwise pure — no storage access, no manifest
|
|
53
|
+
* writing, no logging. The runner orchestrates side effects.
|
|
54
|
+
*
|
|
55
|
+
* `assetName` and `hash` are passed in so analyzers that produce
|
|
56
|
+
* supplementary files can name them deterministically (e.g.
|
|
57
|
+
* `{name}-{hash}-poster.png`).
|
|
58
|
+
*/
|
|
59
|
+
export interface UploadAnalyzer {
|
|
60
|
+
/** Stable identifier for diagnostics (`'animated-image'`, `'audio'`). */
|
|
61
|
+
readonly name: string;
|
|
62
|
+
/** Whether this analyzer applies to the given MIME. */
|
|
63
|
+
matches(mime: string | null): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Read the bytes; return manifest enrichment + supplementary files.
|
|
66
|
+
* Throw on malformed input — runner wraps in a typed error.
|
|
67
|
+
*/
|
|
68
|
+
analyze(input: AnalyzerInput): Promise<AnalysisResult>;
|
|
69
|
+
}
|
|
70
|
+
export interface AnalyzerInput {
|
|
71
|
+
/** Final, post-preprocess bytes. */
|
|
72
|
+
bytes: Uint8Array;
|
|
73
|
+
/** Asset name (canonical, no extension). For supplementary file paths. */
|
|
74
|
+
assetName: string;
|
|
75
|
+
/** Asset hash. For supplementary file paths. */
|
|
76
|
+
hash: string;
|
|
77
|
+
/** Source extension (`jpg`, `png`, `gif`, ...). For format-specific decisions. */
|
|
78
|
+
ext: string;
|
|
79
|
+
/** Sniffed MIME — analyzers don't need to re-sniff. */
|
|
80
|
+
mime: string;
|
|
81
|
+
}
|
|
82
|
+
export declare const defaultAnalyzers: readonly UploadAnalyzer[];
|
|
83
|
+
/**
|
|
84
|
+
* Run the matching analyzer(s) for the given MIME. Returns the
|
|
85
|
+
* merged enrichment + flattened supplementary files. Pass-through
|
|
86
|
+
* (no enrichment, no extras) when no analyzer matches.
|
|
87
|
+
*
|
|
88
|
+
* Multiple analyzers matching the same MIME is allowed — results
|
|
89
|
+
* are merged (later wins on field conflicts; supplementary files
|
|
90
|
+
* concatenate). v1 exercises this for animated images: both static
|
|
91
|
+
* and animated analyzers run.
|
|
92
|
+
*/
|
|
93
|
+
export declare function runAnalyzers(input: AnalyzerInput, analyzers?: readonly UploadAnalyzer[]): Promise<AnalysisResult>;
|
|
94
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/assets/analyze.ts"],"names":[],"mappings":"AA0CA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,sBAAsB;IACtB,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAA;IAClC,yCAAyC;IACzC,kBAAkB,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAClD;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uDAAuD;IACvD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAA;IACrC;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACvD;AAED,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,KAAK,EAAE,UAAU,CAAA;IACjB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAA;IACX,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAA;CACb;AAiBD,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAAgE,CAAA;AAEtH;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,aAAa,EACpB,SAAS,GAAE,SAAS,cAAc,EAAqB,GACtD,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default analyzer registry — what ingest uses out of the box.
|
|
3
|
+
* Order matters when more than one matches; analyzer results
|
|
4
|
+
* later in the list win on field conflicts. Today's order:
|
|
5
|
+
* 1. `staticImageAnalyzer` — width/height for all images except SVG
|
|
6
|
+
* 2. `animatedImageAnalyzer` — multi-frame detection + poster
|
|
7
|
+
* 3. `audioAnalyzer` — duration via music-metadata
|
|
8
|
+
*
|
|
9
|
+
* Both image analyzers run for animated images (static contributes
|
|
10
|
+
* canvas dimensions, animated contributes animation flags + poster).
|
|
11
|
+
* Audio MIMEs trigger only the audio analyzer.
|
|
12
|
+
*/
|
|
13
|
+
import { animatedImageAnalyzer, staticImageAnalyzer } from './analyze-image.js';
|
|
14
|
+
import { audioAnalyzer } from './analyze-audio.js';
|
|
15
|
+
export const defaultAnalyzers = [staticImageAnalyzer, animatedImageAnalyzer, audioAnalyzer];
|
|
16
|
+
/**
|
|
17
|
+
* Run the matching analyzer(s) for the given MIME. Returns the
|
|
18
|
+
* merged enrichment + flattened supplementary files. Pass-through
|
|
19
|
+
* (no enrichment, no extras) when no analyzer matches.
|
|
20
|
+
*
|
|
21
|
+
* Multiple analyzers matching the same MIME is allowed — results
|
|
22
|
+
* are merged (later wins on field conflicts; supplementary files
|
|
23
|
+
* concatenate). v1 exercises this for animated images: both static
|
|
24
|
+
* and animated analyzers run.
|
|
25
|
+
*/
|
|
26
|
+
export async function runAnalyzers(input, analyzers = defaultAnalyzers) {
|
|
27
|
+
let manifestPatch;
|
|
28
|
+
const supplementaryFiles = [];
|
|
29
|
+
for (const analyzer of analyzers) {
|
|
30
|
+
if (!analyzer.matches(input.mime))
|
|
31
|
+
continue;
|
|
32
|
+
const result = await analyzer.analyze(input);
|
|
33
|
+
if (result.manifestPatch) {
|
|
34
|
+
manifestPatch = { ...manifestPatch, ...result.manifestPatch };
|
|
35
|
+
}
|
|
36
|
+
if (result.supplementaryFiles) {
|
|
37
|
+
supplementaryFiles.push(...result.supplementaryFiles);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
manifestPatch,
|
|
42
|
+
supplementaryFiles: supplementaryFiles.length > 0 ? supplementaryFiles : undefined,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/assets/analyze.ts"],"names":[],"mappings":"AAgIA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAA8B,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,aAAa,CAAC,CAAA;AAEtH;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAoB,EACpB,YAAuC,gBAAgB;IAEvD,IAAI,aAA6C,CAAA;IACjD,MAAM,kBAAkB,GAAwB,EAAE,CAAA;IAElD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAQ;QAC3C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC5C,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,CAAC,aAAa,EAAE,CAAA;QAC/D,CAAC;QACD,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC9B,kBAAkB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa;QACb,kBAAkB,EAAE,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;KACnF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset-refs binding for the generic dep-sidecars module.
|
|
3
|
+
*
|
|
4
|
+
* Asset-side conveniences over the generic API:
|
|
5
|
+
* - `ASSET_REFS` constant fixes the dep-sidecar relation kind for
|
|
6
|
+
* callers (so they don't need to know "the asset-refs root is named
|
|
7
|
+
* `asset-refs`").
|
|
8
|
+
* - `itemRefToAssetRef` reconstructs an `AssetRef` (the schema/types
|
|
9
|
+
* shape used in 409 delete-blocking responses) from the sidecar's
|
|
10
|
+
* `ItemRef`. Sidecars don't carry `componentPath`; we synthesize
|
|
11
|
+
* null and let callers re-read manifests for breadcrumb display.
|
|
12
|
+
*/
|
|
13
|
+
import type { ContentRoot } from '../content-root.js';
|
|
14
|
+
import { type DepRelation, type ItemRef, type ManifestLike } from '../dep-sidecars.js';
|
|
15
|
+
import type { AssetRef } from './refs.js';
|
|
16
|
+
/** The asset-refs relation: extract `_asset` references from a manifest. */
|
|
17
|
+
export declare const ASSET_REFS: DepRelation;
|
|
18
|
+
/** Convert an `ItemRef` to the `AssetRef` shape used by delete.ts and 409 responses. */
|
|
19
|
+
export declare function itemRefToAssetRef(item: ItemRef): AssetRef;
|
|
20
|
+
/** Read every item that references this asset. Thin wrapper around `readDepsFor`. */
|
|
21
|
+
export declare function readRefsForAsset(contentRoot: ContentRoot, assetName: string): Promise<ItemRef[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Apply asset-refs diff for one item's manifest change. Thin wrapper
|
|
24
|
+
* around `rebuildItemDeps` with the asset-refs relation pre-bound.
|
|
25
|
+
*/
|
|
26
|
+
export declare function rebuildAssetRefs(contentRoot: ContentRoot, item: ItemRef, oldManifest: ManifestLike | null, newManifest: ManifestLike | null): Promise<void>;
|
|
27
|
+
/** Apply a pre-computed diff (used in tests + cases where caller has the sets already). */
|
|
28
|
+
export declare function applyAssetRefsDiff(contentRoot: ContentRoot, item: ItemRef, oldAssets: ReadonlySet<string>, newAssets: ReadonlySet<string>): Promise<void>;
|
|
29
|
+
export { applyDepDiff, filenameToItemRef, itemRefToFilename, type DepRelation, type ItemRef, } from '../dep-sidecars.js';
|
|
30
|
+
//# sourceMappingURL=asset-deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-deps.d.ts","sourceRoot":"","sources":["../../src/assets/asset-deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,YAAY,EAIlB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAGzC,4EAA4E;AAC5E,eAAO,MAAM,UAAU,EAAE,WAKxB,CAAA;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAYzD;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAEhG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,YAAY,GAAG,IAAI,EAChC,WAAW,EAAE,YAAY,GAAG,IAAI,GAC/B,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAC9B,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAEf;AAID,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,OAAO,GACb,MAAM,oBAAoB,CAAA"}
|