jsonld-checker
Advanced tools
+22
| # Change Log | ||
| All notable changes to this project will be documented in this file. | ||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||
| ## [0.1.3](https://github.com/gjgd/jsonld-checker/compare/v0.1.2...v0.1.3) (2020-07-08) | ||
| ### Features | ||
| * add getFiles functions to list files in a github repo ([ac00958](https://github.com/gjgd/jsonld-checker/commit/ac0095834315888ab4a9a4d6a14108ca1e36a7c7)) | ||
| ## [0.1.2](https://github.com/gjgd/jsonld-checker/compare/v0.1.1...v0.1.2) (2020-06-27) | ||
| ### Features | ||
| * filter out non jsonld properties ([46ab8b5](https://github.com/gjgd/jsonld-checker/commit/46ab8b525595292f375c219dc819255167962f0e)) |
| declare const getFiles: (user: any, repo: any, ref?: string) => Promise<any>; | ||
| export { getFiles }; |
| declare class CheckResult { | ||
| ok: boolean; | ||
| error: { | ||
| error?: { | ||
| type: string; | ||
@@ -5,0 +5,0 @@ details: string; |
+2
-0
| import CheckResult from './CheckResult'; | ||
| export * from './github'; | ||
| export declare const check: (jsonldDocument: string | object) => Promise<CheckResult>; | ||
@@ -6,1 +7,2 @@ export declare const getAllJsonFromString: (text: string) => Array<Object>; | ||
| export declare const getAllJsonLdFromString: (text: string) => Object[]; | ||
| export { CheckResult }; |
@@ -44,2 +44,32 @@ 'use strict'; | ||
| /* eslint-disable import/prefer-default-export */ | ||
| var fetch = /*#__PURE__*/require('node-fetch'); | ||
| var githubApi = function githubApi(endpoint) { | ||
| try { | ||
| return Promise.resolve(fetch("https://api.github.com/repos/" + endpoint).then(function (res) { | ||
| return res.json(); | ||
| })); | ||
| } catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }; | ||
| var getFiles = function getFiles(user, repo, ref) { | ||
| if (ref === void 0) { | ||
| ref = 'HEAD'; | ||
| } | ||
| try { | ||
| return Promise.resolve(githubApi(user + "/" + repo + "/git/trees/" + ref + "?recursive=1")).then(function (all) { | ||
| var files = all.tree.filter(function (node) { | ||
| return node.type === 'blob'; | ||
| }); | ||
| return files; | ||
| }); | ||
| } catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }; | ||
| var CONTEXTS = {}; // From https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js | ||
@@ -70,2 +100,7 @@ | ||
| jsonld.documentLoader = customLoader; | ||
| var isNotJsonLdPropery = function isNotJsonLdPropery(property) { | ||
| return !['@id', '@type'].includes(property); | ||
| }; | ||
| var check = function check(jsonldDocument) { | ||
@@ -86,3 +121,3 @@ try { | ||
| // Check which keys have been removed | ||
| var keys = Object.keys(jsonldDoc); | ||
| var keys = Object.keys(jsonldDoc).filter(isNotJsonLdPropery); | ||
| var newKeysSet = new Set(Object.keys(compacted)); | ||
@@ -161,6 +196,8 @@ var difference = keys.filter(function (key) { | ||
| exports.CheckResult = CheckResult; | ||
| exports.check = check; | ||
| exports.getAllJsonFromString = getAllJsonFromString; | ||
| exports.getAllJsonLdFromString = getAllJsonLdFromString; | ||
| exports.getFiles = getFiles; | ||
| exports.isJsonLdObject = isJsonLdObject; | ||
| //# sourceMappingURL=jsonld-checker.cjs.development.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"jsonld-checker.cjs.development.js","sources":["../node_modules/babel-plugin-transform-async-to-promises/helpers.js","../src/CheckResult.tsx","../src/index.ts"],"sourcesContent":["// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","class CheckResult {\n ok: boolean;\n\n error: {\n type: string;\n details: string;\n };\n\n constructor(ok: boolean, type = '', details = '') {\n this.ok = ok;\n this.error = {\n type,\n details,\n };\n }\n}\n\nexport default CheckResult;\n","import jsonld from 'jsonld';\nimport CheckResult from './CheckResult';\n\nconst CONTEXTS = {};\n\n// From https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js\nconst isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\nconst nodeDocumentLoader = isNode\n ? jsonld.documentLoaders.node()\n : jsonld.documentLoaders.xhr();\n\n// change the default document loader\nconst customLoader = async (url: string) => {\n if (url in CONTEXTS) {\n return {\n contextUrl: null,\n document: CONTEXTS[url],\n documentUrl: url,\n };\n }\n const res = await nodeDocumentLoader(url);\n CONTEXTS[url] = res.document;\n return res;\n};\n\njsonld.documentLoader = customLoader;\n\nexport const check = async (jsonldDocument: string | object) => {\n try {\n let jsonldDoc: object;\n if (typeof jsonldDocument === 'string') {\n jsonldDoc = JSON.parse(jsonldDocument);\n } else {\n jsonldDoc = jsonldDocument;\n }\n // Remove all keys not present in the jsonld context\n const expanded = await jsonld.expand(jsonldDoc);\n const compacted = await jsonld.compact(expanded, jsonldDoc['@context']);\n // Check which keys have been removed\n const keys = Object.keys(jsonldDoc);\n const newKeysSet = new Set(Object.keys(compacted));\n const difference = keys.filter(key => !newKeysSet.has(key));\n if (difference.length === 0) {\n return new CheckResult(true);\n }\n return new CheckResult(\n false,\n 'MISSING_PROPERTIES_IN_CONTEXT',\n JSON.stringify(difference)\n );\n } catch (err) {\n return new CheckResult(false, err.name, err.message);\n }\n};\n\nconst getAllOpenBrackets = (text: string) => {\n const results: number[] = [];\n for (let cursor = 0; cursor < text.length; cursor += 1) {\n if (text[cursor] === '{') {\n results.push(cursor);\n }\n }\n return results;\n};\n\nconst getStringUntilMatchingBracket = (\n text: string,\n openBracketIndex: number\n) => {\n let substring = text[openBracketIndex];\n if (substring !== '{') {\n throw new Error('start must be the index of an opening bracket');\n }\n let bracketCount = 1;\n let cursor = openBracketIndex + 1;\n const { length } = text;\n while (bracketCount !== 0 && cursor < length) {\n const currentChar = text[cursor];\n if (currentChar === '{') {\n bracketCount += 1;\n } else if (currentChar === '}') {\n bracketCount -= 1;\n }\n cursor += 1;\n substring += currentChar;\n }\n try {\n return JSON.parse(substring);\n } catch (e) {\n return null;\n }\n};\n\nexport const getAllJsonFromString = (text: string): Array<Object> => {\n const openBrackets = getAllOpenBrackets(text);\n return openBrackets\n .map(openBracketIndex =>\n getStringUntilMatchingBracket(text, openBracketIndex)\n )\n .filter(Boolean);\n};\n\nexport const isJsonLdObject = (obj: Object): Boolean => {\n return '@context' in obj;\n};\n\nexport const getAllJsonLdFromString = (text: string) => {\n return getAllJsonFromString(text).filter(obj => isJsonLdObject(obj));\n};\n"],"names":["CheckResult","ok","type","details","error","CONTEXTS","isNode","process","versions","node","nodeDocumentLoader","jsonld","documentLoaders","xhr","customLoader","url","contextUrl","document","documentUrl","res","documentLoader","check","jsonldDocument","jsonldDoc","JSON","parse","expand","expanded","compact","compacted","keys","Object","newKeysSet","Set","difference","filter","key","has","length","stringify","err","name","message","getAllOpenBrackets","text","results","cursor","push","getStringUntilMatchingBracket","openBracketIndex","substring","Error","bracketCount","currentChar","e","getAllJsonFromString","openBrackets","map","Boolean","isJsonLdObject","obj","getAllJsonLdFromString"],"mappings":"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"} | ||
| {"version":3,"file":"jsonld-checker.cjs.development.js","sources":["../node_modules/babel-plugin-transform-async-to-promises/helpers.js","../src/CheckResult.tsx","../src/github.ts","../src/index.ts"],"sourcesContent":["// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","class CheckResult {\n ok: boolean;\n\n error?: {\n type: string;\n details: string;\n };\n\n constructor(ok: boolean, type = '', details = '') {\n this.ok = ok;\n this.error = {\n type,\n details,\n };\n }\n}\n\nexport default CheckResult;\n","/* eslint-disable import/prefer-default-export */\nconst fetch = require('node-fetch');\n\nconst githubApi = async endpoint => {\n return fetch(`https://api.github.com/repos/${endpoint}`).then(res =>\n res.json()\n );\n};\n\nconst getFiles = async (user, repo, ref = 'HEAD') => {\n const all = await githubApi(`${user}/${repo}/git/trees/${ref}?recursive=1`);\n const files = all.tree.filter(node => node.type === 'blob');\n return files;\n};\n\nexport { getFiles };\n","import jsonld from 'jsonld';\nimport CheckResult from './CheckResult';\n\n// TODO: refactor\nexport * from './github';\n\nconst CONTEXTS = {};\n\n// From https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js\nconst isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\nconst nodeDocumentLoader = isNode\n ? jsonld.documentLoaders.node()\n : jsonld.documentLoaders.xhr();\n\n// change the default document loader\nconst customLoader = async (url: string) => {\n if (url in CONTEXTS) {\n return {\n contextUrl: null,\n document: CONTEXTS[url],\n documentUrl: url,\n };\n }\n const res = await nodeDocumentLoader(url);\n CONTEXTS[url] = res.document;\n return res;\n};\n\njsonld.documentLoader = customLoader;\n\nconst isNotJsonLdPropery = property => !['@id', '@type'].includes(property);\n\nexport const check = async (jsonldDocument: string | object) => {\n try {\n let jsonldDoc: object;\n if (typeof jsonldDocument === 'string') {\n jsonldDoc = JSON.parse(jsonldDocument);\n } else {\n jsonldDoc = jsonldDocument;\n }\n // Remove all keys not present in the jsonld context\n const expanded = await jsonld.expand(jsonldDoc);\n const compacted = await jsonld.compact(expanded, jsonldDoc['@context']);\n // Check which keys have been removed\n const keys = Object.keys(jsonldDoc).filter(isNotJsonLdPropery);\n const newKeysSet = new Set(Object.keys(compacted));\n const difference = keys.filter(key => !newKeysSet.has(key));\n if (difference.length === 0) {\n return new CheckResult(true);\n }\n return new CheckResult(\n false,\n 'MISSING_PROPERTIES_IN_CONTEXT',\n JSON.stringify(difference)\n );\n } catch (err) {\n return new CheckResult(false, err.name, err.message);\n }\n};\n\nconst getAllOpenBrackets = (text: string) => {\n const results: number[] = [];\n for (let cursor = 0; cursor < text.length; cursor += 1) {\n if (text[cursor] === '{') {\n results.push(cursor);\n }\n }\n return results;\n};\n\nconst getStringUntilMatchingBracket = (\n text: string,\n openBracketIndex: number\n) => {\n let substring = text[openBracketIndex];\n if (substring !== '{') {\n throw new Error('start must be the index of an opening bracket');\n }\n let bracketCount = 1;\n let cursor = openBracketIndex + 1;\n const { length } = text;\n while (bracketCount !== 0 && cursor < length) {\n const currentChar = text[cursor];\n if (currentChar === '{') {\n bracketCount += 1;\n } else if (currentChar === '}') {\n bracketCount -= 1;\n }\n cursor += 1;\n substring += currentChar;\n }\n try {\n return JSON.parse(substring);\n } catch (e) {\n return null;\n }\n};\n\nexport const getAllJsonFromString = (text: string): Array<Object> => {\n const openBrackets = getAllOpenBrackets(text);\n return openBrackets\n .map(openBracketIndex =>\n getStringUntilMatchingBracket(text, openBracketIndex)\n )\n .filter(Boolean);\n};\n\nexport const isJsonLdObject = (obj: Object): Boolean => {\n return '@context' in obj;\n};\n\nexport const getAllJsonLdFromString = (text: string) => {\n return getAllJsonFromString(text).filter(obj => isJsonLdObject(obj));\n};\n\nexport { CheckResult };\n"],"names":["CheckResult","ok","type","details","error","fetch","require","githubApi","endpoint","then","res","json","getFiles","user","repo","ref","all","files","tree","filter","node","CONTEXTS","isNode","process","versions","nodeDocumentLoader","jsonld","documentLoaders","xhr","customLoader","url","contextUrl","document","documentUrl","documentLoader","isNotJsonLdPropery","property","includes","check","jsonldDocument","jsonldDoc","JSON","parse","expand","expanded","compact","compacted","keys","Object","newKeysSet","Set","difference","key","has","length","stringify","err","name","message","getAllOpenBrackets","text","results","cursor","push","getStringUntilMatchingBracket","openBracketIndex","substring","Error","bracketCount","currentChar","e","getAllJsonFromString","openBrackets","map","Boolean","isJsonLdObject","obj","getAllJsonLdFromString"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=(e=require("jsonld"))&&"object"==typeof e&&"default"in e?e.default:e;"undefined"!=typeof Symbol&&(Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator"))),"undefined"!=typeof Symbol&&(Symbol.asyncIterator||(Symbol.asyncIterator=Symbol("Symbol.asyncIterator")));var t=function(e,r,t){void 0===r&&(r=""),void 0===t&&(t=""),this.ok=e,this.error={type:r,details:t}},n={},o="undefined"!=typeof process&&null!=process.versions&&null!=process.versions.node?r.documentLoaders.node():r.documentLoaders.xhr();r.documentLoader=function(e){try{return e in n?Promise.resolve({contextUrl:null,document:n[e],documentUrl:e}):Promise.resolve(o(e)).then((function(r){return n[e]=r.document,r}))}catch(e){return Promise.reject(e)}};var u=function(e){return function(e){for(var r=[],t=0;t<e.length;t+=1)"{"===e[t]&&r.push(t);return r}(e).map((function(r){return function(e,r){var t=e[r];if("{"!==t)throw new Error("start must be the index of an opening bracket");for(var n=1,o=r+1,u=e.length;0!==n&&o<u;){var i=e[o];"{"===i?n+=1:"}"===i&&(n-=1),o+=1,t+=i}try{return JSON.parse(t)}catch(e){return null}}(e,r)})).filter(Boolean)},i=function(e){return"@context"in e};exports.check=function(e){try{return Promise.resolve(function(n,o){try{var u=(i="string"==typeof e?JSON.parse(e):e,Promise.resolve(r.expand(i)).then((function(e){return Promise.resolve(r.compact(e,i["@context"])).then((function(e){var r=Object.keys(i),n=new Set(Object.keys(e)),o=r.filter((function(e){return!n.has(e)}));return 0===o.length?new t(!0):new t(!1,"MISSING_PROPERTIES_IN_CONTEXT",JSON.stringify(o))}))})))}catch(e){return o(e)}var i;return u&&u.then?u.then(void 0,o):u}(0,(function(e){return new t(!1,e.name,e.message)})))}catch(e){return Promise.reject(e)}},exports.getAllJsonFromString=u,exports.getAllJsonLdFromString=function(e){return u(e).filter((function(e){return i(e)}))},exports.isJsonLdObject=i; | ||
| "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=(e=require("jsonld"))&&"object"==typeof e&&"default"in e?e.default:e;"undefined"!=typeof Symbol&&(Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator"))),"undefined"!=typeof Symbol&&(Symbol.asyncIterator||(Symbol.asyncIterator=Symbol("Symbol.asyncIterator")));var t=function(e,r,t){void 0===r&&(r=""),void 0===t&&(t=""),this.ok=e,this.error={type:r,details:t}},n=require("node-fetch"),o={},i="undefined"!=typeof process&&null!=process.versions&&null!=process.versions.node?r.documentLoaders.node():r.documentLoaders.xhr();r.documentLoader=function(e){try{return e in o?Promise.resolve({contextUrl:null,document:o[e],documentUrl:e}):Promise.resolve(i(e)).then((function(r){return o[e]=r.document,r}))}catch(e){return Promise.reject(e)}};var u=function(e){return!["@id","@type"].includes(e)},s=function(e){return function(e){for(var r=[],t=0;t<e.length;t+=1)"{"===e[t]&&r.push(t);return r}(e).map((function(r){return function(e,r){var t=e[r];if("{"!==t)throw new Error("start must be the index of an opening bracket");for(var n=1,o=r+1,i=e.length;0!==n&&o<i;){var u=e[o];"{"===u?n+=1:"}"===u&&(n-=1),o+=1,t+=u}try{return JSON.parse(t)}catch(e){return null}}(e,r)})).filter(Boolean)},c=function(e){return"@context"in e};exports.CheckResult=t,exports.check=function(e){try{return Promise.resolve(function(n,o){try{var i=(s="string"==typeof e?JSON.parse(e):e,Promise.resolve(r.expand(s)).then((function(e){return Promise.resolve(r.compact(e,s["@context"])).then((function(e){var r=Object.keys(s).filter(u),n=new Set(Object.keys(e)),o=r.filter((function(e){return!n.has(e)}));return 0===o.length?new t(!0):new t(!1,"MISSING_PROPERTIES_IN_CONTEXT",JSON.stringify(o))}))})))}catch(e){return o(e)}var s;return i&&i.then?i.then(void 0,o):i}(0,(function(e){return new t(!1,e.name,e.message)})))}catch(e){return Promise.reject(e)}},exports.getAllJsonFromString=s,exports.getAllJsonLdFromString=function(e){return s(e).filter((function(e){return c(e)}))},exports.getFiles=function(e,r,t){void 0===t&&(t="HEAD");try{return Promise.resolve(function(e){try{return Promise.resolve(n("https://api.github.com/repos/"+e).then((function(e){return e.json()})))}catch(e){return Promise.reject(e)}}(e+"/"+r+"/git/trees/"+t+"?recursive=1")).then((function(e){return e.tree.filter((function(e){return"blob"===e.type}))}))}catch(e){return Promise.reject(e)}},exports.isJsonLdObject=c; | ||
| //# sourceMappingURL=jsonld-checker.cjs.production.min.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"jsonld-checker.cjs.production.min.js","sources":["../node_modules/babel-plugin-transform-async-to-promises/helpers.js","../src/CheckResult.tsx","../src/index.ts"],"sourcesContent":["// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","class CheckResult {\n ok: boolean;\n\n error: {\n type: string;\n details: string;\n };\n\n constructor(ok: boolean, type = '', details = '') {\n this.ok = ok;\n this.error = {\n type,\n details,\n };\n }\n}\n\nexport default CheckResult;\n","import jsonld from 'jsonld';\nimport CheckResult from './CheckResult';\n\nconst CONTEXTS = {};\n\n// From https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js\nconst isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\nconst nodeDocumentLoader = isNode\n ? jsonld.documentLoaders.node()\n : jsonld.documentLoaders.xhr();\n\n// change the default document loader\nconst customLoader = async (url: string) => {\n if (url in CONTEXTS) {\n return {\n contextUrl: null,\n document: CONTEXTS[url],\n documentUrl: url,\n };\n }\n const res = await nodeDocumentLoader(url);\n CONTEXTS[url] = res.document;\n return res;\n};\n\njsonld.documentLoader = customLoader;\n\nexport const check = async (jsonldDocument: string | object) => {\n try {\n let jsonldDoc: object;\n if (typeof jsonldDocument === 'string') {\n jsonldDoc = JSON.parse(jsonldDocument);\n } else {\n jsonldDoc = jsonldDocument;\n }\n // Remove all keys not present in the jsonld context\n const expanded = await jsonld.expand(jsonldDoc);\n const compacted = await jsonld.compact(expanded, jsonldDoc['@context']);\n // Check which keys have been removed\n const keys = Object.keys(jsonldDoc);\n const newKeysSet = new Set(Object.keys(compacted));\n const difference = keys.filter(key => !newKeysSet.has(key));\n if (difference.length === 0) {\n return new CheckResult(true);\n }\n return new CheckResult(\n false,\n 'MISSING_PROPERTIES_IN_CONTEXT',\n JSON.stringify(difference)\n );\n } catch (err) {\n return new CheckResult(false, err.name, err.message);\n }\n};\n\nconst getAllOpenBrackets = (text: string) => {\n const results: number[] = [];\n for (let cursor = 0; cursor < text.length; cursor += 1) {\n if (text[cursor] === '{') {\n results.push(cursor);\n }\n }\n return results;\n};\n\nconst getStringUntilMatchingBracket = (\n text: string,\n openBracketIndex: number\n) => {\n let substring = text[openBracketIndex];\n if (substring !== '{') {\n throw new Error('start must be the index of an opening bracket');\n }\n let bracketCount = 1;\n let cursor = openBracketIndex + 1;\n const { length } = text;\n while (bracketCount !== 0 && cursor < length) {\n const currentChar = text[cursor];\n if (currentChar === '{') {\n bracketCount += 1;\n } else if (currentChar === '}') {\n bracketCount -= 1;\n }\n cursor += 1;\n substring += currentChar;\n }\n try {\n return JSON.parse(substring);\n } catch (e) {\n return null;\n }\n};\n\nexport const getAllJsonFromString = (text: string): Array<Object> => {\n const openBrackets = getAllOpenBrackets(text);\n return openBrackets\n .map(openBracketIndex =>\n getStringUntilMatchingBracket(text, openBracketIndex)\n )\n .filter(Boolean);\n};\n\nexport const isJsonLdObject = (obj: Object): Boolean => {\n return '@context' in obj;\n};\n\nexport const getAllJsonLdFromString = (text: string) => {\n return getAllJsonFromString(text).filter(obj => isJsonLdObject(obj));\n};\n"],"names":["Symbol","iterator","asyncIterator","CheckResult","ok","type","details","error","CONTEXTS","nodeDocumentLoader","process","versions","node","jsonld","documentLoaders","xhr","documentLoader","url","contextUrl","document","documentUrl","res","getAllJsonFromString","text","results","cursor","length","push","getAllOpenBrackets","map","openBracketIndex","substring","Error","bracketCount","currentChar","JSON","parse","e","getStringUntilMatchingBracket","filter","Boolean","isJsonLdObject","obj","jsonldDocument","body","recover","result","jsonldDoc","expand","expanded","compact","compacted","keys","Object","newKeysSet","Set","difference","key","has","stringify","then","err","name","message"],"mappings":"iJAoK+D,oBAAXA,SAA0BA,OAAOC,WAAaD,OAAOC,SAAWD,OAAO,qBA6DvD,oBAAXA,SAA0BA,OAAOE,gBAAkBF,OAAOE,cAAgBF,OAAO,8BCjOpIG,EAQJ,SAAYC,EAAaC,EAAWC,YAAXD,IAAAA,EAAO,aAAIC,IAAAA,EAAU,SACvCF,GAAKA,OACLG,MAAQ,CACXF,KAAAA,EACAC,QAAAA,ICTAE,EAAW,GAQXC,EAJe,oBAAZC,SACa,MAApBA,QAAQC,UACiB,MAAzBD,QAAQC,SAASC,KAGfC,EAAOC,gBAAgBF,OACvBC,EAAOC,gBAAgBC,MAgB3BF,EAAOG,wBAbqBC,cACtBA,KAAOT,kBACF,CACLU,WAAY,KACZC,SAAUX,EAASS,GACnBG,YAAaH,oBAGCR,EAAmBQ,mBAA/BI,UACNb,EAASS,GAAOI,EAAIF,SACbE,6CAuEIC,EAAuB,SAACC,UAtCV,SAACA,WACpBC,EAAoB,GACjBC,EAAS,EAAGA,EAASF,EAAKG,OAAQD,GAAU,EAC9B,MAAjBF,EAAKE,IACPD,EAAQG,KAAKF,UAGVD,EAgCcI,CAAmBL,GAErCM,KAAI,SAAAC,UA/B6B,SACpCP,EACAO,OAEIC,EAAYR,EAAKO,MACH,MAAdC,QACI,IAAIC,MAAM,yDAEdC,EAAe,EACfR,EAASK,EAAmB,EACxBJ,EAAWH,EAAXG,OACgB,IAAjBO,GAAsBR,EAASC,GAAQ,KACtCQ,EAAcX,EAAKE,GACL,MAAhBS,EACFD,GAAgB,EACS,MAAhBC,IACTD,GAAgB,GAElBR,GAAU,EACVM,GAAaG,aAGNC,KAAKC,MAAML,GAClB,MAAOM,UACA,MAQLC,CAA8Bf,EAAMO,MAErCS,OAAOC,UAGCC,EAAiB,SAACC,SACtB,aAAcA,0BA5EKC,8BFmhBrB,SAAgBC,EAAMC,GAC5B,IACC,IAAIC,GEjhBAC,EAD4B,iBAAnBJ,EACGR,KAAKC,MAAMO,GAEXA,kBAGS9B,EAAOmC,OAAOD,mBAA/BE,0BACkBpC,EAAOqC,QAAQD,EAAUF,EAAU,6BAArDI,OAEAC,EAAOC,OAAOD,KAAKL,GACnBO,EAAa,IAAIC,IAAIF,OAAOD,KAAKD,IACjCK,EAAaJ,EAAKb,QAAO,SAAAkB,UAAQH,EAAWI,IAAID,aAC5B,IAAtBD,EAAW9B,OACN,IAAIvB,GAAY,GAElB,IAAIA,GACT,EACA,gCACAgC,KAAKwB,UAAUH,WFigBlB,MAAMnB,GACP,OAAOQ,EAAQR,OErhBTU,EFuhBP,OAAID,GAAUA,EAAOc,KACbd,EAAOc,UAAK,EAAQf,GAErBC,eErgBGe,UACA,IAAI1D,GAAY,EAAO0D,EAAIC,KAAMD,EAAIE,+GAuDV,SAACxC,UAC9BD,EAAqBC,GAAMgB,QAAO,SAAAG,UAAOD,EAAeC"} | ||
| {"version":3,"file":"jsonld-checker.cjs.production.min.js","sources":["../node_modules/babel-plugin-transform-async-to-promises/helpers.js","../src/CheckResult.tsx","../src/github.ts","../src/index.ts"],"sourcesContent":["// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","class CheckResult {\n ok: boolean;\n\n error?: {\n type: string;\n details: string;\n };\n\n constructor(ok: boolean, type = '', details = '') {\n this.ok = ok;\n this.error = {\n type,\n details,\n };\n }\n}\n\nexport default CheckResult;\n","/* eslint-disable import/prefer-default-export */\nconst fetch = require('node-fetch');\n\nconst githubApi = async endpoint => {\n return fetch(`https://api.github.com/repos/${endpoint}`).then(res =>\n res.json()\n );\n};\n\nconst getFiles = async (user, repo, ref = 'HEAD') => {\n const all = await githubApi(`${user}/${repo}/git/trees/${ref}?recursive=1`);\n const files = all.tree.filter(node => node.type === 'blob');\n return files;\n};\n\nexport { getFiles };\n","import jsonld from 'jsonld';\nimport CheckResult from './CheckResult';\n\n// TODO: refactor\nexport * from './github';\n\nconst CONTEXTS = {};\n\n// From https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js\nconst isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\nconst nodeDocumentLoader = isNode\n ? jsonld.documentLoaders.node()\n : jsonld.documentLoaders.xhr();\n\n// change the default document loader\nconst customLoader = async (url: string) => {\n if (url in CONTEXTS) {\n return {\n contextUrl: null,\n document: CONTEXTS[url],\n documentUrl: url,\n };\n }\n const res = await nodeDocumentLoader(url);\n CONTEXTS[url] = res.document;\n return res;\n};\n\njsonld.documentLoader = customLoader;\n\nconst isNotJsonLdPropery = property => !['@id', '@type'].includes(property);\n\nexport const check = async (jsonldDocument: string | object) => {\n try {\n let jsonldDoc: object;\n if (typeof jsonldDocument === 'string') {\n jsonldDoc = JSON.parse(jsonldDocument);\n } else {\n jsonldDoc = jsonldDocument;\n }\n // Remove all keys not present in the jsonld context\n const expanded = await jsonld.expand(jsonldDoc);\n const compacted = await jsonld.compact(expanded, jsonldDoc['@context']);\n // Check which keys have been removed\n const keys = Object.keys(jsonldDoc).filter(isNotJsonLdPropery);\n const newKeysSet = new Set(Object.keys(compacted));\n const difference = keys.filter(key => !newKeysSet.has(key));\n if (difference.length === 0) {\n return new CheckResult(true);\n }\n return new CheckResult(\n false,\n 'MISSING_PROPERTIES_IN_CONTEXT',\n JSON.stringify(difference)\n );\n } catch (err) {\n return new CheckResult(false, err.name, err.message);\n }\n};\n\nconst getAllOpenBrackets = (text: string) => {\n const results: number[] = [];\n for (let cursor = 0; cursor < text.length; cursor += 1) {\n if (text[cursor] === '{') {\n results.push(cursor);\n }\n }\n return results;\n};\n\nconst getStringUntilMatchingBracket = (\n text: string,\n openBracketIndex: number\n) => {\n let substring = text[openBracketIndex];\n if (substring !== '{') {\n throw new Error('start must be the index of an opening bracket');\n }\n let bracketCount = 1;\n let cursor = openBracketIndex + 1;\n const { length } = text;\n while (bracketCount !== 0 && cursor < length) {\n const currentChar = text[cursor];\n if (currentChar === '{') {\n bracketCount += 1;\n } else if (currentChar === '}') {\n bracketCount -= 1;\n }\n cursor += 1;\n substring += currentChar;\n }\n try {\n return JSON.parse(substring);\n } catch (e) {\n return null;\n }\n};\n\nexport const getAllJsonFromString = (text: string): Array<Object> => {\n const openBrackets = getAllOpenBrackets(text);\n return openBrackets\n .map(openBracketIndex =>\n getStringUntilMatchingBracket(text, openBracketIndex)\n )\n .filter(Boolean);\n};\n\nexport const isJsonLdObject = (obj: Object): Boolean => {\n return '@context' in obj;\n};\n\nexport const getAllJsonLdFromString = (text: string) => {\n return getAllJsonFromString(text).filter(obj => isJsonLdObject(obj));\n};\n\nexport { CheckResult };\n"],"names":["Symbol","iterator","asyncIterator","CheckResult","ok","type","details","error","fetch","require","CONTEXTS","nodeDocumentLoader","process","versions","node","jsonld","documentLoaders","xhr","documentLoader","url","contextUrl","document","documentUrl","res","isNotJsonLdPropery","property","includes","getAllJsonFromString","text","results","cursor","length","push","getAllOpenBrackets","map","openBracketIndex","substring","Error","bracketCount","currentChar","JSON","parse","e","getStringUntilMatchingBracket","filter","Boolean","isJsonLdObject","obj","jsonldDocument","body","recover","result","jsonldDoc","expand","expanded","compact","compacted","keys","Object","newKeysSet","Set","difference","key","has","stringify","then","err","name","message","user","repo","ref","endpoint","json","githubApi","all","tree"],"mappings":"iJAoK+D,oBAAXA,SAA0BA,OAAOC,WAAaD,OAAOC,SAAWD,OAAO,qBA6DvD,oBAAXA,SAA0BA,OAAOE,gBAAkBF,OAAOE,cAAgBF,OAAO,8BCjOpIG,EAQJ,SAAYC,EAAaC,EAAWC,YAAXD,IAAAA,EAAO,aAAIC,IAAAA,EAAU,SACvCF,GAAKA,OACLG,MAAQ,CACXF,KAAAA,EACAC,QAAAA,ICXAE,EAAQC,QAAQ,cCKhBC,EAAW,GAQXC,EAJe,oBAAZC,SACa,MAApBA,QAAQC,UACiB,MAAzBD,QAAQC,SAASC,KAGfC,EAAOC,gBAAgBF,OACvBC,EAAOC,gBAAgBC,MAgB3BF,EAAOG,wBAbqBC,cACtBA,KAAOT,kBACF,CACLU,WAAY,KACZC,SAAUX,EAASS,GACnBG,YAAaH,oBAGCR,EAAmBQ,mBAA/BI,UACNb,EAASS,GAAOI,EAAIF,SACbE,yCAKT,IAAMC,EAAqB,SAAAC,UAAa,CAAC,MAAO,SAASC,SAASD,IAoErDE,EAAuB,SAACC,UAtCV,SAACA,WACpBC,EAAoB,GACjBC,EAAS,EAAGA,EAASF,EAAKG,OAAQD,GAAU,EAC9B,MAAjBF,EAAKE,IACPD,EAAQG,KAAKF,UAGVD,EAgCcI,CAAmBL,GAErCM,KAAI,SAAAC,UA/B6B,SACpCP,EACAO,OAEIC,EAAYR,EAAKO,MACH,MAAdC,QACI,IAAIC,MAAM,yDAEdC,EAAe,EACfR,EAASK,EAAmB,EACxBJ,EAAWH,EAAXG,OACgB,IAAjBO,GAAsBR,EAASC,GAAQ,KACtCQ,EAAcX,EAAKE,GACL,MAAhBS,EACFD,GAAgB,EACS,MAAhBC,IACTD,GAAgB,GAElBR,GAAU,EACVM,GAAaG,aAGNC,KAAKC,MAAML,GAClB,MAAOM,UACA,MAQLC,CAA8Bf,EAAMO,MAErCS,OAAOC,UAGCC,EAAiB,SAACC,SACtB,aAAcA,gDA5EKC,8BH8gBrB,SAAgBC,EAAMC,GAC5B,IACC,IAAIC,GG5gBAC,EAD4B,iBAAnBJ,EACGR,KAAKC,MAAMO,GAEXA,kBAGSjC,EAAOsC,OAAOD,mBAA/BE,0BACkBvC,EAAOwC,QAAQD,EAAUF,EAAU,6BAArDI,OAEAC,EAAOC,OAAOD,KAAKL,GAAWR,OAAOpB,GACrCmC,EAAa,IAAIC,IAAIF,OAAOD,KAAKD,IACjCK,EAAaJ,EAAKb,QAAO,SAAAkB,UAAQH,EAAWI,IAAID,aAC5B,IAAtBD,EAAW9B,OACN,IAAI5B,GAAY,GAElB,IAAIA,GACT,EACA,gCACAqC,KAAKwB,UAAUH,WH4flB,MAAMnB,GACP,OAAOQ,EAAQR,OGhhBTU,EHkhBP,OAAID,GAAUA,EAAOc,KACbd,EAAOc,UAAK,EAAQf,GAErBC,eGhgBGe,UACA,IAAI/D,GAAY,EAAO+D,EAAIC,KAAMD,EAAIE,+GAuDV,SAACxC,UAC9BD,EAAqBC,GAAMgB,QAAO,SAAAG,UAAOD,EAAeC,iCD3GzCsB,EAAMC,EAAMC,YAAAA,IAAAA,EAAM,4CANlBC,8BACfhE,kCAAsCgE,GAAYP,MAAK,SAAA1C,UAC5DA,EAAIkD,8CAKYC,CAAaL,MAAQC,gBAAkBC,kCAAnDI,UACQA,EAAIC,KAAKhC,QAAO,SAAA9B,SAAsB,SAAdA,EAAKT"} |
@@ -38,2 +38,32 @@ import jsonld from 'jsonld'; | ||
| /* eslint-disable import/prefer-default-export */ | ||
| var fetch = /*#__PURE__*/require('node-fetch'); | ||
| var githubApi = function githubApi(endpoint) { | ||
| try { | ||
| return Promise.resolve(fetch("https://api.github.com/repos/" + endpoint).then(function (res) { | ||
| return res.json(); | ||
| })); | ||
| } catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }; | ||
| var getFiles = function getFiles(user, repo, ref) { | ||
| if (ref === void 0) { | ||
| ref = 'HEAD'; | ||
| } | ||
| try { | ||
| return Promise.resolve(githubApi(user + "/" + repo + "/git/trees/" + ref + "?recursive=1")).then(function (all) { | ||
| var files = all.tree.filter(function (node) { | ||
| return node.type === 'blob'; | ||
| }); | ||
| return files; | ||
| }); | ||
| } catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }; | ||
| var CONTEXTS = {}; // From https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js | ||
@@ -64,2 +94,7 @@ | ||
| jsonld.documentLoader = customLoader; | ||
| var isNotJsonLdPropery = function isNotJsonLdPropery(property) { | ||
| return !['@id', '@type'].includes(property); | ||
| }; | ||
| var check = function check(jsonldDocument) { | ||
@@ -80,3 +115,3 @@ try { | ||
| // Check which keys have been removed | ||
| var keys = Object.keys(jsonldDoc); | ||
| var keys = Object.keys(jsonldDoc).filter(isNotJsonLdPropery); | ||
| var newKeysSet = new Set(Object.keys(compacted)); | ||
@@ -155,3 +190,3 @@ var difference = keys.filter(function (key) { | ||
| export { check, getAllJsonFromString, getAllJsonLdFromString, isJsonLdObject }; | ||
| export { CheckResult, check, getAllJsonFromString, getAllJsonLdFromString, getFiles, isJsonLdObject }; | ||
| //# sourceMappingURL=jsonld-checker.esm.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"jsonld-checker.esm.js","sources":["../node_modules/babel-plugin-transform-async-to-promises/helpers.js","../src/CheckResult.tsx","../src/index.ts"],"sourcesContent":["// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","class CheckResult {\n ok: boolean;\n\n error: {\n type: string;\n details: string;\n };\n\n constructor(ok: boolean, type = '', details = '') {\n this.ok = ok;\n this.error = {\n type,\n details,\n };\n }\n}\n\nexport default CheckResult;\n","import jsonld from 'jsonld';\nimport CheckResult from './CheckResult';\n\nconst CONTEXTS = {};\n\n// From https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js\nconst isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\nconst nodeDocumentLoader = isNode\n ? jsonld.documentLoaders.node()\n : jsonld.documentLoaders.xhr();\n\n// change the default document loader\nconst customLoader = async (url: string) => {\n if (url in CONTEXTS) {\n return {\n contextUrl: null,\n document: CONTEXTS[url],\n documentUrl: url,\n };\n }\n const res = await nodeDocumentLoader(url);\n CONTEXTS[url] = res.document;\n return res;\n};\n\njsonld.documentLoader = customLoader;\n\nexport const check = async (jsonldDocument: string | object) => {\n try {\n let jsonldDoc: object;\n if (typeof jsonldDocument === 'string') {\n jsonldDoc = JSON.parse(jsonldDocument);\n } else {\n jsonldDoc = jsonldDocument;\n }\n // Remove all keys not present in the jsonld context\n const expanded = await jsonld.expand(jsonldDoc);\n const compacted = await jsonld.compact(expanded, jsonldDoc['@context']);\n // Check which keys have been removed\n const keys = Object.keys(jsonldDoc);\n const newKeysSet = new Set(Object.keys(compacted));\n const difference = keys.filter(key => !newKeysSet.has(key));\n if (difference.length === 0) {\n return new CheckResult(true);\n }\n return new CheckResult(\n false,\n 'MISSING_PROPERTIES_IN_CONTEXT',\n JSON.stringify(difference)\n );\n } catch (err) {\n return new CheckResult(false, err.name, err.message);\n }\n};\n\nconst getAllOpenBrackets = (text: string) => {\n const results: number[] = [];\n for (let cursor = 0; cursor < text.length; cursor += 1) {\n if (text[cursor] === '{') {\n results.push(cursor);\n }\n }\n return results;\n};\n\nconst getStringUntilMatchingBracket = (\n text: string,\n openBracketIndex: number\n) => {\n let substring = text[openBracketIndex];\n if (substring !== '{') {\n throw new Error('start must be the index of an opening bracket');\n }\n let bracketCount = 1;\n let cursor = openBracketIndex + 1;\n const { length } = text;\n while (bracketCount !== 0 && cursor < length) {\n const currentChar = text[cursor];\n if (currentChar === '{') {\n bracketCount += 1;\n } else if (currentChar === '}') {\n bracketCount -= 1;\n }\n cursor += 1;\n substring += currentChar;\n }\n try {\n return JSON.parse(substring);\n } catch (e) {\n return null;\n }\n};\n\nexport const getAllJsonFromString = (text: string): Array<Object> => {\n const openBrackets = getAllOpenBrackets(text);\n return openBrackets\n .map(openBracketIndex =>\n getStringUntilMatchingBracket(text, openBracketIndex)\n )\n .filter(Boolean);\n};\n\nexport const isJsonLdObject = (obj: Object): Boolean => {\n return '@context' in obj;\n};\n\nexport const getAllJsonLdFromString = (text: string) => {\n return getAllJsonFromString(text).filter(obj => isJsonLdObject(obj));\n};\n"],"names":["CheckResult","ok","type","details","error","CONTEXTS","isNode","process","versions","node","nodeDocumentLoader","jsonld","documentLoaders","xhr","customLoader","url","contextUrl","document","documentUrl","res","documentLoader","check","jsonldDocument","jsonldDoc","JSON","parse","expand","expanded","compact","compacted","keys","Object","newKeysSet","Set","difference","filter","key","has","length","stringify","err","name","message","getAllOpenBrackets","text","results","cursor","push","getStringUntilMatchingBracket","openBracketIndex","substring","Error","bracketCount","currentChar","e","getAllJsonFromString","openBrackets","map","Boolean","isJsonLdObject","obj","getAllJsonLdFromString"],"mappings":"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"} | ||
| {"version":3,"file":"jsonld-checker.esm.js","sources":["../node_modules/babel-plugin-transform-async-to-promises/helpers.js","../src/CheckResult.tsx","../src/github.ts","../src/index.ts"],"sourcesContent":["// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","class CheckResult {\n ok: boolean;\n\n error?: {\n type: string;\n details: string;\n };\n\n constructor(ok: boolean, type = '', details = '') {\n this.ok = ok;\n this.error = {\n type,\n details,\n };\n }\n}\n\nexport default CheckResult;\n","/* eslint-disable import/prefer-default-export */\nconst fetch = require('node-fetch');\n\nconst githubApi = async endpoint => {\n return fetch(`https://api.github.com/repos/${endpoint}`).then(res =>\n res.json()\n );\n};\n\nconst getFiles = async (user, repo, ref = 'HEAD') => {\n const all = await githubApi(`${user}/${repo}/git/trees/${ref}?recursive=1`);\n const files = all.tree.filter(node => node.type === 'blob');\n return files;\n};\n\nexport { getFiles };\n","import jsonld from 'jsonld';\nimport CheckResult from './CheckResult';\n\n// TODO: refactor\nexport * from './github';\n\nconst CONTEXTS = {};\n\n// From https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js\nconst isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\nconst nodeDocumentLoader = isNode\n ? jsonld.documentLoaders.node()\n : jsonld.documentLoaders.xhr();\n\n// change the default document loader\nconst customLoader = async (url: string) => {\n if (url in CONTEXTS) {\n return {\n contextUrl: null,\n document: CONTEXTS[url],\n documentUrl: url,\n };\n }\n const res = await nodeDocumentLoader(url);\n CONTEXTS[url] = res.document;\n return res;\n};\n\njsonld.documentLoader = customLoader;\n\nconst isNotJsonLdPropery = property => !['@id', '@type'].includes(property);\n\nexport const check = async (jsonldDocument: string | object) => {\n try {\n let jsonldDoc: object;\n if (typeof jsonldDocument === 'string') {\n jsonldDoc = JSON.parse(jsonldDocument);\n } else {\n jsonldDoc = jsonldDocument;\n }\n // Remove all keys not present in the jsonld context\n const expanded = await jsonld.expand(jsonldDoc);\n const compacted = await jsonld.compact(expanded, jsonldDoc['@context']);\n // Check which keys have been removed\n const keys = Object.keys(jsonldDoc).filter(isNotJsonLdPropery);\n const newKeysSet = new Set(Object.keys(compacted));\n const difference = keys.filter(key => !newKeysSet.has(key));\n if (difference.length === 0) {\n return new CheckResult(true);\n }\n return new CheckResult(\n false,\n 'MISSING_PROPERTIES_IN_CONTEXT',\n JSON.stringify(difference)\n );\n } catch (err) {\n return new CheckResult(false, err.name, err.message);\n }\n};\n\nconst getAllOpenBrackets = (text: string) => {\n const results: number[] = [];\n for (let cursor = 0; cursor < text.length; cursor += 1) {\n if (text[cursor] === '{') {\n results.push(cursor);\n }\n }\n return results;\n};\n\nconst getStringUntilMatchingBracket = (\n text: string,\n openBracketIndex: number\n) => {\n let substring = text[openBracketIndex];\n if (substring !== '{') {\n throw new Error('start must be the index of an opening bracket');\n }\n let bracketCount = 1;\n let cursor = openBracketIndex + 1;\n const { length } = text;\n while (bracketCount !== 0 && cursor < length) {\n const currentChar = text[cursor];\n if (currentChar === '{') {\n bracketCount += 1;\n } else if (currentChar === '}') {\n bracketCount -= 1;\n }\n cursor += 1;\n substring += currentChar;\n }\n try {\n return JSON.parse(substring);\n } catch (e) {\n return null;\n }\n};\n\nexport const getAllJsonFromString = (text: string): Array<Object> => {\n const openBrackets = getAllOpenBrackets(text);\n return openBrackets\n .map(openBracketIndex =>\n getStringUntilMatchingBracket(text, openBracketIndex)\n )\n .filter(Boolean);\n};\n\nexport const isJsonLdObject = (obj: Object): Boolean => {\n return '@context' in obj;\n};\n\nexport const getAllJsonLdFromString = (text: string) => {\n return getAllJsonFromString(text).filter(obj => isJsonLdObject(obj));\n};\n\nexport { CheckResult };\n"],"names":["CheckResult","ok","type","details","error","fetch","require","githubApi","endpoint","then","res","json","getFiles","user","repo","ref","all","files","tree","filter","node","CONTEXTS","isNode","process","versions","nodeDocumentLoader","jsonld","documentLoaders","xhr","customLoader","url","contextUrl","document","documentUrl","documentLoader","isNotJsonLdPropery","property","includes","check","jsonldDocument","jsonldDoc","JSON","parse","expand","expanded","compact","compacted","keys","Object","newKeysSet","Set","difference","key","has","length","stringify","err","name","message","getAllOpenBrackets","text","results","cursor","push","getStringUntilMatchingBracket","openBracketIndex","substring","Error","bracketCount","currentChar","e","getAllJsonFromString","openBrackets","map","Boolean","isJsonLdObject","obj","getAllJsonLdFromString"],"mappings":"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"} |
@@ -31,2 +31,7 @@ declare const context: { | ||
| }; | ||
| declare const docWithAtProperty: { | ||
| '@context': string[]; | ||
| '@type': string; | ||
| name: string; | ||
| }; | ||
| declare const docNotJsonLd: { | ||
@@ -36,2 +41,2 @@ bonjour: string; | ||
| declare const text: string; | ||
| export { context, docNotJsonLd, docWithExhaustiveContext, docWithInvalidContext, docWithNotExhaustiveContext, text, }; | ||
| export { context, docNotJsonLd, docWithExhaustiveContext, docWithInvalidContext, docWithNotExhaustiveContext, docWithAtProperty, text, }; |
+5
-6
| { | ||
| "name": "jsonld-checker", | ||
| "author": "gjgd", | ||
| "version": "0.1.1", | ||
| "version": "0.1.3", | ||
| "license": "MIT", | ||
@@ -10,4 +10,3 @@ "main": "dist/index.js", | ||
| "files": [ | ||
| "dist", | ||
| "src" | ||
| "dist" | ||
| ], | ||
@@ -44,5 +43,5 @@ "engines": { | ||
| "dependencies": { | ||
| "jsonld": "^3.1.1" | ||
| }, | ||
| "gitHead": "ba13ad23aec3fc7a22315993006fcea6fcd2161b" | ||
| "jsonld": "^3.1.1", | ||
| "node-fetch": "^2.6.0" | ||
| } | ||
| } |
| class CheckResult { | ||
| ok: boolean; | ||
| error: { | ||
| type: string; | ||
| details: string; | ||
| }; | ||
| constructor(ok: boolean, type = '', details = '') { | ||
| this.ok = ok; | ||
| this.error = { | ||
| type, | ||
| details, | ||
| }; | ||
| } | ||
| } | ||
| export default CheckResult; |
-113
| import jsonld from 'jsonld'; | ||
| import CheckResult from './CheckResult'; | ||
| const CONTEXTS = {}; | ||
| // From https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js | ||
| const isNode = | ||
| typeof process !== 'undefined' && | ||
| process.versions != null && | ||
| process.versions.node != null; | ||
| const nodeDocumentLoader = isNode | ||
| ? jsonld.documentLoaders.node() | ||
| : jsonld.documentLoaders.xhr(); | ||
| // change the default document loader | ||
| const customLoader = async (url: string) => { | ||
| if (url in CONTEXTS) { | ||
| return { | ||
| contextUrl: null, | ||
| document: CONTEXTS[url], | ||
| documentUrl: url, | ||
| }; | ||
| } | ||
| const res = await nodeDocumentLoader(url); | ||
| CONTEXTS[url] = res.document; | ||
| return res; | ||
| }; | ||
| jsonld.documentLoader = customLoader; | ||
| export const check = async (jsonldDocument: string | object) => { | ||
| try { | ||
| let jsonldDoc: object; | ||
| if (typeof jsonldDocument === 'string') { | ||
| jsonldDoc = JSON.parse(jsonldDocument); | ||
| } else { | ||
| jsonldDoc = jsonldDocument; | ||
| } | ||
| // Remove all keys not present in the jsonld context | ||
| const expanded = await jsonld.expand(jsonldDoc); | ||
| const compacted = await jsonld.compact(expanded, jsonldDoc['@context']); | ||
| // Check which keys have been removed | ||
| const keys = Object.keys(jsonldDoc); | ||
| const newKeysSet = new Set(Object.keys(compacted)); | ||
| const difference = keys.filter(key => !newKeysSet.has(key)); | ||
| if (difference.length === 0) { | ||
| return new CheckResult(true); | ||
| } | ||
| return new CheckResult( | ||
| false, | ||
| 'MISSING_PROPERTIES_IN_CONTEXT', | ||
| JSON.stringify(difference) | ||
| ); | ||
| } catch (err) { | ||
| return new CheckResult(false, err.name, err.message); | ||
| } | ||
| }; | ||
| const getAllOpenBrackets = (text: string) => { | ||
| const results: number[] = []; | ||
| for (let cursor = 0; cursor < text.length; cursor += 1) { | ||
| if (text[cursor] === '{') { | ||
| results.push(cursor); | ||
| } | ||
| } | ||
| return results; | ||
| }; | ||
| const getStringUntilMatchingBracket = ( | ||
| text: string, | ||
| openBracketIndex: number | ||
| ) => { | ||
| let substring = text[openBracketIndex]; | ||
| if (substring !== '{') { | ||
| throw new Error('start must be the index of an opening bracket'); | ||
| } | ||
| let bracketCount = 1; | ||
| let cursor = openBracketIndex + 1; | ||
| const { length } = text; | ||
| while (bracketCount !== 0 && cursor < length) { | ||
| const currentChar = text[cursor]; | ||
| if (currentChar === '{') { | ||
| bracketCount += 1; | ||
| } else if (currentChar === '}') { | ||
| bracketCount -= 1; | ||
| } | ||
| cursor += 1; | ||
| substring += currentChar; | ||
| } | ||
| try { | ||
| return JSON.parse(substring); | ||
| } catch (e) { | ||
| return null; | ||
| } | ||
| }; | ||
| export const getAllJsonFromString = (text: string): Array<Object> => { | ||
| const openBrackets = getAllOpenBrackets(text); | ||
| return openBrackets | ||
| .map(openBracketIndex => | ||
| getStringUntilMatchingBracket(text, openBracketIndex) | ||
| ) | ||
| .filter(Boolean); | ||
| }; | ||
| export const isJsonLdObject = (obj: Object): Boolean => { | ||
| return '@context' in obj; | ||
| }; | ||
| export const getAllJsonLdFromString = (text: string) => { | ||
| return getAllJsonFromString(text).filter(obj => isJsonLdObject(obj)); | ||
| }; |
| <!DOCTYPE html> | ||
| <html> | ||
| <head> | ||
| <title>Universal Wallet 2020</title> | ||
| <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> | ||
| <!-- | ||
| === NOTA BENE === | ||
| For the three scripts below, if your spec resides on dev.w3 you can check them | ||
| out in the same tree and use relative links so that they'll work offline, | ||
| --> | ||
| <script | ||
| src="https://www.w3.org/Tools/respec/respec-w3c-common" | ||
| class="remove" | ||
| ></script> | ||
| <script src="./common.js" class="remove"></script> | ||
| <script type="text/javascript" class="remove"> | ||
| var respecConfig = { | ||
| // specification status (e.g., WD, LCWD, NOTE, etc.). If in doubt use ED. | ||
| specStatus: "ED", | ||
| // the specification's short name, as in http://www.w3.org/TR/short-name/ | ||
| shortName: "universal-wallet-2020", | ||
| // subtitle for the spec | ||
| subtitle: | ||
| "This specification describes a portable, extensible, JSON-LD wallet representation, supporting digital currencies and credentials.", | ||
| // if you wish the publication date to be other than today, set this | ||
| //publishDate: "2019-03-26", | ||
| //crEnd: "2019-04-23", | ||
| //implementationReportURI: "https://w3c.github.io/sdh-test-suite", | ||
| previousMaturity: "UNOFFICIAL", | ||
| previousPublishDate: "2020-03-25", | ||
| // if there is a previously published draft, uncomment this and set its YYYY-MM-DD date | ||
| // and its maturity status | ||
| // previousPublishDate: "1977-03-15", | ||
| // previousMaturity: "WD", | ||
| // extend the bibliography entries | ||
| localBiblio: ccg.localBiblio, | ||
| doJsonLd: true, | ||
| github: { | ||
| repoURL: "https://github.com/transmute-industries/universal-wallet/", | ||
| // Set branch to master (default is gh-pages) to fix the "Commit history link" | ||
| branch: 'master', | ||
| }, | ||
| includePermalinks: false, | ||
| // if there a publicly available Editor's Draft, this is the link | ||
| edDraftURI: "https://transmute-industries.github.io/universal-wallet/", | ||
| // if this is a LCWD, uncomment and set the end of its review period | ||
| // lcEnd: "2009-08-05", | ||
| // editors, add as many as you like | ||
| // only "name" is required | ||
| editors: [ | ||
| { | ||
| name: "Orie Steele", | ||
| url: "https://www.linkedin.com/in/or13b/", | ||
| company: "Transmute", | ||
| companyURL: "https://transmute.industries/", | ||
| }, | ||
| ], | ||
| // authors, add as many as you like. | ||
| // This is optional, uncomment if you have authors as well as editors. | ||
| // only "name" is required. Same format as editors. | ||
| authors: [ | ||
| { | ||
| name: "Orie Steele", | ||
| url: "https://www.linkedin.com/in/or13b/", | ||
| company: "Transmute", | ||
| companyURL: "https://transmute.industries/", | ||
| }, | ||
| { | ||
| name: "Margo Johnson", | ||
| url: "https://www.linkedin.com/in/margojohnson/", | ||
| company: "Transmute", | ||
| companyURL: "https://transmute.industries/", | ||
| }, | ||
| { | ||
| name: "Guillaume Dardelet", | ||
| url: "https://www.linkedin.com/in/guillaume-dardelet/", | ||
| company: "Transmute", | ||
| companyURL: "https://transmute.industries/", | ||
| }, | ||
| ], | ||
| // name of the WG | ||
| wg: "Credentials Community Group", | ||
| // URI of the public WG page | ||
| wgURI: "https://www.w3.org/community/credentials/", | ||
| // name (with the @w3c.org) of the public mailing to which comments are due | ||
| wgPublicList: "public-credentials", | ||
| // URI of the patent status for this WG, for Rec-track documents | ||
| // !!!! IMPORTANT !!!! | ||
| // This is important for Rec-track documents, do not copy a patent URI from a random | ||
| // document unless you know what you're doing. If in doubt ask your friendly neighborhood | ||
| // Team Contact. | ||
| //wgPatentURI: "https://www.w3.org/2004/01/pp-impl/98922/status", | ||
| maxTocLevel: 2, | ||
| inlineCSS: true, | ||
| }; | ||
| </script> | ||
| <style> | ||
| pre .highlight { | ||
| font-weight: bold; | ||
| color: green; | ||
| } | ||
| pre .comment { | ||
| font-weight: bold; | ||
| color: Gray; | ||
| } | ||
| .color-text { | ||
| font-weight: bold; | ||
| text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; | ||
| } | ||
| ol.algorithm { | ||
| counter-reset: numsection; | ||
| list-style-type: none; | ||
| } | ||
| ol.algorithm li { | ||
| margin: 0.5em 0; | ||
| } | ||
| ol.algorithm li:before { | ||
| font-weight: bold; | ||
| counter-increment: numsection; | ||
| content: counters(numsection, ".") ") "; | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <section id="abstract"> | ||
| <p> | ||
| This specification describes a portable, extensible, JSON-LD wallet, | ||
| supporting digital currencies and credentials. | ||
| </p> | ||
| </section> | ||
| <section id="sotd"> | ||
| <p> | ||
| This document is experimental and is undergoing heavy development. It is | ||
| inadvisable to implement the specification in its current form. An | ||
| <a href="https://github.com/transmute-industries/universal-wallet/tree/master/packages/universal-wallet" | ||
| >experimental implementation</a | ||
| > | ||
| is available. | ||
| </p> | ||
| </section> | ||
| <section class="informative"> | ||
| <h2>Introduction</h2> | ||
| <p> | ||
| Traditional physical wallets are used to store a variety of personal | ||
| assets such as cash, credit cards, driver license, health insurance, and | ||
| business cards. Today we also have a wide variety of digital wallets to | ||
| store and access digital versions of these same assets, with more | ||
| options coming into the market every day. However, each wallet | ||
| represents data and capabilities differently, sometimes intentionally to | ||
| facilitate vendor lock in. | ||
| </p> | ||
| <p> | ||
| Imagine you had to carry a dozen different wallets with you at all | ||
| times, and to use each one independently based on the situation. The | ||
| wallets are disconnected, and the burden is on either the holder or the | ||
| verifier to request all required information for each transaction. The | ||
| result is a cumbersome user experience (not dissimilar to account and | ||
| password management today) and expensive business implementation to | ||
| support different wallets. What is missing is a standardized structure - | ||
| a universal wallet - that can effectively point to and comprehend each | ||
| digital asset in its current location. This universal wallet not only | ||
| offers a convenient access point for people and machines to organize | ||
| their assets (akin to a traditional physical wallet), but it also | ||
| enables awareness and relationships between those assets as needed for | ||
| real-world use. | ||
| </p> | ||
| <p> | ||
| The purpose of this specification is to design an abstract data model | ||
| and set of interfaces that approximate a physical wallet system and its | ||
| common uses. | ||
| </p> | ||
| <p> | ||
| There are many existing software systems which manage subsets or | ||
| supersets of the information represented in digital wallets. This | ||
| specification aims to be compatible with those systems, by allowing them | ||
| to continue to manage the information and inferfaces, so long as they | ||
| can be adequately described at both a data model, and interface level. | ||
| </p> | ||
| <p> | ||
| The property of representing data and interfaces as they exist, where | ||
| they exist today, is a critical component of this specification. We | ||
| fully expect this specification to live or die by its ability to achieve | ||
| this property. | ||
| </p> | ||
| </section> | ||
| <section id="terms" class="normative"> | ||
| <h2>Terminology</h2> | ||
| <p> | ||
| The following terms are used to describe concepts involved in the | ||
| <a>universal wallet</a>. | ||
| </p> | ||
| <dl> | ||
| <dt><dfn>wallet</dfn></dt> | ||
| <dd> | ||
| A wallet is a small, flat case that can be used to carry such small | ||
| personal items as paper currency, credit cards, and identification | ||
| documents. See | ||
| <a href="https://en.wikipedia.org/wiki/Wallet">Wallet</a>. | ||
| </dd> | ||
| <dt><dfn>cryptocurrency</dfn></dt> | ||
| <dd> | ||
| A digital asset designed to work as a medium of exchange wherein | ||
| individual coin ownership records are stored in a digital ledger or | ||
| computerized database using strong cryptography to secure transaction | ||
| record entries, to control the creation of additional digital coin | ||
| records. See | ||
| <a href="https://en.wikipedia.org/wiki/Cryptocurrency" | ||
| >Cryptocurrency</a | ||
| >. | ||
| </dd> | ||
| <dt><dfn>verifiable credential</dfn></dt> | ||
| <dd> | ||
| A data model for conveying claims made by an issuer about a subject. | ||
| See [[vc-data-model]]. | ||
| </dd> | ||
| <dt><dfn>secret</dfn></dt> | ||
| <dd> | ||
| Information controlled by an <a>identity</a>. MAY be used to derive | ||
| <a>key</a>s. | ||
| </dd> | ||
| <dt><dfn>key</dfn></dt> | ||
| <dd> | ||
| A mechanism for granting or restricing access to something. MAY be | ||
| used to <a>issue</a> and <a>prove</a> <a>verifiable credentials</a>. | ||
| MAY be used to transfer and controll <a>cryptocurrency</a>. See | ||
| <a href="https://en.wikipedia.org/wiki/Key_(cryptography)" | ||
| >Key_(cryptography)</a | ||
| >. | ||
| </dd> | ||
| <dt><dfn>card</dfn></dt> | ||
| <dd> | ||
| A thin rectangular object used to store information graphically or | ||
| digitally. MAY be used to represent any wallet content type. | ||
| </dd> | ||
| <dt><dfn>meta data</dfn></dt> | ||
| <dd> | ||
| Information about other information. MAY be used to describe the | ||
| context in which information is used, or attributes of other | ||
| information. | ||
| </dd> | ||
| <dt><dfn>identity</dfn></dt> | ||
| <dd> | ||
| A unique entity. Typically represented with a unique identifier. | ||
| </dd> | ||
| <dt><dfn>controller</dfn></dt> | ||
| <dd> | ||
| The entity that has the ability to make changes to an <a>identity</a>, | ||
| <a>cryptocurrency</a> or <a>verifiable credential</a>. See | ||
| <a | ||
| href="https://w3c.github.io/did-core/#dfn-did-controllers" | ||
| target="_blank" | ||
| >DID controller</a | ||
| >, [[vc-data-model]]. | ||
| </dd> | ||
| <dt><dfn>issue</dfn></dt> | ||
| <dd> | ||
| The process of creating a <a>verifiable credential</a>. MAY require | ||
| the use of a <a>key</a>. See [[vc-data-model]]. | ||
| </dd> | ||
| <dt><dfn>prove</dfn></dt> | ||
| <dd> | ||
| The process of presenting a <a>verifiable credential</a>. MAY require | ||
| the use of a <a>key</a>. See [[vc-data-model]]. | ||
| </dd> | ||
| <dt><dfn>transfer</dfn></dt> | ||
| <dd> | ||
| The process of changing the <a>controller</a> of a | ||
| <a>cryptocurrency</a>, <a>identity</a> or | ||
| <a>verifiable credential</a>. MAY require the use of a <a>key</a>. | ||
| </dd> | ||
| <dt><dfn>agent</dfn></dt> | ||
| <dd> | ||
| A representative for an <a>identity</a>. MAY require the use of a | ||
| <a>wallet</a>. MAY support <a>transfer</a>,<a>issue</a>, <a>prove</a>. | ||
| </dd> | ||
| <dt><dfn>profile</dfn></dt> | ||
| <dd> | ||
| A profile is a named bucket for grouping wallet content. | ||
| </dd> | ||
| <dt><dfn>entropy</dfn></dt> | ||
| <dd> | ||
| Unpredictable information. Often used as a <a>secret</a> or as input to | ||
| a <a>key</a> generation algorithm. | ||
| <a href="https://en.wikipedia.org/wiki/Entropy_(information_theory)" | ||
| >Entropy_(information_theory)</a | ||
| >. | ||
| </dd> | ||
| <dt id="correlation"><dfn>correlation</dfn></dt> | ||
| <dd> | ||
| An identifier used to indicate that external parties have observed how | ||
| wallet contents are related. For example, when a public key is reused | ||
| in multiple DIDs, it conveys that some common entity is controlling | ||
| both identifiers. Tracking correlation allows for software to warn | ||
| when some new information might be about to be exposed, for example: | ||
| "Looks like you are about to send crypo currency, from an account you | ||
| frequently use to a new account you just created." | ||
| </dd> | ||
| <dt id="tags"><dfn>tags</dfn></dt> | ||
| <dd> | ||
| Human friendly text labels for organizing information. | ||
| </dd> | ||
| <dt id="note"><dfn>note</dfn></dt> | ||
| <dd> | ||
| Text note about wallet content. | ||
| </dd> | ||
| <dt id="target"><dfn>target</dfn></dt> | ||
| <dd> | ||
| The target of a wallet content. Used for representing directed | ||
| associations. | ||
| </dd> | ||
| <dt id="quorum"><dfn>quorum</dfn></dt> | ||
| <dd> | ||
| Number of controllers needed to make a valid transaction. | ||
| </dd> | ||
| <dt id="UniversalWallet2020"><dfn>universal wallet</dfn></dt> | ||
| <dd> | ||
| A digital wallet that supports <a>cryptocurrency</a>, | ||
| <a>verifiable credential</a>s and <a>card</a>s. | ||
| </dd> | ||
| <dt id="multibase"><dfn>multibase</dfn></dt> | ||
| <dd> | ||
| <a href="https://github.com/multiformats/multibase">Multibase</a> is a protocol for disambiguating the encoding of base-encoded (e.g., base32, base36, base64, base58, etc.) binary appearing in text. | ||
| </dd> | ||
| <dt id="hdPath"><dfn>hdPath</dfn></dt> | ||
| <dd> | ||
| A standard way of pointing to a key generated by a single <a href="#Mnemonic">mnemonic</a>. See | ||
| </dd> | ||
| </dl> | ||
| </section> | ||
| <section id="Data Model" class="normative"> | ||
| <h2>Data Model</h2> | ||
| <p> | ||
| Each entity is represented as a JSON Object, with relationships between | ||
| entities described using identifiers. | ||
| </p> | ||
| <section> | ||
| <h3 id="Profile">Profile</h3> | ||
| <p>A profile is a named bucket for grouping wallet content.</p> | ||
| <p> | ||
| A profile MAY be used to group all correlatable wallet items together. | ||
| </p> | ||
| <p> | ||
| A profile MAY be used to manage separate external personal, or | ||
| organizational identities and their associated data. | ||
| </p> | ||
| <p>Here is an example of a personal profile.</p> | ||
| <pre | ||
| class="example highlight" | ||
| title="A profile for a personal identity" | ||
| > | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "did:example:123456789abcdefghi", | ||
| "type": "Person", | ||
| "name": "John Smith", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "Professional software developer for Acme Corp.", | ||
| "tags": ["professional", "person"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"] | ||
| } | ||
| </pre | ||
| > | ||
| <p>Here is an example of an organization profile.</p> | ||
| <pre | ||
| class="example highlight" | ||
| title="A profile for an organizational identity" | ||
| > | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "did:example:123456789abcdefghi", | ||
| "type": "Organization", | ||
| "name": "Acme Corp.", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "A software company.", | ||
| "tags": ["professional", "organization"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"] | ||
| } | ||
| </pre | ||
| > | ||
| </section> | ||
| <section> | ||
| <h3 id="Currency"><dfn>Currency</dfn></h3> | ||
| <p>An amount of currency controlled by one or more <a>Key</a>s.</p> | ||
| <p>Here is an example of some bitcoin stored on a testnet.</p> | ||
| <pre class="example highlight" title="A bitcoin currency example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "https://live.blockcypher.com/btc-testnet/address/mu6vftfsBxJDhnUQVrZfwjzj5BL5WRvLUH/", | ||
| "type": "Currency", | ||
| "name": "BTC for Testing", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "Bitcoin reserved for testing", | ||
| "tags": ["personal"], | ||
| "amount": "7.00749119", | ||
| "currency": "BTC", | ||
| "controller": ["did:example:123"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"] | ||
| } | ||
| </pre | ||
| > | ||
| <p>Here is an example of some ethereum stored on a testnet.</p> | ||
| <pre class="example highlight" title="A currency example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "https://ropsten.etherscan.io/address/0x74fd35392f1c2a97c6080e0394b1995b0e63c8bf", | ||
| "type": "Currency", | ||
| "name": "ETH for Tips", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "Ethereum reserved for tipping software developers.", | ||
| "tags": ["personal"], | ||
| "amount": "8.142406194939252896", | ||
| "currency": "ETH", | ||
| "controller": ["did:ethr:0x74fd35392f1c2a97c6080e0394b1995b0e63c8bf#key-0"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"] | ||
| } | ||
| </pre | ||
| > | ||
| <p> | ||
| Here is an example of some ethereum stored on a testnet requiring | ||
| multisig. | ||
| </p> | ||
| <pre class="example highlight" title="A currency example"> | ||
| { | ||
| "id": "https://ropsten.etherscan.io/address/0x658e4fe24b34589492b18b1a45294be0601606a9", | ||
| "type": "Currency", | ||
| "name": "ETH for Games", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "Ethereum reserved for games.", | ||
| "tags": ["personal"], | ||
| "amount": "6,271.91386730845876097", | ||
| "currency": "ETH", | ||
| "controller": ["did:ethr:0x658e4fe24b34589492b18b1a45294be0601606a9#key-0", "did:ethr:0x658e4fe24b34589492b18b1a45294be0601606a9#key-1"], | ||
| "quorum": 2, | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"] | ||
| } | ||
| </pre | ||
| > | ||
| </section> | ||
| <section> | ||
| <h3 id="Credential"><dfn>Credential</dfn></h3> | ||
| <p>A set of claims about a subject.</p> | ||
| <p>MAY be presented with one or more <a>Key</a>s.</p> | ||
| <p> | ||
| Here is an example of a University Degree represented using the | ||
| [[vc-data-model]]. | ||
| </p> | ||
| <pre class="example highlight" title="A verifiable credential example"> | ||
| { | ||
| "@context": [ | ||
| "https://www.w3.org/2018/credentials/v1", | ||
| "https://www.w3.org/2018/credentials/examples/v1" | ||
| ], | ||
| "id": "http://example.gov/credentials/3732", | ||
| "type": [ | ||
| "VerifiableCredential", | ||
| "UniversityDegreeCredential" | ||
| ], | ||
| "issuer": { | ||
| "id": "did:example:123456789abcdefghi" | ||
| }, | ||
| "issuanceDate": "2020-03-10T04:24:12.164Z", | ||
| "credentialSubject": { | ||
| "id": "did:example:ebfeb1f712ebc6f1c276e12ec21", | ||
| "degree": { | ||
| "type": "BachelorDegree", | ||
| "name": "Bachelor of Science and Arts" | ||
| } | ||
| }, | ||
| "proof": { | ||
| "type": "JsonWebSignature2020", | ||
| "created": "2020-03-21T17:51:48Z", | ||
| "verificationMethod": "did:example:123456789abcdefghi#_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A", | ||
| "proofPurpose": "assertionMethod", | ||
| "jws": "eyJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdLCJhbGciOiJFZERTQSJ9..OPxskX37SK0FhmYygDk-S4csY_gNhCUgSOAaXFXDTZx86CmI5nU9xkqtLWg-f4cqkigKDdMVdtIqWAvaYx2JBA" | ||
| } | ||
| } | ||
| </pre | ||
| > | ||
| <p>Here is an example of an JWT Credential.</p> | ||
| <pre class="example highlight" title="An example of a JWT Credential"> | ||
| { | ||
| "protected": { | ||
| "kid": "did:web:identity.foundation#_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A", | ||
| "alg": "EdDSA" | ||
| }, | ||
| "payload": { | ||
| "sub": "did:web:identity.foundation", | ||
| "iss": "did:web:identity.foundation", | ||
| "nbf": 1586814292, | ||
| "exp": 1589406292, | ||
| "vc": { | ||
| "@context": [ | ||
| "https://www.w3.org/2018/credentials/v1", | ||
| "https://identity.foundation/.well-known/contexts/did-configuration-v0.0.jsonld" | ||
| ], | ||
| "issuer": "did:web:identity.foundation", | ||
| "issuanceDate": "2020-04-13T16:44:52-05:00", | ||
| "expirationDate": "2020-05-13T16:44:52-05:00", | ||
| "type": [ | ||
| "VerifiableCredential", | ||
| "DomainLinkageCredential" | ||
| ], | ||
| "credentialSubject": { | ||
| "id": "did:web:identity.foundation", | ||
| "domain": "identity.foundation" | ||
| } | ||
| } | ||
| }, | ||
| "signature": "qEV-lat1Wc8qKU_OLbTd07fx7tkW12QhkyiB912OsHi4FmkTWr_qMAFyW8IZxaQAsXg1E4yCRe8VsfGYaePfCg" | ||
| } | ||
| </pre | ||
| > | ||
| <p>Here is an example of an Indy Credential.</p> | ||
| <p> | ||
| Proposing to wrap Hyperledger Indy Credentials with useful meta data, | ||
| and provide a JSON-LD context for them. | ||
| </p> | ||
| <pre | ||
| class="example highlight" | ||
| title="An example of a Hyperledger Indy Credential Request" | ||
| > | ||
| { | ||
| "@context": [ | ||
| "https://www.w3.org/2018/credentials/v1", | ||
| "https://example.com/hyperledger/indy/v1" | ||
| ], | ||
| "id": "urn:uui:5e2a2cfc-ddee-4b6e-b1df-b25d5c381dd6", | ||
| "type": ["HyperledgerIndyCredentialRequest"], | ||
| "name": "Request for ZKP of PII", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description": "Some hyperledger indy request", | ||
| "tags": ["personal"], | ||
| "controller": ["did:example:123"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "request": { | ||
| "blinded_ms": { | ||
| "committed_attributes": {}, | ||
| "hidden_attributes": ["master_secret"], | ||
| "u": "65831452313882581230262709313640398502180121409437456701285942297697220273020651832867867646867694104285264882901784486060003798041322783654882887801338491262118680258721202637330550769869214264954742835710055875494951347903964659726990419477041411071293939395959337387632115898651722739118077413287212136124581126858655228247591827039715635869509104285523508350517189259095099031335038010813127434575838122472539671883003577935935805849721520698913035313700463716817299972399222663463531626690265819737278764702201558856023597942255295546958215228209847949123140888705477748125028989834201043317313234794999670960309", | ||
| "ur": null | ||
| }, | ||
| "blinded_ms_correctness_proof": { | ||
| "c": "109860678073076085235251415455172114757447490048716300713084480862613855161594", | ||
| "m_caps": { | ||
| "master_secret": "26283368873168710647823575287384506775329371134097934071944480688608740447086822076157945371978097759120680279871932367038315961209475528490588458124513336494442045082962002632630" | ||
| }, | ||
| "r_caps": {}, | ||
| "v_dash_cap": "2280251997303109215440229941746203124645437910879700880787994443943315426654016847375797993806524993944624797926394628097776282593677641139413080324847861793144967254410329241135241448735975536630491881499127637586742389241597839730305081627234920106253837671010874865272721731993787096927927219667907076510252353984721949818101724187470187212834753509683017877231098388634684162763868165666439930098806964029632419913797905735247261174021083829716744013146112407108188748399721262104236090674581750516219214189074147796588753301588559493169281419642497122075637138527711629397854490786655717000499533957790924731039896458915259618414177079172716906654070782024546965289973737179244936586584621455129955294625933138084" | ||
| }, | ||
| "cred_def_id": "97RDzn8aDviHUQQKPXg96e:3:CL:1:cred_def_tag", | ||
| "nonce": "787732518675896939298806", | ||
| "prover_did": "VsKV7grR1BUE29mG2Fm2kX" | ||
| } | ||
| } | ||
| </pre | ||
| > | ||
| <p>Here is an example of an Indy Credential Response.</p> | ||
| <pre | ||
| class="example highlight" | ||
| title="An example of a Hyperledger Indy Credential Response" | ||
| > | ||
| { | ||
| "@context": [ | ||
| "https://www.w3.org/2018/credentials/v1", | ||
| "https://example.com/hyperledger/indy/v1" | ||
| ], | ||
| "id": "urn:uui:5e2a2cfc-ddee-4b6e-b1df-b25d5c381dd6", | ||
| "type": ["HyperledgerIndyCredentialResponse"], | ||
| "name": "Response with ZKP of PII", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description": "Some hyperledger indy response", | ||
| "tags": ["personal"], | ||
| "controller": ["did:example:123"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "response": { | ||
| "cred_def_id": "97RDzn8aDviHUQQKPXg96e:3:CL:1:cred_def_tag", | ||
| "rev_reg": null, | ||
| "rev_reg_id": null, | ||
| "schema_id": "1", | ||
| "signature": { | ||
| "p_credential": { | ||
| "a": "95353830375173330011563360059148264672898064240769511250683274343595259814385881580652435846242305610602775955153225949828351822615582300818164568659759210654812158114909671116500854641792747538502940562299939329775539393907208674840307912497761924491759626001631051978385141797844740405389371307810867892266393402889311183432317570029074621797181653694420095514029762818719468632709966063515795023890061161695773247748450608404761004379958193940141773792823139355492617241722063652768459827450028875759363009052805727635793672494079344330863114982873831106116041797167251966936936806424711883143669500689657231135606", | ||
| "e": "259344723055062059907025491480697571938277889515152306249728583105665800713306759149981690559193987143012367913206299323899696942213235956742930148508371517214363847909185411372253", | ||
| "m_2": "87933324484247736755432182254530234578539725681347360397600269871642228431291", | ||
| "v": "9980048782698213650029707306155459223351306678221752614666406496131317042580709639463968555501635926971838913872812808348795802668959822338264694189410327519660902443001438239011481179716268316444260971946516885083303128874909099593395255544689704182390571217148562533306555613083811625224310294070840596291508202160863034924955239229626686346699964038203572055526536874808785883442434204203578065957249420787817929622802282705534703609382585731044976967091334711355681718119910796427448184020435027328010716618250816760780193851507746646202423419420085349209268468391222040632949331381277174716781756370851681892517534221307517998851557466372447869765146986972380453630642444945932431258454568836958535197445982382692900624253982717831288480544351529597240580788825685640983253528750762130639934973110889811748482529784" | ||
| }, | ||
| "r_credential": null | ||
| }, | ||
| "signature_correctness_proof": { | ||
| "c": "111039946245998422293228198882690698427961176580797991507430891006675146356597", | ||
| "se": "22605964272161668401729392750124222261476956426739374858535661640179592757898860024832882984205300374191737843804934686452004477429402832292629718216663316164939570354876583921389754652453753209439712424429741656877542117083074742649581822964695267610947419213636358675100501109665802628234428907141311421109128613552987278370127477282566942966334173257609909151324991747736857761765991353008203982871999513346493415736923977797669183887730008747615226061509085005490533206472742385316192550536165419027378783950304188984918698568811667562161240994301427542320560168961460242425150722543163690905028839780636297387853" | ||
| }, | ||
| "values": { | ||
| "age": { "encoded": "28", "raw": "28" }, | ||
| "height": { "encoded": "175", "raw": "175" }, | ||
| "name": { | ||
| "encoded": "1139481716457488690172217916278103335", | ||
| "raw": "Alex" | ||
| }, | ||
| "sex": { | ||
| "encoded": "5944657099558967239210949258394887428692050081607692519917050011144233115103", | ||
| "raw": "male" | ||
| } | ||
| }, | ||
| "witness": null | ||
| } | ||
| } | ||
| </pre | ||
| > | ||
| </section> | ||
| <section> | ||
| <h3 id="Key">Key</h3> | ||
| <p>A cryptographic key. Used for signing, encrypting or hashing.</p> | ||
| <p> | ||
| Here is an example of storing an Ed25519 key using JWK. | ||
| </p> | ||
| <pre class="example highlight" title="A jwk key example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "urn:uuid:53d846c8-9525-11ea-bb37-0242ac130002", | ||
| "name": "My Test Key 1", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "For testing only, totally compromised.", | ||
| "tags": ["professional", "organization", "compromised"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "controller": ["did:example:123#_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A"], | ||
| "type": "Ed25519VerificationKey2018", | ||
| "publicKeyJwk": { | ||
| "crv": "Ed25519", | ||
| "x": "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ", | ||
| "kty": "OKP", | ||
| "kid": "_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A" | ||
| }, | ||
| "privateKeyJwk": { | ||
| "crv": "Ed25519", | ||
| "x": "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ", | ||
| "d": "tP7VWE16yMQWUO2G250yvoevfbfxY25GjHglTP3ZOyU", | ||
| "kty": "OKP", | ||
| "kid": "_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A" | ||
| } | ||
| } | ||
| </pre | ||
| > | ||
| <p> | ||
| Here is an example of storing an Ed25519 key using base58. | ||
| </p> | ||
| <pre class="example highlight" title="A base58 key example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "urn:uuid:e8fc7810-9524-11ea-bb37-0242ac130002", | ||
| "name": "My Test Key 2", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "For testing only, totally compromised.", | ||
| "tags": ["professional", "organization", "compromised"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "controller": ["did:key:z6MkjjCpsoQrwnEmqHzLdxWowXk5gjbwor4urC1RPDmGeV8r#z6MkjjCpsoQrwnEmqHzLdxWowXk5gjbwor4urC1RPDmGeV8r"], | ||
| "type": "Ed25519VerificationKey2018", | ||
| "privateKeyBase58": "3CQCBKF3Mf1tU5q1FLpHpbxYrNYxLiZk4adDtfyPEfc39Wk6gsTb2qoc1ZtpqzJYdM1rG4gpaD3ZVKdkiDrkLF1p", | ||
| "publicKeyBase58": "6GwnHZARcEkJio9dxPYy6SC5sAL6PxpZAB6VYwoFjGMU" | ||
| } | ||
| </pre | ||
| > | ||
| <p> | ||
| Here is an example of a key which is stored in a remote kms. | ||
| </p> | ||
| <pre class="example highlight" title="A remote key example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "urn:uuid:e8fc7810-9524-11ea-bb37-0242ac130006", | ||
| "name": "My Test Key 3", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "For testing only, totally compromised.", | ||
| "tags": ["professional", "organization", "compromised"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "controller": ["did:key:z6MkjjCpsoQrwnEmqHzLdxWowXk5gjbwor4urC1RPDmGeV8r#z6MkjjCpsoQrwnEmqHzLdxWowXk5gjbwor4urC1RPDmGeV8r"], | ||
| "type": "Ed25519VerificationKey2018", | ||
| "publicKeyJwk": { | ||
| "crv": "Ed25519", | ||
| "x": "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ", | ||
| "kty": "OKP", | ||
| "kid": "_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A" | ||
| }, | ||
| "privateKeyWebKms": "http://example.com/kms/keystores/0/keys/0" | ||
| } | ||
| </pre | ||
| > | ||
| <p> | ||
| Here is an example of a local, hardware isolated key. | ||
| </p> | ||
| <pre class="example highlight" title="A remote key example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "urn:uuid:e8fc7810-9524-11ea-bb37-0242ac130006", | ||
| "name": "My Test Key 3", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "For testing only, totally compromised.", | ||
| "tags": ["professional", "organization", "compromised"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "controller": ["did:key:z6MkjjCpsoQrwnEmqHzLdxWowXk5gjbwor4urC1RPDmGeV8r#z6MkjjCpsoQrwnEmqHzLdxWowXk5gjbwor4urC1RPDmGeV8r"], | ||
| "type": "Ed25519VerificationKey2018", | ||
| "publicKeyJwk": { | ||
| "crv": "Ed25519", | ||
| "x": "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ", | ||
| "kty": "OKP", | ||
| "kid": "_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A" | ||
| }, | ||
| "privateKeySecureEnclave": "urn:ios:enclave:uuid:e8fc7810-9524-11ea-bb37-0242ac130789" | ||
| } | ||
| </pre | ||
| > | ||
| </section> | ||
| <section> | ||
| <h3 id="Mnemonic">Mnemonic</h3> | ||
| <p>An ordered list of memorable words.</p> | ||
| <p>MAY be used as a source of memorable <a>Entropy</a>.</p> | ||
| <p>MAY be used as input to a <a href="https://en.wikipedia.org/wiki/Key_derivation_function">KDF</a>.</p> | ||
| <p>Here is an example of storing a mnemonic as a <a>Secret</a>.</p> | ||
| <pre class="example highlight" title="A mnemonic example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "urn:uuid:c410e44a-9525-11ea-bb37-0242ac130002", | ||
| "name": "My Ropsten Mnemonic 1", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "For testing only, totally compromised.", | ||
| "tags": ["professional", "organization", "compromised"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "type": "Mnemonic", | ||
| "value": "humble piece toy mimic miss hurdle smile awkward patch drama hurry mixture" | ||
| } | ||
| </pre | ||
| > | ||
| </section> | ||
| <section> | ||
| <h3 id="Entropy">Entropy</h3> | ||
| <p>MAY be used as input to a <a href="https://en.wikipedia.org/wiki/Key_derivation_function">KDF</a>.</p> | ||
| <p>Here is an example of storing entropy as a <a>Secret</a>.</p> | ||
| <pre class="example highlight" title="An entropy example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "urn:uuid:c410e44a-9525-11ea-bb37-0242ac130002", | ||
| "name": "My Test Entropy 1", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "For testing only, totally compromised.", | ||
| "tags": ["professional", "organization", "compromised"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "type": "Entropy", | ||
| "multibase": "z6MkuVZVSKLUNHRjXBXcEwvG5yiNHLhzBeXRjAkwmgSYensE" | ||
| } | ||
| </pre | ||
| > | ||
| </section> | ||
| <section> | ||
| <h3>Meta Data</h3> | ||
| <p>Information about wallet data.</p> | ||
| <p> | ||
| Here is an example where meta data is used to remind the wallet | ||
| controller that a credential has likely be exposed because of a breach | ||
| notification. | ||
| </p> | ||
| <pre class="example highlight" title="A credential meta data example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "urn:uuid:2905324a-9524-11ea-bb37-0242ac130002", | ||
| "type": "MetaData", | ||
| "name": "Degree Notes", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "Personal notes about this degree.", | ||
| "tags": ["professional", "organization"], | ||
| "correlation": ["urn:uuid:4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "note": "I've shared this degree, with many websites that have been breached. It should be considered public information at this point :(" | ||
| } | ||
| </pre | ||
| > | ||
| <p> | ||
| Here is an example where meta data is used to remind the wallet | ||
| controller that they use a mnemonic for manage their ethereum accounts | ||
| and funds for testing. | ||
| </p> | ||
| <pre class="example highlight" title="A secret meta data example"> | ||
| { | ||
| "@context": ["https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json"], | ||
| "id": "urn:uuid:2905324a-9524-11ea-bb37-0242ac130002", | ||
| "type": "MetaData", | ||
| "name": "Ropsten Testnet HD Accounts", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description" : "My Ethereum TestNet Accounts", | ||
| "tags": ["professional", "organization"], | ||
| "correlation": ["urn:uuid:4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "hdPath": "m’/44’/60’/0’", | ||
| "target": ["urn:uuid:c410e44a-9525-11ea-bb37-0242ac130002"] | ||
| } | ||
| </pre | ||
| > | ||
| </section> | ||
| <section> | ||
| <h2>Locked Wallet</h2> | ||
| <p>Also known as a signed encrypted wallet.</p> | ||
| <p> | ||
| An integrity protected, authenticated and privacy preserving | ||
| representation of a wallet. | ||
| </p> | ||
| <pre class="example highlight" title="An encrypted wallet example"> | ||
| { | ||
| "@context": [ | ||
| "https://www.w3.org/2018/credentials/v1", | ||
| "https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json", | ||
| ], | ||
| "id": "http://example.gov/wallet/3732", | ||
| "type": ["VerifiableCredential", "EncryptedWallet"], | ||
| "issuer": "did:example:123", | ||
| "issuanceDate": "2020-05-22T17:38:21.910Z", | ||
| "credentialSubject": { | ||
| "id": "did:example:123", | ||
| "contents": [ | ||
| { | ||
| "id": "urn:uuid:e8fc7810-9524-11ea-bb37-0242ac130002", | ||
| "jwe": { | ||
| "protected": "eyJlbmMiOiJYQzIwUCJ9", | ||
| "recipients": [ | ||
| { | ||
| "header": { | ||
| "kid": "did:key:z6MkjMSYauuMgx9azEyUnTW5o5jFRkbBu5T83f39uNwnsGmm#z6LSoGtZSrUMZudAagzEfYf7k8jHZcGD79Sox7v4wCkDKNSw", | ||
| "alg": "ECDH-ES+A256KW", | ||
| "epk": { | ||
| "kty": "OKP", | ||
| "crv": "X25519", | ||
| "x": "RfXdxTfIzilWBzWWX3ovHBDzgDcLNy0BFJWSxa0dqnw" | ||
| }, | ||
| "apu": "RfXdxTfIzilWBzWWX3ovHBDzgDcLNy0BFJWSxa0dqnw", | ||
| "apv": "ZGlkOmtleTp6Nk1rak1TWWF1dU1neDlhekV5VW5UVzVvNWpGUmtiQnU1VDgzZjM5dU53bnNHbW0jejZMU29HdFpTclVNWnVkQWFnekVmWWY3azhqSFpjR0Q3OVNveDd2NHdDa0RLTlN3" | ||
| }, | ||
| "encrypted_key": "-ABaawsVfTxJKmYVMhC0UWGQRZaYaLr8WdTBlugLOADXxrlOP-5M-A" | ||
| } | ||
| ], | ||
| "iv": "zjJPRrj0TGez9JYkChTrB3iqKoDkiBhn", | ||
| "ciphertext": "pPqPLiMuJLygwKbsDh-QWw0y5CHmQMINXPc1-qgsKLCFDTJ6ytqoTF35rM5KxSfeVCk74HLtIUIbDvNx53xr2YGqOi9-yDHrT3KurY8CIiBDTYCHkW50wgJq-Ac_gE3lSEEOYT1ZF4izf6GoA1jnI7alxD8ScgOGv2OuWLKEhV5HNEBLUpNz8Di7LDmRLSvAroiWE0rBu-xl7dRrLRH3ZKUzc-R6vrG_X56o-ivjUCfcvrjTnh2pgmVFo27BA34edYbLHIbKcWjMoSBEgmeY30ZuQt_KXK0vDQ6pFmMW5n8oISjPYv8rdicwNPfpCR89x11Vgrde419guqIwEsuOyvCAWidzgFeUu7jeyxjyYcNaIM1r2mq7OXnTODAFBzK4lWqniiDYWy2CLcPTHIXHnhq9YvPOhjqFz6aBbf_XqiFdIQZgOX2oDX6zGHg9fvw4AZc3_N3bCHRbZzKkf-AyvvHxPb9dphU1OdQmnRefYg-xtEQnlwk704J26xZU2qBn7YIJh_nrh9u41KqA0FSlYQsGiyW7SvOf2_LaA9qr17eA7HqY7Lst53_kiYhgWCd7g8hTWiT5G7QVLS_wx89DUpNfz_bxqQU0f17W2L0rLSLCWwaqUjxlLbPlFnpWgokbnxOMOETDvt_8DGUbczRou7Z4NyQ6ZFCOV4TD0AFRCM-RTj-YR6UC_UAAIvEPJep3Uz8elJzkf7xevnWKRSGyFLIUie0tSwZ7hCtjdvP3tOKidwy56jHtOQ_R6wx_9taVc3_5IeoP-4wZ4DNOm_IS9jb6csWmRvyW5GoRx-robqraPCM64SKg9EM", | ||
| "tag": "h6mJqHn33oCsDd5X57MI-g" | ||
| } | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| </pre | ||
| > | ||
| </section> | ||
| <section> | ||
| <h2>Unlocked Wallet</h2> | ||
| <p>Also known as plaintext wallet.</p> | ||
| <p> | ||
| This representation may be used without ever having a locked | ||
| representation. | ||
| </p> | ||
| <p> | ||
| Implementations may choose to construct this representation from | ||
| database entities. | ||
| </p> | ||
| <pre class="example highlight" title="An unlocked wallet example"> | ||
| { | ||
| "@context": [ | ||
| "https://www.w3.org/2018/credentials/v1", | ||
| "https://transmute-industries.github.io/universal-wallet/contexts/wallet-v1.json", | ||
| ], | ||
| "id": "http://example.gov/wallet/3732", | ||
| "type": [ | ||
| "UniversalWallet2020" | ||
| ], | ||
| "status": "UNLOCKED", | ||
| "contents": [ | ||
| // other wallet content types, ... | ||
| { | ||
| "id": "urn:uuid:e8fc7810-9524-11ea-bb37-0242ac130002", | ||
| "title": "My Test Key 2", | ||
| "image": "https://via.placeholder.com/150", | ||
| "description": "For testing only, totally compromised.", | ||
| "tags": ["professional", "organization", "compromised"], | ||
| "correlation": ["4058a72a-9523-11ea-bb37-0242ac130002"], | ||
| "controller": [ | ||
| "did:key:z6MkjjCpsoQrwnEmqHzLdxWowXk5gjbwor4urC1RPDmGeV8r#z6MkjjCpsoQrwnEmqHzLdxWowXk5gjbwor4urC1RPDmGeV8r" | ||
| ], | ||
| "type": "Ed25519VerificationKey2018", | ||
| "privateKeyBase58": "3CQCBKF3Mf1tU5q1FLpHpbxYrNYxLiZk4adDtfyPEfc39Wk6gsTb2qoc1ZtpqzJYdM1rG4gpaD3ZVKdkiDrkLF1p", | ||
| "publicKeyBase58": "6GwnHZARcEkJio9dxPYy6SC5sAL6PxpZAB6VYwoFjGMU" | ||
| } | ||
| ] | ||
| } | ||
| </pre | ||
| > | ||
| </section> | ||
| </section> | ||
| <section id="interface" class="normative"> | ||
| <h2>Interface</h2> | ||
| <section> | ||
| <h3>Import</h3> | ||
| <p> | ||
| Takes a serialized exported wallet representation as input. Loads the | ||
| representation into wallet software. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>Unlock</h3> | ||
| <p> | ||
| Transforms one or more wallet contents from ciphertext to plaintext. | ||
| </p> | ||
| <p> | ||
| Requires knowledge of the password used to lock the wallet. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>Lock</h3> | ||
| <p> | ||
| Transforms one or more wallet contents from plaintext to ciphertext. | ||
| </p> | ||
| <p> | ||
| Requires knowledge of the password used to lock the wallet. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>Query</h3> | ||
| <p> | ||
| Takes a map and reduce functions as input, and returns a collection of | ||
| results based on the current wallet contents. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>SignRaw</h3> | ||
| <p> | ||
| Takes a Buffer as input, and an <code>options</code> object, which | ||
| contains at least a <code>verificationMethod</code>, and may content | ||
| additonal details such as <code>alg</code> or other JOSE related | ||
| terms. | ||
| </p> | ||
| <p> | ||
| Must support detached signatures. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>VerifyRaw</h3> | ||
| <p> | ||
| Takes a Buffer as input, and an <code>options</code> object, which | ||
| contains at least a <code>verificationMethod</code>, and may content | ||
| additonal details such as <code>alg</code> or other JOSE related | ||
| terms. | ||
| </p> | ||
| <p> | ||
| Must support detached signatures. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>Verify</h3> | ||
| <p> | ||
| Takes a Verifiable Credential or Verifiable Presentation as input, | ||
| returns a boolean <code>verified</code>, and an error object | ||
| <code>error</code> if <code>verified</code> if false. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>Issue</h3> | ||
| <p> | ||
| Takes a Verifiable Credential without a <code>proof</code>, and an | ||
| <code>options</code> object, which contains at least a | ||
| <code>verificationMethod</code>, and <code>proofPurpose</code>. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>Prove</h3> | ||
| <p> | ||
| Takes an id of a Verifiable Credential, and an | ||
| <code>options</code> object, which contains at least a | ||
| <code>challenge</code>. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>Export</h3> | ||
| <p> | ||
| Produces a serialized exported wallet representation. | ||
| </p> | ||
| <p> | ||
| Only ciphertext wallet contents can be exported. | ||
| </p> | ||
| </section> | ||
| </section> | ||
| <section id="integration" class="informative"> | ||
| <h2>Integration</h2> | ||
| <p> | ||
| The following sections describe how a wallet <a>controller</a> | ||
| can define relationships with external systems. | ||
| </p> | ||
| <section> | ||
| <h3>HD Wallets</h3> | ||
| <p> | ||
| HD Wallets are a popular mechanism for managing many keys, addresess | ||
| and accounts across multiple crypto currency ledgers. | ||
| </p> | ||
| <p> | ||
| Using a <a>Meta Data</a> object applied to a <a>Secret</a>, a user | ||
| instruct an application to discover <a>cryptocurrency</a> that is | ||
| controlled by a <a>Secret</a>. | ||
| </p> | ||
| <p> | ||
| See <a href="https://github.com/ethereum/EIPs/issues/84">EIP84</a> | ||
| for examples of how this is done in the ethereum community. | ||
| </p> | ||
| </section> | ||
| <section> | ||
| <h3>OpenPGP Keyring</h3> | ||
| <a href="https://tools.ietf.org/html/rfc4880#section-3.6"> | ||
| OpenPGP Keyring | ||
| </a> | ||
| </section> | ||
| <section> | ||
| <h3>Mobile Wallets</h3> | ||
| <h3>Android Keychain</h3> | ||
| <a | ||
| href="https://developer.android.com/reference/android/security/KeyChain" | ||
| > | ||
| KeyChain | ||
| </a> | ||
| <a href="https://developer.android.com/training/articles/keystore" | ||
| >keystore | ||
| </a> | ||
| <h4>Apple Wallet</h4> | ||
| <a href="https://support.apple.com/guide/keychain-access/welcome/mac" | ||
| >Keychain Acccess | ||
| </a> | ||
| <a href="https://wallet.apple.com/">wallet.apple.com</a> | ||
| <h4>Google Wallet</h4> | ||
| <a href="https://wallet.google.com/">wallet.google.com</a> | ||
| <h3>Microsoft Wallet</h3> | ||
| <a href="http://wallet.microsoft.com/">wallet.microsoft.com</a> | ||
| </section> | ||
| </section> | ||
| <section id="conformance" class="normative"></section> | ||
| </body> | ||
| </html> |
| import fs from 'fs'; | ||
| import path from 'path'; | ||
| const context = [ | ||
| { | ||
| test: 'http://test.com#', | ||
| property1: 'test:1', | ||
| property2: 'test:2', | ||
| }, | ||
| ]; | ||
| const docWithExhaustiveContext = { | ||
| '@context': context, | ||
| property1: 'value1', | ||
| property2: 'value2', | ||
| }; | ||
| const docWithNotExhaustiveContext = { | ||
| '@context': context, | ||
| property1: 'value1', | ||
| property2: 'value1', | ||
| property3: 'value1', | ||
| }; | ||
| const docWithInvalidContext = { | ||
| '@context': 'http://invalid.context.com', | ||
| property1: 'value1', | ||
| property2: 'value1', | ||
| property3: 'value1', | ||
| }; | ||
| const docNotJsonLd = { bonjour: 'lol' }; | ||
| const textPath = path.join(__dirname, './example.html'); | ||
| const text = fs.readFileSync(textPath).toString(); | ||
| export { | ||
| context, | ||
| docNotJsonLd, | ||
| docWithExhaustiveContext, | ||
| docWithInvalidContext, | ||
| docWithNotExhaustiveContext, | ||
| text, | ||
| }; |
| import { check, getAllJsonFromString, getAllJsonLdFromString } from '..'; | ||
| import { | ||
| docNotJsonLd, | ||
| docWithExhaustiveContext, | ||
| docWithInvalidContext, | ||
| docWithNotExhaustiveContext, | ||
| text, | ||
| } from './__fixtures__'; | ||
| describe('check', () => { | ||
| it('should return true if all properties are in the context', async () => { | ||
| const result = await check(docWithExhaustiveContext); | ||
| expect(result.ok).toBeTruthy(); | ||
| }); | ||
| it('should return true for valid string argument', async () => { | ||
| const result = await check(JSON.stringify(docWithExhaustiveContext)); | ||
| expect(result.ok).toBeTruthy(); | ||
| }); | ||
| it('should return false if some properties are missing from the context', async () => { | ||
| const result = await check(docWithNotExhaustiveContext); | ||
| expect(result.ok).toBeFalsy(); | ||
| expect(result.error!.type).toBe('MISSING_PROPERTIES_IN_CONTEXT'); | ||
| expect(result.error!.details).toEqual('["property3"]'); | ||
| }); | ||
| it('should return false if argument is a non parseable string', async () => { | ||
| const result = await check('{'); | ||
| expect(result.ok).toBeFalsy(); | ||
| expect(result.error!.type).toBe('SyntaxError'); | ||
| expect(result.error!.details).toBe('Unexpected end of JSON input'); | ||
| }); | ||
| it('should return false is doc has invalid context', async () => { | ||
| const result = await check(docWithInvalidContext); | ||
| expect(result.ok).toBeFalsy(); | ||
| expect(result.error!.type).toBe('jsonld.InvalidUrl'); | ||
| }); | ||
| it('should return false is doc is not JSON-LD', async () => { | ||
| const result = await check(docNotJsonLd); | ||
| expect(result.ok).toBeFalsy(); | ||
| expect(result.error!.type).toBe('jsonld.SyntaxError'); | ||
| expect(result.error!.details).toBe( | ||
| 'Invalid JSON-LD syntax; @context must be an object.' | ||
| ); | ||
| }); | ||
| }); | ||
| describe('getAllJsonLdFromString', () => { | ||
| it('should return all JSON objects from the page', () => { | ||
| const results = getAllJsonFromString(text); | ||
| expect(results).toHaveLength(51); | ||
| }); | ||
| it('should return all JSON-LD objects from the page', () => { | ||
| const results = getAllJsonLdFromString(text); | ||
| expect(results).toHaveLength(16); | ||
| }); | ||
| }); | ||
| describe('integration', () => { | ||
| it('should return all non exhaustive json-ld contexts', async () => { | ||
| const jsonldObjects = getAllJsonLdFromString(text); | ||
| const promises = jsonldObjects.map(check); | ||
| const results = await Promise.all(promises); | ||
| expect(results).toHaveLength(16); | ||
| }); | ||
| }); |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
3
-25%111215
-27.86%2
100%13
-18.75%393
-26.82%7
600%+ Added
+ Added
+ Added
+ Added
+ Added