@murumets-ee/content 0.95.0 → 0.97.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/dist/admin.mjs +1 -1
- package/dist/block-resolver.d.mts +19 -1
- package/dist/block-resolver.d.mts.map +1 -1
- package/dist/block-resolver.mjs +1 -1
- package/dist/block-resolver.mjs.map +1 -1
- package/dist/client.mjs +1 -1
- package/dist/plugin-DmyWYmuE.mjs +2 -0
- package/dist/plugin-DmyWYmuE.mjs.map +1 -0
- package/dist/plugin.mjs +1 -1
- package/dist/{resolve-context-D8UXwWwr.mjs → resolve-context-DklN53BH.mjs} +2 -2
- package/dist/{resolve-context-D8UXwWwr.mjs.map → resolve-context-DklN53BH.mjs.map} +1 -1
- package/dist/resolve.d.mts +9 -0
- package/dist/resolve.d.mts.map +1 -1
- package/dist/resolve.mjs +1 -1
- package/dist/{routes-DlvqU8bO.mjs → routes-B6TJ5qiR.mjs} +2 -2
- package/dist/{routes-DlvqU8bO.mjs.map → routes-B6TJ5qiR.mjs.map} +1 -1
- package/dist/{schema-IML1rRU_.mjs → schema-LlK6EkOJ.mjs} +2 -2
- package/dist/{schema-IML1rRU_.mjs.map → schema-LlK6EkOJ.mjs.map} +1 -1
- package/dist/{versions-B8feZTS9.mjs → versions-C5_IJpI8.mjs} +2 -2
- package/dist/{versions-B8feZTS9.mjs.map → versions-C5_IJpI8.mjs.map} +1 -1
- package/package.json +10 -10
- package/dist/plugin-ChCEq_Qy.mjs +0 -2
- package/dist/plugin-ChCEq_Qy.mjs.map +0 -1
package/dist/admin.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e,r as t,t as n}from"./routes-
|
|
1
|
+
import{n as e,r as t,t as n}from"./routes-B6TJ5qiR.mjs";export{e as PATH_RESOLVE_PERMISSION,t as pathRoutes,n as redirectRoutes};
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
import { Entity } from "@murumets-ee/entity";
|
|
2
2
|
import { ToolkitApp } from "@murumets-ee/core";
|
|
3
|
-
import { CollectionFieldLookup, CollectionResult, CollectionSourceSpec, DocumentBreadcrumb, DocumentDetail, DocumentDetailPart, FindManyClientLike, LiveValues, TemplateNamespace } from "@murumets-ee/blocks/server";
|
|
3
|
+
import { CollectionFieldLookup, CollectionResult, CollectionSourceSpec, DocumentBreadcrumb, DocumentDetail, DocumentDetailPart, EmbedLookup, EmbedReference, FindManyClientLike, LiveValues, TemplateNamespace } from "@murumets-ee/blocks/server";
|
|
4
4
|
|
|
5
|
+
//#region src/embedded-documents.d.ts
|
|
6
|
+
/** What the resolver needs to expand embeds; omitted → embeds show nothing. */
|
|
7
|
+
interface EmbeddedDocumentDeps {
|
|
8
|
+
readonly lookup: EmbedLookup;
|
|
9
|
+
/**
|
|
10
|
+
* The PUBLISHED top-level blocks of each referenced document, keyed by
|
|
11
|
+
* `embedReferenceKey`. A document that is unpublished, trashed, of another
|
|
12
|
+
* site or absent has NO entry. Must not throw for one bad id.
|
|
13
|
+
*/
|
|
14
|
+
readonly load: (refs: readonly EmbedReference[], locale: string) => Promise<ReadonlyMap<string, readonly unknown[]>>;
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
5
17
|
//#region src/block-resolver.d.ts
|
|
6
18
|
/** Structural mirror of `content-api`'s `MediaProjection`. */
|
|
7
19
|
interface BlockMediaProjection {
|
|
@@ -206,6 +218,12 @@ interface BlockResolverDeps {
|
|
|
206
218
|
readonly steps: readonly DocumentBreadcrumb[];
|
|
207
219
|
readonly ancestors: readonly BlockTreeRef[];
|
|
208
220
|
} | undefined>) | undefined;
|
|
221
|
+
/**
|
|
222
|
+
* Embedded documents (forms D002) — a block that names another document
|
|
223
|
+
* shows that document's PUBLISHED tree in its place. Omit and every embed
|
|
224
|
+
* shows nothing, deny-by-default like `collections`.
|
|
225
|
+
*/
|
|
226
|
+
embeddedDocuments?: EmbeddedDocumentDeps | undefined;
|
|
209
227
|
}
|
|
210
228
|
/**
|
|
211
229
|
* Resolve one stored block tree into a {@link ResolvedBlockTree}.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-resolver.d.mts","names":[],"sources":["../src/block-resolver.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"block-resolver.d.mts","names":[],"sources":["../src/embedded-documents.ts","../src/block-resolver.ts"],"mappings":"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"}
|
package/dist/block-resolver.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e,t}from"./resolve-context-D8UXwWwr.mjs";import{r as n}from"./enumerate-CYHJKQz6.mjs";import{n as r}from"./breadcrumbs-BqSuMNac.mjs";import{collectLinkValues as i,linkValueKey as a}from"@murumets-ee/blocks/links";import{breadcrumbLabelOf as o,canvasSiteFormat as s,collectBoundColumnsInTree as c,createCollectionReader as l,detailNeedsBody as u,detailPartsInTree as d,effectiveCollectionSources as f,effectiveDetailSpecs as p,hasConfiguredLiveSources as m,loadCanvasLiveValues as h,materializeServerTemplate as g,readSpotCrop as _,resolveDocumentDetail as v,resolveLinks as y,resolveTreeCollections as b,sameSpotCrop as x,serverBlockStructureLookup as S,serverBoundColumnsInTree as C,serverCollectionFieldLookup as w,serverTemplateMaterializer as T,templateNamespace as E}from"@murumets-ee/blocks/server";const D=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function O(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function k(e){return Array.isArray(e)}const A=new Set(Object.keys({id:!0,url:!0,mimeType:!0,width:!0,height:!0,alt:!0,title:!0,variants:!0,sources:!0,avifSources:!0,focalPoint:!0,blurDataUrl:!0,crop:!0,spotSources:!0}));function j(e,t){if(!O(e))return null;let n=e.id;if(typeof n!=`string`||!D.test(n)||typeof e.url!=`string`||e.url===``)return null;let r=Object.keys(e).filter(e=>!A.has(e));return r.length>0?(t?.(r),null):!M(e.alt,`string`)||!M(e.title,`string`)||!M(e.mimeType,`string`)||!M(e.width,`number`)||!M(e.height,`number`)||!M(e.blurDataUrl,`string`)||e.variants!==void 0&&e.variants!==null&&!O(e.variants)||e.focalPoint!==void 0&&e.focalPoint!==null&&!O(e.focalPoint)||e.sources!==void 0&&e.sources!==null&&(!O(e.sources)||!Object.values(e.sources).every(e=>Array.isArray(e)))||e.avifSources!==void 0&&e.avifSources!==null&&(!O(e.avifSources)||!Object.values(e.avifSources).every(e=>Array.isArray(e)))||e.crop!==void 0&&e.crop!==null&&!O(e.crop)||e.spotSources!==void 0&&e.spotSources!==null&&!Array.isArray(e.spotSources)?null:n}function M(e,t){return e==null||typeof e===t}function N(e,t,n,r){if(n>256){r.truncated=!0;return}let i=e=>{for(let t of e)r.nearMissKeys.add(t)};if(k(e)){for(let a=0;a<e.length;a+=1){let o=j(e[a],i);o===null?N(e[a],t,n+1,r):t.push({container:e,key:a,id:o,crop:_(e[a])})}return}if(O(e))for(let[a,o]of Object.entries(e)){let s=j(o,i);s===null?N(o,t,n+1,r):t.push({container:e,key:a,id:s,crop:_(o)})}}function P(e){let t={id:e.id,url:e.url,variants:e.variants,focalPoint:e.focalPoint,sources:e.sources};return e.avifSources!==void 0&&Object.keys(e.avifSources).length>0&&(t.avifSources=e.avifSources),e.mimeType!==null&&(t.mimeType=e.mimeType),e.width!==null&&(t.width=e.width),e.height!==null&&(t.height=e.height),e.alt!==null&&(t.alt=e.alt),e.title!==null&&(t.title=e.title),e.blurDataUrl!==null&&(t.blurDataUrl=e.blurDataUrl),t}function F(e,t){if(!(t===void 0||e.spotSources===void 0))return e.spotSources.find(e=>x(e.crop,t)&&e.sources.length>0)}function I(e,t){let n=P(e),r=F(e,t),i=r?.sources[r.sources.length-1];if(r!==void 0&&i!==void 0){n.url=i.url,n.width=i.width,n.height=i.height,n.focalPoint={x:.5,y:.5},n.sources={natural:r.sources};let e=r.avifSources;e!==void 0&&e.length===r.sources.length&&e.every((e,t)=>e.width===r.sources[t]?.width&&e.height===r.sources[t]?.height)?n.avifSources={natural:e}:delete n.avifSources}return n.crop={x:t.x,y:t.y,w:t.w,h:t.h},n}function L(e,t){let n=t===null?null:e.crop===void 0?P(t):I(t,e.crop);if(Array.isArray(e.container)){typeof e.key==`number`&&(e.container[e.key]=n);return}typeof e.key==`string`&&(e.container[e.key]=n)}async function R(e,t,n){let r=e,o=[];if(t.template!==void 0){let e=t.boundValues?.id;if(typeof e==`string`&&e!==``){let i=(n.materializeTemplate??g)(t.template,E(t.entity,e));r=i.blocks,o=i.boundColumns}else r=[],n.logger?.warn({entity:t.entity,field:t.field},`content: a templated document arrived without its row id, so its template is served EMPTY — its block ids could not be namespaced to it (editor F124)`)}else if(t.rowIsForeign!==!0&&t.boundValues!==void 0&&k(e))try{o=(n.boundColumnsOf??C)(e)}catch(e){n.logger?.warn({err:e,entity:t.entity,field:t.field},`content: could not enumerate the bound columns of a block tree, so its bound-field links render plain`)}let s=t.boundValues??{},c=o.filter(e=>Object.hasOwn(s,e)).map(e=>s[e]);if(!k(r))throw n.logger?.warn({entity:t.entity,field:t.field},`content: stored block tree is not an array — nothing to resolve, so this field is served EMPTY rather than as stored (the caller retries this throw with an exhausted budget, and a non-array fails that identically)`),TypeError(`content: block tree \`${t.entity}.${t.field}\` is not an array; nothing to resolve.`);let l=[],u={truncated:!1,nearMissKeys:new Set};N(r,l,0,u),u.truncated&&n.logger?.warn({entity:t.entity,field:t.field,cap:256},`content: block tree is nested deeper than the media walk descends — any media ref below the bound keeps the url recorded when an editor picked it, which may be signed`),u.nearMissKeys.size>0&&n.logger?.debug({entity:t.entity,field:t.field,keys:[...u.nearMissKeys].sort()},`content: a value looked like a media ref but carried keys outside the projection, so it was left alone. If these are media refs, they keep their stored urls`);let f=[...i(r,64),...i(c,64)],p=[],m=[];for(let e of f)e.kind===`media`&&(D.test(e.id)?p.push(e.id):m.push({kind:`link`,ref:a(e),reason:`unresolvable`}));let h=H([...l.map(e=>e.id),...p]),_=[];for(let e of f)e.kind===`entity`&&(D.test(e.id)?_.push(U(e.entity,e.id)):m.push({kind:`link`,ref:a(e),reason:`unresolvable`}));let v=[...m];!n.resolveMedia&&h.length>0&&n.logger?.debug({entity:t.entity,field:t.field,count:h.length},`content: no media resolver wired for block trees — every media ref resolves to null`);let b=n.resolveMedia?t.budget.claim(`block`,h.length):0,x=h.slice(0,b),S=n.resolveMedia?new Set(h.slice(b)):new Set;for(let e of h.slice(b))v.push({kind:`media`,ref:e,reason:S.has(e)?`budget`:`unresolvable`});let w=H(_),T=t.budget.claim(`block`,w.length),O=w.slice(0,T),A=new Set(w.slice(T)),j=await G(x,t.locale,n,t.entity);for(let e of l)L(e,j.get(e.id)??null);for(let e of x)j.has(e)||v.push({kind:`media`,ref:e,reason:`unresolvable`});let M=await K(O,t.locale,n,t.entity),P=await y(f,{renderContext:`request`,locale:t.locale,resolveEntityHref:({entity:e,id:t})=>M.get(U(e,t))??null,resolveMediaHref:e=>j.get(e)?.url??null}),F={};for(let[e,t]of P)F[e]=t.href;for(let e of f){if(e.kind!==`entity`&&e.kind!==`media`)continue;let t=a(e);F[t]!==null&&F[t]!==void 0||v.push({kind:`link`,ref:t,reason:V(e,A,S)})}let I=n.resolveLiveValues,R=I===void 0?0:t.budget.claim(`block`,1),[{results:B,cardMedia:q},J]=await Promise.all([z(r,t,n),R>0&&I!==void 0?(async()=>I(r,t.locale))().catch(e=>{n.logger?.warn({err:e},`blocks: resolveLiveValues rejected; this tree draws no live values`)}):Promise.resolve(void 0)]),Y,X=[];if(t.boundValues!==void 0){let e=d(k(r)?r:[]),i=new Set(e);if(i.delete(`breadcrumbs`),n.resolveDetail!==void 0)try{let e=i;if(e.has(`body`)&&n.detailNeedsBody?.(t.entity,e,t.boundValues)===!0&&t.budget.claim(`block`,1)<1){let r=new Set(e);r.delete(`body`),e=r,n.logger?.warn({entity:t.entity,field:t.field},`blocks: the response budget is spent; this tree is delivered without its HTML body`)}e.size>0&&(Y=n.resolveDetail(t.entity,t.boundValues,t.locale,e))}catch(e){n.logger?.warn({err:e,entity:t.entity},`blocks: resolveDetail threw; this tree carries no detail`)}if(e.has(`breadcrumbs`)&&n.resolveBreadcrumbs!==void 0)if(t.claimCollection?.()!==!0||t.budget.claim(`block`,1)<1)n.logger?.warn({entity:t.entity,field:t.field},`blocks: the response’s allowance is spent; this tree is delivered without its breadcrumbs`);else try{let e=await n.resolveBreadcrumbs(t.entity,t.boundValues,t.locale);e!==void 0&&e.steps.length>0&&(Y={...Y,breadcrumbs:e.steps},X.push(...e.ancestors))}catch(e){n.logger?.warn({err:e,entity:t.entity},`blocks: resolveBreadcrumbs threw; this tree carries no breadcrumbs`)}}let Z=new Map;for(let e of j.keys())Z.set(U(`media`,e),{entity:`media`,id:e});for(let e of q)Z.set(U(`media`,e),{entity:`media`,id:e});for(let e of B.values())if(e.entity!==null)for(let t of e.rows)Z.set(U(e.entity,t.id),{entity:e.entity,id:t.id});for(let e of X)Z.set(U(e.entity,e.id),e);for(let e of M.keys()){if(Z.has(e))continue;let t=e.indexOf(` `);if(t<=0)continue;let n=e.slice(0,t),r=e.slice(t+1);r!==``&&Z.set(e,{entity:n,id:r})}return{resolved:1,blocks:r,links:F,...v.length>0&&{unresolved:W(v)},...Z.size>0&&{refs:[...Z.values()]},...B.size>0&&{collections:Object.fromEntries(B)},...J!==void 0&&Object.keys(J.sources).length>0&&{live:{sources:J.sources,values:J.values}},...n.currency!==void 0&&{currency:n.currency},...Y!==void 0&&{detail:Y}}}async function z(e,t,n){let r=n.collections,i=t.canReadEntity,a=t.claimCollection;if(r===void 0||i===void 0||a===void 0)return{results:new Map,cardMedia:new Set};let o=n.resolveMedia,s=new Set;return{results:await b(e,r.sourceFieldOf,{sources:r.sources,getEntity:r.getEntity,clientFor:r.clientFor,canRead:i,resolveImages:o===void 0?void 0:async e=>{let n=[...await o(e,{locale:t.locale})].filter(([,e])=>e.mimeType?.startsWith(`image/`)===!0);for(let[e]of n)s.add(e);return new Map(n.map(([e,t])=>[e,{url:t.url,alt:t.alt,width:t.width,height:t.height,focalPoint:t.focalPoint,sources:t.sources,...t.avifSources!==void 0&&Object.keys(t.avifSources).length>0&&{avifSources:t.avifSources},blurDataUrl:t.blurDataUrl}]))},resolveHrefs:(e,r)=>n.resolvePublishedPaths(e,r,t.locale),locale:t.locale,renderContext:`request`,current:B(t.entity,t.boundValues),...t.page!==void 0&&{page:t.page},claim:()=>a()&&t.budget.claim(`block`,1)>=1,logger:n.logger}),cardMedia:s}}function B(e,t){let n=t?.id;if(!(t===void 0||typeof n!=`string`||n===``))return{entity:e,id:n,values:t}}function V(e,t,n){return e.kind===`entity`&&t.has(U(e.entity,e.id))||e.kind===`media`&&n.has(e.id)?`budget`:`unresolvable`}function H(e){return[...new Set(e)]}function U(e,t){return[e,t].join(` `)}function W(e){let t=new Set,n=[];for(let r of e){let e=`${r.kind} ${r.ref}`;t.has(e)||(t.add(e),n.push(r))}return n}async function G(e,t,n,r){if(e.length===0||!n.resolveMedia)return new Map;try{return await n.resolveMedia(e,{locale:t,spots:!0})}catch(e){return n.logger?.warn({entity:r,err:e},"content: media resolver threw while resolving a block tree — its media refs resolve to null (if this is a ForbiddenError, the requesting role is missing `media:view`)"),new Map}}async function K(e,t,n,r){let i=new Map;if(e.length===0)return i;let a=new Map;for(let t of e){let e=t.indexOf(` `),n=t.slice(0,e),r=t.slice(e+1),i=a.get(n);i?i.push(r):a.set(n,[r])}for(let[e,o]of a)try{let r=await n.resolvePublishedPaths(e,o,t);for(let[t,n]of r)i.set(U(e,t),n)}catch(t){n.logger?.warn({entity:r,entityType:e,err:t},`content: path resolution threw for a block-tree link target — its links render as plain text`)}return i}function q(i,a){let d=null,g=i=>{if(d?.app===i)return d.deps;let g=e(i),{sources:_}=f(i),y=_.length===0?void 0:{sources:_,sourceFieldOf:w(),getEntity:e=>i.entities.get(e),clientFor:e=>l(e,i)},b=T(),x=S(),C=p(i).specs,E={...y!==void 0&&{collections:y},boundColumnsOf:e=>c(e,x),materializeTemplate:(e,t)=>b(e,t),resolveMedia:a.resolveMedia,resolvePublishedPaths:async(e,t,r)=>{let i=await g.filterPublished(e,t,r);return i.size===0?new Map:n(e,[...i],r,g)},logger:i.logger,...m()&&{resolveLiveValues:(e,t)=>h(e,{locale:t,logger:i.logger})},currency:s(a.defaultLocale).currency,resolveBreadcrumbs:async(e,n,a)=>{let s=n.id;if(typeof s!=`string`||s===``)return;let c=i.entities.get(e);if(c===void 0)return;let l=o(c,n),u=await r({entityType:e,id:s,locale:a,...l!==void 0&&{label:l}},t(i));return u===void 0?void 0:{steps:u.steps,ancestors:u.ancestors}},...C.size>0&&{resolveDetail:(e,t,n,r)=>{let i=C.get(e);return i===void 0?void 0:v(i,t,n,r)},detailNeedsBody:(e,t,n)=>{let r=C.get(e);return r!==void 0&&u(r,t,n)}}};return d={app:i,deps:E},E};return async(e,t)=>{let n=await i();return R(e,{...t,locale:t.locale??a.defaultLocale},g(n))}}export{q as createBlockResolver,R as resolveBlockTree};
|
|
1
|
+
import{i as e,t}from"./resolve-context-DklN53BH.mjs";import{r as n}from"./enumerate-CYHJKQz6.mjs";import{n as r}from"./breadcrumbs-BqSuMNac.mjs";import{createSystemReachResolver as i}from"@murumets-ee/core";import{QueryClient as a}from"@murumets-ee/entity/query";import{inArray as o}from"drizzle-orm";import{collectLinkValues as s,linkValueKey as c}from"@murumets-ee/blocks/links";import{breadcrumbLabelOf as l,canvasSiteFormat as u,collectBoundColumnsInTree as d,collectEmbeds as f,createCollectionReader as p,detailNeedsBody as m,detailPartsInTree as h,distinctEmbeddedDocuments as g,effectiveCollectionSources as _,effectiveDetailSpecs as v,embedReferenceKey as y,hasConfiguredLiveSources as b,loadCanvasLiveValues as x,materializeServerTemplate as S,readSpotCrop as C,resolveDocumentDetail as w,resolveLinks as T,resolveTreeCollections as E,sameSpotCrop as D,serverBlockStructureLookup as O,serverBoundColumnsInTree as k,serverCollectionFieldLookup as A,serverEmbedLookup as j,serverTemplateMaterializer as M,templateNamespace as N}from"@murumets-ee/blocks/server";function P(e){return Array.isArray(e)}function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function I(e,t){let n=structuredClone(e),r=e=>{if(P(e))for(let n of e)F(n)&&(typeof n.id==`string`&&(n.id=`${t}${n.id}`),r(n.children))};return r(n),Array.isArray(n)?n:[]}async function L(e,t,n,r){if(n===void 0||n.lookup.size===0)return{expanded:[]};R(e,n.lookup);let i=f(e,n.lookup,{onDropped:e=>r?.warn({entity:t.entity,dropped:e},`content: a block tree embeds more documents than one page may show; the rest show nothing`)});if(i.length===0)return{expanded:[]};let a=g(i),o=t.budget.claim(`block`,a.length),s=a.slice(0,o);if(s.length<a.length&&r?.warn({entity:t.entity,dropped:a.length-s.length},`content: the response budget is spent; some embedded documents show nothing`),s.length===0)return{expanded:[]};let c;try{c=await n.load(s,t.locale)}catch(e){return r?.warn({err:e,entity:t.entity},`content: loading embedded documents failed; they show nothing`),{expanded:s}}let l=new Map(i.map(e=>[e.blockId,e])),u=e=>{if(P(e))for(let t of e){if(!F(t))continue;let e=typeof t.id==`string`?l.get(t.id):void 0;if(e===void 0){u(t.children);continue}let n=c.get(y(e));n!==void 0&&(t.children=I(n,`${e.blockId}~`))}};return u(e),{expanded:s}}function R(e,t){let n=(e,r)=>{if(!(!P(e)||r>64)){for(let i of e)if(F(i)){if(typeof i.type==`string`&&t.has(i.type)){i.children!==void 0&&(i.children=[]);continue}n(i.children,r+1)}}};n(e,0)}const z=i(`embed-resolver`);function B(e){for(let[t,n]of Object.entries(e.allFields))if(n.type===`blockTree`)return t}async function V(e,t,n){let r=new Map,i=new Map;for(let e of t){let t=i.get(e.entity)??[];t.push(e.id),i.set(e.entity,t)}for(let[t,s]of i){let i=e.entities.get(t),c=i===void 0?void 0:B(i);if(i===void 0||c===void 0)continue;let l;try{let r=new a({entity:i,db:e.db.readOnly,logger:e.logger.child({resolve:`embedded-document`,entity:t}),contextResolver:z}),c=r.getTable().id;l=await r.findMany({where:o(c,s),locale:n,limit:s.length})}catch(n){e.logger.warn({err:n,entity:t,count:s.length},`content: reading embedded documents failed — they render empty`);continue}for(let e of l){let n=e,i=n.id,a=n[c];typeof i==`string`&&Array.isArray(a)&&r.set(y({entity:t,id:i}),a)}}return r}const H=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function U(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function W(e){return Array.isArray(e)}const G=new Set(Object.keys({id:!0,url:!0,mimeType:!0,width:!0,height:!0,alt:!0,title:!0,variants:!0,sources:!0,avifSources:!0,focalPoint:!0,blurDataUrl:!0,crop:!0,spotSources:!0}));function K(e,t){if(!U(e))return null;let n=e.id;if(typeof n!=`string`||!H.test(n)||typeof e.url!=`string`||e.url===``)return null;let r=Object.keys(e).filter(e=>!G.has(e));return r.length>0?(t?.(r),null):!q(e.alt,`string`)||!q(e.title,`string`)||!q(e.mimeType,`string`)||!q(e.width,`number`)||!q(e.height,`number`)||!q(e.blurDataUrl,`string`)||e.variants!==void 0&&e.variants!==null&&!U(e.variants)||e.focalPoint!==void 0&&e.focalPoint!==null&&!U(e.focalPoint)||e.sources!==void 0&&e.sources!==null&&(!U(e.sources)||!Object.values(e.sources).every(e=>Array.isArray(e)))||e.avifSources!==void 0&&e.avifSources!==null&&(!U(e.avifSources)||!Object.values(e.avifSources).every(e=>Array.isArray(e)))||e.crop!==void 0&&e.crop!==null&&!U(e.crop)||e.spotSources!==void 0&&e.spotSources!==null&&!Array.isArray(e.spotSources)?null:n}function q(e,t){return e==null||typeof e===t}function J(e,t,n,r){if(n>256){r.truncated=!0;return}let i=e=>{for(let t of e)r.nearMissKeys.add(t)};if(W(e)){for(let a=0;a<e.length;a+=1){let o=K(e[a],i);o===null?J(e[a],t,n+1,r):t.push({container:e,key:a,id:o,crop:C(e[a])})}return}if(U(e))for(let[a,o]of Object.entries(e)){let s=K(o,i);s===null?J(o,t,n+1,r):t.push({container:e,key:a,id:s,crop:C(o)})}}function Y(e){let t={id:e.id,url:e.url,variants:e.variants,focalPoint:e.focalPoint,sources:e.sources};return e.avifSources!==void 0&&Object.keys(e.avifSources).length>0&&(t.avifSources=e.avifSources),e.mimeType!==null&&(t.mimeType=e.mimeType),e.width!==null&&(t.width=e.width),e.height!==null&&(t.height=e.height),e.alt!==null&&(t.alt=e.alt),e.title!==null&&(t.title=e.title),e.blurDataUrl!==null&&(t.blurDataUrl=e.blurDataUrl),t}function X(e,t){if(!(t===void 0||e.spotSources===void 0))return e.spotSources.find(e=>D(e.crop,t)&&e.sources.length>0)}function ee(e,t){let n=Y(e),r=X(e,t),i=r?.sources[r.sources.length-1];if(r!==void 0&&i!==void 0){n.url=i.url,n.width=i.width,n.height=i.height,n.focalPoint={x:.5,y:.5},n.sources={natural:r.sources};let e=r.avifSources;e!==void 0&&e.length===r.sources.length&&e.every((e,t)=>e.width===r.sources[t]?.width&&e.height===r.sources[t]?.height)?n.avifSources={natural:e}:delete n.avifSources}return n.crop={x:t.x,y:t.y,w:t.w,h:t.h},n}function te(e,t){let n=t===null?null:e.crop===void 0?Y(t):ee(t,e.crop);if(Array.isArray(e.container)){typeof e.key==`number`&&(e.container[e.key]=n);return}typeof e.key==`string`&&(e.container[e.key]=n)}async function Z(e,t,n){let r=e,i=[];if(t.template!==void 0){let e=t.boundValues?.id;if(typeof e==`string`&&e!==``){let a=(n.materializeTemplate??S)(t.template,N(t.entity,e));r=a.blocks,i=a.boundColumns}else r=[],n.logger?.warn({entity:t.entity,field:t.field},`content: a templated document arrived without its row id, so its template is served EMPTY — its block ids could not be namespaced to it (editor F124)`)}else if(t.rowIsForeign!==!0&&t.boundValues!==void 0&&W(e))try{i=(n.boundColumnsOf??k)(e)}catch(e){n.logger?.warn({err:e,entity:t.entity,field:t.field},`content: could not enumerate the bound columns of a block tree, so its bound-field links render plain`)}let a=t.boundValues??{},o=i.filter(e=>Object.hasOwn(a,e)).map(e=>a[e]);if(!W(r))throw n.logger?.warn({entity:t.entity,field:t.field},`content: stored block tree is not an array — nothing to resolve, so this field is served EMPTY rather than as stored (the caller retries this throw with an exhausted budget, and a non-array fails that identically)`),TypeError(`content: block tree \`${t.entity}.${t.field}\` is not an array; nothing to resolve.`);let{expanded:l}=await L(r,{locale:t.locale,budget:t.budget,entity:t.entity},n.embeddedDocuments,n.logger),u=[],d={truncated:!1,nearMissKeys:new Set};J(r,u,0,d),d.truncated&&n.logger?.warn({entity:t.entity,field:t.field,cap:256},`content: block tree is nested deeper than the media walk descends — any media ref below the bound keeps the url recorded when an editor picked it, which may be signed`),d.nearMissKeys.size>0&&n.logger?.debug({entity:t.entity,field:t.field,keys:[...d.nearMissKeys].sort()},`content: a value looked like a media ref but carried keys outside the projection, so it was left alone. If these are media refs, they keep their stored urls`);let f=[...s(r,64),...s(o,64)],p=[],m=[];for(let e of f)e.kind===`media`&&(H.test(e.id)?p.push(e.id):m.push({kind:`link`,ref:c(e),reason:`unresolvable`}));let g=Q([...u.map(e=>e.id),...p]),_=[];for(let e of f)e.kind===`entity`&&(H.test(e.id)?_.push($(e.entity,e.id)):m.push({kind:`link`,ref:c(e),reason:`unresolvable`}));let v=[...m];!n.resolveMedia&&g.length>0&&n.logger?.debug({entity:t.entity,field:t.field,count:g.length},`content: no media resolver wired for block trees — every media ref resolves to null`);let y=n.resolveMedia?t.budget.claim(`block`,g.length):0,b=g.slice(0,y),x=n.resolveMedia?new Set(g.slice(y)):new Set;for(let e of g.slice(y))v.push({kind:`media`,ref:e,reason:x.has(e)?`budget`:`unresolvable`});let C=Q(_),w=t.budget.claim(`block`,C.length),E=C.slice(0,w),D=new Set(C.slice(w)),O=await oe(b,t.locale,n,t.entity);for(let e of u)te(e,O.get(e.id)??null);for(let e of b)O.has(e)||v.push({kind:`media`,ref:e,reason:`unresolvable`});let A=await se(E,t.locale,n,t.entity),j=await T(f,{renderContext:`request`,locale:t.locale,resolveEntityHref:({entity:e,id:t})=>A.get($(e,t))??null,resolveMediaHref:e=>O.get(e)?.url??null}),M={};for(let[e,t]of j)M[e]=t.href;for(let e of f){if(e.kind!==`entity`&&e.kind!==`media`)continue;let t=c(e);M[t]!==null&&M[t]!==void 0||v.push({kind:`link`,ref:t,reason:ie(e,D,x)})}let P=n.resolveLiveValues,F=P===void 0?0:t.budget.claim(`block`,1),[{results:I,cardMedia:R},z]=await Promise.all([ne(r,t,n),F>0&&P!==void 0?(async()=>P(r,t.locale))().catch(e=>{n.logger?.warn({err:e},`blocks: resolveLiveValues rejected; this tree draws no live values`)}):Promise.resolve(void 0)]),B,V=[];if(t.boundValues!==void 0){let e=h(W(r)?r:[]),i=new Set(e);if(i.delete(`breadcrumbs`),n.resolveDetail!==void 0)try{let e=i;if(e.has(`body`)&&n.detailNeedsBody?.(t.entity,e,t.boundValues)===!0&&t.budget.claim(`block`,1)<1){let r=new Set(e);r.delete(`body`),e=r,n.logger?.warn({entity:t.entity,field:t.field},`blocks: the response budget is spent; this tree is delivered without its HTML body`)}e.size>0&&(B=n.resolveDetail(t.entity,t.boundValues,t.locale,e))}catch(e){n.logger?.warn({err:e,entity:t.entity},`blocks: resolveDetail threw; this tree carries no detail`)}if(e.has(`breadcrumbs`)&&n.resolveBreadcrumbs!==void 0)if(t.claimCollection?.()!==!0||t.budget.claim(`block`,1)<1)n.logger?.warn({entity:t.entity,field:t.field},`blocks: the response’s allowance is spent; this tree is delivered without its breadcrumbs`);else try{let e=await n.resolveBreadcrumbs(t.entity,t.boundValues,t.locale);e!==void 0&&e.steps.length>0&&(B={...B,breadcrumbs:e.steps},V.push(...e.ancestors))}catch(e){n.logger?.warn({err:e,entity:t.entity},`blocks: resolveBreadcrumbs threw; this tree carries no breadcrumbs`)}}let U=new Map;for(let e of O.keys())U.set($(`media`,e),{entity:`media`,id:e});for(let e of R)U.set($(`media`,e),{entity:`media`,id:e});for(let e of I.values())if(e.entity!==null)for(let t of e.rows)U.set($(e.entity,t.id),{entity:e.entity,id:t.id});for(let e of V)U.set($(e.entity,e.id),e);for(let e of l)U.set($(e.entity,e.id),{entity:e.entity,id:e.id});for(let e of A.keys()){if(U.has(e))continue;let t=e.indexOf(` `);if(t<=0)continue;let n=e.slice(0,t),r=e.slice(t+1);r!==``&&U.set(e,{entity:n,id:r})}return{resolved:1,blocks:r,links:M,...v.length>0&&{unresolved:ae(v)},...U.size>0&&{refs:[...U.values()]},...I.size>0&&{collections:Object.fromEntries(I)},...z!==void 0&&Object.keys(z.sources).length>0&&{live:{sources:z.sources,values:z.values}},...n.currency!==void 0&&{currency:n.currency},...B!==void 0&&{detail:B}}}async function ne(e,t,n){let r=n.collections,i=t.canReadEntity,a=t.claimCollection;if(r===void 0||i===void 0||a===void 0)return{results:new Map,cardMedia:new Set};let o=n.resolveMedia,s=new Set;return{results:await E(e,r.sourceFieldOf,{sources:r.sources,getEntity:r.getEntity,clientFor:r.clientFor,canRead:i,resolveImages:o===void 0?void 0:async e=>{let n=[...await o(e,{locale:t.locale})].filter(([,e])=>e.mimeType?.startsWith(`image/`)===!0);for(let[e]of n)s.add(e);return new Map(n.map(([e,t])=>[e,{url:t.url,alt:t.alt,width:t.width,height:t.height,focalPoint:t.focalPoint,sources:t.sources,...t.avifSources!==void 0&&Object.keys(t.avifSources).length>0&&{avifSources:t.avifSources},blurDataUrl:t.blurDataUrl}]))},resolveHrefs:(e,r)=>n.resolvePublishedPaths(e,r,t.locale),locale:t.locale,renderContext:`request`,current:re(t.entity,t.boundValues),...t.page!==void 0&&{page:t.page},claim:()=>a()&&t.budget.claim(`block`,1)>=1,logger:n.logger}),cardMedia:s}}function re(e,t){let n=t?.id;if(!(t===void 0||typeof n!=`string`||n===``))return{entity:e,id:n,values:t}}function ie(e,t,n){return e.kind===`entity`&&t.has($(e.entity,e.id))||e.kind===`media`&&n.has(e.id)?`budget`:`unresolvable`}function Q(e){return[...new Set(e)]}function $(e,t){return[e,t].join(` `)}function ae(e){let t=new Set,n=[];for(let r of e){let e=`${r.kind} ${r.ref}`;t.has(e)||(t.add(e),n.push(r))}return n}async function oe(e,t,n,r){if(e.length===0||!n.resolveMedia)return new Map;try{return await n.resolveMedia(e,{locale:t,spots:!0})}catch(e){return n.logger?.warn({entity:r,err:e},"content: media resolver threw while resolving a block tree — its media refs resolve to null (if this is a ForbiddenError, the requesting role is missing `media:view`)"),new Map}}async function se(e,t,n,r){let i=new Map;if(e.length===0)return i;let a=new Map;for(let t of e){let e=t.indexOf(` `),n=t.slice(0,e),r=t.slice(e+1),i=a.get(n);i?i.push(r):a.set(n,[r])}for(let[e,o]of a)try{let r=await n.resolvePublishedPaths(e,o,t);for(let[t,n]of r)i.set($(e,t),n)}catch(t){n.logger?.warn({entity:r,entityType:e,err:t},`content: path resolution threw for a block-tree link target — its links render as plain text`)}return i}function ce(i,a){let o=null,s=i=>{if(o?.app===i)return o.deps;let s=e(i),{sources:c}=_(i),f=c.length===0?void 0:{sources:c,sourceFieldOf:A(),getEntity:e=>i.entities.get(e),clientFor:e=>p(e,i)},h=M(),g=O(),y=v(i).specs,S={...f!==void 0&&{collections:f},boundColumnsOf:e=>d(e,g),materializeTemplate:(e,t)=>h(e,t),resolveMedia:a.resolveMedia,resolvePublishedPaths:async(e,t,r)=>{let i=await s.filterPublished(e,t,r);return i.size===0?new Map:n(e,[...i],r,s)},logger:i.logger,...b()&&{resolveLiveValues:(e,t)=>x(e,{locale:t,logger:i.logger})},currency:u(a.defaultLocale).currency,resolveBreadcrumbs:async(e,n,a)=>{let o=n.id;if(typeof o!=`string`||o===``)return;let s=i.entities.get(e);if(s===void 0)return;let c=l(s,n),u=await r({entityType:e,id:o,locale:a,...c!==void 0&&{label:c}},t(i));return u===void 0?void 0:{steps:u.steps,ancestors:u.ancestors}},...y.size>0&&{resolveDetail:(e,t,n,r)=>{let i=y.get(e);return i===void 0?void 0:w(i,t,n,r)},detailNeedsBody:(e,t,n)=>{let r=y.get(e);return r!==void 0&&m(r,t,n)}}},C=j();return C.size>0&&(S.embeddedDocuments={lookup:C,load:(e,t)=>V(i,e,t)}),o={app:i,deps:S},S};return async(e,t)=>{let n=await i();return Z(e,{...t,locale:t.locale??a.defaultLocale},s(n))}}export{ce as createBlockResolver,Z as resolveBlockTree};
|
|
2
2
|
//# sourceMappingURL=block-resolver.mjs.map
|