@kanonak-protocol/sdk 6.3.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/auth/credentialConfig.d.ts +0 -2
  2. package/dist/browser.d.ts +3 -1
  3. package/dist/browser.js +1 -1
  4. package/dist/{chunk-ED35OFGD.js → chunk-5AMN6MW7.js} +1 -1
  5. package/dist/{chunk-7JBKOJB4.js → chunk-5ZRVFYCP.js} +1 -1
  6. package/dist/{chunk-ADSDFJUO.js → chunk-7TNZ7ICK.js} +1 -1
  7. package/dist/{chunk-VORVR5BZ.js → chunk-A224OOBZ.js} +1 -1
  8. package/dist/{chunk-A3HRXFVX.js → chunk-AAYMTPG7.js} +1 -1
  9. package/dist/{chunk-R4LVLXAC.js → chunk-BDTJIUS4.js} +1 -1
  10. package/dist/{chunk-GKIX3OD6.js → chunk-FB5QKDNM.js} +1 -1
  11. package/dist/chunk-GGK6A6QK.js +1 -0
  12. package/dist/{chunk-TYVZXABI.js → chunk-GXEKJFXG.js} +1 -1
  13. package/dist/{chunk-66GZUKYS.js → chunk-K76UUREI.js} +1 -1
  14. package/dist/{chunk-22DSABP6.js → chunk-LKJVNKCN.js} +1 -1
  15. package/dist/{chunk-EKD2ZLKQ.js → chunk-MSOUPUUB.js} +1 -1
  16. package/dist/chunk-PC3MYDGL.js +1 -0
  17. package/dist/{chunk-MWJSYONH.js → chunk-Q57XCPAQ.js} +1 -1
  18. package/dist/chunk-WXUMROTA.js +1 -0
  19. package/dist/{chunk-6VIUXP4N.js → chunk-WXXZOJ4O.js} +1 -1
  20. package/dist/{chunk-D2X6J77P.js → chunk-X4V6DEZL.js} +1 -1
  21. package/dist/chunk-Z2444SWM.js +2 -0
  22. package/dist/config/packageUrlTemplatesConfig.d.ts +22 -0
  23. package/dist/config/userConfig.d.ts +10 -0
  24. package/dist/index.d.ts +7 -4
  25. package/dist/index.js +2 -2
  26. package/dist/lock/LockFile.d.ts +7 -0
  27. package/dist/lock/index.d.ts +1 -1
  28. package/dist/parsing/index.js +1 -1
  29. package/dist/producer/index.js +1 -1
  30. package/dist/reasoning/index.js +1 -1
  31. package/dist/repositories/HttpKanonakDocumentRepository.d.ts +9 -7
  32. package/dist/repositories/PackageUrlTemplates.d.ts +37 -0
  33. package/dist/repositories/PublisherIndex.d.ts +37 -1
  34. package/dist/repositories/browser.js +1 -1
  35. package/dist/repositories/buildLocalFirstRepository.d.ts +5 -1
  36. package/dist/repositories/index.d.ts +2 -0
  37. package/dist/repositories/index.js +1 -1
  38. package/dist/resolution/index.js +1 -1
  39. package/dist/search/index.js +1 -1
  40. package/dist/server/index.js +5 -5
  41. package/dist/server/loadResourceModel.d.ts +3 -0
  42. package/dist/server/requestRouter.d.ts +3 -0
  43. package/dist/server/types.d.ts +8 -1
  44. package/dist/transformations/index.js +1 -1
  45. package/dist/uri-helpers/index.js +1 -1
  46. package/dist/validation/index.js +1 -1
  47. package/package.json +2 -2
  48. package/dist/chunk-D4QGPMRW.js +0 -1
  49. package/dist/chunk-MD4CAJIO.js +0 -2
  50. package/dist/chunk-NUTHBBDZ.js +0 -1
  51. package/dist/chunk-QILEJIFU.js +0 -1
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as wt,b as Kt,c as Nt,d as Lt,e as z}from"./chunk-A3HRXFVX.js";import{a as jn,b as Dn,c as Hn}from"./chunk-R4LVLXAC.js";import{a as Pt,b as xt,c as _t,d as Hr,e as Fr,f as Tr,g as Wr,h as qr,i as Br,j as Le,k as Gr,l as Oe,m as Ie,n as zr,o as Qr,p as Xr,q as de,r as Yr,s as Ae}from"./chunk-EKD2ZLKQ.js";import{a as Jr}from"./chunk-ED35OFGD.js";import{a as $r,b as Ur,c as Mr,d as Q,e as jr,f as Dr,g as Ne,h as Zr,i as ei,j as ni,k as oi,l as ti}from"./chunk-ADSDFJUO.js";import{a as Po,b as xo,c as _o,d as wo,e as Ko,f as Wo,g as qo,h as Bo,i as Go}from"./chunk-66GZUKYS.js";import{a as Ao,b as Vo,c as $o,d as Uo,e as Mo,f as jo,h as Do,i as qe,j as Be,k as Ge,l as ze,m as Qe,n as Ho,o as To}from"./chunk-MD4CAJIO.js";import{a as It,b as At,c as Vt,d as $t,e as Ut,f as Mt}from"./chunk-GKIX3OD6.js";import{a as jt,b as Ht}from"./chunk-D2X6J77P.js";import{a as Fo}from"./chunk-SC5M74NM.js";import{A as mr,B as hr,C as Sr,D as kr,E as yr,F as gr,G as Kr,H as Nr,I as Lr,J as Or,K as Ir,L as Ar,M as Vr,a as Ft,b as Tt,c as Wt,d as qt,e as Bt,f as Gt,g as zt,h as Qt,i as Xt,j as Yt,k as Jt,l as Zt,m as er,n as nr,o as or,p as tr,q as rr,r as ir,s as ar,t as sr,u as cr,v as dr,w as ur,x as lr,y as pr,z as fr}from"./chunk-MWJSYONH.js";import"./chunk-VORVR5BZ.js";import{c as $n,d as Er,e as br,f as Cr,g as Rr,i as vr,j as Pr,m as xr,o as Ke,q as Un,r as Mn,t as _r,u as wr}from"./chunk-TYVZXABI.js";import"./chunk-QHABFCRC.js";import{a as No,b as Lo,c as Oo,d as Io,e as N}from"./chunk-5FVUBF7N.js";import{a as Se}from"./chunk-6VIUXP4N.js";import{a as _e,g as $,h as we,i as Rt,j as vt,k as D}from"./chunk-22DSABP6.js";import{a as H}from"./chunk-7JBKOJB4.js";import{a as Dt}from"./chunk-PEJALHXK.js";import{$ as ae,A as un,B as ln,C as pn,D as fn,E as mn,F as hn,G as Sn,H as kn,I as yn,J as gn,K as be,L as En,M as bn,N as Cn,O as Rn,P as vn,Q as Pn,R as xn,S as _n,T as wn,U as Kn,V as Nn,W as Ln,X as On,Y as In,Z as Ce,_ as An,a as st,aa as Re,b as ct,ba as ve,c as T,ca as se,d as pt,da as q,e as ft,ea as B,g as mt,h as te,ha as ht,i as re,ia as St,j as Xe,k as W,ka as kt,l as ie,m as Ye,ma as yt,n as Je,na as k,o as ge,oa as xe,p as Ze,pa as gt,q as en,qa as Et,r as nn,s as on,t as Ee,ta as bt,u as tn,ua as Ct,v as rn,va as G,w as an,x as sn,y as cn,z as dn}from"./chunk-NUTHBBDZ.js";import{C as j,D as R,E as oe,F as S,G as F,H as ye,I as ce,J as Pe,L as Vn,a as zo,b as Qo,c as y,d as L,e as O,f as Yo,g as Jo,h as Zo,i as et,j as nt,k as ot,l as tt,m as rt,n as it,o as at,p as dt,q as ut,r as l,u as lt,v as M,w as ke,x as ne,z as x}from"./chunk-D4QGPMRW.js";import{a as Xo}from"./chunk-FUUTGGJS.js";import"./chunk-F67UH4FD.js";import{a as So,b as ko,c as ee,d as yo,e as V,f as go,g as Eo,h as bo,i as Co,j as Ro,k as vo}from"./chunk-QILEJIFU.js";import{a as Ot}from"./chunk-ODIECDN7.js";async function Fn(n){let e=await new D().parseKanonaks(n),t=await new z().reason(n);return{kind:"merged",catalog:e,reasoning:t}}function Tn(n,e){return{kind:"merged",catalog:n,reasoning:e}}async function Wn(n,e){let t=e??new Se(new H);return{kind:"standalone",catalog:await new D().parseKanonaks(new Vn(n,t))}}function I(n){return typeof n=="number"?n:void 0}function ri(n){if(!n)return;let e=l(n);if(e===l(kn))return"IRI";if(e===l(yn))return"BlankNode";if(e===l(gn))return"Literal"}function Bn(n){if(!n)return;let e=l(n);if(e===l(En))return"Violation";if(e===l(bn))return"Warning";if(e===l(Cn))return"Info"}function Gn(n,e,t,o){let r=S(e,ge);if(!r)return;let i={path:r},d=I(R(e,Ze)),s=I(R(e,en));d!==void 0&&(i.minCount=d),s!==void 0&&(i.maxCount=s);let a=I(R(e,an)),u=I(R(e,sn));a!==void 0&&(i.minLength=a),u!==void 0&&(i.maxLength=u);let c=I(R(e,cn)),p=I(R(e,dn));c!==void 0&&(i.minInclusive=c),p!==void 0&&(i.maxInclusive=p);let m=oe(e,tn);if(m!==void 0){let h=oe(e,rn);i.pattern=h!==void 0?{regex:m,flags:h}:{regex:m}}if(j(e,Ee)){let h=[],K=[];for(let{item:g}of ke(e,Ee))"literal"in g?h.push(g.value):g instanceof O&&K.push(g.subject);h.length>0&&(i.inValues=h),K.length>0&&(i.inRefs=K)}let f=S(e,nn);f&&(i.datatype=f);let A=S(e,on);A&&(i.classRef=A);let v=ri(S(e,Sn));v&&(i.nodeKind=v);let U=S(e,An);if(U&&(i.hasValue=U),j(e,ae)||j(e,Re)||j(e,ve)){let h={},K=I(R(e,Re)),g=I(R(e,ve));K!==void 0&&(h.minCount=K),g!==void 0&&(h.maxCount=g);let P=ii(n,e,o);"problem"in P?h.problem=P.problem:h.shape=P.shape,i.qualified=h}let w=oe(e,un);w!==void 0&&(i.message=w);let J=Bn(S(e,be))??t;return J&&(i.severity=J),i}function ii(n,e,t){let o=F(e,ae);if(o)return qn(n,o,void 0,t);let r=S(e,ae);if(!r)return{problem:"sh:qualifiedValueShape is missing"};let i=l(r);if(t.has(i))return{problem:`sh:qualifiedValueShape '${r.name}' leads back to itself (a cycle through named shapes)`};let d=x(n,r);return d?qn(n,d,i,t):{problem:`sh:qualifiedValueShape '${r.name}' does not resolve`}}function qn(n,e,t,o){let r=t?new Set([...o,t]):o,i=ne(e,W);if((ne(e,ie)||j(e,ge))&&!i){let a=Gn(n,e,void 0,r);return a?{shape:{kind:"property",constraint:a}}:{problem:"the qualified property shape has no sh:path"}}return e instanceof y&&!i?{problem:`sh:qualifiedValueShape '${e.name}' is not a shape`}:{shape:{kind:"node",shape:zn(n,e,r)}}}function zn(n,e,t){let o=Bn(S(e,be)),r={name:e instanceof y?e.name:"(inline shape)",uri:e instanceof y?k(e):void 0,targetClass:S(e,Ye),targetNodes:M(e,ln),targetSubjectsOf:M(e,pn),targetObjectsOf:M(e,fn),closed:R(e,mn)===!0,ignoredProperties:[],severity:o,properties:[]};r.ignoredProperties.push(...M(e,hn));for(let{item:i}of ke(e,Je)){let d;if(i instanceof L?d=i:i instanceof O&&(d=x(n,i.subject)),!d)continue;let s=Gn(n,d,o,t);s&&r.properties.push(s)}return r}function ue(n){let e=[];for(let t of n){if(!(t instanceof y)||!ne(t,W))continue;let o=k(t);e.push(zn(n,t,new Set(o?[l(o)]:[])))}return e}var b="kanonak.org/transformations",X="values";var le="allowed",$e="expected",E=n=>({type:`${b}/VarRef`,varName:n}),Ve=n=>({type:`${b}/IntegerLiteral`,integerLiteral:n}),ai=n=>({type:`${b}/DecimalLiteral`,decimalLiteral:n}),Qn=n=>Number.isInteger(n)?Ve(n):ai(n),Xn=n=>({type:`${b}/Count`,source:n}),Yn=(n,e)=>({type:`${b}/GreaterThanOrEqual`,compareLeft:n,compareRight:e}),Jn=(n,e)=>({type:`${b}/LessThanOrEqual`,compareLeft:n,compareRight:e});function Ue(n,e){if(!e||e.length===0)return n;let t=new Set(["i","m","s"]),o=[...new Set(e.split(""))];if(o.filter(i=>!t.has(i)).length>0)throw new Error(`sh:flags '${e}' is outside the pinned regex subset (supported: i, m, s)`);return`(?${o.sort().join("")})${n}`}function pe(n){let e=[];return n.minCount!==void 0&&e.push({component:"minCount",per:"node",expr:Yn(Xn(E(X)),Ve(n.minCount))}),n.maxCount!==void 0&&e.push({component:"maxCount",per:"node",expr:Jn(Xn(E(X)),Ve(n.maxCount))}),n.hasValue!==void 0&&e.push({component:"hasValue",per:"node",expr:{type:`${b}/Contains`,haystack:E(X),needle:E($e)}}),(n.inValues!==void 0||n.inRefs!==void 0)&&e.push({component:"in",per:"value",expr:{type:`${b}/Contains`,haystack:E(le),needle:E("v")}}),n.pattern!==void 0&&e.push({component:"pattern",per:"value",expr:{type:`${b}/Matches`,matchSource:E("v"),pattern:Ue(n.pattern.regex,n.pattern.flags)}}),n.minLength!==void 0&&e.push({component:"minLength",per:"value",expr:{type:`${b}/Matches`,matchSource:E("v"),pattern:`(?s)^.{${n.minLength},}$`}}),n.maxLength!==void 0&&e.push({component:"maxLength",per:"value",expr:{type:`${b}/Matches`,matchSource:E("v"),pattern:`(?s)^.{0,${n.maxLength}}$`}}),n.minInclusive!==void 0&&e.push({component:"minInclusive",per:"value",expr:Yn(E("v"),Qn(n.minInclusive))}),n.maxInclusive!==void 0&&e.push({component:"maxInclusive",per:"value",expr:Jn(E("v"),Qn(n.maxInclusive))}),e}import{evaluate as ci,ExpressionError as di}from"@kanonak-protocol/expression";function eo(n,e){let t=ui(e)?e:ue(e),o=[],r=n.catalog.filter(s=>s instanceof y).map(fe),i=new Map;li(r,i);let d={scope:n,membership:new Me(n),embeddedFocus:i};for(let s of t)for(let a of pi(d,s,r))oo(d,s,a,o);return{conforms:!o.some(s=>s.severity==="Violation"),results:o}}function ui(n){return n.length>0&&!(n[0]instanceof Object&&"statement"in n[0])&&typeof n[0].name=="string"&&"properties"in n[0]}function no(n){let e=n.predicate;return e instanceof O?e:void 0}function fe(n){return{node:n,key:Pe(n),uri:k(n),label:n.name}}function De(n,e){return{node:n,key:e,label:e.includes("#")?e.slice(e.indexOf("#")):e}}function li(n,e){_e(n.map(t=>t.node),({kanonak:t,address:o})=>{t instanceof L&&!e.has(t)&&e.set(t,De(t,o))})}var Me=class{constructor(e){this.scope=e}scope;ancestors=new Map;isInstance(e,t){let o=l(t);return e.some(r=>l(r)===o||this.ancestorsOf(r).has(o))}ancestorsOf(e){let t=e.version&&typeof e.version.major=="number"?`${l(e)}@${V(e.version)}`:l(e),o=this.ancestors.get(t);return o||(o=this.scope.reasoning?new Set(this.scope.reasoning.getSuperclasses(e)):new Set(xe(this.scope.catalog,e).map(r=>l(r))),this.ancestors.set(t,o)),o}};function pi(n,e,t){let{scope:o}=n,r=new Map,i=s=>{r.set(s.key,s)},d=()=>[...t,...n.embeddedFocus.values()];if(e.targetClass){let s=e.targetClass;for(let a of d())n.membership.isInstance(G(a.node),s)&&i(a)}for(let s of e.targetNodes){let a=x(o.catalog,s);a instanceof y&&i(fe(a))}for(let s of e.targetSubjectsOf){let a=l(s);for(let u of d())u.node.statement.some(c=>{let p=no(c);return p&&l(p.subject)===a})&&i(u)}for(let s of e.targetObjectsOf)for(let a of d())for(let u of ce(a.node,s,o.catalog,a.key))u.kind==="subject"?i(fe(u.node)):u.kind==="embedded"&&i(n.embeddedFocus.get(u.node)??De(u.node,u.address));return[...r.values()]}function fi(n,e,t){return e.node?ce(e.node,t,n.scope.catalog,e.key).map(o=>mi(n,o)):[]}function mi(n,e){switch(e.kind){case"subject":return{kernel:{ref:l(e.uri)},kind:"reference",ref:e.uri,subject:e.node};case"unresolved":return{kernel:{ref:l(e.uri)},kind:"reference",ref:e.uri};case"embedded":{let t=n.embeddedFocus.get(e.node)??De(e.node,e.address);return{kernel:{ref:t.key},kind:"embedded",embedded:t}}case"literal":return typeof e.value=="boolean"?{kernel:e.value?1:0,kind:"boolean",literal:e.value}:{kernel:e.value,kind:typeof e.value=="number"?"number":"string",literal:e.value}}}function oo(n,e,t,o){for(let r of e.properties)ro(n,e,t,r,o);e.closed&&Pi(e,t,o)}function je(n,e,t,o,r={},i){return{focusNode:e.key,focusUri:e.uri,constraintComponent:t,severity:i??to(n),message:o,sourceShape:n.name,sourceShapeUri:n.uri,...r}}function to(n){return n.severity??"Violation"}var hi={minCount:Rn,maxCount:vn,hasValue:se,in:_n,pattern:wn,minLength:Kn,maxLength:Nn,minInclusive:Ln,maxInclusive:On};function ro(n,e,t,o,r){let i=fi(n,t,o.path),d=o.severity??to(e),s=o.path.name,a=[...(o.inValues??[]).map(c=>typeof c=="boolean"?c?1:0:c),...(o.inRefs??[]).map(c=>({ref:l(c)}))],u=(c,p,m)=>{let f=je(e,t,c,o.message??p,{resultPath:o.path,value:m?.literal,valueRef:m?.ref},d);return r.push(f),f};for(let c of pe(o)){let p=hi[c.component];if(c.per==="node"){let m={[X]:i.map(f=>f.kernel),[le]:a};o.hasValue&&(m[$e]={ref:l(o.hasValue)}),Zn(c,m)||u(p,Si(c,s,o,i.length));continue}for(let m of i){if((c.component==="pattern"||c.component==="minLength"||c.component==="maxLength")&&m.kind!=="string"){u(p,`'${s}' value is not a string; ${c.component} applies to string values.`,m);continue}Zn(c,{v:m.kernel,[le]:a})||u(p,bi(c,s,o,m),m)}}if(o.nodeKind)for(let c of i)Ci(o.nodeKind,c)||u(In,`'${s}' value is ${c.kind}; nodeKind requires ${o.nodeKind}.`,c);if(o.datatype)for(let c of i){let p=Ri(o.datatype,c);p&&u(Pn,`'${s}' ${p}`,c)}if(o.classRef)for(let c of i){let p=vi(n,o.classRef,c);p&&u(xn,`'${s}' ${p}`,c)}o.qualified&&ki(n,o,i,s,u)}function Si(n,e,t,o){switch(n.component){case"minCount":return`'${e}' has ${o} value(s); minCount is ${t.minCount}.`;case"maxCount":return`'${e}' has ${o} value(s); maxCount is ${t.maxCount}.`;case"hasValue":return`'${e}' has no value equal to ${t.hasValue?l(t.hasValue):"(unset)"}.`;default:return`'${e}' violates ${n.component}.`}}function ki(n,e,t,o,r){let i=e.qualified,d=i.maxCount!==void 0?B:q,s=(u,c)=>{io.add(r(d,u,c))};if(!i.shape){s(`'${o}' qualified value shape cannot be evaluated: ${i.problem??"it could not be built"}.`);return}let a=0;for(let u of t){let c=u.ref?l(u.ref):u.embedded?u.embedded.label:JSON.stringify(u.literal),p=yi(n,u);if(!p){s(`'${o}' value ${c} does not resolve in this scope; whether it conforms to the qualified shape cannot be decided.`,u);continue}let m=Ei(n,i.shape,p);if(m.kind==="undecided"){s(`'${o}' value ${c}: whether it conforms to the qualified shape cannot be decided \u2014 ${m.reason}`,u);continue}m.kind==="conforms"&&a++}i.minCount!==void 0&&a<i.minCount&&r(q,`'${o}' has ${a} value(s) that conform to the qualified shape; qualifiedMinCount is ${i.minCount}.`),i.maxCount!==void 0&&a>i.maxCount&&r(B,`'${o}' has ${a} value(s) that conform to the qualified shape; qualifiedMaxCount is ${i.maxCount}.`)}function yi(n,e){switch(e.kind){case"reference":return e.subject?fe(e.subject):void 0;case"embedded":return e.embedded;default:{let t=JSON.stringify(e.literal);return{key:t,label:t}}}}var gi={name:"(qualified value shape)",targetNodes:[],targetSubjectsOf:[],targetObjectsOf:[],closed:!1,ignoredProperties:[],properties:[]},io=new WeakSet;function Ei(n,e,t){let o=[];e.kind==="property"?ro(n,gi,t,e.constraint,o):oo(n,e.shape,t,o);let r=o.find(i=>io.has(i));return r?{kind:"undecided",reason:r.message}:o.length===0?{kind:"conforms"}:{kind:"fails"}}function bi(n,e,t,o){let r=o.ref?l(o.ref):o.embedded?o.embedded.label:JSON.stringify(o.literal);switch(n.component){case"in":return`'${e}' value ${r} is not in the permitted set.`;case"pattern":return`'${e}' value ${r} does not match pattern ${t.pattern?.regex}.`;case"minLength":return`'${e}' value ${r} is shorter than minLength ${t.minLength}.`;case"maxLength":return`'${e}' value ${r} is longer than maxLength ${t.maxLength}.`;case"minInclusive":return`'${e}' value ${r} is below minInclusive ${t.minInclusive} (or not numeric).`;case"maxInclusive":return`'${e}' value ${r} is above maxInclusive ${t.maxInclusive} (or not numeric).`;default:return`'${e}' value ${r} violates ${n.component}.`}}function Zn(n,e){let t=o=>{let r=o.varName;if(o.type==="kanonak.org/transformations/VarRef"&&typeof r=="string"&&r in e)return e[r];throw new di(`Conformance lowering produced an unexpected leaf '${o.type}'`)};return ci(n.expr,void 0,t)===1}function Ci(n,e){switch(n){case"IRI":return e.kind==="reference";case"BlankNode":return e.kind==="embedded";case"Literal":return e.kind==="string"||e.kind==="number"||e.kind==="boolean"}}function Ri(n,e){if(e.kind==="reference"||e.kind==="embedded")return`value is a ${e.kind}; sh:datatype requires a literal of ${n.name}.`;let t=we(n);if(t!==void 0)switch(t){case $.Boolean:return e.kind==="boolean"?void 0:`value is not a boolean (${n.name}).`;case $.Integer:return e.kind!=="number"?`value is not a number (${n.name}).`:Number.isInteger(e.literal)?void 0:`value is not an integer (${n.name}).`;case $.Decimal:case $.Double:case $.Float:return e.kind==="number"?void 0:`value is not a number (${n.name}).`;default:return e.kind==="string"?void 0:`value is not a string-carried literal (${n.name}).`}}function vi(n,e,t){if(t.kind==="embedded"&&t.embedded?.node){let r=G(t.embedded.node);return r.length===0?`value ${t.embedded.label} has no type; sh:class requires an instance of ${e.name}.`:n.membership.isInstance(r,e)?void 0:`value ${t.embedded.label} is not an instance of ${e.name}.`}if(t.kind!=="reference"||!t.ref)return`value is not a reference; sh:class requires an instance of ${e.name}.`;let o=t.subject;return o?n.membership.isInstance(G(o),e)?void 0:`value ${l(t.ref)} is not an instance of ${e.name}.`:`value ${l(t.ref)} does not resolve in this scope (sh:class ${e.name}).`}function Pi(n,e,t){if(!e.node)return;let o=new Set([...n.properties.map(i=>l(i.path)),...n.ignoredProperties.map(i=>l(i))]),r=new Set;for(let i of e.node.statement){let d=no(i);if(!d)continue;let s=l(d.subject);o.has(s)||r.has(s)||(r.add(s),t.push(je(n,e,Ce,`'${e.label}' carries undeclared property '${d.subject.name}' (closed shape).`,{resultPath:d.subject})))}for(let i of e.node.unresolvedPredicates)r.has(i.key)||(r.add(i.key),t.push(je(n,e,Ce,`'${e.label}' carries unresolvable property '${i.key}' (closed shape).`,{value:i.key})))}var xi="1.1.0",_i=new Set([se,q,B].map(n=>n.name));async function ao(n){let e=new Q(n.repository),t=e.imports(),o=n.result.results.some(a=>_i.has(a.constraintComponent.name))?"1.2.0":xi,r=t.ensure(te,re,o,"sh"),i=(a,u)=>a&&a.version&&typeof a.version.major=="number"?`${t.ensure(a.publisher,a.package_,V(a.version),a.package_)}.${a.name}`:u,d={},s=[];return n.result.results.forEach((a,u)=>{let c=`result-${u+1}`;s.push(c);let p={type:`${r}.ValidationResult`,[`${r}.focusNode`]:i(a.focusUri,a.focusNode),[`${r}.resultMessage`]:a.message,[`${r}.resultSeverity`]:`${r}.${a.severity}`,[`${r}.sourceConstraintComponent`]:`${r}.${a.constraintComponent.name}`};a.resultPath&&(p[`${r}.resultPath`]=i(a.resultPath,l(a.resultPath))),a.sourceShapeUri&&(p[`${r}.sourceShape`]=i(a.sourceShapeUri,a.sourceShape)),a.valueRef?p[`${r}.value`]=i(a.valueRef,l(a.valueRef)):a.value!==void 0&&(p[`${r}.value`]=a.value),d[c]=p}),d.report={type:`${r}.ValidationReport`,[`${r}.conforms`]:n.result.conforms,...s.length>0?{[`${r}.result`]:s}:{}},e.buildContentAddressed({publisher:n.publisher,book:t,body:d,...n.header!==void 0?{header:n.header}:{},contentHashProperty:"contentHash"})}import{VersionOperator as Cs}from"@kanonak-protocol/types/document/models/enums";import{spawn as wi}from"child_process";var co=12e4,Ki=4096,Y=class{argv;interactive;timeoutMs;stderr;now;constructor(e){this.argv=uo(e.command),this.interactive=e.interactive??!1,this.timeoutMs=e.timeoutMs??co,this.stderr=e.stderr??process.stderr,this.now=e.nowSeconds??(()=>Date.now()/1e3)}get command(){return this.argv.join(" ")}async get(e){let t=await this.run("get",this.wireRequest("get",e)),o=Oe(e,t,this.now());if(!o.ok)throw new N(`credential helper '${this.command}' answered get for ${e.resource} outside the protocol (${o.problem}): ${o.message}`);return o.answer}async erase(e){let t=await this.run("erase",{...this.wireRequest("erase",e),scope:e.scope}),o=Ie(t);if(!o.ok)throw new N(`credential helper '${this.command}' answered erase for ${e.resource} outside the protocol (${o.problem}): ${o.message}`)}wireRequest(e,t){let o={version:Le,operation:e,resource:t.resource,method:t.method};return t.challenges&&(o.challenges=t.challenges),o.interactive=this.interactive,o}run(e,t){let o=`credential helper '${this.command}' ${e}`;return new Promise((r,i)=>{let d=!1,s=f=>{d||(d=!0,f())},a;try{a=wi(this.argv[0],[...this.argv.slice(1),e],{stdio:["pipe","pipe","pipe"],shell:!1,windowsHide:!0})}catch(f){i(so(o,f));return}let u=[],c="",p=!1,m=setTimeout(()=>{p=!0,a.kill()},this.timeoutMs);a.stdout.on("data",f=>u.push(f)),a.stderr.on("data",f=>{this.stderr.write(f),c=(c+f.toString("utf8")).slice(-Ki)}),a.on("error",f=>{clearTimeout(m),s(()=>i(so(o,f)))}),a.on("close",(f,A)=>{clearTimeout(m);let v=c.trim()?`: ${c.trim()}`:"";if(p){s(()=>i(new N(`${o} did not finish within ${Math.round(this.timeoutMs/1e3)}s${v}`)));return}if(f!==0){let w=f!==null?`exit ${f}`:`signal ${A}`;s(()=>i(new N(`${o} failed (${w})${v}`)));return}let U=Buffer.concat(u).toString("utf8").trim();try{let w=JSON.parse(U);s(()=>r(w))}catch{s(()=>i(new N(`${o} exited 0 without printing one JSON answer${v}`)))}}),a.stdin.on("error",()=>{}),a.stdin.end(`${JSON.stringify(t)}
2
- `)})}};function uo(n){let e=n.trim().split(/\s+/).filter(t=>t!=="");if(e.length===0)throw new Error("the credential helper command is empty");return e}function so(n,e){let t=e.code,o="";return t==="ENOENT"&&(o=" (not found: give its path, or put it on PATH)"),t==="EINVAL"&&process.platform==="win32"&&(o=" (a .cmd or .bat file cannot run without a shell: configure an executable, e.g. `node path/to/helper.js`)"),new N(`${n} could not be started: ${e.message}${o}`)}import{existsSync as Ni,readFileSync as Li}from"fs";import{homedir as Oi}from"os";import{join as Ii}from"path";var He="KANONAK_CREDENTIAL_HELPER";function lo(){return Ii(Oi(),".kanonak","config.json")}function Ai(n={}){let e=n.env??process.env,t=n.configPath??lo(),o=Vi(e,t);if(o){let i=Object.keys(e).filter(d=>(d===de||d.startsWith(`${de}_`))&&(e[d]??"").trim()!=="").sort();if(i.length>0)throw new Error(`A credential helper is configured (${o.source}: ${o.command}) and so is ${i.join(", ")}. Configure one or the other.`);return new Y({command:o.command,interactive:n.interactive??!1})}let r={env:e};return n.discovery&&(r.discovery=n.discovery),new Ae(r)}function Vi(n,e){let t=(n[He]??"").trim();if(t)return{command:t,source:He};if(!Ni(e))return;let o;try{o=JSON.parse(Li(e,"utf-8"))}catch(i){throw new Error(`${e} is not valid JSON: ${i.message}`)}if(typeof o!="object"||o===null||Array.isArray(o))throw new Error(`${e} must hold a JSON object`);let r=o.credentialHelper;if(r!==void 0){if(typeof r!="string"||r.trim()==="")throw new Error(`"credentialHelper" in ${e} must be a non-empty command line`);return{command:r.trim(),source:e}}}var C="kanonak.org",_="view",po="core-kanonak",$i={publisher:C,package_:_,name:"rootView"},Ui={publisher:C,package_:_,name:"bind"},Mi={publisher:C,package_:_,name:"produces"},ji={publisher:C,package_:_,name:"projections"},Di={publisher:C,package_:_,name:"where"},Hi={publisher:C,package_:_,name:"value"},Fi={publisher:C,package_:_,name:"as"},me=class{constructor(e,t=new H){this.repository=e;this.parser=t;this.objectParser=new D(this.parser),this.builder=new Q(this.repository,this.parser,this.objectParser)}repository;parser;objectParser;builder;async materialize(e,t={}){let o=await this.objectParser.parseKanonaks(this.repository),r=this.resolveView(o,e),i=S(r,Ui);if(!i)throw new Error(`View ${r.namespace}/${r.name} declares no view.bind; cannot materialize.`);let d=S(r,Mi);if(!d)throw new Error(`View ${r.namespace}/${r.name} is a selection view (no view.produces). In-graph materialization of selection views is not yet supported \u2014 declare a view.produces output class to reshape the result.`);let s=Ti(r),a=fo(o,C,po),u=fo(o,C,_),c=this.builder.imports(),p=c.ensure(C,po,a,"ck"),m=c.ensure(C,_,u,"v"),f=c.ref(d),A=new Mn(this.repository,this.parser,this.objectParser),v=new Un(A,o),U=this.readProjections(o,r),w=Bi(r,Di),J=this.findInstances(o,i,await this.reason(t)),h={},K=new Set;for(let Z of J){if(!await this.passesWhere(v,o,w,Z))continue;let he={type:f};for(let Te of U){let ho=await this.evaluateValue(v,o,Te.value,Z),We=this.builder.serializeValue(mo(ho),c);We!==void 0&&(he[c.ref(Te.as)]=We)}let Fe=k(Z);Fe&&(he[`${m}.derivedFrom`]=c.ref(Fe)),h[this.rowName(Z,K)]=he}let g={};t.resolvedAt&&(g[`${p}.resolvedAt`]=t.resolvedAt),t.invocationId&&(g[`${p}.id`]=t.invocationId);let P=await this.builder.buildContentAddressed({publisher:s,book:c,body:h,contentHashProperty:`${p}.contentHash`,header:g});return{yaml:P.yaml,contentHash:P.contentHash,packageName:P.packageName,publisher:P.publisher,rowCount:P.resourceCount}}resolveView(e,t){let o=x(e,t);if(!o)throw new Error(`View ${t.publisher}/${t.package_}/${t.name} not found in the catalog.`);let r=S(o,$i);if(r){let i=x(e,r);if(!i)throw new Error(`ViewPackage ${t.name} names rootView ${r.name}, which is not in the catalog.`);return i}return o}readProjections(e,t){let o=[];for(let r of ye(t,ji)){let i=r instanceof L?r:r instanceof O?x(e,r.subject):void 0;if(!i)continue;let d=F(i,Hi),s=S(i,Fi);d&&s&&o.push({value:d,as:s})}return o}async reason(e){return new z({profile:e.reasoningProfile??"owl-rl-classification"}).reason(this.repository)}findInstances(e,t,o){let r=qi(e),i=[],d=new Set;for(let s of o.getInstancesOfClass(t)){if(d.has(s))continue;d.add(s);let a=r.get(s);a&&i.push(a)}return i.sort((s,a)=>{let u=T(k(s)),c=T(k(a));return u<c?-1:u>c?1:0}),i}async passesWhere(e,t,o,r){for(let i of o){let d=await this.evaluateValue(e,t,i,r);if(!Gi(d))return!1}return!0}async evaluateValue(e,t,o,r){let i=$n(o,"view-projection",{catalog:t,depth:0}),d=new Map([["input",r]]);return e.evaluate(i,d)}rowName(e,t){let o=Ne(e.name)||"row",r=o,i=2;for(;t.has(r);)r=`${o}-${i++}`;return t.add(r),r}};function mo(n){return Ke(n)?n.value:Array.isArray(n)?n.map(mo):n}function Ti(n){let e=k(n);if(!e)throw new Error(`Could not derive a publisher from view ${n.namespace}/${n.name}.`);return e.publisher}function fo(n,e,t){let o=Wi(n,e,t);if(!o)throw new Error(`Package ${e}/${t} is not in the catalog; it must be importable to materialize a view.`);return o}function Wi(n,e,t){let o;for(let r of n){if(!(r instanceof y))continue;let i=k(r);!i||i.publisher!==e||i.package_!==t||!i.version||(!o||ee(i.version,o)>0)&&(o=i.version)}return o?V(o):void 0}function qi(n){let e=new Map,t=new Map;for(let o of n){if(!(o instanceof y))continue;let r=k(o);if(!r||!r.version)continue;let i=T(r),d=t.get(i);(!d||ee(r.version,d)>0)&&(t.set(i,r.version),e.set(i,o))}return e}function Bi(n,e){let t=F(n,e);return t?[t]:ye(n,e).filter(o=>o instanceof L)}function Gi(n){return n===!0?!0:n===!1||n===void 0||n===null?!1:typeof n=="string"?n.length>0:typeof n=="number"?n!==0:Ke(n)?n.value.length>0:Array.isArray(n)?n.length>0:!!n}export{dr as AmbiguousReferenceRule,ot as BooleanStatement,Mr as CANONICAL_FORM_VERSION,Qr as CREDENTIAL_EXPIRY_SKEW_SECONDS,He as CREDENTIAL_HELPER_ENV,Le as CREDENTIAL_HELPER_PROTOCOL_VERSION,co as CREDENTIAL_HELPER_TIMEOUT_MS,$ as Carrier,hr as ClassDefinitionRule,or as ClassHierarchyCycleRule,_o as CompositeKanonakDocumentRepository,N as CredentialError,qr as DEFAULT_CONSENT_BINDING_PARAM,Qo as DefinedKanonak,Ar as DiamondNameClashRule,kr as DisplayLensScopeRule,xo as DocumentLocation,xt as EdgeType,L as EmbeddedKanonak,Zt as EmbeddedKanonakTypeRule,rt as EmbeddedStatement,oi as EntitlementDeniedError,ti as EntitlementProducer,Y as ExecCredentialProvider,Po as FileSystemKanonakDocumentRepository,Ot as GitIgnoreFilter,_t as GraphBuilder,To as HttpKanonakDocumentRepository,Be as INTEGRITY_PREFIX,Dr as ImportBook,er as ImportExistenceRule,Se as InMemoryKanonakDocumentRepository,Ao as KANONAK_USER_AGENT,zo as Kanonak,At as KanonakDocumentPositions,No as KanonakHttpError,D as KanonakObjectParser,Vr as KanonakObjectValidator,H as KanonakParser,Xo as KanonakUri,jt as KanonakUriBuilder,Dt as KanonakUrlResolver,kt as KanonakVocabulary,Rr as LINE_STYLES,Gt as LinkTargetRule,it as ListStatement,Yo as LiteralKanonak,Wo as LocalFirstRepository,qo as LockAwareRepository,Nr as LookBandPathRule,_r as LookRenderer,yr as LookSemanticSvgPathRule,Sr as MarkdownLinkRule,at as MarkdownStatement,sr as NamespaceImportCycleRule,zt as NamespacePrefixRule,Pt as NodeType,nt as NumberStatement,Br as OAuthDiscovery,Nt as OWL_RL_CLASSIFICATION_RULES,lr as ObjectPropertyValueValidationRule,Wt as OntologyValidationError,Ft as OntologyValidationResult,Ir as OwlOneOfRule,Q as PackageBuilder,Jt as PackageHeaderRule,Zr as ProducerRepository,pr as PropertyDomainRule,tr as PropertyHierarchyCycleRule,fr as PropertyKindRangeConsistencyRule,It as PropertyMetadata,ur as PropertyRangeReferenceRule,rr as PropertyRangeRequiredRule,Xt as PropertyTypeSpecificityRule,Do as PublisherConfigResolver,Ho as PublisherIndex,Kt as RDFS_RULES,z as Reasoner,Lt as ReasoningResult,O as ReferenceKanonak,tt as ReferenceStatement,Ko as RepositoryFactory,mr as ReservedNameShadowRule,Qt as ResourceNamingRule,st as ResourceResolver,yt as ResourceTypeClassifier,re as SHACL_PACKAGE,te as SHACL_PUBLISHER,W as SH_NODE_SHAPE,ie as SH_PROPERTY_SHAPE,Xe as SH_SHAPE,Zo as ScalarStatement,Kr as SequenceNarrativeRule,Or as ShaclShapeRule,Jo as Statement,et as StringStatement,ir as SubClassOfReferenceRule,ar as SubPropertyOfReferenceRule,y as SubjectKanonak,Yt as SubjectKanonakTypeRequiredRule,de as TOKEN_ENV,Ae as TokenCredentialProvider,wt as TripleStore,gr as TxExpressionCompilesRule,Lr as TxExpressionPathRule,ct as TypeResolver,Er as URI_DISPLAY_LABEL,br as URI_DISPLAY_SUMMARY,cr as UnresolvedPredicateRule,nr as UnresolvedReferenceRule,Bt as ValidationCache,qt as ValidationContext,Tt as ValidationSeverity,Cs as VersionOperator,me as ViewMaterializer,ei as allowAllPolicy,Uo as assertHttpsUrl,Fo as assertPackageIdentity,Go as buildLocalFirstRepository,xr as buildOntologyModel,ao as buildReportPackageAsync,ue as buildShapesModel,ht as builtinHomePackages,St as builtinUri,$r as canonicalForm,Ur as canonicalHash,we as carrierOf,Gr as checkCredentialAnswer,Oe as checkHelperAnswer,Ie as checkHelperEraseAnswer,Bo as collectKanonakFiles,ee as compareVersions,Hn as computeIntegrity,Qe as computeIntegrityAsync,jr as contentAddressedName,G as contextTypesOf,Xr as createCredentialedFetch,go as createVersion,Ai as credentialProviderFromConfig,Oo as describeResponse,eo as evaluateConformance,vt as extractMarkdownLinks,Jr as findDerivation,Rt as findMalformedReferences,$t as findMarkdownLinkAt,Ue as foldFlagsIntoPattern,ut as formatKanonakAddress,V as formatVersion,wo as getGlobalCachePath,$o as getKanonakUserAgent,Lo as httpError,bo as isCompatibleVersion,Co as isMajorCompatible,Et as isPropertySubject,Mo as kanonakFetch,jn as loadLockFile,qe as lockedVersion,pe as lowerConstraint,pt as makeUriKey,Wr as narrowestScope,ni as noopMeter,Hr as normalizeHost,dt as parseKanonakAddress,Ge as parseLockFile,Fr as parseScope,Eo as parseVersionString,Vt as parseWithPositions,zr as parseWwwAuthenticate,vo as pickHighestDocument,bt as propertiesInScope,gt as propertyClassOf,vr as readSequenceConnectors,Ht as referenceSpelling,M as referenceUris,Cr as resolveDisplayValue,Ct as resolvePropertyStep,Io as retryAfterSecondsOf,Ne as sanitizeName,Ro as satisfiesVersionOperator,Dn as saveLockFile,Tr as scopeContains,Tn as scopeFromCatalog,Wn as scopeFromDocumentAsync,Fn as scopeFromRepositoryAsync,ze as serializeLockFile,jo as setKanonakFetchRetries,Vo as setKanonakUserAgent,Mt as sourceSymbolAt,Ut as sourceSymbols,uo as splitCommandLine,Pe as subjectAddress,k as subjectUri,xe as superClassChain,wr as supportedBandKeys,Yr as tokenEnvKeyFor,ft as tripleKey,lt as typeReferenceUris,T as uriKey,mt as uriTriple,lo as userConfigPath,ce as valuesOf,So as versionOperatorFromChar,ko as versionOperatorToChar,yo as versionsEqual,_e as walkDefinedKanonaks,Pr as walkSequence};
1
+ import{a as Ut,b as $t,c as Mt,d as jt,e as z}from"./chunk-AAYMTPG7.js";import{a as Bn,b as Gn,c as zn}from"./chunk-BDTJIUS4.js";import{a as Ot,b as It,c as Vt,d as Qr,e as Xr,f as Yr,g as Jr,h as Zr,i as ei,j as Ue,k as ni,l as $e,m as Me,n as oi,o as ti,p as ri,q as le,r as ii,s as je}from"./chunk-MSOUPUUB.js";import{a as ai}from"./chunk-5AMN6MW7.js";import{a as Wr,b as qr,c as Br,d as Q,e as Gr,f as zr,g as Ve,h as si,i as ci,j as di,k as ui,l as li}from"./chunk-7TNZ7ICK.js";import{a as Lo,b as Ao,c as Oo,d as Io,e as Vo,f as nt,g as ot,h as tt,i as rt}from"./chunk-K76UUREI.js";import{a as Do,b as To,c as Ho,d as Fo,e as Wo,f as qo,g as ye,h as Ee,i as be,j as Qo,k as Xo,m as Yo,n as Ye,o as Je,p as Ze,q as en,r as nn,s as on,t as Jo,u as et}from"./chunk-Z2444SWM.js";import{a as Tt,b as Ht,c as Ft,d as Wt,e as qt,f as Bt}from"./chunk-FB5QKDNM.js";import{a as Gt,b as Qt}from"./chunk-X4V6DEZL.js";import{a as Zo}from"./chunk-SC5M74NM.js";import{A as Cr,B as Rr,C as Pr,D as vr,E as _r,F as xr,G as $r,H as Mr,I as jr,J as Dr,K as Tr,L as Hr,M as Fr,a as Xt,b as Yt,c as Jt,d as Zt,e as er,f as nr,g as or,h as tr,i as rr,j as ir,k as ar,l as sr,m as cr,n as dr,o as ur,p as lr,q as pr,r as fr,s as mr,t as hr,u as gr,v as kr,w as Sr,x as yr,y as Er,z as br}from"./chunk-Q57XCPAQ.js";import"./chunk-A224OOBZ.js";import{c as Fn,d as wr,e as Kr,f as Nr,g as Lr,i as Ar,j as Or,m as Ir,o as Ie,q as Wn,r as qn,t as Vr,u as Ur}from"./chunk-GXEKJFXG.js";import"./chunk-QHABFCRC.js";import{a as Uo,b as $o,c as Mo,d as jo,e as N}from"./chunk-5FVUBF7N.js";import{a as Se}from"./chunk-WXXZOJ4O.js";import{a as Ae,g as U,h as Oe,i as Lt,j as At,k as D}from"./chunk-LKJVNKCN.js";import{a as T}from"./chunk-5ZRVFYCP.js";import{a as zt}from"./chunk-PEJALHXK.js";import{$ as ce,A as kn,B as Sn,C as yn,D as En,E as bn,F as Cn,G as Rn,H as Pn,I as vn,J as _n,K as _e,L as xn,M as wn,N as Kn,O as Nn,P as Ln,Q as An,R as On,S as In,T as Vn,U as Un,V as $n,W as Mn,X as jn,Y as Dn,Z as xe,_ as Tn,a as kt,aa as we,b as St,ba as Ke,c as F,ca as de,d as Et,da as q,e as bt,ea as B,g as Ct,h as ie,ha as Rt,i as ae,ia as Pt,j as tn,k as W,ka as vt,l as se,m as rn,ma as _t,n as an,na as k,o as Pe,oa as Le,p as sn,pa as xt,q as cn,qa as wt,r as dn,s as un,t as ve,ta as Kt,u as ln,ua as Nt,v as pn,va as G,w as fn,x as mn,y as hn,z as gn}from"./chunk-WXUMROTA.js";import{A as j,B as R,C as re,D as g,E as H,F as Re,G as ue,H as Ne,J as Hn,a as it,b as at,c as S,d as L,e as A,f as st,g as ct,h as dt,i as ut,j as lt,k as pt,l as ft,m as mt,n as ht,o as gt,p as l,s as yt,t as M,u as Ce,v as te,x as _}from"./chunk-PC3MYDGL.js";import"./chunk-F67UH4FD.js";import{a as Co,b as Ro,c as oe,d as Po,e as V,f as vo,g as _o,h as xo,i as wo,j as Ko,k as No,l as Go,m as zo}from"./chunk-GGK6A6QK.js";import{a as Bo}from"./chunk-FUUTGGJS.js";import{a as Dt}from"./chunk-ODIECDN7.js";async function Qn(n){let e=await new D().parseKanonaks(n),t=await new z().reason(n);return{kind:"merged",catalog:e,reasoning:t}}function Xn(n,e){return{kind:"merged",catalog:n,reasoning:e}}async function Yn(n,e){let t=e??new Se(new T);return{kind:"standalone",catalog:await new D().parseKanonaks(new Hn(n,t))}}function O(n){return typeof n=="number"?n:void 0}function pi(n){if(!n)return;let e=l(n);if(e===l(Pn))return"IRI";if(e===l(vn))return"BlankNode";if(e===l(_n))return"Literal"}function Zn(n){if(!n)return;let e=l(n);if(e===l(xn))return"Violation";if(e===l(wn))return"Warning";if(e===l(Kn))return"Info"}function eo(n,e,t,o){let r=g(e,Pe);if(!r)return;let i={path:r},d=O(R(e,sn)),s=O(R(e,cn));d!==void 0&&(i.minCount=d),s!==void 0&&(i.maxCount=s);let a=O(R(e,fn)),u=O(R(e,mn));a!==void 0&&(i.minLength=a),u!==void 0&&(i.maxLength=u);let c=O(R(e,hn)),p=O(R(e,gn));c!==void 0&&(i.minInclusive=c),p!==void 0&&(i.maxInclusive=p);let m=re(e,ln);if(m!==void 0){let h=re(e,pn);i.pattern=h!==void 0?{regex:m,flags:h}:{regex:m}}if(j(e,ve)){let h=[],K=[];for(let{item:y}of Ce(e,ve))"literal"in y?h.push(y.value):y instanceof A&&K.push(y.subject);h.length>0&&(i.inValues=h),K.length>0&&(i.inRefs=K)}let f=g(e,dn);f&&(i.datatype=f);let I=g(e,un);I&&(i.classRef=I);let P=pi(g(e,Rn));P&&(i.nodeKind=P);let $=g(e,Tn);if($&&(i.hasValue=$),j(e,ce)||j(e,we)||j(e,Ke)){let h={},K=O(R(e,we)),y=O(R(e,Ke));K!==void 0&&(h.minCount=K),y!==void 0&&(h.maxCount=y);let v=fi(n,e,o);"problem"in v?h.problem=v.problem:h.shape=v.shape,i.qualified=h}let w=re(e,kn);w!==void 0&&(i.message=w);let ee=Zn(g(e,_e))??t;return ee&&(i.severity=ee),i}function fi(n,e,t){let o=H(e,ce);if(o)return Jn(n,o,void 0,t);let r=g(e,ce);if(!r)return{problem:"sh:qualifiedValueShape is missing"};let i=l(r);if(t.has(i))return{problem:`sh:qualifiedValueShape '${r.name}' leads back to itself (a cycle through named shapes)`};let d=_(n,r);return d?Jn(n,d,i,t):{problem:`sh:qualifiedValueShape '${r.name}' does not resolve`}}function Jn(n,e,t,o){let r=t?new Set([...o,t]):o,i=te(e,W);if((te(e,se)||j(e,Pe))&&!i){let a=eo(n,e,void 0,r);return a?{shape:{kind:"property",constraint:a}}:{problem:"the qualified property shape has no sh:path"}}return e instanceof S&&!i?{problem:`sh:qualifiedValueShape '${e.name}' is not a shape`}:{shape:{kind:"node",shape:no(n,e,r)}}}function no(n,e,t){let o=Zn(g(e,_e)),r={name:e instanceof S?e.name:"(inline shape)",uri:e instanceof S?k(e):void 0,targetClass:g(e,rn),targetNodes:M(e,Sn),targetSubjectsOf:M(e,yn),targetObjectsOf:M(e,En),closed:R(e,bn)===!0,ignoredProperties:[],severity:o,properties:[]};r.ignoredProperties.push(...M(e,Cn));for(let{item:i}of Ce(e,an)){let d;if(i instanceof L?d=i:i instanceof A&&(d=_(n,i.subject)),!d)continue;let s=eo(n,d,o,t);s&&r.properties.push(s)}return r}function pe(n){let e=[];for(let t of n){if(!(t instanceof S)||!te(t,W))continue;let o=k(t);e.push(no(n,t,new Set(o?[l(o)]:[])))}return e}var b="kanonak.org/transformations",X="values";var fe="allowed",Te="expected",E=n=>({type:`${b}/VarRef`,varName:n}),De=n=>({type:`${b}/IntegerLiteral`,integerLiteral:n}),mi=n=>({type:`${b}/DecimalLiteral`,decimalLiteral:n}),oo=n=>Number.isInteger(n)?De(n):mi(n),to=n=>({type:`${b}/Count`,source:n}),ro=(n,e)=>({type:`${b}/GreaterThanOrEqual`,compareLeft:n,compareRight:e}),io=(n,e)=>({type:`${b}/LessThanOrEqual`,compareLeft:n,compareRight:e});function He(n,e){if(!e||e.length===0)return n;let t=new Set(["i","m","s"]),o=[...new Set(e.split(""))];if(o.filter(i=>!t.has(i)).length>0)throw new Error(`sh:flags '${e}' is outside the pinned regex subset (supported: i, m, s)`);return`(?${o.sort().join("")})${n}`}function me(n){let e=[];return n.minCount!==void 0&&e.push({component:"minCount",per:"node",expr:ro(to(E(X)),De(n.minCount))}),n.maxCount!==void 0&&e.push({component:"maxCount",per:"node",expr:io(to(E(X)),De(n.maxCount))}),n.hasValue!==void 0&&e.push({component:"hasValue",per:"node",expr:{type:`${b}/Contains`,haystack:E(X),needle:E(Te)}}),(n.inValues!==void 0||n.inRefs!==void 0)&&e.push({component:"in",per:"value",expr:{type:`${b}/Contains`,haystack:E(fe),needle:E("v")}}),n.pattern!==void 0&&e.push({component:"pattern",per:"value",expr:{type:`${b}/Matches`,matchSource:E("v"),pattern:He(n.pattern.regex,n.pattern.flags)}}),n.minLength!==void 0&&e.push({component:"minLength",per:"value",expr:{type:`${b}/Matches`,matchSource:E("v"),pattern:`(?s)^.{${n.minLength},}$`}}),n.maxLength!==void 0&&e.push({component:"maxLength",per:"value",expr:{type:`${b}/Matches`,matchSource:E("v"),pattern:`(?s)^.{0,${n.maxLength}}$`}}),n.minInclusive!==void 0&&e.push({component:"minInclusive",per:"value",expr:ro(E("v"),oo(n.minInclusive))}),n.maxInclusive!==void 0&&e.push({component:"maxInclusive",per:"value",expr:io(E("v"),oo(n.maxInclusive))}),e}import{evaluate as gi,ExpressionError as ki}from"@kanonak-protocol/expression";function so(n,e){let t=Si(e)?e:pe(e),o=[],r=n.catalog.filter(s=>s instanceof S).map(he),i=new Map;yi(r,i);let d={scope:n,membership:new Fe(n),embeddedFocus:i};for(let s of t)for(let a of Ei(d,s,r))uo(d,s,a,o);return{conforms:!o.some(s=>s.severity==="Violation"),results:o}}function Si(n){return n.length>0&&!(n[0]instanceof Object&&"statement"in n[0])&&typeof n[0].name=="string"&&"properties"in n[0]}function co(n){let e=n.predicate;return e instanceof A?e:void 0}function he(n){return{node:n,key:Ne(n),uri:k(n),label:n.name}}function qe(n,e){return{node:n,key:e,label:e.includes("#")?e.slice(e.indexOf("#")):e}}function yi(n,e){Ae(n.map(t=>t.node),({kanonak:t,address:o})=>{t instanceof L&&!e.has(t)&&e.set(t,qe(t,o))})}var Fe=class{constructor(e){this.scope=e}scope;ancestors=new Map;isInstance(e,t){let o=l(t);return e.some(r=>l(r)===o||this.ancestorsOf(r).has(o))}ancestorsOf(e){let t=e.version&&typeof e.version.major=="number"?`${l(e)}@${V(e.version)}`:l(e),o=this.ancestors.get(t);return o||(o=this.scope.reasoning?new Set(this.scope.reasoning.getSuperclasses(e)):new Set(Le(this.scope.catalog,e).map(r=>l(r))),this.ancestors.set(t,o)),o}};function Ei(n,e,t){let{scope:o}=n,r=new Map,i=s=>{r.set(s.key,s)},d=()=>[...t,...n.embeddedFocus.values()];if(e.targetClass){let s=e.targetClass;for(let a of d())n.membership.isInstance(G(a.node),s)&&i(a)}for(let s of e.targetNodes){let a=_(o.catalog,s);a instanceof S&&i(he(a))}for(let s of e.targetSubjectsOf){let a=l(s);for(let u of d())u.node.statement.some(c=>{let p=co(c);return p&&l(p.subject)===a})&&i(u)}for(let s of e.targetObjectsOf)for(let a of d())for(let u of ue(a.node,s,o.catalog,a.key))u.kind==="subject"?i(he(u.node)):u.kind==="embedded"&&i(n.embeddedFocus.get(u.node)??qe(u.node,u.address));return[...r.values()]}function bi(n,e,t){return e.node?ue(e.node,t,n.scope.catalog,e.key).map(o=>Ci(n,o)):[]}function Ci(n,e){switch(e.kind){case"subject":return{kernel:{ref:l(e.uri)},kind:"reference",ref:e.uri,subject:e.node};case"unresolved":return{kernel:{ref:l(e.uri)},kind:"reference",ref:e.uri};case"embedded":{let t=n.embeddedFocus.get(e.node)??qe(e.node,e.address);return{kernel:{ref:t.key},kind:"embedded",embedded:t}}case"literal":return typeof e.value=="boolean"?{kernel:e.value?1:0,kind:"boolean",literal:e.value}:{kernel:e.value,kind:typeof e.value=="number"?"number":"string",literal:e.value}}}function uo(n,e,t,o){for(let r of e.properties)po(n,e,t,r,o);e.closed&&Oi(e,t,o)}function We(n,e,t,o,r={},i){return{focusNode:e.key,focusUri:e.uri,constraintComponent:t,severity:i??lo(n),message:o,sourceShape:n.name,sourceShapeUri:n.uri,...r}}function lo(n){return n.severity??"Violation"}var Ri={minCount:Nn,maxCount:Ln,hasValue:de,in:In,pattern:Vn,minLength:Un,maxLength:$n,minInclusive:Mn,maxInclusive:jn};function po(n,e,t,o,r){let i=bi(n,t,o.path),d=o.severity??lo(e),s=o.path.name,a=[...(o.inValues??[]).map(c=>typeof c=="boolean"?c?1:0:c),...(o.inRefs??[]).map(c=>({ref:l(c)}))],u=(c,p,m)=>{let f=We(e,t,c,o.message??p,{resultPath:o.path,value:m?.literal,valueRef:m?.ref},d);return r.push(f),f};for(let c of me(o)){let p=Ri[c.component];if(c.per==="node"){let m={[X]:i.map(f=>f.kernel),[fe]:a};o.hasValue&&(m[Te]={ref:l(o.hasValue)}),ao(c,m)||u(p,Pi(c,s,o,i.length));continue}for(let m of i){if((c.component==="pattern"||c.component==="minLength"||c.component==="maxLength")&&m.kind!=="string"){u(p,`'${s}' value is not a string; ${c.component} applies to string values.`,m);continue}ao(c,{v:m.kernel,[fe]:a})||u(p,Ki(c,s,o,m),m)}}if(o.nodeKind)for(let c of i)Ni(o.nodeKind,c)||u(Dn,`'${s}' value is ${c.kind}; nodeKind requires ${o.nodeKind}.`,c);if(o.datatype)for(let c of i){let p=Li(o.datatype,c);p&&u(An,`'${s}' ${p}`,c)}if(o.classRef)for(let c of i){let p=Ai(n,o.classRef,c);p&&u(On,`'${s}' ${p}`,c)}o.qualified&&vi(n,o,i,s,u)}function Pi(n,e,t,o){switch(n.component){case"minCount":return`'${e}' has ${o} value(s); minCount is ${t.minCount}.`;case"maxCount":return`'${e}' has ${o} value(s); maxCount is ${t.maxCount}.`;case"hasValue":return`'${e}' has no value equal to ${t.hasValue?l(t.hasValue):"(unset)"}.`;default:return`'${e}' violates ${n.component}.`}}function vi(n,e,t,o,r){let i=e.qualified,d=i.maxCount!==void 0?B:q,s=(u,c)=>{fo.add(r(d,u,c))};if(!i.shape){s(`'${o}' qualified value shape cannot be evaluated: ${i.problem??"it could not be built"}.`);return}let a=0;for(let u of t){let c=u.ref?l(u.ref):u.embedded?u.embedded.label:JSON.stringify(u.literal),p=_i(n,u);if(!p){s(`'${o}' value ${c} does not resolve in this scope; whether it conforms to the qualified shape cannot be decided.`,u);continue}let m=wi(n,i.shape,p);if(m.kind==="undecided"){s(`'${o}' value ${c}: whether it conforms to the qualified shape cannot be decided \u2014 ${m.reason}`,u);continue}m.kind==="conforms"&&a++}i.minCount!==void 0&&a<i.minCount&&r(q,`'${o}' has ${a} value(s) that conform to the qualified shape; qualifiedMinCount is ${i.minCount}.`),i.maxCount!==void 0&&a>i.maxCount&&r(B,`'${o}' has ${a} value(s) that conform to the qualified shape; qualifiedMaxCount is ${i.maxCount}.`)}function _i(n,e){switch(e.kind){case"reference":return e.subject?he(e.subject):void 0;case"embedded":return e.embedded;default:{let t=JSON.stringify(e.literal);return{key:t,label:t}}}}var xi={name:"(qualified value shape)",targetNodes:[],targetSubjectsOf:[],targetObjectsOf:[],closed:!1,ignoredProperties:[],properties:[]},fo=new WeakSet;function wi(n,e,t){let o=[];e.kind==="property"?po(n,xi,t,e.constraint,o):uo(n,e.shape,t,o);let r=o.find(i=>fo.has(i));return r?{kind:"undecided",reason:r.message}:o.length===0?{kind:"conforms"}:{kind:"fails"}}function Ki(n,e,t,o){let r=o.ref?l(o.ref):o.embedded?o.embedded.label:JSON.stringify(o.literal);switch(n.component){case"in":return`'${e}' value ${r} is not in the permitted set.`;case"pattern":return`'${e}' value ${r} does not match pattern ${t.pattern?.regex}.`;case"minLength":return`'${e}' value ${r} is shorter than minLength ${t.minLength}.`;case"maxLength":return`'${e}' value ${r} is longer than maxLength ${t.maxLength}.`;case"minInclusive":return`'${e}' value ${r} is below minInclusive ${t.minInclusive} (or not numeric).`;case"maxInclusive":return`'${e}' value ${r} is above maxInclusive ${t.maxInclusive} (or not numeric).`;default:return`'${e}' value ${r} violates ${n.component}.`}}function ao(n,e){let t=o=>{let r=o.varName;if(o.type==="kanonak.org/transformations/VarRef"&&typeof r=="string"&&r in e)return e[r];throw new ki(`Conformance lowering produced an unexpected leaf '${o.type}'`)};return gi(n.expr,void 0,t)===1}function Ni(n,e){switch(n){case"IRI":return e.kind==="reference";case"BlankNode":return e.kind==="embedded";case"Literal":return e.kind==="string"||e.kind==="number"||e.kind==="boolean"}}function Li(n,e){if(e.kind==="reference"||e.kind==="embedded")return`value is a ${e.kind}; sh:datatype requires a literal of ${n.name}.`;let t=Oe(n);if(t!==void 0)switch(t){case U.Boolean:return e.kind==="boolean"?void 0:`value is not a boolean (${n.name}).`;case U.Integer:return e.kind!=="number"?`value is not a number (${n.name}).`:Number.isInteger(e.literal)?void 0:`value is not an integer (${n.name}).`;case U.Decimal:case U.Double:case U.Float:return e.kind==="number"?void 0:`value is not a number (${n.name}).`;default:return e.kind==="string"?void 0:`value is not a string-carried literal (${n.name}).`}}function Ai(n,e,t){if(t.kind==="embedded"&&t.embedded?.node){let r=G(t.embedded.node);return r.length===0?`value ${t.embedded.label} has no type; sh:class requires an instance of ${e.name}.`:n.membership.isInstance(r,e)?void 0:`value ${t.embedded.label} is not an instance of ${e.name}.`}if(t.kind!=="reference"||!t.ref)return`value is not a reference; sh:class requires an instance of ${e.name}.`;let o=t.subject;return o?n.membership.isInstance(G(o),e)?void 0:`value ${l(t.ref)} is not an instance of ${e.name}.`:`value ${l(t.ref)} does not resolve in this scope (sh:class ${e.name}).`}function Oi(n,e,t){if(!e.node)return;let o=new Set([...n.properties.map(i=>l(i.path)),...n.ignoredProperties.map(i=>l(i))]),r=new Set;for(let i of e.node.statement){let d=co(i);if(!d)continue;let s=l(d.subject);o.has(s)||r.has(s)||(r.add(s),t.push(We(n,e,xe,`'${e.label}' carries undeclared property '${d.subject.name}' (closed shape).`,{resultPath:d.subject})))}for(let i of e.node.unresolvedPredicates)r.has(i.key)||(r.add(i.key),t.push(We(n,e,xe,`'${e.label}' carries unresolvable property '${i.key}' (closed shape).`,{value:i.key})))}var Ii="1.1.0",Vi=new Set([de,q,B].map(n=>n.name));async function mo(n){let e=new Q(n.repository),t=e.imports(),o=n.result.results.some(a=>Vi.has(a.constraintComponent.name))?"1.2.0":Ii,r=t.ensure(ie,ae,o,"sh"),i=(a,u)=>a&&a.version&&typeof a.version.major=="number"?`${t.ensure(a.publisher,a.package_,V(a.version),a.package_)}.${a.name}`:u,d={},s=[];return n.result.results.forEach((a,u)=>{let c=`result-${u+1}`;s.push(c);let p={type:`${r}.ValidationResult`,[`${r}.focusNode`]:i(a.focusUri,a.focusNode),[`${r}.resultMessage`]:a.message,[`${r}.resultSeverity`]:`${r}.${a.severity}`,[`${r}.sourceConstraintComponent`]:`${r}.${a.constraintComponent.name}`};a.resultPath&&(p[`${r}.resultPath`]=i(a.resultPath,l(a.resultPath))),a.sourceShapeUri&&(p[`${r}.sourceShape`]=i(a.sourceShapeUri,a.sourceShape)),a.valueRef?p[`${r}.value`]=i(a.valueRef,l(a.valueRef)):a.value!==void 0&&(p[`${r}.value`]=a.value),d[c]=p}),d.report={type:`${r}.ValidationReport`,[`${r}.conforms`]:n.result.conforms,...s.length>0?{[`${r}.result`]:s}:{}},e.buildContentAddressed({publisher:n.publisher,book:t,body:d,...n.header!==void 0?{header:n.header}:{},contentHashProperty:"contentHash"})}import{VersionOperator as Us}from"@kanonak-protocol/types/document/models/enums";import{spawn as Ui}from"child_process";var go=12e4,$i=4096,Y=class{argv;interactive;timeoutMs;stderr;now;constructor(e){this.argv=ko(e.command),this.interactive=e.interactive??!1,this.timeoutMs=e.timeoutMs??go,this.stderr=e.stderr??process.stderr,this.now=e.nowSeconds??(()=>Date.now()/1e3)}get command(){return this.argv.join(" ")}async get(e){let t=await this.run("get",this.wireRequest("get",e)),o=$e(e,t,this.now());if(!o.ok)throw new N(`credential helper '${this.command}' answered get for ${e.resource} outside the protocol (${o.problem}): ${o.message}`);return o.answer}async erase(e){let t=await this.run("erase",{...this.wireRequest("erase",e),scope:e.scope}),o=Me(t);if(!o.ok)throw new N(`credential helper '${this.command}' answered erase for ${e.resource} outside the protocol (${o.problem}): ${o.message}`)}wireRequest(e,t){let o={version:Ue,operation:e,resource:t.resource,method:t.method};return t.challenges&&(o.challenges=t.challenges),o.interactive=this.interactive,o}run(e,t){let o=`credential helper '${this.command}' ${e}`;return new Promise((r,i)=>{let d=!1,s=f=>{d||(d=!0,f())},a;try{a=Ui(this.argv[0],[...this.argv.slice(1),e],{stdio:["pipe","pipe","pipe"],shell:!1,windowsHide:!0})}catch(f){i(ho(o,f));return}let u=[],c="",p=!1,m=setTimeout(()=>{p=!0,a.kill()},this.timeoutMs);a.stdout.on("data",f=>u.push(f)),a.stderr.on("data",f=>{this.stderr.write(f),c=(c+f.toString("utf8")).slice(-$i)}),a.on("error",f=>{clearTimeout(m),s(()=>i(ho(o,f)))}),a.on("close",(f,I)=>{clearTimeout(m);let P=c.trim()?`: ${c.trim()}`:"";if(p){s(()=>i(new N(`${o} did not finish within ${Math.round(this.timeoutMs/1e3)}s${P}`)));return}if(f!==0){let w=f!==null?`exit ${f}`:`signal ${I}`;s(()=>i(new N(`${o} failed (${w})${P}`)));return}let $=Buffer.concat(u).toString("utf8").trim();try{let w=JSON.parse($);s(()=>r(w))}catch{s(()=>i(new N(`${o} exited 0 without printing one JSON answer${P}`)))}}),a.stdin.on("error",()=>{}),a.stdin.end(`${JSON.stringify(t)}
2
+ `)})}};function ko(n){let e=n.trim().split(/\s+/).filter(t=>t!=="");if(e.length===0)throw new Error("the credential helper command is empty");return e}function ho(n,e){let t=e.code,o="";return t==="ENOENT"&&(o=" (not found: give its path, or put it on PATH)"),t==="EINVAL"&&process.platform==="win32"&&(o=" (a .cmd or .bat file cannot run without a shell: configure an executable, e.g. `node path/to/helper.js`)"),new N(`${n} could not be started: ${e.message}${o}`)}import{existsSync as Mi,readFileSync as ji}from"fs";import{homedir as Di}from"os";import{join as Ti}from"path";function J(){return Ti(Di(),".kanonak","config.json")}function Z(n){if(!Mi(n))return;let e;try{e=JSON.parse(ji(n,"utf-8"))}catch(t){throw new Error(`${n} is not valid JSON: ${t.message}`)}if(typeof e!="object"||e===null||Array.isArray(e))throw new Error(`${n} must hold a JSON object`);return e}var Be="KANONAK_CREDENTIAL_HELPER";function Hi(n={}){let e=n.env??process.env,t=n.configPath??J(),o=Fi(e,t);if(o){let i=Object.keys(e).filter(d=>(d===le||d.startsWith(`${le}_`))&&(e[d]??"").trim()!=="").sort();if(i.length>0)throw new Error(`A credential helper is configured (${o.source}: ${o.command}) and so is ${i.join(", ")}. Configure one or the other.`);return new Y({command:o.command,interactive:n.interactive??!1})}let r={env:e};return n.discovery&&(r.discovery=n.discovery),new je(r)}function Fi(n,e){let t=(n[Be]??"").trim();if(t)return{command:t,source:Be};let o=Z(e)?.credentialHelper;if(o!==void 0){if(typeof o!="string"||o.trim()==="")throw new Error(`"credentialHelper" in ${e} must be a non-empty command line`);return{command:o.trim(),source:e}}}var Ge="KANONAK_PACKAGE_URL_TEMPLATE";function Wi(n={}){let e=n.env??process.env,t=n.configPath??J(),o=Z(t)?.packageUrlTemplates,r=o===void 0?{}:{...Ee(o,"packageUrlTemplates",t)},i=(e[Ge]??"").trim();return i&&(r[ye]=be(i,Ge,!0)),Object.keys(r).length>0?Object.freeze(r):void 0}var C="kanonak.org",x="view",So="core-kanonak",qi={publisher:C,package_:x,name:"rootView"},Bi={publisher:C,package_:x,name:"bind"},Gi={publisher:C,package_:x,name:"produces"},zi={publisher:C,package_:x,name:"projections"},Qi={publisher:C,package_:x,name:"where"},Xi={publisher:C,package_:x,name:"value"},Yi={publisher:C,package_:x,name:"as"},ge=class{constructor(e,t=new T){this.repository=e;this.parser=t;this.objectParser=new D(this.parser),this.builder=new Q(this.repository,this.parser,this.objectParser)}repository;parser;objectParser;builder;async materialize(e,t={}){let o=await this.objectParser.parseKanonaks(this.repository),r=this.resolveView(o,e),i=g(r,Bi);if(!i)throw new Error(`View ${r.namespace}/${r.name} declares no view.bind; cannot materialize.`);let d=g(r,Gi);if(!d)throw new Error(`View ${r.namespace}/${r.name} is a selection view (no view.produces). In-graph materialization of selection views is not yet supported \u2014 declare a view.produces output class to reshape the result.`);let s=Ji(r),a=yo(o,C,So),u=yo(o,C,x),c=this.builder.imports(),p=c.ensure(C,So,a,"ck"),m=c.ensure(C,x,u,"v"),f=c.ref(d),I=new qn(this.repository,this.parser,this.objectParser),P=new Wn(I,o),$=this.readProjections(o,r),w=na(r,Qi),ee=this.findInstances(o,i,await this.reason(t)),h={},K=new Set;for(let ne of ee){if(!await this.passesWhere(P,o,w,ne))continue;let ke={type:f};for(let Qe of $){let bo=await this.evaluateValue(P,o,Qe.value,ne),Xe=this.builder.serializeValue(Eo(bo),c);Xe!==void 0&&(ke[c.ref(Qe.as)]=Xe)}let ze=k(ne);ze&&(ke[`${m}.derivedFrom`]=c.ref(ze)),h[this.rowName(ne,K)]=ke}let y={};t.resolvedAt&&(y[`${p}.resolvedAt`]=t.resolvedAt),t.invocationId&&(y[`${p}.id`]=t.invocationId);let v=await this.builder.buildContentAddressed({publisher:s,book:c,body:h,contentHashProperty:`${p}.contentHash`,header:y});return{yaml:v.yaml,contentHash:v.contentHash,packageName:v.packageName,publisher:v.publisher,rowCount:v.resourceCount}}resolveView(e,t){let o=_(e,t);if(!o)throw new Error(`View ${t.publisher}/${t.package_}/${t.name} not found in the catalog.`);let r=g(o,qi);if(r){let i=_(e,r);if(!i)throw new Error(`ViewPackage ${t.name} names rootView ${r.name}, which is not in the catalog.`);return i}return o}readProjections(e,t){let o=[];for(let r of Re(t,zi)){let i=r instanceof L?r:r instanceof A?_(e,r.subject):void 0;if(!i)continue;let d=H(i,Xi),s=g(i,Yi);d&&s&&o.push({value:d,as:s})}return o}async reason(e){return new z({profile:e.reasoningProfile??"owl-rl-classification"}).reason(this.repository)}findInstances(e,t,o){let r=ea(e),i=[],d=new Set;for(let s of o.getInstancesOfClass(t)){if(d.has(s))continue;d.add(s);let a=r.get(s);a&&i.push(a)}return i.sort((s,a)=>{let u=F(k(s)),c=F(k(a));return u<c?-1:u>c?1:0}),i}async passesWhere(e,t,o,r){for(let i of o){let d=await this.evaluateValue(e,t,i,r);if(!oa(d))return!1}return!0}async evaluateValue(e,t,o,r){let i=Fn(o,"view-projection",{catalog:t,depth:0}),d=new Map([["input",r]]);return e.evaluate(i,d)}rowName(e,t){let o=Ve(e.name)||"row",r=o,i=2;for(;t.has(r);)r=`${o}-${i++}`;return t.add(r),r}};function Eo(n){return Ie(n)?n.value:Array.isArray(n)?n.map(Eo):n}function Ji(n){let e=k(n);if(!e)throw new Error(`Could not derive a publisher from view ${n.namespace}/${n.name}.`);return e.publisher}function yo(n,e,t){let o=Zi(n,e,t);if(!o)throw new Error(`Package ${e}/${t} is not in the catalog; it must be importable to materialize a view.`);return o}function Zi(n,e,t){let o;for(let r of n){if(!(r instanceof S))continue;let i=k(r);!i||i.publisher!==e||i.package_!==t||!i.version||(!o||oe(i.version,o)>0)&&(o=i.version)}return o?V(o):void 0}function ea(n){let e=new Map,t=new Map;for(let o of n){if(!(o instanceof S))continue;let r=k(o);if(!r||!r.version)continue;let i=F(r),d=t.get(i);(!d||oe(r.version,d)>0)&&(t.set(i,r.version),e.set(i,o))}return e}function na(n,e){let t=H(n,e);return t?[t]:Re(n,e).filter(o=>o instanceof L)}function oa(n){return n===!0?!0:n===!1||n===void 0||n===null?!1:typeof n=="string"?n.length>0:typeof n=="number"?n!==0:Ie(n)?n.value.length>0:Array.isArray(n)?n.length>0:!!n}export{ye as ANY_PUBLISHER,kr as AmbiguousReferenceRule,pt as BooleanStatement,Br as CANONICAL_FORM_VERSION,ti as CREDENTIAL_EXPIRY_SKEW_SECONDS,Be as CREDENTIAL_HELPER_ENV,Ue as CREDENTIAL_HELPER_PROTOCOL_VERSION,go as CREDENTIAL_HELPER_TIMEOUT_MS,U as Carrier,Rr as ClassDefinitionRule,ur as ClassHierarchyCycleRule,Oo as CompositeKanonakDocumentRepository,N as CredentialError,Zr as DEFAULT_CONSENT_BINDING_PARAM,at as DefinedKanonak,Hr as DiamondNameClashRule,vr as DisplayLensScopeRule,Ao as DocumentLocation,It as EdgeType,L as EmbeddedKanonak,sr as EmbeddedKanonakTypeRule,mt as EmbeddedStatement,ui as EntitlementDeniedError,li as EntitlementProducer,Y as ExecCredentialProvider,Lo as FileSystemKanonakDocumentRepository,Dt as GitIgnoreFilter,Vt as GraphBuilder,et as HttpKanonakDocumentRepository,Je as INTEGRITY_PREFIX,zr as ImportBook,cr as ImportExistenceRule,Se as InMemoryKanonakDocumentRepository,Do as KANONAK_USER_AGENT,it as Kanonak,Ht as KanonakDocumentPositions,Uo as KanonakHttpError,D as KanonakObjectParser,Fr as KanonakObjectValidator,T as KanonakParser,Bo as KanonakUri,Gt as KanonakUriBuilder,zt as KanonakUrlResolver,vt as KanonakVocabulary,Lr as LINE_STYLES,nr as LinkTargetRule,ht as ListStatement,st as LiteralKanonak,nt as LocalFirstRepository,ot as LockAwareRepository,Mr as LookBandPathRule,Vr as LookRenderer,_r as LookSemanticSvgPathRule,Pr as MarkdownLinkRule,gt as MarkdownStatement,hr as NamespaceImportCycleRule,or as NamespacePrefixRule,Ot as NodeType,lt as NumberStatement,ei as OAuthDiscovery,Mt as OWL_RL_CLASSIFICATION_RULES,yr as ObjectPropertyValueValidationRule,Jt as OntologyValidationError,Xt as OntologyValidationResult,Tr as OwlOneOfRule,Ge as PACKAGE_URL_TEMPLATE_ENV,Q as PackageBuilder,ar as PackageHeaderRule,si as ProducerRepository,Er as PropertyDomainRule,lr as PropertyHierarchyCycleRule,br as PropertyKindRangeConsistencyRule,Tt as PropertyMetadata,Sr as PropertyRangeReferenceRule,pr as PropertyRangeRequiredRule,rr as PropertyTypeSpecificityRule,Yo as PublisherConfigResolver,Jo as PublisherIndex,$t as RDFS_RULES,z as Reasoner,jt as ReasoningResult,A as ReferenceKanonak,ft as ReferenceStatement,Vo as RepositoryFactory,Cr as ReservedNameShadowRule,tr as ResourceNamingRule,kt as ResourceResolver,_t as ResourceTypeClassifier,ae as SHACL_PACKAGE,ie as SHACL_PUBLISHER,W as SH_NODE_SHAPE,se as SH_PROPERTY_SHAPE,tn as SH_SHAPE,dt as ScalarStatement,$r as SequenceNarrativeRule,Dr as ShaclShapeRule,ct as Statement,ut as StringStatement,fr as SubClassOfReferenceRule,mr as SubPropertyOfReferenceRule,S as SubjectKanonak,ir as SubjectKanonakTypeRequiredRule,le as TOKEN_ENV,je as TokenCredentialProvider,Ut as TripleStore,xr as TxExpressionCompilesRule,jr as TxExpressionPathRule,St as TypeResolver,wr as URI_DISPLAY_LABEL,Kr as URI_DISPLAY_SUMMARY,gr as UnresolvedPredicateRule,dr as UnresolvedReferenceRule,er as ValidationCache,Zt as ValidationContext,Yt as ValidationSeverity,Us as VersionOperator,ge as ViewMaterializer,ci as allowAllPolicy,Fo as assertHttpsUrl,on as assertIntegrityAsync,Zo as assertPackageIdentity,rt as buildLocalFirstRepository,Ir as buildOntologyModel,mo as buildReportPackageAsync,pe as buildShapesModel,Rt as builtinHomePackages,Pt as builtinUri,Wr as canonicalForm,qr as canonicalHash,Oe as carrierOf,ni as checkCredentialAnswer,$e as checkHelperAnswer,Me as checkHelperEraseAnswer,be as checkPackageUrlTemplate,Ee as checkPackageUrlTemplates,tt as collectKanonakFiles,oe as compareVersions,zn as computeIntegrity,nn as computeIntegrityAsync,Gr as contentAddressedName,G as contextTypesOf,ri as createCredentialedFetch,vo as createVersion,Hi as credentialProviderFromConfig,Mo as describeResponse,so as evaluateConformance,At as extractMarkdownLinks,Xo as fillPackageUrlTemplate,ai as findDerivation,Lt as findMalformedReferences,Wt as findMarkdownLinkAt,He as foldFlagsIntoPattern,zo as formatKanonakAddress,V as formatVersion,Io as getGlobalCachePath,Ho as getKanonakUserAgent,$o as httpError,xo as isCompatibleVersion,wo as isMajorCompatible,wt as isPropertySubject,Wo as kanonakFetch,Bn as loadLockFile,Ye as lockedVersion,me as lowerConstraint,Et as makeUriKey,Jr as narrowestScope,di as noopMeter,Qr as normalizeHost,Qo as packageUrlTemplateFor,Wi as packageUrlTemplatesFromConfig,Go as parseKanonakAddress,Ze as parseLockFile,Xr as parseScope,_o as parseVersionString,Ft as parseWithPositions,oi as parseWwwAuthenticate,No as pickHighestDocument,Kt as propertiesInScope,xt as propertyClassOf,Ar as readSequenceConnectors,Z as readUserConfig,Qt as referenceSpelling,M as referenceUris,Nr as resolveDisplayValue,Nt as resolvePropertyStep,jo as retryAfterSecondsOf,Ve as sanitizeName,Ko as satisfiesVersionOperator,Gn as saveLockFile,Yr as scopeContains,Xn as scopeFromCatalog,Yn as scopeFromDocumentAsync,Qn as scopeFromRepositoryAsync,en as serializeLockFile,qo as setKanonakFetchRetries,To as setKanonakUserAgent,Bt as sourceSymbolAt,qt as sourceSymbols,ko as splitCommandLine,Ne as subjectAddress,k as subjectUri,Le as superClassChain,Ur as supportedBandKeys,ii as tokenEnvKeyFor,bt as tripleKey,yt as typeReferenceUris,F as uriKey,Ct as uriTriple,J as userConfigPath,ue as valuesOf,Co as versionOperatorFromChar,Ro as versionOperatorToChar,Po as versionsEqual,Ae as walkDefinedKanonaks,Or as walkSequence};
@@ -59,3 +59,10 @@ export declare function serializeLockFile(lock: LockFile): string;
59
59
  * browsers). Same format, same bytes hashed (UTF-8), same result.
