@noeldemartin/solid-utils 0.1.1-next.0138d472d679413be54bc014f8cf21f03a1e1c3c → 0.1.1-next.1f0cf6ccc237588ae655211348e94eba9ba16c8d

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/.nvmrc CHANGED
@@ -1 +1 @@
1
- v14.15.0
1
+ v16
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("core-js/modules/es.reflect.construct.js");var e=require("@babel/runtime/helpers/classCallCheck"),t=require("@babel/runtime/helpers/inherits"),r=require("@babel/runtime/helpers/possibleConstructorReturn"),n=require("@babel/runtime/helpers/getPrototypeOf");require("core-js/modules/es.array.concat.js");var u=require("@noeldemartin/utils"),o=require("@babel/runtime/helpers/createClass"),a=require("@babel/runtime/helpers/asyncToGenerator"),s=require("@babel/runtime/regenerator");require("core-js/modules/es.array.map.js"),require("core-js/modules/es.regexp.exec.js"),require("core-js/modules/es.string.replace.js"),require("core-js/modules/es.function.name.js"),require("core-js/modules/es.array.from.js"),require("core-js/modules/es.symbol.js"),require("core-js/modules/es.symbol.description.js"),require("core-js/modules/es.symbol.iterator.js");var i=require("@babel/runtime/helpers/toConsumableArray"),c=require("@babel/runtime/helpers/slicedToArray");require("core-js/modules/es.array.slice.js"),require("core-js/modules/es.array.filter.js"),require("core-js/modules/es.array.flat-map.js"),require("core-js/modules/es.array.unscopables.flat-map.js"),require("core-js/modules/es.array.iterator.js"),require("core-js/modules/es.object.to-string.js"),require("core-js/modules/es.set.js"),require("core-js/modules/es.string.iterator.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js"),require("core-js/modules/web.dom-collections.iterator.js"),require("core-js/modules/es.array.join.js"),require("core-js/modules/es.object.entries.js"),require("core-js/modules/es.string.match-all.js"),require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.promise.js"),require("core-js/modules/es.array.flat.js");var l=require("n3"),f=require("jsonld"),d=require("md5");require("core-js/modules/es.string.match.js"),require("core-js/modules/es.array.find.js"),require("core-js/modules/es.string.starts-with.js"),require("core-js/modules/es.string.split.js");var p=require("@babel/runtime/helpers/typeof");require("core-js/modules/es.regexp.constructor.js"),require("core-js/modules/es.regexp.to-string.js"),require("core-js/modules/es.object.keys.js"),require("core-js/modules/web.dom-collections.for-each.js"),require("core-js/modules/es.string.includes.js");var v=require("jest-diff");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var h=m(e),y=m(t),x=m(r),j=m(n),b=m(o),w=m(a),g=m(s),q=m(i),k=m(c),E=m(d),T=m(p),R=m(v);function D(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=j.default(e);if(t){var u=j.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return x.default(this,r)}}exports.SolidDocumentFormat=void 0,(exports.SolidDocumentFormat||(exports.SolidDocumentFormat={})).Turtle="Turtle";var S=function(e){y.default(MalformedSolidDocumentError,e);var t=D(MalformedSolidDocumentError);function MalformedSolidDocumentError(e,r,n){var u;return h.default(this,MalformedSolidDocumentError),(u=t.call(this,function(e,t,r){return e?"Malformed ".concat(t," document found at ").concat(e," - ").concat(r):"Malformed ".concat(t," document - ").concat(r)}(e,r,n))).documentUrl=e,u.documentFormat=r,u.malformationDetails=n,u}return MalformedSolidDocumentError}(u.Error);function P(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=j.default(e);if(t){var u=j.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return x.default(this,r)}}var I=function(e){y.default(NetworkRequestError,e);var t=P(NetworkRequestError);function NetworkRequestError(e){var r;return h.default(this,NetworkRequestError),(r=t.call(this,"Request failed trying to fetch ".concat(e))).url=e,r}return NetworkRequestError}(u.Error);function A(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=j.default(e);if(t){var u=j.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return x.default(this,r)}}var N=function(e){y.default(NotFoundError,e);var t=A(NotFoundError);function NotFoundError(e){var r;return h.default(this,NotFoundError),(r=t.call(this,"Document with '".concat(e,"' url not found"))).url=e,r}return NotFoundError}(u.Error);function U(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=j.default(e);if(t){var u=j.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return x.default(this,r)}}var C=function(e){y.default(UnauthorizedError,e);var t=U(UnauthorizedError);function UnauthorizedError(e,r){var n;return h.default(this,UnauthorizedError),(n=t.call(this,function(e,t){return"Unauthorized".concat(403===t?" (Forbidden)":"",": ").concat(e)}(e,r))).url=e,n.responseStatus=r,n}return b.default(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(u.Error),B={foaf:"http://xmlns.com/foaf/0.1/",pim:"http://www.w3.org/ns/pim/space#",purl:"http://purl.org/dc/terms/",rdfs:"http://www.w3.org/1999/02/22-rdf-syntax-ns#",schema:"https://schema.org/",solid:"http://www.w3.org/ns/solid/terms#",vcard:"http://www.w3.org/2006/vcard/ns#"};function O(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=k.default(r,2),u=n[0],o=n[1];if(o){var a,s,i,c=null!==(a=null!==(s=B[u])&&void 0!==s?s:null===(i=t.extraContext)||void 0===i?void 0:i[u])&&void 0!==a?a:null;if(!c)throw new Error("Can't expand IRI with unknown prefix: '".concat(e,"'"));return c+o}if(!t.defaultPrefix)throw new Error("Can't expand IRI without a default prefix: '".concat(e,"'"));return t.defaultPrefix+u}var z=function(){function e(t,r){h.default(this,e),this.url=t,this.quads=r}return b.default(e,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===O(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===O(e)})).map((function(e){return e.object.value}))}}]),e}(),F=function(){function e(t,r,n){h.default(this,e),this.url=t,this.quads=r,this.headers=n}return b.default(e,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,O("rdfs:type"),O("foaf:PersonalProfileDocument"))}},{key:"isStorage",value:function(){var e;return!(null===(e=this.headers.get("Link"))||void 0===e||!e.match(/<http:\/\/www\.w3\.org\/ns\/pim\/space#Storage>;[^,]+rel="type"/))}},{key:"getLastModified",value:function(){var e,t,r,n;return null!==(e=null!==(t=null!==(r=u.parseDate(this.headers.get("last-modified")))&&void 0!==r?r:u.parseDate(null===(n=this.statement(this.url,"purl:modified"))||void 0===n?void 0:n.object.value))&&void 0!==t?t:this.getLatestDocumentDate())&&void 0!==e?e:null}},{key:"statements",value:function(e,t,r){var n=this;return this.quads.filter((function(u){return!(r&&u.object.value!==O(r,{defaultPrefix:n.url})||e&&u.subject.value!==O(e,{defaultPrefix:n.url})||t&&u.predicate.value!==O(t,{defaultPrefix:n.url}))}))}},{key:"statement",value:function(e,t,r){var n=this,u=this.quads.find((function(u){return!(r&&u.object.value!==O(r,{defaultPrefix:n.url})||e&&u.subject.value!==O(e,{defaultPrefix:n.url})||t&&u.predicate.value!==O(t,{defaultPrefix:n.url}))}));return null!=u?u:null}},{key:"contains",value:function(e,t,r){return null!==this.statement(e,t,r)}},{key:"getThing",value:function(e){var t=this.statements(e);return new z(e,t)}},{key:"getLatestDocumentDate",value:function(){var e=[].concat(q.default(this.statements(void 0,"purl:modified")),q.default(this.statements(void 0,"purl:created"))).map((function(e){return u.parseDate(e.object.value)})).filter((function(e){return null!==e}));return e.length>0?e.reduce((function(e,t){return e>t?e:t})):null}}]),e}();function M(e){return"@graph"in e}function L(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return Q(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Q(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,u=function(){};return{s:u,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw o}}}}function Q(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function W(e,t){return $.apply(this,arguments)}function $(){return($=w.default(g.default.mark((function e(t,r){var n,u,o;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={headers:{Accept:"text/turtle"}},e.prev=1,e.next=4,r(t,n);case 4:if(404!==(u=e.sent).status){e.next=7;break}throw new N(t);case 7:if(![401,403].includes(u.status)){e.next=9;break}throw new C(t,u.status);case 9:return e.next=11,u.text();case 11:return o=e.sent,e.abrupt("return",{body:o,headers:u.headers});case 15:if(e.prev=15,e.t0=e.catch(1),!(e.t0 instanceof C)){e.next=19;break}throw e.t0;case 19:throw new I(t);case 20:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function H(e){var t,r=e.slice(0),n={},o=u.arr(e).flatMap((function(e,t){var r,o=u.arrayFilter(["BlankNode"===e.object.termType?e.object.value:null,"BlankNode"===e.subject.termType?e.subject.value:null]),a=L(o);try{for(a.s();!(r=a.n()).done;){var s,i=r.value;n[i]=null!==(s=n[i])&&void 0!==s?s:new Set,n[i].add(t)}}catch(e){a.e(e)}finally{a.f()}return o})).filter().unique(),a=L(o);try{var s=function(){var o,a=t.value,s=E.default(u.arr(n[a]).map((function(t){return e[t]})).filter((function(e){var t=e.subject,r=t.termType,n=t.value;return"BlankNode"===r&&n===a})).map((function(e){var t=e.predicate,r=e.object;return"BlankNode"===r.termType?t.value:t.value+r.value})).sorted().join()),i=L(n[a]);try{for(i.s();!(o=i.n()).done;){for(var c=o.value,f=r[c],d={subject:f.subject,object:f.object},p=0,v=Object.entries(d);p<v.length;p++){var m=k.default(v[p],2),h=m[0],y=m[1];"BlankNode"===y.termType&&y.value===a&&(d[h]=new l.BlankNode(s))}u.arrayReplace(r,f,new l.Quad(d.subject,f.predicate,d.object))}}catch(e){i.e(e)}finally{i.f()}};for(a.s();!(t=a.n()).done;)s()}catch(e){a.e(e)}finally{a.f()}return r}function J(e,t,r){return _.apply(this,arguments)}function _(){return(_=w.default(g.default.mark((function e(t,r,n){var u,o;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(u=n)&&void 0!==u?u:window.fetch,e.next=3,oe(r);case 3:return o=e.sent,e.next=6,n(t,{method:"PUT",headers:{"Content-Type":"text/turtle"},body:r});case 6:return e.abrupt("return",new F(t,o,new Headers({})));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function G(e,t){return X.apply(this,arguments)}function X(){return(X=w.default(g.default.mark((function e(t,r){var n,u,o,a;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,W(t,null!=r?r:window.fetch);case 2:return n=e.sent,u=n.body,o=n.headers,e.next=7,oe(u,{documentUrl:t});case 7:return a=e.sent,e.abrupt("return",new F(t,a,o));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function K(e){return V.apply(this,arguments)}function V(){return(V=w.default(g.default.mark((function e(t){var r;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!M(t)){e.next=5;break}return e.next=3,Promise.all(t["@graph"].map(K));case 3:return r=e.sent,e.abrupt("return",r.flat());case 5:return e.abrupt("return",f.toRDF(t));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Y(e){var t=ue(e);return Object.entries(t).reduce((function(e,t){var r=k.default(t,2),n=r[0],u=r[1].map((function(e){return" "+ee(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(u,"\n}"))}),[]).join(" ;\n")}function Z(e){return(new l.Writer).quadsToString(e)}function ee(e){return(new l.Writer).quadsToString([e]).slice(0,-1)}function te(e,t){return re.apply(this,arguments)}function re(){return(re=w.default(g.default.mark((function e(t,r){var n;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,G(t,r);case 3:return n=e.sent,e.abrupt("return",!n.isEmpty());case 7:return e.prev=7,e.t0=e.catch(0),e.abrupt("return",!1);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}function ne(){return(ne=w.default(g.default.mark((function e(t){var r,n,u,o=arguments;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=o.length>1&&void 0!==o[1]?o[1]:{},n=t.matchAll(/(\w+) DATA {([^}]+)}/g),u={},e.next=5,Promise.all(q.default(n).map(function(){var e=w.default(g.default.mark((function e(t){var n,o;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),o=t[2],e.next=4,oe(o,r);case 4:u[n]=e.sent;case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 5:return e.abrupt("return",u);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ue(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.matchAll(/(\w+) DATA {([^}]+)}/g),u={},o=L(n);try{for(o.s();!(t=o.n()).done;){var a=t.value,s=a[1].toLowerCase(),i=a[2];u[s]=se(i,r)}}catch(e){o.e(e)}finally{o.f()}return u}function oe(e){return ae.apply(this,arguments)}function ae(){return(ae=w.default(g.default.mark((function e(t){var r,n,o,a,s=arguments;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>1&&void 0!==s[1]?s[1]:{},n=u.objectWithoutEmpty({baseIRI:r.documentUrl}),o=new l.Parser(n),a=[],e.abrupt("return",new Promise((function(e,n){o.parse(t,(function(t,u){var o;t?n(new S(null!==(o=r.documentUrl)&&void 0!==o?o:null,exports.SolidDocumentFormat.Turtle,t.message)):u?a.push(u):r.normalizeBlankNodes?e(H(a)):e(a)}))})));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function se(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=u.objectWithoutEmpty({baseIRI:t.documentUrl}),n=new l.Parser(r);try{var o=n.parse(e);return t.normalizeBlankNodes?H(o):o}catch(e){var a;throw new S(null!==(a=t.documentUrl)&&void 0!==a?a:null,exports.SolidDocumentFormat.Turtle,e.message)}}function ie(e,t,r){return ce.apply(this,arguments)}function ce(){return(ce=w.default(g.default.mark((function e(t,r,n){var u;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(u=n)&&void 0!==u?u:window.fetch,e.next=3,n(t,{method:"PATCH",headers:{"Content-Type":"application/sparql-update"},body:r});case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function le(e,t){return fe.apply(this,arguments)}function fe(){return(fe=w.default(g.default.mark((function e(t,r){var n,o,a,s,i,c,l,f,d,p,v,m,h,y;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return f=u.urlRoute(t),e.next=3,G(f,r);case 3:if((d=e.sent).isPersonalProfile()){e.next=6;break}throw new Error("Document at ".concat(f," is not a profile."));case 6:p=d.statements(t,"pim:storage").map((function(e){return e.object.value})),v=d.statement(t,"solid:publicTypeIndex"),m=d.statement(t,"solid:privateTypeIndex"),h=u.urlParentDirectory(f);case 10:if(!h||0!==p.length){e.next=20;break}return e.next=13,u.silenced(G(h,r));case 13:if(null==(y=e.sent)||!y.isStorage()){e.next=17;break}return p.push(h),e.abrupt("break",20);case 17:h=u.urlParentDirectory(h),e.next=10;break;case 20:return e.abrupt("return",u.objectWithoutEmpty({webId:t,storageUrls:p,name:null!==(n=null===(o=d.statement(t,"vcard:fn"))||void 0===o?void 0:o.object.value)&&void 0!==n?n:null===(a=d.statement(t,"foaf:name"))||void 0===a?void 0:a.object.value,avatarUrl:null!==(s=null===(i=d.statement(t,"vcard:hasPhoto"))||void 0===i?void 0:i.object.value)&&void 0!==s?s:null===(c=d.statement(t,"foaf:img"))||void 0===c?void 0:c.object.value,oidcIssuerUrl:null===(l=d.statement(t,"solid:oidcIssuer"))||void 0===l?void 0:l.object.value,publicTypeIndexUrl:null==v?void 0:v.object.value,privateTypeIndexUrl:null==m?void 0:m.object.value}));case 21:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function de(){return(de=w.default(g.default.mark((function e(t,r){var n,o,a;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=u.silenced((function(e){return le(e,r)})),e.next=3,a(t);case 3:if(e.t2=o=e.sent,e.t1=null!==e.t2,!e.t1){e.next=7;break}e.t1=void 0!==o;case 7:if(!e.t1){e.next=11;break}e.t3=o,e.next=14;break;case 11:return e.next=13,a(t.replace(/\/$/,"").concat("/profile/card#me"));case 13:e.t3=e.sent;case 14:if(e.t4=n=e.t3,e.t0=null!==e.t4,!e.t0){e.next=18;break}e.t0=void 0!==n;case 18:if(!e.t0){e.next=22;break}e.t5=n,e.next=25;break;case 22:return e.next=24,a(u.urlRoot(t).concat("/profile/card#me"));case 24:e.t5=e.sent;case 25:return e.abrupt("return",e.t5);case 26:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function pe(e,t){return ve.apply(this,arguments)}function ve(){return(ve=w.default(g.default.mark((function e(t,r){var n,o,a;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,o=t.storageUrls[0],a="".concat(o,"settings/privateTypeIndex"),e.next=5,te(a,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(o,"settings/privateTypeIndex-").concat(u.uuid()),e.next=10;break;case 9:e.t0=a;case 10:return e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function me(){return(me=w.default(g.default.mark((function e(t,r){var n,u,o;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,e.next=3,pe(t,r);case 3:return u=e.sent,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",o="\n INSERT DATA {\n <".concat(t.webId,"> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <").concat(u,"> .\n }\n "),J(u,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",r),ie(t.webId,o,r),e.abrupt("return",u);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function he(){return(he=w.default(g.default.mark((function e(t,r,n){var u,o,a;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,G(t,n);case 2:return o=e.sent,a=o.statements(void 0,"rdfs:type","solid:TypeRegistration").find((function(e){return o.contains(e.subject.value,"solid:forClass",r)&&o.contains(e.subject.value,"solid:instanceContainer")})),e.abrupt("return",a&&null!==(u=o.getThing(a.subject.value))&&void 0!==u?u:null);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ye(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return xe(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return xe(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,u=function(){};return{s:u,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw o}}}}function xe(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var je={};function be(e){return/\[\[(.*\]\[)?([^\]]+)\]\]/.test(e)}function we(e,t){if(!be(e))return e===t;var r=[];if(!(e in je)){var n,u=e.matchAll(/\[\[((.*)\]\[)?([^\]]+)\]\]/g),o=[],a=e,s=ye(u);try{for(s.s();!(n=s.n()).done;){var i=n.value;i[2]&&r.push(i[2]),o.push(i[3]),a=a.replace(i[0],"%PATTERN".concat(o.length-1,"%"))}}catch(e){s.e(e)}finally{s.f()}a=a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");for(var c=0,l=Object.entries(o);c<l.length;c++){var f=k.default(l[c],2),d=f[0],p=f[1];a=a.replace("%PATTERN".concat(d,"%"),p)}je[e]=new RegExp(a)}return je[e].test(t)}function ge(e,t){return function(e,t){if(e.termType!==t.termType)return!1;if("Literal"===e.termType&&"Literal"===t.termType){if(e.datatype.value!==t.datatype.value)return!1;if(!be(e.value))return"http://www.w3.org/2001/XMLSchema#dateTime"===e.datatype.value?new Date(e.value).getTime()===new Date(t.value).getTime():e.value===t.value}return we(e.value,t.value)}(e.object,t.object)&&we(e.subject.value,t.subject.value)&&we(e.predicate.value,t.predicate.value)}function qe(){je={}}function ke(e,t){return Ee.apply(this,arguments)}function Ee(){return(Ee=w.default(g.default.mark((function e(t,r){var n,u,o,a,s,i,c,l,f;return g.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return qe(),e.next=3,K(t);case 3:return n=e.sent,e.next=6,K(r);case 6:if(u=e.sent,o=Z(n),a=Z(u),s=function(e,t){return{success:e,message:t,expected:o,actual:a}},n.length===u.length){e.next=12;break}return e.abrupt("return",s(!1,"Expected ".concat(n.length," triples, found ").concat(u.length,".")));case 12:i=ye(n),e.prev=13,l=function(){var e=c.value;if(!u.some((function(t){return ge(e,t)})))return{v:s(!1,"Couldn't find the following triple: ".concat(ee(e)))}},i.s();case 16:if((c=i.n()).done){e.next=22;break}if(f=l(),"object"!==T.default(f)){e.next=20;break}return e.abrupt("return",f.v);case 20:e.next=16;break;case 22:e.next=27;break;case 24:e.prev=24,e.t0=e.catch(13),i.e(e.t0);case 27:return e.prev=27,i.f(),e.finish(27);case 30:return e.abrupt("return",s(!0,"jsonld matches"));case 31:case"end":return e.stop()}}),e,null,[[13,24,27,30]])})))).apply(this,arguments)}function Te(e,t){var r;qe();for(var n=ue(e,{normalizeBlankNodes:!0}),o=ue(t,{normalizeBlankNodes:!0}),a=function(r,n){return{success:r,message:n,expected:e,actual:t}},s=0,i=Object.keys(n);s<i.length;s++){var c=i[s];if(!(c in o))return a(!1,"Couldn't find expected ".concat(c," operation."));var l=u.pull(n,c),f=u.pull(o,c);if(l.length!==f.length)return a(!1,"Expected ".concat(l.length," ").concat(c," triples, found ").concat(f.length,"."));var d,p=ye(l);try{var v=function(){var e=d.value;if(!f.some((function(t){return ge(e,t)})))return{v:a(!1,"Couldn't find the following ".concat(c," triple: ").concat(ee(e)))}};for(p.s();!(d=p.n()).done;){var m=v();if("object"===T.default(m))return m.v}}catch(e){p.e(e)}finally{p.f()}}var h=null!==(r=Object.keys(o)[0])&&void 0!==r?r:null;return h?a(!1,"Did not expect to find ".concat(h," triples.")):a(!0,"sparql matches")}function Re(e,t){qe();var r=se(e,{normalizeBlankNodes:!0}),n=se(t,{normalizeBlankNodes:!0}),u=function(r,n){return{success:r,message:n,expected:e,actual:t}};if(r.length!==n.length)return u(!1,"Expected ".concat(r.length," triples, found ").concat(n.length,"."));var o,a=ye(r);try{var s=function(){var e=o.value;if(!n.some((function(t){return ge(e,t)})))return{v:u(!1,"Couldn't find the following triple: ".concat(ee(e)))}};for(a.s();!(o=a.n()).done;){var i=s();if("object"===T.default(i))return i.v}}catch(e){a.e(e)}finally{a.f()}return u(!0,"turtle matches")}var De={turtle:function(e){var t=this._obj,r=this.assert.bind(this),n=Re(e,t);r(n.success,n.message,"",n.expected,n.actual)},sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=Te(e,t);r(n.success,n.message,"",n.expected,n.actual)}};function Se(e,t){var r=e.success,n=t.context.utils;return{pass:r,message:r?function(){return[e.message,n.matcherHint(t.hint),["Expected: not ".concat(n.printExpected(t.expected)),"Received: ".concat(n.printReceived(t.received))].join("\n")].join("\n\n")}:function(){var r=R.default(t.expected,t.received,{expand:t.context.expand});return[e.message,n.matcherHint(t.hint),r&&r.includes("- Expect")?"Difference:\n\n".concat(r):["Expected: ".concat(n.printExpected(t.expected)),"Received: ".concat(n.printReceived(t.received))].join("\n")].join("\n\n")}}}var Pe={toEqualJsonLD:function(e,t){var r=this;return w.default(g.default.mark((function n(){var u;return g.default.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,ke(t,e);case 2:return u=n.sent,n.abrupt("return",Se(u,{context:r,hint:"toEqualJsonLD",expected:t,received:e}));case 4:case"end":return n.stop()}}),n)})))()},toEqualSparql:function(e,t){return Se(Te(t,e),{context:this,hint:"toEqualSparql",expected:Y(t),received:Y(e)})}};exports.MalformedSolidDocumentError=S,exports.NetworkRequestError=I,exports.NotFoundError=N,exports.SolidDocument=F,exports.SolidThing=z,exports.UnauthorizedError=C,exports.createPrivateTypeIndex=function(e,t){return me.apply(this,arguments)},exports.createSolidDocument=J,exports.defineIRIPrefix=function(e,t){B[e]=t},exports.expandIRI=O,exports.fetchLoginUserProfile=function(e,t){return de.apply(this,arguments)},exports.fetchSolidDocument=G,exports.findContainerRegistration=function(e,t,r){return he.apply(this,arguments)},exports.installChaiPlugin=function(){chai.use((function(e){return Object.entries(De).forEach((function(t){var r=k.default(t,2),n=r[0],u=r[1];return e.Assertion.addMethod(n,u)}))}))},exports.installJestPlugin=function(){expect.extend(Pe)},exports.isJsonLDGraph=M,exports.jsonldEquals=ke,exports.jsonldToQuads=K,exports.normalizeSparql=Y,exports.quadToTurtle=ee,exports.quadsToTurtle=Z,exports.solidDocumentExists=te,exports.sparqlEquals=Te,exports.sparqlToQuads=function(e){return ne.apply(this,arguments)},exports.sparqlToQuadsSync=ue,exports.turtleEquals=Re,exports.turtleToQuads=oe,exports.turtleToQuadsSync=se,exports.updateSolidDocument=ie;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("core-js/modules/es.object.to-string.js"),require("core-js/modules/es.reflect.to-string-tag.js"),require("core-js/modules/es.reflect.construct.js");var e=require("@babel/runtime/helpers/classCallCheck"),t=require("@babel/runtime/helpers/assertThisInitialized"),r=require("@babel/runtime/helpers/inherits"),n=require("@babel/runtime/helpers/possibleConstructorReturn"),u=require("@babel/runtime/helpers/getPrototypeOf"),o=require("@babel/runtime/helpers/defineProperty");require("core-js/modules/es.array.concat.js");var a=require("@noeldemartin/utils"),s=require("@babel/runtime/helpers/createClass"),i=require("@babel/runtime/helpers/asyncToGenerator"),c=require("@babel/runtime/regenerator");require("core-js/modules/es.array.map.js"),require("core-js/modules/esnext.async-iterator.map.js"),require("core-js/modules/esnext.iterator.map.js"),require("core-js/modules/es.regexp.exec.js"),require("core-js/modules/es.string.replace.js"),require("core-js/modules/es.function.name.js"),require("core-js/modules/es.array.from.js"),require("core-js/modules/es.regexp.test.js"),require("core-js/modules/es.symbol.js"),require("core-js/modules/es.symbol.description.js"),require("core-js/modules/es.symbol.iterator.js");var l=require("@babel/runtime/helpers/toConsumableArray"),f=require("@babel/runtime/helpers/slicedToArray");require("core-js/modules/es.array.slice.js"),require("core-js/modules/es.array.filter.js"),require("core-js/modules/esnext.async-iterator.filter.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/es.array.flat-map.js"),require("core-js/modules/es.array.unscopables.flat-map.js"),require("core-js/modules/esnext.async-iterator.flat-map.js"),require("core-js/modules/esnext.iterator.flat-map.js"),require("core-js/modules/es.array.iterator.js"),require("core-js/modules/es.set.js"),require("core-js/modules/es.string.iterator.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js"),require("core-js/modules/web.dom-collections.iterator.js"),require("core-js/modules/es.array.join.js"),require("core-js/modules/es.object.entries.js"),require("core-js/modules/esnext.async-iterator.reduce.js"),require("core-js/modules/esnext.iterator.reduce.js"),require("core-js/modules/es.array.sort.js"),require("core-js/modules/es.string.match-all.js"),require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.promise.js"),require("core-js/modules/es.array.flat.js"),require("core-js/modules/es.array.unscopables.flat.js");var d=require("n3"),p=require("jsonld"),m=require("md5");function h(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("core-js/modules/es.string.match.js"),require("core-js/modules/es.array.find.js"),require("core-js/modules/esnext.async-iterator.find.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/es.string.starts-with.js"),require("core-js/modules/es.string.split.js"),require("core-js/modules/es.object.values.js"),require("core-js/modules/esnext.async-iterator.for-each.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/web.dom-collections.for-each.js"),require("core-js/modules/es.regexp.constructor.js"),require("core-js/modules/es.regexp.sticky.js"),require("core-js/modules/es.regexp.to-string.js"),require("core-js/modules/es.object.keys.js");var v=h(e),j=h(t),y=h(r),x=h(n),b=h(u),w=h(o),g=h(s),q=h(i),k=h(c),E=h(l),T=h(f),R=h(m);function D(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=b.default(e);if(t){var u=b.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return x.default(this,r)}}exports.SolidDocumentFormat=void 0,(exports.SolidDocumentFormat||(exports.SolidDocumentFormat={})).Turtle="Turtle";var S=function(e){y.default(MalformedSolidDocumentError,e);var t=D(MalformedSolidDocumentError);function MalformedSolidDocumentError(e,r,n){var u;return v.default(this,MalformedSolidDocumentError),u=t.call(this,function(e,t,r){return e?"Malformed ".concat(t," document found at ").concat(e," - ").concat(r):"Malformed ".concat(t," document - ").concat(r)}(e,r,n)),w.default(j.default(u),"documentUrl",void 0),w.default(j.default(u),"documentFormat",void 0),w.default(j.default(u),"malformationDetails",void 0),u.documentUrl=e,u.documentFormat=r,u.malformationDetails=n,u}return MalformedSolidDocumentError}(a.Error);function P(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=b.default(e);if(t){var u=b.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return x.default(this,r)}}var A=function(e){y.default(NetworkRequestError,e);var t=P(NetworkRequestError);function NetworkRequestError(e){var r;return v.default(this,NetworkRequestError),r=t.call(this,"Request failed trying to fetch ".concat(e)),w.default(j.default(r),"url",void 0),r.url=e,r}return NetworkRequestError}(a.Error);function I(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=b.default(e);if(t){var u=b.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return x.default(this,r)}}var U=function(e){y.default(NotFoundError,e);var t=I(NotFoundError);function NotFoundError(e){var r;return v.default(this,NotFoundError),r=t.call(this,"Document with '".concat(e,"' url not found")),w.default(j.default(r),"url",void 0),r.url=e,r}return NotFoundError}(a.Error);function N(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=b.default(e);if(t){var u=b.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return x.default(this,r)}}var C=function(e){y.default(UnauthorizedError,e);var t=N(UnauthorizedError);function UnauthorizedError(e,r){var n;return v.default(this,UnauthorizedError),n=t.call(this,function(e,t){return"Unauthorized".concat(403===t?" (Forbidden)":"",": ").concat(e)}(e,r)),w.default(j.default(n),"url",void 0),w.default(j.default(n),"responseStatus",void 0),n.url=e,n.responseStatus=r,n}return g.default(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(a.Error),B={foaf:"http://xmlns.com/foaf/0.1/",pim:"http://www.w3.org/ns/pim/space#",purl:"http://purl.org/dc/terms/",rdfs:"http://www.w3.org/1999/02/22-rdf-syntax-ns#",schema:"https://schema.org/",solid:"http://www.w3.org/ns/solid/terms#",vcard:"http://www.w3.org/2006/vcard/ns#"};function O(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=T.default(r,2),u=n[0],o=n[1];if(o){var a,s,i,c=null!==(a=null!==(s=B[u])&&void 0!==s?s:null===(i=t.extraContext)||void 0===i?void 0:i[u])&&void 0!==a?a:null;if(!c)throw new Error("Can't expand IRI with unknown prefix: '".concat(e,"'"));return c+o}if(!t.defaultPrefix)throw new Error("Can't expand IRI without a default prefix: '".concat(e,"'"));return t.defaultPrefix+u}var z=function(){function e(t,r){v.default(this,e),w.default(this,"url",void 0),w.default(this,"quads",void 0),this.url=t,this.quads=r}return g.default(e,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===O(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===O(e)})).map((function(e){return e.object.value}))}}]),e}(),F=function(){function e(t,r,n){v.default(this,e),w.default(this,"url",void 0),w.default(this,"headers",void 0),w.default(this,"quads",void 0),this.url=t,this.quads=r,this.headers=n}return g.default(e,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,O("rdfs:type"),O("foaf:PersonalProfileDocument"))}},{key:"isStorage",value:function(){var e;return!(null===(e=this.headers.get("Link"))||void 0===e||!e.match(/<http:\/\/www\.w3\.org\/ns\/pim\/space#Storage>;[^,]+rel="type"/))}},{key:"getLastModified",value:function(){var e,t,r,n;return null!==(e=null!==(t=null!==(r=a.parseDate(this.headers.get("last-modified")))&&void 0!==r?r:a.parseDate(null===(n=this.statement(this.url,"purl:modified"))||void 0===n?void 0:n.object.value))&&void 0!==t?t:this.getLatestDocumentDate())&&void 0!==e?e:null}},{key:"statements",value:function(e,t,r){var n=this;return this.quads.filter((function(u){return!(r&&u.object.value!==O(r,{defaultPrefix:n.url})||e&&u.subject.value!==O(e,{defaultPrefix:n.url})||t&&u.predicate.value!==O(t,{defaultPrefix:n.url}))}))}},{key:"statement",value:function(e,t,r){var n=this,u=this.quads.find((function(u){return!(r&&u.object.value!==O(r,{defaultPrefix:n.url})||e&&u.subject.value!==O(e,{defaultPrefix:n.url})||t&&u.predicate.value!==O(t,{defaultPrefix:n.url}))}));return null!=u?u:null}},{key:"contains",value:function(e,t,r){return null!==this.statement(e,t,r)}},{key:"getThing",value:function(e){var t=this.statements(e);return new z(e,t)}},{key:"getLatestDocumentDate",value:function(){var e=[].concat(E.default(this.statements(void 0,"purl:modified")),E.default(this.statements(void 0,"purl:created"))).map((function(e){return a.parseDate(e.object.value)})).filter((function(e){return null!==e}));return e.length>0?e.reduce((function(e,t){return e>t?e:t})):null}}]),e}();function M(e){return"@graph"in e}function L(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return Q(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Q(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,u=function(){};return{s:u,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw o}}}}function Q(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function W(e,t){return $.apply(this,arguments)}function $(){return($=q.default(k.default.mark((function e(t,r){var n,u,o;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={headers:{Accept:"text/turtle"}},e.prev=1,e.next=4,r(t,n);case 4:if(404!==(u=e.sent).status){e.next=7;break}throw new U(t);case 7:if(![401,403].includes(u.status)){e.next=9;break}throw new C(t,u.status);case 9:return e.next=11,u.text();case 11:return o=e.sent,e.abrupt("return",{body:o,headers:u.headers});case 15:if(e.prev=15,e.t0=e.catch(1),!(e.t0 instanceof C)){e.next=19;break}throw e.t0;case 19:throw new A(t);case 20:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function H(e){var t,r=e.slice(0),n={},u=a.arr(e).flatMap((function(e,t){var r,u=a.arrayFilter(["BlankNode"===e.object.termType?e.object.value:null,"BlankNode"===e.subject.termType?e.subject.value:null]),o=L(u);try{for(o.s();!(r=o.n()).done;){var s,i=r.value;n[i]=null!==(s=n[i])&&void 0!==s?s:new Set,n[i].add(t)}}catch(e){o.e(e)}finally{o.f()}return u})).filter().unique(),o=L(u);try{var s=function(){var u,o=t.value,s=R.default(a.arr(n[o]).map((function(t){return e[t]})).filter((function(e){var t=e.subject,r=t.termType,n=t.value;return"BlankNode"===r&&n===o})).map((function(e){var t=e.predicate,r=e.object;return"BlankNode"===r.termType?t.value:t.value+r.value})).sorted().join()),i=L(n[o]);try{for(i.s();!(u=i.n()).done;){for(var c=u.value,l=r[c],f={subject:l.subject,object:l.object},p=0,m=Object.entries(f);p<m.length;p++){var h=T.default(m[p],2),v=h[0],j=h[1];"BlankNode"===j.termType&&j.value===o&&(f[v]=new d.BlankNode(s))}a.arrayReplace(r,l,new d.Quad(f.subject,l.predicate,f.object))}}catch(e){i.e(e)}finally{i.f()}};for(o.s();!(t=o.n()).done;)s()}catch(e){o.e(e)}finally{o.f()}return r}function J(e,t,r){return _.apply(this,arguments)}function _(){return(_=q.default(k.default.mark((function e(t,r,n){var u,o;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(u=n)&&void 0!==u?u:window.fetch,e.next=3,oe(r);case 3:return o=e.sent,e.next=6,n(t,{method:"PUT",headers:{"Content-Type":"text/turtle"},body:r});case 6:return e.abrupt("return",new F(t,o,new Headers({})));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function G(e,t){return X.apply(this,arguments)}function X(){return(X=q.default(k.default.mark((function e(t,r){var n,u,o,a;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,W(t,null!=r?r:window.fetch);case 2:return n=e.sent,u=n.body,o=n.headers,e.next=7,oe(u,{documentUrl:t});case 7:return a=e.sent,e.abrupt("return",new F(t,a,o));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function K(e){return V.apply(this,arguments)}function V(){return(V=q.default(k.default.mark((function e(t){var r;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!M(t)){e.next=5;break}return e.next=3,Promise.all(t["@graph"].map(K));case 3:return r=e.sent,e.abrupt("return",r.flat());case 5:return e.abrupt("return",p.toRDF(t));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Y(e){var t=ue(e);return Object.entries(t).reduce((function(e,t){var r=T.default(t,2),n=r[0],u=r[1].map((function(e){return" "+ee(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(u,"\n}"))}),[]).join(" ;\n")}function Z(e){return(new d.Writer).quadsToString(e)}function ee(e){return(new d.Writer).quadsToString([e]).slice(0,-1)}function te(e,t){return re.apply(this,arguments)}function re(){return(re=q.default(k.default.mark((function e(t,r){var n;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,G(t,r);case 3:return n=e.sent,e.abrupt("return",!n.isEmpty());case 7:return e.prev=7,e.t0=e.catch(0),e.abrupt("return",!1);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}function ne(){return ne=q.default(k.default.mark((function e(t){var r,n,u,o=arguments;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=o.length>1&&void 0!==o[1]?o[1]:{},n=t.matchAll(/(\w+) DATA {([^}]+)}/g),u={},e.next=5,Promise.all(E.default(n).map(function(){var e=q.default(k.default.mark((function e(t){var n,o;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),o=t[2],e.next=4,oe(o,r);case 4:u[n]=e.sent;case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 5:return e.abrupt("return",u);case 6:case"end":return e.stop()}}),e)}))),ne.apply(this,arguments)}function ue(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.matchAll(/(\w+) DATA {([^}]+)}/g),u={},o=L(n);try{for(o.s();!(t=o.n()).done;){var a=t.value,s=a[1].toLowerCase(),i=a[2];u[s]=se(i,r)}}catch(e){o.e(e)}finally{o.f()}return u}function oe(e){return ae.apply(this,arguments)}function ae(){return ae=q.default(k.default.mark((function e(t){var r,n,u,o,s=arguments;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>1&&void 0!==s[1]?s[1]:{},n=a.objectWithoutEmpty({baseIRI:r.documentUrl}),u=new d.Parser(n),o=[],e.abrupt("return",new Promise((function(e,n){u.parse(t,(function(t,u){var a;t?n(new S(null!==(a=r.documentUrl)&&void 0!==a?a:null,exports.SolidDocumentFormat.Turtle,t.message)):u?o.push(u):r.normalizeBlankNodes?e(H(o)):e(o)}))})));case 5:case"end":return e.stop()}}),e)}))),ae.apply(this,arguments)}function se(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=a.objectWithoutEmpty({baseIRI:t.documentUrl}),n=new d.Parser(r);try{var u=n.parse(e);return t.normalizeBlankNodes?H(u):u}catch(e){var o,s;throw new S(null!==(o=t.documentUrl)&&void 0!==o?o:null,exports.SolidDocumentFormat.Turtle,null!==(s=e.message)&&void 0!==s?s:"")}}function ie(e,t,r){return ce.apply(this,arguments)}function ce(){return(ce=q.default(k.default.mark((function e(t,r,n){var u;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(u=n)&&void 0!==u?u:window.fetch,e.next=3,n(t,{method:"PATCH",headers:{"Content-Type":"application/sparql-update"},body:r});case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function le(e,t){return fe.apply(this,arguments)}function fe(){return(fe=q.default(k.default.mark((function e(t,r){var n,u,o,s,i,c,l,f,d,p,m,h,v,j;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return f=a.urlRoute(t),e.next=3,G(f,r);case 3:if((d=e.sent).isPersonalProfile()){e.next=6;break}throw new Error("Document at ".concat(f," is not a profile."));case 6:p=d.statements(t,"pim:storage").map((function(e){return e.object.value})),m=d.statement(t,"solid:publicTypeIndex"),h=d.statement(t,"solid:privateTypeIndex"),v=a.urlParentDirectory(f);case 10:if(!v||0!==p.length){e.next=20;break}return e.next=13,a.silenced(G(v,r));case 13:if(null==(j=e.sent)||!j.isStorage()){e.next=17;break}return p.push(v),e.abrupt("break",20);case 17:v=a.urlParentDirectory(v),e.next=10;break;case 20:return e.abrupt("return",a.objectWithoutEmpty({webId:t,storageUrls:p,name:null!==(n=null===(u=d.statement(t,"vcard:fn"))||void 0===u?void 0:u.object.value)&&void 0!==n?n:null===(o=d.statement(t,"foaf:name"))||void 0===o?void 0:o.object.value,avatarUrl:null!==(s=null===(i=d.statement(t,"vcard:hasPhoto"))||void 0===i?void 0:i.object.value)&&void 0!==s?s:null===(c=d.statement(t,"foaf:img"))||void 0===c?void 0:c.object.value,oidcIssuerUrl:null===(l=d.statement(t,"solid:oidcIssuer"))||void 0===l?void 0:l.object.value,publicTypeIndexUrl:null==m?void 0:m.object.value,privateTypeIndexUrl:null==h?void 0:h.object.value}));case 21:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function de(){return(de=q.default(k.default.mark((function e(t,r){var n,u,o;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o=a.silenced((function(e){return le(e,r)})),e.next=3,o(t);case 3:if(e.t2=u=e.sent,e.t1=null!==e.t2,!e.t1){e.next=7;break}e.t1=void 0!==u;case 7:if(!e.t1){e.next=11;break}e.t3=u,e.next=14;break;case 11:return e.next=13,o(t.replace(/\/$/,"").concat("/profile/card#me"));case 13:e.t3=e.sent;case 14:if(e.t4=n=e.t3,e.t0=null!==e.t4,!e.t0){e.next=18;break}e.t0=void 0!==n;case 18:if(!e.t0){e.next=22;break}e.t5=n,e.next=25;break;case 22:return e.next=24,o(a.urlRoot(t).concat("/profile/card#me"));case 24:e.t5=e.sent;case 25:return e.abrupt("return",e.t5);case 26:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function pe(e){var t=function(e){return e.path&&e.path.startsWith("/")?e.path.match(/^\/[^/]*$/)?"/":"/".concat(a.arr(e.path.split("/")).filter().slice(0,-1).join("/"),"/").replace("//","/"):null}(e);return e.protocol&&e.domain?"".concat(e.protocol,"://").concat(e.domain).concat(null!=t?t:"/"):t}function me(e){var t;if("@type"in e&&!("@value"in e)){e["@id"]=null!==(t=e["@id"])&&void 0!==t?t:a.uuid();for(var r=0,n=Object.values(e);r<n.length;r++){var u=n[r];a.isObject(u)&&me(u),a.isArray(u)&&u.forEach((function(e){return a.isObject(e)&&me(e)}))}}}function he(e,t){return ve.apply(this,arguments)}function ve(){return(ve=q.default(k.default.mark((function e(t,r){var n,u,o;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,u=t.storageUrls[0],o="".concat(u,"settings/privateTypeIndex"),e.next=5,te(o,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(u,"settings/privateTypeIndex-").concat(a.uuid()),e.next=10;break;case 9:e.t0=o;case 10:return e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function je(){return(je=q.default(k.default.mark((function e(t,r){var n,u,o;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,e.next=3,he(t,r);case 3:return u=e.sent,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",o="\n INSERT DATA {\n <".concat(t.webId,"> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <").concat(u,"> .\n }\n "),e.next=8,Promise.all([J(u,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",r),ie(t.webId,o,r)]);case 8:return e.abrupt("return",u);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ye(){return(ye=q.default(k.default.mark((function e(t,r,n){var u,o,a;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,G(t,n);case 2:return o=e.sent,a=o.statements(void 0,"rdfs:type","solid:TypeRegistration").find((function(e){return o.contains(e.subject.value,"solid:forClass",r)&&o.contains(e.subject.value,"solid:instanceContainer")})),e.abrupt("return",a&&null!==(u=o.getThing(a.subject.value))&&void 0!==u?u:null);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function xe(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return be(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return be(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,u=function(){};return{s:u,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw o}}}}function be(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function we(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=b.default(e);if(t){var u=b.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return x.default(this,r)}}var ge={},qe={"%uuid%":"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"},ke=function(e){y.default(ExpectedQuadAssertionError,e);var t=we(ExpectedQuadAssertionError);function ExpectedQuadAssertionError(e){var r;return v.default(this,ExpectedQuadAssertionError),r=t.call(this,"Couldn't find the following triple: ".concat(ee(e))),w.default(j.default(r),"expectedQuad",void 0),r.expectedQuad=e,r}return ExpectedQuadAssertionError}(a.Error);function Ee(e,t){var r,n=xe(e);try{var u=function(){var e=r.value,n=t.find((function(t){return n=t,function(e,t){if(e.termType!==t.termType)return!1;if("Literal"===e.termType&&"Literal"===t.termType){if(e.datatype.value!==t.datatype.value)return!1;if(!Te(e.value))return"http://www.w3.org/2001/XMLSchema#dateTime"===e.datatype.value?new Date(e.value).getTime()===new Date(t.value).getTime():e.value===t.value}return Re(e.value,t.value)}((r=e).object,n.object)&&Re(r.subject.value,n.subject.value)&&Re(r.predicate.value,n.predicate.value);var r,n}));if(!n)throw new ke(e);a.arrayRemove(t,n)};for(n.s();!(r=n.n()).done;)u()}catch(e){n.e(e)}finally{n.f()}}function Te(e){return/\[\[(.*\]\[)?([^\]]+)\]\]/.test(e)}function Re(e,t){if(!Te(e))return e===t;var r=[];if(!(e in ge)){var n,u=e.matchAll(/\[\[((.*?)\]\[)?([^\]]+)\]\]/g),o=[],a=e,s=xe(u);try{for(s.s();!(n=s.n()).done;){var i=n.value;i[2]&&r.push(i[2]),o.push(i[3]),a=a.replace(i[0],"%PATTERN".concat(o.length-1,"%"))}}catch(e){s.e(e)}finally{s.f()}a=a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");for(var c=0,l=Object.entries(o);c<l.length;c++){var f,d=T.default(l[c],2),p=d[0],m=d[1];a=a.replace("%PATTERN".concat(p,"%"),null!==(f=qe[m])&&void 0!==f?f:m)}ge[e]=new RegExp(a)}return ge[e].test(t)}function De(){ge={}}function Se(e,t){return Pe.apply(this,arguments)}function Pe(){return(Pe=q.default(k.default.mark((function e(t,r){var n,u,o,a,s;return k.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return De(),e.next=3,K(t);case 3:return n=e.sent,e.next=6,K(r);case 6:if(u=e.sent,o=Z(n),a=Z(u),s=function(e,t){return{success:e,message:t,expected:o,actual:a}},n.length===u.length){e.next=12;break}return e.abrupt("return",s(!1,"Expected ".concat(n.length," triples, found ").concat(u.length,".")));case 12:e.prev=12,Ee(n,u),e.next=21;break;case 16:if(e.prev=16,e.t0=e.catch(12),e.t0 instanceof ke){e.next=20;break}throw e.t0;case 20:return e.abrupt("return",s(!1,e.t0.message));case 21:return e.abrupt("return",s(!0,"jsonld matches"));case 22:case"end":return e.stop()}}),e,null,[[12,16]])})))).apply(this,arguments)}function Ae(e,t){var r;De();for(var n=ue(e,{normalizeBlankNodes:!0}),u=ue(t,{normalizeBlankNodes:!0}),o=function(r,n){return{success:r,message:n,expected:e,actual:t}},s=0,i=Object.keys(n);s<i.length;s++){var c=i[s];if(!(c in u))return o(!1,"Couldn't find expected ".concat(c," operation."));var l=a.pull(n,c),f=a.pull(u,c);if(l.length!==f.length)return o(!1,"Expected ".concat(l.length," ").concat(c," triples, found ").concat(f.length,"."));try{Ee(l,f)}catch(e){if(!(e instanceof ke))throw e;return o(!1,"Couldn't find the following ".concat(c," triple: ").concat(ee(e.expectedQuad)))}}var d=null!==(r=Object.keys(u)[0])&&void 0!==r?r:null;return d?o(!1,"Did not expect to find ".concat(d," triples.")):o(!0,"sparql matches")}function Ie(e,t){De();var r=se(e,{normalizeBlankNodes:!0}),n=se(t,{normalizeBlankNodes:!0}),u=function(r,n){return{success:r,message:n,expected:e,actual:t}};if(r.length!==n.length)return u(!1,"Expected ".concat(r.length," triples, found ").concat(n.length,"."));try{Ee(r,n)}catch(e){if(!(e instanceof ke))throw e;return u(!1,e.message)}return u(!0,"turtle matches")}var Ue={turtle:function(e){var t=this._obj,r=this.assert.bind(this),n=Ie(e,t);r(n.success,n.message,"",n.expected,n.actual)},sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=Ae(e,t);r(n.success,n.message,"",n.expected,n.actual)}};function Ne(e,t){var r=e.success,n=t.context.utils;return{pass:r,message:r?function(){return[e.message,n.matcherHint(t.hint),["Expected: not ".concat(n.printExpected(t.expected)),"Received: ".concat(n.printReceived(t.received))].join("\n")].join("\n\n")}:function(){return[e.message,n.matcherHint(t.hint)].join("\n\n")}}}var Ce={toEqualJsonLD:function(e,t){var r=this;return q.default(k.default.mark((function n(){var u;return k.default.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,Se(t,e);case 2:return u=n.sent,n.abrupt("return",Ne(u,{context:r,hint:"toEqualJsonLD",expected:t,received:e}));case 4:case"end":return n.stop()}}),n)})))()},toEqualSparql:function(e,t){return Ne(Ae(t,e),{context:this,hint:"toEqualSparql",expected:Y(t),received:Y(e)})}};exports.MalformedSolidDocumentError=S,exports.NetworkRequestError=A,exports.NotFoundError=U,exports.SolidDocument=F,exports.SolidThing=z,exports.UnauthorizedError=C,exports.createPrivateTypeIndex=function(e,t){return je.apply(this,arguments)},exports.createSolidDocument=J,exports.defineIRIPrefix=function(e,t){B[e]=t},exports.expandIRI=O,exports.fetchLoginUserProfile=function(e,t){return de.apply(this,arguments)},exports.fetchSolidDocument=G,exports.findContainerRegistration=function(e,t,r){return ye.apply(this,arguments)},exports.installChaiPlugin=function(){chai.use((function(e){return Object.entries(Ue).forEach((function(t){var r=T.default(t,2),n=r[0],u=r[1];return e.Assertion.addMethod(n,u)}))}))},exports.installJestPlugin=function(){expect.extend(Ce)},exports.isJsonLDGraph=M,exports.jsonldEquals=Se,exports.jsonldToQuads=K,exports.mintJsonLDIdentifiers=function(e){return a.tap(a.objectDeepClone(e),(function(e){return me(e)}))},exports.normalizeSparql=Y,exports.parseResourceSubject=function(e){var t=a.urlParse(e);return t?a.objectWithoutEmpty({containerUrl:pe(t),documentName:t.path?t.path.split("/").pop():null,resourceHash:t.fragment}):{}},exports.quadToTurtle=ee,exports.quadsToTurtle=Z,exports.solidDocumentExists=te,exports.sparqlEquals=Ae,exports.sparqlToQuads=function(e){return ne.apply(this,arguments)},exports.sparqlToQuadsSync=ue,exports.turtleEquals=Ie,exports.turtleToQuads=oe,exports.turtleToQuadsSync=se,exports.updateSolidDocument=ie;
2
2
  //# sourceMappingURL=noeldemartin-solid-utils.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"noeldemartin-solid-utils.cjs.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/SolidDocument.ts","../src/helpers/jsonld.ts","../src/helpers/io.ts","../src/helpers/auth.ts","../src/helpers/interop.ts","../src/helpers/testing.ts","../src/plugins/chai/assertions.ts","../src/plugins/jest/matchers.ts","../src/plugins/chai/index.ts","../src/plugins/jest/index.ts"],"sourcesContent":["import { Error } 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 Error {\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 { Error } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Request failed trying to fetch ${url}`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NotFoundError extends Error {\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 { Error } 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 Error {\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'\n ? this.responseStatus === 403\n : 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 foaf: 'http://xmlns.com/foaf/0.1/',\n pim: 'http://www.w3.org/ns/pim/space#',\n purl: 'http://purl.org/dc/terms/',\n rdfs: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\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'))\n return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix)\n throw new Error(`Can't expand IRI with unknown prefix: '${iri}'`);\n\n return expandedPrefix + name;\n }\n\n if (!options.defaultPrefix)\n throw new Error(`Can't expand IRI without a default prefix: '${iri}'`);\n\n return options.defaultPrefix + prefix;\n}\n","import type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/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\n .find(quad => quad.predicate.value === expandIRI(property))\n ?.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 { parseDate } from '@noeldemartin/utils';\nimport type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport default class SolidDocument {\n\n public readonly url: string;\n public readonly headers: Headers;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n this.url = url;\n this.quads = quads;\n this.headers = headers;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(\n this.url,\n expandIRI('rdfs:type'),\n expandIRI('foaf:PersonalProfileDocument'),\n );\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 getLastModified(): Date | null {\n return parseDate(this.headers.get('last-modified'))\n ?? parseDate(this.statement(this.url, 'purl:modified')?.object.value)\n ?? this.getLatestDocumentDate()\n ?? null;\n }\n\n public statements(subject?: string, predicate?: string, object?: string): Quad[] {\n return this.quads.filter(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n }\n\n public statement(subject?: string, predicate?: string, object?: string): Quad | null {\n const statement = this.quads.find(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\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 private getLatestDocumentDate(): Date | null {\n const dates = [\n ...this.statements(undefined, 'purl:modified'),\n ...this.statements(undefined, 'purl:created'),\n ]\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}\n","export 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 = { '@graph': JsonLDResource[] };\n\nexport function isJsonLDGraph(jsonld: JsonLD): jsonld is JsonLDGraph {\n return '@graph' in jsonld;\n}\n","import { arr, arrayFilter, arrayReplace,objectWithoutEmpty } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';\nimport type { JsonLdDocument } from 'jsonld';\nimport { toRDF } from 'jsonld';\nimport md5 from 'md5';\nimport type { Quad } from 'rdf-js';\nimport type { Term as N3Term } from 'n3';\n\nimport SolidDocument from '@/models/SolidDocument';\n\nimport MalformedSolidDocumentError, { SolidDocumentFormat } from '@/errors/MalformedSolidDocumentError';\nimport NetworkRequestError from '@/errors/NetworkRequestError';\nimport NotFoundError from '@/errors/NotFoundError';\nimport UnauthorizedError from '@/errors/UnauthorizedError';\nimport { isJsonLDGraph } from '@/helpers/jsonld';\nimport type { JsonLD } from '@/helpers/jsonld';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type AnyFetch = (input: any, options?: any) => Promise<any>;\nexport declare type TypedFetch = (input: RequestInfo, options?: RequestInit) => Promise<Response>;\nexport declare type Fetch = TypedFetch | AnyFetch;\n\nasync function fetchRawSolidDocument(url: string, fetch: Fetch): Promise<{ body: string; headers: Headers }> {\n const options = {\n headers: { Accept: 'text/turtle' },\n };\n\n try {\n const response = await fetch(url, options);\n\n if (response.status === 404)\n throw new NotFoundError(url);\n\n if ([401, 403].includes(response.status))\n 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)\n throw error;\n\n throw new NetworkRequestError(url);\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 const ids = arrayFilter([\n quad.object.termType === 'BlankNode' ? quad.object.value : null,\n quad.subject.termType === 'BlankNode' ? quad.subject.value : null,\n ]);\n\n for (const id of ids) {\n quadsIndexes[id] = quadsIndexes[id] ?? new Set();\n quadsIndexes[id].add(index);\n }\n\n return ids;\n })\n .filter()\n .unique();\n\n for (const originalId of blankNodeIds) {\n const normalizedId = md5(\n arr(quadsIndexes[originalId])\n .map(index => quads[index])\n .filter(({ subject: { termType, value } }) => termType === 'BlankNode' && value === originalId)\n .map(\n ({ predicate, object }) => object.termType === 'BlankNode'\n ? predicate.value\n : predicate.value + object.value,\n )\n .sorted()\n .join(),\n );\n\n for (const index of quadsIndexes[originalId]) {\n const quad = normalizedQuads[index];\n const terms: Record<string, N3Term> = { subject: quad.subject as N3Term, object: quad.object as N3Term };\n\n for (const [termName, termValue] of Object.entries(terms)) {\n if (termValue.termType !== 'BlankNode' || termValue.value !== originalId)\n continue;\n\n terms[termName] = new N3BlankNode(normalizedId);\n }\n\n arrayReplace(normalizedQuads, quad, new N3Quad(terms.subject, quad.predicate as N3Term, terms.object));\n }\n }\n\n return normalizedQuads;\n}\n\nexport interface ParsingOptions {\n documentUrl: string;\n normalizeBlankNodes: boolean;\n}\n\nexport async function createSolidDocument(url: string, body: string, fetch?: Fetch): Promise<SolidDocument> {\n fetch = fetch ?? window.fetch;\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, fetch?: Fetch): Promise<SolidDocument> {\n const { body: data, headers } = await fetchRawSolidDocument(url, fetch ?? window.fetch);\n const statements = await turtleToQuads(data, { documentUrl: url });\n\n return new SolidDocument(url, statements, headers);\n}\n\nexport async function jsonldToQuads(jsonld: JsonLD): Promise<Quad[]> {\n if (isJsonLDGraph(jsonld)) {\n const graphQuads = await Promise.all(jsonld['@graph'].map(jsonldToQuads));\n\n return graphQuads.flat();\n }\n\n return toRDF(jsonld as JsonLdDocument) as Promise<Quad[]>;\n}\n\nexport function normalizeSparql(sparql: string): string {\n const quads = sparqlToQuadsSync(sparql);\n\n return Object\n .entries(quads)\n .reduce((normalizedOperations, [operation, quads]) => {\n const normalizedQuads = quads.map(quad => ' ' + quadToTurtle(quad)).sort().join('\\n');\n\n return normalizedOperations.concat(`${operation.toUpperCase()} DATA {\\n${normalizedQuads}\\n}`);\n }, [] as string[])\n .join(' ;\\n');\n}\n\nexport function quadsToTurtle(quads: Quad[]): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString(quads);\n}\n\nexport function quadToTurtle(quad: Quad): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, fetch?: Fetch): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, fetch);\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 = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all([...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 return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = sparql.matchAll(/(\\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 parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n const quads: Quad[] = [];\n\n return new Promise((resolve, reject) => {\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(\n options.documentUrl ?? null,\n SolidDocumentFormat.Turtle,\n error.message,\n ),\n );\n return;\n }\n\n if (!quad) {\n options.normalizeBlankNodes\n ? resolve(normalizeBlankNodes(quads))\n : resolve(quads);\n\n return;\n }\n\n quads.push(quad);\n });\n });\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes\n ? normalizeBlankNodes(quads)\n : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(options.documentUrl ?? null, SolidDocumentFormat.Turtle, error.message);\n }\n}\n\nexport async function updateSolidDocument(url: string, body: string, fetch?: Fetch): Promise<void> {\n fetch = fetch ?? window.fetch;\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n","import { objectWithoutEmpty, silenced, urlParentDirectory, urlRoot, urlRoute } from '@noeldemartin/utils';\n\nimport { fetchSolidDocument } from './io';\nimport type { Fetch } from './io';\n\nexport interface SolidUserProfile {\n webId: string;\n storageUrls: string[];\n name?: string;\n avatarUrl?: string;\n oidcIssuerUrl?: string;\n publicTypeIndexUrl?: string;\n privateTypeIndexUrl?: string;\n}\n\nasync function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUserProfile> {\n const documentUrl = urlRoute(webId);\n const document = await fetchSolidDocument(documentUrl, fetch);\n\n if (!document.isPersonalProfile())\n throw new Error(`Document at ${documentUrl} is not a profile.`);\n\n const storageUrls = document.statements(webId, 'pim:storage').map(storage => storage.object.value);\n const publicTypeIndex = document.statement(webId, 'solid:publicTypeIndex');\n const privateTypeIndex = document.statement(webId, 'solid:privateTypeIndex');\n\n let parentUrl = urlParentDirectory(documentUrl);\n while (parentUrl && storageUrls.length === 0) {\n const parentDocument = await silenced(fetchSolidDocument(parentUrl, fetch));\n\n if (parentDocument?.isStorage()) {\n storageUrls.push(parentUrl);\n\n break;\n }\n\n parentUrl = urlParentDirectory(parentUrl);\n }\n\n return objectWithoutEmpty({\n webId,\n storageUrls,\n name:\n document.statement(webId, 'vcard:fn')?.object.value ??\n document.statement(webId, 'foaf:name')?.object.value,\n avatarUrl:\n document.statement(webId, 'vcard:hasPhoto')?.object.value ??\n document.statement(webId, 'foaf:img')?.object.value,\n oidcIssuerUrl: document.statement(webId, 'solid:oidcIssuer')?.object.value,\n publicTypeIndexUrl: publicTypeIndex?.object.value,\n privateTypeIndexUrl: privateTypeIndex?.object.value,\n });\n}\n\nexport async function fetchLoginUserProfile(loginUrl: string, fetch?: Fetch): Promise<SolidUserProfile | null> {\n const fetchProfile = silenced(url => fetchUserProfile(url, fetch));\n\n return await fetchProfile(loginUrl)\n ?? await fetchProfile(loginUrl.replace(/\\/$/, '').concat('/profile/card#me'))\n ?? await fetchProfile(urlRoot(loginUrl).concat('/profile/card#me'));\n}\n","import { uuid } from '@noeldemartin/utils';\n\nimport { createSolidDocument, fetchSolidDocument, solidDocumentExists, updateSolidDocument } from '@/helpers/io';\nimport type SolidThing from '@/models/SolidThing';\nimport type { Fetch } from '@/helpers/io';\nimport type { SolidUserProfile } from '@/helpers/auth';\n\nasync function mintPrivateTypeIndexUrl(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const storageUrl = user.storageUrls[0];\n const typeIndexUrl = `${storageUrl}settings/privateTypeIndex`;\n\n return await solidDocumentExists(typeIndexUrl, fetch)\n ? `${storageUrl}settings/privateTypeIndex-${uuid()}`\n : typeIndexUrl;\n}\n\nexport async function createPrivateTypeIndex(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const typeIndexUrl = await mintPrivateTypeIndexUrl(user, fetch);\n const typeIndexBody = `\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n `;\n const profileUpdateBody = `\n INSERT DATA {\n <${user.webId}> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <${typeIndexUrl}> .\n }\n `;\n\n createSolidDocument(typeIndexUrl, typeIndexBody, fetch);\n updateSolidDocument(user.webId, profileUpdateBody, fetch);\n\n return typeIndexUrl;\n}\n\nexport async function findContainerRegistration(\n typeIndexUrl: string,\n childrenType: string,\n fetch?: Fetch,\n): Promise<SolidThing | null> {\n const typeIndex = await fetchSolidDocument(typeIndexUrl, fetch);\n const containerQuad = typeIndex\n .statements(undefined, 'rdfs:type', 'solid:TypeRegistration')\n .find(\n statement =>\n typeIndex.contains(statement.subject.value, 'solid:forClass', childrenType) &&\n typeIndex.contains(statement.subject.value, 'solid:instanceContainer'),\n );\n\n return containerQuad\n ? typeIndex.getThing(containerQuad.subject.value) ?? null\n : null;\n}\n","import type { JsonLD } from '@/helpers/jsonld';\nimport { pull } from '@noeldemartin/utils';\nimport type { Quad, Quad_Object } from 'rdf-js';\n\nimport { jsonldToQuads, quadToTurtle, quadsToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';\n\nlet patternsRegExpsIndex: Record<string, RegExp> = {};\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[(.*\\]\\[)?([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n if (!containsPatterns(expected))\n return expected === actual;\n\n const patternAliases = [];\n\n if (!(expected in patternsRegExpsIndex)) {\n const patternMatches = expected.matchAll(/\\[\\[((.*)\\]\\[)?([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n if (patternMatch[2]) {\n patternAliases.push(patternMatch[2]);\n }\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}%`, pattern);\n }\n\n patternsRegExpsIndex[expected] = new RegExp(expectedRegExp);\n }\n\n return patternsRegExpsIndex[expected].test(actual);\n}\n\nfunction quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {\n if (expected.termType !== actual.termType)\n return false;\n\n if (expected.termType === 'Literal' && actual.termType === 'Literal') {\n if (expected.datatype.value !== actual.datatype.value)\n 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 quadObjectEquals(expected.object, actual.object)\n && quadValueEquals(expected.subject.value, actual.subject.value)\n && quadValueEquals(expected.predicate.value, actual.predicate.value);\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 for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\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))\n 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 for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following ${operation} triple: ${quadToTurtle(expectedQuad)}`);\n }\n }\n\n const unexpectedOperation = Object.keys(actualOperations)[0] ?? null;\n if (unexpectedOperation)\n 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 for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n return result(true, 'turtle matches');\n}\n","import { sparqlEquals, turtleEquals } from '@/helpers/testing';\n\ntype CustomAssertions = {\n [assertion in keyof typeof assertions]: typeof assertions[assertion];\n};\n\ndeclare global {\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Chai {\n\n interface Assertion extends CustomAssertions {}\n interface Include extends CustomAssertions {}\n\n }\n\n}\n\nconst assertions: Record<string, (this: Chai.AssertionStatic, ...args: any[]) => void> = {\n turtle(graph: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = graph;\n const result = turtleEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n sparql(query: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = query;\n const result = sparqlEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n};\n\nexport default assertions;\n","import diff from 'jest-diff';\n\nimport { normalizeSparql } from '@/helpers/io';\nimport { jsonldEquals, sparqlEquals } from '@/helpers/testing';\nimport type { EqualityResult } from '@/helpers/testing';\n\ninterface FormatResultOptions {\n context: jest.MatcherContext;\n hint: string;\n expected: unknown;\n received: unknown;\n}\n\nfunction formatResult(result: EqualityResult, options: FormatResultOptions) {\n const pass = result.success;\n const utils = options.context.utils;\n const message = pass\n ? () => [\n result.message,\n utils.matcherHint(options.hint),\n [\n `Expected: not ${utils.printExpected(options.expected)}`,\n `Received: ${utils.printReceived(options.received)}`,\n ].join('\\n'),\n ].join('\\n\\n')\n : () => {\n const diffString = diff(options.expected, options.received, {\n expand: options.context.expand,\n });\n\n return [\n result.message,\n utils.matcherHint(options.hint),\n diffString && diffString.includes('- Expect')\n ? `Difference:\\n\\n${diffString}`\n : [\n `Expected: ${utils.printExpected(options.expected)}`,\n `Received: ${utils.printReceived(options.received)}`,\n ].join('\\n'),\n ].join('\\n\\n');\n };\n\n return { pass, message };\n}\n\nconst matchers: jest.ExpectExtendMap = {\n async toEqualJsonLD(received, expected) {\n const result = await jsonldEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualJsonLD',\n expected,\n received,\n });\n },\n toEqualSparql(received, expected) {\n const result = sparqlEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualSparql',\n expected: normalizeSparql(expected),\n received: normalizeSparql(received),\n });\n },\n};\n\nexport default matchers;\n","import assertions from './assertions';\n\nexport function installChaiPlugin(): void {\n chai.use(_chai => Object.entries(assertions).forEach(([name, method]) => _chai.Assertion.addMethod(name, method)));\n}\n","import matchers from './matchers';\n\nexport function installJestPlugin(): void {\n expect.extend(matchers);\n}\n"],"names":["SolidDocumentFormat","MalformedSolidDocumentError","documentUrl","documentFormat","malformationDetails","errorMessage","Error","NetworkRequestError","url","NotFoundError","UnauthorizedError","responseStatus","this","undefined","knownPrefixes","foaf","pim","purl","rdfs","schema","solid","vcard","expandIRI","iri","options","startsWith","split","prefix","name","expandedPrefix","extraContext","_options$extraContext","defaultPrefix","SolidThing","quads","property","find","quad","predicate","value","_this$quads$find","object","filter","map","SolidDocument","headers","statements","length","statement","get","_this$headers$get","match","parseDate","_this$statement","getLatestDocumentDate","subject","_this","_this2","dates","date","reduce","a","b","isJsonLDGraph","jsonld","fetchRawSolidDocument","fetch","Accept","response","status","includes","text","body","_context","normalizeBlankNodes","normalizedQuads","slice","quadsIndexes","blankNodeIds","arr","flatMap","index","ids","arrayFilter","termType","id","Set","add","unique","originalId","normalizedId","md5","sorted","join","terms","Object","entries","termName","termValue","N3BlankNode","arrayReplace","N3Quad","createSolidDocument","window","turtleToQuads","method","Headers","fetchSolidDocument","data","jsonldToQuads","Promise","all","graphQuads","flat","toRDF","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","quadToTurtle","sort","concat","toUpperCase","quadsToTurtle","TurtleWriter","quadsToString","solidDocumentExists","document","isEmpty","operations","matchAll","_toConsumableArray","operationName","toLowerCase","operationBody","turtleToQuadsSync","turtle","parserOptions","objectWithoutEmpty","baseIRI","parser","TurtleParser","resolve","reject","parse","error","Turtle","message","push","updateSolidDocument","fetchUserProfile","webId","urlRoute","isPersonalProfile","storageUrls","storage","publicTypeIndex","privateTypeIndex","parentUrl","urlParentDirectory","silenced","parentDocument","isStorage","_document$statement","_document$statement2","avatarUrl","_document$statement3","_document$statement4","oidcIssuerUrl","_document$statement5","publicTypeIndexUrl","privateTypeIndexUrl","loginUrl","fetchProfile","replace","urlRoot","mintPrivateTypeIndexUrl","user","storageUrl","typeIndexUrl","uuid","profileUpdateBody","childrenType","typeIndex","containerQuad","contains","getThing","patternsRegExpsIndex","containsPatterns","test","quadValueEquals","expected","actual","patternAliases","patternMatches","patterns","expectedRegExp","patternMatch","patternIndex","pattern","RegExp","quadEquals","datatype","Date","getTime","quadObjectEquals","resetPatterns","jsonldEquals","expectedQuads","actualQuads","expectedTurtle","actualTurtle","result","success","expectedQuad","some","actualQuad","sparqlEquals","expectedOperations","actualOperations","keys","pull","unexpectedOperation","turtleEquals","assertions","graph","_obj","assert","bind","query","formatResult","pass","utils","context","matcherHint","hint","printExpected","printReceived","received","diffString","diff","expand","matchers","toEqualJsonLD","toEqualSparql","chai","use","_chai","forEach","Assertion","addMethod","expect","extend"],"mappings":"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"}
