@noeldemartin/solid-utils 0.1.1-next.9e4a01d16d6b3e9e29a5546b75e8b5d0d8a452d6 → 0.1.1-next.e69e8c7806f3429b47d509ae8c4c0b85e96126e1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/noeldemartin-solid-utils.cjs.js +1 -1
- package/dist/noeldemartin-solid-utils.cjs.js.map +1 -1
- package/dist/noeldemartin-solid-utils.d.ts +39 -9
- package/dist/noeldemartin-solid-utils.esm.js +1 -1
- package/dist/noeldemartin-solid-utils.esm.js.map +1 -1
- package/package.json +2 -2
- package/src/errors/NetworkRequestError.ts +3 -2
- package/src/helpers/auth.ts +64 -10
- package/src/helpers/identifiers.ts +56 -0
- package/src/helpers/index.ts +2 -0
- package/src/helpers/interop.ts +3 -3
- package/src/helpers/io.ts +61 -29
- package/src/helpers/testing.ts +23 -24
- package/src/helpers/vocabs.ts +4 -2
- package/src/helpers/wac.ts +45 -0
- package/src/models/SolidDocument.ts +7 -37
- package/src/models/SolidStore.ts +61 -0
- package/src/models/index.ts +1 -0
- package/src/plugins/jest/matchers.ts +5 -7
|
@@ -1,2 +1,2 @@
|
|
|
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,uuid as h,pull as j,arrayRemove as y}from"@noeldemartin/utils";import x from"@babel/runtime/helpers/esm/createClass";import w from"@babel/runtime/helpers/esm/asyncToGenerator";import b 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 g from"@babel/runtime/helpers/esm/toConsumableArray";import k 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 E,Parser as T,BlankNode as R,Quad as A}from"n3";import{toRDF as I}from"jsonld";import P 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.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";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";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 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 q;!function(e){e.Turtle="Turtle"}(q||(q={}));var U=function(n){r(MalformedSolidDocumentError,a);var o=S(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 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,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 N=function(n){r(NetworkRequestError,a);var o=D(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 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(n){r(NotFoundError,a);var o=B(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 O(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 z=function(n){r(UnauthorizedError,a);var o=O(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 x(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(),M={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 L(e,t){M[e]=t}function F(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=k(r,2),o=n[0],s=n[1];if(s){var a,u,i,c=null!==(a=null!==(u=M[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 Q=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 x(t,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===F(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===F(e)})).map((function(e){return e.object.value}))}}]),t}(),$=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 x(t,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,F("rdfs:type"),F("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!==F(r,{defaultPrefix:n.url})||e&&o.subject.value!==F(e,{defaultPrefix:n.url})||t&&o.predicate.value!==F(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!==F(r,{defaultPrefix:n.url})||e&&o.subject.value!==F(e,{defaultPrefix:n.url})||t&&o.predicate.value!==F(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 Q(e,t)}},{key:"getLatestDocumentDate",value:function(){var e=[].concat(g(this.statements(void 0,"purl:modified")),g(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 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,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 _(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=w(b.mark((function e(t,r){var n,o,s;return b.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 z(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 z)){e.next=19;break}throw e.t0;case 19:throw new N(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=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=J(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=J(o);try{var a=function(){var o,s=t.value,a=P(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=J(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=k(m[d],2),h=v[0],j=v[1];"BlankNode"===j.termType&&j.value===s&&(p[h]=new R(a))}f(r,l,new A(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 K(e,t,r){return V.apply(this,arguments)}function V(){return(V=w(b.mark((function e(t,r,n){var o,s;return b.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,le(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 Y(e,t){return Z.apply(this,arguments)}function Z(){return(Z=w(b.mark((function e(t,r){var n,o,s,a;return b.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,le(o,{documentUrl:t});case 7:return a=e.sent,e.abrupt("return",new $(t,a,s));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ee(e){return te.apply(this,arguments)}function te(){return(te=w(b.mark((function e(t){var r;return b.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(ee));case 3:return r=e.sent,e.abrupt("return",r.flat());case 5:return e.abrupt("return",I(t));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function re(e){var t=ce(e);return Object.entries(t).reduce((function(e,t){var r=k(t,2),n=r[0],o=r[1].map((function(e){return" "+oe(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(o,"\n}"))}),[]).join(" ;\n")}function ne(e){return(new E).quadsToString(e)}function oe(e){return(new E).quadsToString([e]).slice(0,-1)}function se(e,t){return ae.apply(this,arguments)}function ae(){return(ae=w(b.mark((function e(t,r){var n;return b.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,Y(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 ie.apply(this,arguments)}function ie(){return ie=w(b.mark((function e(t){var r,n,o,s=arguments;return b.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(g(n).map(function(){var e=w(b.mark((function e(t){var n,s;return b.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),s=t[2],e.next=4,le(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)}))),ie.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 a=t.value,u=a[1].toLowerCase(),i=a[2];o[u]=pe(i,r)}}catch(e){s.e(e)}finally{s.f()}return o}function le(e){return fe.apply(this,arguments)}function fe(){return fe=w(b.mark((function e(t){var r,n,o,s,a=arguments;return b.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 T(n),s=[],e.abrupt("return",new Promise((function(e,n){o.parse(t,(function(t,o){var a;t?n(new U(null!==(a=r.documentUrl)&&void 0!==a?a:null,q.Turtle,t.message)):o?s.push(o):r.normalizeBlankNodes?e(X(s)):e(s)}))})));case 5:case"end":return e.stop()}}),e)}))),fe.apply(this,arguments)}function pe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=i({baseIRI:t.documentUrl}),n=new T(r);try{var o=n.parse(e);return t.normalizeBlankNodes?X(o):o}catch(e){var s,a;throw new U(null!==(s=t.documentUrl)&&void 0!==s?s:null,q.Turtle,null!==(a=e.message)&&void 0!==a?a:"")}}function de(e,t,r){return me.apply(this,arguments)}function me(){return(me=w(b.mark((function e(t,r,n){var o;return b.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 ve(e,t){return he.apply(this,arguments)}function he(){return(he=w(b.mark((function e(t,r){var n,o,s,a,u,c,l,f,p,h,j,y,x,w;return b.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return f=v(t),e.next=3,Y(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(Y(x,r));case 13:if(null==(w=e.sent)||!w.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 je(e,t){return ye.apply(this,arguments)}function ye(){return(ye=w(b.mark((function e(t,r){var n,o,s;return b.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=d((function(e){return ve(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 xe(e,t){return we.apply(this,arguments)}function we(){return(we=w(b.mark((function e(t,r){var n,o,s;return b.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,se(s,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(o,"settings/privateTypeIndex-").concat(h()),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 be(e,t){return ge.apply(this,arguments)}function ge(){return(ge=w(b.mark((function e(t,r){var n,o,s;return b.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,xe(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([K(o,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",r),de(t.webId,s,r)]);case 8:return e.abrupt("return",o);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ke(e,t,r){return Ee.apply(this,arguments)}function Ee(){return(Ee=w(b.mark((function e(t,r,n){var o,s,a;return b.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Y(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 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 Re(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 Re(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 Re(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 Ae(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 Ie={},Pe={"%uuid%":"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"},Se=function(n){r(ExpectedQuadAssertionError,a);var o=Ae(ExpectedQuadAssertionError);function ExpectedQuadAssertionError(r){var n;return e(this,ExpectedQuadAssertionError),n=o.call(this,"Couldn't find the following triple: ".concat(oe(r))),s(t(n),"expectedQuad",void 0),n.expectedQuad=r,n}return ExpectedQuadAssertionError}();function qe(e,t){var r,n=Te(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(!Ue(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 De(e.value,t.value)}((r=e).object,n.object)&&De(r.subject.value,n.subject.value)&&De(r.predicate.value,n.predicate.value);var r,n}));if(!n)throw new Se(e);y(t,n)};for(n.s();!(r=n.n()).done;)o()}catch(e){n.e(e)}finally{n.f()}}function Ue(e){return/\[\[(.*\]\[)?([^\]]+)\]\]/.test(e)}function De(e,t){if(!Ue(e))return e===t;var r=[];if(!(e in Ie)){var n,o=e.matchAll(/\[\[((.*?)\]\[)?([^\]]+)\]\]/g),s=[],a=e,u=Te(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=k(l[c],2),d=p[0],m=p[1];a=a.replace("%PATTERN".concat(d,"%"),null!==(f=Pe[m])&&void 0!==f?f:m)}Ie[e]=new RegExp(a)}return Ie[e].test(t)}function Ne(){Ie={}}function Be(e,t){return Ce.apply(this,arguments)}function Ce(){return(Ce=w(b.mark((function e(t,r){var n,o,s,a,u;return b.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return Ne(),e.next=3,ee(t);case 3:return n=e.sent,e.next=6,ee(r);case 6:if(o=e.sent,s=ne(n),a=ne(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,qe(n,o),e.next=21;break;case 16:if(e.prev=16,e.t0=e.catch(12),e.t0 instanceof Se){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 Oe(e,t){var r;Ne();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}},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=j(n,i),l=j(o,i);if(c.length!==l.length)return s(!1,"Expected ".concat(c.length," ").concat(i," triples, found ").concat(l.length,"."));try{qe(c,l)}catch(e){if(!(e instanceof Se))throw e;return s(!1,"Couldn't find the following ".concat(i," triple: ").concat(oe(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 ze(e,t){Ne();var r=pe(e,{normalizeBlankNodes:!0}),n=pe(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{qe(r,n)}catch(e){if(!(e instanceof Se))throw e;return o(!1,e.message)}return o(!0,"turtle matches")}var Me={turtle:function(e){var t=this._obj,r=this.assert.bind(this),n=ze(e,t);r(n.success,n.message,"",n.expected,n.actual)},sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=Oe(e,t);r(n.success,n.message,"",n.expected,n.actual)}};function Le(){chai.use((function(e){return Object.entries(Me).forEach((function(t){var r=k(t,2),n=r[0],o=r[1];return e.Assertion.addMethod(n,o)}))}))}function Fe(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 Qe={toEqualJsonLD:function(e,t){var r=this;return w(b.mark((function n(){var o;return b.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,Be(t,e);case 2:return o=n.sent,n.abrupt("return",Fe(o,{context:r,hint:"toEqualJsonLD",expected:t,received:e}));case 4:case"end":return n.stop()}}),n)})))()},toEqualSparql:function(e,t){return Fe(Oe(t,e),{context:this,hint:"toEqualSparql",expected:re(t),received:re(e)})}};function $e(){expect.extend(Qe)}export{U as MalformedSolidDocumentError,N as NetworkRequestError,C as NotFoundError,$ as SolidDocument,q as SolidDocumentFormat,Q as SolidThing,z as UnauthorizedError,be as createPrivateTypeIndex,K as createSolidDocument,L as defineIRIPrefix,F as expandIRI,je as fetchLoginUserProfile,Y as fetchSolidDocument,ke as findContainerRegistration,Le as installChaiPlugin,$e as installJestPlugin,H as isJsonLDGraph,Be as jsonldEquals,ee as jsonldToQuads,re as normalizeSparql,oe as quadToTurtle,ne as quadsToTurtle,se as solidDocumentExists,Oe as sparqlEquals,ue as sparqlToQuads,ce as sparqlToQuadsSync,ze as turtleEquals,le as turtleToQuads,pe as turtleToQuadsSync,de 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,stringMatchAll as c,objectWithoutEmpty as i,arr as l,tap as f,arrayFilter as p,arrayReplace as d,urlRoot as m,silenced as v,urlParentDirectory as h,urlRoute as y,objectDeepClone as j,urlParse as x,uuid as w,isObject as b,isArray as g,pull as k,arrayRemove as E,urlResolve as R,requireUrlParentDirectory as I}from"@noeldemartin/utils";import T from"@babel/runtime/helpers/esm/createClass";import A from"@babel/runtime/helpers/esm/toConsumableArray";import S from"@babel/runtime/helpers/esm/asyncToGenerator";import q from"@babel/runtime/regenerator";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/esnext.async-iterator.for-each.js";import"core-js/modules/esnext.iterator.constructor.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.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.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.filter.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 U from"@babel/runtime/helpers/esm/slicedToArray";import"core-js/modules/es.string.starts-with.js";import"core-js/modules/es.string.split.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"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.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.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 P from"md5";import{Writer as D,Parser as N,BlankNode as B,Quad as C}from"n3";import{toRDF as O,fromRDF as z}from"jsonld";import"core-js/modules/es.string.match.js";import"core-js/modules/es.object.values.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 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 M;!function(e){e.Turtle="Turtle"}(M||(M={}));var Q=function(n){r(MalformedSolidDocumentError,a);var o=L(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 F(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 H=function(n){r(NetworkRequestError,a);var o=F(NetworkRequestError);function NetworkRequestError(r,n){var a;return e(this,NetworkRequestError),a=o.call(this,"Request failed trying to fetch ".concat(r),n),s(t(a),"url",void 0),a.url=r,a}return NetworkRequestError}();function $(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 J=function(n){r(NotFoundError,a);var o=$(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 W(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=W(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 T(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(),G={acl:"http://www.w3.org/ns/auth/acl#",foaf:"http://xmlns.com/foaf/0.1/",pim:"http://www.w3.org/ns/pim/space#",purl:"http://purl.org/dc/terms/",rdf:"http://www.w3.org/1999/02/22-rdf-syntax-ns#",rdfs:"http://www.w3.org/2000/01/rdf-schema#",schema:"https://schema.org/",solid:"http://www.w3.org/ns/solid/terms#",vcard:"http://www.w3.org/2006/vcard/ns#"};function X(e,t){G[e]=t}function K(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=U(r,2),o=n[0],s=n[1];if(o&&s){var a,u,c,i=null!==(a=null!==(u=G[o])&&void 0!==u?u:null===(c=t.extraContext)||void 0===c?void 0:c[o])&&void 0!==a?a: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 V=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 T(t,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===K(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===K(e)})).map((function(e){return e.object.value}))}}]),t}(),Y=function(){function t(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];e(this,t),s(this,"quads",void 0),this.quads=r}return T(t,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"getQuads",value:function(){return this.quads.slice(0)}},{key:"addQuads",value:function(e){var t;(t=this.quads).push.apply(t,A(e))}},{key:"statements",value:function(e,t,r){var n=this;return this.quads.filter((function(o){return!(r&&o.object.value!==n.expandIRI(r)||e&&o.subject.value!==n.expandIRI(e)||t&&o.predicate.value!==n.expandIRI(t))}))}},{key:"statement",value:function(e,t,r){var n=this,o=this.quads.find((function(o){return!(r&&o.object.value!==n.expandIRI(r)||e&&o.subject.value!==n.expandIRI(e)||t&&o.predicate.value!==n.expandIRI(t))}));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 V(e,t)}},{key:"expandIRI",value:function(e){return K(e)}}]),t}();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 ee=function(n){r(a,Y);var o=Z(a);function a(r,n,u){var c;return e(this,a),c=o.call(this,n),s(t(c),"url",void 0),s(t(c),"headers",void 0),c.url=r,c.headers=u,c}return T(a,[{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,K("rdf:type"),K("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:"expandIRI",value:function(e){return K(e,{defaultPrefix:this.url})}},{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}}]),a}();function te(e){return"@graph"in e}function re(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 ne(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 ne(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 ne(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 oe(e,t){return se.apply(this,arguments)}function se(){return(se=S(q.mark((function e(t,r){var n,o,s;return q.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 J(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:if(!(e.t0 instanceof J)){e.next=21;break}throw e.t0;case 21:throw new H(t,{cause:e.t0});case 22:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function ae(e){var t,r=e.slice(0),n={},o=re(l(e).flatMap((function(e,t){return f(p(["BlankNode"===e.object.termType?e.object.value:null,"BlankNode"===e.subject.termType?e.subject.value:null]),(function(e){return e.forEach((function(e){var r;return(null!==(r=n[e])&&void 0!==r?r:n[e]=new Set).add(t)}))}))})).filter().unique());try{var s=function(){var o,s=t.value,a=n[s],u=P(l(a).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=re(a);try{for(c.s();!(o=c.n()).done;){for(var i=o.value,f=r[i],p={subject:f.subject,object:f.object},m=0,v=Object.entries(p);m<v.length;m++){var h=U(v[m],2),y=h[0],j=h[1];"BlankNode"===j.termType&&j.value===s&&(p[y]=new B(u))}d(r,f,new C(p.subject,f.predicate,p.object))}}catch(e){c.e(e)}finally{c.f()}};for(o.s();!(t=o.n()).done;)s()}catch(e){o.e(e)}finally{o.f()}return r}function ue(e,t,r){return ce.apply(this,arguments)}function ce(){return(ce=S(q.mark((function e(t,r,n){var o,s;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch.bind(window),e.next=3,Re(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 ee(t,s,new Headers({})));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ie(e,t){return le.apply(this,arguments)}function le(){return(le=S(q.mark((function e(t,r){var n,o,s,a;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,oe(t,null!=r?r:window.fetch);case 2:return n=e.sent,o=n.body,s=n.headers,e.next=7,Re(o,{documentUrl:t});case 7:return a=e.sent,e.abrupt("return",new ee(t,a,s));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function fe(e,t){return pe.apply(this,arguments)}function pe(){return(pe=S(q.mark((function e(t,r){var n;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,ie(t,r);case 3:return n=e.sent,e.abrupt("return",n);case 7:if(e.prev=7,e.t0=e.catch(0),e.t0 instanceof J){e.next=11;break}throw e.t0;case 11:return e.abrupt("return",null);case 12:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}function de(e){return me.apply(this,arguments)}function me(){return(me=S(q.mark((function e(t){var r;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!te(t)){e.next=5;break}return e.next=3,Promise.all(t["@graph"].map(de));case 3:return r=e.sent,e.abrupt("return",r.flat());case 5:return e.abrupt("return",O(t));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ve(e){var t=Ee(e);return Object.entries(t).reduce((function(e,t){var r=U(t,2),n=r[0],o=r[1].map((function(e){return" "+xe(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(o,"\n}"))}),[]).join(" ;\n")}function he(e){return ye.apply(this,arguments)}function ye(){return(ye=S(q.mark((function e(t){var r;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,z(t);case 2:return r=e.sent,e.abrupt("return",{"@graph":r});case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function je(e){return(new D).quadsToString(e)}function xe(e){return(new D).quadsToString([e]).slice(0,-1)}function we(e,t){return be.apply(this,arguments)}function be(){return(be=S(q.mark((function e(t,r){var n;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,ie(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 ge(e){return ke.apply(this,arguments)}function ke(){return ke=S(q.mark((function e(t){var r,n,o,s=arguments;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>1&&void 0!==s[1]?s[1]:{},n=c(t,/(\w+) DATA {([^}]+)}/g),o={},e.next=5,Promise.all(A(n).map(function(){var e=S(q.mark((function e(t){var n,s;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),s=t[2],e.next=4,Re(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)}))),ke.apply(this,arguments)}function Ee(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=c(e,/(\w+) DATA {([^}]+)}/g),o={},s=re(n);try{for(s.s();!(t=s.n()).done;){var a=t.value,u=a[1].toLowerCase(),i=a[2];o[u]=Te(i,r)}}catch(e){s.e(e)}finally{s.f()}return o}function Re(e){return Ie.apply(this,arguments)}function Ie(){return Ie=S(q.mark((function e(t){var r,n,o,s,a=arguments;return q.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 N(n),s=[],e.abrupt("return",new Promise((function(e,n){o.parse(t,(function(t,o){var a;t?n(new Q(null!==(a=r.documentUrl)&&void 0!==a?a:null,M.Turtle,t.message)):o?s.push(o):r.normalizeBlankNodes?e(ae(s)):e(s)}))})));case 5:case"end":return e.stop()}}),e)}))),Ie.apply(this,arguments)}function Te(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=i({baseIRI:t.documentUrl}),n=new N(r);try{var o=n.parse(e);return t.normalizeBlankNodes?ae(o):o}catch(e){var s,a;throw new Q(null!==(s=t.documentUrl)&&void 0!==s?s:null,M.Turtle,null!==(a=e.message)&&void 0!==a?a:"")}}function Ae(e,t,r){return Se.apply(this,arguments)}function Se(){return(Se=S(q.mark((function e(t,r,n){var o;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch.bind(window),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 qe(e,t){return Ue.apply(this,arguments)}function Ue(){return Ue=S(q.mark((function e(t,r){var n,o,s,a,u,c;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=!1,o=new Y(t.getQuads()),s=new Set([t.url]),a=new Set([t.url]),u=function(e){return e.statements(void 0,"rdfs:seeAlso").map((function(e){return e.object.value})).forEach((function(e){return s.add(e)}))},c=function(){var e=S(q.mark((function e(){var t,c,i,l;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=0,c=A(s);case 1:if(!(t<c.length)){e.next=20;break}if(i=c[t],!a.has(i)){e.next=5;break}return e.abrupt("continue",17);case 5:return e.prev=5,e.next=8,ie(i,r);case 8:l=e.sent,a.add(l.url),o.addQuads(l.getQuads()),u(l),e.next=17;break;case 14:e.prev=14,e.t0=e.catch(5),e.t0 instanceof _&&(n=!0);case 17:t++,e.next=1;break;case 20:case"end":return e.stop()}}),e,null,[[5,14]])})));return function(){return e.apply(this,arguments)}}(),u(t);case 7:return e.next=9,c();case 9:if(a.size<a.size){e.next=7;break}case 10:return e.abrupt("return",{store:o,cloaked:n});case 11:case"end":return e.stop()}}),e)}))),Ue.apply(this,arguments)}function Pe(e,t){return De.apply(this,arguments)}function De(){return(De=S(q.mark((function e(t,r){var n,o,s,a,u,c,l,f,p,d,m,j,x,w,b,g,k;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return f=y(t),e.next=3,ie(f,r);case 3:if((p=e.sent).isPersonalProfile()||p.contains(t,"solid:oidcIssuer")){e.next=6;break}throw new Error("".concat(t," is not a valid webId."));case 6:return e.next=8,qe(p,r);case 8:d=e.sent,m=d.store,j=d.cloaked,x=m.statements(t,"pim:storage").map((function(e){return e.object.value})),w=m.statement(t,"solid:publicTypeIndex"),b=m.statement(t,"solid:privateTypeIndex"),g=h(f);case 15:if(!g||0!==x.length){e.next=25;break}return e.next=18,v(ie(g,r));case 18:if(null==(k=e.sent)||!k.isStorage()){e.next=22;break}return x.push(g),e.abrupt("break",25);case 22:g=h(g),e.next=15;break;case 25:return e.abrupt("return",i({webId:t,storageUrls:x,cloaked:j,name:null!==(n=null===(o=m.statement(t,"vcard:fn"))||void 0===o?void 0:o.object.value)&&void 0!==n?n:null===(s=m.statement(t,"foaf:name"))||void 0===s?void 0:s.object.value,avatarUrl:null!==(a=null===(u=m.statement(t,"vcard:hasPhoto"))||void 0===u?void 0:u.object.value)&&void 0!==a?a:null===(c=m.statement(t,"foaf:img"))||void 0===c?void 0:c.object.value,oidcIssuerUrl:null===(l=m.statement(t,"solid:oidcIssuer"))||void 0===l?void 0:l.object.value,publicTypeIndexUrl:null==w?void 0:w.object.value,privateTypeIndexUrl:null==b?void 0:b.object.value}));case 26:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ne(e,t){return Be.apply(this,arguments)}function Be(){return(Be=S(q.mark((function e(t,r){var n,o,s;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=v((function(e){return Pe(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(m(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 Ce(e){var t=function(e){return e.path&&e.path.startsWith("/")?e.path.match(/^\/[^/]*$/)?"/":"/".concat(l(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 Oe(e){var t;if("@type"in e&&!("@value"in e)){e["@id"]=null!==(t=e["@id"])&&void 0!==t?t:w();for(var r=0,n=Object.values(e);r<n.length;r++){var o=n[r];b(o)&&Oe(o),g(o)&&o.forEach((function(e){return b(e)&&Oe(e)}))}}}function ze(e){return f(j(e),(function(e){return Oe(e)}))}function Le(e){var t=x(e);return t?i({containerUrl:Ce(t),documentName:t.path?t.path.split("/").pop():null,resourceHash:t.fragment}):{}}function Me(e,t){return Qe.apply(this,arguments)}function Qe(){return(Qe=S(q.mark((function e(t,r){var n,o,s;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch.bind(r),o=t.storageUrls[0],s="".concat(o,"settings/privateTypeIndex"),e.next=5,we(s,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(o,"settings/privateTypeIndex-").concat(w()),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 Fe(e,t){return He.apply(this,arguments)}function He(){return(He=S(q.mark((function e(t,r){var n,o,s;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch.bind(r),e.next=3,Me(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([ue(o,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",r),Ae(t.webId,s,r)]);case 8:return e.abrupt("return",o);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function $e(e,t,r){return Je.apply(this,arguments)}function Je(){return(Je=S(q.mark((function e(t,r,n){var o,s,a;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ie(t,n);case 2:return s=e.sent,a=s.statements(void 0,"rdf: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 We(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(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(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 _e(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 Ge(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 Xe={},Ke={"%uuid%":"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"},Ve=function(n){r(ExpectedQuadAssertionError,a);var o=Ge(ExpectedQuadAssertionError);function ExpectedQuadAssertionError(r){var n;return e(this,ExpectedQuadAssertionError),n=o.call(this,"Couldn't find the following triple: ".concat(xe(r))),s(t(n),"expectedQuad",void 0),n.expectedQuad=r,n}return ExpectedQuadAssertionError}();function Ye(e,t){var r,n=We(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(!Ze(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 et(e.value,t.value)}((r=e).object,n.object)&&et(r.subject.value,n.subject.value)&&et(r.predicate.value,n.predicate.value);var r,n}));if(!n)throw new Ve(e);E(t,n)};for(n.s();!(r=n.n()).done;)o()}catch(e){n.e(e)}finally{n.f()}}function Ze(e){return/\[\[(.*\]\[)?([^\]]+)\]\]/.test(e)}function et(e,t){var r,n;return Ze(e)?(null!==(n=(r=Xe)[e])&&void 0!==n?n:r[e]=function(e){var t,r=[],n=[],o=e,s=We(c(e,/\[\[((.*?)\]\[)?([^\]]+)\]\]/g));try{for(s.s();!(t=s.n()).done;){var a=t.value;a[2]&&r.push(a[2]),n.push(a[3]),o=o.replace(a[0],"%PATTERN".concat(n.length-1,"%"))}}catch(e){s.e(e)}finally{s.f()}o=o.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");for(var u=0,i=Object.entries(n);u<i.length;u++){var l,f=U(i[u],2),p=f[0],d=f[1];o=o.replace("%PATTERN".concat(p,"%"),null!==(l=Ke[d])&&void 0!==l?l:d)}return new RegExp(o)}(e)).test(t):e===t}function tt(){Xe={}}function rt(e,t){return nt.apply(this,arguments)}function nt(){return(nt=S(q.mark((function e(t,r){var n,o,s,a,u;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return tt(),e.next=3,de(t);case 3:return n=e.sent,e.next=6,de(r);case 6:if(o=e.sent,s=je(n),a=je(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,Ye(n,o),e.next=21;break;case 16:if(e.prev=16,e.t0=e.catch(12),e.t0 instanceof Ve){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 ot(e,t){var r;tt();for(var n=Ee(e,{normalizeBlankNodes:!0}),o=Ee(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 c=u[a];if(!(c in o))return s(!1,"Couldn't find expected ".concat(c," operation."));var i=k(n,c),l=k(o,c);if(i.length!==l.length)return s(!1,"Expected ".concat(i.length," ").concat(c," triples, found ").concat(l.length,"."));try{Ye(i,l)}catch(e){if(!(e instanceof Ve))throw e;return s(!1,"Couldn't find the following ".concat(c," triple: ").concat(xe(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 st(e,t){tt();var r=Te(e,{normalizeBlankNodes:!0}),n=Te(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{Ye(r,n)}catch(e){if(!(e instanceof Ve))throw e;return o(!1,e.message)}return o(!0,"turtle matches")}function at(e,t){return ut.apply(this,arguments)}function ut(){return(ut=S(q.mark((function e(t,r){var n,o,s,a,u,c,i;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch.bind(window),e.next=3,r(t,{method:"HEAD"});case 3:if(u=e.sent,c=null!==(o=u.headers.get("Link"))&&void 0!==o?o:"",i=null!==(s=null===(a=c.match(/<([^>]+)>;\s*rel="acl"/))||void 0===a?void 0:a[1])&&void 0!==s?s:null){e.next=8;break}throw new Error("Could not find ACL Resource for '".concat(t,"'"));case 8:return e.abrupt("return",R(I(t),i));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ct(e,t,r){return it.apply(this,arguments)}function it(){return(it=S(q.mark((function e(t,r,n){var o,s,a;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(null===(o=n)||void 0===o){e.next=4;break}e.t0=o,e.next=7;break;case 4:return e.next=6,at(t,r);case 6:e.t0=e.sent;case 7:return n=e.t0,e.next=10,fe(null!==(a=n)&&void 0!==a?a:"",r);case 10:if(e.t2=s=e.sent,e.t1=null!==e.t2,!e.t1){e.next=14;break}e.t1=void 0!==s;case 14:if(!e.t1){e.next=18;break}e.t3=s,e.next=21;break;case 18:return e.next=20,ct(I(t),r);case 20:e.t3=e.sent;case 21:return e.abrupt("return",e.t3);case 22:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function lt(e,t){return ft.apply(this,arguments)}function ft(){return(ft=S(q.mark((function e(t,r){var n,o;return q.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,at(t,r);case 2:return n=e.sent,e.next=5,ct(t,r,n);case 5:return o=e.sent,e.abrupt("return",i({url:n,effectiveUrl:o.url,document:o}));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var pt={turtle:function(e){var t=this._obj,r=this.assert.bind(this),n=st(e,t);r(n.success,n.message,"",n.expected,n.actual)},sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=ot(e,t);r(n.success,n.message,"",n.expected,n.actual)}};function dt(){chai.use((function(e){return Object.entries(pt).forEach((function(t){var r=U(t,2),n=r[0],o=r[1];return e.Assertion.addMethod(n,o)}))}))}function mt(e,t){var r=e.success,n=t.context.utils;return{pass:r,message:r?function(){return[e.message,n.matcherHint(t.hint)].join("\n\n")}: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")}}}var vt={toEqualJsonLD:function(e,t){var r=this;return S(q.mark((function n(){var o;return q.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,rt(t,e);case 2:return o=n.sent,n.abrupt("return",mt(o,{context:r,hint:"toEqualJsonLD",expected:t,received:e}));case 4:case"end":return n.stop()}}),n)})))()},toEqualSparql:function(e,t){return mt(ot(t,e),{context:this,hint:"toEqualSparql",expected:ve(t),received:ve(e)})}};function ht(){expect.extend(vt)}export{Q as MalformedSolidDocumentError,H as NetworkRequestError,J as NotFoundError,ee as SolidDocument,M as SolidDocumentFormat,Y as SolidStore,V as SolidThing,_ as UnauthorizedError,Fe as createPrivateTypeIndex,ue as createSolidDocument,X as defineIRIPrefix,K as expandIRI,Ne as fetchLoginUserProfile,ie as fetchSolidDocument,lt as fetchSolidDocumentACL,fe as fetchSolidDocumentIfFound,$e as findContainerRegistration,dt as installChaiPlugin,ht as installJestPlugin,te as isJsonLDGraph,rt as jsonldEquals,de as jsonldToQuads,ze as mintJsonLDIdentifiers,ve as normalizeSparql,Le as parseResourceSubject,xe as quadToTurtle,he as quadsToJsonLD,je as quadsToTurtle,we as solidDocumentExists,ot as sparqlEquals,ge as sparqlToQuads,Ee as sparqlToQuadsSync,st as turtleEquals,Re as turtleToQuads,Te as turtleToQuadsSync,Ae 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(\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 { 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","mintPrivateTypeIndexUrl","user","storageUrl","typeIndexUrl","uuid","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","forEach","Assertion","addMethod","formatResult","pass","utils","context","matcherHint","hint","printExpected","printReceived","received","matchers","toEqualJsonLD","toEqualSparql","installJestPlugin","expect","extend"],"mappings":"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"}
|
|
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/SolidStore.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/helpers/wac.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';\nimport type { ErrorOptions } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends Error {\n\n public readonly url: string;\n\n constructor(url: string, options?: ErrorOptions) {\n super(`Request failed trying to fetch ${url}`, options);\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 acl: 'http://www.w3.org/ns/auth/acl#',\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 rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\n rdfs: 'http://www.w3.org/2000/01/rdf-schema#',\n schema: 'https://schema.org/',\n solid: 'http://www.w3.org/ns/solid/terms#',\n vcard: 'http://www.w3.org/2006/vcard/ns#',\n};\n\nexport function defineIRIPrefix(name: string, value: string): void {\n knownPrefixes[name] = value;\n}\n\nexport function expandIRI(iri: string, options: Partial<ExpandIRIOptions> = {}): string {\n if (iri.startsWith('http'))\n return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (prefix && name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix)\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 type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport default class SolidStore {\n\n private quads: Quad[];\n\n public constructor(quads: Quad[] = []) {\n this.quads = quads;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public getQuads(): Quad[] {\n return this.quads.slice(0);\n }\n\n public addQuads(quads: Quad[]): void {\n this.quads.push(...quads);\n }\n\n public statements(subject?: string, predicate?: string, object?: string): Quad[] {\n return this.quads.filter(\n statement =>\n (!object || statement.object.value === this.expandIRI(object)) &&\n (!subject || statement.subject.value === this.expandIRI(subject)) &&\n (!predicate || statement.predicate.value === this.expandIRI(predicate)),\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 === this.expandIRI(object)) &&\n (!subject || statement.subject.value === this.expandIRI(subject)) &&\n (!predicate || statement.predicate.value === this.expandIRI(predicate)),\n );\n\n return statement ?? null;\n }\n\n public contains(subject: string, predicate?: string, object?: string): boolean {\n return this.statement(subject, predicate, object) !== null;\n }\n\n public getThing(subject: string): SolidThing {\n const statements = this.statements(subject);\n\n return new SolidThing(subject, statements);\n }\n\n protected expandIRI(iri: string): string {\n return expandIRI(iri);\n }\n\n}\n","import { parseDate } from '@noeldemartin/utils';\nimport type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nimport SolidStore from './SolidStore';\n\nexport default class SolidDocument extends SolidStore {\n\n public readonly url: string;\n public readonly headers: Headers;\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n super(quads);\n\n this.url = url;\n this.headers = headers;\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(\n this.url,\n expandIRI('rdf: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 protected expandIRI(iri: string): string {\n return expandIRI(iri, { defaultPrefix: this.url });\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 md5 from 'md5';\nimport { arr, arrayFilter, arrayReplace, objectWithoutEmpty, stringMatchAll, tap } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';\nimport { fromRDF, toRDF } from 'jsonld';\nimport type { JsonLdDocument } from 'jsonld';\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, JsonLDGraph, JsonLDResource } from '@/helpers/jsonld';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type AnyFetch = (input: any, options?: any) => Promise<Response>;\nexport declare type TypedFetch = (input: RequestInfo, options?: RequestInit) => Promise<Response>;\nexport declare type Fetch = TypedFetch | AnyFetch;\n\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 if (error instanceof NotFoundError)\n throw error;\n\n throw new NetworkRequestError(url, { cause: error });\n }\n}\n\nfunction normalizeBlankNodes(quads: Quad[]): Quad[] {\n const normalizedQuads = quads.slice(0);\n const quadsIndexes: Record<string, Set<number>> = {};\n const blankNodeIds = arr(quads)\n .flatMap(\n (quad, index) => tap(\n arrayFilter([\n quad.object.termType === 'BlankNode' ? quad.object.value : null,\n quad.subject.termType === 'BlankNode' ? quad.subject.value : null,\n ]),\n ids => ids.forEach(id => (quadsIndexes[id] ??= new Set()).add(index)),\n ),\n )\n .filter()\n .unique();\n\n for (const originalId of blankNodeIds) {\n const quadIndexes = quadsIndexes[originalId] as Set<number>;\n const normalizedId = md5(\n arr(quadIndexes)\n .map(index => quads[index] as Quad)\n .filter(({ subject: { termType, value } }) => termType === 'BlankNode' && value === originalId)\n .map(\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 quadIndexes) {\n const quad = normalizedQuads[index] as Quad;\n const terms: Record<string, N3Term> = {\n subject: quad.subject as N3Term,\n object: quad.object as N3Term,\n };\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(\n normalizedQuads,\n quad,\n new N3Quad(\n terms.subject as N3Term,\n quad.predicate as N3Term,\n terms.object as N3Term,\n ),\n );\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.bind(window);\n\n const statements = await turtleToQuads(body);\n\n await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/turtle' },\n body,\n });\n\n return new SolidDocument(url, statements, new Headers({}));\n}\n\nexport async function fetchSolidDocument(url: string, 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 fetchSolidDocumentIfFound(url: string, fetch?: Fetch): Promise<SolidDocument | null> {\n try {\n const document = await fetchSolidDocument(url, fetch);\n\n return document;\n } catch (error) {\n if (!(error instanceof NotFoundError))\n throw error;\n\n return null;\n }\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 async function quadsToJsonLD(quads: Quad[]): Promise<JsonLDGraph> {\n const graph = await fromRDF(quads);\n\n return {\n '@graph': graph as JsonLDResource[],\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 = stringMatchAll<3>(sparql, /(\\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 = stringMatchAll<3>(sparql, /(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n for (const operation of operations) {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = turtleToQuadsSync(operationBody, options);\n }\n\n return quads;\n}\n\nexport async function turtleToQuads(turtle: string, options: Partial<ParsingOptions> = {}): Promise<Quad[]> {\n const 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.bind(window);\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 SolidStore from '../models/SolidStore';\nimport UnauthorizedError from '../errors/UnauthorizedError';\nimport type SolidDocument from '../models/SolidDocument';\n\nimport { fetchSolidDocument } from './io';\nimport type { Fetch } from './io';\n\nexport interface SolidUserProfile {\n webId: string;\n storageUrls: string[];\n cloaked: boolean;\n name?: string;\n avatarUrl?: string;\n oidcIssuerUrl?: string;\n publicTypeIndexUrl?: string;\n privateTypeIndexUrl?: string;\n}\n\nasync function fetchExtendedUserProfile(document: SolidDocument, fetch?: Fetch): Promise<{\n store: SolidStore;\n cloaked: boolean;\n}> {\n let cloaked = false;\n const store = new SolidStore(document.getQuads());\n const profileDocumentUrls = new Set([document.url]);\n const loadedDocumentUrls = new Set([document.url]);\n const addReferencedDocumentUrls = (document: SolidDocument) => document\n .statements(undefined, 'rdfs:seeAlso')\n .map(quad => quad.object.value)\n .forEach(profileDocumentUrl => profileDocumentUrls.add(profileDocumentUrl));\n const loadProfileDocuments = async (): Promise<void> => {\n for (const url of [...profileDocumentUrls]) {\n if (loadedDocumentUrls.has(url)) {\n continue;\n }\n\n try {\n const document = await fetchSolidDocument(url, fetch);\n\n loadedDocumentUrls.add(document.url);\n store.addQuads(document.getQuads());\n\n addReferencedDocumentUrls(document);\n } catch (error) {\n if (error instanceof UnauthorizedError) {\n cloaked = true;\n }\n\n // Silence error\n }\n }\n };\n\n addReferencedDocumentUrls(document);\n\n do {\n await loadProfileDocuments();\n } while (loadedDocumentUrls.size < loadedDocumentUrls.size);\n\n return {\n store,\n cloaked,\n };\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() && !document.contains(webId, 'solid:oidcIssuer'))\n throw new Error(`${webId} is not a valid webId.`);\n\n const { store, cloaked } = await fetchExtendedUserProfile(document, fetch);\n const storageUrls = store.statements(webId, 'pim:storage').map(storage => storage.object.value);\n const publicTypeIndex = store.statement(webId, 'solid:publicTypeIndex');\n const privateTypeIndex = store.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 cloaked,\n name:\n store.statement(webId, 'vcard:fn')?.object.value ??\n store.statement(webId, 'foaf:name')?.object.value,\n avatarUrl:\n store.statement(webId, 'vcard:hasPhoto')?.object.value ??\n store.statement(webId, 'foaf:img')?.object.value,\n oidcIssuerUrl: store.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.bind(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.bind(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, 'rdf: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, stringMatchAll } 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 createPatternRegexp(expected: string): RegExp {\n const patternAliases = [];\n const patternMatches = stringMatchAll<4, 1 | 2>(\n expected,\n /\\[\\[((.*?)\\]\\[)?([^\\]]+)\\]\\]/g,\n );\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n patternMatch[2] && patternAliases.push(patternMatch[2]);\n\n patterns.push(patternMatch[3]);\n\n expectedRegExp = expectedRegExp.replace(patternMatch[0], `%PATTERN${patterns.length - 1}%`);\n }\n\n expectedRegExp = expectedRegExp.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\n for (const [patternIndex, pattern] of Object.entries(patterns)) {\n expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, builtInPatterns[pattern] ?? pattern);\n }\n\n return new RegExp(expectedRegExp);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n return containsPatterns(expected)\n ? (patternsRegExpsIndex[expected] ??= createPatternRegexp(expected)).test(actual)\n : expected === actual;\n}\n\nfunction quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {\n if (expected.termType !== actual.termType)\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 { objectWithoutEmpty, requireUrlParentDirectory, urlResolve } from '@noeldemartin/utils';\n\nimport { fetchSolidDocumentIfFound } from '@/helpers/io';\nimport type SolidDocument from '@/models/SolidDocument';\nimport type { Fetch } from '@/helpers/io';\n\nasync function fetchACLResourceUrl(resourceUrl: string, fetch: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch.bind(window);\n\n const resourceHead = await fetch(resourceUrl, { method: 'HEAD' });\n const linkHeader = resourceHead.headers.get('Link') ?? '';\n const url = linkHeader.match(/<([^>]+)>;\\s*rel=\"acl\"/)?.[1] ?? null;\n\n if (!url) {\n throw new Error(`Could not find ACL Resource for '${resourceUrl}'`);\n }\n\n return urlResolve(requireUrlParentDirectory(resourceUrl), url);\n}\n\nasync function fetchEffectiveACL(\n resourceUrl: string,\n fetch: Fetch,\n aclResourceUrl?: string | null,\n): Promise<SolidDocument> {\n aclResourceUrl = aclResourceUrl ?? await fetchACLResourceUrl(resourceUrl, fetch);\n\n return await fetchSolidDocumentIfFound(aclResourceUrl ?? '', fetch)\n ?? await fetchEffectiveACL(requireUrlParentDirectory(resourceUrl), fetch);\n}\n\nexport async function fetchSolidDocumentACL(documentUrl: string, fetch: Fetch): Promise<{\n url: string;\n effectiveUrl: string;\n document: SolidDocument;\n}> {\n const url = await fetchACLResourceUrl(documentUrl, fetch);\n const document = await fetchEffectiveACL(documentUrl, fetch, url);\n\n return objectWithoutEmpty({\n url,\n effectiveUrl: document.url,\n document,\n });\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 ].join('\\n\\n')\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 { 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","options","NotFoundError","UnauthorizedError","responseStatus","this","undefined","knownPrefixes","acl","foaf","pim","purl","rdf","rdfs","schema","solid","vcard","defineIRIPrefix","name","value","expandIRI","iri","startsWith","split","prefix","expandedPrefix","extraContext","_options$extraContext","defaultPrefix","SolidThing","quads","property","find","quad","predicate","_this$quads$find","object","filter","map","SolidStore","statements","length","slice","push","subject","statement","_this","_this2","SolidDocument","headers","get","_this$headers$get","match","parseDate","_this$statement","getLatestDocumentDate","dates","date","reduce","a","b","isJsonLDGraph","jsonld","fetchRawSolidDocument","fetch","Accept","response","status","includes","text","body","_context","cause","normalizeBlankNodes","normalizedQuads","quadsIndexes","arr","flatMap","index","tap","arrayFilter","termType","ids","forEach","id","Set","add","unique","originalId","quadIndexes","normalizedId","md5","sorted","join","terms","Object","entries","termName","termValue","N3BlankNode","arrayReplace","N3Quad","createSolidDocument","window","bind","turtleToQuads","method","Headers","fetchSolidDocument","data","fetchSolidDocumentIfFound","document","_context4","jsonldToQuads","Promise","all","graphQuads","flat","toRDF","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","quadToTurtle","sort","concat","toUpperCase","quadsToJsonLD","fromRDF","graph","quadsToTurtle","TurtleWriter","quadsToString","solidDocumentExists","isEmpty","sparqlToQuads","operations","stringMatchAll","_toConsumableArray","operationName","toLowerCase","operationBody","turtleToQuadsSync","turtle","parserOptions","objectWithoutEmpty","baseIRI","parser","TurtleParser","resolve","reject","parse","error","Turtle","message","updateSolidDocument","fetchExtendedUserProfile","cloaked","store","getQuads","profileDocumentUrls","loadedDocumentUrls","addReferencedDocumentUrls","profileDocumentUrl","loadProfileDocuments","has","addQuads","size","fetchUserProfile","webId","urlRoute","isPersonalProfile","contains","storageUrls","storage","publicTypeIndex","privateTypeIndex","parentUrl","urlParentDirectory","silenced","parentDocument","isStorage","_store$statement","_store$statement2","avatarUrl","_store$statement3","_store$statement4","oidcIssuerUrl","_store$statement5","publicTypeIndexUrl","privateTypeIndexUrl","fetchLoginUserProfile","loginUrl","fetchProfile","replace","urlRoot","getContainerUrl","parts","containerPath","path","getContainerPath","protocol","domain","__mintJsonLDIdentifiers","uuid","values","propertyValue","isObject","isArray","mintJsonLDIdentifiers","objectDeepClone","clone","parseResourceSubject","urlParse","containerUrl","documentName","pop","resourceHash","fragment","mintPrivateTypeIndexUrl","user","storageUrl","typeIndexUrl","createPrivateTypeIndex","profileUpdateBody","findContainerRegistration","childrenType","typeIndex","containerQuad","getThing","patternsRegExpsIndex","builtInPatterns","ExpectedQuadAssertionError","expectedQuad","assertExpectedQuadsExist","expectedQuads","actualQuads","matchingQuad","actualQuad","actual","expected","datatype","containsPatterns","Date","getTime","quadValueEquals","quadObjectEquals","arrayRemove","test","_patternsRegExpsIndex","patternAliases","patterns","expectedRegExp","patternMatch","patternIndex","pattern","RegExp","createPatternRegexp","resetPatterns","jsonldEquals","expectedTurtle","actualTurtle","result","success","sparqlEquals","expectedOperations","actualOperations","keys","pull","unexpectedOperation","turtleEquals","fetchACLResourceUrl","resourceUrl","resourceHead","linkHeader","_linkHeader$match","urlResolve","requireUrlParentDirectory","fetchEffectiveACL","aclResourceUrl","fetchSolidDocumentACL","effectiveUrl","assertions","_obj","assert","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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noeldemartin/solid-utils",
|
|
3
|
-
"version": "0.1.1-next.
|
|
3
|
+
"version": "0.1.1-next.e69e8c7806f3429b47d509ae8c4c0b85e96126e1",
|
|
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",
|
|
@@ -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": "
|
|
32
|
+
"@noeldemartin/utils": "0.2.1-next.23f6799530aeebef7d8efca4078fdcd960f8e441",
|
|
33
33
|
"@types/rdf-js": "^4.0.1",
|
|
34
34
|
"core-js": "^3.12.1",
|
|
35
35
|
"jest-diff": "^26.6.2",
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Error } from '@noeldemartin/utils';
|
|
2
|
+
import type { ErrorOptions } from '@noeldemartin/utils';
|
|
2
3
|
|
|
3
4
|
export default class NetworkRequestError extends Error {
|
|
4
5
|
|
|
5
6
|
public readonly url: string;
|
|
6
7
|
|
|
7
|
-
constructor(url: string) {
|
|
8
|
-
super(`Request failed trying to fetch ${url}
|
|
8
|
+
constructor(url: string, options?: ErrorOptions) {
|
|
9
|
+
super(`Request failed trying to fetch ${url}`, options);
|
|
9
10
|
|
|
10
11
|
this.url = url;
|
|
11
12
|
}
|
package/src/helpers/auth.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { objectWithoutEmpty, silenced, urlParentDirectory, urlRoot, urlRoute } from '@noeldemartin/utils';
|
|
2
2
|
|
|
3
|
+
import SolidStore from '../models/SolidStore';
|
|
4
|
+
import UnauthorizedError from '../errors/UnauthorizedError';
|
|
5
|
+
import type SolidDocument from '../models/SolidDocument';
|
|
6
|
+
|
|
3
7
|
import { fetchSolidDocument } from './io';
|
|
4
8
|
import type { Fetch } from './io';
|
|
5
9
|
|
|
6
10
|
export interface SolidUserProfile {
|
|
7
11
|
webId: string;
|
|
8
12
|
storageUrls: string[];
|
|
13
|
+
cloaked: boolean;
|
|
9
14
|
name?: string;
|
|
10
15
|
avatarUrl?: string;
|
|
11
16
|
oidcIssuerUrl?: string;
|
|
@@ -13,16 +18,64 @@ export interface SolidUserProfile {
|
|
|
13
18
|
privateTypeIndexUrl?: string;
|
|
14
19
|
}
|
|
15
20
|
|
|
21
|
+
async function fetchExtendedUserProfile(document: SolidDocument, fetch?: Fetch): Promise<{
|
|
22
|
+
store: SolidStore;
|
|
23
|
+
cloaked: boolean;
|
|
24
|
+
}> {
|
|
25
|
+
let cloaked = false;
|
|
26
|
+
const store = new SolidStore(document.getQuads());
|
|
27
|
+
const profileDocumentUrls = new Set([document.url]);
|
|
28
|
+
const loadedDocumentUrls = new Set([document.url]);
|
|
29
|
+
const addReferencedDocumentUrls = (document: SolidDocument) => document
|
|
30
|
+
.statements(undefined, 'rdfs:seeAlso')
|
|
31
|
+
.map(quad => quad.object.value)
|
|
32
|
+
.forEach(profileDocumentUrl => profileDocumentUrls.add(profileDocumentUrl));
|
|
33
|
+
const loadProfileDocuments = async (): Promise<void> => {
|
|
34
|
+
for (const url of [...profileDocumentUrls]) {
|
|
35
|
+
if (loadedDocumentUrls.has(url)) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
const document = await fetchSolidDocument(url, fetch);
|
|
41
|
+
|
|
42
|
+
loadedDocumentUrls.add(document.url);
|
|
43
|
+
store.addQuads(document.getQuads());
|
|
44
|
+
|
|
45
|
+
addReferencedDocumentUrls(document);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
if (error instanceof UnauthorizedError) {
|
|
48
|
+
cloaked = true;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Silence error
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
addReferencedDocumentUrls(document);
|
|
57
|
+
|
|
58
|
+
do {
|
|
59
|
+
await loadProfileDocuments();
|
|
60
|
+
} while (loadedDocumentUrls.size < loadedDocumentUrls.size);
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
store,
|
|
64
|
+
cloaked,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
16
68
|
async function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUserProfile> {
|
|
17
69
|
const documentUrl = urlRoute(webId);
|
|
18
70
|
const document = await fetchSolidDocument(documentUrl, fetch);
|
|
19
71
|
|
|
20
|
-
if (!document.isPersonalProfile())
|
|
21
|
-
throw new Error(
|
|
72
|
+
if (!document.isPersonalProfile() && !document.contains(webId, 'solid:oidcIssuer'))
|
|
73
|
+
throw new Error(`${webId} is not a valid webId.`);
|
|
22
74
|
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
75
|
+
const { store, cloaked } = await fetchExtendedUserProfile(document, fetch);
|
|
76
|
+
const storageUrls = store.statements(webId, 'pim:storage').map(storage => storage.object.value);
|
|
77
|
+
const publicTypeIndex = store.statement(webId, 'solid:publicTypeIndex');
|
|
78
|
+
const privateTypeIndex = store.statement(webId, 'solid:privateTypeIndex');
|
|
26
79
|
|
|
27
80
|
let parentUrl = urlParentDirectory(documentUrl);
|
|
28
81
|
while (parentUrl && storageUrls.length === 0) {
|
|
@@ -40,13 +93,14 @@ async function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUser
|
|
|
40
93
|
return objectWithoutEmpty({
|
|
41
94
|
webId,
|
|
42
95
|
storageUrls,
|
|
96
|
+
cloaked,
|
|
43
97
|
name:
|
|
44
|
-
|
|
45
|
-
|
|
98
|
+
store.statement(webId, 'vcard:fn')?.object.value ??
|
|
99
|
+
store.statement(webId, 'foaf:name')?.object.value,
|
|
46
100
|
avatarUrl:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
oidcIssuerUrl:
|
|
101
|
+
store.statement(webId, 'vcard:hasPhoto')?.object.value ??
|
|
102
|
+
store.statement(webId, 'foaf:img')?.object.value,
|
|
103
|
+
oidcIssuerUrl: store.statement(webId, 'solid:oidcIssuer')?.object.value,
|
|
50
104
|
publicTypeIndexUrl: publicTypeIndex?.object.value,
|
|
51
105
|
privateTypeIndexUrl: privateTypeIndex?.object.value,
|
|
52
106
|
});
|