@noeldemartin/solid-utils 0.6.0-next.c7addc0a638eedd08392f2f42039946a876fe146 → 0.6.0-next.cea357c45d71b0c9b778bcf63049fce19ae3129f

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.
package/dist/chai.js CHANGED
@@ -1,4 +1,4 @@
1
- import { s as o, t as r } from "./helpers-CIIrVGVG.js";
1
+ import { s as o, t as r } from "./helpers-j4nIGcvg.js";
2
2
  const i = {
3
3
  turtle(t) {
4
4
  const s = this, c = s._obj, a = s.assert.bind(this), e = r(t, c);
@@ -1,5 +1,5 @@
1
1
  import { pull as g, arrayRemove as q, JSError as v, stringMatchAll as j } from "@noeldemartin/utils";
2
- import { j as m, q as T, s as E, a as y, t as w } from "./io-CT3AW8WO.js";
2
+ import { j as m, q as T, s as E, a as y, t as w } from "./io-BiadF9_D.js";
3
3
  let i = {};
4
4
  const Q = {
5
5
  "%uuid%": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
@@ -104,4 +104,4 @@ export {
104
104
  R as s,
105
105
  z as t
106
106
  };
107
- //# sourceMappingURL=helpers-CIIrVGVG.js.map
107
+ //# sourceMappingURL=helpers-j4nIGcvg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers-CIIrVGVG.js","sources":["../src/testing/helpers.ts"],"sourcesContent":["import { JSError, arrayRemove, pull, stringMatchAll } from '@noeldemartin/utils';\nimport type { Quad, Quad_Object } from '@rdfjs/types';\n\nimport {\n jsonldToQuads,\n quadToTurtle,\n quadsToTurtle,\n sparqlToQuadsSync,\n turtleToQuadsSync,\n} from '@noeldemartin/solid-utils/helpers/io';\nimport type { JsonLD } from '@noeldemartin/solid-utils/helpers/jsonld';\n\nlet patternsRegExpsIndex: Record<string, RegExp> = {};\nconst builtInPatterns: Record<string, string> = {\n '%uuid%': '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}',\n};\n\nclass ExpectedQuadAssertionError extends JSError {\n\n constructor(public readonly expectedQuad: Quad) {\n super(`Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n}\n\nfunction assertExpectedQuadsExist(expectedQuads: Quad[], actualQuads: Quad[]): void {\n for (const expectedQuad of expectedQuads) {\n const matchingQuad = actualQuads.find((actualQuad) => quadEquals(expectedQuad, actualQuad));\n\n if (!matchingQuad) throw new ExpectedQuadAssertionError(expectedQuad);\n\n arrayRemove(actualQuads, matchingQuad);\n }\n}\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[(.*\\]\\[)?([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction createPatternRegexp(expected: string): RegExp {\n const patternAliases = [];\n const patternMatches = stringMatchAll<4, 1 | 2>(expected, /\\[\\[((.*?)\\]\\[)?([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n patternMatch[2] && patternAliases.push(patternMatch[2]);\n\n patterns.push(patternMatch[3]);\n\n expectedRegExp = expectedRegExp.replace(patternMatch[0], `%PATTERN${patterns.length - 1}%`);\n }\n\n expectedRegExp = expectedRegExp.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\n for (const [patternIndex, pattern] of Object.entries(patterns)) {\n expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, builtInPatterns[pattern] ?? pattern);\n }\n\n return new RegExp(expectedRegExp);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n return containsPatterns(expected)\n ? (patternsRegExpsIndex[expected] ??= createPatternRegexp(expected)).test(actual)\n : expected === actual;\n}\n\nfunction quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {\n if (expected.termType !== actual.termType) return false;\n\n if (expected.termType === 'Literal' && actual.termType === 'Literal') {\n if (expected.datatype.value !== actual.datatype.value) return false;\n\n if (!containsPatterns(expected.value))\n return expected.datatype.value === 'http://www.w3.org/2001/XMLSchema#dateTime'\n ? new Date(expected.value).getTime() === new Date(actual.value).getTime()\n : expected.value === actual.value;\n }\n\n return quadValueEquals(expected.value, actual.value);\n}\n\nfunction quadEquals(expected: Quad, actual: Quad): boolean {\n return (\n quadObjectEquals(expected.object, actual.object) &&\n quadValueEquals(expected.subject.value, actual.subject.value) &&\n quadValueEquals(expected.predicate.value, actual.predicate.value)\n );\n}\n\nfunction resetPatterns(): void {\n patternsRegExpsIndex = {};\n}\n\nexport interface EqualityResult {\n success: boolean;\n message: string;\n expected: string;\n actual: string;\n}\n\nexport async function jsonldEquals(expected: JsonLD, actual: JsonLD): Promise<EqualityResult> {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedQuads = await jsonldToQuads(expected);\n const actualQuads = await jsonldToQuads(actual);\n const expectedTurtle = quadsToTurtle(expectedQuads);\n const actualTurtle = quadsToTurtle(actualQuads);\n const result = (success: boolean, message: string) => ({\n success,\n message,\n expected: expectedTurtle,\n actual: actualTurtle,\n });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n try {\n assertExpectedQuadsExist(expectedQuads, actualQuads);\n } catch (error) {\n if (!(error instanceof ExpectedQuadAssertionError)) throw error;\n\n return result(false, error.message);\n }\n\n return result(true, 'jsonld matches');\n}\n\nexport function sparqlEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedOperations = sparqlToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualOperations = sparqlToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n for (const operation of Object.keys(expectedOperations)) {\n if (!(operation in actualOperations)) return result(false, `Couldn't find expected ${operation} operation.`);\n\n const expectedQuads = pull(expectedOperations, operation);\n const actualQuads = pull(actualOperations, operation);\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} ${operation} triples, found ${actualQuads.length}.`);\n\n try {\n assertExpectedQuadsExist(expectedQuads, actualQuads);\n } catch (error) {\n if (!(error instanceof ExpectedQuadAssertionError)) throw error;\n\n return result(\n false,\n `Couldn't find the following ${operation} triple: ${quadToTurtle(error.expectedQuad)}`,\n );\n }\n }\n\n const unexpectedOperation = Object.keys(actualOperations)[0] ?? null;\n if (unexpectedOperation) return result(false, `Did not expect to find ${unexpectedOperation} triples.`);\n\n return result(true, 'sparql matches');\n}\n\nexport function turtleEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedQuads = turtleToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualQuads = turtleToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n try {\n assertExpectedQuadsExist(expectedQuads, actualQuads);\n } catch (error) {\n if (!(error instanceof ExpectedQuadAssertionError)) throw error;\n\n return result(false, error.message);\n }\n\n return result(true, 'turtle matches');\n}\n"],"names":["patternsRegExpsIndex","builtInPatterns","ExpectedQuadAssertionError","JSError","expectedQuad","quadToTurtle","assertExpectedQuadsExist","expectedQuads","actualQuads","matchingQuad","actualQuad","quadEquals","arrayRemove","containsPatterns","value","createPatternRegexp","expected","patternAliases","patternMatches","stringMatchAll","patterns","expectedRegExp","patternMatch","patternIndex","pattern","quadValueEquals","actual","quadObjectEquals","resetPatterns","jsonldEquals","jsonldToQuads","expectedTurtle","quadsToTurtle","actualTurtle","result","success","message","error","sparqlEquals","expectedOperations","sparqlToQuadsSync","actualOperations","operation","pull","unexpectedOperation","turtleEquals","turtleToQuadsSync"],"mappings":"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"}
1
+ {"version":3,"file":"helpers-j4nIGcvg.js","sources":["../src/testing/helpers.ts"],"sourcesContent":["import { JSError, arrayRemove, pull, stringMatchAll } from '@noeldemartin/utils';\nimport type { Quad, Quad_Object } from '@rdfjs/types';\n\nimport {\n jsonldToQuads,\n quadToTurtle,\n quadsToTurtle,\n sparqlToQuadsSync,\n turtleToQuadsSync,\n} from '@noeldemartin/solid-utils/helpers/io';\nimport type { JsonLD } from '@noeldemartin/solid-utils/helpers/jsonld';\n\nlet patternsRegExpsIndex: Record<string, RegExp> = {};\nconst builtInPatterns: Record<string, string> = {\n '%uuid%': '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}',\n};\n\nclass ExpectedQuadAssertionError extends JSError {\n\n constructor(public readonly expectedQuad: Quad) {\n super(`Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n}\n\nfunction assertExpectedQuadsExist(expectedQuads: Quad[], actualQuads: Quad[]): void {\n for (const expectedQuad of expectedQuads) {\n const matchingQuad = actualQuads.find((actualQuad) => quadEquals(expectedQuad, actualQuad));\n\n if (!matchingQuad) throw new ExpectedQuadAssertionError(expectedQuad);\n\n arrayRemove(actualQuads, matchingQuad);\n }\n}\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[(.*\\]\\[)?([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction createPatternRegexp(expected: string): RegExp {\n const patternAliases = [];\n const patternMatches = stringMatchAll<4, 1 | 2>(expected, /\\[\\[((.*?)\\]\\[)?([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n patternMatch[2] && patternAliases.push(patternMatch[2]);\n\n patterns.push(patternMatch[3]);\n\n expectedRegExp = expectedRegExp.replace(patternMatch[0], `%PATTERN${patterns.length - 1}%`);\n }\n\n expectedRegExp = expectedRegExp.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\n for (const [patternIndex, pattern] of Object.entries(patterns)) {\n expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, builtInPatterns[pattern] ?? pattern);\n }\n\n return new RegExp(expectedRegExp);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n return containsPatterns(expected)\n ? (patternsRegExpsIndex[expected] ??= createPatternRegexp(expected)).test(actual)\n : expected === actual;\n}\n\nfunction quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {\n if (expected.termType !== actual.termType) return false;\n\n if (expected.termType === 'Literal' && actual.termType === 'Literal') {\n if (expected.datatype.value !== actual.datatype.value) return false;\n\n if (!containsPatterns(expected.value))\n return expected.datatype.value === 'http://www.w3.org/2001/XMLSchema#dateTime'\n ? new Date(expected.value).getTime() === new Date(actual.value).getTime()\n : expected.value === actual.value;\n }\n\n return quadValueEquals(expected.value, actual.value);\n}\n\nfunction quadEquals(expected: Quad, actual: Quad): boolean {\n return (\n quadObjectEquals(expected.object, actual.object) &&\n quadValueEquals(expected.subject.value, actual.subject.value) &&\n quadValueEquals(expected.predicate.value, actual.predicate.value)\n );\n}\n\nfunction resetPatterns(): void {\n patternsRegExpsIndex = {};\n}\n\nexport interface EqualityResult {\n success: boolean;\n message: string;\n expected: string;\n actual: string;\n}\n\nexport async function jsonldEquals(expected: JsonLD, actual: JsonLD): Promise<EqualityResult> {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedQuads = await jsonldToQuads(expected);\n const actualQuads = await jsonldToQuads(actual);\n const expectedTurtle = quadsToTurtle(expectedQuads);\n const actualTurtle = quadsToTurtle(actualQuads);\n const result = (success: boolean, message: string) => ({\n success,\n message,\n expected: expectedTurtle,\n actual: actualTurtle,\n });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n try {\n assertExpectedQuadsExist(expectedQuads, actualQuads);\n } catch (error) {\n if (!(error instanceof ExpectedQuadAssertionError)) throw error;\n\n return result(false, error.message);\n }\n\n return result(true, 'jsonld matches');\n}\n\nexport function sparqlEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedOperations = sparqlToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualOperations = sparqlToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n for (const operation of Object.keys(expectedOperations)) {\n if (!(operation in actualOperations)) return result(false, `Couldn't find expected ${operation} operation.`);\n\n const expectedQuads = pull(expectedOperations, operation);\n const actualQuads = pull(actualOperations, operation);\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} ${operation} triples, found ${actualQuads.length}.`);\n\n try {\n assertExpectedQuadsExist(expectedQuads, actualQuads);\n } catch (error) {\n if (!(error instanceof ExpectedQuadAssertionError)) throw error;\n\n return result(\n false,\n `Couldn't find the following ${operation} triple: ${quadToTurtle(error.expectedQuad)}`,\n );\n }\n }\n\n const unexpectedOperation = Object.keys(actualOperations)[0] ?? null;\n if (unexpectedOperation) return result(false, `Did not expect to find ${unexpectedOperation} triples.`);\n\n return result(true, 'sparql matches');\n}\n\nexport function turtleEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedQuads = turtleToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualQuads = turtleToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n try {\n assertExpectedQuadsExist(expectedQuads, actualQuads);\n } catch (error) {\n if (!(error instanceof ExpectedQuadAssertionError)) throw error;\n\n return result(false, error.message);\n }\n\n return result(true, 'turtle matches');\n}\n"],"names":["patternsRegExpsIndex","builtInPatterns","ExpectedQuadAssertionError","JSError","expectedQuad","quadToTurtle","assertExpectedQuadsExist","expectedQuads","actualQuads","matchingQuad","actualQuad","quadEquals","arrayRemove","containsPatterns","value","createPatternRegexp","expected","patternAliases","patternMatches","stringMatchAll","patterns","expectedRegExp","patternMatch","patternIndex","pattern","quadValueEquals","actual","quadObjectEquals","resetPatterns","jsonldEquals","jsonldToQuads","expectedTurtle","quadsToTurtle","actualTurtle","result","success","message","error","sparqlEquals","expectedOperations","sparqlToQuadsSync","actualOperations","operation","pull","unexpectedOperation","turtleEquals","turtleToQuadsSync"],"mappings":"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"}
@@ -277,7 +277,7 @@ async function E(r, t) {
277
277
  return tt(e), e;
278
278
  }
279
279
  async function pt(r, t) {
280
- const e = await E(structuredClone(r), t);
280
+ const e = await E(r, t);
281
281
  return rt(e);
282
282
  }
283
283
  function wt(r) {
@@ -407,4 +407,4 @@ export {
407
407
  Y as y,
408
408
  H as z
409
409
  };
410
- //# sourceMappingURL=io-CT3AW8WO.js.map
410
+ //# sourceMappingURL=io-BiadF9_D.js.map
@@ -1 +1 @@
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":";;;;;;;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,OAAK3B,IAAA2B,EAAK,KAAK,MAAV,QAAA3B,EAAa,WAAW,MAI7B;AAAA,IAAA2B,EAAK,KAAK,IAAII,IAAmBJ,EAAK,KAAK;AAE3C,eAAW,CAACiC,GAAOjE,CAAK,KAAK,OAAO,QAAQgC,CAAI;AAC5C,MAAI,OAAOhC,KAAU,YAAYA,MAAU,QAAQ,EAAE,SAASA,MAI3CgE,EAAAhC,EAAKiC,CAAK,CAAW;AAAA;AAEhD;AAEA,SAASC,GAAoB3D,GAAqB;AAC9C,aAAWE,KAAQF;AACf,IAAIE,EAAK,QAAQ,MAAM,WAAW2B,CAAgB,MAC9C3B,EAAK,QAAQ,QAAQA,EAAK,QAAQ,MAAM,MAAM4B,CAAuB,IAGrE5B,EAAK,OAAO,MAAM,WAAW2B,CAAgB,MAC7C3B,EAAK,OAAO,QAAQA,EAAK,OAAO,MAAM,MAAM4B,CAAuB;AAG/E;AAiBsB,eAAA8B,GAAoB3E,GAAa4E,GAAcC,GAAuC;AACxG,EAAAA,IAAQA,KAAS,OAAO,MAAM,KAAK,MAAM;AAEnC,QAAArD,IAAa,MAAMsD,EAAcF,CAAI;AAE3C,eAAMC,EAAM7E,GAAK;AAAA,IACb,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,cAAc;AAAA,IACzC,MAAA4E;AAAA,EAAA,CACH,GAEM,IAAIjD,EAAc3B,GAAKwB,GAAY,IAAI,QAAQ,CAAA,CAAE,CAAC;AAC7D;AAEsB,eAAAuD,EAAmB/E,GAAaC,GAA6D;AACzG,QAAA,EAAE,MAAM+E,GAAM,SAAApD,MAAY,MAAMkB,EAAsB9C,GAAKC,CAAO,GAClEuB,IAAa,MAAMsD,EAAcE,GAAM,EAAE,SAAShF,GAAK;AAE7D,SAAO,IAAI2B,EAAc3B,GAAKwB,GAAYI,CAAO;AACrD;AAEsB,eAAAqD,GAClBjF,GACAC,GAC6B;AACzB,MAAA;AAGO,WAFU,MAAM8E,EAAmB/E,GAAKC,CAAO;AAAA,WAGjDgD,GAAO;AACR,QAAA,EAAEA,aAAiB/C,GAAsB,OAAA+C;AAEtC,WAAA;AAAA,EAAA;AAEf;AAEsB,eAAAiC,EAAc1C,GAAc2C,GAAmC;AAC7E,MAAAxC,EAAcH,CAAI;AAGlB,YAFmB,MAAM,QAAQ,IAAIA,EAAK,QAAQ,EAAE,IAAI,CAAC4C,MAAaF,EAAcE,GAAUD,CAAO,CAAC,CAAC,GAErF,KAAK;AAG3B,EAAAX,EAAmBhC,CAAI;AAEjB,QAAAzB,IAAQ,MAAO2B,EAAO,MAAMF,GAAwB,EAAE,MAAM2C,GAAS;AAE3E,SAAAT,GAAoB3D,CAAK,GAElBA;AACX;AAEsB,eAAAsE,GAAgB7C,GAAc2C,GAAmC;AACnF,QAAMpE,IAAQ,MAAMmE,EAAc,gBAAgB1C,CAAI,GAAG2C,CAAO;AAEhE,SAAOG,GAAcvE,CAAK;AAC9B;AAEO,SAASwE,GAAgBC,GAAwB;AAC9C,QAAAzE,IAAQ0E,GAAkBD,CAAM;AAE/B,SAAA,OAAO,QAAQzE,CAAK,EACtB,OAAO,CAAC2E,GAAsB,CAACC,GAAWC,CAAM,MAAM;AAC7C,UAAAzC,IAAkBmB,EAAesB,CAAM;AAE7C,WAAOF,EAAqB,OAAO,GAAGC,EAAU,aAAa;AAAA,EAAYxC,CAAe;AAAA,EAAK;AAAA,EAAA,GAC9F,CAAc,CAAA,EAChB,KAAK;AAAA,CAAM;AACpB;AAEO,SAAS0C,GAAgBL,GAAwB;AAC9C,QAAAzE,IAAQ+E,EAAkBN,CAAM;AAEtC,SAAOlB,EAAevD,CAAK;AAC/B;AAEO,SAASgF,GAAYC,GAAgB/F,IAAmC,IAA2B;AACtG,QAAMgG,IAAgBC,EAAmB,EAAE,SAASjG,EAAQ,SAAS,GAC/DkG,IAAS,IAAIC,EAAOH,CAAa,GACjCjB,IAAqB;AAAA,IACvB,OAAO,CAAC;AAAA,IACR,sBAAsB;AAAA,EAC1B;AAEA,SAAO,IAAI,QAAQ,CAACqB,GAASC,MAAW;AACpC,UAAMC,IAAqBJ,EAAO;AAE3B,IAAAA,EAAA,sBAAsB,IAAIK,OAC7BxB,EAAK,uBAAuB,IAC5BmB,EAAO,sBAAsBI,GAEtBJ,EAAO,oBAAoB,GAAGK,CAAI,IAG7CL,EAAO,MAAMH,GAAQ,CAAC/C,GAAOhC,MAAS;AAClC,UAAIgC,GAAO;AACP,QAAAqD;AAAA,UACI,IAAI1G,EAA4BK,EAAQ,WAAW,MAAMN,EAAoB,QAAQsD,EAAM,OAAO;AAAA,QACtG;AAEA;AAAA,MAAA;AAGJ,UAAI,CAAChC,GAAM;AAKP,QAAAoF,EAAQrB,CAAI;AAEZ;AAAA,MAAA;AAGC,MAAAA,EAAA,MAAM,KAAK/D,CAAI;AAAA,IAAA,CACvB;AAAA,EAAA,CACJ;AACL;AAEA,eAAsBqE,GAAcvE,GAAqC;AAG9D,SAAA;AAAA,IACH,UAHU,MAAM2B,EAAO,QAAQ3B,CAAK;AAAA,EAIxC;AACJ;AAEO,SAAS0F,GAAc1F,GAAuB;AAG1C,SAFQ,IAAI2F,EAAO,EAEZ,cAAc3F,CAAK;AACrC;AAEO,SAASwD,GAAatD,GAAoB;AAGtC,SAFQ,IAAIyF,EAAO,EAEZ,cAAc,CAACzF,CAAI,CAAC,EAAE,MAAM,GAAG,EAAE;AACnD;AAEsB,eAAA0F,GAAoB3G,GAAaC,GAAuD;AACtG,MAAA;AAGO,WAAA,EAFU,MAAM8E,EAAmB/E,GAAKC,CAAO,GAErC,QAAQ;AAAA,UACb;AACL,WAAA;AAAA,EAAA;AAEf;AAEA,eAAsB2G,GAClBpB,GACAvF,IAAmC,IACJ;AACzB,QAAA4G,IAAaC,EAAkBtB,GAAQ,uBAAuB,GAC9DzE,IAAgC,CAAC;AAEvC,eAAM,QAAQ;AAAA,IACV,CAAC,GAAG8F,CAAU,EAAE,IAAI,OAAOlB,MAAc;AACrC,YAAMoB,IAAgBpB,EAAU,CAAC,EAAE,YAAY,GACzCqB,IAAgBrB,EAAU,CAAC;AAEjC,MAAA5E,EAAMgG,CAAa,IAAI,MAAMjC,EAAckC,GAAe/G,CAAO;AAAA,IACpE,CAAA;AAAA,EACL,GAEOc;AACX;AAEO,SAAS0E,GAAkBD,GAAgBvF,IAAmC,IAA4B;AACvG,QAAA4G,IAAaC,EAAkBtB,GAAQ,uBAAuB,GAC9DzE,IAAgC,CAAC;AAEvC,aAAW4E,KAAakB,GAAY;AAChC,UAAME,IAAgBpB,EAAU,CAAC,EAAE,YAAY,GACzCqB,IAAgBrB,EAAU,CAAC;AAEjC,IAAA5E,EAAMgG,CAAa,IAAIjB,EAAkBkB,GAAe/G,CAAO;AAAA,EAAA;AAG5D,SAAAc;AACX;AAEA,eAAsB+D,EAAckB,GAAgB/F,IAAmC,IAAqB;AACxG,QAAM,EAAE,OAAAc,EAAM,IAAI,MAAMgF,GAAYC,GAAQ/F,CAAO;AAE5C,SAAAc;AACX;AAEO,SAAS+E,EAAkBE,GAAgB/F,IAAmC,IAAY;AAC7F,QAAMgG,IAAgBC,EAAmB,EAAE,SAASjG,EAAQ,SAAS,GAC/DkG,IAAS,IAAIC,EAAOH,CAAa;AAEnC,MAAA;AACM,UAAAlF,IAAQoF,EAAO,MAAMH,CAAM;AAEjC,WAAO/F,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,eAAAgE,GAAoBjH,GAAa4E,GAAcC,GAA8B;AAC/F,EAAAA,IAAQA,KAAS,OAAO,MAAM,KAAK,MAAM,GAEzC,MAAMA,EAAM7E,GAAK;AAAA,IACb,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,4BAA4B;AAAA,IACvD,MAAA4E;AAAA,EAAA,CACH;AACL;"}
1
+ {"version":3,"file":"io-BiadF9_D.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(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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"}
@@ -1,8 +1,8 @@
1
1
  var L = Object.defineProperty;
2
2
  var I = (t, e, r) => e in t ? L(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r;
3
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";
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-BiadF9_D.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-BiadF9_D.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`;
package/dist/testing.js CHANGED
@@ -1,4 +1,4 @@
1
- import { j as l, s as q, t as r } from "./helpers-CIIrVGVG.js";
1
+ import { j as l, s as q, t as r } from "./helpers-j4nIGcvg.js";
2
2
  export {
3
3
  l as jsonldEquals,
4
4
  q as sparqlEquals,
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-CT3AW8WO.js";
3
- import { t as o, s as u, j as c } from "./helpers-CIIrVGVG.js";
2
+ import { n as r, b as i } from "./io-BiadF9_D.js";
3
+ import { t as o, s as u, j as c } from "./helpers-j4nIGcvg.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-next.c7addc0a638eedd08392f2f42039946a876fe146",
3
+ "version": "0.6.0-next.cea357c45d71b0c9b778bcf63049fce19ae3129f",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -226,13 +226,10 @@ describe('IO', () => {
226
226
  ],
227
227
  };
228
228
 
229
- const clone = structuredClone(json);
230
-
231
229
  // Act
232
230
  const normalized = await normalizeJsonLD(json);
233
231
 
234
232
  // Assert
235
- expect(json).toEqual(clone);
236
233
  expect(normalized).toEqual({
237
234
  '@graph': [
238
235
  {
package/src/helpers/io.ts CHANGED
@@ -213,7 +213,7 @@ export async function jsonldToQuads(json: JsonLD, baseIRI?: string): Promise<Qua
213
213
  }
214
214
 
215
215
  export async function normalizeJsonLD(json: JsonLD, baseIRI?: string): Promise<JsonLD> {
216
- const quads = await jsonldToQuads(structuredClone(json), baseIRI);
216
+ const quads = await jsonldToQuads(json, baseIRI);
217
217
 
218
218
  return quadsToJsonLD(quads);
219
219
  }