@murumets-ee/content 0.110.0 → 0.111.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.d.mts +0 -1
- package/dist/block-resolver.d.mts +0 -1
- package/dist/block-resolver.mjs +0 -1
- package/dist/breadcrumbs-BqSuMNac.mjs +0 -1
- package/dist/chrome-entity-names-zYJzP-_U.mjs +0 -1
- package/dist/chrome-provider.d.mts +0 -1
- package/dist/chrome-provider.mjs +0 -1
- package/dist/client.d.mts +0 -1
- package/dist/client.mjs +0 -1
- package/dist/content-config-store-8omQF5p5.mjs +0 -1
- package/dist/context-D7eEItCY.mjs +0 -1
- package/dist/detail-template-names-CD1Y9n1U.mjs +0 -1
- package/dist/detail-template-provider.d.mts +0 -1
- package/dist/detail-template-provider.mjs +0 -1
- package/dist/document-site-B8tmEqLw.mjs +0 -1
- package/dist/entities/index.d.mts +0 -1
- package/dist/entities/index.mjs +0 -1
- package/dist/enumerate-CYHJKQz6.mjs +0 -1
- package/dist/errors-NRNILhhm.mjs +0 -1
- package/dist/index-cT8Qk4gu.d.mts +0 -1
- package/dist/index.mjs +0 -1
- package/dist/locale-entity-CoSq3C77.mjs +0 -1
- package/dist/locale-registry-COsJrVZl.mjs +0 -1
- package/dist/locale-utils-B0mFoV47.mjs +0 -1
- package/dist/lock-service.d.mts +0 -1
- package/dist/lock-service.mjs +0 -1
- package/dist/locks-5779ugSW.mjs +0 -1
- package/dist/plugin-CjgqBSFy.mjs +0 -1
- package/dist/plugin.d.mts +0 -1
- package/dist/query-client.d.mts +0 -1
- package/dist/query-client.mjs +0 -1
- package/dist/registry-CaPbY5lm.mjs +0 -1
- package/dist/resolve-context-DklN53BH.mjs +0 -1
- package/dist/resolve.d.mts +0 -1
- package/dist/resolve.mjs +0 -1
- package/dist/routes-siXmjKDA.mjs +0 -1
- package/dist/routing-strategy-CAG3tZP0.d.mts +0 -1
- package/dist/routing-strategy-D6B4ngT9.mjs +0 -1
- package/dist/schema-BYrYzsmO.mjs +0 -1
- package/dist/schema-LlK6EkOJ.mjs +0 -1
- package/dist/seed.d.mts +0 -1
- package/dist/seed.mjs +0 -1
- package/dist/site-chrome-BAtQaAqC.mjs +0 -1
- package/dist/site-chrome-DNCcePSR.d.mts +0 -1
- package/dist/translation-provenance-B41lEDM-.mjs +0 -1
- package/dist/translation-provenance-BZ0MlbFR.d.mts +0 -1
- package/dist/translation.d.mts +0 -1
- package/dist/translation.mjs +0 -1
- package/dist/types-BOk9tg_9.d.mts +0 -1
- package/dist/versionable-Br_G5VGR.mjs +0 -1
- package/dist/versionable-CRvV87nZ.d.mts +0 -1
- package/dist/versions-w2ui-Vzb.mjs +0 -1
- package/package.json +10 -10
- package/dist/admin.d.mts.map +0 -1
- package/dist/block-resolver.d.mts.map +0 -1
- package/dist/block-resolver.mjs.map +0 -1
- package/dist/breadcrumbs-BqSuMNac.mjs.map +0 -1
- package/dist/chrome-entity-names-zYJzP-_U.mjs.map +0 -1
- package/dist/chrome-provider.d.mts.map +0 -1
- package/dist/chrome-provider.mjs.map +0 -1
- package/dist/client.d.mts.map +0 -1
- package/dist/client.mjs.map +0 -1
- package/dist/content-config-store-8omQF5p5.mjs.map +0 -1
- package/dist/context-D7eEItCY.mjs.map +0 -1
- package/dist/detail-template-names-CD1Y9n1U.mjs.map +0 -1
- package/dist/detail-template-provider.d.mts.map +0 -1
- package/dist/detail-template-provider.mjs.map +0 -1
- package/dist/document-site-B8tmEqLw.mjs.map +0 -1
- package/dist/entities/index.d.mts.map +0 -1
- package/dist/entities/index.mjs.map +0 -1
- package/dist/enumerate-CYHJKQz6.mjs.map +0 -1
- package/dist/errors-NRNILhhm.mjs.map +0 -1
- package/dist/index-cT8Qk4gu.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/locale-entity-CoSq3C77.mjs.map +0 -1
- package/dist/locale-registry-COsJrVZl.mjs.map +0 -1
- package/dist/locale-utils-B0mFoV47.mjs.map +0 -1
- package/dist/lock-service.d.mts.map +0 -1
- package/dist/lock-service.mjs.map +0 -1
- package/dist/locks-5779ugSW.mjs.map +0 -1
- package/dist/plugin-CjgqBSFy.mjs.map +0 -1
- package/dist/plugin.d.mts.map +0 -1
- package/dist/query-client.d.mts.map +0 -1
- package/dist/query-client.mjs.map +0 -1
- package/dist/registry-CaPbY5lm.mjs.map +0 -1
- package/dist/resolve-context-DklN53BH.mjs.map +0 -1
- package/dist/resolve.d.mts.map +0 -1
- package/dist/resolve.mjs.map +0 -1
- package/dist/routes-siXmjKDA.mjs.map +0 -1
- package/dist/routing-strategy-CAG3tZP0.d.mts.map +0 -1
- package/dist/routing-strategy-D6B4ngT9.mjs.map +0 -1
- package/dist/schema-BYrYzsmO.mjs.map +0 -1
- package/dist/schema-LlK6EkOJ.mjs.map +0 -1
- package/dist/seed.d.mts.map +0 -1
- package/dist/seed.mjs.map +0 -1
- package/dist/site-chrome-BAtQaAqC.mjs.map +0 -1
- package/dist/site-chrome-DNCcePSR.d.mts.map +0 -1
- package/dist/translation-provenance-B41lEDM-.mjs.map +0 -1
- package/dist/translation-provenance-BZ0MlbFR.d.mts.map +0 -1
- package/dist/translation.d.mts.map +0 -1
- package/dist/translation.mjs.map +0 -1
- package/dist/types-BOk9tg_9.d.mts.map +0 -1
- package/dist/versionable-Br_G5VGR.mjs.map +0 -1
- package/dist/versionable-CRvV87nZ.d.mts.map +0 -1
- package/dist/versions-w2ui-Vzb.mjs.map +0 -1
package/dist/admin.d.mts
CHANGED
|
@@ -317,4 +317,3 @@ declare function createBlockResolver(getApp: () => Promise<ToolkitApp> | Toolkit
|
|
|
317
317
|
}) => Promise<ResolvedBlockTree>;
|
|
318
318
|
//#endregion
|
|
319
319
|
export { BlockCollectionDeps, BlockMediaProjection, BlockMediaResolver, BlockResolutionBudget, BlockResolverDeps, BlockResolverLogger, BlockSpotSources, BlockTreeRef, ResolvedBlockTree, UnresolvedBlockRef, createBlockResolver, resolveBlockTree };
|
|
320
|
-
//# sourceMappingURL=block-resolver.d.mts.map
|
package/dist/block-resolver.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
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{blockTypesInTree as l,breadcrumbLabelOf as u,canvasSiteFormat as d,collectBoundColumnsInTree as f,collectEmbeds as p,contributedBlockDataProviders as m,createCollectionReader as h,detailNeedsBody as g,detailPartsInTree as _,distinctEmbeddedDocuments as v,effectiveCollectionSources as y,effectiveDetailSpecs as b,embedReferenceKey as x,hasConfiguredLiveSources as S,loadCanvasLiveValues as C,materializeServerTemplate as w,readSpotCrop as T,resolveBlockData as E,resolveDocumentDetail as D,resolveLinks as O,resolveTreeCollections as k,sameSpotCrop as A,serverBlockStructureLookup as j,serverBoundColumnsInTree as ee,serverCollectionFieldLookup as M,serverEmbedLookup as N,serverTemplateMaterializer as P,templateNamespace as F}from"@murumets-ee/blocks/server";function I(e){return Array.isArray(e)}function L(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function R(e,t){let n=structuredClone(e),r=e=>{if(I(e))for(let n of e)L(n)&&(typeof n.id==`string`&&(n.id=`${t}${n.id}`),r(n.children))};return r(n),Array.isArray(n)?n:[]}async function te(e,t,n,r){if(n===void 0||n.lookup.size===0)return{expanded:[]};z(e,n.lookup);let i=p(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=v(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(I(e))for(let t of e){if(!L(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(x(e));n!==void 0&&(t.children=R(n,`${e.blockId}~`))}};return u(e),{expanded:s}}function z(e,t){let n=(e,r)=>{if(!(!I(e)||r>64)){for(let i of e)if(L(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 B=i(`embed-resolver`);function V(e){for(let[t,n]of Object.entries(e.allFields))if(n.type===`blockTree`)return t}async function H(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:V(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:B}),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(x({entity:t,id:i}),a)}}return r}const U=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function W(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function G(e){return Array.isArray(e)}const K=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 q(e,t){if(!W(e))return null;let n=e.id;if(typeof n!=`string`||!U.test(n)||typeof e.url!=`string`||e.url===``)return null;let r=Object.keys(e).filter(e=>!K.has(e));return r.length>0?(t?.(r),null):!J(e.alt,`string`)||!J(e.title,`string`)||!J(e.mimeType,`string`)||!J(e.width,`number`)||!J(e.height,`number`)||!J(e.blurDataUrl,`string`)||e.variants!==void 0&&e.variants!==null&&!W(e.variants)||e.focalPoint!==void 0&&e.focalPoint!==null&&!W(e.focalPoint)||e.sources!==void 0&&e.sources!==null&&(!W(e.sources)||!Object.values(e.sources).every(e=>Array.isArray(e)))||e.avifSources!==void 0&&e.avifSources!==null&&(!W(e.avifSources)||!Object.values(e.avifSources).every(e=>Array.isArray(e)))||e.crop!==void 0&&e.crop!==null&&!W(e.crop)||e.spotSources!==void 0&&e.spotSources!==null&&!Array.isArray(e.spotSources)?null:n}function J(e,t){return e==null||typeof e===t}function Y(e,t,n,r){if(n>256){r.truncated=!0;return}let i=e=>{for(let t of e)r.nearMissKeys.add(t)};if(G(e)){for(let a=0;a<e.length;a+=1){let o=q(e[a],i);o===null?Y(e[a],t,n+1,r):t.push({container:e,key:a,id:o,crop:T(e[a])})}return}if(W(e))for(let[a,o]of Object.entries(e)){let s=q(o,i);s===null?Y(o,t,n+1,r):t.push({container:e,key:a,id:s,crop:T(o)})}}function X(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 ne(e,t){if(!(t===void 0||e.spotSources===void 0))return e.spotSources.find(e=>A(e.crop,t)&&e.sources.length>0)}function re(e,t){let n=X(e),r=ne(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 ie(e,t){let n=t===null?null:e.crop===void 0?X(t):re(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??w)(t.template,F(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&&G(e))try{i=(n.boundColumnsOf??ee)(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(!G(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:u}=await te(r,{locale:t.locale,budget:t.budget,entity:t.entity},n.embeddedDocuments,n.logger),d=[],f={truncated:!1,nearMissKeys:new Set};Y(r,d,0,f),f.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`),f.nearMissKeys.size>0&&n.logger?.debug({entity:t.entity,field:t.field,keys:[...f.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 p=[...s(r,64),...s(o,64)],m=[],h=[];for(let e of p)e.kind===`media`&&(U.test(e.id)?m.push(e.id):h.push({kind:`link`,ref:c(e),reason:`unresolvable`}));let g=Q([...d.map(e=>e.id),...m]),v=[];for(let e of p)e.kind===`entity`&&(U.test(e.id)?v.push($(e.entity,e.id)):h.push({kind:`link`,ref:c(e),reason:`unresolvable`}));let y=[...h];!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 b=n.resolveMedia?t.budget.claim(`block`,g.length):0,x=g.slice(0,b),S=n.resolveMedia?new Set(g.slice(b)):new Set;for(let e of g.slice(b))y.push({kind:`media`,ref:e,reason:S.has(e)?`budget`:`unresolvable`});let C=Q(v),T=t.budget.claim(`block`,C.length),E=C.slice(0,T),D=new Set(C.slice(T)),k=await le(x,t.locale,n,t.entity);for(let e of d)ie(e,k.get(e.id)??null);for(let e of x)k.has(e)||y.push({kind:`media`,ref:e,reason:`unresolvable`});let A=await ue(E,t.locale,n,t.entity),j=await O(p,{renderContext:`request`,locale:t.locale,resolveEntityHref:({entity:e,id:t})=>A.get($(e,t))??null,resolveMediaHref:e=>k.get(e)?.url??null}),M={};for(let[e,t]of j)M[e]=t.href;for(let e of p){if(e.kind!==`entity`&&e.kind!==`media`)continue;let t=c(e);M[t]!==null&&M[t]!==void 0||y.push({kind:`link`,ref:t,reason:se(e,D,S)})}let N=n.resolveLiveValues,P=N===void 0?0:t.budget.claim(`block`,1),[{results:I,cardMedia:L},R]=await Promise.all([ae(r,t,n),P>0&&N!==void 0?(async()=>N(r,t.locale))().catch(e=>{n.logger?.warn({err:e},`blocks: resolveLiveValues rejected; this tree draws no live values`)}):Promise.resolve(void 0)]),z,B=[];if(t.boundValues!==void 0){let e=_(G(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&&(z=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&&(z={...z,breadcrumbs:e.steps},B.push(...e.ancestors))}catch(e){n.logger?.warn({err:e,entity:t.entity},`blocks: resolveBreadcrumbs threw; this tree carries no breadcrumbs`)}}let V;if(n.resolveBlockData!==void 0&&n.blockDataTypes!==void 0){let e=[...l(r)].filter(e=>n.blockDataTypes?.has(e));if(e.length>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 block data`);else try{let r=await n.resolveBlockData(e,t.locale);Object.keys(r).length>0&&(V=r)}catch(e){n.logger?.warn({err:e,entity:t.entity},`blocks: resolveBlockData threw; this tree carries no block data`)}}let H=new Map;for(let e of k.keys())H.set($(`media`,e),{entity:`media`,id:e});for(let e of L)H.set($(`media`,e),{entity:`media`,id:e});for(let e of I.values())if(e.entity!==null)for(let t of e.rows)H.set($(e.entity,t.id),{entity:e.entity,id:t.id});for(let e of B)H.set($(e.entity,e.id),e);for(let e of u)H.set($(e.entity,e.id),{entity:e.entity,id:e.id});for(let e of A.keys()){if(H.has(e))continue;let t=e.indexOf(` `);if(t<=0)continue;let n=e.slice(0,t),r=e.slice(t+1);r!==``&&H.set(e,{entity:n,id:r})}return{resolved:1,blocks:r,links:M,...y.length>0&&{unresolved:ce(y)},...H.size>0&&{refs:[...H.values()]},...I.size>0&&{collections:Object.fromEntries(I)},...R!==void 0&&Object.keys(R.sources).length>0&&{live:{sources:R.sources,values:R.values}},...n.currency!==void 0&&{currency:n.currency},...z!==void 0&&{detail:z},...V!==void 0&&{blockData:V}}}async function ae(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 k(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:oe(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 oe(e,t){let n=t?.id;if(!(t===void 0||typeof n!=`string`||n===``))return{entity:e,id:n,values:t}}function se(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 ce(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 le(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 ue(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 de(i,a){let o=null,s=i=>{if(o?.app===i)return o.deps;let s=e(i),{sources:c}=y(i),l=c.length===0?void 0:{sources:c,sourceFieldOf:M(),getEntity:e=>i.entities.get(e),clientFor:e=>h(e,i)},p=P(),_=j(),v=b(i).specs,x={...l!==void 0&&{collections:l},boundColumnsOf:e=>f(e,_),materializeTemplate:(e,t)=>p(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,...S()&&{resolveLiveValues:(e,t)=>C(e,{locale:t,logger:i.logger})},currency:d(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=u(s,n),l=await r({entityType:e,id:o,locale:a,...c!==void 0&&{label:c}},t(i));return l===void 0?void 0:{steps:l.steps,ancestors:l.ancestors}},...v.size>0&&{resolveDetail:(e,t,n,r)=>{let i=v.get(e);return i===void 0?void 0:D(i,t,n,r)},detailNeedsBody:(e,t,n)=>{let r=v.get(e);return r!==void 0&&g(r,t,n)}}},w=m();w.size>0&&(x.blockDataTypes=new Set(w.keys()),x.resolveBlockData=(e,t)=>E(e,{locale:t,surface:`site`,logger:i.logger,providers:w}));let T=N();return T.size>0&&(x.embeddedDocuments={lookup:T,load:(e,t)=>H(i,e,t)}),o={app:i,deps:x},x};return async(e,t)=>{let n=await i();return Z(e,{...t,locale:t.locale??a.defaultLocale},s(n))}}export{de as createBlockResolver,Z as resolveBlockTree};
|
|
2
|
-
//# sourceMappingURL=block-resolver.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./rolldown-runtime-DK3Fl9T5.mjs";var t=e({MAX_BREADCRUMBS:()=>8,ancestorPaths:()=>n,resolveBreadcrumbTrail:()=>r});function n(e){if(!e.startsWith(`/`))return[];let t=e.split(`/`).filter(e=>e!==``),n=[];for(let e=1;e<t.length;e++)n.push(`/${t.slice(0,e).join(`/`)}`);return n}async function r(e,t){let r=(await t.pathsClient.findMany({where:{entityType:e.entityType,entityId:{in:[e.id]},locale:e.locale,isCanonical:!0},limit:1}))[0]?.path;if(r===void 0)return;let i=n(r).slice(-7),a=[],o=[];if(i.length>0){let n=await t.pathsClient.findMany({where:{locale:e.locale,isCanonical:!0,path:{in:i}},limit:i.length}),r=new Map;for(let e of n){let t=r.get(e.entityType);t===void 0?r.set(e.entityType,[e.entityId]):t.push(e.entityId)}let s=new Map;for(let[n,i]of r)for(let[r,a]of await t.publishedTitles(n,i,e.locale))s.set(`${n}\u0000${r}`,a);let c=new Map(n.map(e=>[e.path,e]));for(let e of n)o.push({entity:e.entityType,id:e.entityId});for(let e of i){let t=c.get(e);if(t===void 0)continue;let n=s.get(`${t.entityType}\u0000${t.entityId}`);n!==void 0&&a.push({label:n,href:e})}}if(a.length!==0)return e.label!==void 0&&a.push({label:e.label}),{steps:a,ancestors:o}}export{r as n,t};
|
|
2
|
-
//# sourceMappingURL=breadcrumbs-BqSuMNac.mjs.map
|
|
@@ -140,4 +140,3 @@ declare function createChromeProvider(getApp: () => Promise<ToolkitApp> | Toolki
|
|
|
140
140
|
};
|
|
141
141
|
//#endregion
|
|
142
142
|
export { ChromeProviderDeps, ChromeProviderRegion, ChromeProviderRegions, ChromeRegionName, ChromeResolutionBudget, composeChromeRegions, createChromeProvider };
|
|
143
|
-
//# sourceMappingURL=chrome-provider.d.mts.map
|
package/dist/chrome-provider.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./chrome-entity-names-zYJzP-_U.mjs";import{t}from"./site-chrome-BAtQaAqC.mjs";import{getBlockTreeFieldName as n}from"@murumets-ee/entity";import{composeChromeRegion as r,stripScopeTags as i}from"@murumets-ee/blocks/render";const a=t;async function o(e,t){let n=e.document&&(!t.claim||t.claim())?await t.readOverrides(e.document.entityType,e.document.id,e.locale):null,o={header:null,footer:null};for(let s of a){if(t.claim&&!t.claim())continue;let a=await t.readChromeDocument(s,e.locale);if(!a)continue;let c={id:a.id,blocks:a.blocks};try{let e=r(c,n);if(!e)continue;o[s]={blocks:i(e.blocks),overridden:e.overridden}}catch(n){t.logger?.warn({region:s,documentId:c.id,locale:e.locale,err:n},`content: chrome region failed to compose (malformed stored blocks, or strip depth exceeded) — serving no chrome for this region`)}}return a.some(e=>o[e]!==null)?o:null}function s(t){return{entity:e,getChrome:async r=>{let i=await t(),{createQueryClient:a}=await import(`@murumets-ee/core/clients`),{schemaRegistry:s}=await import(`@murumets-ee/db`),{eq:c,getTableColumns:l}=await import(`drizzle-orm`),u=e=>{let t=s.get(e);if(t)return l(t)},d=async(e,t,n,r)=>{let o=i.entities.get(e);return o?(await a(o).findMany({limit:1,locale:t,...n!==void 0&&{where:n},...r!==void 0&&{exposeInternalFields:r}}))[0]??null:null},f=i.entities.get(e),p=f?n(f):void 0,m=u(e)?.placement;return!p||!m?null:o(r,{claim:()=>r.budget.claim(`block`,1)>0,readChromeDocument:async(t,n)=>{let r=await d(e,n,c(m,t));if(!r)return null;let i=r[p];return{id:typeof r.id==`string`?r.id:e,blocks:Array.isArray(i)?i:[]}},readOverrides:async(e,t,n)=>{let r=u(e)?.id;if(!r)return null;let i=await d(e,n,c(r,t),[`_overrides`]);if(!i)return null;let a=i._overrides;return a&&typeof a==`object`&&!Array.isArray(a)?a:null},logger:i.logger})}}}export{o as composeChromeRegions,s as createChromeProvider};
|
|
2
|
-
//# sourceMappingURL=chrome-provider.mjs.map
|
package/dist/client.d.mts
CHANGED
|
@@ -86,4 +86,3 @@ declare class ContentClient<AllFields extends Record<string, FieldConfig> = Reco
|
|
|
86
86
|
declare function createContentClient<AllFields extends Record<string, FieldConfig>>(entity: Entity<AllFields>): ContentClient<AllFields>;
|
|
87
87
|
//#endregion
|
|
88
88
|
export { ContentClient, ContentClientConfig, createContentClient };
|
|
89
|
-
//# sourceMappingURL=client.d.mts.map
|
package/dist/client.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./versionable-Br_G5VGR.mjs";import{n as t,r as n,t as r}from"./errors-NRNILhhm.mjs";import{t as i}from"./content-config-store-8omQF5p5.mjs";import{a,d as o,f as s,h as c,i as l,l as u,m as d,n as f,o as p,p as m,r as h,s as g,t as _,u as v}from"./versions-w2ui-Vzb.mjs";import{n as y}from"./plugin-CjgqBSFy.mjs";import{t as b}from"./locale-utils-B0mFoV47.mjs";import{i as x,n as S,r as C}from"./context-D7eEItCY.mjs";import{c as w,f as T,r as E}from"./translation-provenance-B41lEDM-.mjs";import{blockTreeFieldsOf as D,buildPartitionCondition as O}from"@murumets-ee/entity";import{getApp as k,getContext as A,requireSiteFor as ee}from"@murumets-ee/core";import{schemaRegistry as te}from"@murumets-ee/db";import{and as ne,inArray as j}from"drizzle-orm";import"server-only";import{createAdminClient as M}from"@murumets-ee/core/clients";function N(e){return{id:e.id,entityId:e.entityId,locale:e.locale,data:e.data,createdBy:e.createdBy,createdByName:e.createdByName??null,createdAt:e.createdAt,updatedAt:e.updatedAt}}async function P(e,t,n){try{return await e.admin.findById(t,n===`_`?{}:{locale:n})??void 0}catch(n){e.logger?.warn({entity:e.entity.name,entityId:t,error:n},`draft: the live row could not be read to grandfather its block tree`);return}}async function F(e,t,n,r,i){let a=typeof i==`object`&&i?i:void 0;if(!D(e.entity).some(({name:e})=>Object.hasOwn(r,e)&&!Array.isArray(a?.[e])))return a;let o=await P(e,t,n);return o===void 0?a:{...o,...a}}async function I(e,n,r,i=`_`,a){b(i);let s=await C(e);if(!s)throw new t(e.entity.name,`drafts`);let c=o(e.entity,r);e.admin.assertBlockTreesValid(c);let l=D(e.entity).some(({name:e})=>Object.hasOwn(c,e))?await s.findOne({entityId:n,locale:i}):null;await e.admin.assertBlockTreesFitDocument(c,()=>F(e,n,i,c,l?.data),{loadAreaRow:()=>P(e,n,i)}),await e.admin.assertMediaKindsValid(c,l?.data);let u=new Date,d=a?.id??``,f=a?.name??null,p=await s.upsert({entityId:n,locale:i,data:c,createdBy:d,createdByName:f,createdAt:u,updatedAt:u},{target:[`entityId`,`locale`],set:{data:c,updatedAt:u}});return await w({entityName:e.entity.name,entityId:n,locale:i,userId:a?.id,draftData:p.data??{}}),N(p)}const L=[`slug`,`slugMode`,`parent`];async function R(e,n,r,i=`_`,a){b(i);let s=await C(e);if(!s)throw new t(e.entity.name,`drafts`);let c=o(e.entity,r);if(Object.keys(c).length===0){let e=await s.findOne({entityId:n,locale:i});return e?N(e):null}e.admin.assertBlockTreesValid(c),e.admin.assertUpdateValid(c);let l=D(e.entity).some(({name:e})=>Object.hasOwn(c,e)),u=e.entity.frontend?.path!==void 0&&L.some(e=>Object.hasOwn(c,e)),d=l||u?await s.findOne({entityId:n,locale:i}):null;if(await e.admin.assertBlockTreesFitDocument(c,()=>F(e,n,i,c,d?.data),{loadAreaRow:()=>P(e,n,i)}),await e.admin.assertMediaKindsValid(c,d?.data),u){let t={...d?.data??{},...c};if(i===`_`)await e.admin.assertPathAvailable(n,t);else{let r=e.entity.allFields,a={},o={};for(let[e,n]of Object.entries(t))r[e]?.translatable===!0?a[e]=n:o[e]=n;let s=e=>L.some(t=>Object.hasOwn(e,t)&&Object.hasOwn(c,t));s(a)&&await e.admin.assertPathAvailable(n,a,i),s(o)&&await e.admin.assertPathAvailable(n,o)}}let f=new Date,p=await s.upsert({entityId:n,locale:i,data:c,createdBy:a?.id??``,createdByName:a?.name??null,createdAt:f,updatedAt:f},{target:[`entityId`,`locale`],set:{updatedAt:f},mergeJsonb:[`data`]});return await w({entityName:e.entity.name,entityId:n,locale:i,userId:a?.id,draftData:p.data??{}}),N(p)}async function z(e,t,n=`_`){b(n);let r=await C(e);if(!r)return null;let i=await r.findOne({entityId:t,locale:n});return i?N(i):null}async function B(e,t,n=`_`){b(n);let r=await C(e);if(!r)return!1;let i=await r.deleteMany({entityId:t,locale:n});return i.length>0&&await w({entityName:e.entity.name,entityId:t,locale:n,reverted:!0}),i.length>0}async function V(e,n,i=`_`,a){if(b(i),!await C(e))throw new t(e.entity.name,`drafts`);let c=e.versionableOptions?await e.admin.findById(n,m(i)):null;return e.db.transaction(async l=>{let u={...e,db:l},d=await C(u);if(!d)throw new t(e.entity.name,`drafts`);let[p]=await d.deleteMany({entityId:n,locale:i});if(!p)throw new r(n,i);let{publishedAt:m,...h}=p.data??{},g=await s(u,n,o(e.entity,{...h,status:`published`}),i,l),_=H(e.entity,h);return _!==void 0&&await e.admin.updateInternal(n,{_overrides:_},{tx:l}),e.versionableOptions&&await f(u,n,g,c,i,a),g})}function H(e,t){if(!(e.behaviors??[]).some(e=>e.name===`withOverrides`))return;let n=e.allFields._overrides;if(n===void 0||n.internal!==!0)return;let r=t._overrides;if(!(typeof r!=`object`||!r||Array.isArray(r)))return r}async function U(e,t,n=`_`){b(n);let r=await C(e);return r?r.exists({entityId:t,locale:n}):!1}async function W(e,t=`_`){b(t);let n=await C(e);return n?n.count({locale:t}):0}async function G(e,t,n=`_`){b(n);let r=new Set;if(t.length===0)return r;let i=await C(e);if(!i)return r;let a=await i.findMany({where:{entityId:{in:t},locale:n}});for(let e of a)r.add(e.entityId);return r}async function K(e,t,n=`_`){b(n);let r=await z(e,t,n);if(!r)return null;let a=i().defaultLocale,o=n===`_`?{defaultLocale:a}:{locale:n,defaultLocale:a},s=await e.admin.findById(t,o);if(!s)return null;let l=e.entity.allFields,u=s,f=r.data,p={};for(let e of Object.keys(f))p[e]=u[e];let m=c(p,f,l);for(let e of m)e.type===`blockTree`&&(e.blockDiffs=d(Array.isArray(e.from)?e.from:[],Array.isArray(e.to)?e.to:[]));return{diffs:m,current:s,draft:r}}async function q(e,t){let n=(await Y(e,[t])).get(t);return n?Object.values(n):[]}async function J(e,n,r,a){b(r);let o=i();if(r===o.defaultLocale){let t={status:a};a===`published`&&(t.publishedAt=new Date),await e.admin.update(n,t);return}let s=await x(e);if(!s)throw new t(e.entity.name,`localeStatus`);let c={status:a};await e.admin.updateForLocale(n,c,r,{defaultLocale:o.defaultLocale,localeStatusWriter:(e,t,n)=>y(s,e,t,n)})}async function Y(e,t){let n=new Map;if(t.length===0)return n;let r=await x(e);if(!r)return n;let i=await r.findMany({where:{entityId:{in:t}}});for(let e of i){let t=e.entityId,r=e.locale,i=n.get(t);i||(i={},n.set(t,i)),i[r]={locale:r,status:e.status,publishedAt:e.publishedAt??null}}return n}function X(){let e=i(),t=A();return{locales:(t?.availableLocales??e.locales.map(e=>e.code)).map(e=>({code:e})),defaultLocale:t?.defaultLocale??e.defaultLocale}}function re(e,t,n,r){let i={};for(let a of n){if(a.code===r)continue;let n=t?.get(a.code)??{},o=[];for(let t of e)(n[t]===void 0||n[t]===null)&&o.push(t);i[a.code]={complete:o.length===0,total:e.length,translated:e.length-o.length,missing:o}}return i}async function ie(e,t){return(await Z(e,[t])).get(t)??{}}async function Z(e,t){let n=new Map;if(t.length===0)return n;let{locales:r,defaultLocale:i}=X(),a=Object.entries(e.entity.allFields).filter(([e,t])=>t.translatable).map(([e])=>e);if(a.length===0)return n;let o=te.get(`${e.entity.name}_translations`);if(!o)return n;let s=await ee(e.entity),c=j(o.entityId,t),l=await e.db.select().from(o).where(s===void 0?c:ne(c,O(o,{site:s},e.entity.name))),u=new Map;for(let e of l){let t=e,n=t.entityId,r=t.locale,i={};for(let e of a)i[e]=t[e];let o=u.get(n);o||(o=new Map,u.set(n,o)),o.set(r,i)}let d=await E(e.entity.name,t,e.db);for(let e of t){let t=re(a,u.get(e),r,i),o=d.get(e);for(let[e,n]of Object.entries(t)){let t=T(o,e);t&&(n.freshness=t)}n.set(e,t)}return n}const Q={total:0,complete:0,partial:0,missing:0,outdated:0,machineUnreviewed:0};async function ae(e,t){let{locales:r,defaultLocale:i}=X(),a=t?.locale??r.find(e=>e.code!==i)?.code;if(!a)return{...Q};if(!r.some(e=>e.code===a))throw new n(a,r.map(e=>e.code));let o=await e.admin.findMany();if(o.length===0)return{...Q};let s=await Z(e,o.map(e=>e.id)),c=0,l=0,u=0,d=0,f=0;for(let e of o){let t=s.get(e.id)?.[a];!t||t.translated===0?u++:t.complete?c++:l++,t?.freshness?.outdated===!0&&d++,t?.freshness?.machineUnreviewed===!0&&f++}return{total:o.length,complete:c,partial:l,missing:u,outdated:d,machineUnreviewed:f}}var $=class{ctx;constructor(t){let n=e(t.entity.behaviors);this.ctx=S(t,n)}async create(e){let t=await this.ctx.admin.create(e);return this.ctx.versionableOptions&&await g(this.ctx,t.id,t,null,!1),t}findById(e,t){return this.ctx.admin.findById(e,t)}findMany(e){return this.ctx.admin.findMany(e)}async update(e,t){let n=null;this.ctx.versionableOptions&&(n=await this.ctx.admin.findById(e));let r=await this.ctx.admin.update(e,t);if(this.ctx.versionableOptions&&n){let t=v(n,r),i=await g(this.ctx,e,r,t,!1);if(i!==void 0)return await u(this.ctx,e,i),await a(this.ctx,e),{...r,_version:i};await a(this.ctx,e)}return r}delete(e){return this.ctx.admin.delete(e)}saveTranslation(e,t,n){return this.ctx.admin.saveTranslation(e,t,n)}deleteTranslation(e,t){return this.ctx.admin.deleteTranslation(e,t)}getVersions(e,t){return l(this.ctx,e,t)}getVersion(e,t,n){return h(this.ctx,e,t,n)}compareVersions(e,t,n,r){return _(this.ctx,e,t,n,r)}restoreVersion(e,t,n){return p(this.ctx,e,t,n)}pruneVersions(e,t){return a(this.ctx,e,t)}createVersionSnapshot(e,t,n,r,i){return f(this.ctx,e,t,n,r,i)}getTranslationStatus(e){return ie(this.ctx,e)}getTranslationStatusBatch(e){return Z(this.ctx,e)}getTranslationReport(e){return ae(this.ctx,e)}getLocaleStatus(e){return q(this.ctx,e)}setLocaleStatus(e,t,n){return J(this.ctx,e,t,n)}getLocaleStatusBatch(e){return Y(this.ctx,e)}saveDraft(e,t,n,r){return I(this.ctx,e,t,n,r)}mergeDraft(e,t,n,r){return R(this.ctx,e,t,n,r)}getDraft(e,t){return z(this.ctx,e,t)}deleteDraft(e,t){return B(this.ctx,e,t)}publishDraft(e,t,n){return V(this.ctx,e,t,n)}hasDraft(e,t){return U(this.ctx,e,t)}countDrafts(e){return W(this.ctx,e)}hasDraftBatch(e,t){return G(this.ctx,e,t)}compareDraftWithCurrent(e,t){return K(this.ctx,e,t)}};function oe(e){return new $({admin:M(e),entity:e,logger:k().logger.child({content:e.name})})}export{$ as ContentClient,oe as createContentClient};
|
|
2
|
-
//# sourceMappingURL=client.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
const e=Symbol.for(`@murumets-ee/content:content-config`);function t(t){globalThis[e]=t}function n(){let t=globalThis[e];if(!t)throw Error(`@murumets-ee/content plugin not initialized. Add content() to your plugins array.`);return t}export{t as n,n as t};
|
|
2
|
-
//# sourceMappingURL=content-config-store-8omQF5p5.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./rolldown-runtime-DK3Fl9T5.mjs";import{t}from"./registry-CaPbY5lm.mjs";import{requireSiteFor as n}from"@murumets-ee/core";import"server-only";var r=e({createContentContext:()=>i,getDraftsClient:()=>a,getLocaleStatusClient:()=>s,getVersionsClient:()=>o});function i(e,t){return{entity:e.entity,admin:e.admin,db:e.admin.getDb(),versionableOptions:t,logger:e.logger}}async function a(e){let{drafts:r}=t(e.entity.name);return r?r.makeClient(e.db,await n(e.entity)):null}async function o(e){let{versions:r}=t(e.entity.name);return r?r.makeClient(e.db,await n(e.entity)):null}async function s(e){let{localeStatus:r}=t(e.entity.name);return r?r.makeClient(e.db,await n(e.entity)):null}export{o as a,s as i,i as n,a as r,r as t};
|
|
2
|
-
//# sourceMappingURL=context-D7eEItCY.mjs.map
|
|
@@ -25,4 +25,3 @@ declare function createDetailTemplateProvider(getApp: () => Promise<ToolkitApp>
|
|
|
25
25
|
}): DetailTemplateProvider;
|
|
26
26
|
//#endregion
|
|
27
27
|
export { DetailTemplateDocument, DetailTemplateProvider, createDetailTemplateProvider };
|
|
28
|
-
//# sourceMappingURL=detail-template-provider.d.mts.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{n as e,t}from"./detail-template-names-CD1Y9n1U.mjs";import{getBlockTreeFieldName as n,isTemplateDrawn as r}from"@murumets-ee/entity";import{createSystemReachResolver as i}from"@murumets-ee/core";import{QueryClient as a}from"@murumets-ee/entity/query";import{schemaRegistry as o}from"@murumets-ee/db";import{eq as s,getTableColumns as c}from"drizzle-orm";import{effectiveDetailSpecs as l,resolveDocumentDetail as u}from"@murumets-ee/blocks/server";const d=i(`detail-template-resolver`),f=new Set([`title`,`text`]);function p(i,p){return{entity:t,readTemplate:async({entity:l,locale:u})=>{let f=await i(),m=f.entities.get(l);if(!m||!r(m))return null;let h=f.entities.get(t);if(!h)return null;let g=n(h),_=o.get(t),v=(_?c(_):void 0)?.[e];if(!g||!v)return null;let y=(await new a({entity:h,db:f.db.readOnly,logger:f.logger.child({resolve:`detail-template`}),contextResolver:d}).findMany({limit:1,locale:u,defaultLocale:p.defaultLocale,where:s(v,l)}))[0];if(!y||typeof y.id!=`string`)return null;let b=y[g];return!Array.isArray(b)||b.length===0?null:{id:y.id,blocks:b}},publicRow:async({entity:e,row:t,locale:n})=>{let r=l(await i()).specs.get(e);if(r===void 0)return{};let a=u(r,t,n,f);return{...a?.title!==void 0&&{title:a.title},...a?.text!==void 0&&{description:a.text}}}}}export{p as createDetailTemplateProvider};
|
|
2
|
-
//# sourceMappingURL=detail-template-provider.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./rolldown-runtime-DK3Fl9T5.mjs";import{getAppOrUndefined as t,getContext as n,requireSiteFor as r}from"@murumets-ee/core";var i=e({siteForDocumentType:()=>a});async function a(e){let i=n()?.app??t();if(!i)return;let a=i.entities.get(e);if(a)return r(a,i)}export{a as n,i as t};
|
|
2
|
-
//# sourceMappingURL=document-site-B8tmEqLw.mjs.map
|
|
@@ -61,4 +61,3 @@ declare function detailTemplateEntity(options: DetailTemplateEntityOptions): Ent
|
|
|
61
61
|
}, "detail_template", [Behavior<import("@murumets-ee/entity").AuditableFields, string>, Behavior<import("@murumets-ee/entity").PublishableFields, "publishable">, Behavior<VersionableFields, string>, Behavior<Record<never, never>, "content:detail-template-undeletable">, ...Behavior<Record<never, never>, string>[]]>;
|
|
62
62
|
//#endregion
|
|
63
63
|
export { CHROME_PLACEMENTS, CHROME_PLACEMENT_LABELS, type ChromePlacement, DetailTemplateDeleteRefusedError, type DetailTemplateEntityOptions, type SiteChromeEntityOptions, detailTemplateEntity, detailTemplateTargets, siteChromeEntity };
|
|
64
|
-
//# sourceMappingURL=index.d.mts.map
|
package/dist/entities/index.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{n as e}from"../versionable-Br_G5VGR.mjs";import{t}from"../detail-template-names-CD1Y9n1U.mjs";import{n,r,t as i}from"../site-chrome-BAtQaAqC.mjs";import{ForbiddenError as a,auditable as o,defineEntity as s,field as c,isTemplateDrawn as l,publishable as u}from"@murumets-ee/entity";const d={label:{label:`Name`,description:`Shown in the admin list and as the editor title. Visitors never see it.`}};function f(e){let t={...d};for(let[n,r]of Object.entries(e??{}))t[n]={...t[n],...r};return t}var p=class extends a{constructor(){super(`A detail template is not deleted: the rows it draws are still on the site. Unpublish it instead — those pages then show a plain fallback, and the draft stays editable.`),this.name=`DetailTemplateDeleteRefusedError`}};const m={name:`content:detail-template-undeletable`,hooks:{beforeDelete:async()=>{throw new p}}};function h(e){let t=[];for(let n of e){if(!l(n))throw Error(`detailTemplateEntity: '${n.name}' is listed in \`for\` but does not declare \`frontend: { path, drawnBy: 'template' }\`. A template for it would never be drawn.`);t.includes(n.name)||t.push(n.name)}return t}function g(n){let r=n.viewRole??`editor`,i=n.updateRole??`editor`,a=n.adminRole??`admin`,l=h(n.for);return s({name:t,site:`bound`,kind:`collection`,fields:{target:c.select({options:l,required:!0,unique:!0}),label:c.text({required:!0}),layout:c.blockTree({translatable:!0,rowsFrom:`target`,...n.environment!==void 0&&{environment:n.environment}})},behaviors:[o(),u(),e({maxPerDoc:n.maxVersions??30}),m,...n.behaviors??[]],scope:`global`,access:{view:r,create:a,update:i,delete:a},admin:{icon:`layout-template`,description:`One page layout per kind of synced record, drawn for every record of that kind.`,rootFields:[`label`],fieldOverrides:f(n.admin?.fieldOverrides),titleField:`label`,group:`Site`,disableCreate:!0,...l.length===0&&{hidden:!0}}})}export{i as CHROME_PLACEMENTS,n as CHROME_PLACEMENT_LABELS,p as DetailTemplateDeleteRefusedError,g as detailTemplateEntity,h as detailTemplateTargets,r as siteChromeEntity};
|
|
2
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./rolldown-runtime-DK3Fl9T5.mjs";import{c as t}from"./schema-BYrYzsmO.mjs";var n=e({enumeratePaths:()=>r,getCanonicalPaths:()=>i});async function*r(e,n,r={}){let i=r.pageSize??200,a=r.publishConcurrency??5,{locale:o,entityType:s}=e,c=e.afterId;for(;;){let e={locale:o,isCanonical:!0};s!==void 0&&(e.entityType=s),c!==void 0&&(e.id={gt:c});let r=await n.pathsClient.findMany({where:e,orderBy:[{column:`id`,dir:`asc`}],limit:i});if(r.length===0)break;let l=new Map;for(let e of r){let t=l.get(e.entityType);t?t.push(e):l.set(e.entityType,[e])}let u=new Map;await t([...l.entries()],a,async([e,t])=>{let r=await n.filterPublished(e,t.map(e=>e.entityId),o);u.set(e,r)});for(let e of r)u.get(e.entityType)?.has(e.entityId)&&(yield{path:e.path,entityType:e.entityType,id:e.entityId,updatedAt:e.updatedAt});let d=r[r.length-1];if(!d||(c=d.id,r.length<i))break}}async function i(e,t,n,r){let i=new Map;for(let a=0;a<t.length;a+=500){let o=t.slice(a,a+500),s=await r.pathsClient.findMany({where:{entityType:e,locale:n,isCanonical:!0,entityId:{in:[...o]}},limit:o.length});for(let e of s)i.set(e.entityId,e.path)}return i}export{n,i as r,r as t};
|
|
2
|
-
//# sourceMappingURL=enumerate-CYHJKQz6.mjs.map
|
package/dist/errors-NRNILhhm.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
var e=class extends Error{entityName;capability;constructor(e,t,n){super(n??`Entity "${e}" does not support ${t}. Add the corresponding behavior to defineEntity({ behaviors: [...] }).`),this.name=`EntityCapabilityError`,this.entityName=e,this.capability=t}},t=class extends Error{entityId;locale;constructor(e,t){super(t===`_`?`No pending draft to publish — this document is already up to date.`:`No pending draft to publish for locale "${t}" — it is already up to date.`),this.name=`DraftNotFoundError`,this.entityId=e,this.locale=t}},n=class extends Error{entityId;version;locale;constructor(e,t,n){super(`Version ${t} not found for entity ${e}`),this.name=`VersionNotFoundError`,this.entityId=e,this.version=t,this.locale=n}},r=class extends Error{locale;allowed;constructor(e,t){super(`Invalid locale "${e}". Configured locales: [${t.join(`, `)}]. (The "_" sentinel is also accepted for default-locale storage.)`),this.name=`InvalidLocaleError`,this.locale=e,this.allowed=t}};export{n as i,e as n,r,t};
|
|
2
|
-
//# sourceMappingURL=errors-NRNILhhm.mjs.map
|
|
@@ -272,4 +272,3 @@ declare function resolveSiteI18n(app: ToolkitApp, options?: {
|
|
|
272
272
|
declare function resolveMessageOverrides(app: ToolkitApp, locale: string): Promise<MessageEntry[]>;
|
|
273
273
|
//#endregion
|
|
274
274
|
export { withOverrides as A, WorkflowableFields as C, OverridesMap as D, OverrideDirective as E, WithOverridesFields as O, WorkflowTransitionError as S, workflowable as T, EntityCapability as _, resolveI18nConfig as a, WORKFLOW_TRANSITIONS as b, DraftNotFoundError as c, VersionNotFoundError as d, BlockDiffEntry as f, PropDiff as g, FieldDiff as h, resolveEffectiveLocales as i, hasWithOverrides as k, EntityCapabilityError as l, DiffSegment as m, SiteI18n as n, resolveSiteI18n as o, BlockDiffStatus as p, enabledLocaleCodes as r, resolveSiteLocales as s, resolveMessageOverrides as t, InvalidLocaleError as u, entitySupports as v, isAllowedTransition as w, WorkflowState as x, WORKFLOW_STATES as y };
|
|
275
|
-
//# sourceMappingURL=index-cT8Qk4gu.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{n as e,t}from"./versionable-Br_G5VGR.mjs";import{i as n,n as r,r as i,t as a}from"./errors-NRNILhhm.mjs";import{n as o,r as s,t as c}from"./locale-entity-CoSq3C77.mjs";import{a as l,i as u,o as d,r as f,t as p}from"./locale-registry-COsJrVZl.mjs";import{n as m,r as h,t as g}from"./routing-strategy-D6B4ngT9.mjs";import{USER_ID_MAX_LENGTH as _,field as v}from"@murumets-ee/entity";import{createSystemReachResolver as y}from"@murumets-ee/core";import{QueryClient as b}from"@murumets-ee/entity/query";import{schemaRegistry as x}from"@murumets-ee/db";import{eq as S}from"drizzle-orm";const C=new Set([`hide`,`patch`,`replace`]),w=Symbol.for(`@murumets-ee/content:withOverrides`),T=new Set([`__proto__`,`constructor`,`prototype`]);function E(e,t,n=0){if(e!=null&&!(typeof e!=`object`||Array.isArray(e)))for(let r of Object.keys(e)){if(T.has(r))throw Error(`withOverrides: reserved key '${r}' at ${t} is not allowed.`);n<3&&E(e[r],`${t}.${r}`,n+1)}}function D(e){if(e==null)return{};if(typeof e!=`object`||Array.isArray(e))throw Error(`withOverrides: _overrides must be a plain object map.`);let t=e,n=Object.keys(t);if(n.length>100)throw Error(`withOverrides: _overrides has ${n.length} entries; cap is 100.`);let r={};for(let e of n){if(T.has(e))throw Error(`withOverrides: reserved key '${e}' is not allowed.`);let n=t[e];if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`withOverrides: _overrides['${e}'] must be a directive object.`);let i=n.kind;if(typeof i!=`string`||!C.has(i))throw Error(`withOverrides: _overrides['${e}'].kind must be one of [hide, patch, replace]; got ${String(i)}.`);if(i===`patch`){let t=n;O(t.props,`_overrides['${e}'].props`),O(t.traits,`_overrides['${e}'].traits`)}if(i===`replace`){let t=n.block;if(typeof t!=`object`||!t||Array.isArray(t)||typeof t.id!=`string`)throw Error(`withOverrides: _overrides['${e}'] replace payload must include an object 'block' with a string 'id'.`)}E(n,`_overrides['${e}']`),r[e]=n}return r}function O(e,t){if(e!==void 0&&(typeof e!=`object`||!e||Array.isArray(e)))throw Error(`withOverrides: ${t} must be an object.`)}function k(){return{name:`withOverrides`,fields:{_overrides:v.json({default:()=>({}),internal:!0,refScan:!0})},hooks:{beforeCreate:async e=>(e._overrides===void 0?e._overrides={}:e._overrides=D(e._overrides),e),beforeUpdate:async(e,t)=>(t._overrides===void 0||(t._overrides=D(t._overrides)),t)},[w]:!0}}function A(e){return e?e.some(e=>!!e?.[w]):!1}const j=[`draft`,`in_review`,`approved`,`rejected`,`published`],M={draft:[`in_review`],in_review:[`approved`,`rejected`],approved:[`published`,`in_review`],rejected:[`in_review`,`draft`],published:[`draft`]};function N(e,t){return e===t?!0:M[e]?.includes(t)??!1}var P=class extends Error{from;to;constructor(e,t){super(`Invalid workflow transition: ${e} → ${t}. Allowed transitions from "${e}": [${(M[e]??[]).join(`, `)}].`),this.name=`WorkflowTransitionError`,this.from=e,this.to=t}};function F(){return{name:`workflowable`,fields:{_workflowStatus:v.select({options:j,default:`draft`,indexed:!0,required:!0,internal:!0}),_workflowAssignee:v.text({required:!1,internal:!0,maxLength:_}),_workflowNote:v.text({required:!1,internal:!0}),_workflowUpdatedAt:v.date({internal:!0})},hooks:{beforeCreate:async e=>(e._workflowStatus=`draft`,e._workflowUpdatedAt=new Date,e),beforeUpdate:async(e,t,n)=>{let r=t._workflowStatus;if(r===void 0)return t;if(!j.includes(r))throw new P(`draft`,r);let i=(await n?.loadCurrent?.())?._workflowStatus??`draft`,a=r;if(!N(i,a))throw new P(i,a);return t._workflowUpdatedAt=new Date,t}}}}function I(e,t){switch(t){case`drafts`:return L(e,`publishable`);case`versions`:return L(e,`versionable`);case`localeStatus`:return L(e,`publishable`)&&R(e);case`translations`:return R(e)}}function L(e,t){return e.behaviors?.some(e=>e.name===t)??!1}function R(e){let t=e.allFields;for(let e of Object.keys(t)){let n=t[e];if(n&&n.translatable===!0)return!0}return!1}const z=y(`message-registry`),B=2e4;async function V(e,t){if(!e.entities?.has(`message`))return[];let n=x.get(`message`);if(!n)return[];let r=new b({entity:h,db:e.db.readOnly,logger:e.logger.child({registry:`message`}),contextResolver:z});try{let i=await r.findMany({where:S(n.locale,t),limit:B});return i.length>=B&&e.logger.warn({locale:t,cap:B},`message override read hit the row cap — some overrides were not applied`),i.map(e=>{let t=e;return{namespace:String(t.namespace),key:String(t.key),value:String(t.value)}})}catch(n){return e.logger.warn({err:n,locale:t},`message registry read failed — falling back to shipped defaults only`),[]}}export{a as DraftNotFoundError,r as EntityCapabilityError,i as InvalidLocaleError,c as Locale,h as Message,o as ROUTING_STRATEGIES,n as VersionNotFoundError,j as WORKFLOW_STATES,M as WORKFLOW_TRANSITIONS,P as WorkflowTransitionError,p as enabledLocaleCodes,I as entitySupports,t as getVersionableOptions,A as hasWithOverrides,s as i18nSettings,N as isAllowedTransition,g as localePrefixForStrategy,m as prefixDefaultLocaleForStrategy,f as resolveEffectiveLocales,u as resolveI18nConfig,V as resolveMessageOverrides,l as resolveSiteI18n,d as resolveSiteLocales,e as versionable,k as withOverrides,F as workflowable};
|
|
2
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{behavior as e,defineEntity as t,field as n}from"@murumets-ee/entity";import{defineSettings as r,setting as i}from"@murumets-ee/settings/define";const a=[`prefix-all`,`no-prefix-default`,`cookie`],o=r({namespace:`i18n`,scope:`global`,label:`Languages`,iconName:`languages`,hideFromMenu:!0,schema:{defaultLocale:i.text({default:``}),routingStrategy:i.select({options:a,default:`no-prefix-default`})}}),s=t({name:`locale`,class:`config`,scope:`global`,site:`shared`,access:{view:`locale:view`,create:`locale:create`,update:`locale:update`,delete:`locale:delete`},fields:{code:n.text({required:!0,unique:!0,maxLength:10}),label:n.text({required:!0,maxLength:64}),enabled:n.boolean({default:!0}),direction:n.select({options:[`ltr`,`rtl`],default:`ltr`}),sortOrder:n.number({default:0})},behaviors:[e.auditable()],admin:{hidden:!0,label:`Languages`,labelSingular:`Language`}});export{a as n,o as r,s as t};
|
|
2
|
-
//# sourceMappingURL=locale-entity-CoSq3C77.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./rolldown-runtime-DK3Fl9T5.mjs";import{n as t,r as n,t as r}from"./locale-entity-CoSq3C77.mjs";import{t as i}from"./content-config-store-8omQF5p5.mjs";import{createSystemReachResolver as a,getApp as o,getCurrentSite as s,mergeConfigOverrides as c,readSiteRecord as l,resolveImplicitSite as u}from"@murumets-ee/core";import{QueryClient as d}from"@murumets-ee/entity/query";var f=e({enabledLocaleCodes:()=>v,resolveEffectiveLocales:()=>_,resolveI18nConfig:()=>y,resolveInstallBaseLocale:()=>T,resolveSiteI18n:()=>w,resolveSiteLocales:()=>C});const p=a(`locale-registry`);function m(){return i().locales.map((e,t)=>({code:e.code,label:e.label,enabled:!0,direction:`ltr`,sortOrder:t}))}function h(e,t){return e.sortOrder-t.sortOrder||e.code.localeCompare(t.code)}async function g(e){return e.entities?.has(`locale`)?(await new d({entity:r,db:e.db.readOnly,logger:e.logger.child({registry:`locale`}),contextResolver:p}).findMany({limit:1e3})).map(e=>{let t=e;return{code:String(t.code),label:typeof t.label==`string`&&t.label.length>0?t.label:String(t.code),enabled:t.enabled!==!1,direction:t.direction===`rtl`?`rtl`:`ltr`,sortOrder:typeof t.sortOrder==`number`?t.sortOrder:0}}):[]}async function _(e){let t;try{t=await g(e)}catch(t){return e.logger.warn({err:t},`locale registry read failed — falling back to content() defaults`),[...m()].sort(h)}return c({defaults:m(),overrides:t,idOfDefault:e=>e.code,idOfOverride:e=>e.code}).sort(h)}function v(e){return e.filter(e=>e.enabled).map(e=>e.code)}async function y(e,r){let a=v(r??await _(e)),o=i().defaultLocale,s={};try{let{createSettingsClient:t}=await import(`@murumets-ee/settings/runtime`);s=await t(n,{app:e}).getAll()??{}}catch(t){e.logger.warn({err:t},`i18n settings read failed — falling back to content() defaults`)}let c=typeof s.defaultLocale==`string`&&s.defaultLocale.length>0?s.defaultLocale:o,l=a.includes(c)?c:a.includes(o)?o:a[0]??o,u=s.routingStrategy;return{defaultLocale:l,routingStrategy:t.includes(typeof u==`string`?u:``)?u:`no-prefix-default`}}async function b(e,t){return t??s()??await u(e).catch(()=>void 0)}function x(e,t){return l(e,t)}function S(e,t){let n=t?.locales??[];return n.length===0?e:e.filter(e=>n.includes(e.code))}async function C(e,t={}){let n=[...t.entries??await _(e)],r=await b(e,t.site);return r===void 0?{site:r,entries:n}:{site:r,entries:S(n,await x(e,r))}}async function w(e,n={}){let r=[...n.entries??await _(e)],i=await y(e,r),a=await b(e,n.site);if(a===void 0)return{site:a,entries:r,i18n:i,install:i};let o=await x(e,a),s=S(r,o),c=v(s),l=e.config.sites?.multiple===!0,u=l?o?.defaultLocale:void 0,d=u!==void 0&&c.includes(u)?u:c.includes(i.defaultLocale)?i.defaultLocale:c[0]??i.defaultLocale,f=l?o?.routingStrategy:void 0;return{site:a,entries:s,i18n:{defaultLocale:d,routingStrategy:t.includes(f??``)?f:i.routingStrategy},install:i}}async function T(){let e=o();if(e.entities.has(`locale`))return(await y(e)).defaultLocale}export{w as a,y as i,f as n,C as o,_ as r,v as t};
|
|
2
|
-
//# sourceMappingURL=locale-registry-COsJrVZl.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{r as e}from"./errors-NRNILhhm.mjs";import{t}from"./content-config-store-8omQF5p5.mjs";import{getContext as n}from"@murumets-ee/core";function r(r){if(r===`_`)return;let i=n()?.availableLocales??t().locales.map(e=>e.code);for(let e of i)if(e===r)return;throw new e(r,[...i])}export{r as t};
|
|
2
|
-
//# sourceMappingURL=locale-utils-B0mFoV47.mjs.map
|
package/dist/lock-service.d.mts
CHANGED
package/dist/lock-service.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./locks-5779ugSW.mjs";import"server-only";var t=class{client;constructor(t){this.client=e.makeClient(t.app.db.readWrite)}async acquireLock(e,t,n,r){let i=new Date,a=new Date(i.getTime()+300*1e3),o=await this.client.tryClaim({entityType:e,entityId:t,locale:n,lockedBy:r.id,lockedByName:r.name??null,lockedAt:i,expiresAt:a},{target:[`entityType`,`entityId`,`locale`],replaceWhen:{$or:[{expiresAt:{lt:i}},{lockedBy:r.id}]}});return o.acquired?{acquired:!0}:{acquired:!1,lock:{lockedBy:o.row.lockedBy,lockedByName:o.row.lockedByName??null,lockedAt:o.row.lockedAt,expiresAt:o.row.expiresAt}}}async renewLock(e,t,n,r){let i=new Date,a=new Date(i.getTime()+300*1e3);return await this.client.update({entityType:e,entityId:t,locale:n,lockedBy:r,expiresAt:{gte:i}},{expiresAt:a})!==null}async releaseLock(e,t,n,r){return await this.client.delete({entityType:e,entityId:t,locale:n,lockedBy:r})!==null}async forceReleaseLock(e,t,n){return await this.client.delete({entityType:e,entityId:t,locale:n})!==null}async getLock(e,t,n){let r=new Date,i=await this.client.findOne({entityType:e,entityId:t,locale:n,expiresAt:{gte:r}});return i?{lockedBy:i.lockedBy,lockedByName:i.lockedByName??null,lockedAt:i.lockedAt,expiresAt:i.expiresAt}:null}};export{t as LockService};
|
|
2
|
-
//# sourceMappingURL=lock-service.mjs.map
|
package/dist/locks-5779ugSW.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{column as e,defineTable as t}from"@murumets-ee/db";const n=t({name:`toolkit_content_locks`,columns:{id:e.uuid({primaryKey:!0,defaultRandom:!0}),entityType:e.varchar({length:100,notNull:!0,pgName:`entity_type`}),entityId:e.varchar({length:255,notNull:!0,pgName:`entity_id`}),locale:e.varchar({length:10,notNull:!0,default:`_`}),lockedBy:e.varchar({length:255,notNull:!0,pgName:`locked_by`}),lockedByName:e.varchar({length:255,pgName:`locked_by_name`}),lockedAt:e.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`locked_at`}),expiresAt:e.timestamp({notNull:!0,withTimezone:!0,pgName:`expires_at`})},unique:[{on:[`entityType`,`entityId`,`locale`]}]}),r=n.table;export{r as n,n as t};
|
|
2
|
-
//# sourceMappingURL=locks-5779ugSW.mjs.map
|
package/dist/plugin-CjgqBSFy.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./versionable-Br_G5VGR.mjs";import{r as t}from"./errors-NRNILhhm.mjs";import{r as n,t as r}from"./locale-entity-CoSq3C77.mjs";import{n as i,t as a}from"./content-config-store-8omQF5p5.mjs";import{r as o}from"./routing-strategy-D6B4ngT9.mjs";import{n as s,t as c}from"./registry-CaPbY5lm.mjs";import"./locale-utils-B0mFoV47.mjs";import{n as l}from"./document-site-B8tmEqLw.mjs";import{m as u,n as d,p as f}from"./translation-provenance-B41lEDM-.mjs";import{n as p}from"./chrome-entity-names-zYJzP-_U.mjs";import{r as m}from"./detail-template-names-CD1Y9n1U.mjs";import{c as h,i as g,n as _,o as v,r as y,t as b}from"./schema-BYrYzsmO.mjs";import{l as x,t as S,u as C}from"./schema-LlK6EkOJ.mjs";import{r as w,t as T}from"./routes-siXmjKDA.mjs";import{n as E}from"./locks-5779ugSW.mjs";import{MAX_PATH_DEPTH as ee,buildPartitionCondition as D,hasPathParent as O,isSiteBound as k,resolveEffectiveSlugMode as A,resolvePattern as j}from"@murumets-ee/entity";import{definePlugin as M,getApp as N,getContext as P,getCurrentSite as F,requireRequestSite as I,resolveImplicitSite as L,runAsCli as R,runInEverySite as z,runInSite as B}from"@murumets-ee/core";import{column as V,defineTable as te,schemaRegistry as H}from"@murumets-ee/db";import{and as U,asc as W,eq as G,getTableColumns as ne,inArray as re,sql as ie}from"drizzle-orm";import{createHash as ae}from"node:crypto";import{z as K}from"zod";const oe=Symbol.for(`@murumets-ee/content:locale-status-writer`);async function q(e,t,n,r){let i=r===`published`?new Date:null;await e.upsert({entityId:t,locale:n,status:r,publishedAt:i},{target:[`entityId`,`locale`],set:{status:r,publishedAt:i}})}function se(e){globalThis[oe]=(n,r)=>{let{localeStatus:i}=c(n.name);if(i)return async(n,a,o,s)=>{let c=P()?.availableLocales??e;if(!c.includes(a))throw new t(a,[...c]);await q(i.makeClient(r,s),n,a,o)}}}function ce(){return{async writeDraft({documentType:e,documentId:t,locale:n,dataPatch:r,user:i,tx:a}){let{drafts:o}=c(e);if(!o)return!1;let s=o.makeClient(a,await l(e)),u=new Date,f=await s.upsert({entityId:t,locale:n,data:r,createdBy:i.id,createdByName:i.name??null,createdAt:u,updatedAt:u},{target:[`entityId`,`locale`],set:{updatedAt:u},mergeJsonb:[`data`]});return d({entityName:e,entityId:t,locale:n,userId:i.id,draftData:f.data??r}),!0},async readDraft({documentType:e,documentId:t,locale:n,db:r}){let{drafts:i}=c(e);if(!i)return null;let a=await i.makeClient(r,await l(e)).findOne({entityId:t,locale:n});return a?{data:a.data??{},createdBy:a.createdBy??null,createdByName:a.createdByName??null,updatedAt:a.updatedAt??null}:null},async readLocaleStatus({documentType:e,documentId:t,locale:n,db:r}){let{localeStatus:i}=c(e);if(!i)return null;let a=await i.makeClient(r,await l(e)).findOne({entityId:t,locale:n});return a?a.status===`published`?`published`:`draft`:null},async hasAnyDraft({documentType:e,documentId:t,db:n}){let{drafts:r}=c(e);return r?r.makeClient(n,await l(e)).exists({entityId:t}):!1},async hasAnyLocaleActivity({documentType:e,documentId:t,db:n}){let{localeStatus:r}=c(e),i=await l(e);if(r&&await r.makeClient(n,i).exists({entityId:t}))return!0;let a=H.get(`${e}_translations`);if(a){let r=a.entityId;if(r!==void 0){let o=i===void 0?G(r,t):U(G(r,t),D(a,{site:i},e));if((await n.select({one:ie`1`}).from(a).where(o).limit(1)).length>0)return!0}}return!1}}}function le(e){let{defaultLocale:t}=a();return e===`_`||e===t?{defaultLocale:t}:{locale:e,defaultLocale:t}}function ue(e){let{defaultLocale:t}=a();return e===`_`||e===t?`_`:e}async function de(e,t,n,r){let{drafts:i}=c(e);if(!i)return;let a=await i.makeClient(r,await l(e)).findOne({entityId:t,locale:n});return a?a.data??void 0:void 0}function fe(){return{async snapshotCurrentState({documentType:t,documentId:n,locale:r,user:i}){let a=N(),o=a.entities.get(t);if(!o)return!1;let s=e(o.behaviors);if(!s)return!1;let c=a.getClient(o),l=c.getDb(),u=ue(r),d=await c.findById(n,le(u));if(!d)return!1;let f=await de(t,n,u,l),p=f?{...d,...f}:{...d},[{createContentContext:m},{createVersionSnapshot:h}]=await Promise.all([import(`./context-D7eEItCY.mjs`).then(e=>e.t),import(`./versions-w2ui-Vzb.mjs`).then(e=>e.c)]);return await h(m({admin:c,entity:o},s),n,p,d,u,{id:i.id,...i.name==null?{}:{name:i.name}}),!0}}}async function pe(e,t,n){let r=ne(b),i=r[y],a=r.entityType,o=r.entityId;if(!i||!a||!o)throw Error(`toolkit_paths is missing '${y}'/entity columns`);let s=await e.selectDistinct({site:i}).from(b).where(U(G(a,t),G(o,n))).limit(2);if(s.length>1)return null;let c=s[0]?.site;return typeof c==`string`?c:void 0}const me=Symbol.for(`@murumets-ee/content:path-writers-factory`),J=Symbol.for(`@murumets-ee/content:cascade-trigger-factory`);function he(e){globalThis[J]=e}function ge(){let e=globalThis[J];return typeof e==`function`?e:void 0}function _e(e,t){return async r=>{let i=await ve(e,t,r);if(i===null)return;let a=_.makeClient(e.db.readWrite,i),o=F();if(o!==void 0&&o!==i&&!(r.action===`delete`||r.action===`release`)){e.logger.warn({entity:r.entityName,id:r.id,site:i,requestSite:o},"toolkit_paths: a cascade reached a document on another site — its path is left for `lumi paths:rebuild` on that site rather than recomputed from this request");return}return o===void 0&&r.viaCascade===!0&&k(t)?B(i,()=>n(a,r)):n(a,r)};async function n(n,r){if(r.action===`delete`){await n.deleteMany({entityType:r.entityName,entityId:r.id});return}if(r.action===`release`){await n.deleteMany({entityType:r.entityName,entityId:r.id,isCanonical:!0});return}let i=a(),o=i.defaultLocale,s=i.reservedPathPrefixes??[],c=r.locale?[r.locale]:i.locales.map(e=>e.code),l=r.viaCascade===!0?e.getSystemClient(t):e.getClient(t),u=async n=>{if(!O(t))return;let i=ge();if(i)try{await i(e,t,r.id,n)}catch(t){e.logger.warn({err:t,entity:r.entityName,id:r.id,locale:n},`toolkit_paths: descendant-cascade trigger threw — the entity write already committed, so tolerating and continuing (paths are rebuildable, D005)`)}};for(let i of c){let a=i===r.locale?r.row??null:await l.findById(r.id,{locale:i,defaultLocale:o});if(!a){await v({pathsClient:n,entityType:r.entityName,entityId:r.id,locale:i,path:null,skipReason:`row-unreadable`,reservedPathPrefixes:s,logger:e.logger});continue}let c=await x({entity:t,row:a,locale:i,defaultLocale:o,pathsClient:n}),d=await v({pathsClient:n,entityType:r.entityName,entityId:r.id,locale:i,path:c.path,...c.skipReason!==void 0&&{skipReason:c.skipReason},reservedPathPrefixes:s,logger:e.logger});(d.outcome===`renamed`||r.action===`restore`&&d.outcome===`created`)&&await u(i)}}}async function ve(e,t,n){if(n.viaCascade===!0&&k(t)){let t=await pe(e.db.readWrite,n.entityName,n.id);if(t===null)return e.logger.warn({entity:n.entityName,id:n.id},"toolkit_paths: a document has path rows on SEVERAL sites — refusing to guess which one this cascade maintains; `lumi paths:rebuild` per site repairs it"),null;if(t!==void 0)return t;let r=F();if(r!==void 0)return r;let i=await L(e).catch(()=>void 0);return i===void 0?(e.logger.warn({entity:n.entityName,id:n.id,action:n.action},"toolkit_paths: cascade child has no path rows and the request names no site — nothing to maintain here; `lumi paths:rebuild` recomputes it per site"),null):i}return I(`toolkit_paths`,e)}function ye(e,t){return async n=>{let r=_.makeClient(e.db.readWrite,await I(`toolkit_paths`,e)),i=a(),o=i.defaultLocale,s=i.reservedPathPrefixes??[],c=n.locale??o,l=null;n.id!==void 0&&(l=await e.getClient(t).findById(n.id,{locale:c,defaultLocale:o}));let u=A(n.data.slugMode,l?.slugMode);await C({entity:t,data:n.data,currentRow:l,id:n.id,locale:c,defaultLocale:o,slugMode:u,reservedPathPrefixes:s,pathsClient:r})}}function be(){globalThis[me]=(e,t)=>({pathIndexWriter:_e(e,t),pathConflictGuard:ye(e,t)})}const Y=K.object({entityType:K.string().min(1),parentId:K.string().uuid(),locale:K.string().min(1)}),X=K.object({entity:K.string().min(1).optional(),locale:K.string().min(1).optional(),dryRun:K.boolean()}),Z=K.object({dryRun:K.boolean()});async function xe(e,t,n={}){let{entityType:r,parentId:i,locale:o}=t,s=n.maxItems??2e3,c=n.concurrency??5,l={processed:0,regenerated:0,unchanged:0,skipped:0,failed:0,truncated:!1},u=e=>({phase:e,...l}),d=()=>({entityType:r,parentId:i,locale:o,cap:s,...l}),f=e.entities.get(r);if(!f)return e.logger.warn({entityType:r,parentId:i,locale:o},`paths-cascade: unknown entity type — nothing to regenerate`),n.onProgress?.(u(`done`)),d();if(!O(f))return e.logger.warn({entityType:r,parentId:i,locale:o},`paths-cascade: entity is not a pathParent() hierarchy — nothing to regenerate`),n.onProgress?.(u(`done`)),d();let p=a(),m=p.defaultLocale,g=p.reservedPathPrefixes??[],y=_.makeClient(e.db.readWrite,await I(`toolkit_paths`,e)),b=e.getClient(f),S=b.getTable().parent,C=async t=>{let n=t.id;try{let i=await x({entity:f,row:t,locale:o,defaultLocale:m,pathsClient:y});switch((await v({pathsClient:y,entityType:r,entityId:n,locale:o,path:i.path,...i.skipReason!==void 0&&{skipReason:i.skipReason},reservedPathPrefixes:g,logger:e.logger})).outcome){case`created`:case`renamed`:l.regenerated+=1;break;case`unchanged`:l.unchanged+=1;break;default:l.skipped+=1;break}}catch(t){l.failed+=1,e.logger.warn({err:t,entityType:r,id:n,locale:o},`paths-cascade: failed to regenerate one descendant path — continuing (per-item isolation)`)}},w=[i];for(;w.length>0;){let e=s-l.processed;if(e<=0){l.truncated=!0;break}let t=await b.findMany({where:re(S,w),locale:o,defaultLocale:m,limit:e+1});if(t.length===0)break;let r=t;if(t.length>e&&(r=t.slice(0,e),l.truncated=!0),await h(r,c,C),l.processed+=r.length,n.onProgress?.(u(`walking`)),l.truncated)break;w=r.map(e=>e.id)}return l.truncated&&e.logger.warn({entityType:r,parentId:i,locale:o,processed:l.processed,cap:s},`paths-cascade: descendant subtree exceeded the cap — deeper/remaining descendants were NOT regenerated. Run \`lumi paths:rebuild --entity ${r}\` for guaranteed full coverage.`),n.onProgress?.(u(`done`)),d()}async function Se(e,t,n={}){let r=n.pageSize??200,i=n.concurrency??5,o=n.sampleCap??25,s=t.dryRun,c=a(),l=c.defaultLocale,u=c.reservedPathPrefixes??[],d=c.locales.map(e=>e.code),f=t.locale?d.filter(e=>e===t.locale):d,p=[...e.entities.values()].filter(e=>!!e.frontend?.path&&(t.entity===void 0||e.name===t.entity)),m=t.entity!==void 0&&p.length===0,g=t.locale!==void 0&&f.length===0;m&&e.logger.warn({entity:t.entity,dryRun:s},`paths-rebuild: --entity matches no routable entity (one declaring frontend.path) — nothing to rebuild (likely a typo in the entity name)`),g&&e.logger.warn({locale:t.locale,configuredLocales:d,dryRun:s},`paths-rebuild: --locale matches no configured locale — nothing to rebuild (likely a typo in the locale code)`);let y=m||g?{entity:m,locale:g}:void 0,b=p.some(e=>O(e)),S=s&&b?`Preview reflects a SINGLE pass; a pathParent() hierarchy drifted at multiple levels may need the real (non-dry-run) rebuild's multi-pass convergence to fully resolve. The real run always converges.`:void 0,C=_.makeClient(e.db.readWrite,await I(`toolkit_paths`,e)),w={scanned:0,changed:0,applied:0,failed:0},T=new Map,E={missing:0,conflicts:0,unchanged:0,skipped:0},D=(e,t)=>{let n=T.get(e);n!==t&&(n!==void 0&&n!==`resolved`&&--E[n],T.set(e,t),t!==`resolved`&&(E[t]+=1))},k=[],A=!1,j=e=>{k.length<o?k.push(e):A=!0},M=0,N=e=>({phase:e,dryRun:s,scope:{entity:t.entity??null,locale:t.locale??null},scanned:w.scanned,changed:w.changed,applied:w.applied,failed:w.failed,missing:E.missing,conflicts:E.conflicts,unchanged:E.unchanged,skipped:E.skipped,passes:M,sample:k,sampleTruncated:A,...S===void 0?{}:{hierarchyNote:S},...y===void 0?{}:{unmatchedScope:y}}),P=async(t,n,r,i)=>{let a=r.id,o=!1;try{let c=await x({entity:t,row:r,locale:i,defaultLocale:l,pathsClient:C}),d=await v({pathsClient:C,entityType:n,entityId:a,locale:i,path:c.path,...c.skipReason!==void 0&&{skipReason:c.skipReason},suppressNoteworthy:[`parent-not-indexed`],reservedPathPrefixes:u,logger:e.logger,dryRun:s}),f=`${n}:${a}:${i}`;switch(d.outcome){case`unchanged`:D(f,`unchanged`);break;case`skipped-null`:case`skipped-reserved`:D(f,`skipped`);break;case`conflict`:D(f,`conflicts`),j({kind:`conflict`,entityType:n,entityId:a,locale:i,oldPath:d.oldPath,newPath:d.newPath,...d.conflictWith?{conflictWith:d.conflictWith.entityId}:{}});break;case`created`:s?D(f,`missing`):(w.applied+=1,o=!0,D(f,`resolved`)),j({kind:`missing`,entityType:n,entityId:a,locale:i,oldPath:null,newPath:d.newPath});break;case`renamed`:w.changed+=1,s||(w.applied+=1,o=!0),D(f,`resolved`),j({kind:`changed`,entityType:n,entityId:a,locale:i,oldPath:d.oldPath,newPath:d.newPath});break}}catch(t){w.failed+=1,e.logger.warn({err:t,entityType:n,id:a,locale:i},`paths-rebuild: failed to process one document — continuing (per-item isolation)`)}return o},F=async t=>{let a=0;for(let o of t){let t=e.getClient(o),s=o.name,c=t.getTable().id;for(let e of f){let u;for(;;){let d=await t.findMany({locale:e,defaultLocale:l,limit:r,orderBy:W(c),...u===void 0?{}:{cursor:{field:`id`,value:u,direction:`asc`}}});if(d.length===0)break;await h(d,i,async t=>{await P(o,s,t,e)&&(a+=1)}),w.scanned+=d.length;let f=d[d.length-1];if(f&&(u=f.id),n.onProgress?.(N(`scanning`)),d.length<r)break}}}return a},L=async t=>{let r=[];for(let[n,i]of T){if(i!==`conflicts`&&i!==`skipped`&&i!==`missing`)continue;let a=n.indexOf(`:`),o=n.lastIndexOf(`:`);if(a<=0||o<=a)continue;let s=n.slice(0,a);if(t.has(s))continue;let c=e.entities.get(s);c!==void 0&&r.push({entity:c,entityType:s,entityId:n.slice(a+1,o),locale:n.slice(o+1)})}if(r.length===0)return 0;let a=0;return await h(r,i,async t=>{let n=await e.getClient(t.entity).findById(t.entityId,{locale:t.locale,defaultLocale:l});n!==null&&(w.scanned+=1,await P(t.entity,t.entityType,n,t.locale)&&(a+=1))}),n.onProgress?.(N(`scanning`)),a},R=p.filter(e=>O(e)),z=new Set(R.map(e=>e.name)),B=s||!b?1:ee;for(let e=0;e<B;e++){M=e+1;let t=await F(e===0?p:R);if(e>0&&(t+=await L(z)),t===0)break}A&&e.logger.warn({scanned:w.scanned,changed:w.changed,missing:E.missing,conflicts:E.conflicts,sampleCap:o},`paths-rebuild: more diff entries than the progress sample can hold — see the aggregate counts; the stored sample is truncated`);let V=N(`done`);n.onProgress?.(V);let{phase:te,...H}=V;return H}async function Ce(e,t,n={}){let r=n.maxRows??1e4,i=n.batchSize??500,a={dryRun:t.dryRun,orphans:[],found:0,deleted:0,truncated:!1,refused:!1},o=new Set([...e.entities.values()].filter(e=>!!e.frontend?.path).map(e=>e.name));if(o.size===0)return e.logger.warn({dryRun:t.dryRun},`paths-prune: no entity declares frontend.path — refusing to treat every row as an orphan`),a.refused=!0,a;let s=_.makeClient(e.db.readWrite,await I(`toolkit_paths`,e)),c=(await s.distinct(`entityType`)).filter(e=>!o.has(e));for(let e of c){let t=await s.count({entityType:e});t>0&&a.orphans.push({entityType:e,rows:t}),a.found+=t}if(t.dryRun)return a;for(let{entityType:e}of a.orphans)for(;a.deleted<r;){let t=await s.findMany({where:{entityType:e},limit:Math.min(i,r-a.deleted)});if(t.length===0)break;let n=await s.deleteMany({id:{in:t.map(e=>e.id)}});a.deleted+=n.length}return a.truncated=a.deleted<a.found&&a.deleted>=r,a.truncated&&e.logger.warn({deleted:a.deleted,found:a.found,maxRows:r},`paths-prune: row cap reached — run again to continue`),a}async function we(e){let{defineJob:t,registerJob:n,QueueClient:r}=await import(`@murumets-ee/queue/client`),i=t({name:`content:paths-cascade`,description:`Regenerate toolkit_paths canonical rows for the descendants of a renamed routable-hierarchy ancestor (one locale). Walks the full bounded subtree in a single invocation.`,schema:Y}),a=t({name:`content:paths-rebuild`,description:`Recompute every routable document's canonical toolkit_paths row (optionally scoped to one entity/locale); dryRun reports the diff without writing. On-demand (lumi paths:rebuild).`,schema:X});n(t({name:`content:paths-prune`,description:`Delete toolkit_paths rows of entity types that are no longer routable (lost frontend.path or unregistered). dryRun reports them without deleting. On-demand (lumi paths:rebuild --orphans).`,schema:Z}),async t=>{let n={dryRun:Z.parse(t.payload).dryRun,orphans:[],found:0,deleted:0,truncated:!1,refused:!1};await R(()=>z(async()=>{let r=await Ce(e,Z.parse(t.payload));for(let e of r.orphans){let t=n.orphans.find(t=>t.entityType===e.entityType);t?t.rows+=e.rows:n.orphans.push({...e})}n.found+=r.found,n.deleted+=r.deleted,n.truncated||=r.truncated,n.refused||=r.refused,t.updateProgress(n),e.logger.info(r,`paths-prune: sweep complete`)},{app:e,label:`paths-prune`}))}),n(i,async t=>{await R(async()=>{let n=await xe(e,Y.parse(t.payload),{onProgress:e=>t.updateProgress(e)});e.logger.info(n,`paths-cascade: descendant regeneration complete`)})}),n(a,async t=>{await R(()=>z(async()=>{let n=await Se(e,X.parse(t.payload),{onProgress:e=>t.updateProgress({...e,site:F()??null})});e.logger.info({dryRun:n.dryRun,scanned:n.scanned,changed:n.changed,missing:n.missing,conflicts:n.conflicts,applied:n.applied,failed:n.failed,passes:n.passes,...n.hierarchyNote===void 0?{}:{hierarchyNote:n.hierarchyNote}},`paths-rebuild: sweep complete`)},{app:e,label:`paths-rebuild`}))}),he(async(e,t,n,a)=>{await new r({app:e,logger:e.logger}).enqueue(i,{entityType:t.name,parentId:n,locale:a})})}const Q=te({name:`toolkit_path_patterns`,columns:{id:V.uuid({primaryKey:!0,defaultRandom:!0}),entityType:V.varchar({length:100,notNull:!0,pgName:`entity_type`}),locale:V.varchar({length:10,notNull:!0}),patternHash:V.varchar({length:64,notNull:!0,pgName:`pattern_hash`}),updatedAt:V.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`updated_at`})},unique:[{on:[`entityType`,`locale`]}]}),Te=Q.table;function Ee(e,t,n){let r=j(e,t,n);if(r===null)return null;let i=typeof r==`function`?r.toString():JSON.stringify(r);return ae(`sha256`).update(i).digest(`hex`)}async function De(e){let t=a(),n=t.defaultLocale,r=t.locales.map(e=>e.code),i=Q.makeClient(e.db.readWrite);for(let[t,a]of e.entities){let o=a.frontend?.path;if(o!==void 0)for(let a of r){let r=Ee(o,a,n);if(r===null)continue;let s=await i.findOne({entityType:t,locale:a});s!==null&&s.patternHash===r||(s!==null&&e.logger.warn({entity:t,locale:a,previousHash:s.patternHash,currentHash:r},`toolkit_paths: frontend.path pattern for '${t}' (locale '${a}') changed since last boot — stale toolkit_paths rows may exist; run \`lumi paths:rebuild --entity ${t}\``),await i.upsert({entityType:t,locale:a,patternHash:r},{target:[`entityType`,`locale`],set:{patternHash:r,updatedAt:new Date}}))}}}const Oe=async(e,t,n)=>{if(t.length===0)return new Map;let[{buildEnumerateDeps:r},{getCanonicalPaths:i}]=await Promise.all([import(`./resolve-context-DklN53BH.mjs`).then(e=>e.u),import(`./enumerate-CYHJKQz6.mjs`).then(e=>e.n)]),a=r(N()),o=await a.filterPublished(e,t,n);return o.size===0?new Map:i(e,[...o],n,a)},ke=async(e,t)=>{if(e.length===0)return new Set;let{buildEnumerateDeps:n}=await import(`./resolve-context-DklN53BH.mjs`).then(e=>e.u),r=n(N()),i=[...new Set(e)],a=i.slice(0,48);i.length>a.length&&N().logger.warn({paths:i.length,max:48},`content: publishedPathsAmong was asked for more paths than it reads; the rest count as unpublished`);let o=await r.pathsClient.findMany({where:{locale:t,isCanonical:!0,path:{in:a}},limit:a.length}),s=new Map;for(let e of o){let t=s.get(e.entityType);t===void 0&&(t=new Map,s.set(e.entityType,t)),t.set(e.entityId,e.path)}let c=new Set;for(let[e,n]of s){let i=await r.filterPublished(e,[...n.keys()],t);for(let[e,t]of n)i.has(e)&&c.add(t)}return c},Ae=async e=>{let[{buildBreadcrumbDeps:t},{resolveBreadcrumbTrail:n}]=await Promise.all([import(`./resolve-context-DklN53BH.mjs`).then(e=>e.u),import(`./breadcrumbs-BqSuMNac.mjs`).then(e=>e.t)]);return(await n(e,t(N())))?.steps};function $(e){return g(e,{name:`${e.name}_drafts`,columns:{id:V.uuid({primaryKey:!0,defaultRandom:!0}),entityId:V.uuid({notNull:!0,pgName:`entity_id`}),locale:V.varchar({length:10,notNull:!0,default:`_`}),data:V.jsonb({notNull:!0}),createdBy:V.varchar({length:255,notNull:!0,pgName:`created_by`}),createdByName:V.varchar({length:255,pgName:`created_by_name`}),createdAt:V.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`created_at`}),updatedAt:V.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`updated_at`})},unique:[{on:[`entityId`,`locale`]}]})}function je(e){return g(e,{name:`${e.name}_locale_status`,columns:{id:V.uuid({primaryKey:!0,defaultRandom:!0}),entityId:V.uuid({notNull:!0,pgName:`entity_id`}),locale:V.varchar({length:10,notNull:!0}),status:V.varchar({length:20,notNull:!0,default:`draft`}),publishedAt:V.timestamp({withTimezone:!0,pgName:`published_at`})},unique:[{on:[`entityId`,`locale`]}]})}function Me(e){return g(e,{name:`${e.name}_versions`,columns:{id:V.uuid({primaryKey:!0,defaultRandom:!0}),entityId:V.uuid({notNull:!0,pgName:`entity_id`}),version:V.integer({notNull:!0}),locale:V.varchar({length:10,notNull:!0,default:`_`}),data:V.jsonb({notNull:!0}),delta:V.jsonb(),status:V.varchar({length:20}),createdBy:V.varchar({length:255,pgName:`created_by`}),createdByName:V.varchar({length:255,pgName:`created_by_name`}),createdAt:V.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`created_at`}),isAutosave:V.boolean({notNull:!0,default:!1,pgName:`is_autosave`})},unique:[{on:[`entityId`,`version`,`locale`]}]})}function Ne(e){if(!e.locales||e.locales.length===0)throw Error(`content() requires at least one locale`);if(!e.defaultLocale)throw Error(`content() requires a defaultLocale`);if(!e.locales.some(t=>t.code===e.defaultLocale))throw Error(`defaultLocale "${e.defaultLocale}" not found in locales: [${e.locales.map(e=>e.code).join(`, `)}]`);if(e.reservedPathPrefixes){for(let t of e.reservedPathPrefixes)if(typeof t!=`string`||!t.startsWith(`/`))throw Error(`content(): reservedPathPrefixes entries must be absolute paths starting with '/', got ${JSON.stringify(t)}`)}let t=e.autoTrash??!0,a=t===!1?void 0:{publishable:!0,...typeof t==`object`&&t.exclude?{exclude:t.exclude}:{}};return M({name:`@murumets-ee/content`,contributes:{"blocks.documentDraftStore":ce(),"blocks.documentVersionStore":fe(),"blocks.publishedPathResolver":Oe,"entity.writeListeners":f,"blocks.publishedPathsAmong":ke,"blocks.breadcrumbTrail":Ae,"sites.baseLocale":async()=>(await import(`./locale-registry-COsJrVZl.mjs`).then(e=>e.n)).resolveInstallBaseLocale(),...a?{"trash.autoEnable":a}:{},...e.reservedPathPrefixes?{"routing.reservedPathPrefixes":e.reservedPathPrefixes}:{}},shared:{settings:[n],features:[{resource:`redirect`,actions:[`manage`],defaultRoles:[`admin`],description:`Create, edit, and delete manual URL redirects (toolkit_redirects).`},{resource:`path`,actions:[`resolve`],defaultRoles:[`admin`,`editor`],description:`Resolve a site URL path to the CMS document that serves it.`}]},server:{entities:[r,o],tables:{toolkitContentLocks:E,toolkitPaths:b,toolkitPathPatterns:Te,toolkitRedirects:S,toolkitTranslationProvenance:u},routes:[...T(),...w()],seeders:[{name:`content:site-chrome`,description:`Create the empty site_chrome row for each placement (header, footer), as a DRAFT, so they can be edited on the page canvas. Publishing one is what makes /v1/_chrome serve it instead of the delivery template's own fallback. Idempotent — an existing row for a placement is left alone.`,available:p,bootstrap:!0,run:async()=>{let{seedSiteChrome:e}=await import(`@murumets-ee/content/seed`);return await e()}},{name:`content:detail-templates`,description:`Create the DRAFT detail template for each entity drawn by one (block-library D009), so its page layout can be edited on the canvas. Until a template is published its rows keep the plain fallback page. Idempotent — an existing template is left alone.`,available:m,bootstrap:!0,run:async()=>{let{seedDetailTemplates:e}=await import(`@murumets-ee/content/seed`);return await e()}}],init:async t=>{i(e);let n=0,r=0,a=0;for(let[e,i]of t.entities){if(i.behaviors?.some(e=>e.name===`versionable`)){let t=`${e}_versions`;if(!H.has(t)){let n=Me(i);H.register(t,n.table),s(e,{versions:n})}n++}let t=i.behaviors?.some(e=>e.name===`publishable`),o=i.allFields,c=Object.values(o).some(e=>e.translatable);if(t&&c){let t=`${e}_locale_status`;if(!H.has(t)){let n=je(i);H.register(t,n.table),s(e,{localeStatus:n})}r++}if(t){let t=`${e}_drafts`;if(!H.has(t)){let n=$(i);H.register(t,n.table),s(e,{drafts:n})}a++}}se(e.locales.map(e=>e.code)),be();try{await we(t)}catch(e){t.logger.warn({err:e},"content: failed to register routing path jobs — descendant cascade + `lumi paths:rebuild` will be unavailable (path writes still succeed)")}t.logger.info({locales:e.locales.map(e=>e.code),defaultLocale:e.defaultLocale,versionableEntities:n,localeStatusEntities:r,draftEntities:a},`Content plugin initialized`)},onReady:async e=>{try{await De(e)}catch(t){e.logger.error({err:t},"content: boot-time frontend-path pattern-drift check failed — continuing app boot without it. Inspect the logged `err` for the cause: a transient DB error can be retried (and `lumi paths:rebuild` re-derives the index if a pattern actually changed), whereas a structural cause — e.g. a missing migration leaving `toolkit_path_patterns` absent — will recur on every boot and needs `lumi migrate`")}}}})}export{q as n,Ne as t};
|
|
2
|
-
//# sourceMappingURL=plugin-CjgqBSFy.mjs.map
|
package/dist/plugin.d.mts
CHANGED
|
@@ -38,4 +38,3 @@ declare function content(config: ContentConfig): Pick<import("@murumets-ee/core"
|
|
|
38
38
|
};
|
|
39
39
|
//#endregion
|
|
40
40
|
export { type I18nConfig, Locale, type LocaleDirection, type LocaleEntry, Message, ROUTING_STRATEGIES, type RoutingStrategy, content, getContentConfig, i18nSettings, localePrefixForStrategy, prefixDefaultLocaleForStrategy };
|
|
41
|
-
//# sourceMappingURL=plugin.d.mts.map
|
package/dist/query-client.d.mts
CHANGED
|
@@ -128,4 +128,3 @@ declare class ContentQueryClient {
|
|
|
128
128
|
declare function createContentQueryClient(entity: Entity): ContentQueryClient;
|
|
129
129
|
//#endregion
|
|
130
130
|
export { ContentQueryClient, ContentQueryClientConfig, createContentQueryClient };
|
|
131
|
-
//# sourceMappingURL=query-client.d.mts.map
|
package/dist/query-client.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./locale-utils-B0mFoV47.mjs";import{schemaRegistry as t}from"@murumets-ee/db";import{eq as n}from"drizzle-orm";import"server-only";import{createQueryClient as r}from"@murumets-ee/core/clients";var i=class{entity;query;constructor(e){this.entity=e.entity,this.query=e.query}async findById(e,t){return this.query.findById(e,t)}async findBySlug(r,i){i?.locale!==void 0&&e(i.locale);let a=t.get(this.entity.name);return!a||!a.slug?null:(await this.query.findMany({where:n(a.slug,r),limit:1,locale:i?.locale}))[0]??null}async findMany(e){return this.query.findMany(e)}async count(e){return this.query.count(e)}};function a(e){return new i({query:r(e),entity:e})}export{i as ContentQueryClient,a as createContentQueryClient};
|
|
2
|
-
//# sourceMappingURL=query-client.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
const e=Symbol.for(`@murumets-ee/content:content-tables-registry`);function t(){let t=globalThis,n=t[e];return n||(n=new Map,t[e]=n),n}function n(e,n){let r=t(),i=r.get(e)??{};r.set(e,{...i,...n})}function r(e){return t().get(e)??{}}export{n,r as t};
|
|
2
|
-
//# sourceMappingURL=registry-CaPbY5lm.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./rolldown-runtime-DK3Fl9T5.mjs";import{t}from"./content-config-store-8omQF5p5.mjs";import{n}from"./schema-BYrYzsmO.mjs";import{i as r,n as i}from"./schema-LlK6EkOJ.mjs";import{getEntityTitleField as a,isSiteBound as o,isValidSiteHandle as s}from"@murumets-ee/entity";import{createSystemReachResolver as c,getContext as l,readSiteRecord as u,requireRequestSite as d}from"@murumets-ee/core";import{QueryClient as f}from"@murumets-ee/entity/query";import{inArray as p}from"drizzle-orm";import{z as m}from"zod";const h=m.object({entity:m.string().min(1),id:m.string().uuid()});function g(e){let t=h.safeParse(e);return t.success?t.data:null}function _(e){return()=>d(`toolkit_paths`,e)}function v(e){if(!s(e))throw Error(`'${String(e)}' is not a valid site handle`);let t=l()?.site;if(t!==void 0&&t!==e)throw Error(`A request acting on site '${t}' cannot read site '${e}' — a request is confined to its site; start per-site work from a site-less frame.`);return e}function y(e){return v(e),async()=>v(e)}function b(e,t){return t===void 0?_(e):y(t)}function x(e,t){return()=>(v(t),Object.freeze({...e(),site:t}))}function S(e,t){return{findOne:async r=>n.makeClient(e,await t()).findOne(r),findMany:async r=>n.makeClient(e,await t()).findMany(r)}}function C(e,t){return{findOne:async n=>i.makeClient(e,await t()).findOne(n),findMany:async n=>i.makeClient(e,await t()).findMany(n)}}var w=e({buildBreadcrumbDeps:()=>I,buildCanonicalPathDeps:()=>D,buildCanonicalPathsBatchDeps:()=>j,buildEnumerateDeps:()=>A,buildPublishChecker:()=>O,buildRedirectsListDeps:()=>P,buildResolveDeps:()=>F,buildSitemapDeps:()=>N,createHomepageReader:()=>k});const T=c(`path-resolver`);function E(e){return e===void 0?T:x(T,e)}function D(e,t={}){return{pathsClient:S(e.db.readOnly,b(e,t.site))}}function O(e,t={}){let n=E(t.site);return r({entityResolver:t=>e.entities.get(t),queryClientFactory:t=>new f({entity:t,db:e.db.readOnly,logger:e.logger.child({resolve:`publish-check`,entity:t.name}),contextResolver:n})})}function k(e,t){return async()=>{let n=await u(e,await t()),r=n?g(n.homeDocument):null;if(!r)return null;let i=e.entities.get(r.entity);return!i?.frontend?.path||e.config.sites?.multiple===!0&&!o(i)?null:r}}function A(e,t={}){let n=e.db.readOnly,r=E(t.site);return{pathsClient:S(n,b(e,t.site)),filterPublished:async(t,i,a)=>{if(i.length===0)return new Set;let o=e.entities.get(t);if(o===void 0)return new Set;let s=new f({entity:o,db:n,logger:e.logger.child({resolve:`enumerate-publish`,entity:o.name}),contextResolver:r}),c=s.getTable().id,l=await s.findMany({where:p(c,[...i]),locale:a}),u=new Set;for(let e of l){let t=e.id;typeof t==`string`&&u.add(t)}return u}}}function j(e,t={}){return{pathsClient:S(e.db.readOnly,b(e,t.site))}}function M(e,t={}){let n=e.db.readOnly,r=E(t.site);return async(t,i,a)=>{if(i.length===0)return new Set;let o=e.entities.get(t);if(o===void 0||!o.behaviors?.some(e=>e.name===`seoMeta`))return new Set;let s=new f({entity:o,db:n,logger:e.logger.child({resolve:`sitemap-noindex`,entity:o.name}),contextResolver:r}),c=s.getTable().id,l=await s.findMany({where:p(c,[...i]),locale:a}),u=new Set;for(let e of l){let t=e.id,n=e.noIndex;typeof t==`string`&&n===!0&&u.add(t)}return u}}function N(e,t={}){return{enumerate:A(e,t),canonicalBatch:j(e,t),filterNoIndex:M(e,t)}}function P(e,t={}){let n=A(e,t);return{redirectsClient:C(e.db.readOnly,b(e,t.site)),pathsClient:n.pathsClient,canonicalBatch:j(e,t),filterPublished:n.filterPublished}}function F(e,n={}){let r=e.db.readOnly,i=b(e,n.site);return{pathsClient:S(r,i),redirectsClient:C(r,i),publishChecker:O(e,n),homepageReader:k(e,i),isRoutable:t=>!!e.entities.get(t)?.frontend?.path,locales:t().locales.map(e=>e.code),logger:e.logger}}function I(e,t={}){let n=e.db.readOnly,r=E(t.site);return{pathsClient:S(n,b(e,t.site)),publishedTitles:async(t,i,o)=>{let s=new Map;if(i.length===0)return s;let c=e.entities.get(t);if(c===void 0)return s;let l=a(c);if(l===`id`)return s;let u=new f({entity:c,db:n,logger:e.logger.child({resolve:`breadcrumb-titles`,entity:c.name}),contextResolver:r}),d=u.getTable().id,m=await u.findMany({where:p(d,[...i]),locale:o,limit:i.length});for(let e of m){let t=e,n=t.id,r=t[l];typeof n==`string`&&typeof r==`string`&&r.trim()!==``&&s.set(n,r.trim())}return s}}}export{O as a,N as c,h as d,g as f,A as i,k as l,D as n,P as o,j as r,F as s,I as t,w as u};
|
|
2
|
-
//# sourceMappingURL=resolve-context-DklN53BH.mjs.map
|
package/dist/resolve.d.mts
CHANGED
|
@@ -648,4 +648,3 @@ declare function buildRedirectsListDeps(app: ToolkitApp, options?: SiteScopeOpti
|
|
|
648
648
|
declare function buildResolveDeps(app: ToolkitApp, options?: SiteScopeOptions): ResolvePathDeps & AlternatesDeps;
|
|
649
649
|
//#endregion
|
|
650
650
|
export { type AlternatesDeps, type CanonicalPathDeps, type CanonicalPathsBatchDeps, DEFAULT_MAX_URLS_PER_FILE, type EntityResolver, type EnumeratePathsDeps, type EnumeratePathsOptions, type EnumeratePathsTuning, type HomepagePointer, type HomepageReader, MAX_REDIRECT_HOPS, type PathEntry, type PathEnumReader, type PathEnumRow, type PathEnumWhere, type PathIndexReader, type PathIndexRow, type PathIndexWhere, type PublishChecker, type PublishFilter, type PublishQueryClient, type QueryClientFactory, type RedirectEntry, type RedirectListReader, type RedirectListRow, type RedirectListWhere, type RedirectLookupReader, type RedirectsListDeps, type RedirectsListOptions, type RedirectsListTuning, type ResolveDocumentResult, type ResolveNoneResult, type ResolvePathDeps, type ResolveRedirectResult, type ResolveResult, SITEMAP_INDEX_FILENAME, type SiteScopeOptions, type SiteSitemapOptions, type SitemapDeps, type SitemapFile, type SitemapOptions, type SitemapTuning, buildCanonicalPathDeps, buildCanonicalPathsBatchDeps, buildEnumerateDeps, buildPublishChecker, buildRedirectsListDeps, buildResolveDeps, buildSitemapDeps, createHomepageReader, createPublishChecker, enumeratePaths, generateSiteSitemap, generateSitemap, getAlternates, getCanonicalPath, getCanonicalPaths, getRedirects, homepagePointerSchema, parseHomepagePointer, resolveDraftPath, resolvePath };
|
|
651
|
-
//# sourceMappingURL=resolve.d.mts.map
|
package/dist/resolve.mjs
CHANGED
|
@@ -6,4 +6,3 @@ import{a as e,t}from"./locale-registry-COsJrVZl.mjs";import{c as n}from"./schema
|
|
|
6
6
|
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${e.map(e=>` <sitemap>
|
|
7
7
|
<loc>${P(`${t}/${e.filename}`)}</loc>\n <lastmod>${e.lastmod}</lastmod>\n </sitemap>`).join(`
|
|
8
8
|
`)}\n</sitemapindex>\n`}function j(e,t){return`<xhtml:link rel="alternate" hreflang="${P(e)}" href="${P(t)}"/>`}function M(e,t,n,r){return`${e}${t?t(n):``}${r}`}function N(e){return e.replace(/\/+$/,``)}function P(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function F(e,t){return t===0?`sitemap-${e}.xml`:`sitemap-${e}-${t+1}.xml`}function I(e,t){if(e===void 0||!Number.isFinite(e))return t;let n=Math.floor(e);return n>=1?n:t}async function*L(e,t){let n=[];for await(let r of e)n.push(r),n.length>=t&&(yield n,n=[]);n.length>0&&(yield n)}async function*R(n,r,i={},a={}){let o=await S(n,r);if(!o)throw Error(`There is no site '${r}'`);let s=o.origins[0];if(s===void 0)throw Error(`Site '${r}' declares no public origin — its sitemap has no URLs to give`);let{entries:c,i18n:l}=await e(n,{site:r});yield*T({locales:t(c),defaultLocale:l.defaultLocale,baseUrl:s,...i.prefix!==void 0&&{prefix:i.prefix},...i.maxUrlsPerFile!==void 0&&{maxUrlsPerFile:i.maxUrlsPerFile}},d(n,{site:r}),a)}async function*z(e,t,n={}){let{locale:r}=e,i=n.pageSize??200,a=new Set;yield*B(r,r,t,i,a),yield*B(r,null,t,i,a),yield*U(r,t,i,a)}async function*B(e,t,n,r,i){let o;for(;;){let s={locale:t};o!==void 0&&(s.id={gt:o});let c=await n.redirectsClient.findMany({where:s,orderBy:[{column:`id`,dir:`asc`}],limit:r});if(c.length===0)break;let l=[];for(let e of c)i.has(e.fromPath)||(i.add(e.fromPath),l.push(e));let u=await V(l,e,n);for(let t of l){let r=W(t.status),i=t.target;if(i.kind===`url`){yield{from:t.fromPath,to:i.url,status:r};continue}if(i.kind===`entity`){let e=u.get(t.id);e!==void 0&&e!==t.fromPath&&(yield{from:t.fromPath,to:e,status:r});continue}let o=a(i.path);o!==t.fromPath&&await H(n.pathsClient,e,o)&&(yield{from:t.fromPath,to:o,status:r})}let d=c[c.length-1];if(!d||(o=d.id,c.length<r))break}}async function V(e,t,n){let r=new Map,i=new Map;for(let t of e){if(t.target.kind!==`entity`)continue;let e={rowId:t.id,targetId:t.target.id},n=i.get(t.target.entity);n?n.push(e):i.set(t.target.entity,[e])}for(let[e,a]of i){let i=await b(e,a.map(e=>e.targetId),t,n.canonicalBatch),o=[...i.keys()];if(o.length===0)continue;let s=await n.filterPublished(e,o,t);for(let{rowId:e,targetId:t}of a){let n=i.get(t);n!==void 0&&s.has(t)&&r.set(e,n)}}return r}async function H(e,t,n){return(await e.findMany({where:{locale:t,path:n,isCanonical:!0},limit:1})).length>0}async function*U(e,t,n,r){let i=new Set,a;for(;;){let o={locale:e,isCanonical:!1};a!==void 0&&(o.id={gt:a});let s=await t.pathsClient.findMany({where:o,orderBy:[{column:`id`,dir:`asc`}],limit:n});if(s.length===0)break;let c=new Map;for(let e of s){let t=c.get(e.entityType);t?t.push(e):c.set(e.entityType,[e])}let l=new Map;for(let[n,r]of c){let i=await b(n,r.map(e=>e.entityId),e,t.canonicalBatch),a=[...i.keys()];if(a.length===0)continue;let o=await t.filterPublished(n,a,e);for(let[e,t]of i)o.has(e)&&l.set(e,t)}for(let e of s){if(r.has(e.path)||i.has(e.path))continue;let t=l.get(e.entityId);t!==void 0&&t!==e.path&&(i.add(e.path),yield{from:e.path,to:t,status:301})}let u=s[s.length-1];if(!u||(a=u.id,s.length<n))break}}function W(e){return e===302?302:301}export{C as DEFAULT_MAX_URLS_PER_FILE,c as MAX_REDIRECT_HOPS,w as SITEMAP_INDEX_FILENAME,g as buildCanonicalPathDeps,v as buildCanonicalPathsBatchDeps,m as buildEnumerateDeps,u as buildPublishChecker,_ as buildRedirectsListDeps,y as buildResolveDeps,d as buildSitemapDeps,h as createHomepageReader,o as createPublishChecker,x as enumeratePaths,R as generateSiteSitemap,T as generateSitemap,r as getAlternates,s as getCanonicalPath,b as getCanonicalPaths,z as getRedirects,f as homepagePointerSchema,p as parseHomepagePointer,l as resolveDraftPath,i as resolvePath};
|
|
9
|
-
//# sourceMappingURL=resolve.mjs.map
|
package/dist/routes-siXmjKDA.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./content-config-store-8omQF5p5.mjs";import{t}from"./registry-CaPbY5lm.mjs";import{n,s as r}from"./schema-BYrYzsmO.mjs";import{d as i,n as a,s as o}from"./schema-LlK6EkOJ.mjs";import{getBlockTreeFieldName as s,getEntityTitleField as c,isPublishable as l,matchReservedPrefix as u}from"@murumets-ee/entity";import{combineAdminRoutes as d,defineAdminRoute as f,getContext as ee,requireRequestSite as te,requireSiteFor as ne,safeAudit as p}from"@murumets-ee/core";import{and as m,eq as h}from"drizzle-orm";import{z as g}from"zod";import{entityRefs as _}from"@murumets-ee/entity/refs";const v=`path:resolve`,re=[`admin`,`editor`];function y(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":`application/json`}})}const b={kind:`none`};function x(e){return e===null||e.length===0?{error:`query param 'path' is required`}:e.length>2048?{error:`query param 'path' is too long`}:e.startsWith(`/`)?e.startsWith(`//`)?{error:`query param 'path' must not be protocol-relative`}:e.includes(`?`)||e.includes(`#`)?{error:`query param 'path' must not include a query or fragment`}:{path:e}:{error:`query param 'path' must start with '/'`}}function S(t,n){let r=e(),i=t??n??r.defaultLocale;return(ee()?.availableLocales??r.locales.map(e=>e.code)).includes(i)?{locale:i}:{error:`query param 'locale' is not a content locale`}}const ie=async(e,t)=>{let n=new URL(e.url).searchParams,r=x(n.get(`path`));if(`error`in r)return y({error:r.error},400);let i=S(n.get(`locale`),t.locale??t.defaultLocale);if(`error`in i)return y({error:i.error},400);let{locale:a}=i,{buildResolveDeps:s}=await import(`./resolve-context-DklN53BH.mjs`).then(e=>e.u),c=s(t.app),l=async(e,n)=>{if(!t.checkPermission(e,`view`))return b;let r=await ae(t.app,e,n,a);return r===void 0?{kind:`document`,entityType:e,id:n}:{kind:`document`,entityType:e,id:n,form:r}},u=await o(r.path,a,c);if(u.kind===`document`)return y(await l(u.entityType,u.id));if(u.kind===`none`)return y(b);if(!(u.to.startsWith(`/`)&&!u.to.startsWith(`//`)))return y({kind:`redirect`,to:u.to});let d=await o(u.to,a,c);return y(d.kind===`document`?await l(d.entityType,d.id):b)};async function ae(n,r,i,a){let o=n.entities?.get(r);if(!(o===void 0||s(o)!==void 0))try{let r=n.getClient(o),s=await r.findById(i,{locale:a});if(s===null)return{title:null,published:null};let u=s[c(o)],d=typeof u==`string`&&u.trim().length>0?u:null;if(!l(o))return{title:d,published:!0};let f=s.status===`published`;if(a!==e().defaultLocale){let{localeStatus:e}=t(o.name);if(e!==void 0){let t=(await e.makeClient(r.getDb(),await ne(o)).findMany({where:{entityId:i,locale:a},limit:1}))[0];t!==void 0&&(f=t.status===`published`)}}return{title:d,published:f}}catch(e){return n.logger?.debug({err:e,entityType:r,id:i},`paths/resolve: could not read a form document`),{title:null,published:null}}}function oe(){return d([f({prefix:`paths`,path:`resolve`,method:`GET`,permission:v,defaultRoles:re,description:`Resolve a site URL path to the CMS document that serves it (editor canvas link navigation).`,tokens:`accept`,handler:ie})])}var C=class extends Error{fromPath;prefix;constructor(e,t){super(`Redirect source "${e}" falls under the reserved prefix "${t}" and cannot be used — that path range is owned by the framework.`),this.name=`RedirectReservedPrefixError`,this.fromPath=e,this.prefix=t}},w=class extends Error{fromPath;locale;conflictingLocale;constructor(e,t,n){super(`Redirect source "${e}" already serves content in locale "${n}" (it is a live canonical URL). Choose a different source path, or unpublish/rename the content first.`),this.name=`RedirectServesContentError`,this.fromPath=e,this.locale=t,this.conflictingLocale=n}},T=class extends Error{entity;constructor(e){super(`Redirect target references entity type "${e}", which is not a registered entity. Check the entity name.`),this.name=`RedirectUnknownEntityError`,this.entity=e}},E=class extends Error{entity;id;constructor(e,t){super(`Redirect target ${e} "${t}" does not exist. Redirect to a document that exists, or use a URL/path target instead.`),this.name=`RedirectTargetNotFoundError`,this.entity=e,this.id=t}},D=class extends Error{fromPath;locale;constructor(e,t){super(`Redirect source "${e}"${t===null?``:` (locale "${t}")`} resolves back to itself — a redirect cannot point at its own source path. Choose a different destination.`),this.name=`RedirectSelfReferenceError`,this.fromPath=e,this.locale=t}};const O=`toolkit_redirects`;async function k(e,t,n){n.kind===`entity`&&await e.insert(_).values({sourceEntity:O,sourceId:t,sourceField:`target`,targetEntity:n.entity,targetId:n.id,relationKind:`link`}).onConflictDoNothing()}async function A(e,t){await e.delete(_).where(m(h(_.sourceEntity,O),h(_.sourceId,t)))}const j=g.discriminatedUnion(`kind`,[g.object({kind:g.literal(`entity`),entity:g.string().min(1),id:g.string().uuid()}),g.object({kind:g.literal(`url`),url:g.string().max(2048).url()}),g.object({kind:g.literal(`path`),path:g.string().min(1).max(2048).startsWith(`/`)})]);function M(e){return i(e)}function N(e){let t=M(e.fromPath),n=u(t,e.reservedPathPrefixes);if(n!==void 0)throw new C(t,n)}async function P(e){let t=M(e.fromPath);if(e.locale!==null){let n=await e.pathsClient.findOne({path:t,isCanonical:!0,locale:e.locale});if(n)throw new w(t,e.locale,n.locale);return}let n=await e.pathsClient.findOne({path:t,isCanonical:!0,locale:{in:[...e.configuredLocales]}});if(n)throw new w(t,null,n.locale)}async function se(e){if(e.target.kind!==`path`)return e.target;let t=M(e.target.path),n=e.excludeId===void 0?{}:{id:{ne:e.excludeId}};if(e.locale!==null){let r=await e.redirectsClient.findOne({fromPath:t,locale:e.locale,...n});if(r)return r.target}let r=await e.redirectsClient.findOne({fromPath:t,locale:null,...n});return r?r.target:{kind:`path`,path:t}}async function ce(e){if(e.target.kind!==`entity`)return;let{entity:t,id:n}=e.target,r=e.resolveClient(t);if(r===void 0)throw new T(t);if(await r.findById(n)==null)throw new E(t,n)}function F(){return te(`toolkit_redirects`)}const I=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,le=/^[a-zA-Z0-9:_.-]{1,100}$/,L=`redirect:manage`,R=[`admin`];function z(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":`application/json`}})}function B(e,t){return z({error:e},t)}async function V(e,t){let n;try{n=await e.json()}catch{return{response:B(`Invalid JSON body`,400)}}let r=t.safeParse(n);if(!r.success){let e=r.error.issues[0];return{response:B(e?`${e.path.join(`.`)||`body`}: ${e.message}`:`Invalid body`,400)}}return{data:r.data}}function H(e,t){if(e===null||!/^\d+$/.test(e))return t;let n=Number(e);return Number.isSafeInteger(n)?n:t}function U(e){return e.name===void 0?{userId:e.id}:{userId:e.id,userName:e.name}}async function W(){let{getApp:e}=await import(`@murumets-ee/core`);return e()}async function G(){return(await W()).db.readWrite}async function K(){let e=await W();return t=>{let n=e.entities.get(t);return n?e.getClient(n):void 0}}function q(e){return e}const J=g.union([g.literal(301),g.literal(302)]),Y=g.string().min(1).max(2048).startsWith(`/`),ue=g.object({locale:g.string().min(1).nullable(),fromPath:Y,target:j,status:J.default(301)}),de=g.object({locale:g.string().min(1).nullable().optional(),fromPath:Y.optional(),target:j.optional(),status:J.optional()});function X(t){return t===null||e().locales.map(e=>e.code).includes(t)?null:B(`Unknown locale "${t}" — not one of the configured content locales.`,400)}function Z(e){if(e instanceof C)return z({error:e.message,fromPath:e.fromPath,prefix:e.prefix},409);if(e instanceof w)return z({error:e.message,fromPath:e.fromPath,locale:e.locale,conflictingLocale:e.conflictingLocale},409);if(e instanceof D)return z({error:e.message,fromPath:e.fromPath,locale:e.locale},409);if(e instanceof T)return z({error:e.message,entity:e.entity},400);if(e instanceof E)return z({error:e.message,entity:e.entity,id:e.id},400);if(r(e))return z({error:`A redirect already exists for this locale + source path.`},409);throw e}async function Q(t){let r=e(),i=r.reservedPathPrefixes??[],o=r.locales.map(e=>e.code),s=M(t.fromPath);N({fromPath:s,reservedPathPrefixes:i}),await ce({target:t.target,resolveClient:t.resolveClient});let c=await G(),l=await F();return c.transaction(async e=>{let r=q(e),i=a.makeClient(r,l),c=n.makeClient(r,l);await P({fromPath:s,locale:t.locale,configuredLocales:o,pathsClient:c});let u=await se({target:t.target,locale:t.locale,redirectsClient:i,...t.id===null?{}:{excludeId:t.id}});if(u.kind===`path`&&M(u.path)===s)throw new D(s,t.locale);if(t.id===null){let e=await i.insert({locale:t.locale,fromPath:s,target:u,status:t.status,createdBy:t.userId});return await k(r,e.id,u),e}let d=await i.update({id:t.id},{locale:t.locale,fromPath:s,target:u,status:t.status,updatedAt:new Date});return d?(await A(r,t.id),await k(r,t.id,u),d):null})}const $=async e=>{let t=new URL(e.url),n=t.searchParams.get(`locale`),r=Math.min(Math.max(H(t.searchParams.get(`limit`),50),1),200),i=Math.min(H(t.searchParams.get(`offset`),0),1e5),o;if(n!==null&&n!==``){let e=X(n);if(e)return e;o=n}let s=a.makeClient(await G(),await F());return z({items:o===void 0?await s.findMany({orderBy:[{column:`createdAt`,dir:`desc`}],limit:r,offset:i}):await s.findMany({where:{locale:o},orderBy:[{column:`createdAt`,dir:`desc`}],limit:r,offset:i}),total:o===void 0?await s.count():await s.count({locale:o})})},fe=async(e,t)=>{let n=await V(e,ue);if(`response`in n)return n.response;let r=n.data,i=X(r.locale);if(i)return i;try{let e=await K(),n=await Q({id:null,locale:r.locale,fromPath:r.fromPath,target:r.target,status:r.status,userId:t.user.id,resolveClient:e});return n?(p(t,{action:`redirect.created`,entityType:`redirect`,entityId:n.id,...U(t.user),metadata:{locale:n.locale,fromPath:n.fromPath,targetKind:n.target.kind}}),z({item:n},201)):B(`Failed to create redirect`,500)}catch(e){return Z(e)}},pe=async(e,t)=>{let n=t.segments[0];if(!n||!I.test(n))return B(`Invalid id`,400);let r=await V(e,de);if(`response`in r)return r.response;let i=r.data,o=await a.makeClient(await G(),await F()).findOne({id:n});if(!o)return B(`Not found`,404);let s=i.locale===void 0?o.locale:i.locale,c=i.fromPath===void 0?o.fromPath:i.fromPath,l=i.target===void 0?o.target:i.target,u=i.status===void 0?o.status:i.status,d=X(s);if(d)return d;try{let e=await K(),r=await Q({id:n,locale:s,fromPath:c,target:l,status:u,userId:t.user.id,resolveClient:e});return r?(p(t,{action:`redirect.updated`,entityType:`redirect`,entityId:r.id,...U(t.user),metadata:{locale:r.locale,fromPath:r.fromPath,targetKind:r.target.kind}}),z({item:r})):B(`Not found`,404)}catch(e){return Z(e)}},me=async(e,t)=>{let n=t.segments[0];if(!n||!I.test(n))return B(`Invalid id`,400);let r=await G(),i=await F(),o=await r.transaction(async e=>{let t=q(e),r=await a.makeClient(t,i).delete({id:n});return r&&await A(t,n),r});return o?(p(t,{action:`redirect.deleted`,entityType:`redirect`,entityId:n,...U(t.user),metadata:{locale:o.locale,fromPath:o.fromPath}}),z({ok:!0})):B(`Not found`,404)},he=async e=>{let t=new URL(e.url),r=t.searchParams.get(`entityType`),i=t.searchParams.get(`entityId`);if(!r||!le.test(r))return B(`entityType is required`,400);if(!i||!I.test(i))return B(`entityId is required and must be a UUID`,400);let a=t.searchParams.get(`locale`),o;if(a!==null&&a!==``){let e=X(a);if(e)return e;o=a}return z({items:await n.makeClient(await G(),await F()).findMany({where:{entityType:r,entityId:i,isCanonical:!1,...o!==void 0&&{locale:o}},orderBy:[{column:`updatedAt`,dir:`desc`}],limit:100})})};function ge(){return d([f({prefix:`redirects`,path:``,method:`GET`,permission:L,defaultRoles:R,description:`List manual URL redirects (paginated, optional locale filter).`,tokens:`accept`,handler:$}),f({prefix:`redirects`,path:`history`,method:`GET`,permission:L,defaultRoles:R,description:`Read-only automatic-redirect (rename) history for one document.`,tokens:`accept`,handler:he}),f({prefix:`redirects`,path:``,method:`POST`,permission:L,defaultRoles:R,description:`Create a manual URL redirect.`,tokens:`accept`,handler:fe}),f({prefix:`redirects`,path:``,method:`PATCH`,matchAnyPath:!0,permission:L,defaultRoles:R,description:`Update a manual URL redirect by id.`,tokens:`accept`,handler:pe}),f({prefix:`redirects`,path:``,method:`DELETE`,matchAnyPath:!0,permission:L,defaultRoles:R,description:`Delete a manual URL redirect by id.`,tokens:`accept`,confirm:!0,handler:me})])}export{v as n,oe as r,ge as t};
|
|
2
|
-
//# sourceMappingURL=routes-siXmjKDA.mjs.map
|
|
@@ -152,4 +152,3 @@ declare function localePrefixForStrategy(strategy: RoutingStrategy): 'always' |
|
|
|
152
152
|
declare function prefixDefaultLocaleForStrategy(strategy: RoutingStrategy): boolean;
|
|
153
153
|
//#endregion
|
|
154
154
|
export { ROUTING_STRATEGIES as a, Locale as i, prefixDefaultLocaleForStrategy as n, i18nSettings as o, Message as r, localePrefixForStrategy as t };
|
|
155
|
-
//# sourceMappingURL=routing-strategy-CAG3tZP0.d.mts.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{behavior as e,defineEntity as t,field as n}from"@murumets-ee/entity";function r(){return{name:`messageKeyUnique`,fields:{},constraints:(e,t)=>{if(t!==`main`)return[];let{namespace:n,key:r,locale:i}=e;return!n||!r||!i?[]:[{kind:`uniqueConstraint`,name:`message_namespace_key_locale_unique`,on:[n,r,i]}]}}}const i=t({name:`message`,class:`config`,scope:`global`,site:`shared`,access:{view:`message:view`,create:`message:create`,update:`message:update`,delete:`message:delete`},fields:{namespace:n.text({required:!0,maxLength:64}),key:n.text({required:!0,maxLength:255}),locale:n.text({required:!0,maxLength:10,indexed:!0}),value:n.text({required:!0})},behaviors:[e.auditable(),r()],admin:{hidden:!0,label:`Translations`,labelSingular:`Message`}});function a(e){switch(e){case`prefix-all`:return`always`;case`no-prefix-default`:return`as-needed`;case`cookie`:return`never`}}function o(e){return e===`prefix-all`}export{o as n,i as r,a as t};
|
|
2
|
-
//# sourceMappingURL=routing-strategy-D6B4ngT9.mjs.map
|
package/dist/schema-BYrYzsmO.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{isSiteBound as e,matchReservedPrefix as t}from"@murumets-ee/entity";import{column as n,defineTable as r}from"@murumets-ee/db";import{sql as i}from"drizzle-orm";function a(e){let t=e;for(let e=0;t&&e<5;e++){if(t.code===`23505`)return!0;t=t.cause}return!1}const o=new Set([`not-routable`,`parent-not-indexed`,`row-unreadable`]);async function s(e){let{pathsClient:n,entityType:r,entityId:i,locale:s,path:l,reservedPathPrefixes:u,logger:d}=e;if(l===null){let t=e.skipReason??null,n=t!==null&&(e.suppressNoteworthy?.includes(t)??!1);return t!==null&&!n&&o.has(t)&&d.warn({entity:r,id:i,locale:s,skipReason:t},`toolkit_paths: no canonical path computed for this (document, locale) — ${t}. The document has no toolkit_paths row and will 404 on the public site until this is resolved (fix the input and re-save, or run \`lumi paths:rebuild\`).`),{outcome:`skipped-null`,oldPath:null,newPath:null,conflictWith:null,skipReason:t}}let f=t(l,u);if(f!==void 0)return d.warn({entity:r,id:i,locale:s,path:l,reserved:f},`toolkit_paths: computed path falls under a reserved prefix — skipping this locale (kept out of the routable index, see F013)`),{outcome:`skipped-reserved`,oldPath:null,newPath:l,conflictWith:null,skipReason:null};let p=await n.findOne({entityType:r,entityId:i,locale:s,isCanonical:!0}),m=p?.path??null;if(p!==null&&p.path===l)return{outcome:`unchanged`,oldPath:m,newPath:l,conflictWith:null,skipReason:null};if(e.dryRun){let e=await n.findOne({locale:s,path:l,isCanonical:!0});return e!==null&&!(e.entityType===r&&e.entityId===i)?{outcome:`conflict`,oldPath:m,newPath:l,conflictWith:{entityType:e.entityType,entityId:e.entityId},skipReason:null}:{outcome:p===null?`created`:`renamed`,oldPath:m,newPath:l,conflictWith:null,skipReason:null}}p!==null&&await n.update({id:p.id},{isCanonical:!1,updatedAt:new Date});let h=!1;try{await n.insert({entityType:r,entityId:i,locale:s,path:l,isCanonical:!0}),h=!0}catch(e){if(!a(e))throw e}if(!h){if(p!==null)try{await n.update({id:p.id},{isCanonical:!0,updatedAt:new Date})}catch(e){if(!a(e))throw e;d.warn({entity:r,id:i,locale:s,path:l},`toolkit_paths: could not re-promote the old canonical after a failed insert — a canonical row already exists for this document+locale (concurrent write); leaving history as-is`)}let e=await n.findOne({locale:s,path:l,isCanonical:!0}),t=e!==null&&!(e.entityType===r&&e.entityId===i)?{entityType:e.entityType,entityId:e.entityId}:null;return d.warn({entity:r,id:i,locale:s,path:l},`toolkit_paths: canonical (locale, path) already claimed by another document — skipping (old canonical restored / left in place)`),{outcome:`conflict`,oldPath:m,newPath:l,conflictWith:t,skipReason:null}}return p===null?{outcome:`created`,oldPath:null,newPath:l,conflictWith:null,skipReason:null}:(await c(n,r,i,s),{outcome:`renamed`,oldPath:m,newPath:l,conflictWith:null,skipReason:null})}async function c(e,t,n,r){let i=await e.count({entityType:t,entityId:n,locale:r,isCanonical:!1})-25;if(i<=0)return;let a=(await e.findMany({where:{entityType:t,entityId:n,locale:r,isCanonical:!1},orderBy:[{column:`updatedAt`,dir:`asc`},{column:`createdAt`,dir:`asc`}],limit:Math.min(i,1e3)})).map(e=>e.id);a.length>0&&await e.deleteMany({id:{in:a}})}async function l(e,t,n){let r=e.length;if(r===0)return;let i=0,a=Math.max(1,Math.min(Number.isFinite(t)?Math.floor(t):1,r));async function o(){for(;;){let t=i;if(i+=1,t>=r)return;await n(e[t],t)}}await Promise.all(Array.from({length:a},()=>o()))}const u=`_site`;function d(e){return r({name:e.name,columns:{...e.columns,[u]:n.varchar({length:64,notNull:!0})},unique:(e.unique??[]).map(e=>({...e,on:[u,...e.on.map(String)]})),...e.indexes!==void 0&&{indexes:e.indexes.map(e=>({...e,on:e.on.map(String)}))},partitionColumn:u})}function f(t,n){return e(t)?d(n):r(n)}const p=d({name:`toolkit_paths`,columns:{id:n.uuid({primaryKey:!0,defaultRandom:!0}),entityType:n.varchar({length:100,notNull:!0,pgName:`entity_type`}),entityId:n.uuid({notNull:!0,pgName:`entity_id`}),locale:n.varchar({length:10,notNull:!0}),path:n.text({notNull:!0}),isCanonical:n.boolean({notNull:!0,default:!0,pgName:`is_canonical`}),createdAt:n.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`created_at`}),updatedAt:n.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`updated_at`})},unique:[{on:[`locale`,`path`],where:e=>i`${e.isCanonical} = true`},{on:[`entityType`,`entityId`,`locale`],where:e=>i`${e.isCanonical} = true`}],indexes:[{on:[`entityType`,`entityId`,`locale`]}]}),m=p.table;export{d as a,l as c,f as i,p as n,s as o,u as r,a as s,m as t};
|
|
2
|
-
//# sourceMappingURL=schema-BYrYzsmO.mjs.map
|
package/dist/schema-LlK6EkOJ.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{a as e}from"./schema-BYrYzsmO.mjs";import{buildEntityHref as t,matchReservedPrefix as n,resolvePattern as r}from"@murumets-ee/entity";import{column as i}from"@murumets-ee/db";import{sql as a}from"drizzle-orm";var o=class extends Error{entityName;locale;path;conflictingEntityId;constructor(e,t,n,r,i){super(i??`Path "${n}" (locale "${t}") is already used by another ${e} document. Choose a different slug, or set this document's slug manually.`),this.name=`PathConflictError`,this.entityName=e,this.locale=t,this.path=n,this.conflictingEntityId=r}},s=class extends Error{entityName;path;prefix;constructor(e,t,n){super(`Path "${t}" falls under the reserved prefix "${n}" and cannot be used as a public URL for a ${e} document.`),this.name=`PathReservedPrefixError`,this.entityName=e,this.path=t,this.prefix=n}};async function c(e){let n=e.entity.frontend?.path;if(n===void 0)return{path:null,skipReason:`not-routable`};let i=r(n,e.locale,e.defaultLocale);if(i===null)return{path:null,skipReason:`no-pattern-for-locale`};let a=i;if(typeof i==`string`&&i.includes(`[parent.path]`)){let t=e.row.parent;if(typeof t==`string`&&t.length>0){let n=await e.pathsClient.findOne({entityType:e.entity.name,entityId:t,locale:e.locale,isCanonical:!0});if(!n)return{path:null,skipReason:`parent-not-indexed`};a=i.replaceAll(`[parent.path]`,n.path)}else a=i.replaceAll(`[parent.path]`,``)}let o=t(a,e.row,e.locale,e.defaultLocale);return o===null?{path:null,skipReason:`unresolved-token`}:{path:l(o)}}function l(e){let t=e.replace(/\/{2,}/g,`/`);return t.length>1&&t.endsWith(`/`)?t.slice(0,-1):t}async function u(e){let{entity:t,data:r,currentRow:i,id:a,locale:l,defaultLocale:u,slugMode:f,reservedPathPrefixes:p,pathsClient:m}=e,h=``;for(let e=0;e<50;e++){let e={...i??{},...r},g=await c({entity:t,row:e,locale:l,defaultLocale:u,pathsClient:m});if(g.path===null)return;let _=g.path;h=_;let v=n(_,p);if(v!==void 0)throw new s(t.name,_,v);let y=await m.findOne({locale:l,path:_,isCanonical:!0}),b=y!=null&&y.entityType===t.name&&y.entityId===a;if(y==null||b)return;if(f===`manual`)throw new o(t.name,l,_,y.entityId);let x=e.slug;if(typeof x!=`string`||x.length===0)throw new o(t.name,l,_,y.entityId);r.slug=d(x)}throw new o(t.name,l,h,void 0,`Could not find a free path for a ${t.name} document near "${h}" (locale "${l}") after 50 attempts — choose a different slug manually.`)}function d(e){let t=/^(.*)-(\d+)$/.exec(e);return t?`${t[1]??e}-${Number.parseInt(t[2]??`1`,10)+1}`:`${e}-2`}async function f(e){let{pathsClient:t,locale:n,path:r,logger:i}=e,a=await t.findMany({where:{locale:n,path:r},orderBy:[{column:`updatedAt`,dir:`desc`}],limit:10});for(let e of a){let r=await t.findOne({entityType:e.entityType,entityId:e.entityId,locale:n,isCanonical:!0});if(r)return{entityType:e.entityType,entityId:e.entityId,currentPath:r.path}}return a.length===10&&i?.warn?.({locale:n,path:r,examined:a.length},`toolkit_paths: redirect lookup examined the full candidate window without resolving one — answering 404, but a further candidate may exist`),null}const p=5;async function m(e,t,n,r){return(await r.pathsClient.findOne({entityType:e,entityId:t,locale:n,isCanonical:!0}))?.path??null}function h(e){return{async isPublished(t,n,r){let i=e.entityResolver(t);return i===void 0?!1:await e.queryClientFactory(i).findById(n,{locale:r})!=null}}}function g(e,t,n){return v(e,t,n,(e,t,r)=>n.publishChecker.isPublished(e,t,r))}function _(e,t,n){return v(e,t,n,async()=>!0)}async function v(e,t,n,r){let i=l(e),a=e=>n.isRoutable?.(e)??!0,o=await n.homepageReader();if(i===`/`)return o===null||!await r(o.entity,o.id,t)?{kind:`none`}:{kind:`document`,entityType:o.entity,id:o.id};let s=await n.pathsClient.findOne({locale:t,path:i,isCanonical:!0});if(s)return!a(s.entityType)||!await r(s.entityType,s.entityId,t)?{kind:`none`}:S(o,s.entityType,s.entityId)?{kind:`redirect`,to:`/`,status:301}:{kind:`document`,entityType:s.entityType,id:s.entityId};let c=await y(i,t,n,o,a);if(c!==null)return c;let u=await f({pathsClient:n.pathsClient,locale:t,path:i,...n.logger!==void 0&&{logger:n.logger}});return u===null||!a(u.entityType)||!await r(u.entityType,u.entityId,t)?{kind:`none`}:S(o,u.entityType,u.entityId)?{kind:`redirect`,to:`/`,status:301}:{kind:`redirect`,to:u.currentPath,status:301}}async function y(e,t,n,r,i){let a=await b(n.redirectsClient,e,t);if(a===null)return null;for(let e=0;e<5;e++){let e=a.target,o=C(a.status);if(e.kind===`url`)return{kind:`redirect`,to:e.url,status:o};if(e.kind===`entity`){if(S(r,e.entity,e.id))return{kind:`redirect`,to:`/`,status:o};if(!i(e.entity))return{kind:`none`};let a=await m(e.entity,e.id,t,n);return a===null?{kind:`none`}:{kind:`redirect`,to:a,status:o}}let s=l(e.path),c=await b(n.redirectsClient,s,t);if(c!==null){a=c;continue}let u=await n.pathsClient.findOne({locale:t,path:s,isCanonical:!0});return u&&i(u.entityType)?S(r,u.entityType,u.entityId)?{kind:`redirect`,to:`/`,status:301}:{kind:`redirect`,to:s,status:o}:{kind:`none`}}return{kind:`none`}}async function b(e,t,n){return await e.findOne({fromPath:t,locale:n})||e.findOne({fromPath:t,locale:null})}async function x(e,t,n){let r=[];for(let i of n.locales){let a=await m(e,t,i,n);a!==null&&await n.publishChecker.isPublished(e,t,i)&&r.push({locale:i,path:a})}return r}function S(e,t,n){return e!==null&&e.entity===t&&e.id===n}function C(e){return e===302?302:301}const w=e({name:`toolkit_redirects`,columns:{id:i.uuid({primaryKey:!0,defaultRandom:!0}),locale:i.varchar({length:10}),fromPath:i.text({notNull:!0,pgName:`from_path`}),target:i.jsonb({notNull:!0}),status:i.integer({notNull:!0,default:301}),createdBy:i.varchar({length:255,pgName:`created_by`}),createdAt:i.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`created_at`}),updatedAt:i.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`updated_at`})},unique:[{on:[`locale`,`fromPath`],where:e=>a`${e.locale} IS NOT NULL`},{on:[`fromPath`],where:e=>a`${e.locale} IS NULL`}]}),T=w.table;export{x as a,g as c,l as d,h as i,c as l,w as n,m as o,p as r,_ as s,T as t,u};
|
|
2
|
-
//# sourceMappingURL=schema-LlK6EkOJ.mjs.map
|
package/dist/seed.d.mts
CHANGED
|
@@ -174,4 +174,3 @@ declare function seedDetailTemplates(): Promise<{
|
|
|
174
174
|
declare function forgetEntityPaths(entityNames: readonly string[]): Promise<Record<string, number>>;
|
|
175
175
|
//#endregion
|
|
176
176
|
export { forgetEntityPaths, seedDetailTemplates, seedSiteChrome };
|
|
177
|
-
//# sourceMappingURL=seed.d.mts.map
|
package/dist/seed.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./chrome-entity-names-zYJzP-_U.mjs";import{n as t,t as n}from"./detail-template-names-CD1Y9n1U.mjs";import{n as r,s as i}from"./schema-BYrYzsmO.mjs";import{n as a,t as o}from"./site-chrome-BAtQaAqC.mjs";import{getApp as s,requireRequestSite as c,runInEverySite as l}from"@murumets-ee/core";import{eq as u}from"drizzle-orm";import{createAdminClient as d}from"@murumets-ee/core/clients";import{randomUUID as f}from"node:crypto";import{defaultChromeBlocks as p}from"@murumets-ee/blocks/library";function m(e){return p(e,()=>f())}async function h(){let t=s(),n=t.entities.get(e);return n?{created:(await l(()=>g(n),{app:t,label:`content:site-chrome`})).reduce((e,t)=>e+t.created,0)}:{created:0}}async function g(t){let n=d(t),r=0,s=n.getTable().placement;if(!s)throw Error(`${e} has no "placement" column — the chrome entity registered by this app is not the one @murumets-ee/content ships.`);for(let e of o)if(!((await n.findMany({where:u(s,e),limit:1})).length>0))try{await n.create({placement:e,label:a[e],layout:m(e)}),r++}catch(e){if(!i(e))throw e}return{created:r}}async function _(){let e=s(),t=e.entities.get(n);return t?{created:(await l(()=>y(t),{app:e,label:`content:detail-templates`})).reduce((e,t)=>e+t.created,0)}:{created:0}}function v(e){let t=e.replace(/[_-]+/g,` `).trim();return`${t.charAt(0).toUpperCase()}${t.slice(1)} detail`}async function y(e){let r=e.allFields[t],a=r?.type===`select`?r.options:[];if(a.length===0)return{created:0};let o=d(e),s=o.getTable()[t];if(!s)throw Error(`${n} has no "${t}" column — the entity registered by this app is not the one @murumets-ee/content ships.`);let c=0;for(let e of a)if(!((await o.findMany({where:u(s,e),limit:1})).length>0))try{await o.create({[t]:e,label:v(e),layout:[{id:f(),type:`documentTitle`,props:{},traits:{}}]}),c++}catch(e){if(!i(e))throw e}return{created:c}}async function b(e){let t=r.makeClient(s().db.readWrite,await c(`toolkit_paths`)),n={};for(let r of e)n[r]=(await t.deleteMany({entityType:r})).length;return n}export{b as forgetEntityPaths,_ as seedDetailTemplates,h as seedSiteChrome};
|
|
2
|
-
//# sourceMappingURL=seed.mjs.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{n as e}from"./versionable-Br_G5VGR.mjs";import{auditable as t,defineEntity as n,field as r,publishable as i}from"@murumets-ee/entity";const a=[`header`,`footer`],o={header:`Site header`,footer:`Site footer`},s={label:{label:`Name`,description:`Shown in the admin list, and as the editor title when this document is opened by itself. Visitors never see it.`}};function c(e){let t={...s};for(let[n,r]of Object.entries(e??{}))t[n]={...t[n],...r};return t}function l(o){let s=o?.viewRole??`editor`,l=o?.updateRole??`editor`,u=o?.adminRole??`admin`,d=o?.maxVersions??30;return n({name:`site_chrome`,site:`bound`,kind:`collection`,fields:{placement:r.select({options:a,required:!0,unique:!0}),label:r.text({required:!0}),layout:r.blockTree({translatable:!0,areaFrom:`placement`,...o?.environment!==void 0&&{environment:o.environment}})},behaviors:[t(),i(),e({maxPerDoc:d}),...o?.behaviors??[]],scope:`global`,access:{view:s,create:u,update:l,delete:u},admin:{icon:`panel-top`,description:`Blocks rendered around every page that does not override them.`,rootFields:[`label`],fieldOverrides:c(o?.admin?.fieldOverrides),titleField:`label`,group:`Site`,disableCreate:!0}})}l().name;export{o as n,l as r,a as t};
|
|
2
|
-
//# sourceMappingURL=site-chrome-BAtQaAqC.mjs.map
|
|
@@ -95,4 +95,3 @@ declare function siteChromeEntity(options?: SiteChromeEntityOptions): import("@m
|
|
|
95
95
|
}, "site_chrome", [Behavior<import("@murumets-ee/entity").AuditableFields, string>, Behavior<import("@murumets-ee/entity").PublishableFields, "publishable">, Behavior<VersionableFields, string>, ...Behavior<Record<never, never>, string>[]]>;
|
|
96
96
|
//#endregion
|
|
97
97
|
export { siteChromeEntity as a, SiteChromeEntityOptions as i, CHROME_PLACEMENT_LABELS as n, ChromePlacement as r, CHROME_PLACEMENTS as t };
|
|
98
|
-
//# sourceMappingURL=site-chrome-DNCcePSR.d.mts.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./content-config-store-8omQF5p5.mjs";import{t}from"./registry-CaPbY5lm.mjs";import"./locale-utils-B0mFoV47.mjs";import{blockTreeFieldsOf as n}from"@murumets-ee/entity";import{getApp as r,getContext as i,isTokenDerivedDoor as a}from"@murumets-ee/core";import{column as o,defineTable as s}from"@murumets-ee/db";import{AsyncResource as c}from"node:async_hooks";import{createHash as l}from"node:crypto";import{isProseText as u,treeTextStrings as d}from"@murumets-ee/blocks/translation-text";const f=s({name:`toolkit_translation_provenance`,columns:{id:o.uuid({primaryKey:!0,defaultRandom:!0}),entityType:o.varchar({length:100,notNull:!0,pgName:`entity_type`}),entityId:o.varchar({length:255,notNull:!0,pgName:`entity_id`}),locale:o.varchar({length:10,notNull:!0}),contentHash:o.varchar({length:64,notNull:!0,pgName:`content_hash`}),contentChangedAt:o.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`content_changed_at`}),sourceLocale:o.varchar({length:10,pgName:`source_locale`}),sourceHash:o.varchar({length:64,pgName:`source_hash`}),method:o.varchar({length:10}),reviewedAt:o.timestamp({withTimezone:!0,pgName:`reviewed_at`}),reviewedBy:o.varchar({length:255,pgName:`reviewed_by`}),updatedAt:o.timestamp({notNull:!0,defaultNow:!0,withTimezone:!0,pgName:`updated_at`}),updatedBy:o.varchar({length:255,pgName:`updated_by`})},unique:[{on:[`entityType`,`entityId`,`locale`],name:`uq_translation_provenance_doc_locale`}]}),p=f.table;function m(e){return e.allFields}function h(e){let t=[];for(let[n,r]of Object.entries(m(e)))r.translatable===!0&&(r.type===`text`||r.type===`richtext`)&&t.push(n);return t}function g(e){let t=m(e);return n(e).map(e=>e.name).filter(e=>t[e]?.translatable===!0)}function _(e,t){let n=[];for(let r of h(e)){let e=t[r];typeof e==`string`&&u(e)&&n.push([r,e])}return n}function v(e){return h(e).length>0||g(e).length>0}const y=/<\/?(?:a|abbr|b|code|em|i|mark|s|small|span|strong|sub|sup|u)(?:\s[^<>]*)?\/?>/gi;function b(e){return e.replace(y,``).replace(/<[^<>]*>/g,` `)}function x(e){return e.replace(/\s+/g,` `).trim()}function S(e,t){let n=[],r=m(e);for(let i of h(e)){let e=t[i];if(typeof e!=`string`||!u(e))continue;let a=r[i]?.type===`richtext`?b(e):e;n.push(`${i}=${x(a)}`)}for(let r of g(e)){let e=t[r];if(Array.isArray(e))for(let t of d(e)){let e=x(t);e!==``&&n.push(e)}}return n.sort(),l(`sha256`).update(JSON.stringify(n)).digest(`hex`)}function C(e,t){return e===`_`?t:e}function w(e=r().db.readWrite){return f.makeClient(e)}function T(){try{return r()}catch{return}}function E(e){let t=e.method;return{locale:String(e.locale),contentHash:String(e.contentHash),contentChangedAt:e.contentChangedAt,sourceLocale:typeof e.sourceLocale==`string`?e.sourceLocale:null,sourceHash:typeof e.sourceHash==`string`?e.sourceHash:null,method:t===`ai`||t===`human`||t===`copy`?t:null,reviewedAt:e.reviewedAt??null,reviewedBy:typeof e.reviewedBy==`string`?e.reviewedBy:null}}async function D(e,n,i,a,o){let s=r(),c=i===a,l=await s.getClient(e).findById(n,{...c?{}:{locale:i,defaultLocale:a}});if(!l)return null;if(o!==void 0)return{row:l,working:{...l,...o},drafted:!0};let{drafts:u}=t(e.name);if(!u)return{row:l,working:l,drafted:!1};let{siteForDocumentType:d}=await import(`./document-site-B8tmEqLw.mjs`).then(e=>e.t),f=(await u.makeClient(s.db.readWrite,await d(e.name)).findOne({entityId:n,locale:c?`_`:i}))?.data;return f&&typeof f==`object`?{row:l,working:{...l,...f},drafted:!0}:{row:l,working:l,drafted:!1}}async function O(t){let{entityName:n,entityId:r}=t,o=T();if(o)try{let s=o.entities.get(n);if(!s||!v(s))return;let c=e().defaultLocale,l=C(t.locale,c),u=await D(s,r,l,c,t.draftData===void 0?void 0:{...t.draftData});if(!u)return;let d=S(s,u.working),f=w(),p=new Date,m={entityType:s.name,entityId:r};if(t.contentOnly===!0||l===c&&t.sourceLocale===void 0){let e=t.contentOnly===!0||t.reverted===!0?void 0:t.userId;await k(f,{...m,locale:l},d,p,e);return}let h=C(t.sourceLocale??c,c);if(h===l)return;let g=t.sourceHash;if(g===void 0){let e=await f.findOne({...m,locale:h});if(e)g=String(e.contentHash);else{let e=await D(s,r,h,c);if(!e)return;g=S(s,e.working),await k(f,{...m,locale:h},g,p,void 0)}}let _=await f.findOne({...m,locale:l}),y=_===null?u.drafted?S(s,u.row)!==d:d!==g:_.contentHash!==d,b=t.method===`ai`||y&&t.reverted!==!0&&a(i()?.door),x=t.userId!==void 0&&t.reverted!==!0&&(_===null||_.contentHash!==d),T=_?.method===`ai`,E=b||T?`ai`:d===g?`copy`:`human`;await f.upsert({...m,locale:l,contentHash:d,contentChangedAt:p,sourceLocale:h,sourceHash:g,method:E,reviewedAt:null,reviewedBy:null,updatedAt:p,updatedBy:t.userId??null},{target:[`entityType`,`entityId`,`locale`],set:{contentHash:d,...(_===null||_.contentHash!==d)&&{contentChangedAt:p},sourceLocale:h,sourceHash:g,method:E,...b&&{reviewedAt:null,reviewedBy:null},updatedAt:p,...x&&{updatedBy:t.userId}}})}catch(e){o.logger.warn({err:e,entity:n,entityId:r,locale:t.locale},`translation provenance: could not record a locale save`)}}async function k(e,t,n,r,i){let a=await e.findOne(t);a&&a.contentHash===n||await e.upsert({...t,contentHash:n,contentChangedAt:r,updatedAt:r,updatedBy:i??null},{target:[`entityType`,`entityId`,`locale`],set:{contentHash:n,contentChangedAt:r,updatedAt:r,...i!==void 0&&{updatedBy:i}}})}async function A(e){let t=w(),n={entityType:e.entityType,entityId:e.entityId,locale:e.locale},r=await t.findOne(n);if(!r)return`none`;if(e.refuseSelf===!0&&r.updatedBy===e.userId)return`self`;let i=new Date;return await t.update(n,{reviewedAt:i,reviewedBy:e.userId,updatedAt:i}),`reviewed`}async function j(e,t,n){let r=new Map;if(t.length===0)return r;let i=await w(n).findMany({where:{entityType:{eq:e},entityId:{in:[...t]}}});for(let e of i){let t=String(e.entityId),n=r.get(t);n||(n=new Map,r.set(t,n));let i=E(e);n.set(i.locale,i)}return r}function M(e,t){let n=e?.get(t);if(!n)return null;let r=n.sourceLocale===null?void 0:e?.get(n.sourceLocale),i=r!==void 0&&n.sourceHash!==null&&r.contentHash!==n.sourceHash;return{method:n.method,sourceLocale:n.sourceLocale,outdated:i,outdatedSince:i&&r?new Date(r.contentChangedAt).toISOString():null,machineUnreviewed:n.method===`ai`&&n.reviewedAt===null,reviewedAt:n.reviewedAt?new Date(n.reviewedAt).toISOString():null}}const N=new Map,P=new Map;function F(){for(let[e,t]of N){if(P.size>=2)return;if(P.has(e))continue;N.delete(e);let n=t.run().finally(()=>{P.delete(e),F()});P.set(e,n)}}function I(e){let t=T();if(!t)return;let n=R(e.entityName,e.entityId,e.locale);if(!N.has(n)&&N.size>=200){t.logger.warn({entity:e.entityName,entityId:e.entityId,locale:e.locale,waiting:N.size},`translation provenance: too many recordings waiting — this save was not recorded`);return}N.set(n,{run:c.bind(()=>O(e))}),F()}const L=e=>{if(e.action===`delete`)return;let t=T();if(!t)return;let n=t.entities.get(e.entityName);!n||!v(n)||I({entityName:e.entityName,entityId:e.id,locale:e.locale??`_`,userId:i()?.user?.id})};function R(e,t,n){return`${e}:${t}:${n}`}async function z(e,t,n,r=3e3){let i=R(e,t,n),a=Date.now()+r;for(;Date.now()<a;){let e=P.get(i);if(e!==void 0){await Promise.race([e,new Promise(e=>setTimeout(e,50))]);continue}if(!N.has(i))return;await new Promise(e=>setTimeout(e,5))}}async function B(){for(;P.size>0||N.size>0;)await new Promise(e=>setTimeout(e,5))}export{z as a,O as c,g as d,M as f,v as i,_ as l,p as m,I as n,A as o,L as p,j as r,B as s,S as t,h as u};
|
|
2
|
-
//# sourceMappingURL=translation-provenance-B41lEDM-.mjs.map
|
|
@@ -250,4 +250,3 @@ declare function localeSaveSettled(entityName: string, entityId: string, locale:
|
|
|
250
250
|
declare function provenanceQueueIdle(): Promise<void>;
|
|
251
251
|
//#endregion
|
|
252
252
|
export { documentTextHash as a, hasTranslatableText as c, provenanceQueueIdle as d, recordLocaleSave as f, translationFreshness as g, translatableTreeFields as h, TranslationProvenance as i, localeSaveSettled as l, translatableTextFields as m, TranslationFreshness as n, enqueueLocaleSave as o, translatableFieldTexts as p, TranslationMethod as r, getTranslationProvenanceBatch as s, LocaleSaveInput as t, markTranslationReviewed as u };
|
|
253
|
-
//# sourceMappingURL=translation-provenance-BZ0MlbFR.d.mts.map
|
package/dist/translation.d.mts
CHANGED
|
@@ -141,4 +141,3 @@ interface SiteTranslationEntry {
|
|
|
141
141
|
declare function getSiteTranslationEntry(): SiteTranslationEntry | undefined;
|
|
142
142
|
//#endregion
|
|
143
143
|
export { type LocaleSaveInput, type SiteTranslationEntry, type TranslatableSource, type TranslatableSourceItem, type TranslatableSourceRead, type TranslatableSourceText, type TranslationFreshness, type TranslationMethod, type TranslationProvenance, documentTextHash, enqueueLocaleSave, getSiteTranslationEntry, getTranslatableSources, getTranslationProvenanceBatch, hasTranslatableText, localeSaveSettled, markTranslationReviewed, provenanceQueueIdle, recordLocaleSave, translatableFieldTexts, translatableTextFields, translatableTreeFields, translationFreshness };
|
|
144
|
-
//# sourceMappingURL=translation.d.mts.map
|
package/dist/translation.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,r as c,s as l,t as u,u as d}from"./translation-provenance-B41lEDM-.mjs";import{getContributions as f}from"@murumets-ee/core";function p(){let e=new Map;for(let t of f(`content.translatableSources`))for(let n of t)e.set(n.kind,n);return[...e.values()]}function m(){return f(`content.siteTranslation`).at(-1)}export{u as documentTextHash,o as enqueueLocaleSave,m as getSiteTranslationEntry,p as getTranslatableSources,c as getTranslationProvenanceBatch,i as hasTranslatableText,e as localeSaveSettled,s as markTranslationReviewed,l as provenanceQueueIdle,t as recordLocaleSave,a as translatableFieldTexts,d as translatableTextFields,n as translatableTreeFields,r as translationFreshness};
|
|
2
|
-
//# sourceMappingURL=translation.mjs.map
|
|
@@ -147,4 +147,3 @@ interface LockInfo {
|
|
|
147
147
|
}
|
|
148
148
|
//#endregion
|
|
149
149
|
export { LocaleDirection as a, LockInfo as c, TranslationReport as d, TranslationStatus as f, LocaleConfig as i, RoutingStrategy as l, VersionableOptions as m, DraftEntry as n, LocaleEntry as o, VersionEntry as p, I18nConfig as r, LocalePublishStatus as s, ContentConfig as t, TranslationFieldStatus as u };
|
|
150
|
-
//# sourceMappingURL=types-BOk9tg_9.d.mts.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{field as e}from"@murumets-ee/entity";const t={maxPerDoc:50,autosave:!1};function n(n){let r={...t,...n};if(!Number.isInteger(r.maxPerDoc)||r.maxPerDoc<1)throw Error(`versionable({ maxPerDoc: ${r.maxPerDoc} }) — maxPerDoc must be a positive integer.`);return{name:`versionable`,fields:{_version:e.number({required:!0,default:1,integer:!0,internal:!0}),_versionedAt:e.date({internal:!0})},hooks:{beforeCreate:async e=>(e._version=1,e._versionedAt=new Date,e),beforeUpdate:async(e,t)=>(t._versionedAt=new Date,t)},_versionableOptions:r}}function r(e){return e?e.find(e=>e.name===`versionable`)?._versionableOptions??null:null}export{n,r as t};
|
|
2
|
-
//# sourceMappingURL=versionable-Br_G5VGR.mjs.map
|
|
@@ -15,4 +15,3 @@ declare function versionable(options?: VersionableOptions): Behavior<Versionable
|
|
|
15
15
|
declare function getVersionableOptions(behaviors?: Behavior[]): Required<VersionableOptions> | null;
|
|
16
16
|
//#endregion
|
|
17
17
|
export { getVersionableOptions as n, versionable as r, VersionableFields as t };
|
|
18
|
-
//# sourceMappingURL=versionable-CRvV87nZ.d.mts.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
import{t as e}from"./rolldown-runtime-DK3Fl9T5.mjs";import{i as t,n}from"./errors-NRNILhhm.mjs";import{t as r}from"./content-config-store-8omQF5p5.mjs";import{n as i}from"./plugin-CjgqBSFy.mjs";import{t as a}from"./locale-utils-B0mFoV47.mjs";import{a as o,i as s}from"./context-D7eEItCY.mjs";import{schemaRegistry as c}from"@murumets-ee/db";import{eq as l}from"drizzle-orm";import"server-only";function u(e){return e.match(/\S+|\s+/g)??[]}function d(e,t){if(e===t)return e?[{type:`equal`,value:e}]:[];if(!e)return[{type:`add`,value:t}];if(!t)return[{type:`remove`,value:e}];let n=u(e),r=u(t),i=n.length,a=r.length,o=Array.from({length:i+1},()=>Array(a+1).fill(0));for(let e=1;e<=i;e++){let t=o[e],i=o[e-1];if(!(!t||!i))for(let o=1;o<=a;o++)n[e-1]===r[o-1]?t[o]=(i[o-1]??0)+1:t[o]=Math.max(i[o]??0,t[o-1]??0)}let s=[],c=i,l=a,d=[];for(;c>0||l>0;){let e=c>0?n[c-1]:void 0,t=l>0?r[l-1]:void 0;if(c>0&&l>0&&e!==void 0&&e===t)d.push({type:`equal`,value:e}),c--,l--;else if(l>0&&t!==void 0&&(c===0||(o[c]?.[l-1]??0)>=(o[c-1]?.[l]??0)))d.push({type:`add`,value:t}),l--;else if(e!==void 0)d.push({type:`remove`,value:e}),c--;else break}d.reverse();for(let e of d){let t=s[s.length-1];t&&t.type===e.type?t.value+=e.value:s.push({...e})}return s}function f(e){return e.replace(/<[^>]*>/g,` `).replace(/\s+/g,` `).trim()}function p(e){return e==null?``:e instanceof Date?e.toISOString():typeof e==`object`?JSON.stringify(e):String(e)}function m(e,t,n,r){if(JSON.stringify(t)===JSON.stringify(n))return null;switch(r?.type??g(t,n)){case`text`:case`slug`:return{field:e,type:`text`,from:t,to:n,segments:d(p(t),p(n))};case`richtext`:return{field:e,type:`richtext`,from:t,to:n,segments:d(f(p(t)),f(p(n)))};case`number`:return{field:e,type:`number`,from:t,to:n};case`boolean`:return{field:e,type:`boolean`,from:t,to:n};case`date`:return{field:e,type:`date`,from:t,to:n};case`select`:return{field:e,type:`select`,from:t,to:n};case`media`:return{field:e,type:`media`,from:t,to:n};case`json`:return{field:e,type:`json`,from:t,to:n};case`blockTree`:return{field:e,type:`blockTree`,from:t,to:n};default:return{field:e,type:`unknown`,from:t,to:n}}}function h(e,t,n){let r=new Set([...Object.keys(e),...Object.keys(t)]),i=[];for(let a of r){if(a===`id`||a===`createdAt`||a===`updatedAt`)continue;let r=m(a,e[a],t[a],n?.[a]);r&&i.push(r)}return i}function g(e,t){let n=e??t;if(typeof n==`number`)return`number`;if(typeof n==`boolean`)return`boolean`;if(n instanceof Date)return`date`;if(typeof n==`string`)return/^\d{4}-\d{2}-\d{2}/.test(n)?`date`:`text`;if(Array.isArray(n)){let e=n[0];return n.length>0&&typeof e==`object`&&e&&`type`in e&&`id`in e?`blockTree`:`json`}return typeof n==`object`?`json`:`unknown`}function _(e,t){if(typeof e==`string`||typeof t==`string`)return d(p(e),p(t))}function v(e){if(typeof e!=`object`||!e)return null;let t=e;if(typeof t.id!=`string`||typeof t.type!=`string`)return null;let n={...t.props??{}};return t.traits!==void 0&&(n.traits=t.traits),t.children!==void 0&&(n.children=t.children),{id:t.id,type:t.type,props:n}}function y(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]),r=[];for(let i of n){let n=e[i],a=t[i];JSON.stringify(n)!==JSON.stringify(a)&&r.push({field:i,from:n,to:a,segments:_(n,a)})}return r}function b(e){let t=new Map,n=0;for(let r of e){let e=v(r);e&&(t.set(e.id,{block:e,index:n}),n++)}return t}function x(e,t){let n=b(e),r=b(t),i=[],a=new Set;for(let[e,{block:t,index:o}]of r){a.add(e);let r=n.get(e);if(!r){i.push({blockId:e,blockType:t.type,status:`added`,toIndex:o});continue}let s=r.block,c=r.index,l=y(s.props,t.props),u=c!==o;l.length===0&&!u?i.push({blockId:e,blockType:t.type,status:`unchanged`,fromIndex:c,toIndex:o}):l.length>0?i.push({blockId:e,blockType:t.type,status:`changed`,fromIndex:c,toIndex:o,propDiffs:l}):i.push({blockId:e,blockType:t.type,status:`moved`,fromIndex:c,toIndex:o})}for(let[e,{block:t,index:r}]of n)a.has(e)||i.push({blockId:e,blockType:t.type,status:`removed`,fromIndex:r});return i}function S(e){return e===`_`||e===r().defaultLocale}function C(e){let{defaultLocale:t}=r();return S(e)?{defaultLocale:t}:{locale:e,defaultLocale:t}}async function w(e,t,n,o,c){if(c!==void 0&&e.db!==c)throw Error("applyLocaleRoutedUpdate: `tx` must be the context's own db handle");let l=await s(e);return e.admin.updateForLocale(t,n,o,{defaultLocale:r().defaultLocale,...c!==void 0&&{tx:c},...l!==null&&{localeStatusWriter:(e,t,n)=>(a(t),i(l,e,t,n))}})}const T=new Set([`id`,`createdAt`,`createdBy`,`updatedAt`,`updatedBy`]);function E(e,t){let n=e.allFields,r={};for(let e of Object.keys(t)){if(T.has(e)||e.startsWith(`_`)||!Object.hasOwn(n,e))continue;let i=n[e];i&&i.internal===!0||(r[e]=t[e])}return r}function D(e,t){return JSON.stringify(e)===JSON.stringify(t)}function O(e,t){let n={};for(let r of Object.keys(t))r===`id`||r.startsWith(`_`)||D(e[r],t[r])||(n[r]=t[r]);return n}var k=e({compareVersions:()=>M,createVersionSnapshot:()=>I,getVersion:()=>j,getVersions:()=>A,pruneVersions:()=>P,restoreVersion:()=>N,saveVersionSnapshot:()=>F,writeVersionColumn:()=>L});async function A(e,t,n){n?.locale!==void 0&&a(n.locale);let r=await o(e);return r?await r.findMany({where:{entityId:t,locale:n?.locale??`_`},orderBy:[{column:`version`,dir:`desc`}],...n?.limit===void 0?{}:{limit:n.limit},...n?.offset===void 0?{}:{offset:n.offset}}):[]}async function j(e,t,n,r=`_`){a(r);let i=await o(e);return i?await i.findOne({entityId:t,version:n,locale:r})??null:null}async function M(e,t,n,r,i=`_`){a(i);let[o,s]=await Promise.all([j(e,t,n,i),j(e,t,r,i)]);if(!o||!s)return null;let c=e.entity.allFields,l=h(o.data,s.data,c);for(let e of l)e.type===`blockTree`&&(e.blockDiffs=x(Array.isArray(e.from)?e.from:[],Array.isArray(e.to)?e.to:[]));return{diffs:l,fromVersion:o,toVersion:s}}async function N(e,r,i,s=`_`){if(a(s),!await o(e))throw new n(e.entity.name,`versions`);let c=await j(e,r,i,s);if(!c)throw new t(r,i,s);let l=c.data;return w(e,r,E(e.entity,l),s)}async function P(e,t,n=`_`){if(a(n),!e.versionableOptions)return;let r=await o(e);if(!r)return;let i=e.versionableOptions.maxPerDoc,s=await r.findMany({where:{entityId:t,locale:n},orderBy:[{column:`version`,dir:`desc`}],limit:i});if(s.length<i)return;let c=s.map(e=>e.id);await r.deleteMany({entityId:t,locale:n,id:{notIn:c}})}async function F(e,t,n,r,i,s=`_`,c){a(s);let l=await o(e);if(!l)return;let[u]=await l.aggregate({select:{maxVersion:{fn:`max`,column:`version`}},where:{entityId:t,locale:s}}),d=Number(u?.maxVersion??0)+1,f=n.status??null;if(i){let e=await l.findOne({entityId:t,isAutosave:!0,version:d,locale:s});if(e)return await l.update({id:e.id},{data:n,delta:r,status:f,createdAt:new Date}),d}return await l.insert({entityId:t,version:d,locale:s,data:n,delta:r,status:f,createdBy:c?.id??null,createdByName:c?.name??null,isAutosave:i}),d}async function I(e,t,n,r,i,o){if(i!==void 0&&a(i),!e.versionableOptions)return;let s=i??`_`,c=await F(e,t,n,r?O(r,n):null,!1,s,o);c!==void 0&&s===`_`&&await L(e,t,c),await P(e,t,s)}async function L(e,t,n){let r=c.get(e.entity.name);r&&await e.db.update(r).set({_version:n}).where(l(r.id,t))}export{P as a,k as c,E as d,w as f,h,A as i,L as l,x as m,I as n,N as o,C as p,j as r,F as s,M as t,O as u};
|
|
2
|
-
//# sourceMappingURL=versions-w2ui-Vzb.mjs.map
|