@kanonak-protocol/sdk 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,58 @@
1
+ import type { Version } from '@kanonak-protocol/types/document/models/types';
2
+ import { KanonakUri } from './KanonakUri.js';
3
+ /**
4
+ * The space of "Kanonak addresses" — anything a user might paste into
5
+ * an address bar or click as a link, at any of the three nested
6
+ * levels of the protocol's hierarchy:
7
+ *
8
+ * 1. publisher (e.g. `kanonak.org`)
9
+ * 2. publisher/package[@version] (e.g. `kanonak.org/core-rdf@1.0.0`)
10
+ * 3. publisher/package[@version]/name (e.g. `kanonak.org/core-rdf@1.0.0/Class`)
11
+ *
12
+ * Each level is a legitimate browse target: a publisher's index page,
13
+ * a package's overview, or a single resource's form view. The shape
14
+ * of the address tells consumers which view to render.
15
+ *
16
+ * `KanonakUri` is a strictly-narrower type — it only addresses level
17
+ * 3 (a named resource). The two coexist: pre-existing call sites that
18
+ * require a resource address keep using `KanonakUri.parse` and are
19
+ * unaffected; consumers that accept any browse target use
20
+ * `parseKanonakAddress` and switch on the discriminator.
21
+ */
22
+ export type KanonakAddress = {
23
+ readonly kind: 'publisher';
24
+ readonly publisher: string;
25
+ } | {
26
+ readonly kind: 'package';
27
+ readonly publisher: string;
28
+ readonly package_: string;
29
+ /** Absent for the unversioned form `publisher/package`. */
30
+ readonly version?: Version;
31
+ } | {
32
+ readonly kind: 'resource';
33
+ readonly uri: KanonakUri;
34
+ };
35
+ /**
36
+ * Parse a Kanonak address string. Recognizes all three levels:
37
+ *
38
+ * - 1 segment → `publisher`
39
+ * - 2 segments → `publisher/package` or `publisher/package@version`
40
+ * - 3 segments → `publisher/package[@version]/name` (delegates to
41
+ * `KanonakUri.parse` so the resource form keeps the
42
+ * single source of truth)
43
+ *
44
+ * Throws on malformed input. The error messages name the form that
45
+ * was expected so address-bar UIs can echo the problem back without
46
+ * inventing their own diagnostics.
47
+ *
48
+ * Note: a raw publisher domain is just an identifier — the parser
49
+ * trusts whatever the user typed and does not validate that the
50
+ * domain actually publishes Kanonak content. Callers that want to
51
+ * confirm reachability resolve against the publisher index.
52
+ */
53
+ export declare function parseKanonakAddress(input: string): KanonakAddress;
54
+ /**
55
+ * Render a `KanonakAddress` back to its canonical string form.
56
+ * Round-trips with `parseKanonakAddress`.
57
+ */
58
+ export declare function formatKanonakAddress(address: KanonakAddress): string;
@@ -2,6 +2,8 @@ export { ResourceResolver } from './ResourceResolver.js';
2
2
  export type { ILogger } from './ResourceResolver.js';
3
3
  export { KanonakUri } from './KanonakUri.js';
4
4
  export { KanonakUriBuilder } from './KanonakUriBuilder.js';
5
+ export { parseKanonakAddress, formatKanonakAddress, } from './KanonakAddress.js';
6
+ export type { KanonakAddress } from './KanonakAddress.js';
5
7
  export type { ResourceResolutionResult } from './ResourceResolutionResult.js';
6
8
  export { TypeResolver } from './TypeResolver.js';
7
9
  export { findInstancesByType } from './InstanceSearch.js';
