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