60
60
  */
61
61
  export declare function computeIntegrityAsync(content: string): Promise<string>;
62
+ /**
63
+ * Check `content` against the integrity a lock records for it, and throw when
64
+ * they differ, naming `what` (a package coordinate), where the bytes came from
65
+ * (`from`: a URL, or "the cache"), and both hashes. THE integrity check for a
66
+ * pinned version, wherever its bytes are fetched or read.
67
+ */
68
+ export declare function assertIntegrityAsync(what: string, content: string, expected: string, from: string): Promise<void>;
@@ -1,3 +1,3 @@
1
1
  export { loadLockFile, saveLockFile, computeIntegrity, } from './LockFileIO.js';
2
- export { parseLockFile, serializeLockFile, computeIntegrityAsync, lockedVersion, INTEGRITY_PREFIX, } from './LockFile.js';
2
+ export { parseLockFile, serializeLockFile, computeIntegrityAsync, assertIntegrityAsync, lockedVersion, INTEGRITY_PREFIX, } from './LockFile.js';
3
3
  export type { LockFile, LockEntry } from './LockFile.js';
@@ -1 +1 @@
1
- import{a as c,b as d,c as e,d as f,e as g,f as h}from"../chunk-GKIX3OD6.js";import{k as b}from"../chunk-22DSABP6.js";import{a}from"../chunk-7JBKOJB4.js";import"../chunk-NUTHBBDZ.js";import"../chunk-D4QGPMRW.js";import"../chunk-FUUTGGJS.js";import"../chunk-F67UH4FD.js";import"../chunk-QILEJIFU.js";export{d as KanonakDocumentPositions,b as KanonakObjectParser,a as KanonakParser,c as PropertyMetadata,f as findMarkdownLinkAt,e as parseWithPositions,h as sourceSymbolAt,g as sourceSymbols};
1
+ import{a as c,b as d,c as e,d as f,e as g,f as h}from"../chunk-FB5QKDNM.js";import{k as b}from"../chunk-LKJVNKCN.js";import{a}from"../chunk-5ZRVFYCP.js";import"../chunk-WXUMROTA.js";import"../chunk-PC3MYDGL.js";import"../chunk-F67UH4FD.js";import"../chunk-GGK6A6QK.js";import"../chunk-FUUTGGJS.js";export{d as KanonakDocumentPositions,b as KanonakObjectParser,a as KanonakParser,c as PropertyMetadata,f as findMarkdownLinkAt,e as parseWithPositions,h as sourceSymbolAt,g as sourceSymbols};
@@ -1 +1 @@
1
- import{d as a,e as b,f as c,g as d,h as e,i as f,j as g,k as h,l as i}from"../chunk-ADSDFJUO.js";import"../chunk-QHABFCRC.js";import"../chunk-22DSABP6.js";import"../chunk-7JBKOJB4.js";import"../chunk-NUTHBBDZ.js";import"../chunk-D4QGPMRW.js";import"../chunk-FUUTGGJS.js";import"../chunk-F67UH4FD.js";import"../chunk-QILEJIFU.js";export{h as EntitlementDeniedError,i as EntitlementProducer,c as ImportBook,a as PackageBuilder,e as ProducerRepository,f as allowAllPolicy,b as contentAddressedName,g as noopMeter,d as sanitizeName};
1
+ import{d as a,e as b,f as c,g as d,h as e,i as f,j as g,k as h,l as i}from"../chunk-7TNZ7ICK.js";import"../chunk-QHABFCRC.js";import"../chunk-LKJVNKCN.js";import"../chunk-5ZRVFYCP.js";import"../chunk-WXUMROTA.js";import"../chunk-PC3MYDGL.js";import"../chunk-F67UH4FD.js";import"../chunk-GGK6A6QK.js";import"../chunk-FUUTGGJS.js";export{h as EntitlementDeniedError,i as EntitlementProducer,c as ImportBook,a as PackageBuilder,e as ProducerRepository,f as allowAllPolicy,b as contentAddressedName,g as noopMeter,d as sanitizeName};
@@ -1 +1 @@
1
- import{a as i,b as j,c as k,d as l,e as m}from"../chunk-A3HRXFVX.js";import"../chunk-22DSABP6.js";import"../chunk-7JBKOJB4.js";import{c as a,d as b,e as c,g as d,ha as e,ia as f,ja as g,ka as h}from"../chunk-NUTHBBDZ.js";import"../chunk-D4QGPMRW.js";import"../chunk-FUUTGGJS.js";import"../chunk-F67UH4FD.js";import"../chunk-QILEJIFU.js";export{h as KanonakVocabulary,k as OWL_RL_CLASSIFICATION_RULES,j as RDFS_RULES,m as Reasoner,l as ReasoningResult,i as TripleStore,e as builtinHomePackages,f as builtinUri,g as canonicalizeBuiltinUri,b as makeUriKey,c as tripleKey,a as uriKey,d as uriTriple};
1
+ import{a as i,b as j,c as k,d as l,e as m}from"../chunk-AAYMTPG7.js";import"../chunk-LKJVNKCN.js";import"../chunk-5ZRVFYCP.js";import{c as a,d as b,e as c,g as d,ha as e,ia as f,ja as g,ka as h}from"../chunk-WXUMROTA.js";import"../chunk-PC3MYDGL.js";import"../chunk-F67UH4FD.js";import"../chunk-GGK6A6QK.js";import"../chunk-FUUTGGJS.js";export{h as KanonakVocabulary,k as OWL_RL_CLASSIFICATION_RULES,j as RDFS_RULES,m as Reasoner,l as ReasoningResult,i as TripleStore,e as builtinHomePackages,f as builtinUri,g as canonicalizeBuiltinUri,b as makeUriKey,c as tripleKey,a as uriKey,d as uriTriple};
@@ -1,6 +1,7 @@
1
1
  import type { IKanonakDocumentRepository } from '@kanonak-protocol/types/document/models';
