@noeldemartin/solid-utils 0.0.0-next.f9716490938d6dbabb0920bc834315c53ccd2505 → 0.1.1-next.8c064afc67573f7cf20fa4cbeecfad10a949a9ef
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nvmrc +1 -0
- package/.semaphore/semaphore.yml +1 -1
- 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 +9 -0
- package/dist/noeldemartin-solid-utils.esm.js +1 -1
- package/dist/noeldemartin-solid-utils.esm.js.map +1 -1
- package/noeldemartin.config.js +4 -2
- package/package.json +8 -6
- package/src/helpers/io.ts +20 -0
- package/src/helpers/jsonld.ts +4 -0
- package/src/helpers/testing.ts +47 -8
- package/src/plugins/chai/assertions.ts +11 -2
- package/src/plugins/cypress/types.d.ts +1 -0
- package/src/plugins/jest/matchers.ts +47 -32
- package/src/plugins/jest/types.d.ts +1 -0
package/.nvmrc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
v14.15.0
|
package/.semaphore/semaphore.yml
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("core-js/modules/es.reflect.construct.js");var e=require("@babel/runtime/helpers/classCallCheck"),t=require("@babel/runtime/helpers/inherits"),r=require("@babel/runtime/helpers/possibleConstructorReturn"),n=require("@babel/runtime/helpers/getPrototypeOf");require("core-js/modules/es.array.concat.js");var u=require("@noeldemartin/utils"),o=require("@babel/runtime/helpers/createClass"),a=require("@babel/runtime/helpers/asyncToGenerator"),s=require("@babel/runtime/regenerator");require("core-js/modules/es.array.map.js"),require("core-js/modules/es.regexp.exec.js"),require("core-js/modules/es.string.replace.js"),require("core-js/modules/es.function.name.js"),require("core-js/modules/es.array.from.js"),require("core-js/modules/es.symbol.js"),require("core-js/modules/es.symbol.description.js"),require("core-js/modules/es.symbol.iterator.js");var i=require("@babel/runtime/helpers/toConsumableArray"),c=require("@babel/runtime/helpers/slicedToArray");require("core-js/modules/es.array.slice.js"),require("core-js/modules/es.array.filter.js"),require("core-js/modules/es.array.flat-map.js"),require("core-js/modules/es.array.unscopables.flat-map.js"),require("core-js/modules/es.array.iterator.js"),require("core-js/modules/es.object.to-string.js"),require("core-js/modules/es.set.js"),require("core-js/modules/es.string.iterator.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js"),require("core-js/modules/web.dom-collections.iterator.js"),require("core-js/modules/es.array.join.js"),require("core-js/modules/es.object.entries.js"),require("core-js/modules/es.string.match-all.js"),require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.promise.js");var l=require("n3"),f=require("md5");require("core-js/modules/es.string.match.js"),require("core-js/modules/es.array.find.js"),require("core-js/modules/es.string.starts-with.js"),require("core-js/modules/es.string.split.js");var d=require("@babel/runtime/helpers/typeof");require("core-js/modules/es.regexp.constructor.js"),require("core-js/modules/es.regexp.to-string.js"),require("core-js/modules/es.object.keys.js"),require("core-js/modules/web.dom-collections.for-each.js"),require("core-js/modules/es.string.includes.js");var p=require("jest-diff");function v(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var m=v(e),h=v(t),y=v(r),j=v(n),x=v(o),b=v(a),w=v(s),g=v(i),q=v(c),k=v(f),E=v(d),T=v(p);function R(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=j.default(e);if(t){var u=j.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return y.default(this,r)}}exports.SolidDocumentFormat=void 0,(exports.SolidDocumentFormat||(exports.SolidDocumentFormat={})).Turtle="Turtle";var S=function(e){h.default(MalformedSolidDocumentError,e);var t=R(MalformedSolidDocumentError);function MalformedSolidDocumentError(e,r,n){var u;return m.default(this,MalformedSolidDocumentError),(u=t.call(this,function(e,t,r){return e?"Malformed ".concat(t," document found at ").concat(e," - ").concat(r):"Malformed ".concat(t," document - ").concat(r)}(e,r,n))).documentUrl=e,u.documentFormat=r,u.malformationDetails=n,u}return MalformedSolidDocumentError}(u.Error);function D(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=j.default(e);if(t){var u=j.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return y.default(this,r)}}var P=function(e){h.default(NetworkRequestError,e);var t=D(NetworkRequestError);function NetworkRequestError(e){var r;return m.default(this,NetworkRequestError),(r=t.call(this,"Request failed trying to fetch ".concat(e))).url=e,r}return NetworkRequestError}(u.Error);function I(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=j.default(e);if(t){var u=j.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return y.default(this,r)}}var A=function(e){h.default(NotFoundError,e);var t=I(NotFoundError);function NotFoundError(e){var r;return m.default(this,NotFoundError),(r=t.call(this,"Document with '".concat(e,"' url not found"))).url=e,r}return NotFoundError}(u.Error);function N(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=j.default(e);if(t){var u=j.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return y.default(this,r)}}var U=function(e){h.default(UnauthorizedError,e);var t=N(UnauthorizedError);function UnauthorizedError(e,r){var n;return m.default(this,UnauthorizedError),(n=t.call(this,function(e,t){return"Unauthorized".concat(403===t?" (Forbidden)":"",": ").concat(e)}(e,r))).url=e,n.responseStatus=r,n}return x.default(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(u.Error),C={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 B(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=q.default(r,2),u=n[0],o=n[1];if(o){var a,s,i,c=null!==(a=null!==(s=C[u])&&void 0!==s?s:null===(i=t.extraContext)||void 0===i?void 0:i[u])&&void 0!==a?a:null;if(!c)throw new Error("Can't expand IRI with unknown prefix: '".concat(e,"'"));return c+o}if(!t.defaultPrefix)throw new Error("Can't expand IRI without a default prefix: '".concat(e,"'"));return t.defaultPrefix+u}var O=function(){function e(t,r){m.default(this,e),this.url=t,this.quads=r}return x.default(e,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===B(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===B(e)})).map((function(e){return e.object.value}))}}]),e}(),z=function(){function e(t,r,n){m.default(this,e),this.url=t,this.quads=r,this.headers=n}return x.default(e,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,B("rdfs:type"),B("foaf:PersonalProfileDocument"))}},{key:"isStorage",value:function(){var e;return!(null===(e=this.headers.get("Link"))||void 0===e||!e.match(/<http:\/\/www\.w3\.org\/ns\/pim\/space#Storage>;[^,]+rel="type"/))}},{key:"getLastModified",value:function(){var e,t,r,n;return null!==(e=null!==(t=null!==(r=u.parseDate(this.headers.get("last-modified")))&&void 0!==r?r:u.parseDate(null===(n=this.statement(this.url,"purl:modified"))||void 0===n?void 0:n.object.value))&&void 0!==t?t:this.getLatestDocumentDate())&&void 0!==e?e:null}},{key:"statements",value:function(e,t,r){var n=this;return this.quads.filter((function(u){return!(r&&u.object.value!==B(r,{defaultPrefix:n.url})||e&&u.subject.value!==B(e,{defaultPrefix:n.url})||t&&u.predicate.value!==B(t,{defaultPrefix:n.url}))}))}},{key:"statement",value:function(e,t,r){var n=this,u=this.quads.find((function(u){return!(r&&u.object.value!==B(r,{defaultPrefix:n.url})||e&&u.subject.value!==B(e,{defaultPrefix:n.url})||t&&u.predicate.value!==B(t,{defaultPrefix:n.url}))}));return null!=u?u:null}},{key:"contains",value:function(e,t,r){return null!==this.statement(e,t,r)}},{key:"getThing",value:function(e){var t=this.statements(e);return new O(e,t)}},{key:"getLatestDocumentDate",value:function(){var e=[].concat(g.default(this.statements(void 0,"purl:modified")),g.default(this.statements(void 0,"purl:created"))).map((function(e){return u.parseDate(e.object.value)})).filter((function(e){return null!==e}));return e.length>0?e.reduce((function(e,t){return e>t?e:t})):null}}]),e}();function M(e,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 F(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 F(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,u=function(){};return{s:u,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw o}}}}function F(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 L(e,t){return Q.apply(this,arguments)}function Q(){return(Q=b.default(w.default.mark((function e(t,r){var n,u,o;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={headers:{Accept:"text/turtle"}},e.prev=1,e.next=4,r(t,n);case 4:if(404!==(u=e.sent).status){e.next=7;break}throw new A(t);case 7:if(![401,403].includes(u.status)){e.next=9;break}throw new U(t,u.status);case 9:return e.next=11,u.text();case 11:return o=e.sent,e.abrupt("return",{body:o,headers:u.headers});case 15:if(e.prev=15,e.t0=e.catch(1),!(e.t0 instanceof U)){e.next=19;break}throw e.t0;case 19:throw new P(t);case 20:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function W(e){var t,r=e.slice(0),n={},o=u.arr(e).flatMap((function(e,t){var r,o=u.arrayFilter(["BlankNode"===e.object.termType?e.object.value:null,"BlankNode"===e.subject.termType?e.subject.value:null]),a=M(o);try{for(a.s();!(r=a.n()).done;){var s,i=r.value;n[i]=null!==(s=n[i])&&void 0!==s?s:new Set,n[i].add(t)}}catch(e){a.e(e)}finally{a.f()}return o})).filter().unique(),a=M(o);try{var s=function(){var o,a=t.value,s=k.default(u.arr(n[a]).map((function(t){return e[t]})).filter((function(e){var t=e.subject,r=t.termType,n=t.value;return"BlankNode"===r&&n===a})).map((function(e){var t=e.predicate,r=e.object;return"BlankNode"===r.termType?t.value:t.value+r.value})).sorted().join()),i=M(n[a]);try{for(i.s();!(o=i.n()).done;){for(var c=o.value,f=r[c],d={subject:f.subject,object:f.object},p=0,v=Object.entries(d);p<v.length;p++){var m=q.default(v[p],2),h=m[0],y=m[1];"BlankNode"===y.termType&&y.value===a&&(d[h]=new l.BlankNode(s))}u.arrayReplace(r,f,new l.Quad(d.subject,f.predicate,d.object))}}catch(e){i.e(e)}finally{i.f()}};for(a.s();!(t=a.n()).done;)s()}catch(e){a.e(e)}finally{a.f()}return r}function $(e,t,r){return H.apply(this,arguments)}function H(){return(H=b.default(w.default.mark((function e(t,r,n){var u,o;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(u=n)&&void 0!==u?u:window.fetch,e.next=3,ee(r);case 3:return o=e.sent,e.next=6,n(t,{method:"PUT",headers:{"Content-Type":"text/turtle"},body:r});case 6:return e.abrupt("return",new z(t,o,new Headers({})));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function _(e,t){return J.apply(this,arguments)}function J(){return(J=b.default(w.default.mark((function e(t,r){var n,u,o,a;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,L(t,null!=r?r:window.fetch);case 2:return n=e.sent,u=n.body,o=n.headers,e.next=7,ee(u,{documentUrl:t});case 7:return a=e.sent,e.abrupt("return",new z(t,a,o));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function G(e){var t=Z(e);return Object.entries(t).reduce((function(e,t){var r=q.default(t,2),n=r[0],u=r[1].map((function(e){return" "+X(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(u,"\n}"))}),[]).join(" ;\n")}function X(e){return(new l.Writer).quadsToString([e]).slice(0,-1)}function K(e,t){return V.apply(this,arguments)}function V(){return(V=b.default(w.default.mark((function e(t,r){var n;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,_(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 Y(){return(Y=b.default(w.default.mark((function e(t){var r,n,u,o=arguments;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=o.length>1&&void 0!==o[1]?o[1]:{},n=t.matchAll(/(\w+) DATA {([^}]+)}/g),u={},e.next=5,Promise.all(g.default(n).map(function(){var e=b.default(w.default.mark((function e(t){var n,o;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),o=t[2],e.next=4,ee(o,r);case 4:u[n]=e.sent;case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 5:return e.abrupt("return",u);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Z(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.matchAll(/(\w+) DATA {([^}]+)}/g),u={},o=M(n);try{for(o.s();!(t=o.n()).done;){var a=t.value,s=a[1].toLowerCase(),i=a[2];u[s]=re(i,r)}}catch(e){o.e(e)}finally{o.f()}return u}function ee(e){return te.apply(this,arguments)}function te(){return(te=b.default(w.default.mark((function e(t){var r,n,o,a,s=arguments;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>1&&void 0!==s[1]?s[1]:{},n=u.objectWithoutEmpty({baseIRI:r.documentUrl}),o=new l.Parser(n),a=[],e.abrupt("return",new Promise((function(e,n){o.parse(t,(function(t,u){var o;t?n(new S(null!==(o=r.documentUrl)&&void 0!==o?o:null,exports.SolidDocumentFormat.Turtle,t.message)):u?a.push(u):r.normalizeBlankNodes?e(W(a)):e(a)}))})));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function re(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=u.objectWithoutEmpty({baseIRI:t.documentUrl}),n=new l.Parser(r);try{var o=n.parse(e);return t.normalizeBlankNodes?W(o):o}catch(e){var a;throw new S(null!==(a=t.documentUrl)&&void 0!==a?a:null,exports.SolidDocumentFormat.Turtle,e.message)}}function ne(e,t,r){return ue.apply(this,arguments)}function ue(){return(ue=b.default(w.default.mark((function e(t,r,n){var u;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(u=n)&&void 0!==u?u:window.fetch,e.next=3,n(t,{method:"PATCH",headers:{"Content-Type":"application/sparql-update"},body:r});case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function oe(e,t){return ae.apply(this,arguments)}function ae(){return(ae=b.default(w.default.mark((function e(t,r){var n,o,a,s,i,c,l,f,d,p,v,m,h,y;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return f=u.urlRoute(t),e.next=3,_(f,r);case 3:if((d=e.sent).isPersonalProfile()){e.next=6;break}throw new Error("Document at ".concat(f," is not a profile."));case 6:p=d.statements(t,"pim:storage").map((function(e){return e.object.value})),v=d.statement(t,"solid:publicTypeIndex"),m=d.statement(t,"solid:privateTypeIndex"),h=u.urlParentDirectory(f);case 10:if(!h||0!==p.length){e.next=20;break}return e.next=13,u.silenced(_(h,r));case 13:if(null==(y=e.sent)||!y.isStorage()){e.next=17;break}return p.push(h),e.abrupt("break",20);case 17:h=u.urlParentDirectory(h),e.next=10;break;case 20:return e.abrupt("return",u.objectWithoutEmpty({webId:t,storageUrls:p,name:null!==(n=null===(o=d.statement(t,"vcard:fn"))||void 0===o?void 0:o.object.value)&&void 0!==n?n:null===(a=d.statement(t,"foaf:name"))||void 0===a?void 0:a.object.value,avatarUrl:null!==(s=null===(i=d.statement(t,"vcard:hasPhoto"))||void 0===i?void 0:i.object.value)&&void 0!==s?s:null===(c=d.statement(t,"foaf:img"))||void 0===c?void 0:c.object.value,oidcIssuerUrl:null===(l=d.statement(t,"solid:oidcIssuer"))||void 0===l?void 0:l.object.value,publicTypeIndexUrl:null==v?void 0:v.object.value,privateTypeIndexUrl:null==m?void 0:m.object.value}));case 21:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function se(){return(se=b.default(w.default.mark((function e(t,r){var n,o,a;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=u.silenced((function(e){return oe(e,r)})),e.next=3,a(t);case 3:if(e.t2=o=e.sent,e.t1=null!==e.t2,!e.t1){e.next=7;break}e.t1=void 0!==o;case 7:if(!e.t1){e.next=11;break}e.t3=o,e.next=14;break;case 11:return e.next=13,a(t.replace(/\/$/,"").concat("/profile/card#me"));case 13:e.t3=e.sent;case 14:if(e.t4=n=e.t3,e.t0=null!==e.t4,!e.t0){e.next=18;break}e.t0=void 0!==n;case 18:if(!e.t0){e.next=22;break}e.t5=n,e.next=25;break;case 22:return e.next=24,a(u.urlRoot(t).concat("/profile/card#me"));case 24:e.t5=e.sent;case 25:return e.abrupt("return",e.t5);case 26:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ie(e,t){return ce.apply(this,arguments)}function ce(){return(ce=b.default(w.default.mark((function e(t,r){var n,o,a;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,o=t.storageUrls[0],a="".concat(o,"settings/privateTypeIndex"),e.next=5,K(a,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(o,"settings/privateTypeIndex-").concat(u.uuid()),e.next=10;break;case 9:e.t0=a;case 10:return e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function le(){return(le=b.default(w.default.mark((function e(t,r){var n,u,o;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,e.next=3,ie(t,r);case 3:return u=e.sent,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",o="\n INSERT DATA {\n <".concat(t.webId,"> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <").concat(u,"> .\n }\n "),$(u,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",r),ne(t.webId,o,r),e.abrupt("return",u);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function fe(){return(fe=b.default(w.default.mark((function e(t,r,n){var u,o,a;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,_(t,n);case 2:return o=e.sent,a=o.statements(void 0,"rdfs:type","solid:TypeRegistration").find((function(e){return o.contains(e.subject.value,"solid:forClass",r)&&o.contains(e.subject.value,"solid:instanceContainer")})),e.abrupt("return",a&&null!==(u=o.getThing(a.subject.value))&&void 0!==u?u:null);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function de(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 pe(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 pe(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,u=function(){};return{s:u,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw o}}}}function pe(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var ve={};function me(e){return/\[\[([^\]]+)\]\]/.test(e)}function he(e,t){if(!me(e))return e===t;if(!(e in ve)){var r,n=e.matchAll(/\[\[([^\]]+)\]\]/g),u=[],o=e,a=de(n);try{for(a.s();!(r=a.n()).done;){var s=r.value;u.push(s[1]),o=o.replace(s[0],"%PATTERN".concat(u.length-1,"%"))}}catch(e){a.e(e)}finally{a.f()}o=o.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");for(var i=0,c=Object.entries(u);i<c.length;i++){var l=q.default(c[i],2),f=l[0],d=l[1];o=o.replace("%PATTERN".concat(f,"%"),d)}ve[e]=new RegExp(o)}return ve[e].test(t)}function ye(e,t){return function(e,t){if(e.termType!==t.termType)return!1;if("Literal"===e.termType&&"Literal"===t.termType){if(e.datatype.value!==t.datatype.value)return!1;if(!me(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 he(e.value,t.value)}(e.object,t.object)&&he(e.subject.value,t.subject.value)&&he(e.predicate.value,t.predicate.value)}function je(e,t){for(var r,n=Z(e,{normalizeBlankNodes:!0}),o=Z(t,{normalizeBlankNodes:!0}),a=function(r,n){return{success:r,message:n,expected:e,actual:t}},s=0,i=Object.keys(n);s<i.length;s++){var c=i[s];if(!(c in o))return a(!1,"Couldn't find expected ".concat(c," operation."));var l=u.pull(n,c),f=u.pull(o,c);if(l.length!==f.length)return a(!1,"Expected ".concat(l.length," ").concat(c," triples, found ").concat(f.length,"."));var d,p=de(l);try{var v=function(){var e=d.value;if(!f.some((function(t){return ye(e,t)})))return{v:a(!1,"Couldn't find the following ".concat(c," triple: ").concat(X(e)))}};for(p.s();!(d=p.n()).done;){var m=v();if("object"===E.default(m))return m.v}}catch(e){p.e(e)}finally{p.f()}}var h=null!==(r=Object.keys(o)[0])&&void 0!==r?r:null;return h?a(!1,"Did not expect to find ".concat(h," triples.")):a(!0,"sparql matches")}var xe={sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=e,u=je(n,t);r(u.success,u.message,n,t)}};var be={toEqualSparql:function(e,t){var r=this,n=je(t,e),u=n.success,o=G(e),a=G(t);return{pass:u,message:u?function(){return[n.message,r.utils.matcherHint("toEqualSparql"),["Expected: not ".concat(r.utils.printExpected(a)),"Received: ".concat(r.utils.printReceived(o))].join("\n")].join("\n\n")}:function(){var e=T.default(a,o,{expand:r.expand});return[n.message,r.utils.matcherHint("toEqualJsonLD"),e&&e.includes("- Expect")?"Difference:\n\n".concat(e):["Expected: ".concat(r.utils.printExpected(a)),"Received: ".concat(r.utils.printReceived(o))].join("\n")].join("\n\n")}}}};exports.MalformedSolidDocumentError=S,exports.NetworkRequestError=P,exports.NotFoundError=A,exports.SolidDocument=z,exports.SolidThing=O,exports.UnauthorizedError=U,exports.createPrivateTypeIndex=function(e,t){return le.apply(this,arguments)},exports.createSolidDocument=$,exports.defineIRIPrefix=function(e,t){C[e]=t},exports.expandIRI=B,exports.fetchLoginUserProfile=function(e,t){return se.apply(this,arguments)},exports.fetchSolidDocument=_,exports.findContainerRegistration=function(e,t,r){return fe.apply(this,arguments)},exports.installChaiPlugin=function(){chai.use((function(e){return Object.entries(xe).forEach((function(t){var r=q.default(t,2),n=r[0],u=r[1];return e.Assertion.addMethod(n,u)}))}))},exports.installJestPlugin=function(){expect.extend(be)},exports.normalizeSparql=G,exports.quadToTurtle=X,exports.solidDocumentExists=K,exports.sparqlEquals=je,exports.sparqlToQuads=function(e){return Y.apply(this,arguments)},exports.sparqlToQuadsSync=Z,exports.turtleEquals=function(e,t){var r=re(e,{normalizeBlankNodes:!0}),n=re(t,{normalizeBlankNodes:!0}),u=function(r,n){return{success:r,message:n,expected:e,actual:t}};if(r.length!==n.length)return u(!1,"Expected ".concat(r.length," triples, found ").concat(n.length,"."));var o,a=de(r);try{var s=function(){var e=o.value;if(!n.some((function(t){return ye(e,t)})))return{v:u(!1,"Couldn't find the following triple: ".concat(X(e)))}};for(a.s();!(o=a.n()).done;){var i=s();if("object"===E.default(i))return i.v}}catch(e){a.e(e)}finally{a.f()}return u(!0,"turtle matches")},exports.turtleToQuads=ee,exports.turtleToQuadsSync=re,exports.updateSolidDocument=ne;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("core-js/modules/es.reflect.construct.js");var e=require("@babel/runtime/helpers/classCallCheck"),t=require("@babel/runtime/helpers/inherits"),r=require("@babel/runtime/helpers/possibleConstructorReturn"),n=require("@babel/runtime/helpers/getPrototypeOf");require("core-js/modules/es.array.concat.js");var u=require("@noeldemartin/utils"),o=require("@babel/runtime/helpers/createClass"),a=require("@babel/runtime/helpers/asyncToGenerator"),s=require("@babel/runtime/regenerator");require("core-js/modules/es.array.map.js"),require("core-js/modules/es.regexp.exec.js"),require("core-js/modules/es.string.replace.js"),require("core-js/modules/es.function.name.js"),require("core-js/modules/es.array.from.js"),require("core-js/modules/es.symbol.js"),require("core-js/modules/es.symbol.description.js"),require("core-js/modules/es.symbol.iterator.js");var i=require("@babel/runtime/helpers/toConsumableArray"),c=require("@babel/runtime/helpers/slicedToArray");require("core-js/modules/es.array.slice.js"),require("core-js/modules/es.array.filter.js"),require("core-js/modules/es.array.flat-map.js"),require("core-js/modules/es.array.unscopables.flat-map.js"),require("core-js/modules/es.array.iterator.js"),require("core-js/modules/es.object.to-string.js"),require("core-js/modules/es.set.js"),require("core-js/modules/es.string.iterator.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js"),require("core-js/modules/web.dom-collections.iterator.js"),require("core-js/modules/es.array.join.js"),require("core-js/modules/es.object.entries.js"),require("core-js/modules/es.string.match-all.js"),require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.promise.js"),require("core-js/modules/es.array.flat.js");var l=require("n3"),f=require("jsonld"),d=require("md5");require("core-js/modules/es.string.match.js"),require("core-js/modules/es.array.find.js"),require("core-js/modules/es.string.starts-with.js"),require("core-js/modules/es.string.split.js");var p=require("@babel/runtime/helpers/typeof");function v(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("core-js/modules/es.regexp.constructor.js"),require("core-js/modules/es.regexp.to-string.js"),require("core-js/modules/es.object.keys.js"),require("core-js/modules/web.dom-collections.for-each.js");var m=v(e),h=v(t),y=v(r),x=v(n),j=v(o),b=v(a),w=v(s),g=v(i),q=v(c),k=v(d),T=v(p);function E(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=x.default(e);if(t){var u=x.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return y.default(this,r)}}exports.SolidDocumentFormat=void 0,(exports.SolidDocumentFormat||(exports.SolidDocumentFormat={})).Turtle="Turtle";var R=function(e){h.default(MalformedSolidDocumentError,e);var t=E(MalformedSolidDocumentError);function MalformedSolidDocumentError(e,r,n){var u;return m.default(this,MalformedSolidDocumentError),(u=t.call(this,function(e,t,r){return e?"Malformed ".concat(t," document found at ").concat(e," - ").concat(r):"Malformed ".concat(t," document - ").concat(r)}(e,r,n))).documentUrl=e,u.documentFormat=r,u.malformationDetails=n,u}return MalformedSolidDocumentError}(u.Error);function D(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=x.default(e);if(t){var u=x.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return y.default(this,r)}}var S=function(e){h.default(NetworkRequestError,e);var t=D(NetworkRequestError);function NetworkRequestError(e){var r;return m.default(this,NetworkRequestError),(r=t.call(this,"Request failed trying to fetch ".concat(e))).url=e,r}return NetworkRequestError}(u.Error);function P(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=x.default(e);if(t){var u=x.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return y.default(this,r)}}var I=function(e){h.default(NotFoundError,e);var t=P(NotFoundError);function NotFoundError(e){var r;return m.default(this,NotFoundError),(r=t.call(this,"Document with '".concat(e,"' url not found"))).url=e,r}return NotFoundError}(u.Error);function A(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=x.default(e);if(t){var u=x.default(this).constructor;r=Reflect.construct(n,arguments,u)}else r=n.apply(this,arguments);return y.default(this,r)}}var N=function(e){h.default(UnauthorizedError,e);var t=A(UnauthorizedError);function UnauthorizedError(e,r){var n;return m.default(this,UnauthorizedError),(n=t.call(this,function(e,t){return"Unauthorized".concat(403===t?" (Forbidden)":"",": ").concat(e)}(e,r))).url=e,n.responseStatus=r,n}return j.default(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(u.Error),U={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 C(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=q.default(r,2),u=n[0],o=n[1];if(o){var a,s,i,c=null!==(a=null!==(s=U[u])&&void 0!==s?s:null===(i=t.extraContext)||void 0===i?void 0:i[u])&&void 0!==a?a:null;if(!c)throw new Error("Can't expand IRI with unknown prefix: '".concat(e,"'"));return c+o}if(!t.defaultPrefix)throw new Error("Can't expand IRI without a default prefix: '".concat(e,"'"));return t.defaultPrefix+u}var B=function(){function e(t,r){m.default(this,e),this.url=t,this.quads=r}return j.default(e,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===C(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===C(e)})).map((function(e){return e.object.value}))}}]),e}(),O=function(){function e(t,r,n){m.default(this,e),this.url=t,this.quads=r,this.headers=n}return j.default(e,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,C("rdfs:type"),C("foaf:PersonalProfileDocument"))}},{key:"isStorage",value:function(){var e;return!(null===(e=this.headers.get("Link"))||void 0===e||!e.match(/<http:\/\/www\.w3\.org\/ns\/pim\/space#Storage>;[^,]+rel="type"/))}},{key:"getLastModified",value:function(){var e,t,r,n;return null!==(e=null!==(t=null!==(r=u.parseDate(this.headers.get("last-modified")))&&void 0!==r?r:u.parseDate(null===(n=this.statement(this.url,"purl:modified"))||void 0===n?void 0:n.object.value))&&void 0!==t?t:this.getLatestDocumentDate())&&void 0!==e?e:null}},{key:"statements",value:function(e,t,r){var n=this;return this.quads.filter((function(u){return!(r&&u.object.value!==C(r,{defaultPrefix:n.url})||e&&u.subject.value!==C(e,{defaultPrefix:n.url})||t&&u.predicate.value!==C(t,{defaultPrefix:n.url}))}))}},{key:"statement",value:function(e,t,r){var n=this,u=this.quads.find((function(u){return!(r&&u.object.value!==C(r,{defaultPrefix:n.url})||e&&u.subject.value!==C(e,{defaultPrefix:n.url})||t&&u.predicate.value!==C(t,{defaultPrefix:n.url}))}));return null!=u?u:null}},{key:"contains",value:function(e,t,r){return null!==this.statement(e,t,r)}},{key:"getThing",value:function(e){var t=this.statements(e);return new B(e,t)}},{key:"getLatestDocumentDate",value:function(){var e=[].concat(g.default(this.statements(void 0,"purl:modified")),g.default(this.statements(void 0,"purl:created"))).map((function(e){return u.parseDate(e.object.value)})).filter((function(e){return null!==e}));return e.length>0?e.reduce((function(e,t){return e>t?e:t})):null}}]),e}();function z(e){return"@graph"in e}function F(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 M(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 M(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,u=function(){};return{s:u,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw o}}}}function M(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 L(e,t){return Q.apply(this,arguments)}function Q(){return(Q=b.default(w.default.mark((function e(t,r){var n,u,o;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={headers:{Accept:"text/turtle"}},e.prev=1,e.next=4,r(t,n);case 4:if(404!==(u=e.sent).status){e.next=7;break}throw new I(t);case 7:if(![401,403].includes(u.status)){e.next=9;break}throw new N(t,u.status);case 9:return e.next=11,u.text();case 11:return o=e.sent,e.abrupt("return",{body:o,headers:u.headers});case 15:if(e.prev=15,e.t0=e.catch(1),!(e.t0 instanceof N)){e.next=19;break}throw e.t0;case 19:throw new S(t);case 20:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function W(e){var t,r=e.slice(0),n={},o=u.arr(e).flatMap((function(e,t){var r,o=u.arrayFilter(["BlankNode"===e.object.termType?e.object.value:null,"BlankNode"===e.subject.termType?e.subject.value:null]),a=F(o);try{for(a.s();!(r=a.n()).done;){var s,i=r.value;n[i]=null!==(s=n[i])&&void 0!==s?s:new Set,n[i].add(t)}}catch(e){a.e(e)}finally{a.f()}return o})).filter().unique(),a=F(o);try{var s=function(){var o,a=t.value,s=k.default(u.arr(n[a]).map((function(t){return e[t]})).filter((function(e){var t=e.subject,r=t.termType,n=t.value;return"BlankNode"===r&&n===a})).map((function(e){var t=e.predicate,r=e.object;return"BlankNode"===r.termType?t.value:t.value+r.value})).sorted().join()),i=F(n[a]);try{for(i.s();!(o=i.n()).done;){for(var c=o.value,f=r[c],d={subject:f.subject,object:f.object},p=0,v=Object.entries(d);p<v.length;p++){var m=q.default(v[p],2),h=m[0],y=m[1];"BlankNode"===y.termType&&y.value===a&&(d[h]=new l.BlankNode(s))}u.arrayReplace(r,f,new l.Quad(d.subject,f.predicate,d.object))}}catch(e){i.e(e)}finally{i.f()}};for(a.s();!(t=a.n()).done;)s()}catch(e){a.e(e)}finally{a.f()}return r}function $(e,t,r){return H.apply(this,arguments)}function H(){return(H=b.default(w.default.mark((function e(t,r,n){var u,o;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(u=n)&&void 0!==u?u:window.fetch,e.next=3,ne(r);case 3:return o=e.sent,e.next=6,n(t,{method:"PUT",headers:{"Content-Type":"text/turtle"},body:r});case 6:return e.abrupt("return",new O(t,o,new Headers({})));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function J(e,t){return _.apply(this,arguments)}function _(){return(_=b.default(w.default.mark((function e(t,r){var n,u,o,a;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,L(t,null!=r?r:window.fetch);case 2:return n=e.sent,u=n.body,o=n.headers,e.next=7,ne(u,{documentUrl:t});case 7:return a=e.sent,e.abrupt("return",new O(t,a,o));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function G(e){return X.apply(this,arguments)}function X(){return(X=b.default(w.default.mark((function e(t){var r;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!z(t)){e.next=5;break}return e.next=3,Promise.all(t["@graph"].map(G));case 3:return r=e.sent,e.abrupt("return",r.flat());case 5:return e.abrupt("return",f.toRDF(t));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function K(e){var t=re(e);return Object.entries(t).reduce((function(e,t){var r=q.default(t,2),n=r[0],u=r[1].map((function(e){return" "+Y(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(u,"\n}"))}),[]).join(" ;\n")}function V(e){return(new l.Writer).quadsToString(e)}function Y(e){return(new l.Writer).quadsToString([e]).slice(0,-1)}function Z(e,t){return ee.apply(this,arguments)}function ee(){return(ee=b.default(w.default.mark((function e(t,r){var n;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,J(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 te(){return(te=b.default(w.default.mark((function e(t){var r,n,u,o=arguments;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=o.length>1&&void 0!==o[1]?o[1]:{},n=t.matchAll(/(\w+) DATA {([^}]+)}/g),u={},e.next=5,Promise.all(g.default(n).map(function(){var e=b.default(w.default.mark((function e(t){var n,o;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),o=t[2],e.next=4,ne(o,r);case 4:u[n]=e.sent;case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 5:return e.abrupt("return",u);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function re(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.matchAll(/(\w+) DATA {([^}]+)}/g),u={},o=F(n);try{for(o.s();!(t=o.n()).done;){var a=t.value,s=a[1].toLowerCase(),i=a[2];u[s]=oe(i,r)}}catch(e){o.e(e)}finally{o.f()}return u}function ne(e){return ue.apply(this,arguments)}function ue(){return(ue=b.default(w.default.mark((function e(t){var r,n,o,a,s=arguments;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>1&&void 0!==s[1]?s[1]:{},n=u.objectWithoutEmpty({baseIRI:r.documentUrl}),o=new l.Parser(n),a=[],e.abrupt("return",new Promise((function(e,n){o.parse(t,(function(t,u){var o;t?n(new R(null!==(o=r.documentUrl)&&void 0!==o?o:null,exports.SolidDocumentFormat.Turtle,t.message)):u?a.push(u):r.normalizeBlankNodes?e(W(a)):e(a)}))})));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function oe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=u.objectWithoutEmpty({baseIRI:t.documentUrl}),n=new l.Parser(r);try{var o=n.parse(e);return t.normalizeBlankNodes?W(o):o}catch(e){var a;throw new R(null!==(a=t.documentUrl)&&void 0!==a?a:null,exports.SolidDocumentFormat.Turtle,e.message)}}function ae(e,t,r){return se.apply(this,arguments)}function se(){return(se=b.default(w.default.mark((function e(t,r,n){var u;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(u=n)&&void 0!==u?u:window.fetch,e.next=3,n(t,{method:"PATCH",headers:{"Content-Type":"application/sparql-update"},body:r});case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ie(e,t){return ce.apply(this,arguments)}function ce(){return(ce=b.default(w.default.mark((function e(t,r){var n,o,a,s,i,c,l,f,d,p,v,m,h,y;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return f=u.urlRoute(t),e.next=3,J(f,r);case 3:if((d=e.sent).isPersonalProfile()){e.next=6;break}throw new Error("Document at ".concat(f," is not a profile."));case 6:p=d.statements(t,"pim:storage").map((function(e){return e.object.value})),v=d.statement(t,"solid:publicTypeIndex"),m=d.statement(t,"solid:privateTypeIndex"),h=u.urlParentDirectory(f);case 10:if(!h||0!==p.length){e.next=20;break}return e.next=13,u.silenced(J(h,r));case 13:if(null==(y=e.sent)||!y.isStorage()){e.next=17;break}return p.push(h),e.abrupt("break",20);case 17:h=u.urlParentDirectory(h),e.next=10;break;case 20:return e.abrupt("return",u.objectWithoutEmpty({webId:t,storageUrls:p,name:null!==(n=null===(o=d.statement(t,"vcard:fn"))||void 0===o?void 0:o.object.value)&&void 0!==n?n:null===(a=d.statement(t,"foaf:name"))||void 0===a?void 0:a.object.value,avatarUrl:null!==(s=null===(i=d.statement(t,"vcard:hasPhoto"))||void 0===i?void 0:i.object.value)&&void 0!==s?s:null===(c=d.statement(t,"foaf:img"))||void 0===c?void 0:c.object.value,oidcIssuerUrl:null===(l=d.statement(t,"solid:oidcIssuer"))||void 0===l?void 0:l.object.value,publicTypeIndexUrl:null==v?void 0:v.object.value,privateTypeIndexUrl:null==m?void 0:m.object.value}));case 21:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function le(){return(le=b.default(w.default.mark((function e(t,r){var n,o,a;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=u.silenced((function(e){return ie(e,r)})),e.next=3,a(t);case 3:if(e.t2=o=e.sent,e.t1=null!==e.t2,!e.t1){e.next=7;break}e.t1=void 0!==o;case 7:if(!e.t1){e.next=11;break}e.t3=o,e.next=14;break;case 11:return e.next=13,a(t.replace(/\/$/,"").concat("/profile/card#me"));case 13:e.t3=e.sent;case 14:if(e.t4=n=e.t3,e.t0=null!==e.t4,!e.t0){e.next=18;break}e.t0=void 0!==n;case 18:if(!e.t0){e.next=22;break}e.t5=n,e.next=25;break;case 22:return e.next=24,a(u.urlRoot(t).concat("/profile/card#me"));case 24:e.t5=e.sent;case 25:return e.abrupt("return",e.t5);case 26:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function fe(e,t){return de.apply(this,arguments)}function de(){return(de=b.default(w.default.mark((function e(t,r){var n,o,a;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,o=t.storageUrls[0],a="".concat(o,"settings/privateTypeIndex"),e.next=5,Z(a,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(o,"settings/privateTypeIndex-").concat(u.uuid()),e.next=10;break;case 9:e.t0=a;case 10:return e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function pe(){return(pe=b.default(w.default.mark((function e(t,r){var n,u,o;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,e.next=3,fe(t,r);case 3:return u=e.sent,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",o="\n INSERT DATA {\n <".concat(t.webId,"> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <").concat(u,"> .\n }\n "),$(u,"\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,o,r),e.abrupt("return",u);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ve(){return(ve=b.default(w.default.mark((function e(t,r,n){var u,o,a;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,J(t,n);case 2:return o=e.sent,a=o.statements(void 0,"rdfs:type","solid:TypeRegistration").find((function(e){return o.contains(e.subject.value,"solid:forClass",r)&&o.contains(e.subject.value,"solid:instanceContainer")})),e.abrupt("return",a&&null!==(u=o.getThing(a.subject.value))&&void 0!==u?u:null);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function me(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 he(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 he(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,u=function(){};return{s:u,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw o}}}}function he(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var ye={};function xe(e){return/\[\[(.*\]\[)?([^\]]+)\]\]/.test(e)}function je(e,t){if(!xe(e))return e===t;var r=[];if(!(e in ye)){var n,u=e.matchAll(/\[\[((.*)\]\[)?([^\]]+)\]\]/g),o=[],a=e,s=me(u);try{for(s.s();!(n=s.n()).done;){var i=n.value;i[2]&&r.push(i[2]),o.push(i[3]),a=a.replace(i[0],"%PATTERN".concat(o.length-1,"%"))}}catch(e){s.e(e)}finally{s.f()}a=a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");for(var c=0,l=Object.entries(o);c<l.length;c++){var f=q.default(l[c],2),d=f[0],p=f[1];a=a.replace("%PATTERN".concat(d,"%"),p)}ye[e]=new RegExp(a)}return ye[e].test(t)}function be(e,t){return function(e,t){if(e.termType!==t.termType)return!1;if("Literal"===e.termType&&"Literal"===t.termType){if(e.datatype.value!==t.datatype.value)return!1;if(!xe(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 je(e.value,t.value)}(e.object,t.object)&&je(e.subject.value,t.subject.value)&&je(e.predicate.value,t.predicate.value)}function we(){ye={}}function ge(e,t){return qe.apply(this,arguments)}function qe(){return(qe=b.default(w.default.mark((function e(t,r){var n,u,o,a,s,i,c,l,f;return w.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return we(),e.next=3,G(t);case 3:return n=e.sent,e.next=6,G(r);case 6:if(u=e.sent,o=V(n),a=V(u),s=function(e,t){return{success:e,message:t,expected:o,actual:a}},n.length===u.length){e.next=12;break}return e.abrupt("return",s(!1,"Expected ".concat(n.length," triples, found ").concat(u.length,".")));case 12:i=me(n),e.prev=13,l=function(){var e=c.value;if(!u.some((function(t){return be(e,t)})))return{v:s(!1,"Couldn't find the following triple: ".concat(Y(e)))}},i.s();case 16:if((c=i.n()).done){e.next=22;break}if(f=l(),"object"!==T.default(f)){e.next=20;break}return e.abrupt("return",f.v);case 20:e.next=16;break;case 22:e.next=27;break;case 24:e.prev=24,e.t0=e.catch(13),i.e(e.t0);case 27:return e.prev=27,i.f(),e.finish(27);case 30:return e.abrupt("return",s(!0,"jsonld matches"));case 31:case"end":return e.stop()}}),e,null,[[13,24,27,30]])})))).apply(this,arguments)}function ke(e,t){var r;we();for(var n=re(e,{normalizeBlankNodes:!0}),o=re(t,{normalizeBlankNodes:!0}),a=function(r,n){return{success:r,message:n,expected:e,actual:t}},s=0,i=Object.keys(n);s<i.length;s++){var c=i[s];if(!(c in o))return a(!1,"Couldn't find expected ".concat(c," operation."));var l=u.pull(n,c),f=u.pull(o,c);if(l.length!==f.length)return a(!1,"Expected ".concat(l.length," ").concat(c," triples, found ").concat(f.length,"."));var d,p=me(l);try{var v=function(){var e=d.value;if(!f.some((function(t){return be(e,t)})))return{v:a(!1,"Couldn't find the following ".concat(c," triple: ").concat(Y(e)))}};for(p.s();!(d=p.n()).done;){var m=v();if("object"===T.default(m))return m.v}}catch(e){p.e(e)}finally{p.f()}}var h=null!==(r=Object.keys(o)[0])&&void 0!==r?r:null;return h?a(!1,"Did not expect to find ".concat(h," triples.")):a(!0,"sparql matches")}function Te(e,t){we();var r=oe(e,{normalizeBlankNodes:!0}),n=oe(t,{normalizeBlankNodes:!0}),u=function(r,n){return{success:r,message:n,expected:e,actual:t}};if(r.length!==n.length)return u(!1,"Expected ".concat(r.length," triples, found ").concat(n.length,"."));var o,a=me(r);try{var s=function(){var e=o.value;if(!n.some((function(t){return be(e,t)})))return{v:u(!1,"Couldn't find the following triple: ".concat(Y(e)))}};for(a.s();!(o=a.n()).done;){var i=s();if("object"===T.default(i))return i.v}}catch(e){a.e(e)}finally{a.f()}return u(!0,"turtle matches")}var Ee={turtle:function(e){var t=this._obj,r=this.assert.bind(this),n=Te(e,t);r(n.success,n.message,"",n.expected,n.actual)},sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=ke(e,t);r(n.success,n.message,"",n.expected,n.actual)}};function Re(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 De={toEqualJsonLD:function(e,t){var r=this;return b.default(w.default.mark((function n(){var u;return w.default.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,ge(t,e);case 2:return u=n.sent,n.abrupt("return",Re(u,{context:r,hint:"toEqualJsonLD",expected:t,received:e}));case 4:case"end":return n.stop()}}),n)})))()},toEqualSparql:function(e,t){return Re(ke(t,e),{context:this,hint:"toEqualSparql",expected:K(t),received:K(e)})}};exports.MalformedSolidDocumentError=R,exports.NetworkRequestError=S,exports.NotFoundError=I,exports.SolidDocument=O,exports.SolidThing=B,exports.UnauthorizedError=N,exports.createPrivateTypeIndex=function(e,t){return pe.apply(this,arguments)},exports.createSolidDocument=$,exports.defineIRIPrefix=function(e,t){U[e]=t},exports.expandIRI=C,exports.fetchLoginUserProfile=function(e,t){return le.apply(this,arguments)},exports.fetchSolidDocument=J,exports.findContainerRegistration=function(e,t,r){return ve.apply(this,arguments)},exports.installChaiPlugin=function(){chai.use((function(e){return Object.entries(Ee).forEach((function(t){var r=q.default(t,2),n=r[0],u=r[1];return e.Assertion.addMethod(n,u)}))}))},exports.installJestPlugin=function(){expect.extend(De)},exports.isJsonLDGraph=z,exports.jsonldEquals=ge,exports.jsonldToQuads=G,exports.normalizeSparql=K,exports.quadToTurtle=Y,exports.quadsToTurtle=V,exports.solidDocumentExists=Z,exports.sparqlEquals=ke,exports.sparqlToQuads=function(e){return te.apply(this,arguments)},exports.sparqlToQuadsSync=re,exports.turtleEquals=Te,exports.turtleToQuads=ne,exports.turtleToQuadsSync=oe,exports.updateSolidDocument=ae;
|
|
2
2
|
//# sourceMappingURL=noeldemartin-solid-utils.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noeldemartin-solid-utils.cjs.js","sources":["../src/errors/MalformedSolidDocumentError.ts","../src/errors/NetworkRequestError.ts","../src/errors/NotFoundError.ts","../src/errors/UnauthorizedError.ts","../src/helpers/vocabs.ts","../src/models/SolidThing.ts","../src/models/SolidDocument.ts","../src/helpers/io.ts","../src/helpers/auth.ts","../src/helpers/interop.ts","../src/helpers/testing.ts","../src/plugins/chai/assertions.ts","../src/plugins/jest/matchers.ts","../src/plugins/chai/index.ts","../src/plugins/jest/index.ts"],"sourcesContent":["import { Error } from '@noeldemartin/utils';\n\nfunction errorMessage(\n documentUrl: string | null,\n documentFormat: SolidDocumentFormat,\n malformationDetails: string,\n): string {\n return documentUrl\n ? `Malformed ${documentFormat} document found at ${documentUrl} - ${malformationDetails}`\n : `Malformed ${documentFormat} document - ${malformationDetails}`;\n}\n\nexport enum SolidDocumentFormat {\n Turtle = 'Turtle',\n}\n\nexport default class MalformedSolidDocumentError extends Error {\n\n public readonly documentUrl: string | null;\n public readonly documentFormat: SolidDocumentFormat;\n public readonly malformationDetails: string;\n\n constructor(documentUrl: string | null, documentFormat: SolidDocumentFormat, malformationDetails: string) {\n super(errorMessage(documentUrl, documentFormat, malformationDetails));\n\n this.documentUrl = documentUrl;\n this.documentFormat = documentFormat;\n this.malformationDetails = malformationDetails;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Request failed trying to fetch ${url}`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NotFoundError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Document with '${url}' url not found`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nfunction errorMessage(url: string, responseStatus?: number): string {\n const typeInfo = responseStatus === 403 ? ' (Forbidden)' : '';\n\n return `Unauthorized${typeInfo}: ${url}`;\n}\n\nexport default class UnauthorizedError extends Error {\n\n public readonly url: string;\n public readonly responseStatus?: number;\n\n constructor(url: string, responseStatus?: number) {\n super(errorMessage(url, responseStatus));\n\n this.url = url;\n this.responseStatus = responseStatus;\n }\n\n public get forbidden(): boolean | undefined {\n return typeof this.responseStatus !== 'undefined'\n ? this.responseStatus === 403\n : undefined;\n }\n\n}\n","export type RDFContext = Record<string, string>;\n\nexport interface ExpandIRIOptions {\n defaultPrefix: string;\n extraContext: RDFContext;\n}\n\nconst knownPrefixes: RDFContext = {\n foaf: 'http://xmlns.com/foaf/0.1/',\n pim: 'http://www.w3.org/ns/pim/space#',\n purl: 'http://purl.org/dc/terms/',\n rdfs: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\n schema: 'https://schema.org/',\n solid: 'http://www.w3.org/ns/solid/terms#',\n vcard: 'http://www.w3.org/2006/vcard/ns#',\n};\n\nexport function defineIRIPrefix(name: string, value: string): void {\n knownPrefixes[name] = value;\n}\n\nexport function expandIRI(iri: string, options: Partial<ExpandIRIOptions> = {}): string {\n if (iri.startsWith('http'))\n return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix)\n throw new Error(`Can't expand IRI with unknown prefix: '${iri}'`);\n\n return expandedPrefix + name;\n }\n\n if (!options.defaultPrefix)\n throw new Error(`Can't expand IRI without a default prefix: '${iri}'`);\n\n return options.defaultPrefix + prefix;\n}\n","import type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nexport default class SolidThing {\n\n public readonly url: string;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[]) {\n this.url = url;\n this.quads = quads;\n }\n\n public value(property: string): string | undefined {\n return this.quads\n .find(quad => quad.predicate.value === expandIRI(property))\n ?.object.value;\n }\n\n public values(property: string): string[] {\n return this.quads\n .filter(quad => quad.predicate.value === expandIRI(property))\n .map(quad => quad.object.value);\n }\n\n}\n","import { parseDate } from '@noeldemartin/utils';\nimport type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport default class SolidDocument {\n\n public readonly url: string;\n public readonly headers: Headers;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n this.url = url;\n this.quads = quads;\n this.headers = headers;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(\n this.url,\n expandIRI('rdfs:type'),\n expandIRI('foaf:PersonalProfileDocument'),\n );\n }\n\n public isStorage(): boolean {\n return !!this.headers.get('Link')?.match(/<http:\\/\\/www\\.w3\\.org\\/ns\\/pim\\/space#Storage>;[^,]+rel=\"type\"/);\n }\n\n public getLastModified(): Date | null {\n return parseDate(this.headers.get('last-modified'))\n ?? parseDate(this.statement(this.url, 'purl:modified')?.object.value)\n ?? this.getLatestDocumentDate()\n ?? null;\n }\n\n public statements(subject?: string, predicate?: string, object?: string): Quad[] {\n return this.quads.filter(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n }\n\n public statement(subject?: string, predicate?: string, object?: string): Quad | null {\n const statement = this.quads.find(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n\n return statement ?? null;\n }\n\n public contains(subject: string, predicate?: string, object?: string): boolean {\n return this.statement(subject, predicate, object) !== null;\n }\n\n public getThing(subject: string): SolidThing {\n const statements = this.statements(subject);\n\n return new SolidThing(subject, statements);\n }\n\n private getLatestDocumentDate(): Date | null {\n const dates = [\n ...this.statements(undefined, 'purl:modified'),\n ...this.statements(undefined, 'purl:created'),\n ]\n .map(statement => parseDate(statement.object.value))\n .filter((date): date is Date => date !== null);\n\n return dates.length > 0 ? dates.reduce((a, b) => a > b ? a : b) : null;\n }\n\n}\n","import { arr, arrayFilter, arrayReplace,objectWithoutEmpty } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';\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';\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 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 quadToTurtle(quad: Quad): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, fetch?: Fetch): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, fetch);\n\n return !document.isEmpty();\n } catch (error) {\n return false;\n }\n}\n\nexport async function sparqlToQuads(\n sparql: string,\n options: Partial<ParsingOptions> = {},\n): Promise<Record<string, Quad[]>> {\n const operations = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all([...operations].map(async operation => {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = await turtleToQuads(operationBody, options);\n }));\n\n return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n for (const operation of operations) {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = turtleToQuadsSync(operationBody, options);\n }\n\n return quads;\n}\n\nexport async function turtleToQuads(turtle: string, options: Partial<ParsingOptions> = {}): Promise<Quad[]> {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n const quads: Quad[] = [];\n\n return new Promise((resolve, reject) => {\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(\n options.documentUrl ?? null,\n SolidDocumentFormat.Turtle,\n error.message,\n ),\n );\n return;\n }\n\n if (!quad) {\n options.normalizeBlankNodes\n ? resolve(normalizeBlankNodes(quads))\n : resolve(quads);\n\n return;\n }\n\n quads.push(quad);\n });\n });\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes\n ? normalizeBlankNodes(quads)\n : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(options.documentUrl ?? null, SolidDocumentFormat.Turtle, error.message);\n }\n}\n\nexport async function updateSolidDocument(url: string, body: string, fetch?: Fetch): Promise<void> {\n fetch = fetch ?? window.fetch;\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n","import { objectWithoutEmpty, silenced, urlParentDirectory, urlRoot, urlRoute } from '@noeldemartin/utils';\n\nimport { fetchSolidDocument } from './io';\nimport type { Fetch } from './io';\n\nexport interface SolidUserProfile {\n webId: string;\n storageUrls: string[];\n name?: string;\n avatarUrl?: string;\n oidcIssuerUrl?: string;\n publicTypeIndexUrl?: string;\n privateTypeIndexUrl?: string;\n}\n\nasync function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUserProfile> {\n const documentUrl = urlRoute(webId);\n const document = await fetchSolidDocument(documentUrl, fetch);\n\n if (!document.isPersonalProfile())\n throw new Error(`Document at ${documentUrl} is not a profile.`);\n\n const storageUrls = document.statements(webId, 'pim:storage').map(storage => storage.object.value);\n const publicTypeIndex = document.statement(webId, 'solid:publicTypeIndex');\n const privateTypeIndex = document.statement(webId, 'solid:privateTypeIndex');\n\n let parentUrl = urlParentDirectory(documentUrl);\n while (parentUrl && storageUrls.length === 0) {\n const parentDocument = await silenced(fetchSolidDocument(parentUrl, fetch));\n\n if (parentDocument?.isStorage()) {\n storageUrls.push(parentUrl);\n\n break;\n }\n\n parentUrl = urlParentDirectory(parentUrl);\n }\n\n return objectWithoutEmpty({\n webId,\n storageUrls,\n name:\n document.statement(webId, 'vcard:fn')?.object.value ??\n document.statement(webId, 'foaf:name')?.object.value,\n avatarUrl:\n document.statement(webId, 'vcard:hasPhoto')?.object.value ??\n document.statement(webId, 'foaf:img')?.object.value,\n oidcIssuerUrl: document.statement(webId, 'solid:oidcIssuer')?.object.value,\n publicTypeIndexUrl: publicTypeIndex?.object.value,\n privateTypeIndexUrl: privateTypeIndex?.object.value,\n });\n}\n\nexport async function fetchLoginUserProfile(loginUrl: string, fetch?: Fetch): Promise<SolidUserProfile | null> {\n const fetchProfile = silenced(url => fetchUserProfile(url, fetch));\n\n return await fetchProfile(loginUrl)\n ?? await fetchProfile(loginUrl.replace(/\\/$/, '').concat('/profile/card#me'))\n ?? await fetchProfile(urlRoot(loginUrl).concat('/profile/card#me'));\n}\n","import { uuid } from '@noeldemartin/utils';\n\nimport { createSolidDocument, fetchSolidDocument, solidDocumentExists, updateSolidDocument } from '@/helpers/io';\nimport type SolidThing from '@/models/SolidThing';\nimport type { Fetch } from '@/helpers/io';\nimport type { SolidUserProfile } from '@/helpers/auth';\n\nasync function mintPrivateTypeIndexUrl(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const storageUrl = user.storageUrls[0];\n const typeIndexUrl = `${storageUrl}settings/privateTypeIndex`;\n\n return await solidDocumentExists(typeIndexUrl, fetch)\n ? `${storageUrl}settings/privateTypeIndex-${uuid()}`\n : typeIndexUrl;\n}\n\nexport async function createPrivateTypeIndex(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const typeIndexUrl = await mintPrivateTypeIndexUrl(user, fetch);\n const typeIndexBody = `\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n `;\n const profileUpdateBody = `\n INSERT DATA {\n <${user.webId}> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <${typeIndexUrl}> .\n }\n `;\n\n createSolidDocument(typeIndexUrl, typeIndexBody, fetch);\n updateSolidDocument(user.webId, profileUpdateBody, fetch);\n\n return typeIndexUrl;\n}\n\nexport async function findContainerRegistration(\n typeIndexUrl: string,\n childrenType: string,\n fetch?: Fetch,\n): Promise<SolidThing | null> {\n const typeIndex = await fetchSolidDocument(typeIndexUrl, fetch);\n const containerQuad = typeIndex\n .statements(undefined, 'rdfs:type', 'solid:TypeRegistration')\n .find(\n statement =>\n typeIndex.contains(statement.subject.value, 'solid:forClass', childrenType) &&\n typeIndex.contains(statement.subject.value, 'solid:instanceContainer'),\n );\n\n return containerQuad\n ? typeIndex.getThing(containerQuad.subject.value) ?? null\n : null;\n}\n","import { pull } from '@noeldemartin/utils';\nimport type { Quad, Quad_Object } from 'rdf-js';\n\nimport { quadToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';\n\nconst patternRegExps: Record<string, RegExp> = {};\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n if (!containsPatterns(expected))\n return expected === actual;\n\n if (!(expected in patternRegExps)) {\n const patternMatches = expected.matchAll(/\\[\\[([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n patterns.push(patternMatch[1]);\n\n expectedRegExp = expectedRegExp.replace(patternMatch[0], `%PATTERN${patterns.length - 1}%`);\n }\n\n expectedRegExp = expectedRegExp.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\n for (const [patternIndex, pattern] of Object.entries(patterns)) {\n expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, pattern);\n }\n\n patternRegExps[expected] = new RegExp(expectedRegExp);\n }\n\n return patternRegExps[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\nexport interface EqualityResult {\n success: boolean;\n message: string;\n expected: string;\n actual: string;\n}\n\nexport function sparqlEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n\n const expectedOperations = sparqlToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualOperations = sparqlToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n for (const operation of Object.keys(expectedOperations)) {\n if (!(operation in actualOperations))\n return result(false, `Couldn't find expected ${operation} operation.`);\n\n const expectedQuads = pull(expectedOperations, operation);\n const actualQuads = pull(actualOperations, operation);\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} ${operation} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following ${operation} triple: ${quadToTurtle(expectedQuad)}`);\n }\n }\n\n const unexpectedOperation = Object.keys(actualOperations)[0] ?? null;\n if (unexpectedOperation)\n return result(false, `Did not expect to find ${unexpectedOperation} triples.`);\n\n return result(true, 'sparql matches');\n}\n\nexport function turtleEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n\n const expectedQuads = turtleToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualQuads = turtleToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n return result(true, 'turtle matches');\n}\n","import { sparqlEquals } 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 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, expected, actual);\n },\n};\n\nexport default assertions;\n","import diff from 'jest-diff';\n\nimport { normalizeSparql } from '@/helpers/io';\nimport { sparqlEquals } from '@/helpers/testing';\n\nconst matchers: jest.ExpectExtendMap = {\n toEqualSparql(received, expected) {\n const result = sparqlEquals(expected, received);\n const pass = result.success;\n const normalizedReceived = normalizeSparql(received);\n const normalizedExpected = normalizeSparql(expected);\n const message = pass\n ? () => [\n result.message,\n this.utils.matcherHint('toEqualSparql'),\n [\n `Expected: not ${this.utils.printExpected(normalizedExpected)}`,\n `Received: ${this.utils.printReceived(normalizedReceived)}`,\n ].join('\\n'),\n ].join('\\n\\n')\n : () => {\n const diffString = diff(normalizedExpected, normalizedReceived, {\n expand: this.expand,\n });\n\n return [\n result.message,\n this.utils.matcherHint('toEqualJsonLD'),\n diffString && diffString.includes('- Expect')\n ? `Difference:\\n\\n${diffString}`\n : [\n `Expected: ${this.utils.printExpected(normalizedExpected)}`,\n `Received: ${this.utils.printReceived(normalizedReceived)}`,\n ].join('\\n'),\n ].join('\\n\\n');\n };\n\n return { pass, message };\n },\n};\n\nexport default matchers;\n","import assertions from './assertions';\n\nexport function installChaiPlugin(): void {\n chai.use(_chai => Object.entries(assertions).forEach(([name, method]) => _chai.Assertion.addMethod(name, method)));\n}\n","import matchers from './matchers';\n\nexport function installJestPlugin(): void {\n expect.extend(matchers);\n}\n"],"names":["SolidDocumentFormat","MalformedSolidDocumentError","documentUrl","documentFormat","malformationDetails","errorMessage","Error","NetworkRequestError","url","NotFoundError","UnauthorizedError","responseStatus","this","undefined","knownPrefixes","foaf","pim","purl","rdfs","schema","solid","vcard","expandIRI","iri","options","startsWith","split","prefix","name","expandedPrefix","extraContext","_options$extraContext","defaultPrefix","SolidThing","quads","property","find","quad","predicate","value","_this$quads$find","object","filter","map","SolidDocument","headers","statements","length","statement","get","_this$headers$get","match","parseDate","_this$statement","getLatestDocumentDate","subject","_this","_this2","dates","date","reduce","a","b","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","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","quadToTurtle","sort","concat","toUpperCase","TurtleWriter","quadsToString","solidDocumentExists","document","isEmpty","operations","matchAll","Promise","all","_toConsumableArray","operationName","toLowerCase","operationBody","turtleToQuadsSync","turtle","parserOptions","objectWithoutEmpty","baseIRI","parser","TurtleParser","resolve","reject","parse","error","Turtle","message","push","updateSolidDocument","fetchUserProfile","webId","urlRoute","isPersonalProfile","storageUrls","storage","publicTypeIndex","privateTypeIndex","parentUrl","urlParentDirectory","silenced","parentDocument","isStorage","_document$statement","_document$statement2","avatarUrl","_document$statement3","_document$statement4","oidcIssuerUrl","_document$statement5","publicTypeIndexUrl","privateTypeIndexUrl","loginUrl","fetchProfile","replace","urlRoot","mintPrivateTypeIndexUrl","user","storageUrl","typeIndexUrl","uuid","profileUpdateBody","childrenType","typeIndex","containerQuad","contains","getThing","patternRegExps","containsPatterns","test","quadValueEquals","expected","actual","patternMatches","patterns","expectedRegExp","patternMatch","patternIndex","pattern","RegExp","quadEquals","datatype","Date","getTime","quadObjectEquals","sparqlEquals","expectedOperations","actualOperations","result","success","keys","expectedQuads","pull","actualQuads","expectedQuad","some","actualQuad","unexpectedOperation","assertions","query","_obj","assert","bind","matchers","toEqualSparql","received","pass","normalizedReceived","normalizedExpected","utils","matcherHint","printExpected","printReceived","diffString","diff","expand","chai","use","_chai","forEach","Assertion","addMethod","expect","extend"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"noeldemartin-solid-utils.cjs.js","sources":["../src/errors/MalformedSolidDocumentError.ts","../src/errors/NetworkRequestError.ts","../src/errors/NotFoundError.ts","../src/errors/UnauthorizedError.ts","../src/helpers/vocabs.ts","../src/models/SolidThing.ts","../src/models/SolidDocument.ts","../src/helpers/jsonld.ts","../src/helpers/io.ts","../src/helpers/auth.ts","../src/helpers/interop.ts","../src/helpers/testing.ts","../src/plugins/chai/assertions.ts","../src/plugins/jest/matchers.ts","../src/plugins/chai/index.ts","../src/plugins/jest/index.ts"],"sourcesContent":["import { Error } from '@noeldemartin/utils';\n\nfunction errorMessage(\n documentUrl: string | null,\n documentFormat: SolidDocumentFormat,\n malformationDetails: string,\n): string {\n return documentUrl\n ? `Malformed ${documentFormat} document found at ${documentUrl} - ${malformationDetails}`\n : `Malformed ${documentFormat} document - ${malformationDetails}`;\n}\n\nexport enum SolidDocumentFormat {\n Turtle = 'Turtle',\n}\n\nexport default class MalformedSolidDocumentError extends Error {\n\n public readonly documentUrl: string | null;\n public readonly documentFormat: SolidDocumentFormat;\n public readonly malformationDetails: string;\n\n constructor(documentUrl: string | null, documentFormat: SolidDocumentFormat, malformationDetails: string) {\n super(errorMessage(documentUrl, documentFormat, malformationDetails));\n\n this.documentUrl = documentUrl;\n this.documentFormat = documentFormat;\n this.malformationDetails = malformationDetails;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Request failed trying to fetch ${url}`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NotFoundError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Document with '${url}' url not found`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nfunction errorMessage(url: string, responseStatus?: number): string {\n const typeInfo = responseStatus === 403 ? ' (Forbidden)' : '';\n\n return `Unauthorized${typeInfo}: ${url}`;\n}\n\nexport default class UnauthorizedError extends Error {\n\n public readonly url: string;\n public readonly responseStatus?: number;\n\n constructor(url: string, responseStatus?: number) {\n super(errorMessage(url, responseStatus));\n\n this.url = url;\n this.responseStatus = responseStatus;\n }\n\n public get forbidden(): boolean | undefined {\n return typeof this.responseStatus !== 'undefined'\n ? this.responseStatus === 403\n : undefined;\n }\n\n}\n","export type RDFContext = Record<string, string>;\n\nexport interface ExpandIRIOptions {\n defaultPrefix: string;\n extraContext: RDFContext;\n}\n\nconst knownPrefixes: RDFContext = {\n foaf: 'http://xmlns.com/foaf/0.1/',\n pim: 'http://www.w3.org/ns/pim/space#',\n purl: 'http://purl.org/dc/terms/',\n rdfs: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\n schema: 'https://schema.org/',\n solid: 'http://www.w3.org/ns/solid/terms#',\n vcard: 'http://www.w3.org/2006/vcard/ns#',\n};\n\nexport function defineIRIPrefix(name: string, value: string): void {\n knownPrefixes[name] = value;\n}\n\nexport function expandIRI(iri: string, options: Partial<ExpandIRIOptions> = {}): string {\n if (iri.startsWith('http'))\n return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix)\n throw new Error(`Can't expand IRI with unknown prefix: '${iri}'`);\n\n return expandedPrefix + name;\n }\n\n if (!options.defaultPrefix)\n throw new Error(`Can't expand IRI without a default prefix: '${iri}'`);\n\n return options.defaultPrefix + prefix;\n}\n","import type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nexport default class SolidThing {\n\n public readonly url: string;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[]) {\n this.url = url;\n this.quads = quads;\n }\n\n public value(property: string): string | undefined {\n return this.quads\n .find(quad => quad.predicate.value === expandIRI(property))\n ?.object.value;\n }\n\n public values(property: string): string[] {\n return this.quads\n .filter(quad => quad.predicate.value === expandIRI(property))\n .map(quad => quad.object.value);\n }\n\n}\n","import { parseDate } from '@noeldemartin/utils';\nimport type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport default class SolidDocument {\n\n public readonly url: string;\n public readonly headers: Headers;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n this.url = url;\n this.quads = quads;\n this.headers = headers;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(\n this.url,\n expandIRI('rdfs:type'),\n expandIRI('foaf:PersonalProfileDocument'),\n );\n }\n\n public isStorage(): boolean {\n return !!this.headers.get('Link')?.match(/<http:\\/\\/www\\.w3\\.org\\/ns\\/pim\\/space#Storage>;[^,]+rel=\"type\"/);\n }\n\n public getLastModified(): Date | null {\n return parseDate(this.headers.get('last-modified'))\n ?? parseDate(this.statement(this.url, 'purl:modified')?.object.value)\n ?? this.getLatestDocumentDate()\n ?? null;\n }\n\n public statements(subject?: string, predicate?: string, object?: string): Quad[] {\n return this.quads.filter(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n }\n\n public statement(subject?: string, predicate?: string, object?: string): Quad | null {\n const statement = this.quads.find(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n\n return statement ?? null;\n }\n\n public contains(subject: string, predicate?: string, object?: string): boolean {\n return this.statement(subject, predicate, object) !== null;\n }\n\n public getThing(subject: string): SolidThing {\n const statements = this.statements(subject);\n\n return new SolidThing(subject, statements);\n }\n\n private getLatestDocumentDate(): Date | null {\n const dates = [\n ...this.statements(undefined, 'purl:modified'),\n ...this.statements(undefined, 'purl:created'),\n ]\n .map(statement => parseDate(statement.object.value))\n .filter((date): date is Date => date !== null);\n\n return dates.length > 0 ? dates.reduce((a, b) => a > b ? a : b) : null;\n }\n\n}\n","export type JsonLD = Partial<{\n '@context': Record<string, unknown>;\n '@id': string;\n '@type': null | string | string[];\n}> & { [k: string]: unknown };\n\nexport type JsonLDResource = Omit<JsonLD, '@id'> & { '@id': string };\nexport type JsonLDGraph = { '@graph': JsonLDResource[] };\n\nexport function isJsonLDGraph(jsonld: JsonLD): jsonld is JsonLDGraph {\n return '@graph' in jsonld;\n}\n","import { arr, arrayFilter, arrayReplace,objectWithoutEmpty } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';\nimport type { JsonLdDocument } from 'jsonld';\nimport { toRDF } from 'jsonld';\nimport md5 from 'md5';\nimport type { Quad } from 'rdf-js';\nimport type { Term as N3Term } from 'n3';\n\nimport SolidDocument from '@/models/SolidDocument';\n\nimport MalformedSolidDocumentError, { SolidDocumentFormat } from '@/errors/MalformedSolidDocumentError';\nimport NetworkRequestError from '@/errors/NetworkRequestError';\nimport NotFoundError from '@/errors/NotFoundError';\nimport UnauthorizedError from '@/errors/UnauthorizedError';\nimport { isJsonLDGraph } from '@/helpers/jsonld';\nimport type { JsonLD } from '@/helpers/jsonld';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type AnyFetch = (input: any, options?: any) => Promise<any>;\nexport declare type TypedFetch = (input: RequestInfo, options?: RequestInit) => Promise<Response>;\nexport declare type Fetch = TypedFetch | AnyFetch;\n\nasync function fetchRawSolidDocument(url: string, fetch: Fetch): Promise<{ body: string; headers: Headers }> {\n const options = {\n headers: { Accept: 'text/turtle' },\n };\n\n try {\n const response = await fetch(url, options);\n\n if (response.status === 404)\n throw new NotFoundError(url);\n\n if ([401, 403].includes(response.status))\n throw new UnauthorizedError(url, response.status);\n\n const body = await response.text();\n\n return {\n body,\n headers: response.headers,\n };\n } catch (error) {\n if (error instanceof UnauthorizedError)\n throw error;\n\n throw new NetworkRequestError(url);\n }\n}\n\nfunction normalizeBlankNodes(quads: Quad[]): Quad[] {\n const normalizedQuads = quads.slice(0);\n const quadsIndexes: Record<string, Set<number>> = {};\n const blankNodeIds = arr(quads)\n .flatMap((quad, index) => {\n const ids = arrayFilter([\n quad.object.termType === 'BlankNode' ? quad.object.value : null,\n quad.subject.termType === 'BlankNode' ? quad.subject.value : null,\n ]);\n\n for (const id of ids) {\n quadsIndexes[id] = quadsIndexes[id] ?? new Set();\n quadsIndexes[id].add(index);\n }\n\n return ids;\n })\n .filter()\n .unique();\n\n for (const originalId of blankNodeIds) {\n const normalizedId = md5(\n arr(quadsIndexes[originalId])\n .map(index => quads[index])\n .filter(({ subject: { termType, value } }) => termType === 'BlankNode' && value === originalId)\n .map(\n ({ predicate, object }) => object.termType === 'BlankNode'\n ? predicate.value\n : predicate.value + object.value,\n )\n .sorted()\n .join(),\n );\n\n for (const index of quadsIndexes[originalId]) {\n const quad = normalizedQuads[index];\n const terms: Record<string, N3Term> = { subject: quad.subject as N3Term, object: quad.object as N3Term };\n\n for (const [termName, termValue] of Object.entries(terms)) {\n if (termValue.termType !== 'BlankNode' || termValue.value !== originalId)\n continue;\n\n terms[termName] = new N3BlankNode(normalizedId);\n }\n\n arrayReplace(normalizedQuads, quad, new N3Quad(terms.subject, quad.predicate as N3Term, terms.object));\n }\n }\n\n return normalizedQuads;\n}\n\nexport interface ParsingOptions {\n documentUrl: string;\n normalizeBlankNodes: boolean;\n}\n\nexport async function createSolidDocument(url: string, body: string, fetch?: Fetch): Promise<SolidDocument> {\n fetch = fetch ?? window.fetch;\n\n const statements = await turtleToQuads(body);\n\n await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/turtle' },\n body,\n });\n\n return new SolidDocument(url, statements, new Headers({}));\n}\n\nexport async function fetchSolidDocument(url: string, fetch?: Fetch): Promise<SolidDocument> {\n const { body: data, headers } = await fetchRawSolidDocument(url, fetch ?? window.fetch);\n const statements = await turtleToQuads(data, { documentUrl: url });\n\n return new SolidDocument(url, statements, headers);\n}\n\nexport async function jsonldToQuads(jsonld: JsonLD): Promise<Quad[]> {\n if (isJsonLDGraph(jsonld)) {\n const graphQuads = await Promise.all(jsonld['@graph'].map(jsonldToQuads));\n\n return graphQuads.flat();\n }\n\n return toRDF(jsonld as JsonLdDocument) as Promise<Quad[]>;\n}\n\nexport function normalizeSparql(sparql: string): string {\n const quads = sparqlToQuadsSync(sparql);\n\n return Object\n .entries(quads)\n .reduce((normalizedOperations, [operation, quads]) => {\n const normalizedQuads = quads.map(quad => ' ' + quadToTurtle(quad)).sort().join('\\n');\n\n return normalizedOperations.concat(`${operation.toUpperCase()} DATA {\\n${normalizedQuads}\\n}`);\n }, [] as string[])\n .join(' ;\\n');\n}\n\nexport function quadsToTurtle(quads: Quad[]): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString(quads);\n}\n\nexport function quadToTurtle(quad: Quad): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, fetch?: Fetch): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, fetch);\n\n return !document.isEmpty();\n } catch (error) {\n return false;\n }\n}\n\nexport async function sparqlToQuads(\n sparql: string,\n options: Partial<ParsingOptions> = {},\n): Promise<Record<string, Quad[]>> {\n const operations = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all([...operations].map(async operation => {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = await turtleToQuads(operationBody, options);\n }));\n\n return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n for (const operation of operations) {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = turtleToQuadsSync(operationBody, options);\n }\n\n return quads;\n}\n\nexport async function turtleToQuads(turtle: string, options: Partial<ParsingOptions> = {}): Promise<Quad[]> {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n const quads: Quad[] = [];\n\n return new Promise((resolve, reject) => {\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(\n options.documentUrl ?? null,\n SolidDocumentFormat.Turtle,\n error.message,\n ),\n );\n return;\n }\n\n if (!quad) {\n options.normalizeBlankNodes\n ? resolve(normalizeBlankNodes(quads))\n : resolve(quads);\n\n return;\n }\n\n quads.push(quad);\n });\n });\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes\n ? normalizeBlankNodes(quads)\n : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(options.documentUrl ?? null, SolidDocumentFormat.Turtle, error.message);\n }\n}\n\nexport async function updateSolidDocument(url: string, body: string, fetch?: Fetch): Promise<void> {\n fetch = fetch ?? window.fetch;\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n","import { objectWithoutEmpty, silenced, urlParentDirectory, urlRoot, urlRoute } from '@noeldemartin/utils';\n\nimport { fetchSolidDocument } from './io';\nimport type { Fetch } from './io';\n\nexport interface SolidUserProfile {\n webId: string;\n storageUrls: string[];\n name?: string;\n avatarUrl?: string;\n oidcIssuerUrl?: string;\n publicTypeIndexUrl?: string;\n privateTypeIndexUrl?: string;\n}\n\nasync function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUserProfile> {\n const documentUrl = urlRoute(webId);\n const document = await fetchSolidDocument(documentUrl, fetch);\n\n if (!document.isPersonalProfile())\n throw new Error(`Document at ${documentUrl} is not a profile.`);\n\n const storageUrls = document.statements(webId, 'pim:storage').map(storage => storage.object.value);\n const publicTypeIndex = document.statement(webId, 'solid:publicTypeIndex');\n const privateTypeIndex = document.statement(webId, 'solid:privateTypeIndex');\n\n let parentUrl = urlParentDirectory(documentUrl);\n while (parentUrl && storageUrls.length === 0) {\n const parentDocument = await silenced(fetchSolidDocument(parentUrl, fetch));\n\n if (parentDocument?.isStorage()) {\n storageUrls.push(parentUrl);\n\n break;\n }\n\n parentUrl = urlParentDirectory(parentUrl);\n }\n\n return objectWithoutEmpty({\n webId,\n storageUrls,\n name:\n document.statement(webId, 'vcard:fn')?.object.value ??\n document.statement(webId, 'foaf:name')?.object.value,\n avatarUrl:\n document.statement(webId, 'vcard:hasPhoto')?.object.value ??\n document.statement(webId, 'foaf:img')?.object.value,\n oidcIssuerUrl: document.statement(webId, 'solid:oidcIssuer')?.object.value,\n publicTypeIndexUrl: publicTypeIndex?.object.value,\n privateTypeIndexUrl: privateTypeIndex?.object.value,\n });\n}\n\nexport async function fetchLoginUserProfile(loginUrl: string, fetch?: Fetch): Promise<SolidUserProfile | null> {\n const fetchProfile = silenced(url => fetchUserProfile(url, fetch));\n\n return await fetchProfile(loginUrl)\n ?? await fetchProfile(loginUrl.replace(/\\/$/, '').concat('/profile/card#me'))\n ?? await fetchProfile(urlRoot(loginUrl).concat('/profile/card#me'));\n}\n","import { uuid } from '@noeldemartin/utils';\n\nimport { createSolidDocument, fetchSolidDocument, solidDocumentExists, updateSolidDocument } from '@/helpers/io';\nimport type SolidThing from '@/models/SolidThing';\nimport type { Fetch } from '@/helpers/io';\nimport type { SolidUserProfile } from '@/helpers/auth';\n\nasync function mintPrivateTypeIndexUrl(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const storageUrl = user.storageUrls[0];\n const typeIndexUrl = `${storageUrl}settings/privateTypeIndex`;\n\n return await solidDocumentExists(typeIndexUrl, fetch)\n ? `${storageUrl}settings/privateTypeIndex-${uuid()}`\n : typeIndexUrl;\n}\n\nexport async function createPrivateTypeIndex(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const typeIndexUrl = await mintPrivateTypeIndexUrl(user, fetch);\n const typeIndexBody = `\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n `;\n const profileUpdateBody = `\n INSERT DATA {\n <${user.webId}> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <${typeIndexUrl}> .\n }\n `;\n\n createSolidDocument(typeIndexUrl, typeIndexBody, fetch);\n updateSolidDocument(user.webId, profileUpdateBody, fetch);\n\n return typeIndexUrl;\n}\n\nexport async function findContainerRegistration(\n typeIndexUrl: string,\n childrenType: string,\n fetch?: Fetch,\n): Promise<SolidThing | null> {\n const typeIndex = await fetchSolidDocument(typeIndexUrl, fetch);\n const containerQuad = typeIndex\n .statements(undefined, 'rdfs:type', 'solid:TypeRegistration')\n .find(\n statement =>\n typeIndex.contains(statement.subject.value, 'solid:forClass', childrenType) &&\n typeIndex.contains(statement.subject.value, 'solid:instanceContainer'),\n );\n\n return containerQuad\n ? typeIndex.getThing(containerQuad.subject.value) ?? null\n : null;\n}\n","import type { JsonLD } from '@/helpers/jsonld';\nimport { pull } from '@noeldemartin/utils';\nimport type { Quad, Quad_Object } from 'rdf-js';\n\nimport { jsonldToQuads, quadToTurtle, quadsToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';\n\nlet patternsRegExpsIndex: Record<string, RegExp> = {};\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[(.*\\]\\[)?([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n if (!containsPatterns(expected))\n return expected === actual;\n\n const patternAliases = [];\n\n if (!(expected in patternsRegExpsIndex)) {\n const patternMatches = expected.matchAll(/\\[\\[((.*)\\]\\[)?([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n if (patternMatch[2]) {\n patternAliases.push(patternMatch[2]);\n }\n\n patterns.push(patternMatch[3]);\n\n expectedRegExp = expectedRegExp.replace(patternMatch[0], `%PATTERN${patterns.length - 1}%`);\n }\n\n expectedRegExp = expectedRegExp.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\n for (const [patternIndex, pattern] of Object.entries(patterns)) {\n expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, pattern);\n }\n\n patternsRegExpsIndex[expected] = new RegExp(expectedRegExp);\n }\n\n return patternsRegExpsIndex[expected].test(actual);\n}\n\nfunction quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {\n if (expected.termType !== actual.termType)\n return false;\n\n if (expected.termType === 'Literal' && actual.termType === 'Literal') {\n if (expected.datatype.value !== actual.datatype.value)\n return false;\n\n if (!containsPatterns(expected.value))\n return expected.datatype.value === 'http://www.w3.org/2001/XMLSchema#dateTime'\n ? new Date(expected.value).getTime() === new Date(actual.value).getTime()\n : expected.value === actual.value;\n }\n\n return quadValueEquals(expected.value, actual.value);\n}\n\nfunction quadEquals(expected: Quad, actual: Quad): boolean {\n return quadObjectEquals(expected.object, actual.object)\n && quadValueEquals(expected.subject.value, actual.subject.value)\n && quadValueEquals(expected.predicate.value, actual.predicate.value);\n}\n\nfunction resetPatterns(): void {\n patternsRegExpsIndex = {};\n}\n\nexport interface EqualityResult {\n success: boolean;\n message: string;\n expected: string;\n actual: string;\n}\n\nexport async function jsonldEquals(expected: JsonLD, actual: JsonLD): Promise<EqualityResult> {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedQuads = await jsonldToQuads(expected);\n const actualQuads = await jsonldToQuads(actual);\n const expectedTurtle = quadsToTurtle(expectedQuads);\n const actualTurtle = quadsToTurtle(actualQuads);\n const result = (success: boolean, message: string) => ({\n success,\n message,\n expected: expectedTurtle,\n actual: actualTurtle,\n });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n return result(true, 'jsonld matches');\n}\n\nexport function sparqlEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedOperations = sparqlToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualOperations = sparqlToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n for (const operation of Object.keys(expectedOperations)) {\n if (!(operation in actualOperations))\n return result(false, `Couldn't find expected ${operation} operation.`);\n\n const expectedQuads = pull(expectedOperations, operation);\n const actualQuads = pull(actualOperations, operation);\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} ${operation} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following ${operation} triple: ${quadToTurtle(expectedQuad)}`);\n }\n }\n\n const unexpectedOperation = Object.keys(actualOperations)[0] ?? null;\n if (unexpectedOperation)\n return result(false, `Did not expect to find ${unexpectedOperation} triples.`);\n\n return result(true, 'sparql matches');\n}\n\nexport function turtleEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedQuads = turtleToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualQuads = turtleToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n return result(true, 'turtle matches');\n}\n","import { sparqlEquals, turtleEquals } from '@/helpers/testing';\n\ntype CustomAssertions = {\n [assertion in keyof typeof assertions]: typeof assertions[assertion];\n};\n\ndeclare global {\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Chai {\n\n interface Assertion extends CustomAssertions {}\n interface Include extends CustomAssertions {}\n\n }\n\n}\n\nconst assertions: Record<string, (this: Chai.AssertionStatic, ...args: any[]) => void> = {\n turtle(graph: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = graph;\n const result = turtleEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n sparql(query: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = query;\n const result = sparqlEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n};\n\nexport default assertions;\n","import { normalizeSparql } from '@/helpers/io';\nimport { jsonldEquals, sparqlEquals } from '@/helpers/testing';\nimport type { EqualityResult } from '@/helpers/testing';\n\ninterface FormatResultOptions {\n context: jest.MatcherContext;\n hint: string;\n expected: unknown;\n received: unknown;\n}\n\nfunction formatResult(result: EqualityResult, options: FormatResultOptions) {\n const pass = result.success;\n const utils = options.context.utils;\n const message = pass\n ? () => [\n result.message,\n utils.matcherHint(options.hint),\n [\n `Expected: not ${utils.printExpected(options.expected)}`,\n `Received: ${utils.printReceived(options.received)}`,\n ].join('\\n'),\n ].join('\\n\\n')\n : () => {\n return [\n result.message,\n utils.matcherHint(options.hint),\n ].join('\\n\\n');\n };\n\n return { pass, message };\n}\n\nconst matchers: jest.ExpectExtendMap = {\n async toEqualJsonLD(received, expected) {\n const result = await jsonldEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualJsonLD',\n expected,\n received,\n });\n },\n toEqualSparql(received, expected) {\n const result = sparqlEquals(expected, received);\n\n return formatResult(result, {\n context: this,\n hint: 'toEqualSparql',\n expected: normalizeSparql(expected),\n received: normalizeSparql(received),\n });\n },\n};\n\nexport default matchers;\n","import assertions from './assertions';\n\nexport function installChaiPlugin(): void {\n chai.use(_chai => Object.entries(assertions).forEach(([name, method]) => _chai.Assertion.addMethod(name, method)));\n}\n","import matchers from './matchers';\n\nexport function installJestPlugin(): void {\n expect.extend(matchers);\n}\n"],"names":["SolidDocumentFormat","MalformedSolidDocumentError","documentUrl","documentFormat","malformationDetails","errorMessage","Error","NetworkRequestError","url","NotFoundError","UnauthorizedError","responseStatus","this","undefined","knownPrefixes","foaf","pim","purl","rdfs","schema","solid","vcard","expandIRI","iri","options","startsWith","split","prefix","name","expandedPrefix","extraContext","_options$extraContext","defaultPrefix","SolidThing","quads","property","find","quad","predicate","value","_this$quads$find","object","filter","map","SolidDocument","headers","statements","length","statement","get","_this$headers$get","match","parseDate","_this$statement","getLatestDocumentDate","subject","_this","_this2","dates","date","reduce","a","b","isJsonLDGraph","jsonld","fetchRawSolidDocument","fetch","Accept","response","status","includes","text","body","_context","normalizeBlankNodes","normalizedQuads","slice","quadsIndexes","blankNodeIds","arr","flatMap","index","ids","arrayFilter","termType","id","Set","add","unique","originalId","normalizedId","md5","sorted","join","terms","Object","entries","termName","termValue","N3BlankNode","arrayReplace","N3Quad","createSolidDocument","window","turtleToQuads","method","Headers","fetchSolidDocument","data","jsonldToQuads","Promise","all","graphQuads","flat","toRDF","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","quadToTurtle","sort","concat","toUpperCase","quadsToTurtle","TurtleWriter","quadsToString","solidDocumentExists","document","isEmpty","operations","matchAll","_toConsumableArray","operationName","toLowerCase","operationBody","turtleToQuadsSync","turtle","parserOptions","objectWithoutEmpty","baseIRI","parser","TurtleParser","resolve","reject","parse","error","Turtle","message","push","updateSolidDocument","fetchUserProfile","webId","urlRoute","isPersonalProfile","storageUrls","storage","publicTypeIndex","privateTypeIndex","parentUrl","urlParentDirectory","silenced","parentDocument","isStorage","_document$statement","_document$statement2","avatarUrl","_document$statement3","_document$statement4","oidcIssuerUrl","_document$statement5","publicTypeIndexUrl","privateTypeIndexUrl","loginUrl","fetchProfile","replace","urlRoot","mintPrivateTypeIndexUrl","user","storageUrl","typeIndexUrl","uuid","profileUpdateBody","childrenType","typeIndex","containerQuad","contains","getThing","patternsRegExpsIndex","containsPatterns","test","quadValueEquals","expected","actual","patternAliases","patternMatches","patterns","expectedRegExp","patternMatch","patternIndex","pattern","RegExp","quadEquals","datatype","Date","getTime","quadObjectEquals","resetPatterns","jsonldEquals","expectedQuads","actualQuads","expectedTurtle","actualTurtle","result","success","expectedQuad","some","actualQuad","sparqlEquals","expectedOperations","actualOperations","keys","pull","unexpectedOperation","turtleEquals","assertions","graph","_obj","assert","bind","query","formatResult","pass","utils","context","matcherHint","hint","printExpected","printReceived","received","matchers","toEqualJsonLD","toEqualSparql","chai","use","_chai","forEach","Assertion","addMethod","expect","extend"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ declare global {
|
|
|
5
5
|
// TODO generate automatically
|
|
6
6
|
interface Matchers<R> {
|
|
7
7
|
toEqualSparql(sparql: string): R;
|
|
8
|
+
toEqualJsonLD(jsonld: JsonLD): Promise<R>;
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
}
|
|
@@ -47,6 +48,8 @@ export declare function installChaiPlugin(): void;
|
|
|
47
48
|
|
|
48
49
|
export declare function installJestPlugin(): void;
|
|
49
50
|
|
|
51
|
+
export declare function isJsonLDGraph(jsonld: JsonLD): jsonld is JsonLDGraph;
|
|
52
|
+
|
|
50
53
|
export declare type JsonLD = Partial<{
|
|
51
54
|
'@context': Record<string, unknown>;
|
|
52
55
|
'@id': string;
|
|
@@ -55,6 +58,8 @@ export declare type JsonLD = Partial<{
|
|
|
55
58
|
[k: string]: unknown;
|
|
56
59
|
};
|
|
57
60
|
|
|
61
|
+
export declare function jsonldEquals(expected: JsonLD, actual: JsonLD): Promise<EqualityResult>;
|
|
62
|
+
|
|
58
63
|
export declare type JsonLDGraph = {
|
|
59
64
|
'@graph': JsonLDResource[];
|
|
60
65
|
};
|
|
@@ -63,6 +68,8 @@ export declare type JsonLDResource = Omit<JsonLD, '@id'> & {
|
|
|
63
68
|
'@id': string;
|
|
64
69
|
};
|
|
65
70
|
|
|
71
|
+
export declare function jsonldToQuads(jsonld: JsonLD): Promise<Quad[]>;
|
|
72
|
+
|
|
66
73
|
export declare class MalformedSolidDocumentError extends Error_2 {
|
|
67
74
|
readonly documentUrl: string | null;
|
|
68
75
|
readonly documentFormat: SolidDocumentFormat;
|
|
@@ -87,6 +94,8 @@ export declare interface ParsingOptions {
|
|
|
87
94
|
normalizeBlankNodes: boolean;
|
|
88
95
|
}
|
|
89
96
|
|
|
97
|
+
export declare function quadsToTurtle(quads: Quad[]): string;
|
|
98
|
+
|
|
90
99
|
export declare function quadToTurtle(quad: Quad): string;
|
|
91
100
|
|
|
92
101
|
export declare type RDFContext = Record<string, string>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"core-js/modules/es.reflect.construct.js";import e from"@babel/runtime/helpers/esm/classCallCheck";import t from"@babel/runtime/helpers/esm/inherits";import r from"@babel/runtime/helpers/esm/possibleConstructorReturn";import n from"@babel/runtime/helpers/esm/getPrototypeOf";import"core-js/modules/es.array.concat.js";import{Error as o,parseDate as s,objectWithoutEmpty as u,arr as a,arrayFilter as i,arrayReplace as c,silenced as l,urlParentDirectory as f,urlRoute as p,urlRoot as d,uuid as m,pull as v}from"@noeldemartin/utils";import h from"@babel/runtime/helpers/esm/createClass";import y from"@babel/runtime/helpers/esm/asyncToGenerator";import j from"@babel/runtime/regenerator";import"core-js/modules/es.array.map.js";import"core-js/modules/es.regexp.exec.js";import"core-js/modules/es.string.replace.js";import"core-js/modules/es.function.name.js";import"core-js/modules/es.array.from.js";import"core-js/modules/es.symbol.js";import"core-js/modules/es.symbol.description.js";import"core-js/modules/es.symbol.iterator.js";import w from"@babel/runtime/helpers/esm/toConsumableArray";import b from"@babel/runtime/helpers/esm/slicedToArray";import"core-js/modules/es.array.slice.js";import"core-js/modules/es.array.filter.js";import"core-js/modules/es.array.flat-map.js";import"core-js/modules/es.array.unscopables.flat-map.js";import"core-js/modules/es.array.iterator.js";import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.set.js";import"core-js/modules/es.string.iterator.js";import"core-js/modules/esnext.set.add-all.js";import"core-js/modules/esnext.set.delete-all.js";import"core-js/modules/esnext.set.difference.js";import"core-js/modules/esnext.set.every.js";import"core-js/modules/esnext.set.filter.js";import"core-js/modules/esnext.set.find.js";import"core-js/modules/esnext.set.intersection.js";import"core-js/modules/esnext.set.is-disjoint-from.js";import"core-js/modules/esnext.set.is-subset-of.js";import"core-js/modules/esnext.set.is-superset-of.js";import"core-js/modules/esnext.set.join.js";import"core-js/modules/esnext.set.map.js";import"core-js/modules/esnext.set.reduce.js";import"core-js/modules/esnext.set.some.js";import"core-js/modules/esnext.set.symmetric-difference.js";import"core-js/modules/esnext.set.union.js";import"core-js/modules/web.dom-collections.iterator.js";import"core-js/modules/es.array.join.js";import"core-js/modules/es.object.entries.js";import"core-js/modules/es.string.match-all.js";import"core-js/modules/es.array.includes.js";import"core-js/modules/es.promise.js";import{Writer as x,Parser as g,BlankNode as k,Quad as T}from"n3";import E from"md5";import"core-js/modules/es.string.match.js";import"core-js/modules/es.array.find.js";import"core-js/modules/es.string.starts-with.js";import"core-js/modules/es.string.split.js";import R from"@babel/runtime/helpers/esm/typeof";import"core-js/modules/es.regexp.constructor.js";import"core-js/modules/es.regexp.to-string.js";import"core-js/modules/es.object.keys.js";import"core-js/modules/web.dom-collections.for-each.js";import"core-js/modules/es.string.includes.js";import A from"jest-diff";function I(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,s=n(e);if(t){var u=n(this).constructor;o=Reflect.construct(s,arguments,u)}else o=s.apply(this,arguments);return r(this,o)}}var S;!function(e){e.Turtle="Turtle"}(S||(S={}));var P=function(r){t(MalformedSolidDocumentError,o);var n=I(MalformedSolidDocumentError);function MalformedSolidDocumentError(t,r,o){var s;return e(this,MalformedSolidDocumentError),(s=n.call(this,function(e,t,r){return e?"Malformed ".concat(t," document found at ").concat(e," - ").concat(r):"Malformed ".concat(t," document - ").concat(r)}(t,r,o))).documentUrl=t,s.documentFormat=r,s.malformationDetails=o,s}return MalformedSolidDocumentError}();function U(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,s=n(e);if(t){var u=n(this).constructor;o=Reflect.construct(s,arguments,u)}else o=s.apply(this,arguments);return r(this,o)}}var D=function(r){t(NetworkRequestError,o);var n=U(NetworkRequestError);function NetworkRequestError(t){var r;return e(this,NetworkRequestError),(r=n.call(this,"Request failed trying to fetch ".concat(t))).url=t,r}return NetworkRequestError}();function N(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,s=n(e);if(t){var u=n(this).constructor;o=Reflect.construct(s,arguments,u)}else o=s.apply(this,arguments);return r(this,o)}}var q=function(r){t(NotFoundError,o);var n=N(NotFoundError);function NotFoundError(t){var r;return e(this,NotFoundError),(r=n.call(this,"Document with '".concat(t,"' url not found"))).url=t,r}return NotFoundError}();function C(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,s=n(e);if(t){var u=n(this).constructor;o=Reflect.construct(s,arguments,u)}else o=s.apply(this,arguments);return r(this,o)}}var B=function(r){t(UnauthorizedError,o);var n=C(UnauthorizedError);function UnauthorizedError(t,r){var o;return e(this,UnauthorizedError),(o=n.call(this,function(e,t){return"Unauthorized".concat(403===t?" (Forbidden)":"",": ").concat(e)}(t,r))).url=t,o.responseStatus=r,o}return h(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(),O={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 z(e,t){O[e]=t}function M(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=b(r,2),o=n[0],s=n[1];if(s){var u,a,i,c=null!==(u=null!==(a=O[o])&&void 0!==a?a:null===(i=t.extraContext)||void 0===i?void 0:i[o])&&void 0!==u?u: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 L=function(){function t(r,n){e(this,t),this.url=r,this.quads=n}return h(t,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===M(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===M(e)})).map((function(e){return e.object.value}))}}]),t}(),F=function(){function t(r,n,o){e(this,t),this.url=r,this.quads=n,this.headers=o}return h(t,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,M("rdfs:type"),M("foaf:PersonalProfileDocument"))}},{key:"isStorage",value:function(){var e;return!(null===(e=this.headers.get("Link"))||void 0===e||!e.match(/<http:\/\/www\.w3\.org\/ns\/pim\/space#Storage>;[^,]+rel="type"/))}},{key:"getLastModified",value:function(){var e,t,r,n;return null!==(e=null!==(t=null!==(r=s(this.headers.get("last-modified")))&&void 0!==r?r:s(null===(n=this.statement(this.url,"purl:modified"))||void 0===n?void 0:n.object.value))&&void 0!==t?t:this.getLatestDocumentDate())&&void 0!==e?e:null}},{key:"statements",value:function(e,t,r){var n=this;return this.quads.filter((function(o){return!(r&&o.object.value!==M(r,{defaultPrefix:n.url})||e&&o.subject.value!==M(e,{defaultPrefix:n.url})||t&&o.predicate.value!==M(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!==M(r,{defaultPrefix:n.url})||e&&o.subject.value!==M(e,{defaultPrefix:n.url})||t&&o.predicate.value!==M(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 L(e,t)}},{key:"getLatestDocumentDate",value:function(){var e=[].concat(w(this.statements(void 0,"purl:modified")),w(this.statements(void 0,"purl:created"))).map((function(e){return s(e.object.value)})).filter((function(e){return null!==e}));return e.length>0?e.reduce((function(e,t){return e>t?e:t})):null}}]),t}();function $(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 H(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 H(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,u=!0,a=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return u=e.done,e},e:function(e){a=!0,s=e},f:function(){try{u||null==r.return||r.return()}finally{if(a)throw s}}}}function H(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 J.apply(this,arguments)}function J(){return(J=y(j.mark((function e(t,r){var n,o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={headers:{Accept:"text/turtle"}},e.prev=1,e.next=4,r(t,n);case 4:if(404!==(o=e.sent).status){e.next=7;break}throw new q(t);case 7:if(![401,403].includes(o.status)){e.next=9;break}throw new B(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 B)){e.next=19;break}throw e.t0;case 19:throw new D(t);case 20:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function W(e){var t,r=e.slice(0),n={},o=a(e).flatMap((function(e,t){var r,o=i(["BlankNode"===e.object.termType?e.object.value:null,"BlankNode"===e.subject.termType?e.subject.value:null]),s=$(o);try{for(s.s();!(r=s.n()).done;){var u,a=r.value;n[a]=null!==(u=n[a])&&void 0!==u?u:new Set,n[a].add(t)}}catch(e){s.e(e)}finally{s.f()}return o})).filter().unique(),s=$(o);try{var u=function(){var o,s=t.value,u=E(a(n[s]).map((function(t){return e[t]})).filter((function(e){var t=e.subject,r=t.termType,n=t.value;return"BlankNode"===r&&n===s})).map((function(e){var t=e.predicate,r=e.object;return"BlankNode"===r.termType?t.value:t.value+r.value})).sorted().join()),i=$(n[s]);try{for(i.s();!(o=i.n()).done;){for(var l=o.value,f=r[l],p={subject:f.subject,object:f.object},d=0,m=Object.entries(p);d<m.length;d++){var v=b(m[d],2),h=v[0],y=v[1];"BlankNode"===y.termType&&y.value===s&&(p[h]=new k(u))}c(r,f,new T(p.subject,f.predicate,p.object))}}catch(e){i.e(e)}finally{i.f()}};for(s.s();!(t=s.n()).done;)u()}catch(e){s.e(e)}finally{s.f()}return r}function X(e,t,r){return _.apply(this,arguments)}function _(){return(_=y(j.mark((function e(t,r,n){var o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch,e.next=3,oe(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 F(t,s,new Headers({})));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function K(e,t){return Q.apply(this,arguments)}function Q(){return(Q=y(j.mark((function e(t,r){var n,o,s,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,G(t,null!=r?r:window.fetch);case 2:return n=e.sent,o=n.body,s=n.headers,e.next=7,oe(o,{documentUrl:t});case 7:return u=e.sent,e.abrupt("return",new F(t,u,s));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function V(e){var t=ne(e);return Object.entries(t).reduce((function(e,t){var r=b(t,2),n=r[0],o=r[1].map((function(e){return" "+Y(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(o,"\n}"))}),[]).join(" ;\n")}function Y(e){return(new x).quadsToString([e]).slice(0,-1)}function Z(e,t){return ee.apply(this,arguments)}function ee(){return(ee=y(j.mark((function e(t,r){var n;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,K(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 te(e){return re.apply(this,arguments)}function re(){return(re=y(j.mark((function e(t){var r,n,o,s=arguments;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>1&&void 0!==s[1]?s[1]:{},n=t.matchAll(/(\w+) DATA {([^}]+)}/g),o={},e.next=5,Promise.all(w(n).map(function(){var e=y(j.mark((function e(t){var n,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),s=t[2],e.next=4,oe(s,r);case 4:o[n]=e.sent;case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 5:return e.abrupt("return",o);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ne(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.matchAll(/(\w+) DATA {([^}]+)}/g),o={},s=$(n);try{for(s.s();!(t=s.n()).done;){var u=t.value,a=u[1].toLowerCase(),i=u[2];o[a]=ue(i,r)}}catch(e){s.e(e)}finally{s.f()}return o}function oe(e){return se.apply(this,arguments)}function se(){return(se=y(j.mark((function e(t){var r,n,o,s,a=arguments;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=a.length>1&&void 0!==a[1]?a[1]:{},n=u({baseIRI:r.documentUrl}),o=new g(n),s=[],e.abrupt("return",new Promise((function(e,n){o.parse(t,(function(t,o){var u;t?n(new P(null!==(u=r.documentUrl)&&void 0!==u?u:null,S.Turtle,t.message)):o?s.push(o):r.normalizeBlankNodes?e(W(s)):e(s)}))})));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ue(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=u({baseIRI:t.documentUrl}),n=new g(r);try{var o=n.parse(e);return t.normalizeBlankNodes?W(o):o}catch(e){var s;throw new P(null!==(s=t.documentUrl)&&void 0!==s?s:null,S.Turtle,e.message)}}function ae(e,t,r){return ie.apply(this,arguments)}function ie(){return(ie=y(j.mark((function e(t,r,n){var o;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch,e.next=3,n(t,{method:"PATCH",headers:{"Content-Type":"application/sparql-update"},body:r});case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ce(e,t){return le.apply(this,arguments)}function le(){return(le=y(j.mark((function e(t,r){var n,o,s,a,i,c,d,m,v,h,y,w,b,x;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return m=p(t),e.next=3,K(m,r);case 3:if((v=e.sent).isPersonalProfile()){e.next=6;break}throw new Error("Document at ".concat(m," is not a profile."));case 6:h=v.statements(t,"pim:storage").map((function(e){return e.object.value})),y=v.statement(t,"solid:publicTypeIndex"),w=v.statement(t,"solid:privateTypeIndex"),b=f(m);case 10:if(!b||0!==h.length){e.next=20;break}return e.next=13,l(K(b,r));case 13:if(null==(x=e.sent)||!x.isStorage()){e.next=17;break}return h.push(b),e.abrupt("break",20);case 17:b=f(b),e.next=10;break;case 20:return e.abrupt("return",u({webId:t,storageUrls:h,name:null!==(n=null===(o=v.statement(t,"vcard:fn"))||void 0===o?void 0:o.object.value)&&void 0!==n?n:null===(s=v.statement(t,"foaf:name"))||void 0===s?void 0:s.object.value,avatarUrl:null!==(a=null===(i=v.statement(t,"vcard:hasPhoto"))||void 0===i?void 0:i.object.value)&&void 0!==a?a:null===(c=v.statement(t,"foaf:img"))||void 0===c?void 0:c.object.value,oidcIssuerUrl:null===(d=v.statement(t,"solid:oidcIssuer"))||void 0===d?void 0:d.object.value,publicTypeIndexUrl:null==y?void 0:y.object.value,privateTypeIndexUrl:null==w?void 0:w.object.value}));case 21:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function fe(e,t){return pe.apply(this,arguments)}function pe(){return(pe=y(j.mark((function e(t,r){var n,o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=l((function(e){return ce(e,r)})),e.next=3,s(t);case 3:if(e.t2=o=e.sent,e.t1=null!==e.t2,!e.t1){e.next=7;break}e.t1=void 0!==o;case 7:if(!e.t1){e.next=11;break}e.t3=o,e.next=14;break;case 11:return e.next=13,s(t.replace(/\/$/,"").concat("/profile/card#me"));case 13:e.t3=e.sent;case 14:if(e.t4=n=e.t3,e.t0=null!==e.t4,!e.t0){e.next=18;break}e.t0=void 0!==n;case 18:if(!e.t0){e.next=22;break}e.t5=n,e.next=25;break;case 22:return e.next=24,s(d(t).concat("/profile/card#me"));case 24:e.t5=e.sent;case 25:return e.abrupt("return",e.t5);case 26:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function de(e,t){return me.apply(this,arguments)}function me(){return(me=y(j.mark((function e(t,r){var n,o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,o=t.storageUrls[0],s="".concat(o,"settings/privateTypeIndex"),e.next=5,Z(s,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(o,"settings/privateTypeIndex-").concat(m()),e.next=10;break;case 9:e.t0=s;case 10:return e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ve(e,t){return he.apply(this,arguments)}function he(){return(he=y(j.mark((function e(t,r){var n,o,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,e.next=3,de(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 "),X(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),e.abrupt("return",o);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ye(e,t,r){return je.apply(this,arguments)}function je(){return(je=y(j.mark((function e(t,r,n){var o,s,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,K(t,n);case 2:return s=e.sent,u=s.statements(void 0,"rdfs:type","solid:TypeRegistration").find((function(e){return s.contains(e.subject.value,"solid:forClass",r)&&s.contains(e.subject.value,"solid:instanceContainer")})),e.abrupt("return",u&&null!==(o=s.getThing(u.subject.value))&&void 0!==o?o:null);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function 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 be(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return be(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,u=!0,a=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return u=e.done,e},e:function(e){a=!0,s=e},f:function(){try{u||null==r.return||r.return()}finally{if(a)throw s}}}}function be(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var xe={};function ge(e){return/\[\[([^\]]+)\]\]/.test(e)}function ke(e,t){if(!ge(e))return e===t;if(!(e in xe)){var r,n=e.matchAll(/\[\[([^\]]+)\]\]/g),o=[],s=e,u=we(n);try{for(u.s();!(r=u.n()).done;){var a=r.value;o.push(a[1]),s=s.replace(a[0],"%PATTERN".concat(o.length-1,"%"))}}catch(e){u.e(e)}finally{u.f()}s=s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");for(var i=0,c=Object.entries(o);i<c.length;i++){var l=b(c[i],2),f=l[0],p=l[1];s=s.replace("%PATTERN".concat(f,"%"),p)}xe[e]=new RegExp(s)}return xe[e].test(t)}function Te(e,t){return function(e,t){if(e.termType!==t.termType)return!1;if("Literal"===e.termType&&"Literal"===t.termType){if(e.datatype.value!==t.datatype.value)return!1;if(!ge(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 ke(e.value,t.value)}(e.object,t.object)&&ke(e.subject.value,t.subject.value)&&ke(e.predicate.value,t.predicate.value)}function Ee(e,t){for(var r,n=ne(e,{normalizeBlankNodes:!0}),o=ne(t,{normalizeBlankNodes:!0}),s=function(r,n){return{success:r,message:n,expected:e,actual:t}},u=0,a=Object.keys(n);u<a.length;u++){var i=a[u];if(!(i in o))return s(!1,"Couldn't find expected ".concat(i," operation."));var c=v(n,i),l=v(o,i);if(c.length!==l.length)return s(!1,"Expected ".concat(c.length," ").concat(i," triples, found ").concat(l.length,"."));var f,p=we(c);try{var d=function(){var e=f.value;if(!l.some((function(t){return Te(e,t)})))return{v:s(!1,"Couldn't find the following ".concat(i," triple: ").concat(Y(e)))}};for(p.s();!(f=p.n()).done;){var m=d();if("object"===R(m))return m.v}}catch(e){p.e(e)}finally{p.f()}}var h=null!==(r=Object.keys(o)[0])&&void 0!==r?r:null;return h?s(!1,"Did not expect to find ".concat(h," triples.")):s(!0,"sparql matches")}function Re(e,t){var r=ue(e,{normalizeBlankNodes:!0}),n=ue(t,{normalizeBlankNodes:!0}),o=function(r,n){return{success:r,message:n,expected:e,actual:t}};if(r.length!==n.length)return o(!1,"Expected ".concat(r.length," triples, found ").concat(n.length,"."));var s,u=we(r);try{var a=function(){var e=s.value;if(!n.some((function(t){return Te(e,t)})))return{v:o(!1,"Couldn't find the following triple: ".concat(Y(e)))}};for(u.s();!(s=u.n()).done;){var i=a();if("object"===R(i))return i.v}}catch(e){u.e(e)}finally{u.f()}return o(!0,"turtle matches")}var Ae={sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=e,o=Ee(n,t);r(o.success,o.message,n,t)}};function Ie(){chai.use((function(e){return Object.entries(Ae).forEach((function(t){var r=b(t,2),n=r[0],o=r[1];return e.Assertion.addMethod(n,o)}))}))}var Se={toEqualSparql:function(e,t){var r=this,n=Ee(t,e),o=n.success,s=V(e),u=V(t);return{pass:o,message:o?function(){return[n.message,r.utils.matcherHint("toEqualSparql"),["Expected: not ".concat(r.utils.printExpected(u)),"Received: ".concat(r.utils.printReceived(s))].join("\n")].join("\n\n")}:function(){var e=A(u,s,{expand:r.expand});return[n.message,r.utils.matcherHint("toEqualJsonLD"),e&&e.includes("- Expect")?"Difference:\n\n".concat(e):["Expected: ".concat(r.utils.printExpected(u)),"Received: ".concat(r.utils.printReceived(s))].join("\n")].join("\n\n")}}}};function Pe(){expect.extend(Se)}export{P as MalformedSolidDocumentError,D as NetworkRequestError,q as NotFoundError,F as SolidDocument,S as SolidDocumentFormat,L as SolidThing,B as UnauthorizedError,ve as createPrivateTypeIndex,X as createSolidDocument,z as defineIRIPrefix,M as expandIRI,fe as fetchLoginUserProfile,K as fetchSolidDocument,ye as findContainerRegistration,Ie as installChaiPlugin,Pe as installJestPlugin,V as normalizeSparql,Y as quadToTurtle,Z as solidDocumentExists,Ee as sparqlEquals,te as sparqlToQuads,ne as sparqlToQuadsSync,Re as turtleEquals,oe as turtleToQuads,ue as turtleToQuadsSync,ae as updateSolidDocument};
|
|
1
|
+
import"core-js/modules/es.reflect.construct.js";import e from"@babel/runtime/helpers/esm/classCallCheck";import t from"@babel/runtime/helpers/esm/inherits";import r from"@babel/runtime/helpers/esm/possibleConstructorReturn";import n from"@babel/runtime/helpers/esm/getPrototypeOf";import"core-js/modules/es.array.concat.js";import{Error as o,parseDate as u,objectWithoutEmpty as s,arr as a,arrayFilter as c,arrayReplace as i,silenced as l,urlParentDirectory as f,urlRoute as p,urlRoot as d,uuid as m,pull as v}from"@noeldemartin/utils";import h from"@babel/runtime/helpers/esm/createClass";import y from"@babel/runtime/helpers/esm/asyncToGenerator";import j from"@babel/runtime/regenerator";import"core-js/modules/es.array.map.js";import"core-js/modules/es.regexp.exec.js";import"core-js/modules/es.string.replace.js";import"core-js/modules/es.function.name.js";import"core-js/modules/es.array.from.js";import"core-js/modules/es.symbol.js";import"core-js/modules/es.symbol.description.js";import"core-js/modules/es.symbol.iterator.js";import b from"@babel/runtime/helpers/esm/toConsumableArray";import w from"@babel/runtime/helpers/esm/slicedToArray";import"core-js/modules/es.array.slice.js";import"core-js/modules/es.array.filter.js";import"core-js/modules/es.array.flat-map.js";import"core-js/modules/es.array.unscopables.flat-map.js";import"core-js/modules/es.array.iterator.js";import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.set.js";import"core-js/modules/es.string.iterator.js";import"core-js/modules/esnext.set.add-all.js";import"core-js/modules/esnext.set.delete-all.js";import"core-js/modules/esnext.set.difference.js";import"core-js/modules/esnext.set.every.js";import"core-js/modules/esnext.set.filter.js";import"core-js/modules/esnext.set.find.js";import"core-js/modules/esnext.set.intersection.js";import"core-js/modules/esnext.set.is-disjoint-from.js";import"core-js/modules/esnext.set.is-subset-of.js";import"core-js/modules/esnext.set.is-superset-of.js";import"core-js/modules/esnext.set.join.js";import"core-js/modules/esnext.set.map.js";import"core-js/modules/esnext.set.reduce.js";import"core-js/modules/esnext.set.some.js";import"core-js/modules/esnext.set.symmetric-difference.js";import"core-js/modules/esnext.set.union.js";import"core-js/modules/web.dom-collections.iterator.js";import"core-js/modules/es.array.join.js";import"core-js/modules/es.object.entries.js";import"core-js/modules/es.string.match-all.js";import"core-js/modules/es.array.includes.js";import"core-js/modules/es.promise.js";import"core-js/modules/es.array.flat.js";import{Writer as x,Parser as g,BlankNode as k,Quad as T}from"n3";import{toRDF as E}from"jsonld";import R from"md5";import"core-js/modules/es.string.match.js";import"core-js/modules/es.array.find.js";import"core-js/modules/es.string.starts-with.js";import"core-js/modules/es.string.split.js";import A from"@babel/runtime/helpers/esm/typeof";import"core-js/modules/es.regexp.constructor.js";import"core-js/modules/es.regexp.to-string.js";import"core-js/modules/es.object.keys.js";import"core-js/modules/web.dom-collections.for-each.js";function I(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,u=n(e);if(t){var s=n(this).constructor;o=Reflect.construct(u,arguments,s)}else o=u.apply(this,arguments);return r(this,o)}}var S;!function(e){e.Turtle="Turtle"}(S||(S={}));var P=function(r){t(MalformedSolidDocumentError,o);var n=I(MalformedSolidDocumentError);function MalformedSolidDocumentError(t,r,o){var u;return e(this,MalformedSolidDocumentError),(u=n.call(this,function(e,t,r){return e?"Malformed ".concat(t," document found at ").concat(e," - ").concat(r):"Malformed ".concat(t," document - ").concat(r)}(t,r,o))).documentUrl=t,u.documentFormat=r,u.malformationDetails=o,u}return MalformedSolidDocumentError}();function U(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,u=n(e);if(t){var s=n(this).constructor;o=Reflect.construct(u,arguments,s)}else o=u.apply(this,arguments);return r(this,o)}}var q=function(r){t(NetworkRequestError,o);var n=U(NetworkRequestError);function NetworkRequestError(t){var r;return e(this,NetworkRequestError),(r=n.call(this,"Request failed trying to fetch ".concat(t))).url=t,r}return NetworkRequestError}();function 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 o,u=n(e);if(t){var s=n(this).constructor;o=Reflect.construct(u,arguments,s)}else o=u.apply(this,arguments);return r(this,o)}}var N=function(r){t(NotFoundError,o);var n=D(NotFoundError);function NotFoundError(t){var r;return e(this,NotFoundError),(r=n.call(this,"Document with '".concat(t,"' url not found"))).url=t,r}return NotFoundError}();function C(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var o,u=n(e);if(t){var s=n(this).constructor;o=Reflect.construct(u,arguments,s)}else o=u.apply(this,arguments);return r(this,o)}}var B=function(r){t(UnauthorizedError,o);var n=C(UnauthorizedError);function UnauthorizedError(t,r){var o;return e(this,UnauthorizedError),(o=n.call(this,function(e,t){return"Unauthorized".concat(403===t?" (Forbidden)":"",": ").concat(e)}(t,r))).url=t,o.responseStatus=r,o}return h(UnauthorizedError,[{key:"forbidden",get:function(){return void 0!==this.responseStatus?403===this.responseStatus:void 0}}]),UnauthorizedError}(),O={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 z(e,t){O[e]=t}function M(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.startsWith("http"))return e;var r=e.split(":"),n=w(r,2),o=n[0],u=n[1];if(u){var s,a,c,i=null!==(s=null!==(a=O[o])&&void 0!==a?a:null===(c=t.extraContext)||void 0===c?void 0:c[o])&&void 0!==s?s:null;if(!i)throw new Error("Can't expand IRI with unknown prefix: '".concat(e,"'"));return i+u}if(!t.defaultPrefix)throw new Error("Can't expand IRI without a default prefix: '".concat(e,"'"));return t.defaultPrefix+o}var L=function(){function t(r,n){e(this,t),this.url=r,this.quads=n}return h(t,[{key:"value",value:function(e){var t;return null===(t=this.quads.find((function(t){return t.predicate.value===M(e)})))||void 0===t?void 0:t.object.value}},{key:"values",value:function(e){return this.quads.filter((function(t){return t.predicate.value===M(e)})).map((function(e){return e.object.value}))}}]),t}(),F=function(){function t(r,n,o){e(this,t),this.url=r,this.quads=n,this.headers=o}return h(t,[{key:"isEmpty",value:function(){return 0===this.statements.length}},{key:"isPersonalProfile",value:function(){return!!this.statement(this.url,M("rdfs:type"),M("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!==M(r,{defaultPrefix:n.url})||e&&o.subject.value!==M(e,{defaultPrefix:n.url})||t&&o.predicate.value!==M(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!==M(r,{defaultPrefix:n.url})||e&&o.subject.value!==M(e,{defaultPrefix:n.url})||t&&o.predicate.value!==M(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 L(e,t)}},{key:"getLatestDocumentDate",value:function(){var e=[].concat(b(this.statements(void 0,"purl:modified")),b(this.statements(void 0,"purl:created"))).map((function(e){return 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 $(e){return"@graph"in e}function H(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 J(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 J(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 u,s=!0,a=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return s=e.done,e},e:function(e){a=!0,u=e},f:function(){try{s||null==r.return||r.return()}finally{if(a)throw u}}}}function J(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 _(e,t){return G.apply(this,arguments)}function G(){return(G=y(j.mark((function e(t,r){var n,o,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={headers:{Accept:"text/turtle"}},e.prev=1,e.next=4,r(t,n);case 4:if(404!==(o=e.sent).status){e.next=7;break}throw new N(t);case 7:if(![401,403].includes(o.status)){e.next=9;break}throw new B(t,o.status);case 9:return e.next=11,o.text();case 11:return u=e.sent,e.abrupt("return",{body:u,headers:o.headers});case 15:if(e.prev=15,e.t0=e.catch(1),!(e.t0 instanceof B)){e.next=19;break}throw e.t0;case 19:throw new q(t);case 20:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function W(e){var t,r=e.slice(0),n={},o=a(e).flatMap((function(e,t){var r,o=c(["BlankNode"===e.object.termType?e.object.value:null,"BlankNode"===e.subject.termType?e.subject.value:null]),u=H(o);try{for(u.s();!(r=u.n()).done;){var s,a=r.value;n[a]=null!==(s=n[a])&&void 0!==s?s:new Set,n[a].add(t)}}catch(e){u.e(e)}finally{u.f()}return o})).filter().unique(),u=H(o);try{var s=function(){var o,u=t.value,s=R(a(n[u]).map((function(t){return e[t]})).filter((function(e){var t=e.subject,r=t.termType,n=t.value;return"BlankNode"===r&&n===u})).map((function(e){var t=e.predicate,r=e.object;return"BlankNode"===r.termType?t.value:t.value+r.value})).sorted().join()),c=H(n[u]);try{for(c.s();!(o=c.n()).done;){for(var l=o.value,f=r[l],p={subject:f.subject,object:f.object},d=0,m=Object.entries(p);d<m.length;d++){var v=w(m[d],2),h=v[0],y=v[1];"BlankNode"===y.termType&&y.value===u&&(p[h]=new k(s))}i(r,f,new T(p.subject,f.predicate,p.object))}}catch(e){c.e(e)}finally{c.f()}};for(u.s();!(t=u.n()).done;)s()}catch(e){u.e(e)}finally{u.f()}return r}function X(e,t,r){return K.apply(this,arguments)}function K(){return(K=y(j.mark((function e(t,r,n){var o,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch,e.next=3,ce(r);case 3:return u=e.sent,e.next=6,n(t,{method:"PUT",headers:{"Content-Type":"text/turtle"},body:r});case 6:return e.abrupt("return",new F(t,u,new Headers({})));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Q(e,t){return V.apply(this,arguments)}function V(){return(V=y(j.mark((function e(t,r){var n,o,u,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,_(t,null!=r?r:window.fetch);case 2:return n=e.sent,o=n.body,u=n.headers,e.next=7,ce(o,{documentUrl:t});case 7:return s=e.sent,e.abrupt("return",new F(t,s,u));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Y(e){return Z.apply(this,arguments)}function Z(){return(Z=y(j.mark((function e(t){var r;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!$(t)){e.next=5;break}return e.next=3,Promise.all(t["@graph"].map(Y));case 3:return r=e.sent,e.abrupt("return",r.flat());case 5:return e.abrupt("return",E(t));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ee(e){var t=ae(e);return Object.entries(t).reduce((function(e,t){var r=w(t,2),n=r[0],o=r[1].map((function(e){return" "+re(e)})).sort().join("\n");return e.concat("".concat(n.toUpperCase()," DATA {\n").concat(o,"\n}"))}),[]).join(" ;\n")}function te(e){return(new x).quadsToString(e)}function re(e){return(new x).quadsToString([e]).slice(0,-1)}function ne(e,t){return oe.apply(this,arguments)}function oe(){return(oe=y(j.mark((function e(t,r){var n;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,Q(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 se.apply(this,arguments)}function se(){return(se=y(j.mark((function e(t){var r,n,o,u=arguments;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=u.length>1&&void 0!==u[1]?u[1]:{},n=t.matchAll(/(\w+) DATA {([^}]+)}/g),o={},e.next=5,Promise.all(b(n).map(function(){var e=y(j.mark((function e(t){var n,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[1].toLowerCase(),u=t[2],e.next=4,ce(u,r);case 4:o[n]=e.sent;case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 5:return e.abrupt("return",o);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ae(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.matchAll(/(\w+) DATA {([^}]+)}/g),o={},u=H(n);try{for(u.s();!(t=u.n()).done;){var s=t.value,a=s[1].toLowerCase(),c=s[2];o[a]=le(c,r)}}catch(e){u.e(e)}finally{u.f()}return o}function ce(e){return ie.apply(this,arguments)}function ie(){return(ie=y(j.mark((function e(t){var r,n,o,u,a=arguments;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=a.length>1&&void 0!==a[1]?a[1]:{},n=s({baseIRI:r.documentUrl}),o=new g(n),u=[],e.abrupt("return",new Promise((function(e,n){o.parse(t,(function(t,o){var s;t?n(new P(null!==(s=r.documentUrl)&&void 0!==s?s:null,S.Turtle,t.message)):o?u.push(o):r.normalizeBlankNodes?e(W(u)):e(u)}))})));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function le(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=s({baseIRI:t.documentUrl}),n=new g(r);try{var o=n.parse(e);return t.normalizeBlankNodes?W(o):o}catch(e){var u;throw new P(null!==(u=t.documentUrl)&&void 0!==u?u:null,S.Turtle,e.message)}}function fe(e,t,r){return pe.apply(this,arguments)}function pe(){return(pe=y(j.mark((function e(t,r,n){var o;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!==(o=n)&&void 0!==o?o:window.fetch,e.next=3,n(t,{method:"PATCH",headers:{"Content-Type":"application/sparql-update"},body:r});case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function de(e,t){return me.apply(this,arguments)}function me(){return(me=y(j.mark((function e(t,r){var n,o,u,a,c,i,d,m,v,h,y,b,w,x;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return m=p(t),e.next=3,Q(m,r);case 3:if((v=e.sent).isPersonalProfile()){e.next=6;break}throw new Error("Document at ".concat(m," is not a profile."));case 6:h=v.statements(t,"pim:storage").map((function(e){return e.object.value})),y=v.statement(t,"solid:publicTypeIndex"),b=v.statement(t,"solid:privateTypeIndex"),w=f(m);case 10:if(!w||0!==h.length){e.next=20;break}return e.next=13,l(Q(w,r));case 13:if(null==(x=e.sent)||!x.isStorage()){e.next=17;break}return h.push(w),e.abrupt("break",20);case 17:w=f(w),e.next=10;break;case 20:return e.abrupt("return",s({webId:t,storageUrls:h,name:null!==(n=null===(o=v.statement(t,"vcard:fn"))||void 0===o?void 0:o.object.value)&&void 0!==n?n:null===(u=v.statement(t,"foaf:name"))||void 0===u?void 0:u.object.value,avatarUrl:null!==(a=null===(c=v.statement(t,"vcard:hasPhoto"))||void 0===c?void 0:c.object.value)&&void 0!==a?a:null===(i=v.statement(t,"foaf:img"))||void 0===i?void 0:i.object.value,oidcIssuerUrl:null===(d=v.statement(t,"solid:oidcIssuer"))||void 0===d?void 0:d.object.value,publicTypeIndexUrl:null==y?void 0:y.object.value,privateTypeIndexUrl:null==b?void 0:b.object.value}));case 21:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ve(e,t){return he.apply(this,arguments)}function he(){return(he=y(j.mark((function e(t,r){var n,o,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return u=l((function(e){return de(e,r)})),e.next=3,u(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,u(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,u(d(t).concat("/profile/card#me"));case 24:e.t5=e.sent;case 25:return e.abrupt("return",e.t5);case 26:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ye(e,t){return je.apply(this,arguments)}function je(){return(je=y(j.mark((function e(t,r){var n,o,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,o=t.storageUrls[0],u="".concat(o,"settings/privateTypeIndex"),e.next=5,ne(u,r);case 5:if(!e.sent){e.next=9;break}e.t0="".concat(o,"settings/privateTypeIndex-").concat(m()),e.next=10;break;case 9:e.t0=u;case 10:return e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function be(e,t){return we.apply(this,arguments)}function we(){return(we=y(j.mark((function e(t,r){var n,o,u;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=null!==(n=r)&&void 0!==n?n:window.fetch,e.next=3,ye(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 ",u="\n INSERT DATA {\n <".concat(t.webId,"> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <").concat(o,"> .\n }\n "),X(o,"\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n ",r),fe(t.webId,u,r),e.abrupt("return",o);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function xe(e,t,r){return ge.apply(this,arguments)}function ge(){return(ge=y(j.mark((function e(t,r,n){var o,u,s;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Q(t,n);case 2:return u=e.sent,s=u.statements(void 0,"rdfs:type","solid:TypeRegistration").find((function(e){return u.contains(e.subject.value,"solid:forClass",r)&&u.contains(e.subject.value,"solid:instanceContainer")})),e.abrupt("return",s&&null!==(o=u.getThing(s.subject.value))&&void 0!==o?o:null);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ke(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 Te(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 Te(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 u,s=!0,a=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return s=e.done,e},e:function(e){a=!0,u=e},f:function(){try{s||null==r.return||r.return()}finally{if(a)throw u}}}}function Te(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var Ee={};function Re(e){return/\[\[(.*\]\[)?([^\]]+)\]\]/.test(e)}function Ae(e,t){if(!Re(e))return e===t;var r=[];if(!(e in Ee)){var n,o=e.matchAll(/\[\[((.*)\]\[)?([^\]]+)\]\]/g),u=[],s=e,a=ke(o);try{for(a.s();!(n=a.n()).done;){var c=n.value;c[2]&&r.push(c[2]),u.push(c[3]),s=s.replace(c[0],"%PATTERN".concat(u.length-1,"%"))}}catch(e){a.e(e)}finally{a.f()}s=s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");for(var i=0,l=Object.entries(u);i<l.length;i++){var f=w(l[i],2),p=f[0],d=f[1];s=s.replace("%PATTERN".concat(p,"%"),d)}Ee[e]=new RegExp(s)}return Ee[e].test(t)}function Ie(e,t){return function(e,t){if(e.termType!==t.termType)return!1;if("Literal"===e.termType&&"Literal"===t.termType){if(e.datatype.value!==t.datatype.value)return!1;if(!Re(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 Ae(e.value,t.value)}(e.object,t.object)&&Ae(e.subject.value,t.subject.value)&&Ae(e.predicate.value,t.predicate.value)}function Se(){Ee={}}function Pe(e,t){return Ue.apply(this,arguments)}function Ue(){return(Ue=y(j.mark((function e(t,r){var n,o,u,s,a,c,i,l,f;return j.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return Se(),e.next=3,Y(t);case 3:return n=e.sent,e.next=6,Y(r);case 6:if(o=e.sent,u=te(n),s=te(o),a=function(e,t){return{success:e,message:t,expected:u,actual:s}},n.length===o.length){e.next=12;break}return e.abrupt("return",a(!1,"Expected ".concat(n.length," triples, found ").concat(o.length,".")));case 12:c=ke(n),e.prev=13,l=function(){var e=i.value;if(!o.some((function(t){return Ie(e,t)})))return{v:a(!1,"Couldn't find the following triple: ".concat(re(e)))}},c.s();case 16:if((i=c.n()).done){e.next=22;break}if(f=l(),"object"!==A(f)){e.next=20;break}return e.abrupt("return",f.v);case 20:e.next=16;break;case 22:e.next=27;break;case 24:e.prev=24,e.t0=e.catch(13),c.e(e.t0);case 27:return e.prev=27,c.f(),e.finish(27);case 30:return e.abrupt("return",a(!0,"jsonld matches"));case 31:case"end":return e.stop()}}),e,null,[[13,24,27,30]])})))).apply(this,arguments)}function qe(e,t){var r;Se();for(var n=ae(e,{normalizeBlankNodes:!0}),o=ae(t,{normalizeBlankNodes:!0}),u=function(r,n){return{success:r,message:n,expected:e,actual:t}},s=0,a=Object.keys(n);s<a.length;s++){var c=a[s];if(!(c in o))return u(!1,"Couldn't find expected ".concat(c," operation."));var i=v(n,c),l=v(o,c);if(i.length!==l.length)return u(!1,"Expected ".concat(i.length," ").concat(c," triples, found ").concat(l.length,"."));var f,p=ke(i);try{var d=function(){var e=f.value;if(!l.some((function(t){return Ie(e,t)})))return{v:u(!1,"Couldn't find the following ".concat(c," triple: ").concat(re(e)))}};for(p.s();!(f=p.n()).done;){var m=d();if("object"===A(m))return m.v}}catch(e){p.e(e)}finally{p.f()}}var h=null!==(r=Object.keys(o)[0])&&void 0!==r?r:null;return h?u(!1,"Did not expect to find ".concat(h," triples.")):u(!0,"sparql matches")}function De(e,t){Se();var r=le(e,{normalizeBlankNodes:!0}),n=le(t,{normalizeBlankNodes:!0}),o=function(r,n){return{success:r,message:n,expected:e,actual:t}};if(r.length!==n.length)return o(!1,"Expected ".concat(r.length," triples, found ").concat(n.length,"."));var u,s=ke(r);try{var a=function(){var e=u.value;if(!n.some((function(t){return Ie(e,t)})))return{v:o(!1,"Couldn't find the following triple: ".concat(re(e)))}};for(s.s();!(u=s.n()).done;){var c=a();if("object"===A(c))return c.v}}catch(e){s.e(e)}finally{s.f()}return o(!0,"turtle matches")}var Ne={turtle:function(e){var t=this._obj,r=this.assert.bind(this),n=De(e,t);r(n.success,n.message,"",n.expected,n.actual)},sparql:function(e){var t=this._obj,r=this.assert.bind(this),n=qe(e,t);r(n.success,n.message,"",n.expected,n.actual)}};function Ce(){chai.use((function(e){return Object.entries(Ne).forEach((function(t){var r=w(t,2),n=r[0],o=r[1];return e.Assertion.addMethod(n,o)}))}))}function Be(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 Oe={toEqualJsonLD:function(e,t){var r=this;return y(j.mark((function n(){var o;return j.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,Pe(t,e);case 2:return o=n.sent,n.abrupt("return",Be(o,{context:r,hint:"toEqualJsonLD",expected:t,received:e}));case 4:case"end":return n.stop()}}),n)})))()},toEqualSparql:function(e,t){return Be(qe(t,e),{context:this,hint:"toEqualSparql",expected:ee(t),received:ee(e)})}};function ze(){expect.extend(Oe)}export{P as MalformedSolidDocumentError,q as NetworkRequestError,N as NotFoundError,F as SolidDocument,S as SolidDocumentFormat,L as SolidThing,B as UnauthorizedError,be as createPrivateTypeIndex,X as createSolidDocument,z as defineIRIPrefix,M as expandIRI,ve as fetchLoginUserProfile,Q as fetchSolidDocument,xe as findContainerRegistration,Ce as installChaiPlugin,ze as installJestPlugin,$ as isJsonLDGraph,Pe as jsonldEquals,Y as jsonldToQuads,ee as normalizeSparql,re as quadToTurtle,te as quadsToTurtle,ne as solidDocumentExists,qe as sparqlEquals,ue as sparqlToQuads,ae as sparqlToQuadsSync,De as turtleEquals,ce as turtleToQuads,le as turtleToQuadsSync,fe 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/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","import { arr, arrayFilter, arrayReplace,objectWithoutEmpty } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';\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';\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 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 quadToTurtle(quad: Quad): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, fetch?: Fetch): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, fetch);\n\n return !document.isEmpty();\n } catch (error) {\n return false;\n }\n}\n\nexport async function sparqlToQuads(\n sparql: string,\n options: Partial<ParsingOptions> = {},\n): Promise<Record<string, Quad[]>> {\n const operations = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all([...operations].map(async operation => {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = await turtleToQuads(operationBody, options);\n }));\n\n return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n for (const operation of operations) {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = turtleToQuadsSync(operationBody, options);\n }\n\n return quads;\n}\n\nexport async function turtleToQuads(turtle: string, options: Partial<ParsingOptions> = {}): Promise<Quad[]> {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n const quads: Quad[] = [];\n\n return new Promise((resolve, reject) => {\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(\n options.documentUrl ?? null,\n SolidDocumentFormat.Turtle,\n error.message,\n ),\n );\n return;\n }\n\n if (!quad) {\n options.normalizeBlankNodes\n ? resolve(normalizeBlankNodes(quads))\n : resolve(quads);\n\n return;\n }\n\n quads.push(quad);\n });\n });\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes\n ? normalizeBlankNodes(quads)\n : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(options.documentUrl ?? null, SolidDocumentFormat.Turtle, error.message);\n }\n}\n\nexport async function updateSolidDocument(url: string, body: string, fetch?: Fetch): Promise<void> {\n fetch = fetch ?? window.fetch;\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n","import { objectWithoutEmpty, silenced, urlParentDirectory, urlRoot, urlRoute } from '@noeldemartin/utils';\n\nimport { fetchSolidDocument } from './io';\nimport type { Fetch } from './io';\n\nexport interface SolidUserProfile {\n webId: string;\n storageUrls: string[];\n name?: string;\n avatarUrl?: string;\n oidcIssuerUrl?: string;\n publicTypeIndexUrl?: string;\n privateTypeIndexUrl?: string;\n}\n\nasync function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUserProfile> {\n const documentUrl = urlRoute(webId);\n const document = await fetchSolidDocument(documentUrl, fetch);\n\n if (!document.isPersonalProfile())\n throw new Error(`Document at ${documentUrl} is not a profile.`);\n\n const storageUrls = document.statements(webId, 'pim:storage').map(storage => storage.object.value);\n const publicTypeIndex = document.statement(webId, 'solid:publicTypeIndex');\n const privateTypeIndex = document.statement(webId, 'solid:privateTypeIndex');\n\n let parentUrl = urlParentDirectory(documentUrl);\n while (parentUrl && storageUrls.length === 0) {\n const parentDocument = await silenced(fetchSolidDocument(parentUrl, fetch));\n\n if (parentDocument?.isStorage()) {\n storageUrls.push(parentUrl);\n\n break;\n }\n\n parentUrl = urlParentDirectory(parentUrl);\n }\n\n return objectWithoutEmpty({\n webId,\n storageUrls,\n name:\n document.statement(webId, 'vcard:fn')?.object.value ??\n document.statement(webId, 'foaf:name')?.object.value,\n avatarUrl:\n document.statement(webId, 'vcard:hasPhoto')?.object.value ??\n document.statement(webId, 'foaf:img')?.object.value,\n oidcIssuerUrl: document.statement(webId, 'solid:oidcIssuer')?.object.value,\n publicTypeIndexUrl: publicTypeIndex?.object.value,\n privateTypeIndexUrl: privateTypeIndex?.object.value,\n });\n}\n\nexport async function fetchLoginUserProfile(loginUrl: string, fetch?: Fetch): Promise<SolidUserProfile | null> {\n const fetchProfile = silenced(url => fetchUserProfile(url, fetch));\n\n return await fetchProfile(loginUrl)\n ?? await fetchProfile(loginUrl.replace(/\\/$/, '').concat('/profile/card#me'))\n ?? await fetchProfile(urlRoot(loginUrl).concat('/profile/card#me'));\n}\n","import { uuid } from '@noeldemartin/utils';\n\nimport { createSolidDocument, fetchSolidDocument, solidDocumentExists, updateSolidDocument } from '@/helpers/io';\nimport type SolidThing from '@/models/SolidThing';\nimport type { Fetch } from '@/helpers/io';\nimport type { SolidUserProfile } from '@/helpers/auth';\n\nasync function mintPrivateTypeIndexUrl(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const storageUrl = user.storageUrls[0];\n const typeIndexUrl = `${storageUrl}settings/privateTypeIndex`;\n\n return await solidDocumentExists(typeIndexUrl, fetch)\n ? `${storageUrl}settings/privateTypeIndex-${uuid()}`\n : typeIndexUrl;\n}\n\nexport async function createPrivateTypeIndex(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const typeIndexUrl = await mintPrivateTypeIndexUrl(user, fetch);\n const typeIndexBody = `\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n `;\n const profileUpdateBody = `\n INSERT DATA {\n <${user.webId}> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <${typeIndexUrl}> .\n }\n `;\n\n createSolidDocument(typeIndexUrl, typeIndexBody, fetch);\n updateSolidDocument(user.webId, profileUpdateBody, fetch);\n\n return typeIndexUrl;\n}\n\nexport async function findContainerRegistration(\n typeIndexUrl: string,\n childrenType: string,\n fetch?: Fetch,\n): Promise<SolidThing | null> {\n const typeIndex = await fetchSolidDocument(typeIndexUrl, fetch);\n const containerQuad = typeIndex\n .statements(undefined, 'rdfs:type', 'solid:TypeRegistration')\n .find(\n statement =>\n typeIndex.contains(statement.subject.value, 'solid:forClass', childrenType) &&\n typeIndex.contains(statement.subject.value, 'solid:instanceContainer'),\n );\n\n return containerQuad\n ? typeIndex.getThing(containerQuad.subject.value) ?? null\n : null;\n}\n","import { pull } from '@noeldemartin/utils';\nimport type { Quad, Quad_Object } from 'rdf-js';\n\nimport { quadToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';\n\nconst patternRegExps: Record<string, RegExp> = {};\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n if (!containsPatterns(expected))\n return expected === actual;\n\n if (!(expected in patternRegExps)) {\n const patternMatches = expected.matchAll(/\\[\\[([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n patterns.push(patternMatch[1]);\n\n expectedRegExp = expectedRegExp.replace(patternMatch[0], `%PATTERN${patterns.length - 1}%`);\n }\n\n expectedRegExp = expectedRegExp.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\n for (const [patternIndex, pattern] of Object.entries(patterns)) {\n expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, pattern);\n }\n\n patternRegExps[expected] = new RegExp(expectedRegExp);\n }\n\n return patternRegExps[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\nexport interface EqualityResult {\n success: boolean;\n message: string;\n expected: string;\n actual: string;\n}\n\nexport function sparqlEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n\n const expectedOperations = sparqlToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualOperations = sparqlToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n for (const operation of Object.keys(expectedOperations)) {\n if (!(operation in actualOperations))\n return result(false, `Couldn't find expected ${operation} operation.`);\n\n const expectedQuads = pull(expectedOperations, operation);\n const actualQuads = pull(actualOperations, operation);\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} ${operation} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following ${operation} triple: ${quadToTurtle(expectedQuad)}`);\n }\n }\n\n const unexpectedOperation = Object.keys(actualOperations)[0] ?? null;\n if (unexpectedOperation)\n return result(false, `Did not expect to find ${unexpectedOperation} triples.`);\n\n return result(true, 'sparql matches');\n}\n\nexport function turtleEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n\n const expectedQuads = turtleToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualQuads = turtleToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n return result(true, 'turtle matches');\n}\n","import { sparqlEquals } 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 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, expected, actual);\n },\n};\n\nexport default assertions;\n","import assertions from './assertions';\n\nexport function installChaiPlugin(): void {\n chai.use(_chai => Object.entries(assertions).forEach(([name, method]) => _chai.Assertion.addMethod(name, method)));\n}\n","import diff from 'jest-diff';\n\nimport { normalizeSparql } from '@/helpers/io';\nimport { sparqlEquals } from '@/helpers/testing';\n\nconst matchers: jest.ExpectExtendMap = {\n toEqualSparql(received, expected) {\n const result = sparqlEquals(expected, received);\n const pass = result.success;\n const normalizedReceived = normalizeSparql(received);\n const normalizedExpected = normalizeSparql(expected);\n const message = pass\n ? () => [\n result.message,\n this.utils.matcherHint('toEqualSparql'),\n [\n `Expected: not ${this.utils.printExpected(normalizedExpected)}`,\n `Received: ${this.utils.printReceived(normalizedReceived)}`,\n ].join('\\n'),\n ].join('\\n\\n')\n : () => {\n const diffString = diff(normalizedExpected, normalizedReceived, {\n expand: this.expand,\n });\n\n return [\n result.message,\n this.utils.matcherHint('toEqualJsonLD'),\n diffString && diffString.includes('- Expect')\n ? `Difference:\\n\\n${diffString}`\n : [\n `Expected: ${this.utils.printExpected(normalizedExpected)}`,\n `Received: ${this.utils.printReceived(normalizedReceived)}`,\n ].join('\\n'),\n ].join('\\n\\n');\n };\n\n return { pass, message };\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","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","normalizeSparql","sparql","sparqlToQuadsSync","normalizedOperations","operation","quadToTurtle","sort","concat","toUpperCase","TurtleWriter","quadsToString","solidDocumentExists","document","isEmpty","sparqlToQuads","operations","matchAll","Promise","all","_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","patternRegExps","containsPatterns","test","quadValueEquals","expected","actual","patternMatches","patterns","expectedRegExp","patternMatch","patternIndex","pattern","RegExp","quadEquals","datatype","Date","getTime","quadObjectEquals","sparqlEquals","expectedOperations","actualOperations","result","success","keys","expectedQuads","pull","actualQuads","expectedQuad","some","actualQuad","unexpectedOperation","turtleEquals","assertions","query","_obj","assert","bind","installChaiPlugin","chai","use","_chai","forEach","Assertion","addMethod","matchers","toEqualSparql","received","pass","normalizedReceived","normalizedExpected","utils","matcherHint","printExpected","printReceived","diffString","diff","expand","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/SolidDocument.ts","../src/helpers/jsonld.ts","../src/helpers/io.ts","../src/helpers/auth.ts","../src/helpers/interop.ts","../src/helpers/testing.ts","../src/plugins/chai/assertions.ts","../src/plugins/chai/index.ts","../src/plugins/jest/matchers.ts","../src/plugins/jest/index.ts"],"sourcesContent":["import { Error } from '@noeldemartin/utils';\n\nfunction errorMessage(\n documentUrl: string | null,\n documentFormat: SolidDocumentFormat,\n malformationDetails: string,\n): string {\n return documentUrl\n ? `Malformed ${documentFormat} document found at ${documentUrl} - ${malformationDetails}`\n : `Malformed ${documentFormat} document - ${malformationDetails}`;\n}\n\nexport enum SolidDocumentFormat {\n Turtle = 'Turtle',\n}\n\nexport default class MalformedSolidDocumentError extends Error {\n\n public readonly documentUrl: string | null;\n public readonly documentFormat: SolidDocumentFormat;\n public readonly malformationDetails: string;\n\n constructor(documentUrl: string | null, documentFormat: SolidDocumentFormat, malformationDetails: string) {\n super(errorMessage(documentUrl, documentFormat, malformationDetails));\n\n this.documentUrl = documentUrl;\n this.documentFormat = documentFormat;\n this.malformationDetails = malformationDetails;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NetworkRequestError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Request failed trying to fetch ${url}`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nexport default class NotFoundError extends Error {\n\n public readonly url: string;\n\n constructor(url: string) {\n super(`Document with '${url}' url not found`);\n\n this.url = url;\n }\n\n}\n","import { Error } from '@noeldemartin/utils';\n\nfunction errorMessage(url: string, responseStatus?: number): string {\n const typeInfo = responseStatus === 403 ? ' (Forbidden)' : '';\n\n return `Unauthorized${typeInfo}: ${url}`;\n}\n\nexport default class UnauthorizedError extends Error {\n\n public readonly url: string;\n public readonly responseStatus?: number;\n\n constructor(url: string, responseStatus?: number) {\n super(errorMessage(url, responseStatus));\n\n this.url = url;\n this.responseStatus = responseStatus;\n }\n\n public get forbidden(): boolean | undefined {\n return typeof this.responseStatus !== 'undefined'\n ? this.responseStatus === 403\n : undefined;\n }\n\n}\n","export type RDFContext = Record<string, string>;\n\nexport interface ExpandIRIOptions {\n defaultPrefix: string;\n extraContext: RDFContext;\n}\n\nconst knownPrefixes: RDFContext = {\n foaf: 'http://xmlns.com/foaf/0.1/',\n pim: 'http://www.w3.org/ns/pim/space#',\n purl: 'http://purl.org/dc/terms/',\n rdfs: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\n schema: 'https://schema.org/',\n solid: 'http://www.w3.org/ns/solid/terms#',\n vcard: 'http://www.w3.org/2006/vcard/ns#',\n};\n\nexport function defineIRIPrefix(name: string, value: string): void {\n knownPrefixes[name] = value;\n}\n\nexport function expandIRI(iri: string, options: Partial<ExpandIRIOptions> = {}): string {\n if (iri.startsWith('http'))\n return iri;\n\n const [prefix, name] = iri.split(':');\n\n if (name) {\n const expandedPrefix = knownPrefixes[prefix] ?? options.extraContext?.[prefix] ?? null;\n\n if (!expandedPrefix)\n throw new Error(`Can't expand IRI with unknown prefix: '${iri}'`);\n\n return expandedPrefix + name;\n }\n\n if (!options.defaultPrefix)\n throw new Error(`Can't expand IRI without a default prefix: '${iri}'`);\n\n return options.defaultPrefix + prefix;\n}\n","import type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nexport default class SolidThing {\n\n public readonly url: string;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[]) {\n this.url = url;\n this.quads = quads;\n }\n\n public value(property: string): string | undefined {\n return this.quads\n .find(quad => quad.predicate.value === expandIRI(property))\n ?.object.value;\n }\n\n public values(property: string): string[] {\n return this.quads\n .filter(quad => quad.predicate.value === expandIRI(property))\n .map(quad => quad.object.value);\n }\n\n}\n","import { parseDate } from '@noeldemartin/utils';\nimport type { Quad } from 'rdf-js';\n\nimport { expandIRI } from '@/helpers/vocabs';\n\nimport SolidThing from './SolidThing';\n\nexport default class SolidDocument {\n\n public readonly url: string;\n public readonly headers: Headers;\n private quads: Quad[];\n\n public constructor(url: string, quads: Quad[], headers: Headers) {\n this.url = url;\n this.quads = quads;\n this.headers = headers;\n }\n\n public isEmpty(): boolean {\n return this.statements.length === 0;\n }\n\n public isPersonalProfile(): boolean {\n return !!this.statement(\n this.url,\n expandIRI('rdfs:type'),\n expandIRI('foaf:PersonalProfileDocument'),\n );\n }\n\n public isStorage(): boolean {\n return !!this.headers.get('Link')?.match(/<http:\\/\\/www\\.w3\\.org\\/ns\\/pim\\/space#Storage>;[^,]+rel=\"type\"/);\n }\n\n public getLastModified(): Date | null {\n return parseDate(this.headers.get('last-modified'))\n ?? parseDate(this.statement(this.url, 'purl:modified')?.object.value)\n ?? this.getLatestDocumentDate()\n ?? null;\n }\n\n public statements(subject?: string, predicate?: string, object?: string): Quad[] {\n return this.quads.filter(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n }\n\n public statement(subject?: string, predicate?: string, object?: string): Quad | null {\n const statement = this.quads.find(\n statement =>\n (!object || statement.object.value === expandIRI(object, { defaultPrefix: this.url })) &&\n (!subject || statement.subject.value === expandIRI(subject, { defaultPrefix: this.url })) &&\n (!predicate || statement.predicate.value === expandIRI(predicate, { defaultPrefix: this.url })),\n );\n\n return statement ?? null;\n }\n\n public contains(subject: string, predicate?: string, object?: string): boolean {\n return this.statement(subject, predicate, object) !== null;\n }\n\n public getThing(subject: string): SolidThing {\n const statements = this.statements(subject);\n\n return new SolidThing(subject, statements);\n }\n\n private getLatestDocumentDate(): Date | null {\n const dates = [\n ...this.statements(undefined, 'purl:modified'),\n ...this.statements(undefined, 'purl:created'),\n ]\n .map(statement => parseDate(statement.object.value))\n .filter((date): date is Date => date !== null);\n\n return dates.length > 0 ? dates.reduce((a, b) => a > b ? a : b) : null;\n }\n\n}\n","export type JsonLD = Partial<{\n '@context': Record<string, unknown>;\n '@id': string;\n '@type': null | string | string[];\n}> & { [k: string]: unknown };\n\nexport type JsonLDResource = Omit<JsonLD, '@id'> & { '@id': string };\nexport type JsonLDGraph = { '@graph': JsonLDResource[] };\n\nexport function isJsonLDGraph(jsonld: JsonLD): jsonld is JsonLDGraph {\n return '@graph' in jsonld;\n}\n","import { arr, arrayFilter, arrayReplace,objectWithoutEmpty } from '@noeldemartin/utils';\nimport { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';\nimport type { JsonLdDocument } from 'jsonld';\nimport { toRDF } from 'jsonld';\nimport md5 from 'md5';\nimport type { Quad } from 'rdf-js';\nimport type { Term as N3Term } from 'n3';\n\nimport SolidDocument from '@/models/SolidDocument';\n\nimport MalformedSolidDocumentError, { SolidDocumentFormat } from '@/errors/MalformedSolidDocumentError';\nimport NetworkRequestError from '@/errors/NetworkRequestError';\nimport NotFoundError from '@/errors/NotFoundError';\nimport UnauthorizedError from '@/errors/UnauthorizedError';\nimport { isJsonLDGraph } from '@/helpers/jsonld';\nimport type { JsonLD } from '@/helpers/jsonld';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type AnyFetch = (input: any, options?: any) => Promise<any>;\nexport declare type TypedFetch = (input: RequestInfo, options?: RequestInit) => Promise<Response>;\nexport declare type Fetch = TypedFetch | AnyFetch;\n\nasync function fetchRawSolidDocument(url: string, fetch: Fetch): Promise<{ body: string; headers: Headers }> {\n const options = {\n headers: { Accept: 'text/turtle' },\n };\n\n try {\n const response = await fetch(url, options);\n\n if (response.status === 404)\n throw new NotFoundError(url);\n\n if ([401, 403].includes(response.status))\n throw new UnauthorizedError(url, response.status);\n\n const body = await response.text();\n\n return {\n body,\n headers: response.headers,\n };\n } catch (error) {\n if (error instanceof UnauthorizedError)\n throw error;\n\n throw new NetworkRequestError(url);\n }\n}\n\nfunction normalizeBlankNodes(quads: Quad[]): Quad[] {\n const normalizedQuads = quads.slice(0);\n const quadsIndexes: Record<string, Set<number>> = {};\n const blankNodeIds = arr(quads)\n .flatMap((quad, index) => {\n const ids = arrayFilter([\n quad.object.termType === 'BlankNode' ? quad.object.value : null,\n quad.subject.termType === 'BlankNode' ? quad.subject.value : null,\n ]);\n\n for (const id of ids) {\n quadsIndexes[id] = quadsIndexes[id] ?? new Set();\n quadsIndexes[id].add(index);\n }\n\n return ids;\n })\n .filter()\n .unique();\n\n for (const originalId of blankNodeIds) {\n const normalizedId = md5(\n arr(quadsIndexes[originalId])\n .map(index => quads[index])\n .filter(({ subject: { termType, value } }) => termType === 'BlankNode' && value === originalId)\n .map(\n ({ predicate, object }) => object.termType === 'BlankNode'\n ? predicate.value\n : predicate.value + object.value,\n )\n .sorted()\n .join(),\n );\n\n for (const index of quadsIndexes[originalId]) {\n const quad = normalizedQuads[index];\n const terms: Record<string, N3Term> = { subject: quad.subject as N3Term, object: quad.object as N3Term };\n\n for (const [termName, termValue] of Object.entries(terms)) {\n if (termValue.termType !== 'BlankNode' || termValue.value !== originalId)\n continue;\n\n terms[termName] = new N3BlankNode(normalizedId);\n }\n\n arrayReplace(normalizedQuads, quad, new N3Quad(terms.subject, quad.predicate as N3Term, terms.object));\n }\n }\n\n return normalizedQuads;\n}\n\nexport interface ParsingOptions {\n documentUrl: string;\n normalizeBlankNodes: boolean;\n}\n\nexport async function createSolidDocument(url: string, body: string, fetch?: Fetch): Promise<SolidDocument> {\n fetch = fetch ?? window.fetch;\n\n const statements = await turtleToQuads(body);\n\n await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/turtle' },\n body,\n });\n\n return new SolidDocument(url, statements, new Headers({}));\n}\n\nexport async function fetchSolidDocument(url: string, fetch?: Fetch): Promise<SolidDocument> {\n const { body: data, headers } = await fetchRawSolidDocument(url, fetch ?? window.fetch);\n const statements = await turtleToQuads(data, { documentUrl: url });\n\n return new SolidDocument(url, statements, headers);\n}\n\nexport async function jsonldToQuads(jsonld: JsonLD): Promise<Quad[]> {\n if (isJsonLDGraph(jsonld)) {\n const graphQuads = await Promise.all(jsonld['@graph'].map(jsonldToQuads));\n\n return graphQuads.flat();\n }\n\n return toRDF(jsonld as JsonLdDocument) as Promise<Quad[]>;\n}\n\nexport function normalizeSparql(sparql: string): string {\n const quads = sparqlToQuadsSync(sparql);\n\n return Object\n .entries(quads)\n .reduce((normalizedOperations, [operation, quads]) => {\n const normalizedQuads = quads.map(quad => ' ' + quadToTurtle(quad)).sort().join('\\n');\n\n return normalizedOperations.concat(`${operation.toUpperCase()} DATA {\\n${normalizedQuads}\\n}`);\n }, [] as string[])\n .join(' ;\\n');\n}\n\nexport function quadsToTurtle(quads: Quad[]): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString(quads);\n}\n\nexport function quadToTurtle(quad: Quad): string {\n const writer = new TurtleWriter;\n\n return writer.quadsToString([quad]).slice(0, -1);\n}\n\nexport async function solidDocumentExists(url: string, fetch?: Fetch): Promise<boolean> {\n try {\n const document = await fetchSolidDocument(url, fetch);\n\n return !document.isEmpty();\n } catch (error) {\n return false;\n }\n}\n\nexport async function sparqlToQuads(\n sparql: string,\n options: Partial<ParsingOptions> = {},\n): Promise<Record<string, Quad[]>> {\n const operations = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n await Promise.all([...operations].map(async operation => {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = await turtleToQuads(operationBody, options);\n }));\n\n return quads;\n}\n\nexport function sparqlToQuadsSync(sparql: string, options: Partial<ParsingOptions> = {}): Record<string, Quad[]> {\n const operations = sparql.matchAll(/(\\w+) DATA {([^}]+)}/g);\n const quads: Record<string, Quad[]> = {};\n\n for (const operation of operations) {\n const operationName = operation[1].toLowerCase();\n const operationBody = operation[2];\n\n quads[operationName] = turtleToQuadsSync(operationBody, options);\n }\n\n return quads;\n}\n\nexport async function turtleToQuads(turtle: string, options: Partial<ParsingOptions> = {}): Promise<Quad[]> {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n const quads: Quad[] = [];\n\n return new Promise((resolve, reject) => {\n parser.parse(turtle, (error, quad) => {\n if (error) {\n reject(\n new MalformedSolidDocumentError(\n options.documentUrl ?? null,\n SolidDocumentFormat.Turtle,\n error.message,\n ),\n );\n return;\n }\n\n if (!quad) {\n options.normalizeBlankNodes\n ? resolve(normalizeBlankNodes(quads))\n : resolve(quads);\n\n return;\n }\n\n quads.push(quad);\n });\n });\n}\n\nexport function turtleToQuadsSync(turtle: string, options: Partial<ParsingOptions> = {}): Quad[] {\n const parserOptions = objectWithoutEmpty({ baseIRI: options.documentUrl });\n const parser = new TurtleParser(parserOptions);\n\n try {\n const quads = parser.parse(turtle);\n\n return options.normalizeBlankNodes\n ? normalizeBlankNodes(quads)\n : quads;\n } catch (error) {\n throw new MalformedSolidDocumentError(options.documentUrl ?? null, SolidDocumentFormat.Turtle, error.message);\n }\n}\n\nexport async function updateSolidDocument(url: string, body: string, fetch?: Fetch): Promise<void> {\n fetch = fetch ?? window.fetch;\n\n await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body,\n });\n}\n","import { objectWithoutEmpty, silenced, urlParentDirectory, urlRoot, urlRoute } from '@noeldemartin/utils';\n\nimport { fetchSolidDocument } from './io';\nimport type { Fetch } from './io';\n\nexport interface SolidUserProfile {\n webId: string;\n storageUrls: string[];\n name?: string;\n avatarUrl?: string;\n oidcIssuerUrl?: string;\n publicTypeIndexUrl?: string;\n privateTypeIndexUrl?: string;\n}\n\nasync function fetchUserProfile(webId: string, fetch?: Fetch): Promise<SolidUserProfile> {\n const documentUrl = urlRoute(webId);\n const document = await fetchSolidDocument(documentUrl, fetch);\n\n if (!document.isPersonalProfile())\n throw new Error(`Document at ${documentUrl} is not a profile.`);\n\n const storageUrls = document.statements(webId, 'pim:storage').map(storage => storage.object.value);\n const publicTypeIndex = document.statement(webId, 'solid:publicTypeIndex');\n const privateTypeIndex = document.statement(webId, 'solid:privateTypeIndex');\n\n let parentUrl = urlParentDirectory(documentUrl);\n while (parentUrl && storageUrls.length === 0) {\n const parentDocument = await silenced(fetchSolidDocument(parentUrl, fetch));\n\n if (parentDocument?.isStorage()) {\n storageUrls.push(parentUrl);\n\n break;\n }\n\n parentUrl = urlParentDirectory(parentUrl);\n }\n\n return objectWithoutEmpty({\n webId,\n storageUrls,\n name:\n document.statement(webId, 'vcard:fn')?.object.value ??\n document.statement(webId, 'foaf:name')?.object.value,\n avatarUrl:\n document.statement(webId, 'vcard:hasPhoto')?.object.value ??\n document.statement(webId, 'foaf:img')?.object.value,\n oidcIssuerUrl: document.statement(webId, 'solid:oidcIssuer')?.object.value,\n publicTypeIndexUrl: publicTypeIndex?.object.value,\n privateTypeIndexUrl: privateTypeIndex?.object.value,\n });\n}\n\nexport async function fetchLoginUserProfile(loginUrl: string, fetch?: Fetch): Promise<SolidUserProfile | null> {\n const fetchProfile = silenced(url => fetchUserProfile(url, fetch));\n\n return await fetchProfile(loginUrl)\n ?? await fetchProfile(loginUrl.replace(/\\/$/, '').concat('/profile/card#me'))\n ?? await fetchProfile(urlRoot(loginUrl).concat('/profile/card#me'));\n}\n","import { uuid } from '@noeldemartin/utils';\n\nimport { createSolidDocument, fetchSolidDocument, solidDocumentExists, updateSolidDocument } from '@/helpers/io';\nimport type SolidThing from '@/models/SolidThing';\nimport type { Fetch } from '@/helpers/io';\nimport type { SolidUserProfile } from '@/helpers/auth';\n\nasync function mintPrivateTypeIndexUrl(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const storageUrl = user.storageUrls[0];\n const typeIndexUrl = `${storageUrl}settings/privateTypeIndex`;\n\n return await solidDocumentExists(typeIndexUrl, fetch)\n ? `${storageUrl}settings/privateTypeIndex-${uuid()}`\n : typeIndexUrl;\n}\n\nexport async function createPrivateTypeIndex(user: SolidUserProfile, fetch?: Fetch): Promise<string> {\n fetch = fetch ?? window.fetch;\n\n const typeIndexUrl = await mintPrivateTypeIndexUrl(user, fetch);\n const typeIndexBody = `\n <> a\n <http://www.w3.org/ns/solid/terms#TypeIndex>,\n <http://www.w3.org/ns/solid/terms#UnlistedDocument> .\n `;\n const profileUpdateBody = `\n INSERT DATA {\n <${user.webId}> <http://www.w3.org/ns/solid/terms#privateTypeIndex> <${typeIndexUrl}> .\n }\n `;\n\n createSolidDocument(typeIndexUrl, typeIndexBody, fetch);\n updateSolidDocument(user.webId, profileUpdateBody, fetch);\n\n return typeIndexUrl;\n}\n\nexport async function findContainerRegistration(\n typeIndexUrl: string,\n childrenType: string,\n fetch?: Fetch,\n): Promise<SolidThing | null> {\n const typeIndex = await fetchSolidDocument(typeIndexUrl, fetch);\n const containerQuad = typeIndex\n .statements(undefined, 'rdfs:type', 'solid:TypeRegistration')\n .find(\n statement =>\n typeIndex.contains(statement.subject.value, 'solid:forClass', childrenType) &&\n typeIndex.contains(statement.subject.value, 'solid:instanceContainer'),\n );\n\n return containerQuad\n ? typeIndex.getThing(containerQuad.subject.value) ?? null\n : null;\n}\n","import type { JsonLD } from '@/helpers/jsonld';\nimport { pull } from '@noeldemartin/utils';\nimport type { Quad, Quad_Object } from 'rdf-js';\n\nimport { jsonldToQuads, quadToTurtle, quadsToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';\n\nlet patternsRegExpsIndex: Record<string, RegExp> = {};\n\nfunction containsPatterns(value: string): boolean {\n return /\\[\\[(.*\\]\\[)?([^\\]]+)\\]\\]/.test(value);\n}\n\nfunction quadValueEquals(expected: string, actual: string): boolean {\n if (!containsPatterns(expected))\n return expected === actual;\n\n const patternAliases = [];\n\n if (!(expected in patternsRegExpsIndex)) {\n const patternMatches = expected.matchAll(/\\[\\[((.*)\\]\\[)?([^\\]]+)\\]\\]/g);\n const patterns: string[] = [];\n let expectedRegExp = expected;\n\n for (const patternMatch of patternMatches) {\n if (patternMatch[2]) {\n patternAliases.push(patternMatch[2]);\n }\n\n patterns.push(patternMatch[3]);\n\n expectedRegExp = expectedRegExp.replace(patternMatch[0], `%PATTERN${patterns.length - 1}%`);\n }\n\n expectedRegExp = expectedRegExp.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\n for (const [patternIndex, pattern] of Object.entries(patterns)) {\n expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, pattern);\n }\n\n patternsRegExpsIndex[expected] = new RegExp(expectedRegExp);\n }\n\n return patternsRegExpsIndex[expected].test(actual);\n}\n\nfunction quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {\n if (expected.termType !== actual.termType)\n return false;\n\n if (expected.termType === 'Literal' && actual.termType === 'Literal') {\n if (expected.datatype.value !== actual.datatype.value)\n return false;\n\n if (!containsPatterns(expected.value))\n return expected.datatype.value === 'http://www.w3.org/2001/XMLSchema#dateTime'\n ? new Date(expected.value).getTime() === new Date(actual.value).getTime()\n : expected.value === actual.value;\n }\n\n return quadValueEquals(expected.value, actual.value);\n}\n\nfunction quadEquals(expected: Quad, actual: Quad): boolean {\n return quadObjectEquals(expected.object, actual.object)\n && quadValueEquals(expected.subject.value, actual.subject.value)\n && quadValueEquals(expected.predicate.value, actual.predicate.value);\n}\n\nfunction resetPatterns(): void {\n patternsRegExpsIndex = {};\n}\n\nexport interface EqualityResult {\n success: boolean;\n message: string;\n expected: string;\n actual: string;\n}\n\nexport async function jsonldEquals(expected: JsonLD, actual: JsonLD): Promise<EqualityResult> {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedQuads = await jsonldToQuads(expected);\n const actualQuads = await jsonldToQuads(actual);\n const expectedTurtle = quadsToTurtle(expectedQuads);\n const actualTurtle = quadsToTurtle(actualQuads);\n const result = (success: boolean, message: string) => ({\n success,\n message,\n expected: expectedTurtle,\n actual: actualTurtle,\n });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n return result(true, 'jsonld matches');\n}\n\nexport function sparqlEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedOperations = sparqlToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualOperations = sparqlToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n for (const operation of Object.keys(expectedOperations)) {\n if (!(operation in actualOperations))\n return result(false, `Couldn't find expected ${operation} operation.`);\n\n const expectedQuads = pull(expectedOperations, operation);\n const actualQuads = pull(actualOperations, operation);\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} ${operation} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following ${operation} triple: ${quadToTurtle(expectedQuad)}`);\n }\n }\n\n const unexpectedOperation = Object.keys(actualOperations)[0] ?? null;\n if (unexpectedOperation)\n return result(false, `Did not expect to find ${unexpectedOperation} triples.`);\n\n return result(true, 'sparql matches');\n}\n\nexport function turtleEquals(expected: string, actual: string): EqualityResult {\n // TODO catch parsing errors and improve message.\n resetPatterns();\n\n const expectedQuads = turtleToQuadsSync(expected, { normalizeBlankNodes: true });\n const actualQuads = turtleToQuadsSync(actual, { normalizeBlankNodes: true });\n const result = (success: boolean, message: string) => ({ success, message, expected, actual });\n\n if (expectedQuads.length !== actualQuads.length)\n return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);\n\n for (const expectedQuad of expectedQuads) {\n if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))\n return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);\n }\n\n return result(true, 'turtle matches');\n}\n","import { sparqlEquals, turtleEquals } from '@/helpers/testing';\n\ntype CustomAssertions = {\n [assertion in keyof typeof assertions]: typeof assertions[assertion];\n};\n\ndeclare global {\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Chai {\n\n interface Assertion extends CustomAssertions {}\n interface Include extends CustomAssertions {}\n\n }\n\n}\n\nconst assertions: Record<string, (this: Chai.AssertionStatic, ...args: any[]) => void> = {\n turtle(graph: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = graph;\n const result = turtleEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n sparql(query: string): void {\n const self = this as unknown as Chai.AssertionStatic;\n const actual = self._obj;\n const assert = self.assert.bind(this);\n const expected = query;\n const result = sparqlEquals(expected, actual);\n\n assert(result.success, result.message, '', result.expected, result.actual);\n },\n};\n\nexport default assertions;\n","import assertions from './assertions';\n\nexport function installChaiPlugin(): void {\n chai.use(_chai => Object.entries(assertions).forEach(([name, method]) => _chai.Assertion.addMethod(name, method)));\n}\n","import { 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","containsPatterns","test","quadValueEquals","expected","actual","patternAliases","patternMatches","patterns","expectedRegExp","patternMatch","patternIndex","pattern","RegExp","quadEquals","datatype","Date","getTime","quadObjectEquals","resetPatterns","jsonldEquals","expectedQuads","actualQuads","expectedTurtle","actualTurtle","result","success","expectedQuad","some","actualQuad","sparqlEquals","expectedOperations","actualOperations","keys","pull","unexpectedOperation","turtleEquals","assertions","graph","_obj","assert","bind","query","installChaiPlugin","chai","use","_chai","forEach","Assertion","addMethod","formatResult","pass","utils","context","matcherHint","hint","printExpected","printReceived","received","matchers","toEqualJsonLD","toEqualSparql","installJestPlugin","expect","extend"],"mappings":"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"}
|
package/noeldemartin.config.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noeldemartin/solid-utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1-next.8c064afc67573f7cf20fa4cbeecfad10a949a9ef",
|
|
4
4
|
"description": "My JavaScript utilities for Solid",
|
|
5
5
|
"main": "dist/noeldemartin-solid-utils.cjs.js",
|
|
6
6
|
"module": "dist/noeldemartin-solid-utils.esm.js",
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
"build": "rm dist -rf && npm run build:js && npm run build:types",
|
|
10
10
|
"build:js": "noeldemartin-build-javascript",
|
|
11
11
|
"build:types": "noeldemartin-build-types",
|
|
12
|
-
"lint": "eslint src",
|
|
12
|
+
"lint": "eslint src && tsc --noEmit",
|
|
13
13
|
"publish-next": "noeldemartin-publish-next",
|
|
14
14
|
"test": "jest --verbose",
|
|
15
15
|
"test:coverage": "jest --coverage"
|
|
16
16
|
},
|
|
17
17
|
"engines": {
|
|
18
|
-
"node": ">=14.
|
|
18
|
+
"node": ">=14.15.0 <15"
|
|
19
19
|
},
|
|
20
20
|
"repository": {
|
|
21
21
|
"type": "git",
|
|
@@ -29,10 +29,11 @@
|
|
|
29
29
|
"homepage": "https://github.com/noeldemartin/solid-utils",
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@babel/runtime": "^7.14.0",
|
|
32
|
-
"@noeldemartin/utils": "0.1
|
|
32
|
+
"@noeldemartin/utils": "^0.2.1-next.c3e1bb57127c6f5eab27c6fbb99463760b5aa02c",
|
|
33
33
|
"@types/rdf-js": "^4.0.1",
|
|
34
34
|
"core-js": "^3.12.1",
|
|
35
35
|
"jest-diff": "^26.6.2",
|
|
36
|
+
"jsonld": "^5.2.0",
|
|
36
37
|
"md5": "^2.3.0",
|
|
37
38
|
"n3": "^1.10.0"
|
|
38
39
|
},
|
|
@@ -43,8 +44,8 @@
|
|
|
43
44
|
"@babel/preset-env": "^7.14.2",
|
|
44
45
|
"@babel/preset-typescript": "^7.13.0",
|
|
45
46
|
"@microsoft/api-extractor": "^7.15.2",
|
|
46
|
-
"@noeldemartin/eslint-config-typescript": "0.
|
|
47
|
-
"@noeldemartin/scripts": "0.
|
|
47
|
+
"@noeldemartin/eslint-config-typescript": "^0.1.0",
|
|
48
|
+
"@noeldemartin/scripts": "^0.1.1",
|
|
48
49
|
"@rollup/plugin-alias": "^3.1.2",
|
|
49
50
|
"@rollup/plugin-babel": "^5.3.0",
|
|
50
51
|
"@rollup/plugin-commonjs": "^19.0.0",
|
|
@@ -53,6 +54,7 @@
|
|
|
53
54
|
"@types/chai": "^4.2.18",
|
|
54
55
|
"@types/jest": "^26.0.23",
|
|
55
56
|
"@types/jest-diff": "^24.3.0",
|
|
57
|
+
"@types/jsonld": "^1.5.6",
|
|
56
58
|
"@types/md5": "^2.3.0",
|
|
57
59
|
"@types/n3": "^1.8.0",
|
|
58
60
|
"babel-plugin-transform-remove-imports": "^1.5.4",
|
package/src/helpers/io.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { arr, arrayFilter, arrayReplace,objectWithoutEmpty } from '@noeldemartin/utils';
|
|
2
2
|
import { BlankNode as N3BlankNode, Quad as N3Quad, Parser as TurtleParser, Writer as TurtleWriter } from 'n3';
|
|
3
|
+
import type { JsonLdDocument } from 'jsonld';
|
|
4
|
+
import { toRDF } from 'jsonld';
|
|
3
5
|
import md5 from 'md5';
|
|
4
6
|
import type { Quad } from 'rdf-js';
|
|
5
7
|
import type { Term as N3Term } from 'n3';
|
|
@@ -10,6 +12,8 @@ import MalformedSolidDocumentError, { SolidDocumentFormat } from '@/errors/Malfo
|
|
|
10
12
|
import NetworkRequestError from '@/errors/NetworkRequestError';
|
|
11
13
|
import NotFoundError from '@/errors/NotFoundError';
|
|
12
14
|
import UnauthorizedError from '@/errors/UnauthorizedError';
|
|
15
|
+
import { isJsonLDGraph } from '@/helpers/jsonld';
|
|
16
|
+
import type { JsonLD } from '@/helpers/jsonld';
|
|
13
17
|
|
|
14
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
19
|
export declare type AnyFetch = (input: any, options?: any) => Promise<any>;
|
|
@@ -122,6 +126,16 @@ export async function fetchSolidDocument(url: string, fetch?: Fetch): Promise<So
|
|
|
122
126
|
return new SolidDocument(url, statements, headers);
|
|
123
127
|
}
|
|
124
128
|
|
|
129
|
+
export async function jsonldToQuads(jsonld: JsonLD): Promise<Quad[]> {
|
|
130
|
+
if (isJsonLDGraph(jsonld)) {
|
|
131
|
+
const graphQuads = await Promise.all(jsonld['@graph'].map(jsonldToQuads));
|
|
132
|
+
|
|
133
|
+
return graphQuads.flat();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return toRDF(jsonld as JsonLdDocument) as Promise<Quad[]>;
|
|
137
|
+
}
|
|
138
|
+
|
|
125
139
|
export function normalizeSparql(sparql: string): string {
|
|
126
140
|
const quads = sparqlToQuadsSync(sparql);
|
|
127
141
|
|
|
@@ -135,6 +149,12 @@ export function normalizeSparql(sparql: string): string {
|
|
|
135
149
|
.join(' ;\n');
|
|
136
150
|
}
|
|
137
151
|
|
|
152
|
+
export function quadsToTurtle(quads: Quad[]): string {
|
|
153
|
+
const writer = new TurtleWriter;
|
|
154
|
+
|
|
155
|
+
return writer.quadsToString(quads);
|
|
156
|
+
}
|
|
157
|
+
|
|
138
158
|
export function quadToTurtle(quad: Quad): string {
|
|
139
159
|
const writer = new TurtleWriter;
|
|
140
160
|
|
package/src/helpers/jsonld.ts
CHANGED
|
@@ -6,3 +6,7 @@ export type JsonLD = Partial<{
|
|
|
6
6
|
|
|
7
7
|
export type JsonLDResource = Omit<JsonLD, '@id'> & { '@id': string };
|
|
8
8
|
export type JsonLDGraph = { '@graph': JsonLDResource[] };
|
|
9
|
+
|
|
10
|
+
export function isJsonLDGraph(jsonld: JsonLD): jsonld is JsonLDGraph {
|
|
11
|
+
return '@graph' in jsonld;
|
|
12
|
+
}
|
package/src/helpers/testing.ts
CHANGED
|
@@ -1,25 +1,32 @@
|
|
|
1
|
+
import type { JsonLD } from '@/helpers/jsonld';
|
|
1
2
|
import { pull } from '@noeldemartin/utils';
|
|
2
3
|
import type { Quad, Quad_Object } from 'rdf-js';
|
|
3
4
|
|
|
4
|
-
import { quadToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';
|
|
5
|
+
import { jsonldToQuads, quadToTurtle, quadsToTurtle, sparqlToQuadsSync, turtleToQuadsSync } from './io';
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
let patternsRegExpsIndex: Record<string, RegExp> = {};
|
|
7
8
|
|
|
8
9
|
function containsPatterns(value: string): boolean {
|
|
9
|
-
return /\[\[([^\]]+)\]\]/.test(value);
|
|
10
|
+
return /\[\[(.*\]\[)?([^\]]+)\]\]/.test(value);
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
function quadValueEquals(expected: string, actual: string): boolean {
|
|
13
14
|
if (!containsPatterns(expected))
|
|
14
15
|
return expected === actual;
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
const patternAliases = [];
|
|
18
|
+
|
|
19
|
+
if (!(expected in patternsRegExpsIndex)) {
|
|
20
|
+
const patternMatches = expected.matchAll(/\[\[((.*)\]\[)?([^\]]+)\]\]/g);
|
|
18
21
|
const patterns: string[] = [];
|
|
19
22
|
let expectedRegExp = expected;
|
|
20
23
|
|
|
21
24
|
for (const patternMatch of patternMatches) {
|
|
22
|
-
|
|
25
|
+
if (patternMatch[2]) {
|
|
26
|
+
patternAliases.push(patternMatch[2]);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
patterns.push(patternMatch[3]);
|
|
23
30
|
|
|
24
31
|
expectedRegExp = expectedRegExp.replace(patternMatch[0], `%PATTERN${patterns.length - 1}%`);
|
|
25
32
|
}
|
|
@@ -30,10 +37,10 @@ function quadValueEquals(expected: string, actual: string): boolean {
|
|
|
30
37
|
expectedRegExp = expectedRegExp.replace(`%PATTERN${patternIndex}%`, pattern);
|
|
31
38
|
}
|
|
32
39
|
|
|
33
|
-
|
|
40
|
+
patternsRegExpsIndex[expected] = new RegExp(expectedRegExp);
|
|
34
41
|
}
|
|
35
42
|
|
|
36
|
-
return
|
|
43
|
+
return patternsRegExpsIndex[expected].test(actual);
|
|
37
44
|
}
|
|
38
45
|
|
|
39
46
|
function quadObjectEquals(expected: Quad_Object, actual: Quad_Object): boolean {
|
|
@@ -59,6 +66,10 @@ function quadEquals(expected: Quad, actual: Quad): boolean {
|
|
|
59
66
|
&& quadValueEquals(expected.predicate.value, actual.predicate.value);
|
|
60
67
|
}
|
|
61
68
|
|
|
69
|
+
function resetPatterns(): void {
|
|
70
|
+
patternsRegExpsIndex = {};
|
|
71
|
+
}
|
|
72
|
+
|
|
62
73
|
export interface EqualityResult {
|
|
63
74
|
success: boolean;
|
|
64
75
|
message: string;
|
|
@@ -66,8 +77,35 @@ export interface EqualityResult {
|
|
|
66
77
|
actual: string;
|
|
67
78
|
}
|
|
68
79
|
|
|
80
|
+
export async function jsonldEquals(expected: JsonLD, actual: JsonLD): Promise<EqualityResult> {
|
|
81
|
+
// TODO catch parsing errors and improve message.
|
|
82
|
+
resetPatterns();
|
|
83
|
+
|
|
84
|
+
const expectedQuads = await jsonldToQuads(expected);
|
|
85
|
+
const actualQuads = await jsonldToQuads(actual);
|
|
86
|
+
const expectedTurtle = quadsToTurtle(expectedQuads);
|
|
87
|
+
const actualTurtle = quadsToTurtle(actualQuads);
|
|
88
|
+
const result = (success: boolean, message: string) => ({
|
|
89
|
+
success,
|
|
90
|
+
message,
|
|
91
|
+
expected: expectedTurtle,
|
|
92
|
+
actual: actualTurtle,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
if (expectedQuads.length !== actualQuads.length)
|
|
96
|
+
return result(false, `Expected ${expectedQuads.length} triples, found ${actualQuads.length}.`);
|
|
97
|
+
|
|
98
|
+
for (const expectedQuad of expectedQuads) {
|
|
99
|
+
if (!actualQuads.some(actualQuad => quadEquals(expectedQuad, actualQuad)))
|
|
100
|
+
return result(false, `Couldn't find the following triple: ${quadToTurtle(expectedQuad)}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return result(true, 'jsonld matches');
|
|
104
|
+
}
|
|
105
|
+
|
|
69
106
|
export function sparqlEquals(expected: string, actual: string): EqualityResult {
|
|
70
107
|
// TODO catch parsing errors and improve message.
|
|
108
|
+
resetPatterns();
|
|
71
109
|
|
|
72
110
|
const expectedOperations = sparqlToQuadsSync(expected, { normalizeBlankNodes: true });
|
|
73
111
|
const actualOperations = sparqlToQuadsSync(actual, { normalizeBlankNodes: true });
|
|
@@ -98,6 +136,7 @@ export function sparqlEquals(expected: string, actual: string): EqualityResult {
|
|
|
98
136
|
|
|
99
137
|
export function turtleEquals(expected: string, actual: string): EqualityResult {
|
|
100
138
|
// TODO catch parsing errors and improve message.
|
|
139
|
+
resetPatterns();
|
|
101
140
|
|
|
102
141
|
const expectedQuads = turtleToQuadsSync(expected, { normalizeBlankNodes: true });
|
|
103
142
|
const actualQuads = turtleToQuadsSync(actual, { normalizeBlankNodes: true });
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { sparqlEquals } from '@/helpers/testing';
|
|
1
|
+
import { sparqlEquals, turtleEquals } from '@/helpers/testing';
|
|
2
2
|
|
|
3
3
|
type CustomAssertions = {
|
|
4
4
|
[assertion in keyof typeof assertions]: typeof assertions[assertion];
|
|
@@ -17,6 +17,15 @@ declare global {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
const assertions: Record<string, (this: Chai.AssertionStatic, ...args: any[]) => void> = {
|
|
20
|
+
turtle(graph: string): void {
|
|
21
|
+
const self = this as unknown as Chai.AssertionStatic;
|
|
22
|
+
const actual = self._obj;
|
|
23
|
+
const assert = self.assert.bind(this);
|
|
24
|
+
const expected = graph;
|
|
25
|
+
const result = turtleEquals(expected, actual);
|
|
26
|
+
|
|
27
|
+
assert(result.success, result.message, '', result.expected, result.actual);
|
|
28
|
+
},
|
|
20
29
|
sparql(query: string): void {
|
|
21
30
|
const self = this as unknown as Chai.AssertionStatic;
|
|
22
31
|
const actual = self._obj;
|
|
@@ -24,7 +33,7 @@ const assertions: Record<string, (this: Chai.AssertionStatic, ...args: any[]) =>
|
|
|
24
33
|
const expected = query;
|
|
25
34
|
const result = sparqlEquals(expected, actual);
|
|
26
35
|
|
|
27
|
-
assert(result.success, result.message, expected, actual);
|
|
36
|
+
assert(result.success, result.message, '', result.expected, result.actual);
|
|
28
37
|
},
|
|
29
38
|
};
|
|
30
39
|
|
|
@@ -1,41 +1,56 @@
|
|
|
1
|
-
import diff from 'jest-diff';
|
|
2
|
-
|
|
3
1
|
import { normalizeSparql } from '@/helpers/io';
|
|
4
|
-
import { sparqlEquals } from '@/helpers/testing';
|
|
2
|
+
import { jsonldEquals, sparqlEquals } from '@/helpers/testing';
|
|
3
|
+
import type { EqualityResult } from '@/helpers/testing';
|
|
4
|
+
|
|
5
|
+
interface FormatResultOptions {
|
|
6
|
+
context: jest.MatcherContext;
|
|
7
|
+
hint: string;
|
|
8
|
+
expected: unknown;
|
|
9
|
+
received: unknown;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function formatResult(result: EqualityResult, options: FormatResultOptions) {
|
|
13
|
+
const pass = result.success;
|
|
14
|
+
const utils = options.context.utils;
|
|
15
|
+
const message = pass
|
|
16
|
+
? () => [
|
|
17
|
+
result.message,
|
|
18
|
+
utils.matcherHint(options.hint),
|
|
19
|
+
[
|
|
20
|
+
`Expected: not ${utils.printExpected(options.expected)}`,
|
|
21
|
+
`Received: ${utils.printReceived(options.received)}`,
|
|
22
|
+
].join('\n'),
|
|
23
|
+
].join('\n\n')
|
|
24
|
+
: () => {
|
|
25
|
+
return [
|
|
26
|
+
result.message,
|
|
27
|
+
utils.matcherHint(options.hint),
|
|
28
|
+
].join('\n\n');
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
return { pass, message };
|
|
32
|
+
}
|
|
5
33
|
|
|
6
34
|
const matchers: jest.ExpectExtendMap = {
|
|
35
|
+
async toEqualJsonLD(received, expected) {
|
|
36
|
+
const result = await jsonldEquals(expected, received);
|
|
37
|
+
|
|
38
|
+
return formatResult(result, {
|
|
39
|
+
context: this,
|
|
40
|
+
hint: 'toEqualJsonLD',
|
|
41
|
+
expected,
|
|
42
|
+
received,
|
|
43
|
+
});
|
|
44
|
+
},
|
|
7
45
|
toEqualSparql(received, expected) {
|
|
8
46
|
const result = sparqlEquals(expected, received);
|
|
9
|
-
const pass = result.success;
|
|
10
|
-
const normalizedReceived = normalizeSparql(received);
|
|
11
|
-
const normalizedExpected = normalizeSparql(expected);
|
|
12
|
-
const message = pass
|
|
13
|
-
? () => [
|
|
14
|
-
result.message,
|
|
15
|
-
this.utils.matcherHint('toEqualSparql'),
|
|
16
|
-
[
|
|
17
|
-
`Expected: not ${this.utils.printExpected(normalizedExpected)}`,
|
|
18
|
-
`Received: ${this.utils.printReceived(normalizedReceived)}`,
|
|
19
|
-
].join('\n'),
|
|
20
|
-
].join('\n\n')
|
|
21
|
-
: () => {
|
|
22
|
-
const diffString = diff(normalizedExpected, normalizedReceived, {
|
|
23
|
-
expand: this.expand,
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
return [
|
|
27
|
-
result.message,
|
|
28
|
-
this.utils.matcherHint('toEqualJsonLD'),
|
|
29
|
-
diffString && diffString.includes('- Expect')
|
|
30
|
-
? `Difference:\n\n${diffString}`
|
|
31
|
-
: [
|
|
32
|
-
`Expected: ${this.utils.printExpected(normalizedExpected)}`,
|
|
33
|
-
`Received: ${this.utils.printReceived(normalizedReceived)}`,
|
|
34
|
-
].join('\n'),
|
|
35
|
-
].join('\n\n');
|
|
36
|
-
};
|
|
37
47
|
|
|
38
|
-
return
|
|
48
|
+
return formatResult(result, {
|
|
49
|
+
context: this,
|
|
50
|
+
hint: 'toEqualSparql',
|
|
51
|
+
expected: normalizeSparql(expected),
|
|
52
|
+
received: normalizeSparql(received),
|
|
53
|
+
});
|
|
39
54
|
},
|
|
40
55
|
};
|
|
41
56
|
|