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.
Files changed (340) hide show
  1. package/admin-dist/assets/index-BO9-CXmW.css +1 -0
  2. package/admin-dist/assets/index-Ufu8zZH_.js +668 -0
  3. package/admin-dist/index.html +2 -2
  4. package/dist/admin-api/error-response.d.ts +21 -0
  5. package/dist/admin-api/error-response.d.ts.map +1 -0
  6. package/dist/admin-api/error-response.js +12 -0
  7. package/dist/admin-api/error-response.js.map +1 -0
  8. package/dist/admin-api/index.d.ts +0 -2
  9. package/dist/admin-api/index.d.ts.map +1 -1
  10. package/dist/admin-api/index.js +4 -24
  11. package/dist/admin-api/index.js.map +1 -1
  12. package/dist/admin-api/routes/assets.d.ts +16 -0
  13. package/dist/admin-api/routes/assets.d.ts.map +1 -0
  14. package/dist/admin-api/routes/assets.js +433 -0
  15. package/dist/admin-api/routes/assets.js.map +1 -0
  16. package/dist/admin-api/routes/fragments.d.ts.map +1 -1
  17. package/dist/admin-api/routes/fragments.js +30 -4
  18. package/dist/admin-api/routes/fragments.js.map +1 -1
  19. package/dist/admin-api/routes/pages.d.ts.map +1 -1
  20. package/dist/admin-api/routes/pages.js +37 -4
  21. package/dist/admin-api/routes/pages.js.map +1 -1
  22. package/dist/admin-api/routes/publish.d.ts.map +1 -1
  23. package/dist/admin-api/routes/publish.js +68 -35
  24. package/dist/admin-api/routes/publish.js.map +1 -1
  25. package/dist/admin-api/schemas/assets.d.ts +48 -0
  26. package/dist/admin-api/schemas/assets.d.ts.map +1 -0
  27. package/dist/admin-api/schemas/assets.js +44 -0
  28. package/dist/admin-api/schemas/assets.js.map +1 -0
  29. package/dist/admin-api/schemas/index.d.ts +2 -0
  30. package/dist/admin-api/schemas/index.d.ts.map +1 -1
  31. package/dist/admin-api/schemas/index.js +2 -0
  32. package/dist/admin-api/schemas/index.js.map +1 -1
  33. package/dist/admin-api/source-context.d.ts +0 -7
  34. package/dist/admin-api/source-context.d.ts.map +1 -1
  35. package/dist/admin-api/source-context.js +0 -3
  36. package/dist/admin-api/source-context.js.map +1 -1
  37. package/dist/assets/analyze-audio.d.ts +3 -0
  38. package/dist/assets/analyze-audio.d.ts.map +1 -0
  39. package/dist/assets/analyze-audio.js +80 -0
  40. package/dist/assets/analyze-audio.js.map +1 -0
  41. package/dist/assets/analyze-image.d.ts +19 -0
  42. package/dist/assets/analyze-image.d.ts.map +1 -0
  43. package/dist/assets/analyze-image.js +123 -0
  44. package/dist/assets/analyze-image.js.map +1 -0
  45. package/dist/assets/analyze.d.ts +94 -0
  46. package/dist/assets/analyze.d.ts.map +1 -0
  47. package/dist/assets/analyze.js +45 -0
  48. package/dist/assets/analyze.js.map +1 -0
  49. package/dist/assets/asset-deps.d.ts +30 -0
  50. package/dist/assets/asset-deps.d.ts.map +1 -0
  51. package/dist/assets/asset-deps.js +42 -0
  52. package/dist/assets/asset-deps.js.map +1 -0
  53. package/dist/assets/asset-paths.d.ts +155 -0
  54. package/dist/assets/asset-paths.d.ts.map +1 -0
  55. package/dist/assets/asset-paths.js +197 -0
  56. package/dist/assets/asset-paths.js.map +1 -0
  57. package/dist/assets/delete.d.ts +75 -0
  58. package/dist/assets/delete.d.ts.map +1 -0
  59. package/dist/assets/delete.js +82 -0
  60. package/dist/assets/delete.js.map +1 -0
  61. package/dist/assets/errors.d.ts +241 -0
  62. package/dist/assets/errors.d.ts.map +1 -0
  63. package/dist/assets/errors.js +300 -0
  64. package/dist/assets/errors.js.map +1 -0
  65. package/dist/assets/find-refs.d.ts +37 -0
  66. package/dist/assets/find-refs.d.ts.map +1 -0
  67. package/dist/assets/find-refs.js +35 -0
  68. package/dist/assets/find-refs.js.map +1 -0
  69. package/dist/assets/hash.d.ts +13 -0
  70. package/dist/assets/hash.d.ts.map +1 -0
  71. package/dist/assets/hash.js +43 -0
  72. package/dist/assets/hash.js.map +1 -0
  73. package/dist/assets/image-metadata.d.ts +11 -0
  74. package/dist/assets/image-metadata.d.ts.map +1 -0
  75. package/dist/assets/image-metadata.js +31 -0
  76. package/dist/assets/image-metadata.js.map +1 -0
  77. package/dist/assets/ingest-locale.d.ts +86 -0
  78. package/dist/assets/ingest-locale.d.ts.map +1 -0
  79. package/dist/assets/ingest-locale.js +209 -0
  80. package/dist/assets/ingest-locale.js.map +1 -0
  81. package/dist/assets/ingest.d.ts +96 -0
  82. package/dist/assets/ingest.d.ts.map +1 -0
  83. package/dist/assets/ingest.js +308 -0
  84. package/dist/assets/ingest.js.map +1 -0
  85. package/dist/assets/kind-compat.d.ts +34 -0
  86. package/dist/assets/kind-compat.d.ts.map +1 -0
  87. package/dist/assets/kind-compat.js +33 -0
  88. package/dist/assets/kind-compat.js.map +1 -0
  89. package/dist/assets/list.d.ts +46 -0
  90. package/dist/assets/list.d.ts.map +1 -0
  91. package/dist/assets/list.js +102 -0
  92. package/dist/assets/list.js.map +1 -0
  93. package/dist/assets/manifest-default.d.ts +56 -0
  94. package/dist/assets/manifest-default.d.ts.map +1 -0
  95. package/dist/assets/manifest-default.js +120 -0
  96. package/dist/assets/manifest-default.js.map +1 -0
  97. package/dist/assets/manifest-filename.d.ts +52 -0
  98. package/dist/assets/manifest-filename.d.ts.map +1 -0
  99. package/dist/assets/manifest-filename.js +104 -0
  100. package/dist/assets/manifest-filename.js.map +1 -0
  101. package/dist/assets/manifest-locale.d.ts +60 -0
  102. package/dist/assets/manifest-locale.d.ts.map +1 -0
  103. package/dist/assets/manifest-locale.js +206 -0
  104. package/dist/assets/manifest-locale.js.map +1 -0
  105. package/dist/assets/manifest-merge.d.ts +66 -0
  106. package/dist/assets/manifest-merge.d.ts.map +1 -0
  107. package/dist/assets/manifest-merge.js +82 -0
  108. package/dist/assets/manifest-merge.js.map +1 -0
  109. package/dist/assets/manifest.d.ts +83 -0
  110. package/dist/assets/manifest.d.ts.map +1 -0
  111. package/dist/assets/manifest.js +93 -0
  112. package/dist/assets/manifest.js.map +1 -0
  113. package/dist/assets/mime-sniff.d.ts +18 -0
  114. package/dist/assets/mime-sniff.d.ts.map +1 -0
  115. package/dist/assets/mime-sniff.js +84 -0
  116. package/dist/assets/mime-sniff.js.map +1 -0
  117. package/dist/assets/preprocess-svg.d.ts +3 -0
  118. package/dist/assets/preprocess-svg.d.ts.map +1 -0
  119. package/dist/assets/preprocess-svg.js +49 -0
  120. package/dist/assets/preprocess-svg.js.map +1 -0
  121. package/dist/assets/preprocess.d.ts +62 -0
  122. package/dist/assets/preprocess.d.ts.map +1 -0
  123. package/dist/assets/preprocess.js +86 -0
  124. package/dist/assets/preprocess.js.map +1 -0
  125. package/dist/assets/publish-plan.d.ts +41 -0
  126. package/dist/assets/publish-plan.d.ts.map +1 -0
  127. package/dist/assets/publish-plan.js +49 -0
  128. package/dist/assets/publish-plan.js.map +1 -0
  129. package/dist/assets/publish.d.ts +33 -0
  130. package/dist/assets/publish.d.ts.map +1 -0
  131. package/dist/assets/publish.js +81 -0
  132. package/dist/assets/publish.js.map +1 -0
  133. package/dist/assets/refs.d.ts +37 -0
  134. package/dist/assets/refs.d.ts.map +1 -0
  135. package/dist/assets/refs.js +33 -0
  136. package/dist/assets/refs.js.map +1 -0
  137. package/dist/assets/remove-override.d.ts +42 -0
  138. package/dist/assets/remove-override.d.ts.map +1 -0
  139. package/dist/assets/remove-override.js +53 -0
  140. package/dist/assets/remove-override.js.map +1 -0
  141. package/dist/assets/rename.d.ts +43 -0
  142. package/dist/assets/rename.d.ts.map +1 -0
  143. package/dist/assets/rename.js +271 -0
  144. package/dist/assets/rename.js.map +1 -0
  145. package/dist/assets/replace.d.ts +37 -0
  146. package/dist/assets/replace.d.ts.map +1 -0
  147. package/dist/assets/replace.js +195 -0
  148. package/dist/assets/replace.js.map +1 -0
  149. package/dist/assets/resolve.d.ts +141 -0
  150. package/dist/assets/resolve.d.ts.map +1 -0
  151. package/dist/assets/resolve.js +381 -0
  152. package/dist/assets/resolve.js.map +1 -0
  153. package/dist/assets/rewrite-manifest-asset-ref.d.ts +44 -0
  154. package/dist/assets/rewrite-manifest-asset-ref.d.ts.map +1 -0
  155. package/dist/assets/rewrite-manifest-asset-ref.js +51 -0
  156. package/dist/assets/rewrite-manifest-asset-ref.js.map +1 -0
  157. package/dist/assets/scan-manifest-for-asset.d.ts +63 -0
  158. package/dist/assets/scan-manifest-for-asset.d.ts.map +1 -0
  159. package/dist/assets/scan-manifest-for-asset.js +105 -0
  160. package/dist/assets/scan-manifest-for-asset.js.map +1 -0
  161. package/dist/assets/serve-route.d.ts +45 -0
  162. package/dist/assets/serve-route.d.ts.map +1 -0
  163. package/dist/assets/serve-route.js +123 -0
  164. package/dist/assets/serve-route.js.map +1 -0
  165. package/dist/assets/svg-sanitize.d.ts +38 -0
  166. package/dist/assets/svg-sanitize.d.ts.map +1 -0
  167. package/dist/assets/svg-sanitize.js +209 -0
  168. package/dist/assets/svg-sanitize.js.map +1 -0
  169. package/dist/assets/update-metadata.d.ts +61 -0
  170. package/dist/assets/update-metadata.d.ts.map +1 -0
  171. package/dist/assets/update-metadata.js +82 -0
  172. package/dist/assets/update-metadata.js.map +1 -0
  173. package/dist/assets/url.d.ts +82 -0
  174. package/dist/assets/url.d.ts.map +1 -0
  175. package/dist/assets/url.js +103 -0
  176. package/dist/assets/url.js.map +1 -0
  177. package/dist/assets/validate.d.ts +74 -0
  178. package/dist/assets/validate.d.ts.map +1 -0
  179. package/dist/assets/validate.js +136 -0
  180. package/dist/assets/validate.js.map +1 -0
  181. package/dist/assets/variants.d.ts +23 -0
  182. package/dist/assets/variants.d.ts.map +1 -0
  183. package/dist/assets/variants.js +74 -0
  184. package/dist/assets/variants.js.map +1 -0
  185. package/dist/cli/assets-cli.d.ts +58 -0
  186. package/dist/cli/assets-cli.d.ts.map +1 -0
  187. package/dist/cli/assets-cli.js +233 -0
  188. package/dist/cli/assets-cli.js.map +1 -0
  189. package/dist/cli/assets-display.d.ts +112 -0
  190. package/dist/cli/assets-display.d.ts.map +1 -0
  191. package/dist/cli/assets-display.js +106 -0
  192. package/dist/cli/assets-display.js.map +1 -0
  193. package/dist/cli/bootstrap.d.ts +0 -2
  194. package/dist/cli/bootstrap.d.ts.map +1 -1
  195. package/dist/cli/bootstrap.js +0 -1
  196. package/dist/cli/bootstrap.js.map +1 -1
  197. package/dist/cli/index.js +64 -18
  198. package/dist/cli/index.js.map +1 -1
  199. package/dist/compare.d.ts.map +1 -1
  200. package/dist/compare.js +15 -12
  201. package/dist/compare.js.map +1 -1
  202. package/dist/dep-sidecars.d.ts +127 -0
  203. package/dist/dep-sidecars.d.ts.map +1 -0
  204. package/dist/dep-sidecars.js +122 -0
  205. package/dist/dep-sidecars.js.map +1 -0
  206. package/dist/editor/AssetEmbeddedWidget.d.ts +3 -0
  207. package/dist/editor/AssetEmbeddedWidget.d.ts.map +1 -0
  208. package/dist/editor/AssetEmbeddedWidget.js +146 -0
  209. package/dist/editor/AssetEmbeddedWidget.js.map +1 -0
  210. package/dist/editor/mount.d.ts +12 -1
  211. package/dist/editor/mount.d.ts.map +1 -1
  212. package/dist/editor/mount.js +36 -5
  213. package/dist/editor/mount.js.map +1 -1
  214. package/dist/format.d.ts +44 -0
  215. package/dist/format.d.ts.map +1 -0
  216. package/dist/format.js +65 -0
  217. package/dist/format.js.map +1 -0
  218. package/dist/fragment-deps.d.ts +24 -0
  219. package/dist/fragment-deps.d.ts.map +1 -0
  220. package/dist/fragment-deps.js +20 -0
  221. package/dist/fragment-deps.js.map +1 -0
  222. package/dist/hash.d.ts +0 -6
  223. package/dist/hash.d.ts.map +1 -1
  224. package/dist/hash.js +0 -18
  225. package/dist/hash.js.map +1 -1
  226. package/dist/history-provider.d.ts.map +1 -1
  227. package/dist/history-provider.js +30 -8
  228. package/dist/history-provider.js.map +1 -1
  229. package/dist/history-recorder.d.ts +7 -3
  230. package/dist/history-recorder.d.ts.map +1 -1
  231. package/dist/history-recorder.js +9 -1
  232. package/dist/history-recorder.js.map +1 -1
  233. package/dist/history-restorer.d.ts.map +1 -1
  234. package/dist/history-restorer.js +34 -2
  235. package/dist/history-restorer.js.map +1 -1
  236. package/dist/history.d.ts +26 -8
  237. package/dist/history.d.ts.map +1 -1
  238. package/dist/index.d.ts +2 -4
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +1 -2
  241. package/dist/index.js.map +1 -1
  242. package/dist/locale.d.ts +20 -0
  243. package/dist/locale.d.ts.map +1 -1
  244. package/dist/locale.js +38 -0
  245. package/dist/locale.js.map +1 -1
  246. package/dist/providers/_atomic-write.d.ts +9 -0
  247. package/dist/providers/_atomic-write.d.ts.map +1 -0
  248. package/dist/providers/_atomic-write.js +72 -0
  249. package/dist/providers/_atomic-write.js.map +1 -0
  250. package/dist/providers/_rm-ignore-missing.d.ts +31 -0
  251. package/dist/providers/_rm-ignore-missing.d.ts.map +1 -0
  252. package/dist/providers/_rm-ignore-missing.js +12 -0
  253. package/dist/providers/_rm-ignore-missing.js.map +1 -0
  254. package/dist/providers/_stream-interop.d.ts +23 -0
  255. package/dist/providers/_stream-interop.d.ts.map +1 -0
  256. package/dist/providers/_stream-interop.js +21 -0
  257. package/dist/providers/_stream-interop.js.map +1 -0
  258. package/dist/providers/azure-blob.d.ts.map +1 -1
  259. package/dist/providers/azure-blob.js +60 -0
  260. package/dist/providers/azure-blob.js.map +1 -1
  261. package/dist/providers/filesystem.d.ts +4 -0
  262. package/dist/providers/filesystem.d.ts.map +1 -1
  263. package/dist/providers/filesystem.js +63 -2
  264. package/dist/providers/filesystem.js.map +1 -1
  265. package/dist/providers/s3.d.ts.map +1 -1
  266. package/dist/providers/s3.js +84 -1
  267. package/dist/providers/s3.js.map +1 -1
  268. package/dist/publish-rendered.d.ts +37 -17
  269. package/dist/publish-rendered.d.ts.map +1 -1
  270. package/dist/publish-rendered.js +71 -67
  271. package/dist/publish-rendered.js.map +1 -1
  272. package/dist/publish.d.ts +13 -12
  273. package/dist/publish.d.ts.map +1 -1
  274. package/dist/publish.js +23 -47
  275. package/dist/publish.js.map +1 -1
  276. package/dist/resolver.d.ts +12 -2
  277. package/dist/resolver.d.ts.map +1 -1
  278. package/dist/resolver.js +54 -9
  279. package/dist/resolver.js.map +1 -1
  280. package/dist/schema/dimensions.d.ts +78 -0
  281. package/dist/schema/dimensions.d.ts.map +1 -0
  282. package/dist/schema/dimensions.js +97 -0
  283. package/dist/schema/dimensions.js.map +1 -0
  284. package/dist/schema/helpers.d.ts +108 -0
  285. package/dist/schema/helpers.d.ts.map +1 -0
  286. package/dist/schema/helpers.js +133 -0
  287. package/dist/schema/helpers.js.map +1 -0
  288. package/dist/schema/index.d.ts +27 -0
  289. package/dist/schema/index.d.ts.map +1 -0
  290. package/dist/schema/index.js +25 -0
  291. package/dist/schema/index.js.map +1 -0
  292. package/dist/schema/types.d.ts +390 -0
  293. package/dist/schema/types.d.ts.map +1 -0
  294. package/dist/schema/types.js +25 -0
  295. package/dist/schema/types.js.map +1 -0
  296. package/dist/selector-chain.d.ts +63 -0
  297. package/dist/selector-chain.d.ts.map +1 -0
  298. package/dist/selector-chain.js +58 -0
  299. package/dist/selector-chain.js.map +1 -0
  300. package/dist/sidecars.d.ts +19 -18
  301. package/dist/sidecars.d.ts.map +1 -1
  302. package/dist/sidecars.js +70 -62
  303. package/dist/sidecars.js.map +1 -1
  304. package/dist/targets.d.ts.map +1 -1
  305. package/dist/targets.js +15 -37
  306. package/dist/targets.js.map +1 -1
  307. package/dist/themes.d.ts +69 -0
  308. package/dist/themes.d.ts.map +1 -0
  309. package/dist/themes.js +85 -0
  310. package/dist/themes.js.map +1 -0
  311. package/dist/transforms/adapter.d.ts +115 -0
  312. package/dist/transforms/adapter.d.ts.map +1 -0
  313. package/dist/transforms/adapter.js +2 -0
  314. package/dist/transforms/adapter.js.map +1 -0
  315. package/dist/transforms/cloudflare.d.ts +17 -0
  316. package/dist/transforms/cloudflare.d.ts.map +1 -0
  317. package/dist/transforms/cloudflare.js +110 -0
  318. package/dist/transforms/cloudflare.js.map +1 -0
  319. package/dist/transforms/index.d.ts +24 -0
  320. package/dist/transforms/index.d.ts.map +1 -0
  321. package/dist/transforms/index.js +30 -0
  322. package/dist/transforms/index.js.map +1 -0
  323. package/dist/transforms/sharp.d.ts +3 -0
  324. package/dist/transforms/sharp.d.ts.map +1 -0
  325. package/dist/transforms/sharp.js +43 -0
  326. package/dist/transforms/sharp.js.map +1 -0
  327. package/dist/types.d.ts +125 -1
  328. package/dist/types.d.ts.map +1 -1
  329. package/dist/types.js.map +1 -1
  330. package/package.json +20 -1
  331. package/admin-dist/assets/index-B6pVot0Y.css +0 -1
  332. package/admin-dist/assets/index-DniLwxJA.js +0 -609
  333. package/dist/providers/r2.d.ts +0 -8
  334. package/dist/providers/r2.d.ts.map +0 -1
  335. package/dist/providers/r2.js +0 -86
  336. package/dist/providers/r2.js.map +0 -1
  337. package/dist/source-sidecars.d.ts +0 -32
  338. package/dist/source-sidecars.d.ts.map +0 -1
  339. package/dist/source-sidecars.js +0 -98
  340. 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;;;;;;;;;;;;;;;;;;;GAmBG;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"}
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;;;;;;;;;;;;;;;;;;;GAmBG;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"}
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":"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"}
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":"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"}
1
+ {"version":3,"file":"source-context.js","sourceRoot":"","sources":["../../src/admin-api/source-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { UploadAnalyzer } from './analyze.js';
2
+ export declare const audioAnalyzer: UploadAnalyzer;
3
+ //# sourceMappingURL=analyze-audio.d.ts.map
@@ -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"}