2
2
  import type { KanonakDocument, Import, DocumentReference } from '@kanonak-protocol/types/document/models/types';
3
3
  import type { AuthenticatedFetchFn } from '../auth/index.js';
4
+ import type { PackageUrlTemplates } from './PackageUrlTemplates.js';
4
5
  /**
5
6
  * Whether the lock's pinned version satisfies an import's operator — a
6
7
  * COMPATIBILITY ASSERTION, not a selector. The served lock pins one version per
@@ -40,16 +41,17 @@ export declare class HttpKanonakDocumentRepository implements IKanonakDocumentRe
40
41
  onFetch?: HttpCacheWrite;
41
42
  getFromCache?: HttpCacheRead;
42
43
  fetchFn?: AuthenticatedFetchFn;
44
+ /** The consumer's package URL templates (#130); see {@link PublisherIndex}. */
45
+ packageUrlTemplates?: PackageUrlTemplates;
43
46
  });
44
47
  getHighestCompatibleVersionAsync(publisher: string, import_: Import): Promise<KanonakDocument | null>;
45
48
  /**
46
- * Fetch a package at the version the served lock pins. The `resolved` URL
47
- * recorded in the lock is used verbatim (https-guarded by the fetch layer),
48
- * and the bytes are identity-checked (namespace must match) before caching.
49
- * Cryptographic integrity verification against the lock's hash happens Node-
50
- * side at install time (where bytes are persisted and the local lock written);
51
- * this resolution path stays browser-bundleable and relies on the identity
52
- * guard plus the integrity-verified install that populated the cache.
49
+ * Fetch a package at the version the served lock pins, from the consumer's
50
+ * template or else the `resolved` URL the lock records (https-guarded by the
51
+ * fetch layer). The bytes are checked against the lock's sha256 (Web Crypto,
52
+ * so this path stays browser-bundleable) and identity-checked (namespace
53
+ * must match) before caching. The hash check is what lets a consumer fetch
54
+ * through a registry or mirror without trusting it (#130).
53
55
  */