@@ -1 +1 @@
1
- var g=class n{constructor(e,t,o,r){this.publisher=e;this.package_=t;this.name=o;this.version=r}publisher;package_;name;version;static parse(e){if(!e||e.trim().length===0)throw new Error("Kanonak URI string cannot be null or empty");let t=e.split("/");if(t.length!==3)throw new Error(`Invalid Kanonak URI: ${e}. Expected format: publisher/package[@version]/name`);let[o,r,s]=t;if(!o||!r||!s)throw new Error(`Invalid Kanonak URI: ${e}. Expected format: publisher/package[@version]/name`);let a=r.indexOf("@");if(a===-1)return new n(o,r,s,void 0);let u=r.substring(0,a),i=r.substring(a+1);if(!u||!i)throw new Error(`Invalid Kanonak URI: ${e}. Expected format: publisher/package[@version]/name`);let c=i.split(".").map(Number),p=P(c[0]||0,c[1]||0,c[2]||0);return new n(o,u,s,p)}toString(){return this.version?`${this.publisher}/${this.package_}@${this.version.major}.${this.version.minor}.${this.version.patch}/${this.name}`:`${this.publisher}/${this.package_}/${this.name}`}};function P(n,e,t){return{major:n,minor:e,patch:t,toString:()=>`${n}.${e}.${t}`,equals:o=>!o||typeof o!="object"?!1:o.major===n&&o.minor===e&&o.patch===t,getHashCode:()=>n<<20|e<<10|t,compareTo:o=>n!==o.major?n-o.major:e!==o.minor?e-o.minor:t-o.patch}}function b(n){if(Array.isArray(n))return n.map(t=>t?.toString()??"").filter(t=>t.length>0);let e=n?.toString();return e?[e]:[]}var R=class{cache=new Map;repository;logger;constructor(e,t){this.repository=e,this.logger=t}async resolveEntityAsync(e,t){let o=t.metadata?.namespace_?.toString()??"unknown",r=this.cache.get(o);if(r){let a=r.get(e);if(a)return a}let s=await this.buildEntityIndexAsyncInternal(t,new Set,"");return this.cache.set(o,s),s.get(e)??null}async resolveAllEntitiesAsync(e,t){let o=await this.buildAllEntitiesIndexAsync(t,new Set,"");if(e.includes(".")){let r=e.split("."),s=r[0],a=r[1],u=await this.findDocumentForAlias(t,s);return u?await this.resolveAllEntitiesAsync(a,u):[]}return o.filter(r=>r.entityName===e)}async buildAllEntitiesIndexAsync(e,t,o){let r=[],s=e.metadata?.namespace_?.toString()??"unknown";if(this.logger?.debug?.(`Building ALL entities index for namespace: ${s}`),t.has(s))return this.logger?.debug?.(`Skipping ${s} - already visited (circular import prevention)`),r;t.add(s);let a=o.length===0?s:`${o} \u2192 ${s}`;for(let[u,i]of Object.entries(e.body))if(i&&typeof i=="object"&&!Array.isArray(i)){let c=e.metadata.namespace_?.version??{major:1,minor:0,patch:0,toString:()=>"1.0.0",equals:()=>!1,getHashCode:()=>0,compareTo:()=>0};r.push({entityName:u,uri:new g(e.metadata.namespace_.publisher,e.metadata.namespace_.package_,u,c),entity:i,definedInNamespace:s,isImported:o.length>0,importPath:a})}if(this.logger?.debug?.(`Collected ${r.length} entities from ${s}`),e.metadata?.imports){let u=Object.values(e.metadata.imports).reduce((i,c)=>i+c.length,0);this.logger?.debug?.(`Processing ${u} import(s) for ${s}`);for(let[i,c]of Object.entries(e.metadata.imports))for(let p of c)try{this.logger?.debug?.(`Resolving import: ${i}/${p.packageName}`);let l=await this.repository.getHighestCompatibleVersionAsync(i,p);if(l){this.logger?.debug?.(`Successfully loaded import: ${l.metadata?.namespace_?.toString()}`);let m=await this.buildAllEntitiesIndexAsync(l,t,a);r.push(...m),this.logger?.debug?.(`Added ${m.length} entities from import ${l.metadata?.namespace_?.toString()}`)}else this.logger?.warn?.(`Failed to load import: ${i}/${p.packageName}`)}catch(l){let m=l;throw this.logger?.error?.(`Failed to process import ${i}/${p.packageName} for namespace ${s}. Error: ${m.message}`,m),new Error(`Failed to process import ${i}/${p.packageName} for namespace ${s}. See inner exception for details.`,{cause:l})}}return r}async buildEntityIndexAsync(e){return await this.buildEntityIndexAsyncInternal(e,new Set,"")}async buildEntityIndexAsyncInternal(e,t,o){let r=new Map,s=e.metadata?.namespace_?.toString()??"unknown";if(this.logger?.debug?.(`Building entity index for namespace: ${s}`),t.has(s))return this.logger?.debug?.(`Skipping ${s} - already visited (circular import prevention)`),r;t.add(s);let a=o.length===0?s:`${o} \u2192 ${s}`,u=0;for(let[i,c]of Object.entries(e.body))if(c&&typeof c=="object"&&!Array.isArray(c)&&!r.has(i)){let p=e.metadata.namespace_?.version??{major:1,minor:0,patch:0,toString:()=>"1.0.0",equals:()=>!1,getHashCode:()=>0,compareTo:()=>0};r.set(i,{entityName:i,uri:new g(e.metadata.namespace_.publisher,e.metadata.namespace_.package_,i,p),entity:c,definedInNamespace:s,isImported:o.length>0,importPath:a}),u++}if(this.logger?.debug?.(`Indexed ${u} entities from ${s}`),e.metadata?.imports){let i=Object.values(e.metadata.imports).reduce((c,p)=>c+p.length,0);this.logger?.debug?.(`Processing ${i} import(s) for ${s}`);for(let[c,p]of Object.entries(e.metadata.imports))for(let l of p)try{this.logger?.debug?.(`Resolving import: ${c}/${l.packageName}`);let m=await this.repository.getHighestCompatibleVersionAsync(c,l);if(m){this.logger?.debug?.(`Successfully loaded import: ${m.metadata?.namespace_?.toString()}`);let d=await this.buildEntityIndexAsyncInternal(m,t,a),h=0;for(let[y,$]of d.entries())if(r.has(y)||(r.set(y,$),h++),l.alias&&!y.includes(".")){let x=`${l.alias}.${y}`;r.has(x)||(r.set(x,$),h++)}this.logger?.debug?.(`Merged ${h} entities from import ${m.metadata?.namespace_?.toString()}`)}else this.logger?.warn?.(`Failed to load import: ${c}/${l.packageName}`)}catch(m){let d=m;throw this.logger?.error?.(`Failed to process import ${c}/${l.packageName} for namespace ${s}. Error: ${d.message}`,d),new Error(`Failed to process import ${c}/${l.packageName} for namespace ${s}. See inner exception for details.`,{cause:m})}}return r}async findDocumentForAlias(e,t){if(!e.metadata?.imports)return null;for(let[o,r]of Object.entries(e.metadata.imports))for(let s of r){if(s.alias===t)return await this.repository.getHighestCompatibleVersionAsync(o,s);if(!s.alias&&s.packageName===t)return await this.repository.getHighestCompatibleVersionAsync(o,s)}return null}clearCache(){this.cache.clear()}clearCacheForDocument(e){this.cache.delete(e)}async isSubclassOfAsync(e,t,o){if(e===t)return!0;let r=new Set;return await this.isSubclassOfRecursiveAsync(e,t,o,r)}async isSubclassOfRecursiveAsync(e,t,o,r){if(r.has(e))return!1;r.add(e);let s=await this.resolveEntityAsync(e,o);if(!s?.entity)return!1;let a=s.entity.subClassOf;if(a){let u=b(a);for(let i of u)if(i===t||await this.isSubclassOfRecursiveAsync(i,t,o,r))return!0}return!1}async isSubpropertyOfAsync(e,t,o){if(e===t)return!0;let r=new Set;return await this.isSubpropertyOfRecursiveAsync(e,t,o,r)}async isSubpropertyOfRecursiveAsync(e,t,o,r){if(r.has(e))return!1;r.add(e);let s=await this.resolveEntityAsync(e,o);if(!s?.entity)return!1;let a=s.entity.subPropertyOf;if(a){let u=b(a);for(let i of u)if(i===t||await this.isSubpropertyOfRecursiveAsync(i,t,o,r))return!0}return!1}};var k=class{resourceResolver;constructor(e){this.resourceResolver=e}async buildFromNameAsync(e,t){return(await this.resourceResolver.resolveEntityAsync(e,t))?.uri??null}buildFromName(e,t,o){if(e.includes(".")){let s=e.split("."),a=s[0],u=s[1],i=this.findPackageNameForAlias(o,a);if(i){for(let c of t.values())if(c.entityName===u&&c.uri.package_===i)return c.uri}return null}let r=t.get(e);return r?r.uri:null}create(e,t,o,r){return new g(e,t,o,r)}findPackageNameForAlias(e,t){if(!e.metadata.imports)return null;for(let[o,r]of Object.entries(e.metadata.imports))for(let s of r)if(s.alias===t||!s.alias&&s.packageName===t)return s.packageName;return null}};var v=class n{static KNOWN_XSD_DATATYPES=new Set(["string","integer","int","boolean","bool","decimal","float","double","date","datetime","time","duration","anyuri","base64binary","hexbinary","long","short","byte","nonnegativeinteger","positiveinteger","negativeinteger","nonpositiveinteger","unsignedint","unsignedlong","unsignedshort","unsignedbyte"]);resourceResolver;constructor(e){this.resourceResolver=e}isXsdDatatype(e){return e?e.publisher==="kanonak.org"&&e.package_==="core.xsd"&&n.KNOWN_XSD_DATATYPES.has(e.name.toLowerCase()):!1}isLiteralType(e){return e?e.publisher==="kanonak.org"&&e.package_==="core.rdf"&&e.name==="Literal":!1}isKnownXsdDatatypeName(e){let t=e.includes(".")?e.split(".")[1]:e;return n.KNOWN_XSD_DATATYPES.has(t.toLowerCase())}async isClassTypeAsync(e,t){if(this.isKnownXsdDatatypeName(e))return!1;let o=await this.resourceResolver.resolveEntityAsync(e,t);if(o){let r=o.entity.type;if(r){let s=String(r);return s==="Class"||s==="rdfs.Class"||s.endsWith(".Class")}}return!0}getPropertyTypeClassification(e){if(!e||e.trim().length===0)return"Property";switch(e.includes(".")?e.split(".")[1]:e){case"DatatypeProperty":return"DatatypeProperty";case"ObjectProperty":return"ObjectProperty";case"AnnotationProperty":return"AnnotationProperty";case"Property":return"Property";default:return"Property"}}isEffectiveDatatypeProperty(e,t){return!!(e==="DatatypeProperty"||e==="Property"&&this.isXsdDatatype(t)||e==="Property"&&this.isLiteralType(t))}isEffectiveObjectProperty(e,t){return!!(e==="ObjectProperty"||e==="Property"&&t&&!this.isXsdDatatype(t)&&!this.isLiteralType(t))}};async function S(n,e){let t=[],o=await n.getAllDocumentsAsync();for(let r of o){let s=r.metadata.namespace_;if(!s)continue;let a=s.publisher,u=s.package_,i=s.version?`${s.version.major}.${s.version.minor}.${s.version.patch}`:"0.0.0";for(let[c,p]of Object.entries(r.body)){if(!p||typeof p!="object")continue;let l=p.type;!l||typeof l!="string"||l!=="Package"&&K(l,e)&&t.push({entityName:c,entity:p,documentNamespace:`${a}/${u}@${i}`,publisher:a,package_:u,version:i})}}return t}function K(n,e){let t=w(n),o=w(e);return t===o}function w(n){let e=n.lastIndexOf(".");if(e!==-1)return n.substring(e+1);let t=n.lastIndexOf("/");return t!==-1?n.substring(t+1):n}function f(n,e){return n.major!==e.major?n.major-e.major:n.minor!==e.minor?n.minor-e.minor:n.patch-e.patch}function V(n,e){return n.major===e.major&&n.minor===e.minor&&n.patch===e.patch}function A(n){return`${n.major}.${n.minor}.${n.patch}`}function D(n,e,t){let o=`${n}.${e}.${t}`;return{major:n,minor:e,patch:t,toString:()=>o,equals:r=>r?.major===n&&r?.minor===e&&r?.patch===t,getHashCode:()=>n<<20|e<<10|t,compareTo:r=>n!==r.major?n-r.major:e!==r.minor?e-r.minor:t-r.patch}}function I(n){let e=/^(\d+)\.(\d+)\.(\d+)$/.exec(n);return e?D(Number(e[1]),Number(e[2]),Number(e[3])):null}function E(n,e){return f(n,e)>=0&&n.major===e.major&&n.minor===e.minor}function _(n,e){return e.major===0?f(n,e)>=0&&n.major===0&&n.minor===e.minor:f(n,e)>=0&&n.major===e.major}function j(n,e={}){let{requestedVersion:t}=e;if(n.length===0)return{chosen:null,alternatives:[],multipleVersionsPresent:!1,exactRequestedVersionMissing:!!t};if(t){let r=n.find(s=>{let a=s.metadata.namespace_?.version;return!!a&&A(a)===t});return r?{chosen:r,alternatives:n.filter(s=>s!==r),multipleVersionsPresent:n.length>1,exactRequestedVersionMissing:!1}:{chosen:null,alternatives:n,multipleVersionsPresent:n.length>1,exactRequestedVersionMissing:!0}}if(n.length===1)return{chosen:n[0],alternatives:[],multipleVersionsPresent:!1,exactRequestedVersionMissing:!1};let o=[...n].sort((r,s)=>{let a=r.metadata.namespace_?.version,u=s.metadata.namespace_?.version;return!a&&!u?0:a?u?f(u,a):-1:1});return{chosen:o[0],alternatives:o.slice(1),multipleVersionsPresent:!0,exactRequestedVersionMissing:!1}}export{g as KanonakUri,k as KanonakUriBuilder,R as ResourceResolver,v as TypeResolver,f as compareVersions,D as createVersion,S as findInstancesByType,A as formatVersion,E as isCompatibleVersion,_ as isMajorCompatible,I as parseVersionString,j as pickHighestDocument,V as versionsEqual};
1
+ var g=class t{constructor(e,r,n,s){this.publisher=e;this.package_=r;this.name=n;this.version=s}publisher;package_;name;version;static parse(e){if(!e||e.trim().length===0)throw new Error("Kanonak URI string cannot be null or empty");let r=e.split("/");if(r.length!==3)throw new Error(`Invalid Kanonak URI: ${e}. Expected format: publisher/package[@version]/name`);let[n,s,o]=r;if(!n||!s||!o)throw new Error(`Invalid Kanonak URI: ${e}. Expected format: publisher/package[@version]/name`);let a=s.indexOf("@");if(a===-1)return new t(n,s,o,void 0);let c=s.substring(0,a),i=s.substring(a+1);if(!c||!i)throw new Error(`Invalid Kanonak URI: ${e}. Expected format: publisher/package[@version]/name`);let u=i.split(".").map(Number),p=D(u[0]||0,u[1]||0,u[2]||0);return new t(n,c,o,p)}toString(){return this.version?`${this.publisher}/${this.package_}@${this.version.major}.${this.version.minor}.${this.version.patch}/${this.name}`:`${this.publisher}/${this.package_}/${this.name}`}};function D(t,e,r){return{major:t,minor:e,patch:r,toString:()=>`${t}.${e}.${r}`,equals:n=>!n||typeof n!="object"?!1:n.major===t&&n.minor===e&&n.patch===r,getHashCode:()=>t<<20|e<<10|r,compareTo:n=>t!==n.major?t-n.major:e!==n.minor?e-n.minor:r-n.patch}}function b(t){if(Array.isArray(t))return t.map(r=>r?.toString()??"").filter(r=>r.length>0);let e=t?.toString();return e?[e]:[]}var k=class{cache=new Map;repository;logger;constructor(e,r){this.repository=e,this.logger=r}async resolveEntityAsync(e,r){let n=r.metadata?.namespace_?.toString()??"unknown",s=this.cache.get(n);if(s){let a=s.get(e);if(a)return a}let o=await this.buildEntityIndexAsyncInternal(r,new Set,"");return this.cache.set(n,o),o.get(e)??null}async resolveAllEntitiesAsync(e,r){let n=await this.buildAllEntitiesIndexAsync(r,new Set,"");if(e.includes(".")){let s=e.split("."),o=s[0],a=s[1],c=await this.findDocumentForAlias(r,o);return c?await this.resolveAllEntitiesAsync(a,c):[]}return n.filter(s=>s.entityName===e)}async buildAllEntitiesIndexAsync(e,r,n){let s=[],o=e.metadata?.namespace_?.toString()??"unknown";if(this.logger?.debug?.(`Building ALL entities index for namespace: ${o}`),r.has(o))return this.logger?.debug?.(`Skipping ${o} - already visited (circular import prevention)`),s;r.add(o);let a=n.length===0?o:`${n} \u2192 ${o}`;for(let[c,i]of Object.entries(e.body))if(i&&typeof i=="object"&&!Array.isArray(i)){let u=e.metadata.namespace_?.version??{major:1,minor:0,patch:0,toString:()=>"1.0.0",equals:()=>!1,getHashCode:()=>0,compareTo:()=>0};s.push({entityName:c,uri:new g(e.metadata.namespace_.publisher,e.metadata.namespace_.package_,c,u),entity:i,definedInNamespace:o,isImported:n.length>0,importPath:a})}if(this.logger?.debug?.(`Collected ${s.length} entities from ${o}`),e.metadata?.imports){let c=Object.values(e.metadata.imports).reduce((i,u)=>i+u.length,0);this.logger?.debug?.(`Processing ${c} import(s) for ${o}`);for(let[i,u]of Object.entries(e.metadata.imports))for(let p of u)try{this.logger?.debug?.(`Resolving import: ${i}/${p.packageName}`);let l=await this.repository.getHighestCompatibleVersionAsync(i,p);if(l){this.logger?.debug?.(`Successfully loaded import: ${l.metadata?.namespace_?.toString()}`);let m=await this.buildAllEntitiesIndexAsync(l,r,a);s.push(...m),this.logger?.debug?.(`Added ${m.length} entities from import ${l.metadata?.namespace_?.toString()}`)}else this.logger?.warn?.(`Failed to load import: ${i}/${p.packageName}`)}catch(l){let m=l;throw this.logger?.error?.(`Failed to process import ${i}/${p.packageName} for namespace ${o}. Error: ${m.message}`,m),new Error(`Failed to process import ${i}/${p.packageName} for namespace ${o}. See inner exception for details.`,{cause:l})}}return s}async buildEntityIndexAsync(e){return await this.buildEntityIndexAsyncInternal(e,new Set,"")}async buildEntityIndexAsyncInternal(e,r,n){let s=new Map,o=e.metadata?.namespace_?.toString()??"unknown";if(this.logger?.debug?.(`Building entity index for namespace: ${o}`),r.has(o))return this.logger?.debug?.(`Skipping ${o} - already visited (circular import prevention)`),s;r.add(o);let a=n.length===0?o:`${n} \u2192 ${o}`,c=0;for(let[i,u]of Object.entries(e.body))if(u&&typeof u=="object"&&!Array.isArray(u)&&!s.has(i)){let p=e.metadata.namespace_?.version??{major:1,minor:0,patch:0,toString:()=>"1.0.0",equals:()=>!1,getHashCode:()=>0,compareTo:()=>0};s.set(i,{entityName:i,uri:new g(e.metadata.namespace_.publisher,e.metadata.namespace_.package_,i,p),entity:u,definedInNamespace:o,isImported:n.length>0,importPath:a}),c++}if(this.logger?.debug?.(`Indexed ${c} entities from ${o}`),e.metadata?.imports){let i=Object.values(e.metadata.imports).reduce((u,p)=>u+p.length,0);this.logger?.debug?.(`Processing ${i} import(s) for ${o}`);for(let[u,p]of Object.entries(e.metadata.imports))for(let l of p)try{this.logger?.debug?.(`Resolving import: ${u}/${l.packageName}`);let m=await this.repository.getHighestCompatibleVersionAsync(u,l);if(m){this.logger?.debug?.(`Successfully loaded import: ${m.metadata?.namespace_?.toString()}`);let d=await this.buildEntityIndexAsyncInternal(m,r,a),h=0;for(let[y,$]of d.entries())if(s.has(y)||(s.set(y,$),h++),l.alias&&!y.includes(".")){let x=`${l.alias}.${y}`;s.has(x)||(s.set(x,$),h++)}this.logger?.debug?.(`Merged ${h} entities from import ${m.metadata?.namespace_?.toString()}`)}else this.logger?.warn?.(`Failed to load import: ${u}/${l.packageName}`)}catch(m){let d=m;throw this.logger?.error?.(`Failed to process import ${u}/${l.packageName} for namespace ${o}. Error: ${d.message}`,d),new Error(`Failed to process import ${u}/${l.packageName} for namespace ${o}. See inner exception for details.`,{cause:m})}}return s}async findDocumentForAlias(e,r){if(!e.metadata?.imports)return null;for(let[n,s]of Object.entries(e.metadata.imports))for(let o of s){if(o.alias===r)return await this.repository.getHighestCompatibleVersionAsync(n,o);if(!o.alias&&o.packageName===r)return await this.repository.getHighestCompatibleVersionAsync(n,o)}return null}clearCache(){this.cache.clear()}clearCacheForDocument(e){this.cache.delete(e)}async isSubclassOfAsync(e,r,n){if(e===r)return!0;let s=new Set;return await this.isSubclassOfRecursiveAsync(e,r,n,s)}async isSubclassOfRecursiveAsync(e,r,n,s){if(s.has(e))return!1;s.add(e);let o=await this.resolveEntityAsync(e,n);if(!o?.entity)return!1;let a=o.entity.subClassOf;if(a){let c=b(a);for(let i of c)if(i===r||await this.isSubclassOfRecursiveAsync(i,r,n,s))return!0}return!1}async isSubpropertyOfAsync(e,r,n){if(e===r)return!0;let s=new Set;return await this.isSubpropertyOfRecursiveAsync(e,r,n,s)}async isSubpropertyOfRecursiveAsync(e,r,n,s){if(s.has(e))return!1;s.add(e);let o=await this.resolveEntityAsync(e,n);if(!o?.entity)return!1;let a=o.entity.subPropertyOf;if(a){let c=b(a);for(let i of c)if(i===r||await this.isSubpropertyOfRecursiveAsync(i,r,n,s))return!0}return!1}};var v=class{resourceResolver;constructor(e){this.resourceResolver=e}async buildFromNameAsync(e,r){return(await this.resourceResolver.resolveEntityAsync(e,r))?.uri??null}buildFromName(e,r,n){if(e.includes(".")){let o=e.split("."),a=o[0],c=o[1],i=this.findPackageNameForAlias(n,a);if(i){for(let u of r.values())if(u.entityName===c&&u.uri.package_===i)return u.uri}return null}let s=r.get(e);return s?s.uri:null}create(e,r,n,s){return new g(e,r,n,s)}findPackageNameForAlias(e,r){if(!e.metadata.imports)return null;for(let[n,s]of Object.entries(e.metadata.imports))for(let o of s)if(o.alias===r||!o.alias&&o.packageName===r)return o.packageName;return null}};function V(t){if(!t||t.trim().length===0)throw new Error("Kanonak address string cannot be null or empty");let e=t.trim(),r=e.split("/");if(r.length===1){let n=r[0];if(!n)throw new Error(`Invalid Kanonak address: "${t}". Expected publisher, publisher/package[@version], or publisher/package[@version]/name.`);if(n.includes("@"))throw new Error(`Invalid Kanonak address: "${t}". A bare publisher cannot carry an @version qualifier \u2014 versions belong to packages.`);return{kind:"publisher",publisher:n}}if(r.length===2){let[n,s]=r;if(!n||!s)throw new Error(`Invalid Kanonak address: "${t}". Expected publisher/package[@version].`);let o=s.indexOf("@");if(o===-1)return{kind:"package",publisher:n,package_:s};let a=s.substring(0,o),c=s.substring(o+1);if(!a||!c)throw new Error(`Invalid Kanonak address: "${t}". Expected publisher/package[@version].`);let i=S(c);return{kind:"package",publisher:n,package_:a,version:i}}return{kind:"resource",uri:g.parse(e)}}function P(t){switch(t.kind){case"publisher":return t.publisher;case"package":return t.version?`${t.publisher}/${t.package_}@${t.version.major}.${t.version.minor}.${t.version.patch}`:`${t.publisher}/${t.package_}`;case"resource":return t.uri.toString()}}function S(t){let e=t.split(".").map(Number);return I(e[0]||0,e[1]||0,e[2]||0)}function I(t,e,r){return{major:t,minor:e,patch:r,toString:()=>`${t}.${e}.${r}`,equals:n=>!n||typeof n!="object"?!1:n.major===t&&n.minor===e&&n.patch===r,getHashCode:()=>t<<20|e<<10|r,compareTo:n=>t!==n.major?t-n.major:e!==n.minor?e-n.minor:r-n.patch}}var R=class t{static KNOWN_XSD_DATATYPES=new Set(["string","integer","int","boolean","bool","decimal","float","double","date","datetime","time","duration","anyuri","base64binary","hexbinary","long","short","byte","nonnegativeinteger","positiveinteger","negativeinteger","nonpositiveinteger","unsignedint","unsignedlong","unsignedshort","unsignedbyte"]);resourceResolver;constructor(e){this.resourceResolver=e}isXsdDatatype(e){return e?e.publisher==="kanonak.org"&&e.package_==="core.xsd"&&t.KNOWN_XSD_DATATYPES.has(e.name.toLowerCase()):!1}isLiteralType(e){return e?e.publisher==="kanonak.org"&&e.package_==="core.rdf"&&e.name==="Literal":!1}isKnownXsdDatatypeName(e){let r=e.includes(".")?e.split(".")[1]:e;return t.KNOWN_XSD_DATATYPES.has(r.toLowerCase())}async isClassTypeAsync(e,r){if(this.isKnownXsdDatatypeName(e))return!1;let n=await this.resourceResolver.resolveEntityAsync(e,r);if(n){let s=n.entity.type;if(s){let o=String(s);return o==="Class"||o==="rdfs.Class"||o.endsWith(".Class")}}return!0}getPropertyTypeClassification(e){if(!e||e.trim().length===0)return"Property";switch(e.includes(".")?e.split(".")[1]:e){case"DatatypeProperty":return"DatatypeProperty";case"ObjectProperty":return"ObjectProperty";case"AnnotationProperty":return"AnnotationProperty";case"Property":return"Property";default:return"Property"}}isEffectiveDatatypeProperty(e,r){return!!(e==="DatatypeProperty"||e==="Property"&&this.isXsdDatatype(r)||e==="Property"&&this.isLiteralType(r))}isEffectiveObjectProperty(e,r){return!!(e==="ObjectProperty"||e==="Property"&&r&&!this.isXsdDatatype(r)&&!this.isLiteralType(r))}};async function E(t,e){let r=[],n=await t.getAllDocumentsAsync();for(let s of n){let o=s.metadata.namespace_;if(!o)continue;let a=o.publisher,c=o.package_,i=o.version?`${o.version.major}.${o.version.minor}.${o.version.patch}`:"0.0.0";for(let[u,p]of Object.entries(s.body)){if(!p||typeof p!="object")continue;let l=p.type;!l||typeof l!="string"||l!=="Package"&&_(l,e)&&r.push({entityName:u,entity:p,documentNamespace:`${a}/${c}@${i}`,publisher:a,package_:c,version:i})}}return r}function _(t,e){let r=w(t),n=w(e);return r===n}function w(t){let e=t.lastIndexOf(".");if(e!==-1)return t.substring(e+1);let r=t.lastIndexOf("/");return r!==-1?t.substring(r+1):t}function f(t,e){return t.major!==e.major?t.major-e.major:t.minor!==e.minor?t.minor-e.minor:t.patch-e.patch}function j(t,e){return t.major===e.major&&t.minor===e.minor&&t.patch===e.patch}function A(t){return`${t.major}.${t.minor}.${t.patch}`}function K(t,e,r){let n=`${t}.${e}.${r}`;return{major:t,minor:e,patch:r,toString:()=>n,equals:s=>s?.major===t&&s?.minor===e&&s?.patch===r,getHashCode:()=>t<<20|e<<10|r,compareTo:s=>t!==s.major?t-s.major:e!==s.minor?e-s.minor:r-s.patch}}function O(t){let e=/^(\d+)\.(\d+)\.(\d+)$/.exec(t);return e?K(Number(e[1]),Number(e[2]),Number(e[3])):null}function C(t,e){return f(t,e)>=0&&t.major===e.major&&t.minor===e.minor}function N(t,e){return e.major===0?f(t,e)>=0&&t.major===0&&t.minor===e.minor:f(t,e)>=0&&t.major===e.major}function M(t,e={}){let{requestedVersion:r}=e;if(t.length===0)return{chosen:null,alternatives:[],multipleVersionsPresent:!1,exactRequestedVersionMissing:!!r};if(r){let s=t.find(o=>{let a=o.metadata.namespace_?.version;return!!a&&A(a)===r});return s?{chosen:s,alternatives:t.filter(o=>o!==s),multipleVersionsPresent:t.length>1,exactRequestedVersionMissing:!1}:{chosen:null,alternatives:t,multipleVersionsPresent:t.length>1,exactRequestedVersionMissing:!0}}if(t.length===1)return{chosen:t[0],alternatives:[],multipleVersionsPresent:!1,exactRequestedVersionMissing:!1};let n=[...t].sort((s,o)=>{let a=s.metadata.namespace_?.version,c=o.metadata.namespace_?.version;return!a&&!c?0:a?c?f(c,a):-1:1});return{chosen:n[0],alternatives:n.slice(1),multipleVersionsPresent:!0,exactRequestedVersionMissing:!1}}export{g as KanonakUri,v as KanonakUriBuilder,k as ResourceResolver,R as TypeResolver,f as compareVersions,K as createVersion,E as findInstancesByType,P as formatKanonakAddress,A as formatVersion,C as isCompatibleVersion,N as isMajorCompatible,V as parseKanonakAddress,O as parseVersionString,M as pickHighestDocument,j as versionsEqual};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanonak-protocol/sdk",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "Kanonak Protocol SDK - Document repository and parsing implementations for TypeScript",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -105,7 +105,7 @@
105
105
  "yaml-parser"
106
106
  ],
107
107
  "dependencies": {
108
- "@kanonak-protocol/types": "^2.3.0",
108
+ "@kanonak-protocol/types": "^2.4.0",
109
109
  "ignore": "^7.0.5",
110
110
  "js-yaml": "^4.1.0",
111
111
  "yaml": "^2.7.0"