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,49 @@
1
+ import { manifestPath } from './manifest.js';
2
+ import { collectAssetRefs } from './scan-manifest-for-asset.js';
3
+ /**
4
+ * Compute the set of assets to publish given the items being published,
5
+ * after running the source-existence pre-flight check.
6
+ *
7
+ * Empty refs short-circuit to `ok: true` with no assets — sites without
8
+ * media still publish fine.
9
+ */
10
+ export async function planAssetCopy(input) {
11
+ const { refs, itemsWithRefs } = await collectRefsAcrossItems(input);
12
+ if (refs.size === 0)
13
+ return { ok: true, assets: [], itemsWithRefs: [] };
14
+ const missing = [];
15
+ for (const name of refs) {
16
+ const exists = await input.sourceRoot.storage.exists(input.sourceRoot.path('assets', manifestPath(name)));
17
+ if (!exists)
18
+ missing.push(name);
19
+ }
20
+ if (missing.length > 0) {
21
+ return { ok: false, reason: 'missing-on-source', missing };
22
+ }
23
+ return { ok: true, assets: [...refs], itemsWithRefs };
24
+ }
25
+ async function collectRefsAcrossItems(input) {
26
+ const refs = new Set();
27
+ const itemsWithRefs = [];
28
+ for (const item of input.itemNames) {
29
+ const path = input.sourceRoot.path(item, manifestFilenameFor(item));
30
+ const raw = await input.sourceRoot.storage.readFile(path).catch(() => null);
31
+ if (raw === null)
32
+ continue;
33
+ // Page/fragment manifests have the same `Walkable` shape that
34
+ // `collectAssetRefs` accepts; cast here rather than parse-and-validate
35
+ // since the planner's job is ref discovery, not manifest validation.
36
+ const manifest = JSON.parse(raw);
37
+ const itemRefs = collectAssetRefs(manifest);
38
+ if (itemRefs.size === 0)
39
+ continue;
40
+ itemsWithRefs.push(item);
41
+ for (const name of itemRefs)
42
+ refs.add(name);
43
+ }
44
+ return { refs, itemsWithRefs };
45
+ }
46
+ function manifestFilenameFor(itemName) {
47
+ return itemName.startsWith('fragments/') ? 'fragment.json' : 'page.json';
48
+ }
49
+ //# sourceMappingURL=publish-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-plan.js","sourceRoot":"","sources":["../../src/assets/publish-plan.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAe/D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAgB;IAClD,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAA;IAEnE,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAA;IAEvE,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzG,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAA;IAC5D,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,aAAa,EAAE,CAAA;AACvD,CAAC;AAOD,KAAK,UAAU,sBAAsB,CAAC,KAAgB;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,aAAa,GAAa,EAAE,CAAA;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAA;QACnE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC3E,IAAI,GAAG,KAAK,IAAI;YAAE,SAAQ;QAC1B,8DAA8D;QAC9D,uEAAuE;QACvE,qEAAqE;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2C,CAAA;QAC1E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAC3C,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;YAAE,SAAQ;QACjC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxB,KAAK,MAAM,IAAI,IAAI,QAAQ;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAA;AAChC,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,OAAO,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAA;AAC1E,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { ContentRoot } from '../content-root.js';
2
+ export interface PublishAssetsInput {
3
+ /** Source content root (assets live at `sourceRoot.path('assets')`). */
4
+ readonly sourceRoot: ContentRoot;
5
+ /** Target content root (assets land at `targetRoot.path('assets')`). */
6
+ readonly targetRoot: ContentRoot;
7
+ /** Items being published — e.g., `['pages/home', 'fragments/header']`. */
8
+ readonly itemNames: readonly string[];
9
+ }
10
+ export type PublishAssetsResult = {
11
+ readonly ok: true;
12
+ readonly copiedAssets: number;
13
+ readonly copiedFiles: number;
14
+ } | {
15
+ readonly ok: false;
16
+ readonly reason: 'missing-on-source';
17
+ readonly missing: readonly string[];
18
+ };
19
+ /**
20
+ * Copy every asset referenced by `itemNames` from source to target.
21
+ *
22
+ * Returns a discriminated-union result. On the failure variant, no
23
+ * writes have happened — validation is complete before any copy starts.
24
+ *
25
+ * Asset copies run in bounded parallel — assets are independent (no
26
+ * cross-asset shared state) and each one's stream-bridge spends most of
27
+ * its time waiting on cloud I/O. Sequential copy serializes those waits;
28
+ * parallel copy lets them overlap. Concurrency is bounded by `mapLimit`'s
29
+ * default to avoid running out of file handles or saturating the SDK's
30
+ * connection pool.
31
+ */
32
+ export declare function publishAssets(input: PublishAssetsInput): Promise<PublishAssetsResult>;
33
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/assets/publish.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAMrD,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAA;IAChC,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAA;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAClF;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAErG;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoB3F"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Publish assets — copy referenced assets from a source target's storage
3
+ * to a destination target's storage during publish.
4
+ *
5
+ * This module is the orchestrator: it asks `publish-plan.ts` what to copy
6
+ * (and stops on a structured failure), then performs the actual byte
7
+ * moves. The two concerns split because validation must complete before
8
+ * any bytes are written — so a missing-on-source asset never produces a
9
+ * half-copied target — and the executor wants nothing to do with the
10
+ * walk that produced the asset list.
11
+ *
12
+ * Dedupe is a runtime check on the destination, not a planner output:
13
+ * the planner can't know whether an asset is *already on target* without
14
+ * the same `exists()` call we'd make at copy time, so checking once at
15
+ * the copy site is cheaper.
16
+ */
17
+ import { mapLimit } from '../concurrency.js';
18
+ import { assetBytePaths, assetStoragePaths } from './asset-paths.js';
19
+ import { readManifest, writeManifest } from './manifest.js';
20
+ import { planAssetCopy } from './publish-plan.js';
21
+ /**
22
+ * Copy every asset referenced by `itemNames` from source to target.
23
+ *
24
+ * Returns a discriminated-union result. On the failure variant, no
25
+ * writes have happened — validation is complete before any copy starts.
26
+ *
27
+ * Asset copies run in bounded parallel — assets are independent (no
28
+ * cross-asset shared state) and each one's stream-bridge spends most of
29
+ * its time waiting on cloud I/O. Sequential copy serializes those waits;
30
+ * parallel copy lets them overlap. Concurrency is bounded by `mapLimit`'s
31
+ * default to avoid running out of file handles or saturating the SDK's
32
+ * connection pool.
33
+ */
34
+ export async function publishAssets(input) {
35
+ const plan = await planAssetCopy(input);
36
+ if (!plan.ok)
37
+ return plan;
38
+ if (plan.assets.length === 0)
39
+ return { ok: true, copiedAssets: 0, copiedFiles: 0 };
40
+ const ctx = {
41
+ source: input.sourceRoot.storage,
42
+ target: input.targetRoot.storage,
43
+ sourceAssets: input.sourceRoot.path('assets'),
44
+ targetAssets: input.targetRoot.path('assets'),
45
+ };
46
+ const perAsset = await mapLimit(plan.assets, name => copyOneAsset(ctx, name));
47
+ let copiedAssets = 0;
48
+ let copiedFiles = 0;
49
+ for (const r of perAsset) {
50
+ if (r.copied)
51
+ copiedAssets++;
52
+ copiedFiles += r.files;
53
+ }
54
+ return { ok: true, copiedAssets, copiedFiles };
55
+ }
56
+ async function copyOneAsset(ctx, name) {
57
+ const sourceManifest = await readManifest(ctx.source, ctx.sourceAssets, name);
58
+ const sourcePaths = assetStoragePaths(ctx.sourceAssets, sourceManifest);
59
+ const targetPaths = assetStoragePaths(ctx.targetAssets, sourceManifest);
60
+ // Content-addressed dedupe: the hash is in the bytes path, so its
61
+ // presence on the target proves byte-equivalence. Skip the whole
62
+ // asset (manifest + bytes + variants).
63
+ if (await ctx.target.exists(targetPaths.defaultBytes))
64
+ return { copied: false, files: 0 };
65
+ await writeManifest(ctx.target, ctx.targetAssets, sourceManifest);
66
+ let files = 1;
67
+ // Copy every byte path (default + per-override) preserving structure.
68
+ // `assetBytePaths` returns default bytes/variants first, then each
69
+ // override's bytes/variants — both source and target produce the same
70
+ // ordered list because they're built from the same manifest, so we
71
+ // can iterate in lockstep.
72
+ const sourceBytePaths = assetBytePaths(sourcePaths);
73
+ const targetBytePaths = assetBytePaths(targetPaths);
74
+ for (let i = 0; i < sourceBytePaths.length; i++) {
75
+ const stream = await ctx.source.readStream(sourceBytePaths[i]);
76
+ await ctx.target.writeStream(targetBytePaths[i], stream);
77
+ files++;
78
+ }
79
+ return { copied: true, files };
80
+ }
81
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/assets/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `AssetRef` — a single reference record emitted by the ref scanner.
3
+ *
4
+ * Domain concept (where content references an asset), not transport
5
+ * concept (how it moves over HTTP). Lives in the asset domain because:
6
+ *
7
+ * - The ref scanner produces these
8
+ * - The delete orchestrator consumes them (to decide refuse vs remove)
9
+ * - A future usage panel will consume them (same shape, different UI)
10
+ *
11
+ * Zod schema + inferred type in one place — single source of truth. The
12
+ * admin-api's transport schemas import this and wrap it in HTTP-shaped
13
+ * envelopes (e.g. `AssetInUseResponse`); the admin client's types derive
14
+ * from those envelopes. No hand-written parallel interface anywhere.
15
+ */
16
+ import { z } from 'zod';
17
+ /**
18
+ * Where a ref was found. Stable across pages and fragments so any
19
+ * consumer (usage panel, delete dialog, CLI report) renders uniformly.
20
+ *
21
+ * - `path` is the content-root-relative manifest path
22
+ * (e.g. `"pages/home/page.json"`).
23
+ * - `componentPath` is a dotted breadcrumb into the manifest's content
24
+ * tree (`"hero"`, `"banner.image"`, `"gallery[0].photo"`), or `null`
25
+ * when the ref sits at the manifest's top-level content. `null` means
26
+ * "the manifest root" — no sentinel string to compare against.
27
+ */
28
+ export declare const AssetRefSchema: z.ZodObject<{
29
+ source: z.ZodEnum<{
30
+ page: "page";
31
+ fragment: "fragment";
32
+ }>;
33
+ path: z.ZodString;
34
+ componentPath: z.ZodNullable<z.ZodString>;
35
+ }, z.core.$strip>;
36
+ export type AssetRef = z.infer<typeof AssetRefSchema>;
37
+ //# sourceMappingURL=refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/assets/refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc;;;;;;;iBAIzB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `AssetRef` — a single reference record emitted by the ref scanner.
3
+ *
4
+ * Domain concept (where content references an asset), not transport
5
+ * concept (how it moves over HTTP). Lives in the asset domain because:
6
+ *
7
+ * - The ref scanner produces these
8
+ * - The delete orchestrator consumes them (to decide refuse vs remove)
9
+ * - A future usage panel will consume them (same shape, different UI)
10
+ *
11
+ * Zod schema + inferred type in one place — single source of truth. The
12
+ * admin-api's transport schemas import this and wrap it in HTTP-shaped
13
+ * envelopes (e.g. `AssetInUseResponse`); the admin client's types derive
14
+ * from those envelopes. No hand-written parallel interface anywhere.
15
+ */
16
+ import { z } from 'zod';
17
+ /**
18
+ * Where a ref was found. Stable across pages and fragments so any
19
+ * consumer (usage panel, delete dialog, CLI report) renders uniformly.
20
+ *
21
+ * - `path` is the content-root-relative manifest path
22
+ * (e.g. `"pages/home/page.json"`).
23
+ * - `componentPath` is a dotted breadcrumb into the manifest's content
24
+ * tree (`"hero"`, `"banner.image"`, `"gallery[0].photo"`), or `null`
25
+ * when the ref sits at the manifest's top-level content. `null` means
26
+ * "the manifest root" — no sentinel string to compare against.
27
+ */
28
+ export const AssetRefSchema = z.object({
29
+ source: z.enum(['page', 'fragment']),
30
+ path: z.string(),
31
+ componentPath: z.string().nullable(),
32
+ });
33
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/assets/refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAA"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Remove a single locale/theme override from an asset.
3
+ *
4
+ * Author-facing semantics (design-media.md → "Remove French bytes
5
+ * override"):
6
+ * "Always allowed; locale bytes overrides don't own refs independently.
7
+ * Effect: deletes locale bytes + variants + manifest. The locale
8
+ * falls back to default bytes — no broken refs, no code changes in
9
+ * referring pages."
10
+ *
11
+ * Single responsibility: delete the override slice cleanly. Owns:
12
+ * - resolve the override slice from `enumerateAssetStoragePaths`
13
+ * - rm the slice's manifest + bytes + variants in safe order
14
+ * - record one history revision
15
+ *
16
+ * Does NOT own: HTTP, default-asset operations, ref scanning (overrides
17
+ * carry no refs of their own).
18
+ */
19
+ import type { ContentRoot } from '../content-root.js';
20
+ import type { HistoryProvider } from '../history.js';
21
+ import { type Selector } from '../schema/dimensions.js';
22
+ import type { StorageProvider } from '../types.js';
23
+ export interface RemoveOverrideInput {
24
+ storage: StorageProvider;
25
+ assetsRoot: string;
26
+ /** Path prefix for site content (used for content-root construction). */
27
+ siteDir: string;
28
+ assetName: string;
29
+ /** Selector identifying which override to remove. Must be non-null. */
30
+ selector: Selector;
31
+ history?: HistoryProvider;
32
+ author?: string;
33
+ contentRoot?: ContentRoot;
34
+ }
35
+ /**
36
+ * Remove the override slice identified by `selector`. Throws:
37
+ * - `AssetManifestNotFoundError` — the asset doesn't exist OR the
38
+ * specific override doesn't exist on this asset
39
+ * - `AssetStorageError` — underlying rm failed
40
+ */
41
+ export declare function removeOverride(input: RemoveOverrideInput): Promise<void>;
42
+ //# sourceMappingURL=remove-override.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-override.d.ts","sourceRoot":"","sources":["../../src/assets/remove-override.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,OAAO,EAAkC,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAOlD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,eAAe,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,uEAAuE;IACvE,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC9E"}
@@ -0,0 +1,53 @@
1
+ import { recordWrite } from '../history-recorder.js';
2
+ import { selectorsEqual, selectorSuffix } from '../schema/dimensions.js';
3
+ import { createContentRoot } from '../content-root.js';
4
+ import { rmIgnoreMissing } from '../providers/_rm-ignore-missing.js';
5
+ import { enumerateAssetStoragePaths } from './asset-paths.js';
6
+ import { AssetManifestNotFoundError, AssetStorageError } from './errors.js';
7
+ import { readManifest } from './manifest.js';
8
+ /**
9
+ * Remove the override slice identified by `selector`. Throws:
10
+ * - `AssetManifestNotFoundError` — the asset doesn't exist OR the
11
+ * specific override doesn't exist on this asset
12
+ * - `AssetStorageError` — underlying rm failed
13
+ */
14
+ export async function removeOverride(input) {
15
+ const defaultManifest = await readManifest(input.storage, input.assetsRoot, input.assetName);
16
+ const paths = await enumerateAssetStoragePaths(input.storage, input.assetsRoot, defaultManifest);
17
+ const slice = paths.overrides.find(s => selectorsEqual(s.selector, input.selector));
18
+ if (!slice) {
19
+ // Reuse the existing 404 — the override is, from the API's view,
20
+ // a separate addressable resource that doesn't exist.
21
+ throw new AssetManifestNotFoundError(`${input.assetName}${selectorSuffix(input.selector)}`);
22
+ }
23
+ // Removal-safe order for ONE slice: bytes + variants first, manifest
24
+ // last. If interrupted mid-rm, an orphan manifest pointing at missing
25
+ // bytes is the resolver-degrades-gracefully case; the reverse leaves
26
+ // bytes the resolver can never reach (future GC reclaims).
27
+ const orderedPaths = [];
28
+ if (slice.bytes !== null)
29
+ orderedPaths.push(slice.bytes);
30
+ orderedPaths.push(...slice.variants);
31
+ orderedPaths.push(slice.manifest);
32
+ const contentRoot = input.contentRoot ?? createContentRoot(input.storage, input.siteDir);
33
+ if (input.history) {
34
+ const items = orderedPaths.map(path => ({ path, content: null }));
35
+ await recordWrite({
36
+ history: input.history,
37
+ contentRoot,
38
+ operation: 'save',
39
+ author: input.author,
40
+ items,
41
+ message: `Remove ${input.assetName} override (${selectorSuffix(input.selector).slice(1)})`,
42
+ });
43
+ }
44
+ for (const path of orderedPaths) {
45
+ try {
46
+ await rmIgnoreMissing(input.storage, path);
47
+ }
48
+ catch (err) {
49
+ throw new AssetStorageError('delete', path, err);
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=remove-override.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-override.js","sourceRoot":"","sources":["../../src/assets/remove-override.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,WAAW,EAAoB,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAiB,MAAM,yBAAyB,CAAA;AAEvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAe5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAA0B;IAC7D,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAE5F,MAAM,KAAK,GAAG,MAAM,0BAA0B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;IAChG,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IACnF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,iEAAiE;QACjE,sDAAsD;QACtD,MAAM,IAAI,0BAA0B,CAAC,GAAG,KAAK,CAAC,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC7F,CAAC;IAED,qEAAqE;IACrE,sEAAsE;IACtE,qEAAqE;IACrE,2DAA2D;IAC3D,MAAM,YAAY,GAAa,EAAE,CAAA;IACjC,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI;QAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACxD,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IACpC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAEjC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAExF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,KAAK,GAAkB,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAChF,MAAM,WAAW,CAAC;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW;YACX,SAAS,EAAE,MAAM;YACjB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK;YACL,OAAO,EAAE,UAAU,KAAK,CAAC,SAAS,cAAc,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;SAC3F,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { SiteManifest, StorageProvider } from '../types.js';
2
+ import type { ContentRoot } from '../content-root.js';
3
+ import type { HistoryProvider } from '../history.js';
4
+ export interface RenameAssetInput {
5
+ /** Storage holding both the asset and the content tree. */
6
+ storage: StorageProvider;
7
+ /** Path prefix for assets (typically `"assets"`). */
8
+ assetsRoot: string;
9
+ /** Path prefix for site content (where `pages/` and `fragments/` live). */
10
+ siteDir: string;
11
+ /** Existing asset name. */
12
+ oldName: string;
13
+ /** Target name. Must not already exist. */
14
+ newName: string;
15
+ /** Project-level manifest passed to `loadSite`. */
16
+ manifest?: SiteManifest;
17
+ /** Optional — record one revision covering the whole operation. */
18
+ history?: HistoryProvider;
19
+ /** Author identifier passed through to the history revision. */
20
+ author?: string;
21
+ /**
22
+ * Optional content root. When omitted, one is built from `storage`
23
+ * + `siteDir`. Tests pass an explicit one to share a single root
24
+ * with other operations.
25
+ */
26
+ contentRoot?: ContentRoot;
27
+ }
28
+ export interface RenameAssetResult {
29
+ /** How many references were rewritten across all manifests. */
30
+ readonly refsRewritten: number;
31
+ /** How many distinct manifests were touched. */
32
+ readonly manifestsRewritten: number;
33
+ }
34
+ /**
35
+ * Rename `oldName` → `newName`. Throws:
36
+ * - `AssetManifestNotFoundError` — old asset missing
37
+ * - `AssetNameCollisionError` — new name already taken
38
+ * - `AssetMimeUnsupportedError` — old asset's MIME has no extension
39
+ * mapping (misconfiguration; thrown during path enumeration)
40
+ * - `AssetStorageError` — any underlying read/write/rm failure
41
+ */
42
+ export declare function renameAsset(input: RenameAssetInput): Promise<RenameAssetResult>;
43
+ //# sourceMappingURL=rename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../../src/assets/rename.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAqB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAapD,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,OAAO,EAAE,eAAe,CAAA;IACxB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAA;IACf,mDAAmD;IACnD,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,mEAAmE;IACnE,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;CACpC;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmOrF"}