54
56
  private fetchPinned;
55
57
  /**
@@ -0,0 +1,37 @@
1
+ /**
2
+ * A consumer's package URL templates (#130): where THIS consumer fetches
3
+ * package sources from, whatever each publisher advertises. A registry that
4
+ * serves (and caches) many publishers, an internal or air-gapped mirror, a
5
+ * corporate proxy: the consumer chooses, without the publisher agreeing.
6
+ *
7
+ * Keyed by publisher, plus {@link ANY_PUBLISHER} for every publisher not named.
8
+ * The same shape as `packageUrlTemplates` in `~/.kanonak/config.json`.
9
+ *
10
+ * Only the address changes. A pinned version is still checked against the
11
+ * sha256 its publisher's lock records, and the discovery documents
12
+ * (`.well-known/kanonak.json`, `kanonak.lock`) are still read from the
13
+ * publisher, so a registry cannot substitute bytes for a pinned version.
14
+ */
15
+ export type PackageUrlTemplates = Readonly<Record<string, string>>;
16
+ /** The key of the template for every publisher a consumer has not named. */
17
+ export declare const ANY_PUBLISHER = "*";
18
+ /**
19
+ * Check a consumer's templates, as read from the setting `setting` in
20
+ * `location` (both named in every error). Each key is a publisher or
21
+ * {@link ANY_PUBLISHER}; each value is checked by {@link checkPackageUrlTemplate}.
22
+ */
23
+ export declare function checkPackageUrlTemplates(templates: unknown, setting: string, location?: string): PackageUrlTemplates;
24
+ /**
25
+ * Check one consumer template: an absolute `https://` URL template whose only
26
+ * placeholders are `{publisher}`, `{package}` and `{version}`. `{package}` and
27
+ * `{version}` are required; `{publisher}` too when the template serves any
28
+ * publisher, so one template can address every publisher's packages.
29
+ */
30
+ export declare function checkPackageUrlTemplate(template: unknown, setting: string, anyPublisher: boolean): string;
31
+ /** The consumer's template for `publisher`: its own, else the one for any publisher. */
32
+ export declare function packageUrlTemplateFor(templates: PackageUrlTemplates | undefined, publisher: string): string | undefined;
33
+ /**
34
+ * Fill a package URL template, the consumer's or the publisher's, with a
35
+ * package coordinate. The result must be an https URL with no placeholder left.
36
+ */
37
+ export declare function fillPackageUrlTemplate(template: string, publisher: string, packageName: string, version: string): string;
@@ -1,6 +1,7 @@
1
1
  import { PublisherConfigResolver, type PublisherConfig } from './PublisherConfig.js';