1
+ {"version":3,"file":"noeldemartin-solid-utils.cjs.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/SolidDocument.ts","../src/helpers/jsonld.ts","../src/helpers/io.ts","../src/helpers/auth.ts","../src/helpers/identifiers.ts","../src/helpers/interop.ts","../src/helpers/testing.ts","../src/plugins/chai/assertions.ts","../src/plugins/jest/matchers.ts","../src/plugins/chai/index.ts","../src/plugins/jest/index.ts"],"sourcesContent":["import { Error } 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 Error {\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 { Error } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Request failed trying to fetch ${url}`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NotFoundError extends Error {\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 { Error } 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 Error {\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'\n ? this.responseStatus === 403\n : 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 foaf: 'http://xmlns.com/foaf/0.1/',\n pim: 'http://www.w3.org/ns/pim/space#',\n purl: 'http://purl.org/dc/terms/',\n rdfs: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\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'))\n return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix)\n throw new Error(`Can't expand IRI with unknown prefix: '${iri}'`);\n\n return expandedPrefix + name;\n }\n\n if (!options.defaultPrefix)\n throw new Error(`Can't expand IRI without a default prefix: '${iri}'`);\n\n return options.defaultPrefix + prefix;\n}\n","import type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/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\n .find(quad => quad.predicate.value === expandIRI(property))\n ?.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 { parseDate } from '@noeldemartin/utils';\nimport type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport default class SolidDocument {\n\n public readonly url: string;\n public readonly headers: Headers;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n this.url = url;\n this.quads = quads;\n this.headers = headers;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(\n this.url,\n expandIRI('rdfs:type'),\n expandIRI('foaf:PersonalProfileDocument'),\n );\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 getLastModified(): Date | null {\n return parseDate(this.headers.get('last-modified'))\n ?? parseDate(this.statement(this.url, 'purl:modified')?.object.value)\n ?? this.getLatestDocumentDate()\n ?? null;\n }\n\n public statements(subject?: string, predicate?: string, object?: string): Quad[] {\n return this.quads.filter(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n }\n\n public statement(subject?: string, predicate?: string, object?: string): Quad | null {\n const statement = this.quads.find(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\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 private getLatestDocumentDate(): Date | null {\n const dates = [\n ...this.statements(undefined, 'purl:modified'),\n ...this.statements(undefined, 'purl:created'),\n ]\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}\n","export 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 = { '@graph': JsonLDResource[] };\n\nexport function isJsonLDGraph(jsonld: JsonLD): jsonld is JsonLDGraph {\n return '@graph' in jsonld;\n}\n","import { arr, arrayFilter, arrayReplace,objectWithoutEmpty } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';\nimport type { JsonLdDocument } from 'jsonld';\nimport { toRDF } from 'jsonld';\nimport md5 from 'md5';\nimport type { Quad } from 'rdf-js';\nimport type { Term as N3Term } from 'n3';\n\nimport SolidDocument from '@/models/SolidDocument';\n\nimport MalformedSolidDocumentError, { SolidDocumentFormat } from '@/errors/MalformedSolidDocumentError';\nimport NetworkRequestError from '@/errors/NetworkRequestError';\nimport NotFoundError from '@/errors/NotFoundError';\nimport UnauthorizedError from '@/errors/UnauthorizedError';\nimport { isJsonLDGraph } from '@/helpers/jsonld';\nimport type { JsonLD } from '@/helpers/jsonld';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type AnyFetch = (input: any, options?: any) => Promise<any>;\nexport declare type TypedFetch = (input: RequestInfo, options?: RequestInit) => Promise<Response>;\nexport declare type Fetch = TypedFetch | AnyFetch;\n\nasync function fetchRawSolidDocument(url: string, fetch: Fetch): Promise<{ body: string; headers: Headers }> {\n const options = {\n headers: { Accept: 'text/turtle' },\n };\n\n try {\n const response = await fetch(url, options);\n\n if (response.status === 404)\n throw new NotFoundError(url);\n\n if ([401, 403].includes(response.status))\n 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)\n throw error;\n\n throw new NetworkRequestError(url);\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 const ids = arrayFilter([\n quad.object.termType === 'BlankNode' ? quad.object.value : null,\n quad.subject.termType === 'BlankNode' ? quad.subject.value : null,\n ]);\n\n for (const id of ids) {\n quadsIndexes[id] = quadsIndexes[id] ?? new Set();\n quadsIndexes[id].add(index);\n }\n\n return ids;\n })\n .filter()\n .unique();\n\n for (const originalId of blankNodeIds) {\n const normalizedId = md5(\n arr(quadsIndexes[originalId])\n .map(index => quads[index])\n .filter(({ subject: { termType, value } }) => termType === 'BlankNode' && value === originalId)\n .map(\n ({ predicate, object }) => object.termType === 'BlankNode'\n ? predicate.value\n : predicate.value + object.value,\n )\n .sorted()\n .join(),\n );\n\n for (const index of quadsIndexes[originalId]) {\n const quad = normalizedQuads[index];\n const terms: Record<string, N3Term> = { subject: quad.subject as N3Term, object: quad.object as N3Term };\n\n for (const [termName, termValue] of Object.entries(terms)) {\n if (termValue.termType !== 'BlankNode' || termValue.value !== originalId)\n continue;\n\n terms[termName] = new N3BlankNode(normalizedId);\n }\n\n arrayReplace(normalizedQuads, quad, new N3Quad(terms.subject, quad.predicate as N3Term, terms.object));\n }\n }\n\n return normalizedQuads;\n}\n\nexport interface ParsingOptions {\n documentUrl: string;\n normalizeBlankNodes: boolean;\n}\n\nexport async function createSolidDocument(url: string, body: string, fetch?: Fetch): Promise<SolidDocument> {\n fetch = fetch ?? window.fetch;\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, fetch?: Fetch): Promise<SolidDocument> {\n const { body: data, headers } = await fetchRawSolidDocument(url, fetch ?? window.fetch);\n const statements = await turtleToQuads(data, { documentUrl: url });\n\n return new SolidDocument(url, statements, headers);\n}\n\nexport async function jsonldToQuads(jsonld: JsonLD): Promise<Quad[]> {\n if (isJsonLDGraph(jsonld)) {\n const graphQuads = await Promise.all(jsonld['@graph'].map(jsonldToQuads));\n\n return graphQuads.flat();\n }\n\n return toRDF(jsonld as JsonLdDocument) as Promise<Quad[]>;\n}\n\nexport function normalizeSparql(sparql: string): string {\n const quads = sparqlToQuadsSync(sparql);\n\n return Object\n .entries(quads)\n .reduce((normalizedOperations, [operation, quads]) => {\n const normalizedQuads = quads.map(quad => ' ' + quadToTurtle(quad)).sort().join('\\n');\n\n return normalizedOperations.concat(`${operation.toUpperCase()} DATA {\\n${normalizedQuads}\\n}`);\n }, [] as string[])\n .join(' ;\\n');\n}\n\nexport function quadsToTurtle(quads: Quad[]): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString(quads);\n}\n\nexport function quadToTurtle(quad: Quad): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, fetch?: Fetch): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, fetch);\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 = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all([...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 return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = sparql.matchAll(/(\\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 parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n const quads: Quad[] = [];\n\n return new Promise((resolve, reject) => {\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(\n options.documentUrl ?? null,\n SolidDocumentFormat.Turtle,\n error.message,\n ),\n );\n return;\n }\n\n if (!quad) {\n options.normalizeBlankNodes\n ? resolve(normalizeBlankNodes(quads))\n : resolve(quads);\n\n return;\n }\n\n quads.push(quad);\n });\n });\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes\n ? normalizeBlankNodes(quads)\n : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(\n options.documentUrl ?? 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;\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n","import { objectWithoutEmpty, silenced, urlParentDirectory, urlRoot, urlRoute } from '@noeldemartin/utils';\n\nimport { fetchSolidDocument } from './io';\nimport type { Fetch } from './io';\n\nexport interface SolidUserProfile {\n webId: string;\n storageUrls: string[];\n name?: string;\n avatarUrl?: string;\n oidcIssuerUrl?: string;\n publicTypeIndexUrl?: string;\n privateTypeIndexUrl?: string;\n}\n\nasync function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUserProfile> {\n const documentUrl = urlRoute(webId);\n const document = await fetchSolidDocument(documentUrl, fetch);\n\n if (!document.isPersonalProfile())\n throw new Error(`Document at ${documentUrl} is not a profile.`);\n\n const storageUrls = document.statements(webId, 'pim:storage').map(storage => storage.object.value);\n const publicTypeIndex = document.statement(webId, 'solid:publicTypeIndex');\n const privateTypeIndex = document.statement(webId, 'solid:privateTypeIndex');\n\n let parentUrl = urlParentDirectory(documentUrl);\n while (parentUrl && storageUrls.length === 0) {\n const parentDocument = await silenced(fetchSolidDocument(parentUrl, fetch));\n\n if (parentDocument?.isStorage()) {\n storageUrls.push(parentUrl);\n\n break;\n }\n\n parentUrl = urlParentDirectory(parentUrl);\n }\n\n return objectWithoutEmpty({\n webId,\n storageUrls,\n name:\n document.statement(webId, 'vcard:fn')?.object.value ??\n document.statement(webId, 'foaf:name')?.object.value,\n avatarUrl:\n document.statement(webId, 'vcard:hasPhoto')?.object.value ??\n document.statement(webId, 'foaf:img')?.object.value,\n oidcIssuerUrl: document.statement(webId, 'solid:oidcIssuer')?.object.value,\n publicTypeIndexUrl: publicTypeIndex?.object.value,\n privateTypeIndexUrl: privateTypeIndex?.object.value,\n });\n}\n\nexport async function fetchLoginUserProfile(loginUrl: string, fetch?: Fetch): Promise<SolidUserProfile | null> {\n const fetchProfile = silenced(url => fetchUserProfile(url, fetch));\n\n return await fetchProfile(loginUrl)\n ?? await fetchProfile(loginUrl.replace(/\\/$/, '').concat('/profile/card#me'))\n ?? await fetchProfile(urlRoot(loginUrl).concat('/profile/card#me'));\n}\n","import { arr, isArray, isObject, objectDeepClone, objectWithoutEmpty, tap, urlParse, uuid } from '@noeldemartin/utils';\nimport type { UrlParts } from '@noeldemartin/utils';\nimport type { JsonLD, JsonLDResource } from '@/helpers';\n\nexport interface SubjectParts {\n containerUrl?: string;\n documentName?: string;\n resourceHash?: string;\n}\n\nfunction getContainerPath(parts: UrlParts): string | null {\n if (!parts.path || !parts.path.startsWith('/'))\n return null;\n\n if (parts.path.match(/^\\/[^/]*$/))\n return '/';\n\n return `/${arr(parts.path.split('/')).filter().slice(0, -1).join('/')}/`.replace('//', '/');\n}\n\nfunction getContainerUrl(parts: UrlParts): string | null {\n const containerPath = getContainerPath(parts);\n\n return parts.protocol && parts.domain\n ? `${parts.protocol}://${parts.domain}${containerPath ?? '/'}`\n : containerPath;\n}\n\nfunction __mintJsonLDIdentifiers(jsonld: JsonLD): void {\n if (!('@type' in jsonld) || '@value' in jsonld)\n return;\n\n jsonld['@id'] = jsonld['@id'] ?? uuid();\n\n for (const propertyValue of Object.values(jsonld)) {\n if (isObject(propertyValue))\n __mintJsonLDIdentifiers(propertyValue);\n\n if (isArray(propertyValue))\n propertyValue.forEach(value => isObject(value) && __mintJsonLDIdentifiers(value));\n }\n}\n\nexport function mintJsonLDIdentifiers(jsonld: JsonLD): JsonLDResource {\n return tap(objectDeepClone(jsonld) as JsonLDResource, clone => __mintJsonLDIdentifiers(clone));\n}\n\nexport function parseResourceSubject(subject: string): SubjectParts {\n const parts = urlParse(subject);\n\n return !parts ? {} : objectWithoutEmpty({\n containerUrl: getContainerUrl(parts),\n documentName: parts.path ? parts.path.split('/').pop() : null,\n resourceHash: parts.fragment,\n });\n}\n","import { uuid } from '@noeldemartin/utils';\n\nimport { createSolidDocument, fetchSolidDocument, solidDocumentExists, updateSolidDocument } from '@/helpers/io';\nimport type SolidThing from '@/models/SolidThing';\nimport type { Fetch } from '@/helpers/io';\nimport type { SolidUserProfile } from '@/helpers/auth';\n\nasync function mintPrivateTypeIndexUrl(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const storageUrl = user.storageUrls[0];\n const typeIndexUrl = `${storageUrl}settings/privateTypeIndex`;\n\n return await solidDocumentExists(typeIndexUrl, fetch)\n ? `${storageUrl}settings/privateTypeIndex-${uuid()}`\n : typeIndexUrl;\n}\n\nexport async function createPrivateTypeIndex(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const typeIndexUrl = await mintPrivateTypeIndexUrl(user, fetch);\n const typeIndexBody = `\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n `;\n const profileUpdateBody = `\n INSERT DATA {\n <${user.webId}> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <${typeIndexUrl}> .\n }\n `;\n\n await Promise.all([\n createSolidDocument(typeIndexUrl, typeIndexBody, fetch),\n updateSolidDocument(user.webId, profileUpdateBody, fetch),\n ]);\n\n return typeIndexUrl;\n}\n\nexport async function findContainerRegistration(\n typeIndexUrl: string,\n childrenType: string,\n fetch?: Fetch,\n): Promise<SolidThing | null> {\n const typeIndex = await fetchSolidDocument(typeIndexUrl, fetch);\n const containerQuad = typeIndex\n .statements(undefined, 'rdfs:type', 'solid:TypeRegistration')\n .find(\n statement =>\n typeIndex.contains(statement.subject.value, 'solid:forClass', childrenType) &&\n typeIndex.contains(statement.subject.value, 'solid:instanceContainer'),\n );\n\n return containerQuad\n ? typeIndex.getThing(containerQuad.subject.value) ?? null\n : null;\n}\n","import { Error, arrayRemove, pull } from '@noeldemartin/utils';\nimport type { JsonLD } from '@/helpers/jsonld';\nimport type { Quad, Quad_Object } from 'rdf-js';\n\nimport { jsonldToQuads, quadToTurtle, quadsToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';\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 Error {\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)\n throw new ExpectedQuadAssertionError(expectedQuad);\n\n arrayRemove(actualQuads, matchingQuad);\n }\n}\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[(.*\\]\\[)?([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n if (!containsPatterns(expected))\n return expected === actual;\n\n const patternAliases = [];\n\n if (!(expected in patternsRegExpsIndex)) {\n const patternMatches = expected.matchAll(/\\[\\[((.*?)\\]\\[)?([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n if (patternMatch[2]) {\n patternAliases.push(patternMatch[2]);\n }\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 patternsRegExpsIndex[expected] = new RegExp(expectedRegExp);\n }\n\n return patternsRegExpsIndex[expected].test(actual);\n}\n\nfunction quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {\n if (expected.termType !== actual.termType)\n return false;\n\n if (expected.termType === 'Literal' && actual.termType === 'Literal') {\n if (expected.datatype.value !== actual.datatype.value)\n 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 quadObjectEquals(expected.object, actual.object)\n && quadValueEquals(expected.subject.value, actual.subject.value)\n && quadValueEquals(expected.predicate.value, actual.predicate.value);\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))\n 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))\n 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))\n 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)\n 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))\n throw error;\n\n return result(false, error.message);\n }\n\n return result(true, 'turtle matches');\n}\n","import { sparqlEquals, turtleEquals } from '@/helpers/testing';\n\ntype CustomAssertions = {\n [assertion in keyof typeof assertions]: typeof assertions[assertion];\n};\n\ndeclare global {\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Chai {\n\n interface Assertion extends CustomAssertions {}\n interface Include extends CustomAssertions {}\n\n }\n\n}\n\nconst assertions: Record<string, (this: Chai.AssertionStatic, ...args: any[]) => void> = {\n turtle(graph: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = graph;\n const result = turtleEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n sparql(query: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = query;\n const result = sparqlEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n};\n\nexport default assertions;\n","import { normalizeSparql } from '@/helpers/io';\nimport { jsonldEquals, sparqlEquals } from '@/helpers/testing';\nimport type { EqualityResult } from '@/helpers/testing';\n\ninterface FormatResultOptions {\n context: jest.MatcherContext;\n hint: string;\n expected: unknown;\n received: unknown;\n}\n\nfunction formatResult(result: EqualityResult, options: FormatResultOptions) {\n const pass = result.success;\n const utils = options.context.utils;\n const message = pass\n ? () => [\n result.message,\n utils.matcherHint(options.hint),\n [\n `Expected: not ${utils.printExpected(options.expected)}`,\n `Received: ${utils.printReceived(options.received)}`,\n ].join('\\n'),\n ].join('\\n\\n')\n : () => {\n return [\n result.message,\n utils.matcherHint(options.hint),\n ].join('\\n\\n');\n };\n\n return { pass, message };\n}\n\nconst matchers: jest.ExpectExtendMap = {\n async toEqualJsonLD(received, expected) {\n const result = await jsonldEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualJsonLD',\n expected,\n received,\n });\n },\n toEqualSparql(received, expected) {\n const result = sparqlEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualSparql',\n expected: normalizeSparql(expected),\n received: normalizeSparql(received),\n });\n },\n};\n\nexport default matchers;\n","import assertions from './assertions';\n\nexport function installChaiPlugin(): void {\n chai.use(_chai => Object.entries(assertions).forEach(([name, method]) => _chai.Assertion.addMethod(name, method)));\n}\n","import matchers from './matchers';\n\nexport function installJestPlugin(): void {\n expect.extend(matchers);\n}\n"],"names":["SolidDocumentFormat","MalformedSolidDocumentError","documentUrl","documentFormat","malformationDetails","errorMessage","Error","NetworkRequestError","url","NotFoundError","UnauthorizedError","responseStatus","this","undefined","knownPrefixes","foaf","pim","purl","rdfs","schema","solid","vcard","expandIRI","iri","options","startsWith","split","prefix","name","expandedPrefix","extraContext","_options$extraContext","defaultPrefix","SolidThing","quads","property","find","quad","predicate","value","_this$quads$find","object","filter","map","SolidDocument","headers","statements","length","statement","get","_this$headers$get","match","parseDate","_this$statement","getLatestDocumentDate","subject","_this","_this2","dates","date","reduce","a","b","isJsonLDGraph","jsonld","fetchRawSolidDocument","fetch","Accept","response","status","includes","text","body","_context","normalizeBlankNodes","normalizedQuads","slice","quadsIndexes","blankNodeIds","arr","flatMap","index","ids","arrayFilter","termType","id","Set","add","unique","originalId","normalizedId","md5","sorted","join","terms","Object","entries","termName","termValue","N3BlankNode","arrayReplace","N3Quad","createSolidDocument","window","turtleToQuads","method","Headers","fetchSolidDocument","data","jsonldToQuads","Promise","all","graphQuads","flat","toRDF","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","quadToTurtle","sort","concat","toUpperCase","quadsToTurtle","TurtleWriter","quadsToString","solidDocumentExists","document","isEmpty","operations","matchAll","_toConsumableArray","operationName","toLowerCase","operationBody","turtleToQuadsSync","turtle","parserOptions","objectWithoutEmpty","baseIRI","parser","TurtleParser","resolve","reject","parse","error","Turtle","message","push","updateSolidDocument","fetchUserProfile","webId","urlRoute","isPersonalProfile","storageUrls","storage","publicTypeIndex","privateTypeIndex","parentUrl","urlParentDirectory","silenced","parentDocument","isStorage","_document$statement","_document$statement2","avatarUrl","_document$statement3","_document$statement4","oidcIssuerUrl","_document$statement5","publicTypeIndexUrl","privateTypeIndexUrl","loginUrl","fetchProfile","replace","urlRoot","getContainerUrl","parts","containerPath","path","getContainerPath","protocol","domain","__mintJsonLDIdentifiers","uuid","values","propertyValue","isObject","isArray","forEach","mintPrivateTypeIndexUrl","user","storageUrl","typeIndexUrl","profileUpdateBody","childrenType","typeIndex","containerQuad","contains","getThing","patternsRegExpsIndex","builtInPatterns","ExpectedQuadAssertionError","expectedQuad","assertExpectedQuadsExist","expectedQuads","actualQuads","matchingQuad","actualQuad","actual","expected","datatype","containsPatterns","Date","getTime","quadValueEquals","quadObjectEquals","arrayRemove","test","patternAliases","patternMatches","patterns","expectedRegExp","patternMatch","patternIndex","pattern","RegExp","resetPatterns","jsonldEquals","expectedTurtle","actualTurtle","result","success","sparqlEquals","expectedOperations","actualOperations","keys","pull","unexpectedOperation","turtleEquals","assertions","graph","_obj","assert","bind","query","formatResult","pass","utils","context","matcherHint","hint","printExpected","printReceived","received","matchers","toEqualJsonLD","toEqualSparql","chai","use","_chai","Assertion","addMethod","expect","extend","tap","objectDeepClone","clone","urlParse","containerUrl","documentName","pop","resourceHash","fragment"],"mappings":"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"}
@@ -77,6 +77,8 @@ export declare class MalformedSolidDocumentError extends Error_2 {
77
77
  constructor(documentUrl: string | null, documentFormat: SolidDocumentFormat, malformationDetails: string);
78
78
  }
