@noeldemartin/solid-utils 0.6.0 → 0.6.1-next.0d15181b9561088547ef2d0f22a04aef565e06bb

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
- {"version":3,"file":"io-wCcrq4b9.js","sources":["../src/errors/MalformedSolidDocumentError.ts","../src/errors/NetworkRequestError.ts","../src/errors/NotFoundError.ts","../src/errors/UnauthorizedError.ts","../src/helpers/vocabs.ts","../src/models/SolidThing.ts","../src/models/SolidStore.ts","../src/models/SolidDocument.ts","../src/helpers/jsonld.ts","../src/helpers/io.ts"],"sourcesContent":["import { JSError } from '@noeldemartin/utils';\n\nfunction errorMessage(\n documentUrl: string | null,\n documentFormat: SolidDocumentFormat,\n malformationDetails: string,\n): string {\n return documentUrl\n ? `Malformed ${documentFormat} document found at ${documentUrl} - ${malformationDetails}`\n : `Malformed ${documentFormat} document - ${malformationDetails}`;\n}\n\nexport enum SolidDocumentFormat {\n Turtle = 'Turtle',\n}\n\nexport default class MalformedSolidDocumentError extends JSError {\n\n public readonly documentUrl: string | null;\n public readonly documentFormat: SolidDocumentFormat;\n public readonly malformationDetails: string;\n\n constructor(documentUrl: string | null, documentFormat: SolidDocumentFormat, malformationDetails: string) {\n super(errorMessage(documentUrl, documentFormat, malformationDetails));\n\n this.documentUrl = documentUrl;\n this.documentFormat = documentFormat;\n this.malformationDetails = malformationDetails;\n }\n\n}\n","import { JSError } from '@noeldemartin/utils';\nimport type { JSErrorOptions } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends JSError {\n\n public readonly url: string;\n\n constructor(url: string, options?: JSErrorOptions) {\n super(`Request failed trying to fetch ${url}`, options);\n\n this.url = url;\n }\n\n}\n","import { JSError } from '@noeldemartin/utils';\n\nexport default class NotFoundError extends JSError {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Document with '${url}' url not found`);\n\n this.url = url;\n }\n\n}\n","import { JSError } from '@noeldemartin/utils';\n\nfunction errorMessage(url: string, responseStatus?: number): string {\n const typeInfo = responseStatus === 403 ? ' (Forbidden)' : '';\n\n return `Unauthorized${typeInfo}: ${url}`;\n}\n\nexport default class UnauthorizedError extends JSError {\n\n public readonly url: string;\n public readonly responseStatus?: number;\n\n constructor(url: string, responseStatus?: number) {\n super(errorMessage(url, responseStatus));\n\n this.url = url;\n this.responseStatus = responseStatus;\n }\n\n public get forbidden(): boolean | undefined {\n return typeof this.responseStatus !== 'undefined' ? this.responseStatus === 403 : undefined;\n }\n\n}\n","export type RDFContext = Record<string, string>;\n\nexport interface ExpandIRIOptions {\n defaultPrefix: string;\n extraContext: RDFContext;\n}\n\nconst knownPrefixes: RDFContext = {\n acl: 'http://www.w3.org/ns/auth/acl#',\n foaf: 'http://xmlns.com/foaf/0.1/',\n ldp: 'http://www.w3.org/ns/ldp#',\n pim: 'http://www.w3.org/ns/pim/space#',\n purl: 'http://purl.org/dc/terms/',\n rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\n rdfs: 'http://www.w3.org/2000/01/rdf-schema#',\n schema: 'https://schema.org/',\n solid: 'http://www.w3.org/ns/solid/terms#',\n vcard: 'http://www.w3.org/2006/vcard/ns#',\n};\n\nexport function defineIRIPrefix(name: string, value: string): void {\n knownPrefixes[name] = value;\n}\n\nexport function expandIRI(iri: string, options: Partial<ExpandIRIOptions> = {}): string {\n if (iri.startsWith('http')) return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (prefix && name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix) throw new Error(`Can't expand IRI with unknown prefix: '${iri}'`);\n\n return expandedPrefix + name;\n }\n\n if (!options.defaultPrefix) throw new Error(`Can't expand IRI without a default prefix: '${iri}'`);\n\n return options.defaultPrefix + prefix;\n}\n","import type { Quad } from '@rdfjs/types';\n\nimport { expandIRI } from '@noeldemartin/solid-utils/helpers/vocabs';\n\nexport default class SolidThing {\n\n public readonly url: string;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[]) {\n this.url = url;\n this.quads = quads;\n }\n\n public value(property: string): string | undefined {\n return this.quads.find((quad) => quad.predicate.value === expandIRI(property))?.object.value;\n }\n\n public values(property: string): string[] {\n return this.quads\n .filter((quad) => quad.predicate.value === expandIRI(property))\n .map((quad) => quad.object.value);\n }\n\n}\n","import type { BlankNode, Literal, NamedNode, Quad, Variable } from '@rdfjs/types';\n\nimport { expandIRI } from '@noeldemartin/solid-utils/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport type Term = NamedNode | Literal | BlankNode | Quad | Variable;\n\nexport default class SolidStore {\n\n private quads: Quad[];\n\n public constructor(quads: Quad[] = []) {\n this.quads = quads;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public getQuads(): Quad[] {\n return this.quads.slice(0);\n }\n\n public addQuads(quads: Quad[]): void {\n this.quads.push(...quads);\n }\n\n public statements(subject?: Term | string, predicate?: Term | string, object?: Term | string): Quad[] {\n return this.quads.filter(\n (statement) =>\n (!object || this.termMatches(statement.object, object)) &&\n (!subject || this.termMatches(statement.subject, subject)) &&\n (!predicate || this.termMatches(statement.predicate, predicate)),\n );\n }\n\n public statement(subject?: Term | string, predicate?: Term | string, object?: Term | string): Quad | null {\n const statement = this.quads.find(\n (_statement) =>\n (!object || this.termMatches(_statement.object, object)) &&\n (!subject || this.termMatches(_statement.subject, subject)) &&\n (!predicate || this.termMatches(_statement.predicate, predicate)),\n );\n\n return statement ?? null;\n }\n\n public contains(subject: string, predicate?: string, object?: string): boolean {\n return this.statement(subject, predicate, object) !== null;\n }\n\n public getThing(subject: string): SolidThing {\n const statements = this.statements(subject);\n\n return new SolidThing(subject, statements);\n }\n\n protected expandIRI(iri: string): string {\n return expandIRI(iri);\n }\n\n protected termMatches(term: Term, value: Term | string): boolean {\n if (typeof value === 'string') {\n return this.expandIRI(value) === term.value;\n }\n\n return term.termType === term.termType && term.value === value.value;\n }\n\n}\n","import { arrayFilter, parseDate, stringMatch } from '@noeldemartin/utils';\nimport type { Quad } from '@rdfjs/types';\n\nimport { expandIRI } from '@noeldemartin/solid-utils/helpers/vocabs';\n\nimport SolidStore from './SolidStore';\n\nexport enum SolidDocumentPermission {\n Read = 'read',\n Write = 'write',\n Append = 'append',\n Control = 'control',\n}\n\nexport default class SolidDocument extends SolidStore {\n\n public readonly url: string;\n public readonly headers: Headers;\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n super(quads);\n\n this.url = url;\n this.headers = headers;\n }\n\n public isACPResource(): boolean {\n return !!this.headers\n .get('Link')\n ?.match(/<http:\\/\\/www\\.w3\\.org\\/ns\\/solid\\/acp#AccessControlResource>;[^,]+rel=\"type\"/);\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(this.url, expandIRI('rdf:type'), expandIRI('foaf:PersonalProfileDocument'));\n }\n\n public isStorage(): boolean {\n return !!this.headers.get('Link')?.match(/<http:\\/\\/www\\.w3\\.org\\/ns\\/pim\\/space#Storage>;[^,]+rel=\"type\"/);\n }\n\n public isUserWritable(): boolean {\n return this.getUserPermissions().includes(SolidDocumentPermission.Write);\n }\n\n public getUserPermissions(): SolidDocumentPermission[] {\n return this.getPermissionsFromWAC('user');\n }\n\n public getPublicPermissions(): SolidDocumentPermission[] {\n return this.getPermissionsFromWAC('public');\n }\n\n public getLastModified(): Date | null {\n return (\n parseDate(this.headers.get('last-modified')) ??\n parseDate(this.statement(this.url, 'purl:modified')?.object.value) ??\n this.getLatestDocumentDate() ??\n null\n );\n }\n\n protected expandIRI(iri: string): string {\n return expandIRI(iri, { defaultPrefix: this.url });\n }\n\n private getLatestDocumentDate(): Date | null {\n const dates = [...this.statements(undefined, 'purl:modified'), ...this.statements(undefined, 'purl:created')]\n .map((statement) => parseDate(statement.object.value))\n .filter((date): date is Date => date !== null);\n\n return dates.length > 0 ? dates.reduce((a, b) => (a > b ? a : b)) : null;\n }\n\n private getPermissionsFromWAC(type: string): SolidDocumentPermission[] {\n const wacAllow = this.headers.get('WAC-Allow') ?? '';\n const publicModes = stringMatch<2>(wacAllow, new RegExp(`${type}=\"([^\"]+)\"`))?.[1] ?? '';\n\n return arrayFilter([\n publicModes.includes('read') && SolidDocumentPermission.Read,\n publicModes.includes('write') && SolidDocumentPermission.Write,\n publicModes.includes('append') && SolidDocumentPermission.Append,\n publicModes.includes('control') && SolidDocumentPermission.Control,\n ]);\n }\n\n}\n","import jsonld from 'jsonld';\nimport type { JsonLdDocument } from 'jsonld';\n\nexport type JsonLD = Partial<{\n '@context': Record<string, unknown>;\n '@id': string;\n '@type': null | string | string[];\n}> & { [k: string]: unknown };\n\nexport type JsonLDResource = Omit<JsonLD, '@id'> & { '@id': string };\nexport type JsonLDGraph = {\n '@context'?: Record<string, unknown>;\n '@graph': JsonLDResource[];\n};\n\nexport async function compactJsonLDGraph(json: JsonLDGraph): Promise<JsonLDGraph> {\n const compactedJsonLD = await jsonld.compact(json as JsonLdDocument, {});\n\n if ('@graph' in compactedJsonLD) {\n return compactedJsonLD as JsonLDGraph;\n }\n\n if ('@id' in compactedJsonLD) {\n return { '@graph': [compactedJsonLD] } as JsonLDGraph;\n }\n\n return { '@graph': [] };\n}\n\nexport function isJsonLDGraph(json: JsonLD): json is JsonLDGraph {\n return '@graph' in json;\n}\n","import jsonld from 'jsonld';\nimport md5 from 'md5';\nimport { arr, arrayFilter, arrayReplace, objectWithoutEmpty, stringMatchAll, tap } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser, Writer } from 'n3';\nimport type { JsonLdDocument } from 'jsonld';\nimport type { Quad } from '@rdfjs/types';\nimport type { Term } from 'n3';\n\nimport SolidDocument from '@noeldemartin/solid-utils/models/SolidDocument';\n\n// eslint-disable-next-line max-len\nimport MalformedSolidDocumentError, { SolidDocumentFormat } from '@noeldemartin/solid-utils/errors/MalformedSolidDocumentError';\nimport NetworkRequestError from '@noeldemartin/solid-utils/errors/NetworkRequestError';\nimport NotFoundError from '@noeldemartin/solid-utils/errors/NotFoundError';\nimport UnauthorizedError from '@noeldemartin/solid-utils/errors/UnauthorizedError';\nimport { isJsonLDGraph } from '@noeldemartin/solid-utils/helpers/jsonld';\nimport type { JsonLD, JsonLDGraph, JsonLDResource } from '@noeldemartin/solid-utils/helpers/jsonld';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type AnyFetch = (input: any, options?: any) => Promise<Response>;\nexport declare type TypedFetch = (input: RequestInfo, options?: RequestInit) => Promise<Response>;\nexport declare type Fetch = TypedFetch | AnyFetch;\n\nconst ANONYMOUS_PREFIX = 'anonymous://';\nconst ANONYMOUS_PREFIX_LENGTH = ANONYMOUS_PREFIX.length;\n\nasync function fetchRawSolidDocument(\n url: string,\n options?: FetchSolidDocumentOptions,\n): Promise<{ body: string; headers: Headers }> {\n const requestOptions: RequestInit = {\n headers: { Accept: 'text/turtle' },\n };\n\n if (options?.cache) {\n requestOptions.cache = options.cache;\n }\n\n try {\n const fetch = options?.fetch ?? window.fetch;\n const response = await fetch(url, requestOptions);\n\n if (response.status === 404) throw new NotFoundError(url);\n\n if ([401, 403].includes(response.status)) throw new UnauthorizedError(url, response.status);\n\n const body = await response.text();\n\n return {\n body,\n headers: response.headers,\n };\n } catch (error) {\n if (error instanceof UnauthorizedError) throw error;\n\n if (error instanceof NotFoundError) throw error;\n\n throw new NetworkRequestError(url, { cause: error });\n }\n}\n\nfunction normalizeBlankNodes(quads: Quad[]): Quad[] {\n const normalizedQuads = quads.slice(0);\n const quadsIndexes: Record<string, Set<number>> = {};\n const blankNodeIds = arr(quads)\n .flatMap((quad, index) =>\n tap(\n arrayFilter([\n quad.object.termType === 'BlankNode' ? quad.object.value : null,\n quad.subject.termType === 'BlankNode' ? quad.subject.value : null,\n ]),\n (ids) => ids.forEach((id) => (quadsIndexes[id] ??= new Set()).add(index)),\n ))\n .filter()\n .unique();\n\n for (const originalId of blankNodeIds) {\n const quadIndexes = quadsIndexes[originalId] as Set<number>;\n const normalizedId = md5(\n arr(quadIndexes)\n .map((index) => quads[index] as Quad)\n .filter(({ subject: { termType, value } }) => termType === 'BlankNode' && value === originalId)\n .map(({ predicate, object }) =>\n object.termType === 'BlankNode' ? predicate.value : predicate.value + object.value)\n .sorted()\n .join(),\n );\n\n for (const index of quadIndexes) {\n const quad = normalizedQuads[index] as Quad;\n const terms: Record<string, Term> = {\n subject: quad.subject as Term,\n object: quad.object as Term,\n };\n\n for (const [termName, termValue] of Object.entries(terms)) {\n if (termValue.termType !== 'BlankNode' || termValue.value !== originalId) continue;\n\n terms[termName] = new N3BlankNode(normalizedId) as Term;\n }\n\n arrayReplace(\n normalizedQuads,\n quad,\n new N3Quad(terms.subject as Term, quad.predicate as Term, terms.object as Term),\n );\n }\n }\n\n return normalizedQuads;\n}\n\nfunction normalizeQuads(quads: Quad[]): string {\n return quads\n .map((quad) => ' ' + quadToTurtle(quad))\n .sort()\n .join('\\n');\n}\n\nfunction preprocessSubjects(json: JsonLD): void {\n if (!json['@id']?.startsWith('#')) {\n return;\n }\n\n json['@id'] = ANONYMOUS_PREFIX + json['@id'];\n}\n\nfunction postprocessSubjects(quads: Quad[]): void {\n for (const quad of quads) {\n if (!quad.subject.value.startsWith(ANONYMOUS_PREFIX)) {\n continue;\n }\n\n quad.subject.value = quad.subject.value.slice(ANONYMOUS_PREFIX_LENGTH);\n }\n}\n\nexport interface FetchSolidDocumentOptions {\n fetch?: Fetch;\n cache?: RequestCache;\n}\n\nexport interface ParsingOptions {\n baseIRI: string;\n normalizeBlankNodes: boolean;\n}\n\nexport interface RDFGraphData {\n quads: Quad[];\n containsRelativeIRIs: boolean;\n}\n\nexport async function createSolidDocument(url: string, body: string, fetch?: Fetch): Promise<SolidDocument> {\n fetch = fetch ?? window.fetch.bind(window);\n\n const statements = await turtleToQuads(body);\n\n await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/turtle' },\n body,\n });\n\n return new SolidDocument(url, statements, new Headers({}));\n}\n\nexport async function fetchSolidDocument(url: string, options?: FetchSolidDocumentOptions): Promise<SolidDocument> {\n const { body: data, headers } = await fetchRawSolidDocument(url, options);\n const statements = await turtleToQuads(data, { baseIRI: url });\n\n return new SolidDocument(url, statements, headers);\n}\n\nexport async function fetchSolidDocumentIfFound(\n url: string,\n options?: FetchSolidDocumentOptions,\n): Promise<SolidDocument | null> {\n try {\n const document = await fetchSolidDocument(url, options);\n\n return document;\n } catch (error) {\n if (!(error instanceof NotFoundError)) throw error;\n\n return null;\n }\n}\n\nexport async function jsonldToQuads(json: JsonLD, baseIRI?: string): Promise<Quad[]> {\n if (isJsonLDGraph(json)) {\n const graphQuads = await Promise.all(json['@graph'].map((resource) => jsonldToQuads(resource, baseIRI)));\n\n return graphQuads.flat();\n }\n\n preprocessSubjects(json);\n\n const quads = await (jsonld.toRDF(json as JsonLdDocument, { base: baseIRI }) as Promise<Quad[]>);\n\n postprocessSubjects(quads);\n\n return quads;\n}\n\nexport function normalizeSparql(sparql: string): string {\n const quads = sparqlToQuadsSync(sparql);\n\n return Object.entries(quads)\n .reduce((normalizedOperations, [operation, _quads]) => {\n const normalizedQuads = normalizeQuads(_quads);\n\n return normalizedOperations.concat(`${operation.toUpperCase()} DATA {\\n${normalizedQuads}\\n}`);\n }, [] as string[])\n .join(' ;\\n');\n}\n\nexport function normalizeTurtle(sparql: string): string {\n const quads = turtleToQuadsSync(sparql);\n\n return normalizeQuads(quads);\n}\n\nexport function parseTurtle(turtle: string, options: Partial<ParsingOptions> = {}): Promise<RDFGraphData> {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.baseIRI });\n const parser = new Parser(parserOptions);\n const data: RDFGraphData = {\n quads: [],\n containsRelativeIRIs: false,\n };\n\n return new Promise((resolve, reject) => {\n const resolveRelativeIRI = parser._resolveRelativeIRI;\n\n parser._resolveRelativeIRI = (...args) => {\n data.containsRelativeIRIs = true;\n parser._resolveRelativeIRI = resolveRelativeIRI;\n\n return parser._resolveRelativeIRI(...args);\n };\n\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(options.baseIRI ?? null, SolidDocumentFormat.Turtle, error.message),\n );\n\n return;\n }\n\n if (!quad) {\n // data.quads = options.normalizeBlankNodes\n // ? normalizeBlankNodes(data.quads)\n // : data.quads;\n\n resolve(data);\n\n return;\n }\n\n data.quads.push(quad);\n });\n });\n}\n\nexport async function quadsToJsonLD(quads: Quad[]): Promise<JsonLDGraph> {\n const graph = await jsonld.fromRDF(quads);\n\n return {\n '@graph': graph as JsonLDResource[],\n };\n}\n\nexport function quadsToTurtle(quads: Quad[]): string {\n const writer = new Writer();\n\n return writer.quadsToString(quads);\n}\n\nexport function quadToTurtle(quad: Quad): string {\n const writer = new Writer();\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, options?: FetchSolidDocumentOptions): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, options);\n\n return !document.isEmpty();\n } catch (error) {\n return false;\n }\n}\n\nexport async function sparqlToQuads(\n sparql: string,\n options: Partial<ParsingOptions> = {},\n): Promise<Record<string, Quad[]>> {\n const operations = stringMatchAll<3>(sparql, /(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all(\n [...operations].map(async (operation) => {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = await turtleToQuads(operationBody, options);\n }),\n );\n\n return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = stringMatchAll<3>(sparql, /(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n for (const operation of operations) {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = turtleToQuadsSync(operationBody, options);\n }\n\n return quads;\n}\n\nexport async function turtleToQuads(turtle: string, options: Partial<ParsingOptions> = {}): Promise<Quad[]> {\n const { quads } = await parseTurtle(turtle, options);\n\n return quads;\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.baseIRI });\n const parser = new Parser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes ? normalizeBlankNodes(quads) : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(\n options.baseIRI ?? null,\n SolidDocumentFormat.Turtle,\n (error as Error).message ?? '',\n );\n }\n}\n\nexport async function updateSolidDocument(url: string, body: string, fetch?: Fetch): Promise<void> {\n fetch = fetch ?? window.fetch.bind(window);\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n"],"names":["errorMessage","documentUrl","documentFormat","malformationDetails","SolidDocumentFormat","MalformedSolidDocumentError","JSError","__publicField","NetworkRequestError","url","options","NotFoundError","responseStatus","UnauthorizedError","knownPrefixes","defineIRIPrefix","name","value","expandIRI","iri","prefix","expandedPrefix","_a","SolidThing","quads","property","quad","SolidStore","subject","predicate","object","statement","_statement","statements","term","SolidDocumentPermission","SolidDocument","headers","parseDate","dates","date","a","b","type","wacAllow","publicModes","stringMatch","arrayFilter","compactJsonLDGraph","json","compactedJsonLD","jsonld","isJsonLDGraph","ANONYMOUS_PREFIX","ANONYMOUS_PREFIX_LENGTH","fetchRawSolidDocument","requestOptions","response","error","normalizeBlankNodes","normalizedQuads","quadsIndexes","blankNodeIds","arr","index","tap","ids","id","originalId","quadIndexes","normalizedId","md5","termType","terms","termName","termValue","N3BlankNode","arrayReplace","N3Quad","normalizeQuads","quadToTurtle","preprocessSubjects","postprocessSubjects","createSolidDocument","body","fetch","turtleToQuads","fetchSolidDocument","data","fetchSolidDocumentIfFound","jsonldToQuads","baseIRI","resource","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","_quads","normalizeTurtle","turtleToQuadsSync","parseTurtle","turtle","parserOptions","objectWithoutEmpty","parser","Parser","resolve","reject","resolveRelativeIRI","args","quadsToJsonLD","quadsToTurtle","Writer","solidDocumentExists","sparqlToQuads","operations","stringMatchAll","operationName","operationBody","updateSolidDocument"],"mappings":";;;;;;;AAEA,SAASA,EACLC,GACAC,GACAC,GACM;AACC,SAAAF,IACD,aAAaC,CAAc,sBAAsBD,CAAW,MAAME,CAAmB,KACrF,aAAaD,CAAc,eAAeC,CAAmB;AACvE;AAEY,IAAAC,sBAAAA,OACRA,EAAA,SAAS,UADDA,IAAAA,KAAA,CAAA,CAAA;AAIZ,MAAqBC,UAAoCC,EAAQ;AAAA,EAM7D,YAAYL,GAA4BC,GAAqCC,GAA6B;AACtG,UAAMH,EAAaC,GAAaC,GAAgBC,CAAmB,CAAC;AALxD,IAAAI,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAKZ,SAAK,cAAcN,GACnB,KAAK,iBAAiBC,GACtB,KAAK,sBAAsBC;AAAA,EAAA;AAGnC;AC3BA,MAAqBK,UAA4BF,EAAQ;AAAA,EAIrD,YAAYG,GAAaC,GAA0B;AACzC,UAAA,kCAAkCD,CAAG,IAAIC,CAAO;AAH1C,IAAAH,EAAA;AAKZ,SAAK,MAAME;AAAA,EAAA;AAGnB;ACXA,MAAqBE,UAAsBL,EAAQ;AAAA,EAI/C,YAAYG,GAAa;AACf,UAAA,kBAAkBA,CAAG,iBAAiB;AAHhC,IAAAF,EAAA;AAKZ,SAAK,MAAME;AAAA,EAAA;AAGnB;ACVA,SAAST,EAAaS,GAAaG,GAAiC;AAGzD,SAAA,eAFUA,MAAmB,MAAM,iBAAiB,EAE7B,KAAKH,CAAG;AAC1C;AAEA,MAAqBI,UAA0BP,EAAQ;AAAA,EAKnD,YAAYG,GAAaG,GAAyB;AACxC,UAAAZ,EAAaS,GAAKG,CAAc,CAAC;AAJ3B,IAAAL,EAAA;AACA,IAAAA,EAAA;AAKZ,SAAK,MAAME,GACX,KAAK,iBAAiBG;AAAA,EAAA;AAAA,EAG1B,IAAW,YAAiC;AACxC,WAAO,OAAO,KAAK,iBAAmB,MAAc,KAAK,mBAAmB,MAAM;AAAA,EAAA;AAG1F;ACjBA,MAAME,IAA4B;AAAA,EAC9B,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACX;AAEgB,SAAAC,GAAgBC,GAAcC,GAAqB;AAC/D,EAAAH,EAAcE,CAAI,IAAIC;AAC1B;AAEO,SAASC,EAAUC,GAAaT,IAAqC,IAAY;;AACpF,MAAIS,EAAI,WAAW,MAAM,EAAU,QAAAA;AAEnC,QAAM,CAACC,GAAQJ,CAAI,IAAIG,EAAI,MAAM,GAAG;AAEpC,MAAIC,KAAUJ,GAAM;AAChB,UAAMK,IAAiBP,EAAcM,CAAM,OAAKE,IAAAZ,EAAQ,iBAAR,gBAAAY,EAAuBF,OAAW;AAElF,QAAI,CAACC,EAAgB,OAAM,IAAI,MAAM,0CAA0CF,CAAG,GAAG;AAErF,WAAOE,IAAiBL;AAAA,EAAA;AAGxB,MAAA,CAACN,EAAQ,cAAe,OAAM,IAAI,MAAM,+CAA+CS,CAAG,GAAG;AAEjG,SAAOT,EAAQ,gBAAgBU;AACnC;ACpCA,MAAqBG,EAAW;AAAA,EAKrB,YAAYd,GAAae,GAAe;AAH/B,IAAAjB,EAAA;AACR,IAAAA,EAAA;AAGJ,SAAK,MAAME,GACX,KAAK,QAAQe;AAAA,EAAA;AAAA,EAGV,MAAMC,GAAsC;;AAC/C,YAAOH,IAAA,KAAK,MAAM,KAAK,CAACI,MAASA,EAAK,UAAU,UAAUR,EAAUO,CAAQ,CAAC,MAAtE,gBAAAH,EAAyE,OAAO;AAAA,EAAA;AAAA,EAGpF,OAAOG,GAA4B;AACtC,WAAO,KAAK,MACP,OAAO,CAACC,MAASA,EAAK,UAAU,UAAUR,EAAUO,CAAQ,CAAC,EAC7D,IAAI,CAACC,MAASA,EAAK,OAAO,KAAK;AAAA,EAAA;AAG5C;AChBA,MAAqBC,EAAW;AAAA,EAIrB,YAAYH,IAAgB,IAAI;AAF/B,IAAAjB,EAAA;AAGJ,SAAK,QAAQiB;AAAA,EAAA;AAAA,EAGV,UAAmB;AACf,WAAA,KAAK,WAAW,WAAW;AAAA,EAAA;AAAA,EAG/B,WAAmB;AACf,WAAA,KAAK,MAAM,MAAM,CAAC;AAAA,EAAA;AAAA,EAGtB,SAASA,GAAqB;AAC5B,SAAA,MAAM,KAAK,GAAGA,CAAK;AAAA,EAAA;AAAA,EAGrB,WAAWI,GAAyBC,GAA2BC,GAAgC;AAClG,WAAO,KAAK,MAAM;AAAA,MACd,CAACC,OACI,CAACD,KAAU,KAAK,YAAYC,EAAU,QAAQD,CAAM,OACpD,CAACF,KAAW,KAAK,YAAYG,EAAU,SAASH,CAAO,OACvD,CAACC,KAAa,KAAK,YAAYE,EAAU,WAAWF,CAAS;AAAA,IACtE;AAAA,EAAA;AAAA,EAGG,UAAUD,GAAyBC,GAA2BC,GAAqC;AAQtG,WAPkB,KAAK,MAAM;AAAA,MACzB,CAACE,OACI,CAACF,KAAU,KAAK,YAAYE,EAAW,QAAQF,CAAM,OACrD,CAACF,KAAW,KAAK,YAAYI,EAAW,SAASJ,CAAO,OACxD,CAACC,KAAa,KAAK,YAAYG,EAAW,WAAWH,CAAS;AAAA,IACvE,KAEoB;AAAA,EAAA;AAAA,EAGjB,SAASD,GAAiBC,GAAoBC,GAA0B;AAC3E,WAAO,KAAK,UAAUF,GAASC,GAAWC,CAAM,MAAM;AAAA,EAAA;AAAA,EAGnD,SAASF,GAA6B;AACnC,UAAAK,IAAa,KAAK,WAAWL,CAAO;AAEnC,WAAA,IAAIL,EAAWK,GAASK,CAAU;AAAA,EAAA;AAAA,EAGnC,UAAUd,GAAqB;AACrC,WAAOD,EAAUC,CAAG;AAAA,EAAA;AAAA,EAGd,YAAYe,GAAYjB,GAA+B;AACzD,WAAA,OAAOA,KAAU,WACV,KAAK,UAAUA,CAAK,MAAMiB,EAAK,QAGnCA,EAAK,aAAaA,EAAK,YAAYA,EAAK,UAAUjB,EAAM;AAAA,EAAA;AAGvE;AC/DY,IAAAkB,sBAAAA,OACRA,EAAA,OAAO,QACPA,EAAA,QAAQ,SACRA,EAAA,SAAS,UACTA,EAAA,UAAU,WAJFA,IAAAA,KAAA,CAAA,CAAA;AAOZ,MAAqBC,UAAsBT,EAAW;AAAA,EAK3C,YAAYlB,GAAae,GAAea,GAAkB;AAC7D,UAAMb,CAAK;AAJC,IAAAjB,EAAA;AACA,IAAAA,EAAA;AAKZ,SAAK,MAAME,GACX,KAAK,UAAU4B;AAAA,EAAA;AAAA,EAGZ,gBAAyB;;AACrB,WAAA,CAAC,GAACf,IAAA,KAAK,QACT,IAAI,MAAM,MADN,QAAAA,EAEH,MAAM;AAAA,EAA+E;AAAA,EAGxF,oBAA6B;AACzB,WAAA,CAAC,CAAC,KAAK,UAAU,KAAK,KAAKJ,EAAU,UAAU,GAAGA,EAAU,8BAA8B,CAAC;AAAA,EAAA;AAAA,EAG/F,YAAqB;;AACjB,WAAA,CAAC,GAACI,IAAA,KAAK,QAAQ,IAAI,MAAM,MAAvB,QAAAA,EAA0B,MAAM;AAAA,EAAiE;AAAA,EAGvG,iBAA0B;AAC7B,WAAO,KAAK,qBAAqB;AAAA,MAAS;AAAA;AAAA,IAA6B;AAAA,EAAA;AAAA,EAGpE,qBAAgD;AAC5C,WAAA,KAAK,sBAAsB,MAAM;AAAA,EAAA;AAAA,EAGrC,uBAAkD;AAC9C,WAAA,KAAK,sBAAsB,QAAQ;AAAA,EAAA;AAAA,EAGvC,kBAA+B;;AAClC,WACIgB,EAAU,KAAK,QAAQ,IAAI,eAAe,CAAC,KAC3CA,GAAUhB,IAAA,KAAK,UAAU,KAAK,KAAK,eAAe,MAAxC,gBAAAA,EAA2C,OAAO,KAAK,KACjE,KAAK,2BACL;AAAA,EAAA;AAAA,EAIE,UAAUH,GAAqB;AACrC,WAAOD,EAAUC,GAAK,EAAE,eAAe,KAAK,KAAK;AAAA,EAAA;AAAA,EAG7C,wBAAqC;AACzC,UAAMoB,IAAQ,CAAC,GAAG,KAAK,WAAW,QAAW,eAAe,GAAG,GAAG,KAAK,WAAW,QAAW,cAAc,CAAC,EACvG,IAAI,CAACR,MAAcO,EAAUP,EAAU,OAAO,KAAK,CAAC,EACpD,OAAO,CAACS,MAAuBA,MAAS,IAAI;AAEjD,WAAOD,EAAM,SAAS,IAAIA,EAAM,OAAO,CAACE,GAAGC,MAAOD,IAAIC,IAAID,IAAIC,CAAE,IAAI;AAAA,EAAA;AAAA,EAGhE,sBAAsBC,GAAyC;;AACnE,UAAMC,IAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAC5CC,MAAcvB,IAAAwB,EAAeF,GAAU,IAAI,OAAO,GAAGD,CAAI,YAAY,CAAC,MAAxD,gBAAArB,EAA4D,OAAM;AAEtF,WAAOyB,EAAY;AAAA,MACfF,EAAY,SAAS,MAAM,KAAK;AAAA,MAChCA,EAAY,SAAS,OAAO,KAAK;AAAA,MACjCA,EAAY,SAAS,QAAQ,KAAK;AAAA,MAClCA,EAAY,SAAS,SAAS,KAAK;AAAA;AAAA,IAAA,CACtC;AAAA,EAAA;AAGT;ACtEA,eAAsBG,GAAmBC,GAAyC;AAC9E,QAAMC,IAAkB,MAAMC,EAAO,QAAQF,GAAwB,CAAA,CAAE;AAEvE,SAAI,YAAYC,IACLA,IAGP,SAASA,IACF,EAAE,UAAU,CAACA,CAAe,EAAE,IAGlC,EAAE,UAAU,GAAG;AAC1B;AAEO,SAASE,EAAcH,GAAmC;AAC7D,SAAO,YAAYA;AACvB;ACRA,MAAMI,IAAmB,gBACnBC,IAA0BD,EAAiB;AAEjD,eAAeE,EACX9C,GACAC,GAC2C;AAC3C,QAAM8C,IAA8B;AAAA,IAChC,SAAS,EAAE,QAAQ,cAAc;AAAA,EACrC;AAEA,EAAI9C,KAAA,QAAAA,EAAS,UACT8C,EAAe,QAAQ9C,EAAQ;AAG/B,MAAA;AAEA,UAAM+C,IAAW,QADH/C,KAAA,gBAAAA,EAAS,UAAS,OAAO,OACVD,GAAK+C,CAAc;AAEhD,QAAIC,EAAS,WAAW,IAAW,OAAA,IAAI9C,EAAcF,CAAG;AAExD,QAAI,CAAC,KAAK,GAAG,EAAE,SAASgD,EAAS,MAAM,EAAS,OAAA,IAAI5C,EAAkBJ,GAAKgD,EAAS,MAAM;AAInF,WAAA;AAAA,MACH,MAHS,MAAMA,EAAS,KAAK;AAAA,MAI7B,SAASA,EAAS;AAAA,IACtB;AAAA,WACKC,GAAO;AAGR,UAFAA,aAAiB7C,KAEjB6C,aAAiB/C,IAAqB+C,IAEpC,IAAIlD,EAAoBC,GAAK,EAAE,OAAOiD,GAAO;AAAA,EAAA;AAE3D;AAEA,SAASC,EAAoBnC,GAAuB;AAC1C,QAAAoC,IAAkBpC,EAAM,MAAM,CAAC,GAC/BqC,IAA4C,CAAC,GAC7CC,IAAeC,EAAIvC,CAAK,EACzB,QAAQ,CAACE,GAAMsC,MACZC;AAAA,IACIlB,EAAY;AAAA,MACRrB,EAAK,OAAO,aAAa,cAAcA,EAAK,OAAO,QAAQ;AAAA,MAC3DA,EAAK,QAAQ,aAAa,cAAcA,EAAK,QAAQ,QAAQ;AAAA,IAAA,CAChE;AAAA,IACD,CAACwC,MAAQA,EAAI,QAAQ,CAACC,OAAQN,EAAAM,OAAAN,EAAAM,KAAyB,oBAAA,QAAO,IAAIH,CAAK,CAAC;AAAA,EAAA,CAC3E,EACJ,OAAO,EACP,OAAO;AAEZ,aAAWI,KAAcN,GAAc;AAC7B,UAAAO,IAAcR,EAAaO,CAAU,GACrCE,IAAeC;AAAA,MACjBR,EAAIM,CAAW,EACV,IAAI,CAACL,MAAUxC,EAAMwC,CAAK,CAAS,EACnC,OAAO,CAAC,EAAE,SAAS,EAAE,UAAAQ,GAAU,OAAAvD,EAAM,QAAQuD,MAAa,eAAevD,MAAUmD,CAAU,EAC7F,IAAI,CAAC,EAAE,WAAAvC,GAAW,QAAAC,QACfA,EAAO,aAAa,cAAcD,EAAU,QAAQA,EAAU,QAAQC,EAAO,KAAK,EACrF,OAAA,EACA,KAAK;AAAA,IACd;AAEA,eAAWkC,KAASK,GAAa;AACvB,YAAA3C,IAAOkC,EAAgBI,CAAK,GAC5BS,IAA8B;AAAA,QAChC,SAAS/C,EAAK;AAAA,QACd,QAAQA,EAAK;AAAA,MACjB;AAEA,iBAAW,CAACgD,GAAUC,CAAS,KAAK,OAAO,QAAQF,CAAK;AACpD,QAAIE,EAAU,aAAa,eAAeA,EAAU,UAAUP,MAE9DK,EAAMC,CAAQ,IAAI,IAAIE,EAAYN,CAAY;AAGlD,MAAAO;AAAA,QACIjB;AAAA,QACAlC;AAAA,QACA,IAAIoD,EAAOL,EAAM,SAAiB/C,EAAK,WAAmB+C,EAAM,MAAc;AAAA,MAClF;AAAA,IAAA;AAAA,EACJ;AAGG,SAAAb;AACX;AAEA,SAASmB,EAAevD,GAAuB;AAC3C,SAAOA,EACF,IAAI,CAACE,MAAS,SAASsD,GAAatD,CAAI,CAAC,EACzC,OACA,KAAK;AAAA,CAAI;AAClB;AAEA,SAASuD,EAAmBhC,GAAoB;;AAC5C,GAAK3B,IAAA2B,EAAK,KAAK,MAAV,QAAA3B,EAAa,WAAW,SAI7B2B,EAAK,KAAK,IAAII,IAAmBJ,EAAK,KAAK;AAC/C;AAEA,SAASiC,EAAoB1D,GAAqB;AAC9C,aAAWE,KAAQF;AACf,IAAKE,EAAK,QAAQ,MAAM,WAAW2B,CAAgB,MAInD3B,EAAK,QAAQ,QAAQA,EAAK,QAAQ,MAAM,MAAM4B,CAAuB;AAE7E;AAiBsB,eAAA6B,GAAoB1E,GAAa2E,GAAcC,GAAuC;AACxG,EAAAA,IAAQA,KAAS,OAAO,MAAM,KAAK,MAAM;AAEnC,QAAApD,IAAa,MAAMqD,EAAcF,CAAI;AAE3C,eAAMC,EAAM5E,GAAK;AAAA,IACb,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,cAAc;AAAA,IACzC,MAAA2E;AAAA,EAAA,CACH,GAEM,IAAIhD,EAAc3B,GAAKwB,GAAY,IAAI,QAAQ,CAAA,CAAE,CAAC;AAC7D;AAEsB,eAAAsD,EAAmB9E,GAAaC,GAA6D;AACzG,QAAA,EAAE,MAAM8E,GAAM,SAAAnD,MAAY,MAAMkB,EAAsB9C,GAAKC,CAAO,GAClEuB,IAAa,MAAMqD,EAAcE,GAAM,EAAE,SAAS/E,GAAK;AAE7D,SAAO,IAAI2B,EAAc3B,GAAKwB,GAAYI,CAAO;AACrD;AAEsB,eAAAoD,GAClBhF,GACAC,GAC6B;AACzB,MAAA;AAGO,WAFU,MAAM6E,EAAmB9E,GAAKC,CAAO;AAAA,WAGjDgD,GAAO;AACR,QAAA,EAAEA,aAAiB/C,GAAsB,OAAA+C;AAEtC,WAAA;AAAA,EAAA;AAEf;AAEsB,eAAAgC,GAAczC,GAAc0C,GAAmC;AAC7E,MAAAvC,EAAcH,CAAI;AAGlB,YAFmB,MAAM,QAAQ,IAAIA,EAAK,QAAQ,EAAE,IAAI,CAAC2C,MAAaF,GAAcE,GAAUD,CAAO,CAAC,CAAC,GAErF,KAAK;AAG3B,EAAAV,EAAmBhC,CAAI;AAEjB,QAAAzB,IAAQ,MAAO2B,EAAO,MAAMF,GAAwB,EAAE,MAAM0C,GAAS;AAE3E,SAAAT,EAAoB1D,CAAK,GAElBA;AACX;AAEO,SAASqE,GAAgBC,GAAwB;AAC9C,QAAAtE,IAAQuE,GAAkBD,CAAM;AAE/B,SAAA,OAAO,QAAQtE,CAAK,EACtB,OAAO,CAACwE,GAAsB,CAACC,GAAWC,CAAM,MAAM;AAC7C,UAAAtC,IAAkBmB,EAAemB,CAAM;AAE7C,WAAOF,EAAqB,OAAO,GAAGC,EAAU,aAAa;AAAA,EAAYrC,CAAe;AAAA,EAAK;AAAA,EAAA,GAC9F,CAAc,CAAA,EAChB,KAAK;AAAA,CAAM;AACpB;AAEO,SAASuC,GAAgBL,GAAwB;AAC9C,QAAAtE,IAAQ4E,EAAkBN,CAAM;AAEtC,SAAOf,EAAevD,CAAK;AAC/B;AAEO,SAAS6E,GAAYC,GAAgB5F,IAAmC,IAA2B;AACtG,QAAM6F,IAAgBC,EAAmB,EAAE,SAAS9F,EAAQ,SAAS,GAC/D+F,IAAS,IAAIC,EAAOH,CAAa,GACjCf,IAAqB;AAAA,IACvB,OAAO,CAAC;AAAA,IACR,sBAAsB;AAAA,EAC1B;AAEA,SAAO,IAAI,QAAQ,CAACmB,GAASC,MAAW;AACpC,UAAMC,IAAqBJ,EAAO;AAE3B,IAAAA,EAAA,sBAAsB,IAAIK,OAC7BtB,EAAK,uBAAuB,IAC5BiB,EAAO,sBAAsBI,GAEtBJ,EAAO,oBAAoB,GAAGK,CAAI,IAG7CL,EAAO,MAAMH,GAAQ,CAAC5C,GAAOhC,MAAS;AAClC,UAAIgC,GAAO;AACP,QAAAkD;AAAA,UACI,IAAIvG,EAA4BK,EAAQ,WAAW,MAAMN,EAAoB,QAAQsD,EAAM,OAAO;AAAA,QACtG;AAEA;AAAA,MAAA;AAGJ,UAAI,CAAChC,GAAM;AAKP,QAAAiF,EAAQnB,CAAI;AAEZ;AAAA,MAAA;AAGC,MAAAA,EAAA,MAAM,KAAK9D,CAAI;AAAA,IAAA,CACvB;AAAA,EAAA,CACJ;AACL;AAEA,eAAsBqF,GAAcvF,GAAqC;AAG9D,SAAA;AAAA,IACH,UAHU,MAAM2B,EAAO,QAAQ3B,CAAK;AAAA,EAIxC;AACJ;AAEO,SAASwF,GAAcxF,GAAuB;AAG1C,SAFQ,IAAIyF,EAAO,EAEZ,cAAczF,CAAK;AACrC;AAEO,SAASwD,GAAatD,GAAoB;AAGtC,SAFQ,IAAIuF,EAAO,EAEZ,cAAc,CAACvF,CAAI,CAAC,EAAE,MAAM,GAAG,EAAE;AACnD;AAEsB,eAAAwF,GAAoBzG,GAAaC,GAAuD;AACtG,MAAA;AAGO,WAAA,EAFU,MAAM6E,EAAmB9E,GAAKC,CAAO,GAErC,QAAQ;AAAA,UACb;AACL,WAAA;AAAA,EAAA;AAEf;AAEA,eAAsByG,GAClBrB,GACApF,IAAmC,IACJ;AACzB,QAAA0G,IAAaC,EAAkBvB,GAAQ,uBAAuB,GAC9DtE,IAAgC,CAAC;AAEvC,eAAM,QAAQ;AAAA,IACV,CAAC,GAAG4F,CAAU,EAAE,IAAI,OAAOnB,MAAc;AACrC,YAAMqB,IAAgBrB,EAAU,CAAC,EAAE,YAAY,GACzCsB,IAAgBtB,EAAU,CAAC;AAEjC,MAAAzE,EAAM8F,CAAa,IAAI,MAAMhC,EAAciC,GAAe7G,CAAO;AAAA,IACpE,CAAA;AAAA,EACL,GAEOc;AACX;AAEO,SAASuE,GAAkBD,GAAgBpF,IAAmC,IAA4B;AACvG,QAAA0G,IAAaC,EAAkBvB,GAAQ,uBAAuB,GAC9DtE,IAAgC,CAAC;AAEvC,aAAWyE,KAAamB,GAAY;AAChC,UAAME,IAAgBrB,EAAU,CAAC,EAAE,YAAY,GACzCsB,IAAgBtB,EAAU,CAAC;AAEjC,IAAAzE,EAAM8F,CAAa,IAAIlB,EAAkBmB,GAAe7G,CAAO;AAAA,EAAA;AAG5D,SAAAc;AACX;AAEA,eAAsB8D,EAAcgB,GAAgB5F,IAAmC,IAAqB;AACxG,QAAM,EAAE,OAAAc,EAAM,IAAI,MAAM6E,GAAYC,GAAQ5F,CAAO;AAE5C,SAAAc;AACX;AAEO,SAAS4E,EAAkBE,GAAgB5F,IAAmC,IAAY;AAC7F,QAAM6F,IAAgBC,EAAmB,EAAE,SAAS9F,EAAQ,SAAS,GAC/D+F,IAAS,IAAIC,EAAOH,CAAa;AAEnC,MAAA;AACM,UAAA/E,IAAQiF,EAAO,MAAMH,CAAM;AAEjC,WAAO5F,EAAQ,sBAAsBiD,EAAoBnC,CAAK,IAAIA;AAAA,WAC7DkC,GAAO;AACZ,UAAM,IAAIrD;AAAA,MACNK,EAAQ,WAAW;AAAA,MACnBN,EAAoB;AAAA,MACnBsD,EAAgB,WAAW;AAAA,IAChC;AAAA,EAAA;AAER;AAEsB,eAAA8D,GAAoB/G,GAAa2E,GAAcC,GAA8B;AAC/F,EAAAA,IAAQA,KAAS,OAAO,MAAM,KAAK,MAAM,GAEzC,MAAMA,EAAM5E,GAAK;AAAA,IACb,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,4BAA4B;AAAA,IACvD,MAAA2E;AAAA,EAAA,CACH;AACL;"}
1
+ {"version":3,"file":"io-CT3AW8WO.js","sources":["../src/errors/MalformedSolidDocumentError.ts","../src/errors/NetworkRequestError.ts","../src/errors/NotFoundError.ts","../src/errors/UnauthorizedError.ts","../src/helpers/vocabs.ts","../src/models/SolidThing.ts","../src/models/SolidStore.ts","../src/models/SolidDocument.ts","../src/helpers/jsonld.ts","../src/helpers/io.ts"],"sourcesContent":["import { JSError } from '@noeldemartin/utils';\n\nfunction errorMessage(\n documentUrl: string | null,\n documentFormat: SolidDocumentFormat,\n malformationDetails: string,\n): string {\n return documentUrl\n ? `Malformed ${documentFormat} document found at ${documentUrl} - ${malformationDetails}`\n : `Malformed ${documentFormat} document - ${malformationDetails}`;\n}\n\nexport enum SolidDocumentFormat {\n Turtle = 'Turtle',\n}\n\nexport default class MalformedSolidDocumentError extends JSError {\n\n public readonly documentUrl: string | null;\n public readonly documentFormat: SolidDocumentFormat;\n public readonly malformationDetails: string;\n\n constructor(documentUrl: string | null, documentFormat: SolidDocumentFormat, malformationDetails: string) {\n super(errorMessage(documentUrl, documentFormat, malformationDetails));\n\n this.documentUrl = documentUrl;\n this.documentFormat = documentFormat;\n this.malformationDetails = malformationDetails;\n }\n\n}\n","import { JSError } from '@noeldemartin/utils';\nimport type { JSErrorOptions } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends JSError {\n\n public readonly url: string;\n\n constructor(url: string, options?: JSErrorOptions) {\n super(`Request failed trying to fetch ${url}`, options);\n\n this.url = url;\n }\n\n}\n","import { JSError } from '@noeldemartin/utils';\n\nexport default class NotFoundError extends JSError {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Document with '${url}' url not found`);\n\n this.url = url;\n }\n\n}\n","import { JSError } from '@noeldemartin/utils';\n\nfunction errorMessage(url: string, responseStatus?: number): string {\n const typeInfo = responseStatus === 403 ? ' (Forbidden)' : '';\n\n return `Unauthorized${typeInfo}: ${url}`;\n}\n\nexport default class UnauthorizedError extends JSError {\n\n public readonly url: string;\n public readonly responseStatus?: number;\n\n constructor(url: string, responseStatus?: number) {\n super(errorMessage(url, responseStatus));\n\n this.url = url;\n this.responseStatus = responseStatus;\n }\n\n public get forbidden(): boolean | undefined {\n return typeof this.responseStatus !== 'undefined' ? this.responseStatus === 403 : undefined;\n }\n\n}\n","export type RDFContext = Record<string, string>;\n\nexport interface ExpandIRIOptions {\n defaultPrefix: string;\n extraContext: RDFContext;\n}\n\nconst knownPrefixes: RDFContext = {\n acl: 'http://www.w3.org/ns/auth/acl#',\n foaf: 'http://xmlns.com/foaf/0.1/',\n ldp: 'http://www.w3.org/ns/ldp#',\n pim: 'http://www.w3.org/ns/pim/space#',\n purl: 'http://purl.org/dc/terms/',\n rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\n rdfs: 'http://www.w3.org/2000/01/rdf-schema#',\n schema: 'https://schema.org/',\n solid: 'http://www.w3.org/ns/solid/terms#',\n vcard: 'http://www.w3.org/2006/vcard/ns#',\n};\n\nexport function defineIRIPrefix(name: string, value: string): void {\n knownPrefixes[name] = value;\n}\n\nexport function expandIRI(iri: string, options: Partial<ExpandIRIOptions> = {}): string {\n if (iri.startsWith('http')) return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (prefix && name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix) throw new Error(`Can't expand IRI with unknown prefix: '${iri}'`);\n\n return expandedPrefix + name;\n }\n\n if (!options.defaultPrefix) throw new Error(`Can't expand IRI without a default prefix: '${iri}'`);\n\n return options.defaultPrefix + prefix;\n}\n","import type { Quad } from '@rdfjs/types';\n\nimport { expandIRI } from '@noeldemartin/solid-utils/helpers/vocabs';\n\nexport default class SolidThing {\n\n public readonly url: string;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[]) {\n this.url = url;\n this.quads = quads;\n }\n\n public value(property: string): string | undefined {\n return this.quads.find((quad) => quad.predicate.value === expandIRI(property))?.object.value;\n }\n\n public values(property: string): string[] {\n return this.quads\n .filter((quad) => quad.predicate.value === expandIRI(property))\n .map((quad) => quad.object.value);\n }\n\n}\n","import type { BlankNode, Literal, NamedNode, Quad, Variable } from '@rdfjs/types';\n\nimport { expandIRI } from '@noeldemartin/solid-utils/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport type Term = NamedNode | Literal | BlankNode | Quad | Variable;\n\nexport default class SolidStore {\n\n private quads: Quad[];\n\n public constructor(quads: Quad[] = []) {\n this.quads = quads;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public getQuads(): Quad[] {\n return this.quads.slice(0);\n }\n\n public addQuads(quads: Quad[]): void {\n this.quads.push(...quads);\n }\n\n public statements(subject?: Term | string, predicate?: Term | string, object?: Term | string): Quad[] {\n return this.quads.filter(\n (statement) =>\n (!object || this.termMatches(statement.object, object)) &&\n (!subject || this.termMatches(statement.subject, subject)) &&\n (!predicate || this.termMatches(statement.predicate, predicate)),\n );\n }\n\n public statement(subject?: Term | string, predicate?: Term | string, object?: Term | string): Quad | null {\n const statement = this.quads.find(\n (_statement) =>\n (!object || this.termMatches(_statement.object, object)) &&\n (!subject || this.termMatches(_statement.subject, subject)) &&\n (!predicate || this.termMatches(_statement.predicate, predicate)),\n );\n\n return statement ?? null;\n }\n\n public contains(subject: string, predicate?: string, object?: string): boolean {\n return this.statement(subject, predicate, object) !== null;\n }\n\n public getThing(subject: string): SolidThing {\n const statements = this.statements(subject);\n\n return new SolidThing(subject, statements);\n }\n\n protected expandIRI(iri: string): string {\n return expandIRI(iri);\n }\n\n protected termMatches(term: Term, value: Term | string): boolean {\n if (typeof value === 'string') {\n return this.expandIRI(value) === term.value;\n }\n\n return term.termType === term.termType && term.value === value.value;\n }\n\n}\n","import { arrayFilter, parseDate, stringMatch } from '@noeldemartin/utils';\nimport type { Quad } from '@rdfjs/types';\n\nimport { expandIRI } from '@noeldemartin/solid-utils/helpers/vocabs';\n\nimport SolidStore from './SolidStore';\n\nexport enum SolidDocumentPermission {\n Read = 'read',\n Write = 'write',\n Append = 'append',\n Control = 'control',\n}\n\nexport default class SolidDocument extends SolidStore {\n\n public readonly url: string;\n public readonly headers: Headers;\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n super(quads);\n\n this.url = url;\n this.headers = headers;\n }\n\n public isACPResource(): boolean {\n return !!this.headers\n .get('Link')\n ?.match(/<http:\\/\\/www\\.w3\\.org\\/ns\\/solid\\/acp#AccessControlResource>;[^,]+rel=\"type\"/);\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(this.url, expandIRI('rdf:type'), expandIRI('foaf:PersonalProfileDocument'));\n }\n\n public isStorage(): boolean {\n return !!this.headers.get('Link')?.match(/<http:\\/\\/www\\.w3\\.org\\/ns\\/pim\\/space#Storage>;[^,]+rel=\"type\"/);\n }\n\n public isUserWritable(): boolean {\n return this.getUserPermissions().includes(SolidDocumentPermission.Write);\n }\n\n public getUserPermissions(): SolidDocumentPermission[] {\n return this.getPermissionsFromWAC('user');\n }\n\n public getPublicPermissions(): SolidDocumentPermission[] {\n return this.getPermissionsFromWAC('public');\n }\n\n public getLastModified(): Date | null {\n return (\n parseDate(this.headers.get('last-modified')) ??\n parseDate(this.statement(this.url, 'purl:modified')?.object.value) ??\n this.getLatestDocumentDate() ??\n null\n );\n }\n\n protected expandIRI(iri: string): string {\n return expandIRI(iri, { defaultPrefix: this.url });\n }\n\n private getLatestDocumentDate(): Date | null {\n const dates = [...this.statements(undefined, 'purl:modified'), ...this.statements(undefined, 'purl:created')]\n .map((statement) => parseDate(statement.object.value))\n .filter((date): date is Date => date !== null);\n\n return dates.length > 0 ? dates.reduce((a, b) => (a > b ? a : b)) : null;\n }\n\n private getPermissionsFromWAC(type: string): SolidDocumentPermission[] {\n const wacAllow = this.headers.get('WAC-Allow') ?? '';\n const publicModes = stringMatch<2>(wacAllow, new RegExp(`${type}=\"([^\"]+)\"`))?.[1] ?? '';\n\n return arrayFilter([\n publicModes.includes('read') && SolidDocumentPermission.Read,\n publicModes.includes('write') && SolidDocumentPermission.Write,\n publicModes.includes('append') && SolidDocumentPermission.Append,\n publicModes.includes('control') && SolidDocumentPermission.Control,\n ]);\n }\n\n}\n","import jsonld from 'jsonld';\nimport type { JsonLdDocument } from 'jsonld';\n\nexport type JsonLD = Partial<{\n '@context': Record<string, unknown>;\n '@id': string;\n '@type': null | string | string[];\n}> & { [k: string]: unknown };\n\nexport type JsonLDResource = Omit<JsonLD, '@id'> & { '@id': string };\nexport type JsonLDGraph = {\n '@context'?: Record<string, unknown>;\n '@graph': JsonLDResource[];\n};\n\nexport async function compactJsonLDGraph(json: JsonLDGraph): Promise<JsonLDGraph> {\n const compactedJsonLD = await jsonld.compact(json as JsonLdDocument, {});\n\n if ('@graph' in compactedJsonLD) {\n return compactedJsonLD as JsonLDGraph;\n }\n\n if ('@id' in compactedJsonLD) {\n return { '@graph': [compactedJsonLD] } as JsonLDGraph;\n }\n\n return { '@graph': [] };\n}\n\nexport function isJsonLDGraph(json: JsonLD): json is JsonLDGraph {\n return '@graph' in json;\n}\n","import jsonld from 'jsonld';\nimport md5 from 'md5';\nimport { arr, arrayFilter, arrayReplace, objectWithoutEmpty, stringMatchAll, tap } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser, Writer } from 'n3';\nimport type { JsonLdDocument } from 'jsonld';\nimport type { Quad } from '@rdfjs/types';\nimport type { Term } from 'n3';\n\nimport SolidDocument from '@noeldemartin/solid-utils/models/SolidDocument';\n\n// eslint-disable-next-line max-len\nimport MalformedSolidDocumentError, { SolidDocumentFormat } from '@noeldemartin/solid-utils/errors/MalformedSolidDocumentError';\nimport NetworkRequestError from '@noeldemartin/solid-utils/errors/NetworkRequestError';\nimport NotFoundError from '@noeldemartin/solid-utils/errors/NotFoundError';\nimport UnauthorizedError from '@noeldemartin/solid-utils/errors/UnauthorizedError';\nimport { isJsonLDGraph } from '@noeldemartin/solid-utils/helpers/jsonld';\nimport type { JsonLD, JsonLDGraph, JsonLDResource } from '@noeldemartin/solid-utils/helpers/jsonld';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type AnyFetch = (input: any, options?: any) => Promise<Response>;\nexport declare type TypedFetch = (input: RequestInfo, options?: RequestInit) => Promise<Response>;\nexport declare type Fetch = TypedFetch | AnyFetch;\n\nconst ANONYMOUS_PREFIX = 'anonymous://';\nconst ANONYMOUS_PREFIX_LENGTH = ANONYMOUS_PREFIX.length;\n\nasync function fetchRawSolidDocument(\n url: string,\n options?: FetchSolidDocumentOptions,\n): Promise<{ body: string; headers: Headers }> {\n const requestOptions: RequestInit = {\n headers: { Accept: 'text/turtle' },\n };\n\n if (options?.cache) {\n requestOptions.cache = options.cache;\n }\n\n try {\n const fetch = options?.fetch ?? window.fetch;\n const response = await fetch(url, requestOptions);\n\n if (response.status === 404) throw new NotFoundError(url);\n\n if ([401, 403].includes(response.status)) throw new UnauthorizedError(url, response.status);\n\n const body = await response.text();\n\n return {\n body,\n headers: response.headers,\n };\n } catch (error) {\n if (error instanceof UnauthorizedError) throw error;\n\n if (error instanceof NotFoundError) throw error;\n\n throw new NetworkRequestError(url, { cause: error });\n }\n}\n\nfunction normalizeBlankNodes(quads: Quad[]): Quad[] {\n const normalizedQuads = quads.slice(0);\n const quadsIndexes: Record<string, Set<number>> = {};\n const blankNodeIds = arr(quads)\n .flatMap((quad, index) =>\n tap(\n arrayFilter([\n quad.object.termType === 'BlankNode' ? quad.object.value : null,\n quad.subject.termType === 'BlankNode' ? quad.subject.value : null,\n ]),\n (ids) => ids.forEach((id) => (quadsIndexes[id] ??= new Set()).add(index)),\n ))\n .filter()\n .unique();\n\n for (const originalId of blankNodeIds) {\n const quadIndexes = quadsIndexes[originalId] as Set<number>;\n const normalizedId = md5(\n arr(quadIndexes)\n .map((index) => quads[index] as Quad)\n .filter(({ subject: { termType, value } }) => termType === 'BlankNode' && value === originalId)\n .map(({ predicate, object }) =>\n object.termType === 'BlankNode' ? predicate.value : predicate.value + object.value)\n .sorted()\n .join(),\n );\n\n for (const index of quadIndexes) {\n const quad = normalizedQuads[index] as Quad;\n const terms: Record<string, Term> = {\n subject: quad.subject as Term,\n object: quad.object as Term,\n };\n\n for (const [termName, termValue] of Object.entries(terms)) {\n if (termValue.termType !== 'BlankNode' || termValue.value !== originalId) continue;\n\n terms[termName] = new N3BlankNode(normalizedId) as Term;\n }\n\n arrayReplace(\n normalizedQuads,\n quad,\n new N3Quad(terms.subject as Term, quad.predicate as Term, terms.object as Term),\n );\n }\n }\n\n return normalizedQuads;\n}\n\nfunction normalizeQuads(quads: Quad[]): string {\n return quads\n .map((quad) => ' ' + quadToTurtle(quad))\n .sort()\n .join('\\n');\n}\n\nfunction preprocessSubjects(json: JsonLD): void {\n if (!json['@id']?.startsWith('#')) {\n return;\n }\n\n json['@id'] = ANONYMOUS_PREFIX + json['@id'];\n\n for (const [field, value] of Object.entries(json)) {\n if (typeof value !== 'object' || value === null || !('@id' in value)) {\n continue;\n }\n\n preprocessSubjects(json[field] as JsonLD);\n }\n}\n\nfunction postprocessSubjects(quads: Quad[]): void {\n for (const quad of quads) {\n if (quad.subject.value.startsWith(ANONYMOUS_PREFIX)) {\n quad.subject.value = quad.subject.value.slice(ANONYMOUS_PREFIX_LENGTH);\n }\n\n if (quad.object.value.startsWith(ANONYMOUS_PREFIX)) {\n quad.object.value = quad.object.value.slice(ANONYMOUS_PREFIX_LENGTH);\n }\n }\n}\n\nexport interface FetchSolidDocumentOptions {\n fetch?: Fetch;\n cache?: RequestCache;\n}\n\nexport interface ParsingOptions {\n baseIRI: string;\n normalizeBlankNodes: boolean;\n}\n\nexport interface RDFGraphData {\n quads: Quad[];\n containsRelativeIRIs: boolean;\n}\n\nexport async function createSolidDocument(url: string, body: string, fetch?: Fetch): Promise<SolidDocument> {\n fetch = fetch ?? window.fetch.bind(window);\n\n const statements = await turtleToQuads(body);\n\n await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/turtle' },\n body,\n });\n\n return new SolidDocument(url, statements, new Headers({}));\n}\n\nexport async function fetchSolidDocument(url: string, options?: FetchSolidDocumentOptions): Promise<SolidDocument> {\n const { body: data, headers } = await fetchRawSolidDocument(url, options);\n const statements = await turtleToQuads(data, { baseIRI: url });\n\n return new SolidDocument(url, statements, headers);\n}\n\nexport async function fetchSolidDocumentIfFound(\n url: string,\n options?: FetchSolidDocumentOptions,\n): Promise<SolidDocument | null> {\n try {\n const document = await fetchSolidDocument(url, options);\n\n return document;\n } catch (error) {\n if (!(error instanceof NotFoundError)) throw error;\n\n return null;\n }\n}\n\nexport async function jsonldToQuads(json: JsonLD, baseIRI?: string): Promise<Quad[]> {\n if (isJsonLDGraph(json)) {\n const graphQuads = await Promise.all(json['@graph'].map((resource) => jsonldToQuads(resource, baseIRI)));\n\n return graphQuads.flat();\n }\n\n preprocessSubjects(json);\n\n const quads = await (jsonld.toRDF(json as JsonLdDocument, { base: baseIRI }) as Promise<Quad[]>);\n\n postprocessSubjects(quads);\n\n return quads;\n}\n\nexport async function normalizeJsonLD(json: JsonLD, baseIRI?: string): Promise<JsonLD> {\n const quads = await jsonldToQuads(structuredClone(json), baseIRI);\n\n return quadsToJsonLD(quads);\n}\n\nexport function normalizeSparql(sparql: string): string {\n const quads = sparqlToQuadsSync(sparql);\n\n return Object.entries(quads)\n .reduce((normalizedOperations, [operation, _quads]) => {\n const normalizedQuads = normalizeQuads(_quads);\n\n return normalizedOperations.concat(`${operation.toUpperCase()} DATA {\\n${normalizedQuads}\\n}`);\n }, [] as string[])\n .join(' ;\\n');\n}\n\nexport function normalizeTurtle(sparql: string): string {\n const quads = turtleToQuadsSync(sparql);\n\n return normalizeQuads(quads);\n}\n\nexport function parseTurtle(turtle: string, options: Partial<ParsingOptions> = {}): Promise<RDFGraphData> {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.baseIRI });\n const parser = new Parser(parserOptions);\n const data: RDFGraphData = {\n quads: [],\n containsRelativeIRIs: false,\n };\n\n return new Promise((resolve, reject) => {\n const resolveRelativeIRI = parser._resolveRelativeIRI;\n\n parser._resolveRelativeIRI = (...args) => {\n data.containsRelativeIRIs = true;\n parser._resolveRelativeIRI = resolveRelativeIRI;\n\n return parser._resolveRelativeIRI(...args);\n };\n\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(options.baseIRI ?? null, SolidDocumentFormat.Turtle, error.message),\n );\n\n return;\n }\n\n if (!quad) {\n // data.quads = options.normalizeBlankNodes\n // ? normalizeBlankNodes(data.quads)\n // : data.quads;\n\n resolve(data);\n\n return;\n }\n\n data.quads.push(quad);\n });\n });\n}\n\nexport async function quadsToJsonLD(quads: Quad[]): Promise<JsonLDGraph> {\n const graph = await jsonld.fromRDF(quads);\n\n return {\n '@graph': graph as JsonLDResource[],\n };\n}\n\nexport function quadsToTurtle(quads: Quad[]): string {\n const writer = new Writer();\n\n return writer.quadsToString(quads);\n}\n\nexport function quadToTurtle(quad: Quad): string {\n const writer = new Writer();\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, options?: FetchSolidDocumentOptions): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, options);\n\n return !document.isEmpty();\n } catch (error) {\n return false;\n }\n}\n\nexport async function sparqlToQuads(\n sparql: string,\n options: Partial<ParsingOptions> = {},\n): Promise<Record<string, Quad[]>> {\n const operations = stringMatchAll<3>(sparql, /(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all(\n [...operations].map(async (operation) => {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = await turtleToQuads(operationBody, options);\n }),\n );\n\n return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = stringMatchAll<3>(sparql, /(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n for (const operation of operations) {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = turtleToQuadsSync(operationBody, options);\n }\n\n return quads;\n}\n\nexport async function turtleToQuads(turtle: string, options: Partial<ParsingOptions> = {}): Promise<Quad[]> {\n const { quads } = await parseTurtle(turtle, options);\n\n return quads;\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.baseIRI });\n const parser = new Parser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes ? normalizeBlankNodes(quads) : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(\n options.baseIRI ?? null,\n SolidDocumentFormat.Turtle,\n (error as Error).message ?? '',\n );\n }\n}\n\nexport async function updateSolidDocument(url: string, body: string, fetch?: Fetch): Promise<void> {\n fetch = fetch ?? window.fetch.bind(window);\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n"],"names":["errorMessage","documentUrl","documentFormat","malformationDetails","SolidDocumentFormat","MalformedSolidDocumentError","JSError","__publicField","NetworkRequestError","url","options","NotFoundError","responseStatus","UnauthorizedError","knownPrefixes","defineIRIPrefix","name","value","expandIRI","iri","prefix","expandedPrefix","_a","SolidThing","quads","property","quad","SolidStore","subject","predicate","object","statement","_statement","statements","term","SolidDocumentPermission","SolidDocument","headers","parseDate","dates","date","a","b","type","wacAllow","publicModes","stringMatch","arrayFilter","compactJsonLDGraph","json","compactedJsonLD","jsonld","isJsonLDGraph","ANONYMOUS_PREFIX","ANONYMOUS_PREFIX_LENGTH","fetchRawSolidDocument","requestOptions","response","error","normalizeBlankNodes","normalizedQuads","quadsIndexes","blankNodeIds","arr","index","tap","ids","id","originalId","quadIndexes","normalizedId","md5","termType","terms","termName","termValue","N3BlankNode","arrayReplace","N3Quad","normalizeQuads","quadToTurtle","preprocessSubjects","field","postprocessSubjects","createSolidDocument","body","fetch","turtleToQuads","fetchSolidDocument","data","fetchSolidDocumentIfFound","jsonldToQuads","baseIRI","resource","normalizeJsonLD","quadsToJsonLD","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","_quads","normalizeTurtle","turtleToQuadsSync","parseTurtle","turtle","parserOptions","objectWithoutEmpty","parser","Parser","resolve","reject","resolveRelativeIRI","args","quadsToTurtle","Writer","solidDocumentExists","sparqlToQuads","operations","stringMatchAll","operationName","operationBody","updateSolidDocument"],"mappings":"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"}
@@ -130,6 +130,8 @@ export declare class NetworkRequestError extends JSError {
130
130
  constructor(url: string, options?: JSErrorOptions);
131
131
  }