2
2
  import type { AuthenticatedFetchFn } from '../auth/index.js';
3
3
  import { type LockFile, type LockEntry } from '../lock/LockFile.js';
4
+ import { type PackageUrlTemplates } from './PackageUrlTemplates.js';
4
5
  /**
5
6
  * The client for a publisher's SERVED metadata: its `.well-known/kanonak.json`
6
7
  * discovery config, its `kanonak.lock` (the resolution + integrity source for
@@ -13,22 +14,57 @@ import { type LockFile, type LockEntry } from '../lock/LockFile.js';
13
14
  * `{package}/{version}.kan.yml` URL — published versions are immutable, so the
14
15
  * URL space IS the archive (see `HttpKanonakDocumentRepository`).
15
16
  *
17
+ * It is also THE place a package's source URL is chosen (#130). The
18
+ * consumer's {@link PackageUrlTemplates}, when given, win over everything a
19
+ * publisher states: for publisher/package@version the URL is
20
+ *
21
+ * 1. the consumer's template for that publisher, else its template for any
22
+ * publisher;
23
+ * 2. else the `resolved` URL the lock records, for a pinned version, or the
24
+ * publisher's `package_url_template` / the protocol default otherwise.
25
+ *
26
+ * Discovery (`.well-known/kanonak.json`, the locks) is always read from the
27
+ * publisher, so the sha256 a pinned version is checked against is the
28
+ * publisher's, wherever the bytes come from.
29
+ *
16
30
  * (The class name is historical; it indexes nothing. `PublisherSource` is the
17
31
  * accurate name whenever a breaking rename is acceptable.)
18
32
  */