79
79
 
80
+ export declare function mintJsonLDIdentifiers(jsonld: JsonLD): JsonLDResource;
81
+
80
82
  export declare class NetworkRequestError extends Error_2 {
81
83
  readonly url: string;
82
84
  constructor(url: string);
@@ -89,6 +91,8 @@ export declare class NotFoundError extends Error_2 {
89
91
  constructor(url: string);
90
92
  }
91
93
 
94
+ export declare function parseResourceSubject(subject: string): SubjectParts;
95
+
92
96
  export declare interface ParsingOptions {
93
97
  documentUrl: string;
94
98
  normalizeBlankNodes: boolean;
@@ -146,6 +150,12 @@ export declare function sparqlToQuads(sparql: string, options?: Partial<ParsingO
146
150
 
147
151
  export declare function sparqlToQuadsSync(sparql: string, options?: Partial<ParsingOptions>): Record<string, Quad[]>;
148
152
 
153
+ export declare interface SubjectParts {
154
+ containerUrl?: string;
155
+ documentName?: string;
156
+ resourceHash?: string;
157
+ }
158
+
149
159
  export declare function turtleEquals(expected: string, actual: string): EqualityResult;
150
160
 
151
161
  export declare function turtleToQuads(turtle: string, options?: Partial<ParsingOptions>): Promise<Quad[]>;
@@ -1,2 +1,2 @@
1
- import"core-js/modules/es.reflect.construct.js";import e from"@babel/runtime/helpers/esm/classCallCheck";import t from"@babel/runtime/helpers/esm/inherits";import r from"@babel/runtime/helpers/esm/possibleConstructorReturn";import n from"@babel/runtime/helpers/esm/getPrototypeOf";import"core-js/modules/es.array.concat.js";import{Error as o,parseDate as s,objectWithoutEmpty as u,arr as a,arrayFilter as c,arrayReplace as i,silenced as l,urlParentDirectory as f,urlRoute as p,urlRoot as d,uuid as m,pull as v}from"@noeldemartin/utils";import h from"@babel/runtime/helpers/esm/createClass";import y from"@babel/runtime/helpers/esm/asyncToGenerator";import j from"@babel/runtime/regenerator";import"core-js/modules/es.array.map.js";import"core-js/modules/es.regexp.exec.js";import"core-js/modules/es.string.replace.js";import"core-js/modules/es.function.name.js";import"core-js/modules/es.array.from.js";import"core-js/modules/es.symbol.js";import"core-js/modules/es.symbol.description.js";import"core-js/modules/es.symbol.iterator.js";import b from"@babel/runtime/helpers/esm/toConsumableArray";import w from"@babel/runtime/helpers/esm/slicedToArray";import"core-js/modules/es.array.slice.js";import"core-js/modules/es.array.filter.js";import"core-js/modules/es.array.flat-map.js";import"core-js/modules/es.array.unscopables.flat-map.js";import"core-js/modules/es.array.iterator.js";import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.set.js";import"core-js/modules/es.string.iterator.js";import"core-js/modules/esnext.set.add-all.js";import"core-js/modules/esnext.set.delete-all.js";import"core-js/modules/esnext.set.difference.js";import"core-js/modules/esnext.set.every.js";import"core-js/modules/esnext.set.filter.js";import"core-js/modules/esnext.set.find.js";import"core-js/modules/esnext.set.intersection.js";import"core-js/modules/esnext.set.is-disjoint-from.js";import"core-js/modules/esnext.set.is-subset-of.js";import"core-js/modules/esnext.set.is-superset-of.js";import"core-js/modules/esnext.set.join.js";import"core-js/modules/esnext.set.map.js";import"core-js/modules/esnext.set.reduce.js";import"core-js/modules/esnext.set.some.js";import"core-js/modules/esnext.set.symmetric-difference.js";import"core-js/modules/esnext.set.union.js";import"core-js/modules/web.dom-collections.iterator.js";import"core-js/modules/es.array.join.js";import"core-js/modules/es.object.entries.js";import"core-js/modules/es.string.match-all.js";import"core-js/modules/es.array.includes.js";import"core-js/modules/es.promise.js";import"core-js/modules/es.array.flat.js";import{Writer as x,Parser as g,BlankNode as k,Quad as T}from"n3";import{toRDF as E}from"jsonld";import R from"md5";import"core-js/modules/es.string.match.js";import"core-js/modules/es.array.find.js";import"core-js/modules/es.string.starts-with.js";import"core-js/modules/es.string.split.js";import A from"@babel/runtime/helpers/esm/typeof";import"core-js/modules/es.regexp.constructor.js";import"core-js/modules/es.regexp.to-string.js";import"core-js/modules/es.object.keys.js";import"core-js/modules/web.dom-collections.for-each.js";import"core-js/modules/es.string.includes.js";import I from"jest-diff";function S(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,s=n(e);if(t){var u=n(this).constructor;o=Reflect.construct(s,arguments,u)}else o=s.apply(this,arguments);return r(this,o)}}var P;!function(e){e.Turtle="Turtle"}(P||(P={}));var D=function(r){t(MalformedSolidDocumentError,o);var n=S(MalformedSolidDocumentError);function MalformedSolidDocumentError(t,r,o){var s;return e(this,MalformedSolidDocumentError),(s=n.call(this,function(e,t,r){return e?"Malformed ".concat(t," document found at ").concat(e," - ").concat(r):"Malformed ".concat(t," document - ").concat(r)}(t,r,o))).documentUrl=t,s.documentFormat=r,s.malformationDetails=o,s}return MalformedSolidDocumentError}();function U(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,s=n(e);if(t){var u=n(this).constructor;o=Reflect.construct(s,arguments,u)}else o=s.apply(this,arguments);return r(this,o)}}var q=function(r){t(NetworkRequestError,o);var n=U(NetworkRequestError);function NetworkRequestError(t){var r;return e(this,NetworkRequestError),(r=n.call(this,"Request failed trying to fetch ".concat(t))).url=t,r}return NetworkRequestError}();function N(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,s=n(e);if(t){var u=n(this).constructor;o=Reflect.construct(s,arguments,u)}else o=s.apply(this,arguments);return r(this,o)}}var C=function(r){t(NotFoundError,o);var n=N(NotFoundError);function NotFoundError(t){var r;return e(this,NotFoundError),(r=n.call(this,"Document with '".concat(t,"' url not found"))).url=t,r}return NotFoundError}();function B(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,s=n(e);if(t){var u=n(this).constructor;o=Reflect.construct(s,arguments,u)}else o=s.apply(this,arguments);return r(this,o)}}var O=function(r){t(UnauthorizedError,o);var n=B(UnauthorizedError);function UnauthorizedError(t,r){var o;return e(this,UnauthorizedError),(o=n.call(this,function(e,t){return"Unauthorized".concat(403===t?" (Forbidden)":"",": ").concat(e)}(t,r))).url=t,o.responseStatus=r,o}return h(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(),z={foaf:"http://xmlns.com/foaf/0.1/",pim:"http://www.w3.org/ns/pim/space#",purl:"http://purl.org/dc/terms/",rdfs:"http://www.w3.org/1999/02/22-rdf-syntax-ns#",schema:"https://schema.org/",solid:"http://www.w3.org/ns/solid/terms#",vcard:"http://www.w3.org/2006/vcard/ns#"};function M(e,t){z[e]=t}function L(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=w(r,2),o=n[0],s=n[1];if(s){var u,a,c,i=null!==(u=null!==(a=z[o])&&void 0!==a?a:null===(c=t.extraContext)||void 0===c?void 0:c[o])&&void 0!==u?u:null;if(!i)throw new Error("Can't expand IRI with unknown prefix: '".concat(e,"'"));return i+s}if(!t.defaultPrefix)throw new Error("Can't expand IRI without a default prefix: '".concat(e,"'"));return t.defaultPrefix+o}var F=function(){function t(r,n){e(this,t),this.url=r,this.quads=n}return h(t,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===L(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===L(e)})).map((function(e){return e.object.value}))}}]),t}(),$=function(){function t(r,n,o){e(this,t),this.url=r,this.quads=n,this.headers=o}return h(t,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,L("rdfs:type"),L("foaf:PersonalProfileDocument"))}},{key:"isStorage",value:function(){var e;return!(null===(e=this.headers.get("Link"))||void 0===e||!e.match(/<http:\/\/www\.w3\.org\/ns\/pim\/space#Storage>;[^,]+rel="type"/))}},{key:"getLastModified",value:function(){var e,t,r,n;return null!==(e=null!==(t=null!==(r=s(this.headers.get("last-modified")))&&void 0!==r?r:s(null===(n=this.statement(this.url,"purl:modified"))||void 0===n?void 0:n.object.value))&&void 0!==t?t:this.getLatestDocumentDate())&&void 0!==e?e:null}},{key:"statements",value:function(e,t,r){var n=this;return this.quads.filter((function(o){return!(r&&o.object.value!==L(r,{defaultPrefix:n.url})||e&&o.subject.value!==L(e,{defaultPrefix:n.url})||t&&o.predicate.value!==L(t,{defaultPrefix:n.url}))}))}},{key:"statement",value:function(e,t,r){var n=this,o=this.quads.find((function(o){return!(r&&o.object.value!==L(r,{defaultPrefix:n.url})||e&&o.subject.value!==L(e,{defaultPrefix:n.url})||t&&o.predicate.value!==L(t,{defaultPrefix:n.url}))}));return null!=o?o:null}},{key:"contains",value:function(e,t,r){return null!==this.statement(e,t,r)}},{key:"getThing",value:function(e){var t=this.statements(e);return new F(e,t)}},{key:"getLatestDocumentDate",value:function(){var e=[].concat(b(this.statements(void 0,"purl:modified")),b(this.statements(void 0,"purl:created"))).map((function(e){return s(e.object.value)})).filter((function(e){return null!==e}));return e.length>0?e.reduce((function(e,t){return e>t?e:t})):null}}]),t}();function H(e){return"@graph"in e}function J(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return _(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return _(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,u=!0,a=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return u=e.done,e},e:function(e){a=!0,s=e},f:function(){try{u||null==r.return||r.return()}finally{if(a)throw s}}}}function _(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function G(e,t){return W.apply(this,arguments)}function W(){return(W=y(j.mark((function e(t,r){var n,o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={headers:{Accept:"text/turtle"}},e.prev=1,e.next=4,r(t,n);case 4:if(404!==(o=e.sent).status){e.next=7;break}throw new C(t);case 7:if(![401,403].includes(o.status)){e.next=9;break}throw new O(t,o.status);case 9:return e.next=11,o.text();case 11:return s=e.sent,e.abrupt("return",{body:s,headers:o.headers});case 15:if(e.prev=15,e.t0=e.catch(1),!(e.t0 instanceof O)){e.next=19;break}throw e.t0;case 19:throw new q(t);case 20:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function X(e){var t,r=e.slice(0),n={},o=a(e).flatMap((function(e,t){var r,o=c(["BlankNode"===e.object.termType?e.object.value:null,"BlankNode"===e.subject.termType?e.subject.value:null]),s=J(o);try{for(s.s();!(r=s.n()).done;){var u,a=r.value;n[a]=null!==(u=n[a])&&void 0!==u?u:new Set,n[a].add(t)}}catch(e){s.e(e)}finally{s.f()}return o})).filter().unique(),s=J(o);try{var u=function(){var o,s=t.value,u=R(a(n[s]).map((function(t){return e[t]})).filter((function(e){var t=e.subject,r=t.termType,n=t.value;return"BlankNode"===r&&n===s})).map((function(e){var t=e.predicate,r=e.object;return"BlankNode"===r.termType?t.value:t.value+r.value})).sorted().join()),c=J(n[s]);try{for(c.s();!(o=c.n()).done;){for(var l=o.value,f=r[l],p={subject:f.subject,object:f.object},d=0,m=Object.entries(p);d<m.length;d++){var v=w(m[d],2),h=v[0],y=v[1];"BlankNode"===y.termType&&y.value===s&&(p[h]=new k(u))}i(r,f,new T(p.subject,f.predicate,p.object))}}catch(e){c.e(e)}finally{c.f()}};for(s.s();!(t=s.n()).done;)u()}catch(e){s.e(e)}finally{s.f()}return r}function K(e,t,r){return Q.apply(this,arguments)}function Q(){return(Q=y(j.mark((function e(t,r,n){var o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch,e.next=3,ie(r);case 3:return s=e.sent,e.next=6,n(t,{method:"PUT",headers:{"Content-Type":"text/turtle"},body:r});case 6:return e.abrupt("return",new $(t,s,new Headers({})));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function V(e,t){return Y.apply(this,arguments)}function Y(){return(Y=y(j.mark((function e(t,r){var n,o,s,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,G(t,null!=r?r:window.fetch);case 2:return n=e.sent,o=n.body,s=n.headers,e.next=7,ie(o,{documentUrl:t});case 7:return u=e.sent,e.abrupt("return",new $(t,u,s));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Z(e){return ee.apply(this,arguments)}function ee(){return(ee=y(j.mark((function e(t){var r;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!H(t)){e.next=5;break}return e.next=3,Promise.all(t["@graph"].map(Z));case 3:return r=e.sent,e.abrupt("return",r.flat());case 5:return e.abrupt("return",E(t));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function te(e){var t=ce(e);return Object.entries(t).reduce((function(e,t){var r=w(t,2),n=r[0],o=r[1].map((function(e){return" "+ne(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(o,"\n}"))}),[]).join(" ;\n")}function re(e){return(new x).quadsToString(e)}function ne(e){return(new x).quadsToString([e]).slice(0,-1)}function oe(e,t){return se.apply(this,arguments)}function se(){return(se=y(j.mark((function e(t,r){var n;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,V(t,r);case 3:return n=e.sent,e.abrupt("return",!n.isEmpty());case 7:return e.prev=7,e.t0=e.catch(0),e.abrupt("return",!1);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}function ue(e){return ae.apply(this,arguments)}function ae(){return(ae=y(j.mark((function e(t){var r,n,o,s=arguments;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>1&&void 0!==s[1]?s[1]:{},n=t.matchAll(/(\w+) DATA {([^}]+)}/g),o={},e.next=5,Promise.all(b(n).map(function(){var e=y(j.mark((function e(t){var n,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),s=t[2],e.next=4,ie(s,r);case 4:o[n]=e.sent;case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 5:return e.abrupt("return",o);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ce(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.matchAll(/(\w+) DATA {([^}]+)}/g),o={},s=J(n);try{for(s.s();!(t=s.n()).done;){var u=t.value,a=u[1].toLowerCase(),c=u[2];o[a]=fe(c,r)}}catch(e){s.e(e)}finally{s.f()}return o}function ie(e){return le.apply(this,arguments)}function le(){return(le=y(j.mark((function e(t){var r,n,o,s,a=arguments;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=a.length>1&&void 0!==a[1]?a[1]:{},n=u({baseIRI:r.documentUrl}),o=new g(n),s=[],e.abrupt("return",new Promise((function(e,n){o.parse(t,(function(t,o){var u;t?n(new D(null!==(u=r.documentUrl)&&void 0!==u?u:null,P.Turtle,t.message)):o?s.push(o):r.normalizeBlankNodes?e(X(s)):e(s)}))})));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function fe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=u({baseIRI:t.documentUrl}),n=new g(r);try{var o=n.parse(e);return t.normalizeBlankNodes?X(o):o}catch(e){var s;throw new D(null!==(s=t.documentUrl)&&void 0!==s?s:null,P.Turtle,e.message)}}function pe(e,t,r){return de.apply(this,arguments)}function de(){return(de=y(j.mark((function e(t,r,n){var o;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch,e.next=3,n(t,{method:"PATCH",headers:{"Content-Type":"application/sparql-update"},body:r});case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function me(e,t){return ve.apply(this,arguments)}function ve(){return(ve=y(j.mark((function e(t,r){var n,o,s,a,c,i,d,m,v,h,y,b,w,x;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return m=p(t),e.next=3,V(m,r);case 3:if((v=e.sent).isPersonalProfile()){e.next=6;break}throw new Error("Document at ".concat(m," is not a profile."));case 6:h=v.statements(t,"pim:storage").map((function(e){return e.object.value})),y=v.statement(t,"solid:publicTypeIndex"),b=v.statement(t,"solid:privateTypeIndex"),w=f(m);case 10:if(!w||0!==h.length){e.next=20;break}return e.next=13,l(V(w,r));case 13:if(null==(x=e.sent)||!x.isStorage()){e.next=17;break}return h.push(w),e.abrupt("break",20);case 17:w=f(w),e.next=10;break;case 20:return e.abrupt("return",u({webId:t,storageUrls:h,name:null!==(n=null===(o=v.statement(t,"vcard:fn"))||void 0===o?void 0:o.object.value)&&void 0!==n?n:null===(s=v.statement(t,"foaf:name"))||void 0===s?void 0:s.object.value,avatarUrl:null!==(a=null===(c=v.statement(t,"vcard:hasPhoto"))||void 0===c?void 0:c.object.value)&&void 0!==a?a:null===(i=v.statement(t,"foaf:img"))||void 0===i?void 0:i.object.value,oidcIssuerUrl:null===(d=v.statement(t,"solid:oidcIssuer"))||void 0===d?void 0:d.object.value,publicTypeIndexUrl:null==y?void 0:y.object.value,privateTypeIndexUrl:null==b?void 0:b.object.value}));case 21:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function he(e,t){return ye.apply(this,arguments)}function ye(){return(ye=y(j.mark((function e(t,r){var n,o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=l((function(e){return me(e,r)})),e.next=3,s(t);case 3:if(e.t2=o=e.sent,e.t1=null!==e.t2,!e.t1){e.next=7;break}e.t1=void 0!==o;case 7:if(!e.t1){e.next=11;break}e.t3=o,e.next=14;break;case 11:return e.next=13,s(t.replace(/\/$/,"").concat("/profile/card#me"));case 13:e.t3=e.sent;case 14:if(e.t4=n=e.t3,e.t0=null!==e.t4,!e.t0){e.next=18;break}e.t0=void 0!==n;case 18:if(!e.t0){e.next=22;break}e.t5=n,e.next=25;break;case 22:return e.next=24,s(d(t).concat("/profile/card#me"));case 24:e.t5=e.sent;case 25:return e.abrupt("return",e.t5);case 26:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function je(e,t){return be.apply(this,arguments)}function be(){return(be=y(j.mark((function e(t,r){var n,o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,o=t.storageUrls[0],s="".concat(o,"settings/privateTypeIndex"),e.next=5,oe(s,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(o,"settings/privateTypeIndex-").concat(m()),e.next=10;break;case 9:e.t0=s;case 10:return e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function we(e,t){return xe.apply(this,arguments)}function xe(){return(xe=y(j.mark((function e(t,r){var n,o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,e.next=3,je(t,r);case 3:return o=e.sent,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",s="\n INSERT DATA {\n <".concat(t.webId,"> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <").concat(o,"> .\n }\n "),K(o,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",r),pe(t.webId,s,r),e.abrupt("return",o);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ge(e,t,r){return ke.apply(this,arguments)}function ke(){return(ke=y(j.mark((function e(t,r,n){var o,s,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,V(t,n);case 2:return s=e.sent,u=s.statements(void 0,"rdfs:type","solid:TypeRegistration").find((function(e){return s.contains(e.subject.value,"solid:forClass",r)&&s.contains(e.subject.value,"solid:instanceContainer")})),e.abrupt("return",u&&null!==(o=s.getThing(u.subject.value))&&void 0!==o?o:null);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Te(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return Ee(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Ee(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,u=!0,a=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return u=e.done,e},e:function(e){a=!0,s=e},f:function(){try{u||null==r.return||r.return()}finally{if(a)throw s}}}}function Ee(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var Re={};function Ae(e){return/\[\[(.*\]\[)?([^\]]+)\]\]/.test(e)}function Ie(e,t){if(!Ae(e))return e===t;var r=[];if(!(e in Re)){var n,o=e.matchAll(/\[\[((.*)\]\[)?([^\]]+)\]\]/g),s=[],u=e,a=Te(o);try{for(a.s();!(n=a.n()).done;){var c=n.value;c[2]&&r.push(c[2]),s.push(c[3]),u=u.replace(c[0],"%PATTERN".concat(s.length-1,"%"))}}catch(e){a.e(e)}finally{a.f()}u=u.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");for(var i=0,l=Object.entries(s);i<l.length;i++){var f=w(l[i],2),p=f[0],d=f[1];u=u.replace("%PATTERN".concat(p,"%"),d)}Re[e]=new RegExp(u)}return Re[e].test(t)}function Se(e,t){return function(e,t){if(e.termType!==t.termType)return!1;if("Literal"===e.termType&&"Literal"===t.termType){if(e.datatype.value!==t.datatype.value)return!1;if(!Ae(e.value))return"http://www.w3.org/2001/XMLSchema#dateTime"===e.datatype.value?new Date(e.value).getTime()===new Date(t.value).getTime():e.value===t.value}return Ie(e.value,t.value)}(e.object,t.object)&&Ie(e.subject.value,t.subject.value)&&Ie(e.predicate.value,t.predicate.value)}function Pe(){Re={}}function De(e,t){return Ue.apply(this,arguments)}function Ue(){return(Ue=y(j.mark((function e(t,r){var n,o,s,u,a,c,i,l,f;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return Pe(),e.next=3,Z(t);case 3:return n=e.sent,e.next=6,Z(r);case 6:if(o=e.sent,s=re(n),u=re(o),a=function(e,t){return{success:e,message:t,expected:s,actual:u}},n.length===o.length){e.next=12;break}return e.abrupt("return",a(!1,"Expected ".concat(n.length," triples, found ").concat(o.length,".")));case 12:c=Te(n),e.prev=13,l=function(){var e=i.value;if(!o.some((function(t){return Se(e,t)})))return{v:a(!1,"Couldn't find the following triple: ".concat(ne(e)))}},c.s();case 16:if((i=c.n()).done){e.next=22;break}if(f=l(),"object"!==A(f)){e.next=20;break}return e.abrupt("return",f.v);case 20:e.next=16;break;case 22:e.next=27;break;case 24:e.prev=24,e.t0=e.catch(13),c.e(e.t0);case 27:return e.prev=27,c.f(),e.finish(27);case 30:return e.abrupt("return",a(!0,"jsonld matches"));case 31:case"end":return e.stop()}}),e,null,[[13,24,27,30]])})))).apply(this,arguments)}function qe(e,t){var r;Pe();for(var n=ce(e,{normalizeBlankNodes:!0}),o=ce(t,{normalizeBlankNodes:!0}),s=function(r,n){return{success:r,message:n,expected:e,actual:t}},u=0,a=Object.keys(n);u<a.length;u++){var c=a[u];if(!(c in o))return s(!1,"Couldn't find expected ".concat(c," operation."));var i=v(n,c),l=v(o,c);if(i.length!==l.length)return s(!1,"Expected ".concat(i.length," ").concat(c," triples, found ").concat(l.length,"."));var f,p=Te(i);try{var d=function(){var e=f.value;if(!l.some((function(t){return Se(e,t)})))return{v:s(!1,"Couldn't find the following ".concat(c," triple: ").concat(ne(e)))}};for(p.s();!(f=p.n()).done;){var m=d();if("object"===A(m))return m.v}}catch(e){p.e(e)}finally{p.f()}}var h=null!==(r=Object.keys(o)[0])&&void 0!==r?r:null;return h?s(!1,"Did not expect to find ".concat(h," triples.")):s(!0,"sparql matches")}function Ne(e,t){Pe();var r=fe(e,{normalizeBlankNodes:!0}),n=fe(t,{normalizeBlankNodes:!0}),o=function(r,n){return{success:r,message:n,expected:e,actual:t}};if(r.length!==n.length)return o(!1,"Expected ".concat(r.length," triples, found ").concat(n.length,"."));var s,u=Te(r);try{var a=function(){var e=s.value;if(!n.some((function(t){return Se(e,t)})))return{v:o(!1,"Couldn't find the following triple: ".concat(ne(e)))}};for(u.s();!(s=u.n()).done;){var c=a();if("object"===A(c))return c.v}}catch(e){u.e(e)}finally{u.f()}return o(!0,"turtle matches")}var Ce={turtle:function(e){var t=this._obj,r=this.assert.bind(this),n=Ne(e,t);r(n.success,n.message,"",n.expected,n.actual)},sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=qe(e,t);r(n.success,n.message,"",n.expected,n.actual)}};function Be(){chai.use((function(e){return Object.entries(Ce).forEach((function(t){var r=w(t,2),n=r[0],o=r[1];return e.Assertion.addMethod(n,o)}))}))}function Oe(e,t){var r=e.success,n=t.context.utils;return{pass:r,message:r?function(){return[e.message,n.matcherHint(t.hint),["Expected: not ".concat(n.printExpected(t.expected)),"Received: ".concat(n.printReceived(t.received))].join("\n")].join("\n\n")}:function(){var r=I(t.expected,t.received,{expand:t.context.expand});return[e.message,n.matcherHint(t.hint),r&&r.includes("- Expect")?"Difference:\n\n".concat(r):["Expected: ".concat(n.printExpected(t.expected)),"Received: ".concat(n.printReceived(t.received))].join("\n")].join("\n\n")}}}var ze={toEqualJsonLD:function(e,t){var r=this;return y(j.mark((function n(){var o;return j.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,De(t,e);case 2:return o=n.sent,n.abrupt("return",Oe(o,{context:r,hint:"toEqualJsonLD",expected:t,received:e}));case 4:case"end":return n.stop()}}),n)})))()},toEqualSparql:function(e,t){return Oe(qe(t,e),{context:this,hint:"toEqualSparql",expected:te(t),received:te(e)})}};function Me(){expect.extend(ze)}export{D as MalformedSolidDocumentError,q as NetworkRequestError,C as NotFoundError,$ as SolidDocument,P as SolidDocumentFormat,F as SolidThing,O as UnauthorizedError,we as createPrivateTypeIndex,K as createSolidDocument,M as defineIRIPrefix,L as expandIRI,he as fetchLoginUserProfile,V as fetchSolidDocument,ge as findContainerRegistration,Be as installChaiPlugin,Me as installJestPlugin,H as isJsonLDGraph,De as jsonldEquals,Z as jsonldToQuads,te as normalizeSparql,ne as quadToTurtle,re as quadsToTurtle,oe as solidDocumentExists,qe as sparqlEquals,ue as sparqlToQuads,ce as sparqlToQuadsSync,Ne as turtleEquals,ie as turtleToQuads,fe as turtleToQuadsSync,pe as updateSolidDocument};
1
+ import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.reflect.to-string-tag.js";import"core-js/modules/es.reflect.construct.js";import e from"@babel/runtime/helpers/esm/classCallCheck";import t from"@babel/runtime/helpers/esm/assertThisInitialized";import r from"@babel/runtime/helpers/esm/inherits";import n from"@babel/runtime/helpers/esm/possibleConstructorReturn";import o from"@babel/runtime/helpers/esm/getPrototypeOf";import s from"@babel/runtime/helpers/esm/defineProperty";import"core-js/modules/es.array.concat.js";import{Error as a,parseDate as u,objectWithoutEmpty as i,arr as c,arrayFilter as l,arrayReplace as f,urlRoot as p,silenced as d,urlParentDirectory as m,urlRoute as v,tap as h,objectDeepClone as j,urlParse as y,uuid as x,isObject as b,isArray as w,pull as g,arrayRemove as k}from"@noeldemartin/utils";import E from"@babel/runtime/helpers/esm/createClass";import T from"@babel/runtime/helpers/esm/asyncToGenerator";import R from"@babel/runtime/regenerator";import"core-js/modules/es.array.map.js";import"core-js/modules/esnext.async-iterator.map.js";import"core-js/modules/esnext.iterator.map.js";import"core-js/modules/es.regexp.exec.js";import"core-js/modules/es.string.replace.js";import"core-js/modules/es.function.name.js";import"core-js/modules/es.array.from.js";import"core-js/modules/es.regexp.test.js";import"core-js/modules/es.symbol.js";import"core-js/modules/es.symbol.description.js";import"core-js/modules/es.symbol.iterator.js";import A from"@babel/runtime/helpers/esm/toConsumableArray";import I from"@babel/runtime/helpers/esm/slicedToArray";import"core-js/modules/es.array.slice.js";import"core-js/modules/es.array.filter.js";import"core-js/modules/esnext.async-iterator.filter.js";import"core-js/modules/esnext.iterator.constructor.js";import"core-js/modules/esnext.iterator.filter.js";import"core-js/modules/es.array.flat-map.js";import"core-js/modules/es.array.unscopables.flat-map.js";import"core-js/modules/esnext.async-iterator.flat-map.js";import"core-js/modules/esnext.iterator.flat-map.js";import"core-js/modules/es.array.iterator.js";import"core-js/modules/es.set.js";import"core-js/modules/es.string.iterator.js";import"core-js/modules/esnext.set.add-all.js";import"core-js/modules/esnext.set.delete-all.js";import"core-js/modules/esnext.set.difference.js";import"core-js/modules/esnext.set.every.js";import"core-js/modules/esnext.set.filter.js";import"core-js/modules/esnext.set.find.js";import"core-js/modules/esnext.set.intersection.js";import"core-js/modules/esnext.set.is-disjoint-from.js";import"core-js/modules/esnext.set.is-subset-of.js";import"core-js/modules/esnext.set.is-superset-of.js";import"core-js/modules/esnext.set.join.js";import"core-js/modules/esnext.set.map.js";import"core-js/modules/esnext.set.reduce.js";import"core-js/modules/esnext.set.some.js";import"core-js/modules/esnext.set.symmetric-difference.js";import"core-js/modules/esnext.set.union.js";import"core-js/modules/web.dom-collections.iterator.js";import"core-js/modules/es.array.join.js";import"core-js/modules/es.object.entries.js";import"core-js/modules/esnext.async-iterator.reduce.js";import"core-js/modules/esnext.iterator.reduce.js";import"core-js/modules/es.array.sort.js";import"core-js/modules/es.string.match-all.js";import"core-js/modules/es.array.includes.js";import"core-js/modules/es.promise.js";import"core-js/modules/es.array.flat.js";import"core-js/modules/es.array.unscopables.flat.js";import{Writer as P,Parser as S,BlankNode as U,Quad as q}from"n3";import{toRDF as D}from"jsonld";import N from"md5";import"core-js/modules/es.string.match.js";import"core-js/modules/es.array.find.js";import"core-js/modules/esnext.async-iterator.find.js";import"core-js/modules/esnext.iterator.find.js";import"core-js/modules/es.string.starts-with.js";import"core-js/modules/es.string.split.js";import"core-js/modules/es.object.values.js";import"core-js/modules/esnext.async-iterator.for-each.js";import"core-js/modules/esnext.iterator.for-each.js";import"core-js/modules/web.dom-collections.for-each.js";import"core-js/modules/es.regexp.constructor.js";import"core-js/modules/es.regexp.sticky.js";import"core-js/modules/es.regexp.to-string.js";import"core-js/modules/es.object.keys.js";function B(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,s=o(e);if(t){var a=o(this).constructor;r=Reflect.construct(s,arguments,a)}else r=s.apply(this,arguments);return n(this,r)}}var C;!function(e){e.Turtle="Turtle"}(C||(C={}));var O=function(n){r(MalformedSolidDocumentError,a);var o=B(MalformedSolidDocumentError);function MalformedSolidDocumentError(r,n,a){var u;return e(this,MalformedSolidDocumentError),u=o.call(this,function(e,t,r){return e?"Malformed ".concat(t," document found at ").concat(e," - ").concat(r):"Malformed ".concat(t," document - ").concat(r)}(r,n,a)),s(t(u),"documentUrl",void 0),s(t(u),"documentFormat",void 0),s(t(u),"malformationDetails",void 0),u.documentUrl=r,u.documentFormat=n,u.malformationDetails=a,u}return MalformedSolidDocumentError}();function z(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,s=o(e);if(t){var a=o(this).constructor;r=Reflect.construct(s,arguments,a)}else r=s.apply(this,arguments);return n(this,r)}}var M=function(n){r(NetworkRequestError,a);var o=z(NetworkRequestError);function NetworkRequestError(r){var n;return e(this,NetworkRequestError),n=o.call(this,"Request failed trying to fetch ".concat(r)),s(t(n),"url",void 0),n.url=r,n}return NetworkRequestError}();function L(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,s=o(e);if(t){var a=o(this).constructor;r=Reflect.construct(s,arguments,a)}else r=s.apply(this,arguments);return n(this,r)}}var F=function(n){r(NotFoundError,a);var o=L(NotFoundError);function NotFoundError(r){var n;return e(this,NotFoundError),n=o.call(this,"Document with '".concat(r,"' url not found")),s(t(n),"url",void 0),n.url=r,n}return NotFoundError}();function Q(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,s=o(e);if(t){var a=o(this).constructor;r=Reflect.construct(s,arguments,a)}else r=s.apply(this,arguments);return n(this,r)}}var $=function(n){r(UnauthorizedError,a);var o=Q(UnauthorizedError);function UnauthorizedError(r,n){var a;return e(this,UnauthorizedError),a=o.call(this,function(e,t){return"Unauthorized".concat(403===t?" (Forbidden)":"",": ").concat(e)}(r,n)),s(t(a),"url",void 0),s(t(a),"responseStatus",void 0),a.url=r,a.responseStatus=n,a}return E(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(),H={foaf:"http://xmlns.com/foaf/0.1/",pim:"http://www.w3.org/ns/pim/space#",purl:"http://purl.org/dc/terms/",rdfs:"http://www.w3.org/1999/02/22-rdf-syntax-ns#",schema:"https://schema.org/",solid:"http://www.w3.org/ns/solid/terms#",vcard:"http://www.w3.org/2006/vcard/ns#"};function J(e,t){H[e]=t}function W(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=I(r,2),o=n[0],s=n[1];if(s){var a,u,i,c=null!==(a=null!==(u=H[o])&&void 0!==u?u:null===(i=t.extraContext)||void 0===i?void 0:i[o])&&void 0!==a?a:null;if(!c)throw new Error("Can't expand IRI with unknown prefix: '".concat(e,"'"));return c+s}if(!t.defaultPrefix)throw new Error("Can't expand IRI without a default prefix: '".concat(e,"'"));return t.defaultPrefix+o}var _=function(){function t(r,n){e(this,t),s(this,"url",void 0),s(this,"quads",void 0),this.url=r,this.quads=n}return E(t,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===W(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===W(e)})).map((function(e){return e.object.value}))}}]),t}(),G=function(){function t(r,n,o){e(this,t),s(this,"url",void 0),s(this,"headers",void 0),s(this,"quads",void 0),this.url=r,this.quads=n,this.headers=o}return E(t,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,W("rdfs:type"),W("foaf:PersonalProfileDocument"))}},{key:"isStorage",value:function(){var e;return!(null===(e=this.headers.get("Link"))||void 0===e||!e.match(/<http:\/\/www\.w3\.org\/ns\/pim\/space#Storage>;[^,]+rel="type"/))}},{key:"getLastModified",value:function(){var e,t,r,n;return null!==(e=null!==(t=null!==(r=u(this.headers.get("last-modified")))&&void 0!==r?r:u(null===(n=this.statement(this.url,"purl:modified"))||void 0===n?void 0:n.object.value))&&void 0!==t?t:this.getLatestDocumentDate())&&void 0!==e?e:null}},{key:"statements",value:function(e,t,r){var n=this;return this.quads.filter((function(o){return!(r&&o.object.value!==W(r,{defaultPrefix:n.url})||e&&o.subject.value!==W(e,{defaultPrefix:n.url})||t&&o.predicate.value!==W(t,{defaultPrefix:n.url}))}))}},{key:"statement",value:function(e,t,r){var n=this,o=this.quads.find((function(o){return!(r&&o.object.value!==W(r,{defaultPrefix:n.url})||e&&o.subject.value!==W(e,{defaultPrefix:n.url})||t&&o.predicate.value!==W(t,{defaultPrefix:n.url}))}));return null!=o?o:null}},{key:"contains",value:function(e,t,r){return null!==this.statement(e,t,r)}},{key:"getThing",value:function(e){var t=this.statements(e);return new _(e,t)}},{key:"getLatestDocumentDate",value:function(){var e=[].concat(A(this.statements(void 0,"purl:modified")),A(this.statements(void 0,"purl:created"))).map((function(e){return u(e.object.value)})).filter((function(e){return null!==e}));return e.length>0?e.reduce((function(e,t){return e>t?e:t})):null}}]),t}();function X(e){return"@graph"in e}function K(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return V(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return V(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){u=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw s}}}}function V(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function Y(e,t){return Z.apply(this,arguments)}function Z(){return(Z=T(R.mark((function e(t,r){var n,o,s;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={headers:{Accept:"text/turtle"}},e.prev=1,e.next=4,r(t,n);case 4:if(404!==(o=e.sent).status){e.next=7;break}throw new F(t);case 7:if(![401,403].includes(o.status)){e.next=9;break}throw new $(t,o.status);case 9:return e.next=11,o.text();case 11:return s=e.sent,e.abrupt("return",{body:s,headers:o.headers});case 15:if(e.prev=15,e.t0=e.catch(1),!(e.t0 instanceof $)){e.next=19;break}throw e.t0;case 19:throw new M(t);case 20:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function ee(e){var t,r=e.slice(0),n={},o=c(e).flatMap((function(e,t){var r,o=l(["BlankNode"===e.object.termType?e.object.value:null,"BlankNode"===e.subject.termType?e.subject.value:null]),s=K(o);try{for(s.s();!(r=s.n()).done;){var a,u=r.value;n[u]=null!==(a=n[u])&&void 0!==a?a:new Set,n[u].add(t)}}catch(e){s.e(e)}finally{s.f()}return o})).filter().unique(),s=K(o);try{var a=function(){var o,s=t.value,a=N(c(n[s]).map((function(t){return e[t]})).filter((function(e){var t=e.subject,r=t.termType,n=t.value;return"BlankNode"===r&&n===s})).map((function(e){var t=e.predicate,r=e.object;return"BlankNode"===r.termType?t.value:t.value+r.value})).sorted().join()),u=K(n[s]);try{for(u.s();!(o=u.n()).done;){for(var i=o.value,l=r[i],p={subject:l.subject,object:l.object},d=0,m=Object.entries(p);d<m.length;d++){var v=I(m[d],2),h=v[0],j=v[1];"BlankNode"===j.termType&&j.value===s&&(p[h]=new U(a))}f(r,l,new q(p.subject,l.predicate,p.object))}}catch(e){u.e(e)}finally{u.f()}};for(s.s();!(t=s.n()).done;)a()}catch(e){s.e(e)}finally{s.f()}return r}function te(e,t,r){return re.apply(this,arguments)}function re(){return(re=T(R.mark((function e(t,r,n){var o,s;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch,e.next=3,ve(r);case 3:return s=e.sent,e.next=6,n(t,{method:"PUT",headers:{"Content-Type":"text/turtle"},body:r});case 6:return e.abrupt("return",new G(t,s,new Headers({})));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ne(e,t){return oe.apply(this,arguments)}function oe(){return(oe=T(R.mark((function e(t,r){var n,o,s,a;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Y(t,null!=r?r:window.fetch);case 2:return n=e.sent,o=n.body,s=n.headers,e.next=7,ve(o,{documentUrl:t});case 7:return a=e.sent,e.abrupt("return",new G(t,a,s));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function se(e){return ae.apply(this,arguments)}function ae(){return(ae=T(R.mark((function e(t){var r;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!X(t)){e.next=5;break}return e.next=3,Promise.all(t["@graph"].map(se));case 3:return r=e.sent,e.abrupt("return",r.flat());case 5:return e.abrupt("return",D(t));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ue(e){var t=me(e);return Object.entries(t).reduce((function(e,t){var r=I(t,2),n=r[0],o=r[1].map((function(e){return" "+ce(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(o,"\n}"))}),[]).join(" ;\n")}function ie(e){return(new P).quadsToString(e)}function ce(e){return(new P).quadsToString([e]).slice(0,-1)}function le(e,t){return fe.apply(this,arguments)}function fe(){return(fe=T(R.mark((function e(t,r){var n;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,ne(t,r);case 3:return n=e.sent,e.abrupt("return",!n.isEmpty());case 7:return e.prev=7,e.t0=e.catch(0),e.abrupt("return",!1);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}function pe(e){return de.apply(this,arguments)}function de(){return de=T(R.mark((function e(t){var r,n,o,s=arguments;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>1&&void 0!==s[1]?s[1]:{},n=t.matchAll(/(\w+) DATA {([^}]+)}/g),o={},e.next=5,Promise.all(A(n).map(function(){var e=T(R.mark((function e(t){var n,s;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),s=t[2],e.next=4,ve(s,r);case 4:o[n]=e.sent;case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 5:return e.abrupt("return",o);case 6:case"end":return e.stop()}}),e)}))),de.apply(this,arguments)}function me(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.matchAll(/(\w+) DATA {([^}]+)}/g),o={},s=K(n);try{for(s.s();!(t=s.n()).done;){var a=t.value,u=a[1].toLowerCase(),i=a[2];o[u]=je(i,r)}}catch(e){s.e(e)}finally{s.f()}return o}function ve(e){return he.apply(this,arguments)}function he(){return he=T(R.mark((function e(t){var r,n,o,s,a=arguments;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=a.length>1&&void 0!==a[1]?a[1]:{},n=i({baseIRI:r.documentUrl}),o=new S(n),s=[],e.abrupt("return",new Promise((function(e,n){o.parse(t,(function(t,o){var a;t?n(new O(null!==(a=r.documentUrl)&&void 0!==a?a:null,C.Turtle,t.message)):o?s.push(o):r.normalizeBlankNodes?e(ee(s)):e(s)}))})));case 5:case"end":return e.stop()}}),e)}))),he.apply(this,arguments)}function je(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=i({baseIRI:t.documentUrl}),n=new S(r);try{var o=n.parse(e);return t.normalizeBlankNodes?ee(o):o}catch(e){var s,a;throw new O(null!==(s=t.documentUrl)&&void 0!==s?s:null,C.Turtle,null!==(a=e.message)&&void 0!==a?a:"")}}function ye(e,t,r){return xe.apply(this,arguments)}function xe(){return(xe=T(R.mark((function e(t,r,n){var o;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch,e.next=3,n(t,{method:"PATCH",headers:{"Content-Type":"application/sparql-update"},body:r});case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function be(e,t){return we.apply(this,arguments)}function we(){return(we=T(R.mark((function e(t,r){var n,o,s,a,u,c,l,f,p,h,j,y,x,b;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return f=v(t),e.next=3,ne(f,r);case 3:if((p=e.sent).isPersonalProfile()){e.next=6;break}throw new Error("Document at ".concat(f," is not a profile."));case 6:h=p.statements(t,"pim:storage").map((function(e){return e.object.value})),j=p.statement(t,"solid:publicTypeIndex"),y=p.statement(t,"solid:privateTypeIndex"),x=m(f);case 10:if(!x||0!==h.length){e.next=20;break}return e.next=13,d(ne(x,r));case 13:if(null==(b=e.sent)||!b.isStorage()){e.next=17;break}return h.push(x),e.abrupt("break",20);case 17:x=m(x),e.next=10;break;case 20:return e.abrupt("return",i({webId:t,storageUrls:h,name:null!==(n=null===(o=p.statement(t,"vcard:fn"))||void 0===o?void 0:o.object.value)&&void 0!==n?n:null===(s=p.statement(t,"foaf:name"))||void 0===s?void 0:s.object.value,avatarUrl:null!==(a=null===(u=p.statement(t,"vcard:hasPhoto"))||void 0===u?void 0:u.object.value)&&void 0!==a?a:null===(c=p.statement(t,"foaf:img"))||void 0===c?void 0:c.object.value,oidcIssuerUrl:null===(l=p.statement(t,"solid:oidcIssuer"))||void 0===l?void 0:l.object.value,publicTypeIndexUrl:null==j?void 0:j.object.value,privateTypeIndexUrl:null==y?void 0:y.object.value}));case 21:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ge(e,t){return ke.apply(this,arguments)}function ke(){return(ke=T(R.mark((function e(t,r){var n,o,s;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=d((function(e){return be(e,r)})),e.next=3,s(t);case 3:if(e.t2=o=e.sent,e.t1=null!==e.t2,!e.t1){e.next=7;break}e.t1=void 0!==o;case 7:if(!e.t1){e.next=11;break}e.t3=o,e.next=14;break;case 11:return e.next=13,s(t.replace(/\/$/,"").concat("/profile/card#me"));case 13:e.t3=e.sent;case 14:if(e.t4=n=e.t3,e.t0=null!==e.t4,!e.t0){e.next=18;break}e.t0=void 0!==n;case 18:if(!e.t0){e.next=22;break}e.t5=n,e.next=25;break;case 22:return e.next=24,s(p(t).concat("/profile/card#me"));case 24:e.t5=e.sent;case 25:return e.abrupt("return",e.t5);case 26:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ee(e){var t=function(e){return e.path&&e.path.startsWith("/")?e.path.match(/^\/[^/]*$/)?"/":"/".concat(c(e.path.split("/")).filter().slice(0,-1).join("/"),"/").replace("//","/"):null}(e);return e.protocol&&e.domain?"".concat(e.protocol,"://").concat(e.domain).concat(null!=t?t:"/"):t}function Te(e){var t;if("@type"in e&&!("@value"in e)){e["@id"]=null!==(t=e["@id"])&&void 0!==t?t:x();for(var r=0,n=Object.values(e);r<n.length;r++){var o=n[r];b(o)&&Te(o),w(o)&&o.forEach((function(e){return b(e)&&Te(e)}))}}}function Re(e){return h(j(e),(function(e){return Te(e)}))}function Ae(e){var t=y(e);return t?i({containerUrl:Ee(t),documentName:t.path?t.path.split("/").pop():null,resourceHash:t.fragment}):{}}function Ie(e,t){return Pe.apply(this,arguments)}function Pe(){return(Pe=T(R.mark((function e(t,r){var n,o,s;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,o=t.storageUrls[0],s="".concat(o,"settings/privateTypeIndex"),e.next=5,le(s,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(o,"settings/privateTypeIndex-").concat(x()),e.next=10;break;case 9:e.t0=s;case 10:return e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Se(e,t){return Ue.apply(this,arguments)}function Ue(){return(Ue=T(R.mark((function e(t,r){var n,o,s;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,e.next=3,Ie(t,r);case 3:return o=e.sent,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",s="\n INSERT DATA {\n <".concat(t.webId,"> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <").concat(o,"> .\n }\n "),e.next=8,Promise.all([te(o,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",r),ye(t.webId,s,r)]);case 8:return e.abrupt("return",o);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function qe(e,t,r){return De.apply(this,arguments)}function De(){return(De=T(R.mark((function e(t,r,n){var o,s,a;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ne(t,n);case 2:return s=e.sent,a=s.statements(void 0,"rdfs:type","solid:TypeRegistration").find((function(e){return s.contains(e.subject.value,"solid:forClass",r)&&s.contains(e.subject.value,"solid:instanceContainer")})),e.abrupt("return",a&&null!==(o=s.getThing(a.subject.value))&&void 0!==o?o:null);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ne(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return Be(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Be(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){u=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw s}}}}function Be(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function Ce(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,s=o(e);if(t){var a=o(this).constructor;r=Reflect.construct(s,arguments,a)}else r=s.apply(this,arguments);return n(this,r)}}var Oe={},ze={"%uuid%":"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"},Me=function(n){r(ExpectedQuadAssertionError,a);var o=Ce(ExpectedQuadAssertionError);function ExpectedQuadAssertionError(r){var n;return e(this,ExpectedQuadAssertionError),n=o.call(this,"Couldn't find the following triple: ".concat(ce(r))),s(t(n),"expectedQuad",void 0),n.expectedQuad=r,n}return ExpectedQuadAssertionError}();function Le(e,t){var r,n=Ne(e);try{var o=function(){var e=r.value,n=t.find((function(t){return n=t,function(e,t){if(e.termType!==t.termType)return!1;if("Literal"===e.termType&&"Literal"===t.termType){if(e.datatype.value!==t.datatype.value)return!1;if(!Fe(e.value))return"http://www.w3.org/2001/XMLSchema#dateTime"===e.datatype.value?new Date(e.value).getTime()===new Date(t.value).getTime():e.value===t.value}return Qe(e.value,t.value)}((r=e).object,n.object)&&Qe(r.subject.value,n.subject.value)&&Qe(r.predicate.value,n.predicate.value);var r,n}));if(!n)throw new Me(e);k(t,n)};for(n.s();!(r=n.n()).done;)o()}catch(e){n.e(e)}finally{n.f()}}function Fe(e){return/\[\[(.*\]\[)?([^\]]+)\]\]/.test(e)}function Qe(e,t){if(!Fe(e))return e===t;var r=[];if(!(e in Oe)){var n,o=e.matchAll(/\[\[((.*?)\]\[)?([^\]]+)\]\]/g),s=[],a=e,u=Ne(o);try{for(u.s();!(n=u.n()).done;){var i=n.value;i[2]&&r.push(i[2]),s.push(i[3]),a=a.replace(i[0],"%PATTERN".concat(s.length-1,"%"))}}catch(e){u.e(e)}finally{u.f()}a=a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");for(var c=0,l=Object.entries(s);c<l.length;c++){var f,p=I(l[c],2),d=p[0],m=p[1];a=a.replace("%PATTERN".concat(d,"%"),null!==(f=ze[m])&&void 0!==f?f:m)}Oe[e]=new RegExp(a)}return Oe[e].test(t)}function $e(){Oe={}}function He(e,t){return Je.apply(this,arguments)}function Je(){return(Je=T(R.mark((function e(t,r){var n,o,s,a,u;return R.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return $e(),e.next=3,se(t);case 3:return n=e.sent,e.next=6,se(r);case 6:if(o=e.sent,s=ie(n),a=ie(o),u=function(e,t){return{success:e,message:t,expected:s,actual:a}},n.length===o.length){e.next=12;break}return e.abrupt("return",u(!1,"Expected ".concat(n.length," triples, found ").concat(o.length,".")));case 12:e.prev=12,Le(n,o),e.next=21;break;case 16:if(e.prev=16,e.t0=e.catch(12),e.t0 instanceof Me){e.next=20;break}throw e.t0;case 20:return e.abrupt("return",u(!1,e.t0.message));case 21:return e.abrupt("return",u(!0,"jsonld matches"));case 22:case"end":return e.stop()}}),e,null,[[12,16]])})))).apply(this,arguments)}function We(e,t){var r;$e();for(var n=me(e,{normalizeBlankNodes:!0}),o=me(t,{normalizeBlankNodes:!0}),s=function(r,n){return{success:r,message:n,expected:e,actual:t}},a=0,u=Object.keys(n);a<u.length;a++){var i=u[a];if(!(i in o))return s(!1,"Couldn't find expected ".concat(i," operation."));var c=g(n,i),l=g(o,i);if(c.length!==l.length)return s(!1,"Expected ".concat(c.length," ").concat(i," triples, found ").concat(l.length,"."));try{Le(c,l)}catch(e){if(!(e instanceof Me))throw e;return s(!1,"Couldn't find the following ".concat(i," triple: ").concat(ce(e.expectedQuad)))}}var f=null!==(r=Object.keys(o)[0])&&void 0!==r?r:null;return f?s(!1,"Did not expect to find ".concat(f," triples.")):s(!0,"sparql matches")}function _e(e,t){$e();var r=je(e,{normalizeBlankNodes:!0}),n=je(t,{normalizeBlankNodes:!0}),o=function(r,n){return{success:r,message:n,expected:e,actual:t}};if(r.length!==n.length)return o(!1,"Expected ".concat(r.length," triples, found ").concat(n.length,"."));try{Le(r,n)}catch(e){if(!(e instanceof Me))throw e;return o(!1,e.message)}return o(!0,"turtle matches")}var Ge={turtle:function(e){var t=this._obj,r=this.assert.bind(this),n=_e(e,t);r(n.success,n.message,"",n.expected,n.actual)},sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=We(e,t);r(n.success,n.message,"",n.expected,n.actual)}};function Xe(){chai.use((function(e){return Object.entries(Ge).forEach((function(t){var r=I(t,2),n=r[0],o=r[1];return e.Assertion.addMethod(n,o)}))}))}function Ke(e,t){var r=e.success,n=t.context.utils;return{pass:r,message:r?function(){return[e.message,n.matcherHint(t.hint),["Expected: not ".concat(n.printExpected(t.expected)),"Received: ".concat(n.printReceived(t.received))].join("\n")].join("\n\n")}:function(){return[e.message,n.matcherHint(t.hint)].join("\n\n")}}}var Ve={toEqualJsonLD:function(e,t){var r=this;return T(R.mark((function n(){var o;return R.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,He(t,e);case 2:return o=n.sent,n.abrupt("return",Ke(o,{context:r,hint:"toEqualJsonLD",expected:t,received:e}));case 4:case"end":return n.stop()}}),n)})))()},toEqualSparql:function(e,t){return Ke(We(t,e),{context:this,hint:"toEqualSparql",expected:ue(t),received:ue(e)})}};function Ye(){expect.extend(Ve)}export{O as MalformedSolidDocumentError,M as NetworkRequestError,F as NotFoundError,G as SolidDocument,C as SolidDocumentFormat,_ as SolidThing,$ as UnauthorizedError,Se as createPrivateTypeIndex,te as createSolidDocument,J as defineIRIPrefix,W as expandIRI,ge as fetchLoginUserProfile,ne as fetchSolidDocument,qe as findContainerRegistration,Xe as installChaiPlugin,Ye as installJestPlugin,X as isJsonLDGraph,He as jsonldEquals,se as jsonldToQuads,Re as mintJsonLDIdentifiers,ue as normalizeSparql,Ae as parseResourceSubject,ce as quadToTurtle,ie as quadsToTurtle,le as solidDocumentExists,We as sparqlEquals,pe as sparqlToQuads,me as sparqlToQuadsSync,_e as turtleEquals,ve as turtleToQuads,je as turtleToQuadsSync,ye as updateSolidDocument};
2
2
  //# sourceMappingURL=noeldemartin-solid-utils.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"noeldemartin-solid-utils.esm.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/SolidDocument.ts","../src/helpers/jsonld.ts","../src/helpers/io.ts","../src/helpers/auth.ts","../src/helpers/interop.ts","../src/helpers/testing.ts","../src/plugins/chai/assertions.ts","../src/plugins/chai/index.ts","../src/plugins/jest/matchers.ts","../src/plugins/jest/index.ts"],"sourcesContent":["import { Error } 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 Error {\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 { Error } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Request failed trying to fetch ${url}`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NotFoundError extends Error {\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 { Error } 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 Error {\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'\n ? this.responseStatus === 403\n : 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 foaf: 'http://xmlns.com/foaf/0.1/',\n pim: 'http://www.w3.org/ns/pim/space#',\n purl: 'http://purl.org/dc/terms/',\n rdfs: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\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'))\n return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix)\n throw new Error(`Can't expand IRI with unknown prefix: '${iri}'`);\n\n return expandedPrefix + name;\n }\n\n if (!options.defaultPrefix)\n throw new Error(`Can't expand IRI without a default prefix: '${iri}'`);\n\n return options.defaultPrefix + prefix;\n}\n","import type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/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\n .find(quad => quad.predicate.value === expandIRI(property))\n ?.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 { parseDate } from '@noeldemartin/utils';\nimport type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport default class SolidDocument {\n\n public readonly url: string;\n public readonly headers: Headers;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n this.url = url;\n this.quads = quads;\n this.headers = headers;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(\n this.url,\n expandIRI('rdfs:type'),\n expandIRI('foaf:PersonalProfileDocument'),\n );\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 getLastModified(): Date | null {\n return parseDate(this.headers.get('last-modified'))\n ?? parseDate(this.statement(this.url, 'purl:modified')?.object.value)\n ?? this.getLatestDocumentDate()\n ?? null;\n }\n\n public statements(subject?: string, predicate?: string, object?: string): Quad[] {\n return this.quads.filter(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n }\n\n public statement(subject?: string, predicate?: string, object?: string): Quad | null {\n const statement = this.quads.find(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\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 private getLatestDocumentDate(): Date | null {\n const dates = [\n ...this.statements(undefined, 'purl:modified'),\n ...this.statements(undefined, 'purl:created'),\n ]\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}\n","export 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 = { '@graph': JsonLDResource[] };\n\nexport function isJsonLDGraph(jsonld: JsonLD): jsonld is JsonLDGraph {\n return '@graph' in jsonld;\n}\n","import { arr, arrayFilter, arrayReplace,objectWithoutEmpty } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';\nimport type { JsonLdDocument } from 'jsonld';\nimport { toRDF } from 'jsonld';\nimport md5 from 'md5';\nimport type { Quad } from 'rdf-js';\nimport type { Term as N3Term } from 'n3';\n\nimport SolidDocument from '@/models/SolidDocument';\n\nimport MalformedSolidDocumentError, { SolidDocumentFormat } from '@/errors/MalformedSolidDocumentError';\nimport NetworkRequestError from '@/errors/NetworkRequestError';\nimport NotFoundError from '@/errors/NotFoundError';\nimport UnauthorizedError from '@/errors/UnauthorizedError';\nimport { isJsonLDGraph } from '@/helpers/jsonld';\nimport type { JsonLD } from '@/helpers/jsonld';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type AnyFetch = (input: any, options?: any) => Promise<any>;\nexport declare type TypedFetch = (input: RequestInfo, options?: RequestInit) => Promise<Response>;\nexport declare type Fetch = TypedFetch | AnyFetch;\n\nasync function fetchRawSolidDocument(url: string, fetch: Fetch): Promise<{ body: string; headers: Headers }> {\n const options = {\n headers: { Accept: 'text/turtle' },\n };\n\n try {\n const response = await fetch(url, options);\n\n if (response.status === 404)\n throw new NotFoundError(url);\n\n if ([401, 403].includes(response.status))\n 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)\n throw error;\n\n throw new NetworkRequestError(url);\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 const ids = arrayFilter([\n quad.object.termType === 'BlankNode' ? quad.object.value : null,\n quad.subject.termType === 'BlankNode' ? quad.subject.value : null,\n ]);\n\n for (const id of ids) {\n quadsIndexes[id] = quadsIndexes[id] ?? new Set();\n quadsIndexes[id].add(index);\n }\n\n return ids;\n })\n .filter()\n .unique();\n\n for (const originalId of blankNodeIds) {\n const normalizedId = md5(\n arr(quadsIndexes[originalId])\n .map(index => quads[index])\n .filter(({ subject: { termType, value } }) => termType === 'BlankNode' && value === originalId)\n .map(\n ({ predicate, object }) => object.termType === 'BlankNode'\n ? predicate.value\n : predicate.value + object.value,\n )\n .sorted()\n .join(),\n );\n\n for (const index of quadsIndexes[originalId]) {\n const quad = normalizedQuads[index];\n const terms: Record<string, N3Term> = { subject: quad.subject as N3Term, object: quad.object as N3Term };\n\n for (const [termName, termValue] of Object.entries(terms)) {\n if (termValue.termType !== 'BlankNode' || termValue.value !== originalId)\n continue;\n\n terms[termName] = new N3BlankNode(normalizedId);\n }\n\n arrayReplace(normalizedQuads, quad, new N3Quad(terms.subject, quad.predicate as N3Term, terms.object));\n }\n }\n\n return normalizedQuads;\n}\n\nexport interface ParsingOptions {\n documentUrl: string;\n normalizeBlankNodes: boolean;\n}\n\nexport async function createSolidDocument(url: string, body: string, fetch?: Fetch): Promise<SolidDocument> {\n fetch = fetch ?? window.fetch;\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, fetch?: Fetch): Promise<SolidDocument> {\n const { body: data, headers } = await fetchRawSolidDocument(url, fetch ?? window.fetch);\n const statements = await turtleToQuads(data, { documentUrl: url });\n\n return new SolidDocument(url, statements, headers);\n}\n\nexport async function jsonldToQuads(jsonld: JsonLD): Promise<Quad[]> {\n if (isJsonLDGraph(jsonld)) {\n const graphQuads = await Promise.all(jsonld['@graph'].map(jsonldToQuads));\n\n return graphQuads.flat();\n }\n\n return toRDF(jsonld as JsonLdDocument) as Promise<Quad[]>;\n}\n\nexport function normalizeSparql(sparql: string): string {\n const quads = sparqlToQuadsSync(sparql);\n\n return Object\n .entries(quads)\n .reduce((normalizedOperations, [operation, quads]) => {\n const normalizedQuads = quads.map(quad => ' ' + quadToTurtle(quad)).sort().join('\\n');\n\n return normalizedOperations.concat(`${operation.toUpperCase()} DATA {\\n${normalizedQuads}\\n}`);\n }, [] as string[])\n .join(' ;\\n');\n}\n\nexport function quadsToTurtle(quads: Quad[]): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString(quads);\n}\n\nexport function quadToTurtle(quad: Quad): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, fetch?: Fetch): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, fetch);\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 = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all([...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 return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = sparql.matchAll(/(\\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 parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n const quads: Quad[] = [];\n\n return new Promise((resolve, reject) => {\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(\n options.documentUrl ?? null,\n SolidDocumentFormat.Turtle,\n error.message,\n ),\n );\n return;\n }\n\n if (!quad) {\n options.normalizeBlankNodes\n ? resolve(normalizeBlankNodes(quads))\n : resolve(quads);\n\n return;\n }\n\n quads.push(quad);\n });\n });\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes\n ? normalizeBlankNodes(quads)\n : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(options.documentUrl ?? null, SolidDocumentFormat.Turtle, error.message);\n }\n}\n\nexport async function updateSolidDocument(url: string, body: string, fetch?: Fetch): Promise<void> {\n fetch = fetch ?? window.fetch;\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n","import { objectWithoutEmpty, silenced, urlParentDirectory, urlRoot, urlRoute } from '@noeldemartin/utils';\n\nimport { fetchSolidDocument } from './io';\nimport type { Fetch } from './io';\n\nexport interface SolidUserProfile {\n webId: string;\n storageUrls: string[];\n name?: string;\n avatarUrl?: string;\n oidcIssuerUrl?: string;\n publicTypeIndexUrl?: string;\n privateTypeIndexUrl?: string;\n}\n\nasync function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUserProfile> {\n const documentUrl = urlRoute(webId);\n const document = await fetchSolidDocument(documentUrl, fetch);\n\n if (!document.isPersonalProfile())\n throw new Error(`Document at ${documentUrl} is not a profile.`);\n\n const storageUrls = document.statements(webId, 'pim:storage').map(storage => storage.object.value);\n const publicTypeIndex = document.statement(webId, 'solid:publicTypeIndex');\n const privateTypeIndex = document.statement(webId, 'solid:privateTypeIndex');\n\n let parentUrl = urlParentDirectory(documentUrl);\n while (parentUrl && storageUrls.length === 0) {\n const parentDocument = await silenced(fetchSolidDocument(parentUrl, fetch));\n\n if (parentDocument?.isStorage()) {\n storageUrls.push(parentUrl);\n\n break;\n }\n\n parentUrl = urlParentDirectory(parentUrl);\n }\n\n return objectWithoutEmpty({\n webId,\n storageUrls,\n name:\n document.statement(webId, 'vcard:fn')?.object.value ??\n document.statement(webId, 'foaf:name')?.object.value,\n avatarUrl:\n document.statement(webId, 'vcard:hasPhoto')?.object.value ??\n document.statement(webId, 'foaf:img')?.object.value,\n oidcIssuerUrl: document.statement(webId, 'solid:oidcIssuer')?.object.value,\n publicTypeIndexUrl: publicTypeIndex?.object.value,\n privateTypeIndexUrl: privateTypeIndex?.object.value,\n });\n}\n\nexport async function fetchLoginUserProfile(loginUrl: string, fetch?: Fetch): Promise<SolidUserProfile | null> {\n const fetchProfile = silenced(url => fetchUserProfile(url, fetch));\n\n return await fetchProfile(loginUrl)\n ?? await fetchProfile(loginUrl.replace(/\\/$/, '').concat('/profile/card#me'))\n ?? await fetchProfile(urlRoot(loginUrl).concat('/profile/card#me'));\n}\n","import { uuid } from '@noeldemartin/utils';\n\nimport { createSolidDocument, fetchSolidDocument, solidDocumentExists, updateSolidDocument } from '@/helpers/io';\nimport type SolidThing from '@/models/SolidThing';\nimport type { Fetch } from '@/helpers/io';\nimport type { SolidUserProfile } from '@/helpers/auth';\n\nasync function mintPrivateTypeIndexUrl(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const storageUrl = user.storageUrls[0];\n const typeIndexUrl = `${storageUrl}settings/privateTypeIndex`;\n\n return await solidDocumentExists(typeIndexUrl, fetch)\n ? `${storageUrl}settings/privateTypeIndex-${uuid()}`\n : typeIndexUrl;\n}\n\nexport async function createPrivateTypeIndex(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const typeIndexUrl = await mintPrivateTypeIndexUrl(user, fetch);\n const typeIndexBody = `\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n `;\n const profileUpdateBody = `\n INSERT DATA {\n <${user.webId}> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <${typeIndexUrl}> .\n }\n `;\n\n createSolidDocument(typeIndexUrl, typeIndexBody, fetch);\n updateSolidDocument(user.webId, profileUpdateBody, fetch);\n\n return typeIndexUrl;\n}\n\nexport async function findContainerRegistration(\n typeIndexUrl: string,\n childrenType: string,\n fetch?: Fetch,\n): Promise<SolidThing | null> {\n const typeIndex = await fetchSolidDocument(typeIndexUrl, fetch);\n const containerQuad = typeIndex\n .statements(undefined, 'rdfs:type', 'solid:TypeRegistration')\n .find(\n statement =>\n typeIndex.contains(statement.subject.value, 'solid:forClass', childrenType) &&\n typeIndex.contains(statement.subject.value, 'solid:instanceContainer'),\n );\n\n return containerQuad\n ? typeIndex.getThing(containerQuad.subject.value) ?? null\n : null;\n}\n","import type { JsonLD } from '@/helpers/jsonld';\nimport { pull } from '@noeldemartin/utils';\nimport type { Quad, Quad_Object } from 'rdf-js';\n\nimport { jsonldToQuads, quadToTurtle, quadsToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';\n\nlet patternsRegExpsIndex: Record<string, RegExp> = {};\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[(.*\\]\\[)?([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n if (!containsPatterns(expected))\n return expected === actual;\n\n const patternAliases = [];\n\n if (!(expected in patternsRegExpsIndex)) {\n const patternMatches = expected.matchAll(/\\[\\[((.*)\\]\\[)?([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n if (patternMatch[2]) {\n patternAliases.push(patternMatch[2]);\n }\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}%`, pattern);\n }\n\n patternsRegExpsIndex[expected] = new RegExp(expectedRegExp);\n }\n\n return patternsRegExpsIndex[expected].test(actual);\n}\n\nfunction quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {\n if (expected.termType !== actual.termType)\n return false;\n\n if (expected.termType === 'Literal' && actual.termType === 'Literal') {\n if (expected.datatype.value !== actual.datatype.value)\n 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 quadObjectEquals(expected.object, actual.object)\n && quadValueEquals(expected.subject.value, actual.subject.value)\n && quadValueEquals(expected.predicate.value, actual.predicate.value);\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 for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\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))\n 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 for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following ${operation} triple: ${quadToTurtle(expectedQuad)}`);\n }\n }\n\n const unexpectedOperation = Object.keys(actualOperations)[0] ?? null;\n if (unexpectedOperation)\n 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 for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n return result(true, 'turtle matches');\n}\n","import { sparqlEquals, turtleEquals } from '@/helpers/testing';\n\ntype CustomAssertions = {\n [assertion in keyof typeof assertions]: typeof assertions[assertion];\n};\n\ndeclare global {\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Chai {\n\n interface Assertion extends CustomAssertions {}\n interface Include extends CustomAssertions {}\n\n }\n\n}\n\nconst assertions: Record<string, (this: Chai.AssertionStatic, ...args: any[]) => void> = {\n turtle(graph: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = graph;\n const result = turtleEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n sparql(query: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = query;\n const result = sparqlEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n};\n\nexport default assertions;\n","import assertions from './assertions';\n\nexport function installChaiPlugin(): void {\n chai.use(_chai => Object.entries(assertions).forEach(([name, method]) => _chai.Assertion.addMethod(name, method)));\n}\n","import diff from 'jest-diff';\n\nimport { normalizeSparql } from '@/helpers/io';\nimport { jsonldEquals, sparqlEquals } from '@/helpers/testing';\nimport type { EqualityResult } from '@/helpers/testing';\n\ninterface FormatResultOptions {\n context: jest.MatcherContext;\n hint: string;\n expected: unknown;\n received: unknown;\n}\n\nfunction formatResult(result: EqualityResult, options: FormatResultOptions) {\n const pass = result.success;\n const utils = options.context.utils;\n const message = pass\n ? () => [\n result.message,\n utils.matcherHint(options.hint),\n [\n `Expected: not ${utils.printExpected(options.expected)}`,\n `Received: ${utils.printReceived(options.received)}`,\n ].join('\\n'),\n ].join('\\n\\n')\n : () => {\n const diffString = diff(options.expected, options.received, {\n expand: options.context.expand,\n });\n\n return [\n result.message,\n utils.matcherHint(options.hint),\n diffString && diffString.includes('- Expect')\n ? `Difference:\\n\\n${diffString}`\n : [\n `Expected: ${utils.printExpected(options.expected)}`,\n `Received: ${utils.printReceived(options.received)}`,\n ].join('\\n'),\n ].join('\\n\\n');\n };\n\n return { pass, message };\n}\n\nconst matchers: jest.ExpectExtendMap = {\n async toEqualJsonLD(received, expected) {\n const result = await jsonldEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualJsonLD',\n expected,\n received,\n });\n },\n toEqualSparql(received, expected) {\n const result = sparqlEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualSparql',\n expected: normalizeSparql(expected),\n received: normalizeSparql(received),\n });\n },\n};\n\nexport default matchers;\n","import matchers from './matchers';\n\nexport function installJestPlugin(): void {\n expect.extend(matchers);\n}\n"],"names":["SolidDocumentFormat","MalformedSolidDocumentError","Error","documentUrl","documentFormat","malformationDetails","errorMessage","NetworkRequestError","url","NotFoundError","UnauthorizedError","responseStatus","this","undefined","knownPrefixes","foaf","pim","purl","rdfs","schema","solid","vcard","defineIRIPrefix","name","value","expandIRI","iri","options","startsWith","split","prefix","expandedPrefix","extraContext","_options$extraContext","defaultPrefix","SolidThing","quads","property","find","quad","predicate","_this$quads$find","object","filter","map","SolidDocument","headers","statements","length","statement","get","_this$headers$get","match","parseDate","_this$statement","getLatestDocumentDate","subject","_this","_this2","dates","date","reduce","a","b","isJsonLDGraph","jsonld","fetchRawSolidDocument","fetch","Accept","response","status","includes","text","body","_context","normalizeBlankNodes","normalizedQuads","slice","quadsIndexes","blankNodeIds","arr","flatMap","index","ids","arrayFilter","termType","id","Set","add","unique","originalId","normalizedId","md5","sorted","join","terms","Object","entries","termName","termValue","N3BlankNode","arrayReplace","N3Quad","createSolidDocument","window","turtleToQuads","method","Headers","fetchSolidDocument","data","jsonldToQuads","Promise","all","graphQuads","flat","toRDF","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","quadToTurtle","sort","concat","toUpperCase","quadsToTurtle","TurtleWriter","quadsToString","solidDocumentExists","document","isEmpty","sparqlToQuads","operations","matchAll","_toConsumableArray","operationName","toLowerCase","operationBody","turtleToQuadsSync","turtle","parserOptions","objectWithoutEmpty","baseIRI","parser","TurtleParser","resolve","reject","parse","error","Turtle","message","push","updateSolidDocument","fetchUserProfile","webId","urlRoute","isPersonalProfile","storageUrls","storage","publicTypeIndex","privateTypeIndex","parentUrl","urlParentDirectory","silenced","parentDocument","isStorage","_document$statement","_document$statement2","avatarUrl","_document$statement3","_document$statement4","oidcIssuerUrl","_document$statement5","publicTypeIndexUrl","privateTypeIndexUrl","fetchLoginUserProfile","loginUrl","fetchProfile","replace","urlRoot","mintPrivateTypeIndexUrl","user","storageUrl","typeIndexUrl","uuid","createPrivateTypeIndex","profileUpdateBody","findContainerRegistration","childrenType","typeIndex","containerQuad","contains","getThing","patternsRegExpsIndex","containsPatterns","test","quadValueEquals","expected","actual","patternAliases","patternMatches","patterns","expectedRegExp","patternMatch","patternIndex","pattern","RegExp","quadEquals","datatype","Date","getTime","quadObjectEquals","resetPatterns","jsonldEquals","expectedQuads","actualQuads","expectedTurtle","actualTurtle","result","success","expectedQuad","some","actualQuad","sparqlEquals","expectedOperations","actualOperations","keys","pull","unexpectedOperation","turtleEquals","assertions","graph","_obj","assert","bind","query","installChaiPlugin","chai","use","_chai","forEach","Assertion","addMethod","formatResult","pass","utils","context","matcherHint","hint","printExpected","printReceived","received","diffString","diff","expand","matchers","toEqualJsonLD","toEqualSparql","installJestPlugin","expect","extend"],"mappings":"iiHAYYA,GAAZ,SAAYA,GACRA,kBADJ,CAAYA,IAAAA,WAISC,4CAAoCC,6EAMzCC,EAA4BC,EAAqCC,mEApBjF,SACIF,EACAC,EACAC,UAEOF,sBACYC,gCAAoCD,gBAAiBE,uBACrDD,yBAA6BC,GActCC,CAAaH,EAAaC,EAAgBC,KAE3CF,YAAcA,IACdC,eAAiBA,IACjBC,oBAAsBA,qdCzBdE,oCAA4BL,6DAIjCM,oGACgCA,KAEnCA,IAAMA,6cCPEC,8BAAsBP,iDAI3BM,8EACgBA,uBAEnBA,IAAMA,ucCDEE,kCAA0BR,yDAK/BM,EAAaG,yDAX7B,SAAsBH,EAAaG,+BACK,MAAnBA,EAAyB,eAAiB,gBAExBH,GASzBF,CAAaE,EAAKG,KAEnBH,IAAMA,IACNG,eAAiBA,qDAG1B,uBAC0C,IAAxBC,KAAKD,eACW,MAAxBC,KAAKD,oBACLE,2BChBRC,EAA4B,CAC9BC,KAAM,6BACNC,IAAK,kCACLC,KAAM,4BACNC,KAAM,8CACNC,OAAQ,sBACRC,MAAO,oCACPC,MAAO,6CAGKC,EAAgBC,EAAcC,GAC1CV,EAAcS,GAAQC,WAGVC,EAAUC,OAAaC,yDAAqC,MACpED,EAAIE,WAAW,QACf,OAAOF,QAEYA,EAAIG,MAAM,cAA1BC,OAAQP,UAEXA,EAAM,WACAQ,sBAAiBjB,EAAcgB,4BAAWH,EAAQK,iCAARC,EAAuBH,kBAAW,SAE7EC,EACD,MAAM,IAAI7B,uDAAgDwB,eAEvDK,EAAiBR,MAGvBI,EAAQO,cACT,MAAM,IAAIhC,4DAAqDwB,eAE5DC,EAAQO,cAAgBJ,MCnCdK,wBAKE3B,EAAa4B,kBACvB5B,IAAMA,OACN4B,MAAQA,iCAGV,SAAMC,0BACFzB,KAAKwB,MACPE,MAAK,SAAAC,UAAQA,EAAKC,UAAUhB,QAAUC,EAAUY,0BAD9CI,EAEDC,OAAOlB,4BAGV,SAAOa,UACHzB,KAAKwB,MACPO,QAAO,SAAAJ,UAAQA,EAAKC,UAAUhB,QAAUC,EAAUY,MAClDO,KAAI,SAAAL,UAAQA,EAAKG,OAAOlB,kBChBhBqB,wBAMErC,EAAa4B,EAAeU,kBACtCtC,IAAMA,OACN4B,MAAQA,OACRU,QAAUA,mCAGZ,kBAC+B,IAA3BlC,KAAKmC,WAAWC,wCAGpB,mBACMpC,KAAKqC,UACVrC,KAAKJ,IACLiB,EAAU,aACVA,EAAU,0DAIX,mCACMb,KAAKkC,QAAQI,IAAI,uBAAjBC,EAA0BC,MAAM,mGAGtC,4DACIC,EAAUzC,KAAKkC,QAAQI,IAAI,iCAC3BG,YAAUzC,KAAKqC,UAAUrC,KAAKJ,IAAK,qCAAzB8C,EAA2CZ,OAAOlB,sBAC5DZ,KAAK2C,uCACL,+BAGJ,SAAWC,EAAkBhB,EAAoBE,qBAC7C9B,KAAKwB,MAAMO,QACd,SAAAM,WACMP,GAAUO,EAAUP,OAAOlB,QAAUC,EAAUiB,EAAQ,CAAER,cAAeuB,EAAKjD,OAC7EgD,GAAWP,EAAUO,QAAQhC,QAAUC,EAAU+B,EAAS,CAAEtB,cAAeuB,EAAKjD,OAChFgC,GAAaS,EAAUT,UAAUhB,QAAUC,EAAUe,EAAW,CAAEN,cAAeuB,EAAKjD,mCAI7F,SAAUgD,EAAkBhB,EAAoBE,cAC7CO,EAAYrC,KAAKwB,MAAME,MACzB,SAAAW,WACMP,GAAUO,EAAUP,OAAOlB,QAAUC,EAAUiB,EAAQ,CAAER,cAAewB,EAAKlD,OAC7EgD,GAAWP,EAAUO,QAAQhC,QAAUC,EAAU+B,EAAS,CAAEtB,cAAewB,EAAKlD,OAChFgC,GAAaS,EAAUT,UAAUhB,QAAUC,EAAUe,EAAW,CAAEN,cAAewB,EAAKlD,iBAGzFyC,MAAAA,EAAAA,EAAa,6BAGjB,SAASO,EAAiBhB,EAAoBE,UACK,OAA/C9B,KAAKqC,UAAUO,EAAShB,EAAWE,2BAGvC,SAASc,OACNT,EAAanC,KAAKmC,WAAWS,UAE5B,IAAIrB,EAAWqB,EAAST,wCAG3B,eACEY,EAAQ,YACP/C,KAAKmC,gBAAWlC,EAAW,oBAC3BD,KAAKmC,gBAAWlC,EAAW,kBAE7B+B,KAAI,SAAAK,UAAaI,EAAUJ,EAAUP,OAAOlB,UAC5CmB,QAAO,SAACiB,UAAgC,OAATA,YAE7BD,EAAMX,OAAS,EAAIW,EAAME,QAAO,SAACC,EAAGC,UAAMD,EAAIC,EAAID,EAAIC,KAAK,uBCvE1DC,EAAcC,SACnB,WAAYA,+hCCYRC,sEAAf,WAAqC1D,EAAa2D,mFACxCxC,EAAU,CACZmB,QAAS,CAAEsB,OAAQ,kCAIID,EAAM3D,EAAKmB,aAEV,OAFlB0C,UAEOC,6BACH,IAAI7D,EAAcD,cAExB,CAAC,IAAK,KAAK+D,SAASF,EAASC,8BACvB,IAAI5D,EAAkBF,EAAK6D,EAASC,gCAE3BD,EAASG,sBAAtBC,2BAEC,CACHA,KAAAA,EACA3B,QAASuB,EAASvB,iDAGlB4B,gBAAiBhE,6CAGf,IAAIH,EAAoBC,oFAItC,SAASmE,EAAoBvC,SACnBwC,EAAkBxC,EAAMyC,MAAM,GAC9BC,EAA4C,GAC5CC,EAAeC,EAAI5C,GACpB6C,SAAQ,SAAC1C,EAAM2C,SACNC,EAAMC,EAAY,CACK,cAAzB7C,EAAKG,OAAO2C,SAA2B9C,EAAKG,OAAOlB,MAAQ,KACjC,cAA1Be,EAAKiB,QAAQ6B,SAA2B9C,EAAKiB,QAAQhC,MAAQ,WAGhD2D,kCAAK,OAAXG,UACPR,EAAaQ,aAAMR,EAAaQ,kBAAO,IAAIC,IAC3CT,EAAaQ,GAAIE,IAAIN,yCAGlBC,KAEVxC,SACA8C,aAEoBV,8BAAdW,UACDC,EAAeC,EACjBZ,EAAIF,EAAaY,IACZ9C,KAAI,SAAAsC,UAAS9C,EAAM8C,MACnBvC,QAAO,oBAAGa,QAAW6B,IAAAA,SAAU7D,IAAAA,YAA2B,cAAb6D,GAA4B7D,IAAUkE,KACnF9C,KACG,gBAAGJ,IAAAA,UAAWE,IAAAA,aAAiC,cAApBA,EAAO2C,SAC5B7C,EAAUhB,MACVgB,EAAUhB,MAAQkB,EAAOlB,SAElCqE,SACAC,YAGWhB,EAAaY,mCAAa,SAAnCR,UACD3C,EAAOqC,EAAgBM,GACvBa,EAAgC,CAAEvC,QAASjB,EAAKiB,QAAmBd,OAAQH,EAAKG,cAElDsD,OAAOC,QAAQF,kBAAQ,iBAA/CG,OAAUC,OACS,cAAvBA,EAAUd,UAA4Bc,EAAU3E,QAAUkE,IAG9DK,EAAMG,GAAY,IAAIE,EAAYT,IAGtCU,EAAazB,EAAiBrC,EAAM,IAAI+D,EAAOP,EAAMvC,QAASjB,EAAKC,UAAqBuD,EAAMrD,8GAI/FkC,WAQW2B,wEAAf,WAAmC/F,EAAaiE,EAAcN,iFACjEA,YAAQA,iBAASqC,OAAOrC,eAECsC,GAAchC,iBAAjC1B,kBAEAoB,EAAM3D,EAAK,CACbkG,OAAQ,MACR5D,QAAS,gBAAkB,eAC3B2B,KAAAA,oCAGG,IAAI5B,EAAcrC,EAAKuC,EAAY,IAAI4D,QAAQ,iFAGpCC,sEAAf,WAAkCpG,EAAa2D,8FACZD,EAAsB1D,EAAK2D,MAAAA,EAAAA,EAASqC,OAAOrC,8BAAnE0C,IAANpC,KAAY3B,IAAAA,iBACK2D,GAAcI,EAAM,CAAE1G,YAAaK,kBAAtDuC,2BAEC,IAAIF,EAAcrC,EAAKuC,EAAYD,+EAGxBgE,uEAAf,WAA6B7C,4EAC5BD,EAAcC,mCACW8C,QAAQC,IAAI/C,EAAO,UAAUrB,IAAIkE,kBAApDG,2BAECA,EAAWC,wCAGfC,EAAMlD,+EAGDmD,GAAgBC,OACtBjF,EAAQkF,GAAkBD,UAEzBrB,OACFC,QAAQ7D,GACRyB,QAAO,SAAC0D,kBAAuBC,OACtB5C,OAAwBhC,KAAI,SAAAL,SAAQ,OAASkF,GAAalF,MAAOmF,OAAO5B,KAAK,aAE5EyB,EAAqBI,iBAAUH,EAAUI,kCAAyBhD,YAC1E,IACFkB,KAAK,iBAGE+B,GAAczF,UACX,IAAI0F,GAELC,cAAc3F,YAGhBqF,GAAalF,UACV,IAAIuF,GAELC,cAAc,CAACxF,IAAOsC,MAAM,GAAI,YAG5BmD,0EAAf,WAAmCxH,EAAa2D,iGAExByC,EAAmBpG,EAAK2D,iBAAzC8D,4BAEEA,EAASC,qEAEV,4FAIOC,wEAAf,WACHd,+FACA1F,iCAAmC,GAE7ByG,EAAaf,EAAOgB,SAAS,yBAC7BjG,EAAgC,YAEhC2E,QAAQC,IAAIsB,EAAIF,GAAYxF,+BAAI,WAAM4E,iFAClCe,EAAgBf,EAAU,GAAGgB,cAC7BC,EAAgBjB,EAAU,YAEHf,GAAcgC,EAAe9G,UAA1DS,EAAMmG,6IAGHnG,8EAGKkF,GAAkBD,SAAgB1F,yDAAmC,GAC3EyG,EAAaf,EAAOgB,SAAS,yBAC7BjG,EAAgC,OAEdgG,kCAAY,KAAzBZ,UACDe,EAAgBf,EAAU,GAAGgB,cAC7BC,EAAgBjB,EAAU,GAEhCpF,EAAMmG,GAAiBG,GAAkBD,EAAe9G,yCAGrDS,WAGWqE,wEAAf,WAA6BkC,iGAAgBhH,iCAAmC,GAC7EiH,EAAgBC,EAAmB,CAAEC,QAASnH,EAAQxB,cACtD4I,EAAS,IAAIC,EAAaJ,GAC1BxG,EAAgB,qBAEf,IAAI2E,SAAQ,SAACkC,EAASC,GACzBH,EAAOI,MAAMR,GAAQ,SAACS,EAAO7G,SACrB6G,EACAF,EACI,IAAIjJ,YACA0B,EAAQxB,2BAAe,KACvBH,EAAoBqJ,OACpBD,EAAME,UAMb/G,EAQLH,EAAMmH,KAAKhH,GAPPZ,EAAQgD,oBACFsE,EAAQtE,EAAoBvC,IAC5B6G,EAAQ7G,qFAUdsG,GAAkBC,OAAgBhH,yDAAmC,GAC3EiH,EAAgBC,EAAmB,CAAEC,QAASnH,EAAQxB,cACtD4I,EAAS,IAAIC,EAAaJ,WAGtBxG,EAAQ2G,EAAOI,MAAMR,UAEpBhH,EAAQgD,oBACTA,EAAoBvC,GACpBA,EACR,MAAOgH,eACC,IAAInJ,YAA4B0B,EAAQxB,2BAAe,KAAMH,EAAoBqJ,OAAQD,EAAME,mBAIvFE,4EAAf,WAAmChJ,EAAaiE,EAAcN,+EACjEA,YAAQA,iBAASqC,OAAOrC,eAElBA,EAAM3D,EAAK,CACbkG,OAAQ,QACR5D,QAAS,gBAAkB,6BAC3B2B,KAAAA,+ECjPOgF,0EAAf,WAAgCC,EAAevF,yGACrChE,EAAcwJ,EAASD,YACN9C,EAAmBzG,EAAagE,cAAjD8D,UAEQ2B,0CACJ,IAAI1J,4BAAqBC,gCAE7B0J,EAAc5B,EAASlF,WAAW2G,EAAO,eAAe9G,KAAI,SAAAkH,UAAWA,EAAQpH,OAAOlB,SACtFuI,EAAkB9B,EAAShF,UAAUyG,EAAO,yBAC5CM,EAAmB/B,EAAShF,UAAUyG,EAAO,0BAE/CO,EAAYC,EAAmB/J,eAC5B8J,GAAoC,IAAvBJ,EAAY7G,yCACCmH,EAASvD,EAAmBqD,EAAW9F,eAEhEiG,OAFEA,YAEFA,EAAgBC,oCAChBR,EAAYN,KAAKU,gCAKrBA,EAAYC,EAAmBD,oDAG5BpB,EAAmB,CACtBa,MAAAA,EACAG,YAAAA,EACAtI,yBACI0G,EAAShF,UAAUyG,EAAO,gCAA1BY,EAAuC5H,OAAOlB,+BAC9CyG,EAAShF,UAAUyG,EAAO,iCAA1Ba,EAAwC7H,OAAOlB,MACnDgJ,8BACIvC,EAAShF,UAAUyG,EAAO,sCAA1Be,EAA6C/H,OAAOlB,+BACpDyG,EAAShF,UAAUyG,EAAO,gCAA1BgB,EAAuChI,OAAOlB,MAClDmJ,wBAAe1C,EAAShF,UAAUyG,EAAO,wCAA1BkB,EAA+ClI,OAAOlB,MACrEqJ,mBAAoBd,MAAAA,SAAAA,EAAiBrH,OAAOlB,MAC5CsJ,oBAAqBd,MAAAA,SAAAA,EAAkBtH,OAAOlB,qFAIhCuJ,0EAAf,WAAqCC,EAAkB7G,mFACpD8G,EAAed,GAAS,SAAA3J,UAAOiJ,GAAiBjJ,EAAK2D,eAE9C8G,EAAaD,mKACbC,EAAaD,EAASE,QAAQ,MAAO,IAAIvD,OAAO,0MAChDsD,EAAaE,EAAQH,GAAUrD,OAAO,4JCpDxCyD,0EAAf,WAAuCC,EAAwBlH,mFAC3DA,YAAQA,iBAASqC,OAAOrC,MAElBmH,EAAaD,EAAKxB,YAAY,GAC9B0B,YAAkBD,wCAEXtD,GAAoBuD,EAAcpH,oDACtCmH,uCAAuCE,iCAC1CD,qHAGYE,0EAAf,WAAsCJ,EAAwBlH,mFACjEA,YAAQA,iBAASqC,OAAOrC,eAEGiH,GAAwBC,EAAMlH,iBAAnDoH,8JAMAG,kDAEKL,EAAK3B,wEAA+D6B,0BAI/EhF,EAAoBgF,uJAA6BpH,GACjDqF,GAAoB6B,EAAK3B,MAAOgC,EAAmBvH,qBAE5CoH,8EAGWI,4EAAf,WACHJ,EACAK,EACAzH,4FAEwByC,EAAmB2E,EAAcpH,iBAAnD0H,SACAC,EAAgBD,EACjB9I,gBAAWlC,EAAW,YAAa,0BACnCyB,MACG,SAAAW,UACI4I,EAAUE,SAAS9I,EAAUO,QAAQhC,MAAO,iBAAkBoK,IAC9DC,EAAUE,SAAS9I,EAAUO,QAAQhC,MAAO,gDAGjDsK,aACDD,EAAUG,SAASF,EAActI,QAAQhC,sBACzC,gmCCjDV,IAAIyK,GAA+C,GAEnD,SAASC,GAAiB1K,SACf,4BAA4B2K,KAAK3K,GAG5C,SAAS4K,GAAgBC,EAAkBC,OAClCJ,GAAiBG,GAClB,OAAOA,IAAaC,MAElBC,EAAiB,QAEjBF,KAAYJ,IAAuB,OAC/BO,EAAiBH,EAAShE,SAAS,gCACnCoE,EAAqB,GACvBC,EAAiBL,OAEMG,kCAAgB,KAAhCG,UACHA,EAAa,IACbJ,EAAehD,KAAKoD,EAAa,IAGrCF,EAASlD,KAAKoD,EAAa,IAE3BD,EAAiBA,EAAexB,QAAQyB,EAAa,qBAAeF,EAASzJ,OAAS,uCAG1F0J,EAAiBA,EAAexB,QAAQ,2BAA4B,sBAE9BlF,OAAOC,QAAQwG,kBAAW,iBAApDG,OAAcC,OACtBH,EAAiBA,EAAexB,0BAAmB0B,OAAiBC,GAGxEZ,GAAqBI,GAAY,IAAIS,OAAOJ,UAGzCT,GAAqBI,GAAUF,KAAKG,GAoB/C,SAASS,GAAWV,EAAgBC,UAjBpC,SAA0BD,EAAuBC,MACzCD,EAAShH,WAAaiH,EAAOjH,SAC7B,OAAO,KAEe,YAAtBgH,EAAShH,UAA8C,YAApBiH,EAAOjH,SAAwB,IAC9DgH,EAASW,SAASxL,QAAU8K,EAAOU,SAASxL,MAC5C,OAAO,MAEN0K,GAAiBG,EAAS7K,OAC3B,MAAmC,8CAA5B6K,EAASW,SAASxL,MACnB,IAAIyL,KAAKZ,EAAS7K,OAAO0L,YAAc,IAAID,KAAKX,EAAO9K,OAAO0L,UAC9Db,EAAS7K,QAAU8K,EAAO9K,aAGjC4K,GAAgBC,EAAS7K,MAAO8K,EAAO9K,OAIvC2L,CAAiBd,EAAS3J,OAAQ4J,EAAO5J,SACzC0J,GAAgBC,EAAS7I,QAAQhC,MAAO8K,EAAO9I,QAAQhC,QACvD4K,GAAgBC,EAAS7J,UAAUhB,MAAO8K,EAAO9J,UAAUhB,OAGtE,SAAS4L,KACLnB,GAAuB,YAULoB,0EAAf,WAA4BhB,EAAkBC,+FAEjDc,cAE4BtG,EAAcuF,iBAApCiB,kBACoBxG,EAAcwF,aAAlCiB,SACAC,EAAiB3F,GAAcyF,GAC/BG,EAAe5F,GAAc0F,GAC7BG,EAAS,SAACC,EAAkBrE,SAAqB,CACnDqE,QAAAA,EACArE,QAAAA,EACA+C,SAAUmB,EACVlB,OAAQmB,IAGRH,EAActK,SAAWuK,EAAYvK,iDAC9B0K,GAAO,qBAAmBJ,EAActK,kCAAyBuK,EAAYvK,2BAE7DsK,8BAAhBM,cACFL,EAAYM,MAAK,SAAAC,UAAcf,GAAWa,EAAcE,MACzD,SAAOJ,GAAO,gDAA8CjG,GAAamG,0SAG1EF,GAAO,EAAM,oHAGRK,GAAa1B,EAAkBC,SAE3Cc,aAEMY,EAAqB1G,GAAkB+E,EAAU,CAAE1H,qBAAqB,IACxEsJ,EAAmB3G,GAAkBgF,EAAQ,CAAE3H,qBAAqB,IACpE+I,EAAS,SAACC,EAAkBrE,SAAqB,CAAEqE,QAAAA,EAASrE,QAAAA,EAAS+C,SAAAA,EAAUC,OAAAA,UAE7DtG,OAAOkI,KAAKF,kBAAqB,KAA9CxG,YACDA,KAAayG,GACf,OAAOP,GAAO,mCAAiClG,sBAE7C8F,EAAgBa,EAAKH,EAAoBxG,GACzC+F,EAAcY,EAAKF,EAAkBzG,MAEvC8F,EAActK,SAAWuK,EAAYvK,OACrC,OAAO0K,GAAO,qBAAmBJ,EAActK,mBAAUwE,6BAA4B+F,EAAYvK,wBAE1EsK,4BAAhBM,cACFL,EAAYM,MAAK,SAAAC,UAAcf,GAAWa,EAAcE,MACzD,SAAOJ,GAAO,wCAAsClG,sBAAqBC,GAAamG,kCAFpD,6EAMxCQ,YAAsBpI,OAAOkI,KAAKD,GAAkB,kBAAM,YAC5DG,EACOV,GAAO,mCAAiCU,gBAE5CV,GAAO,EAAM,2BAGRW,GAAahC,EAAkBC,GAE3Cc,SAEME,EAAgB5E,GAAkB2D,EAAU,CAAE1H,qBAAqB,IACnE4I,EAAc7E,GAAkB4D,EAAQ,CAAE3H,qBAAqB,IAC/D+I,EAAS,SAACC,EAAkBrE,SAAqB,CAAEqE,QAAAA,EAASrE,QAAAA,EAAS+C,SAAAA,EAAUC,OAAAA,OAEjFgB,EAActK,SAAWuK,EAAYvK,OACrC,OAAO0K,GAAO,qBAAmBJ,EAActK,kCAAyBuK,EAAYvK,wBAE7DsK,4BAAhBM,cACFL,EAAYM,MAAK,SAAAC,UAAcf,GAAWa,EAAcE,MACzD,SAAOJ,GAAO,gDAA8CjG,GAAamG,kCAFvC,+EAKnCF,GAAO,EAAM,kBCtIxB,IAAMY,GAAmF,CACrF3F,gBAAO4F,OAEGjC,EADO1L,KACO4N,KACdC,EAFO7N,KAEO6N,OAAOC,KAAK9N,MAE1B8M,EAASW,GADEE,EACqBjC,GAEtCmC,EAAOf,EAAOC,QAASD,EAAOpE,QAAS,GAAIoE,EAAOrB,SAAUqB,EAAOpB,SAEvEjF,gBAAOsH,OAEGrC,EADO1L,KACO4N,KACdC,EAFO7N,KAEO6N,OAAOC,KAAK9N,MAE1B8M,EAASK,GADEY,EACqBrC,GAEtCmC,EAAOf,EAAOC,QAASD,EAAOpE,QAAS,GAAIoE,EAAOrB,SAAUqB,EAAOpB,mBCjC3DsC,KACZC,KAAKC,KAAI,SAAAC,UAAS/I,OAAOC,QAAQqI,IAAYU,SAAQ,yBAAEzN,OAAMmF,cAAYqI,EAAME,UAAUC,UAAU3N,EAAMmF,SCU7G,SAASyI,GAAazB,EAAwB/L,OACpCyN,EAAO1B,EAAOC,QACd0B,EAAQ1N,EAAQ2N,QAAQD,YA2BvB,CAAED,KAAAA,EAAM9F,QA1BC8F,EACV,iBAAM,CACJ1B,EAAOpE,QACP+F,EAAME,YAAY5N,EAAQ6N,MAC1B,yBACqBH,EAAMI,cAAc9N,EAAQ0K,+BAChCgD,EAAMK,cAAc/N,EAAQgO,YAC3C7J,KAAK,OACTA,KAAK,SACL,eACQ8J,EAAaC,EAAKlO,EAAQ0K,SAAU1K,EAAQgO,SAAU,CACxDG,OAAQnO,EAAQ2N,QAAQQ,eAGrB,CACHpC,EAAOpE,QACP+F,EAAME,YAAY5N,EAAQ6N,MAC1BI,GAAcA,EAAWrL,SAAS,qCACVqL,GAClB,qBACeP,EAAMI,cAAc9N,EAAQ0K,+BAC5BgD,EAAMK,cAAc/N,EAAQgO,YAC3C7J,KAAK,OACbA,KAAK,UAMnB,IAAMiK,GAAiC,CAC7BC,uBAAcL,EAAUtD,iIACLgB,GAAahB,EAAUsD,iBAAtCjC,2BAECyB,GAAazB,EAAQ,CACxB4B,QAAS7L,EACT+L,KAAM,gBACNnD,SAAAA,EACAsD,SAAAA,mDAGRM,uBAAcN,EAAUtD,UAGb8C,GAFQpB,GAAa1B,EAAUsD,GAEV,CACxBL,QAAS1O,KACT4O,KAAM,gBACNnD,SAAUjF,GAAgBiF,GAC1BsD,SAAUvI,GAAgBuI,gBC7DtBO,KACZC,OAAOC,OAAOL"}
1
+ {"version":3,"file":"noeldemartin-solid-utils.esm.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/SolidDocument.ts","../src/helpers/jsonld.ts","../src/helpers/io.ts","../src/helpers/auth.ts","../src/helpers/identifiers.ts","../src/helpers/interop.ts","../src/helpers/testing.ts","../src/plugins/chai/assertions.ts","../src/plugins/chai/index.ts","../src/plugins/jest/matchers.ts","../src/plugins/jest/index.ts"],"sourcesContent":["import { Error } 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 Error {\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 { Error } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Request failed trying to fetch ${url}`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NotFoundError extends Error {\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 { Error } 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 Error {\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'\n ? this.responseStatus === 403\n : 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 foaf: 'http://xmlns.com/foaf/0.1/',\n pim: 'http://www.w3.org/ns/pim/space#',\n purl: 'http://purl.org/dc/terms/',\n rdfs: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\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'))\n return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix)\n throw new Error(`Can't expand IRI with unknown prefix: '${iri}'`);\n\n return expandedPrefix + name;\n }\n\n if (!options.defaultPrefix)\n throw new Error(`Can't expand IRI without a default prefix: '${iri}'`);\n\n return options.defaultPrefix + prefix;\n}\n","import type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/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\n .find(quad => quad.predicate.value === expandIRI(property))\n ?.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 { parseDate } from '@noeldemartin/utils';\nimport type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport default class SolidDocument {\n\n public readonly url: string;\n public readonly headers: Headers;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n this.url = url;\n this.quads = quads;\n this.headers = headers;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(\n this.url,\n expandIRI('rdfs:type'),\n expandIRI('foaf:PersonalProfileDocument'),\n );\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 getLastModified(): Date | null {\n return parseDate(this.headers.get('last-modified'))\n ?? parseDate(this.statement(this.url, 'purl:modified')?.object.value)\n ?? this.getLatestDocumentDate()\n ?? null;\n }\n\n public statements(subject?: string, predicate?: string, object?: string): Quad[] {\n return this.quads.filter(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n }\n\n public statement(subject?: string, predicate?: string, object?: string): Quad | null {\n const statement = this.quads.find(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\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 private getLatestDocumentDate(): Date | null {\n const dates = [\n ...this.statements(undefined, 'purl:modified'),\n ...this.statements(undefined, 'purl:created'),\n ]\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}\n","export 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 = { '@graph': JsonLDResource[] };\n\nexport function isJsonLDGraph(jsonld: JsonLD): jsonld is JsonLDGraph {\n return '@graph' in jsonld;\n}\n","import { arr, arrayFilter, arrayReplace,objectWithoutEmpty } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';\nimport type { JsonLdDocument } from 'jsonld';\nimport { toRDF } from 'jsonld';\nimport md5 from 'md5';\nimport type { Quad } from 'rdf-js';\nimport type { Term as N3Term } from 'n3';\n\nimport SolidDocument from '@/models/SolidDocument';\n\nimport MalformedSolidDocumentError, { SolidDocumentFormat } from '@/errors/MalformedSolidDocumentError';\nimport NetworkRequestError from '@/errors/NetworkRequestError';\nimport NotFoundError from '@/errors/NotFoundError';\nimport UnauthorizedError from '@/errors/UnauthorizedError';\nimport { isJsonLDGraph } from '@/helpers/jsonld';\nimport type { JsonLD } from '@/helpers/jsonld';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type AnyFetch = (input: any, options?: any) => Promise<any>;\nexport declare type TypedFetch = (input: RequestInfo, options?: RequestInit) => Promise<Response>;\nexport declare type Fetch = TypedFetch | AnyFetch;\n\nasync function fetchRawSolidDocument(url: string, fetch: Fetch): Promise<{ body: string; headers: Headers }> {\n const options = {\n headers: { Accept: 'text/turtle' },\n };\n\n try {\n const response = await fetch(url, options);\n\n if (response.status === 404)\n throw new NotFoundError(url);\n\n if ([401, 403].includes(response.status))\n 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)\n throw error;\n\n throw new NetworkRequestError(url);\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 const ids = arrayFilter([\n quad.object.termType === 'BlankNode' ? quad.object.value : null,\n quad.subject.termType === 'BlankNode' ? quad.subject.value : null,\n ]);\n\n for (const id of ids) {\n quadsIndexes[id] = quadsIndexes[id] ?? new Set();\n quadsIndexes[id].add(index);\n }\n\n return ids;\n })\n .filter()\n .unique();\n\n for (const originalId of blankNodeIds) {\n const normalizedId = md5(\n arr(quadsIndexes[originalId])\n .map(index => quads[index])\n .filter(({ subject: { termType, value } }) => termType === 'BlankNode' && value === originalId)\n .map(\n ({ predicate, object }) => object.termType === 'BlankNode'\n ? predicate.value\n : predicate.value + object.value,\n )\n .sorted()\n .join(),\n );\n\n for (const index of quadsIndexes[originalId]) {\n const quad = normalizedQuads[index];\n const terms: Record<string, N3Term> = { subject: quad.subject as N3Term, object: quad.object as N3Term };\n\n for (const [termName, termValue] of Object.entries(terms)) {\n if (termValue.termType !== 'BlankNode' || termValue.value !== originalId)\n continue;\n\n terms[termName] = new N3BlankNode(normalizedId);\n }\n\n arrayReplace(normalizedQuads, quad, new N3Quad(terms.subject, quad.predicate as N3Term, terms.object));\n }\n }\n\n return normalizedQuads;\n}\n\nexport interface ParsingOptions {\n documentUrl: string;\n normalizeBlankNodes: boolean;\n}\n\nexport async function createSolidDocument(url: string, body: string, fetch?: Fetch): Promise<SolidDocument> {\n fetch = fetch ?? window.fetch;\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, fetch?: Fetch): Promise<SolidDocument> {\n const { body: data, headers } = await fetchRawSolidDocument(url, fetch ?? window.fetch);\n const statements = await turtleToQuads(data, { documentUrl: url });\n\n return new SolidDocument(url, statements, headers);\n}\n\nexport async function jsonldToQuads(jsonld: JsonLD): Promise<Quad[]> {\n if (isJsonLDGraph(jsonld)) {\n const graphQuads = await Promise.all(jsonld['@graph'].map(jsonldToQuads));\n\n return graphQuads.flat();\n }\n\n return toRDF(jsonld as JsonLdDocument) as Promise<Quad[]>;\n}\n\nexport function normalizeSparql(sparql: string): string {\n const quads = sparqlToQuadsSync(sparql);\n\n return Object\n .entries(quads)\n .reduce((normalizedOperations, [operation, quads]) => {\n const normalizedQuads = quads.map(quad => ' ' + quadToTurtle(quad)).sort().join('\\n');\n\n return normalizedOperations.concat(`${operation.toUpperCase()} DATA {\\n${normalizedQuads}\\n}`);\n }, [] as string[])\n .join(' ;\\n');\n}\n\nexport function quadsToTurtle(quads: Quad[]): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString(quads);\n}\n\nexport function quadToTurtle(quad: Quad): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, fetch?: Fetch): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, fetch);\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 = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all([...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 return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = sparql.matchAll(/(\\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 parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n const quads: Quad[] = [];\n\n return new Promise((resolve, reject) => {\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(\n options.documentUrl ?? null,\n SolidDocumentFormat.Turtle,\n error.message,\n ),\n );\n return;\n }\n\n if (!quad) {\n options.normalizeBlankNodes\n ? resolve(normalizeBlankNodes(quads))\n : resolve(quads);\n\n return;\n }\n\n quads.push(quad);\n });\n });\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes\n ? normalizeBlankNodes(quads)\n : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(\n options.documentUrl ?? 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;\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n","import { objectWithoutEmpty, silenced, urlParentDirectory, urlRoot, urlRoute } from '@noeldemartin/utils';\n\nimport { fetchSolidDocument } from './io';\nimport type { Fetch } from './io';\n\nexport interface SolidUserProfile {\n webId: string;\n storageUrls: string[];\n name?: string;\n avatarUrl?: string;\n oidcIssuerUrl?: string;\n publicTypeIndexUrl?: string;\n privateTypeIndexUrl?: string;\n}\n\nasync function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUserProfile> {\n const documentUrl = urlRoute(webId);\n const document = await fetchSolidDocument(documentUrl, fetch);\n\n if (!document.isPersonalProfile())\n throw new Error(`Document at ${documentUrl} is not a profile.`);\n\n const storageUrls = document.statements(webId, 'pim:storage').map(storage => storage.object.value);\n const publicTypeIndex = document.statement(webId, 'solid:publicTypeIndex');\n const privateTypeIndex = document.statement(webId, 'solid:privateTypeIndex');\n\n let parentUrl = urlParentDirectory(documentUrl);\n while (parentUrl && storageUrls.length === 0) {\n const parentDocument = await silenced(fetchSolidDocument(parentUrl, fetch));\n\n if (parentDocument?.isStorage()) {\n storageUrls.push(parentUrl);\n\n break;\n }\n\n parentUrl = urlParentDirectory(parentUrl);\n }\n\n return objectWithoutEmpty({\n webId,\n storageUrls,\n name:\n document.statement(webId, 'vcard:fn')?.object.value ??\n document.statement(webId, 'foaf:name')?.object.value,\n avatarUrl:\n document.statement(webId, 'vcard:hasPhoto')?.object.value ??\n document.statement(webId, 'foaf:img')?.object.value,\n oidcIssuerUrl: document.statement(webId, 'solid:oidcIssuer')?.object.value,\n publicTypeIndexUrl: publicTypeIndex?.object.value,\n privateTypeIndexUrl: privateTypeIndex?.object.value,\n });\n}\n\nexport async function fetchLoginUserProfile(loginUrl: string, fetch?: Fetch): Promise<SolidUserProfile | null> {\n const fetchProfile = silenced(url => fetchUserProfile(url, fetch));\n\n return await fetchProfile(loginUrl)\n ?? await fetchProfile(loginUrl.replace(/\\/$/, '').concat('/profile/card#me'))\n ?? await fetchProfile(urlRoot(loginUrl).concat('/profile/card#me'));\n}\n","import { arr, isArray, isObject, objectDeepClone, objectWithoutEmpty, tap, urlParse, uuid } from '@noeldemartin/utils';\nimport type { UrlParts } from '@noeldemartin/utils';\nimport type { JsonLD, JsonLDResource } from '@/helpers';\n\nexport interface SubjectParts {\n containerUrl?: string;\n documentName?: string;\n resourceHash?: string;\n}\n\nfunction getContainerPath(parts: UrlParts): string | null {\n if (!parts.path || !parts.path.startsWith('/'))\n return null;\n\n if (parts.path.match(/^\\/[^/]*$/))\n return '/';\n\n return `/${arr(parts.path.split('/')).filter().slice(0, -1).join('/')}/`.replace('//', '/');\n}\n\nfunction getContainerUrl(parts: UrlParts): string | null {\n const containerPath = getContainerPath(parts);\n\n return parts.protocol && parts.domain\n ? `${parts.protocol}://${parts.domain}${containerPath ?? '/'}`\n : containerPath;\n}\n\nfunction __mintJsonLDIdentifiers(jsonld: JsonLD): void {\n if (!('@type' in jsonld) || '@value' in jsonld)\n return;\n\n jsonld['@id'] = jsonld['@id'] ?? uuid();\n\n for (const propertyValue of Object.values(jsonld)) {\n if (isObject(propertyValue))\n __mintJsonLDIdentifiers(propertyValue);\n\n if (isArray(propertyValue))\n propertyValue.forEach(value => isObject(value) && __mintJsonLDIdentifiers(value));\n }\n}\n\nexport function mintJsonLDIdentifiers(jsonld: JsonLD): JsonLDResource {\n return tap(objectDeepClone(jsonld) as JsonLDResource, clone => __mintJsonLDIdentifiers(clone));\n}\n\nexport function parseResourceSubject(subject: string): SubjectParts {\n const parts = urlParse(subject);\n\n return !parts ? {} : objectWithoutEmpty({\n containerUrl: getContainerUrl(parts),\n documentName: parts.path ? parts.path.split('/').pop() : null,\n resourceHash: parts.fragment,\n });\n}\n","import { uuid } from '@noeldemartin/utils';\n\nimport { createSolidDocument, fetchSolidDocument, solidDocumentExists, updateSolidDocument } from '@/helpers/io';\nimport type SolidThing from '@/models/SolidThing';\nimport type { Fetch } from '@/helpers/io';\nimport type { SolidUserProfile } from '@/helpers/auth';\n\nasync function mintPrivateTypeIndexUrl(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const storageUrl = user.storageUrls[0];\n const typeIndexUrl = `${storageUrl}settings/privateTypeIndex`;\n\n return await solidDocumentExists(typeIndexUrl, fetch)\n ? `${storageUrl}settings/privateTypeIndex-${uuid()}`\n : typeIndexUrl;\n}\n\nexport async function createPrivateTypeIndex(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const typeIndexUrl = await mintPrivateTypeIndexUrl(user, fetch);\n const typeIndexBody = `\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n `;\n const profileUpdateBody = `\n INSERT DATA {\n <${user.webId}> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <${typeIndexUrl}> .\n }\n `;\n\n await Promise.all([\n createSolidDocument(typeIndexUrl, typeIndexBody, fetch),\n updateSolidDocument(user.webId, profileUpdateBody, fetch),\n ]);\n\n return typeIndexUrl;\n}\n\nexport async function findContainerRegistration(\n typeIndexUrl: string,\n childrenType: string,\n fetch?: Fetch,\n): Promise<SolidThing | null> {\n const typeIndex = await fetchSolidDocument(typeIndexUrl, fetch);\n const containerQuad = typeIndex\n .statements(undefined, 'rdfs:type', 'solid:TypeRegistration')\n .find(\n statement =>\n typeIndex.contains(statement.subject.value, 'solid:forClass', childrenType) &&\n typeIndex.contains(statement.subject.value, 'solid:instanceContainer'),\n );\n\n return containerQuad\n ? typeIndex.getThing(containerQuad.subject.value) ?? null\n : null;\n}\n","import { Error, arrayRemove, pull } from '@noeldemartin/utils';\nimport type { JsonLD } from '@/helpers/jsonld';\nimport type { Quad, Quad_Object } from 'rdf-js';\n\nimport { jsonldToQuads, quadToTurtle, quadsToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';\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 Error {\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)\n throw new ExpectedQuadAssertionError(expectedQuad);\n\n arrayRemove(actualQuads, matchingQuad);\n }\n}\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[(.*\\]\\[)?([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n if (!containsPatterns(expected))\n return expected === actual;\n\n const patternAliases = [];\n\n if (!(expected in patternsRegExpsIndex)) {\n const patternMatches = expected.matchAll(/\\[\\[((.*?)\\]\\[)?([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n if (patternMatch[2]) {\n patternAliases.push(patternMatch[2]);\n }\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 patternsRegExpsIndex[expected] = new RegExp(expectedRegExp);\n }\n\n return patternsRegExpsIndex[expected].test(actual);\n}\n\nfunction quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {\n if (expected.termType !== actual.termType)\n return false;\n\n if (expected.termType === 'Literal' && actual.termType === 'Literal') {\n if (expected.datatype.value !== actual.datatype.value)\n 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 quadObjectEquals(expected.object, actual.object)\n && quadValueEquals(expected.subject.value, actual.subject.value)\n && quadValueEquals(expected.predicate.value, actual.predicate.value);\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))\n 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))\n 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))\n 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)\n 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))\n throw error;\n\n return result(false, error.message);\n }\n\n return result(true, 'turtle matches');\n}\n","import { sparqlEquals, turtleEquals } from '@/helpers/testing';\n\ntype CustomAssertions = {\n [assertion in keyof typeof assertions]: typeof assertions[assertion];\n};\n\ndeclare global {\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Chai {\n\n interface Assertion extends CustomAssertions {}\n interface Include extends CustomAssertions {}\n\n }\n\n}\n\nconst assertions: Record<string, (this: Chai.AssertionStatic, ...args: any[]) => void> = {\n turtle(graph: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = graph;\n const result = turtleEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n sparql(query: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = query;\n const result = sparqlEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n};\n\nexport default assertions;\n","import assertions from './assertions';\n\nexport function installChaiPlugin(): void {\n chai.use(_chai => Object.entries(assertions).forEach(([name, method]) => _chai.Assertion.addMethod(name, method)));\n}\n","import { normalizeSparql } from '@/helpers/io';\nimport { jsonldEquals, sparqlEquals } from '@/helpers/testing';\nimport type { EqualityResult } from '@/helpers/testing';\n\ninterface FormatResultOptions {\n context: jest.MatcherContext;\n hint: string;\n expected: unknown;\n received: unknown;\n}\n\nfunction formatResult(result: EqualityResult, options: FormatResultOptions) {\n const pass = result.success;\n const utils = options.context.utils;\n const message = pass\n ? () => [\n result.message,\n utils.matcherHint(options.hint),\n [\n `Expected: not ${utils.printExpected(options.expected)}`,\n `Received: ${utils.printReceived(options.received)}`,\n ].join('\\n'),\n ].join('\\n\\n')\n : () => {\n return [\n result.message,\n utils.matcherHint(options.hint),\n ].join('\\n\\n');\n };\n\n return { pass, message };\n}\n\nconst matchers: jest.ExpectExtendMap = {\n async toEqualJsonLD(received, expected) {\n const result = await jsonldEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualJsonLD',\n expected,\n received,\n });\n },\n toEqualSparql(received, expected) {\n const result = sparqlEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualSparql',\n expected: normalizeSparql(expected),\n received: normalizeSparql(received),\n });\n },\n};\n\nexport default matchers;\n","import matchers from './matchers';\n\nexport function installJestPlugin(): void {\n expect.extend(matchers);\n}\n"],"names":["SolidDocumentFormat","MalformedSolidDocumentError","Error","documentUrl","documentFormat","malformationDetails","errorMessage","NetworkRequestError","url","NotFoundError","UnauthorizedError","responseStatus","this","undefined","knownPrefixes","foaf","pim","purl","rdfs","schema","solid","vcard","defineIRIPrefix","name","value","expandIRI","iri","options","startsWith","split","prefix","expandedPrefix","extraContext","_options$extraContext","defaultPrefix","SolidThing","quads","property","find","quad","predicate","_this$quads$find","object","filter","map","SolidDocument","headers","statements","length","statement","get","_this$headers$get","match","parseDate","_this$statement","getLatestDocumentDate","subject","_this","_this2","dates","date","reduce","a","b","isJsonLDGraph","jsonld","fetchRawSolidDocument","fetch","Accept","response","status","includes","text","body","_context","normalizeBlankNodes","normalizedQuads","slice","quadsIndexes","blankNodeIds","arr","flatMap","index","ids","arrayFilter","termType","id","Set","add","unique","originalId","normalizedId","md5","sorted","join","terms","Object","entries","termName","termValue","N3BlankNode","arrayReplace","N3Quad","createSolidDocument","window","turtleToQuads","method","Headers","fetchSolidDocument","data","jsonldToQuads","Promise","all","graphQuads","flat","toRDF","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","quadToTurtle","sort","concat","toUpperCase","quadsToTurtle","TurtleWriter","quadsToString","solidDocumentExists","document","isEmpty","sparqlToQuads","operations","matchAll","_toConsumableArray","operationName","toLowerCase","operationBody","turtleToQuadsSync","turtle","parserOptions","objectWithoutEmpty","baseIRI","parser","TurtleParser","resolve","reject","parse","error","Turtle","message","push","updateSolidDocument","fetchUserProfile","webId","urlRoute","isPersonalProfile","storageUrls","storage","publicTypeIndex","privateTypeIndex","parentUrl","urlParentDirectory","silenced","parentDocument","isStorage","_document$statement","_document$statement2","avatarUrl","_document$statement3","_document$statement4","oidcIssuerUrl","_document$statement5","publicTypeIndexUrl","privateTypeIndexUrl","fetchLoginUserProfile","loginUrl","fetchProfile","replace","urlRoot","getContainerUrl","parts","containerPath","path","getContainerPath","protocol","domain","__mintJsonLDIdentifiers","uuid","values","propertyValue","isObject","isArray","forEach","mintJsonLDIdentifiers","tap","objectDeepClone","clone","parseResourceSubject","urlParse","containerUrl","documentName","pop","resourceHash","fragment","mintPrivateTypeIndexUrl","user","storageUrl","typeIndexUrl","createPrivateTypeIndex","profileUpdateBody","findContainerRegistration","childrenType","typeIndex","containerQuad","contains","getThing","patternsRegExpsIndex","builtInPatterns","ExpectedQuadAssertionError","expectedQuad","assertExpectedQuadsExist","expectedQuads","actualQuads","matchingQuad","actualQuad","actual","expected","datatype","containsPatterns","Date","getTime","quadValueEquals","quadObjectEquals","arrayRemove","test","patternAliases","patternMatches","patterns","expectedRegExp","patternMatch","patternIndex","pattern","RegExp","resetPatterns","jsonldEquals","expectedTurtle","actualTurtle","result","success","sparqlEquals","expectedOperations","actualOperations","keys","pull","unexpectedOperation","turtleEquals","assertions","graph","_obj","assert","bind","query","installChaiPlugin","chai","use","_chai","Assertion","addMethod","formatResult","pass","utils","context","matcherHint","hint","printExpected","printReceived","received","matchers","toEqualJsonLD","toEqualSparql","installJestPlugin","expect","extend"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
- module.exports = {
1
+ const { defineConfig } = require('@noeldemartin/scripts');
2
+
3
+ module.exports = defineConfig({
2
4
  name: 'NoelDeMartinSolidUtils',
3
5
  declarations: [
4
6
  // 'src/plugins/cypress/types.d.ts',
5
7
  'src/plugins/jest/types.d.ts',
6
8
  ],
7
- };
9
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noeldemartin/solid-utils",
3
- "version": "0.1.1-next.0138d472d679413be54bc014f8cf21f03a1e1c3c",
3
+ "version": "0.1.1-next.1f0cf6ccc237588ae655211348e94eba9ba16c8d",
4
4
  "description": "My JavaScript utilities for Solid",
5
5
  "main": "dist/noeldemartin-solid-utils.cjs.js",
6
6
  "module": "dist/noeldemartin-solid-utils.esm.js",
@@ -9,18 +9,18 @@
9
9
  "build": "rm dist -rf && npm run build:js && npm run build:types",
10
10
  "build:js": "noeldemartin-build-javascript",
11
11
  "build:types": "noeldemartin-build-types",
12
- "lint": "eslint src && tsc --noEmit",
12
+ "lint": "noeldemartin-lint src",
13
13
  "publish-next": "noeldemartin-publish-next",
14
14
  "test": "jest --verbose",
15
15
  "test:coverage": "jest --coverage"
16
16
  },
17
- "engines": {
18
- "node": ">=14.15.0 <15"
19
- },
20
17
  "repository": {
21
18
  "type": "git",
22
19
  "url": "git+https://github.com/noeldemartin/solid-utils.git"
23
20
  },
21
+ "engines": {
22
+ "node": ">=14.x"
23
+ },
24
24
  "author": "Noel De Martin",
25
25
  "license": "MIT",
26
26
  "bugs": {
@@ -29,7 +29,7 @@
29
29
  "homepage": "https://github.com/noeldemartin/solid-utils",
30
30
  "dependencies": {
31
31
  "@babel/runtime": "^7.14.0",
32
- "@noeldemartin/utils": "^0.2.1-next.f9c86762b10628346fab4d9d8f543b7f9e3c997f",
32
+ "@noeldemartin/utils": "^0.2.1-next.1d98ba7681512958f6bf2401b26c5c6433670098",
33
33
  "@types/rdf-js": "^4.0.1",
34
34
  "core-js": "^3.12.1",
35
35
  "jest-diff": "^26.6.2",
@@ -44,8 +44,8 @@
44
44
  "@babel/preset-env": "^7.14.2",
45
45
  "@babel/preset-typescript": "^7.13.0",
46
46
  "@microsoft/api-extractor": "^7.15.2",
47
- "@noeldemartin/eslint-config-typescript": "^0.1.0",
48
- "@noeldemartin/scripts": "^0.1.1",
47
+ "@noeldemartin/eslint-config-typescript": "^0.1.0-next.e83e5d37837b9845675534ab9d3745820b1326b4",
48
+ "@noeldemartin/scripts": "^0.1.1-next.40031a27875d800f17a8b8e7899e8304a16256c3",
49
49
  "@rollup/plugin-alias": "^3.1.2",
50
50
  "@rollup/plugin-babel": "^5.3.0",
51
51
  "@rollup/plugin-commonjs": "^19.0.0",
@@ -0,0 +1,56 @@
1
+ import { arr, isArray, isObject, objectDeepClone, objectWithoutEmpty, tap, urlParse, uuid } from '@noeldemartin/utils';
2
+ import type { UrlParts } from '@noeldemartin/utils';
3
+ import type { JsonLD, JsonLDResource } from '@/helpers';
4
+
5
+ export interface SubjectParts {
6
+ containerUrl?: string;
7
+ documentName?: string;
8
+ resourceHash?: string;
9
+ }
10
+
11
+ function getContainerPath(parts: UrlParts): string | null {
12
+ if (!parts.path || !parts.path.startsWith('/'))
13
+ return null;
14
+
15
+ if (parts.path.match(/^\/[^/]*$/))
16
+ return '/';
17
+
18
+ return `/${arr(parts.path.split('/')).filter().slice(0, -1).join('/')}/`.replace('//', '/');
19
+ }
20
+
21
+ function getContainerUrl(parts: UrlParts): string | null {
22
+ const containerPath = getContainerPath(parts);
23
+
24
+ return parts.protocol && parts.domain
25
+ ? `${parts.protocol}://${parts.domain}${containerPath ?? '/'}`
26
+ : containerPath;
27
+ }
28
+
29
+ function __mintJsonLDIdentifiers(jsonld: JsonLD): void {
30
+ if (!('@type' in jsonld) || '@value' in jsonld)
31
+ return;
32
+
33
+ jsonld['@id'] = jsonld['@id'] ?? uuid();
34
+
35
+ for (const propertyValue of Object.values(jsonld)) {
36
+ if (isObject(propertyValue))
37
+ __mintJsonLDIdentifiers(propertyValue);
38
+
39
+ if (isArray(propertyValue))
40
+ propertyValue.forEach(value => isObject(value) && __mintJsonLDIdentifiers(value));
41
+ }
42
+ }
43
+
44
+ export function mintJsonLDIdentifiers(jsonld: JsonLD): JsonLDResource {
45
+ return tap(objectDeepClone(jsonld) as JsonLDResource, clone => __mintJsonLDIdentifiers(clone));
46
+ }
47
+
48
+ export function parseResourceSubject(subject: string): SubjectParts {
49
+ const parts = urlParse(subject);
50
+
51
+ return !parts ? {} : objectWithoutEmpty({
52
+ containerUrl: getContainerUrl(parts),
53
+ documentName: parts.path ? parts.path.split('/').pop() : null,
54
+ resourceHash: parts.fragment,
55
+ });
56
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './auth';
2
+ export * from './identifiers';
2
3
  export * from './interop';
3
4
  export * from './io';
4
5
  export * from './jsonld';
@@ -31,8 +31,10 @@ export async function createPrivateTypeIndex(user: SolidUserProfile, fetch?: Fet
31
31
  }
32
32
  `;
33
33
 
34
- createSolidDocument(typeIndexUrl, typeIndexBody, fetch);
35
- updateSolidDocument(user.webId, profileUpdateBody, fetch);
34
+ await Promise.all([
35
+ createSolidDocument(typeIndexUrl, typeIndexBody, fetch),
36
+ updateSolidDocument(user.webId, profileUpdateBody, fetch),
37
+ ]);
36
38
 
37
39
  return typeIndexUrl;
38
40
  }
package/src/helpers/io.ts CHANGED
@@ -244,7 +244,11 @@ export function turtleToQuadsSync(turtle: string, options: Partial<ParsingOption
244
244
  ? normalizeBlankNodes(quads)
245
245
  : quads;
246
246
  } catch (error) {
247
- throw new MalformedSolidDocumentError(options.documentUrl ?? null, SolidDocumentFormat.Turtle, error.message);
247
+ throw new MalformedSolidDocumentError(
248
+ options.documentUrl ?? null,
249
+ SolidDocumentFormat.Turtle,
250
+ (error as Error).message ?? '',
251
+ );
248
252
  }
249
253
  }
250
254
 
@@ -1,10 +1,32 @@
1
+ import { Error, arrayRemove, pull } from '@noeldemartin/utils';
1
2
  import type { JsonLD } from '@/helpers/jsonld';
2
- import { pull } from '@noeldemartin/utils';
3
3
  import type { Quad, Quad_Object } from 'rdf-js';
4
4
 
5
5
  import { jsonldToQuads, quadToTurtle, quadsToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';
6
6
 
7
7
  let patternsRegExpsIndex: Record<string, RegExp> = {};
8
+ const builtInPatterns: Record<string, string> = {
9
+ '%uuid%': '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}',
10
+ };
11
+
12
+ class ExpectedQuadAssertionError extends Error {
13
+
14
+ constructor(public readonly expectedQuad: Quad) {
15
+ super(`Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);
16
+ }
17
+
18
+ }
19
+
20
+ function assertExpectedQuadsExist(expectedQuads: Quad[], actualQuads: Quad[]): void {
21
+ for (const expectedQuad of expectedQuads) {
22
+ const matchingQuad = actualQuads.find(actualQuad => quadEquals(expectedQuad, actualQuad));
23
+
24
+ if (!matchingQuad)
25
+ throw new ExpectedQuadAssertionError(expectedQuad);
26
+
27
+ arrayRemove(actualQuads, matchingQuad);
28
+ }
29
+ }
8
30
 
9
31
  function containsPatterns(value: string): boolean {
10
32
  return /\[\[(.*\]\[)?([^\]]+)\]\]/.test(value);
@@ -17,7 +39,7 @@ function quadValueEquals(expected: string, actual: string): boolean {
17
39
  const patternAliases = [];
18
40
 
19
41
  if (!(expected in patternsRegExpsIndex)) {
20
- const patternMatches = expected.matchAll(/\[\[((.*)\]\[)?([^\]]+)\]\]/g);
42
+ const patternMatches = expected.matchAll(/\[\[((.*?)\]\[)?([^\]]+)\]\]/g);
21
43
  const patterns: string[] = [];
22
44
  let expectedRegExp = expected;
23
45
 
@@ -34,7 +56,7 @@ function quadValueEquals(expected: string, actual: string): boolean {
34
56
  expectedRegExp = expectedRegExp.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
35
57
 
36
58
  for (const [patternIndex, pattern] of Object.entries(patterns)) {
37
- expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, pattern);
59
+ expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, builtInPatterns[pattern] ?? pattern);
38
60
  }
39
61
 
40
62
  patternsRegExpsIndex[expected] = new RegExp(expectedRegExp);
@@ -95,9 +117,13 @@ export async function jsonldEquals(expected: JsonLD, actual: JsonLD): Promise<Eq
95
117
  if (expectedQuads.length !== actualQuads.length)
96
118
  return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);
97
119
 
98
- for (const expectedQuad of expectedQuads) {
99
- if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))
100
- return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);
120
+ try {
121
+ assertExpectedQuadsExist(expectedQuads, actualQuads);
122
+ } catch (error) {
123
+ if (!(error instanceof ExpectedQuadAssertionError))
124
+ throw error;
125
+
126
+ return result(false, error.message);
101
127
  }
102
128
 
103
129
  return result(true, 'jsonld matches');
@@ -121,9 +147,16 @@ export function sparqlEquals(expected: string, actual: string): EqualityResult {
121
147
  if (expectedQuads.length !== actualQuads.length)
122
148
  return result(false, `Expected ${expectedQuads.length} ${operation} triples, found ${actualQuads.length}.`);
123
149
 
124
- for (const expectedQuad of expectedQuads) {
125
- if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))
126
- return result(false, `Couldn't find the following ${operation} triple: ${quadToTurtle(expectedQuad)}`);
150
+ try {
151
+ assertExpectedQuadsExist(expectedQuads, actualQuads);
152
+ } catch (error) {
153
+ if (!(error instanceof ExpectedQuadAssertionError))
154
+ throw error;
155
+
156
+ return result(
157
+ false,
158
+ `Couldn't find the following ${operation} triple: ${quadToTurtle(error.expectedQuad)}`,
159
+ );
127
160
  }
128
161
  }
