{"version":3,"file":"rdfUtils.mjs","names":["createQuad","quad"],"sources":["../../src/util/rdfUtils.ts"],"sourcesContent":["import type { LdoDataset } from \"@ldo/ldo\";\nimport { parseRdf } from \"@ldo/ldo\";\nimport { namedNode, quad as createQuad } from \"@ldo/rdf-utils\";\nimport type { Dataset } from \"@rdfjs/types\";\nimport type { SolidContainerUri } from \"../types\";\nimport { isSolidContainerUri } from \"./isSolidUri\";\n\nexport const ldpContains = namedNode(\"http://www.w3.org/ns/ldp#contains\");\nexport const rdfType = namedNode(\n  \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\",\n);\nexport const ldpResource = namedNode(\"http://www.w3.org/ns/ldp#Resource\");\nexport const ldpContainer = namedNode(\"http://www.w3.org/ns/ldp#Container\");\nexport const ldpBasicContainer = namedNode(\n  \"http://www.w3.org/ns/ldp#BasicContainer\",\n);\n\n/**\n * @internal\n * Gets the URI of a parent according the the Solid Spec\n *\n * @param uri - the child URI\n * @returns A parent URI or undefined if not possible\n */\nexport function getParentUri(uri: string): SolidContainerUri | undefined {\n  const urlObject = new URL(uri);\n  const pathItems = urlObject.pathname.split(\"/\");\n  if (\n    pathItems.length < 2 ||\n    (pathItems.length === 2 && pathItems[1].length === 0)\n  ) {\n    return undefined;\n  }\n  if (pathItems[pathItems.length - 1] === \"\") {\n    pathItems.pop();\n  }\n  pathItems.pop();\n  urlObject.pathname = `${pathItems.join(\"/\")}/`;\n  return urlObject.toString() as SolidContainerUri;\n}\n\n/**\n * @internal\n * Gets the slug (last part of the path) for a given URI\n *\n * @param uri - the full URI\n * @returns the slug of the URI\n */\nexport function getSlug(uri: string): string {\n  const urlObject = new URL(uri);\n  const pathItems = urlObject.pathname.split(\"/\");\n  return pathItems[pathItems.length - 1] || pathItems[pathItems.length - 2];\n}\n\n/**\n * @internal\n * Deletes mention of a resource from the provided dataset\n *\n * @param resourceUri - the resource to delete\n * @param dataset - dataset to modify\n */\nexport function deleteResourceRdfFromContainer(\n  resourceUri: string,\n  dataset: Dataset,\n) {\n  const parentUri = getParentUri(resourceUri);\n  if (parentUri) {\n    const parentNode = namedNode(parentUri);\n    const resourceNode = namedNode(resourceUri);\n    dataset.delete(\n      createQuad(parentNode, ldpContains, resourceNode, parentNode),\n    );\n    dataset.deleteMatches(resourceNode, undefined, undefined, parentNode);\n  }\n}\n\n/**\n * @internal\n * Adds a resource to a container in an RDF dataset\n *\n * @param resourceUri - the resource to add\n * @param dataset - the dataset to modify\n */\nexport function addResourceRdfToContainer(\n  resourceUri: string,\n  dataset: Dataset,\n) {\n  const parentUri = getParentUri(resourceUri);\n  if (parentUri) {\n    const parentNode = namedNode(parentUri);\n    const resourceNode = namedNode(resourceUri);\n    dataset.add(createQuad(parentNode, ldpContains, resourceNode, parentNode));\n    dataset.add(createQuad(resourceNode, rdfType, ldpResource, parentNode));\n    if (isSolidContainerUri(resourceUri)) {\n      dataset.add(\n        createQuad(resourceNode, rdfType, ldpBasicContainer, parentNode),\n      );\n      dataset.add(createQuad(resourceNode, rdfType, ldpContainer, parentNode));\n    }\n    addResourceRdfToContainer(parentUri, dataset);\n  }\n}\n\n/**\n * @internal\n * Adds raw turtle to the provided dataset\n * @param rawTurtle - String of raw turtle\n * @param dataset - the dataset to modify\n * @param baseUri - base URI to parsing turtle\n * @returns Undefined if successful, noncompliantPodError if not\n */\nexport async function addRawTurtleToDataset(\n  rawTurtle: string,\n  dataset: Dataset,\n  baseUri: string,\n): Promise<undefined | Error> {\n  const rawTurtleResult = await rawTurtleToDataset(rawTurtle, baseUri);\n  if (rawTurtleResult instanceof Error) return rawTurtleResult;\n  const loadedDataset = rawTurtleResult;\n  const graphNode = namedNode(baseUri);\n  // Destroy all triples that were once a part of this resouce\n  dataset.deleteMatches(undefined, undefined, undefined, graphNode);\n  // Add the triples from the fetched item\n  dataset.addAll(\n    loadedDataset.map((quad) =>\n      createQuad(quad.subject, quad.predicate, quad.object, graphNode),\n    ),\n  );\n}\n\n/**\n * @internal\n * Creates a dataset from raw turtle string\n * @param rawTurtle - the Raw turtle string\n * @param baseUri - A base url for relative uris\n * @returns LdoDataset or Error\n */\nexport async function rawTurtleToDataset(\n  rawTurtle: string,\n  baseUri: string,\n): Promise<LdoDataset | Error> {\n  try {\n    const loadedDataset = await parseRdf(rawTurtle, {\n      baseIRI: baseUri,\n    });\n    return loadedDataset;\n  } catch (err) {\n    const message = err instanceof Error ? err.message : \"\";\n    return new Error(\n      `Request returned noncompliant turtle: ${message}\\n${rawTurtle}`,\n    );\n  }\n}\n"],"mappings":";;;;AAOA,MAAa,cAAc,UAAU,oCAAoC;AACzE,MAAa,UAAU,UACrB,kDACD;AACD,MAAa,cAAc,UAAU,oCAAoC;AACzE,MAAa,eAAe,UAAU,qCAAqC;AAC3E,MAAa,oBAAoB,UAC/B,0CACD;;;;;;;;AASD,SAAgB,aAAa,KAA4C;CACvE,MAAM,YAAY,IAAI,IAAI,IAAI;CAC9B,MAAM,YAAY,UAAU,SAAS,MAAM,IAAI;AAC/C,KACE,UAAU,SAAS,KAClB,UAAU,WAAW,KAAK,UAAU,GAAG,WAAW,EAEnD;AAEF,KAAI,UAAU,UAAU,SAAS,OAAO,GACtC,WAAU,KAAK;AAEjB,WAAU,KAAK;AACf,WAAU,WAAW,GAAG,UAAU,KAAK,IAAI,CAAC;AAC5C,QAAO,UAAU,UAAU;;;;;;;;;AAU7B,SAAgB,QAAQ,KAAqB;CAE3C,MAAM,YAAY,IADI,IAAI,IACC,CAAC,SAAS,MAAM,IAAI;AAC/C,QAAO,UAAU,UAAU,SAAS,MAAM,UAAU,UAAU,SAAS;;;;;;;;;AAUzE,SAAgB,+BACd,aACA,SACA;CACA,MAAM,YAAY,aAAa,YAAY;AAC3C,KAAI,WAAW;EACb,MAAM,aAAa,UAAU,UAAU;EACvC,MAAM,eAAe,UAAU,YAAY;AAC3C,UAAQ,OACNA,KAAW,YAAY,aAAa,cAAc,WAAW,CAC9D;AACD,UAAQ,cAAc,cAAc,KAAA,GAAW,KAAA,GAAW,WAAW;;;;;;;;;;AAWzE,SAAgB,0BACd,aACA,SACA;CACA,MAAM,YAAY,aAAa,YAAY;AAC3C,KAAI,WAAW;EACb,MAAM,aAAa,UAAU,UAAU;EACvC,MAAM,eAAe,UAAU,YAAY;AAC3C,UAAQ,IAAIA,KAAW,YAAY,aAAa,cAAc,WAAW,CAAC;AAC1E,UAAQ,IAAIA,KAAW,cAAc,SAAS,aAAa,WAAW,CAAC;AACvE,MAAI,oBAAoB,YAAY,EAAE;AACpC,WAAQ,IACNA,KAAW,cAAc,SAAS,mBAAmB,WAAW,CACjE;AACD,WAAQ,IAAIA,KAAW,cAAc,SAAS,cAAc,WAAW,CAAC;;AAE1E,4BAA0B,WAAW,QAAQ;;;;;;;;;;;AAYjD,eAAsB,sBACpB,WACA,SACA,SAC4B;CAC5B,MAAM,kBAAkB,MAAM,mBAAmB,WAAW,QAAQ;AACpE,KAAI,2BAA2B,MAAO,QAAO;CAC7C,MAAM,gBAAgB;CACtB,MAAM,YAAY,UAAU,QAAQ;AAEpC,SAAQ,cAAc,KAAA,GAAW,KAAA,GAAW,KAAA,GAAW,UAAU;AAEjE,SAAQ,OACN,cAAc,KAAK,WACjBA,KAAWC,OAAK,SAASA,OAAK,WAAWA,OAAK,QAAQ,UAAU,CACjE,CACF;;;;;;;;;AAUH,eAAsB,mBACpB,WACA,SAC6B;AAC7B,KAAI;AAIF,SAAO,MAHqB,SAAS,WAAW,EAC9C,SAAS,SACV,CAAC;UAEK,KAAK;EACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,yBAAO,IAAI,MACT,yCAAyC,QAAQ,IAAI,YACtD"}