prez-lib 4.0.3 → 4.0.4

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 @@
1
+ {"version":3,"file":"prez-lib.js","sources":["../src/factory.ts","../src/consts.ts","../src/helpers.ts","../src/store.ts","../src/service.ts"],"sourcesContent":["import type { PrezNode, PrezLiteral, PrezBlankNode, PrezTerm } from \"./types\";\n\n// custom type guard\nexport function isTypePrezTerm(obj: any): obj is PrezTerm {\n return obj.value !== undefined;\n}\n\nexport function node(objOrValue: Omit<PrezNode, \"termType\" | \"equals\"> | string): PrezNode {\n const n: PrezNode = {\n value: typeof objOrValue === \"string\" ? objOrValue : objOrValue.value,\n termType: \"NamedNode\",\n equals: (other: PrezTerm | null | undefined) => {\n return !!other && n.termType === other.termType && n.value === other.value;\n }\n };\n\n if (typeof objOrValue !== \"string\") {\n Object.assign(n, objOrValue);\n }\n\n return n;\n}\n\n\nexport function literal(objOrValue: Omit<PrezLiteral, \"termType\" | \"equals\"> | string): PrezLiteral {\n const l: PrezLiteral = {\n value: typeof objOrValue === \"string\" ? objOrValue : objOrValue.value,\n termType: \"Literal\",\n equals: (other: PrezTerm | null | undefined) => {\n if (!!other && l.termType === other.termType && l.value === other.value) {\n if (l.language !== other.language) {\n return false;\n } else if (l.datatype !== other.datatype) {\n return false;\n } else return true;\n } else return false;\n }\n };\n\n if (typeof objOrValue !== \"string\") {\n Object.assign(l, objOrValue);\n }\n\n return l;\n}\n\n\nexport function bnode(objOrValue: Omit<PrezBlankNode, \"termType\" | \"equals\"> | string): PrezBlankNode {\n const b: PrezBlankNode = {\n value: typeof objOrValue === \"string\" ? objOrValue : objOrValue.value,\n properties: {},\n termType: \"BlankNode\",\n equals: (other: PrezTerm | null | undefined) => {\n return !!other && b.termType === other.termType && b.value === other.value && b.properties === other.properties;\n }\n };\n\n if (typeof objOrValue !== \"string\") {\n Object.assign(b, objOrValue);\n }\n\n return b;\n}\n","import type { PrezPrefixes } from \"./types\";\n\n// only add RDF prefix to handle a\nexport const DEFAULT_PREFIXES: PrezPrefixes = {\n \"rdf\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" \n};\n\n/*\n \"altr-ext\": \"http://www.w3.org/ns/dx/conneg/altr-ext#\",\n \"dcat\": \"http://www.w3.org/ns/dcat#\",\n \"dcterms\": \"http://purl.org/dc/terms/\",\n \"geo\": \"http://www.opengis.net/ont/geosparql#\",\n \"owl\": \"http://www.w3.org/2002/07/owl#\",\n \"prez\": \"https://prez.dev/\",\n \"prof\": \"http://www.w3.org/ns/dx/prof/\",\n \"prov\": \"http://www.w3.org/ns/prov#\",\n \"rdf\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n \"rdfs\": \"http://www.w3.org/2000/01/rdf-schema#\",\n \"reg\": \"http://purl.org/linked-data/registry#\",\n \"sdo\": \"https://schema.org/\",\n \"sh\": \"http://www.w3.org/ns/shacl#\",\n \"skos\": \"http://www.w3.org/2004/02/skos/core#\",\n \"xsd\": \"http://www.w3.org/2001/XMLSchema#\", \n};*/\n\nexport const PREZ_PREDICATES = {\n namespace: \"https://prez.dev/\",\n label: \"https://prez.dev/label\",\n description: \"https://prez.dev/description\",\n provenance: \"https://prez.dev/provenance\",\n focusNode: \"https://prez.dev/FocusNode\",\n link: \"https://prez.dev/link\",\n members: \"https://prez.dev/members\",\n identifier: \"https://prez.dev/identifier\",\n count: \"https://prez.dev/count\",\n searchResult: \"https://prez.dev/SearchResult\",\n searchResultWeight: \"https://prez.dev/searchResultWeight\",\n searchResultPredicate: \"https://prez.dev/searchResultPredicate\",\n searchResultURI: \"https://prez.dev/searchResultURI\",\n searchResultMatch: \"https://prez.dev/searchResultMatch\",\n hasChildren: \"https://prez.dev/hasChildren\"\n};\n\nexport const SYSTEM_PREDICATES = {\n skosConceptScheme: \"http://www.w3.org/2004/02/skos/core#ConceptScheme\",\n skosConcept: \"http://www.w3.org/2004/02/skos/core#Concept\",\n a: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\",\n rdfLangString: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#langString\",\n xmlString: \"http://www.w3.org/2001/XMLSchema#string\",\n w3Html: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#HTML\",\n w3Markdown: \"https://www.w3.org/ns/iana/media-types/text/markdown\",\n shaclAllPredicates: \"http://example.com/shacl-extension#allPredicateValues\",\n shaclProperty: \"http://www.w3.org/ns/shacl#property\",\n shaclPath: \"http://www.w3.org/ns/shacl#path\",\n shaclUnion: \"http://www.w3.org/ns/shacl#union\"\n};\n\n\nexport const ANNOTATION_PREDICATES = {\n label: [\n // \"http://www.w3.org/2000/01/rdf-schema#label\",\n // \"http://purl.org/dc/terms/title\",\n // \"http://www.w3.org/2004/02/skos/core#prefLabel\",\n // \"https://schema.org/name\",\n \"https://prez.dev/label\"\n ],\n description: [\n // \"http://purl.org/dc/terms/description\",\n // \"http://www.w3.org/2004/02/skos/core#definition\",\n // \"https://schema.org/description\",\n \"https://prez.dev/description\"\n ],\n provenance: [\n // \"http://purl.org/dc/terms/provenance\",\n \"https://prez.dev/provenance\"\n ]\n};\n","import type { PrezPrefixes, PrezConceptNode, PrezFocusNode } from \"./types\";\nimport { DEFAULT_PREFIXES, SYSTEM_PREDICATES } from \"./consts\";\n\n/**\n * Interprets a predicate curie into its full IRI\n * \n * Uses the default list of prefixes by default\n * \n * @param s \n * @param prefixes \n * @returns Predicate IRI string\n */\nexport function defaultToIri(s: string, prefixes: PrezPrefixes = DEFAULT_PREFIXES): string {\n if (s === \"a\") { // special handling for \"a\" as rdf:type\n return prefixes.rdf + \"type\";\n } else {\n const [prefix, pred] = s.split(\":\");\n if (!prefix) {\n return s;\n }\n return [prefix] + pred!;\n }\n}\n\n/**\n * Creates a curie from an IRI\n * \n * Uses the default list of prefixes by default\n * \n * @param iri \n * @param prefixes \n * @returns curie string\n */\nexport function defaultFromIri(iri: string, prefixes: PrezPrefixes = DEFAULT_PREFIXES): string {\n let curie = \"\";\n Object.entries(prefixes).forEach(([prefix, prefixIri]) => {\n if (iri.startsWith(prefixIri)) {\n curie = prefix + \":\" + iri.split(prefixIri)[1];\n }\n });\n return curie;\n}\n\n/**\n * Get the base URL from a URL, protocol & host\n * \n * @param existingUrl existing URL to determine the base from\n * @returns \n */\nexport const getBaseUrl = (existingUrl:string) => {\n const url = new URL(existingUrl);\n return `${url.protocol}//${url.hostname}`;\n}\n\n/**\n * Get the URL path (minus the protocol & host) from a full URL\n * \n * \n * @param existingUrl existing URL to determine the base from\n * @returns \n */\nexport const getUrlPath = (existingUrl:string) => {\n const url = new URL(existingUrl);\n return url.pathname;\n}\n\n/**\n * Get the narrowers URL for a hierarchy based on an a concept and existing URL context\n * \n * @param concept\n * @param existingUrl \n * @returns \n */\nexport const getNarrowersUrl = (baseUrl:string, concept:PrezConceptNode) => {\n const id = concept.identifiers?.find(identifier=>identifier.value)?.value;\n return id ? baseUrl + `/concept-hierarchy/${id}/narrowers` : '';\n}\n\n/**\n * Get the top concepts for a given focus node\n * \n * @param item \n * @param existingOrBaseUrl to use for prefixing\n * @returns \n */\nexport const getTopConceptsUrl = (item:PrezFocusNode, existingOrBaseUrl?:string) => {\n const baseUrl = existingOrBaseUrl ? getBaseUrl(existingOrBaseUrl) : '';\n const identifiers = item.identifiers?.find(identifier=>identifier.value);\n const id = identifiers ? identifiers.value : '';\n const url = id ? baseUrl + `/concept-hierarchy/${id}/top-concepts` : '';\n return url;\n}\n\ntype PathElement = { \"@id\"?: string; \"@list\"?: PathElement[] };\n\n/**\n * Process a SHACL path to get the full list of predicates\n * \n * @param path \n * @returns \n */\nexport const processShaclPath = (path: PathElement[]): string[] => {\n return path.flatMap((e) => {\n if (e[\"@id\"]) {\n return e[\"@id\"];\n }\n\n if (e[\"@list\"] && e[\"@list\"].length > 0) {\n const firstElement = e[\"@list\"][0];\n // Check if the first element indicates a shacl union\n if (firstElement?.[\"@id\"] === SYSTEM_PREDICATES.shaclUnion) {\n // Recursively process only the union elements\n return processShaclPath(e[\"@list\"][1]?.[\"@list\"] || []).filter(Boolean);\n } else {\n // Process non-union lists as normal\n return processShaclPath(e[\"@list\"]).flat();\n }\n }\n\n return [];\n }).filter((item): item is string => Boolean(item));\n}\n/**\n * Build a profile object from a list of profiles\n * \n * @param data - list of profiles in json-ld format\n * @returns \n */\nexport const buildProfiles = (data: any[]): Record<string, string[]> => {\n return data.reduce((acc, profile) => {\n // get the SHACL path for each profile\n if (SYSTEM_PREDICATES.shaclProperty in profile) {\n // get the SHACL path for each property\n for (const props of profile[SYSTEM_PREDICATES.shaclProperty]) {\n // find the profile in the data\n const lookup = data.find((p: any) => p['@id'] === props['@id']);\n if (lookup && SYSTEM_PREDICATES.shaclPath in lookup) {\n acc[profile['@id']] = processShaclPath(lookup[SYSTEM_PREDICATES.shaclPath])\n // filter #allPredicates, as it is a special case that is a placeholder to indicate all predicates, which is the same as an empty array\n .filter(prop=>prop !== SYSTEM_PREDICATES.shaclAllPredicates);\n }\n }\n }\n return acc;\n }, {} as Record<string, string[]>);\n}\n\n/** this function is used to construct a simple object to show profile info in the debug panel */\nexport function simplifyNodeArray(input: any): any {\n if (Array.isArray(input)) {\n // Handle arrays recursively and merge objects\n return input.reduce((acc, item) => {\n const result = simplifyNodeArray(item);\n if (typeof result === 'object' && !Array.isArray(result)) {\n Object.assign(acc, result); // Merge objects instead of creating arrays of objects\n }\n return acc;\n }, {});\n } else if (typeof input === 'object' && input !== null) {\n // Check for 'value' property and return it\n if (input.hasOwnProperty('value')) {\n return input.value;\n } else if (input.hasOwnProperty('node') && input.hasOwnProperty('list')) {\n // Custom logic for converting 'node' and 'list' structure\n const result: any = {};\n result[input.node.value] = input.list.length > 0 ? simplifyNodeArray(input.list) : \"\";\n return result;\n } else {\n // Recursively handle other objects\n const result: any = {};\n for (const key in input) {\n result[key] = simplifyNodeArray(input[key]);\n }\n return result;\n }\n }\n return input; // Return item as-is if it's neither array nor object\n}\n\n/* turn a node array into a tree object, for the debug panel */\nexport function nodeArrayToTree(obj:any, prefix = '') {\n let tree = '';\n const entries = Object.entries(obj);\n const totalEntries = entries.length;\n \n entries.forEach(([key, value], index) => {\n // Remove http(s):// and www.\n const formattedKey = key.replace(/https?:\\/\\/(www\\.)?/, '');\n const [domainAndPath, fragment] = formattedKey.split('#');\n const pathParts = domainAndPath!.split('/');\n const lastPathPart = pathParts[pathParts.length - 1];\n const displayKey = fragment \n ? `(${pathParts[0]})/${lastPathPart}#${fragment}` \n : `(${pathParts[0]})/${lastPathPart}`;\n \n const isLast = index === totalEntries - 1;\n const branch = isLast ? '└── ' : '├── ';\n tree += `${prefix}${branch}${displayKey}\\n`;\n \n // If the value is an object, recurse into it\n if (typeof value === 'object' && value !== null) {\n const newPrefix = isLast ? ' ' : '│ ';\n tree+= nodeArrayToTree(value, prefix + newPrefix);\n }\n });\n \n return tree;\n}\n\n/** this function is used to dump a profile node array into a simple string tree */\nexport function dumpNodeArray(obj:any) {\n return obj ? nodeArrayToTree(simplifyNodeArray(obj)) : '';\n}\n","import { Store, Parser, DataFactory, type Quad_Object, type Quad_Subject, type Term, type Quad } from \"n3\";\nimport type { PrezLiteral, PrezNode, PrezTerm, PrezProperties, PrezSearchResult, PrezFocusNode, PrezLink, PrezConceptSchemeNode, PrezConceptNode, PrezLinkParent, PrezNodeList } from \"./types\";\nimport { DEFAULT_PREFIXES, PREZ_PREDICATES, SYSTEM_PREDICATES } from \"./consts\";\nimport { defaultToIri, defaultFromIri } from \"./helpers\";\nimport { node, literal, bnode } from \"./factory\";\nimport * as RDF from \"@rdfjs/types\";\n\nconst { namedNode } = DataFactory;\n\n/**\n * An in-memory N3.js store containing convenience functions\n */\nexport class RDFStore {\n public store: Store; // N3\n private parser: Parser; // N3\n public prefixes: { [namespace: string]: string };\n private basePath: string;\n // @ts-ignore - incorrectly warns unused\n private baseUrl: string;\n private linkedLists: Record<string, RDF.Term[]>;\n private lists: Record<string, PrezNodeList[]>;\n\n constructor() {\n this.store = new Store();\n this.baseUrl = '';\n this.basePath = '';\n this.parser = new Parser();\n this.prefixes = DEFAULT_PREFIXES;\n this.linkedLists = {};\n this.lists = {};\n }\n\n /**\n * Parses an RDF string in Turtle format into a store\n * \n * @param s RDF Turtle string\n */\n public load(s: string) {\n s = \"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\\n\" + s; // temp fix for missing rdf: prefix from API\n const p = this.parser.parse(s, null, (prefixName, prefixNode) => {\n // callback for each prefix parsed --> no longer using default prefixes\n // if (!Object.values(DEFAULT_PREFIXES).includes(prefixNode.value)) {\n // }\n this.prefixes[prefixName] = prefixNode.value;\n });\n this.store.addQuads(p);\n this.linkedLists = this.store.extractLists();\n this.buildLists();\n }\n\n /** build the top level node array from a linked list */\n public buildLists() {\n this.lists = {}; // Reset processed lists\n const rawLinkedLists = this.linkedLists; // Keep reference if needed for debugging\n\n // Find blank nodes that are objects of sh:path\n this.store.getQuads(null, SYSTEM_PREDICATES.shaclPath, null, null).forEach(pathQuad => {\n const pathObject = pathQuad.object; // This should be the blank node containing sh:union\n\n if (pathObject.termType === 'BlankNode') {\n // Get properties of this blank node (?bnode sh:union ?listHead)\n const unionQuads = this.store.getQuads(pathObject, SYSTEM_PREDICATES.shaclUnion, null, null);\n\n if (unionQuads.length > 0) {\n const listHead = unionQuads[0]!.object; // The object of sh:union should be the list head\n\n // Check if this list head exists in our extracted lists\n if (listHead.termType === 'BlankNode' && listHead.value in rawLinkedLists) {\n const listItems = rawLinkedLists[listHead.value]!;\n // Process the list items using buildSubList\n // We need a key for this.lists. Using the pathQuad subject or the pathObject BNode ID seems reasonable.\n // Let's use the pathObject BNode ID as it directly relates to the path structure.\n const listKey = pathObject.value;\n this.lists[listKey] = this.buildSubList(listItems);\n } else {\n console.warn(`[buildLists] Found sh:union for ${pathObject.value}, but its object ${listHead.value} is not a valid list head in linkedLists.`);\n }\n }\n }\n });\n }\n\n /** build sub linked lists */\n private buildSubList(list: RDF.Term[]): PrezNodeList[] {\n const items:PrezNodeList[] = [];\n for(const n of list) {\n if(n.termType == \"BlankNode\") {\n const lid = n.value;\n // Check if this blank node is the head of another list\n if(lid in this.linkedLists) { // Use the originally extracted lists here\n const subList = this.buildSubList(this.linkedLists[lid]!); // Recursive call\n // Merging logic\n if(subList.length > 1) {\n const existingList = items.find(i => i.node.value == subList[0]!.node.value);\n if(existingList) {\n (existingList.list ??= []).push(...subList.slice(1));\n } else {\n items.push({node: subList[0]!.node, list: subList.slice(1)});\n }\n } else {\n items.push(...subList);\n }\n }\n } else if(n.termType == 'NamedNode') {\n // Skip the sh:union predicate itself if it appears *in* the list\n if(n.value != SYSTEM_PREDICATES.shaclUnion) {\n const nn = this.toPrezTerm(n as Term) as PrezNode; // Use 'n' directly\n items.push({node: nn, list: []}); // Assume empty list unless proven otherwise\n }\n }\n }\n return items;\n }\n\n /**\n * getParents uses the base path to remove the base path from the parent URL (for breadcrumbs)\n * \n * @param url\n */\n public setBaseUrl(url: string) {\n this.baseUrl = url;\n this.basePath = new URL(url).pathname;\n }\n\n /**\n * Interprets a predicate curie into its full IRI\n * \n * Note: must be called after `load()`\n * \n * @param s curie string\n * @returns Predicate IRI string\n */\n public toIri(s: string): string {\n return defaultToIri(s, this.prefixes);\n }\n\n /**\n * Generates a curie from a IRI\n * \n * Note: must be called after `load()`\n * \n * @param iri the IRI string\n * @returns Generated curie\n */\n public fromIri(iri: string): string {\n return defaultFromIri(iri, this.prefixes);\n }\n\n // private traverseRdfList() { }\n\n // public getRdfList() { }\n\n private getObjectLiteral(iri: string, predicate: string): PrezLiteral | undefined {\n return this.getObjects(iri, predicate).map(o => this.toPrezTerm(o) as PrezLiteral)[0] || undefined;\n }\n\n public getProperties(term: Term, options?: {excludePrefix?: string, includePrefix?: string}): PrezProperties {\n const props: PrezProperties = {};\n\n this.store.forEach(q => {\n // apply filter options\n if(options?.excludePrefix && q.predicate.value.startsWith(options.excludePrefix)) return;\n if(options?.includePrefix && !q.predicate.value.startsWith(options.includePrefix)) return;\n\n props[q.predicate.value] ??= {\n predicate: this.toPrezTerm(q.predicate) as PrezNode,\n objects: []\n };\n\n props[q.predicate.value]!.objects.push(this.toPrezTerm(q.object));\n }, term, null, null, null);\n\n if(term.termType === \"BlankNode\") {\n\n }\n\n return props;\n }\n\n public getParents(link: string) {\n // remove the base path from the link, if the prez API has a base path, e.g. /api/v1\n if(link.startsWith(this.basePath)) {\n link = link.substring(this.basePath.length);\n }\n const linkParts = link.split('/');\n const parents:PrezLinkParent[] = [];\n let current = '';\n for(const part of linkParts) {\n if(part == '') continue;\n current+= '/' + part;\n const parent:PrezLinkParent = {url: current, segment: part};\n if(part.includes(':')) {\n const parts = part.split(':');\n const expanded = this.prefixes[parts[0]!];\n if(expanded) {\n const findParent = this.getObjects(expanded + parts[1], PREZ_PREDICATES.label);\n if(findParent.length > 0) {\n parent.label = literal(findParent[0]!.value);\n }\n }\n }\n parents.push(parent);\n }\n return parents;\n }\n\n private toPrezTerm(term: Term): PrezTerm {\n switch (term.termType) {\n case \"NamedNode\":\n const n = node(term.value);\n\n n.label = this.getObjectLiteral(term.value, PREZ_PREDICATES.label);\n n.description = this.getObjectLiteral(term.value, PREZ_PREDICATES.description);\n n.provenance = this.getObjectLiteral(term.value, PREZ_PREDICATES.provenance);\n\n const identifiers = this.getObjects(term.value, PREZ_PREDICATES.identifier);\n if(identifiers.length > 0) {\n n.identifiers = identifiers.map(t => this.toPrezTerm(t));\n }\n\n const links = this.getObjects(term.value, PREZ_PREDICATES.link);\n if (links.length > 0) {\n n.links = links.map(l => {\n return { value: l.value, parents: this.getParents(l.value) }\n });\n }\n\n const members = this.getObjects(term.value, PREZ_PREDICATES.members);\n if (members.length > 0) {\n n.members = { value: members[0]!.value, parents: this.getParents(members[0]!.value) };\n }\n\n // types\n const types = this.getObjects(term.value, SYSTEM_PREDICATES.a);\n if (types.length > 0) {\n n.rdfTypes = types.map(t => this.toPrezTerm(t) as PrezNode)\n }\n\n return n;\n case \"Literal\":\n const l = literal(term.value);\n\n if (term.datatype) {\n l.datatype = this.toPrezTerm(term.datatype) as PrezNode;\n }\n\n if (term.language) {\n l.language = term.language;\n }\n\n return l;\n case \"BlankNode\":\n const b = bnode(term.value);\n\n b.properties = this.getProperties(term);\n\n // see if this blank node is a list\n if(term.value in this.lists) {\n b.list = this.lists[term.value];\n }\n\n return b;\n default:\n throw (\"Invalid n3 Term object\")\n }\n }\n\n /**\n * Creates a PrezFocusNode object\n * \n * @param obj \n * @returns \n */\n private toPrezFocusNode(obj: Quad_Object): PrezFocusNode {\n const focusNode: PrezFocusNode = this.toPrezTerm(obj) as PrezFocusNode;\n focusNode.properties = this.getProperties(obj, { excludePrefix: PREZ_PREDICATES.namespace });\n focusNode.systemProperties = this.getProperties(obj, { includePrefix: PREZ_PREDICATES.namespace });\n if(focusNode.rdfTypes?.map(t => t.value).includes(SYSTEM_PREDICATES.skosConcept)) {\n (focusNode as PrezConceptNode).hasChildren = focusNode.systemProperties?.[PREZ_PREDICATES.hasChildren]?.objects?.[0]?.value == 'true';\n }\n return focusNode;\n }\n\n /**\n * Gets an array of N3 `Quad_Objects` from a `Store` by providing a predicate or an array of predicates\n * \n * @param predicate a string or string array of predicate IRIs\n * @param object the object IRI\n * @returns the array of objects\n */\n public getSubjects(predicate: string, object: string | null): Quad_Subject[] {\n return this.store.getSubjects(predicate, object, null);\n }\n\n /**\n * Gets an array of N3 `Quad_Objects` from a `Store` by providing a predicate or an array of predicates\n * \n * @param subject the subject IRI\n * @param predicate a string or string array of predicate IRIs\n * @returns the array of objects\n */\n public getObjects(subject: string, predicate: string | string[]): Quad_Object[] {\n if (typeof predicate === \"string\") {\n return this.store.getObjects(namedNode(subject), namedNode(predicate), null);\n } else {\n const objs: Quad_Object[] = [];\n predicate.forEach(p => {\n objs.push(...this.store.getObjects(namedNode(subject), namedNode(p), null));\n });\n return objs;\n }\n }\n\n public getMembers(subject: string): PrezLink|undefined {\n const objs = this.getObjects(subject, this.toIri(\"prez:members\"));\n objs.forEach(o => {\n return {\n value: o.value,\n parents: []\n }\n });\n return undefined;\n }\n\n /**\n * Returns the concept hierarchy for a vocab\n * \n * @param vocab \n * @return the concept hierarchy\n */\n public getConcepts(vocab: Quad_Object): PrezConceptNode[] {\n const inScheme = this.getSubjects(this.toIri(\"skos:inScheme\"), vocab.value);\n\n function isInScheme(c: Quad_Object): boolean {\n return inScheme.map(x => x.value).includes(c.value);\n }\n\n const hasTopConcept = this.getObjects(vocab.value, this.toIri(\"skos:hasTopConcept\"));\n const topConceptOf = this.getObjects(vocab.value, this.toIri(\"skos:topConceptOf\"));\n const index: {[iri: string]: Quad_Object[]} = {}; // an index of IRI's & their narrowers\n const topConcepts = [...hasTopConcept, ...topConceptOf].filter(c => isInScheme(c));\n inScheme.forEach(c => {\n index[c.value] = [];\n });\n\n inScheme.forEach(c => {\n const broader = this.getObjects(c.value, this.toIri(\"skos:broader\"));\n broader.forEach(b => {\n if (isInScheme(b)) {\n index[b.value]!.push(c);\n }\n });\n\n const narrower = this.getObjects(c.value, this.toIri(\"skos:narrower\"));\n narrower.forEach(n => {\n if (isInScheme(n)) {\n index[c.value]!.push(n);\n }\n });\n });\n\n const concepts: PrezConceptNode[] = [];\n\n topConcepts.forEach(c => {\n concepts.push(this.createHierarchy(c, index));\n });\n return concepts;\n }\n\n private createHierarchy(c: Quad_Object, index: {[iri: string]: Quad_Object[]}): PrezConceptNode {\n const narrowers = index[c.value]!.map(n => this.createHierarchy(n, index));\n return {\n ...this.toPrezTerm(c) as PrezNode,\n hasChildren: narrowers.length > 0,\n narrowers\n };\n }\n\n /**\n * Gets a one or more subjects based on having a prez FocusNode identifier\n * \n * @param id optional id to match to get one subject\n * @returns one or more subjects\n */\n getByPrezId(): Quad_Subject[];\n getByPrezId(id: string): Quad_Subject;\n public getByPrezId(id?: string): Quad_Subject | Quad_Subject[] {\n const ids: Quad[] = [];\n\n this.store.forEach(q => {\n ids.push(q);\n }, null, null, namedNode('https://prez.dev/FocusNode'), null);\n \n if (id) {\n return ids.find(q => q.object.value === id)!.subject;\n } else {\n return ids.map(q => q.subject);\n }\n }\n\n public getCount(): number {\n const count = this.store.getObjects(null, PREZ_PREDICATES.count, null);\n if (count.length > 0) {\n /** follow up, expected in value without the quotes */\n return Number(count[0]!.value.replace('>', ''));\n } else {\n return 0;\n }\n }\n\n public getMaxReached(): boolean {\n const count = this.store.getObjects(null, PREZ_PREDICATES.count, null);\n if (count.length > 0) {\n /** follow up, expected in value without the quotes */\n return count[0]!.value.includes(\">\");\n } else {\n return false;\n }\n }\n\n /**\n * Returns a list of item objects\n * \n * @returns a list of item objects\n */\n public getList(): PrezFocusNode[] {\n const items: PrezFocusNode[] = [];\n \n // assume only and all list items have dcterms:identifier - can't select by baseClass\n const objs = this.getByPrezId();\n objs.forEach(obj => {\n items.push(this.toPrezFocusNode(obj));\n });\n return items;\n }\n\n /**\n * Returns an item object\n * \n * @param id the id of the object to return\n * @returns the item object\n */\n public getItem(): PrezFocusNode {\n const obj = this.getByPrezId();\n if(obj.length == 0) throw new Error('Unable to find item');\n const item = this.toPrezFocusNode(obj[0]!);\n\n // if conceptscheme\n if (item.rdfTypes?.map(t => t.value).includes(SYSTEM_PREDICATES.skosConcept)) {\n const concepts = this.getConcepts(obj[0]!);\n return {\n ...item,\n topConcepts: {\n narrowers: concepts,\n hasChildren: concepts.length > 0\n }\n } as PrezConceptSchemeNode;\n }\n \n return item;\n }\n\n /**\n * Return nested subitems for a given predicate\n * \n * @param predicate Predicate IRI to lookup\n * @returns \n */\n public getSubItems(predicate:string) {\n const nodes = this.store.getQuads(null, predicate, null, null);\n const subItems:PrezFocusNode[] = [];\n nodes.forEach(subItem => {\n const node = this.toPrezFocusNode(subItem.object);\n if(node) {\n subItems.push(node);\n }\n });\n return subItems;\n }\n\n /**\n * Returns search results\n */\n public search(): PrezSearchResult[] {\n const resultSubjects = this.getSubjects(SYSTEM_PREDICATES.a, PREZ_PREDICATES.searchResult);\n const results: PrezSearchResult[] = resultSubjects.map(s => {\n const result: PrezSearchResult = {\n hash: s.value.split(\"urn:hash:\").slice(-1)[0]!,\n weight: Number(this.getObjects(s.value, PREZ_PREDICATES.searchResultWeight)[0]!.value),\n predicate: this.toPrezTerm(this.getObjects(s.value, PREZ_PREDICATES.searchResultPredicate)[0]!) as PrezNode,\n match: this.toPrezTerm(this.getObjects(s.value, PREZ_PREDICATES.searchResultMatch)[0]!) as PrezLiteral,\n resource: this.toPrezFocusNode(this.getObjects(s.value, PREZ_PREDICATES.searchResultURI)[0]!)\n };\n return result;\n });\n return results;\n }\n};\n","import type { PrezBlankNode, PrezDataItem, PrezDataList, PrezDataSearch, PrezNodeList, PrezProfileHeader, PrezProfiles, PrezProperties, PrezProperty } from \"./types\";\nimport { RDFStore } from \"./store\";\nimport { SYSTEM_PREDICATES } from \"./consts\";\n\ntype LinkObject = {\n uri: string;\n rel: string;\n title: string;\n anchor: string;\n token: string;\n format: string;\n type: string;\n};\n\nclass NetworkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\n/**\n * Generates profiles from link headers\n * \n * @param linkHeader \n * @returns a list of profile objects\n */\nfunction getProfilesFromHeaders(linkHeader: string): PrezProfileHeader[] {\n let profileObj: {[uri: string]: PrezProfileHeader} = {} ;\n \n const links = linkHeader.split(\",\").map(l => {\n const [, uri, attrs] = l.trim().match(/<(.+)>; (.+)/) as [string, string, string];\n const linkObj = { uri } as LinkObject;\n attrs.split(\"; \").forEach(attr => {\n const [, lhs, rhs] = attr.match(/(.+)=[\\\"<](.+)[\\\">]/) as [string, keyof Omit<LinkObject, \"uri\">, string];\n linkObj[lhs] = rhs;\n });\n return linkObj;\n });\n links.filter(l => l.rel === \"type\").forEach(l => {\n profileObj[l.anchor] = {\n default: false,\n current: false,\n token: l.token,\n mediatypes: [],\n title: l.title,\n description: \"\",\n uri: l.anchor\n };\n });\n\n // find current - either use rel=\"self\" or rel=\"profile\"\n const currentProfile = links.find(l => l.rel === \"self\")!;\n if(currentProfile!.format in profileObj) {\n profileObj[currentProfile!.format]!.current = true;\n }\n\n // find default - no way to get default for now - use rel=\"canonical\" according to https://www.w3.org/TR/dx-prof-conneg/#http-listprofiles ?\n // const defaultProfile = links.find(l => l.rel === \"self\")!;\n // profileObj[defaultProfile.profile].default = true;\n\n links.filter(l => l.rel === \"alternate\" && l.format).forEach(l => {\n if (!profileObj[l.format]!.mediatypes.map(m => m.mediatype).includes(l.type)) {\n profileObj[l.format]!.mediatypes.push({ title: \"\", mediatype: l.type, default: false });\n }\n });\n\n return Object.values(profileObj);\n}\n\n/**\n * Does a GET request to a Prez API endpoint\n * \n * @param url \n * @returns \n */\nexport async function apiGet(url: string) {\n const r = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Accept\": \"text/anot+turtle\"\n }\n });\n\n if (!r.ok) {\n throw new NetworkError(`Network error - status code ${r.status}: ${r.statusText}`);\n }\n\n // parse link headers for profiles\n const linkHeaders = r.headers.get(\"link\") || r.headers.get(\"Link\");\n const profiles = linkHeaders ? getProfilesFromHeaders(linkHeaders) : [];\n\n const data = await r.text(); // always get turtle string\n return { data, profiles };\n}\n\n/**\n * Gets a list of item objects from a listing endpoint\n * \n * @param url \n * @returns the list of item objects\n */\nexport async function getList(baseUrl:string, path: string): Promise<PrezDataList> {\n const url = baseUrl + path;\n const pathOnly = new URL(url).pathname;\n const { data, profiles } = await apiGet(url);\n const store = new RDFStore();\n store.setBaseUrl(baseUrl);\n store.load(data);\n return { type: 'list', data: store.getList(), profiles, \n maxReached: store.getMaxReached(), count: store.getCount(), \n parents: store.getParents(pathOnly)\n };\n}\n\n\n/**\n * Gets an item object from an item endpoint, note store is returned in order to allow for additional nested processing calls\n * \n * @param url \n * @param id the prez:identifier of the object to get\n * @returns the item object\n */\nexport async function getItem(baseUrl: string, path: string): Promise<PrezDataItem> {\n const url = baseUrl + path;\n const pathOnly = new URL(url).pathname;\n const { data, profiles } = await apiGet(url);\n const store = new RDFStore();\n store.setBaseUrl(baseUrl);\n store.load(data);\n return { type: 'item', data: store.getItem(), profiles, parents: store.getParents(pathOnly), store };\n}\n\n/**\n * Runs a search query\n * \n * @param baseUrl API base URL\n * @param path Search path along with any query parameters\n * @returns \n */\nexport async function search(baseUrl: string, path: string): Promise<PrezDataSearch> {\n const url = baseUrl + path;\n const pathOnly = new URL(url).pathname\n const { data, profiles } = await apiGet(url);\n const store = new RDFStore();\n store.setBaseUrl(baseUrl);\n store.load(data);\n return { \n type: 'search', data: store.search(), profiles, \n maxReached: store.getMaxReached(), count: store.getCount(), \n parents: store.getParents(pathOnly)\n };\n}\n\n/**\n * Returns a list of Prez Profiles used for rendering\n * \n * @param baseUrl API base URL\n * @returns A list of Prez Profiles\n */\nexport async function getProfiles(baseUrl: string): Promise<PrezProfiles> {\n const path = '/profiles?page=1&limit=999&_mediatype=application/anot%2Bturtle';\n const { data } = await getList(baseUrl, path);\n const profiles: PrezProfiles = {};\n for(const profile of data) {\n profiles[profile.value] = [];\n if(profile.properties && profile.properties?.[SYSTEM_PREDICATES.shaclProperty]?.objects) {\n const objects = profile.properties[SYSTEM_PREDICATES.shaclProperty]!.objects;\n for(const obj of objects) {\n const bn = obj as PrezBlankNode;\n if(bn.properties && bn.properties[SYSTEM_PREDICATES.shaclPath]) {\n for(const obj2 of bn.properties[SYSTEM_PREDICATES.shaclPath]!.objects) {\n const list = (obj2 as PrezBlankNode).list;\n if(list) {\n profiles[profile.value] = list;\n }\n } \n }\n }\n }\n }\n return profiles;\n}\n\nfunction applyProfileToProperties(properties: PrezProperties, profile: PrezNodeList[]): PrezProperties {\n const newProperties: PrezProperties = {};\n const fieldNames = Object.keys(properties);\n \n // re-ordered fields as per the profile, then add the rest of the fields\n const fields =\n [...(profile || []).filter(f => fieldNames.includes(f.node.value)).map(f=>f.node.value), // add fields that are in the list\n ...fieldNames.filter(fname => !(profile || []).find(f=>f.node.value == fname)) // add the rest of the fields that are not in the list\n ].filter(f=>f in (properties || {})).map(f=>properties![f] as PrezProperty);\n\n\n // console.log('DEFAULT FIELD ORDER', fieldNames);\n // console.log('RE-ORDERED FIELD ORDER', fields.map(f=>f.predicate.value));\n\n // console.log(\"USING PROFILE\", profile);\n \n for(const field of fields) {\n const p = profile.find(f=>f.node.value == field.predicate.value && f.list && f.list.length > 0)\n if(p) {\n // console.log(\"SET LIST FOR FIELD\", field.predicate.value, p);\n }\n newProperties[field.predicate.value] = properties[field.predicate.value] as PrezProperty;\n //console.log(\"SET PROP FOR FIELD\", field.predicate.value, newProperties[field.predicate.value]);\n }\n return newProperties;\n}\n\nexport function applyProfileToItem(item: PrezDataItem, profile: PrezNodeList[]):void {\n // console.log(\"APPLY PROPS\", profile, item.data.properties);\n item.data.properties = applyProfileToProperties(item.data.properties || {}, profile);\n\n // // re-order the properties in the profile order\n // item.data.properties = fields.reduce((acc, field) => {\n // acc[field.predicate.value] = field;\n\n // const subItems = item.store.getSubItems(field.predicate.value);\n // if(subItems) {\n // console.log('SUBITEMS', field.predicate, subItems);\n // }\n\n // return acc;\n // } , {} as PrezProperties);\n\n}\n"],"names":["l","node"],"mappings":"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"}