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,42 @@
1
+ import { applyDepDiff, rebuildItemDeps, readDepsFor, } from '../dep-sidecars.js';
2
+ import { collectAssetRefs } from './scan-manifest-for-asset.js';
3
+ /** The asset-refs relation: extract `_asset` references from a manifest. */
4
+ export const ASSET_REFS = {
5
+ rootName: 'asset-refs',
6
+ // collectAssetRefs accepts a `Walkable` shape — narrower than ComponentManifest
7
+ // but every ComponentManifest is structurally a Walkable for its purposes.
8
+ extract: (manifest) => collectAssetRefs(manifest),
9
+ };
10
+ /** Convert an `ItemRef` to the `AssetRef` shape used by delete.ts and 409 responses. */
11
+ export function itemRefToAssetRef(item) {
12
+ // The sidecar doesn't carry componentPath — it answers "is this asset
13
+ // referenced by this item?" but not "where exactly in the manifest."
14
+ // For breadcrumb display, callers re-read the manifest on demand.
15
+ const filename = item.source === 'page' ? 'page' : 'fragment';
16
+ const localePart = item.locale ? `.${item.locale}` : '';
17
+ const folder = item.source === 'page' ? 'pages' : 'fragments';
18
+ return {
19
+ source: item.source,
20
+ path: `${folder}/${item.name}/${filename}${localePart}.json`,
21
+ componentPath: null,
22
+ };
23
+ }
24
+ /** Read every item that references this asset. Thin wrapper around `readDepsFor`. */
25
+ export function readRefsForAsset(contentRoot, assetName) {
26
+ return readDepsFor(ASSET_REFS, contentRoot, assetName);
27
+ }
28
+ /**
29
+ * Apply asset-refs diff for one item's manifest change. Thin wrapper
30
+ * around `rebuildItemDeps` with the asset-refs relation pre-bound.
31
+ */
32
+ export function rebuildAssetRefs(contentRoot, item, oldManifest, newManifest) {
33
+ return rebuildItemDeps(ASSET_REFS, contentRoot, item, oldManifest, newManifest);
34
+ }
35
+ /** Apply a pre-computed diff (used in tests + cases where caller has the sets already). */
36
+ export function applyAssetRefsDiff(contentRoot, item, oldAssets, newAssets) {
37
+ return applyDepDiff(ASSET_REFS, contentRoot, item, oldAssets, newAssets);
38
+ }
39
+ // Re-export the generic types/utilities so asset-side callers don't
40
+ // need to import from two modules.
41
+ export { applyDepDiff, filenameToItemRef, itemRefToFilename, } from '../dep-sidecars.js';
42
+ //# sourceMappingURL=asset-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-deps.js","sourceRoot":"","sources":["../../src/assets/asset-deps.ts"],"names":[],"mappings":"AAaA,OAAO,EAIL,YAAY,EACZ,eAAe,EACf,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAE/D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC,QAAQ,EAAE,YAAY;IACtB,gFAAgF;IAChF,2EAA2E;IAC3E,OAAO,EAAE,CAAC,QAAsB,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAA6D,CAAC;CACrH,CAAA;AAED,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,sEAAsE;IACtE,qEAAqE;IACrE,kEAAkE;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAA;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAA;IAC7D,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ,GAAG,UAAU,OAAO;QAC5D,aAAa,EAAE,IAAI;KACpB,CAAA;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,gBAAgB,CAAC,WAAwB,EAAE,SAAiB;IAC1E,OAAO,WAAW,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAwB,EACxB,IAAa,EACb,WAAgC,EAChC,WAAgC;IAEhC,OAAO,eAAe,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;AACjF,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,kBAAkB,CAChC,WAAwB,EACxB,IAAa,EACb,SAA8B,EAC9B,SAA8B;IAE9B,OAAO,YAAY,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;AAC1E,CAAC;AAED,oEAAoE;AACpE,mCAAmC;AACnC,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAGlB,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Asset path enumeration — "given a manifest, what on-storage paths make
3
+ * up this asset?"
4
+ *
5
+ * Single responsibility: translate a manifest + its assetsRoot into the
6
+ * concrete storage paths that physically exist for this asset (default
7
+ * bytes, default variants, plus per-locale and per-theme overrides).
8
+ * Callers that want to move, copy, or remove an asset ask this module
9
+ * for the path set and act on it — they don't compute paths themselves.
10
+ *
11
+ * Completeness contract:
12
+ * Either return a fully-populated path set, or throw
13
+ * `AssetMimeUnsupportedError`. No null-bytes escape hatch — the original
14
+ * design tolerated it with a "filter on the way out" pattern, which
15
+ * meant a new asset kind added without extending `extFromMime` silently
16
+ * skipped byte deletion in every consumer. Forcing the error here keeps
17
+ * the MIME map honest: add a kind, extend the map, or fail loud.
18
+ *
19
+ * Override slices:
20
+ * Each `OverrideSlice` represents one (locale, theme, ...) variant of
21
+ * the asset. The selector is part of the slice — slices are
22
+ * self-describing so iteration over `overrides` doesn't need to
23
+ * recompute selectors from filenames. Slices with `bytes: null` are
24
+ * metadata-only locale overrides (no byte file, just a manifest).
25
+ *
26
+ * v1 scope reads `overrides` as an empty array because no callers write
27
+ * locale variants yet. Step 24 (locale-bytes ingest) will populate it.
28
+ * Delete, rename, GC iterate `overrides` from day one — adding the data
29
+ * later doesn't require touching consumers.
30
+ */
31
+ import type { AssetManifest } from '../schema/types.js';
32
+ import { type Selector } from '../schema/dimensions.js';
33
+ import type { StorageProvider } from '../types.js';
34
+ /**
35
+ * One override variant of an asset (a specific (locale, theme, ...)
36
+ * combination). Self-describing — carries its selector so iteration
37
+ * doesn't need to re-derive it from filename parsing.
38
+ */
39
+ export interface OverrideSlice {
40
+ /** Selector identifying this override (locale and/or theme). Never null. */
41
+ readonly selector: Selector;
42
+ /** Locale-variant manifest path: `{name}.asset.{...selectors}.json`. */
43
+ readonly manifest: string;
44
+ /**
45
+ * Locale-bytes path. Null when this override is metadata-only
46
+ * (no `hash` on the locale manifest); non-null when this locale has
47
+ * its own bytes.
48
+ */
49
+ readonly bytes: string | null;
50
+ /**
51
+ * Variant ladder for THIS locale's bytes. Empty when `bytes` is null
52
+ * (no bytes → no variants) or when this locale's bytes are too small
53
+ * to need a ladder.
54
+ */
55
+ readonly variants: readonly string[];
56
+ }
57
+ /**
58
+ * Every on-storage path associated with an asset — default manifest,
59
+ * default bytes, default variants, plus zero or more locale/theme
60
+ * overrides. If this struct is returned, every field points at a real
61
+ * candidate path; if any field would be uncomputable (unknown MIME),
62
+ * the function throws instead.
63
+ */
64
+ export interface AssetStoragePaths {
65
+ /** The `{name}.asset.json` default manifest. Always the last path to
66
+ * remove (if a crash leaves a manifest pointing at missing bytes, the
67
+ * resolver degrades gracefully; the reverse creates an orphan). */
68
+ readonly defaultManifest: string;
69
+ /** Primary default bytes. */
70
+ readonly defaultBytes: string;
71
+ /** Default-variant ladder. Empty until variant generation runs. */
72
+ readonly defaultVariants: readonly string[];
73
+ /**
74
+ * Per-(locale, theme) overrides. Sorted by selector for deterministic
75
+ * iteration. Empty when this asset has no overrides — the typical
76
+ * case for assets that aren't localized or themed.
77
+ */
78
+ readonly overrides: readonly OverrideSlice[];
79
+ }
80
+ /**
81
+ * Enumerate every storage path associated with the asset described by
82
+ * `manifest`, rooted under `assetsRoot`. Throws
83
+ * `AssetMimeUnsupportedError` when the manifest's MIME has no extension
84
+ * mapping — that's a misconfiguration, not a runtime condition to
85
+ * tolerate.
86
+ *
87
+ * Variant paths come straight from the manifest's `variants` list —
88
+ * each variant already knows its own on-disk filename (populated by
89
+ * the ingest pipeline; see `assets/ingest.ts`). No recomputation here,
90
+ * so a future variant-naming scheme change needs zero updates to this
91
+ * module.
92
+ *
93
+ * Pure — no I/O. Override slices come from the caller (typically built
94
+ * via `enumerateOverrideSlices` after a disk scan, or supplied by an
95
+ * in-memory write planner). Defaults to an empty `overrides` so callers
96
+ * that don't deal with locale/theme variants don't pay the I/O cost.
97
+ */
98
+ export declare function assetStoragePaths(assetsRoot: string, manifest: AssetManifest, overrides?: readonly OverrideSlice[]): AssetStoragePaths;
99
+ /**
100
+ * Async wrapper around `assetStoragePaths` that scans `assetsRoot/` for
101
+ * existing locale/theme override manifests and reads them so the result
102
+ * is fully populated with `OverrideSlice[]`.
103
+ *
104
+ * Used by callers that need every-path-for-this-asset (delete, rename,
105
+ * future GC). Pure consumers (compose paths from a known override set)
106
+ * keep using `assetStoragePaths` directly with overrides they already
107
+ * have.
108
+ *
109
+ * Path-style names (`products/shot`): scan happens under the asset's
110
+ * parent directory (`assetsRoot/products/`) and matches
111
+ * `shot.asset.*.json` siblings.
112
+ *
113
+ * Embedded + downloadable kinds use `LocaleOverrideManifest`. Font is
114
+ * out-of-scope here for v1 — fonts are additive, not override, so
115
+ * delete/rename for fonts already pick up additive variants by listing
116
+ * all sibling manifest files. Today the same scanner reads them as
117
+ * locale-override-shaped slices for path enumeration — the bytes path
118
+ * comes from the manifest's `hash` either way.
119
+ */
120
+ export declare function enumerateAssetStoragePaths(storage: StorageProvider, assetsRoot: string, manifest: AssetManifest): Promise<AssetStoragePaths>;
121
+ /**
122
+ * Scan disk for locale/theme override manifests of `manifest`'s asset
123
+ * and return the parsed slices. Pure I/O; pairs with the pure
124
+ * `assetStoragePaths` to compose the full path set.
125
+ */
126
+ export declare function enumerateOverrideSlices(storage: StorageProvider, assetsRoot: string, manifest: AssetManifest): Promise<OverrideSlice[]>;
127
+ /**
128
+ * Flatten the storage-paths set into a removal-safe order. Three rules:
129
+ *
130
+ * 1. Override bytes + variants first (each override is independently
131
+ * removable; orphan default-manifest is fine if an override removal
132
+ * is interrupted, since the resolver degrades gracefully).
133
+ * 2. Override manifests after their bytes/variants (same atomicity
134
+ * rationale per-override).
135
+ * 3. Default bytes + variants, then default manifest LAST. The default
136
+ * manifest is the canonical "this asset exists" record — losing it
137
+ * mid-removal leaves orphan bytes the resolver can't reach, which
138
+ * the future GC will reclaim.
139
+ */
140
+ export declare function assetPathsInRemovalOrder(paths: AssetStoragePaths): string[];
141
+ /**
142
+ * Flat list of every byte path (default + per-override) across the asset.
143
+ * Use case: future GC walks this set across all assets to identify
144
+ * unreferenced byte files. No manifest paths included — those are the
145
+ * "what bytes should exist" record, not bytes themselves.
146
+ */
147
+ export declare function assetBytePaths(paths: AssetStoragePaths): string[];
148
+ /**
149
+ * Flat list of every manifest path (default + per-override). Use case:
150
+ * history captures every manifest file in a revision; restore writes
151
+ * them back. Manifests are the canonical "this asset exists" records,
152
+ * separately enumerable from the bytes they describe.
153
+ */
154
+ export declare function assetManifestPaths(paths: AssetStoragePaths): string[];
155
+ //# sourceMappingURL=asset-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-paths.d.ts","sourceRoot":"","sources":["../../src/assets/asset-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,aAAa,EAA0B,MAAM,oBAAoB,CAAA;AAC/E,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAOlD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC;;wEAEoE;IACpE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,aAAa,EAAE,CAAA;CAC7C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,aAAa,EACvB,SAAS,GAAE,SAAS,aAAa,EAAO,GACvC,iBAAiB,CAWnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAG5B;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,aAAa,EAAE,CAAC,CAiC1B;AAsDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAa3E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAOjE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAErE"}
@@ -0,0 +1,197 @@
1
+ import { selectorsEqual } from '../schema/dimensions.js';
2
+ import { AssetMimeUnsupportedError } from './errors.js';
3
+ import { assetBytesPath, manifestPath } from './manifest.js';
4
+ import { localeManifestVariantFor } from './manifest-locale.js';
5
+ import { parseManifestFilename } from './manifest-filename.js';
6
+ import { extFromMime } from './url.js';
7
+ /**
8
+ * Enumerate every storage path associated with the asset described by
9
+ * `manifest`, rooted under `assetsRoot`. Throws
10
+ * `AssetMimeUnsupportedError` when the manifest's MIME has no extension
11
+ * mapping — that's a misconfiguration, not a runtime condition to
12
+ * tolerate.
13
+ *
14
+ * Variant paths come straight from the manifest's `variants` list —
15
+ * each variant already knows its own on-disk filename (populated by
16
+ * the ingest pipeline; see `assets/ingest.ts`). No recomputation here,
17
+ * so a future variant-naming scheme change needs zero updates to this
18
+ * module.
19
+ *
20
+ * Pure — no I/O. Override slices come from the caller (typically built
21
+ * via `enumerateOverrideSlices` after a disk scan, or supplied by an
22
+ * in-memory write planner). Defaults to an empty `overrides` so callers
23
+ * that don't deal with locale/theme variants don't pay the I/O cost.
24
+ */
25
+ export function assetStoragePaths(assetsRoot, manifest, overrides = []) {
26
+ const ext = extFromMime(manifest.mime);
27
+ if (!ext) {
28
+ throw new AssetMimeUnsupportedError(manifest.mime, manifest.name);
29
+ }
30
+ return {
31
+ defaultManifest: `${assetsRoot}/${manifestPath(manifest.name)}`,
32
+ defaultBytes: `${assetsRoot}/${assetBytesPath(manifest.name, manifest.hash, ext)}`,
33
+ defaultVariants: manifest.variants.map(v => `${assetsRoot}/${v.path}`),
34
+ overrides: [...overrides].sort(compareOverrideSlices),
35
+ };
36
+ }
37
+ /**
38
+ * Async wrapper around `assetStoragePaths` that scans `assetsRoot/` for
39
+ * existing locale/theme override manifests and reads them so the result
40
+ * is fully populated with `OverrideSlice[]`.
41
+ *
42
+ * Used by callers that need every-path-for-this-asset (delete, rename,
43
+ * future GC). Pure consumers (compose paths from a known override set)
44
+ * keep using `assetStoragePaths` directly with overrides they already
45
+ * have.
46
+ *
47
+ * Path-style names (`products/shot`): scan happens under the asset's
48
+ * parent directory (`assetsRoot/products/`) and matches
49
+ * `shot.asset.*.json` siblings.
50
+ *
51
+ * Embedded + downloadable kinds use `LocaleOverrideManifest`. Font is
52
+ * out-of-scope here for v1 — fonts are additive, not override, so
53
+ * delete/rename for fonts already pick up additive variants by listing
54
+ * all sibling manifest files. Today the same scanner reads them as
55
+ * locale-override-shaped slices for path enumeration — the bytes path
56
+ * comes from the manifest's `hash` either way.
57
+ */
58
+ export async function enumerateAssetStoragePaths(storage, assetsRoot, manifest) {
59
+ const overrides = await enumerateOverrideSlices(storage, assetsRoot, manifest);
60
+ return assetStoragePaths(assetsRoot, manifest, overrides);
61
+ }
62
+ /**
63
+ * Scan disk for locale/theme override manifests of `manifest`'s asset
64
+ * and return the parsed slices. Pure I/O; pairs with the pure
65
+ * `assetStoragePaths` to compose the full path set.
66
+ */
67
+ export async function enumerateOverrideSlices(storage, assetsRoot, manifest) {
68
+ // Asset name can be path-style (`products/shot`). Scan happens in the
69
+ // immediate parent directory; sibling matching uses the leaf name.
70
+ const slashIdx = manifest.name.lastIndexOf('/');
71
+ const parentDir = slashIdx >= 0 ? `${assetsRoot}/${manifest.name.slice(0, slashIdx)}` : assetsRoot;
72
+ const leafName = slashIdx >= 0 ? manifest.name.slice(slashIdx + 1) : manifest.name;
73
+ let entries;
74
+ try {
75
+ entries = await storage.readDir(parentDir);
76
+ }
77
+ catch {
78
+ return [];
79
+ }
80
+ const variant = localeManifestVariantFor(manifest.kind);
81
+ const slices = [];
82
+ for (const entry of entries) {
83
+ if (entry.isDirectory)
84
+ continue;
85
+ const parsed = parseManifestFilename(entry.name);
86
+ // Skip non-manifests, default manifest, and manifests for OTHER
87
+ // assets (path-style siblings can sit in the same directory).
88
+ if (!parsed)
89
+ continue;
90
+ if (parsed.assetName !== leafName)
91
+ continue;
92
+ if (parsed.selector === null)
93
+ continue;
94
+ const localeManifest = await variant.read(storage, assetsRoot, manifest.name, parsed.selector);
95
+ if (localeManifest === null)
96
+ continue;
97
+ slices.push(buildOverrideSlice(assetsRoot, manifest, parsed.selector, localeManifest));
98
+ }
99
+ return slices;
100
+ }
101
+ function buildOverrideSlice(assetsRoot, defaultManifest, selector, localeManifest) {
102
+ const manifestRel = manifestPath(defaultManifest.name, selector);
103
+ const manifestAbs = `${assetsRoot}/${manifestRel}`;
104
+ // Bytes-override slice has its own hash + mime (mime can differ per
105
+ // locale: jpeg default, webp override). Metadata-only slice has no
106
+ // bytes; the resolver falls back to default bytes at render time.
107
+ const localeHash = localeManifest.hash;
108
+ if (localeHash === undefined) {
109
+ return { selector, manifest: manifestAbs, bytes: null, variants: [] };
110
+ }
111
+ const localeMime = localeManifest.mime ?? defaultManifest.mime;
112
+ const localeExt = extFromMime(localeMime);
113
+ if (!localeExt) {
114
+ // Should never reach here — the locale manifest validator already
115
+ // requires a known MIME when `hash` is set. Defensive path: surface
116
+ // as no-bytes slice rather than throwing, since path enumeration
117
+ // should be lossy-tolerant (the manifest itself reports the
118
+ // problem on read).
119
+ return { selector, manifest: manifestAbs, bytes: null, variants: [] };
120
+ }
121
+ const bytesAbs = `${assetsRoot}/${assetBytesPath(defaultManifest.name, localeHash, localeExt, selector)}`;
122
+ // Variant paths come from the locale manifest's own `variants` list
123
+ // (per-locale ladder, generated when the override bytes were
124
+ // ingested). No recomputation — single source of truth on the disk.
125
+ const variantAbs = (localeManifest.variants ?? []).map(v => `${assetsRoot}/${v.path}`);
126
+ return { selector, manifest: manifestAbs, bytes: bytesAbs, variants: variantAbs };
127
+ }
128
+ /**
129
+ * Total order on override slices for deterministic iteration. Sorts by
130
+ * the dimension values in `DIMENSION_ORDER` order. Two selectors with
131
+ * the same values are considered equal (selector identity is set-like).
132
+ */
133
+ function compareOverrideSlices(a, b) {
134
+ if (selectorsEqual(a.selector, b.selector))
135
+ return 0;
136
+ // Compare locale first, then theme, missing dimensions sort before set ones.
137
+ const aLoc = a.selector.get('locale') ?? '';
138
+ const bLoc = b.selector.get('locale') ?? '';
139
+ if (aLoc !== bLoc)
140
+ return aLoc < bLoc ? -1 : 1;
141
+ const aTheme = a.selector.get('theme') ?? '';
142
+ const bTheme = b.selector.get('theme') ?? '';
143
+ return aTheme < bTheme ? -1 : aTheme > bTheme ? 1 : 0;
144
+ }
145
+ /**
146
+ * Flatten the storage-paths set into a removal-safe order. Three rules:
147
+ *
148
+ * 1. Override bytes + variants first (each override is independently
149
+ * removable; orphan default-manifest is fine if an override removal
150
+ * is interrupted, since the resolver degrades gracefully).
151
+ * 2. Override manifests after their bytes/variants (same atomicity
152
+ * rationale per-override).
153
+ * 3. Default bytes + variants, then default manifest LAST. The default
154
+ * manifest is the canonical "this asset exists" record — losing it
155
+ * mid-removal leaves orphan bytes the resolver can't reach, which
156
+ * the future GC will reclaim.
157
+ */
158
+ export function assetPathsInRemovalOrder(paths) {
159
+ const order = [];
160
+ // Override bytes + variants, override manifests
161
+ for (const slice of paths.overrides) {
162
+ if (slice.bytes !== null)
163
+ order.push(slice.bytes);
164
+ order.push(...slice.variants);
165
+ }
166
+ for (const slice of paths.overrides) {
167
+ order.push(slice.manifest);
168
+ }
169
+ // Default bytes + variants, then default manifest last
170
+ order.push(paths.defaultBytes, ...paths.defaultVariants, paths.defaultManifest);
171
+ return order;
172
+ }
173
+ /**
174
+ * Flat list of every byte path (default + per-override) across the asset.
175
+ * Use case: future GC walks this set across all assets to identify
176
+ * unreferenced byte files. No manifest paths included — those are the
177
+ * "what bytes should exist" record, not bytes themselves.
178
+ */
179
+ export function assetBytePaths(paths) {
180
+ const out = [paths.defaultBytes, ...paths.defaultVariants];
181
+ for (const slice of paths.overrides) {
182
+ if (slice.bytes !== null)
183
+ out.push(slice.bytes);
184
+ out.push(...slice.variants);
185
+ }
186
+ return out;
187
+ }
188
+ /**
189
+ * Flat list of every manifest path (default + per-override). Use case:
190
+ * history captures every manifest file in a revision; restore writes
191
+ * them back. Manifests are the canonical "this asset exists" records,
192
+ * separately enumerable from the bytes they describe.
193
+ */
194
+ export function assetManifestPaths(paths) {
195
+ return [paths.defaultManifest, ...paths.overrides.map(s => s.manifest)];
196
+ }
197
+ //# sourceMappingURL=asset-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-paths.js","sourceRoot":"","sources":["../../src/assets/asset-paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Delete an asset — the blocked-by-refs flow.
3
+ *
4
+ * Contract:
5
+ * 1. Read the manifest (404-equivalent if missing).
6
+ * 2. Scan site content for references to this asset.
7
+ * 3. If any refs exist, throw `AssetInUseError` with the usage list.
8
+ * The admin surfaces the list so the author can rewrite refs or pick
9
+ * a replacement.
10
+ * 4. If no refs, remove every storage path associated with the asset in
11
+ * removal-safe order (bytes + variants first, manifest last). If a
12
+ * crash lands between any two steps, at worst the manifest points at
13
+ * missing bytes — a state the resolver already degrades gracefully.
14
+ *
15
+ * Single responsibility: policy — "either delete cleanly or refuse with a
16
+ * reason." Owns the three-step flow and nothing else:
17
+ * - reads manifest (via `manifest.ts`)
18
+ * - scans refs (via `find-refs.ts`)
19
+ * - enumerates paths (via `asset-paths.ts`) and removes them
20
+ * idempotently (via `providers/_rm-ignore-missing.ts`)
21
+ *
22
+ * Adding a new manifest dimension (variants, locale bytes, posters)
23
+ * means extending `asset-paths.ts`. This module stays unchanged — the
24
+ * enumeration loop picks up the new paths automatically.
25
+ *
26
+ * History atomicity:
27
+ * When `history` is provided, delete records ONE revision marking
28
+ * every removed path as a deletion (`content: null`). Recording
29
+ * happens BEFORE any rm so the recorder's first-time baseline scan
30
+ * captures pre-op state — same pattern as `replace.ts` and
31
+ * `ingest.ts`. If recording succeeds but a subsequent rm fails, the
32
+ * revision still records the deletion intent; on undo, the restorer
33
+ * re-creates the missing paths from the previous revision's blobs.
34
+ */
35
+ import type { ContentRoot } from '../content-root.js';
36
+ import type { HistoryProvider } from '../history.js';
37
+ import type { StorageProvider, SiteManifest } from '../types.js';
38
+ export interface DeleteAssetInput {
39
+ /** Storage holding both the asset and the content tree. */
40
+ storage: StorageProvider;
41
+ /** Path prefix for assets (typically `"assets"`). */
42
+ assetsRoot: string;
43
+ /**
44
+ * Path prefix for site content (where `pages/` and `fragments/` live).
45
+ * Required — refs are scanned from here.
46
+ */
47
+ siteDir: string;
48
+ /** The asset name to delete. */
49
+ assetName: string;
50
+ /** Project-level manifest passed to the ref-scanner's `loadSite`. */
51
+ manifest?: SiteManifest;
52
+ /**
53
+ * Optional history provider. When set, delete records ONE revision
54
+ * covering the removed manifest + bytes + variants (each as
55
+ * `content: null`). Reuses the `siteDir`-rooted contentRoot built
56
+ * for ref scanning, so callers don't need to pass it separately.
57
+ */
58
+ history?: HistoryProvider;
59
+ /** Author identifier passed through to the history revision. */
60
+ author?: string;
61
+ /**
62
+ * Optional content root. When omitted, one is built from `storage`
63
+ * + `siteDir`. Tests pass an explicit one to share a single root
64
+ * with other operations.
65
+ */
66
+ contentRoot?: ContentRoot;
67
+ }
68
+ /**
69
+ * Delete an asset after verifying no references exist. Returns on
70
+ * success; throws `AssetInUseError` (with the usage list),
71
+ * `AssetManifestNotFoundError`, `AssetMimeUnsupportedError`, or
72
+ * `AssetStorageError` otherwise.
73
+ */
74
+ export declare function deleteAsset(input: DeleteAssetInput): Promise<void>;
75
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/assets/delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAShE,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,OAAO,EAAE,eAAe,CAAA;IACxB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqExE"}
@@ -0,0 +1,82 @@
1
+ import { recordWrite } from '../history-recorder.js';
2
+ import { createContentRoot } from '../content-root.js';
3
+ import { rmIgnoreMissing } from '../providers/_rm-ignore-missing.js';
4
+ import { assetPathsInRemovalOrder, enumerateAssetStoragePaths } from './asset-paths.js';
5
+ import { AssetInUseError, AssetStorageError } from './errors.js';
6
+ import { findAssetRefs } from './find-refs.js';
7
+ import { readManifest } from './manifest.js';
8
+ import { itemRefToAssetRef, readRefsForAsset } from './asset-deps.js';
9
+ /**
10
+ * Delete an asset after verifying no references exist. Returns on
11
+ * success; throws `AssetInUseError` (with the usage list),
12
+ * `AssetManifestNotFoundError`, `AssetMimeUnsupportedError`, or
13
+ * `AssetStorageError` otherwise.
14
+ */
15
+ export async function deleteAsset(input) {
16
+ // Step 1 — read manifest. Throws AssetManifestNotFoundError when missing.
17
+ const manifest = await readManifest(input.storage, input.assetsRoot, input.assetName);
18
+ // Step 2 — scan for refs.
19
+ //
20
+ // Fast path: read the per-edge asset-refs sidecars. O(1) directory
21
+ // listing under the asset's `.gazetta/asset-refs/{name}/` dir.
22
+ // Sidecars are populated by save handlers + publish + reindex CLI.
23
+ //
24
+ // Fallback: if the sidecar dir is empty AND we suspect drift (e.g.,
25
+ // freshly-cloned source where backfill hasn't run), fall through to
26
+ // the manifest walk for safety. The walk catches refs that the
27
+ // sidecar index would have missed for any reason — high-stakes
28
+ // operation (delete loses data), worth the extra ~30s on cloud at
29
+ // N=1000.
30
+ const contentRoot = input.contentRoot ?? createContentRoot(input.storage, input.siteDir);
31
+ const sidecarRefs = await readRefsForAsset(contentRoot, input.assetName);
32
+ let refs;
33
+ if (sidecarRefs.length > 0) {
34
+ refs = sidecarRefs.map(itemRefToAssetRef);
35
+ }
36
+ else {
37
+ // Sidecar dir empty or missing — could mean truly zero refs OR
38
+ // index drift / not-yet-backfilled. Walk to confirm; safe-on-doubt.
39
+ refs = await findAssetRefs({
40
+ storage: input.storage,
41
+ siteDir: input.siteDir,
42
+ assetName: input.assetName,
43
+ manifest: input.manifest,
44
+ });
45
+ }
46
+ // Step 3 — refuse if in use.
47
+ if (refs.length > 0) {
48
+ throw new AssetInUseError(input.assetName, refs);
49
+ }
50
+ // Step 4 — enumerate paths, including any locale/theme overrides
51
+ // discovered on disk. `enumerateAssetStoragePaths` throws
52
+ // `AssetMimeUnsupportedError` when the manifest's MIME has no
53
+ // extension mapping (misconfiguration — surface as-is rather than
54
+ // silently skipping bytes).
55
+ const paths = await enumerateAssetStoragePaths(input.storage, input.assetsRoot, manifest);
56
+ const orderedPaths = assetPathsInRemovalOrder(paths);
57
+ // Step 5 — record history BEFORE any rm. Same pattern as
58
+ // ingest/replace: the recorder's first-time baseline scan must
59
+ // capture pre-op state. Each removed path becomes a deletion
60
+ // (`content: null`) so the next revision's snapshot drops them.
61
+ if (input.history) {
62
+ const items = orderedPaths.map(path => ({ path, content: null }));
63
+ await recordWrite({
64
+ history: input.history,
65
+ contentRoot,
66
+ operation: 'save',
67
+ author: input.author,
68
+ items,
69
+ message: `Delete ${input.assetName}`,
70
+ });
71
+ }
72
+ // Step 6 — remove every enumerated path in removal-safe order.
73
+ for (const path of orderedPaths) {
74
+ try {
75
+ await rmIgnoreMissing(input.storage, path);
76
+ }
77
+ catch (err) {
78
+ throw new AssetStorageError('delete', path, err);
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/assets/delete.ts"],"names":[],"mappings":"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"}