gazetta 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin-dist/assets/index-BO9-CXmW.css +1 -0
- package/admin-dist/assets/index-Ufu8zZH_.js +668 -0
- package/admin-dist/index.html +2 -2
- package/dist/admin-api/error-response.d.ts +21 -0
- package/dist/admin-api/error-response.d.ts.map +1 -0
- package/dist/admin-api/error-response.js +12 -0
- package/dist/admin-api/error-response.js.map +1 -0
- package/dist/admin-api/index.d.ts +0 -2
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +4 -24
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/routes/assets.d.ts +16 -0
- package/dist/admin-api/routes/assets.d.ts.map +1 -0
- package/dist/admin-api/routes/assets.js +433 -0
- package/dist/admin-api/routes/assets.js.map +1 -0
- package/dist/admin-api/routes/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +30 -4
- package/dist/admin-api/routes/fragments.js.map +1 -1
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +37 -4
- package/dist/admin-api/routes/pages.js.map +1 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +68 -35
- package/dist/admin-api/routes/publish.js.map +1 -1
- package/dist/admin-api/schemas/assets.d.ts +48 -0
- package/dist/admin-api/schemas/assets.d.ts.map +1 -0
- package/dist/admin-api/schemas/assets.js +44 -0
- package/dist/admin-api/schemas/assets.js.map +1 -0
- package/dist/admin-api/schemas/index.d.ts +2 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -1
- package/dist/admin-api/schemas/index.js +2 -0
- package/dist/admin-api/schemas/index.js.map +1 -1
- package/dist/admin-api/source-context.d.ts +0 -7
- package/dist/admin-api/source-context.d.ts.map +1 -1
- package/dist/admin-api/source-context.js +0 -3
- package/dist/admin-api/source-context.js.map +1 -1
- package/dist/assets/analyze-audio.d.ts +3 -0
- package/dist/assets/analyze-audio.d.ts.map +1 -0
- package/dist/assets/analyze-audio.js +80 -0
- package/dist/assets/analyze-audio.js.map +1 -0
- package/dist/assets/analyze-image.d.ts +19 -0
- package/dist/assets/analyze-image.d.ts.map +1 -0
- package/dist/assets/analyze-image.js +123 -0
- package/dist/assets/analyze-image.js.map +1 -0
- package/dist/assets/analyze.d.ts +94 -0
- package/dist/assets/analyze.d.ts.map +1 -0
- package/dist/assets/analyze.js +45 -0
- package/dist/assets/analyze.js.map +1 -0
- package/dist/assets/asset-deps.d.ts +30 -0
- package/dist/assets/asset-deps.d.ts.map +1 -0
- package/dist/assets/asset-deps.js +42 -0
- package/dist/assets/asset-deps.js.map +1 -0
- package/dist/assets/asset-paths.d.ts +155 -0
- package/dist/assets/asset-paths.d.ts.map +1 -0
- package/dist/assets/asset-paths.js +197 -0
- package/dist/assets/asset-paths.js.map +1 -0
- package/dist/assets/delete.d.ts +75 -0
- package/dist/assets/delete.d.ts.map +1 -0
- package/dist/assets/delete.js +82 -0
- package/dist/assets/delete.js.map +1 -0
- package/dist/assets/errors.d.ts +241 -0
- package/dist/assets/errors.d.ts.map +1 -0
- package/dist/assets/errors.js +300 -0
- package/dist/assets/errors.js.map +1 -0
- package/dist/assets/find-refs.d.ts +37 -0
- package/dist/assets/find-refs.d.ts.map +1 -0
- package/dist/assets/find-refs.js +35 -0
- package/dist/assets/find-refs.js.map +1 -0
- package/dist/assets/hash.d.ts +13 -0
- package/dist/assets/hash.d.ts.map +1 -0
- package/dist/assets/hash.js +43 -0
- package/dist/assets/hash.js.map +1 -0
- package/dist/assets/image-metadata.d.ts +11 -0
- package/dist/assets/image-metadata.d.ts.map +1 -0
- package/dist/assets/image-metadata.js +31 -0
- package/dist/assets/image-metadata.js.map +1 -0
- package/dist/assets/ingest-locale.d.ts +86 -0
- package/dist/assets/ingest-locale.d.ts.map +1 -0
- package/dist/assets/ingest-locale.js +209 -0
- package/dist/assets/ingest-locale.js.map +1 -0
- package/dist/assets/ingest.d.ts +96 -0
- package/dist/assets/ingest.d.ts.map +1 -0
- package/dist/assets/ingest.js +308 -0
- package/dist/assets/ingest.js.map +1 -0
- package/dist/assets/kind-compat.d.ts +34 -0
- package/dist/assets/kind-compat.d.ts.map +1 -0
- package/dist/assets/kind-compat.js +33 -0
- package/dist/assets/kind-compat.js.map +1 -0
- package/dist/assets/list.d.ts +46 -0
- package/dist/assets/list.d.ts.map +1 -0
- package/dist/assets/list.js +102 -0
- package/dist/assets/list.js.map +1 -0
- package/dist/assets/manifest-default.d.ts +56 -0
- package/dist/assets/manifest-default.d.ts.map +1 -0
- package/dist/assets/manifest-default.js +120 -0
- package/dist/assets/manifest-default.js.map +1 -0
- package/dist/assets/manifest-filename.d.ts +52 -0
- package/dist/assets/manifest-filename.d.ts.map +1 -0
- package/dist/assets/manifest-filename.js +104 -0
- package/dist/assets/manifest-filename.js.map +1 -0
- package/dist/assets/manifest-locale.d.ts +60 -0
- package/dist/assets/manifest-locale.d.ts.map +1 -0
- package/dist/assets/manifest-locale.js +206 -0
- package/dist/assets/manifest-locale.js.map +1 -0
- package/dist/assets/manifest-merge.d.ts +66 -0
- package/dist/assets/manifest-merge.d.ts.map +1 -0
- package/dist/assets/manifest-merge.js +82 -0
- package/dist/assets/manifest-merge.js.map +1 -0
- package/dist/assets/manifest.d.ts +83 -0
- package/dist/assets/manifest.d.ts.map +1 -0
- package/dist/assets/manifest.js +93 -0
- package/dist/assets/manifest.js.map +1 -0
- package/dist/assets/mime-sniff.d.ts +18 -0
- package/dist/assets/mime-sniff.d.ts.map +1 -0
- package/dist/assets/mime-sniff.js +84 -0
- package/dist/assets/mime-sniff.js.map +1 -0
- package/dist/assets/preprocess-svg.d.ts +3 -0
- package/dist/assets/preprocess-svg.d.ts.map +1 -0
- package/dist/assets/preprocess-svg.js +49 -0
- package/dist/assets/preprocess-svg.js.map +1 -0
- package/dist/assets/preprocess.d.ts +62 -0
- package/dist/assets/preprocess.d.ts.map +1 -0
- package/dist/assets/preprocess.js +86 -0
- package/dist/assets/preprocess.js.map +1 -0
- package/dist/assets/publish-plan.d.ts +41 -0
- package/dist/assets/publish-plan.d.ts.map +1 -0
- package/dist/assets/publish-plan.js +49 -0
- package/dist/assets/publish-plan.js.map +1 -0
- package/dist/assets/publish.d.ts +33 -0
- package/dist/assets/publish.d.ts.map +1 -0
- package/dist/assets/publish.js +81 -0
- package/dist/assets/publish.js.map +1 -0
- package/dist/assets/refs.d.ts +37 -0
- package/dist/assets/refs.d.ts.map +1 -0
- package/dist/assets/refs.js +33 -0
- package/dist/assets/refs.js.map +1 -0
- package/dist/assets/remove-override.d.ts +42 -0
- package/dist/assets/remove-override.d.ts.map +1 -0
- package/dist/assets/remove-override.js +53 -0
- package/dist/assets/remove-override.js.map +1 -0
- package/dist/assets/rename.d.ts +43 -0
- package/dist/assets/rename.d.ts.map +1 -0
- package/dist/assets/rename.js +271 -0
- package/dist/assets/rename.js.map +1 -0
- package/dist/assets/replace.d.ts +37 -0
- package/dist/assets/replace.d.ts.map +1 -0
- package/dist/assets/replace.js +195 -0
- package/dist/assets/replace.js.map +1 -0
- package/dist/assets/resolve.d.ts +141 -0
- package/dist/assets/resolve.d.ts.map +1 -0
- package/dist/assets/resolve.js +381 -0
- package/dist/assets/resolve.js.map +1 -0
- package/dist/assets/rewrite-manifest-asset-ref.d.ts +44 -0
- package/dist/assets/rewrite-manifest-asset-ref.d.ts.map +1 -0
- package/dist/assets/rewrite-manifest-asset-ref.js +51 -0
- package/dist/assets/rewrite-manifest-asset-ref.js.map +1 -0
- package/dist/assets/scan-manifest-for-asset.d.ts +63 -0
- package/dist/assets/scan-manifest-for-asset.d.ts.map +1 -0
- package/dist/assets/scan-manifest-for-asset.js +105 -0
- package/dist/assets/scan-manifest-for-asset.js.map +1 -0
- package/dist/assets/serve-route.d.ts +45 -0
- package/dist/assets/serve-route.d.ts.map +1 -0
- package/dist/assets/serve-route.js +123 -0
- package/dist/assets/serve-route.js.map +1 -0
- package/dist/assets/svg-sanitize.d.ts +38 -0
- package/dist/assets/svg-sanitize.d.ts.map +1 -0
- package/dist/assets/svg-sanitize.js +209 -0
- package/dist/assets/svg-sanitize.js.map +1 -0
- package/dist/assets/update-metadata.d.ts +61 -0
- package/dist/assets/update-metadata.d.ts.map +1 -0
- package/dist/assets/update-metadata.js +82 -0
- package/dist/assets/update-metadata.js.map +1 -0
- package/dist/assets/url.d.ts +82 -0
- package/dist/assets/url.d.ts.map +1 -0
- package/dist/assets/url.js +103 -0
- package/dist/assets/url.js.map +1 -0
- package/dist/assets/validate.d.ts +74 -0
- package/dist/assets/validate.d.ts.map +1 -0
- package/dist/assets/validate.js +136 -0
- package/dist/assets/validate.js.map +1 -0
- package/dist/assets/variants.d.ts +23 -0
- package/dist/assets/variants.d.ts.map +1 -0
- package/dist/assets/variants.js +74 -0
- package/dist/assets/variants.js.map +1 -0
- package/dist/cli/assets-cli.d.ts +58 -0
- package/dist/cli/assets-cli.d.ts.map +1 -0
- package/dist/cli/assets-cli.js +233 -0
- package/dist/cli/assets-cli.js.map +1 -0
- package/dist/cli/assets-display.d.ts +112 -0
- package/dist/cli/assets-display.d.ts.map +1 -0
- package/dist/cli/assets-display.js +106 -0
- package/dist/cli/assets-display.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +0 -2
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +0 -1
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/index.js +64 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +15 -12
- package/dist/compare.js.map +1 -1
- package/dist/dep-sidecars.d.ts +127 -0
- package/dist/dep-sidecars.d.ts.map +1 -0
- package/dist/dep-sidecars.js +122 -0
- package/dist/dep-sidecars.js.map +1 -0
- package/dist/editor/AssetEmbeddedWidget.d.ts +3 -0
- package/dist/editor/AssetEmbeddedWidget.d.ts.map +1 -0
- package/dist/editor/AssetEmbeddedWidget.js +146 -0
- package/dist/editor/AssetEmbeddedWidget.js.map +1 -0
- package/dist/editor/mount.d.ts +12 -1
- package/dist/editor/mount.d.ts.map +1 -1
- package/dist/editor/mount.js +36 -5
- package/dist/editor/mount.js.map +1 -1
- package/dist/format.d.ts +44 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +65 -0
- package/dist/format.js.map +1 -0
- package/dist/fragment-deps.d.ts +24 -0
- package/dist/fragment-deps.d.ts.map +1 -0
- package/dist/fragment-deps.js +20 -0
- package/dist/fragment-deps.js.map +1 -0
- package/dist/hash.d.ts +0 -6
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +0 -18
- package/dist/hash.js.map +1 -1
- package/dist/history-provider.d.ts.map +1 -1
- package/dist/history-provider.js +30 -8
- package/dist/history-provider.js.map +1 -1
- package/dist/history-recorder.d.ts +7 -3
- package/dist/history-recorder.d.ts.map +1 -1
- package/dist/history-recorder.js +9 -1
- package/dist/history-recorder.js.map +1 -1
- package/dist/history-restorer.d.ts.map +1 -1
- package/dist/history-restorer.js +34 -2
- package/dist/history-restorer.js.map +1 -1
- package/dist/history.d.ts +26 -8
- package/dist/history.d.ts.map +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +20 -0
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +38 -0
- package/dist/locale.js.map +1 -1
- package/dist/providers/_atomic-write.d.ts +9 -0
- package/dist/providers/_atomic-write.d.ts.map +1 -0
- package/dist/providers/_atomic-write.js +72 -0
- package/dist/providers/_atomic-write.js.map +1 -0
- package/dist/providers/_rm-ignore-missing.d.ts +31 -0
- package/dist/providers/_rm-ignore-missing.d.ts.map +1 -0
- package/dist/providers/_rm-ignore-missing.js +12 -0
- package/dist/providers/_rm-ignore-missing.js.map +1 -0
- package/dist/providers/_stream-interop.d.ts +23 -0
- package/dist/providers/_stream-interop.d.ts.map +1 -0
- package/dist/providers/_stream-interop.js +21 -0
- package/dist/providers/_stream-interop.js.map +1 -0
- package/dist/providers/azure-blob.d.ts.map +1 -1
- package/dist/providers/azure-blob.js +60 -0
- package/dist/providers/azure-blob.js.map +1 -1
- package/dist/providers/filesystem.d.ts +4 -0
- package/dist/providers/filesystem.d.ts.map +1 -1
- package/dist/providers/filesystem.js +63 -2
- package/dist/providers/filesystem.js.map +1 -1
- package/dist/providers/s3.d.ts.map +1 -1
- package/dist/providers/s3.js +84 -1
- package/dist/providers/s3.js.map +1 -1
- package/dist/publish-rendered.d.ts +37 -17
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +71 -67
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish.d.ts +13 -12
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +23 -47
- package/dist/publish.js.map +1 -1
- package/dist/resolver.d.ts +12 -2
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +54 -9
- package/dist/resolver.js.map +1 -1
- package/dist/schema/dimensions.d.ts +78 -0
- package/dist/schema/dimensions.d.ts.map +1 -0
- package/dist/schema/dimensions.js +97 -0
- package/dist/schema/dimensions.js.map +1 -0
- package/dist/schema/helpers.d.ts +108 -0
- package/dist/schema/helpers.d.ts.map +1 -0
- package/dist/schema/helpers.js +133 -0
- package/dist/schema/helpers.js.map +1 -0
- package/dist/schema/index.d.ts +27 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +25 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/types.d.ts +390 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +25 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/selector-chain.d.ts +63 -0
- package/dist/selector-chain.d.ts.map +1 -0
- package/dist/selector-chain.js +58 -0
- package/dist/selector-chain.js.map +1 -0
- package/dist/sidecars.d.ts +19 -18
- package/dist/sidecars.d.ts.map +1 -1
- package/dist/sidecars.js +70 -62
- package/dist/sidecars.js.map +1 -1
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +15 -37
- package/dist/targets.js.map +1 -1
- package/dist/themes.d.ts +69 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +85 -0
- package/dist/themes.js.map +1 -0
- package/dist/transforms/adapter.d.ts +115 -0
- package/dist/transforms/adapter.d.ts.map +1 -0
- package/dist/transforms/adapter.js +2 -0
- package/dist/transforms/adapter.js.map +1 -0
- package/dist/transforms/cloudflare.d.ts +17 -0
- package/dist/transforms/cloudflare.d.ts.map +1 -0
- package/dist/transforms/cloudflare.js +110 -0
- package/dist/transforms/cloudflare.js.map +1 -0
- package/dist/transforms/index.d.ts +24 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +30 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/sharp.d.ts +3 -0
- package/dist/transforms/sharp.d.ts.map +1 -0
- package/dist/transforms/sharp.js +43 -0
- package/dist/transforms/sharp.js.map +1 -0
- package/dist/types.d.ts +125 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +20 -1
- package/admin-dist/assets/index-B6pVot0Y.css +0 -1
- package/admin-dist/assets/index-DniLwxJA.js +0 -609
- package/dist/providers/r2.d.ts +0 -8
- package/dist/providers/r2.d.ts.map +0 -1
- package/dist/providers/r2.js +0 -86
- package/dist/providers/r2.js.map +0 -1
- package/dist/source-sidecars.d.ts +0 -32
- package/dist/source-sidecars.d.ts.map +0 -1
- package/dist/source-sidecars.js +0 -98
- package/dist/source-sidecars.js.map +0 -1
|
@@ -0,0 +1,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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAIhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAChF,OAAO,EAAE,WAAW,EAAoB,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAChH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAgB,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAmCtC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAuB;IACvD,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAA;IACpD,CAAC;IAED,mEAAmE;IACnE,qCAAqC;IACrC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAEtF,+DAA+D;IAC/D,oEAAoE;IACpE,yDAAyD;IACzD,MAAM,cAAc,GAAG,GAAG,KAAK,CAAC,UAAU,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;IAC3E,IAAI,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClD,CAAC;IAED,qEAAqE;IACrE,qEAAqE;IACrE,qEAAqE;IACrE,mEAAmE;IACnE,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAC/F,mEAAmE;IACnE,iEAAiE;IACjE,uDAAuD;IACvD,oEAAoE;IACpE,kEAAkE;IAClE,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,iBAAiB,CACzB,OAAO,EACP,QAAQ,CAAC,eAAe,EACxB,IAAI,KAAK,CACP,kBAAkB,KAAK,CAAC,OAAO,iBAAiB,QAAQ,CAAC,SAAS,CAAC,MAAM,8DAA8D,CACxI,CACF,CAAA;IACH,CAAC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,8DAA8D;QAC9D,qDAAqD;QACrD,MAAM,IAAI,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrD,CAAC;IAED,uEAAuE;IACvE,wEAAwE;IACxE,MAAM,WAAW,GAAmB,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjE,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,qBAAqB,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC;QAC1E,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAA;IACH,MAAM,WAAW,GAAkB;QACjC,GAAG,WAAW;QACd,IAAI,EAAE,KAAK,CAAC,OAAO;QACnB,QAAQ,EAAE,WAAW;KACtB,CAAA;IACD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACxE,MAAM,WAAW,GAAG,GAAG,KAAK,CAAC,UAAU,IAAI,WAAW,EAAE,CAAA;IAExD,uDAAuD;IACvD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACxF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;IAStE,MAAM,QAAQ,GAAc,EAAE,CAAA;IAC9B,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,uBAAuB,CAAC;YACpE,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,KAAK,CAAC,OAAO;YAC5B,WAAW,EAAE,KAAK,CAAC,OAAO;SAC3B,CAAC,CAAA;QACF,IAAI,YAAY,KAAK,CAAC;YAAE,SAAQ;QAChC,aAAa,IAAI,YAAY,CAAA;QAC7B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;YACvD,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;YACzE,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;SAC3E,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,uBAAuB,CAAC;YACpE,QAAQ,EAAE,QAAQ;YAClB,aAAa,EAAE,KAAK,CAAC,OAAO;YAC5B,WAAW,EAAE,KAAK,CAAC,OAAO;SAC3B,CAAC,CAAA;QACF,IAAI,YAAY,KAAK,CAAC;YAAE,SAAQ;QAChC,aAAa,IAAI,YAAY,CAAA;QAC7B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC;YAC/D,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;YACzE,WAAW,EAAE,QAAQ;YACrB,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE;SACnF,CAAC,CAAA;IACJ,CAAC;IAED,mEAAmE;IACnE,oEAAoE;IACpE,kEAAkE;IAClE,qEAAqE;IACrE,kEAAkE;IAClE,+DAA+D;IAC/D,IAAI,YAAwB,CAAA;IAC5B,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IACjE,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAA;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrD,MAAM,aAAa,GAAG,GAAG,KAAK,CAAC,UAAU,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAA;QAC5E,IAAI,CAAC;YACH,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,IAAI,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;QAC/G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAA;QACzD,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,mCAAmC;IACnC,gCAAgC;IAChC,yCAAyC;IACzC,mCAAmC;IACnC,yDAAyD;IACzD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,KAAK,GAAkB;YAC3B,uBAAuB;YACvB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAC9E,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE;YAC5C,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvB,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE;gBACrC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,CAAE;aAC5D,CAAC,CAAC;YACH,eAAe;YACf,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/D,2BAA2B;YAC3B,EAAE,IAAI,EAAE,QAAQ,CAAC,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE;YACjD,EAAE,IAAI,EAAE,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE;YAC9C,GAAG,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;SACnE,CAAA;QACD,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,OAAO,MAAM,KAAK,CAAC,OAAO,EAAE;SACtD,CAAC,CAAA;IACJ,CAAC;IAED,mEAAmE;IACnE,oEAAoE;IACpE,8DAA8D;IAC9D,mEAAmE;IACnE,iEAAiE;IACjE,cAAc;IACd,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAA;IACxD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,+DAA+D;IAC/D,iEAAiE;IACjE,2DAA2D;IAC3D,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAEjE,gEAAgE;IAChE,kEAAkE;IAClE,8DAA8D;IAC9D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,qEAAqE;IACrE,iEAAiE;IACjE,sEAAsE;IACtE,gCAAgC;IAChC,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACf,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QAC9E,sCAAsC;QACtC,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAA;IAC3F,CAAC,CAAC,CACH,CACF,CAAA;IAED,mEAAmE;IACnE,qEAAqE;IACrE,2EAA2E;IAC3E,wEAAwE;IACxE,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,eAAe,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,YAAY,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAA;IACtG,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,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;IAED,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAA;AAC/D,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,QAA2B;IACrD,MAAM,IAAI,GAA4B,EAAE,GAAG,QAAQ,EAAE,CAAA;IACrD,OAAO,IAAI,CAAC,GAAG,CAAA;IACf,OAAO,IAAoC,CAAA;AAC7C,CAAC;AAED,SAAS,kBAAkB,CACzB,IAA2B,EAC3B,QAAgB,EAChB,QAA6B,EAC7B,MAA0B;IAE1B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,OAAO,CAAA;IACvE,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -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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"}
|