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,271 @@
1
+ /**
2
+ * Rename an asset.
3
+ *
4
+ * Author-facing semantics (design-media.md → Rename):
5
+ * "Rename `hero` → `banner` is safe-order:
6
+ * 1. Copy bytes + variants to new hashed paths
7
+ * 2. Copy manifest to `banner.asset.json`
8
+ * 3. Rewrite all refs from `hero` → `banner`
9
+ * 4. Delete old manifest `hero.asset.json`
10
+ * 5. Delete old bytes + variants"
11
+ *
12
+ * URLs are always valid during rename — old bytes stay until refs are
13
+ * rewritten. Per design, "Rename rewrites all references. No CMS in
14
+ * our research does this automatically; it's distinctive and deliberate."
15
+ *
16
+ * Single responsibility: policy — "physically relocate the asset and
17
+ * rewrite every reference, or refuse with a structured reason." This
18
+ * module owns:
19
+ * - read source manifest (404 if missing)
20
+ * - reject if `newName` is already taken (409)
21
+ * - copy bytes + variants to new paths
22
+ * - write the new manifest
23
+ * - rewrite every referencing manifest in memory
24
+ * - record ONE history revision spanning all of the above
25
+ * - write the rewritten manifests
26
+ * - update asset-refs sidecars
27
+ * - delete the old asset (manifest + bytes + variants)
28
+ *
29
+ * It does NOT own:
30
+ * - HTTP concerns (the route adapter does)
31
+ * - per-manifest parsing (delegated to site-loader)
32
+ * - history wiring (caller passes the provider)
33
+ */
34
+ import { join } from 'node:path';
35
+ import { createContentRoot } from '../content-root.js';
36
+ import { allFragmentEntries, allPageEntries, loadSite } from '../site-loader.js';
37
+ import { recordWrite } from '../history-recorder.js';
38
+ import { enumerateAssetStoragePaths } from './asset-paths.js';
39
+ import { AssetManifestNotFoundError, AssetNameCollisionError, AssetStorageError } from './errors.js';
40
+ import { rmIgnoreMissing } from '../providers/_rm-ignore-missing.js';
41
+ import { manifestPath, readManifest, writeManifest, assetBytesPath, assetVariantBytesPath } from './manifest.js';
42
+ import { rewriteManifestAssetRef } from './rewrite-manifest-asset-ref.js';
43
+ import { rebuildAssetRefs } from './asset-deps.js';
44
+ import { extFromMime } from './url.js';
45
+ /**
46
+ * Rename `oldName` → `newName`. Throws:
47
+ * - `AssetManifestNotFoundError` — old asset missing
48
+ * - `AssetNameCollisionError` — new name already taken
49
+ * - `AssetMimeUnsupportedError` — old asset's MIME has no extension
50
+ * mapping (misconfiguration; thrown during path enumeration)
51
+ * - `AssetStorageError` — any underlying read/write/rm failure
52
+ */
53
+ export async function renameAsset(input) {
54
+ if (input.oldName === input.newName) {
55
+ return { refsRewritten: 0, manifestsRewritten: 0 };
56
+ }
57
+ // Step 1 — read source manifest. Throws AssetManifestNotFoundError
58
+ // when missing; that bubbles to 404.
59
+ const oldManifest = await readManifest(input.storage, input.assetsRoot, input.oldName);
60
+ // Step 2 — refuse if the destination name is already taken. We
61
+ // probe the manifest path directly rather than calling readManifest
62
+ // (which would throw an error class we'd then suppress).
63
+ const newManifestAbs = `${input.assetsRoot}/${manifestPath(input.newName)}`;
64
+ if (await input.storage.exists(newManifestAbs)) {
65
+ throw new AssetNameCollisionError(input.newName);
66
+ }
67
+ // Step 3 — enumerate source paths and compute the destination paths.
68
+ // Bytes don't change during rename; only the filename does. The hash
69
+ // stays the same, the byte content is identical — hash-in-path means
70
+ // {oldName}-{hash}.jpg → {newName}-{hash}.jpg with the same bytes.
71
+ const oldPaths = await enumerateAssetStoragePaths(input.storage, input.assetsRoot, oldManifest);
72
+ // v1 limitation: rename of an asset with locale/theme overrides is
73
+ // out of scope. The default-only happy path is kept simple; full
74
+ // override-aware rename is tracked as a follow-up (see
75
+ // design-media-implementation.md → "out of v1"). Surface as a typed
76
+ // error so callers can tell the author to remove overrides first.
77
+ if (oldPaths.overrides.length > 0) {
78
+ throw new AssetStorageError('write', oldPaths.defaultManifest, new Error(`Cannot rename "${input.oldName}" — asset has ${oldPaths.overrides.length} locale/theme override(s). Remove overrides before renaming.`));
79
+ }
80
+ const ext = extFromMime(oldManifest.mime);
81
+ if (!ext) {
82
+ // Should not reach here — assetStoragePaths would have thrown
83
+ // AssetMimeUnsupportedError already. Defensive only.
84
+ throw new AssetManifestNotFoundError(input.oldName);
85
+ }
86
+ // Build the new manifest by swapping name + variant paths. Hash, size,
87
+ // dimensions, MIME, alt all carry over unchanged — bytes are identical.
88
+ const newVariants = oldManifest.variants.map(v => ({
89
+ width: v.width,
90
+ path: assetVariantBytesPath(input.newName, oldManifest.hash, ext, v.width),
91
+ size: v.size,
92
+ }));
93
+ const newManifest = {
94
+ ...oldManifest,
95
+ name: input.newName,
96
+ variants: newVariants,
97
+ };
98
+ const newBytesRel = assetBytesPath(input.newName, oldManifest.hash, ext);
99
+ const newBytesAbs = `${input.assetsRoot}/${newBytesRel}`;
100
+ // Step 4 — load the site once, rewrite refs in memory.
101
+ const contentRoot = input.contentRoot ?? createContentRoot(input.storage, input.siteDir);
102
+ const site = await loadSite({ contentRoot, manifest: input.manifest });
103
+ const rewrites = [];
104
+ let refsRewritten = 0;
105
+ for (const { name, page, locale } of allPageEntries(site)) {
106
+ const { manifest: rewritten, rewriteCount } = rewriteManifestAssetRef({
107
+ manifest: page,
108
+ fromAssetName: input.oldName,
109
+ toAssetName: input.newName,
110
+ });
111
+ if (rewriteCount === 0)
112
+ continue;
113
+ refsRewritten += rewriteCount;
114
+ rewrites.push({
115
+ path: localeManifestPath('pages', name, 'page', locale),
116
+ serialized: `${JSON.stringify(stripRuntimeFields(rewritten), null, 2)}\n`,
117
+ oldManifest: page,
118
+ newManifest: rewritten,
119
+ item: locale ? { source: 'page', name, locale } : { source: 'page', name },
120
+ });
121
+ }
122
+ for (const { name, fragment, locale } of allFragmentEntries(site)) {
123
+ const { manifest: rewritten, rewriteCount } = rewriteManifestAssetRef({
124
+ manifest: fragment,
125
+ fromAssetName: input.oldName,
126
+ toAssetName: input.newName,
127
+ });
128
+ if (rewriteCount === 0)
129
+ continue;
130
+ refsRewritten += rewriteCount;
131
+ rewrites.push({
132
+ path: localeManifestPath('fragments', name, 'fragment', locale),
133
+ serialized: `${JSON.stringify(stripRuntimeFields(rewritten), null, 2)}\n`,
134
+ oldManifest: fragment,
135
+ newManifest: rewritten,
136
+ item: locale ? { source: 'fragment', name, locale } : { source: 'fragment', name },
137
+ });
138
+ }
139
+ // Step 5 — read source bytes + variants into memory (single pass).
140
+ // Each provider's `readBytes` returns a Uint8Array; we hold them in
141
+ // memory for both the history revision and the subsequent writes.
142
+ // Variant bytes are bounded by the per-target upload cap × number of
143
+ // variants (4 × 50 MB max = 200 MB worst case for v1; in practice
144
+ // variants are an order of magnitude smaller than the source).
145
+ let primaryBytes;
146
+ try {
147
+ primaryBytes = await input.storage.readBytes(oldPaths.defaultBytes);
148
+ }
149
+ catch (err) {
150
+ throw new AssetStorageError('read', oldPaths.defaultBytes, err);
151
+ }
152
+ const variantBytes = new Map();
153
+ for (let i = 0; i < oldManifest.variants.length; i++) {
154
+ const oldVariantAbs = `${input.assetsRoot}/${oldManifest.variants[i].path}`;
155
+ try {
156
+ variantBytes.set(`${input.assetsRoot}/${newVariants[i].path}`, await input.storage.readBytes(oldVariantAbs));
157
+ }
158
+ catch (err) {
159
+ throw new AssetStorageError('read', oldVariantAbs, err);
160
+ }
161
+ }
162
+ // Step 6 — record history BEFORE any writes. One revision covers:
163
+ // - new manifest at the new path
164
+ // - new bytes at the new path
165
+ // - new variant bytes at the new paths
166
+ // - every rewritten ref-manifest
167
+ // - old manifest, old bytes, old variants as deletions
168
+ if (input.history) {
169
+ const items = [
170
+ // Adds (new locations)
171
+ { path: newManifestAbs, content: `${JSON.stringify(newManifest, null, 2)}\n` },
172
+ { path: newBytesAbs, content: primaryBytes },
173
+ ...newVariants.map(v => ({
174
+ path: `${input.assetsRoot}/${v.path}`,
175
+ content: variantBytes.get(`${input.assetsRoot}/${v.path}`),
176
+ })),
177
+ // Ref rewrites
178
+ ...rewrites.map(r => ({ path: r.path, content: r.serialized })),
179
+ // Removals (old locations)
180
+ { path: oldPaths.defaultManifest, content: null },
181
+ { path: oldPaths.defaultBytes, content: null },
182
+ ...oldPaths.defaultVariants.map(p => ({ path: p, content: null })),
183
+ ];
184
+ await recordWrite({
185
+ history: input.history,
186
+ contentRoot,
187
+ operation: 'save',
188
+ author: input.author,
189
+ items,
190
+ message: `Rename ${input.oldName} → ${input.newName}`,
191
+ });
192
+ }
193
+ // Step 7 — copy bytes + variants to new paths (additive: old paths
194
+ // still exist; no URLs break). Failure here surfaces the underlying
195
+ // storage error; rollback of partial copies is best-effort by
196
+ // letting the caller retry (idempotent: re-copy of identical bytes
197
+ // is fine, and orphan new-bytes from a failed run get cleaned by
198
+ // future GC).
199
+ try {
200
+ await input.storage.writeBytes(newBytesAbs, primaryBytes);
201
+ }
202
+ catch (err) {
203
+ throw new AssetStorageError('write', newBytesAbs, err);
204
+ }
205
+ for (const [path, bytes] of variantBytes) {
206
+ try {
207
+ await input.storage.writeBytes(path, bytes);
208
+ }
209
+ catch (err) {
210
+ throw new AssetStorageError('write', path, err);
211
+ }
212
+ }
213
+ // Step 8 — write the new manifest. This is the "this asset exists
214
+ // under the new name" record. After this point, refs to either
215
+ // {oldName} or {newName} resolve to bytes; we still rewrite refs
216
+ // before deleting old paths so URLs stay valid throughout.
217
+ await writeManifest(input.storage, input.assetsRoot, newManifest);
218
+ // Step 9 — write every rewritten ref-manifest. Best-effort like
219
+ // replace.ts: if any write fails, subsequent writes still attempt
220
+ // (so partial rewrites land), and we surface the first error.
221
+ for (const r of rewrites) {
222
+ const abs = contentRoot.path(r.path);
223
+ try {
224
+ await input.storage.writeFile(abs, r.serialized);
225
+ }
226
+ catch (err) {
227
+ throw new AssetStorageError('write', abs, err);
228
+ }
229
+ }
230
+ // Step 10 — update asset-refs sidecars. For each rewritten manifest,
231
+ // the diff drops `oldName` and adds `newName`, so sidecars move from
232
+ // `.gazetta/asset-refs/{oldName}/{item}` → `.gazetta/asset-refs/
233
+ // {newName}/{item}`. Errors are non-fatal (sidecars are derived state
234
+ // recoverable via reindex CLI).
235
+ await Promise.all(rewrites.map(r => rebuildAssetRefs(contentRoot, r.item, r.oldManifest, r.newManifest).catch(err => {
236
+ // eslint-disable-next-line no-console
237
+ console.warn(`asset-refs sidecar update failed for ${r.path}: ${err.message}`);
238
+ })));
239
+ // Step 11 — delete the old asset. Manifest first means callers who
240
+ // race the rename mid-flight see "asset not found at oldName" rather
241
+ // than "manifest exists but bytes are missing." `assetPathsInRemovalOrder`
242
+ // puts manifests last for a different reason (atomicity during delete);
243
+ // here we want the manifest gone first so the "is it under the old name?"
244
+ // check resolves cleanly. Compose by hand rather than reusing the helper.
245
+ const oldOrderedPaths = [oldPaths.defaultManifest, oldPaths.defaultBytes, ...oldPaths.defaultVariants];
246
+ for (const path of oldOrderedPaths) {
247
+ try {
248
+ await rmIgnoreMissing(input.storage, path);
249
+ }
250
+ catch (err) {
251
+ throw new AssetStorageError('delete', path, err);
252
+ }
253
+ }
254
+ return { refsRewritten, manifestsRewritten: rewrites.length };
255
+ }
256
+ /**
257
+ * `loadSite` decorates page/fragment manifests with a `dir` field for
258
+ * its own bookkeeping. `dir` is not part of the stored manifest JSON,
259
+ * so strip it before serialization. Same helper as in replace.ts —
260
+ * with only two callers, kept inline (3+-callers rule).
261
+ */
262
+ function stripRuntimeFields(manifest) {
263
+ const copy = { ...manifest };
264
+ delete copy.dir;
265
+ return copy;
266
+ }
267
+ function localeManifestPath(root, itemName, baseName, locale) {
268
+ const file = locale ? `${baseName}.${locale}.json` : `${baseName}.json`;
269
+ return join(root, itemName, file);
270
+ }
271
+ //# sourceMappingURL=rename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/assets/rename.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { SiteManifest, StorageProvider } from '../types.js';
2
+ import type { HistoryProvider } from '../history.js';
3
+ export interface ReplaceAssetInput {
4
+ /** Storage holding both the asset and the content tree. */
5
+ storage: StorageProvider;
6
+ /** Path prefix for assets (typically `"assets"`). */
7
+ assetsRoot: string;
8
+ /** Path prefix for site content (where `pages/` and `fragments/` live). */
9
+ siteDir: string;
10
+ /** The asset to remove after refs are redirected. */
11
+ oldName: string;
12
+ /** The asset every ref should point at after the operation. */
13
+ newName: string;
14
+ /** Project-level manifest passed to `loadSite`. */
15
+ manifest?: SiteManifest;
16
+ /** Optional — record one revision covering every manifest rewrite + the delete. */
17
+ history?: HistoryProvider;
18
+ /** Author identifier passed through to the history revision. */
19
+ author?: string;
20
+ }
21
+ export interface ReplaceAssetResult {
22
+ /** How many references were rewritten across all manifests. */
23
+ readonly refsRewritten: number;
24
+ /** How many distinct manifests were touched. */
25
+ readonly manifestsRewritten: number;
26
+ }
27
+ /**
28
+ * Rewrite every reference to `oldName` to point at `newName`, then
29
+ * delete `oldName`. Returns counts on success. Throws:
30
+ * - `AssetManifestNotFoundError` — either asset missing
31
+ * - `AssetKindMismatchError` — kinds/MIME-categories don't align
32
+ * - `AssetMimeUnsupportedError` — old asset's MIME can't be laid out
33
+ * (misconfiguration; thrown during delete-path enumeration)
34
+ * - `AssetStorageError` — any underlying write/rm failure
35
+ */
36
+ export declare function replaceAsset(input: ReplaceAssetInput): Promise<ReplaceAssetResult>;
37
+ //# sourceMappingURL=replace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.d.ts","sourceRoot":"","sources":["../../src/assets/replace.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAqB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAapD,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,OAAO,EAAE,eAAe,CAAA;IACxB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAA;IACf,mDAAmD;IACnD,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,mFAAmF;IACnF,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4IxF"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Replace-and-delete an asset.
3
+ *
4
+ * Author-facing semantics (design-media.md → Delete semantics):
5
+ * "1+ refs, replacement picked → Rewrite all refs to the replacement
6
+ * asset, then delete original."
7
+ *
8
+ * This is the "atomic replace" verb: a single logical operation that
9
+ * rewrites every referencing manifest to point at `newName`, then
10
+ * removes the `oldName` asset. One history revision covers the whole
11
+ * operation so undo reverts it as a unit.
12
+ *
13
+ * Single responsibility: policy — "either rewrite every ref + delete
14
+ * cleanly, or refuse with a structured reason." This module owns:
15
+ * - read both manifests (404 if either missing)
16
+ * - verify kind/MIME compatibility (409 if not)
17
+ * - scan refs (delegates to `find-refs.ts`)
18
+ * - rewrite manifests in memory (delegates to
19
+ * `rewrite-manifest-asset-ref.ts`)
20
+ * - write updated manifests + delete old asset as a batch
21
+ *
22
+ * It does NOT own:
23
+ * - HTTP concerns (the route adapter does)
24
+ * - per-manifest parsing (delegated to site-loader)
25
+ * - history recording (optional; the caller wires it)
26
+ *
27
+ * History atomicity:
28
+ * Per design, "Replace writes one history revision covering all
29
+ * rewritten manifests + the delete." Caller passes a `HistoryProvider`
30
+ * via `history`; this module gathers every written item (rewritten
31
+ * manifests + deleted asset's manifest with `content: null`) and
32
+ * records ONE revision. No history = no revision, operation still
33
+ * succeeds.
34
+ */
35
+ import { join } from 'node:path';
36
+ import { createContentRoot } from '../content-root.js';
37
+ import { allFragmentEntries, allPageEntries, loadSite } from '../site-loader.js';
38
+ import { recordWrite } from '../history-recorder.js';
39
+ import { assetPathsInRemovalOrder, enumerateAssetStoragePaths } from './asset-paths.js';
40
+ import { checkKindCompat } from './kind-compat.js';
41
+ import { AssetKindMismatchError, AssetStorageError } from './errors.js';
42
+ import { rmIgnoreMissing } from '../providers/_rm-ignore-missing.js';
43
+ import { manifestPath, readManifest } from './manifest.js';
44
+ // `manifestPath` is used when composing the deleted-manifest history item.
45
+ import { rewriteManifestAssetRef } from './rewrite-manifest-asset-ref.js';
46
+ import { rebuildAssetRefs } from './asset-deps.js';
47
+ /**
48
+ * Rewrite every reference to `oldName` to point at `newName`, then
49
+ * delete `oldName`. Returns counts on success. Throws:
50
+ * - `AssetManifestNotFoundError` — either asset missing
51
+ * - `AssetKindMismatchError` — kinds/MIME-categories don't align
52
+ * - `AssetMimeUnsupportedError` — old asset's MIME can't be laid out
53
+ * (misconfiguration; thrown during delete-path enumeration)
54
+ * - `AssetStorageError` — any underlying write/rm failure
55
+ */
56
+ export async function replaceAsset(input) {
57
+ // Step 1 — fetch both manifests. Throws AssetManifestNotFoundError
58
+ // from readManifest when either is missing; that bubbles to 404.
59
+ const [oldManifest, newManifest] = await Promise.all([
60
+ readManifest(input.storage, input.assetsRoot, input.oldName),
61
+ readManifest(input.storage, input.assetsRoot, input.newName),
62
+ ]);
63
+ // Step 2 — compatibility gate (design-media.md).
64
+ const compat = checkKindCompat(oldManifest, newManifest);
65
+ if (!compat.compatible) {
66
+ throw new AssetKindMismatchError(compat.oldKind, compat.oldMimeCategory, compat.newKind, compat.newMimeCategory);
67
+ }
68
+ // Step 3 — load the site once, iterate every manifest, rewrite refs.
69
+ // Keep rewrites in memory so we can bundle them into one history
70
+ // revision and write atomically as a group.
71
+ const contentRoot = createContentRoot(input.storage, input.siteDir);
72
+ const site = await loadSite({ contentRoot, manifest: input.manifest });
73
+ const rewrites = [];
74
+ let refsRewritten = 0;
75
+ for (const { name, page, locale } of allPageEntries(site)) {
76
+ const { manifest, rewriteCount } = rewriteManifestAssetRef({
77
+ manifest: page,
78
+ fromAssetName: input.oldName,
79
+ toAssetName: input.newName,
80
+ });
81
+ if (rewriteCount === 0)
82
+ continue;
83
+ refsRewritten += rewriteCount;
84
+ rewrites.push({
85
+ path: localeManifestPath('pages', name, 'page', locale),
86
+ // Same formatting as admin-api save paths: two-space JSON + trailing newline.
87
+ serialized: `${JSON.stringify(stripRuntimeFields(manifest), null, 2)}\n`,
88
+ oldManifest: page,
89
+ newManifest: manifest,
90
+ item: locale ? { source: 'page', name, locale } : { source: 'page', name },
91
+ });
92
+ }
93
+ for (const { name, fragment, locale } of allFragmentEntries(site)) {
94
+ const { manifest, rewriteCount } = rewriteManifestAssetRef({
95
+ manifest: fragment,
96
+ fromAssetName: input.oldName,
97
+ toAssetName: input.newName,
98
+ });
99
+ if (rewriteCount === 0)
100
+ continue;
101
+ refsRewritten += rewriteCount;
102
+ rewrites.push({
103
+ path: localeManifestPath('fragments', name, 'fragment', locale),
104
+ serialized: `${JSON.stringify(stripRuntimeFields(manifest), null, 2)}\n`,
105
+ oldManifest: fragment,
106
+ newManifest: manifest,
107
+ item: locale ? { source: 'fragment', name, locale } : { source: 'fragment', name },
108
+ });
109
+ }
110
+ // Step 4 — record the history revision BEFORE any writes.
111
+ //
112
+ // Rationale (mirrors admin-api/routes/pages.ts save handler): the
113
+ // recorder captures a pre-op baseline on first call. If we wrote to
114
+ // disk first, the baseline would capture post-op state and "undo
115
+ // this replace" would be a no-op. Recording first lets the baseline
116
+ // see pre-op state; the incoming `items` delta represents the post-op
117
+ // state we're about to write.
118
+ if (input.history) {
119
+ const items = [
120
+ ...rewrites.map(r => ({ path: r.path, content: r.serialized })),
121
+ // The old asset's manifest is going away — represent as a deletion.
122
+ {
123
+ path: `${input.assetsRoot}/${manifestPath(input.oldName)}`,
124
+ content: null,
125
+ },
126
+ ];
127
+ await recordWrite({
128
+ history: input.history,
129
+ contentRoot,
130
+ operation: 'save',
131
+ author: input.author,
132
+ items,
133
+ message: `Replace ${input.oldName} with ${input.newName}`,
134
+ });
135
+ }
136
+ // Step 5 — write every rewritten manifest. Best-effort: if any
137
+ // write fails, subsequent writes still attempt (so partial rewrites
138
+ // land), and we surface the first error. A follow-up rollback is
139
+ // out of scope for v1 (design-media.md → Multi-write contract).
140
+ for (const r of rewrites) {
141
+ const abs = contentRoot.path(r.path);
142
+ try {
143
+ await input.storage.writeFile(abs, r.serialized);
144
+ }
145
+ catch (err) {
146
+ throw new AssetStorageError('write', abs, err);
147
+ }
148
+ }
149
+ // Step 5b — update asset-refs sidecars for each rewritten manifest.
150
+ // Each rewrite is "oldName ref dropped, newName ref added" for this
151
+ // item. `rebuildItemRefs` reads the old/new manifests' asset-ref
152
+ // sets and applies the diff: removes sidecar at .gazetta/asset-refs/
153
+ // {oldName}/{item}, adds at .gazetta/asset-refs/{newName}/{item}.
154
+ // Errors here are non-fatal — the manifest writes are the source of
155
+ // truth; sidecar drift is recoverable via reindex CLI.
156
+ await Promise.all(rewrites.map(r => rebuildAssetRefs(contentRoot, r.item, r.oldManifest, r.newManifest).catch(err => {
157
+ // eslint-disable-next-line no-console
158
+ console.warn(`asset-refs sidecar update failed for ${r.path}: ${err.message}`);
159
+ })));
160
+ // Step 6 — delete the old asset's bytes + variants + manifest in
161
+ // removal-safe order. Reuses the same enumeration as `deleteAsset`;
162
+ // we don't invoke deleteAsset directly because it would re-run ref
163
+ // scanning (refs are 0 now, so it'd pass, but the scan is waste).
164
+ // Enumerated form picks up any locale/theme overrides on disk so the
165
+ // replace removes them too — atomic with the rest of the operation.
166
+ const paths = await enumerateAssetStoragePaths(input.storage, input.assetsRoot, oldManifest);
167
+ for (const path of assetPathsInRemovalOrder(paths)) {
168
+ try {
169
+ await rmIgnoreMissing(input.storage, path);
170
+ }
171
+ catch (err) {
172
+ throw new AssetStorageError('delete', path, err);
173
+ }
174
+ }
175
+ return { refsRewritten, manifestsRewritten: rewrites.length };
176
+ }
177
+ /**
178
+ * `loadSite` decorates page/fragment manifests with a `dir` field (and
179
+ * `route` on pages) for its own bookkeeping. `dir` is not part of the
180
+ * stored manifest JSON, so strip it before serialization — otherwise
181
+ * the on-disk file grows runtime noise every time a replace fires.
182
+ *
183
+ * `route` is kept: it's stored in the original manifest of every
184
+ * starter page. Stripping would regress data.
185
+ */
186
+ function stripRuntimeFields(manifest) {
187
+ const copy = { ...manifest };
188
+ delete copy.dir;
189
+ return copy;
190
+ }
191
+ function localeManifestPath(root, itemName, baseName, locale) {
192
+ const file = locale ? `${baseName}.${locale}.json` : `${baseName}.json`;
193
+ return join(root, itemName, file);
194
+ }
195
+ //# sourceMappingURL=replace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.js","sourceRoot":"","sources":["../../src/assets/replace.ts"],"names":[],"mappings":"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"}