132
132
 
133
+ export declare function normalizeJsonLD(json: JsonLD, baseIRI?: string): Promise<JsonLD>;
134
+
133
135
  export declare function normalizeSparql(sparql: string): string;
134
136
 
135
137
  export declare function normalizeTurtle(sparql: string): string;
@@ -270,6 +272,14 @@ export declare type VitestSolidMatchers<R = unknown> = {
270
272
  export { }
271
273
 
272
274
 
275
+ declare module '@vitest/expect' {
276
+ interface Assertion<T> extends VitestSolidMatchers<T> {
277
+ }
278
+ interface AsymmetricMatchersContaining extends VitestSolidMatchers {
279
+ }
280
+ }
281
+
282
+
273
283
  declare global {
274
284
  namespace Chai {
275
285
  interface Assertion extends ChaiSolidAssertions {
@@ -278,11 +288,3 @@ declare global {
278
288
  }
279
289
  }
280
290
  }
281
-
282
-
283
- declare module '@vitest/expect' {
284
- interface Assertion<T> extends VitestSolidMatchers<T> {
285
- }
286
- interface AsymmetricMatchersContaining extends VitestSolidMatchers {
287
- }
288
- }
@@ -1,8 +1,8 @@
1
- var I = Object.defineProperty;
2
- var L = (t, e, r) => e in t ? I(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r;
3
- var f = (t, e, r) => L(t, typeof e != "symbol" ? e + "" : e, r);
4
- import { f as m, S as k, U as Q, c as H, u as J, d as N, e as z } from "./io-wCcrq4b9.js";
5
- import { M as yt, N as vt, h as Tt, w as gt, g as xt, x as Pt, y as Ut, m as bt, r as $t, v as Et, o as jt, j as St, b as Dt, n as qt, p as Ct, a as Rt, i as At, q as It, k as Lt, s as kt, l as Qt, t as Ht } from "./io-wCcrq4b9.js";
1
+ var L = Object.defineProperty;
2
+ var I = (t, e, r) => e in t ? L(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r;
3
+ var f = (t, e, r) => I(t, typeof e != "symbol" ? e + "" : e, r);
4
+ import { f as m, S as k, U as Q, c as z, u as J, d as H, e as N } from "./io-CT3AW8WO.js";
5
+ import { M as yt, N as vt, h as Tt, x as gt, g as xt, y as Pt, z as Ut, o as bt, v as $t, w as Et, r as jt, j as St, i as Dt, b as qt, n as Ct, p as Rt, a as At, k as Lt, q as It, l as kt, s as Qt, m as zt, t as Jt } from "./io-CT3AW8WO.js";
6
6
  import { JSError as E, silenced as j, urlRoot as O, urlRoute as W, urlParentDirectory as U, objectWithoutEmpty as h, arrayUnique as F, tap as M, objectDeepClone as _, urlParse as B, uuid as S, isObject as b, isArray as G, arr as V, urlResolve as K, requireUrlParentDirectory as D } from "@noeldemartin/utils";
7
7
  function X(t, e) {
8
8
  return e = e ?? t, typeof t == "string" ? `${t} (returned ${e.status} status code)` : `Request to ${e.url} returned ${e.status} status code`;
@@ -122,7 +122,7 @@ function ut(t) {
122
122
  async function rt(t, e, r) {
123
123
  r = r ?? window.fetch.bind(r);
124
124
  const a = t.storageUrls[0], o = `${a}settings/${e}TypeIndex`;
125
- return await N(o, { fetch: r }) ? `${a}settings/${e}TypeIndex-${S()}` : o;
125
+ return await H(o, { fetch: r }) ? `${a}settings/${e}TypeIndex-${S()}` : o;
126
126
  }
127
127
  async function q(t, e, r) {
128
128
  if (t.writableProfileUrl === null)
@@ -137,7 +137,7 @@ async function q(t, e, r) {
137
137
  <${t.webId}> <http://www.w3.org/ns/solid/terms#${e}TypeIndex> <${a}> .
138
138
  }
139
139
  `;
140
- return await H(a, o, r), await J(t.writableProfileUrl, s, r), a;
140
+ return await z(a, o, r), await J(t.writableProfileUrl, s, r), a;
141
141
  }
142
142
  async function C(t, e, r, a) {
143
143
  const o = await m(t, { fetch: a });
@@ -165,7 +165,7 @@ async function R(t, e) {
165
165
  }
166
166
  async function A(t, e, r) {
167
167
  r = r ?? await R(t, e);
168
- const a = await z(r ?? "", { fetch: e });
168
+ const a = await N(r ?? "", { fetch: e });
169
169
  if (!a)
170
170
  return A(D(t), e);
171
171
  if (a.isACPResource())
@@ -195,30 +195,31 @@ export {
195
195
  bt as compactJsonLDGraph,
196
196
  dt as createPrivateTypeIndex,
197
197
  lt as createPublicTypeIndex,
198
- H as createSolidDocument,
198
+ z as createSolidDocument,
199
199
  $t as defineIRIPrefix,
200
200
  Et as expandIRI,
201
201
  it as fetchLoginUserProfile,
202
202
  m as fetchSolidDocument,
203
203
  pt as fetchSolidDocumentACL,
204
- z as fetchSolidDocumentIfFound,
204
+ N as fetchSolidDocumentIfFound,
205
205
  ft as findContainerRegistrations,
206
206
  mt as findInstanceRegistrations,
207
207
  jt as isJsonLDGraph,
208
208
  St as jsonldToQuads,
209
209
  ct as mintJsonLDIdentifiers,
210
- Dt as normalizeSparql,
211
- qt as normalizeTurtle,
210
+ Dt as normalizeJsonLD,
211
+ qt as normalizeSparql,
212
+ Ct as normalizeTurtle,
212
213
  ut as parseResourceSubject,
213
- Ct as parseTurtle,
214
- Rt as quadToTurtle,
215
- At as quadsToJsonLD,
214
+ Rt as parseTurtle,
215
+ At as quadToTurtle,
216
+ Lt as quadsToJsonLD,
216
217
  It as quadsToTurtle,
217
- N as solidDocumentExists,
218
- Lt as sparqlToQuads,
219
- kt as sparqlToQuadsSync,
220
- Qt as turtleToQuads,
221
- Ht as turtleToQuadsSync,
218
+ H as solidDocumentExists,
219
+ kt as sparqlToQuads,
220
+ Qt as sparqlToQuadsSync,
221
+ zt as turtleToQuads,
222
+ Jt as turtleToQuadsSync,
222
223
  J as updateSolidDocument
223
224
  };
224
225
  //# sourceMappingURL=noeldemartin-solid-utils.js.map
package/dist/testing.d.ts CHANGED
@@ -22,6 +22,14 @@ export declare function turtleEquals(expected: string, actual: string): Equality
22
22
  export { }
23
23
 
24
24
 
25
+ declare module '@vitest/expect' {
26
+ interface Assertion<T> extends VitestSolidMatchers<T> {
27
+ }
28
+ interface AsymmetricMatchersContaining extends VitestSolidMatchers {
29
+ }
30
+ }
31
+
32
+
25
33
  declare global {
26
34
  namespace Chai {
27
35
  interface Assertion extends ChaiSolidAssertions {
@@ -30,11 +38,3 @@ declare global {
30
38
  }
31
39
  }
32
40
  }
33
-
34
-
35
- declare module '@vitest/expect' {
36
- interface Assertion<T> extends VitestSolidMatchers<T> {
37
- }
38
- interface AsymmetricMatchersContaining extends VitestSolidMatchers {
39
- }
40
- }
package/dist/testing.js CHANGED
@@ -1,4 +1,4 @@
1
- import { j as l, s as q, t as r } from "./helpers-DGXMj9cx.js";
1
+ import { j as l, s as q, t as r } from "./helpers-CIIrVGVG.js";
2
2
  export {
3
3
  l as jsonldEquals,
4
4
  q as sparqlEquals,
package/dist/vitest.d.ts CHANGED
@@ -32,6 +32,14 @@ export declare type VitestSolidMatchers<R = unknown> = {
32
32
  export { }
33
33
 
34
34
 
35
+ declare module '@vitest/expect' {
36
+ interface Assertion<T> extends VitestSolidMatchers<T> {
37
+ }
38
+ interface AsymmetricMatchersContaining extends VitestSolidMatchers {
39
+ }
40
+ }
41
+
42
+
35
43
  declare global {
36
44
  namespace Chai {
37
45
  interface Assertion extends ChaiSolidAssertions {
@@ -40,11 +48,3 @@ declare global {
40
48
  }
41
49
  }
42
50
  }
43
-
44
-
45
- declare module '@vitest/expect' {
46
- interface Assertion<T> extends VitestSolidMatchers<T> {
47
- }
48
- interface AsymmetricMatchersContaining extends VitestSolidMatchers {
49
- }
50
- }
package/dist/vitest.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { expect as l } from "vitest";
2
- import { n as r, b as i } from "./io-wCcrq4b9.js";
3
- import { t as o, s as u, j as c } from "./helpers-DGXMj9cx.js";
2
+ import { n as r, b as i } from "./io-CT3AW8WO.js";
3
+ import { t as o, s as u, j as c } from "./helpers-CIIrVGVG.js";
4
4
  function a(e, t) {
5
5
  const s = e.success, n = t.state.utils;
6
6
  return { pass: s, message: s ? () => [e.message, n.matcherHint(t.hint)].join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noeldemartin/solid-utils",
3
- "version": "0.6.0",
3
+ "version": "0.6.1-next.0d15181b9561088547ef2d0f22a04aef565e06bb",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -36,23 +36,29 @@
36
36
  "verify": "noeldemartin-verify"
37
37
  },
38
38
  "dependencies": {
39
- "@noeldemartin/utils": "^0.7.0",
39
+ "@noeldemartin/utils": "^0.7.1",
40
40
  "@rdfjs/types": "^2.0.1",
41
41
  "jsonld": "^8.3.3",
42
42
  "md5": "^2.3.0",
43
43
  "n3": "^1.24.2"
44
44
  },
45
45
  "devDependencies": {
46
+ "@arethetypeswrong/cli": "^0.17.4",
46
47
  "@noeldemartin/eslint-config-typescript": "^0.1.2",
47
- "@noeldemartin/scripts": "0.3.0-next.88fb0ff21ba1f9015dab043ded20be9518e51248",
48
- "@noeldemartin/testing": "0.0.0-next.cd489a93da5eaad3f89a4d9ae3734f7ef911b6f6",
48
+ "@noeldemartin/eslint-plugin": "^0.1.0",
49
+ "@noeldemartin/scripts": "next",
50
+ "@noeldemartin/testing": "next",
49
51
  "@tsconfig/node22": "^22.0.0",
50
52
  "@types/chai": "^5.2.0",
51
53
  "@types/jsonld": "^1.5.15",
52
54
  "@types/md5": "^2.3.5",
53
55
  "@types/n3": "^1.24.1",
54
56
  "@types/node": "^22.13.10",
57
+ "@typescript-eslint/eslint-plugin": "^5.6.0",
55
58
  "@vitest/expect": "^3.0.9",
59
+ "eslint": "^8.57.1",
60
+ "prettier-eslint-cli": "^8.0.1",
61
+ "publint": "^0.3.12",
56
62
  "typescript": "^5.8.2",
57
63
  "vite": "^6.2.2",
58
64
  "vite-plugin-dts": "4.5.0",
@@ -10,10 +10,9 @@ describe('Auth helpers', () => {
10
10
 
11
11
  it('reads NSS profiles', async () => {
12
12
  // Arrange
13
- const server = new FakeServer();
14
13
  const webId = 'https://alice.solidcommunity.net/profile/card#me';
15
14
 
16
- server.respondOnce(
15
+ FakeServer.respondOnce(
17
16
  'https://alice.solidcommunity.net/profile/card',
18
17
  FakeResponse.success(
19
18
  `
@@ -41,10 +40,10 @@ describe('Auth helpers', () => {
41
40
  );
42
41
 
43
42
  // Act
44
- const profile = await fetchLoginUserProfile(webId, { fetch: server.fetch });
43
+ const profile = await fetchLoginUserProfile(webId, { fetch: FakeServer.fetch });
45
44
 
46
45
  // Assert
47
- expect(server.getRequests()).toHaveLength(1);
46
+ expect(FakeServer.getRequests()).toHaveLength(1);
48
47
 
49
48
  expect(profile).toEqual({
50
49
  webId,
@@ -60,12 +59,11 @@ describe('Auth helpers', () => {
60
59
 
61
60
  it('reads ESS profiles (public)', async () => {
62
61
  // Arrange
63
- const server = new FakeServer();
64
62
  const webId = 'https://id.inrupt.com/alice';
65
63
 
66
64
  // The first request returns a 303 to `${webId}?lookup`,
67
65
  // but in order to simplify mocking requests we're assuming it doesn't.
68
- server.respondOnce(
66
+ FakeServer.respondOnce(
69
67
  'https://id.inrupt.com/alice',
70
68
  FakeResponse.success(`
71
69
  @prefix foaf: <http://xmlns.com/foaf/0.1/>.
@@ -81,16 +79,16 @@ describe('Auth helpers', () => {
81
79
  foaf:isPrimaryTopicOf <https://storage.inrupt.com/storage-hash/extendedProfile> .
82
80
  `),
83
81
  );
84
- server.respondOnce(
82
+ FakeServer.respondOnce(
85
83
  'https://storage.inrupt.com/storage-hash/extendedProfile',
86
84
  new FakeResponse(undefined, undefined, 401),
87
85
  );
88
86
 
89
87
  // Act
90
- const profile = await fetchLoginUserProfile(webId, { fetch: server.fetch });
88
+ const profile = await fetchLoginUserProfile(webId, { fetch: FakeServer.fetch });
91
89
 
92
90
  // Assert
93
- expect(server.getRequests()).toHaveLength(2);
91
+ expect(FakeServer.getRequests()).toHaveLength(2);
94
92
 
95
93
  expect(profile).toEqual({
96
94
  webId,
@@ -103,12 +101,11 @@ describe('Auth helpers', () => {
103
101
 
104
102
  it('reads ESS profiles (authenticated)', async () => {
105
103
  // Arrange
106
- const server = new FakeServer();
107
104
  const webId = 'https://id.inrupt.com/alice';
108
105
 
109
106
  // The first request returns a 303 to `${webId}?lookup`,
110
107
  // but in order to simplify mocking requests we're assuming it doesn't.
111
- server.respondOnce(
108
+ FakeServer.respondOnce(
112
109
  'https://id.inrupt.com/alice',
113
110
  FakeResponse.success(`
114
111
  @prefix foaf: <http://xmlns.com/foaf/0.1/>.
@@ -124,7 +121,7 @@ describe('Auth helpers', () => {
124
121
  foaf:isPrimaryTopicOf <https://storage.inrupt.com/storage-hash/extendedProfile> .
125
122
  `),
126
123
  );
127
- server.respondOnce(
124
+ FakeServer.respondOnce(
128
125
  'https://storage.inrupt.com/storage-hash/extendedProfile',
129
126
  FakeResponse.success(
130
127
  `
@@ -145,10 +142,10 @@ describe('Auth helpers', () => {
145
142
  );
146
143
 
147
144
  // Act
148
- const profile = await fetchLoginUserProfile(webId, { fetch: server.fetch });
145
+ const profile = await fetchLoginUserProfile(webId, { fetch: FakeServer.fetch });
149
146
 
150
147
  // Assert
151
- expect(server.getRequests()).toHaveLength(2);
148
+ expect(FakeServer.getRequests()).toHaveLength(2);
152
149
 
153
150
  expect(profile).toEqual({
154
151
  webId,
@@ -162,7 +159,6 @@ describe('Auth helpers', () => {
162
159
 
163
160
  it('reads use.id profiles', async () => {
164
161
  // Arrange
165
- const server = new FakeServer();
166
162
  const webId = 'https://use.id/alice';
167
163
  const profileTurtle = `
168
164
  @prefix foaf: <http://xmlns.com/foaf/0.1/>.
@@ -181,17 +177,20 @@ describe('Auth helpers', () => {
181
177
 
182
178
  // The first request returns a 303 to `${webId}/profile`,
183
179
  // but in order to simplify mocking requests we're assuming it doesn't.
184
- server.respondOnce('https://use.id/alice', FakeResponse.success(profileTurtle, { 'WAC-Allow': 'user="read"' }));
185
- server.respondOnce(
180
+ FakeServer.respondOnce(
181
+ 'https://use.id/alice',
182
+ FakeResponse.success(profileTurtle, { 'WAC-Allow': 'user="read"' }),
183
+ );
184
+ FakeServer.respondOnce(
186
185
  'https://use.id/alice/profile',
187
186
  FakeResponse.success(profileTurtle, { 'WAC-Allow': 'user="read"' }),
188
187
  );
189
188
 
190
189
  // Act
191
- const profile = await fetchLoginUserProfile(webId, { fetch: server.fetch });
190
+ const profile = await fetchLoginUserProfile(webId, { fetch: FakeServer.fetch });
192
191
 
193
192
  // Assert
194
- expect(server.getRequests()).toHaveLength(2);
193
+ expect(FakeServer.getRequests()).toHaveLength(2);
195
194
 
196
195
  expect(profile).toEqual({
197
196
  webId,
@@ -204,18 +203,17 @@ describe('Auth helpers', () => {
204
203
 
205
204
  it('throws errors reading required profiles', async () => {
206
205
  // Arrange
207
- const server = new FakeServer();
208
206
  const webId = 'https://pod.example.com/profile/card#me';
209
207
 
210
- server.respondOnce('https://pod.example.com/profile/card', FakeResponse.success('invalid turtle'));
208
+ FakeServer.respondOnce('https://pod.example.com/profile/card', FakeResponse.success('invalid turtle'));
211
209
 
212
210
  // Act
213
- const fetchProfile = fetchLoginUserProfile(webId, { fetch: server.fetch, required: true });
211
+ const fetchProfile = fetchLoginUserProfile(webId, { fetch: FakeServer.fetch, required: true });
214
212
 
215
213
  // Assert
216
214
  await expect(fetchProfile).rejects.toBeInstanceOf(MalformedSolidDocumentError);
217
215
 
218
- expect(server.getRequests()).toHaveLength(1);
216
+ expect(FakeServer.getRequests()).toHaveLength(1);
219
217
  });
220
218
 
221
219
  });
@@ -1,6 +1,13 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
- import { jsonldToQuads, normalizeSparql, quadsToJsonLD, sparqlToQuadsSync, turtleToQuadsSync } from './io';
3
+ import {
4
+ jsonldToQuads,
5
+ normalizeJsonLD,
6
+ normalizeSparql,
7
+ quadsToJsonLD,
8
+ sparqlToQuadsSync,
9
+ turtleToQuadsSync,
10
+ } from './io';
4
11
  import type { Quad } from '@rdfjs/types';
5
12
 
6
13
  describe('IO', () => {
@@ -200,6 +207,48 @@ describe('IO', () => {
200
207
  expect(quads[1].object.value).toEqual('John Doe');
201
208
  });
202
209
 
210
+ it('normalizes jsonld', async () => {
211
+ // Arrange
212
+ const json = {
213
+ '@graph': [
214
+ {
215
+ '@context': { '@vocab': 'https://schema.org/' },
216
+ '@id': '#it',
217
+ '@type': 'Movie',
218
+ 'name': 'Spirited Away',
219
+ },
220
+ {
221
+ '@context': { '@vocab': 'https://vocab.noeldemartin.com/crdt/' },
222
+ '@id': '#it-metadata',
223
+ '@type': 'Metadata',
224
+ 'resource': { '@id': '#it' },
225
+ },
226
+ ],
227
+ };
228
+
229
+ const clone = structuredClone(json);
230
+
231
+ // Act
232
+ const normalized = await normalizeJsonLD(json);
233
+
234
+ // Assert
235
+ expect(json).toEqual(clone);
236
+ expect(normalized).toEqual({
237
+ '@graph': [
238
+ {
239
+ '@id': '#it',
240
+ '@type': ['https://schema.org/Movie'],
241
+ 'https://schema.org/name': [{ '@value': 'Spirited Away' }],
242
+ },
243
+ {
244
+ '@id': '#it-metadata',
245
+ '@type': ['https://vocab.noeldemartin.com/crdt/Metadata'],
246
+ 'https://vocab.noeldemartin.com/crdt/resource': [{ '@id': '#it' }],
247
+ },
248
+ ],
249
+ });
250
+ });
251
+
203
252
  it('converts quads to jsonld', async () => {
204
253
  // Arrange
205
254
  const quads = turtleToQuadsSync(`