@kanonak-protocol/sdk 5.38.0 → 6.0.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.
@@ -1 +1 @@
1
- import{i as b,o as A}from"./chunk-OOYGILH4.js";import{a as P}from"./chunk-6VIUXP4N.js";import{a as f}from"./chunk-7JBKOJB4.js";import{c as K,g as I,j as R}from"./chunk-QILEJIFU.js";import*as i from"fs/promises";import*as c from"path";import{pathToFileURL as F}from"url";var y=class{rootPath;recursive;parser;documentCache;filePathsByIdentifier;cacheInitialized=!1;cacheInitPromise=null;parsingErrors=new Map;constructor(e,t=!0,n){if(!e||e.trim().length===0)throw new Error("Root path cannot be null or empty");this.rootPath=c.resolve(e),this.recursive=t,this.parser=n??new f,this.documentCache=new Map,this.filePathsByIdentifier=new Map}async getAllDocumentsAsync(){await this.ensureCacheInitialized();let e=new Set(this.documentCache.values());return Array.from(e)}async getDocumentAsync(e){await this.ensureCacheInitialized();let t=this.documentCache.get(e);if(t)return t;let n=c.join(this.rootPath,e);if(t=this.documentCache.get(n),t)return t;for(let o of[".kan.yml",".yml",".yaml"])if(!e.endsWith(o)){let s=e+o;if(t=this.documentCache.get(s),t)return t;let a=c.join(this.rootPath,s);if(t=this.documentCache.get(a),t)return t}return null}async getDocumentsByNamespaceAsync(e,t){await this.ensureCacheInitialized();let n=new Set(this.documentCache.values());return Array.from(n).filter(o=>o.metadata.namespace_?.publisher===e&&o.metadata.namespace_?.package_===t)}async getHighestCompatibleVersionAsync(e,t){await this.ensureCacheInitialized();let n=new Set(this.documentCache.values()),o=Array.from(n).filter(a=>a.metadata?.namespace_?.publisher===e&&a.metadata?.namespace_?.package_===t.packageName&&a.metadata?.namespace_?.version!==void 0);if(o.length===0)return null;let s=o.filter(a=>{let r=a.metadata.namespace_.version;return R(r,t)});return s.length===0?null:(s.sort((a,r)=>{let m=a.metadata.namespace_.version,p=r.metadata.namespace_.version;return K(p,m)}),s[0])}async saveDocumentAsync(e,t){let n,o=e.metadata.namespace_?.toString();if(o&&o.includes("@")&&o.includes("/")){let m=o.split("/"),p=m[0],h=m[1].replace("@","@")+".kan.yml";n=c.join(this.rootPath,p,h)}else n=c.join(this.rootPath,t),!n.endsWith(".yml")&&!n.endsWith(".yaml")&&!n.endsWith(".kan.yml")&&(n+=".kan.yml");let s=c.dirname(n);await i.mkdir(s,{recursive:!0});let a=this.parser.save(e);await i.writeFile(n,a,"utf8"),o&&this.documentCache.set(o,e),this.documentCache.set(n,e);let r=c.relative(this.rootPath,n);this.documentCache.set(r,e)}async deleteDocumentAsync(e){let t=await this.getDocumentAsync(e);if(!t)return;let n=this.filePathsByIdentifier.get(e);if(!n)return;try{await i.unlink(n)}catch{}let o=t.metadata.namespace_?.toString();o&&this.documentCache.delete(o),this.documentCache.delete(e),this.documentCache.delete(n);let s=c.relative(this.rootPath,n);this.documentCache.delete(s)}async clearNamespaceAsync(e,t){await this.ensureCacheInitialized();let n=[];for(let[s,a]of this.documentCache.entries()){let r=a.metadata.namespace_?.toString()||"";r.includes(e)&&r.includes(t)&&n.push([s,a])}let o=c.join(this.rootPath,e);try{let s=await i.readdir(o);for(let a of s)a.includes(t)&&a.endsWith(".kan.yml")&&await i.unlink(c.join(o,a))}catch{}for(let[s]of n)this.documentCache.delete(s)}async getAllDocumentReferencesAsync(){await this.ensureCacheInitialized();let e=new Set(this.filePathsByIdentifier.values()),t=[];for(let n of e){let o=F(n).toString(),s;for(let[m,p]of this.documentCache.entries())if(this.filePathsByIdentifier.get(m)===n&&p.metadata.namespace_){s=p.metadata.namespace_.toString();break}let a=s??c.relative(this.rootPath,n),r=this.parsingErrors.has(n);t.push({identifier:a,uri:o,hasParseError:r})}return t}async getDocumentContentAsync(e){await this.ensureCacheInitialized();let t=this.filePathsByIdentifier.get(e);if(!t)try{await i.access(e),t=e}catch{let n=c.join(this.rootPath,e);try{await i.access(n),t=n}catch{return null}}try{return await i.readFile(t,"utf8")}catch{return null}}async getDocumentUriAsync(e){await this.ensureCacheInitialized();let t=this.filePathsByIdentifier.get(e);if(!t)try{await i.access(e),t=e}catch{let n=c.join(this.rootPath,e);try{await i.access(n),t=n}catch{return null}}return F(t).toString()}async refreshAsync(){this.documentCache.clear(),this.filePathsByIdentifier.clear(),this.parsingErrors.clear(),this.cacheInitialized=!1,this.cacheInitPromise=null,await this.ensureCacheInitialized()}async ensureCacheInitialized(){if(!this.cacheInitialized){if(this.cacheInitPromise){await this.cacheInitPromise;return}this.cacheInitPromise=this.loadDocuments(),await this.cacheInitPromise,this.cacheInitialized=!0}}async loadDocuments(){try{await i.mkdir(this.rootPath,{recursive:!0})}catch{}let t=(await this.findYamlFiles(this.rootPath,this.recursive)).map(async o=>{try{let s=await i.readFile(o,"utf8"),a=this.parser.parse(s);return{filePath:o,document:a,error:null}}catch(s){return{filePath:o,document:null,error:s instanceof Error?s.message:String(s)}}}),n=await Promise.all(t);for(let{filePath:o,document:s,error:a}of n){let r=c.relative(this.rootPath,o);if(s&&s.metadata.namespace_){let m=s.metadata.namespace_.toString();this.documentCache.set(m,s),this.documentCache.set(o,s),this.documentCache.set(r,s),this.filePathsByIdentifier.set(m,o),this.filePathsByIdentifier.set(o,o),this.filePathsByIdentifier.set(r,o)}else this.filePathsByIdentifier.set(o,o),this.filePathsByIdentifier.set(r,o);a&&this.parsingErrors.set(o,a)}}async findYamlFiles(e,t){let n=[];try{let o=await i.readdir(e,{withFileTypes:!0});for(let s of o){let a=c.join(e,s.name);if(s.isDirectory()&&t){let r=await this.findYamlFiles(a,t);n.push(...r)}else s.isFile()&&s.name.endsWith(".kan.yml")&&n.push(a)}}catch{}return n}};import*as g from"fs";var S=(n=>(n.NotFound="NotFound",n.Workspace="Workspace",n.Cache="Cache",n))(S||{}),D=class{cache;workspace;constructor(e,t,n){let o=n??new f;g.existsSync(e)||g.mkdirSync(e,{recursive:!0}),g.existsSync(t)||g.mkdirSync(t,{recursive:!0}),this.cache=new y(e,!0,o),this.workspace=new y(t,!0,o)}getCache(){return this.cache}getWorkspace(){return this.workspace}async getAllDocumentsAsync(){let e=await this.workspace.getAllDocumentsAsync(),t=await this.cache.getAllDocumentsAsync(),n=new Map;for(let o of t)if(o.metadata.namespace_){let s=o.metadata.namespace_.toString();n.set(s,o)}for(let o of e)if(o.metadata.namespace_){let s=o.metadata.namespace_.toString();n.set(s,o)}return Array.from(n.values())}async getDocumentAsync(e){let t=await this.workspace.getDocumentAsync(e);return t||await this.cache.getDocumentAsync(e)}async getDocumentsByNamespaceAsync(e,t){let n=await this.workspace.getDocumentsByNamespaceAsync(e,t),o=await this.cache.getDocumentsByNamespaceAsync(e,t),s=new Map;for(let a of o)if(a.metadata.namespace_?.version){let r=a.metadata.namespace_.version.toString();s.set(r,a)}for(let a of n)if(a.metadata.namespace_?.version){let r=a.metadata.namespace_.version.toString();s.set(r,a)}return Array.from(s.values())}async getHighestCompatibleVersionAsync(e,t){let n=await this.workspace.getHighestCompatibleVersionAsync(e,t);return n||await this.cache.getHighestCompatibleVersionAsync(e,t)}async saveDocumentAsync(e,t){await this.workspace.saveDocumentAsync(e,t)}async saveToCacheAsync(e,t){await this.cache.saveDocumentAsync(e,t)}async deleteDocumentAsync(e){await this.workspace.deleteDocumentAsync(e)}async clearNamespaceAsync(e,t){await this.workspace.clearNamespaceAsync(e,t)}async getAllDocumentReferencesAsync(){let e=await this.workspace.getAllDocumentReferencesAsync(),t=await this.cache.getAllDocumentReferencesAsync(),n=[];return n.push(...e),n.push(...t),n}async getDocumentContentAsync(e){let t=await this.workspace.getDocumentContentAsync(e);return t||await this.cache.getDocumentContentAsync(e)}async getDocumentUriAsync(e){let t=await this.workspace.getDocumentUriAsync(e);return t||await this.cache.getDocumentUriAsync(e)}async getDocumentLocationAsync(e){return await this.workspace.getDocumentAsync(e)?"Workspace":await this.cache.getDocumentAsync(e)?"Cache":"NotFound"}};import{homedir as _}from"os";import{join as H}from"path";function d(){let u=process.env.KANONAK_PACKAGE_CACHE;return u||H(_(),".kanonak","packages")}var w=class u{static createComposite(e,t,n){let o=e??d(),s=t??".";return new D(o,s,n)}static createFromEnvironment(e){let t=d(),n=process.env.KANONAK_WORKSPACE_PATH??".";return u.createComposite(t,n,e)}};var k=class{repos;constructor(...e){this.repos=e}async getHighestCompatibleVersionAsync(e,t){for(let n of this.repos)try{let o=await n.getHighestCompatibleVersionAsync(e,t);if(o)return o}catch{}return null}async getAllDocumentsAsync(){let e=[],t=new Set;for(let n of this.repos)try{for(let o of await n.getAllDocumentsAsync()){let s=o.metadata?.namespace_,a=s?s.version?`${s.publisher}/${s.package_}@${s.version.major}.${s.version.minor}.${s.version.patch}`:`${s.publisher}/${s.package_}`:void 0;if(a!==void 0){if(t.has(a))continue;t.add(a)}e.push(o)}}catch{}return e}async getDocumentAsync(e){for(let t of this.repos)try{let n=await t.getDocumentAsync(e);if(n)return n}catch{}return null}async getDocumentsByNamespaceAsync(e,t){for(let n of this.repos)try{let o=await n.getDocumentsByNamespaceAsync(e,t);if(o.length>0)return o}catch{}return[]}async saveDocumentAsync(e,t){await this.repos[0].saveDocumentAsync(e,t)}async deleteDocumentAsync(e){await this.repos[0].deleteDocumentAsync(e)}async clearNamespaceAsync(e,t){await this.repos[0].clearNamespaceAsync(e,t)}async getAllDocumentReferencesAsync(){return this.repos[0].getAllDocumentReferencesAsync()}async getDocumentContentAsync(e){for(let t of this.repos)try{let n=await t.getDocumentContentAsync(e);if(n)return n}catch{}return null}async getDocumentUriAsync(e){for(let t of this.repos)try{let n=await t.getDocumentUriAsync(e);if(n)return n}catch{}return null}};import{VersionOperator as N}from"@kanonak-protocol/types/document/models/enums";var v=class{constructor(e,t){this.base=e;this.lock=t}base;lock;pinnedVersion(e,t){return b(this.lock,e,t)}async getHighestCompatibleVersionAsync(e,t){let n=this.pinnedVersion(e,t.packageName);if(n){let o=I(n);if(o){let s={...t,versionOperator:N.Exact,version:o};return this.base.getHighestCompatibleVersionAsync(e,s)}}return this.base.getHighestCompatibleVersionAsync(e,t)}async getDocumentsByNamespaceAsync(e,t){let n=await this.base.getDocumentsByNamespaceAsync(e,t),o=this.pinnedVersion(e,t);return o?n.filter(s=>{let a=s.metadata.namespace_?.version;return a?`${a.major}.${a.minor}.${a.patch}`===o:!1}):n}getAllDocumentsAsync(){return this.base.getAllDocumentsAsync()}getDocumentAsync(e){return this.base.getDocumentAsync(e)}saveDocumentAsync(e,t){return this.base.saveDocumentAsync(e,t)}deleteDocumentAsync(e){return this.base.deleteDocumentAsync(e)}clearNamespaceAsync(e,t){return this.base.clearNamespaceAsync(e,t)}getAllDocumentReferencesAsync(){return this.base.getAllDocumentReferencesAsync()}getDocumentContentAsync(e){return this.base.getDocumentContentAsync(e)}getDocumentUriAsync(e){return this.base.getDocumentUriAsync(e)}};import{readFileSync as B,readdirSync as V}from"fs";import{join as x}from"path";var $=new Set(["node_modules",".kanonak",".git","_site","build",".stage"]);function C(u,e=[]){for(let t of V(u,{withFileTypes:!0}))t.isDirectory()?$.has(t.name)||C(x(u,t.name),e):t.name.endsWith(".kan.yml")&&e.push(x(u,t.name));return e}async function j(u,e=new f,t={}){let n=new P(e);for(let m of C(u))try{let p=e.parse(B(m,"utf-8")),l=p.metadata?.namespace_,h=l?.version;l&&h&&await n.saveDocumentAsync(p,`${l.publisher}/${l.package_}@${h.major}.${h.minor}.${h.patch}`)}catch{}let o=new y(d(),!0,e);if(t.offline)return new k(n,o);let s=new Map,a=t.httpCache??{getFromCache:(m,p,l)=>s.get(`${m}|${p}|${l}`)??null,onFetch:(m,p,l,h)=>{s.set(`${m}|${p}|${l}`,h)}},r=new A({getFromCache:a.getFromCache,onFetch:a.onFetch});return new k(n,o,r)}export{y as a,S as b,D as c,d,w as e,k as f,v as g,C as h,j as i};
1
+ import{n as b,t as A}from"./chunk-HKQTB65D.js";import{a as P}from"./chunk-6VIUXP4N.js";import{a as f}from"./chunk-7JBKOJB4.js";import{c as K,g as I,j as R}from"./chunk-QILEJIFU.js";import*as i from"fs/promises";import*as c from"path";import{pathToFileURL as F}from"url";var y=class{rootPath;recursive;parser;documentCache;filePathsByIdentifier;cacheInitialized=!1;cacheInitPromise=null;parsingErrors=new Map;constructor(e,t=!0,n){if(!e||e.trim().length===0)throw new Error("Root path cannot be null or empty");this.rootPath=c.resolve(e),this.recursive=t,this.parser=n??new f,this.documentCache=new Map,this.filePathsByIdentifier=new Map}async getAllDocumentsAsync(){await this.ensureCacheInitialized();let e=new Set(this.documentCache.values());return Array.from(e)}async getDocumentAsync(e){await this.ensureCacheInitialized();let t=this.documentCache.get(e);if(t)return t;let n=c.join(this.rootPath,e);if(t=this.documentCache.get(n),t)return t;for(let o of[".kan.yml",".yml",".yaml"])if(!e.endsWith(o)){let s=e+o;if(t=this.documentCache.get(s),t)return t;let a=c.join(this.rootPath,s);if(t=this.documentCache.get(a),t)return t}return null}async getDocumentsByNamespaceAsync(e,t){await this.ensureCacheInitialized();let n=new Set(this.documentCache.values());return Array.from(n).filter(o=>o.metadata.namespace_?.publisher===e&&o.metadata.namespace_?.package_===t)}async getHighestCompatibleVersionAsync(e,t){await this.ensureCacheInitialized();let n=new Set(this.documentCache.values()),o=Array.from(n).filter(a=>a.metadata?.namespace_?.publisher===e&&a.metadata?.namespace_?.package_===t.packageName&&a.metadata?.namespace_?.version!==void 0);if(o.length===0)return null;let s=o.filter(a=>{let r=a.metadata.namespace_.version;return R(r,t)});return s.length===0?null:(s.sort((a,r)=>{let m=a.metadata.namespace_.version,p=r.metadata.namespace_.version;return K(p,m)}),s[0])}async saveDocumentAsync(e,t){let n,o=e.metadata.namespace_?.toString();if(o&&o.includes("@")&&o.includes("/")){let m=o.split("/"),p=m[0],h=m[1].replace("@","@")+".kan.yml";n=c.join(this.rootPath,p,h)}else n=c.join(this.rootPath,t),!n.endsWith(".yml")&&!n.endsWith(".yaml")&&!n.endsWith(".kan.yml")&&(n+=".kan.yml");let s=c.dirname(n);await i.mkdir(s,{recursive:!0});let a=this.parser.save(e);await i.writeFile(n,a,"utf8"),o&&this.documentCache.set(o,e),this.documentCache.set(n,e);let r=c.relative(this.rootPath,n);this.documentCache.set(r,e)}async deleteDocumentAsync(e){let t=await this.getDocumentAsync(e);if(!t)return;let n=this.filePathsByIdentifier.get(e);if(!n)return;try{await i.unlink(n)}catch{}let o=t.metadata.namespace_?.toString();o&&this.documentCache.delete(o),this.documentCache.delete(e),this.documentCache.delete(n);let s=c.relative(this.rootPath,n);this.documentCache.delete(s)}async clearNamespaceAsync(e,t){await this.ensureCacheInitialized();let n=[];for(let[s,a]of this.documentCache.entries()){let r=a.metadata.namespace_?.toString()||"";r.includes(e)&&r.includes(t)&&n.push([s,a])}let o=c.join(this.rootPath,e);try{let s=await i.readdir(o);for(let a of s)a.includes(t)&&a.endsWith(".kan.yml")&&await i.unlink(c.join(o,a))}catch{}for(let[s]of n)this.documentCache.delete(s)}async getAllDocumentReferencesAsync(){await this.ensureCacheInitialized();let e=new Set(this.filePathsByIdentifier.values()),t=[];for(let n of e){let o=F(n).toString(),s;for(let[m,p]of this.documentCache.entries())if(this.filePathsByIdentifier.get(m)===n&&p.metadata.namespace_){s=p.metadata.namespace_.toString();break}let a=s??c.relative(this.rootPath,n),r=this.parsingErrors.has(n);t.push({identifier:a,uri:o,hasParseError:r})}return t}async getDocumentContentAsync(e){await this.ensureCacheInitialized();let t=this.filePathsByIdentifier.get(e);if(!t)try{await i.access(e),t=e}catch{let n=c.join(this.rootPath,e);try{await i.access(n),t=n}catch{return null}}try{return await i.readFile(t,"utf8")}catch{return null}}async getDocumentUriAsync(e){await this.ensureCacheInitialized();let t=this.filePathsByIdentifier.get(e);if(!t)try{await i.access(e),t=e}catch{let n=c.join(this.rootPath,e);try{await i.access(n),t=n}catch{return null}}return F(t).toString()}async refreshAsync(){this.documentCache.clear(),this.filePathsByIdentifier.clear(),this.parsingErrors.clear(),this.cacheInitialized=!1,this.cacheInitPromise=null,await this.ensureCacheInitialized()}async ensureCacheInitialized(){if(!this.cacheInitialized){if(this.cacheInitPromise){await this.cacheInitPromise;return}this.cacheInitPromise=this.loadDocuments(),await this.cacheInitPromise,this.cacheInitialized=!0}}async loadDocuments(){try{await i.mkdir(this.rootPath,{recursive:!0})}catch{}let t=(await this.findYamlFiles(this.rootPath,this.recursive)).map(async o=>{try{let s=await i.readFile(o,"utf8"),a=this.parser.parse(s);return{filePath:o,document:a,error:null}}catch(s){return{filePath:o,document:null,error:s instanceof Error?s.message:String(s)}}}),n=await Promise.all(t);for(let{filePath:o,document:s,error:a}of n){let r=c.relative(this.rootPath,o);if(s&&s.metadata.namespace_){let m=s.metadata.namespace_.toString();this.documentCache.set(m,s),this.documentCache.set(o,s),this.documentCache.set(r,s),this.filePathsByIdentifier.set(m,o),this.filePathsByIdentifier.set(o,o),this.filePathsByIdentifier.set(r,o)}else this.filePathsByIdentifier.set(o,o),this.filePathsByIdentifier.set(r,o);a&&this.parsingErrors.set(o,a)}}async findYamlFiles(e,t){let n=[];try{let o=await i.readdir(e,{withFileTypes:!0});for(let s of o){let a=c.join(e,s.name);if(s.isDirectory()&&t){let r=await this.findYamlFiles(a,t);n.push(...r)}else s.isFile()&&s.name.endsWith(".kan.yml")&&n.push(a)}}catch{}return n}};import*as g from"fs";var S=(n=>(n.NotFound="NotFound",n.Workspace="Workspace",n.Cache="Cache",n))(S||{}),D=class{cache;workspace;constructor(e,t,n){let o=n??new f;g.existsSync(e)||g.mkdirSync(e,{recursive:!0}),g.existsSync(t)||g.mkdirSync(t,{recursive:!0}),this.cache=new y(e,!0,o),this.workspace=new y(t,!0,o)}getCache(){return this.cache}getWorkspace(){return this.workspace}async getAllDocumentsAsync(){let e=await this.workspace.getAllDocumentsAsync(),t=await this.cache.getAllDocumentsAsync(),n=new Map;for(let o of t)if(o.metadata.namespace_){let s=o.metadata.namespace_.toString();n.set(s,o)}for(let o of e)if(o.metadata.namespace_){let s=o.metadata.namespace_.toString();n.set(s,o)}return Array.from(n.values())}async getDocumentAsync(e){let t=await this.workspace.getDocumentAsync(e);return t||await this.cache.getDocumentAsync(e)}async getDocumentsByNamespaceAsync(e,t){let n=await this.workspace.getDocumentsByNamespaceAsync(e,t),o=await this.cache.getDocumentsByNamespaceAsync(e,t),s=new Map;for(let a of o)if(a.metadata.namespace_?.version){let r=a.metadata.namespace_.version.toString();s.set(r,a)}for(let a of n)if(a.metadata.namespace_?.version){let r=a.metadata.namespace_.version.toString();s.set(r,a)}return Array.from(s.values())}async getHighestCompatibleVersionAsync(e,t){let n=await this.workspace.getHighestCompatibleVersionAsync(e,t);return n||await this.cache.getHighestCompatibleVersionAsync(e,t)}async saveDocumentAsync(e,t){await this.workspace.saveDocumentAsync(e,t)}async saveToCacheAsync(e,t){await this.cache.saveDocumentAsync(e,t)}async deleteDocumentAsync(e){await this.workspace.deleteDocumentAsync(e)}async clearNamespaceAsync(e,t){await this.workspace.clearNamespaceAsync(e,t)}async getAllDocumentReferencesAsync(){let e=await this.workspace.getAllDocumentReferencesAsync(),t=await this.cache.getAllDocumentReferencesAsync(),n=[];return n.push(...e),n.push(...t),n}async getDocumentContentAsync(e){let t=await this.workspace.getDocumentContentAsync(e);return t||await this.cache.getDocumentContentAsync(e)}async getDocumentUriAsync(e){let t=await this.workspace.getDocumentUriAsync(e);return t||await this.cache.getDocumentUriAsync(e)}async getDocumentLocationAsync(e){return await this.workspace.getDocumentAsync(e)?"Workspace":await this.cache.getDocumentAsync(e)?"Cache":"NotFound"}};import{homedir as _}from"os";import{join as H}from"path";function d(){let u=process.env.KANONAK_PACKAGE_CACHE;return u||H(_(),".kanonak","packages")}var w=class u{static createComposite(e,t,n){let o=e??d(),s=t??".";return new D(o,s,n)}static createFromEnvironment(e){let t=d(),n=process.env.KANONAK_WORKSPACE_PATH??".";return u.createComposite(t,n,e)}};var k=class{repos;constructor(...e){this.repos=e}async getHighestCompatibleVersionAsync(e,t){for(let n of this.repos)try{let o=await n.getHighestCompatibleVersionAsync(e,t);if(o)return o}catch{}return null}async getAllDocumentsAsync(){let e=[],t=new Set;for(let n of this.repos)try{for(let o of await n.getAllDocumentsAsync()){let s=o.metadata?.namespace_,a=s?s.version?`${s.publisher}/${s.package_}@${s.version.major}.${s.version.minor}.${s.version.patch}`:`${s.publisher}/${s.package_}`:void 0;if(a!==void 0){if(t.has(a))continue;t.add(a)}e.push(o)}}catch{}return e}async getDocumentAsync(e){for(let t of this.repos)try{let n=await t.getDocumentAsync(e);if(n)return n}catch{}return null}async getDocumentsByNamespaceAsync(e,t){for(let n of this.repos)try{let o=await n.getDocumentsByNamespaceAsync(e,t);if(o.length>0)return o}catch{}return[]}async saveDocumentAsync(e,t){await this.repos[0].saveDocumentAsync(e,t)}async deleteDocumentAsync(e){await this.repos[0].deleteDocumentAsync(e)}async clearNamespaceAsync(e,t){await this.repos[0].clearNamespaceAsync(e,t)}async getAllDocumentReferencesAsync(){return this.repos[0].getAllDocumentReferencesAsync()}async getDocumentContentAsync(e){for(let t of this.repos)try{let n=await t.getDocumentContentAsync(e);if(n)return n}catch{}return null}async getDocumentUriAsync(e){for(let t of this.repos)try{let n=await t.getDocumentUriAsync(e);if(n)return n}catch{}return null}};import{VersionOperator as N}from"@kanonak-protocol/types/document/models/enums";var v=class{constructor(e,t){this.base=e;this.lock=t}base;lock;pinnedVersion(e,t){return b(this.lock,e,t)}async getHighestCompatibleVersionAsync(e,t){let n=this.pinnedVersion(e,t.packageName);if(n){let o=I(n);if(o){let s={...t,versionOperator:N.Exact,version:o};return this.base.getHighestCompatibleVersionAsync(e,s)}}return this.base.getHighestCompatibleVersionAsync(e,t)}async getDocumentsByNamespaceAsync(e,t){let n=await this.base.getDocumentsByNamespaceAsync(e,t),o=this.pinnedVersion(e,t);return o?n.filter(s=>{let a=s.metadata.namespace_?.version;return a?`${a.major}.${a.minor}.${a.patch}`===o:!1}):n}getAllDocumentsAsync(){return this.base.getAllDocumentsAsync()}getDocumentAsync(e){return this.base.getDocumentAsync(e)}saveDocumentAsync(e,t){return this.base.saveDocumentAsync(e,t)}deleteDocumentAsync(e){return this.base.deleteDocumentAsync(e)}clearNamespaceAsync(e,t){return this.base.clearNamespaceAsync(e,t)}getAllDocumentReferencesAsync(){return this.base.getAllDocumentReferencesAsync()}getDocumentContentAsync(e){return this.base.getDocumentContentAsync(e)}getDocumentUriAsync(e){return this.base.getDocumentUriAsync(e)}};import{readFileSync as B,readdirSync as V}from"fs";import{join as x}from"path";var $=new Set(["node_modules",".kanonak",".git","_site","build",".stage"]);function C(u,e=[]){for(let t of V(u,{withFileTypes:!0}))t.isDirectory()?$.has(t.name)||C(x(u,t.name),e):t.name.endsWith(".kan.yml")&&e.push(x(u,t.name));return e}async function j(u,e=new f,t={}){let n=new P(e);for(let m of C(u))try{let p=e.parse(B(m,"utf-8")),l=p.metadata?.namespace_,h=l?.version;l&&h&&await n.saveDocumentAsync(p,`${l.publisher}/${l.package_}@${h.major}.${h.minor}.${h.patch}`)}catch{}let o=new y(d(),!0,e);if(t.offline)return new k(n,o);let s=new Map,a=t.httpCache??{getFromCache:(m,p,l)=>s.get(`${m}|${p}|${l}`)??null,onFetch:(m,p,l,h)=>{s.set(`${m}|${p}|${l}`,h)}},r=new A({getFromCache:a.getFromCache,onFetch:a.onFetch});return new k(n,o,r)}export{y as a,S as b,D as c,d,w as e,k as f,v as g,C as h,j as i};
@@ -0,0 +1,2 @@
1
+ import{a as k}from"./chunk-SC5M74NM.js";import{a as A}from"./chunk-7JBKOJB4.js";import{e as m,g as R,j as x}from"./chunk-QILEJIFU.js";var F=class extends Error{constructor(t,n,r,s,i){super(t);this.url=n;this.status=r;this.problem=s;this.retryAfterSeconds=i;this.name="KanonakHttpError"}url;status;problem;retryAfterSeconds},E=300;async function u(o,e,t){let n=await $(t),r=y(t.headers.get("retry-after")),s=`Failed to fetch ${o}: ${e} ${await M(t)}`;return new F(s,e,t.status,n,r)}async function M(o){let e=await $(o),t=y(o.headers.get("retry-after")),n=e?O(e):await S(o),r=`(${o.status}${o.statusText?` ${o.statusText}`:""})`;return n&&(r+=`: ${n}`),t!==void 0&&(r+=` [the server asks to retry after ${t}s]`),r}function y(o){if(!o)return;let e=o.trim();if(/^\d+$/.test(e))return Number(e);let t=Date.parse(e);if(!Number.isNaN(t))return Math.max(0,Math.ceil((t-Date.now())/1e3))}function L(o){return(o.headers.get("content-type")??"").split(";")[0].trim().toLowerCase()}async function $(o){if(L(o)!=="application/problem+json")return;let e;try{e=await o.clone().json()}catch{return}if(!e||typeof e!="object")return;let t=e,n={};return typeof t.type=="string"&&(n.type=t.type),typeof t.title=="string"&&(n.title=t.title),typeof t.status=="number"&&(n.status=t.status),typeof t.detail=="string"&&(n.detail=t.detail),typeof t.instance=="string"&&(n.instance=t.instance),n}function O(o){return[o.title,o.detail].filter(e=>!!e&&e.trim()!=="").join(" \u2014 ")}async function S(o){let e=L(o);if(e!=="text/plain"&&e!=="application/json")return"";let t;try{t=await o.clone().text()}catch{return""}let n=t.replace(/\s+/g," ").trim();return n.length>E?`${n.slice(0,E)}\u2026`:n}var h=class extends Error{constructor(e){super(e),this.name="CredentialError"}};var H="@kanonak-protocol/sdk (+https://kanonak.org)",P=H;function ee(o){P=o}function te(){return P}function p(o){let e;try{e=typeof o=="string"?new URL(o):o}catch{throw new Error(`Kanonak requires an absolute https:// URL \u2014 got an unparseable or relative URL: ${String(o)}`)}if(e.protocol!=="https:")throw new Error(`Kanonak requires HTTPS \u2014 refusing to fetch ${e.href} (only https:// is supported).`)}var j=new Set([429,502,503,504]),q=4,N=500,_=2e4;function g(o,e){p(o);let t=new Headers(e?.headers);return t.has("User-Agent")||t.set("User-Agent",P),B(o,{...e,headers:t})}var w=q;function ne(o){w=Math.max(0,o)}async function B(o,e){let t;for(let n=0;n<=w;n++){let r;try{r=await fetch(o,e)}catch(i){if(t=i,n>=w)throw i;await D(b(n,void 0));continue}if(!j.has(r.status)||n>=w)return r;let s=y(r.headers.get("retry-after"));if(s!==void 0&&s*1e3>_)return r;await D(b(n,s))}throw t??new Error("kanonakFetch: exhausted retries")}function b(o,e){if(e!==void 0)return e*1e3;let t=Math.min(_,N*2**o);return Math.floor(t/2+Math.random()*(t/2))}function D(o){return new Promise(e=>setTimeout(e,o))}var V="https://{publisher}/{package}/{version}.kan.yml",U={version:1};function ae(){return{version:1}}var v=class{constructor(e){this.fetchFn=e}fetchFn;cache=new Map;getConfig(e){let t=this.cache.get(e);return t||(t=this.fetchConfig(e),this.cache.set(e,t),t.catch(()=>{this.cache.get(e)===t&&this.cache.delete(e)})),t}async fetchConfig(e){let t=`https://${e}/.well-known/kanonak.json`,n;try{n=await(this.fetchFn?this.fetchFn(t,e):g(t))}catch(i){if(i instanceof h)throw i;return U}if(n.status===404)return U;if(!n.ok)throw await u("publisher config",t,n);let r=await n.json();if(typeof r.version!="number")throw new Error(`Invalid publisher config at ${t}: missing or invalid "version" field`);let s={version:r.version};return typeof r.package_url_template=="string"&&(W(t,"package_url_template",r.package_url_template),s.package_url_template=r.package_url_template),Array.isArray(r.featured_packages)&&r.featured_packages.every(i=>typeof i=="string")&&(s.featured_packages=r.featured_packages),s}resolvePackageUrl(e,t,n,r){let s=r.package_url_template??V,i=G(s,{publisher:e,package:t,version:n});return p(i),i}};function W(o,e,t){if(!t.startsWith("https://"))throw new Error(`Invalid publisher config at ${o}: ${e} must be an absolute https:// URL template (got "${t}").`)}function G(o,e){let t=o;for(let[r,s]of Object.entries(e))t=t.replaceAll(`{${r}}`,s);let n=t.match(/\{[a-z]+\}/);if(n)throw new Error(`Unresolved variable ${n[0]} in URL template: ${o}`);return t}import K from"js-yaml";function ue(o,e,t){return o.packages[`${e}/${t}`]?.version}var X=`# This file is generated by Kanonak CLI. Do not edit manually.
2
+ `,z="sha256:";function I(o){let e=K.load(o);return!e||typeof e!="object"||e.version!=="1"?null:{version:"1",lastUpdated:e.lastUpdated??"",packages:e.packages??{}}}function ge(o){let e={};for(let n of Object.keys(o.packages).sort())e[n]=o.packages[n];let t=K.dump({...o,packages:e},{lineWidth:-1,sortKeys:!1,quotingType:'"'});return X+t}async function fe(o){let e=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(o)),t=Array.from(new Uint8Array(e),n=>n.toString(16).padStart(2,"0")).join("");return`${z}${t}`}var d=class{configResolver;fetchFn;lockCache=new Map;packageLockCache=new Map;constructor(e){this.configResolver=e?.configResolver??new v(e?.fetchFn),this.fetchFn=e?.fetchFn}getConfig(e){return this.configResolver.getConfig(e)}async getPackageUrl(e,t,n){let r=await this.configResolver.getConfig(e);return this.configResolver.resolvePackageUrl(e,t,n,r)}getLock(e){let t=this.lockCache.get(e);return t||(t=this.fetchLock(e),this.lockCache.set(e,t),t.catch(()=>{this.lockCache.get(e)===t&&this.lockCache.delete(e)})),t}async getPackageLockEntry(e,t){let n=`${e}/${t}`,r=this.packageLockCache.get(n);return r||(r=this.fetchLock(e,t),this.packageLockCache.set(n,r),r.catch(()=>{this.packageLockCache.get(n)===r&&this.packageLockCache.delete(n)})),(await r)?.packages[n]??null}async fetchLock(e,t){let n=t?`https://${e}/${t}/kanonak.lock`:`https://${e}/kanonak.lock`,r;try{r=this.fetchFn?await this.fetchFn(n,e):await g(n)}catch(s){if(s instanceof h)throw s;return null}if(r.status===404)return null;if(!r.ok)throw await u("publisher lock",n,r);return I(await r.text())}};import{VersionOperator as C}from"@kanonak-protocol/types/document/models/enums";function Y(o,e){let t=R(o);return t?x(t,e):!1}var T=class{parser=new A;publisherIndex;documents=new Map;contentCache=new Map;fetchFn;onFetch;getFromCache;constructor(e){this.onFetch=e?.onFetch,this.getFromCache=e?.getFromCache,this.fetchFn=e?.fetchFn,this.publisherIndex=e?.fetchFn?new d({fetchFn:e.fetchFn}):new d}async getHighestCompatibleVersionAsync(e,t){if(t.versionOperator===C.Exact){let s=await this.fromMemoOrCache(e,t.packageName,m(t.version));if(s)return s}let r=(await this.publisherIndex.getLock(e))?.packages[`${e}/${t.packageName}`]??await this.publisherIndex.getPackageLockEntry(e,t.packageName)??void 0;return r&&Y(r.version,t)?this.fetchPinned(e,t.packageName,r):r&&t.versionOperator!==C.Exact?null:this.resolveByDirectFetch(e,t)}async fetchPinned(e,t,n){let r=n.version,s=`${e}/${t}@${r}`,i=await this.fromMemoOrCache(e,t,r);if(i)return i;let a=n.resolved,c=this.fetchFn?await this.fetchFn(a,e):await g(a);if(!c.ok)throw await u("Kanonak package",a,c);let l=await c.text(),f=this.parser.parse(l);return k(f,e,t,r),this.onFetch&&await this.onFetch(e,t,r,l),this.documents.set(s,f),this.contentCache.set(s,l),f}async fromMemoOrCache(e,t,n){let r=`${e}/${t}@${n}`,s=this.documents.get(r);if(s)return s;if(!this.getFromCache)return null;let i=await this.getFromCache(e,t,n);if(i==null)return null;let a;try{a=this.parser.parse(i),k(a,e,t,n)}catch(c){throw new Error(`Cached content for ${r} is not a usable copy of that package \u2014 refusing to fall through to a fetch that would hide it. ${c.message}`,{cause:c})}return this.documents.set(r,a),this.contentCache.set(r,i),a}async resolveByDirectFetch(e,t){let n=t.packageName,s=t.versionOperator===C.Exact?await this.publisherIndex.getPackageUrl(e,n,m(t.version)):`https://${e}/${n}.kan.yml`,i=await this.fetchFollowing(s,e);if(!i)return null;let a=this.parser.parse(i.content),c=a.metadata.namespace_;if(!c||!c.version)throw new Error(`Producer origin returned a package with no namespace/version for ${e}/${n}`);let l=m(c.version);k(a,e,n,l);let f=`${e}/${n}@${l}`;return this.onFetch&&await this.onFetch(e,n,l,i.content),this.documents.set(f,a),this.contentCache.set(f,i.content),a}async fetchFollowing(e,t,n=4){let r=e;for(let s=0;s<n;s++){p(r);let i=this.fetchFn?await this.fetchFn(r,t):await g(r,{redirect:"manual"});if(i.status===301||i.status===302){let a=i.headers.get("location");if(!a)throw new Error(`Redirect with no Location header from ${r}`);r=new URL(a,r).toString();continue}if(i.status===404)return null;if(!i.ok)throw await u("Kanonak package",r,i);return{url:r,content:await i.text()}}throw new Error(`Too many redirects resolving ${e}`)}async getAllDocumentsAsync(){return Array.from(this.documents.values())}async getDocumentAsync(e){return this.documents.get(e)??null}async getDocumentsByNamespaceAsync(e,t){return Array.from(this.documents.values()).filter(n=>{let r=n.metadata.namespace_;return r&&r.publisher===e&&r.package_===t})}async saveDocumentAsync(e,t){throw new Error("HttpKanonakDocumentRepository is read-only")}async deleteDocumentAsync(e){throw new Error("HttpKanonakDocumentRepository is read-only")}async clearNamespaceAsync(e,t){throw new Error("HttpKanonakDocumentRepository is read-only")}async getAllDocumentReferencesAsync(){return[]}async getDocumentContentAsync(e){return this.contentCache.get(e)??null}async getDocumentUriAsync(e){let t=e.match(/^(.+?)\/(.+?)@(.+)$/);if(!t)return null;let[,n,r,s]=t;return this.publisherIndex.getPackageUrl(n,r,s)}};export{F as a,u as b,M as c,y as d,h as e,H as f,ee as g,te as h,p as i,g as j,ne as k,ae as l,v as m,ue as n,z as o,I as p,ge as q,fe as r,d as s,T as t};
@@ -0,0 +1,2 @@
1
+ import{a as I,b as K,c as ee,e as T,j}from"./chunk-HKQTB65D.js";import{k as re}from"./chunk-22DSABP6.js";import{ma as _,pa as z}from"./chunk-NUTHBBDZ.js";import{c as G,o as te}from"./chunk-D4QGPMRW.js";var se=(i=>(i.Class="Class",i.DatatypeProperty="DatatypeProperty",i.ObjectProperty="ObjectProperty",i.AnnotationProperty="AnnotationProperty",i.Instance="Instance",i.Datatype="Datatype",i.Shape="Shape",i.Unknown="Unknown",i))(se||{}),ae=(i=>(i.InstanceOf="instanceOf",i.SubClassOf="subClassOf",i.Domain="domain",i.Range="range",i.ObjectRelationship="objectRelationship",i.SubPropertyOf="subPropertyOf",i.PropertyValue="propertyValue",i.EmbeddedLink="embeddedLink",i))(ae||{}),H=class{static async buildFromRepository(e,r){let s=await new re().parseKanonaks(e),o=await e.getAllDocumentsAsync(),c=[],p=[],i=new Set,h=new Set,b=new Map;for(let g of s){let a=g;if(a.name&&(_.isClassType(a)&&i.add(a.name),g instanceof G)){let d=z(s,g);(d==="ObjectProperty"||d==="Property")&&h.add(a.name)}}for(let g of o)for(let[a,d]of Object.entries(g.body))h.has(a)&&d?.range&&typeof d.range=="string"&&b.set(a,d.range);let w=new Map;for(let g of s){let a=g;a.name&&w.set(a.name,a)}for(let g of o){let a=g.metadata.namespace_,d=a?`${a.publisher}/${a.package_}`:"",u=a?.version?`${a.version.major}.${a.version.minor}.${a.version.patch}`:"",y=ne(g);for(let[f,l]of Object.entries(g.body)){if(!l||typeof l!="object")continue;let A=w.get(f),m="Unknown";if(A){let E=A,k=A instanceof G?z(s,A):void 0;_.isClassType(E)?m="Class":k==="ObjectProperty"?m="ObjectProperty":k==="DatatypeProperty"?m="DatatypeProperty":k==="AnnotationProperty"?m="AnnotationProperty":_.isDatatypeType(E)?m="Datatype":k==="Property"?m="ObjectProperty":_.isShapeType(E)?m="Shape":_.isInstanceOfKnownClass(E,i)&&(m="Instance")}let C=d&&u?`${d}/${f}@${u}`:f,R={};for(let[E,k]of Object.entries(l))E!=="type"&&(typeof k!="object"||k===null)&&(R[E]=k);c.push({id:C,label:l.label??f,type:m,namespace:d,properties:R}),oe(C,l,m,i,h,p,d,u,y,r),q(C,l,h,b,c,p,d,u,y),Ce(C,A,p)}}return{nodes:c,edges:p}}static buildFromDocument(e,r){let n=[],s=[],o=e.metadata.namespace_,c=o?.version?`${o.version.major}.${o.version.minor}.${o.version.patch}`:"",p=o?`${o.publisher}/${o.package_}`:"",i=new Set,h=new Set,b=new Map,w=ne(e);for(let[d,u]of Object.entries(e.body)){let y=u?.type;y&&(be(y,w)&&i.add(d),Pe(y,w)&&(h.add(d),u.range&&typeof u.range=="string"&&b.set(d,u.range)))}for(let[d,u]of Object.entries(e.body)){if(!u||typeof u!="object")continue;let y=u.type,f=Ae(y,d,i,w),l=p&&c?`${p}/${d}@${c}`:d,A={};for(let[m,C]of Object.entries(u))m!=="type"&&(typeof C!="object"||C===null)&&(A[m]=C);n.push({id:l,label:u.label??d,type:f,namespace:p,properties:A}),oe(l,u,f,i,h,s,p,c,w,r),q(l,u,h,b,n,s,p,c,w)}let g=new Set(n.map(d=>d.id)),a=s.filter(d=>g.has(d.source)&&g.has(d.target));return{nodes:n,edges:a}}};function ne(t,e){let r=new Map;if(t.metadata?.imports)for(let[n,s]of Object.entries(t.metadata.imports))for(let o of s){let c=o.alias??o.packageName,p=o.version,i=`${p.major}.${p.minor}.${p.patch}`;r.set(c,{publisher:n,package_:o.packageName,version:i})}return r}var ie={"kanonak.org/core-rdf/Class":"Class","kanonak.org/core-owl/Class":"Class","kanonak.org/core-rdfs/Class":"Class","kanonak.org/core-owl/ObjectProperty":"ObjectProperty","kanonak.org/core-owl/DatatypeProperty":"DatatypeProperty","kanonak.org/core-owl/AnnotationProperty":"AnnotationProperty","kanonak.org/core-rdf/Property":"ObjectProperty","kanonak.org/core-rdfs/Datatype":"Datatype"},ke=new Set(["kanonak.org/core-owl/ObjectProperty","kanonak.org/core-owl/DatatypeProperty","kanonak.org/core-owl/AnnotationProperty","kanonak.org/core-rdf/Property"]);function W(t,e){if(t.includes(".")){let r=t.indexOf("."),n=t.substring(0,r),s=t.substring(r+1),o=e.get(n);if(o)return`${o.publisher}/${o.package_}/${s}`}return null}function be(t,e){let r=W(t,e);return r?ie[r]==="Class":!1}function Pe(t,e){let r=W(t,e);return r?ke.has(r):!1}function Ae(t,e,r,n){if(!t||t==="Package")return"Unknown";let s=W(t,n);if(s){let c=ie[s];if(c)return c;let p=s.split("/").pop()?.split("@")[0]??"";return r.has(p)?"Instance":"Unknown"}let o=t.split(".").pop()??t;return r.has(o)?"Instance":"Unknown"}var ce=new Set(["type","label","comment","version","publisher","imports","license","match","alias","package"]);function oe(t,e,r,n,s,o,c,p,i,h){let b=e.type,w=e.subClassOf;if(w){let f=Array.isArray(w)?w:[w];for(let l of f)typeof l=="string"&&o.push({source:t,target:O(l,c,p,i),type:"subClassOf",label:"subClassOf"})}let g=e.subPropertyOf;if(g){let f=Array.isArray(g)?g:[g];for(let l of f)typeof l=="string"&&o.push({source:t,target:O(l,c,p,i),type:"subPropertyOf",label:"subPropertyOf"})}let a=e.domain,d=e.range;if(h?.includePropertyEdges){let f=[[a,"domain","domain"],[d,"range","range"]];for(let[l,A,m]of f)if(l!=null)for(let C of Array.isArray(l)?l:[l])typeof C=="string"&&o.push({source:t,target:O(C,c,p,i),type:A,label:m})}if(r==="Instance"&&b){let f=b.split(".").pop()??b;o.push({source:t,target:O(f,c,p,i),type:"instanceOf",label:"type"})}if(r==="Instance")for(let[f,l]of Object.entries(e)){if(ce.has(f)||!s.has(f))continue;let A=Array.isArray(l)?l:[l];for(let m of A)typeof m=="string"&&Ee(m)&&o.push({source:t,target:O(m,c,p,i),type:"propertyValue",label:f,propertyId:O(f,c,p,i)})}if((r==="ObjectProperty"||r==="DatatypeProperty"||a&&d)&&a&&d){let f=typeof a=="string"?a:null,l=typeof d=="string"?d:null;f&&l&&o.push({source:O(f,c,p,i),target:O(l,c,p,i),type:"objectRelationship",label:e.label??t.split("/").pop()??"",propertyId:t})}}function q(t,e,r,n,s,o,c,p,i){for(let[h,b]of Object.entries(e)){if(ce.has(h)||typeof b!="object"||b===null||Array.isArray(b))continue;let w=b,g=`${t}/${h}`,a=n.get(h),d=a?a.split(".").pop()??a:"Unknown",u={};for(let[f,l]of Object.entries(w))(typeof l!="object"||l===null)&&(u[f]=l);s.push({id:g,label:`${d} (embedded)`,type:"Instance",namespace:c,properties:u});let y=c&&p?`${c}/${h}@${p}`:h;o.push({source:t,target:g,type:"propertyValue",label:h,propertyId:r.has(h)?y:void 0}),a&&o.push({source:g,target:O(d,c,p,i),type:"instanceOf",label:"type (inferred)"}),q(g,w,r,n,s,o,c,p,i)}}function Ce(t,e,r){let n=e?.statement;if(Array.isArray(n))for(let s of n){if(!(s instanceof te))continue;let o=s.predicate?.subject?.name??"";for(let c of s.links){let p=c.target?.subject;if(!p)continue;let i=p.version,h=i&&typeof i.major=="number"?`@${i.major}.${i.minor}.${i.patch}`:"";r.push({source:t,target:`${p.publisher}/${p.package_}/${p.name}${h}`,type:"embeddedLink",label:o})}}}function Ee(t){return!(!t||t.includes(" ")||t.includes(`
2
+ `)||t.startsWith("http://")||t.startsWith("https://")||/^\d{4}-\d{2}/.test(t)||/^\d+(\.\d+)?$/.test(t))}function O(t,e,r,n){if(t.includes("@")&&t.includes("/"))return t;if(t.includes(".")){let s=t.indexOf("."),o=t.substring(0,s),c=t.substring(s+1);if(n){let p=n.get(o);if(p)return`${p.publisher}/${p.package_}/${c}@${p.version}`}return e&&r?`${e}/${c}@${r}`:c}return e&&r?`${e}/${t}@${r}`:t}function M(t){let e=t.replace(/^https?:\/\//,"").replace(/^git:\/\//,"").replace(/\/+$/,"").trim();if(!e)throw new Error("Publisher host cannot be empty");return e}function v(t){let e;try{e=new URL(t)}catch{throw new Error(`credential scope '${t}' is not an absolute URL`)}if(e.protocol!=="https:")throw new Error(`credential scope '${t}' is not https`);if(e.username||e.password)throw new Error(`credential scope '${t}' carries userinfo`);if(e.search||t.includes("?"))throw new Error(`credential scope '${t}' has a query`);if(e.hash||t.includes("#"))throw new Error(`credential scope '${t}' has a fragment`);let r=e.pathname;return{origin:e.origin,prefix:r.endsWith("/")?r:`${r}/`}}function N(t,e){let r=typeof t=="string"?v(t):t,n;try{n=new URL(e)}catch{return!1}if(n.protocol!=="https:"||n.origin!==r.origin)return!1;let s=n.pathname;return s.startsWith(r.prefix)||`${s}/`===r.prefix}function V(t,e){let r,n=-1;for(let s of t){let o=v(s.scope);N(o,e)&&o.prefix.length>n&&(r=s,n=o.prefix.length)}return r}var Oe="key_thumbprint",x=class{cache=new Map;wellKnownCache=new Map;metadataUrlCache=new Map;async protectedResourceMetadata(e){let r=new URL(e).href,n=this.wellKnownCache.get(r);return n||(n=this.fetchWellKnown(r),this.wellKnownCache.set(r,n)),n}async protectedResourceMetadataAt(e,r){let n=new URL(e).href,s=this.metadataUrlCache.get(n);s||(s=this.fetchMetadataAt(n),this.metadataUrlCache.set(n,s));let o=await s,c;try{c=N(v(o.resource),r)}catch(p){throw new Error(`Protected resource metadata at ${n} names an unusable resource '${o.resource}': ${p.message}`)}if(!c)throw new Error(`Protected resource metadata at ${n} names the resource '${o.resource}', which does not contain the requested ${r}. RFC 9728 \xA73.3 forbids using it.`);return o}async fetchWellKnown(e){let r=new URL(e),n=r.pathname==="/"?"":r.pathname,s=`${r.origin}/.well-known/oauth-protected-resource${n}`,o=await j(s,{redirect:"manual"});if(o.status===404||o.status===410||o.status>=300&&o.status<400)return null;if(!o.ok)throw await K("protected resource metadata",s,o);if(!pe(o.headers.get("content-type")))return null;let c=de(s,await o.text());if(!URL.canParse(c.resource)||new URL(c.resource).href!==e)throw new Error(`Protected resource metadata at ${s} names the resource '${c.resource}', not '${e}'. RFC 9728 \xA73.3 forbids using it.`);return c}async fetchMetadataAt(e){let r=await j(e,{redirect:"manual"});if(!r.ok)throw await K("protected resource metadata",e,r);if(!pe(r.headers.get("content-type")))throw new Error(`Protected resource metadata at ${e} is not a JSON document (${r.headers.get("content-type")??"no content type"})`);return de(e,await r.text())}async discover(e){let r=M(e);if(this.cache.has(r))return this.cache.get(r);let n=`https://${r}/.well-known/oauth-authorization-server`,s=await this.tryEndpoint(n);if(!s){let o=`https://${r}/.well-known/openid-configuration`;s=await this.tryEndpoint(o)}return this.cache.set(r,s),s}async supportsOAuth(e){return await this.discover(e)!==null}static supportsPkceS256(e){return e.codeChallengeMethodsSupported?.some(r=>r.toUpperCase()==="S256")??!1}static supportsDynamicRegistration(e){return!!e.registrationEndpoint}static supportsAuthorizationCode(e){return e.responseTypesSupported?.some(r=>r.toLowerCase()==="code")??!1}static supportsEnrollment(e){return!!e.enrollmentEndpoint}static supportsSession(e){return!!e.sessionEndpoint}async tryEndpoint(e){let r;try{r=await fetch(e)}catch(s){let o=s instanceof Error?s.message:String(s);return o.includes("ENOTFOUND")||o.includes("ECONNREFUSED")?(console.error(` OAuth discovery: ${e} \u2014 host unreachable (${o})`),console.error(" If the server is behind a VPN, ensure you are connected.")):o.includes("CERT")||o.includes("SSL")||o.includes("TLS")?(console.error(` OAuth discovery: ${e} \u2014 TLS error (${o})`),console.error(" If using a custom CA certificate, set NODE_EXTRA_CA_CERTS=/path/to/ca.pem")):console.error(` OAuth discovery: ${e} \u2014 network error: ${o}`),null}if(!r.ok)return r.status===404||(r.status===403?(console.error(` OAuth discovery: ${e} \u2014 HTTP 403 Forbidden`),console.error(" Access may be blocked by a firewall, proxy, or WAF.")):r.status>=500&&(console.error(` OAuth discovery: ${e} \u2014 HTTP ${r.status} server error`),console.error(" The authorization server returned an internal error. Contact your IDP administrator."))),null;let n;try{n=await r.json()}catch{return console.error(` OAuth discovery: ${e} \u2014 response is not valid JSON`),console.error(" The endpoint may be returning HTML instead of JSON. Check IDP configuration."),null}return{issuer:$(n.issuer),authorizationEndpoint:$(n.authorization_endpoint),tokenEndpoint:$(n.token_endpoint),registrationEndpoint:$(n.registration_endpoint),revocationEndpoint:$(n.revocation_endpoint),scopesSupported:S(n.scopes_supported),responseTypesSupported:S(n.response_types_supported),grantTypesSupported:S(n.grant_types_supported),codeChallengeMethodsSupported:S(n.code_challenge_methods_supported),tokenEndpointAuthMethodsSupported:S(n.token_endpoint_auth_methods_supported),dpopSigningAlgValuesSupported:S(n.dpop_signing_alg_values_supported),enrollmentEndpoint:$(n.enrollment_endpoint),enrollmentIssuanceProtocols:S(n.enrollment_issuance_protocols),enrollmentKeyTypes:S(n.enrollment_key_types),enrollmentScopesSupported:S(n.enrollment_scopes_supported),enrollmentConsentBindingParam:$(n.enrollment_consent_binding_param),sessionEndpoint:$(n.session_endpoint),sessionEndpointAuthMethod:$(n.session_endpoint_auth_method)}}};function pe(t){let e=(t??"").split(";")[0].trim().toLowerCase();return e==="application/json"||e.endsWith("+json")}function de(t,e){let r;try{r=JSON.parse(e)}catch{throw new Error(`Protected resource metadata at ${t} is not valid JSON`)}if(typeof r!="object"||r===null||Array.isArray(r))throw new Error(`Protected resource metadata at ${t} is not a JSON object`);let n=r;if(typeof n.resource!="string")throw new Error(`Protected resource metadata at ${t} has no "resource"`);let s=n.authorization_servers;if(s!==void 0&&!(Array.isArray(s)&&s.every(o=>typeof o=="string")))throw new Error(`Protected resource metadata at ${t} has an "authorization_servers" that is not a list of strings`);return{resource:n.resource,authorizationServers:s??[]}}function $(t){return typeof t=="string"?t:null}function S(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):null}var D=1,$e=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,Se=/[\r\n\0]/;function P(t,e){return{ok:!1,problem:t,message:e}}function L(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function U(t,e,r){if(!L(e))return P("malformed","the answer is not a JSON object");if(e.status==="declined")return e.reason!==void 0&&typeof e.reason!="string"?P("reason",`a decline's "reason" must be a string`):{ok:!0,answer:e.reason===void 0?{status:"declined"}:{status:"declined",reason:e.reason}};if(e.status!=="credential")return P("status",`"status" must be "credential" or "declined", not ${JSON.stringify(e.status)}`);let n=e.headers;if(!L(n)||Object.keys(n).length===0)return P("headers",'a credential needs "headers": an object with at least one header');let s={};for(let[i,h]of Object.entries(n)){if(!$e.test(i))return P("headers",`header name ${JSON.stringify(i)} is not a valid field name`);if(typeof h!="string"||Se.test(h))return P("headers",`header '${i}' must be a string without CR, LF or NUL`);s[i]=h}if(typeof e.scope!="string")return P("scope",'a credential needs a "scope" string');let o;try{o=v(e.scope)}catch(i){return P("scope",i.message)}if(!N(o,t.resource))return P("scope-excludes-resource",`scope '${e.scope}' does not contain the requested resource ${t.resource}`);let c;if(e.expiresAt!==void 0){if(typeof e.expiresAt!="number"||!Number.isFinite(e.expiresAt))return P("expires-at",'"expiresAt" must be a number of Unix seconds');if(e.expiresAt<=r)return P("expired",`the credential expired at ${e.expiresAt} (now ${Math.floor(r)})`);c=e.expiresAt}let p={status:"credential",headers:s,scope:e.scope};return c!==void 0&&(p.expiresAt=c),{ok:!0,answer:p}}function Re(t,e,r){return L(e)?e.version!==D?P("version",`"version" must be ${D}, not ${JSON.stringify(e.version)}`):U(t,e,r):P("malformed","the answer is not a JSON object")}function Te(t){return L(t)?t.version!==D?P("version",`"version" must be ${D}, not ${JSON.stringify(t.version)}`):t.status!=="erased"?P("status",`"status" must be "erased", not ${JSON.stringify(t.status)}`):{ok:!0,answer:{status:"erased"}}:P("malformed","the answer is not a JSON object")}function B(t){let e=new J(t),r=[];for(e.skipListSeparators();!e.atEnd();){let n=e.token();if(!n)throw e.error("expected an auth-scheme");let s={scheme:n,params:{}};r.push(s);let o=e.skipSpaces();if(e.atEnd()||e.peek()===","){e.skipListSeparators();continue}if(!o)throw e.error(`expected a space after the auth-scheme '${n}'`);let c=e.tryParam();if(c)for(ue(s,c,e);e.skipOws(),!e.atEnd();){if(e.peek()!==",")throw e.error('expected "," between auth-params');if(e.skipListSeparators(),e.atEnd())break;let p=e.pos,i=e.tryParam();if(!i){e.pos=p;break}ue(s,i,e)}else{let p=e.token68();if(!p)throw e.error(`expected a token68 or auth-params after '${n}'`);if(s.token68=p,e.skipOws(),!e.atEnd()&&e.peek()!==",")throw e.error("unexpected text after token68")}e.skipListSeparators()}return r}function ue(t,[e,r],n){if(Object.prototype.hasOwnProperty.call(t.params,e))throw n.error(`auth-param '${e}' appears twice in the '${t.scheme}' challenge`);t.params[e]=r}var ve=/[!#$%&'*+\-.^_`|~0-9A-Za-z]/,xe=/[A-Za-z0-9\-._~+/]/,J=class{constructor(e){this.s=e}s;pos=0;atEnd(){return this.pos>=this.s.length}peek(){return this.s[this.pos]}error(e){return new Error(`Malformed WWW-Authenticate (${e} at offset ${this.pos}): ${this.s}`)}skipSpaces(){let e=this.pos;for(;!this.atEnd()&&(this.peek()===" "||this.peek()===" ");)this.pos++;return this.pos>e}skipOws(){this.skipSpaces()}skipListSeparators(){for(;;){if(this.skipOws(),this.peek()!==",")return;this.pos++}}token(){let e=this.pos;for(;!this.atEnd()&&ve.test(this.peek());)this.pos++;return this.s.slice(e,this.pos)}token68(){let e=this.pos;for(;!this.atEnd()&&xe.test(this.peek());)this.pos++;if(this.pos===e)return"";for(;!this.atEnd()&&this.peek()==="=";)this.pos++;return this.s.slice(e,this.pos)}tryParam(){let e=this.pos,r=this.token();if(!r)return null;if(this.skipOws(),this.peek()!=="=")return this.pos=e,null;this.pos++,this.skipOws();let n;if(this.peek()==='"')n=this.quotedString();else if(n=this.token(),!n)return this.pos=e,null;return[r.toLowerCase(),n]}quotedString(){this.pos++;let e="";for(;;){if(this.atEnd())throw this.error("unterminated quoted-string");let r=this.s[this.pos++];if(r==='"')return e;if(r==="\\"){if(this.atEnd())throw this.error("unterminated quoted-pair");e+=this.s[this.pos++]}else e+=r}}};var ye=30;function _e(t,e={}){let r=e.discovery??new x,n=e.nowSeconds??(()=>Date.now()/1e3),s=[],o=new WeakSet,c=new Map,p=new Map,i=a=>{let d=n();return s=s.filter(u=>u.expiresAt===void 0||u.expiresAt-ye>d),V(s,a)},h=(a,d)=>{let u=(p.get(a)??Promise.resolve()).then(d);return p.set(a,u.then(()=>{},()=>{})),u},b=a=>{let d=c.get(a);return d||(d=r.protectedResourceMetadata(a).then(u=>u!==null,u=>{if(u instanceof I&&(u.status===401||u.status===403))return!0;throw new T(`Could not learn whether ${a} requires a credential: ${me(u)}`)}),c.set(a,d)),d},w=async(a,d)=>{let u=U(d,await le(()=>a.get(d),d.resource),n());if(!u.ok)throw new T(`The credential provider answered for ${d.resource} outside the protocol (${u.problem}): ${u.message}`);let y=u.answer;if(y.status==="declined")return y.reason===void 0?{}:{declined:y.reason};let f={headers:y.headers,scope:y.scope};return y.expiresAt!==void 0&&(f.expiresAt=y.expiresAt),s=s.filter(l=>l.scope!==f.scope),s.push(f),f},g=(a,d,u)=>j(a,{method:d,redirect:"manual",headers:u?.headers??{}});return async(a,d,u="GET")=>{let y=new URL(a).origin,f=i(a);if(!f&&t&&await b(y)){let k=await h(y,async()=>i(a)??w(t,{resource:a,method:u}));fe(k)&&(f=k)}let l=await g(a,u,f);if(l.status!==401&&l.status!==403)return l;let A=ge(l,a),m=l.status===401;if(!m&&!he(A))return l;if(c.set(y,Promise.resolve(!0)),!t)throw await Y(`${a} requires a credential, and no credential provider is configured`,l);let C={resource:a,method:u,challenges:A},R=await h(y,async()=>{let k=i(a);if(k&&k!==f)return k;if(m&&f&&!o.has(f)){o.add(f);let Q=f;s=s.filter(we=>we!==Q),await le(()=>t.erase({...C,scope:Q.scope}),a)}return w(t,C)});if(!fe(R)){let k=R.declined?`: ${R.declined}`:"";throw await Y(`${a} requires a credential, and the credential provider declined${k}`,l)}let E=await g(a,u,R);if(E.status===401||E.status===403&&he(ge(E,a)))throw await Y(`${a} rejected the credential for ${R.scope} after asking the provider again`,E);return E}}async function le(t,e){try{return await t()}catch(r){throw r instanceof T?r:new T(`The credential provider failed for ${e}: ${me(r)}`)}}function me(t){return t instanceof Error?t.message:String(t)}function fe(t){return"scope"in t}function he(t){return t.some(e=>e.params.error==="insufficient_scope")}function ge(t,e){let r=t.headers.get("www-authenticate");if(!r)return[];try{return B(r)}catch(n){throw new T(`${e} answered ${t.status} with a challenge that cannot be read: ${n.message}`)}}async function Y(t,e){return new T(`${t}. The server answered ${await ee(e)}`)}var F="KANONAK_TOKEN";function Ne(){return typeof process<"u"&&process.env?process.env:{}}function Z(t){return`${F}_${M(t).toUpperCase().replace(/[^A-Z0-9]+/g,"_")}`}var X=class{tokens;env;discovery;constructor(e={}){this.tokens=e.tokens??{},this.env=e.env??Ne(),this.discovery=e.discovery??new x}async get(e){let r=await this.metadataFor(e);if("declined"in r)return{status:"declined",reason:r.declined};let n=r.metadata;if(n.authorizationServers.length===0)return{status:"declined",reason:`the protected-resource metadata for ${n.resource} names no authorization server`};let s=n.authorizationServers.map(o=>new URL(o).host);for(let o of s){let c=this.tokens[o]??this.env[Z(o)]??this.env[F];if(c)return{status:"credential",headers:{Authorization:`Bearer ${c}`},scope:n.resource}}return{status:"declined",reason:`no token is configured for ${s.join(" or ")}: set ${s.map(Z).join(" or ")}, or ${F}`}}async erase(){}async metadataFor(e){let r=e.challenges?.find(o=>o.params.resource_metadata!==void 0)?.params.resource_metadata;if(r!==void 0)return{metadata:await this.discovery.protectedResourceMetadataAt(r,e.resource)};let n=new URL(e.resource).origin,s;try{s=await this.discovery.protectedResourceMetadata(n)}catch(o){if(o instanceof I&&(o.status===401||o.status===403))return{declined:`${n} requires a credential even for its protected-resource metadata, and its challenge names no resource_metadata`};throw o}return s?{metadata:s}:{declined:`${n} publishes no RFC 9728 protected-resource metadata naming its authorization server, so no token is presented to it`}}};export{se as a,ae as b,H as c,M as d,v as e,N as f,V as g,Oe as h,x as i,D as j,U as k,Re as l,Te as m,B as n,ye as o,_e as p,F as q,Z as r,X as s};
@@ -1 +1 @@
1
- import{j as i,k as o,l as r}from"./chunk-OOYGILH4.js";import{readFileSync as c,writeFileSync as l,existsSync as s}from"fs";import{createHash as a}from"crypto";var n="kanonak.lock";function f(e=n){return s(e)?o(c(e,"utf-8")):null}function k(e,t=n){e.lastUpdated=new Date().toISOString(),l(t,r(e),"utf-8")}function L(e){let t=a("sha256").update(e).digest("hex");return`${i}${t}`}export{f as a,k as b,L as c};
1
+ import{o as i,p as o,q as r}from"./chunk-HKQTB65D.js";import{readFileSync as c,writeFileSync as l,existsSync as s}from"fs";import{createHash as a}from"crypto";var n="kanonak.lock";function f(e=n){return s(e)?o(c(e,"utf-8")):null}function k(e,t=n){e.lastUpdated=new Date().toISOString(),l(t,r(e),"utf-8")}function L(e){let t=a("sha256").update(e).digest("hex");return`${i}${t}`}export{f as a,k as b,L as c};
@@ -0,0 +1,38 @@
1
+ /**
2
+ * THE error for an HTTP response the SDK could not use. Every "failed to fetch"
3
+ * site builds it with {@link httpError}, so the message always carries what the
4
+ * server said about the refusal: its RFC 9457 problem details, or a bounded
5
+ * excerpt of a plain-text body, and its `Retry-After`. A server that refuses for
6
+ * a reason backoff cannot fix (a policy, a required step) explains itself there.
7
+ */
8
+ /** RFC 9457 problem details (`application/problem+json`): the members we surface. */
9
+ export interface ProblemDetails {
10
+ type?: string;
11
+ title?: string;
12
+ status?: number;
13
+ detail?: string;
14
+ instance?: string;
15
+ }
16
+ export declare class KanonakHttpError extends Error {
17
+ readonly url: string;
18
+ readonly status: number;
19
+ readonly problem?: ProblemDetails | undefined;
20
+ /** The server's `Retry-After`, in seconds, when it sent one. */
21
+ readonly retryAfterSeconds?: number | undefined;
22
+ constructor(message: string, url: string, status: number, problem?: ProblemDetails | undefined,
23
+ /** The server's `Retry-After`, in seconds, when it sent one. */
24
+ retryAfterSeconds?: number | undefined);
25
+ }
26
+ /**
27
+ * Build the error for `response` to a request for `url`. `what` names the thing
28
+ * being fetched ("Kanonak package", "publisher lock"). Reads the body, so call
29
+ * it only for a response the caller will not otherwise consume.
30
+ */
31
+ export declare function httpError(what: string, url: string, response: Response): Promise<KanonakHttpError>;
32
+ /**
33
+ * `(status text): what the server said [retry-after]` for a response: the status,
34
+ * its problem details or body excerpt, and its `Retry-After`. Reads the body.
35
+ */
36
+ export declare function describeResponse(response: Response): Promise<string>;
37
+ /** `Retry-After` (delta-seconds or HTTP-date) as whole seconds from now. */
38
+ export declare function retryAfterSecondsOf(header: string | null): number | undefined;
@@ -59,8 +59,11 @@ export declare function assertHttpsUrl(url: string | URL): void;
59
59
  * a rate-limited or struggling origin (e.g. kanonak.org) is backed off rather
60
60
  * than hammered. Retries are bounded ({@link MAX_RETRIES}); a non-retryable
61
61
  * status (200/404/302/4xx) returns immediately, and a final 429/5xx is returned
62
- * to the caller to handle. The {@link setKanonakFetchRetries} seam disables the
63
- * waits in tests.
62
+ * to the caller to handle. A `Retry-After` longer than one backoff step
63
+ * ({@link BACKOFF_CAP_MS}) is returned at once too: retrying sooner than the
64
+ * server asked would ignore it, and waiting that long silently would hang the
65
+ * caller. The caller's {@link httpError} then says what the server asked for.
66
+ * The {@link setKanonakFetchRetries} seam disables the waits in tests.
64
67
  */
65
68
  export declare function kanonakFetch(input: string | URL, init?: RequestInit): Promise<Response>;
66
69
  /**
package/dist/index.d.ts CHANGED
@@ -23,9 +23,15 @@ export type { IKanonakDocumentRepository } from '@kanonak-protocol/types/documen
23
23
  export type { IKanonakParser } from '@kanonak-protocol/types/document/parsing';
24
24
  export type { KanonakDocument, KanonakMetadata, Namespace, Import, Version, DocumentReference, ParseResult, ParseError } from '@kanonak-protocol/types/document/models/types';
25
25
  export { VersionOperator } from '@kanonak-protocol/types/document/models/enums';
26
- export { OAuthDiscovery, DEFAULT_CONSENT_BINDING_PARAM, normalizeHost, createCredentialedFetch, parseAuthChallenge, TokenCredentialProvider, } from './auth/index.js';
27
- export type { OAuthServerMetadata, AuthenticatedFetchFn, CredentialProvider, RequestCredential, AuthChallenge, ResolveOptions, CredentialedFetchDeps, TokenCredentialProviderOptions, } from './auth/index.js';
26
+ export { DEFAULT_CONSENT_BINDING_PARAM, OAuthDiscovery, normalizeHost, CredentialError, createCredentialedFetch, CREDENTIAL_EXPIRY_SKEW_SECONDS, parseWwwAuthenticate, parseScope, scopeContains, narrowestScope, CREDENTIAL_HELPER_PROTOCOL_VERSION, checkCredentialAnswer, checkHelperAnswer, checkHelperEraseAnswer, TokenCredentialProvider, TOKEN_ENV, tokenEnvKeyFor, } from './auth/index.js';
27
+ export type { OAuthServerMetadata, AuthenticatedFetchFn, AuthChallenge, Credential, CredentialAnswer, CredentialEraseRequest, CredentialProvider, CredentialRequest, CredentialedFetchDeps, ParsedScope, AnswerCheck, AnswerProblem, ProtectedResourceMetadata, TokenCredentialProviderOptions, } from './auth/index.js';
28
+ export { ExecCredentialProvider, CREDENTIAL_HELPER_TIMEOUT_MS, splitCommandLine, } from './auth/ExecCredentialProvider.js';
29
+ export type { ExecCredentialProviderOptions } from './auth/ExecCredentialProvider.js';
30
+ export { credentialProviderFromConfig, CREDENTIAL_HELPER_ENV, userConfigPath, } from './auth/credentialConfig.js';
31
+ export type { CredentialProviderConfigOptions } from './auth/credentialConfig.js';
28
32
  export { kanonakFetch, assertHttpsUrl, setKanonakFetchRetries, setKanonakUserAgent, getKanonakUserAgent, KANONAK_USER_AGENT, } from './http/kanonakFetch.js';
33
+ export { KanonakHttpError, httpError, describeResponse, retryAfterSecondsOf } from './http/HttpError.js';
34
+ export type { ProblemDetails } from './http/HttpError.js';
29
35
  export { loadLockFile, saveLockFile, computeIntegrity, parseLockFile, serializeLockFile, computeIntegrityAsync, lockedVersion, INTEGRITY_PREFIX, } from './lock/index.js';
30
36
  export type { LockFile, LockEntry } from './lock/index.js';
31
37
  export { findDerivation } from './derivation/index.js';
package/dist/index.js CHANGED
@@ -1 +1,2 @@
1
- import{a as pt,b as ft,c as mt,d as ht,e as W}from"./chunk-A3HRXFVX.js";import{a as Vn,b as Nn,c as On}from"./chunk-DONOB6RA.js";import{a as ut,b as dt,c as lt,d as _r,e as xr,f as Pr,g as vr,h as Ir,i as Lr}from"./chunk-LBVHWFFL.js";import{a as Vr}from"./chunk-ED35OFGD.js";import{a as br,b as Er,c as Rr,d as B,e as Cr,f as Kr,g as Pe,h as Nr,i as Or,j as wr,k as Ar,l as Ur}from"./chunk-ADSDFJUO.js";import{a as fo,b as mo,c as ho,d as So,e as ko,f as vo,g as Io,h as Lo,i as Vo}from"./chunk-HKX27KBZ.js";import{a as yo,b as go,c as bo,d as Eo,e as Ro,f as Co,h as Ko,i as $e,j as Me,k as je,l as De,m as Fe,n as _o,o as Po}from"./chunk-OOYGILH4.js";import{a as kt,b as yt,c as gt,d as bt,e as Et,f as Rt}from"./chunk-GKIX3OD6.js";import{a as Ct,b as _t}from"./chunk-D2X6J77P.js";import{a as xo}from"./chunk-SC5M74NM.js";import{A as Jt,B as Zt,C as er,D as nr,E as or,F as tr,G as fr,H as mr,I as hr,J as Sr,K as kr,L as yr,M as gr,a as xt,b as Pt,c as vt,d as It,e as Lt,f as Vt,g as Nt,h as Ot,i as wt,j as At,k as Ut,l as $t,m as Mt,n as jt,o as Dt,p as Ft,q as Ht,r as Tt,s as qt,t as Wt,u as Bt,v as Gt,w as zt,x as Qt,y as Xt,z as Yt}from"./chunk-O6SOU5Y2.js";import"./chunk-VORVR5BZ.js";import{c as vn,d as rr,e as ar,f as ir,g as sr,i as cr,j as ur,m as dr,o as xe,q as In,r as Ln,t as lr,u as pr}from"./chunk-TYVZXABI.js";import"./chunk-QHABFCRC.js";import{a as fe}from"./chunk-6VIUXP4N.js";import{a as Ke,g as N,h as _e,i as st,j as ct,k as U}from"./chunk-22DSABP6.js";import{a as j}from"./chunk-7JBKOJB4.js";import{a as Kt}from"./chunk-PEJALHXK.js";import{$ as re,A as nn,B as on,C as tn,D as rn,E as an,F as sn,G as cn,H as un,I as dn,J as ln,K as ye,L as pn,M as fn,N as mn,O as hn,P as Sn,Q as kn,R as yn,S as gn,T as bn,U as En,V as Rn,W as Cn,X as Kn,Y as _n,Z as ge,_ as xn,a as Wo,aa as be,b as Bo,ba as Ee,c as F,ca as ae,d as Xo,da as T,e as Yo,ea as q,g as Jo,h as ne,ha as Zo,i as oe,ia as et,j as He,k as H,ka as nt,l as te,m as Te,ma as ot,n as qe,na as S,o as Se,oa as Ce,p as We,pa as tt,q as Be,qa as rt,r as Ge,s as ze,t as ke,ta as at,u as Qe,ua as it,v as Xe,va as A,w as Ye,x as Je,y as Ze,z as en}from"./chunk-NUTHBBDZ.js";import{C as w,D as C,E as ee,F as h,G as D,H as he,I as ie,J as Re,L as Pn,a as No,b as Oo,c as k,d as v,e as I,f as Ao,g as Uo,h as $o,i as Mo,j as jo,k as Do,l as Fo,m as Ho,n as To,o as qo,p as Go,q as zo,r as l,u as Qo,v as O,w as me,x as Z,z as _}from"./chunk-D4QGPMRW.js";import{a as wo}from"./chunk-FUUTGGJS.js";import"./chunk-F67UH4FD.js";import{a as to,b as ro,c as J,d as ao,e as V,f as io,g as so,h as co,i as uo,j as lo,k as po}from"./chunk-QILEJIFU.js";import{a as St}from"./chunk-ODIECDN7.js";async function wn(n){let e=await new U().parseKanonaks(n),t=await new W().reason(n);return{kind:"merged",catalog:e,reasoning:t}}function An(n,e){return{kind:"merged",catalog:n,reasoning:e}}async function Un(n,e){let t=e??new fe(new j);return{kind:"standalone",catalog:await new U().parseKanonaks(new Pn(n,t))}}function L(n){return typeof n=="number"?n:void 0}function $r(n){if(!n)return;let e=l(n);if(e===l(un))return"IRI";if(e===l(dn))return"BlankNode";if(e===l(ln))return"Literal"}function Mn(n){if(!n)return;let e=l(n);if(e===l(pn))return"Violation";if(e===l(fn))return"Warning";if(e===l(mn))return"Info"}function jn(n,e,t,o){let r=h(e,Se);if(!r)return;let a={path:r},u=L(C(e,We)),s=L(C(e,Be));u!==void 0&&(a.minCount=u),s!==void 0&&(a.maxCount=s);let i=L(C(e,Ye)),d=L(C(e,Je));i!==void 0&&(a.minLength=i),d!==void 0&&(a.maxLength=d);let c=L(C(e,Ze)),p=L(C(e,en));c!==void 0&&(a.minInclusive=c),p!==void 0&&(a.maxInclusive=p);let f=ee(e,Qe);if(f!==void 0){let m=ee(e,Xe);a.pattern=m!==void 0?{regex:f,flags:m}:{regex:f}}if(w(e,ke)){let m=[],P=[];for(let{item:y}of me(e,ke))"literal"in y?m.push(y.value):y instanceof I&&P.push(y.subject);m.length>0&&(a.inValues=m),P.length>0&&(a.inRefs=P)}let R=h(e,Ge);R&&(a.datatype=R);let $=h(e,ze);$&&(a.classRef=$);let M=$r(h(e,cn));M&&(a.nodeKind=M);let z=h(e,xn);if(z&&(a.hasValue=z),w(e,re)||w(e,be)||w(e,Ee)){let m={},P=L(C(e,be)),y=L(C(e,Ee));P!==void 0&&(m.minCount=P),y!==void 0&&(m.maxCount=y);let K=Mr(n,e,o);"problem"in K?m.problem=K.problem:m.shape=K.shape,a.qualified=m}let Q=ee(e,nn);Q!==void 0&&(a.message=Q);let X=Mn(h(e,ye))??t;return X&&(a.severity=X),a}function Mr(n,e,t){let o=D(e,re);if(o)return $n(n,o,void 0,t);let r=h(e,re);if(!r)return{problem:"sh:qualifiedValueShape is missing"};let a=l(r);if(t.has(a))return{problem:`sh:qualifiedValueShape '${r.name}' leads back to itself (a cycle through named shapes)`};let u=_(n,r);return u?$n(n,u,a,t):{problem:`sh:qualifiedValueShape '${r.name}' does not resolve`}}function $n(n,e,t,o){let r=t?new Set([...o,t]):o,a=Z(e,H);if((Z(e,te)||w(e,Se))&&!a){let i=jn(n,e,void 0,r);return i?{shape:{kind:"property",constraint:i}}:{problem:"the qualified property shape has no sh:path"}}return e instanceof k&&!a?{problem:`sh:qualifiedValueShape '${e.name}' is not a shape`}:{shape:{kind:"node",shape:Dn(n,e,r)}}}function Dn(n,e,t){let o=Mn(h(e,ye)),r={name:e instanceof k?e.name:"(inline shape)",uri:e instanceof k?S(e):void 0,targetClass:h(e,Te),targetNodes:O(e,on),targetSubjectsOf:O(e,tn),targetObjectsOf:O(e,rn),closed:C(e,an)===!0,ignoredProperties:[],severity:o,properties:[]};r.ignoredProperties.push(...O(e,sn));for(let{item:a}of me(e,qe)){let u;if(a instanceof v?u=a:a instanceof I&&(u=_(n,a.subject)),!u)continue;let s=jn(n,u,o,t);s&&r.properties.push(s)}return r}function se(n){let e=[];for(let t of n){if(!(t instanceof k)||!Z(t,H))continue;let o=S(t);e.push(Dn(n,t,new Set(o?[l(o)]:[])))}return e}var b="kanonak.org/transformations",G="values";var ce="allowed",Ie="expected",g=n=>({type:`${b}/VarRef`,varName:n}),ve=n=>({type:`${b}/IntegerLiteral`,integerLiteral:n}),jr=n=>({type:`${b}/DecimalLiteral`,decimalLiteral:n}),Fn=n=>Number.isInteger(n)?ve(n):jr(n),Hn=n=>({type:`${b}/Count`,source:n}),Tn=(n,e)=>({type:`${b}/GreaterThanOrEqual`,compareLeft:n,compareRight:e}),qn=(n,e)=>({type:`${b}/LessThanOrEqual`,compareLeft:n,compareRight:e});function Le(n,e){if(!e||e.length===0)return n;let t=new Set(["i","m","s"]),o=[...new Set(e.split(""))];if(o.filter(a=>!t.has(a)).length>0)throw new Error(`sh:flags '${e}' is outside the pinned regex subset (supported: i, m, s)`);return`(?${o.sort().join("")})${n}`}function ue(n){let e=[];return n.minCount!==void 0&&e.push({component:"minCount",per:"node",expr:Tn(Hn(g(G)),ve(n.minCount))}),n.maxCount!==void 0&&e.push({component:"maxCount",per:"node",expr:qn(Hn(g(G)),ve(n.maxCount))}),n.hasValue!==void 0&&e.push({component:"hasValue",per:"node",expr:{type:`${b}/Contains`,haystack:g(G),needle:g(Ie)}}),(n.inValues!==void 0||n.inRefs!==void 0)&&e.push({component:"in",per:"value",expr:{type:`${b}/Contains`,haystack:g(ce),needle:g("v")}}),n.pattern!==void 0&&e.push({component:"pattern",per:"value",expr:{type:`${b}/Matches`,matchSource:g("v"),pattern:Le(n.pattern.regex,n.pattern.flags)}}),n.minLength!==void 0&&e.push({component:"minLength",per:"value",expr:{type:`${b}/Matches`,matchSource:g("v"),pattern:`(?s)^.{${n.minLength},}$`}}),n.maxLength!==void 0&&e.push({component:"maxLength",per:"value",expr:{type:`${b}/Matches`,matchSource:g("v"),pattern:`(?s)^.{0,${n.maxLength}}$`}}),n.minInclusive!==void 0&&e.push({component:"minInclusive",per:"value",expr:Tn(g("v"),Fn(n.minInclusive))}),n.maxInclusive!==void 0&&e.push({component:"maxInclusive",per:"value",expr:qn(g("v"),Fn(n.maxInclusive))}),e}import{evaluate as Fr,ExpressionError as Hr}from"@kanonak-protocol/expression";function Bn(n,e){let t=Tr(e)?e:se(e),o=[],r=n.catalog.filter(s=>s instanceof k).map(de),a=new Map;qr(r,a);let u={scope:n,membership:new Ve(n),embeddedFocus:a};for(let s of t)for(let i of Wr(u,s,r))zn(u,s,i,o);return{conforms:!o.some(s=>s.severity==="Violation"),results:o}}function Tr(n){return n.length>0&&!(n[0]instanceof Object&&"statement"in n[0])&&typeof n[0].name=="string"&&"properties"in n[0]}function Gn(n){let e=n.predicate;return e instanceof I?e:void 0}function de(n){return{node:n,key:Re(n),uri:S(n),label:n.name}}function Oe(n,e){return{node:n,key:e,label:e.includes("#")?e.slice(e.indexOf("#")):e}}function qr(n,e){Ke(n.map(t=>t.node),({kanonak:t,address:o})=>{t instanceof v&&!e.has(t)&&e.set(t,Oe(t,o))})}var Ve=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(Ce(this.scope.catalog,e).map(r=>l(r))),this.ancestors.set(t,o)),o}};function Wr(n,e,t){let{scope:o}=n,r=new Map,a=s=>{r.set(s.key,s)},u=()=>[...t,...n.embeddedFocus.values()];if(e.targetClass){let s=e.targetClass;if(o.reasoning){let i=new Set(o.reasoning.getInstancesOfClass(s));for(let d of t)d.uri&&i.has(l(d.uri))&&a(d)}else for(let i of t)n.membership.isInstance(A(i.node),s)&&a(i);for(let i of n.embeddedFocus.values())n.membership.isInstance(A(i.node),s)&&a(i)}for(let s of e.targetNodes){let i=_(o.catalog,s);i instanceof k&&a(de(i))}for(let s of e.targetSubjectsOf){let i=l(s);for(let d of u())d.node.statement.some(c=>{let p=Gn(c);return p&&l(p.subject)===i})&&a(d)}for(let s of e.targetObjectsOf)for(let i of u())for(let d of ie(i.node,s,o.catalog,i.key))d.kind==="subject"?a(de(d.node)):d.kind==="embedded"&&a(n.embeddedFocus.get(d.node)??Oe(d.node,d.address));return[...r.values()]}function Br(n,e,t){return e.node?ie(e.node,t,n.scope.catalog,e.key).map(o=>Gr(n,o)):[]}function Gr(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)??Oe(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 zn(n,e,t,o){for(let r of e.properties)Xn(n,e,t,r,o);e.closed&&ra(e,t,o)}function Ne(n,e,t,o,r={},a){return{focusNode:e.key,focusUri:e.uri,constraintComponent:t,severity:a??Qn(n),message:o,sourceShape:n.name,sourceShapeUri:n.uri,...r}}function Qn(n){return n.severity??"Violation"}var zr={minCount:hn,maxCount:Sn,hasValue:ae,in:gn,pattern:bn,minLength:En,maxLength:Rn,minInclusive:Cn,maxInclusive:Kn};function Xn(n,e,t,o,r){let a=Br(n,t,o.path),u=o.severity??Qn(e),s=o.path.name,i=[...(o.inValues??[]).map(c=>typeof c=="boolean"?c?1:0:c),...(o.inRefs??[]).map(c=>({ref:l(c)}))],d=(c,p,f)=>{let R=Ne(e,t,c,o.message??p,{resultPath:o.path,value:f?.literal,valueRef:f?.ref},u);return r.push(R),R};for(let c of ue(o)){let p=zr[c.component];if(c.per==="node"){let f={[G]:a.map(R=>R.kernel),[ce]:i};o.hasValue&&(f[Ie]={ref:l(o.hasValue)}),Wn(c,f)||d(p,Qr(c,s,o,a.length));continue}for(let f of a){if((c.component==="pattern"||c.component==="minLength"||c.component==="maxLength")&&f.kind!=="string"){d(p,`'${s}' value is not a string; ${c.component} applies to string values.`,f);continue}Wn(c,{v:f.kernel,[ce]:i})||d(p,ea(c,s,o,f),f)}}if(o.nodeKind)for(let c of a)na(o.nodeKind,c)||d(_n,`'${s}' value is ${c.kind}; nodeKind requires ${o.nodeKind}.`,c);if(o.datatype)for(let c of a){let p=oa(o.datatype,c);p&&d(kn,`'${s}' ${p}`,c)}if(o.classRef)for(let c of a){let p=ta(n,o.classRef,c);p&&d(yn,`'${s}' ${p}`,c)}o.qualified&&Xr(n,o,a,s,d)}function Qr(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 Xr(n,e,t,o,r){let a=e.qualified,u=a.maxCount!==void 0?q:T,s=(d,c)=>{Yn.add(r(u,d,c))};if(!a.shape){s(`'${o}' qualified value shape cannot be evaluated: ${a.problem??"it could not be built"}.`);return}let i=0;for(let d of t){let c=d.ref?l(d.ref):d.embedded?d.embedded.label:JSON.stringify(d.literal),p=Yr(n,d);if(!p){s(`'${o}' value ${c} does not resolve in this scope; whether it conforms to the qualified shape cannot be decided.`,d);continue}let f=Zr(n,a.shape,p);if(f.kind==="undecided"){s(`'${o}' value ${c}: whether it conforms to the qualified shape cannot be decided \u2014 ${f.reason}`,d);continue}f.kind==="conforms"&&i++}a.minCount!==void 0&&i<a.minCount&&r(T,`'${o}' has ${i} value(s) that conform to the qualified shape; qualifiedMinCount is ${a.minCount}.`),a.maxCount!==void 0&&i>a.maxCount&&r(q,`'${o}' has ${i} value(s) that conform to the qualified shape; qualifiedMaxCount is ${a.maxCount}.`)}function Yr(n,e){switch(e.kind){case"reference":return e.subject?de(e.subject):void 0;case"embedded":return e.embedded;default:{let t=JSON.stringify(e.literal);return{key:t,label:t}}}}var Jr={name:"(qualified value shape)",targetNodes:[],targetSubjectsOf:[],targetObjectsOf:[],closed:!1,ignoredProperties:[],properties:[]},Yn=new WeakSet;function Zr(n,e,t){let o=[];e.kind==="property"?Xn(n,Jr,t,e.constraint,o):zn(n,e.shape,t,o);let r=o.find(a=>Yn.has(a));return r?{kind:"undecided",reason:r.message}:o.length===0?{kind:"conforms"}:{kind:"fails"}}function ea(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 Wn(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 Hr(`Conformance lowering produced an unexpected leaf '${o.type}'`)};return Fr(n.expr,void 0,t)===1}function na(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 oa(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=_e(n);if(t!==void 0)switch(t){case N.Boolean:return e.kind==="boolean"?void 0:`value is not a boolean (${n.name}).`;case N.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 N.Decimal:case N.Double:case N.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 ta(n,e,t){if(t.kind==="embedded"&&t.embedded?.node){let r=A(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}.`;if(n.scope.reasoning)return n.scope.reasoning.isInstanceOf(t.ref,e)?void 0:`value ${l(t.ref)} is not an instance of ${e.name}.`;let o=t.subject;return o?n.membership.isInstance(A(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 ra(n,e,t){if(!e.node)return;let o=new Set([...n.properties.map(a=>l(a.path)),...n.ignoredProperties.map(a=>l(a))]),r=new Set;for(let a of e.node.statement){let u=Gn(a);if(!u)continue;let s=l(u.subject);o.has(s)||r.has(s)||(r.add(s),t.push(Ne(n,e,ge,`'${e.label}' carries undeclared property '${u.subject.name}' (closed shape).`,{resultPath:u.subject})))}for(let a of e.node.unresolvedPredicates)r.has(a.key)||(r.add(a.key),t.push(Ne(n,e,ge,`'${e.label}' carries unresolvable property '${a.key}' (closed shape).`,{value:a.key})))}var aa="1.1.0",ia=new Set([ae,T,q].map(n=>n.name));async function Jn(n){let e=new B(n.repository),t=e.imports(),o=n.result.results.some(i=>ia.has(i.constraintComponent.name))?"1.2.0":aa,r=t.ensure(ne,oe,o,"sh"),a=(i,d)=>i&&i.version&&typeof i.version.major=="number"?`${t.ensure(i.publisher,i.package_,V(i.version),i.package_)}.${i.name}`:d,u={},s=[];return n.result.results.forEach((i,d)=>{let c=`result-${d+1}`;s.push(c);let p={type:`${r}.ValidationResult`,[`${r}.focusNode`]:a(i.focusUri,i.focusNode),[`${r}.resultMessage`]:i.message,[`${r}.resultSeverity`]:`${r}.${i.severity}`,[`${r}.sourceConstraintComponent`]:`${r}.${i.constraintComponent.name}`};i.resultPath&&(p[`${r}.resultPath`]=a(i.resultPath,l(i.resultPath))),i.sourceShapeUri&&(p[`${r}.sourceShape`]=a(i.sourceShapeUri,i.sourceShape)),i.valueRef?p[`${r}.value`]=a(i.valueRef,l(i.valueRef)):i.value!==void 0&&(p[`${r}.value`]=i.value),u[c]=p}),u.report={type:`${r}.ValidationReport`,[`${r}.conforms`]:n.result.conforms,...s.length>0?{[`${r}.result`]:s}:{}},e.buildContentAddressed({publisher:n.publisher,book:t,body:u,...n.header!==void 0?{header:n.header}:{},contentHashProperty:"contentHash"})}import{VersionOperator as $i}from"@kanonak-protocol/types/document/models/enums";var E="kanonak.org",x="view",Zn="core-kanonak",sa={publisher:E,package_:x,name:"rootView"},ca={publisher:E,package_:x,name:"bind"},ua={publisher:E,package_:x,name:"produces"},da={publisher:E,package_:x,name:"projections"},la={publisher:E,package_:x,name:"where"},pa={publisher:E,package_:x,name:"value"},fa={publisher:E,package_:x,name:"as"},le=class{constructor(e,t=new j){this.repository=e;this.parser=t;this.objectParser=new U(this.parser),this.builder=new B(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),a=h(r,ca);if(!a)throw new Error(`View ${r.namespace}/${r.name} declares no view.bind; cannot materialize.`);let u=h(r,ua);if(!u)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=ma(r),i=eo(o,E,Zn),d=eo(o,E,x),c=this.builder.imports(),p=c.ensure(E,Zn,i,"ck"),f=c.ensure(E,x,d,"v"),R=c.ref(u),$=new Ln(this.repository,this.parser,this.objectParser),M=new In($,o),z=this.readProjections(o,r),Q=ka(r,la),X=this.findInstances(o,a,await this.reason(t)),m={},P=new Set;for(let Y of X){if(!await this.passesWhere(M,o,Q,Y))continue;let pe={type:R};for(let Ae of z){let oo=await this.evaluateValue(M,o,Ae.value,Y),Ue=this.builder.serializeValue(no(oo),c);Ue!==void 0&&(pe[c.ref(Ae.as)]=Ue)}let we=S(Y);we&&(pe[`${f}.derivedFrom`]=c.ref(we)),m[this.rowName(Y,P)]=pe}let y={};t.resolvedAt&&(y[`${p}.resolvedAt`]=t.resolvedAt),t.invocationId&&(y[`${p}.id`]=t.invocationId);let K=await this.builder.buildContentAddressed({publisher:s,book:c,body:m,contentHashProperty:`${p}.contentHash`,header:y});return{yaml:K.yaml,contentHash:K.contentHash,packageName:K.packageName,publisher:K.publisher,rowCount:K.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=h(o,sa);if(r){let a=_(e,r);if(!a)throw new Error(`ViewPackage ${t.name} names rootView ${r.name}, which is not in the catalog.`);return a}return o}readProjections(e,t){let o=[];for(let r of he(t,da)){let a=r instanceof v?r:r instanceof I?_(e,r.subject):void 0;if(!a)continue;let u=D(a,pa),s=h(a,fa);u&&s&&o.push({value:u,as:s})}return o}async reason(e){return new W({profile:e.reasoningProfile??"owl-rl-classification"}).reason(this.repository)}findInstances(e,t,o){let r=Sa(e),a=[],u=new Set;for(let s of o.getInstancesOfClass(t)){if(u.has(s))continue;u.add(s);let i=r.get(s);i&&a.push(i)}return a.sort((s,i)=>{let d=F(S(s)),c=F(S(i));return d<c?-1:d>c?1:0}),a}async passesWhere(e,t,o,r){for(let a of o){let u=await this.evaluateValue(e,t,a,r);if(!ya(u))return!1}return!0}async evaluateValue(e,t,o,r){let a=vn(o,"view-projection",{catalog:t,depth:0}),u=new Map([["input",r]]);return e.evaluate(a,u)}rowName(e,t){let o=Pe(e.name)||"row",r=o,a=2;for(;t.has(r);)r=`${o}-${a++}`;return t.add(r),r}};function no(n){return xe(n)?n.value:Array.isArray(n)?n.map(no):n}function ma(n){let e=S(n);if(!e)throw new Error(`Could not derive a publisher from view ${n.namespace}/${n.name}.`);return e.publisher}function eo(n,e,t){let o=ha(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 ha(n,e,t){let o;for(let r of n){if(!(r instanceof k))continue;let a=S(r);!a||a.publisher!==e||a.package_!==t||!a.version||(!o||J(a.version,o)>0)&&(o=a.version)}return o?V(o):void 0}function Sa(n){let e=new Map,t=new Map;for(let o of n){if(!(o instanceof k))continue;let r=S(o);if(!r||!r.version)continue;let a=F(r),u=t.get(a);(!u||J(r.version,u)>0)&&(t.set(a,r.version),e.set(a,o))}return e}function ka(n,e){let t=D(n,e);return t?[t]:he(n,e).filter(o=>o instanceof v)}function ya(n){return n===!0?!0:n===!1||n===void 0||n===null?!1:typeof n=="string"?n.length>0:typeof n=="number"?n!==0:xe(n)?n.value.length>0:Array.isArray(n)?n.length>0:!!n}export{Gt as AmbiguousReferenceRule,Do as BooleanStatement,Rr as CANONICAL_FORM_VERSION,N as Carrier,Zt as ClassDefinitionRule,Dt as ClassHierarchyCycleRule,ho as CompositeKanonakDocumentRepository,xr as DEFAULT_CONSENT_BINDING_PARAM,Oo as DefinedKanonak,yr as DiamondNameClashRule,nr as DisplayLensScopeRule,mo as DocumentLocation,dt as EdgeType,v as EmbeddedKanonak,$t as EmbeddedKanonakTypeRule,Ho as EmbeddedStatement,Ar as EntitlementDeniedError,Ur as EntitlementProducer,fo as FileSystemKanonakDocumentRepository,St as GitIgnoreFilter,lt as GraphBuilder,Po as HttpKanonakDocumentRepository,Me as INTEGRITY_PREFIX,Kr as ImportBook,Mt as ImportExistenceRule,fe as InMemoryKanonakDocumentRepository,yo as KANONAK_USER_AGENT,No as Kanonak,yt as KanonakDocumentPositions,U as KanonakObjectParser,gr as KanonakObjectValidator,j as KanonakParser,wo as KanonakUri,Ct as KanonakUriBuilder,Kt as KanonakUrlResolver,nt as KanonakVocabulary,sr as LINE_STYLES,Vt as LinkTargetRule,To as ListStatement,Ao as LiteralKanonak,vo as LocalFirstRepository,Io as LockAwareRepository,mr as LookBandPathRule,lr as LookRenderer,or as LookSemanticSvgPathRule,er as MarkdownLinkRule,qo as MarkdownStatement,Wt as NamespaceImportCycleRule,Nt as NamespacePrefixRule,ut as NodeType,jo as NumberStatement,Pr as OAuthDiscovery,mt as OWL_RL_CLASSIFICATION_RULES,Qt as ObjectPropertyValueValidationRule,vt as OntologyValidationError,xt as OntologyValidationResult,kr as OwlOneOfRule,B as PackageBuilder,Ut as PackageHeaderRule,Nr as ProducerRepository,Xt as PropertyDomainRule,Ft as PropertyHierarchyCycleRule,Yt as PropertyKindRangeConsistencyRule,kt as PropertyMetadata,zt as PropertyRangeReferenceRule,Ht as PropertyRangeRequiredRule,wt as PropertyTypeSpecificityRule,Ko as PublisherConfigResolver,_o as PublisherIndex,ft as RDFS_RULES,W as Reasoner,ht as ReasoningResult,I as ReferenceKanonak,Fo as ReferenceStatement,ko as RepositoryFactory,Jt as ReservedNameShadowRule,Ot as ResourceNamingRule,Wo as ResourceResolver,ot as ResourceTypeClassifier,oe as SHACL_PACKAGE,ne as SHACL_PUBLISHER,H as SH_NODE_SHAPE,te as SH_PROPERTY_SHAPE,He as SH_SHAPE,$o as ScalarStatement,fr as SequenceNarrativeRule,Sr as ShaclShapeRule,Uo as Statement,Mo as StringStatement,Tt as SubClassOfReferenceRule,qt as SubPropertyOfReferenceRule,k as SubjectKanonak,At as SubjectKanonakTypeRequiredRule,Lr as TokenCredentialProvider,pt as TripleStore,tr as TxExpressionCompilesRule,hr as TxExpressionPathRule,Bo as TypeResolver,rr as URI_DISPLAY_LABEL,ar as URI_DISPLAY_SUMMARY,Bt as UnresolvedPredicateRule,jt as UnresolvedReferenceRule,Lt as ValidationCache,It as ValidationContext,Pt as ValidationSeverity,$i as VersionOperator,le as ViewMaterializer,Or as allowAllPolicy,Eo as assertHttpsUrl,xo as assertPackageIdentity,Vo as buildLocalFirstRepository,dr as buildOntologyModel,Jn as buildReportPackageAsync,se as buildShapesModel,Zo as builtinHomePackages,et as builtinUri,br as canonicalForm,Er as canonicalHash,_e as carrierOf,Lo as collectKanonakFiles,J as compareVersions,On as computeIntegrity,Fe as computeIntegrityAsync,Cr as contentAddressedName,A as contextTypesOf,Ir as createCredentialedFetch,io as createVersion,Bn as evaluateConformance,ct as extractMarkdownLinks,Vr as findDerivation,st as findMalformedReferences,bt as findMarkdownLinkAt,Le as foldFlagsIntoPattern,zo as formatKanonakAddress,V as formatVersion,So as getGlobalCachePath,bo as getKanonakUserAgent,co as isCompatibleVersion,uo as isMajorCompatible,rt as isPropertySubject,Ro as kanonakFetch,Vn as loadLockFile,$e as lockedVersion,ue as lowerConstraint,Xo as makeUriKey,wr as noopMeter,_r as normalizeHost,vr as parseAuthChallenge,Go as parseKanonakAddress,je as parseLockFile,so as parseVersionString,gt as parseWithPositions,po as pickHighestDocument,at as propertiesInScope,tt as propertyClassOf,cr as readSequenceConnectors,_t as referenceSpelling,O as referenceUris,ir as resolveDisplayValue,it as resolvePropertyStep,Pe as sanitizeName,lo as satisfiesVersionOperator,Nn as saveLockFile,An as scopeFromCatalog,Un as scopeFromDocumentAsync,wn as scopeFromRepositoryAsync,De as serializeLockFile,Co as setKanonakFetchRetries,go as setKanonakUserAgent,Rt as sourceSymbolAt,Et as sourceSymbols,Re as subjectAddress,S as subjectUri,Ce as superClassChain,pr as supportedBandKeys,Yo as tripleKey,Qo as typeReferenceUris,F as uriKey,Jo as uriTriple,ie as valuesOf,to as versionOperatorFromChar,ro as versionOperatorToChar,ao as versionsEqual,Ke as walkDefinedKanonaks,ur as walkSequence};
1
+ import{a as xt,b as Kt,c as Nt,d as Lt,e as z}from"./chunk-A3HRXFVX.js";import{a as Dn,b as jn,c as Hn}from"./chunk-SBO34ENZ.js";import{a as Pt,b as _t,c as wt,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 Ie,m as Oe,n as zr,o as Qr,p as Xr,q as de,r as Yr,s as Ae}from"./chunk-PNBTIGX7.js";import{a as Jr}from"./chunk-ED35OFGD.js";import{a as $r,b as Ur,c as Mr,d as Q,e as Dr,f as jr,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 _o,c as wo,d as xo,e as Ko,f as Wo,g as qo,h as Bo,i as Go}from"./chunk-7F2EAT5Y.js";import{a as No,b as Lo,c as Io,d as Oo,e as N,f as Ao,g as Vo,h as $o,i as Uo,j as Mo,k as Do,m as jo,n as qe,o as Be,p as Ge,q as ze,r as Qe,s as Ho,t as To}from"./chunk-HKQTB65D.js";import{a as Ot,b as At,c as Vt,d as $t,e as Ut,f as Mt}from"./chunk-GKIX3OD6.js";import{a as Dt,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 gr,F as yr,G as Kr,H as Nr,I as Lr,J as Ir,K as Or,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-O6SOU5Y2.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 _r,o as Ke,q as Un,r as Mn,t as wr,u as xr}from"./chunk-TYVZXABI.js";import"./chunk-QHABFCRC.js";import{a as Se}from"./chunk-6VIUXP4N.js";import{a as we,g as $,h as xe,i as Rt,j as vt,k as H}from"./chunk-22DSABP6.js";import{a as F}from"./chunk-7JBKOJB4.js";import{a as jt}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 gn,J as yn,K as be,L as En,M as bn,N as Cn,O as Rn,P as vn,Q as Pn,R as _n,S as wn,T as xn,U as Kn,V as Nn,W as Ln,X as In,Y as On,Z as Ce,_ as An,a as st,aa as Re,b as ct,ba as ve,c as W,ca as se,d as pt,da as B,e as ft,ea as G,g as mt,h as te,ha as ht,i as re,ia as St,j as Xe,k as q,ka as kt,l as ie,m as Ye,ma as gt,n as Je,na as k,o as ye,oa as _e,p as Ze,pa as yt,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 j,w as an,x as sn,y as cn,z as dn}from"./chunk-NUTHBBDZ.js";import{C as D,D as R,E as oe,F as S,G as T,H as ge,I as ce,J as Pe,L as Vn,a as zo,b as Qo,c as g,d as L,e as I,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 _}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 go,e as V,f as yo,g as Eo,h as bo,i as Co,j as Ro,k as vo}from"./chunk-QILEJIFU.js";import{a as It}from"./chunk-ODIECDN7.js";async function Fn(n){let e=await new H().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 F);return{kind:"standalone",catalog:await new H().parseKanonaks(new Vn(n,t))}}function O(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(gn))return"BlankNode";if(e===l(yn))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,ye);if(!r)return;let i={path:r},d=O(R(e,Ze)),s=O(R(e,en));d!==void 0&&(i.minCount=d),s!==void 0&&(i.maxCount=s);let a=O(R(e,an)),u=O(R(e,sn));a!==void 0&&(i.minLength=a),u!==void 0&&(i.maxLength=u);let c=O(R(e,cn)),p=O(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(D(e,Ee)){let h=[],K=[];for(let{item:y}of ke(e,Ee))"literal"in y?h.push(y.value):y instanceof I&&K.push(y.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),D(e,ae)||D(e,Re)||D(e,ve)){let h={},K=O(R(e,Re)),y=O(R(e,ve));K!==void 0&&(h.minCount=K),y!==void 0&&(h.maxCount=y);let P=ii(n,e,o);"problem"in P?h.problem=P.problem:h.shape=P.shape,i.qualified=h}let x=oe(e,un);x!==void 0&&(i.message=x);let J=Bn(S(e,be))??t;return J&&(i.severity=J),i}function ii(n,e,t){let o=T(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=_(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,q);if((ne(e,ie)||D(e,ye))&&!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 g&&!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 g?e.name:"(inline shape)",uri:e instanceof g?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 I&&(d=_(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 g)||!ne(t,q))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 g).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 I?e:void 0}function fe(n){return{node:n,key:Pe(n),uri:k(n),label:n.name}}function je(n,e){return{node:n,key:e,label:e.includes("#")?e.slice(e.indexOf("#")):e}}function li(n,e){we(n.map(t=>t.node),({kanonak:t,address:o})=>{t instanceof L&&!e.has(t)&&e.set(t,je(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(_e(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;if(o.reasoning){let a=new Set(o.reasoning.getInstancesOfClass(s));for(let u of t)u.uri&&a.has(l(u.uri))&&i(u)}else for(let a of t)n.membership.isInstance(j(a.node),s)&&i(a);for(let a of n.embeddedFocus.values())n.membership.isInstance(j(a.node),s)&&i(a)}for(let s of e.targetNodes){let a=_(o.catalog,s);a instanceof g&&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)??je(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)??je(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 De(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:wn,pattern:xn,minLength:Kn,maxLength:Nn,minInclusive:Ln,maxInclusive:In};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=De(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(On,`'${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(_n,`'${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?G:B,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=gi(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(B,`'${o}' has ${a} value(s) that conform to the qualified shape; qualifiedMinCount is ${i.minCount}.`),i.maxCount!==void 0&&a>i.maxCount&&r(G,`'${o}' has ${a} value(s) that conform to the qualified shape; qualifiedMaxCount is ${i.maxCount}.`)}function gi(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 yi={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,yi,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=xe(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=j(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}.`;if(n.scope.reasoning)return n.scope.reasoning.isInstanceOf(t.ref,e)?void 0:`value ${l(t.ref)} is not an instance of ${e.name}.`;let o=t.subject;return o?n.membership.isInstance(j(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(De(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(De(n,e,Ce,`'${e.label}' carries unresolvable property '${i.key}' (closed shape).`,{value:i.key})))}var _i="1.1.0",wi=new Set([se,B,G].map(n=>n.name));async function ao(n){let e=new Q(n.repository),t=e.imports(),o=n.result.results.some(a=>wi.has(a.constraintComponent.name))?"1.2.0":_i,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 xi}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=Ie(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=Oe(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=xi(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 x=f!==null?`exit ${f}`:`signal ${A}`;s(()=>i(new N(`${o} failed (${x})${v}`)));return}let U=Buffer.concat(u).toString("utf8").trim();try{let x=JSON.parse(U);s(()=>r(x))}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 Ii}from"os";import{join as Oi}from"path";var He="KANONAK_CREDENTIAL_HELPER";function lo(){return Oi(Ii(),".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",w="view",po="core-kanonak",$i={publisher:C,package_:w,name:"rootView"},Ui={publisher:C,package_:w,name:"bind"},Mi={publisher:C,package_:w,name:"produces"},Di={publisher:C,package_:w,name:"projections"},ji={publisher:C,package_:w,name:"where"},Hi={publisher:C,package_:w,name:"value"},Fi={publisher:C,package_:w,name:"as"},me=class{constructor(e,t=new F){this.repository=e;this.parser=t;this.objectParser=new H(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,w),c=this.builder.imports(),p=c.ensure(C,po,a,"ck"),m=c.ensure(C,w,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),x=Bi(r,ji),J=this.findInstances(o,i,await this.reason(t)),h={},K=new Set;for(let Z of J){if(!await this.passesWhere(v,o,x,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 y={};t.resolvedAt&&(y[`${p}.resolvedAt`]=t.resolvedAt),t.invocationId&&(y[`${p}.id`]=t.invocationId);let P=await this.builder.buildContentAddressed({publisher:s,book:c,body:h,contentHashProperty:`${p}.contentHash`,header:y});return{yaml:P.yaml,contentHash:P.contentHash,packageName:P.packageName,publisher:P.publisher,rowCount:P.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=S(o,$i);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 ge(t,Di)){let i=r instanceof L?r:r instanceof I?_(e,r.subject):void 0;if(!i)continue;let d=T(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=W(k(s)),c=W(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 g))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 g))continue;let r=k(o);if(!r||!r.version)continue;let i=W(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=T(n,e);return t?[t]:ge(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,wo as CompositeKanonakDocumentRepository,N as CredentialError,qr as DEFAULT_CONSENT_BINDING_PARAM,Qo as DefinedKanonak,Ar as DiamondNameClashRule,kr as DisplayLensScopeRule,_o as DocumentLocation,_t as EdgeType,L as EmbeddedKanonak,Zt as EmbeddedKanonakTypeRule,rt as EmbeddedStatement,oi as EntitlementDeniedError,ti as EntitlementProducer,Y as ExecCredentialProvider,Po as FileSystemKanonakDocumentRepository,It as GitIgnoreFilter,wt as GraphBuilder,To as HttpKanonakDocumentRepository,Be as INTEGRITY_PREFIX,jr as ImportBook,er as ImportExistenceRule,Se as InMemoryKanonakDocumentRepository,Ao as KANONAK_USER_AGENT,zo as Kanonak,At as KanonakDocumentPositions,No as KanonakHttpError,H as KanonakObjectParser,Vr as KanonakObjectValidator,F as KanonakParser,Xo as KanonakUri,Dt as KanonakUriBuilder,jt 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,wr as LookRenderer,gr 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,Or as OwlOneOfRule,Q as PackageBuilder,Jt as PackageHeaderRule,Zr as ProducerRepository,pr as PropertyDomainRule,tr as PropertyHierarchyCycleRule,fr as PropertyKindRangeConsistencyRule,Ot as PropertyMetadata,ur as PropertyRangeReferenceRule,rr as PropertyRangeRequiredRule,Xt as PropertyTypeSpecificityRule,jo as PublisherConfigResolver,Ho as PublisherIndex,Kt as RDFS_RULES,z as Reasoner,Lt as ReasoningResult,I as ReferenceKanonak,tt as ReferenceStatement,Ko as RepositoryFactory,mr as ReservedNameShadowRule,Qt as ResourceNamingRule,st as ResourceResolver,gt as ResourceTypeClassifier,re as SHACL_PACKAGE,te as SHACL_PUBLISHER,q as SH_NODE_SHAPE,ie as SH_PROPERTY_SHAPE,Xe as SH_SHAPE,Zo as ScalarStatement,Kr as SequenceNarrativeRule,Ir as ShaclShapeRule,Jo as Statement,et as StringStatement,ir as SubClassOfReferenceRule,ar as SubPropertyOfReferenceRule,g as SubjectKanonak,Yt as SubjectKanonakTypeRequiredRule,de as TOKEN_ENV,Ae as TokenCredentialProvider,xt as TripleStore,yr 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,_r as buildOntologyModel,ao as buildReportPackageAsync,ue as buildShapesModel,ht as builtinHomePackages,St as builtinUri,$r as canonicalForm,Ur as canonicalHash,xe as carrierOf,Gr as checkCredentialAnswer,Ie as checkHelperAnswer,Oe as checkHelperEraseAnswer,Bo as collectKanonakFiles,ee as compareVersions,Hn as computeIntegrity,Qe as computeIntegrityAsync,Dr as contentAddressedName,j as contextTypesOf,Xr as createCredentialedFetch,yo as createVersion,Ai as credentialProviderFromConfig,Io 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,xo as getGlobalCachePath,$o as getKanonakUserAgent,Lo as httpError,bo as isCompatibleVersion,Co as isMajorCompatible,Et as isPropertySubject,Mo as kanonakFetch,Dn 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,yt as propertyClassOf,vr as readSequenceConnectors,Ht as referenceSpelling,M as referenceUris,Cr as resolveDisplayValue,Ct as resolvePropertyStep,Oo as retryAfterSecondsOf,Ne as sanitizeName,Ro as satisfiesVersionOperator,jn as saveLockFile,Tr as scopeContains,Tn as scopeFromCatalog,Wn as scopeFromDocumentAsync,Fn as scopeFromRepositoryAsync,ze as serializeLockFile,Do as setKanonakFetchRetries,Vo as setKanonakUserAgent,Mt as sourceSymbolAt,Ut as sourceSymbols,uo as splitCommandLine,Pe as subjectAddress,k as subjectUri,_e as superClassChain,xr as supportedBandKeys,Yr as tokenEnvKeyFor,ft as tripleKey,lt as typeReferenceUris,W as uriKey,mt as uriTriple,lo as userConfigPath,ce as valuesOf,So as versionOperatorFromChar,ko as versionOperatorToChar,go as versionsEqual,we as walkDefinedKanonaks,Pr as walkSequence};
@@ -1 +1 @@
1
- import{h as e,n as r,o as n}from"../chunk-OOYGILH4.js";import"../chunk-SC5M74NM.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,s as r,t as n}from"../chunk-HKQTB65D.js";import"../chunk-SC5M74NM.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 +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-HKX27KBZ.js";import{g,h,n as i,o as j}from"../chunk-OOYGILH4.js";import"../chunk-SC5M74NM.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 k,g as l,h as m,i as n}from"../chunk-7F2EAT5Y.js";import{l as g,m as h,s as i,t as j}from"../chunk-HKQTB65D.js";import"../chunk-SC5M74NM.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,7 +1,7 @@
1
- import{c as Pe}from"../chunk-DONOB6RA.js";import{a as be,d as Z,f as Se,h as re}from"../chunk-HKX27KBZ.js";import{e as ve,g as $e,n as U,o as ee}from"../chunk-OOYGILH4.js";import"../chunk-D2X6J77P.js";import"../chunk-SC5M74NM.js";import{a as H,b as q}from"../chunk-VORVR5BZ.js";import{t as ne}from"../chunk-TYVZXABI.js";import"../chunk-QHABFCRC.js";import{a as ye}from"../chunk-6VIUXP4N.js";import{k as te}from"../chunk-22DSABP6.js";import{a as O}from"../chunk-7JBKOJB4.js";import{a as _e}from"../chunk-PEJALHXK.js";import"../chunk-NUTHBBDZ.js";import{A as oe,c as we,p as xe}from"../chunk-D4QGPMRW.js";import{a as Re}from"../chunk-FUUTGGJS.js";import"../chunk-F67UH4FD.js";import{c as V,e as j,f as W,g as Q}from"../chunk-QILEJIFU.js";import{readFileSync as pe,writeFileSync as Me,mkdirSync as Ee}from"fs";import{join as ae}from"path";import De from"js-yaml";var je=[{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 je}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 se(r){let{publisher:e,availablePublishers:i,catalog:o,lookRenderer:t,localNamespaces:a,rawByNsKey:u,renderStack:d,producers:k,lockSource:y,configSource:s}=r,l=new Map,f=new Map,p=new Map,m=new Set;for(let S of o){if(!(S instanceof we))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=Q(E);D&&(m.has(_)||(m.add(_),f.has(P)||f.set(P,[]),f.get(P).push({verStr:E,version:D})),S.name===P&&p.set(_,S))}for(let S of f.values())S.sort((w,_)=>V(_.version,w.version));return{publisher:e,availablePublishers:i,catalog:o,lookRenderer:t,localNamespaces:a,rawByNsKey:u,bySubject:l,pkgVersions:f,pkgSelfByVer:p,renderStack:d,...k?{producers:k}:{},...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 re(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 k=new Set,y=new Map;for(let c of t)c.publisher===d&&(k.add(`${c.publisher}/${c.package_}@${c.verStr}`),y.set(`${c.package_}@${c.verStr}`,c.source));let s=Z(),l=new be(s,!0,i),f={};e.httpCache&&(f.getFromCache=e.httpCache.getFromCache,f.onFetch=e.httpCache.onFetch),e.fetchFn&&(f.fetchFn=e.fetchFn);let p=e.repository??new Se(o,l,new ee(f)),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,X=await(e.fetchFn?e.fetchFn(T,h.publisher):ve(T));if(!X.ok){let C=`fetch ${T} failed: HTTP ${X.status} ${X.statusText}`;w.push({...h,origin:"missing",reason:C}),m(`[render-stack] ${n} \u2014 MISSING: ${C}`);continue}let ke=await X.text();await o.saveDocumentAsync(i.parse(ke),`${h.publisher}/${h.package_}@${F}`);try{let C=ae(s,h.publisher);Ee(C,{recursive:!0}),Me(ae(C,`${h.package_}@${F}.kan.yml`),ke,"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 H(P,p,{onUnresolvedEdge:c=>E.push(c)}),A=p;if(!e.repository){for(let c of S)D.add(N(c));A=new q(p,D)}let B=await new te(i).parseKanonaks(A),le=new ne(B),de=(c,h)=>oe(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"||de(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(ae(r,"kanonak.lock"),"utf-8")}catch{K=Ke(d,t,i)}let L;try{L=pe(ae(r,".well-known","kanonak.json"),"utf-8")}catch{L=void 0}return se({publisher:d,availablePublishers:u,catalog:B,lookRenderer:le,localNamespaces:k,rawByNsKey:y,renderStack:J,...K?{lockSource:K}:{},...L?{configSource:L}:{}})}function Ke(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),k={},y;try{y=i.parse(d).metadata?.imports}catch{y=void 0}for(let l of y?.[r]??[]){let f=o.get(l.packageName);f&&(k[`${r}/${l.packageName}`]=f.verStr)}let s={};for(let l of Object.keys(k).sort())s[l]=k[l];t[`${r}/${a}`]={version:u,resolved:`https://${r}/${a}/${u}.kan.yml`,integrity:Pe(d),dependencies:s}}return De.dump({version:"1",lastUpdated:"",packages:t},{lineWidth:-1,sortKeys:!1,quotingType:'"'})}import{existsSync as Ve,readFileSync as Ae,writeFileSync as Be,mkdirSync as Le}from"fs";import{join as Ce}from"path";async function ge(r,e={}){let i=new O,o=xe(r),t=o.kind==="resource"?o.uri.publisher:o.publisher,a=e.log??(()=>{}),u=e.cacheRoot??Z(),d=(n,g,b)=>Ce(u,n,`${g}@${b}.kan.yml`),k=new Set,y=new Set,s=new Map,l=new ee({getFromCache:(n,g,b)=>{let v=d(n,g,b),$=Ve(v)?Ae(v,"utf-8"):null;return $!==null&&k.add(`${n}/${g}`),$},onFetch:(n,g,b,v)=>{y.add(`${n}/${g}`);try{let $=Ce(u,n);Le($,{recursive:!0}),Be(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}:{}}),f=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 f.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":k.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=[],le=await H([...S,...D],l,{onUnresolvedEdge:n=>B.push(n)}),de=new q(l,le),I=await new te(i).parseKanonaks(de),Y=new ne(I),J=A.map(n=>n.origin==="missing"||oe(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 se({publisher:t,availablePublishers:[t],catalog:I,lookRenderer:Y,localNamespaces:c,rawByNsKey:h,renderStack:L})}import{VersionOperator as ce}from"@kanonak-protocol/types/document/models/enums";function ie(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,k={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})),f=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:k,...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)),...f]}}function Oe(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function he(r){let e=Oe,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(`
1
+ import{c as je}from"../chunk-SBO34ENZ.js";import{a as be,d as Q,f as we,h as ee}from"../chunk-7F2EAT5Y.js";import{b as ve,j as $e,l as Se,s as U,t as Z}from"../chunk-HKQTB65D.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{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
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(`
3
- `),a=r.renderStack.packages.map(s=>{let l=s.origin!=="missing"&&!s.resolvedButNotInCatalog,f=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>${f}</td><td>${p}</td></tr>`}).join(`
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>`,k=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(`
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
+ `),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(`
6
6
  `);return`<!doctype html>
7
7
  <html lang="en">
@@ -49,7 +49,7 @@ ${d}
49
49
  <p class="meta">Resolved for the publisher landing page. Each token shows which resource in the cascade supplied it.</p>
50
50
  ${r.stylesheet.tokens.length===0?'<p><span class="bad">\u2717 No tokens resolved</span></p>':`<table>
51
51
  <tr><th>Token</th><th>Value</th><th>Declared by</th><th>Cascade level</th></tr>
52
- ${k}
52
+ ${f}
53
53
  </table>`}
54
54
 
55
55
  <h2>Look (page body)</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>`),Te=r=>({status:301,headers:{Location:r},body:""}),We=r=>({status:302,headers:{Location:r},body:""});function Ue(r){switch(r.kind){case"exact":return{operator:ce.Exact,version:W(r.major,r.minor,r.patch)};case"minor-pin":return{operator:ce.Compatible,version:W(r.major,r.minor,0)};case"major-pin":return{operator:ce.Major,version:W(r.major,0,0)};default:return{operator:ce.Any,version:W(0,0,0)}}}async function He(r,e,i,o){if(!o)return null;let t=r.producers?.find(k=>k.canProduce(r.publisher,e));if(!t)return null;let a=await t.resolveVersion(r.publisher,e,Ue(i));if(!a)return null;let u=j(a);if(i.kind!=="exact")return We(`/${e}/${u}.kan.yml`);let{source:d}=await t.produce(r.publisher,e,a);return x(200,R[".kan.yml"],d)}function Ne(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($e(),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(ie(r),null,2));if(e==="/.well-known/kanonak-render")return x(200,R[".html"],he(ie(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 k=!u&&/application\/yaml|text\/yaml/i.test(i),y=d.endsWith("/");y&&d!=="/"&&(d=d.slice(0,-1));let s=_e.parse(d,t);if(!s)return M(e);if(s.kind==="package"){let l=Ne(r,s.package_,s.versionSpec);if(!l)return await He(r,s.package_,s.versionSpec,a===".kan.yml"||k)??M(e);if(a===".kan.yml"||k){let m=r.rawByNsKey.get(`${s.package_}@${l}`);return m!==void 0?x(200,R[".kan.yml"],m):M(e)}let f=r.pkgSelfByVer.get(`${s.package_}@${l}`);if(!f)return M(e);if(a===".css")return x(200,R[".css"],o.renderStylesheet(f));if(!y)return Te(d+"/");let p=s.versionSpec.kind==="any";if(p&&!o.hasDeclaredView(f)){let m=(r.pkgVersions.get(s.package_)||[]).map(S=>S.verStr);return x(200,R[".html"],o.renderPackageVersionList(s.package_,m,f))}return x(200,R[".html"],await o.renderDocument(f,p?{bareOverview:!0}:void 0))}if(s.kind==="resource"){let l=Ne(r,s.package_,s.versionSpec);if(!l)return M(e);let f=r.bySubject.get(`${t}/${s.package_}@${l}/${s.name}`);if(!f)return M(e);switch(a){case".css":return x(200,R[".css"],o.renderStylesheet(f));case".svg":return x(200,R[".svg"],await o.renderSvg(f));case".md":{let p=o.renderRawMarkdown(f);return p===void 0?M(e):x(200,R[".md"],p)}default:return x(200,R[".html"],await o.renderDocument(f))}}return M(e)}import{readFileSync as qe}from"fs";var Ie=/^\d+\.\d+\.\d+$/,fe=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 re(this.options.root))try{let a=o.parse(qe(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,k;if(u&&this.options.root!==void 0){let l=this.options.root;d=`ws:${e}`,k=()=>ue(l,{publisher:e,...this.options.log?{log:this.options.log}:{}})}else{let l=i?o?`${e}/${i}@${o}`:`${e}/${i}`:e;d=`rm:${l}`,k=()=>ge(l,a)}let y=this.models.get(d);if(y)return y;let s=await k();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:Fe()};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&&Ie.test(o[2])?o[2]:void 0,k=await this.modelFor(t,u,d),y=e.endsWith("/")&&o.length>1?"/":"",s="/"+o.slice(1).join("/")+y,l=await me(k,s,i);return l.headers.Location?{...l,headers:{...l.headers,Location:`/${t}${l.headers.Location}`}}:l}};function Ge(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 ze(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]&&Ie.test(e[2])?Q(e[2])??void 0:void 0,a=t?e[3]:e[2];return a?{kind:"resource",uri:new Re(i,o,a,t)}:t?{kind:"package",publisher:i,package_:o,version:t}:{kind:"package",publisher:i,package_:o}}function Fe(){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{q as ClosureScopedRepository,fe as RequestRouter,je as UNIVERSAL_RENDER_BASE,ze as addressForRequestPath,ie as buildRenderDiagnostics,z as buildRenderStackWarnings,H as deriveImportClosure,Fe as landingPage,ge as loadResourceModel,ue as loadServerModel,he as renderDiagnosticsHtml,N as renderRefKey,Ge 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,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,...this.options.log?{log:this.options.log}:{}})}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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanonak-protocol/sdk",
3
- "version": "5.38.0",
3
+ "version": "6.0.0",
4
4
  "description": "TypeScript SDK for the Kanonak Protocol — parse, resolve, validate, reason over, and render .kan.yml packages.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -99,7 +99,8 @@
99
99
  "default": "./dist/browser.js"
100
100
  },
101
101
  "./vectors/lexical-vectors.json": "./vectors/lexical-vectors.json",
102
- "./vectors/full-form-vectors.json": "./vectors/full-form-vectors.json"
102
+ "./vectors/full-form-vectors.json": "./vectors/full-form-vectors.json",
103
+ "./vectors/credential-helper-vectors.json": "./vectors/credential-helper-vectors.json"
103
104
  },
104
105
  "files": [
105
106
  "dist/**/*",
@@ -134,7 +135,7 @@
134
135
  ],
135
136
  "dependencies": {
136
137
  "@kanonak-protocol/canonical": "^0.1.3",
137
- "@kanonak-protocol/types": "^5.38.0",
138
+ "@kanonak-protocol/types": "^6.0.0",
138
139
  "ignore": "^7.0.5",
139
140
  "js-yaml": "^4.1.0",
140
141
  "yaml": "^2.7.0",