129
162
 
@@ -145,9 +178,13 @@ export function turtleEquals(expected: string, actual: string): EqualityResult {
145
178
  if (expectedQuads.length !== actualQuads.length)
146
179
  return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);
147
180
 
148
- for (const expectedQuad of expectedQuads) {
149
- if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))
150
- return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);
181
+ try {
182
+ assertExpectedQuadsExist(expectedQuads, actualQuads);
183
+ } catch (error) {
184
+ if (!(error instanceof ExpectedQuadAssertionError))
185
+ throw error;
186
+
187
+ return result(false, error.message);
151
188
  }
152
189
 
153
190
  return result(true, 'turtle matches');
@@ -1,5 +1,3 @@
1
- import diff from 'jest-diff';
2
-
3
1
  import { normalizeSparql } from '@/helpers/io';
4
2
  import { jsonldEquals, sparqlEquals } from '@/helpers/testing';
5
3
  import type { EqualityResult } from '@/helpers/testing';
@@ -24,19 +22,9 @@ function formatResult(result: EqualityResult, options: FormatResultOptions) {
24
22
  ].join('\n'),
25
23
  ].join('\n\n')
26
24
  : () => {
27
- const diffString = diff(options.expected, options.received, {
28
- expand: options.context.expand,
29
- });
30
-
31
25
  return [
32
26
  result.message,
33
27
  utils.matcherHint(options.hint),
34
- diffString && diffString.includes('- Expect')
35
- ? `Difference:\n\n${diffString}`
36
- : [
37
- `Expected: ${utils.printExpected(options.expected)}`,
38
- `Received: ${utils.printReceived(options.received)}`,
39
- ].join('\n'),
40
28
  ].join('\n\n');
41
29
  };
42
30