19
33
  export declare class PublisherIndex {
20
34
  private readonly configResolver;
21
35
  private readonly fetchFn;
36
+ private readonly packageUrlTemplates;
22
37
  private readonly lockCache;
23
38
  private readonly packageLockCache;
24
39
  constructor(options?: {
25
40
  configResolver?: PublisherConfigResolver;
26
41
  fetchFn?: AuthenticatedFetchFn;
42
+ /** The consumer's package URL templates; checked here. */
43
+ packageUrlTemplates?: PackageUrlTemplates;
27
44
  });
28
45
  /** The publisher's `.well-known/kanonak.json` discovery config. */
29
46
  getConfig(publisher: string): Promise<PublisherConfig>;
30
- /** The full URL of a package's raw source (via the publisher's url template). */
47
+ /**
48
+ * The full URL of a package's raw source: the consumer's template, else the
49
+ * publisher's `package_url_template`, else the protocol default. A consumer
50
+ * template answers without reading the publisher's config.
51
+ */
31
52
  getPackageUrl(publisher: string, packageName: string, version: string): Promise<string>;
53
+ /**
54
+ * Where a version a lock pins is fetched from: the consumer's template, else
55
+ * the `resolved` URL the entry records.
56
+ */
57
+ lockedSourceUrl(publisher: string, packageName: string, entry: LockEntry): string;
58
+ /**
59
+ * Fetch a version a lock pins, from {@link lockedSourceUrl}, and check the
60
+ * bytes against the entry's sha256. Throws on a failed fetch or a mismatch:
61
+ * bytes that are not the ones the lock pins are never returned, whichever
62
+ * host served them.
63
+ */
64
+ fetchLockedSource(publisher: string, packageName: string, entry: LockEntry): Promise<{
65
+ url: string;
66
+ content: string;
67
+ }>;
32
68
  /**
33
69
  * The publisher's served `kanonak.lock` — the authoritative resolution +
34
70
  * integrity source (one pinned version per package, with sha256 integrity and
@@ -1 +1 @@
1
- import{h as e,n as r,o as n}from"../chunk-MD4CAJIO.js";import"../chunk-SC5M74NM.js";import"../chunk-5FVUBF7N.js";import{a as o}from"../chunk-6VIUXP4N.js";import"../chunk-7JBKOJB4.js";import"../chunk-F67UH4FD.js";import"../chunk-QILEJIFU.js";export{n as HttpKanonakDocumentRepository,o as InMemoryKanonakDocumentRepository,e as PublisherConfigResolver,r as PublisherIndex};
1
+ import{m as e,t as r,u as n}from"../chunk-Z2444SWM.js";import"../chunk-SC5M74NM.js";import"../chunk-5FVUBF7N.js";import{a as o}from"../chunk-WXXZOJ4O.js";import"../chunk-5ZRVFYCP.js";import"../chunk-F67UH4FD.js";import"../chunk-GGK6A6QK.js";import"../chunk-FUUTGGJS.js";export{n as HttpKanonakDocumentRepository,o as InMemoryKanonakDocumentRepository,e as PublisherConfigResolver,r as PublisherIndex};
@@ -2,6 +2,7 @@ import type { IKanonakDocumentRepository } from '@kanonak-protocol/types/documen
2
2
  import { KanonakParser } from '../parsing/KanonakParser.js';
3
3
  import { type HttpCacheRead, type HttpCacheWrite } from './HttpKanonakDocumentRepository.js';
4
4
  import type { AuthenticatedFetchFn } from '../auth/CredentialProvider.js';
5
+ import type { PackageUrlTemplates } from './PackageUrlTemplates.js';
5
6
  /**
6
7
  * Recursively collect every `.kan.yml` file under `dir`, skipping build/output
7
8
  * and dependency directories. Pure filesystem walk — no YAML parsing.
@@ -22,7 +23,9 @@ export interface HttpCacheHooks {
22
23
  * 3. **HTTP** — on-demand fetch from publisher origins, write-through to the
23
24
  * caller-supplied `httpCache` (defaults to an in-memory map), through the
24
25
  * caller's `fetchFn` (a credentialed transport) when it supplies one, so a
25
- * gated import resolves wherever an install can reach it.
26
+ * gated import resolves wherever an install can reach it. Package sources
27
+ * come from the caller's `packageUrlTemplates` when it supplies them
28
+ * (a registry or mirror of its choosing, #130).
26
29
  *
27
30
  * This is the stack every Kanonak-aware tool should resolve through; it is the
28
31
  * order that makes `LookRenderer` output deterministic. The CLI's
@@ -32,4 +35,5 @@ export declare function buildLocalFirstRepository(workspaceRoot: string, parser?
32
35
  httpCache?: HttpCacheHooks;
33
36
  offline?: boolean;
34
37
  fetchFn?: AuthenticatedFetchFn;
38
+ packageUrlTemplates?: PackageUrlTemplates;
35
39
  }): Promise<IKanonakDocumentRepository>;
@@ -9,5 +9,7 @@ export { buildLocalFirstRepository, collectKanonakFiles, type HttpCacheHooks, }
9
9
  export { PublisherIndex } from './PublisherIndex.js';
10
10
  export { PublisherConfigResolver, defaultPublisherConfig } from './PublisherConfig.js';
11
11
  export type { PublisherConfig } from './PublisherConfig.js';
12
+ export { ANY_PUBLISHER, checkPackageUrlTemplates, checkPackageUrlTemplate, packageUrlTemplateFor, fillPackageUrlTemplate, } from './PackageUrlTemplates.js';
13
+ export type { PackageUrlTemplates } from './PackageUrlTemplates.js';
12
14
  export { getGlobalCachePath } from './CachePaths.js';
13
15
  export type { IKanonakDocumentRepository, KanonakDocument, DocumentReference } from '@kanonak-protocol/types/document/models';
@@ -1 +1 @@
1
- import{a as b,b as c,c as d,d as e,e as f,f as k,g as l,h as m,i as n}from"../chunk-66GZUKYS.js";import{g,h,n as i,o as j}from"../chunk-MD4CAJIO.js";import"../chunk-SC5M74NM.js";import"../chunk-5FVUBF7N.js";import{a}from"../chunk-6VIUXP4N.js";import"../chunk-7JBKOJB4.js";import"../chunk-F67UH4FD.js";import"../chunk-QILEJIFU.js";export{d as CompositeKanonakDocumentRepository,c as DocumentLocation,b as FileSystemKanonakDocumentRepository,j as HttpKanonakDocumentRepository,a as InMemoryKanonakDocumentRepository,k as LocalFirstRepository,l as LockAwareRepository,h as PublisherConfigResolver,i as PublisherIndex,f as RepositoryFactory,n as buildLocalFirstRepository,m as collectKanonakFiles,g as defaultPublisherConfig,e as getGlobalCachePath};
1
+ import{a as b,b as c,c as d,d as e,e as f,f as p,g as q,h as r,i as s}from"../chunk-K76UUREI.js";import{g,h,i,j,k,l,m,t as n,u as o}from"../chunk-Z2444SWM.js";import"../chunk-SC5M74NM.js";import"../chunk-5FVUBF7N.js";import{a}from"../chunk-WXXZOJ4O.js";import"../chunk-5ZRVFYCP.js";import"../chunk-F67UH4FD.js";import"../chunk-GGK6A6QK.js";import"../chunk-FUUTGGJS.js";export{g as ANY_PUBLISHER,d as CompositeKanonakDocumentRepository,c as DocumentLocation,b as FileSystemKanonakDocumentRepository,o as HttpKanonakDocumentRepository,a as InMemoryKanonakDocumentRepository,p as LocalFirstRepository,q as LockAwareRepository,m as PublisherConfigResolver,n as PublisherIndex,f as RepositoryFactory,s as buildLocalFirstRepository,i as checkPackageUrlTemplate,h as checkPackageUrlTemplates,r as collectKanonakFiles,l as defaultPublisherConfig,k as fillPackageUrlTemplate,e as getGlobalCachePath,j as packageUrlTemplateFor};
@@ -1 +1 @@
1
- import{a as F,b as H}from"../chunk-D2X6J77P.js";import{a as o}from"../chunk-SC5M74NM.js";import{a as G}from"../chunk-PEJALHXK.js";import{a as q,b as r,la as u,ma as v,na as w,oa as x,pa as y,qa as z,ra as A,sa as B,ta as C,ua as D,va as E}from"../chunk-NUTHBBDZ.js";import{p as s,q as t}from"../chunk-D4QGPMRW.js";import{a as p}from"../chunk-FUUTGGJS.js";import{a as l,b as m,c as n}from"../chunk-F67UH4FD.js";import{a,b,c,d,e,f,g,h,i,j,k}from"../chunk-QILEJIFU.js";export{l as IMPORT_MODES,p as KanonakUri,F as KanonakUriBuilder,G as KanonakUrlResolver,q as ResourceResolver,v as ResourceTypeClassifier,r as TypeResolver,o as assertPackageIdentity,c as compareVersions,E as contextTypesOf,u as corePropertyClassOf,f as createVersion,t as formatKanonakAddress,e as formatVersion,h as isCompatibleVersion,B as isDatatypePropertySubject,m as isLinkImport,i as isMajorCompatible,A as isObjectPropertySubject,z as isPropertySubject,n as linkedPackages,s as parseKanonakAddress,g as parseVersionString,k as pickHighestDocument,C as propertiesInScope,y as propertyClassOf,H as referenceSpelling,D as resolvePropertyStep,j as satisfiesVersionOperator,w as subjectUri,x as superClassChain,a as versionOperatorFromChar,b as versionOperatorToChar,d as versionsEqual};
1
+ import{a as F,b as H}from"../chunk-X4V6DEZL.js";import{a as r}from"../chunk-SC5M74NM.js";import{a as G}from"../chunk-PEJALHXK.js";import{a as s,b as t,la as u,ma as v,na as w,oa as x,pa as y,qa as z,ra as A,sa as B,ta as C,ua as D,va as E}from"../chunk-WXUMROTA.js";import"../chunk-PC3MYDGL.js";import{a as l,b as m,c as n}from"../chunk-F67UH4FD.js";import{a,b,c,d,e,f,g,h,i,j,k,l as p,m as q}from"../chunk-GGK6A6QK.js";import{a as o}from"../chunk-FUUTGGJS.js";export{l as IMPORT_MODES,o as KanonakUri,F as KanonakUriBuilder,G as KanonakUrlResolver,s as ResourceResolver,v as ResourceTypeClassifier,t as TypeResolver,r as assertPackageIdentity,c as compareVersions,E as contextTypesOf,u as corePropertyClassOf,f as createVersion,q as formatKanonakAddress,e as formatVersion,h as isCompatibleVersion,B as isDatatypePropertySubject,m as isLinkImport,i as isMajorCompatible,A as isObjectPropertySubject,z as isPropertySubject,n as linkedPackages,p as parseKanonakAddress,g as parseVersionString,k as pickHighestDocument,C as propertiesInScope,y as propertyClassOf,H as referenceSpelling,D as resolvePropertyStep,j as satisfiesVersionOperator,w as subjectUri,x as superClassChain,a as versionOperatorFromChar,b as versionOperatorToChar,d as versionsEqual};
@@ -1,4 +1,4 @@
1
- import"../chunk-D2X6J77P.js";import"../chunk-SC5M74NM.js";import{f as g}from"../chunk-TYVZXABI.js";import"../chunk-QHABFCRC.js";import"../chunk-6VIUXP4N.js";import"../chunk-22DSABP6.js";import"../chunk-7JBKOJB4.js";import"../chunk-PEJALHXK.js";import{na as m,va as S}from"../chunk-NUTHBBDZ.js";import{c as v,r as p,z as E}from"../chunk-D4QGPMRW.js";import"../chunk-FUUTGGJS.js";import"../chunk-F67UH4FD.js";import{c as x}from"../chunk-QILEJIFU.js";import{homedir as P}from"os";import{join as d}from"path";import{existsSync as M,mkdirSync as D,readFileSync as j,writeFileSync as O}from"fs";import{createHash as C}from"crypto";import{pathToFileURL as B}from"url";var h="Xenova/all-MiniLM-L6-v2",w="q8",b=32;async function F(r){let{pipeline:e,env:t}=r.transformers;t.cacheDir=r.modelCacheDir??d(P(),".kanonak","models");let n=await e("feature-extraction",h,{dtype:w});return async s=>(await n(s,{pooling:"mean",normalize:!0})).tolist()}async function z(r){let e=d(r,"node_modules","@huggingface","transformers"),t=JSON.parse(j(d(e,"package.json"),"utf-8")),n=I(t);if(!n)throw new Error(`@huggingface/transformers at ${e} exposes no resolvable ESM entry.`);let s=await import(B(d(e,n)).href);return typeof s.pipeline=="function"?s:s.default}function I(r){let e=r.exports,t=n=>typeof n=="string"?n:n?.default;return typeof e=="string"?e:t(e?.node?.import)??t(e?.import)??t(e?.default)??r.module??r.main}var y=null;async function U(){return y||(y=(async()=>{let r;try{r=await import("@huggingface/transformers")}catch(e){throw new Error(`Semantic search requires the embedding runtime, which is an optional dependency.
1
+ import"../chunk-X4V6DEZL.js";import"../chunk-SC5M74NM.js";import{f as g}from"../chunk-GXEKJFXG.js";import"../chunk-QHABFCRC.js";import"../chunk-WXXZOJ4O.js";import"../chunk-LKJVNKCN.js";import"../chunk-5ZRVFYCP.js";import"../chunk-PEJALHXK.js";import{na as m,va as S}from"../chunk-WXUMROTA.js";import{c as v,p,x as E}from"../chunk-PC3MYDGL.js";import"../chunk-F67UH4FD.js";import{c as x}from"../chunk-GGK6A6QK.js";import"../chunk-FUUTGGJS.js";import{homedir as P}from"os";import{join as d}from"path";import{existsSync as M,mkdirSync as D,readFileSync as j,writeFileSync as O}from"fs";import{createHash as C}from"crypto";import{pathToFileURL as B}from"url";var h="Xenova/all-MiniLM-L6-v2",w="q8",b=32;async function F(r){let{pipeline:e,env:t}=r.transformers;t.cacheDir=r.modelCacheDir??d(P(),".kanonak","models");let n=await e("feature-extraction",h,{dtype:w});return async s=>(await n(s,{pooling:"mean",normalize:!0})).tolist()}async function z(r){let e=d(r,"node_modules","@huggingface","transformers"),t=JSON.parse(j(d(e,"package.json"),"utf-8")),n=I(t);if(!n)throw new Error(`@huggingface/transformers at ${e} exposes no resolvable ESM entry.`);let s=await import(B(d(e,n)).href);return typeof s.pipeline=="function"?s:s.default}function I(r){let e=r.exports,t=n=>typeof n=="string"?n:n?.default;return typeof e=="string"?e:t(e?.node?.import)??t(e?.import)??t(e?.default)??r.module??r.main}var y=null;async function U(){return y||(y=(async()=>{let r;try{r=await import("@huggingface/transformers")}catch(e){throw new Error(`Semantic search requires the embedding runtime, which is an optional dependency.
2
2
  Install it with:
3
3
  npm install @huggingface/transformers
4
4
  (underlying import error: ${e.message})`)}return F({transformers:r})})()),y}function H(r,e){let t=0;for(let n=0;n<r.length;n++)t+=r[n]*e[n];return t}function R(r,e){return e?r.version?e.version?x(r.version,e.version)>0:!0:!1:!0}function K(r,e){let t=g(r,e),n=[t.label],s=S(e);if(s.length>0){let i=E(r,s[0]),a=i?g(r,i).label:s[0].name;a&&n.push(`\u2014 a ${a}.`)}return t.summary&&n.push(t.summary),n.join(" ")}function q(r){let e=new Map;for(let t of r){if(!(t instanceof v))continue;let n=m(t);if(!n)continue;let s=p(n),i=e.get(s);(!i||R(n,m(i)))&&e.set(s,t)}return[...e.values()].sort((t,n)=>{let s=m(t)?p(m(t)):t.name,i=m(n)?p(m(n)):n.name;return s.localeCompare(i)})}var k=class{entries=[];embedder;constructor(e={}){this.embedder=e.embedder}resolveEmbedder(){return this.embedder?Promise.resolve(this.embedder):U()}get size(){return this.entries.length}async build(e,t={}){let n=q(e);if(t.include&&(n=n.filter(t.include)),n.length===0)return this.entries=[],{size:0,cached:!1};let s=n.map(o=>K(e,o)),i=t.cacheDir,a;if(i){let o=C("sha256").update(h+"|"+w+`
@@ -1,5 +1,5 @@
1
- import{c as je}from"../chunk-R4LVLXAC.js";import{a as be,d as Q,f as we,h as ee}from"../chunk-66GZUKYS.js";import{e as $e,g as Se,n as U,o as Z}from"../chunk-MD4CAJIO.js";import"../chunk-D2X6J77P.js";import"../chunk-SC5M74NM.js";import{a as q,b as H}from"../chunk-VORVR5BZ.js";import{t as te}from"../chunk-TYVZXABI.js";import"../chunk-QHABFCRC.js";import{b as ve}from"../chunk-5FVUBF7N.js";import{a as ye}from"../chunk-6VIUXP4N.js";import{k as oe}from"../chunk-22DSABP6.js";import{a as O}from"../chunk-7JBKOJB4.js";import{a as Pe}from"../chunk-PEJALHXK.js";import"../chunk-NUTHBBDZ.js";import{A as re,c as Re,p as _e}from"../chunk-D4QGPMRW.js";import{a as xe}from"../chunk-FUUTGGJS.js";import"../chunk-F67UH4FD.js";import{c as V,e as j,f as W,g as X}from"../chunk-QILEJIFU.js";import{readFileSync as pe,writeFileSync as Ee,mkdirSync as De}from"fs";import{join as se}from"path";import Ke from"js-yaml";var Ce=[{publisher:"kanonak.org",package_:"core-kanonak"},{publisher:"kanonak.org",package_:"site"},{publisher:"kanonak.org",package_:"link"},{publisher:"kanonak.org",package_:"look-tokens"},{publisher:"kanonak.org",package_:"look-styles"},{publisher:"kanonak.org",package_:"look"},{publisher:"kanonak.org",package_:"universal-look"}];function G(r){return Ce}function N(r){return`${r.publisher}/${r.package_}`}function z(r,e=[]){let i={"kanonak.org/look-styles":"pages render UNSTYLED \u2014 generated CSS stops at the :root token block","kanonak.org/look-tokens":"the :root block loses the universal design-token floor (colors, fonts, spacing)","kanonak.org/universal-look":"resources without their own look render as an empty HTML comment","kanonak.org/look":"band vocabulary (Hero, PropertyList, \u2026) is unresolvable \u2014 declared looks cannot render","kanonak.org/site":"the site vocabulary (content, navigation) is unresolvable \u2014 the base stylesheet cannot bind","kanonak.org/core-kanonak":"the Package/Publisher classes are unresolvable \u2014 package and publisher pages degrade","kanonak.org/link":"link vocabulary is unresolvable \u2014 cross-reference styling degrades"},o=[];for(let t of r)if(t.origin==="missing"){let a=N(t),u=i[a]??"whatever this package contributes to rendering is lost";o.push(`Render-stack package ${a} is MISSING (${t.reason??"unknown reason"}) \u2014 ${u}. Fix: kanonak install ${a} (as the user running the render), or restore network access to ${t.publisher}.`)}else t.resolvedButNotInCatalog&&o.push(`Render-stack package ${N(t)} resolved (${t.origin}) but is NOT in the parsed catalog \u2014 this is a closure-scoping bug; please report it.`);for(let t of e)o.push(`Import edge ${t.fromNamespace} \u2192 ${t.publisher}/${t.packageName} ${t.constraint} did NOT resolve (${t.reason==="no-compatible-version"?"no compatible version in the repository":"resolution threw"}) \u2014 every statement ${t.fromNamespace} authors against ${t.publisher}/${t.packageName} entities is dropped from the parse as an unresolved predicate (a look declaration loses its bands and pages render empty; see typescript#91). Fix: add a ${t.constraint}-compatible version of ${t.publisher}/${t.packageName} to the workspace or cache (kanonak install ${t.publisher}/${t.packageName}), or bump the import in ${t.fromNamespace}.`);return o}function ne(r){let{publisher:e,availablePublishers:i,catalog:o,lookRenderer:t,localNamespaces:a,rawByNsKey:u,renderStack:d,producers:f,lockSource:y,configSource:s}=r,l=new Map,k=new Map,p=new Map,m=new Set;for(let S of o){if(!(S instanceof Re))continue;let w=S.namespace||"";if(!a.has(w))continue;l.set(`${w}/${S.name}`,S);let _=w.split("/")[1]??"",[P,E]=_.split("@");if(!P||!E)continue;let D=X(E);D&&(m.has(_)||(m.add(_),k.has(P)||k.set(P,[]),k.get(P).push({verStr:E,version:D})),S.name===P&&p.set(_,S))}for(let S of k.values())S.sort((w,_)=>V(_.version,w.version));return{publisher:e,availablePublishers:i,catalog:o,lookRenderer:t,localNamespaces:a,rawByNsKey:u,bySubject:l,pkgVersions:k,pkgSelfByVer:p,renderStack:d,...f?{producers:f}:{},...y?{lockSource:y}:{},...s?{configSource:s}:{}}}async function ue(r,e={}){let i=new O,o=new ye(i),t=[],a=[];for(let c of ee(r)){let h;try{h=pe(c,"utf-8")}catch{continue}let n;try{n=i.parse(h).metadata?.namespace_}catch{continue}if(!n?.version)continue;let g=n.version;a.push({publisher:n.publisher,package_:n.package_,verStr:j(g),version:g,source:h})}a.sort((c,h)=>V(h.version,c.version));for(let c of a)await o.saveDocumentAsync(i.parse(c.source),`${c.publisher}/${c.package_}@${c.verStr}`),t.push({publisher:c.publisher,package_:c.package_,verStr:c.verStr,source:c.source});let u=[...new Set(t.map(c=>c.publisher))].sort(),d=e.publisher;if(d){if(!u.includes(d))throw new Error(`Publisher "${d}" not found in workspace. Available: ${u.join(", ")||"(none)"}`)}else if(u.length===1)d=u[0];else throw u.length===0?new Error(`No Kanonak packages found under ${r}`):new Error(`Workspace has multiple publishers (${u.join(", ")}). Pass --publisher <domain> to choose which one to serve.`);let f=new Set,y=new Map;for(let c of t)c.publisher===d&&(f.add(`${c.publisher}/${c.package_}@${c.verStr}`),y.set(`${c.package_}@${c.verStr}`,c.source));let s=Q(),l=new be(s,!0,i),k={};e.httpCache&&(k.getFromCache=e.httpCache.getFromCache,k.onFetch=e.httpCache.onFetch),e.fetchFn&&(k.fetchFn=e.fetchFn);let p=e.repository??new we(o,l,new Z(k)),m=e.log??(()=>{}),S=G(void 0),w=[],_=c=>c.map(h=>h.metadata.namespace_?.version).filter(h=>h!==void 0).sort((h,n)=>V(n,h)).map(j);if(!e.repository){m(`[render-stack] resolving ${S.length} ambient look-stack package(s); cache: ${s}`);let c=e.fetchFn?new U({fetchFn:e.fetchFn}):new U;for(let h of S){let n=N(h),g=await o.getDocumentsByNamespaceAsync(h.publisher,h.package_);if(g.length>0){let v=_(g);w.push({...h,origin:"workspace",versions:v}),m(`[render-stack] ${n} \u2014 workspace (${v.join(", ")})`);continue}let b=await l.getDocumentsByNamespaceAsync(h.publisher,h.package_);if(b.length>0){let v=_(b);w.push({...h,origin:"cache",versions:v}),m(`[render-stack] ${n} \u2014 cache (${v.join(", ")})`);continue}try{let $=(await c.getLock(h.publisher))?.packages[`${h.publisher}/${h.package_}`];if(!$){let C=`publisher ${h.publisher} reachable but its lock does not pin ${h.package_}`;w.push({...h,origin:"missing",reason:C}),m(`[render-stack] ${n} \u2014 MISSING: ${C}`);continue}let F=$.version,T=$.resolved,de=await(e.fetchFn?e.fetchFn(T,h.publisher):$e(T));if(!de.ok){let C=(await ve("render-stack package",T,de)).message;w.push({...h,origin:"missing",reason:C}),m(`[render-stack] ${n} \u2014 MISSING: ${C}`);continue}let fe=await de.text();await o.saveDocumentAsync(i.parse(fe),`${h.publisher}/${h.package_}@${F}`);try{let C=se(s,h.publisher);De(C,{recursive:!0}),Ee(se(C,`${h.package_}@${F}.kan.yml`),fe,"utf-8"),w.push({...h,origin:"fetched",versions:[F]}),m(`[render-stack] ${n}@${F} \u2014 fetched from ${T}, installed to cache`)}catch(C){w.push({...h,origin:"fetched",versions:[F]}),m(`[render-stack] ${n}@${F} \u2014 fetched from ${T}, but cache ${s} is NOT WRITABLE (${C.message}); usable for this load only \u2014 every load will re-fetch it`)}}catch(v){let $=`fetch failed: ${v.message}`;w.push({...h,origin:"missing",reason:$}),m(`[render-stack] ${n} \u2014 MISSING: ${$}`)}}}let P=(await o.getAllDocumentsAsync()).filter(c=>c.metadata.namespace_?.publisher===d);for(let c of S)P.push(...await p.getDocumentsByNamespaceAsync(c.publisher,c.package_));let E=[],D=await q(P,p,{onUnresolvedEdge:c=>E.push(c)}),A=p;if(!e.repository){for(let c of S)D.add(N(c));A=new H(p,D)}let B=await new oe(i).parseKanonaks(A),ce=new te(B),le=(c,h)=>re(B,{publisher:c,package_:h,name:h}).length>0,I;if(e.repository){I=[];for(let c of S){let h=await p.getDocumentsByNamespaceAsync(c.publisher,c.package_);I.push(h.length>0?{...c,origin:"repository",versions:_(h)}:{...c,origin:"missing",reason:"not present in the caller-supplied repository"})}}else I=w.map(c=>c.origin==="missing"||le(c.publisher,c.package_)?c:{...c,resolvedButNotInCatalog:!0});let Y=z(I,E);for(let c of Y)m(`[render-stack] WARNING: ${c}`);let J={contractSource:"universal-default",cachePath:s,packages:I,warnings:Y},K;try{K=pe(se(r,"kanonak.lock"),"utf-8")}catch{K=Ve(d,t,i)}let L;try{L=pe(se(r,".well-known","kanonak.json"),"utf-8")}catch{L=void 0}return ne({publisher:d,availablePublishers:u,catalog:B,lookRenderer:ce,localNamespaces:f,rawByNsKey:y,renderStack:J,...K?{lockSource:K}:{},...L?{configSource:L}:{}})}function Ve(r,e,i){let o=new Map;for(let a of e)a.publisher===r&&(o.has(a.package_)||o.set(a.package_,{verStr:a.verStr,source:a.source}));if(o.size===0)return;let t={};for(let a of[...o.keys()].sort()){let{verStr:u,source:d}=o.get(a),f={},y;try{y=i.parse(d).metadata?.imports}catch{y=void 0}for(let l of y?.[r]??[]){let k=o.get(l.packageName);k&&(f[`${r}/${l.packageName}`]=k.verStr)}let s={};for(let l of Object.keys(f).sort())s[l]=f[l];t[`${r}/${a}`]={version:u,resolved:`https://${r}/${a}/${u}.kan.yml`,integrity:je(d),dependencies:s}}return Ke.dump({version:"1",lastUpdated:"",packages:t},{lineWidth:-1,sortKeys:!1,quotingType:'"'})}import{existsSync as Ae,readFileSync as Be,writeFileSync as Le,mkdirSync as Oe}from"fs";import{join as Ne}from"path";async function ge(r,e={}){let i=new O,o=_e(r),t=o.kind==="resource"?o.uri.publisher:o.publisher,a=e.log??(()=>{}),u=e.cacheRoot??Q(),d=(n,g,b)=>Ne(u,n,`${g}@${b}.kan.yml`),f=new Set,y=new Set,s=new Map,l=new Z({getFromCache:(n,g,b)=>{let v=d(n,g,b),$=Ae(v)?Be(v,"utf-8"):null;return $!==null&&f.add(`${n}/${g}`),$},onFetch:(n,g,b,v)=>{y.add(`${n}/${g}`);try{let $=Ne(u,n);Oe($,{recursive:!0}),Le(d(n,g,b),v,"utf-8")}catch($){s.set(`${n}/${g}`,$.message),a(`[render] fetched ${n}/${g}@${b} but cache ${u} is NOT WRITABLE (${$.message}); usable for this load only \u2014 every load will re-fetch it`)}},...e.fetchFn?{fetchFn:e.fetchFn}:{}}),k=new U(e.fetchFn?{fetchFn:e.fetchFn}:void 0),p;if(o.kind==="resource"){let n=o.uri.version;p=[n?{package_:o.uri.package_,version:`${n.major}.${n.minor}.${n.patch}`}:{package_:o.uri.package_}]}else if(o.kind==="package"){let n=o.version;p=[n?{package_:o.package_,version:`${n.major}.${n.minor}.${n.patch}`}:{package_:o.package_}]}else p=((await k.getConfig(t)).featured_packages??[]).map(g=>({package_:g}));let m=async(n,g,b)=>{try{let v=b?i.buildImport(g,"=",b,n):i.buildImport(g,"*","0.0.0",n),$=await l.getHighestCompatibleVersionAsync(n,v);return $?{doc:$}:{doc:null,error:`${n} did not resolve ${g}${b?`@${b}`:""} (not in its index, or unreachable)`}}catch(v){return{doc:null,error:v.message}}},S=[],w=[];for(let n of p){let{doc:g,error:b}=await m(t,n.package_,n.version);g?S.push(g):b&&w.push(b)}if(S.length===0)throw new Error(`Could not fetch any package for address "${r}" from publisher "${t}".`+(w.length>0?` Reasons: ${w.join("; ")}`:""));let _=G(),P="universal-default",E=n=>n.map(g=>g.metadata.namespace_?.version).filter(g=>g!==void 0).sort((g,b)=>V(b,g)).map(j);a(`[render-stack] resolving ${_.length} ambient look-stack package(s) (contract: ${P}); cache: ${u}`);let D=[],A=[];for(let n of _){let g=N(n),{doc:b,error:v}=await m(n.publisher,n.package_,void 0);if(b){D.push(b);let $=E([b]),F=y.has(g)?"fetched":f.has(g)?"cache":"fetched";A.push({...n,origin:F,versions:$}),a(`[render-stack] ${g} \u2014 ${F} (${$.join(", ")})`+(s.has(g)?" [cache write FAILED \u2014 will re-fetch next load]":""))}else A.push({...n,origin:"missing",reason:v??"unresolved"}),a(`[render-stack] ${g} \u2014 MISSING: ${v??"unresolved"}`)}let B=[],ce=await q([...S,...D],l,{onUnresolvedEdge:n=>B.push(n)}),le=new H(l,ce),I=await new oe(i).parseKanonaks(le),Y=new te(I),J=A.map(n=>n.origin==="missing"||re(I,{publisher:n.publisher,package_:n.package_,name:n.package_}).length>0?n:{...n,resolvedButNotInCatalog:!0}),K=z(J,B);for(let n of K)a(`[render-stack] WARNING: ${n}`);let L={contractSource:P,cachePath:u,packages:J,warnings:K},c=new Set,h=new Map;for(let n of await l.getAllDocumentsAsync()){let g=n.metadata.namespace_;if(!g?.version||g.publisher!==t)continue;let b=j(g.version),v=`${g.publisher}/${g.package_}@${b}`;c.add(v);let $=await l.getDocumentContentAsync(v);$!==null&&h.set(`${g.package_}@${b}`,$)}return ne({publisher:t,availablePublishers:[t],catalog:I,lookRenderer:Y,localNamespaces:c,rawByNsKey:h,renderStack:L})}import{VersionOperator as ie}from"@kanonak-protocol/types/document/models/enums";function ae(r){let{lookRenderer:e,publisher:i,renderStack:o,catalog:t}=r,a=e.explainStylesheet(e.publisherSubject(i)),u=[...a.tokens.entries()].map(([p,m])=>({name:p,value:m.value,source:`${m.sourceNamespace}/${m.sourceName}`,level:m.level})),d=a.baseStylesheet,f={present:d.css!==void 0,...d.sourceNamespace!==void 0?{source:d.sourceNamespace}:{},...d.scope!==void 0?{scope:d.scope}:{},...d.css!==void 0?{bytes:d.css.length}:{},...d.problem!==void 0?{problem:d.problem}:{},candidates:d.candidates},y=new Map;for(let p of t){let m=p.namespace;m&&y.set(m,(y.get(m)??0)+1)}let s=[...y.entries()].map(([p,m])=>({namespace:p,resources:m})).sort((p,m)=>p.namespace.localeCompare(m.namespace)),l=e.expressionFailures().map(p=>({carrier:p.carrier,reason:p.reason})),k=l.map(p=>`Expression carrier "${p.carrier}" did not compile: ${p.reason} Consequence: that value renders as nothing (and a parent operation consuming it may drop its whole tier). Fix: use a tx.Expression node class the runner implements, or remove the carrier.`);return{publisher:i,renderStack:{contractSource:o.contractSource,cachePath:o.cachePath,packages:o.packages.map(p=>({package_:N(p),origin:p.origin,...p.versions!==void 0?{versions:p.versions}:{},...p.reason!==void 0?{reason:p.reason}:{},...p.resolvedButNotInCatalog!==void 0?{resolvedButNotInCatalog:p.resolvedButNotInCatalog}:{}}))},stylesheet:{tokens:u,baseStylesheet:f,...a.look?{look:{sourceClass:`${a.look.sourceClass.publisher}/${a.look.sourceClass.package_}/${a.look.sourceClass.name}`}}:{}},expressionCarriers:l,catalog:s,warnings:[...o.warnings,...a.warnings.filter(p=>!o.warnings.includes(p)),...k]}}function Te(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function he(r){let e=Te,i=r.warnings.length===0,o=r.expressionCarriers.map(s=>`<tr><td><code>${e(s.carrier)}</code></td><td>${e(s.reason)}</td></tr>`).join(`
2
- `),t=r.warnings.length===0?'<p class="ok">\u2713 No problems detected \u2014 the render stack is fully resolved and pages should be styled.</p>':r.warnings.map(s=>`<div class="warn">\u26A0 ${e(s)}</div>`).join(`
1
+ import{c as xe}from"../chunk-BDTJIUS4.js";import{a as ye,d as J,f as Se,h as Z}from"../chunk-K76UUREI.js";import{l as $e,t as X,u as Q}from"../chunk-Z2444SWM.js";import"../chunk-X4V6DEZL.js";import"../chunk-SC5M74NM.js";import{a as O,b as W}from"../chunk-A224OOBZ.js";import{t as te}from"../chunk-GXEKJFXG.js";import"../chunk-QHABFCRC.js";import"../chunk-5FVUBF7N.js";import{a as fe}from"../chunk-WXXZOJ4O.js";import{k as re}from"../chunk-LKJVNKCN.js";import{a as B}from"../chunk-5ZRVFYCP.js";import{a as Re}from"../chunk-PEJALHXK.js";import"../chunk-WXUMROTA.js";import{c as we,y as ee}from"../chunk-PC3MYDGL.js";import"../chunk-F67UH4FD.js";import{c as V,e as j,f as L,g as Y,l as ve}from"../chunk-GGK6A6QK.js";import{a as be}from"../chunk-FUUTGGJS.js";import{readFileSync as le,writeFileSync as Ie,mkdirSync as Fe}from"fs";import{join as ne}from"path";import Me from"js-yaml";var Pe=[{publisher:"kanonak.org",package_:"core-kanonak"},{publisher:"kanonak.org",package_:"site"},{publisher:"kanonak.org",package_:"link"},{publisher:"kanonak.org",package_:"look-tokens"},{publisher:"kanonak.org",package_:"look-styles"},{publisher:"kanonak.org",package_:"look"},{publisher:"kanonak.org",package_:"universal-look"}];function q(r){return Pe}function C(r){return`${r.publisher}/${r.package_}`}function H(r,e=[]){let i={"kanonak.org/look-styles":"pages render UNSTYLED \u2014 generated CSS stops at the :root token block","kanonak.org/look-tokens":"the :root block loses the universal design-token floor (colors, fonts, spacing)","kanonak.org/universal-look":"resources without their own look render as an empty HTML comment","kanonak.org/look":"band vocabulary (Hero, PropertyList, \u2026) is unresolvable \u2014 declared looks cannot render","kanonak.org/site":"the site vocabulary (content, navigation) is unresolvable \u2014 the base stylesheet cannot bind","kanonak.org/core-kanonak":"the Package/Publisher classes are unresolvable \u2014 package and publisher pages degrade","kanonak.org/link":"link vocabulary is unresolvable \u2014 cross-reference styling degrades"},t=[];for(let o of r)if(o.origin==="missing"){let a=C(o),u=i[a]??"whatever this package contributes to rendering is lost";t.push(`Render-stack package ${a} is MISSING (${o.reason??"unknown reason"}) \u2014 ${u}. Fix: kanonak install ${a} (as the user running the render), or restore network access to ${o.publisher}.`)}else o.resolvedButNotInCatalog&&t.push(`Render-stack package ${C(o)} resolved (${o.origin}) but is NOT in the parsed catalog \u2014 this is a closure-scoping bug; please report it.`);for(let o of e)t.push(`Import edge ${o.fromNamespace} \u2192 ${o.publisher}/${o.packageName} ${o.constraint} did NOT resolve (${o.reason==="no-compatible-version"?"no compatible version in the repository":"resolution threw"}) \u2014 every statement ${o.fromNamespace} authors against ${o.publisher}/${o.packageName} entities is dropped from the parse as an unresolved predicate (a look declaration loses its bands and pages render empty; see typescript#91). Fix: add a ${o.constraint}-compatible version of ${o.publisher}/${o.packageName} to the workspace or cache (kanonak install ${o.publisher}/${o.packageName}), or bump the import in ${o.fromNamespace}.`);return t}function oe(r){let{publisher:e,availablePublishers:i,catalog:t,lookRenderer:o,localNamespaces:a,rawByNsKey:u,renderStack:d,producers:f,lockSource:y,configSource:s}=r,l=new Map,k=new Map,p=new Map,h=new Set;for(let S of t){if(!(S instanceof we))continue;let w=S.namespace||"";if(!a.has(w))continue;l.set(`${w}/${S.name}`,S);let P=w.split("/")[1]??"",[_,M]=P.split("@");if(!_||!M)continue;let E=Y(M);E&&(h.has(P)||(h.add(P),k.has(_)||k.set(_,[]),k.get(_).push({verStr:M,version:E})),S.name===_&&p.set(P,S))}for(let S of k.values())S.sort((w,P)=>V(P.version,w.version));return{publisher:e,availablePublishers:i,catalog:t,lookRenderer:o,localNamespaces:a,rawByNsKey:u,bySubject:l,pkgVersions:k,pkgSelfByVer:p,renderStack:d,...f?{producers:f}:{},...y?{lockSource:y}:{},...s?{configSource:s}:{}}}async function de(r,e={}){let i=new B,t=new fe(i),o=[],a=[];for(let c of Z(r)){let m;try{m=le(c,"utf-8")}catch{continue}let n;try{n=i.parse(m).metadata?.namespace_}catch{continue}if(!n?.version)continue;let g=n.version;a.push({publisher:n.publisher,package_:n.package_,verStr:j(g),version:g,source:m})}a.sort((c,m)=>V(m.version,c.version));for(let c of a)await t.saveDocumentAsync(i.parse(c.source),`${c.publisher}/${c.package_}@${c.verStr}`),o.push({publisher:c.publisher,package_:c.package_,verStr:c.verStr,source:c.source});let u=[...new Set(o.map(c=>c.publisher))].sort(),d=e.publisher;if(d){if(!u.includes(d))throw new Error(`Publisher "${d}" not found in workspace. Available: ${u.join(", ")||"(none)"}`)}else if(u.length===1)d=u[0];else throw u.length===0?new Error(`No Kanonak packages found under ${r}`):new Error(`Workspace has multiple publishers (${u.join(", ")}). Pass --publisher <domain> to choose which one to serve.`);let f=new Set,y=new Map;for(let c of o)c.publisher===d&&(f.add(`${c.publisher}/${c.package_}@${c.verStr}`),y.set(`${c.package_}@${c.verStr}`,c.source));let s=J(),l=new ye(s,!0,i),k={};e.httpCache&&(k.getFromCache=e.httpCache.getFromCache,k.onFetch=e.httpCache.onFetch),e.fetchFn&&(k.fetchFn=e.fetchFn),e.packageUrlTemplates&&(k.packageUrlTemplates=e.packageUrlTemplates);let p=e.repository??new Se(t,l,new Q(k)),h=e.log??(()=>{}),S=q(void 0),w=[],P=c=>c.map(m=>m.metadata.namespace_?.version).filter(m=>m!==void 0).sort((m,n)=>V(n,m)).map(j);if(!e.repository){h(`[render-stack] resolving ${S.length} ambient look-stack package(s); cache: ${s}`);let c=new X({...e.fetchFn?{fetchFn:e.fetchFn}:{},...e.packageUrlTemplates?{packageUrlTemplates:e.packageUrlTemplates}:{}});for(let m of S){let n=C(m),g=await t.getDocumentsByNamespaceAsync(m.publisher,m.package_);if(g.length>0){let v=P(g);w.push({...m,origin:"workspace",versions:v}),h(`[render-stack] ${n} \u2014 workspace (${v.join(", ")})`);continue}let b=await l.getDocumentsByNamespaceAsync(m.publisher,m.package_);if(b.length>0){let v=P(b);w.push({...m,origin:"cache",versions:v}),h(`[render-stack] ${n} \u2014 cache (${v.join(", ")})`);continue}try{let $=(await c.getLock(m.publisher))?.packages[`${m.publisher}/${m.package_}`];if(!$){let K=`publisher ${m.publisher} reachable but its lock does not pin ${m.package_}`;w.push({...m,origin:"missing",reason:K}),h(`[render-stack] ${n} \u2014 MISSING: ${K}`);continue}let I=$.version,{url:he,content:ke}=await c.fetchLockedSource(m.publisher,m.package_,$);await t.saveDocumentAsync(i.parse(ke),`${m.publisher}/${m.package_}@${I}`);try{let K=ne(s,m.publisher);Fe(K,{recursive:!0}),Ie(ne(K,`${m.package_}@${I}.kan.yml`),ke,"utf-8"),w.push({...m,origin:"fetched",versions:[I]}),h(`[render-stack] ${n}@${I} \u2014 fetched from ${he}, installed to cache`)}catch(K){w.push({...m,origin:"fetched",versions:[I]}),h(`[render-stack] ${n}@${I} \u2014 fetched from ${he}, but cache ${s} is NOT WRITABLE (${K.message}); usable for this load only \u2014 every load will re-fetch it`)}}catch(v){let $=`fetch failed: ${v.message}`;w.push({...m,origin:"missing",reason:$}),h(`[render-stack] ${n} \u2014 MISSING: ${$}`)}}}let _=(await t.getAllDocumentsAsync()).filter(c=>c.metadata.namespace_?.publisher===d);for(let c of S)_.push(...await p.getDocumentsByNamespaceAsync(c.publisher,c.package_));let M=[],E=await O(_,p,{onUnresolvedEdge:c=>M.push(c)}),A=p;if(!e.repository){for(let c of S)E.add(C(c));A=new W(p,E)}let T=await new re(i).parseKanonaks(A),ie=new te(T),ce=(c,m)=>ee(T,{publisher:c,package_:m,name:m}).length>0,N;if(e.repository){N=[];for(let c of S){let m=await p.getDocumentsByNamespaceAsync(c.publisher,c.package_);N.push(m.length>0?{...c,origin:"repository",versions:P(m)}:{...c,origin:"missing",reason:"not present in the caller-supplied repository"})}}else N=w.map(c=>c.origin==="missing"||ce(c.publisher,c.package_)?c:{...c,resolvedButNotInCatalog:!0});let G=H(N,M);for(let c of G)h(`[render-stack] WARNING: ${c}`);let z={contractSource:"universal-default",cachePath:s,packages:N,warnings:G},D;try{D=le(ne(r,"kanonak.lock"),"utf-8")}catch{D=Ee(d,o,i)}let U;try{U=le(ne(r,".well-known","kanonak.json"),"utf-8")}catch{U=void 0}return oe({publisher:d,availablePublishers:u,catalog:T,lookRenderer:ie,localNamespaces:f,rawByNsKey:y,renderStack:z,...D?{lockSource:D}:{},...U?{configSource:U}:{}})}function Ee(r,e,i){let t=new Map;for(let a of e)a.publisher===r&&(t.has(a.package_)||t.set(a.package_,{verStr:a.verStr,source:a.source}));if(t.size===0)return;let o={};for(let a of[...t.keys()].sort()){let{verStr:u,source:d}=t.get(a),f={},y;try{y=i.parse(d).metadata?.imports}catch{y=void 0}for(let l of y?.[r]??[]){let k=t.get(l.packageName);k&&(f[`${r}/${l.packageName}`]=k.verStr)}let s={};for(let l of Object.keys(f).sort())s[l]=f[l];o[`${r}/${a}`]={version:u,resolved:`https://${r}/${a}/${u}.kan.yml`,integrity:xe(d),dependencies:s}}return Me.dump({version:"1",lastUpdated:"",packages:o},{lineWidth:-1,sortKeys:!1,quotingType:'"'})}import{existsSync as De,readFileSync as Ke,writeFileSync as Ve,mkdirSync as Ae}from"fs";import{join as _e}from"path";async function pe(r,e={}){let i=new B,t=ve(r),o=t.kind==="resource"?t.uri.publisher:t.publisher,a=e.log??(()=>{}),u=e.cacheRoot??J(),d=(n,g,b)=>_e(u,n,`${g}@${b}.kan.yml`),f=new Set,y=new Set,s=new Map,l=new Q({getFromCache:(n,g,b)=>{let v=d(n,g,b),$=De(v)?Ke(v,"utf-8"):null;return $!==null&&f.add(`${n}/${g}`),$},onFetch:(n,g,b,v)=>{y.add(`${n}/${g}`);try{let $=_e(u,n);Ae($,{recursive:!0}),Ve(d(n,g,b),v,"utf-8")}catch($){s.set(`${n}/${g}`,$.message),a(`[render] fetched ${n}/${g}@${b} but cache ${u} is NOT WRITABLE (${$.message}); usable for this load only \u2014 every load will re-fetch it`)}},...e.fetchFn?{fetchFn:e.fetchFn}:{},...e.packageUrlTemplates?{packageUrlTemplates:e.packageUrlTemplates}:{}}),k=new X(e.fetchFn?{fetchFn:e.fetchFn}:void 0),p;if(t.kind==="resource"){let n=t.uri.version;p=[n?{package_:t.uri.package_,version:`${n.major}.${n.minor}.${n.patch}`}:{package_:t.uri.package_}]}else if(t.kind==="package"){let n=t.version;p=[n?{package_:t.package_,version:`${n.major}.${n.minor}.${n.patch}`}:{package_:t.package_}]}else p=((await k.getConfig(o)).featured_packages??[]).map(g=>({package_:g}));let h=async(n,g,b)=>{try{let v=b?i.buildImport(g,"=",b,n):i.buildImport(g,"*","0.0.0",n),$=await l.getHighestCompatibleVersionAsync(n,v);return $?{doc:$}:{doc:null,error:`${n} did not resolve ${g}${b?`@${b}`:""} (not in its index, or unreachable)`}}catch(v){return{doc:null,error:v.message}}},S=[],w=[];for(let n of p){let{doc:g,error:b}=await h(o,n.package_,n.version);g?S.push(g):b&&w.push(b)}if(S.length===0)throw new Error(`Could not fetch any package for address "${r}" from publisher "${o}".`+(w.length>0?` Reasons: ${w.join("; ")}`:""));let P=q(),_="universal-default",M=n=>n.map(g=>g.metadata.namespace_?.version).filter(g=>g!==void 0).sort((g,b)=>V(b,g)).map(j);a(`[render-stack] resolving ${P.length} ambient look-stack package(s) (contract: ${_}); cache: ${u}`);let E=[],A=[];for(let n of P){let g=C(n),{doc:b,error:v}=await h(n.publisher,n.package_,void 0);if(b){E.push(b);let $=M([b]),I=y.has(g)?"fetched":f.has(g)?"cache":"fetched";A.push({...n,origin:I,versions:$}),a(`[render-stack] ${g} \u2014 ${I} (${$.join(", ")})`+(s.has(g)?" [cache write FAILED \u2014 will re-fetch next load]":""))}else A.push({...n,origin:"missing",reason:v??"unresolved"}),a(`[render-stack] ${g} \u2014 MISSING: ${v??"unresolved"}`)}let T=[],ie=await O([...S,...E],l,{onUnresolvedEdge:n=>T.push(n)}),ce=new W(l,ie),N=await new re(i).parseKanonaks(ce),G=new te(N),z=A.map(n=>n.origin==="missing"||ee(N,{publisher:n.publisher,package_:n.package_,name:n.package_}).length>0?n:{...n,resolvedButNotInCatalog:!0}),D=H(z,T);for(let n of D)a(`[render-stack] WARNING: ${n}`);let U={contractSource:_,cachePath:u,packages:z,warnings:D},c=new Set,m=new Map;for(let n of await l.getAllDocumentsAsync()){let g=n.metadata.namespace_;if(!g?.version||g.publisher!==o)continue;let b=j(g.version),v=`${g.publisher}/${g.package_}@${b}`;c.add(v);let $=await l.getDocumentContentAsync(v);$!==null&&m.set(`${g.package_}@${b}`,$)}return oe({publisher:o,availablePublishers:[o],catalog:N,lookRenderer:G,localNamespaces:c,rawByNsKey:m,renderStack:U})}import{VersionOperator as ae}from"@kanonak-protocol/types/document/models/enums";function se(r){let{lookRenderer:e,publisher:i,renderStack:t,catalog:o}=r,a=e.explainStylesheet(e.publisherSubject(i)),u=[...a.tokens.entries()].map(([p,h])=>({name:p,value:h.value,source:`${h.sourceNamespace}/${h.sourceName}`,level:h.level})),d=a.baseStylesheet,f={present:d.css!==void 0,...d.sourceNamespace!==void 0?{source:d.sourceNamespace}:{},...d.scope!==void 0?{scope:d.scope}:{},...d.css!==void 0?{bytes:d.css.length}:{},...d.problem!==void 0?{problem:d.problem}:{},candidates:d.candidates},y=new Map;for(let p of o){let h=p.namespace;h&&y.set(h,(y.get(h)??0)+1)}let s=[...y.entries()].map(([p,h])=>({namespace:p,resources:h})).sort((p,h)=>p.namespace.localeCompare(h.namespace)),l=e.expressionFailures().map(p=>({carrier:p.carrier,reason:p.reason})),k=l.map(p=>`Expression carrier "${p.carrier}" did not compile: ${p.reason} Consequence: that value renders as nothing (and a parent operation consuming it may drop its whole tier). Fix: use a tx.Expression node class the runner implements, or remove the carrier.`);return{publisher:i,renderStack:{contractSource:t.contractSource,cachePath:t.cachePath,packages:t.packages.map(p=>({package_:C(p),origin:p.origin,...p.versions!==void 0?{versions:p.versions}:{},...p.reason!==void 0?{reason:p.reason}:{},...p.resolvedButNotInCatalog!==void 0?{resolvedButNotInCatalog:p.resolvedButNotInCatalog}:{}}))},stylesheet:{tokens:u,baseStylesheet:f,...a.look?{look:{sourceClass:`${a.look.sourceClass.publisher}/${a.look.sourceClass.package_}/${a.look.sourceClass.name}`}}:{}},expressionCarriers:l,catalog:s,warnings:[...t.warnings,...a.warnings.filter(p=>!t.warnings.includes(p)),...k]}}function Te(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function ue(r){let e=Te,i=r.warnings.length===0,t=r.expressionCarriers.map(s=>`<tr><td><code>${e(s.carrier)}</code></td><td>${e(s.reason)}</td></tr>`).join(`
2
+ `),o=r.warnings.length===0?'<p class="ok">\u2713 No problems detected \u2014 the render stack is fully resolved and pages should be styled.</p>':r.warnings.map(s=>`<div class="warn">\u26A0 ${e(s)}</div>`).join(`
3
3
  `),a=r.renderStack.packages.map(s=>{let l=s.origin!=="missing"&&!s.resolvedButNotInCatalog,k=s.origin==="missing"?'<span class="bad">MISSING</span>':s.resolvedButNotInCatalog?`<span class="bad">${e(s.origin)} (not in catalog)</span>`:`<span class="good">${e(s.origin)}</span>`,p=s.reason?e(s.reason):e((s.versions??[]).join(", "));return`<tr class="${l?"":"row-bad"}"><td><code>${e(s.package_)}</code></td><td>${k}</td><td>${p}</td></tr>`}).join(`
4
4
  `),u=r.stylesheet.baseStylesheet,d=u.present?`<p><span class="good">\u2713 present</span> \u2014 <code>${e(u.source??"")}</code> (${u.bytes} bytes, ${e(u.scope??"")})</p>`:`<p><span class="bad">\u2717 MISSING</span>${u.problem?` \u2014 ${e(u.problem)}`:""}${u.candidates.length>0?`<br>candidates considered: ${u.candidates.map(s=>`<code>${e(s)}</code>`).join(", ")}`:""}</p><p>Without the base stylesheet, generated CSS stops at the <code>:root</code> token block and pages appear unstyled.</p>`,f=r.stylesheet.tokens.map(s=>`<tr><td><code>--kan-${e(s.name)}</code></td><td><code>${e(s.value)}</code></td><td><code>${e(s.source)}</code></td><td>${e(s.level)}</td></tr>`).join(`
5
5
  `),y=r.catalog.map(s=>`<tr><td><code>${e(s.namespace)}</code></td><td>${s.resources}</td></tr>`).join(`
@@ -31,7 +31,7 @@ import{c as je}from"../chunk-R4LVLXAC.js";import{a as be,d as Q,f as we,h as ee}
31
31
  <p class="meta">Machine-readable version: <a href="/.well-known/kanonak-render.json"><code>/.well-known/kanonak-render.json</code></a></p>
32
32
 
33
33
  <h2>Problems</h2>
34
- ${t}
34
+ ${o}
35
35
 
36
36
  <h2>Ambient render stack</h2>
37
37
  <p class="meta">The look stack is discovered, not imported \u2014 these packages must be resolvable for any publisher's pages to render styled.
@@ -59,7 +59,7 @@ ${r.stylesheet.look?`<p><span class="good">\u2713</span> Bands resolve from <cod
59
59
  <p class="meta">Authored <code>tx.Expression</code> carriers (band paths, <code>semanticSvg</code> tiers) that failed to compile while rendering this page. A carrier that does not compile contributes nothing to the output.</p>
60
60
  ${r.expressionCarriers.length===0?'<p><span class="good">\u2713</span> Every expression carrier on this page compiled.</p>':`<table>
61
61
  <tr><th>Carrier</th><th>Reason</th></tr>
62
- ${o}
62
+ ${t}
63
63
  </table>`}
64
64
 
65
65
  <h2>Render catalog (${r.catalog.length} package version(s))</h2>
@@ -69,4 +69,4 @@ ${o}
69
69
  ${y}
70
70
  </table>
71
71
  </body>
72
- </html>`}var R={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".md":"text/markdown; charset=utf-8",".kan.yml":"application/yaml; charset=utf-8",".txt":"text/plain; charset=utf-8",".json":"application/json; charset=utf-8"},x=(r,e,i,o)=>({status:r,headers:{"Content-Type":e,...o||{}},body:i}),M=r=>x(404,R[".html"],`<!doctype html><meta charset=utf-8><title>404</title><h1>404</h1><p>Not found: ${r}</p>`),We=r=>({status:301,headers:{Location:r},body:""}),Ue=r=>({status:302,headers:{Location:r},body:""});function qe(r){switch(r.kind){case"exact":return{operator:ie.Exact,version:W(r.major,r.minor,r.patch)};case"minor-pin":return{operator:ie.Compatible,version:W(r.major,r.minor,0)};case"major-pin":return{operator:ie.Major,version:W(r.major,0,0)};default:return{operator:ie.Any,version:W(0,0,0)}}}async function He(r,e,i,o){if(!o)return null;let t=r.producers?.find(f=>f.canProduce(r.publisher,e));if(!t)return null;let a=await t.resolveVersion(r.publisher,e,qe(i));if(!a)return null;let u=j(a);if(i.kind!=="exact")return Ue(`/${e}/${u}.kan.yml`);let{source:d}=await t.produce(r.publisher,e,a);return x(200,R[".kan.yml"],d)}function Ie(r,e,i){let o=r.pkgVersions.get(e);if(!o||o.length===0)return null;switch(i.kind){case"any":return o[0].verStr;case"major-pin":return o.find(t=>t.version.major===i.major)?.verStr??null;case"minor-pin":return o.find(t=>t.version.major===i.major&&t.version.minor===i.minor)?.verStr??null;case"exact":return o.find(t=>t.version.major===i.major&&t.version.minor===i.minor&&t.version.patch===i.patch)?.verStr??null;default:return null}}async function me(r,e,i=""){let{lookRenderer:o,publisher:t}=r;if(e==="/.well-known/kanonak.json")return r.configSource?x(200,R[".json"],r.configSource):x(200,R[".json"],JSON.stringify(Se(),null,2));if(e==="/kanonak.lock")return r.lockSource?x(200,R[".kan.yml"],r.lockSource):M(e);if(e==="/.well-known/kanonak-render.json")return x(200,R[".json"],JSON.stringify(ae(r),null,2));if(e==="/.well-known/kanonak-render")return x(200,R[".html"],he(ae(r)));if(e==="/"||e==="/index.html"||e==="/index.css"){let l=o.publisherSubject(t);return e==="/index.css"?x(200,R[".css"],o.renderStylesheet(l)):x(200,R[".html"],await o.renderDocument(l,{rootIndex:!0}))}let a=".html",u=!1,d=e;for(let l of[".kan.yml",".css",".svg",".md",".html"])if(e.endsWith(l)){a=l,u=!0,d=e.slice(0,-l.length);break}let f=!u&&/application\/yaml|text\/yaml/i.test(i),y=d.endsWith("/");y&&d!=="/"&&(d=d.slice(0,-1));let s=Pe.parse(d,t);if(!s)return M(e);if(s.kind==="package"){let l=Ie(r,s.package_,s.versionSpec);if(!l)return await He(r,s.package_,s.versionSpec,a===".kan.yml"||f)??M(e);if(a===".kan.yml"||f){let m=r.rawByNsKey.get(`${s.package_}@${l}`);return m!==void 0?x(200,R[".kan.yml"],m):M(e)}let k=r.pkgSelfByVer.get(`${s.package_}@${l}`);if(!k)return M(e);if(a===".css")return x(200,R[".css"],o.renderStylesheet(k));if(!y)return We(d+"/");let p=s.versionSpec.kind==="any";if(p&&!o.hasDeclaredView(k)){let m=(r.pkgVersions.get(s.package_)||[]).map(S=>S.verStr);return x(200,R[".html"],o.renderPackageVersionList(s.package_,m,k))}return x(200,R[".html"],await o.renderDocument(k,p?{bareOverview:!0}:void 0))}if(s.kind==="resource"){let l=Ie(r,s.package_,s.versionSpec);if(!l)return M(e);let k=r.bySubject.get(`${t}/${s.package_}@${l}/${s.name}`);if(!k)return M(e);switch(a){case".css":return x(200,R[".css"],o.renderStylesheet(k));case".svg":return x(200,R[".svg"],await o.renderSvg(k));case".md":{let p=o.renderRawMarkdown(k);return p===void 0?M(e):x(200,R[".md"],p)}default:return x(200,R[".html"],await o.renderDocument(k))}}return M(e)}import{readFileSync as Ge}from"fs";var Fe=/^\d+\.\d+\.\d+$/,ke=class{constructor(e={}){this.options=e}options;models=new Map;workspaceIndex;clearCache(){this.models.clear(),this.workspaceIndex=void 0}getWorkspaceIndex(){if(this.workspaceIndex)return this.workspaceIndex;let e=new Set,i=new Set;if(this.options.root!==void 0){let o=new O;for(let t of ee(this.options.root))try{let a=o.parse(Ge(t,"utf-8")).metadata?.namespace_;if(!a?.version)continue;let u=a.version;e.add(`${a.publisher}/${a.package_}@${u.major}.${u.minor}.${u.patch}`),i.add(`${a.publisher}/${a.package_}`)}catch{}}return this.workspaceIndex={exact:e,pkgs:i},this.workspaceIndex}async modelFor(e,i,o){let t=this.getWorkspaceIndex(),a={...this.options.fetchFn?{fetchFn:this.options.fetchFn}:{},...this.options.log?{log:this.options.log}:{}},u=i?o?t.exact.has(`${e}/${i}@${o}`):t.pkgs.has(`${e}/${i}`):[...t.pkgs].some(l=>l.startsWith(`${e}/`)),d,f;if(u&&this.options.root!==void 0){let l=this.options.root;d=`ws:${e}`,f=()=>ue(l,{publisher:e,...a})}else{let l=i?o?`${e}/${i}@${o}`:`${e}/${i}`:e;d=`rm:${l}`,f=()=>ge(l,a)}let y=this.models.get(d);if(y)return y;let s=await f();return s.lookRenderer.setLinkMode("open-world"),this.models.set(d,s),s}async handle(e,i=""){let o=e.split("/").filter(Boolean);if(o.length===0)return{status:200,headers:{"Content-Type":"text/html; charset=utf-8"},body:Me()};let t=o[0];if(!t.includes("."))return{status:404,headers:{"Content-Type":"text/html; charset=utf-8"},body:"<!doctype html><meta charset=utf-8><title>404</title><h1>404</h1><p>Expected a publisher domain as the first path segment: <code>/{publisher}/{package}/{version}/{resource}</code></p>"};let a=o.length>=2&&(o[1]==="index.html"||o[1]==="index.css"||o[1]==="kanonak.lock"||o[1]===".well-known"),u=!a&&o.length>=2?o[1]:void 0,d=!a&&o.length>=3&&Fe.test(o[2])?o[2]:void 0,f=await this.modelFor(t,u,d),y=e.endsWith("/")&&o.length>1?"/":"",s="/"+o.slice(1).join("/")+y,l=await me(f,s,i);return l.headers.Location?{...l,headers:{...l.headers,Location:`/${t}${l.headers.Location}`}}:l}};function ze(r){switch(r.kind){case"publisher":return`/${r.publisher}/`;case"package":return r.version?`/${r.publisher}/${r.package_}/${j(r.version)}/`:`/${r.publisher}/${r.package_}/`;case"resource":{let e=r.uri;return e.version?`/${e.publisher}/${e.package_}/${j(e.version)}/${e.name}`:`/${e.publisher}/${e.package_}/${e.name}`}}}function Ye(r){let e=r.split("/").filter(Boolean),i=e[0];if(!i||!i.includes("."))return;let o=e[1];if(!o)return{kind:"publisher",publisher:i};let t=e[2]&&Fe.test(e[2])?X(e[2])??void 0:void 0,a=t?e[3]:e[2];return a?{kind:"resource",uri:new xe(i,o,a,t)}:t?{kind:"package",publisher:i,package_:o,version:t}:{kind:"package",publisher:i,package_:o}}function Me(){return'<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Kanonak origin</title></head><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem"><h1>Kanonak request-driven origin</h1><p>Open a resource by its address:</p><p><code>/{publisher}/{package}/{version}/{resource}</code></p><p>e.g. <code>/kanonak.org/capabilities/2.0.0/Capability</code></p></body></html>'}export{H as ClosureScopedRepository,ke as RequestRouter,Ce as UNIVERSAL_RENDER_BASE,Ye as addressForRequestPath,ae as buildRenderDiagnostics,z as buildRenderStackWarnings,q as deriveImportClosure,Me as landingPage,ge as loadResourceModel,ue as loadServerModel,he as renderDiagnosticsHtml,N as renderRefKey,ze as requestPathFor,G as resolveRenderContract,me as route};
72
+ </html>`}var R={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".md":"text/markdown; charset=utf-8",".kan.yml":"application/yaml; charset=utf-8",".txt":"text/plain; charset=utf-8",".json":"application/json; charset=utf-8"},x=(r,e,i,t)=>({status:r,headers:{"Content-Type":e,...t||{}},body:i}),F=r=>x(404,R[".html"],`<!doctype html><meta charset=utf-8><title>404</title><h1>404</h1><p>Not found: ${r}</p>`),Ue=r=>({status:301,headers:{Location:r},body:""}),Be=r=>({status:302,headers:{Location:r},body:""});function Le(r){switch(r.kind){case"exact":return{operator:ae.Exact,version:L(r.major,r.minor,r.patch)};case"minor-pin":return{operator:ae.Compatible,version:L(r.major,r.minor,0)};case"major-pin":return{operator:ae.Major,version:L(r.major,0,0)};default:return{operator:ae.Any,version:L(0,0,0)}}}async function Oe(r,e,i,t){if(!t)return null;let o=r.producers?.find(f=>f.canProduce(r.publisher,e));if(!o)return null;let a=await o.resolveVersion(r.publisher,e,Le(i));if(!a)return null;let u=j(a);if(i.kind!=="exact")return Be(`/${e}/${u}.kan.yml`);let{source:d}=await o.produce(r.publisher,e,a);return x(200,R[".kan.yml"],d)}function je(r,e,i){let t=r.pkgVersions.get(e);if(!t||t.length===0)return null;switch(i.kind){case"any":return t[0].verStr;case"major-pin":return t.find(o=>o.version.major===i.major)?.verStr??null;case"minor-pin":return t.find(o=>o.version.major===i.major&&o.version.minor===i.minor)?.verStr??null;case"exact":return t.find(o=>o.version.major===i.major&&o.version.minor===i.minor&&o.version.patch===i.patch)?.verStr??null;default:return null}}async function ge(r,e,i=""){let{lookRenderer:t,publisher:o}=r;if(e==="/.well-known/kanonak.json")return r.configSource?x(200,R[".json"],r.configSource):x(200,R[".json"],JSON.stringify($e(),null,2));if(e==="/kanonak.lock")return r.lockSource?x(200,R[".kan.yml"],r.lockSource):F(e);if(e==="/.well-known/kanonak-render.json")return x(200,R[".json"],JSON.stringify(se(r),null,2));if(e==="/.well-known/kanonak-render")return x(200,R[".html"],ue(se(r)));if(e==="/"||e==="/index.html"||e==="/index.css"){let l=t.publisherSubject(o);return e==="/index.css"?x(200,R[".css"],t.renderStylesheet(l)):x(200,R[".html"],await t.renderDocument(l,{rootIndex:!0}))}let a=".html",u=!1,d=e;for(let l of[".kan.yml",".css",".svg",".md",".html"])if(e.endsWith(l)){a=l,u=!0,d=e.slice(0,-l.length);break}let f=!u&&/application\/yaml|text\/yaml/i.test(i),y=d.endsWith("/");y&&d!=="/"&&(d=d.slice(0,-1));let s=Re.parse(d,o);if(!s)return F(e);if(s.kind==="package"){let l=je(r,s.package_,s.versionSpec);if(!l)return await Oe(r,s.package_,s.versionSpec,a===".kan.yml"||f)??F(e);if(a===".kan.yml"||f){let h=r.rawByNsKey.get(`${s.package_}@${l}`);return h!==void 0?x(200,R[".kan.yml"],h):F(e)}let k=r.pkgSelfByVer.get(`${s.package_}@${l}`);if(!k)return F(e);if(a===".css")return x(200,R[".css"],t.renderStylesheet(k));if(!y)return Ue(d+"/");let p=s.versionSpec.kind==="any";if(p&&!t.hasDeclaredView(k)){let h=(r.pkgVersions.get(s.package_)||[]).map(S=>S.verStr);return x(200,R[".html"],t.renderPackageVersionList(s.package_,h,k))}return x(200,R[".html"],await t.renderDocument(k,p?{bareOverview:!0}:void 0))}if(s.kind==="resource"){let l=je(r,s.package_,s.versionSpec);if(!l)return F(e);let k=r.bySubject.get(`${o}/${s.package_}@${l}/${s.name}`);if(!k)return F(e);switch(a){case".css":return x(200,R[".css"],t.renderStylesheet(k));case".svg":return x(200,R[".svg"],await t.renderSvg(k));case".md":{let p=t.renderRawMarkdown(k);return p===void 0?F(e):x(200,R[".md"],p)}default:return x(200,R[".html"],await t.renderDocument(k))}}return F(e)}import{readFileSync as We}from"fs";var Ce=/^\d+\.\d+\.\d+$/,me=class{constructor(e={}){this.options=e}options;models=new Map;workspaceIndex;clearCache(){this.models.clear(),this.workspaceIndex=void 0}getWorkspaceIndex(){if(this.workspaceIndex)return this.workspaceIndex;let e=new Set,i=new Set;if(this.options.root!==void 0){let t=new B;for(let o of Z(this.options.root))try{let a=t.parse(We(o,"utf-8")).metadata?.namespace_;if(!a?.version)continue;let u=a.version;e.add(`${a.publisher}/${a.package_}@${u.major}.${u.minor}.${u.patch}`),i.add(`${a.publisher}/${a.package_}`)}catch{}}return this.workspaceIndex={exact:e,pkgs:i},this.workspaceIndex}async modelFor(e,i,t){let o=this.getWorkspaceIndex(),a={...this.options.fetchFn?{fetchFn:this.options.fetchFn}:{},...this.options.packageUrlTemplates?{packageUrlTemplates:this.options.packageUrlTemplates}:{},...this.options.log?{log:this.options.log}:{}},u=i?t?o.exact.has(`${e}/${i}@${t}`):o.pkgs.has(`${e}/${i}`):[...o.pkgs].some(l=>l.startsWith(`${e}/`)),d,f;if(u&&this.options.root!==void 0){let l=this.options.root;d=`ws:${e}`,f=()=>de(l,{publisher:e,...a})}else{let l=i?t?`${e}/${i}@${t}`:`${e}/${i}`:e;d=`rm:${l}`,f=()=>pe(l,a)}let y=this.models.get(d);if(y)return y;let s=await f();return s.lookRenderer.setLinkMode("open-world"),this.models.set(d,s),s}async handle(e,i=""){let t=e.split("/").filter(Boolean);if(t.length===0)return{status:200,headers:{"Content-Type":"text/html; charset=utf-8"},body:Ne()};let o=t[0];if(!o.includes("."))return{status:404,headers:{"Content-Type":"text/html; charset=utf-8"},body:"<!doctype html><meta charset=utf-8><title>404</title><h1>404</h1><p>Expected a publisher domain as the first path segment: <code>/{publisher}/{package}/{version}/{resource}</code></p>"};let a=t.length>=2&&(t[1]==="index.html"||t[1]==="index.css"||t[1]==="kanonak.lock"||t[1]===".well-known"),u=!a&&t.length>=2?t[1]:void 0,d=!a&&t.length>=3&&Ce.test(t[2])?t[2]:void 0,f=await this.modelFor(o,u,d),y=e.endsWith("/")&&t.length>1?"/":"",s="/"+t.slice(1).join("/")+y,l=await ge(f,s,i);return l.headers.Location?{...l,headers:{...l.headers,Location:`/${o}${l.headers.Location}`}}:l}};function qe(r){switch(r.kind){case"publisher":return`/${r.publisher}/`;case"package":return r.version?`/${r.publisher}/${r.package_}/${j(r.version)}/`:`/${r.publisher}/${r.package_}/`;case"resource":{let e=r.uri;return e.version?`/${e.publisher}/${e.package_}/${j(e.version)}/${e.name}`:`/${e.publisher}/${e.package_}/${e.name}`}}}function He(r){let e=r.split("/").filter(Boolean),i=e[0];if(!i||!i.includes("."))return;let t=e[1];if(!t)return{kind:"publisher",publisher:i};let o=e[2]&&Ce.test(e[2])?Y(e[2])??void 0:void 0,a=o?e[3]:e[2];return a?{kind:"resource",uri:new be(i,t,a,o)}:o?{kind:"package",publisher:i,package_:t,version:o}:{kind:"package",publisher:i,package_:t}}function Ne(){return'<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Kanonak origin</title></head><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem"><h1>Kanonak request-driven origin</h1><p>Open a resource by its address:</p><p><code>/{publisher}/{package}/{version}/{resource}</code></p><p>e.g. <code>/kanonak.org/capabilities/2.0.0/Capability</code></p></body></html>'}export{W as ClosureScopedRepository,me as RequestRouter,Pe as UNIVERSAL_RENDER_BASE,He as addressForRequestPath,se as buildRenderDiagnostics,H as buildRenderStackWarnings,O as deriveImportClosure,Ne as landingPage,pe as loadResourceModel,de as loadServerModel,ue as renderDiagnosticsHtml,C as renderRefKey,qe as requestPathFor,q as resolveRenderContract,ge as route};
@@ -1,8 +1,11 @@
1
1
  import type { AuthenticatedFetchFn } from '../auth/index.js';
2
+ import type { PackageUrlTemplates } from '../repositories/PackageUrlTemplates.js';
2
3
  import type { ServerModel } from './types.js';
3
4
  export interface LoadResourceModelOptions {
4
5
  /** Authenticated fetch used for every HTTP request (config, index, package). */
5
6
  fetchFn?: AuthenticatedFetchFn;
7
+ /** The consumer's package URL templates (#130): where package sources are fetched from. */
8
+ packageUrlTemplates?: PackageUrlTemplates;
6
9
  /** Override the global cache directory (the untrusted download accelerator). */
7
10
  cacheRoot?: string;
8
11
  /**