(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["jsonld"] = factory(); else root["jsonld"] = factory(); })(typeof self !== 'undefined' ? self : this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 73); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { var store = __webpack_require__(38)('wks'); var uid = __webpack_require__(20); var Symbol = __webpack_require__(1).Symbol; var USE_SYMBOL = typeof Symbol == 'function'; var $exports = module.exports = function (name) { return store[name] || (store[name] = USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); }; $exports.store = store; /***/ }), /* 1 */ /***/ (function(module, exports) { // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self // eslint-disable-next-line no-new-func : Function('return this')(); if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef /***/ }), /* 2 */ /***/ (function(module, exports) { var core = module.exports = { version: '2.5.6' }; if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var graphTypes = __webpack_require__(5); var types = __webpack_require__(4); // TODO: move `IdentifierIssuer` to its own package var IdentifierIssuer = __webpack_require__(45).IdentifierIssuer; var JsonLdError = __webpack_require__(6); // constants var REGEX_LINK_HEADERS = /(?:<[^>]*?>|"[^"]*?"|[^,])+/g; var REGEX_LINK_HEADER = /\s*<([^>]*?)>\s*(?:;\s*(.*))?/; var REGEX_LINK_HEADER_PARAMS = /(.*?)=(?:(?:"([^"]*?)")|([^"]*?))\s*(?:(?:;\s*)|$)/g; var DEFAULTS = { headers: { accept: 'application/ld+json, application/json' } }; var api = {}; module.exports = api; api.IdentifierIssuer = IdentifierIssuer; // define setImmediate and nextTick // // nextTick implementation with browser-compatible fallback // // // from https://github.com/caolan/async/blob/master/lib/async.js // capture the global reference to guard against fakeTimer mocks var _setImmediate = typeof setImmediate === 'function' && setImmediate; var _delay = _setImmediate ? // not a direct alias (for IE10 compatibility) function (fn) { return _setImmediate(fn); } : function (fn) { return setTimeout(fn, 0); }; if ((typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && typeof process.nextTick === 'function') { api.nextTick = process.nextTick; } else { api.nextTick = _delay; } api.setImmediate = _setImmediate ? _delay : api.nextTick; /** * Clones an object, array, or string/number. If a typed JavaScript object * is given, such as a Date, it will be converted to a string. * * @param value the value to clone. * * @return the cloned value. */ api.clone = function (value) { if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') { var rval = void 0; if (types.isArray(value)) { rval = []; for (var i = 0; i < value.length; ++i) { rval[i] = api.clone(value[i]); } } else if (types.isObject(value)) { rval = {}; for (var key in value) { rval[key] = api.clone(value[key]); } } else { rval = value.toString(); } return rval; } return value; }; /** * Builds an HTTP headers object for making a JSON-LD request from custom * headers and asserts the `accept` header isn't overridden. * * @param headers an object of headers with keys as header names and values * as header values. * * @return an object of headers with a valid `accept` header. */ api.buildHeaders = function () { var headers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var hasAccept = Object.keys(headers).some(function (h) { return h.toLowerCase() === 'accept'; }); if (hasAccept) { throw new RangeError('Accept header may not be specified; only "' + DEFAULTS.headers.accept + '" is supported.'); } return Object.assign({ 'Accept': DEFAULTS.headers.accept }, headers); }; /** * Parses a link header. The results will be key'd by the value of "rel". * * Link: ; * rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json" * * Parses as: { * 'http://www.w3.org/ns/json-ld#context': { * target: http://json-ld.org/contexts/person.jsonld, * type: 'application/ld+json' * } * } * * If there is more than one "rel" with the same IRI, then entries in the * resulting map for that "rel" will be arrays. * * @param header the link header to parse. */ api.parseLinkHeader = function (header) { var rval = {}; // split on unbracketed/unquoted commas var entries = header.match(REGEX_LINK_HEADERS); for (var i = 0; i < entries.length; ++i) { var match = entries[i].match(REGEX_LINK_HEADER); if (!match) { continue; } var result = { target: match[1] }; var params = match[2]; while (match = REGEX_LINK_HEADER_PARAMS.exec(params)) { result[match[1]] = match[2] === undefined ? match[3] : match[2]; } var rel = result['rel'] || ''; if (Array.isArray(rval[rel])) { rval[rel].push(result); } else if (rel in rval) { rval[rel] = [rval[rel], result]; } else { rval[rel] = result; } } return rval; }; /** * Throws an exception if the given value is not a valid @type value. * * @param v the value to check. */ api.validateTypeValue = function (v) { // can be a string or an empty object if (types.isString(v) || types.isEmptyObject(v)) { return; } // must be an array var isValid = false; if (types.isArray(v)) { // must contain only strings isValid = true; for (var i = 0; i < v.length; ++i) { if (!types.isString(v[i])) { isValid = false; break; } } } if (!isValid) { throw new JsonLdError('Invalid JSON-LD syntax; "@type" value must a string, an array of ' + 'strings, or an empty object.', 'jsonld.SyntaxError', { code: 'invalid type value', value: v }); } }; /** * Returns true if the given subject has the given property. * * @param subject the subject to check. * @param property the property to look for. * * @return true if the subject has the given property, false if not. */ api.hasProperty = function (subject, property) { if (property in subject) { var value = subject[property]; return !types.isArray(value) || value.length > 0; } return false; }; /** * Determines if the given value is a property of the given subject. * * @param subject the subject to check. * @param property the property to check. * @param value the value to check. * * @return true if the value exists, false if not. */ api.hasValue = function (subject, property, value) { if (api.hasProperty(subject, property)) { var val = subject[property]; var isList = graphTypes.isList(val); if (types.isArray(val) || isList) { if (isList) { val = val['@list']; } for (var i = 0; i < val.length; ++i) { if (api.compareValues(value, val[i])) { return true; } } } else if (!types.isArray(value)) { // avoid matching the set of values with an array value parameter return api.compareValues(value, val); } } return false; }; /** * Adds a value to a subject. If the value is an array, all values in the * array will be added. * * @param subject the subject to add the value to. * @param property the property that relates the value to the subject. * @param value the value to add. * @param [options] the options to use: * [propertyIsArray] true if the property is always an array, false * if not (default: false). * [allowDuplicate] true to allow duplicates, false not to (uses a * simple shallow comparison of subject ID or value) (default: true). */ api.addValue = function (subject, property, value, options) { options = options || {}; if (!('propertyIsArray' in options)) { options.propertyIsArray = false; } if (!('allowDuplicate' in options)) { options.allowDuplicate = true; } if (types.isArray(value)) { if (value.length === 0 && options.propertyIsArray && !(property in subject)) { subject[property] = []; } for (var i = 0; i < value.length; ++i) { api.addValue(subject, property, value[i], options); } } else if (property in subject) { // check if subject already has value if duplicates not allowed var hasValue = !options.allowDuplicate && api.hasValue(subject, property, value); // make property an array if value not present or always an array if (!types.isArray(subject[property]) && (!hasValue || options.propertyIsArray)) { subject[property] = [subject[property]]; } // add new value if (!hasValue) { subject[property].push(value); } } else { // add new value as set or single value subject[property] = options.propertyIsArray ? [value] : value; } }; /** * Gets all of the values for a subject's property as an array. * * @param subject the subject. * @param property the property. * * @return all of the values for a subject's property as an array. */ api.getValues = function (subject, property) { return [].concat(subject[property] || []); }; /** * Removes a property from a subject. * * @param subject the subject. * @param property the property. */ api.removeProperty = function (subject, property) { delete subject[property]; }; /** * Removes a value from a subject. * * @param subject the subject. * @param property the property that relates the value to the subject. * @param value the value to remove. * @param [options] the options to use: * [propertyIsArray] true if the property is always an array, false * if not (default: false). */ api.removeValue = function (subject, property, value, options) { options = options || {}; if (!('propertyIsArray' in options)) { options.propertyIsArray = false; } // filter out value var values = api.getValues(subject, property).filter(function (e) { return !api.compareValues(e, value); }); if (values.length === 0) { api.removeProperty(subject, property); } else if (values.length === 1 && !options.propertyIsArray) { subject[property] = values[0]; } else { subject[property] = values; } }; /** * Relabels all blank nodes in the given JSON-LD input. * * @param input the JSON-LD input. * @param [options] the options to use: * [issuer] an IdentifierIssuer to use to label blank nodes. */ api.relabelBlankNodes = function (input, options) { options = options || {}; var issuer = options.issuer || new IdentifierIssuer('_:b'); return _labelBlankNodes(issuer, input); }; /** * Compares two JSON-LD values for equality. Two JSON-LD values will be * considered equal if: * * 1. They are both primitives of the same type and value. * 2. They are both @values with the same @value, @type, @language, * and @index, OR * 3. They both have @ids they are the same. * * @param v1 the first value. * @param v2 the second value. * * @return true if v1 and v2 are considered equal, false if not. */ api.compareValues = function (v1, v2) { // 1. equal primitives if (v1 === v2) { return true; } // 2. equal @values if (graphTypes.isValue(v1) && graphTypes.isValue(v2) && v1['@value'] === v2['@value'] && v1['@type'] === v2['@type'] && v1['@language'] === v2['@language'] && v1['@index'] === v2['@index']) { return true; } // 3. equal @ids if (types.isObject(v1) && '@id' in v1 && types.isObject(v2) && '@id' in v2) { return v1['@id'] === v2['@id']; } return false; }; /** * Compares two strings first based on length and then lexicographically. * * @param a the first string. * @param b the second string. * * @return -1 if a < b, 1 if a > b, 0 if a === b. */ api.compareShortestLeast = function (a, b) { if (a.length < b.length) { return -1; } if (b.length < a.length) { return 1; } if (a === b) { return 0; } return a < b ? -1 : 1; }; api.normalizeDocumentLoader = function (fn) { if (fn.length < 2) { return api.callbackify(fn); } return function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(url) { var callback, _args = arguments; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: callback = _args[1]; return _context.abrupt('return', new Promise(function (resolve, reject) { try { fn(url, function (err, remoteDoc) { if (typeof callback === 'function') { return _invokeCallback(callback, err, remoteDoc); } else if (err) { reject(err); } else { resolve(remoteDoc); } }); } catch (e) { if (typeof callback === 'function') { return _invokeCallback(callback, e); } reject(e); } })); case 2: case 'end': return _context.stop(); } } }, _callee, this); })); return function (_x2) { return _ref.apply(this, arguments); }; }(); }; api.callbackify = function (fn) { return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var callback, result; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: callback = args[args.length - 1]; if (typeof callback === 'function') { args.pop(); } result = void 0; _context2.prev = 3; _context2.next = 6; return fn.apply(null, args); case 6: result = _context2.sent; _context2.next = 14; break; case 9: _context2.prev = 9; _context2.t0 = _context2['catch'](3); if (!(typeof callback === 'function')) { _context2.next = 13; break; } return _context2.abrupt('return', _invokeCallback(callback, _context2.t0)); case 13: throw _context2.t0; case 14: if (!(typeof callback === 'function')) { _context2.next = 16; break; } return _context2.abrupt('return', _invokeCallback(callback, null, result)); case 16: return _context2.abrupt('return', result); case 17: case 'end': return _context2.stop(); } } }, _callee2, this, [[3, 9]]); })); }; function _invokeCallback(callback, err, result) { // execute on next tick to prevent "unhandled rejected promise" // and simulate what would have happened in a promiseless API api.nextTick(function () { return callback(err, result); }); } /** * Labels the blank nodes in the given value using the given IdentifierIssuer. * * @param issuer the IdentifierIssuer to use. * @param element the element with blank nodes to rename. * * @return the element. */ function _labelBlankNodes(issuer, element) { if (types.isArray(element)) { for (var i = 0; i < element.length; ++i) { element[i] = _labelBlankNodes(issuer, element[i]); } } else if (graphTypes.isList(element)) { element['@list'] = _labelBlankNodes(issuer, element['@list']); } else if (types.isObject(element)) { // relabel blank node if (graphTypes.isBlankNode(element)) { element['@id'] = issuer.getId(element['@id']); } // recursively apply to all keys var keys = Object.keys(element).sort(); for (var ki = 0; ki < keys.length; ++ki) { var key = keys[ki]; if (key !== '@id') { element[key] = _labelBlankNodes(issuer, element[key]); } } } return element; } /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var api = {}; module.exports = api; /** * Returns true if the given value is an Array. * * @param v the value to check. * * @return true if the value is an Array, false if not. */ api.isArray = Array.isArray; /** * Returns true if the given value is a Boolean. * * @param v the value to check. * * @return true if the value is a Boolean, false if not. */ api.isBoolean = function (v) { return typeof v === 'boolean' || Object.prototype.toString.call(v) === '[object Boolean]'; }; /** * Returns true if the given value is a double. * * @param v the value to check. * * @return true if the value is a double, false if not. */ api.isDouble = function (v) { return api.isNumber(v) && String(v).indexOf('.') !== -1; }; /** * Returns true if the given value is an empty Object. * * @param v the value to check. * * @return true if the value is an empty Object, false if not. */ api.isEmptyObject = function (v) { return api.isObject(v) && Object.keys(v).length === 0; }; /** * Returns true if the given value is a Number. * * @param v the value to check. * * @return true if the value is a Number, false if not. */ api.isNumber = function (v) { return typeof v === 'number' || Object.prototype.toString.call(v) === '[object Number]'; }; /** * Returns true if the given value is numeric. * * @param v the value to check. * * @return true if the value is numeric, false if not. */ api.isNumeric = function (v) { return !isNaN(parseFloat(v)) && isFinite(v); }; /** * Returns true if the given value is an Object. * * @param v the value to check. * * @return true if the value is an Object, false if not. */ api.isObject = function (v) { return Object.prototype.toString.call(v) === '[object Object]'; }; /** * Returns true if the given value is a String. * * @param v the value to check. * * @return true if the value is a String, false if not. */ api.isString = function (v) { return typeof v === 'string' || Object.prototype.toString.call(v) === '[object String]'; }; /** * Returns true if the given value is undefined. * * @param v the value to check. * * @return true if the value is undefined, false if not. */ api.isUndefined = function (v) { return typeof v === 'undefined'; }; /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var types = __webpack_require__(4); var api = {}; module.exports = api; /** * Returns true if the given value is a subject with properties. * * @param v the value to check. * * @return true if the value is a subject with properties, false if not. */ api.isSubject = function (v) { // Note: A value is a subject if all of these hold true: // 1. It is an Object. // 2. It is not a @value, @set, or @list. // 3. It has more than 1 key OR any existing key is not @id. if (types.isObject(v) && !('@value' in v || '@set' in v || '@list' in v)) { var keyCount = Object.keys(v).length; return keyCount > 1 || !('@id' in v); } return false; }; /** * Returns true if the given value is a subject reference. * * @param v the value to check. * * @return true if the value is a subject reference, false if not. */ api.isSubjectReference = function (v) { return ( // Note: A value is a subject reference if all of these hold true: // 1. It is an Object. // 2. It has a single key: @id. types.isObject(v) && Object.keys(v).length === 1 && '@id' in v ); }; /** * Returns true if the given value is a @value. * * @param v the value to check. * * @return true if the value is a @value, false if not. */ api.isValue = function (v) { return ( // Note: A value is a @value if all of these hold true: // 1. It is an Object. // 2. It has the @value property. types.isObject(v) && '@value' in v ); }; /** * Returns true if the given value is a @list. * * @param v the value to check. * * @return true if the value is a @list, false if not. */ api.isList = function (v) { return ( // Note: A value is a @list if all of these hold true: // 1. It is an Object. // 2. It has the @list property. types.isObject(v) && '@list' in v ); }; /** * Returns true if the given value is a @graph. * * @return true if the value is a @graph, false if not. */ api.isGraph = function (v) { // Note: A value is a graph if all of these hold true: // 1. It is an object. // 2. It has an `@graph` key. // 3. It may have '@id' or '@index' return types.isObject(v) && '@graph' in v && Object.keys(v).filter(function (key) { return key !== '@id' && key !== '@index'; }).length === 1; }; /** * Returns true if the given value is a simple @graph. * * @return true if the value is a simple @graph, false if not. */ api.isSimpleGraph = function (v) { // Note: A value is a simple graph if all of these hold true: // 1. It is an object. // 2. It has an `@graph` key. // 3. It has only 1 key or 2 keys where one of them is `@index`. return api.isGraph(v) && !('@id' in v); }; /** * Returns true if the given value is a blank node. * * @param v the value to check. * * @return true if the value is a blank node, false if not. */ api.isBlankNode = function (v) { // Note: A value is a blank node if all of these hold true: // 1. It is an Object. // 2. If it has an @id key its value begins with '_:'. // 3. It has no keys OR is not a @value, @set, or @list. if (types.isObject(v)) { if ('@id' in v) { return v['@id'].indexOf('_:') === 0; } return Object.keys(v).length === 0 || !('@value' in v || '@set' in v || '@list' in v); } return false; }; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } module.exports = function (_Error) { _inherits(JsonLdError, _Error); /** * Creates a JSON-LD Error. * * @param msg the error message. * @param type the error type. * @param details the error details. */ function JsonLdError() { var message = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'An unspecified JSON-LD error occurred.'; var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'jsonld.Error'; var details = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; _classCallCheck(this, JsonLdError); var _this = _possibleConstructorReturn(this, (JsonLdError.__proto__ || Object.getPrototypeOf(JsonLdError)).call(this, message)); _this.name = name; _this.message = message; _this.details = details; return _this; } return JsonLdError; }(Error); /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(1); var core = __webpack_require__(2); var hide = __webpack_require__(10); var redefine = __webpack_require__(16); var ctx = __webpack_require__(28); var PROTOTYPE = 'prototype'; var $export = function (type, name, source) { var IS_FORCED = type & $export.F; var IS_GLOBAL = type & $export.G; var IS_STATIC = type & $export.S; var IS_PROTO = type & $export.P; var IS_BIND = type & $export.B; var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE]; var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); var key, own, out, exp; if (IS_GLOBAL) source = name; for (key in source) { // contains in native own = !IS_FORCED && target && target[key] !== undefined; // export native or passed out = (own ? target : source)[key]; // bind timers to global for call from export context exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; // extend global if (target) redefine(target, key, out, type & $export.U); // export if (exports[key] != out) hide(exports, key, exp); if (IS_PROTO && expProto[key] != out) expProto[key] = out; } }; global.core = core; // type bitmap $export.F = 1; // forced $export.G = 2; // global $export.S = 4; // static $export.P = 8; // proto $export.B = 16; // bind $export.W = 32; // wrap $export.U = 64; // safe $export.R = 128; // real proto method for `library` module.exports = $export; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(9); module.exports = function (it) { if (!isObject(it)) throw TypeError(it + ' is not an object!'); return it; }; /***/ }), /* 9 */ /***/ (function(module, exports) { module.exports = function (it) { return typeof it === 'object' ? it !== null : typeof it === 'function'; }; /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(11); var createDesc = __webpack_require__(27); module.exports = __webpack_require__(12) ? function (object, key, value) { return dP.f(object, key, createDesc(1, value)); } : function (object, key, value) { object[key] = value; return object; }; /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(8); var IE8_DOM_DEFINE = __webpack_require__(51); var toPrimitive = __webpack_require__(35); var dP = Object.defineProperty; exports.f = __webpack_require__(12) ? Object.defineProperty : function defineProperty(O, P, Attributes) { anObject(O); P = toPrimitive(P, true); anObject(Attributes); if (IE8_DOM_DEFINE) try { return dP(O, P, Attributes); } catch (e) { /* empty */ } if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); if ('value' in Attributes) O[P] = Attributes.value; return O; }; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { // Thank's IE8 for his funny defineProperty module.exports = !__webpack_require__(19)(function () { return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; }); /***/ }), /* 13 */ /***/ (function(module, exports) { var hasOwnProperty = {}.hasOwnProperty; module.exports = function (it, key) { return hasOwnProperty.call(it, key); }; /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2016-2017 Digital Bazaar, Inc. All rights reserved. */ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var api = {}; module.exports = api; // define setImmediate and nextTick //// nextTick implementation with browser-compatible fallback //// // from https://github.com/caolan/async/blob/master/lib/async.js // capture the global reference to guard against fakeTimer mocks var _setImmediate = typeof setImmediate === 'function' && setImmediate; var _delay = _setImmediate ? // not a direct alias (for IE10 compatibility) function (fn) { return _setImmediate(fn); } : function (fn) { return setTimeout(fn, 0); }; if ((typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && typeof process.nextTick === 'function') { api.nextTick = process.nextTick; } else { api.nextTick = _delay; } api.setImmediate = _setImmediate ? _delay : api.nextTick; /** * Clones an object, array, or string/number. If a typed JavaScript object * is given, such as a Date, it will be converted to a string. * * @param value the value to clone. * * @return the cloned value. */ api.clone = function (value) { if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') { var rval = void 0; if (Array.isArray(value)) { rval = []; for (var i = 0; i < value.length; ++i) { rval[i] = api.clone(value[i]); } } else if (api.isObject(value)) { rval = {}; for (var key in value) { rval[key] = api.clone(value[key]); } } else { rval = value.toString(); } return rval; } return value; }; /** * Returns true if the given value is an Object. * * @param v the value to check. * * @return true if the value is an Object, false if not. */ api.isObject = function (v) { return Object.prototype.toString.call(v) === '[object Object]'; }; /** * Returns true if the given value is undefined. * * @param v the value to check. * * @return true if the value is undefined, false if not. */ api.isUndefined = function (v) { return typeof v === 'undefined'; }; api.callbackify = function (fn) { return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var callback, result; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: callback = args[args.length - 1]; if (typeof callback === 'function') { args.pop(); } result = void 0; _context.prev = 3; _context.next = 6; return fn.apply(null, args); case 6: result = _context.sent; _context.next = 14; break; case 9: _context.prev = 9; _context.t0 = _context['catch'](3); if (!(typeof callback === 'function')) { _context.next = 13; break; } return _context.abrupt('return', _invokeCallback(callback, _context.t0)); case 13: throw _context.t0; case 14: if (!(typeof callback === 'function')) { _context.next = 16; break; } return _context.abrupt('return', _invokeCallback(callback, null, result)); case 16: return _context.abrupt('return', result); case 17: case 'end': return _context.stop(); } } }, _callee, this, [[3, 9]]); })); }; function _invokeCallback(callback, err, result) { try { return callback(err, result); } catch (unhandledError) { // throw unhandled errors to prevent "unhandled rejected promise" // and simulate what would have happened in a promiseless API process.nextTick(function () { throw unhandledError; }); } } /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _retrieveContextUrls = function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(input, options) { // recursive function that will retrieve all @context URLs in documents var retrieve = function () { var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(doc, cycles, documentLoader) { var _this = this; var urls, queue; return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: if (!(Object.keys(cycles).length > MAX_CONTEXT_URLS)) { _context3.next = 2; break; } throw new JsonLdError('Maximum number of @context URLs exceeded.', 'jsonld.ContextUrlError', { code: 'loading remote context failed', max: MAX_CONTEXT_URLS }); case 2: // find all URLs in the given document, reusing already retrieved URLs urls = {}; Object.keys(_urls).forEach(function (url) { if (_urls[url] !== false) { urls[url] = _urls[url]; } }); _findContextUrls(doc, urls, false, options.base); // queue all unretrieved URLs queue = Object.keys(urls).filter(function (u) { return urls[u] === false; }); // retrieve URLs in queue return _context3.abrupt('return', Promise.all(queue.map(function () { var _ref5 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(url) { var _cycles, remoteDoc, ctx; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!(url in cycles)) { _context2.next = 2; break; } throw new JsonLdError('Cyclical @context URLs detected.', 'jsonld.ContextUrlError', { code: 'recursive context inclusion', url: url }); case 2: _cycles = util.clone(cycles); _cycles[url] = true; remoteDoc = void 0; ctx = void 0; _context2.prev = 6; _context2.next = 9; return documentLoader(url); case 9: remoteDoc = _context2.sent; ctx = remoteDoc.document || null; // parse string context as JSON if (_isString(ctx)) { ctx = JSON.parse(ctx); } _context2.next = 17; break; case 14: _context2.prev = 14; _context2.t0 = _context2['catch'](6); throw new JsonLdError('Dereferencing a URL did not result in a valid JSON-LD object. ' + 'Possible causes are an inaccessible URL perhaps due to ' + 'a same-origin policy (ensure the server uses CORS if you are ' + 'using client-side JavaScript), too many redirects, a ' + 'non-JSON response, or more than one HTTP Link Header was ' + 'provided for a remote context.', 'jsonld.InvalidUrl', { code: 'loading remote context failed', url: url, cause: _context2.t0 }); case 17: if (_isObject(ctx)) { _context2.next = 19; break; } throw new JsonLdError('Dereferencing a URL did not result in a JSON object. The ' + 'response was valid JSON, but it was not a JSON object.', 'jsonld.InvalidUrl', { code: 'invalid remote context', url: url }); case 19: // use empty context if no @context key is present if (!('@context' in ctx)) { ctx = { '@context': {} }; } else { ctx = { '@context': ctx['@context'] }; } // append @context URL to context if given if (remoteDoc.contextUrl) { if (!_isArray(ctx['@context'])) { ctx['@context'] = [ctx['@context']]; } ctx['@context'].push(remoteDoc.contextUrl); } // recurse _context2.next = 23; return retrieve(ctx, _cycles, documentLoader); case 23: // store retrieved context w/replaced @context URLs urls[url] = ctx['@context']; // replace all @context URLs in the document _findContextUrls(doc, urls, true, options.base); case 25: case 'end': return _context2.stop(); } } }, _callee2, _this, [[6, 14]]); })); return function (_x8) { return _ref5.apply(this, arguments); }; }()))); case 7: case 'end': return _context3.stop(); } } }, _callee3, this); })); return function retrieve(_x5, _x6, _x7) { return _ref4.apply(this, arguments); }; }(); var documentLoader, _urls; return regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: documentLoader = util.normalizeDocumentLoader(options.documentLoader); // retrieve all @context URLs in input _urls = {}; _context4.next = 4; return retrieve(input, {}, documentLoader); case 4: return _context4.abrupt('return', input); case 5: case 'end': return _context4.stop(); } } }, _callee4, this); })); return function _retrieveContextUrls(_x3, _x4) { return _ref3.apply(this, arguments); }; }(); /** * Finds all @context URLs in the given JSON-LD input. * * @param input the JSON-LD input. * @param urls a map of URLs (url => false/@contexts). * @param replace true to replace the URLs in the given input with the * @contexts from the urls map, false not to. * @param base the base IRI to use to resolve relative IRIs. * * @return true if new URLs to retrieve were found, false if not. */ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var util = __webpack_require__(3); var ActiveContextCache = __webpack_require__(132); var JsonLdError = __webpack_require__(6); var _require = __webpack_require__(4), _isArray = _require.isArray, _isObject = _require.isObject, _isString = _require.isString, _isUndefined = _require.isUndefined; var _require2 = __webpack_require__(26), _isAbsoluteIri = _require2.isAbsolute, _isRelativeIri = _require2.isRelative, prependBase = _require2.prependBase, parseUrl = _require2.parse; var MAX_CONTEXT_URLS = 10; var api = {}; module.exports = api; api.cache = new ActiveContextCache(); /** * Processes a local context and returns a new active context. * * @param activeCtx the current active context. * @param localCtx the local context to process. * @param options the context processing options. * * @return the new active context. */ api.process = function (_ref) { var activeCtx = _ref.activeCtx, localCtx = _ref.localCtx, options = _ref.options; // normalize local context to an array of @context objects if (_isObject(localCtx) && '@context' in localCtx && _isArray(localCtx['@context'])) { localCtx = localCtx['@context']; } var ctxs = _isArray(localCtx) ? localCtx : [localCtx]; // no contexts in array, clone existing context if (ctxs.length === 0) { return activeCtx.clone(); } // process each context in order, update active context // on each iteration to ensure proper caching var rval = activeCtx; for (var i = 0; i < ctxs.length; ++i) { var ctx = ctxs[i]; // reset to initial context if (ctx === null) { rval = activeCtx = api.getInitialContext(options); continue; } // dereference @context key if present if (_isObject(ctx) && '@context' in ctx) { ctx = ctx['@context']; } // context must be an object by now, all URLs retrieved before this call if (!_isObject(ctx)) { throw new JsonLdError('Invalid JSON-LD syntax; @context must be an object.', 'jsonld.SyntaxError', { code: 'invalid local context', context: ctx }); } // get context from cache if available if (api.cache) { var cached = api.cache.get(activeCtx, ctx); if (cached) { rval = activeCtx = cached; continue; } } // update active context and clone new one before updating activeCtx = rval; rval = rval.clone(); // define context mappings for keys in local context var defined = {}; // handle @version if ('@version' in ctx) { if (ctx['@version'] !== 1.1) { throw new JsonLdError('Unsupported JSON-LD version: ' + ctx['@version'], 'jsonld.UnsupportedVersion', { code: 'invalid @version value', context: ctx }); } if (activeCtx.processingMode && activeCtx.processingMode === 'json-ld-1.0') { throw new JsonLdError('@version: ' + ctx['@version'] + ' not compatible with ' + activeCtx.processingMode, 'jsonld.ProcessingModeConflict', { code: 'processing mode conflict', context: ctx }); } rval.processingMode = 'json-ld-1.1'; rval['@version'] = ctx['@version']; defined['@version'] = true; } // if not set explicitly, set processingMode to "json-ld-1.0" rval.processingMode = rval.processingMode || activeCtx.processingMode || 'json-ld-1.0'; // handle @base if ('@base' in ctx) { var base = ctx['@base']; if (base === null) { // no action } else if (_isAbsoluteIri(base)) { base = parseUrl(base); } else if (_isRelativeIri(base)) { base = parseUrl(prependBase(activeCtx['@base'].href, base)); } else { throw new JsonLdError('Invalid JSON-LD syntax; the value of "@base" in a ' + '@context must be an absolute IRI, a relative IRI, or null.', 'jsonld.SyntaxError', { code: 'invalid base IRI', context: ctx }); } rval['@base'] = base; defined['@base'] = true; } // handle @vocab if ('@vocab' in ctx) { var value = ctx['@vocab']; if (value === null) { delete rval['@vocab']; } else if (!_isString(value)) { throw new JsonLdError('Invalid JSON-LD syntax; the value of "@vocab" in a ' + '@context must be a string or null.', 'jsonld.SyntaxError', { code: 'invalid vocab mapping', context: ctx }); } else if (!_isAbsoluteIri(value)) { throw new JsonLdError('Invalid JSON-LD syntax; the value of "@vocab" in a ' + '@context must be an absolute IRI.', 'jsonld.SyntaxError', { code: 'invalid vocab mapping', context: ctx }); } else { rval['@vocab'] = value; } defined['@vocab'] = true; } // handle @language if ('@language' in ctx) { var _value = ctx['@language']; if (_value === null) { delete rval['@language']; } else if (!_isString(_value)) { throw new JsonLdError('Invalid JSON-LD syntax; the value of "@language" in a ' + '@context must be a string or null.', 'jsonld.SyntaxError', { code: 'invalid default language', context: ctx }); } else { rval['@language'] = _value.toLowerCase(); } defined['@language'] = true; } // process all other keys for (var key in ctx) { api.createTermDefinition(rval, ctx, key, defined); } // cache result if (api.cache) { api.cache.set(activeCtx, ctx, rval); } } return rval; }; /** * Creates a term definition during context processing. * * @param activeCtx the current active context. * @param localCtx the local context being processed. * @param term the term in the local context to define the mapping for. * @param defined a map of defining/defined keys to detect cycles and prevent * double definitions. */ api.createTermDefinition = function (activeCtx, localCtx, term, defined) { if (term in defined) { // term already defined if (defined[term]) { return; } // cycle detected throw new JsonLdError('Cyclical context definition detected.', 'jsonld.CyclicalContext', { code: 'cyclic IRI mapping', context: localCtx, term: term }); } // now defining term defined[term] = false; if (api.isKeyword(term)) { throw new JsonLdError('Invalid JSON-LD syntax; keywords cannot be overridden.', 'jsonld.SyntaxError', { code: 'keyword redefinition', context: localCtx, term: term }); } if (term === '') { throw new JsonLdError('Invalid JSON-LD syntax; a term cannot be an empty string.', 'jsonld.SyntaxError', { code: 'invalid term definition', context: localCtx }); } // remove old mapping if (activeCtx.mappings[term]) { delete activeCtx.mappings[term]; } // get context term value var value = localCtx[term]; // clear context entry if (value === null || _isObject(value) && value['@id'] === null) { activeCtx.mappings[term] = null; defined[term] = true; return; } // convert short-hand value to object w/@id var simpleTerm = false; if (_isString(value)) { simpleTerm = true; value = { '@id': value }; } if (!_isObject(value)) { throw new JsonLdError('Invalid JSON-LD syntax; @context term values must be ' + 'strings or objects.', 'jsonld.SyntaxError', { code: 'invalid term definition', context: localCtx }); } // create new mapping var mapping = activeCtx.mappings[term] = {}; mapping.reverse = false; // make sure term definition only has expected keywords var validKeys = ['@container', '@id', '@language', '@reverse', '@type']; // JSON-LD 1.1 support if (api.processingMode(activeCtx, 1.1)) { validKeys.push('@context', '@nest', '@prefix'); } for (var kw in value) { if (!validKeys.includes(kw)) { throw new JsonLdError('Invalid JSON-LD syntax; a term definition must not contain ' + kw, 'jsonld.SyntaxError', { code: 'invalid term definition', context: localCtx }); } } // always compute whether term has a colon as an optimization for // _compactIri var colon = term.indexOf(':'); mapping._termHasColon = colon !== -1; if ('@reverse' in value) { if ('@id' in value) { throw new JsonLdError('Invalid JSON-LD syntax; a @reverse term definition must not ' + 'contain @id.', 'jsonld.SyntaxError', { code: 'invalid reverse property', context: localCtx }); } if ('@nest' in value) { throw new JsonLdError('Invalid JSON-LD syntax; a @reverse term definition must not ' + 'contain @nest.', 'jsonld.SyntaxError', { code: 'invalid reverse property', context: localCtx }); } var reverse = value['@reverse']; if (!_isString(reverse)) { throw new JsonLdError('Invalid JSON-LD syntax; a @context @reverse value must be a string.', 'jsonld.SyntaxError', { code: 'invalid IRI mapping', context: localCtx }); } // expand and add @id mapping var _id = api.expandIri(activeCtx, reverse, { vocab: true, base: false }, localCtx, defined); if (!_isAbsoluteIri(_id)) { throw new JsonLdError('Invalid JSON-LD syntax; a @context @reverse value must be an ' + 'absolute IRI or a blank node identifier.', 'jsonld.SyntaxError', { code: 'invalid IRI mapping', context: localCtx }); } mapping['@id'] = _id; mapping.reverse = true; } else if ('@id' in value) { var _id2 = value['@id']; if (!_isString(_id2)) { throw new JsonLdError('Invalid JSON-LD syntax; a @context @id value must be an array ' + 'of strings or a string.', 'jsonld.SyntaxError', { code: 'invalid IRI mapping', context: localCtx }); } if (_id2 !== term) { // expand and add @id mapping _id2 = api.expandIri(activeCtx, _id2, { vocab: true, base: false }, localCtx, defined); if (!_isAbsoluteIri(_id2) && !api.isKeyword(_id2)) { throw new JsonLdError('Invalid JSON-LD syntax; a @context @id value must be an ' + 'absolute IRI, a blank node identifier, or a keyword.', 'jsonld.SyntaxError', { code: 'invalid IRI mapping', context: localCtx }); } mapping['@id'] = _id2; // indicate if this term may be used as a compact IRI prefix mapping._prefix = !mapping._termHasColon && _id2.match(/[:\/\?#\[\]@]$/) && (simpleTerm || api.processingMode(activeCtx, 1.0)); } } if (!('@id' in mapping)) { // see if the term has a prefix if (mapping._termHasColon) { var prefix = term.substr(0, colon); if (prefix in localCtx) { // define parent prefix api.createTermDefinition(activeCtx, localCtx, prefix, defined); } if (activeCtx.mappings[prefix]) { // set @id based on prefix parent var suffix = term.substr(colon + 1); mapping['@id'] = activeCtx.mappings[prefix]['@id'] + suffix; } else { // term is an absolute IRI mapping['@id'] = term; } } else { // non-IRIs *must* define @ids if @vocab is not available if (!('@vocab' in activeCtx)) { throw new JsonLdError('Invalid JSON-LD syntax; @context terms must define an @id.', 'jsonld.SyntaxError', { code: 'invalid IRI mapping', context: localCtx, term: term }); } // prepend vocab to term mapping['@id'] = activeCtx['@vocab'] + term; } } // IRI mapping now defined defined[term] = true; if ('@type' in value) { var type = value['@type']; if (!_isString(type)) { throw new JsonLdError('Invalid JSON-LD syntax; an @context @type values must be a string.', 'jsonld.SyntaxError', { code: 'invalid type mapping', context: localCtx }); } if (type !== '@id' && type !== '@vocab') { // expand @type to full IRI type = api.expandIri(activeCtx, type, { vocab: true, base: false }, localCtx, defined); if (!_isAbsoluteIri(type)) { throw new JsonLdError('Invalid JSON-LD syntax; an @context @type value must be an ' + 'absolute IRI.', 'jsonld.SyntaxError', { code: 'invalid type mapping', context: localCtx }); } if (type.indexOf('_:') === 0) { throw new JsonLdError('Invalid JSON-LD syntax; an @context @type values must be an IRI, ' + 'not a blank node identifier.', 'jsonld.SyntaxError', { code: 'invalid type mapping', context: localCtx }); } } // add @type to mapping mapping['@type'] = type; } if ('@container' in value) { // normalize container to an array form var container = _isString(value['@container']) ? [value['@container']] : value['@container'] || []; var validContainers = ['@list', '@set', '@index', '@language']; var isValid = true; var hasSet = container.includes('@set'); // JSON-LD 1.1 support if (api.processingMode(activeCtx, 1.1)) { validContainers.push('@graph', '@id', '@type'); // check container length if (container.includes('@list')) { if (container.length !== 1) { throw new JsonLdError('Invalid JSON-LD syntax; @context @container with @list must ' + 'have no other values', 'jsonld.SyntaxError', { code: 'invalid container mapping', context: localCtx }); } } else if (container.includes('@graph')) { if (container.some(function (key) { return key !== '@graph' && key !== '@id' && key !== '@index' && key !== '@set'; })) { throw new JsonLdError('Invalid JSON-LD syntax; @context @container with @graph must ' + 'have no other values other than @id, @index, and @set', 'jsonld.SyntaxError', { code: 'invalid container mapping', context: localCtx }); } } else { // otherwise, container may also include @set isValid &= container.length <= (hasSet ? 2 : 1); } } else { // in JSON-LD 1.0, container must not be an array (it must be a string, // which is one of the validContainers) isValid &= !_isArray(value['@container']); // check container length isValid &= container.length <= 1; } // check against valid containers isValid &= container.every(function (c) { return validContainers.includes(c); }); // @set not allowed with @list isValid &= !(hasSet && container.includes('@list')); if (!isValid) { throw new JsonLdError('Invalid JSON-LD syntax; @context @container value must be ' + 'one of the following: ' + validContainers.join(', '), 'jsonld.SyntaxError', { code: 'invalid container mapping', context: localCtx }); } if (mapping.reverse && !container.every(function (c) { return ['@index', '@set'].includes(c); })) { throw new JsonLdError('Invalid JSON-LD syntax; @context @container value for a @reverse ' + 'type definition must be @index or @set.', 'jsonld.SyntaxError', { code: 'invalid reverse property', context: localCtx }); } // add @container to mapping mapping['@container'] = container; } // scoped contexts if ('@context' in value) { mapping['@context'] = value['@context']; } if ('@language' in value && !('@type' in value)) { var language = value['@language']; if (language !== null && !_isString(language)) { throw new JsonLdError('Invalid JSON-LD syntax; @context @language value must be ' + 'a string or null.', 'jsonld.SyntaxError', { code: 'invalid language mapping', context: localCtx }); } // add @language to mapping if (language !== null) { language = language.toLowerCase(); } mapping['@language'] = language; } // term may be used as a prefix if ('@prefix' in value) { if (mapping._termHasColon) { throw new JsonLdError('Invalid JSON-LD syntax; @context @prefix used on a compact IRI term', 'jsonld.SyntaxError', { code: 'invalid term definition', context: localCtx }); } if (typeof value['@prefix'] === 'boolean') { mapping._prefix = value['@prefix'] === true; } else { throw new JsonLdError('Invalid JSON-LD syntax; @context value for @prefix must be boolean', 'jsonld.SyntaxError', { code: 'invalid @prefix value', context: localCtx }); } } if ('@nest' in value) { var nest = value['@nest']; if (!_isString(nest) || nest !== '@nest' && nest.indexOf('@') === 0) { throw new JsonLdError('Invalid JSON-LD syntax; @context @nest value must be ' + 'a string which is not a keyword other than @nest.', 'jsonld.SyntaxError', { code: 'invalid @nest value', context: localCtx }); } mapping['@nest'] = nest; } // disallow aliasing @context and @preserve var id = mapping['@id']; if (id === '@context' || id === '@preserve') { throw new JsonLdError('Invalid JSON-LD syntax; @context and @preserve cannot be aliased.', 'jsonld.SyntaxError', { code: 'invalid keyword alias', context: localCtx }); } }; /** * Expands a string to a full IRI. The string may be a term, a prefix, a * relative IRI, or an absolute IRI. The associated absolute IRI will be * returned. * * @param activeCtx the current active context. * @param value the string to expand. * @param relativeTo options for how to resolve relative IRIs: * base: true to resolve against the base IRI, false not to. * vocab: true to concatenate after @vocab, false not to. * @param localCtx the local context being processed (only given if called * during context processing). * @param defined a map for tracking cycles in context definitions (only given * if called during context processing). * * @return the expanded value. */ api.expandIri = function (activeCtx, value, relativeTo, localCtx, defined) { // already expanded if (value === null || !_isString(value) || api.isKeyword(value)) { return value; } // define term dependency if not defined if (localCtx && value in localCtx && defined[value] !== true) { api.createTermDefinition(activeCtx, localCtx, value, defined); } relativeTo = relativeTo || {}; if (relativeTo.vocab) { var mapping = activeCtx.mappings[value]; // value is explicitly ignored with a null mapping if (mapping === null) { return null; } if (mapping) { // value is a term return mapping['@id']; } } // split value into prefix:suffix var colon = value.indexOf(':'); if (colon !== -1) { var prefix = value.substr(0, colon); var suffix = value.substr(colon + 1); // do not expand blank nodes (prefix of '_') or already-absolute // IRIs (suffix of '//') if (prefix === '_' || suffix.indexOf('//') === 0) { return value; } // prefix dependency not defined, define it if (localCtx && prefix in localCtx) { api.createTermDefinition(activeCtx, localCtx, prefix, defined); } // use mapping if prefix is defined var _mapping = activeCtx.mappings[prefix]; if (_mapping) { return _mapping['@id'] + suffix; } // already absolute IRI return value; } // prepend vocab if (relativeTo.vocab && '@vocab' in activeCtx) { return activeCtx['@vocab'] + value; } // prepend base if (relativeTo.base) { return prependBase(activeCtx['@base'], value); } return value; }; /** * Gets the initial context. * * @param options the options to use: * [base] the document base IRI. * * @return the initial context. */ api.getInitialContext = function (options) { var base = parseUrl(options.base || ''); return { '@base': base, processingMode: options.processingMode, mappings: {}, inverse: null, getInverse: _createInverseContext, clone: _cloneActiveContext }; /** * Generates an inverse context for use in the compaction algorithm, if * not already generated for the given active context. * * @return the inverse context. */ function _createInverseContext() { var activeCtx = this; // lazily create inverse if (activeCtx.inverse) { return activeCtx.inverse; } var inverse = activeCtx.inverse = {}; // variables for building fast CURIE map var fastCurieMap = activeCtx.fastCurieMap = {}; var irisToTerms = {}; // handle default language var defaultLanguage = activeCtx['@language'] || '@none'; // create term selections for each mapping in the context, ordered by // shortest and then lexicographically least var mappings = activeCtx.mappings; var terms = Object.keys(mappings).sort(util.compareShortestLeast); for (var i = 0; i < terms.length; ++i) { var term = terms[i]; var mapping = mappings[term]; if (mapping === null) { continue; } var container = mapping['@container'] || '@none'; container = [].concat(container).sort().join(''); // iterate over every IRI in the mapping var ids = [].concat(mapping['@id']); for (var ii = 0; ii < ids.length; ++ii) { var iri = ids[ii]; var entry = inverse[iri]; var isKeyword = api.isKeyword(iri); if (!entry) { // initialize entry inverse[iri] = entry = {}; if (!isKeyword && !mapping._termHasColon) { // init IRI to term map and fast CURIE prefixes irisToTerms[iri] = [term]; var fastCurieEntry = { iri: iri, terms: irisToTerms[iri] }; if (iri[0] in fastCurieMap) { fastCurieMap[iri[0]].push(fastCurieEntry); } else { fastCurieMap[iri[0]] = [fastCurieEntry]; } } } else if (!isKeyword && !mapping._termHasColon) { // add IRI to term match irisToTerms[iri].push(term); } // add new entry if (!entry[container]) { entry[container] = { '@language': {}, '@type': {}, '@any': {} }; } entry = entry[container]; _addPreferredTerm(term, entry['@any'], '@none'); if (mapping.reverse) { // term is preferred for values using @reverse _addPreferredTerm(term, entry['@type'], '@reverse'); } else if ('@type' in mapping) { // term is preferred for values using specific type _addPreferredTerm(term, entry['@type'], mapping['@type']); } else if ('@language' in mapping) { // term is preferred for values using specific language var language = mapping['@language'] || '@null'; _addPreferredTerm(term, entry['@language'], language); } else { // term is preferred for values w/default language or no type and // no language // add an entry for the default language _addPreferredTerm(term, entry['@language'], defaultLanguage); // add entries for no type and no language _addPreferredTerm(term, entry['@type'], '@none'); _addPreferredTerm(term, entry['@language'], '@none'); } } } // build fast CURIE map for (var key in fastCurieMap) { _buildIriMap(fastCurieMap, key, 1); } return inverse; } /** * Runs a recursive algorithm to build a lookup map for quickly finding * potential CURIEs. * * @param iriMap the map to build. * @param key the current key in the map to work on. * @param idx the index into the IRI to compare. */ function _buildIriMap(iriMap, key, idx) { var entries = iriMap[key]; var next = iriMap[key] = {}; var iri = void 0; var letter = void 0; for (var i = 0; i < entries.length; ++i) { iri = entries[i].iri; if (idx >= iri.length) { letter = ''; } else { letter = iri[idx]; } if (letter in next) { next[letter].push(entries[i]); } else { next[letter] = [entries[i]]; } } for (var _key in next) { if (_key === '') { continue; } _buildIriMap(next, _key, idx + 1); } } /** * Adds the term for the given entry if not already added. * * @param term the term to add. * @param entry the inverse context typeOrLanguage entry to add to. * @param typeOrLanguageValue the key in the entry to add to. */ function _addPreferredTerm(term, entry, typeOrLanguageValue) { if (!(typeOrLanguageValue in entry)) { entry[typeOrLanguageValue] = term; } } /** * Clones an active context, creating a child active context. * * @return a clone (child) of the active context. */ function _cloneActiveContext() { var child = {}; child['@base'] = this['@base']; child.mappings = util.clone(this.mappings); child.clone = this.clone; child.inverse = null; child.getInverse = this.getInverse; if ('@language' in this) { child['@language'] = this['@language']; } if ('@vocab' in this) { child['@vocab'] = this['@vocab']; } return child; } }; /** * Gets the value for the given active context key and type, null if none is * set. * * @param ctx the active context. * @param key the context key. * @param [type] the type of value to get (eg: '@id', '@type'), if not * specified gets the entire entry for a key, null if not found. * * @return the value. */ api.getContextValue = function (ctx, key, type) { // return null for invalid key if (key === null) { return null; } // get specific entry information if (ctx.mappings[key]) { var entry = ctx.mappings[key]; if (_isUndefined(type)) { // return whole entry return entry; } if (type in entry) { // return entry value for type return entry[type]; } } // get default language if (type === '@language' && type in ctx) { return ctx[type]; } return null; }; /** * Retrieves external @context URLs using the given document loader. Every * instance of @context in the input that refers to a URL will be replaced * with the JSON @context found at that URL. * * @param input the JSON-LD input with possible contexts. * @param options the options to use: * documentLoader(url, [callback(err, remoteDoc)]) the document loader. * @param callback(err, input) called once the operation completes. */ api.getAllContexts = function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(input, options) { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: return _context.abrupt('return', _retrieveContextUrls(input, options)); case 1: case 'end': return _context.stop(); } } }, _callee, undefined); })); return function (_x, _x2) { return _ref2.apply(this, arguments); }; }(); /** * Processing Mode check. * * @param activeCtx the current active context. * @param version the string or numeric version to check. * * @return boolean. */ api.processingMode = function (activeCtx, version) { if (version.toString() >= '1.1') { return activeCtx.processingMode && activeCtx.processingMode >= 'json-ld-' + version.toString(); } else { return !activeCtx.processingMode || activeCtx.processingMode === 'json-ld-1.0'; } }; /** * Returns whether or not the given value is a keyword. * * @param v the value to check. * * @return true if the value is a keyword, false if not. */ api.isKeyword = function (v) { if (!_isString(v)) { return false; } switch (v) { case '@base': case '@container': case '@context': case '@default': case '@embed': case '@explicit': case '@graph': case '@id': case '@index': case '@language': case '@list': case '@nest': case '@none': case '@omitDefault': case '@prefix': case '@preserve': case '@requireAll': case '@reverse': case '@set': case '@type': case '@value': case '@version': case '@vocab': return true; } return false; }; function _findContextUrls(input, urls, replace, base) { if (_isArray(input)) { for (var i = 0; i < input.length; ++i) { _findContextUrls(input[i], urls, replace, base); } return; } if (!_isObject(input)) { // no @context URLs can be found in non-object input return; } // input is an object for (var key in input) { if (key !== '@context') { _findContextUrls(input[key], urls, replace, base); continue; } // get @context var ctx = input[key]; if (_isArray(ctx)) { // array @context var length = ctx.length; for (var _i = 0; _i < length; ++_i) { var _ctx = ctx[_i]; if (_isString(_ctx)) { _ctx = prependBase(base, _ctx); // replace w/@context if requested if (replace) { if (urls[_ctx] !== false) { _ctx = urls[_ctx]; if (_isArray(_ctx)) { // add flattened context Array.prototype.splice.apply(ctx, [_i, 1].concat(_ctx)); _i += _ctx.length - 1; length = ctx.length; } else { ctx[_i] = _ctx; } } } else if (!(_ctx in urls)) { // @context URL found urls[_ctx] = false; } } else { // look for scoped context for (var _key2 in _ctx) { if (_isObject(_ctx[_key2])) { _findContextUrls(_ctx[_key2], urls, replace, base); } } } } } else if (_isString(ctx)) { // string @context ctx = prependBase(base, ctx); // replace w/@context if requested if (replace) { if (urls[ctx] !== false) { input[key] = urls[ctx]; } } else if (!(ctx in urls)) { // @context URL found urls[ctx] = false; } } else { // look for scoped context for (var _key3 in ctx) { if (_isObject(ctx[_key3])) { _findContextUrls(ctx[_key3], urls, replace, base); } } } } } /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(1); var hide = __webpack_require__(10); var has = __webpack_require__(13); var SRC = __webpack_require__(20)('src'); var TO_STRING = 'toString'; var $toString = Function[TO_STRING]; var TPL = ('' + $toString).split(TO_STRING); __webpack_require__(2).inspectSource = function (it) { return $toString.call(it); }; (module.exports = function (O, key, val, safe) { var isFunction = typeof val == 'function'; if (isFunction) has(val, 'name') || hide(val, 'name', key); if (O[key] === val) return; if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); if (O === global) { O[key] = val; } else if (!safe) { delete O[key]; hide(O, key, val); } else if (O[key]) { O[key] = val; } else { hide(O, key, val); } // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative })(Function.prototype, TO_STRING, function toString() { return typeof this == 'function' && this[SRC] || $toString.call(this); }); /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { // to indexed object, toObject with fallback for non-array-like ES3 strings var IObject = __webpack_require__(53); var defined = __webpack_require__(30); module.exports = function (it) { return IObject(defined(it)); }; /***/ }), /* 18 */ /***/ (function(module, exports) { var toString = {}.toString; module.exports = function (it) { return toString.call(it).slice(8, -1); }; /***/ }), /* 19 */ /***/ (function(module, exports) { module.exports = function (exec) { try { return !!exec(); } catch (e) { return true; } }; /***/ }), /* 20 */ /***/ (function(module, exports) { var id = 0; var px = Math.random(); module.exports = function (key) { return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); }; /***/ }), /* 21 */ /***/ (function(module, exports) { module.exports = false; /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 / 15.2.3.14 Object.keys(O) var $keys = __webpack_require__(55); var enumBugKeys = __webpack_require__(40); module.exports = Object.keys || function keys(O) { return $keys(O, enumBugKeys); }; /***/ }), /* 23 */ /***/ (function(module, exports) { module.exports = {}; /***/ }), /* 24 */ /***/ (function(module, exports) { /** * Node.js module for Forge. * * @author Dave Longley * * Copyright 2011-2016 Digital Bazaar, Inc. */ module.exports = { // default options options: { usePureJavaScript: false } }; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; var XSD = 'http://www.w3.org/2001/XMLSchema#'; module.exports = { LINK_HEADER_REL: 'http://www.w3.org/ns/json-ld#context', RDF: RDF, RDF_LIST: RDF + 'List', RDF_FIRST: RDF + 'first', RDF_REST: RDF + 'rest', RDF_NIL: RDF + 'nil', RDF_TYPE: RDF + 'type', RDF_PLAIN_LITERAL: RDF + 'PlainLiteral', RDF_XML_LITERAL: RDF + 'XMLLiteral', RDF_OBJECT: RDF + 'object', RDF_LANGSTRING: RDF + 'langString', XSD: XSD, XSD_BOOLEAN: XSD + 'boolean', XSD_DOUBLE: XSD + 'double', XSD_INTEGER: XSD + 'integer', XSD_STRING: XSD + 'string' }; /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var types = __webpack_require__(4); var api = {}; module.exports = api; // define URL parser // parseUri 1.2.2 // (c) Steven Levithan // MIT License // with local jsonld.js modifications api.parsers = { simple: { // RFC 3986 basic parts keys: ['href', 'scheme', 'authority', 'path', 'query', 'fragment'], regex: /^(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?/ }, full: { keys: ['href', 'protocol', 'scheme', 'authority', 'auth', 'user', 'password', 'hostname', 'port', 'path', 'directory', 'file', 'query', 'fragment'], regex: /^(([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?(?:(((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/ } }; api.parse = function (str, parser) { var parsed = {}; var o = api.parsers[parser || 'full']; var m = o.regex.exec(str); var i = o.keys.length; while (i--) { parsed[o.keys[i]] = m[i] === undefined ? null : m[i]; } // remove default ports in found in URLs if (parsed.scheme === 'https' && parsed.port === '443' || parsed.scheme === 'http' && parsed.port === '80') { parsed.href = parsed.href.replace(':' + parsed.port, ''); parsed.authority = parsed.authority.replace(':' + parsed.port, ''); parsed.port = null; } parsed.normalizedPath = api.removeDotSegments(parsed.path); return parsed; }; /** * Prepends a base IRI to the given relative IRI. * * @param base the base IRI. * @param iri the relative IRI. * * @return the absolute IRI. */ api.prependBase = function (base, iri) { // skip IRI processing if (base === null) { return iri; } // already an absolute IRI if (iri.indexOf(':') !== -1) { return iri; } // parse base if it is a string if (types.isString(base)) { base = api.parse(base || ''); } // parse given IRI var rel = api.parse(iri); // per RFC3986 5.2.2 var transform = { protocol: base.protocol || '' }; if (rel.authority !== null) { transform.authority = rel.authority; transform.path = rel.path; transform.query = rel.query; } else { transform.authority = base.authority; if (rel.path === '') { transform.path = base.path; if (rel.query !== null) { transform.query = rel.query; } else { transform.query = base.query; } } else { if (rel.path.indexOf('/') === 0) { // IRI represents an absolute path transform.path = rel.path; } else { // merge paths var path = base.path; // append relative path to the end of the last directory from base path = path.substr(0, path.lastIndexOf('/') + 1); if (path.length > 0 && path.substr(-1) !== '/') { path += '/'; } path += rel.path; transform.path = path; } transform.query = rel.query; } } if (rel.path !== '') { // remove slashes and dots in path transform.path = api.removeDotSegments(transform.path); } // construct URL var rval = transform.protocol; if (transform.authority !== null) { rval += '//' + transform.authority; } rval += transform.path; if (transform.query !== null) { rval += '?' + transform.query; } if (rel.fragment !== null) { rval += '#' + rel.fragment; } // handle empty base if (rval === '') { rval = './'; } return rval; }; /** * Removes a base IRI from the given absolute IRI. * * @param base the base IRI. * @param iri the absolute IRI. * * @return the relative IRI if relative to base, otherwise the absolute IRI. */ api.removeBase = function (base, iri) { // skip IRI processing if (base === null) { return iri; } if (types.isString(base)) { base = api.parse(base || ''); } // establish base root var root = ''; if (base.href !== '') { root += (base.protocol || '') + '//' + (base.authority || ''); } else if (iri.indexOf('//')) { // support network-path reference with empty base root += '//'; } // IRI not relative to base if (iri.indexOf(root) !== 0) { return iri; } // remove root from IRI and parse remainder var rel = api.parse(iri.substr(root.length)); // remove path segments that match (do not remove last segment unless there // is a hash or query) var baseSegments = base.normalizedPath.split('/'); var iriSegments = rel.normalizedPath.split('/'); var last = rel.fragment || rel.query ? 0 : 1; while (baseSegments.length > 0 && iriSegments.length > last) { if (baseSegments[0] !== iriSegments[0]) { break; } baseSegments.shift(); iriSegments.shift(); } // use '../' for each non-matching base segment var rval = ''; if (baseSegments.length > 0) { // don't count the last segment (if it ends with '/' last path doesn't // count and if it doesn't end with '/' it isn't a path) baseSegments.pop(); for (var i = 0; i < baseSegments.length; ++i) { rval += '../'; } } // prepend remaining segments rval += iriSegments.join('/'); // add query and hash if (rel.query !== null) { rval += '?' + rel.query; } if (rel.fragment !== null) { rval += '#' + rel.fragment; } // handle empty base if (rval === '') { rval = './'; } return rval; }; /** * Removes dot segments from a URL path. * * @param path the path to remove dot segments from. */ api.removeDotSegments = function (path) { // RFC 3986 5.2.4 (reworked) // empty path shortcut if (path.length === 0) { return ''; } var input = path.split('/'); var output = []; while (input.length > 0) { var next = input.shift(); var done = input.length === 0; if (next === '.') { if (done) { // ensure output has trailing / output.push(''); } continue; } if (next === '..') { output.pop(); if (done) { // ensure output has trailing / output.push(''); } continue; } output.push(next); } // ensure output has leading / if (output.length > 0 && output[0] !== '') { output.unshift(''); } if (output.length === 1 && output[0] === '') { return '/'; } return output.join('/'); }; // TODO: time better isAbsolute/isRelative checks using full regexes: // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html // regex to check for absolute IRI (starting scheme and ':') or blank node IRI var isAbsoluteRegex = /^([A-Za-z][A-Za-z0-9+-.]*|_):/; /** * Returns true if the given value is an absolute IRI or blank node IRI, false * if not. * Note: This weak check only checks for a correct starting scheme. * * @param v the value to check. * * @return true if the value is an absolute IRI, false if not. */ api.isAbsolute = function (v) { return types.isString(v) && isAbsoluteRegex.test(v); }; /** * Returns true if the given value is a relative IRI, false if not. * Note: this is a weak check. * * @param v the value to check. * * @return true if the value is a relative IRI, false if not. */ api.isRelative = function (v) { return types.isString(v); }; /***/ }), /* 27 */ /***/ (function(module, exports) { module.exports = function (bitmap, value) { return { enumerable: !(bitmap & 1), configurable: !(bitmap & 2), writable: !(bitmap & 4), value: value }; }; /***/ }), /* 28 */ /***/ (function(module, exports, __webpack_require__) { // optional / simple context binding var aFunction = __webpack_require__(29); module.exports = function (fn, that, length) { aFunction(fn); if (that === undefined) return fn; switch (length) { case 1: return function (a) { return fn.call(that, a); }; case 2: return function (a, b) { return fn.call(that, a, b); }; case 3: return function (a, b, c) { return fn.call(that, a, b, c); }; } return function (/* ...args */) { return fn.apply(that, arguments); }; }; /***/ }), /* 29 */ /***/ (function(module, exports) { module.exports = function (it) { if (typeof it != 'function') throw TypeError(it + ' is not a function!'); return it; }; /***/ }), /* 30 */ /***/ (function(module, exports) { // 7.2.1 RequireObjectCoercible(argument) module.exports = function (it) { if (it == undefined) throw TypeError("Can't call method on " + it); return it; }; /***/ }), /* 31 */ /***/ (function(module, exports) { exports.f = {}.propertyIsEnumerable; /***/ }), /* 32 */ /***/ (function(module, exports, __webpack_require__) { var def = __webpack_require__(11).f; var has = __webpack_require__(13); var TAG = __webpack_require__(0)('toStringTag'); module.exports = function (it, tag, stat) { if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); }; /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _require = __webpack_require__(15), isKeyword = _require.isKeyword; var graphTypes = __webpack_require__(5); var types = __webpack_require__(4); var util = __webpack_require__(3); var JsonLdError = __webpack_require__(6); var api = {}; module.exports = api; /** * Creates a merged JSON-LD node map (node ID => node). * * @param input the expanded JSON-LD to create a node map of. * @param [options] the options to use: * [issuer] a jsonld.IdentifierIssuer to use to label blank nodes. * * @return the node map. */ api.createMergedNodeMap = function (input, options) { options = options || {}; // produce a map of all subjects and name each bnode var issuer = options.issuer || new util.IdentifierIssuer('_:b'); var graphs = { '@default': {} }; api.createNodeMap(input, graphs, '@default', issuer); // add all non-default graphs to default graph return api.mergeNodeMaps(graphs); }; /** * Recursively flattens the subjects in the given JSON-LD expanded input * into a node map. * * @param input the JSON-LD expanded input. * @param graphs a map of graph name to subject map. * @param graph the name of the current graph. * @param issuer the blank node identifier issuer. * @param name the name assigned to the current input if it is a bnode. * @param list the list to append to, null for none. */ api.createNodeMap = function (input, graphs, graph, issuer, name, list) { // recurse through array if (types.isArray(input)) { for (var i = 0; i < input.length; ++i) { api.createNodeMap(input[i], graphs, graph, issuer, undefined, list); } return; } // add non-object to list if (!types.isObject(input)) { if (list) { list.push(input); } return; } // add values to list if (graphTypes.isValue(input)) { if ('@type' in input) { var type = input['@type']; // rename @type blank node if (type.indexOf('_:') === 0) { input['@type'] = type = issuer.getId(type); } } if (list) { list.push(input); } return; } // Note: At this point, input must be a subject. // spec requires @type to be named first, so assign names early if ('@type' in input) { var _types = input['@type']; for (var _i = 0; _i < _types.length; ++_i) { var _type = _types[_i]; if (_type.indexOf('_:') === 0) { issuer.getId(_type); } } } // get name for subject if (types.isUndefined(name)) { name = graphTypes.isBlankNode(input) ? issuer.getId(input['@id']) : input['@id']; } // add subject reference to list if (list) { list.push({ '@id': name }); } // create new subject or merge into existing one var subjects = graphs[graph]; var subject = subjects[name] = subjects[name] || {}; subject['@id'] = name; var properties = Object.keys(input).sort(); for (var pi = 0; pi < properties.length; ++pi) { var property = properties[pi]; // skip @id if (property === '@id') { continue; } // handle reverse properties if (property === '@reverse') { var referencedNode = { '@id': name }; var reverseMap = input['@reverse']; for (var reverseProperty in reverseMap) { var items = reverseMap[reverseProperty]; for (var ii = 0; ii < items.length; ++ii) { var item = items[ii]; var itemName = item['@id']; if (graphTypes.isBlankNode(item)) { itemName = issuer.getId(itemName); } api.createNodeMap(item, graphs, graph, issuer, itemName); util.addValue(subjects[itemName], reverseProperty, referencedNode, { propertyIsArray: true, allowDuplicate: false }); } } continue; } // recurse into graph if (property === '@graph') { // add graph subjects map entry if (!(name in graphs)) { graphs[name] = {}; } api.createNodeMap(input[property], graphs, name, issuer); continue; } // copy non-@type keywords if (property !== '@type' && isKeyword(property)) { if (property === '@index' && property in subject && (input[property] !== subject[property] || input[property]['@id'] !== subject[property]['@id'])) { throw new JsonLdError('Invalid JSON-LD syntax; conflicting @index property detected.', 'jsonld.SyntaxError', { code: 'conflicting indexes', subject: subject }); } subject[property] = input[property]; continue; } // iterate over objects var objects = input[property]; // if property is a bnode, assign it a new id if (property.indexOf('_:') === 0) { property = issuer.getId(property); } // ensure property is added for empty arrays if (objects.length === 0) { util.addValue(subject, property, [], { propertyIsArray: true }); continue; } for (var oi = 0; oi < objects.length; ++oi) { var o = objects[oi]; if (property === '@type') { // rename @type blank nodes o = o.indexOf('_:') === 0 ? issuer.getId(o) : o; } // handle embedded subject or subject reference if (graphTypes.isSubject(o) || graphTypes.isSubjectReference(o)) { // relabel blank node @id var id = graphTypes.isBlankNode(o) ? issuer.getId(o['@id']) : o['@id']; // add reference and recurse util.addValue(subject, property, { '@id': id }, { propertyIsArray: true, allowDuplicate: false }); api.createNodeMap(o, graphs, graph, issuer, id); } else if (graphTypes.isList(o)) { // handle @list var _list = []; api.createNodeMap(o['@list'], graphs, graph, issuer, name, _list); o = { '@list': _list }; util.addValue(subject, property, o, { propertyIsArray: true, allowDuplicate: false }); } else { // handle @value api.createNodeMap(o, graphs, graph, issuer, name); util.addValue(subject, property, o, { propertyIsArray: true, allowDuplicate: false }); } } } }; /** * Merge separate named graphs into a single merged graph including * all nodes from the default graph and named graphs. * * @param graphs a map of graph name to subject map. * * @return the merged graph map. */ api.mergeNodeMapGraphs = function (graphs) { var merged = {}; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = Object.keys(graphs).sort()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var name = _step.value; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = Object.keys(graphs[name]).sort()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var id = _step2.value; var node = graphs[name][id]; if (!(id in merged)) { merged[id] = { '@id': id }; } var mergedNode = merged[id]; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = Object.keys(node).sort()[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var property = _step3.value; if (isKeyword(property)) { // copy keywords mergedNode[property] = util.clone(node[property]); } else { // merge objects var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = node[property][Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { var value = _step4.value; util.addValue(mergedNode, property, util.clone(value), { propertyIsArray: true, allowDuplicate: false }); } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } } } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return merged; }; api.mergeNodeMaps = function (graphs) { // add all non-default graphs to default graph var defaultGraph = graphs['@default']; var graphNames = Object.keys(graphs).sort(); for (var i = 0; i < graphNames.length; ++i) { var graphName = graphNames[i]; if (graphName === '@default') { continue; } var nodeMap = graphs[graphName]; var subject = defaultGraph[graphName]; if (!subject) { defaultGraph[graphName] = subject = { '@id': graphName, '@graph': [] }; } else if (!('@graph' in subject)) { subject['@graph'] = []; } var graph = subject['@graph']; var ids = Object.keys(nodeMap).sort(); for (var ii = 0; ii < ids.length; ++ii) { var node = nodeMap[ids[ii]]; // only add full subjects if (!graphTypes.isSubjectReference(node)) { graph.push(node); } } } return defaultGraph; }; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(9); var document = __webpack_require__(1).document; // typeof document.createElement is 'object' in old IE var is = isObject(document) && isObject(document.createElement); module.exports = function (it) { return is ? document.createElement(it) : {}; }; /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.1 ToPrimitive(input [, PreferredType]) var isObject = __webpack_require__(9); // instead of the ES6 spec version, we didn't implement @@toPrimitive case // and the second argument - flag - preferred type is a string module.exports = function (it, S) { if (!isObject(it)) return it; var fn, val; if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; throw TypeError("Can't convert object to primitive value"); }; /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.15 ToLength var toInteger = __webpack_require__(37); var min = Math.min; module.exports = function (it) { return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 }; /***/ }), /* 37 */ /***/ (function(module, exports) { // 7.1.4 ToInteger var ceil = Math.ceil; var floor = Math.floor; module.exports = function (it) { return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); }; /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { var core = __webpack_require__(2); var global = __webpack_require__(1); var SHARED = '__core-js_shared__'; var store = global[SHARED] || (global[SHARED] = {}); (module.exports = function (key, value) { return store[key] || (store[key] = value !== undefined ? value : {}); })('versions', []).push({ version: core.version, mode: __webpack_require__(21) ? 'pure' : 'global', copyright: '© 2018 Denis Pushkarev (zloirock.ru)' }); /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { var shared = __webpack_require__(38)('keys'); var uid = __webpack_require__(20); module.exports = function (key) { return shared[key] || (shared[key] = uid(key)); }; /***/ }), /* 40 */ /***/ (function(module, exports) { // IE 8- don't enum bug keys module.exports = ( 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' ).split(','); /***/ }), /* 41 */ /***/ (function(module, exports) { exports.f = Object.getOwnPropertySymbols; /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { // getting tag from 19.1.3.6 Object.prototype.toString() var cof = __webpack_require__(18); var TAG = __webpack_require__(0)('toStringTag'); // ES3 wrong here var ARG = cof(function () { return arguments; }()) == 'Arguments'; // fallback for IE11 Script Access Denied error var tryGet = function (it, key) { try { return it[key]; } catch (e) { /* empty */ } }; module.exports = function (it) { var O, T, B; return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T // builtinTag case : ARG ? cof(O) // ES3 arguments fallback : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; }; /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 25.4.1.5 NewPromiseCapability(C) var aFunction = __webpack_require__(29); function PromiseCapability(C) { var resolve, reject; this.promise = new C(function ($$resolve, $$reject) { if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); resolve = $$resolve; reject = $$reject; }); this.resolve = aFunction(resolve); this.reject = aFunction(reject); } module.exports.f = function (C) { return new PromiseCapability(C); }; /***/ }), /* 44 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(1); var core = __webpack_require__(2); var LIBRARY = __webpack_require__(21); var wksExt = __webpack_require__(65); var defineProperty = __webpack_require__(11).f; module.exports = function (name) { var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); }; /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * An implementation of the RDF Dataset Normalization specification. * This library works in the browser and node.js. * * BSD 3-Clause License * Copyright (c) 2016-2017 Digital Bazaar, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. *.now * Neither the name of the Digital Bazaar, Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var util = __webpack_require__(14); var URDNA2015 = __webpack_require__(68); var URGNA2012 = __webpack_require__(126); var URDNA2015Sync = __webpack_require__(72); var URGNA2012Sync = __webpack_require__(127); var URDNA2015Native = void 0; try { URDNA2015Native = __webpack_require__(128)('urdna2015'); } catch (e) {} var api = {}; module.exports = api; // expose helpers api.NQuads = __webpack_require__(48); api.IdentifierIssuer = __webpack_require__(46); /** * Asynchronously canonizes an RDF dataset. * * @param dataset the dataset to canonize. * @param [options] the options to use: * [algorithm] the canonicalization algorithm to use, `URDNA2015` or * `URGNA2012` (default: `URGNA2012`). * [usePureJavaScript] only use JavaScript implementation * (default: false). * @param callback(err, canonical) called once the operation completes. * * @return a Promise that resolves to the canonicalized RDF Dataset. */ api.canonize = util.callbackify(function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(dataset, options) { var callback, promise; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: callback = void 0; promise = new Promise(function (resolve, reject) { callback = function callback(err, canonical) { if (err) { return reject(err); } /*if(options.format === 'application/nquads') { canonical = canonical.join(''); } canonical = _parseNQuads(canonical.join(''));*/ resolve(canonical); }; }); // back-compat with legacy dataset if (!Array.isArray(dataset)) { dataset = api.NQuads.legacyDatasetToQuads(dataset); } // TODO: convert algorithms to Promise-based async if (!(options.algorithm === 'URDNA2015')) { _context.next = 7; break; } if (URDNA2015Native && !options.usePureJavaScript) { URDNA2015Native.main({ dataset: dataset }, callback); } else { new URDNA2015(options).main(dataset, callback); } _context.next = 12; break; case 7: if (!(options.algorithm === 'URGNA2012')) { _context.next = 11; break; } new URGNA2012(options).main(dataset, callback); _context.next = 12; break; case 11: throw new Error('Invalid RDF Dataset Canonicalization algorithm: ' + options.algorithm); case 12: return _context.abrupt('return', promise); case 13: case 'end': return _context.stop(); } } }, _callee, this); })); return function (_x, _x2) { return _ref.apply(this, arguments); }; }()); /** * Synchronously canonizes an RDF dataset. * * @param dataset the dataset to canonize. * @param [options] the options to use: * [algorithm] the canonicalization algorithm to use, `URDNA2015` or * `URGNA2012` (default: `URGNA2012`). * * @return the RDF dataset in canonical form. */ api.canonizeSync = function (dataset, options) { // back-compat with legacy dataset if (!Array.isArray(dataset)) { dataset = api.NQuads.legacyDatasetToQuads(dataset); } if (options.algorithm === 'URDNA2015') { if (URDNA2015Native && !options.usePureJavaScript) { return URDNA2015Native.mainSync({ dataset: dataset }); } return new URDNA2015Sync(options).main(dataset); } if (options.algorithm === 'URGNA2012') { return new URGNA2012Sync(options).main(dataset); } throw new Error('Invalid RDF Dataset Canonicalization algorithm: ' + options.algorithm); }; /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2016-2017 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var util = __webpack_require__(14); module.exports = function () { /** * Creates a new IdentifierIssuer. A IdentifierIssuer issues unique * identifiers, keeping track of any previously issued identifiers. * * @param prefix the prefix to use (''). */ function IdentifierIssuer(prefix) { _classCallCheck(this, IdentifierIssuer); this.prefix = prefix; this.counter = 0; this.existing = {}; } /** * Copies this IdentifierIssuer. * * @return a copy of this IdentifierIssuer. */ _createClass(IdentifierIssuer, [{ key: 'clone', value: function clone() { var copy = new IdentifierIssuer(this.prefix); copy.counter = this.counter; copy.existing = util.clone(this.existing); return copy; } /** * Gets the new identifier for the given old identifier, where if no old * identifier is given a new identifier will be generated. * * @param [old] the old identifier to get the new identifier for. * * @return the new identifier. */ }, { key: 'getId', value: function getId(old) { // return existing old identifier if (old && old in this.existing) { return this.existing[old]; } // get next identifier var identifier = this.prefix + this.counter; this.counter += 1; // save mapping if (old) { this.existing[old] = identifier; } return identifier; } /** * Returns true if the given old identifer has already been assigned a new * identifier. * * @param old the old identifier to check. * * @return true if the old identifier has been assigned a new identifier, false * if not. */ }, { key: 'hasId', value: function hasId(old) { return old in this.existing; } }]); return IdentifierIssuer; }(); /***/ }), /* 47 */ /***/ (function(module, exports, __webpack_require__) { /** * Node.js module for Forge message digests. * * @author Dave Longley * * Copyright 2011-2017 Digital Bazaar, Inc. */ var forge = __webpack_require__(24); module.exports = forge.md = forge.md || {}; forge.md.algorithms = forge.md.algorithms || {}; /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2016-2017 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var util = __webpack_require__(123); var TERMS = ['subject', 'predicate', 'object', 'graph']; var RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; var RDF_LANGSTRING = RDF + 'langString'; var XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string'; // build regexes var REGEX = {}; (function () { var iri = '(?:<([^:]+:[^>]*)>)'; var bnode = '(_:(?:[A-Za-z0-9]+))'; var plain = '"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"'; var datatype = '(?:\\^\\^' + iri + ')'; var language = '(?:@([a-z]+(?:-[a-z0-9]+)*))'; var literal = '(?:' + plain + '(?:' + datatype + '|' + language + ')?)'; var ws = '[ \\t]+'; var wso = '[ \\t]*'; // define quad part regexes var subject = '(?:' + iri + '|' + bnode + ')' + ws; var property = iri + ws; var object = '(?:' + iri + '|' + bnode + '|' + literal + ')' + wso; var graphName = '(?:\\.|(?:(?:' + iri + '|' + bnode + ')' + wso + '\\.))'; // end of line and empty regexes REGEX.eoln = /(?:\r\n)|(?:\n)|(?:\r)/g; REGEX.empty = new RegExp('^' + wso + '$'); // full quad regex REGEX.quad = new RegExp('^' + wso + subject + property + object + graphName + wso + '$'); })(); module.exports = function () { function NQuads() { _classCallCheck(this, NQuads); } _createClass(NQuads, null, [{ key: 'parse', /** * Parses RDF in the form of N-Quads. * * @param input the N-Quads input to parse. * * @return an RDF dataset (an array of quads per http://rdf.js.org/). */ value: function parse(input) { // build RDF dataset var dataset = []; var graphs = {}; // split N-Quad input into lines var lines = input.split(REGEX.eoln); var lineNumber = 0; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var line = _step.value; lineNumber++; // skip empty lines if (REGEX.empty.test(line)) { continue; } // parse quad var match = line.match(REGEX.quad); if (match === null) { throw new Error('N-Quads parse error on line ' + lineNumber + '.'); } // create RDF quad var quad = {}; // get subject if (!util.isUndefined(match[1])) { quad.subject = { termType: 'NamedNode', value: match[1] }; } else { quad.subject = { termType: 'BlankNode', value: match[2] }; } // get predicate quad.predicate = { termType: 'NamedNode', value: match[3] }; // get object if (!util.isUndefined(match[4])) { quad.object = { termType: 'NamedNode', value: match[4] }; } else if (!util.isUndefined(match[5])) { quad.object = { termType: 'BlankNode', value: match[5] }; } else { quad.object = { termType: 'Literal', value: undefined, datatype: { termType: 'NamedNode' } }; if (!util.isUndefined(match[7])) { quad.object.datatype.value = match[7]; } else if (!util.isUndefined(match[8])) { quad.object.datatype.value = RDF_LANGSTRING; quad.object.language = match[8]; } else { quad.object.datatype.value = XSD_STRING; } var unescaped = match[6].replace(/\\"/g, '"').replace(/\\t/g, '\t').replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/\\\\/g, '\\'); quad.object.value = unescaped; } // get graph if (!util.isUndefined(match[9])) { quad.graph = { termType: 'NamedNode', value: match[9] }; } else if (!util.isUndefined(match[10])) { quad.graph = { termType: 'BlankNode', value: match[10] }; } else { quad.graph = { termType: 'DefaultGraph', value: '' }; } // only add quad if it is unique in its graph if (!(quad.graph.value in graphs)) { graphs[quad.graph.value] = [quad]; dataset.push(quad); } else { var unique = true; var quads = graphs[quad.graph.value]; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = quads[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var q = _step2.value; if (_compareTriples(q, quad)) { unique = false; break; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } if (unique) { quads.push(quad); dataset.push(quad); } } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return dataset; } /** * Converts an RDF dataset to N-Quads. * * @param dataset (array of quads) the RDF dataset to convert. * * @return the N-Quads string. */ }, { key: 'serialize', value: function serialize(dataset) { if (!Array.isArray(dataset)) { dataset = NQuads.legacyDatasetToQuads(dataset); } var quads = []; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = dataset[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var quad = _step3.value; quads.push(NQuads.serializeQuad(quad)); } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } return quads.sort().join(''); } /** * Converts an RDF quad to an N-Quad string (a single quad). * * @param quad the RDF quad convert. * * @return the N-Quad string. */ }, { key: 'serializeQuad', value: function serializeQuad(quad) { var s = quad.subject; var p = quad.predicate; var o = quad.object; var g = quad.graph; var nquad = ''; // subject and predicate can only be NamedNode or BlankNode [s, p].forEach(function (term) { if (term.termType === 'NamedNode') { nquad += '<' + term.value + '>'; } else { nquad += term.value; } nquad += ' '; }); // object is NamedNode, BlankNode, or Literal if (o.termType === 'NamedNode') { nquad += '<' + o.value + '>'; } else if (o.termType === 'BlankNode') { nquad += o.value; } else { var escaped = o.value.replace(/\\/g, '\\\\').replace(/\t/g, '\\t').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\"/g, '\\"'); nquad += '"' + escaped + '"'; if (o.datatype.value === RDF_LANGSTRING) { if (o.language) { nquad += '@' + o.language; } } else if (o.datatype.value !== XSD_STRING) { nquad += '^^<' + o.datatype.value + '>'; } } // graph can only be NamedNode or BlankNode (or DefaultGraph, but that // does not add to `nquad`) if (g.termType === 'NamedNode') { nquad += ' <' + g.value + '>'; } else if (g.termType === 'BlankNode') { nquad += ' ' + g.value; } nquad += ' .\n'; return nquad; } /** * Converts a legacy-formatted dataset to an array of quads dataset per * http://rdf.js.org/. * * @param dataset the legacy dataset to convert. * * @return the array of quads dataset. */ }, { key: 'legacyDatasetToQuads', value: function legacyDatasetToQuads(dataset) { var quads = []; var termTypeMap = { 'blank node': 'BlankNode', 'IRI': 'NamedNode', 'literal': 'Literal' }; var _loop = function _loop(graphName) { var triples = dataset[graphName]; triples.forEach(function (triple) { var quad = {}; for (var componentName in triple) { var oldComponent = triple[componentName]; var newComponent = { termType: termTypeMap[oldComponent.type], value: oldComponent.value }; if (newComponent.termType === 'Literal') { newComponent.datatype = { termType: 'NamedNode' }; if ('datatype' in oldComponent) { newComponent.datatype.value = oldComponent.datatype; } if ('language' in oldComponent) { if (!('datatype' in oldComponent)) { newComponent.datatype.value = RDF_LANGSTRING; } newComponent.language = oldComponent.language; } else if (!('datatype' in oldComponent)) { newComponent.datatype.value = XSD_STRING; } } quad[componentName] = newComponent; } if (graphName === '@default') { quad.graph = { termType: 'DefaultGraph', value: '' }; } else { quad.graph = { termType: graphName.startsWith('_:') ? 'BlankNode' : 'NamedNode', value: graphName }; } quads.push(quad); }); }; for (var graphName in dataset) { _loop(graphName); } return quads; } }]); return NQuads; }(); /** * Compares two RDF triples for equality. * * @param t1 the first triple. * @param t2 the second triple. * * @return true if the triples are the same, false if not. */ function _compareTriples(t1, t2) { for (var k in t1) { if (t1[k].termType !== t2[k].termType || t1[k].value !== t2[k].value) { return false; } } if (t1.termType !== 'Literal') { return true; } return t1.object.datatype.termType === t2.object.datatype.termType && t1.object.datatype.value === t2.object.datatype.value && t1.object.language === t2.object.language; } /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Ignore module for browserify (see package.json) /***/ }), /* 50 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var _require = __webpack_require__(3), callbackify = _require.callbackify, normalizeDocumentLoader = _require.normalizeDocumentLoader; module.exports = function () { /** * Creates a simple queue for requesting documents. */ function RequestQueue() { _classCallCheck(this, RequestQueue); this._requests = {}; this.add = callbackify(this.add.bind(this)); } _createClass(RequestQueue, [{ key: 'wrapLoader', value: function wrapLoader(loader) { var self = this; self._loader = normalizeDocumentLoader(loader); return function () /* url */{ return self.add.apply(self, arguments); }; } }, { key: 'add', value: function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(url) { var self, promise; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: self = this; promise = self._requests[url]; if (!promise) { _context.next = 4; break; } return _context.abrupt('return', Promise.resolve(promise)); case 4: // queue URL and load it promise = self._requests[url] = self._loader(url); _context.prev = 5; _context.next = 8; return promise; case 8: return _context.abrupt('return', _context.sent); case 9: _context.prev = 9; delete self._requests[url]; return _context.finish(9); case 12: case 'end': return _context.stop(); } } }, _callee, this, [[5,, 9, 12]]); })); function add(_x) { return _ref.apply(this, arguments); } return add; }() }]); return RequestQueue; }(); /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { module.exports = !__webpack_require__(12) && !__webpack_require__(19)(function () { return Object.defineProperty(__webpack_require__(34)('div'), 'a', { get: function () { return 7; } }).a != 7; }); /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { // false -> Array#indexOf // true -> Array#includes var toIObject = __webpack_require__(17); var toLength = __webpack_require__(36); var toAbsoluteIndex = __webpack_require__(77); module.exports = function (IS_INCLUDES) { return function ($this, el, fromIndex) { var O = toIObject($this); var length = toLength(O.length); var index = toAbsoluteIndex(fromIndex, length); var value; // Array#includes uses SameValueZero equality algorithm // eslint-disable-next-line no-self-compare if (IS_INCLUDES && el != el) while (length > index) { value = O[index++]; // eslint-disable-next-line no-self-compare if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not } else for (;length > index; index++) if (IS_INCLUDES || index in O) { if (O[index] === el) return IS_INCLUDES || index || 0; } return !IS_INCLUDES && -1; }; }; /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { // fallback for non-array-like ES3 and non-enumerable old V8 strings var cof = __webpack_require__(18); // eslint-disable-next-line no-prototype-builtins module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { return cof(it) == 'String' ? it.split('') : Object(it); }; /***/ }), /* 54 */ /***/ (function(module, exports, __webpack_require__) { // 22.1.3.31 Array.prototype[@@unscopables] var UNSCOPABLES = __webpack_require__(0)('unscopables'); var ArrayProto = Array.prototype; if (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(10)(ArrayProto, UNSCOPABLES, {}); module.exports = function (key) { ArrayProto[UNSCOPABLES][key] = true; }; /***/ }), /* 55 */ /***/ (function(module, exports, __webpack_require__) { var has = __webpack_require__(13); var toIObject = __webpack_require__(17); var arrayIndexOf = __webpack_require__(52)(false); var IE_PROTO = __webpack_require__(39)('IE_PROTO'); module.exports = function (object, names) { var O = toIObject(object); var i = 0; var result = []; var key; for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); // Don't enum bug & hidden keys while (names.length > i) if (has(O, key = names[i++])) { ~arrayIndexOf(result, key) || result.push(key); } return result; }; /***/ }), /* 56 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.13 ToObject(argument) var defined = __webpack_require__(30); module.exports = function (it) { return Object(defined(it)); }; /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 19.1.3.6 Object.prototype.toString() var classof = __webpack_require__(42); var test = {}; test[__webpack_require__(0)('toStringTag')] = 'z'; if (test + '' != '[object z]') { __webpack_require__(16)(Object.prototype, 'toString', function toString() { return '[object ' + classof(this) + ']'; }, true); } /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var LIBRARY = __webpack_require__(21); var $export = __webpack_require__(7); var redefine = __webpack_require__(16); var hide = __webpack_require__(10); var Iterators = __webpack_require__(23); var $iterCreate = __webpack_require__(84); var setToStringTag = __webpack_require__(32); var getPrototypeOf = __webpack_require__(86); var ITERATOR = __webpack_require__(0)('iterator'); var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` var FF_ITERATOR = '@@iterator'; var KEYS = 'keys'; var VALUES = 'values'; var returnThis = function () { return this; }; module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { $iterCreate(Constructor, NAME, next); var getMethod = function (kind) { if (!BUGGY && kind in proto) return proto[kind]; switch (kind) { case KEYS: return function keys() { return new Constructor(this, kind); }; case VALUES: return function values() { return new Constructor(this, kind); }; } return function entries() { return new Constructor(this, kind); }; }; var TAG = NAME + ' Iterator'; var DEF_VALUES = DEFAULT == VALUES; var VALUES_BUG = false; var proto = Base.prototype; var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; var $default = $native || getMethod(DEFAULT); var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; var methods, key, IteratorPrototype; // Fix native if ($anyNative) { IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { // Set @@toStringTag to native iterators setToStringTag(IteratorPrototype, TAG, true); // fix for some old engines if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); } } // fix Array#{values, @@iterator}.name in V8 / FF if (DEF_VALUES && $native && $native.name !== VALUES) { VALUES_BUG = true; $default = function values() { return $native.call(this); }; } // Define iterator if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { hide(proto, ITERATOR, $default); } // Plug for library Iterators[NAME] = $default; Iterators[TAG] = returnThis; if (DEFAULT) { methods = { values: DEF_VALUES ? $default : getMethod(VALUES), keys: IS_SET ? $default : getMethod(KEYS), entries: $entries }; if (FORCED) for (key in methods) { if (!(key in proto)) redefine(proto, key, methods[key]); } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); } return methods; }; /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) var anObject = __webpack_require__(8); var dPs = __webpack_require__(85); var enumBugKeys = __webpack_require__(40); var IE_PROTO = __webpack_require__(39)('IE_PROTO'); var Empty = function () { /* empty */ }; var PROTOTYPE = 'prototype'; // Create object with fake `null` prototype: use iframe Object with cleared prototype var createDict = function () { // Thrash, waste and sodomy: IE GC bug var iframe = __webpack_require__(34)('iframe'); var i = enumBugKeys.length; var lt = '<'; var gt = '>'; var iframeDocument; iframe.style.display = 'none'; __webpack_require__(60).appendChild(iframe); iframe.src = 'javascript:'; // eslint-disable-line no-script-url // createDict = iframe.contentWindow.Object; // html.removeChild(iframe); iframeDocument = iframe.contentWindow.document; iframeDocument.open(); iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); iframeDocument.close(); createDict = iframeDocument.F; while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; return createDict(); }; module.exports = Object.create || function create(O, Properties) { var result; if (O !== null) { Empty[PROTOTYPE] = anObject(O); result = new Empty(); Empty[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill result[IE_PROTO] = O; } else result = createDict(); return Properties === undefined ? result : dPs(result, Properties); }; /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { var document = __webpack_require__(1).document; module.exports = document && document.documentElement; /***/ }), /* 61 */ /***/ (function(module, exports, __webpack_require__) { // 7.3.20 SpeciesConstructor(O, defaultConstructor) var anObject = __webpack_require__(8); var aFunction = __webpack_require__(29); var SPECIES = __webpack_require__(0)('species'); module.exports = function (O, D) { var C = anObject(O).constructor; var S; return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); }; /***/ }), /* 62 */ /***/ (function(module, exports, __webpack_require__) { var ctx = __webpack_require__(28); var invoke = __webpack_require__(96); var html = __webpack_require__(60); var cel = __webpack_require__(34); var global = __webpack_require__(1); var process = global.process; var setTask = global.setImmediate; var clearTask = global.clearImmediate; var MessageChannel = global.MessageChannel; var Dispatch = global.Dispatch; var counter = 0; var queue = {}; var ONREADYSTATECHANGE = 'onreadystatechange'; var defer, channel, port; var run = function () { var id = +this; // eslint-disable-next-line no-prototype-builtins if (queue.hasOwnProperty(id)) { var fn = queue[id]; delete queue[id]; fn(); } }; var listener = function (event) { run.call(event.data); }; // Node.js 0.9+ & IE10+ has setImmediate, otherwise: if (!setTask || !clearTask) { setTask = function setImmediate(fn) { var args = []; var i = 1; while (arguments.length > i) args.push(arguments[i++]); queue[++counter] = function () { // eslint-disable-next-line no-new-func invoke(typeof fn == 'function' ? fn : Function(fn), args); }; defer(counter); return counter; }; clearTask = function clearImmediate(id) { delete queue[id]; }; // Node.js 0.8- if (__webpack_require__(18)(process) == 'process') { defer = function (id) { process.nextTick(ctx(run, id, 1)); }; // Sphere (JS game engine) Dispatch API } else if (Dispatch && Dispatch.now) { defer = function (id) { Dispatch.now(ctx(run, id, 1)); }; // Browsers with MessageChannel, includes WebWorkers } else if (MessageChannel) { channel = new MessageChannel(); port = channel.port2; channel.port1.onmessage = listener; defer = ctx(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) { defer = function (id) { global.postMessage(id + '', '*'); }; global.addEventListener('message', listener, false); // IE8- } else if (ONREADYSTATECHANGE in cel('script')) { defer = function (id) { html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () { html.removeChild(this); run.call(id); }; }; // Rest old browsers } else { defer = function (id) { setTimeout(ctx(run, id, 1), 0); }; } } module.exports = { set: setTask, clear: clearTask }; /***/ }), /* 63 */ /***/ (function(module, exports) { module.exports = function (exec) { try { return { e: false, v: exec() }; } catch (e) { return { e: true, v: e }; } }; /***/ }), /* 64 */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(8); var isObject = __webpack_require__(9); var newPromiseCapability = __webpack_require__(43); module.exports = function (C, x) { anObject(C); if (isObject(x) && x.constructor === C) return x; var promiseCapability = newPromiseCapability.f(C); var resolve = promiseCapability.resolve; resolve(x); return promiseCapability.promise; }; /***/ }), /* 65 */ /***/ (function(module, exports, __webpack_require__) { exports.f = __webpack_require__(0); /***/ }), /* 66 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) var $keys = __webpack_require__(55); var hiddenKeys = __webpack_require__(40).concat('length', 'prototype'); exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { return $keys(O, hiddenKeys); }; /***/ }), /* 67 */ /***/ (function(module, exports) { var g; // This works in non-strict mode g = (function() { return this; })(); try { // This works if eval is allowed (see CSP) g = g || Function("return this")() || (1,eval)("this"); } catch(e) { // This works if the window reference is available if(typeof window === "object") g = window; } // g can still be undefined, but nothing to do about it... // We return undefined, instead of nothing here, so it's // easier to handle this case. if(!global) { ...} module.exports = g; /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2016-2017 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var AsyncAlgorithm = __webpack_require__(119); var IdentifierIssuer = __webpack_require__(46); var MessageDigest = __webpack_require__(69); var Permutator = __webpack_require__(71); var NQuads = __webpack_require__(48); var util = __webpack_require__(14); var POSITIONS = { 'subject': 's', 'object': 'o', 'graph': 'g' }; module.exports = function (_AsyncAlgorithm) { _inherits(URDNA2015, _AsyncAlgorithm); function URDNA2015(options) { _classCallCheck(this, URDNA2015); options = options || {}; var _this = _possibleConstructorReturn(this, (URDNA2015.__proto__ || Object.getPrototypeOf(URDNA2015)).call(this, options)); _this.name = 'URDNA2015'; _this.options = Object.assign({}, options); _this.blankNodeInfo = {}; _this.hashToBlankNodes = {}; _this.canonicalIssuer = new IdentifierIssuer('_:c14n'); _this.hashAlgorithm = 'sha256'; _this.quads; return _this; } // 4.4) Normalization Algorithm _createClass(URDNA2015, [{ key: 'main', value: function main(dataset, callback) { var self = this; self.schedule.start = Date.now(); var result = void 0; self.quads = dataset; // 1) Create the normalization state. // Note: Optimize by generating non-normalized blank node map concurrently. var nonNormalized = {}; self.waterfall([function (callback) { // 2) For every quad in input dataset: self.forEach(dataset, function (quad, idx, callback) { // 2.1) For each blank node that occurs in the quad, add a reference // to the quad using the blank node identifier in the blank node to // quads map, creating a new entry if necessary. self.forEachComponent(quad, function (component) { if (component.termType !== 'BlankNode') { return; } var id = component.value; if (id in self.blankNodeInfo) { self.blankNodeInfo[id].quads.push(quad); } else { nonNormalized[id] = true; self.blankNodeInfo[id] = { quads: [quad] }; } }); callback(); }, callback); }, function (callback) { // 3) Create a list of non-normalized blank node identifiers // non-normalized identifiers and populate it using the keys from the // blank node to quads map. // Note: We use a map here and it was generated during step 2. // 4) Initialize simple, a boolean flag, to true. var simple = true; // 5) While simple is true, issue canonical identifiers for blank nodes: self.whilst(function () { return simple; }, function (callback) { // 5.1) Set simple to false. simple = false; // 5.2) Clear hash to blank nodes map. self.hashToBlankNodes = {}; self.waterfall([function (callback) { // 5.3) For each blank node identifier identifier in // non-normalized identifiers: self.forEach(nonNormalized, function (value, id, callback) { // 5.3.1) Create a hash, hash, according to the Hash First // Degree Quads algorithm. self.hashFirstDegreeQuads(id, function (err, hash) { if (err) { return callback(err); } // 5.3.2) Add hash and identifier to hash to blank nodes map, // creating a new entry if necessary. if (hash in self.hashToBlankNodes) { self.hashToBlankNodes[hash].push(id); } else { self.hashToBlankNodes[hash] = [id]; } callback(); }); }, callback); }, function (callback) { // 5.4) For each hash to identifier list mapping in hash to blank // nodes map, lexicographically-sorted by hash: var hashes = Object.keys(self.hashToBlankNodes).sort(); self.forEach(hashes, function (hash, i, callback) { // 5.4.1) If the length of identifier list is greater than 1, // continue to the next mapping. var idList = self.hashToBlankNodes[hash]; if (idList.length > 1) { return callback(); } // 5.4.2) Use the Issue Identifier algorithm, passing canonical // issuer and the single blank node identifier in identifier // list, identifier, to issue a canonical replacement identifier // for identifier. // TODO: consider changing `getId` to `issue` var id = idList[0]; self.canonicalIssuer.getId(id); // 5.4.3) Remove identifier from non-normalized identifiers. delete nonNormalized[id]; // 5.4.4) Remove hash from the hash to blank nodes map. delete self.hashToBlankNodes[hash]; // 5.4.5) Set simple to true. simple = true; callback(); }, callback); }], callback); }, callback); }, function (callback) { // 6) For each hash to identifier list mapping in hash to blank nodes // map, lexicographically-sorted by hash: var hashes = Object.keys(self.hashToBlankNodes).sort(); self.forEach(hashes, function (hash, idx, callback) { // 6.1) Create hash path list where each item will be a result of // running the Hash N-Degree Quads algorithm. var hashPathList = []; // 6.2) For each blank node identifier identifier in identifier list: var idList = self.hashToBlankNodes[hash]; self.waterfall([function (callback) { self.forEach(idList, function (id, idx, callback) { // 6.2.1) If a canonical identifier has already been issued for // identifier, continue to the next identifier. if (self.canonicalIssuer.hasId(id)) { return callback(); } // 6.2.2) Create temporary issuer, an identifier issuer // initialized with the prefix _:b. var issuer = new IdentifierIssuer('_:b'); // 6.2.3) Use the Issue Identifier algorithm, passing temporary // issuer and identifier, to issue a new temporary blank node // identifier for identifier. issuer.getId(id); // 6.2.4) Run the Hash N-Degree Quads algorithm, passing // temporary issuer, and append the result to the hash path // list. self.hashNDegreeQuads(id, issuer, function (err, result) { if (err) { return callback(err); } hashPathList.push(result); callback(); }); }, callback); }, function (callback) { // 6.3) For each result in the hash path list, // lexicographically-sorted by the hash in result: // TODO: use `String.localeCompare`? hashPathList.sort(function (a, b) { return a.hash < b.hash ? -1 : a.hash > b.hash ? 1 : 0; }); self.forEach(hashPathList, function (result, idx, callback) { // 6.3.1) For each blank node identifier, existing identifier, // that was issued a temporary identifier by identifier issuer // in result, issue a canonical identifier, in the same order, // using the Issue Identifier algorithm, passing canonical // issuer and existing identifier. for (var existing in result.issuer.existing) { self.canonicalIssuer.getId(existing); } callback(); }, callback); }], callback); }, callback); }, function (callback) { /* Note: At this point all blank nodes in the set of RDF quads have been assigned canonical identifiers, which have been stored in the canonical issuer. Here each quad is updated by assigning each of its blank nodes its new identifier. */ // 7) For each quad, quad, in input dataset: var normalized = []; self.waterfall([function (callback) { self.forEach(self.quads, function (quad, idx, callback) { // 7.1) Create a copy, quad copy, of quad and replace any existing // blank node identifiers using the canonical identifiers // previously issued by canonical issuer. // Note: We optimize away the copy here. self.forEachComponent(quad, function (component) { if (component.termType === 'BlankNode' && !component.value.startsWith(self.canonicalIssuer.prefix)) { component.value = self.canonicalIssuer.getId(component.value); } }); // 7.2) Add quad copy to the normalized dataset. normalized.push(NQuads.serializeQuad(quad)); callback(); }, callback); }, function (callback) { // sort normalized output normalized.sort(); // 8) Return the normalized dataset. result = normalized.join(''); return callback(); }], callback); }], function (err) { return callback(err, result); }); } // 4.6) Hash First Degree Quads }, { key: 'hashFirstDegreeQuads', value: function hashFirstDegreeQuads(id, callback) { var self = this; // return cached hash var info = self.blankNodeInfo[id]; if ('hash' in info) { return callback(null, info.hash); } // 1) Initialize nquads to an empty list. It will be used to store quads in // N-Quads format. var nquads = []; // 2) Get the list of quads quads associated with the reference blank node // identifier in the blank node to quads map. var quads = info.quads; // 3) For each quad quad in quads: self.forEach(quads, function (quad, idx, callback) { // 3.1) Serialize the quad in N-Quads format with the following special // rule: // 3.1.1) If any component in quad is an blank node, then serialize it // using a special identifier as follows: var copy = { predicate: quad.predicate }; self.forEachComponent(quad, function (component, key) { // 3.1.2) If the blank node's existing blank node identifier matches the // reference blank node identifier then use the blank node identifier // _:a, otherwise, use the blank node identifier _:z. copy[key] = self.modifyFirstDegreeComponent(id, component, key); }); nquads.push(NQuads.serializeQuad(copy)); callback(); }, function (err) { if (err) { return callback(err); } // 4) Sort nquads in lexicographical order. nquads.sort(); // 5) Return the hash that results from passing the sorted, joined nquads // through the hash algorithm. var md = new MessageDigest(self.hashAlgorithm); for (var i = 0; i < nquads.length; ++i) { md.update(nquads[i]); } // TODO: represent as byte buffer instead to cut memory usage in half info.hash = md.digest(); callback(null, info.hash); }); } // 4.7) Hash Related Blank Node }, { key: 'hashRelatedBlankNode', value: function hashRelatedBlankNode(related, quad, issuer, position, callback) { var self = this; // 1) Set the identifier to use for related, preferring first the canonical // identifier for related if issued, second the identifier issued by issuer // if issued, and last, if necessary, the result of the Hash First Degree // Quads algorithm, passing related. var id = void 0; self.waterfall([function (callback) { if (self.canonicalIssuer.hasId(related)) { id = self.canonicalIssuer.getId(related); return callback(); } if (issuer.hasId(related)) { id = issuer.getId(related); return callback(); } self.hashFirstDegreeQuads(related, function (err, hash) { if (err) { return callback(err); } id = hash; callback(); }); }], function (err) { if (err) { return callback(err); } // 2) Initialize a string input to the value of position. // Note: We use a hash object instead. var md = new MessageDigest(self.hashAlgorithm); md.update(position); // 3) If position is not g, append <, the value of the predicate in quad, // and > to input. if (position !== 'g') { md.update(self.getRelatedPredicate(quad)); } // 4) Append identifier to input. md.update(id); // 5) Return the hash that results from passing input through the hash // algorithm. // TODO: represent as byte buffer instead to cut memory usage in half return callback(null, md.digest()); }); } // 4.8) Hash N-Degree Quads }, { key: 'hashNDegreeQuads', value: function hashNDegreeQuads(id, issuer, callback) { var self = this; // 1) Create a hash to related blank nodes map for storing hashes that // identify related blank nodes. // Note: 2) and 3) handled within `createHashToRelated` var hashToRelated = void 0; var md = new MessageDigest(self.hashAlgorithm); self.waterfall([function (callback) { return self.createHashToRelated(id, issuer, function (err, result) { if (err) { return callback(err); } hashToRelated = result; callback(); }); }, function (callback) { // 4) Create an empty string, data to hash. // Note: We created a hash object `md` above instead. // 5) For each related hash to blank node list mapping in hash to // related blank nodes map, sorted lexicographically by related hash: var hashes = Object.keys(hashToRelated).sort(); self.forEach(hashes, function (hash, idx, callback) { // 5.1) Append the related hash to the data to hash. md.update(hash); // 5.2) Create a string chosen path. var chosenPath = ''; // 5.3) Create an unset chosen issuer variable. var chosenIssuer = void 0; // 5.4) For each permutation of blank node list: var permutator = new Permutator(hashToRelated[hash]); self.whilst(function () { return permutator.hasNext(); }, function (nextPermutation) { var permutation = permutator.next(); // 5.4.1) Create a copy of issuer, issuer copy. var issuerCopy = issuer.clone(); // 5.4.2) Create a string path. var path = ''; // 5.4.3) Create a recursion list, to store blank node identifiers // that must be recursively processed by this algorithm. var recursionList = []; self.waterfall([function (callback) { // 5.4.4) For each related in permutation: self.forEach(permutation, function (related, idx, callback) { // 5.4.4.1) If a canonical identifier has been issued for // related, append it to path. if (self.canonicalIssuer.hasId(related)) { path += self.canonicalIssuer.getId(related); } else { // 5.4.4.2) Otherwise: // 5.4.4.2.1) If issuer copy has not issued an identifier // for related, append related to recursion list. if (!issuerCopy.hasId(related)) { recursionList.push(related); } // 5.4.4.2.2) Use the Issue Identifier algorithm, passing // issuer copy and related and append the result to path. path += issuerCopy.getId(related); } // 5.4.4.3) If chosen path is not empty and the length of path // is greater than or equal to the length of chosen path and // path is lexicographically greater than chosen path, then // skip to the next permutation. if (chosenPath.length !== 0 && path.length >= chosenPath.length && path > chosenPath) { // FIXME: may cause inaccurate total depth calculation return nextPermutation(); } callback(); }, callback); }, function (callback) { // 5.4.5) For each related in recursion list: self.forEach(recursionList, function (related, idx, callback) { // 5.4.5.1) Set result to the result of recursively executing // the Hash N-Degree Quads algorithm, passing related for // identifier and issuer copy for path identifier issuer. self.hashNDegreeQuads(related, issuerCopy, function (err, result) { if (err) { return callback(err); } // 5.4.5.2) Use the Issue Identifier algorithm, passing // issuer copy and related and append the result to path. path += issuerCopy.getId(related); // 5.4.5.3) Append <, the hash in result, and > to path. path += '<' + result.hash + '>'; // 5.4.5.4) Set issuer copy to the identifier issuer in // result. issuerCopy = result.issuer; // 5.4.5.5) If chosen path is not empty and the length of // path is greater than or equal to the length of chosen // path and path is lexicographically greater than chosen // path, then skip to the next permutation. if (chosenPath.length !== 0 && path.length >= chosenPath.length && path > chosenPath) { // FIXME: may cause inaccurate total depth calculation return nextPermutation(); } callback(); }); }, callback); }, function (callback) { // 5.4.6) If chosen path is empty or path is lexicographically // less than chosen path, set chosen path to path and chosen // issuer to issuer copy. if (chosenPath.length === 0 || path < chosenPath) { chosenPath = path; chosenIssuer = issuerCopy; } callback(); }], nextPermutation); }, function (err) { if (err) { return callback(err); } // 5.5) Append chosen path to data to hash. md.update(chosenPath); // 5.6) Replace issuer, by reference, with chosen issuer. issuer = chosenIssuer; callback(); }); }, callback); }], function (err) { // 6) Return issuer and the hash that results from passing data to hash // through the hash algorithm. callback(err, { hash: md.digest(), issuer: issuer }); }); } // helper for modifying component during Hash First Degree Quads }, { key: 'modifyFirstDegreeComponent', value: function modifyFirstDegreeComponent(id, component) { if (component.termType !== 'BlankNode') { return component; } component = util.clone(component); component.value = component.value === id ? '_:a' : '_:z'; return component; } // helper for getting a related predicate }, { key: 'getRelatedPredicate', value: function getRelatedPredicate(quad) { return '<' + quad.predicate.value + '>'; } // helper for creating hash to related blank nodes map }, { key: 'createHashToRelated', value: function createHashToRelated(id, issuer, callback) { var self = this; // 1) Create a hash to related blank nodes map for storing hashes that // identify related blank nodes. var hashToRelated = {}; // 2) Get a reference, quads, to the list of quads in the blank node to // quads map for the key identifier. var quads = self.blankNodeInfo[id].quads; // 3) For each quad in quads: self.forEach(quads, function (quad, idx, callback) { // 3.1) For each component in quad, if component is the subject, object, // and graph name and it is a blank node that is not identified by // identifier: self.forEach(quad, function (component, key, callback) { if (key === 'predicate' || !(component.termType === 'BlankNode' && component.value !== id)) { return callback(); } // 3.1.1) Set hash to the result of the Hash Related Blank Node // algorithm, passing the blank node identifier for component as // related, quad, path identifier issuer as issuer, and position as // either s, o, or g based on whether component is a subject, object, // graph name, respectively. var related = component.value; var position = POSITIONS[key]; self.hashRelatedBlankNode(related, quad, issuer, position, function (err, hash) { if (err) { return callback(err); } // 3.1.2) Add a mapping of hash to the blank node identifier for // component to hash to related blank nodes map, adding an entry as // necessary. if (hash in hashToRelated) { hashToRelated[hash].push(related); } else { hashToRelated[hash] = [related]; } callback(); }); }, callback); }, function (err) { return callback(err, hashToRelated); }); } // helper that iterates over quad components (skips predicate) }, { key: 'forEachComponent', value: function forEachComponent(quad, op) { for (var key in quad) { // skip `predicate` if (key === 'predicate') { continue; } op(quad[key], key, quad); } } }]); return URDNA2015; }(AsyncAlgorithm); /***/ }), /* 69 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2016-2017 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var forge = __webpack_require__(24); __webpack_require__(47); __webpack_require__(120); __webpack_require__(122); module.exports = function () { /** * Creates a new MessageDigest. * * @param algorithm the algorithm to use. */ function MessageDigest(algorithm) { _classCallCheck(this, MessageDigest); this.md = forge.md[algorithm].create(); } _createClass(MessageDigest, [{ key: 'update', value: function update(msg) { this.md.update(msg, 'utf8'); } }, { key: 'digest', value: function digest() { return this.md.digest().toHex(); } }]); return MessageDigest; }(); /***/ }), /* 70 */ /***/ (function(module, exports, __webpack_require__) { /** * Utility functions for web applications. * * @author Dave Longley * * Copyright (c) 2010-2018 Digital Bazaar, Inc. */ var forge = __webpack_require__(24); var baseN = __webpack_require__(121); /* Utilities API */ var util = module.exports = forge.util = forge.util || {}; // define setImmediate and nextTick (function() { // use native nextTick if(typeof process !== 'undefined' && process.nextTick) { util.nextTick = process.nextTick; if(typeof setImmediate === 'function') { util.setImmediate = setImmediate; } else { // polyfill setImmediate with nextTick, older versions of node // (those w/o setImmediate) won't totally starve IO util.setImmediate = util.nextTick; } return; } // polyfill nextTick with native setImmediate if(typeof setImmediate === 'function') { util.setImmediate = function() { return setImmediate.apply(undefined, arguments); }; util.nextTick = function(callback) { return setImmediate(callback); }; return; } /* Note: A polyfill upgrade pattern is used here to allow combining polyfills. For example, MutationObserver is fast, but blocks UI updates, so it needs to allow UI updates periodically, so it falls back on postMessage or setTimeout. */ // polyfill with setTimeout util.setImmediate = function(callback) { setTimeout(callback, 0); }; // upgrade polyfill to use postMessage if(typeof window !== 'undefined' && typeof window.postMessage === 'function') { var msg = 'forge.setImmediate'; var callbacks = []; util.setImmediate = function(callback) { callbacks.push(callback); // only send message when one hasn't been sent in // the current turn of the event loop if(callbacks.length === 1) { window.postMessage(msg, '*'); } }; function handler(event) { if(event.source === window && event.data === msg) { event.stopPropagation(); var copy = callbacks.slice(); callbacks.length = 0; copy.forEach(function(callback) { callback(); }); } } window.addEventListener('message', handler, true); } // upgrade polyfill to use MutationObserver if(typeof MutationObserver !== 'undefined') { // polyfill with MutationObserver var now = Date.now(); var attr = true; var div = document.createElement('div'); var callbacks = []; new MutationObserver(function() { var copy = callbacks.slice(); callbacks.length = 0; copy.forEach(function(callback) { callback(); }); }).observe(div, {attributes: true}); var oldSetImmediate = util.setImmediate; util.setImmediate = function(callback) { if(Date.now() - now > 15) { now = Date.now(); oldSetImmediate(callback); } else { callbacks.push(callback); // only trigger observer when it hasn't been triggered in // the current turn of the event loop if(callbacks.length === 1) { div.setAttribute('a', attr = !attr); } } }; } util.nextTick = util.setImmediate; })(); // check if running under Node.js util.isNodejs = typeof process !== 'undefined' && process.versions && process.versions.node; // define isArray util.isArray = Array.isArray || function(x) { return Object.prototype.toString.call(x) === '[object Array]'; }; // define isArrayBuffer util.isArrayBuffer = function(x) { return typeof ArrayBuffer !== 'undefined' && x instanceof ArrayBuffer; }; // define isArrayBufferView util.isArrayBufferView = function(x) { return x && util.isArrayBuffer(x.buffer) && x.byteLength !== undefined; }; /** * Ensure a bits param is 8, 16, 24, or 32. Used to validate input for * algorithms where bit manipulation, JavaScript limitations, and/or algorithm * design only allow for byte operations of a limited size. * * @param n number of bits. * * Throw Error if n invalid. */ function _checkBitsParam(n) { if(!(n === 8 || n === 16 || n === 24 || n === 32)) { throw new Error('Only 8, 16, 24, or 32 bits supported: ' + n); } } // TODO: set ByteBuffer to best available backing util.ByteBuffer = ByteStringBuffer; /** Buffer w/BinaryString backing */ /** * Constructor for a binary string backed byte buffer. * * @param [b] the bytes to wrap (either encoded as string, one byte per * character, or as an ArrayBuffer or Typed Array). */ function ByteStringBuffer(b) { // TODO: update to match DataBuffer API // the data in this buffer this.data = ''; // the pointer for reading from this buffer this.read = 0; if(typeof b === 'string') { this.data = b; } else if(util.isArrayBuffer(b) || util.isArrayBufferView(b)) { if(typeof Buffer !== 'undefined' && b instanceof Buffer) { this.data = b.toString('binary'); } else { // convert native buffer to forge buffer // FIXME: support native buffers internally instead var arr = new Uint8Array(b); try { this.data = String.fromCharCode.apply(null, arr); } catch(e) { for(var i = 0; i < arr.length; ++i) { this.putByte(arr[i]); } } } } else if(b instanceof ByteStringBuffer || (typeof b === 'object' && typeof b.data === 'string' && typeof b.read === 'number')) { // copy existing buffer this.data = b.data; this.read = b.read; } // used for v8 optimization this._constructedStringLength = 0; } util.ByteStringBuffer = ByteStringBuffer; /* Note: This is an optimization for V8-based browsers. When V8 concatenates a string, the strings are only joined logically using a "cons string" or "constructed/concatenated string". These containers keep references to one another and can result in very large memory usage. For example, if a 2MB string is constructed by concatenating 4 bytes together at a time, the memory usage will be ~44MB; so ~22x increase. The strings are only joined together when an operation requiring their joining takes place, such as substr(). This function is called when adding data to this buffer to ensure these types of strings are periodically joined to reduce the memory footprint. */ var _MAX_CONSTRUCTED_STRING_LENGTH = 4096; util.ByteStringBuffer.prototype._optimizeConstructedString = function(x) { this._constructedStringLength += x; if(this._constructedStringLength > _MAX_CONSTRUCTED_STRING_LENGTH) { // this substr() should cause the constructed string to join this.data.substr(0, 1); this._constructedStringLength = 0; } }; /** * Gets the number of bytes in this buffer. * * @return the number of bytes in this buffer. */ util.ByteStringBuffer.prototype.length = function() { return this.data.length - this.read; }; /** * Gets whether or not this buffer is empty. * * @return true if this buffer is empty, false if not. */ util.ByteStringBuffer.prototype.isEmpty = function() { return this.length() <= 0; }; /** * Puts a byte in this buffer. * * @param b the byte to put. * * @return this buffer. */ util.ByteStringBuffer.prototype.putByte = function(b) { return this.putBytes(String.fromCharCode(b)); }; /** * Puts a byte in this buffer N times. * * @param b the byte to put. * @param n the number of bytes of value b to put. * * @return this buffer. */ util.ByteStringBuffer.prototype.fillWithByte = function(b, n) { b = String.fromCharCode(b); var d = this.data; while(n > 0) { if(n & 1) { d += b; } n >>>= 1; if(n > 0) { b += b; } } this.data = d; this._optimizeConstructedString(n); return this; }; /** * Puts bytes in this buffer. * * @param bytes the bytes (as a UTF-8 encoded string) to put. * * @return this buffer. */ util.ByteStringBuffer.prototype.putBytes = function(bytes) { this.data += bytes; this._optimizeConstructedString(bytes.length); return this; }; /** * Puts a UTF-16 encoded string into this buffer. * * @param str the string to put. * * @return this buffer. */ util.ByteStringBuffer.prototype.putString = function(str) { return this.putBytes(util.encodeUtf8(str)); }; /** * Puts a 16-bit integer in this buffer in big-endian order. * * @param i the 16-bit integer. * * @return this buffer. */ util.ByteStringBuffer.prototype.putInt16 = function(i) { return this.putBytes( String.fromCharCode(i >> 8 & 0xFF) + String.fromCharCode(i & 0xFF)); }; /** * Puts a 24-bit integer in this buffer in big-endian order. * * @param i the 24-bit integer. * * @return this buffer. */ util.ByteStringBuffer.prototype.putInt24 = function(i) { return this.putBytes( String.fromCharCode(i >> 16 & 0xFF) + String.fromCharCode(i >> 8 & 0xFF) + String.fromCharCode(i & 0xFF)); }; /** * Puts a 32-bit integer in this buffer in big-endian order. * * @param i the 32-bit integer. * * @return this buffer. */ util.ByteStringBuffer.prototype.putInt32 = function(i) { return this.putBytes( String.fromCharCode(i >> 24 & 0xFF) + String.fromCharCode(i >> 16 & 0xFF) + String.fromCharCode(i >> 8 & 0xFF) + String.fromCharCode(i & 0xFF)); }; /** * Puts a 16-bit integer in this buffer in little-endian order. * * @param i the 16-bit integer. * * @return this buffer. */ util.ByteStringBuffer.prototype.putInt16Le = function(i) { return this.putBytes( String.fromCharCode(i & 0xFF) + String.fromCharCode(i >> 8 & 0xFF)); }; /** * Puts a 24-bit integer in this buffer in little-endian order. * * @param i the 24-bit integer. * * @return this buffer. */ util.ByteStringBuffer.prototype.putInt24Le = function(i) { return this.putBytes( String.fromCharCode(i & 0xFF) + String.fromCharCode(i >> 8 & 0xFF) + String.fromCharCode(i >> 16 & 0xFF)); }; /** * Puts a 32-bit integer in this buffer in little-endian order. * * @param i the 32-bit integer. * * @return this buffer. */ util.ByteStringBuffer.prototype.putInt32Le = function(i) { return this.putBytes( String.fromCharCode(i & 0xFF) + String.fromCharCode(i >> 8 & 0xFF) + String.fromCharCode(i >> 16 & 0xFF) + String.fromCharCode(i >> 24 & 0xFF)); }; /** * Puts an n-bit integer in this buffer in big-endian order. * * @param i the n-bit integer. * @param n the number of bits in the integer (8, 16, 24, or 32). * * @return this buffer. */ util.ByteStringBuffer.prototype.putInt = function(i, n) { _checkBitsParam(n); var bytes = ''; do { n -= 8; bytes += String.fromCharCode((i >> n) & 0xFF); } while(n > 0); return this.putBytes(bytes); }; /** * Puts a signed n-bit integer in this buffer in big-endian order. Two's * complement representation is used. * * @param i the n-bit integer. * @param n the number of bits in the integer (8, 16, 24, or 32). * * @return this buffer. */ util.ByteStringBuffer.prototype.putSignedInt = function(i, n) { // putInt checks n if(i < 0) { i += 2 << (n - 1); } return this.putInt(i, n); }; /** * Puts the given buffer into this buffer. * * @param buffer the buffer to put into this one. * * @return this buffer. */ util.ByteStringBuffer.prototype.putBuffer = function(buffer) { return this.putBytes(buffer.getBytes()); }; /** * Gets a byte from this buffer and advances the read pointer by 1. * * @return the byte. */ util.ByteStringBuffer.prototype.getByte = function() { return this.data.charCodeAt(this.read++); }; /** * Gets a uint16 from this buffer in big-endian order and advances the read * pointer by 2. * * @return the uint16. */ util.ByteStringBuffer.prototype.getInt16 = function() { var rval = ( this.data.charCodeAt(this.read) << 8 ^ this.data.charCodeAt(this.read + 1)); this.read += 2; return rval; }; /** * Gets a uint24 from this buffer in big-endian order and advances the read * pointer by 3. * * @return the uint24. */ util.ByteStringBuffer.prototype.getInt24 = function() { var rval = ( this.data.charCodeAt(this.read) << 16 ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2)); this.read += 3; return rval; }; /** * Gets a uint32 from this buffer in big-endian order and advances the read * pointer by 4. * * @return the word. */ util.ByteStringBuffer.prototype.getInt32 = function() { var rval = ( this.data.charCodeAt(this.read) << 24 ^ this.data.charCodeAt(this.read + 1) << 16 ^ this.data.charCodeAt(this.read + 2) << 8 ^ this.data.charCodeAt(this.read + 3)); this.read += 4; return rval; }; /** * Gets a uint16 from this buffer in little-endian order and advances the read * pointer by 2. * * @return the uint16. */ util.ByteStringBuffer.prototype.getInt16Le = function() { var rval = ( this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8); this.read += 2; return rval; }; /** * Gets a uint24 from this buffer in little-endian order and advances the read * pointer by 3. * * @return the uint24. */ util.ByteStringBuffer.prototype.getInt24Le = function() { var rval = ( this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16); this.read += 3; return rval; }; /** * Gets a uint32 from this buffer in little-endian order and advances the read * pointer by 4. * * @return the word. */ util.ByteStringBuffer.prototype.getInt32Le = function() { var rval = ( this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16 ^ this.data.charCodeAt(this.read + 3) << 24); this.read += 4; return rval; }; /** * Gets an n-bit integer from this buffer in big-endian order and advances the * read pointer by ceil(n/8). * * @param n the number of bits in the integer (8, 16, 24, or 32). * * @return the integer. */ util.ByteStringBuffer.prototype.getInt = function(n) { _checkBitsParam(n); var rval = 0; do { // TODO: Use (rval * 0x100) if adding support for 33 to 53 bits. rval = (rval << 8) + this.data.charCodeAt(this.read++); n -= 8; } while(n > 0); return rval; }; /** * Gets a signed n-bit integer from this buffer in big-endian order, using * two's complement, and advances the read pointer by n/8. * * @param n the number of bits in the integer (8, 16, 24, or 32). * * @return the integer. */ util.ByteStringBuffer.prototype.getSignedInt = function(n) { // getInt checks n var x = this.getInt(n); var max = 2 << (n - 2); if(x >= max) { x -= max << 1; } return x; }; /** * Reads bytes out into a UTF-8 string and clears them from the buffer. * * @param count the number of bytes to read, undefined or null for all. * * @return a UTF-8 string of bytes. */ util.ByteStringBuffer.prototype.getBytes = function(count) { var rval; if(count) { // read count bytes count = Math.min(this.length(), count); rval = this.data.slice(this.read, this.read + count); this.read += count; } else if(count === 0) { rval = ''; } else { // read all bytes, optimize to only copy when needed rval = (this.read === 0) ? this.data : this.data.slice(this.read); this.clear(); } return rval; }; /** * Gets a UTF-8 encoded string of the bytes from this buffer without modifying * the read pointer. * * @param count the number of bytes to get, omit to get all. * * @return a string full of UTF-8 encoded characters. */ util.ByteStringBuffer.prototype.bytes = function(count) { return (typeof(count) === 'undefined' ? this.data.slice(this.read) : this.data.slice(this.read, this.read + count)); }; /** * Gets a byte at the given index without modifying the read pointer. * * @param i the byte index. * * @return the byte. */ util.ByteStringBuffer.prototype.at = function(i) { return this.data.charCodeAt(this.read + i); }; /** * Puts a byte at the given index without modifying the read pointer. * * @param i the byte index. * @param b the byte to put. * * @return this buffer. */ util.ByteStringBuffer.prototype.setAt = function(i, b) { this.data = this.data.substr(0, this.read + i) + String.fromCharCode(b) + this.data.substr(this.read + i + 1); return this; }; /** * Gets the last byte without modifying the read pointer. * * @return the last byte. */ util.ByteStringBuffer.prototype.last = function() { return this.data.charCodeAt(this.data.length - 1); }; /** * Creates a copy of this buffer. * * @return the copy. */ util.ByteStringBuffer.prototype.copy = function() { var c = util.createBuffer(this.data); c.read = this.read; return c; }; /** * Compacts this buffer. * * @return this buffer. */ util.ByteStringBuffer.prototype.compact = function() { if(this.read > 0) { this.data = this.data.slice(this.read); this.read = 0; } return this; }; /** * Clears this buffer. * * @return this buffer. */ util.ByteStringBuffer.prototype.clear = function() { this.data = ''; this.read = 0; return this; }; /** * Shortens this buffer by triming bytes off of the end of this buffer. * * @param count the number of bytes to trim off. * * @return this buffer. */ util.ByteStringBuffer.prototype.truncate = function(count) { var len = Math.max(0, this.length() - count); this.data = this.data.substr(this.read, len); this.read = 0; return this; }; /** * Converts this buffer to a hexadecimal string. * * @return a hexadecimal string. */ util.ByteStringBuffer.prototype.toHex = function() { var rval = ''; for(var i = this.read; i < this.data.length; ++i) { var b = this.data.charCodeAt(i); if(b < 16) { rval += '0'; } rval += b.toString(16); } return rval; }; /** * Converts this buffer to a UTF-16 string (standard JavaScript string). * * @return a UTF-16 string. */ util.ByteStringBuffer.prototype.toString = function() { return util.decodeUtf8(this.bytes()); }; /** End Buffer w/BinaryString backing */ /** Buffer w/UInt8Array backing */ /** * FIXME: Experimental. Do not use yet. * * Constructor for an ArrayBuffer-backed byte buffer. * * The buffer may be constructed from a string, an ArrayBuffer, DataView, or a * TypedArray. * * If a string is given, its encoding should be provided as an option, * otherwise it will default to 'binary'. A 'binary' string is encoded such * that each character is one byte in length and size. * * If an ArrayBuffer, DataView, or TypedArray is given, it will be used * *directly* without any copying. Note that, if a write to the buffer requires * more space, the buffer will allocate a new backing ArrayBuffer to * accommodate. The starting read and write offsets for the buffer may be * given as options. * * @param [b] the initial bytes for this buffer. * @param options the options to use: * [readOffset] the starting read offset to use (default: 0). * [writeOffset] the starting write offset to use (default: the * length of the first parameter). * [growSize] the minimum amount, in bytes, to grow the buffer by to * accommodate writes (default: 1024). * [encoding] the encoding ('binary', 'utf8', 'utf16', 'hex') for the * first parameter, if it is a string (default: 'binary'). */ function DataBuffer(b, options) { // default options options = options || {}; // pointers for read from/write to buffer this.read = options.readOffset || 0; this.growSize = options.growSize || 1024; var isArrayBuffer = util.isArrayBuffer(b); var isArrayBufferView = util.isArrayBufferView(b); if(isArrayBuffer || isArrayBufferView) { // use ArrayBuffer directly if(isArrayBuffer) { this.data = new DataView(b); } else { // TODO: adjust read/write offset based on the type of view // or specify that this must be done in the options ... that the // offsets are byte-based this.data = new DataView(b.buffer, b.byteOffset, b.byteLength); } this.write = ('writeOffset' in options ? options.writeOffset : this.data.byteLength); return; } // initialize to empty array buffer and add any given bytes using putBytes this.data = new DataView(new ArrayBuffer(0)); this.write = 0; if(b !== null && b !== undefined) { this.putBytes(b); } if('writeOffset' in options) { this.write = options.writeOffset; } } util.DataBuffer = DataBuffer; /** * Gets the number of bytes in this buffer. * * @return the number of bytes in this buffer. */ util.DataBuffer.prototype.length = function() { return this.write - this.read; }; /** * Gets whether or not this buffer is empty. * * @return true if this buffer is empty, false if not. */ util.DataBuffer.prototype.isEmpty = function() { return this.length() <= 0; }; /** * Ensures this buffer has enough empty space to accommodate the given number * of bytes. An optional parameter may be given that indicates a minimum * amount to grow the buffer if necessary. If the parameter is not given, * the buffer will be grown by some previously-specified default amount * or heuristic. * * @param amount the number of bytes to accommodate. * @param [growSize] the minimum amount, in bytes, to grow the buffer by if * necessary. */ util.DataBuffer.prototype.accommodate = function(amount, growSize) { if(this.length() >= amount) { return this; } growSize = Math.max(growSize || this.growSize, amount); // grow buffer var src = new Uint8Array( this.data.buffer, this.data.byteOffset, this.data.byteLength); var dst = new Uint8Array(this.length() + growSize); dst.set(src); this.data = new DataView(dst.buffer); return this; }; /** * Puts a byte in this buffer. * * @param b the byte to put. * * @return this buffer. */ util.DataBuffer.prototype.putByte = function(b) { this.accommodate(1); this.data.setUint8(this.write++, b); return this; }; /** * Puts a byte in this buffer N times. * * @param b the byte to put. * @param n the number of bytes of value b to put. * * @return this buffer. */ util.DataBuffer.prototype.fillWithByte = function(b, n) { this.accommodate(n); for(var i = 0; i < n; ++i) { this.data.setUint8(b); } return this; }; /** * Puts bytes in this buffer. The bytes may be given as a string, an * ArrayBuffer, a DataView, or a TypedArray. * * @param bytes the bytes to put. * @param [encoding] the encoding for the first parameter ('binary', 'utf8', * 'utf16', 'hex'), if it is a string (default: 'binary'). * * @return this buffer. */ util.DataBuffer.prototype.putBytes = function(bytes, encoding) { if(util.isArrayBufferView(bytes)) { var src = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength); var len = src.byteLength - src.byteOffset; this.accommodate(len); var dst = new Uint8Array(this.data.buffer, this.write); dst.set(src); this.write += len; return this; } if(util.isArrayBuffer(bytes)) { var src = new Uint8Array(bytes); this.accommodate(src.byteLength); var dst = new Uint8Array(this.data.buffer); dst.set(src, this.write); this.write += src.byteLength; return this; } // bytes is a util.DataBuffer or equivalent if(bytes instanceof util.DataBuffer || (typeof bytes === 'object' && typeof bytes.read === 'number' && typeof bytes.write === 'number' && util.isArrayBufferView(bytes.data))) { var src = new Uint8Array(bytes.data.byteLength, bytes.read, bytes.length()); this.accommodate(src.byteLength); var dst = new Uint8Array(bytes.data.byteLength, this.write); dst.set(src); this.write += src.byteLength; return this; } if(bytes instanceof util.ByteStringBuffer) { // copy binary string and process as the same as a string parameter below bytes = bytes.data; encoding = 'binary'; } // string conversion encoding = encoding || 'binary'; if(typeof bytes === 'string') { var view; // decode from string if(encoding === 'hex') { this.accommodate(Math.ceil(bytes.length / 2)); view = new Uint8Array(this.data.buffer, this.write); this.write += util.binary.hex.decode(bytes, view, this.write); return this; } if(encoding === 'base64') { this.accommodate(Math.ceil(bytes.length / 4) * 3); view = new Uint8Array(this.data.buffer, this.write); this.write += util.binary.base64.decode(bytes, view, this.write); return this; } // encode text as UTF-8 bytes if(encoding === 'utf8') { // encode as UTF-8 then decode string as raw binary bytes = util.encodeUtf8(bytes); encoding = 'binary'; } // decode string as raw binary if(encoding === 'binary' || encoding === 'raw') { // one byte per character this.accommodate(bytes.length); view = new Uint8Array(this.data.buffer, this.write); this.write += util.binary.raw.decode(view); return this; } // encode text as UTF-16 bytes if(encoding === 'utf16') { // two bytes per character this.accommodate(bytes.length * 2); view = new Uint16Array(this.data.buffer, this.write); this.write += util.text.utf16.encode(view); return this; } throw new Error('Invalid encoding: ' + encoding); } throw Error('Invalid parameter: ' + bytes); }; /** * Puts the given buffer into this buffer. * * @param buffer the buffer to put into this one. * * @return this buffer. */ util.DataBuffer.prototype.putBuffer = function(buffer) { this.putBytes(buffer); buffer.clear(); return this; }; /** * Puts a string into this buffer. * * @param str the string to put. * @param [encoding] the encoding for the string (default: 'utf16'). * * @return this buffer. */ util.DataBuffer.prototype.putString = function(str) { return this.putBytes(str, 'utf16'); }; /** * Puts a 16-bit integer in this buffer in big-endian order. * * @param i the 16-bit integer. * * @return this buffer. */ util.DataBuffer.prototype.putInt16 = function(i) { this.accommodate(2); this.data.setInt16(this.write, i); this.write += 2; return this; }; /** * Puts a 24-bit integer in this buffer in big-endian order. * * @param i the 24-bit integer. * * @return this buffer. */ util.DataBuffer.prototype.putInt24 = function(i) { this.accommodate(3); this.data.setInt16(this.write, i >> 8 & 0xFFFF); this.data.setInt8(this.write, i >> 16 & 0xFF); this.write += 3; return this; }; /** * Puts a 32-bit integer in this buffer in big-endian order. * * @param i the 32-bit integer. * * @return this buffer. */ util.DataBuffer.prototype.putInt32 = function(i) { this.accommodate(4); this.data.setInt32(this.write, i); this.write += 4; return this; }; /** * Puts a 16-bit integer in this buffer in little-endian order. * * @param i the 16-bit integer. * * @return this buffer. */ util.DataBuffer.prototype.putInt16Le = function(i) { this.accommodate(2); this.data.setInt16(this.write, i, true); this.write += 2; return this; }; /** * Puts a 24-bit integer in this buffer in little-endian order. * * @param i the 24-bit integer. * * @return this buffer. */ util.DataBuffer.prototype.putInt24Le = function(i) { this.accommodate(3); this.data.setInt8(this.write, i >> 16 & 0xFF); this.data.setInt16(this.write, i >> 8 & 0xFFFF, true); this.write += 3; return this; }; /** * Puts a 32-bit integer in this buffer in little-endian order. * * @param i the 32-bit integer. * * @return this buffer. */ util.DataBuffer.prototype.putInt32Le = function(i) { this.accommodate(4); this.data.setInt32(this.write, i, true); this.write += 4; return this; }; /** * Puts an n-bit integer in this buffer in big-endian order. * * @param i the n-bit integer. * @param n the number of bits in the integer (8, 16, 24, or 32). * * @return this buffer. */ util.DataBuffer.prototype.putInt = function(i, n) { _checkBitsParam(n); this.accommodate(n / 8); do { n -= 8; this.data.setInt8(this.write++, (i >> n) & 0xFF); } while(n > 0); return this; }; /** * Puts a signed n-bit integer in this buffer in big-endian order. Two's * complement representation is used. * * @param i the n-bit integer. * @param n the number of bits in the integer. * * @return this buffer. */ util.DataBuffer.prototype.putSignedInt = function(i, n) { _checkBitsParam(n); this.accommodate(n / 8); if(i < 0) { i += 2 << (n - 1); } return this.putInt(i, n); }; /** * Gets a byte from this buffer and advances the read pointer by 1. * * @return the byte. */ util.DataBuffer.prototype.getByte = function() { return this.data.getInt8(this.read++); }; /** * Gets a uint16 from this buffer in big-endian order and advances the read * pointer by 2. * * @return the uint16. */ util.DataBuffer.prototype.getInt16 = function() { var rval = this.data.getInt16(this.read); this.read += 2; return rval; }; /** * Gets a uint24 from this buffer in big-endian order and advances the read * pointer by 3. * * @return the uint24. */ util.DataBuffer.prototype.getInt24 = function() { var rval = ( this.data.getInt16(this.read) << 8 ^ this.data.getInt8(this.read + 2)); this.read += 3; return rval; }; /** * Gets a uint32 from this buffer in big-endian order and advances the read * pointer by 4. * * @return the word. */ util.DataBuffer.prototype.getInt32 = function() { var rval = this.data.getInt32(this.read); this.read += 4; return rval; }; /** * Gets a uint16 from this buffer in little-endian order and advances the read * pointer by 2. * * @return the uint16. */ util.DataBuffer.prototype.getInt16Le = function() { var rval = this.data.getInt16(this.read, true); this.read += 2; return rval; }; /** * Gets a uint24 from this buffer in little-endian order and advances the read * pointer by 3. * * @return the uint24. */ util.DataBuffer.prototype.getInt24Le = function() { var rval = ( this.data.getInt8(this.read) ^ this.data.getInt16(this.read + 1, true) << 8); this.read += 3; return rval; }; /** * Gets a uint32 from this buffer in little-endian order and advances the read * pointer by 4. * * @return the word. */ util.DataBuffer.prototype.getInt32Le = function() { var rval = this.data.getInt32(this.read, true); this.read += 4; return rval; }; /** * Gets an n-bit integer from this buffer in big-endian order and advances the * read pointer by n/8. * * @param n the number of bits in the integer (8, 16, 24, or 32). * * @return the integer. */ util.DataBuffer.prototype.getInt = function(n) { _checkBitsParam(n); var rval = 0; do { // TODO: Use (rval * 0x100) if adding support for 33 to 53 bits. rval = (rval << 8) + this.data.getInt8(this.read++); n -= 8; } while(n > 0); return rval; }; /** * Gets a signed n-bit integer from this buffer in big-endian order, using * two's complement, and advances the read pointer by n/8. * * @param n the number of bits in the integer (8, 16, 24, or 32). * * @return the integer. */ util.DataBuffer.prototype.getSignedInt = function(n) { // getInt checks n var x = this.getInt(n); var max = 2 << (n - 2); if(x >= max) { x -= max << 1; } return x; }; /** * Reads bytes out into a UTF-8 string and clears them from the buffer. * * @param count the number of bytes to read, undefined or null for all. * * @return a UTF-8 string of bytes. */ util.DataBuffer.prototype.getBytes = function(count) { // TODO: deprecate this method, it is poorly named and // this.toString('binary') replaces it // add a toTypedArray()/toArrayBuffer() function var rval; if(count) { // read count bytes count = Math.min(this.length(), count); rval = this.data.slice(this.read, this.read + count); this.read += count; } else if(count === 0) { rval = ''; } else { // read all bytes, optimize to only copy when needed rval = (this.read === 0) ? this.data : this.data.slice(this.read); this.clear(); } return rval; }; /** * Gets a UTF-8 encoded string of the bytes from this buffer without modifying * the read pointer. * * @param count the number of bytes to get, omit to get all. * * @return a string full of UTF-8 encoded characters. */ util.DataBuffer.prototype.bytes = function(count) { // TODO: deprecate this method, it is poorly named, add "getString()" return (typeof(count) === 'undefined' ? this.data.slice(this.read) : this.data.slice(this.read, this.read + count)); }; /** * Gets a byte at the given index without modifying the read pointer. * * @param i the byte index. * * @return the byte. */ util.DataBuffer.prototype.at = function(i) { return this.data.getUint8(this.read + i); }; /** * Puts a byte at the given index without modifying the read pointer. * * @param i the byte index. * @param b the byte to put. * * @return this buffer. */ util.DataBuffer.prototype.setAt = function(i, b) { this.data.setUint8(i, b); return this; }; /** * Gets the last byte without modifying the read pointer. * * @return the last byte. */ util.DataBuffer.prototype.last = function() { return this.data.getUint8(this.write - 1); }; /** * Creates a copy of this buffer. * * @return the copy. */ util.DataBuffer.prototype.copy = function() { return new util.DataBuffer(this); }; /** * Compacts this buffer. * * @return this buffer. */ util.DataBuffer.prototype.compact = function() { if(this.read > 0) { var src = new Uint8Array(this.data.buffer, this.read); var dst = new Uint8Array(src.byteLength); dst.set(src); this.data = new DataView(dst); this.write -= this.read; this.read = 0; } return this; }; /** * Clears this buffer. * * @return this buffer. */ util.DataBuffer.prototype.clear = function() { this.data = new DataView(new ArrayBuffer(0)); this.read = this.write = 0; return this; }; /** * Shortens this buffer by triming bytes off of the end of this buffer. * * @param count the number of bytes to trim off. * * @return this buffer. */ util.DataBuffer.prototype.truncate = function(count) { this.write = Math.max(0, this.length() - count); this.read = Math.min(this.read, this.write); return this; }; /** * Converts this buffer to a hexadecimal string. * * @return a hexadecimal string. */ util.DataBuffer.prototype.toHex = function() { var rval = ''; for(var i = this.read; i < this.data.byteLength; ++i) { var b = this.data.getUint8(i); if(b < 16) { rval += '0'; } rval += b.toString(16); } return rval; }; /** * Converts this buffer to a string, using the given encoding. If no * encoding is given, 'utf8' (UTF-8) is used. * * @param [encoding] the encoding to use: 'binary', 'utf8', 'utf16', 'hex', * 'base64' (default: 'utf8'). * * @return a string representation of the bytes in this buffer. */ util.DataBuffer.prototype.toString = function(encoding) { var view = new Uint8Array(this.data, this.read, this.length()); encoding = encoding || 'utf8'; // encode to string if(encoding === 'binary' || encoding === 'raw') { return util.binary.raw.encode(view); } if(encoding === 'hex') { return util.binary.hex.encode(view); } if(encoding === 'base64') { return util.binary.base64.encode(view); } // decode to text if(encoding === 'utf8') { return util.text.utf8.decode(view); } if(encoding === 'utf16') { return util.text.utf16.decode(view); } throw new Error('Invalid encoding: ' + encoding); }; /** End Buffer w/UInt8Array backing */ /** * Creates a buffer that stores bytes. A value may be given to put into the * buffer that is either a string of bytes or a UTF-16 string that will * be encoded using UTF-8 (to do the latter, specify 'utf8' as the encoding). * * @param [input] the bytes to wrap (as a string) or a UTF-16 string to encode * as UTF-8. * @param [encoding] (default: 'raw', other: 'utf8'). */ util.createBuffer = function(input, encoding) { // TODO: deprecate, use new ByteBuffer() instead encoding = encoding || 'raw'; if(input !== undefined && encoding === 'utf8') { input = util.encodeUtf8(input); } return new util.ByteBuffer(input); }; /** * Fills a string with a particular value. If you want the string to be a byte * string, pass in String.fromCharCode(theByte). * * @param c the character to fill the string with, use String.fromCharCode * to fill the string with a byte value. * @param n the number of characters of value c to fill with. * * @return the filled string. */ util.fillString = function(c, n) { var s = ''; while(n > 0) { if(n & 1) { s += c; } n >>>= 1; if(n > 0) { c += c; } } return s; }; /** * Performs a per byte XOR between two byte strings and returns the result as a * string of bytes. * * @param s1 first string of bytes. * @param s2 second string of bytes. * @param n the number of bytes to XOR. * * @return the XOR'd result. */ util.xorBytes = function(s1, s2, n) { var s3 = ''; var b = ''; var t = ''; var i = 0; var c = 0; for(; n > 0; --n, ++i) { b = s1.charCodeAt(i) ^ s2.charCodeAt(i); if(c >= 10) { s3 += t; t = ''; c = 0; } t += String.fromCharCode(b); ++c; } s3 += t; return s3; }; /** * Converts a hex string into a 'binary' encoded string of bytes. * * @param hex the hexadecimal string to convert. * * @return the binary-encoded string of bytes. */ util.hexToBytes = function(hex) { // TODO: deprecate: "Deprecated. Use util.binary.hex.decode instead." var rval = ''; var i = 0; if(hex.length & 1 == 1) { // odd number of characters, convert first character alone i = 1; rval += String.fromCharCode(parseInt(hex[0], 16)); } // convert 2 characters (1 byte) at a time for(; i < hex.length; i += 2) { rval += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); } return rval; }; /** * Converts a 'binary' encoded string of bytes to hex. * * @param bytes the byte string to convert. * * @return the string of hexadecimal characters. */ util.bytesToHex = function(bytes) { // TODO: deprecate: "Deprecated. Use util.binary.hex.encode instead." return util.createBuffer(bytes).toHex(); }; /** * Converts an 32-bit integer to 4-big-endian byte string. * * @param i the integer. * * @return the byte string. */ util.int32ToBytes = function(i) { return ( String.fromCharCode(i >> 24 & 0xFF) + String.fromCharCode(i >> 16 & 0xFF) + String.fromCharCode(i >> 8 & 0xFF) + String.fromCharCode(i & 0xFF)); }; // base64 characters, reverse mapping var _base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; var _base64Idx = [ /*43 -43 = 0*/ /*'+', 1, 2, 3,'/' */ 62, -1, -1, -1, 63, /*'0','1','2','3','4','5','6','7','8','9' */ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, /*15, 16, 17,'=', 19, 20, 21 */ -1, -1, -1, 64, -1, -1, -1, /*65 - 43 = 22*/ /*'A','B','C','D','E','F','G','H','I','J','K','L','M', */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, /*'N','O','P','Q','R','S','T','U','V','W','X','Y','Z' */ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, /*91 - 43 = 48 */ /*48, 49, 50, 51, 52, 53 */ -1, -1, -1, -1, -1, -1, /*97 - 43 = 54*/ /*'a','b','c','d','e','f','g','h','i','j','k','l','m' */ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /*'n','o','p','q','r','s','t','u','v','w','x','y','z' */ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 ]; // base58 characters (Bitcoin alphabet) var _base58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; /** * Base64 encodes a 'binary' encoded string of bytes. * * @param input the binary encoded string of bytes to base64-encode. * @param maxline the maximum number of encoded characters per line to use, * defaults to none. * * @return the base64-encoded output. */ util.encode64 = function(input, maxline) { // TODO: deprecate: "Deprecated. Use util.binary.base64.encode instead." var line = ''; var output = ''; var chr1, chr2, chr3; var i = 0; while(i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); // encode 4 character group line += _base64.charAt(chr1 >> 2); line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4)); if(isNaN(chr2)) { line += '=='; } else { line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6)); line += isNaN(chr3) ? '=' : _base64.charAt(chr3 & 63); } if(maxline && line.length > maxline) { output += line.substr(0, maxline) + '\r\n'; line = line.substr(maxline); } } output += line; return output; }; /** * Base64 decodes a string into a 'binary' encoded string of bytes. * * @param input the base64-encoded input. * * @return the binary encoded string. */ util.decode64 = function(input) { // TODO: deprecate: "Deprecated. Use util.binary.base64.decode instead." // remove all non-base64 characters input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); var output = ''; var enc1, enc2, enc3, enc4; var i = 0; while(i < input.length) { enc1 = _base64Idx[input.charCodeAt(i++) - 43]; enc2 = _base64Idx[input.charCodeAt(i++) - 43]; enc3 = _base64Idx[input.charCodeAt(i++) - 43]; enc4 = _base64Idx[input.charCodeAt(i++) - 43]; output += String.fromCharCode((enc1 << 2) | (enc2 >> 4)); if(enc3 !== 64) { // decoded at least 2 bytes output += String.fromCharCode(((enc2 & 15) << 4) | (enc3 >> 2)); if(enc4 !== 64) { // decoded 3 bytes output += String.fromCharCode(((enc3 & 3) << 6) | enc4); } } } return output; }; /** * UTF-8 encodes the given UTF-16 encoded string (a standard JavaScript * string). Non-ASCII characters will be encoded as multiple bytes according * to UTF-8. * * @param str the string to encode. * * @return the UTF-8 encoded string. */ util.encodeUtf8 = function(str) { return unescape(encodeURIComponent(str)); }; /** * Decodes a UTF-8 encoded string into a UTF-16 string. * * @param str the string to decode. * * @return the UTF-16 encoded string (standard JavaScript string). */ util.decodeUtf8 = function(str) { return decodeURIComponent(escape(str)); }; // binary encoding/decoding tools // FIXME: Experimental. Do not use yet. util.binary = { raw: {}, hex: {}, base64: {}, base58: {}, baseN : { encode: baseN.encode, decode: baseN.decode } }; /** * Encodes a Uint8Array as a binary-encoded string. This encoding uses * a value between 0 and 255 for each character. * * @param bytes the Uint8Array to encode. * * @return the binary-encoded string. */ util.binary.raw.encode = function(bytes) { return String.fromCharCode.apply(null, bytes); }; /** * Decodes a binary-encoded string to a Uint8Array. This encoding uses * a value between 0 and 255 for each character. * * @param str the binary-encoded string to decode. * @param [output] an optional Uint8Array to write the output to; if it * is too small, an exception will be thrown. * @param [offset] the start offset for writing to the output (default: 0). * * @return the Uint8Array or the number of bytes written if output was given. */ util.binary.raw.decode = function(str, output, offset) { var out = output; if(!out) { out = new Uint8Array(str.length); } offset = offset || 0; var j = offset; for(var i = 0; i < str.length; ++i) { out[j++] = str.charCodeAt(i); } return output ? (j - offset) : out; }; /** * Encodes a 'binary' string, ArrayBuffer, DataView, TypedArray, or * ByteBuffer as a string of hexadecimal characters. * * @param bytes the bytes to convert. * * @return the string of hexadecimal characters. */ util.binary.hex.encode = util.bytesToHex; /** * Decodes a hex-encoded string to a Uint8Array. * * @param hex the hexadecimal string to convert. * @param [output] an optional Uint8Array to write the output to; if it * is too small, an exception will be thrown. * @param [offset] the start offset for writing to the output (default: 0). * * @return the Uint8Array or the number of bytes written if output was given. */ util.binary.hex.decode = function(hex, output, offset) { var out = output; if(!out) { out = new Uint8Array(Math.ceil(hex.length / 2)); } offset = offset || 0; var i = 0, j = offset; if(hex.length & 1) { // odd number of characters, convert first character alone i = 1; out[j++] = parseInt(hex[0], 16); } // convert 2 characters (1 byte) at a time for(; i < hex.length; i += 2) { out[j++] = parseInt(hex.substr(i, 2), 16); } return output ? (j - offset) : out; }; /** * Base64-encodes a Uint8Array. * * @param input the Uint8Array to encode. * @param maxline the maximum number of encoded characters per line to use, * defaults to none. * * @return the base64-encoded output string. */ util.binary.base64.encode = function(input, maxline) { var line = ''; var output = ''; var chr1, chr2, chr3; var i = 0; while(i < input.byteLength) { chr1 = input[i++]; chr2 = input[i++]; chr3 = input[i++]; // encode 4 character group line += _base64.charAt(chr1 >> 2); line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4)); if(isNaN(chr2)) { line += '=='; } else { line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6)); line += isNaN(chr3) ? '=' : _base64.charAt(chr3 & 63); } if(maxline && line.length > maxline) { output += line.substr(0, maxline) + '\r\n'; line = line.substr(maxline); } } output += line; return output; }; /** * Decodes a base64-encoded string to a Uint8Array. * * @param input the base64-encoded input string. * @param [output] an optional Uint8Array to write the output to; if it * is too small, an exception will be thrown. * @param [offset] the start offset for writing to the output (default: 0). * * @return the Uint8Array or the number of bytes written if output was given. */ util.binary.base64.decode = function(input, output, offset) { var out = output; if(!out) { out = new Uint8Array(Math.ceil(input.length / 4) * 3); } // remove all non-base64 characters input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); offset = offset || 0; var enc1, enc2, enc3, enc4; var i = 0, j = offset; while(i < input.length) { enc1 = _base64Idx[input.charCodeAt(i++) - 43]; enc2 = _base64Idx[input.charCodeAt(i++) - 43]; enc3 = _base64Idx[input.charCodeAt(i++) - 43]; enc4 = _base64Idx[input.charCodeAt(i++) - 43]; out[j++] = (enc1 << 2) | (enc2 >> 4); if(enc3 !== 64) { // decoded at least 2 bytes out[j++] = ((enc2 & 15) << 4) | (enc3 >> 2); if(enc4 !== 64) { // decoded 3 bytes out[j++] = ((enc3 & 3) << 6) | enc4; } } } // make sure result is the exact decoded length return output ? (j - offset) : out.subarray(0, j); }; // add support for base58 encoding/decoding with Bitcoin alphabet util.binary.base58.encode = function(input, maxline) { return util.binary.baseN.encode(input, _base58, maxline); }; util.binary.base58.decode = function(input, maxline) { return util.binary.baseN.decode(input, _base58, maxline); }; // text encoding/decoding tools // FIXME: Experimental. Do not use yet. util.text = { utf8: {}, utf16: {} }; /** * Encodes the given string as UTF-8 in a Uint8Array. * * @param str the string to encode. * @param [output] an optional Uint8Array to write the output to; if it * is too small, an exception will be thrown. * @param [offset] the start offset for writing to the output (default: 0). * * @return the Uint8Array or the number of bytes written if output was given. */ util.text.utf8.encode = function(str, output, offset) { str = util.encodeUtf8(str); var out = output; if(!out) { out = new Uint8Array(str.length); } offset = offset || 0; var j = offset; for(var i = 0; i < str.length; ++i) { out[j++] = str.charCodeAt(i); } return output ? (j - offset) : out; }; /** * Decodes the UTF-8 contents from a Uint8Array. * * @param bytes the Uint8Array to decode. * * @return the resulting string. */ util.text.utf8.decode = function(bytes) { return util.decodeUtf8(String.fromCharCode.apply(null, bytes)); }; /** * Encodes the given string as UTF-16 in a Uint8Array. * * @param str the string to encode. * @param [output] an optional Uint8Array to write the output to; if it * is too small, an exception will be thrown. * @param [offset] the start offset for writing to the output (default: 0). * * @return the Uint8Array or the number of bytes written if output was given. */ util.text.utf16.encode = function(str, output, offset) { var out = output; if(!out) { out = new Uint8Array(str.length * 2); } var view = new Uint16Array(out.buffer); offset = offset || 0; var j = offset; var k = offset; for(var i = 0; i < str.length; ++i) { view[k++] = str.charCodeAt(i); j += 2; } return output ? (j - offset) : out; }; /** * Decodes the UTF-16 contents from a Uint8Array. * * @param bytes the Uint8Array to decode. * * @return the resulting string. */ util.text.utf16.decode = function(bytes) { return String.fromCharCode.apply(null, new Uint16Array(bytes.buffer)); }; /** * Deflates the given data using a flash interface. * * @param api the flash interface. * @param bytes the data. * @param raw true to return only raw deflate data, false to include zlib * header and trailer. * * @return the deflated data as a string. */ util.deflate = function(api, bytes, raw) { bytes = util.decode64(api.deflate(util.encode64(bytes)).rval); // strip zlib header and trailer if necessary if(raw) { // zlib header is 2 bytes (CMF,FLG) where FLG indicates that // there is a 4-byte DICT (alder-32) block before the data if // its 5th bit is set var start = 2; var flg = bytes.charCodeAt(1); if(flg & 0x20) { start = 6; } // zlib trailer is 4 bytes of adler-32 bytes = bytes.substring(start, bytes.length - 4); } return bytes; }; /** * Inflates the given data using a flash interface. * * @param api the flash interface. * @param bytes the data. * @param raw true if the incoming data has no zlib header or trailer and is * raw DEFLATE data. * * @return the inflated data as a string, null on error. */ util.inflate = function(api, bytes, raw) { // TODO: add zlib header and trailer if necessary/possible var rval = api.inflate(util.encode64(bytes)).rval; return (rval === null) ? null : util.decode64(rval); }; /** * Sets a storage object. * * @param api the storage interface. * @param id the storage ID to use. * @param obj the storage object, null to remove. */ var _setStorageObject = function(api, id, obj) { if(!api) { throw new Error('WebStorage not available.'); } var rval; if(obj === null) { rval = api.removeItem(id); } else { // json-encode and base64-encode object obj = util.encode64(JSON.stringify(obj)); rval = api.setItem(id, obj); } // handle potential flash error if(typeof(rval) !== 'undefined' && rval.rval !== true) { var error = new Error(rval.error.message); error.id = rval.error.id; error.name = rval.error.name; throw error; } }; /** * Gets a storage object. * * @param api the storage interface. * @param id the storage ID to use. * * @return the storage object entry or null if none exists. */ var _getStorageObject = function(api, id) { if(!api) { throw new Error('WebStorage not available.'); } // get the existing entry var rval = api.getItem(id); /* Note: We check api.init because we can't do (api == localStorage) on IE because of "Class doesn't support Automation" exception. Only the flash api has an init method so this works too, but we need a better solution in the future. */ // flash returns item wrapped in an object, handle special case if(api.init) { if(rval.rval === null) { if(rval.error) { var error = new Error(rval.error.message); error.id = rval.error.id; error.name = rval.error.name; throw error; } // no error, but also no item rval = null; } else { rval = rval.rval; } } // handle decoding if(rval !== null) { // base64-decode and json-decode data rval = JSON.parse(util.decode64(rval)); } return rval; }; /** * Stores an item in local storage. * * @param api the storage interface. * @param id the storage ID to use. * @param key the key for the item. * @param data the data for the item (any javascript object/primitive). */ var _setItem = function(api, id, key, data) { // get storage object var obj = _getStorageObject(api, id); if(obj === null) { // create a new storage object obj = {}; } // update key obj[key] = data; // set storage object _setStorageObject(api, id, obj); }; /** * Gets an item from local storage. * * @param api the storage interface. * @param id the storage ID to use. * @param key the key for the item. * * @return the item. */ var _getItem = function(api, id, key) { // get storage object var rval = _getStorageObject(api, id); if(rval !== null) { // return data at key rval = (key in rval) ? rval[key] : null; } return rval; }; /** * Removes an item from local storage. * * @param api the storage interface. * @param id the storage ID to use. * @param key the key for the item. */ var _removeItem = function(api, id, key) { // get storage object var obj = _getStorageObject(api, id); if(obj !== null && key in obj) { // remove key delete obj[key]; // see if entry has no keys remaining var empty = true; for(var prop in obj) { empty = false; break; } if(empty) { // remove entry entirely if no keys are left obj = null; } // set storage object _setStorageObject(api, id, obj); } }; /** * Clears the local disk storage identified by the given ID. * * @param api the storage interface. * @param id the storage ID to use. */ var _clearItems = function(api, id) { _setStorageObject(api, id, null); }; /** * Calls a storage function. * * @param func the function to call. * @param args the arguments for the function. * @param location the location argument. * * @return the return value from the function. */ var _callStorageFunction = function(func, args, location) { var rval = null; // default storage types if(typeof(location) === 'undefined') { location = ['web', 'flash']; } // apply storage types in order of preference var type; var done = false; var exception = null; for(var idx in location) { type = location[idx]; try { if(type === 'flash' || type === 'both') { if(args[0] === null) { throw new Error('Flash local storage not available.'); } rval = func.apply(this, args); done = (type === 'flash'); } if(type === 'web' || type === 'both') { args[0] = localStorage; rval = func.apply(this, args); done = true; } } catch(ex) { exception = ex; } if(done) { break; } } if(!done) { throw exception; } return rval; }; /** * Stores an item on local disk. * * The available types of local storage include 'flash', 'web', and 'both'. * * The type 'flash' refers to flash local storage (SharedObject). In order * to use flash local storage, the 'api' parameter must be valid. The type * 'web' refers to WebStorage, if supported by the browser. The type 'both' * refers to storing using both 'flash' and 'web', not just one or the * other. * * The location array should list the storage types to use in order of * preference: * * ['flash']: flash only storage * ['web']: web only storage * ['both']: try to store in both * ['flash','web']: store in flash first, but if not available, 'web' * ['web','flash']: store in web first, but if not available, 'flash' * * The location array defaults to: ['web', 'flash'] * * @param api the flash interface, null to use only WebStorage. * @param id the storage ID to use. * @param key the key for the item. * @param data the data for the item (any javascript object/primitive). * @param location an array with the preferred types of storage to use. */ util.setItem = function(api, id, key, data, location) { _callStorageFunction(_setItem, arguments, location); }; /** * Gets an item on local disk. * * Set setItem() for details on storage types. * * @param api the flash interface, null to use only WebStorage. * @param id the storage ID to use. * @param key the key for the item. * @param location an array with the preferred types of storage to use. * * @return the item. */ util.getItem = function(api, id, key, location) { return _callStorageFunction(_getItem, arguments, location); }; /** * Removes an item on local disk. * * Set setItem() for details on storage types. * * @param api the flash interface. * @param id the storage ID to use. * @param key the key for the item. * @param location an array with the preferred types of storage to use. */ util.removeItem = function(api, id, key, location) { _callStorageFunction(_removeItem, arguments, location); }; /** * Clears the local disk storage identified by the given ID. * * Set setItem() for details on storage types. * * @param api the flash interface if flash is available. * @param id the storage ID to use. * @param location an array with the preferred types of storage to use. */ util.clearItems = function(api, id, location) { _callStorageFunction(_clearItems, arguments, location); }; /** * Parses the scheme, host, and port from an http(s) url. * * @param str the url string. * * @return the parsed url object or null if the url is invalid. */ util.parseUrl = function(str) { // FIXME: this regex looks a bit broken var regex = /^(https?):\/\/([^:&^\/]*):?(\d*)(.*)$/g; regex.lastIndex = 0; var m = regex.exec(str); var url = (m === null) ? null : { full: str, scheme: m[1], host: m[2], port: m[3], path: m[4] }; if(url) { url.fullHost = url.host; if(url.port) { if(url.port !== 80 && url.scheme === 'http') { url.fullHost += ':' + url.port; } else if(url.port !== 443 && url.scheme === 'https') { url.fullHost += ':' + url.port; } } else if(url.scheme === 'http') { url.port = 80; } else if(url.scheme === 'https') { url.port = 443; } url.full = url.scheme + '://' + url.fullHost; } return url; }; /* Storage for query variables */ var _queryVariables = null; /** * Returns the window location query variables. Query is parsed on the first * call and the same object is returned on subsequent calls. The mapping * is from keys to an array of values. Parameters without values will have * an object key set but no value added to the value array. Values are * unescaped. * * ...?k1=v1&k2=v2: * { * "k1": ["v1"], * "k2": ["v2"] * } * * ...?k1=v1&k1=v2: * { * "k1": ["v1", "v2"] * } * * ...?k1=v1&k2: * { * "k1": ["v1"], * "k2": [] * } * * ...?k1=v1&k1: * { * "k1": ["v1"] * } * * ...?k1&k1: * { * "k1": [] * } * * @param query the query string to parse (optional, default to cached * results from parsing window location search query). * * @return object mapping keys to variables. */ util.getQueryVariables = function(query) { var parse = function(q) { var rval = {}; var kvpairs = q.split('&'); for(var i = 0; i < kvpairs.length; i++) { var pos = kvpairs[i].indexOf('='); var key; var val; if(pos > 0) { key = kvpairs[i].substring(0, pos); val = kvpairs[i].substring(pos + 1); } else { key = kvpairs[i]; val = null; } if(!(key in rval)) { rval[key] = []; } // disallow overriding object prototype keys if(!(key in Object.prototype) && val !== null) { rval[key].push(unescape(val)); } } return rval; }; var rval; if(typeof(query) === 'undefined') { // set cached variables if needed if(_queryVariables === null) { if(typeof(window) !== 'undefined' && window.location && window.location.search) { // parse window search query _queryVariables = parse(window.location.search.substring(1)); } else { // no query variables available _queryVariables = {}; } } rval = _queryVariables; } else { // parse given query rval = parse(query); } return rval; }; /** * Parses a fragment into a path and query. This method will take a URI * fragment and break it up as if it were the main URI. For example: * /bar/baz?a=1&b=2 * results in: * { * path: ["bar", "baz"], * query: {"k1": ["v1"], "k2": ["v2"]} * } * * @return object with a path array and query object. */ util.parseFragment = function(fragment) { // default to whole fragment var fp = fragment; var fq = ''; // split into path and query if possible at the first '?' var pos = fragment.indexOf('?'); if(pos > 0) { fp = fragment.substring(0, pos); fq = fragment.substring(pos + 1); } // split path based on '/' and ignore first element if empty var path = fp.split('/'); if(path.length > 0 && path[0] === '') { path.shift(); } // convert query into object var query = (fq === '') ? {} : util.getQueryVariables(fq); return { pathString: fp, queryString: fq, path: path, query: query }; }; /** * Makes a request out of a URI-like request string. This is intended to * be used where a fragment id (after a URI '#') is parsed as a URI with * path and query parts. The string should have a path beginning and * delimited by '/' and optional query parameters following a '?'. The * query should be a standard URL set of key value pairs delimited by * '&'. For backwards compatibility the initial '/' on the path is not * required. The request object has the following API, (fully described * in the method code): * { * path: . * query: , * getPath(i): get part or all of the split path array, * getQuery(k, i): get part or all of a query key array, * getQueryLast(k, _default): get last element of a query key array. * } * * @return object with request parameters. */ util.makeRequest = function(reqString) { var frag = util.parseFragment(reqString); var req = { // full path string path: frag.pathString, // full query string query: frag.queryString, /** * Get path or element in path. * * @param i optional path index. * * @return path or part of path if i provided. */ getPath: function(i) { return (typeof(i) === 'undefined') ? frag.path : frag.path[i]; }, /** * Get query, values for a key, or value for a key index. * * @param k optional query key. * @param i optional query key index. * * @return query, values for a key, or value for a key index. */ getQuery: function(k, i) { var rval; if(typeof(k) === 'undefined') { rval = frag.query; } else { rval = frag.query[k]; if(rval && typeof(i) !== 'undefined') { rval = rval[i]; } } return rval; }, getQueryLast: function(k, _default) { var rval; var vals = req.getQuery(k); if(vals) { rval = vals[vals.length - 1]; } else { rval = _default; } return rval; } }; return req; }; /** * Makes a URI out of a path, an object with query parameters, and a * fragment. Uses jQuery.param() internally for query string creation. * If the path is an array, it will be joined with '/'. * * @param path string path or array of strings. * @param query object with query parameters. (optional) * @param fragment fragment string. (optional) * * @return string object with request parameters. */ util.makeLink = function(path, query, fragment) { // join path parts if needed path = jQuery.isArray(path) ? path.join('/') : path; var qstr = jQuery.param(query || {}); fragment = fragment || ''; return path + ((qstr.length > 0) ? ('?' + qstr) : '') + ((fragment.length > 0) ? ('#' + fragment) : ''); }; /** * Follows a path of keys deep into an object hierarchy and set a value. * If a key does not exist or it's value is not an object, create an * object in it's place. This can be destructive to a object tree if * leaf nodes are given as non-final path keys. * Used to avoid exceptions from missing parts of the path. * * @param object the starting object. * @param keys an array of string keys. * @param value the value to set. */ util.setPath = function(object, keys, value) { // need to start at an object if(typeof(object) === 'object' && object !== null) { var i = 0; var len = keys.length; while(i < len) { var next = keys[i++]; if(i == len) { // last object[next] = value; } else { // more var hasNext = (next in object); if(!hasNext || (hasNext && typeof(object[next]) !== 'object') || (hasNext && object[next] === null)) { object[next] = {}; } object = object[next]; } } } }; /** * Follows a path of keys deep into an object hierarchy and return a value. * If a key does not exist, create an object in it's place. * Used to avoid exceptions from missing parts of the path. * * @param object the starting object. * @param keys an array of string keys. * @param _default value to return if path not found. * * @return the value at the path if found, else default if given, else * undefined. */ util.getPath = function(object, keys, _default) { var i = 0; var len = keys.length; var hasNext = true; while(hasNext && i < len && typeof(object) === 'object' && object !== null) { var next = keys[i++]; hasNext = next in object; if(hasNext) { object = object[next]; } } return (hasNext ? object : _default); }; /** * Follow a path of keys deep into an object hierarchy and delete the * last one. If a key does not exist, do nothing. * Used to avoid exceptions from missing parts of the path. * * @param object the starting object. * @param keys an array of string keys. */ util.deletePath = function(object, keys) { // need to start at an object if(typeof(object) === 'object' && object !== null) { var i = 0; var len = keys.length; while(i < len) { var next = keys[i++]; if(i == len) { // last delete object[next]; } else { // more if(!(next in object) || (typeof(object[next]) !== 'object') || (object[next] === null)) { break; } object = object[next]; } } } }; /** * Check if an object is empty. * * Taken from: * http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object-from-json/679937#679937 * * @param object the object to check. */ util.isEmpty = function(obj) { for(var prop in obj) { if(obj.hasOwnProperty(prop)) { return false; } } return true; }; /** * Format with simple printf-style interpolation. * * %%: literal '%' * %s,%o: convert next argument into a string. * * @param format the string to format. * @param ... arguments to interpolate into the format string. */ util.format = function(format) { var re = /%./g; // current match var match; // current part var part; // current arg index var argi = 0; // collected parts to recombine later var parts = []; // last index found var last = 0; // loop while matches remain while((match = re.exec(format))) { part = format.substring(last, re.lastIndex - 2); // don't add empty strings (ie, parts between %s%s) if(part.length > 0) { parts.push(part); } last = re.lastIndex; // switch on % code var code = match[0][1]; switch(code) { case 's': case 'o': // check if enough arguments were given if(argi < arguments.length) { parts.push(arguments[argi++ + 1]); } else { parts.push(''); } break; // FIXME: do proper formating for numbers, etc //case 'f': //case 'd': case '%': parts.push('%'); break; default: parts.push('<%' + code + '?>'); } } // add trailing part of format string parts.push(format.substring(last)); return parts.join(''); }; /** * Formats a number. * * http://snipplr.com/view/5945/javascript-numberformat--ported-from-php/ */ util.formatNumber = function(number, decimals, dec_point, thousands_sep) { // http://kevin.vanzonneveld.net // + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + bugfix by: Michael White (http://crestidg.com) // + bugfix by: Benjamin Lupton // + bugfix by: Allan Jensen (http://www.winternet.no) // + revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) // * example 1: number_format(1234.5678, 2, '.', ''); // * returns 1: 1234.57 var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals; var d = dec_point === undefined ? ',' : dec_point; var t = thousands_sep === undefined ? '.' : thousands_sep, s = n < 0 ? '-' : ''; var i = parseInt((n = Math.abs(+n || 0).toFixed(c)), 10) + ''; var j = (i.length > 3) ? i.length % 3 : 0; return s + (j ? i.substr(0, j) + t : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ''); }; /** * Formats a byte size. * * http://snipplr.com/view/5949/format-humanize-file-byte-size-presentation-in-javascript/ */ util.formatSize = function(size) { if(size >= 1073741824) { size = util.formatNumber(size / 1073741824, 2, '.', '') + ' GiB'; } else if(size >= 1048576) { size = util.formatNumber(size / 1048576, 2, '.', '') + ' MiB'; } else if(size >= 1024) { size = util.formatNumber(size / 1024, 0) + ' KiB'; } else { size = util.formatNumber(size, 0) + ' bytes'; } return size; }; /** * Converts an IPv4 or IPv6 string representation into bytes (in network order). * * @param ip the IPv4 or IPv6 address to convert. * * @return the 4-byte IPv6 or 16-byte IPv6 address or null if the address can't * be parsed. */ util.bytesFromIP = function(ip) { if(ip.indexOf('.') !== -1) { return util.bytesFromIPv4(ip); } if(ip.indexOf(':') !== -1) { return util.bytesFromIPv6(ip); } return null; }; /** * Converts an IPv4 string representation into bytes (in network order). * * @param ip the IPv4 address to convert. * * @return the 4-byte address or null if the address can't be parsed. */ util.bytesFromIPv4 = function(ip) { ip = ip.split('.'); if(ip.length !== 4) { return null; } var b = util.createBuffer(); for(var i = 0; i < ip.length; ++i) { var num = parseInt(ip[i], 10); if(isNaN(num)) { return null; } b.putByte(num); } return b.getBytes(); }; /** * Converts an IPv6 string representation into bytes (in network order). * * @param ip the IPv6 address to convert. * * @return the 16-byte address or null if the address can't be parsed. */ util.bytesFromIPv6 = function(ip) { var blanks = 0; ip = ip.split(':').filter(function(e) { if(e.length === 0) ++blanks; return true; }); var zeros = (8 - ip.length + blanks) * 2; var b = util.createBuffer(); for(var i = 0; i < 8; ++i) { if(!ip[i] || ip[i].length === 0) { b.fillWithByte(0, zeros); zeros = 0; continue; } var bytes = util.hexToBytes(ip[i]); if(bytes.length < 2) { b.putByte(0); } b.putBytes(bytes); } return b.getBytes(); }; /** * Converts 4-bytes into an IPv4 string representation or 16-bytes into * an IPv6 string representation. The bytes must be in network order. * * @param bytes the bytes to convert. * * @return the IPv4 or IPv6 string representation if 4 or 16 bytes, * respectively, are given, otherwise null. */ util.bytesToIP = function(bytes) { if(bytes.length === 4) { return util.bytesToIPv4(bytes); } if(bytes.length === 16) { return util.bytesToIPv6(bytes); } return null; }; /** * Converts 4-bytes into an IPv4 string representation. The bytes must be * in network order. * * @param bytes the bytes to convert. * * @return the IPv4 string representation or null for an invalid # of bytes. */ util.bytesToIPv4 = function(bytes) { if(bytes.length !== 4) { return null; } var ip = []; for(var i = 0; i < bytes.length; ++i) { ip.push(bytes.charCodeAt(i)); } return ip.join('.'); }; /** * Converts 16-bytes into an IPv16 string representation. The bytes must be * in network order. * * @param bytes the bytes to convert. * * @return the IPv16 string representation or null for an invalid # of bytes. */ util.bytesToIPv6 = function(bytes) { if(bytes.length !== 16) { return null; } var ip = []; var zeroGroups = []; var zeroMaxGroup = 0; for(var i = 0; i < bytes.length; i += 2) { var hex = util.bytesToHex(bytes[i] + bytes[i + 1]); // canonicalize zero representation while(hex[0] === '0' && hex !== '0') { hex = hex.substr(1); } if(hex === '0') { var last = zeroGroups[zeroGroups.length - 1]; var idx = ip.length; if(!last || idx !== last.end + 1) { zeroGroups.push({start: idx, end: idx}); } else { last.end = idx; if((last.end - last.start) > (zeroGroups[zeroMaxGroup].end - zeroGroups[zeroMaxGroup].start)) { zeroMaxGroup = zeroGroups.length - 1; } } } ip.push(hex); } if(zeroGroups.length > 0) { var group = zeroGroups[zeroMaxGroup]; // only shorten group of length > 0 if(group.end - group.start > 0) { ip.splice(group.start, group.end - group.start + 1, ''); if(group.start === 0) { ip.unshift(''); } if(group.end === 7) { ip.push(''); } } } return ip.join(':'); }; /** * Estimates the number of processes that can be run concurrently. If * creating Web Workers, keep in mind that the main JavaScript process needs * its own core. * * @param options the options to use: * update true to force an update (not use the cached value). * @param callback(err, max) called once the operation completes. */ util.estimateCores = function(options, callback) { if(typeof options === 'function') { callback = options; options = {}; } options = options || {}; if('cores' in util && !options.update) { return callback(null, util.cores); } if(typeof navigator !== 'undefined' && 'hardwareConcurrency' in navigator && navigator.hardwareConcurrency > 0) { util.cores = navigator.hardwareConcurrency; return callback(null, util.cores); } if(typeof Worker === 'undefined') { // workers not available util.cores = 1; return callback(null, util.cores); } if(typeof Blob === 'undefined') { // can't estimate, default to 2 util.cores = 2; return callback(null, util.cores); } // create worker concurrency estimation code as blob var blobUrl = URL.createObjectURL(new Blob(['(', function() { self.addEventListener('message', function(e) { // run worker for 4 ms var st = Date.now(); var et = st + 4; while(Date.now() < et); self.postMessage({st: st, et: et}); }); }.toString(), ')()'], {type: 'application/javascript'})); // take 5 samples using 16 workers sample([], 5, 16); function sample(max, samples, numWorkers) { if(samples === 0) { // get overlap average var avg = Math.floor(max.reduce(function(avg, x) { return avg + x; }, 0) / max.length); util.cores = Math.max(1, avg); URL.revokeObjectURL(blobUrl); return callback(null, util.cores); } map(numWorkers, function(err, results) { max.push(reduce(numWorkers, results)); sample(max, samples - 1, numWorkers); }); } function map(numWorkers, callback) { var workers = []; var results = []; for(var i = 0; i < numWorkers; ++i) { var worker = new Worker(blobUrl); worker.addEventListener('message', function(e) { results.push(e.data); if(results.length === numWorkers) { for(var i = 0; i < numWorkers; ++i) { workers[i].terminate(); } callback(null, results); } }); workers.push(worker); } for(var i = 0; i < numWorkers; ++i) { workers[i].postMessage(i); } } function reduce(numWorkers, results) { // find overlapping time windows var overlaps = []; for(var n = 0; n < numWorkers; ++n) { var r1 = results[n]; var overlap = overlaps[n] = []; for(var i = 0; i < numWorkers; ++i) { if(n === i) { continue; } var r2 = results[i]; if((r1.st > r2.st && r1.st < r2.et) || (r2.st > r1.st && r2.st < r1.et)) { overlap.push(i); } } } // get maximum overlaps ... don't include overlapping worker itself // as the main JS process was also being scheduled during the work and // would have to be subtracted from the estimate anyway return overlaps.reduce(function(max, overlap) { return Math.max(max, overlap.length); }, 0); } }; /***/ }), /* 71 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2016-2017 Digital Bazaar, Inc. All rights reserved. */ // TODO: convert to ES6 iterable var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } module.exports = function () { /** * A Permutator iterates over all possible permutations of the given array * of elements. * * @param list the array of elements to iterate over. */ function Permutator(list) { _classCallCheck(this, Permutator); // original array this.list = list.sort(); // indicates whether there are more permutations this.done = false; // directional info for permutation algorithm this.left = {}; for (var i = 0; i < list.length; ++i) { this.left[list[i]] = true; } } /** * Returns true if there is another permutation. * * @return true if there is another permutation, false if not. */ _createClass(Permutator, [{ key: 'hasNext', value: function hasNext() { return !this.done; } /** * Gets the next permutation. Call hasNext() to ensure there is another one * first. * * @return the next permutation. */ }, { key: 'next', value: function next() { // copy current permutation var rval = this.list.slice(); /* Calculate the next permutation using the Steinhaus-Johnson-Trotter permutation algorithm. */ // get largest mobile element k // (mobile: element is greater than the one it is looking at) var k = null; var pos = 0; var length = this.list.length; for (var i = 0; i < length; ++i) { var element = this.list[i]; var left = this.left[element]; if ((k === null || element > k) && (left && i > 0 && element > this.list[i - 1] || !left && i < length - 1 && element > this.list[i + 1])) { k = element; pos = i; } } // no more permutations if (k === null) { this.done = true; } else { // swap k and the element it is looking at var swap = this.left[k] ? pos - 1 : pos + 1; this.list[pos] = this.list[swap]; this.list[swap] = k; // reverse the direction of all elements larger than k for (var _i = 0; _i < length; ++_i) { if (this.list[_i] > k) { this.left[this.list[_i]] = !this.left[this.list[_i]]; } } } return rval; } }]); return Permutator; }(); /***/ }), /* 72 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2016 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var IdentifierIssuer = __webpack_require__(46); var MessageDigest = __webpack_require__(69); var Permutator = __webpack_require__(71); var NQuads = __webpack_require__(48); var util = __webpack_require__(14); var POSITIONS = { 'subject': 's', 'object': 'o', 'graph': 'g' }; module.exports = function () { function URDNA2015Sync() { _classCallCheck(this, URDNA2015Sync); this.name = 'URDNA2015'; this.blankNodeInfo = {}; this.hashToBlankNodes = {}; this.canonicalIssuer = new IdentifierIssuer('_:c14n'); this.hashAlgorithm = 'sha256'; this.quads; } // 4.4) Normalization Algorithm _createClass(URDNA2015Sync, [{ key: 'main', value: function main(dataset) { var self = this; self.quads = dataset; // 1) Create the normalization state. // Note: Optimize by generating non-normalized blank node map concurrently. var nonNormalized = {}; // 2) For every quad in input dataset: var _loop = function _loop(quad) { // 2.1) For each blank node that occurs in the quad, add a reference // to the quad using the blank node identifier in the blank node to // quads map, creating a new entry if necessary. self.forEachComponent(quad, function (component) { if (component.termType !== 'BlankNode') { return; } var id = component.value; if (id in self.blankNodeInfo) { self.blankNodeInfo[id].quads.push(quad); } else { nonNormalized[id] = true; self.blankNodeInfo[id] = { quads: [quad] }; } }); }; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = dataset[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var quad = _step.value; _loop(quad); } // 3) Create a list of non-normalized blank node identifiers // non-normalized identifiers and populate it using the keys from the // blank node to quads map. // Note: We use a map here and it was generated during step 2. // 4) Initialize simple, a boolean flag, to true. } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var simple = true; // 5) While simple is true, issue canonical identifiers for blank nodes: while (simple) { // 5.1) Set simple to false. simple = false; // 5.2) Clear hash to blank nodes map. self.hashToBlankNodes = {}; // 5.3) For each blank node identifier identifier in non-normalized // identifiers: for (var id in nonNormalized) { // 5.3.1) Create a hash, hash, according to the Hash First Degree // Quads algorithm. var hash = self.hashFirstDegreeQuads(id); // 5.3.2) Add hash and identifier to hash to blank nodes map, // creating a new entry if necessary. if (hash in self.hashToBlankNodes) { self.hashToBlankNodes[hash].push(id); } else { self.hashToBlankNodes[hash] = [id]; } } // 5.4) For each hash to identifier list mapping in hash to blank // nodes map, lexicographically-sorted by hash: var _hashes = Object.keys(self.hashToBlankNodes).sort(); for (var i = 0; i < _hashes.length; ++i) { // 5.4.1) If the length of identifier list is greater than 1, // continue to the next mapping. var _hash = _hashes[i]; var idList = self.hashToBlankNodes[_hash]; if (idList.length > 1) { continue; } // 5.4.2) Use the Issue Identifier algorithm, passing canonical // issuer and the single blank node identifier in identifier // list, identifier, to issue a canonical replacement identifier // for identifier. // TODO: consider changing `getId` to `issue` var _id = idList[0]; self.canonicalIssuer.getId(_id); // 5.4.3) Remove identifier from non-normalized identifiers. delete nonNormalized[_id]; // 5.4.4) Remove hash from the hash to blank nodes map. delete self.hashToBlankNodes[_hash]; // 5.4.5) Set simple to true. simple = true; } } // 6) For each hash to identifier list mapping in hash to blank nodes map, // lexicographically-sorted by hash: var hashes = Object.keys(self.hashToBlankNodes).sort(); for (var _i = 0; _i < hashes.length; ++_i) { // 6.1) Create hash path list where each item will be a result of // running the Hash N-Degree Quads algorithm. var hashPathList = []; // 6.2) For each blank node identifier identifier in identifier list: var _hash2 = hashes[_i]; var _idList = self.hashToBlankNodes[_hash2]; for (var j = 0; j < _idList.length; ++j) { // 6.2.1) If a canonical identifier has already been issued for // identifier, continue to the next identifier. var _id2 = _idList[j]; if (self.canonicalIssuer.hasId(_id2)) { continue; } // 6.2.2) Create temporary issuer, an identifier issuer // initialized with the prefix _:b. var issuer = new IdentifierIssuer('_:b'); // 6.2.3) Use the Issue Identifier algorithm, passing temporary // issuer and identifier, to issue a new temporary blank node // identifier for identifier. issuer.getId(_id2); // 6.2.4) Run the Hash N-Degree Quads algorithm, passing // temporary issuer, and append the result to the hash path list. var result = self.hashNDegreeQuads(_id2, issuer); hashPathList.push(result); } // 6.3) For each result in the hash path list, // lexicographically-sorted by the hash in result: // TODO: use `String.localeCompare`? hashPathList.sort(function (a, b) { return a.hash < b.hash ? -1 : a.hash > b.hash ? 1 : 0; }); for (var _j = 0; _j < hashPathList.length; ++_j) { // 6.3.1) For each blank node identifier, existing identifier, // that was issued a temporary identifier by identifier issuer // in result, issue a canonical identifier, in the same order, // using the Issue Identifier algorithm, passing canonical // issuer and existing identifier. var _result = hashPathList[_j]; for (var existing in _result.issuer.existing) { self.canonicalIssuer.getId(existing); } } } /* Note: At this point all blank nodes in the set of RDF quads have been assigned canonical identifiers, which have been stored in the canonical issuer. Here each quad is updated by assigning each of its blank nodes its new identifier. */ // 7) For each quad, quad, in input dataset: var normalized = []; for (var _i2 = 0; _i2 < self.quads.length; ++_i2) { // 7.1) Create a copy, quad copy, of quad and replace any existing // blank node identifiers using the canonical identifiers // previously issued by canonical issuer. // Note: We optimize away the copy here. var quad = self.quads[_i2]; self.forEachComponent(quad, function (component) { if (component.termType === 'BlankNode' && !component.value.startsWith(self.canonicalIssuer.prefix)) { component.value = self.canonicalIssuer.getId(component.value); } }); // 7.2) Add quad copy to the normalized dataset. normalized.push(NQuads.serializeQuad(quad)); } // sort normalized output normalized.sort(); // 8) Return the normalized dataset. return normalized.join(''); } // 4.6) Hash First Degree Quads }, { key: 'hashFirstDegreeQuads', value: function hashFirstDegreeQuads(id) { var self = this; // return cached hash var info = self.blankNodeInfo[id]; if ('hash' in info) { return info.hash; } // 1) Initialize nquads to an empty list. It will be used to store quads in // N-Quads format. var nquads = []; // 2) Get the list of quads `quads` associated with the reference blank node // identifier in the blank node to quads map. var quads = info.quads; // 3) For each quad `quad` in `quads`: var _loop2 = function _loop2(i) { var quad = quads[i]; // 3.1) Serialize the quad in N-Quads format with the following special // rule: // 3.1.1) If any component in quad is an blank node, then serialize it // using a special identifier as follows: var copy = { predicate: quad.predicate }; self.forEachComponent(quad, function (component, key) { // 3.1.2) If the blank node's existing blank node identifier matches // the reference blank node identifier then use the blank node // identifier _:a, otherwise, use the blank node identifier _:z. copy[key] = self.modifyFirstDegreeComponent(id, component, key); }); nquads.push(NQuads.serializeQuad(copy)); }; for (var i = 0; i < quads.length; ++i) { _loop2(i); } // 4) Sort nquads in lexicographical order. nquads.sort(); // 5) Return the hash that results from passing the sorted, joined nquads // through the hash algorithm. var md = new MessageDigest(self.hashAlgorithm); for (var i = 0; i < nquads.length; ++i) { md.update(nquads[i]); } // TODO: represent as byte buffer instead to cut memory usage in half info.hash = md.digest(); return info.hash; } // 4.7) Hash Related Blank Node }, { key: 'hashRelatedBlankNode', value: function hashRelatedBlankNode(related, quad, issuer, position) { var self = this; // 1) Set the identifier to use for related, preferring first the canonical // identifier for related if issued, second the identifier issued by issuer // if issued, and last, if necessary, the result of the Hash First Degree // Quads algorithm, passing related. var id = void 0; if (self.canonicalIssuer.hasId(related)) { id = self.canonicalIssuer.getId(related); } else if (issuer.hasId(related)) { id = issuer.getId(related); } else { id = self.hashFirstDegreeQuads(related); } // 2) Initialize a string input to the value of position. // Note: We use a hash object instead. var md = new MessageDigest(self.hashAlgorithm); md.update(position); // 3) If position is not g, append <, the value of the predicate in quad, // and > to input. if (position !== 'g') { md.update(self.getRelatedPredicate(quad)); } // 4) Append identifier to input. md.update(id); // 5) Return the hash that results from passing input through the hash // algorithm. // TODO: represent as byte buffer instead to cut memory usage in half return md.digest(); } // 4.8) Hash N-Degree Quads }, { key: 'hashNDegreeQuads', value: function hashNDegreeQuads(id, issuer) { var self = this; // 1) Create a hash to related blank nodes map for storing hashes that // identify related blank nodes. // Note: 2) and 3) handled within `createHashToRelated` var md = new MessageDigest(self.hashAlgorithm); var hashToRelated = self.createHashToRelated(id, issuer); // 4) Create an empty string, data to hash. // Note: We created a hash object `md` above instead. // 5) For each related hash to blank node list mapping in hash to related // blank nodes map, sorted lexicographically by related hash: var hashes = Object.keys(hashToRelated).sort(); for (var i = 0; i < hashes.length; ++i) { // 5.1) Append the related hash to the data to hash. var hash = hashes[i]; md.update(hash); // 5.2) Create a string chosen path. var chosenPath = ''; // 5.3) Create an unset chosen issuer variable. var chosenIssuer = void 0; // 5.4) For each permutation of blank node list: var permutator = new Permutator(hashToRelated[hash]); while (permutator.hasNext()) { var permutation = permutator.next(); // 5.4.1) Create a copy of issuer, issuer copy. var issuerCopy = issuer.clone(); // 5.4.2) Create a string path. var path = ''; // 5.4.3) Create a recursion list, to store blank node identifiers // that must be recursively processed by this algorithm. var recursionList = []; // 5.4.4) For each related in permutation: var nextPermutation = false; for (var j = 0; j < permutation.length; ++j) { // 5.4.4.1) If a canonical identifier has been issued for // related, append it to path. var related = permutation[j]; if (self.canonicalIssuer.hasId(related)) { path += self.canonicalIssuer.getId(related); } else { // 5.4.4.2) Otherwise: // 5.4.4.2.1) If issuer copy has not issued an identifier for // related, append related to recursion list. if (!issuerCopy.hasId(related)) { recursionList.push(related); } // 5.4.4.2.2) Use the Issue Identifier algorithm, passing // issuer copy and related and append the result to path. path += issuerCopy.getId(related); } // 5.4.4.3) If chosen path is not empty and the length of path // is greater than or equal to the length of chosen path and // path is lexicographically greater than chosen path, then // skip to the next permutation. if (chosenPath.length !== 0 && path.length >= chosenPath.length && path > chosenPath) { nextPermutation = true; break; } } if (nextPermutation) { continue; } // 5.4.5) For each related in recursion list: for (var _j2 = 0; _j2 < recursionList.length; ++_j2) { // 5.4.5.1) Set result to the result of recursively executing // the Hash N-Degree Quads algorithm, passing related for // identifier and issuer copy for path identifier issuer. var _related = recursionList[_j2]; var result = self.hashNDegreeQuads(_related, issuerCopy); // 5.4.5.2) Use the Issue Identifier algorithm, passing issuer // copy and related and append the result to path. path += issuerCopy.getId(_related); // 5.4.5.3) Append <, the hash in result, and > to path. path += '<' + result.hash + '>'; // 5.4.5.4) Set issuer copy to the identifier issuer in // result. issuerCopy = result.issuer; // 5.4.5.5) If chosen path is not empty and the length of path // is greater than or equal to the length of chosen path and // path is lexicographically greater than chosen path, then // skip to the next permutation. if (chosenPath.length !== 0 && path.length >= chosenPath.length && path > chosenPath) { nextPermutation = true; break; } } if (nextPermutation) { continue; } // 5.4.6) If chosen path is empty or path is lexicographically // less than chosen path, set chosen path to path and chosen // issuer to issuer copy. if (chosenPath.length === 0 || path < chosenPath) { chosenPath = path; chosenIssuer = issuerCopy; } } // 5.5) Append chosen path to data to hash. md.update(chosenPath); // 5.6) Replace issuer, by reference, with chosen issuer. issuer = chosenIssuer; } // 6) Return issuer and the hash that results from passing data to hash // through the hash algorithm. return { hash: md.digest(), issuer: issuer }; } // helper for modifying component during Hash First Degree Quads }, { key: 'modifyFirstDegreeComponent', value: function modifyFirstDegreeComponent(id, component) { if (component.termType !== 'BlankNode') { return component; } component = util.clone(component); component.value = component.value === id ? '_:a' : '_:z'; return component; } // helper for getting a related predicate }, { key: 'getRelatedPredicate', value: function getRelatedPredicate(quad) { return '<' + quad.predicate.value + '>'; } // helper for creating hash to related blank nodes map }, { key: 'createHashToRelated', value: function createHashToRelated(id, issuer) { var self = this; // 1) Create a hash to related blank nodes map for storing hashes that // identify related blank nodes. var hashToRelated = {}; // 2) Get a reference, quads, to the list of quads in the blank node to // quads map for the key identifier. var quads = self.blankNodeInfo[id].quads; // 3) For each quad in quads: for (var i = 0; i < quads.length; ++i) { // 3.1) For each component in quad, if component is the subject, object, // and graph name and it is a blank node that is not identified by // identifier: var quad = quads[i]; for (var key in quad) { var component = quad[key]; if (key === 'predicate' || !(component.termType === 'BlankNode' && component.value !== id)) { continue; } // 3.1.1) Set hash to the result of the Hash Related Blank Node // algorithm, passing the blank node identifier for component as // related, quad, path identifier issuer as issuer, and position as // either s, o, or g based on whether component is a subject, object, // graph name, respectively. var related = component.value; var position = POSITIONS[key]; var hash = self.hashRelatedBlankNode(related, quad, issuer, position); // 3.1.2) Add a mapping of hash to the blank node identifier for // component to hash to related blank nodes map, adding an entry as // necessary. if (hash in hashToRelated) { hashToRelated[hash].push(related); } else { hashToRelated[hash] = [related]; } } } return hashToRelated; } // helper that iterates over quad components (skips predicate) }, { key: 'forEachComponent', value: function forEachComponent(quad, op) { for (var key in quad) { // skip `predicate` if (key === 'predicate') { continue; } op(quad[key], key, quad); } } }]); return URDNA2015Sync; }(); /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(74); __webpack_require__(75); __webpack_require__(78); __webpack_require__(81); __webpack_require__(104); __webpack_require__(109); module.exports = __webpack_require__(118); /***/ }), /* 74 */ /***/ (function(module, exports) { /** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ !(function(global) { "use strict"; var Op = Object.prototype; var hasOwn = Op.hasOwnProperty; var undefined; // More compressible than void 0. var $Symbol = typeof Symbol === "function" ? Symbol : {}; var iteratorSymbol = $Symbol.iterator || "@@iterator"; var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; var inModule = typeof module === "object"; var runtime = global.regeneratorRuntime; if (runtime) { if (inModule) { // If regeneratorRuntime is defined globally and we're in a module, // make the exports object identical to regeneratorRuntime. module.exports = runtime; } // Don't bother evaluating the rest of this file if the runtime was // already defined globally. return; } // Define the runtime globally (as expected by generated code) as either // module.exports (if we're in a module) or a new, empty object. runtime = global.regeneratorRuntime = inModule ? module.exports : {}; function wrap(innerFn, outerFn, self, tryLocsList) { // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; var generator = Object.create(protoGenerator.prototype); var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next, // .throw, and .return methods. generator._invoke = makeInvokeMethod(innerFn, self, context); return generator; } runtime.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion // record like context.tryEntries[i].completion. This interface could // have been (and was previously) designed to take a closure to be // invoked without arguments, but in all the cases we care about we // already have an existing method we want to call, so there's no need // to create a new function object. We can even get away with assuming // the method takes exactly one argument, since that happens to be true // in every case, so we don't have to touch the arguments object. The // only additional allocation required is the completion record, which // has a stable shape and so hopefully should be cheap to allocate. function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } var GenStateSuspendedStart = "suspendedStart"; var GenStateSuspendedYield = "suspendedYield"; var GenStateExecuting = "executing"; var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as // breaking out of the dispatch switch statement. var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and // .constructor.prototype properties for functions that return Generator // objects. For full spec compliance, you may wish to configure your // minifier not to mangle the names of these two functions. function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that // don't natively support it. var IteratorPrototype = {}; IteratorPrototype[iteratorSymbol] = function () { return this; }; var getProto = Object.getPrototypeOf; var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { // This environment has a native %IteratorPrototype%; use it instead // of the polyfill. IteratorPrototype = NativeIteratorPrototype; } var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; GeneratorFunctionPrototype.constructor = GeneratorFunction; GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction"; // Helper for defining the .next, .throw, and .return methods of the // Iterator interface in terms of a single ._invoke method. function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function(method) { prototype[method] = function(arg) { return this._invoke(method, arg); }; }); } runtime.isGeneratorFunction = function(genFun) { var ctor = typeof genFun === "function" && genFun.constructor; return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can // do is to check its .name property. (ctor.displayName || ctor.name) === "GeneratorFunction" : false; }; runtime.mark = function(genFun) { if (Object.setPrototypeOf) { Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); } else { genFun.__proto__ = GeneratorFunctionPrototype; if (!(toStringTagSymbol in genFun)) { genFun[toStringTagSymbol] = "GeneratorFunction"; } } genFun.prototype = Object.create(Gp); return genFun; }; // Within the body of any async function, `await x` is transformed to // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test // `hasOwn.call(value, "__await")` to determine if the yielded value is // meant to be awaited. runtime.awrap = function(arg) { return { __await: arg }; }; function AsyncIterator(generator) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (record.type === "throw") { reject(record.arg); } else { var result = record.arg; var value = result.value; if (value && typeof value === "object" && hasOwn.call(value, "__await")) { return Promise.resolve(value.__await).then(function(value) { invoke("next", value, resolve, reject); }, function(err) { invoke("throw", err, resolve, reject); }); } return Promise.resolve(value).then(function(unwrapped) { // When a yielded Promise is resolved, its final value becomes // the .value of the Promise<{value,done}> result for the // current iteration. If the Promise is rejected, however, the // result for this iteration will be rejected with the same // reason. Note that rejections of yielded Promises are not // thrown back into the generator function, as is the case // when an awaited Promise is rejected. This difference in // behavior between yield and await is important, because it // allows the consumer to decide what to do with the yielded // rejection (swallow it and continue, manually .throw it back // into the generator, abandon iteration, whatever). With // await, by contrast, there is no opportunity to examine the // rejection reason outside the generator function, so the // only option is to throw it from the await expression, and // let the generator function handle the exception. result.value = unwrapped; resolve(result); }, reject); } } var previousPromise; function enqueue(method, arg) { function callInvokeWithMethodAndArg() { return new Promise(function(resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = // If enqueue has been called before, then we want to wait until // all previous Promises have been resolved before calling invoke, // so that results are always delivered in the correct order. If // enqueue has not been called before, then it is important to // call invoke immediately, without waiting on a callback to fire, // so that the async generator function has the opportunity to do // any necessary setup in a predictable way. This predictability // is why the Promise constructor synchronously invokes its // executor callback, and why async functions synchronously // execute code before the first await. Since we implement simple // async functions in terms of async generators, it is especially // important to get this right, even though it requires care. previousPromise ? previousPromise.then( callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later // invocations of the iterator. callInvokeWithMethodAndArg ) : callInvokeWithMethodAndArg(); } // Define the unified helper method that is used to implement .next, // .throw, and .return (see defineIteratorMethods). this._invoke = enqueue; } defineIteratorMethods(AsyncIterator.prototype); AsyncIterator.prototype[asyncIteratorSymbol] = function () { return this; }; runtime.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of // AsyncIterator objects; they just return a Promise for the value of // the final result produced by the iterator. runtime.async = function(innerFn, outerFn, self, tryLocsList) { var iter = new AsyncIterator( wrap(innerFn, outerFn, self, tryLocsList) ); return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator. : iter.next().then(function(result) { return result.done ? result.value : iter.next(); }); }; function makeInvokeMethod(innerFn, self, context) { var state = GenStateSuspendedStart; return function invoke(method, arg) { if (state === GenStateExecuting) { throw new Error("Generator is already running"); } if (state === GenStateCompleted) { if (method === "throw") { throw arg; } // Be forgiving, per 25.3.3.3.3 of the spec: // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume return doneResult(); } context.method = method; context.arg = arg; while (true) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (context.method === "next") { // Setting context._sent for legacy support of Babel's // function.sent implementation. context.sent = context._sent = context.arg; } else if (context.method === "throw") { if (state === GenStateSuspendedStart) { state = GenStateCompleted; throw context.arg; } context.dispatchException(context.arg); } else if (context.method === "return") { context.abrupt("return", context.arg); } state = GenStateExecuting; var record = tryCatch(innerFn, self, context); if (record.type === "normal") { // If an exception is thrown from innerFn, we leave state === // GenStateExecuting and loop back for another invocation. state = context.done ? GenStateCompleted : GenStateSuspendedYield; if (record.arg === ContinueSentinel) { continue; } return { value: record.arg, done: context.done }; } else if (record.type === "throw") { state = GenStateCompleted; // Dispatch the exception by looping back around to the // context.dispatchException(context.arg) call above. context.method = "throw"; context.arg = record.arg; } } }; } // Call delegate.iterator[context.method](context.arg) and handle the // result, either by returning a { value, done } result from the // delegate iterator, or by modifying context.method and context.arg, // setting context.delegate to null, and returning the ContinueSentinel. function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (method === undefined) { // A .throw or .return when the delegate iterator has no .throw // method always terminates the yield* loop. context.delegate = null; if (context.method === "throw") { if (delegate.iterator.return) { // If the delegate iterator has a return method, give it a // chance to clean up. context.method = "return"; context.arg = undefined; maybeInvokeDelegate(delegate, context); if (context.method === "throw") { // If maybeInvokeDelegate(context) changed context.method from // "return" to "throw", let that override the TypeError below. return ContinueSentinel; } } context.method = "throw"; context.arg = new TypeError( "The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if (record.type === "throw") { context.method = "throw"; context.arg = record.arg; context.delegate = null; return ContinueSentinel; } var info = record.arg; if (! info) { context.method = "throw"; context.arg = new TypeError("iterator result is not an object"); context.delegate = null; return ContinueSentinel; } if (info.done) { // Assign the result of the finished delegate to the temporary // variable specified by delegate.resultName (see delegateYield). context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield). context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the // exception, let the outer generator proceed normally. If // context.method was "next", forget context.arg since it has been // "consumed" by the delegate iterator. If context.method was // "return", allow the original .return call to continue in the // outer generator. if (context.method !== "return") { context.method = "next"; context.arg = undefined; } } else { // Re-yield the result returned by the delegate method. return info; } // The delegate iterator is finished, so forget it and continue with // the outer generator. context.delegate = null; return ContinueSentinel; } // Define Generator.prototype.{next,throw,return} in terms of the // unified ._invoke helper method. defineIteratorMethods(Gp); Gp[toStringTagSymbol] = "Generator"; // A Generator should always return itself as the iterator object when the // @@iterator function is called on it. Some browsers' implementations of the // iterator prototype chain incorrectly implement this, causing the Generator // object to not be returned from this call. This ensures that doesn't happen. // See https://github.com/facebook/regenerator/issues/274 for more details. Gp[iteratorSymbol] = function() { return this; }; Gp.toString = function() { return "[object Generator]"; }; function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; if (1 in locs) { entry.catchLoc = locs[1]; } if (2 in locs) { entry.finallyLoc = locs[2]; entry.afterLoc = locs[3]; } this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal"; delete record.arg; entry.completion = record; } function Context(tryLocsList) { // The root entry object (effectively a try statement without a catch // or a finally block) gives us a place to store values thrown from // locations where there is no enclosing try statement. this.tryEntries = [{ tryLoc: "root" }]; tryLocsList.forEach(pushTryEntry, this); this.reset(true); } runtime.keys = function(object) { var keys = []; for (var key in object) { keys.push(key); } keys.reverse(); // Rather than returning an object with a next method, we keep // things simple and return the next function itself. return function next() { while (keys.length) { var key = keys.pop(); if (key in object) { next.value = key; next.done = false; return next; } } // To avoid creating an additional object, we just hang the .value // and .done properties off the next function object itself. This // also ensures that the minifier will not anonymize the function. next.done = true; return next; }; }; function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) { return iteratorMethod.call(iterable); } if (typeof iterable.next === "function") { return iterable; } if (!isNaN(iterable.length)) { var i = -1, next = function next() { while (++i < iterable.length) { if (hasOwn.call(iterable, i)) { next.value = iterable[i]; next.done = false; return next; } } next.value = undefined; next.done = true; return next; }; return next.next = next; } } // Return an iterator with no values. return { next: doneResult }; } runtime.values = values; function doneResult() { return { value: undefined, done: true }; } Context.prototype = { constructor: Context, reset: function(skipTempReset) { this.prev = 0; this.next = 0; // Resetting context._sent for legacy support of Babel's // function.sent implementation. this.sent = this._sent = undefined; this.done = false; this.delegate = null; this.method = "next"; this.arg = undefined; this.tryEntries.forEach(resetTryEntry); if (!skipTempReset) { for (var name in this) { // Not sure about the optimal order of these conditions: if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { this[name] = undefined; } } } }, stop: function() { this.done = true; var rootEntry = this.tryEntries[0]; var rootRecord = rootEntry.completion; if (rootRecord.type === "throw") { throw rootRecord.arg; } return this.rval; }, dispatchException: function(exception) { if (this.done) { throw exception; } var context = this; function handle(loc, caught) { record.type = "throw"; record.arg = exception; context.next = loc; if (caught) { // If the dispatched exception was caught by a catch block, // then let that catch block handle the exception normally. context.method = "next"; context.arg = undefined; } return !! caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; var record = entry.completion; if (entry.tryLoc === "root") { // Exception thrown outside of any try block that could handle // it, so set the completion value of the entire function to // throw the exception. return handle("end"); } if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"); var hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } else if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else if (hasCatch) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } } else if (hasFinally) { if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else { throw new Error("try statement without catch or finally"); } } } }, abrupt: function(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { // Ignore the finally entry if control is not jumping to a // location outside the try/catch block. finallyEntry = null; } var record = finallyEntry ? finallyEntry.completion : {}; record.type = type; record.arg = arg; if (finallyEntry) { this.method = "next"; this.next = finallyEntry.finallyLoc; return ContinueSentinel; } return this.complete(record); }, complete: function(record, afterLoc) { if (record.type === "throw") { throw record.arg; } if (record.type === "break" || record.type === "continue") { this.next = record.arg; } else if (record.type === "return") { this.rval = this.arg = record.arg; this.method = "return"; this.next = "end"; } else if (record.type === "normal" && afterLoc) { this.next = afterLoc; } return ContinueSentinel; }, finish: function(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) { this.complete(entry.completion, entry.afterLoc); resetTryEntry(entry); return ContinueSentinel; } } }, "catch": function(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (record.type === "throw") { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } // The context.catch method must only be called with a location // argument that corresponds to a known catch block. throw new Error("illegal catch attempt"); }, delegateYield: function(iterable, resultName, nextLoc) { this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }; if (this.method === "next") { // Deliberately forget the last sent value so that we don't // accidentally pass it on to the delegate. this.arg = undefined; } return ContinueSentinel; } }; })( // In sloppy mode, unbound `this` refers to the global object, fallback to // Function constructor if we're in global strict mode. That is sadly a form // of indirect eval which violates Content Security Policy. (function() { return this })() || Function("return this")() ); /***/ }), /* 75 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(76); module.exports = __webpack_require__(2).Array.includes; /***/ }), /* 76 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/Array.prototype.includes var $export = __webpack_require__(7); var $includes = __webpack_require__(52)(true); $export($export.P, 'Array', { includes: function includes(el /* , fromIndex = 0 */) { return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); } }); __webpack_require__(54)('includes'); /***/ }), /* 77 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(37); var max = Math.max; var min = Math.min; module.exports = function (index, length) { index = toInteger(index); return index < 0 ? max(index + length, 0) : min(index, length); }; /***/ }), /* 78 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(79); module.exports = __webpack_require__(2).Object.assign; /***/ }), /* 79 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.3.1 Object.assign(target, source) var $export = __webpack_require__(7); $export($export.S + $export.F, 'Object', { assign: __webpack_require__(80) }); /***/ }), /* 80 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 19.1.2.1 Object.assign(target, source, ...) var getKeys = __webpack_require__(22); var gOPS = __webpack_require__(41); var pIE = __webpack_require__(31); var toObject = __webpack_require__(56); var IObject = __webpack_require__(53); var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug) module.exports = !$assign || __webpack_require__(19)(function () { var A = {}; var B = {}; // eslint-disable-next-line no-undef var S = Symbol(); var K = 'abcdefghijklmnopqrst'; A[S] = 7; K.split('').forEach(function (k) { B[k] = k; }); return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; }) ? function assign(target, source) { // eslint-disable-line no-unused-vars var T = toObject(target); var aLen = arguments.length; var index = 1; var getSymbols = gOPS.f; var isEnum = pIE.f; while (aLen > index) { var S = IObject(arguments[index++]); var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); var length = keys.length; var j = 0; var key; while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; } return T; } : $assign; /***/ }), /* 81 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(57); __webpack_require__(82); __webpack_require__(87); __webpack_require__(90); __webpack_require__(102); __webpack_require__(103); module.exports = __webpack_require__(2).Promise; /***/ }), /* 82 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $at = __webpack_require__(83)(true); // 21.1.3.27 String.prototype[@@iterator]() __webpack_require__(58)(String, 'String', function (iterated) { this._t = String(iterated); // target this._i = 0; // next index // 21.1.5.2.1 %StringIteratorPrototype%.next() }, function () { var O = this._t; var index = this._i; var point; if (index >= O.length) return { value: undefined, done: true }; point = $at(O, index); this._i += point.length; return { value: point, done: false }; }); /***/ }), /* 83 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(37); var defined = __webpack_require__(30); // true -> String#at // false -> String#codePointAt module.exports = function (TO_STRING) { return function (that, pos) { var s = String(defined(that)); var i = toInteger(pos); var l = s.length; var a, b; if (i < 0 || i >= l) return TO_STRING ? '' : undefined; a = s.charCodeAt(i); return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; }; }; /***/ }), /* 84 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var create = __webpack_require__(59); var descriptor = __webpack_require__(27); var setToStringTag = __webpack_require__(32); var IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() __webpack_require__(10)(IteratorPrototype, __webpack_require__(0)('iterator'), function () { return this; }); module.exports = function (Constructor, NAME, next) { Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); setToStringTag(Constructor, NAME + ' Iterator'); }; /***/ }), /* 85 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(11); var anObject = __webpack_require__(8); var getKeys = __webpack_require__(22); module.exports = __webpack_require__(12) ? Object.defineProperties : function defineProperties(O, Properties) { anObject(O); var keys = getKeys(Properties); var length = keys.length; var i = 0; var P; while (length > i) dP.f(O, P = keys[i++], Properties[P]); return O; }; /***/ }), /* 86 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) var has = __webpack_require__(13); var toObject = __webpack_require__(56); var IE_PROTO = __webpack_require__(39)('IE_PROTO'); var ObjectProto = Object.prototype; module.exports = Object.getPrototypeOf || function (O) { O = toObject(O); if (has(O, IE_PROTO)) return O[IE_PROTO]; if (typeof O.constructor == 'function' && O instanceof O.constructor) { return O.constructor.prototype; } return O instanceof Object ? ObjectProto : null; }; /***/ }), /* 87 */ /***/ (function(module, exports, __webpack_require__) { var $iterators = __webpack_require__(88); var getKeys = __webpack_require__(22); var redefine = __webpack_require__(16); var global = __webpack_require__(1); var hide = __webpack_require__(10); var Iterators = __webpack_require__(23); var wks = __webpack_require__(0); var ITERATOR = wks('iterator'); var TO_STRING_TAG = wks('toStringTag'); var ArrayValues = Iterators.Array; var DOMIterables = { CSSRuleList: true, // TODO: Not spec compliant, should be false. CSSStyleDeclaration: false, CSSValueList: false, ClientRectList: false, DOMRectList: false, DOMStringList: false, DOMTokenList: true, DataTransferItemList: false, FileList: false, HTMLAllCollection: false, HTMLCollection: false, HTMLFormElement: false, HTMLSelectElement: false, MediaList: true, // TODO: Not spec compliant, should be false. MimeTypeArray: false, NamedNodeMap: false, NodeList: true, PaintRequestList: false, Plugin: false, PluginArray: false, SVGLengthList: false, SVGNumberList: false, SVGPathSegList: false, SVGPointList: false, SVGStringList: false, SVGTransformList: false, SourceBufferList: false, StyleSheetList: true, // TODO: Not spec compliant, should be false. TextTrackCueList: false, TextTrackList: false, TouchList: false }; for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) { var NAME = collections[i]; var explicit = DOMIterables[NAME]; var Collection = global[NAME]; var proto = Collection && Collection.prototype; var key; if (proto) { if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues); if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); Iterators[NAME] = ArrayValues; if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true); } } /***/ }), /* 88 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var addToUnscopables = __webpack_require__(54); var step = __webpack_require__(89); var Iterators = __webpack_require__(23); var toIObject = __webpack_require__(17); // 22.1.3.4 Array.prototype.entries() // 22.1.3.13 Array.prototype.keys() // 22.1.3.29 Array.prototype.values() // 22.1.3.30 Array.prototype[@@iterator]() module.exports = __webpack_require__(58)(Array, 'Array', function (iterated, kind) { this._t = toIObject(iterated); // target this._i = 0; // next index this._k = kind; // kind // 22.1.5.2.1 %ArrayIteratorPrototype%.next() }, function () { var O = this._t; var kind = this._k; var index = this._i++; if (!O || index >= O.length) { this._t = undefined; return step(1); } if (kind == 'keys') return step(0, index); if (kind == 'values') return step(0, O[index]); return step(0, [index, O[index]]); }, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) Iterators.Arguments = Iterators.Array; addToUnscopables('keys'); addToUnscopables('values'); addToUnscopables('entries'); /***/ }), /* 89 */ /***/ (function(module, exports) { module.exports = function (done, value) { return { value: value, done: !!done }; }; /***/ }), /* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var LIBRARY = __webpack_require__(21); var global = __webpack_require__(1); var ctx = __webpack_require__(28); var classof = __webpack_require__(42); var $export = __webpack_require__(7); var isObject = __webpack_require__(9); var aFunction = __webpack_require__(29); var anInstance = __webpack_require__(91); var forOf = __webpack_require__(92); var speciesConstructor = __webpack_require__(61); var task = __webpack_require__(62).set; var microtask = __webpack_require__(97)(); var newPromiseCapabilityModule = __webpack_require__(43); var perform = __webpack_require__(63); var userAgent = __webpack_require__(98); var promiseResolve = __webpack_require__(64); var PROMISE = 'Promise'; var TypeError = global.TypeError; var process = global.process; var versions = process && process.versions; var v8 = versions && versions.v8 || ''; var $Promise = global[PROMISE]; var isNode = classof(process) == 'process'; var empty = function () { /* empty */ }; var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f; var USE_NATIVE = !!function () { try { // correct subclassing with @@species support var promise = $Promise.resolve(1); var FakePromise = (promise.constructor = {})[__webpack_require__(0)('species')] = function (exec) { exec(empty, empty); }; // unhandled rejections tracking support, NodeJS Promise without it fails @@species test return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 // we can't detect it synchronously, so just check versions && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1; } catch (e) { /* empty */ } }(); // helpers var isThenable = function (it) { var then; return isObject(it) && typeof (then = it.then) == 'function' ? then : false; }; var notify = function (promise, isReject) { if (promise._n) return; promise._n = true; var chain = promise._c; microtask(function () { var value = promise._v; var ok = promise._s == 1; var i = 0; var run = function (reaction) { var handler = ok ? reaction.ok : reaction.fail; var resolve = reaction.resolve; var reject = reaction.reject; var domain = reaction.domain; var result, then, exited; try { if (handler) { if (!ok) { if (promise._h == 2) onHandleUnhandled(promise); promise._h = 1; } if (handler === true) result = value; else { if (domain) domain.enter(); result = handler(value); // may throw if (domain) { domain.exit(); exited = true; } } if (result === reaction.promise) { reject(TypeError('Promise-chain cycle')); } else if (then = isThenable(result)) { then.call(result, resolve, reject); } else resolve(result); } else reject(value); } catch (e) { if (domain && !exited) domain.exit(); reject(e); } }; while (chain.length > i) run(chain[i++]); // variable length - can't use forEach promise._c = []; promise._n = false; if (isReject && !promise._h) onUnhandled(promise); }); }; var onUnhandled = function (promise) { task.call(global, function () { var value = promise._v; var unhandled = isUnhandled(promise); var result, handler, console; if (unhandled) { result = perform(function () { if (isNode) { process.emit('unhandledRejection', value, promise); } else if (handler = global.onunhandledrejection) { handler({ promise: promise, reason: value }); } else if ((console = global.console) && console.error) { console.error('Unhandled promise rejection', value); } }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should promise._h = isNode || isUnhandled(promise) ? 2 : 1; } promise._a = undefined; if (unhandled && result.e) throw result.v; }); }; var isUnhandled = function (promise) { return promise._h !== 1 && (promise._a || promise._c).length === 0; }; var onHandleUnhandled = function (promise) { task.call(global, function () { var handler; if (isNode) { process.emit('rejectionHandled', promise); } else if (handler = global.onrejectionhandled) { handler({ promise: promise, reason: promise._v }); } }); }; var $reject = function (value) { var promise = this; if (promise._d) return; promise._d = true; promise = promise._w || promise; // unwrap promise._v = value; promise._s = 2; if (!promise._a) promise._a = promise._c.slice(); notify(promise, true); }; var $resolve = function (value) { var promise = this; var then; if (promise._d) return; promise._d = true; promise = promise._w || promise; // unwrap try { if (promise === value) throw TypeError("Promise can't be resolved itself"); if (then = isThenable(value)) { microtask(function () { var wrapper = { _w: promise, _d: false }; // wrap try { then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); } catch (e) { $reject.call(wrapper, e); } }); } else { promise._v = value; promise._s = 1; notify(promise, false); } } catch (e) { $reject.call({ _w: promise, _d: false }, e); // wrap } }; // constructor polyfill if (!USE_NATIVE) { // 25.4.3.1 Promise(executor) $Promise = function Promise(executor) { anInstance(this, $Promise, PROMISE, '_h'); aFunction(executor); Internal.call(this); try { executor(ctx($resolve, this, 1), ctx($reject, this, 1)); } catch (err) { $reject.call(this, err); } }; // eslint-disable-next-line no-unused-vars Internal = function Promise(executor) { this._c = []; // <- awaiting reactions this._a = undefined; // <- checked in isUnhandled reactions this._s = 0; // <- state this._d = false; // <- done this._v = undefined; // <- value this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled this._n = false; // <- notify }; Internal.prototype = __webpack_require__(99)($Promise.prototype, { // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) then: function then(onFulfilled, onRejected) { var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; reaction.fail = typeof onRejected == 'function' && onRejected; reaction.domain = isNode ? process.domain : undefined; this._c.push(reaction); if (this._a) this._a.push(reaction); if (this._s) notify(this, false); return reaction.promise; }, // 25.4.5.1 Promise.prototype.catch(onRejected) 'catch': function (onRejected) { return this.then(undefined, onRejected); } }); OwnPromiseCapability = function () { var promise = new Internal(); this.promise = promise; this.resolve = ctx($resolve, promise, 1); this.reject = ctx($reject, promise, 1); }; newPromiseCapabilityModule.f = newPromiseCapability = function (C) { return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C); }; } $export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise }); __webpack_require__(32)($Promise, PROMISE); __webpack_require__(100)(PROMISE); Wrapper = __webpack_require__(2)[PROMISE]; // statics $export($export.S + $export.F * !USE_NATIVE, PROMISE, { // 25.4.4.5 Promise.reject(r) reject: function reject(r) { var capability = newPromiseCapability(this); var $$reject = capability.reject; $$reject(r); return capability.promise; } }); $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { // 25.4.4.6 Promise.resolve(x) resolve: function resolve(x) { return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); } }); $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(101)(function (iter) { $Promise.all(iter)['catch'](empty); })), PROMISE, { // 25.4.4.1 Promise.all(iterable) all: function all(iterable) { var C = this; var capability = newPromiseCapability(C); var resolve = capability.resolve; var reject = capability.reject; var result = perform(function () { var values = []; var index = 0; var remaining = 1; forOf(iterable, false, function (promise) { var $index = index++; var alreadyCalled = false; values.push(undefined); remaining++; C.resolve(promise).then(function (value) { if (alreadyCalled) return; alreadyCalled = true; values[$index] = value; --remaining || resolve(values); }, reject); }); --remaining || resolve(values); }); if (result.e) reject(result.v); return capability.promise; }, // 25.4.4.4 Promise.race(iterable) race: function race(iterable) { var C = this; var capability = newPromiseCapability(C); var reject = capability.reject; var result = perform(function () { forOf(iterable, false, function (promise) { C.resolve(promise).then(capability.resolve, reject); }); }); if (result.e) reject(result.v); return capability.promise; } }); /***/ }), /* 91 */ /***/ (function(module, exports) { module.exports = function (it, Constructor, name, forbiddenField) { if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { throw TypeError(name + ': incorrect invocation!'); } return it; }; /***/ }), /* 92 */ /***/ (function(module, exports, __webpack_require__) { var ctx = __webpack_require__(28); var call = __webpack_require__(93); var isArrayIter = __webpack_require__(94); var anObject = __webpack_require__(8); var toLength = __webpack_require__(36); var getIterFn = __webpack_require__(95); var BREAK = {}; var RETURN = {}; var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable); var f = ctx(fn, that, entries ? 2 : 1); var index = 0; var length, step, iterator, result; if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); // fast case for arrays with default iterator if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); if (result === BREAK || result === RETURN) return result; } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { result = call(iterator, f, step.value, entries); if (result === BREAK || result === RETURN) return result; } }; exports.BREAK = BREAK; exports.RETURN = RETURN; /***/ }), /* 93 */ /***/ (function(module, exports, __webpack_require__) { // call something on iterator step with safe closing on error var anObject = __webpack_require__(8); module.exports = function (iterator, fn, value, entries) { try { return entries ? fn(anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion) } catch (e) { var ret = iterator['return']; if (ret !== undefined) anObject(ret.call(iterator)); throw e; } }; /***/ }), /* 94 */ /***/ (function(module, exports, __webpack_require__) { // check on default Array iterator var Iterators = __webpack_require__(23); var ITERATOR = __webpack_require__(0)('iterator'); var ArrayProto = Array.prototype; module.exports = function (it) { return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); }; /***/ }), /* 95 */ /***/ (function(module, exports, __webpack_require__) { var classof = __webpack_require__(42); var ITERATOR = __webpack_require__(0)('iterator'); var Iterators = __webpack_require__(23); module.exports = __webpack_require__(2).getIteratorMethod = function (it) { if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)]; }; /***/ }), /* 96 */ /***/ (function(module, exports) { // fast apply, http://jsperf.lnkit.com/fast-apply/5 module.exports = function (fn, args, that) { var un = that === undefined; switch (args.length) { case 0: return un ? fn() : fn.call(that); case 1: return un ? fn(args[0]) : fn.call(that, args[0]); case 2: return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]); case 3: return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]); case 4: return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]); } return fn.apply(that, args); }; /***/ }), /* 97 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(1); var macrotask = __webpack_require__(62).set; var Observer = global.MutationObserver || global.WebKitMutationObserver; var process = global.process; var Promise = global.Promise; var isNode = __webpack_require__(18)(process) == 'process'; module.exports = function () { var head, last, notify; var flush = function () { var parent, fn; if (isNode && (parent = process.domain)) parent.exit(); while (head) { fn = head.fn; head = head.next; try { fn(); } catch (e) { if (head) notify(); else last = undefined; throw e; } } last = undefined; if (parent) parent.enter(); }; // Node.js if (isNode) { notify = function () { process.nextTick(flush); }; // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 } else if (Observer && !(global.navigator && global.navigator.standalone)) { var toggle = true; var node = document.createTextNode(''); new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new notify = function () { node.data = toggle = !toggle; }; // environments with maybe non-completely correct, but existent Promise } else if (Promise && Promise.resolve) { // Promise.resolve without an argument throws an error in LG WebOS 2 var promise = Promise.resolve(undefined); notify = function () { promise.then(flush); }; // for other environments - macrotask based on: // - setImmediate // - MessageChannel // - window.postMessag // - onreadystatechange // - setTimeout } else { notify = function () { // strange IE + webpack dev server bug - use .call(global) macrotask.call(global, flush); }; } return function (fn) { var task = { fn: fn, next: undefined }; if (last) last.next = task; if (!head) { head = task; notify(); } last = task; }; }; /***/ }), /* 98 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(1); var navigator = global.navigator; module.exports = navigator && navigator.userAgent || ''; /***/ }), /* 99 */ /***/ (function(module, exports, __webpack_require__) { var redefine = __webpack_require__(16); module.exports = function (target, src, safe) { for (var key in src) redefine(target, key, src[key], safe); return target; }; /***/ }), /* 100 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(1); var dP = __webpack_require__(11); var DESCRIPTORS = __webpack_require__(12); var SPECIES = __webpack_require__(0)('species'); module.exports = function (KEY) { var C = global[KEY]; if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { configurable: true, get: function () { return this; } }); }; /***/ }), /* 101 */ /***/ (function(module, exports, __webpack_require__) { var ITERATOR = __webpack_require__(0)('iterator'); var SAFE_CLOSING = false; try { var riter = [7][ITERATOR](); riter['return'] = function () { SAFE_CLOSING = true; }; // eslint-disable-next-line no-throw-literal Array.from(riter, function () { throw 2; }); } catch (e) { /* empty */ } module.exports = function (exec, skipClosing) { if (!skipClosing && !SAFE_CLOSING) return false; var safe = false; try { var arr = [7]; var iter = arr[ITERATOR](); iter.next = function () { return { done: safe = true }; }; arr[ITERATOR] = function () { return iter; }; exec(arr); } catch (e) { /* empty */ } return safe; }; /***/ }), /* 102 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/proposal-promise-finally var $export = __webpack_require__(7); var core = __webpack_require__(2); var global = __webpack_require__(1); var speciesConstructor = __webpack_require__(61); var promiseResolve = __webpack_require__(64); $export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) { var C = speciesConstructor(this, core.Promise || global.Promise); var isFunction = typeof onFinally == 'function'; return this.then( isFunction ? function (x) { return promiseResolve(C, onFinally()).then(function () { return x; }); } : onFinally, isFunction ? function (e) { return promiseResolve(C, onFinally()).then(function () { throw e; }); } : onFinally ); } }); /***/ }), /* 103 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/proposal-promise-try var $export = __webpack_require__(7); var newPromiseCapability = __webpack_require__(43); var perform = __webpack_require__(63); $export($export.S, 'Promise', { 'try': function (callbackfn) { var promiseCapability = newPromiseCapability.f(this); var result = perform(callbackfn); (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v); return promiseCapability.promise; } }); /***/ }), /* 104 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(105); module.exports = __webpack_require__(2).String.startsWith; /***/ }), /* 105 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 21.1.3.18 String.prototype.startsWith(searchString [, position ]) var $export = __webpack_require__(7); var toLength = __webpack_require__(36); var context = __webpack_require__(106); var STARTS_WITH = 'startsWith'; var $startsWith = ''[STARTS_WITH]; $export($export.P + $export.F * __webpack_require__(108)(STARTS_WITH), 'String', { startsWith: function startsWith(searchString /* , position = 0 */) { var that = context(this, searchString, STARTS_WITH); var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); var search = String(searchString); return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search; } }); /***/ }), /* 106 */ /***/ (function(module, exports, __webpack_require__) { // helper for String#{startsWith, endsWith, includes} var isRegExp = __webpack_require__(107); var defined = __webpack_require__(30); module.exports = function (that, searchString, NAME) { if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); return String(defined(that)); }; /***/ }), /* 107 */ /***/ (function(module, exports, __webpack_require__) { // 7.2.8 IsRegExp(argument) var isObject = __webpack_require__(9); var cof = __webpack_require__(18); var MATCH = __webpack_require__(0)('match'); module.exports = function (it) { var isRegExp; return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp'); }; /***/ }), /* 108 */ /***/ (function(module, exports, __webpack_require__) { var MATCH = __webpack_require__(0)('match'); module.exports = function (KEY) { var re = /./; try { '/./'[KEY](re); } catch (e) { try { re[MATCH] = false; return !'/./'[KEY](re); } catch (f) { /* empty */ } } return true; }; /***/ }), /* 109 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(110); __webpack_require__(57); __webpack_require__(116); __webpack_require__(117); module.exports = __webpack_require__(2).Symbol; /***/ }), /* 110 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // ECMAScript 6 symbols shim var global = __webpack_require__(1); var has = __webpack_require__(13); var DESCRIPTORS = __webpack_require__(12); var $export = __webpack_require__(7); var redefine = __webpack_require__(16); var META = __webpack_require__(111).KEY; var $fails = __webpack_require__(19); var shared = __webpack_require__(38); var setToStringTag = __webpack_require__(32); var uid = __webpack_require__(20); var wks = __webpack_require__(0); var wksExt = __webpack_require__(65); var wksDefine = __webpack_require__(44); var enumKeys = __webpack_require__(112); var isArray = __webpack_require__(113); var anObject = __webpack_require__(8); var isObject = __webpack_require__(9); var toIObject = __webpack_require__(17); var toPrimitive = __webpack_require__(35); var createDesc = __webpack_require__(27); var _create = __webpack_require__(59); var gOPNExt = __webpack_require__(114); var $GOPD = __webpack_require__(115); var $DP = __webpack_require__(11); var $keys = __webpack_require__(22); var gOPD = $GOPD.f; var dP = $DP.f; var gOPN = gOPNExt.f; var $Symbol = global.Symbol; var $JSON = global.JSON; var _stringify = $JSON && $JSON.stringify; var PROTOTYPE = 'prototype'; var HIDDEN = wks('_hidden'); var TO_PRIMITIVE = wks('toPrimitive'); var isEnum = {}.propertyIsEnumerable; var SymbolRegistry = shared('symbol-registry'); var AllSymbols = shared('symbols'); var OPSymbols = shared('op-symbols'); var ObjectProto = Object[PROTOTYPE]; var USE_NATIVE = typeof $Symbol == 'function'; var QObject = global.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 var setSymbolDesc = DESCRIPTORS && $fails(function () { return _create(dP({}, 'a', { get: function () { return dP(this, 'a', { value: 7 }).a; } })).a != 7; }) ? function (it, key, D) { var protoDesc = gOPD(ObjectProto, key); if (protoDesc) delete ObjectProto[key]; dP(it, key, D); if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); } : dP; var wrap = function (tag) { var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); sym._k = tag; return sym; }; var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { return typeof it == 'symbol'; } : function (it) { return it instanceof $Symbol; }; var $defineProperty = function defineProperty(it, key, D) { if (it === ObjectProto) $defineProperty(OPSymbols, key, D); anObject(it); key = toPrimitive(key, true); anObject(D); if (has(AllSymbols, key)) { if (!D.enumerable) { if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); it[HIDDEN][key] = true; } else { if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; D = _create(D, { enumerable: createDesc(0, false) }); } return setSymbolDesc(it, key, D); } return dP(it, key, D); }; var $defineProperties = function defineProperties(it, P) { anObject(it); var keys = enumKeys(P = toIObject(P)); var i = 0; var l = keys.length; var key; while (l > i) $defineProperty(it, key = keys[i++], P[key]); return it; }; var $create = function create(it, P) { return P === undefined ? _create(it) : $defineProperties(_create(it), P); }; var $propertyIsEnumerable = function propertyIsEnumerable(key) { var E = isEnum.call(this, key = toPrimitive(key, true)); if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; }; var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { it = toIObject(it); key = toPrimitive(key, true); if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; var D = gOPD(it, key); if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; return D; }; var $getOwnPropertyNames = function getOwnPropertyNames(it) { var names = gOPN(toIObject(it)); var result = []; var i = 0; var key; while (names.length > i) { if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); } return result; }; var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { var IS_OP = it === ObjectProto; var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); var result = []; var i = 0; var key; while (names.length > i) { if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); } return result; }; // 19.4.1.1 Symbol([description]) if (!USE_NATIVE) { $Symbol = function Symbol() { if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); var tag = uid(arguments.length > 0 ? arguments[0] : undefined); var $set = function (value) { if (this === ObjectProto) $set.call(OPSymbols, value); if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; setSymbolDesc(this, tag, createDesc(1, value)); }; if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set }); return wrap(tag); }; redefine($Symbol[PROTOTYPE], 'toString', function toString() { return this._k; }); $GOPD.f = $getOwnPropertyDescriptor; $DP.f = $defineProperty; __webpack_require__(66).f = gOPNExt.f = $getOwnPropertyNames; __webpack_require__(31).f = $propertyIsEnumerable; __webpack_require__(41).f = $getOwnPropertySymbols; if (DESCRIPTORS && !__webpack_require__(21)) { redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); } wksExt.f = function (name) { return wrap(wks(name)); }; } $export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol }); for (var es6Symbols = ( // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' ).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]); for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]); $export($export.S + $export.F * !USE_NATIVE, 'Symbol', { // 19.4.2.1 Symbol.for(key) 'for': function (key) { return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key); }, // 19.4.2.5 Symbol.keyFor(sym) keyFor: function keyFor(sym) { if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; }, useSetter: function () { setter = true; }, useSimple: function () { setter = false; } }); $export($export.S + $export.F * !USE_NATIVE, 'Object', { // 19.1.2.2 Object.create(O [, Properties]) create: $create, // 19.1.2.4 Object.defineProperty(O, P, Attributes) defineProperty: $defineProperty, // 19.1.2.3 Object.defineProperties(O, Properties) defineProperties: $defineProperties, // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) getOwnPropertyDescriptor: $getOwnPropertyDescriptor, // 19.1.2.7 Object.getOwnPropertyNames(O) getOwnPropertyNames: $getOwnPropertyNames, // 19.1.2.8 Object.getOwnPropertySymbols(O) getOwnPropertySymbols: $getOwnPropertySymbols }); // 24.3.2 JSON.stringify(value [, replacer [, space]]) $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { var S = $Symbol(); // MS Edge converts symbol values to JSON as {} // WebKit converts symbol values to JSON as null // V8 throws on boxed symbols return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; })), 'JSON', { stringify: function stringify(it) { var args = [it]; var i = 1; var replacer, $replacer; while (arguments.length > i) args.push(arguments[i++]); $replacer = replacer = args[1]; if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined if (!isArray(replacer)) replacer = function (key, value) { if (typeof $replacer == 'function') value = $replacer.call(this, key, value); if (!isSymbol(value)) return value; }; args[1] = replacer; return _stringify.apply($JSON, args); } }); // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) $Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); // 19.4.3.5 Symbol.prototype[@@toStringTag] setToStringTag($Symbol, 'Symbol'); // 20.2.1.9 Math[@@toStringTag] setToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag] setToStringTag(global.JSON, 'JSON', true); /***/ }), /* 111 */ /***/ (function(module, exports, __webpack_require__) { var META = __webpack_require__(20)('meta'); var isObject = __webpack_require__(9); var has = __webpack_require__(13); var setDesc = __webpack_require__(11).f; var id = 0; var isExtensible = Object.isExtensible || function () { return true; }; var FREEZE = !__webpack_require__(19)(function () { return isExtensible(Object.preventExtensions({})); }); var setMeta = function (it) { setDesc(it, META, { value: { i: 'O' + ++id, // object ID w: {} // weak collections IDs } }); }; var fastKey = function (it, create) { // return primitive with prefix if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; if (!has(it, META)) { // can't set metadata to uncaught frozen object if (!isExtensible(it)) return 'F'; // not necessary to add metadata if (!create) return 'E'; // add missing metadata setMeta(it); // return object ID } return it[META].i; }; var getWeak = function (it, create) { if (!has(it, META)) { // can't set metadata to uncaught frozen object if (!isExtensible(it)) return true; // not necessary to add metadata if (!create) return false; // add missing metadata setMeta(it); // return hash weak collections IDs } return it[META].w; }; // add metadata on freeze-family methods calling var onFreeze = function (it) { if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); return it; }; var meta = module.exports = { KEY: META, NEED: false, fastKey: fastKey, getWeak: getWeak, onFreeze: onFreeze }; /***/ }), /* 112 */ /***/ (function(module, exports, __webpack_require__) { // all enumerable object keys, includes symbols var getKeys = __webpack_require__(22); var gOPS = __webpack_require__(41); var pIE = __webpack_require__(31); module.exports = function (it) { var result = getKeys(it); var getSymbols = gOPS.f; if (getSymbols) { var symbols = getSymbols(it); var isEnum = pIE.f; var i = 0; var key; while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); } return result; }; /***/ }), /* 113 */ /***/ (function(module, exports, __webpack_require__) { // 7.2.2 IsArray(argument) var cof = __webpack_require__(18); module.exports = Array.isArray || function isArray(arg) { return cof(arg) == 'Array'; }; /***/ }), /* 114 */ /***/ (function(module, exports, __webpack_require__) { // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window var toIObject = __webpack_require__(17); var gOPN = __webpack_require__(66).f; var toString = {}.toString; var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; var getWindowNames = function (it) { try { return gOPN(it); } catch (e) { return windowNames.slice(); } }; module.exports.f = function getOwnPropertyNames(it) { return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); }; /***/ }), /* 115 */ /***/ (function(module, exports, __webpack_require__) { var pIE = __webpack_require__(31); var createDesc = __webpack_require__(27); var toIObject = __webpack_require__(17); var toPrimitive = __webpack_require__(35); var has = __webpack_require__(13); var IE8_DOM_DEFINE = __webpack_require__(51); var gOPD = Object.getOwnPropertyDescriptor; exports.f = __webpack_require__(12) ? gOPD : function getOwnPropertyDescriptor(O, P) { O = toIObject(O); P = toPrimitive(P, true); if (IE8_DOM_DEFINE) try { return gOPD(O, P); } catch (e) { /* empty */ } if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); }; /***/ }), /* 116 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(44)('asyncIterator'); /***/ }), /* 117 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(44)('observable'); /***/ }), /* 118 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } /** * A JavaScript implementation of the JSON-LD API. * * @author Dave Longley * * @license BSD 3-Clause License * Copyright (c) 2011-2017 Digital Bazaar, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Digital Bazaar, Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ (function () { var canonize = __webpack_require__(45); var util = __webpack_require__(3); var IdentifierIssuer = util.IdentifierIssuer; var JsonLdError = __webpack_require__(6); var NQuads = __webpack_require__(129); var Rdfa = __webpack_require__(130); var _require = __webpack_require__(131), _expand = _require.expand; var _require2 = __webpack_require__(133), _flatten = _require2.flatten; var _require3 = __webpack_require__(134), _fromRDF = _require3.fromRDF; var _require4 = __webpack_require__(135), _toRDF = _require4.toRDF; var _require5 = __webpack_require__(136), _frameMergedOrDefault = _require5.frameMergedOrDefault; var _require6 = __webpack_require__(4), _isArray = _require6.isArray, _isObject = _require6.isObject, _isString = _require6.isString; var _require7 = __webpack_require__(5), _isSubjectReference = _require7.isSubjectReference; var _require8 = __webpack_require__(15), _getInitialContext = _require8.getInitialContext, _processContext = _require8.process, _getAllContexts = _require8.getAllContexts, _expandIri = _require8.expandIri; var _require9 = __webpack_require__(137), _compact = _require9.compact, _compactIri = _require9.compactIri, _removePreserve = _require9.removePreserve; var _require10 = __webpack_require__(33), _createNodeMap = _require10.createNodeMap, _createMergedNodeMap = _require10.createMergedNodeMap, _mergeNodeMaps = _require10.mergeNodeMaps; // determine if in-browser or using node.js var _nodejs = typeof process !== 'undefined' && process.versions && process.versions.node; var _browser = !_nodejs && (typeof window !== 'undefined' || typeof self !== 'undefined'); // attaches jsonld API to the given object var wrapper = function wrapper(jsonld) { var _this = this; /* Core API */ /** * Performs JSON-LD compaction. * * @param input the JSON-LD input to compact. * @param ctx the context to compact with. * @param [options] options to use: * [base] the base IRI to use. * [compactArrays] true to compact arrays to single values when * appropriate, false not to (default: true). * [compactToRelative] true to compact IRIs to be relative to document base, * false to keep absolute (default: true) * [graph] true to always output a top-level graph (default: false). * [expandContext] a context to expand with. * [skipExpansion] true to assume the input is expanded and skip * expansion, false not to, defaults to false. * [documentLoader(url, callback(err, remoteDoc))] the document loader. * [expansionMap(info)] a function that can be used to custom map * unmappable values (or to throw an error when they are detected); * if this function returns `undefined` then the default behavior * will be used. * [framing] true if compaction is occuring during a framing operation. * [compactionMap(info)] a function that can be used to custom map * unmappable values (or to throw an error when they are detected); * if this function returns `undefined` then the default behavior * will be used. * @param [callback(err, compacted)] called once the operation completes. * * @return a Promise that resolves to the compacted output. */ jsonld.compact = util.callbackify(function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(input, ctx, options) { var expanded, activeCtx, compacted, tmp, i, hasContext, graphAlias, graph, _graph, key, _graph2, _args = arguments; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(_args.length < 2)) { _context.next = 2; break; } throw new TypeError('Could not compact, too few arguments.'); case 2: if (!(ctx === null)) { _context.next = 4; break; } throw new JsonLdError('The compaction context must not be null.', 'jsonld.CompactError', { code: 'invalid local context' }); case 4: if (!(input === null)) { _context.next = 6; break; } return _context.abrupt('return', null); case 6: // set default options options = _setDefaults(options, { base: _isString(input) ? input : '', compactArrays: true, compactToRelative: true, graph: false, skipExpansion: false, link: false, issuer: new IdentifierIssuer('_:b') }); if (options.link) { // force skip expansion when linking, "link" is not part of the public // API, it should only be called from framing options.skipExpansion = true; } if (!options.compactToRelative) { delete options.base; } // expand input expanded = void 0; if (!options.skipExpansion) { _context.next = 14; break; } expanded = input; _context.next = 17; break; case 14: _context.next = 16; return jsonld.expand(input, options); case 16: expanded = _context.sent; case 17: _context.next = 19; return jsonld.processContext(_getInitialContext(options), ctx, options); case 19: activeCtx = _context.sent; // do compaction compacted = _compact({ activeCtx: activeCtx, element: expanded, options: options, compactionMap: options.compactionMap }); // perform clean up if (options.compactArrays && !options.graph && _isArray(compacted)) { if (compacted.length === 1) { // simplify to a single item compacted = compacted[0]; } else if (compacted.length === 0) { // simplify to an empty object compacted = {}; } } else if (options.graph && _isObject(compacted)) { // always use array if graph option is on compacted = [compacted]; } // follow @context key if (_isObject(ctx) && '@context' in ctx) { ctx = ctx['@context']; } // build output context ctx = util.clone(ctx); if (!_isArray(ctx)) { ctx = [ctx]; } // remove empty contexts tmp = ctx; ctx = []; for (i = 0; i < tmp.length; ++i) { if (!_isObject(tmp[i]) || Object.keys(tmp[i]).length > 0) { ctx.push(tmp[i]); } } // remove array if only one context hasContext = ctx.length > 0; if (ctx.length === 1) { ctx = ctx[0]; } // add context and/or @graph if (_isArray(compacted)) { // use '@graph' keyword graphAlias = _compactIri({ activeCtx: activeCtx, iri: '@graph', relativeTo: { vocab: true } }); graph = compacted; compacted = {}; if (hasContext) { compacted['@context'] = ctx; } compacted[graphAlias] = graph; } else if (_isObject(compacted) && hasContext) { // reorder keys so @context is first _graph = compacted; compacted = { '@context': ctx }; for (key in _graph) { compacted[key] = _graph[key]; } } if (options.framing) { // get graph alias _graph2 = _compactIri({ activeCtx: activeCtx, iri: '@graph', relativeTo: { vocab: true } }); // remove @preserve from results options.link = {}; compacted[_graph2] = _removePreserve(activeCtx, compacted[_graph2], options); } return _context.abrupt('return', compacted); case 33: case 'end': return _context.stop(); } } }, _callee, this); })); return function (_x, _x2, _x3) { return _ref.apply(this, arguments); }; }()); /** * Performs JSON-LD expansion. * * @param input the JSON-LD input to expand. * @param [options] the options to use: * [base] the base IRI to use. * [expandContext] a context to expand with. * [keepFreeFloatingNodes] true to keep free-floating nodes, * false not to, defaults to false. * [documentLoader(url, callback(err, remoteDoc))] the document loader. * [expansionMap(info)] a function that can be used to custom map * unmappable values (or to throw an error when they are detected); * if this function returns `undefined` then the default behavior * will be used. * @param [callback(err, expanded)] called once the operation completes. * * @return a Promise that resolves to the expanded output. */ jsonld.expand = util.callbackify(function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(input, options) { var toResolve, contextsToProcess, expandContext, defaultBase, remoteDoc, activeCtx, expanded, _args2 = arguments; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!(_args2.length < 1)) { _context2.next = 2; break; } throw new TypeError('Could not expand, too few arguments.'); case 2: // set default options options = _setDefaults(options, { keepFreeFloatingNodes: false }); if (options.expansionMap === false) { options.expansionMap = undefined; } // build set of objects that may have @contexts to resolve toResolve = {}; // build set of contexts to process prior to expansion contextsToProcess = []; // if an `expandContext` has been given ensure it gets resolved if ('expandContext' in options) { expandContext = util.clone(options.expandContext); if (_isObject(expandContext) && '@context' in expandContext) { toResolve.expandContext = expandContext; } else { toResolve.expandContext = { '@context': expandContext }; } contextsToProcess.push(toResolve.expandContext); } // if input is a string, attempt to dereference remote document defaultBase = void 0; if (_isString(input)) { _context2.next = 12; break; } // input is not a URL, do not need to retrieve it first toResolve.input = util.clone(input); _context2.next = 18; break; case 12: _context2.next = 14; return jsonld.get(input, options); case 14: remoteDoc = _context2.sent; defaultBase = remoteDoc.documentUrl; toResolve.input = remoteDoc.document; if (remoteDoc.contextUrl) { // context included in HTTP link header and must be resolved toResolve.remoteContext = { '@context': remoteDoc.contextUrl }; contextsToProcess.push(toResolve.remoteContext); } case 18: // set default base if (!('base' in options)) { options.base = defaultBase || ''; } // get all contexts in `toResolve` _context2.next = 21; return _getAllContexts(toResolve, options); case 21: // process any additional contexts activeCtx = _getInitialContext(options); contextsToProcess.forEach(function (localCtx) { activeCtx = _processContext({ activeCtx: activeCtx, localCtx: localCtx, options: options }); }); // expand resolved input expanded = _expand({ activeCtx: activeCtx, element: toResolve.input, options: options, expansionMap: options.expansionMap }); // optimize away @graph with no other properties if (_isObject(expanded) && '@graph' in expanded && Object.keys(expanded).length === 1) { expanded = expanded['@graph']; } else if (expanded === null) { expanded = []; } // normalize to an array if (!_isArray(expanded)) { expanded = [expanded]; } return _context2.abrupt('return', expanded); case 27: case 'end': return _context2.stop(); } } }, _callee2, this); })); return function (_x4, _x5) { return _ref2.apply(this, arguments); }; }()); /** * Performs JSON-LD flattening. * * @param input the JSON-LD to flatten. * @param ctx the context to use to compact the flattened output, or null. * @param [options] the options to use: * [base] the base IRI to use. * [expandContext] a context to expand with. * [documentLoader(url, callback(err, remoteDoc))] the document loader. * @param [callback(err, flattened)] called once the operation completes. * * @return a Promise that resolves to the flattened output. */ jsonld.flatten = util.callbackify(function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(input, ctx, options) { var expanded, flattened, compacted, _args3 = arguments; return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: if (!(_args3.length < 1)) { _context3.next = 2; break; } return _context3.abrupt('return', new TypeError('Could not flatten, too few arguments.')); case 2: if (typeof ctx === 'function') { ctx = null; } else { ctx = ctx || null; } // set default options options = _setDefaults(options, { base: _isString(input) ? input : '' }); // expand input _context3.next = 6; return jsonld.expand(input, options); case 6: expanded = _context3.sent; // do flattening flattened = _flatten(expanded); if (!(ctx === null)) { _context3.next = 10; break; } return _context3.abrupt('return', flattened); case 10: // compact result (force @graph option to true, skip expansion) options.graph = true; options.skipExpansion = true; _context3.next = 14; return jsonld.compact(flattened, ctx, options); case 14: compacted = _context3.sent; return _context3.abrupt('return', compacted); case 16: case 'end': return _context3.stop(); } } }, _callee3, this); })); return function (_x6, _x7, _x8) { return _ref3.apply(this, arguments); }; }()); /** * Performs JSON-LD framing. * * @param input the JSON-LD input to frame. * @param frame the JSON-LD frame to use. * @param [options] the framing options. * [base] the base IRI to use. * [expandContext] a context to expand with. * [embed] default @embed flag: '@last', '@always', '@never', '@link' * (default: '@last'). * [explicit] default @explicit flag (default: false). * [requireAll] default @requireAll flag (default: true). * [omitDefault] default @omitDefault flag (default: false). * [documentLoader(url, callback(err, remoteDoc))] the document loader. * @param [callback(err, framed)] called once the operation completes. * * @return a Promise that resolves to the framed output. */ jsonld.frame = util.callbackify(function () { var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(input, frame, options) { var remoteDoc, ctx, frameContext, expanded, opts, expandedFrame, framed, compacted, _args4 = arguments; return regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: if (!(_args4.length < 2)) { _context4.next = 2; break; } throw new TypeError('Could not frame, too few arguments.'); case 2: // set default options options = _setDefaults(options, { base: _isString(input) ? input : '', embed: '@last', explicit: false, requireAll: true, omitDefault: false, pruneBlankNodeIdentifiers: true, bnodesToClear: [] }); // if frame is a string, attempt to dereference remote document if (!_isString(frame)) { _context4.next = 9; break; } _context4.next = 6; return jsonld.get(frame, options); case 6: remoteDoc = _context4.sent; frame = remoteDoc.document; if (remoteDoc.contextUrl) { // inject link header @context into frame ctx = frame['@context']; if (!ctx) { ctx = remoteDoc.contextUrl; } else if (_isArray(ctx)) { ctx.push(remoteDoc.contextUrl); } else { ctx = [ctx, remoteDoc.contextUrl]; } frame['@context'] = ctx; } case 9: frameContext = frame ? frame['@context'] || {} : {}; // expand input _context4.next = 12; return jsonld.expand(input, options); case 12: expanded = _context4.sent; // expand frame opts = util.clone(options); opts.isFrame = true; opts.keepFreeFloatingNodes = true; _context4.next = 18; return jsonld.expand(frame, opts); case 18: expandedFrame = _context4.sent; // if the unexpanded frame includes a key expanding to @graph, frame the default graph, otherwise, the merged graph framed = void 0; // FIXME should look for aliases of @graph opts.merged = !('@graph' in frame); // do framing framed = _frameMergedOrDefault(expanded, expandedFrame, opts); // compact result (force @graph option to true, skip expansion, // check for linked embeds) opts.graph = true; opts.skipExpansion = true; opts.link = {}; opts.framing = true; _context4.next = 28; return jsonld.compact(framed, frameContext, opts); case 28: compacted = _context4.sent; return _context4.abrupt('return', compacted); case 30: case 'end': return _context4.stop(); } } }, _callee4, this); })); return function (_x9, _x10, _x11) { return _ref4.apply(this, arguments); }; }()); /** * **Experimental** * * Links a JSON-LD document's nodes in memory. * * @param input the JSON-LD document to link. * @param [ctx] the JSON-LD context to apply. * @param [options] the options to use: * [base] the base IRI to use. * [expandContext] a context to expand with. * [documentLoader(url, callback(err, remoteDoc))] the document loader. * @param [callback(err, linked)] called once the operation completes. * * @return a Promise that resolves to the linked output. */ jsonld.link = util.callbackify(function () { var _ref5 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(input, ctx, options) { var frame; return regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: // API matches running frame with a wildcard frame and embed: '@link' // get arguments frame = {}; if (ctx) { frame['@context'] = ctx; } frame['@embed'] = '@link'; return _context5.abrupt('return', jsonld.frame(input, frame, options)); case 4: case 'end': return _context5.stop(); } } }, _callee5, this); })); return function (_x12, _x13, _x14) { return _ref5.apply(this, arguments); }; }()); /** * Performs RDF dataset normalization on the given input. The input is JSON-LD * unless the 'inputFormat' option is used. The output is an RDF dataset * unless the 'format' option is used. * * @param input the input to normalize as JSON-LD or as a format specified by * the 'inputFormat' option. * @param [options] the options to use: * [algorithm] the normalization algorithm to use, `URDNA2015` or * `URGNA2012` (default: `URGNA2012`). * [base] the base IRI to use. * [expandContext] a context to expand with. * [inputFormat] the format if input is not JSON-LD: * 'application/n-quads' for N-Quads. * [format] the format if output is a string: * 'application/n-quads' for N-Quads. * [documentLoader(url, callback(err, remoteDoc))] the document loader. * @param [callback(err, normalized)] called once the operation completes. * * @return a Promise that resolves to the normalized output. */ jsonld.normalize = jsonld.canonize = util.callbackify(function () { var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(input, options) { var parsedInput, opts, dataset, _args6 = arguments; return regeneratorRuntime.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: if (!(_args6.length < 1)) { _context6.next = 2; break; } throw new TypeError('Could not canonize, too few arguments.'); case 2: // set default options options = _setDefaults(options, { base: _isString(input) ? input : '', algorithm: 'URDNA2015' }); if (!('inputFormat' in options)) { _context6.next = 8; break; } if (!(options.inputFormat !== 'application/n-quads' && options.inputFormat !== 'application/nquads')) { _context6.next = 6; break; } throw new JsonLdError('Unknown canonicalization input format.', 'jsonld.CanonizeError'); case 6: // TODO: `await` for async parsers parsedInput = NQuads.parse(input); // do canonicalization return _context6.abrupt('return', canonize.canonize(parsedInput, options)); case 8: // convert to RDF dataset then do normalization opts = util.clone(options); delete opts.format; opts.produceGeneralizedRdf = false; _context6.next = 13; return jsonld.toRDF(input, opts); case 13: dataset = _context6.sent; return _context6.abrupt('return', canonize.canonize(dataset, options)); case 15: case 'end': return _context6.stop(); } } }, _callee6, this); })); return function (_x15, _x16) { return _ref6.apply(this, arguments); }; }()); /** * Converts an RDF dataset to JSON-LD. * * @param dataset a serialized string of RDF in a format specified by the * format option or an RDF dataset to convert. * @param [options] the options to use: * [format] the format if dataset param must first be parsed: * 'application/n-quads' for N-Quads (default). * [rdfParser] a custom RDF-parser to use to parse the dataset. * [useRdfType] true to use rdf:type, false to use @type * (default: false). * [useNativeTypes] true to convert XSD types into native types * (boolean, integer, double), false not to (default: false). * @param [callback(err, output)] called once the operation completes. * * @return a Promise that resolves to the JSON-LD document. */ jsonld.fromRDF = util.callbackify(function () { var _ref7 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7(dataset, options) { var _options, format, rdfParser, parsedDataset, _args7 = arguments; return regeneratorRuntime.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: if (!(_args7.length < 1)) { _context7.next = 2; break; } throw new TypeError('Could not convert from RDF, too few arguments.'); case 2: // set default options options = _setDefaults(options, { format: _isString(dataset) ? 'application/n-quads' : undefined }); _options = options, format = _options.format, rdfParser = _options.rdfParser; // handle special format if (!format) { _context7.next = 10; break; } // check supported formats rdfParser = rdfParser || _rdfParsers[format]; if (rdfParser) { _context7.next = 8; break; } throw new JsonLdError('Unknown input format.', 'jsonld.UnknownFormat', { format: format }); case 8: _context7.next = 11; break; case 10: // no-op parser, assume dataset already parsed rdfParser = function rdfParser() { return dataset; }; case 11: // TODO: call `normalizeAsyncFn` on parser fn // rdfParser can be callback, promise-based, or synchronous parsedDataset = void 0; if (rdfParser.length > 1) { // convert callback-based rdf parser to promise-based parsedDataset = new Promise(function (resolve, reject) { rdfParser(dataset, function (err, dataset) { if (err) { reject(err); } else { resolve(dataset); } }); }); } else { parsedDataset = Promise.resolve(rdfParser(dataset)); } _context7.next = 15; return parsedDataset; case 15: parsedDataset = _context7.sent; // back-compat with old parsers that produced legacy dataset format if (!Array.isArray(parsedDataset)) { parsedDataset = NQuads.legacyDatasetToQuads(parsedDataset); } return _context7.abrupt('return', _fromRDF(parsedDataset, options)); case 18: case 'end': return _context7.stop(); } } }, _callee7, this); })); return function (_x17, _x18) { return _ref7.apply(this, arguments); }; }()); /** * Outputs the RDF dataset found in the given JSON-LD object. * * @param input the JSON-LD input. * @param [options] the options to use: * [base] the base IRI to use. * [expandContext] a context to expand with. * [format] the format to use to output a string: * 'application/n-quads' for N-Quads. * [produceGeneralizedRdf] true to output generalized RDF, false * to produce only standard RDF (default: false). * [documentLoader(url, callback(err, remoteDoc))] the document loader. * @param [callback(err, dataset)] called once the operation completes. * * @return a Promise that resolves to the RDF dataset. */ jsonld.toRDF = util.callbackify(function () { var _ref8 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8(input, options) { var expanded, dataset, _args8 = arguments; return regeneratorRuntime.wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: if (!(_args8.length < 1)) { _context8.next = 2; break; } throw new TypeError('Could not convert to RDF, too few arguments.'); case 2: // set default options options = _setDefaults(options, { base: _isString(input) ? input : '' }); // TODO: support toRDF custom map? // expand input _context8.next = 5; return jsonld.expand(input, options); case 5: expanded = _context8.sent; // output RDF dataset dataset = _toRDF(expanded, options); if (!options.format) { _context8.next = 13; break; } if (!(options.format === 'application/n-quads' || options.format === 'application/nquads')) { _context8.next = 12; break; } _context8.next = 11; return NQuads.serialize(dataset); case 11: return _context8.abrupt('return', _context8.sent); case 12: throw new JsonLdError('Unknown output format.', 'jsonld.UnknownFormat', { format: options.format }); case 13: return _context8.abrupt('return', dataset); case 14: case 'end': return _context8.stop(); } } }, _callee8, this); })); return function (_x19, _x20) { return _ref8.apply(this, arguments); }; }()); /** * **Experimental** * * Recursively flattens the nodes in the given JSON-LD input into a merged * map of node ID => node. All graphs will be merged into the default graph. * * @param input the JSON-LD input. * @param [options] the options to use: * [base] the base IRI to use. * [expandContext] a context to expand with. * [issuer] a jsonld.IdentifierIssuer to use to label blank nodes. * [documentLoader(url, callback(err, remoteDoc))] the document loader. * @param [callback(err, nodeMap)] called once the operation completes. * * @return a Promise that resolves to the merged node map. */ jsonld.createNodeMap = util.callbackify(function () { var _ref9 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9(input, options) { var expanded, _args9 = arguments; return regeneratorRuntime.wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: if (!(_args9.length < 1)) { _context9.next = 2; break; } throw new TypeError('Could not create node map, too few arguments.'); case 2: // set default options options = _setDefaults(options, { base: _isString(input) ? input : '' }); // expand input _context9.next = 5; return jsonld.expand(input, options); case 5: expanded = _context9.sent; return _context9.abrupt('return', _createMergedNodeMap(expanded, options)); case 7: case 'end': return _context9.stop(); } } }, _callee9, this); })); return function (_x21, _x22) { return _ref9.apply(this, arguments); }; }()); /** * **Experimental** * * Merges two or more JSON-LD documents into a single flattened document. * * @param docs the JSON-LD documents to merge together. * @param ctx the context to use to compact the merged result, or null. * @param [options] the options to use: * [base] the base IRI to use. * [expandContext] a context to expand with. * [issuer] a jsonld.IdentifierIssuer to use to label blank nodes. * [mergeNodes] true to merge properties for nodes with the same ID, * false to ignore new properties for nodes with the same ID once * the ID has been defined; note that this may not prevent merging * new properties where a node is in the `object` position * (default: true). * [documentLoader(url, callback(err, remoteDoc))] the document loader. * @param [callback(err, merged)] called once the operation completes. * * @return a Promise that resolves to the merged output. */ jsonld.merge = util.callbackify(function () { var _ref10 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee10(docs, ctx, options) { var expanded, mergeNodes, issuer, graphs, i, doc, _graphs, graphName, _nodeMap, nodeMap, key, defaultGraph, flattened, keys, ki, node, compacted, _args10 = arguments; return regeneratorRuntime.wrap(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: if (!(_args10.length < 1)) { _context10.next = 2; break; } throw new TypeError('Could not merge, too few arguments.'); case 2: if (_isArray(docs)) { _context10.next = 4; break; } throw new TypeError('Could not merge, "docs" must be an array.'); case 4: if (typeof ctx === 'function') { ctx = null; } else { ctx = ctx || null; } // set default options options = _setDefaults(options, {}); // expand all documents _context10.next = 8; return Promise.all(docs.map(function (doc) { var opts = Object.assign({}, options); return jsonld.expand(doc, opts); })); case 8: expanded = _context10.sent; mergeNodes = true; if ('mergeNodes' in options) { mergeNodes = options.mergeNodes; } issuer = options.issuer || new IdentifierIssuer('_:b'); graphs = { '@default': {} }; i = 0; case 14: if (!(i < expanded.length)) { _context10.next = 33; break; } // uniquely relabel blank nodes doc = util.relabelBlankNodes(expanded[i], { issuer: new IdentifierIssuer('_:b' + i + '-') }); // add nodes to the shared node map graphs if merging nodes, to a // separate graph set if not _graphs = mergeNodes || i === 0 ? graphs : { '@default': {} }; _createNodeMap(doc, _graphs, '@default', issuer); if (!(_graphs !== graphs)) { _context10.next = 30; break; } _context10.t0 = regeneratorRuntime.keys(_graphs); case 20: if ((_context10.t1 = _context10.t0()).done) { _context10.next = 30; break; } graphName = _context10.t1.value; _nodeMap = _graphs[graphName]; if (graphName in graphs) { _context10.next = 26; break; } graphs[graphName] = _nodeMap; return _context10.abrupt('continue', 20); case 26: nodeMap = graphs[graphName]; for (key in _nodeMap) { if (!(key in nodeMap)) { nodeMap[key] = _nodeMap[key]; } } _context10.next = 20; break; case 30: ++i; _context10.next = 14; break; case 33: // add all non-default graphs to default graph defaultGraph = _mergeNodeMaps(graphs); // produce flattened output flattened = []; keys = Object.keys(defaultGraph).sort(); for (ki = 0; ki < keys.length; ++ki) { node = defaultGraph[keys[ki]]; // only add full subjects to top-level if (!_isSubjectReference(node)) { flattened.push(node); } } if (!(ctx === null)) { _context10.next = 39; break; } return _context10.abrupt('return', flattened); case 39: // compact result (force @graph option to true, skip expansion) options.graph = true; options.skipExpansion = true; _context10.next = 43; return jsonld.compact(flattened, ctx, options); case 43: compacted = _context10.sent; return _context10.abrupt('return', compacted); case 45: case 'end': return _context10.stop(); } } }, _callee10, this); })); return function (_x23, _x24, _x25) { return _ref10.apply(this, arguments); }; }()); /** * The default document loader for external documents. If the environment * is node.js, a callback-continuation-style document loader is used; otherwise, * a promises-style document loader is used. * * @param url the URL to load. * @param callback(err, remoteDoc) called once the operation completes, * if using a non-promises API. * * @return a promise, if using a promises API. */ Object.defineProperty(jsonld, 'documentLoader', { get: function get() { return jsonld._documentLoader; }, set: function set(v) { return jsonld._documentLoader = util.normalizeDocumentLoader(v); } }); // default document loader not implemented jsonld.documentLoader = function () { var _ref11 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee11(url) { return regeneratorRuntime.wrap(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: throw new JsonLdError('Could not retrieve a JSON-LD document from the URL. URL ' + 'dereferencing not implemented.', 'jsonld.LoadDocumentError', { code: 'loading document failed', url: url }); case 1: case 'end': return _context11.stop(); } } }, _callee11, _this); })); return function (_x26) { return _ref11.apply(this, arguments); }; }(); /** * Deprecated default document loader. Do not use or override. */ jsonld.loadDocument = util.callbackify(_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee12() { var _args12 = arguments; return regeneratorRuntime.wrap(function _callee12$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: return _context12.abrupt('return', jsonld.documentLoader.apply(null, _args12)); case 1: case 'end': return _context12.stop(); } } }, _callee12, this); }))); /** * Gets a remote JSON-LD document using the default document loader or * one given in the passed options. * * @param url the URL to fetch. * @param [options] the options to use: * [documentLoader] the document loader to use. * @param [callback(err, remoteDoc)] called once the operation completes. * * @return a Promise that resolves to the retrieved remote document. */ jsonld.get = util.callbackify(function () { var _ref13 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee13(url, options) { var load, remoteDoc; return regeneratorRuntime.wrap(function _callee13$(_context13) { while (1) { switch (_context13.prev = _context13.next) { case 0: load = void 0; if (typeof options.documentLoader === 'function') { load = util.normalizeDocumentLoader(options.documentLoader); } else { load = jsonld.documentLoader; } _context13.next = 4; return load(url); case 4: remoteDoc = _context13.sent; _context13.prev = 5; if (remoteDoc.document) { _context13.next = 8; break; } throw new JsonLdError('No remote document found at the given URL.', 'jsonld.NullRemoteDocument'); case 8: if (_isString(remoteDoc.document)) { remoteDoc.document = JSON.parse(remoteDoc.document); } _context13.next = 14; break; case 11: _context13.prev = 11; _context13.t0 = _context13['catch'](5); throw new JsonLdError('Could not retrieve a JSON-LD document from the URL.', 'jsonld.LoadDocumentError', { code: 'loading document failed', cause: _context13.t0, remoteDoc: remoteDoc }); case 14: return _context13.abrupt('return', remoteDoc); case 15: case 'end': return _context13.stop(); } } }, _callee13, this, [[5, 11]]); })); return function (_x27, _x28) { return _ref13.apply(this, arguments); }; }()); /** * Processes a local context, resolving any URLs as necessary, and returns a * new active context in its callback. * * @param activeCtx the current active context. * @param localCtx the local context to process. * @param [options] the options to use: * [documentLoader(url, callback(err, remoteDoc))] the document loader. * @param [callback(err, activeCtx)] called once the operation completes. * * @return a Promise that resolves to the new active context. */ jsonld.processContext = util.callbackify(function () { var _ref14 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee14(activeCtx, localCtx, options) { var ctx; return regeneratorRuntime.wrap(function _callee14$(_context14) { while (1) { switch (_context14.prev = _context14.next) { case 0: // set default options options = _setDefaults(options, { base: '' }); // return initial context early for null context if (!(localCtx === null)) { _context14.next = 3; break; } return _context14.abrupt('return', _getInitialContext(options)); case 3: // get URLs in localCtx localCtx = util.clone(localCtx); if (!(_isObject(localCtx) && '@context' in localCtx)) { localCtx = { '@context': localCtx }; } _context14.next = 7; return _getAllContexts(localCtx, options); case 7: ctx = _context14.sent; return _context14.abrupt('return', _processContext({ activeCtx: activeCtx, localCtx: ctx, options: options })); case 9: case 'end': return _context14.stop(); } } }, _callee14, this); })); return function (_x29, _x30, _x31) { return _ref14.apply(this, arguments); }; }()); // backwards compatibility jsonld.getContextValue = __webpack_require__(15).getContextValue; /** * Document loaders. */ jsonld.documentLoaders = {}; jsonld.documentLoaders.node = __webpack_require__(138); jsonld.documentLoaders.xhr = __webpack_require__(139); /** * Assigns the default document loader for external document URLs to a built-in * default. Supported types currently include: 'xhr' and 'node'. * * @param type the type to set. * @param [params] the parameters required to use the document loader. */ jsonld.useDocumentLoader = function (type) { if (!(type in jsonld.documentLoaders)) { throw new JsonLdError('Unknown document loader type: "' + type + '"', 'jsonld.UnknownDocumentLoader', { type: type }); } // set document loader jsonld.documentLoader = jsonld.documentLoaders[type].apply(jsonld, Array.prototype.slice.call(arguments, 1)); }; /** Registered RDF dataset parsers hashed by content-type. */ var _rdfParsers = {}; /** * Registers an RDF dataset parser by content-type, for use with * jsonld.fromRDF. An RDF dataset parser will always be given two parameters, * a string of input and a callback. An RDF dataset parser can be synchronous * or asynchronous. * * If the parser function returns undefined or null then it will be assumed to * be asynchronous w/a continuation-passing style and the callback parameter * given to the parser MUST be invoked. * * If it returns a Promise, then it will be assumed to be asynchronous, but the * callback parameter MUST NOT be invoked. It should instead be ignored. * * If it returns an RDF dataset, it will be assumed to be synchronous and the * callback parameter MUST NOT be invoked. It should instead be ignored. * * @param contentType the content-type for the parser. * @param parser(input, callback(err, dataset)) the parser function (takes a * string as a parameter and either returns null/undefined and uses * the given callback, returns a Promise, or returns an RDF dataset). */ jsonld.registerRDFParser = function (contentType, parser) { _rdfParsers[contentType] = parser; }; /** * Unregisters an RDF dataset parser by content-type. * * @param contentType the content-type for the parser. */ jsonld.unregisterRDFParser = function (contentType) { delete _rdfParsers[contentType]; }; // register the N-Quads RDF parser jsonld.registerRDFParser('application/n-quads', NQuads.parse); jsonld.registerRDFParser('application/nquads', NQuads.parse); // register the RDFa API RDF parser jsonld.registerRDFParser('rdfa-api', Rdfa.parse); /* URL API */ jsonld.url = __webpack_require__(26); /* Utility API */ jsonld.util = util; // backwards compatibility Object.assign(jsonld, util); // reexpose API as jsonld.promises for backwards compatability jsonld.promises = jsonld; // backwards compatibility jsonld.RequestQueue = __webpack_require__(50); /* WebIDL API */ jsonld.JsonLdProcessor = __webpack_require__(140)(jsonld); // setup browser global JsonLdProcessor if (_browser && typeof global.JsonLdProcessor === 'undefined') { Object.defineProperty(global, 'JsonLdProcessor', { writable: true, enumerable: false, configurable: true, value: jsonld.JsonLdProcessor }); } // set platform-specific defaults/APIs if (_nodejs) { // use node document loader by default jsonld.useDocumentLoader('node'); } else if (typeof XMLHttpRequest !== 'undefined') { // use xhr document loader by default jsonld.useDocumentLoader('xhr'); } function _setDefaults(options, _ref15) { var _ref15$documentLoader = _ref15.documentLoader, documentLoader = _ref15$documentLoader === undefined ? jsonld.documentLoader : _ref15$documentLoader, defaults = _objectWithoutProperties(_ref15, ['documentLoader']); if (typeof options === 'function') { options = {}; } options = options || {}; return Object.assign({}, { documentLoader: documentLoader }, defaults, options); } // end of jsonld API `wrapper` factory return jsonld; }; // external APIs: // used to generate a new jsonld API instance var factory = function factory() { return wrapper(function () { return factory(); }); }; if (!_nodejs && "function" === 'function' && __webpack_require__(141)) { // export AMD API !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () { // now that module is defined, wrap main jsonld API instance wrapper(factory); return factory; }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { // wrap the main jsonld API instance wrapper(factory); if ("function" === 'function' && typeof module !== 'undefined' && module.exports) { // export CommonJS/nodejs API module.exports = factory; } if (_browser) { // export simple browser API if (typeof jsonld === 'undefined') { jsonld = jsonldjs = factory; } else { jsonldjs = factory; } } } return factory; })(); /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(67))) /***/ }), /* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * Copyright (c) 2016-2017 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var util = __webpack_require__(14); module.exports = function () { function AsyncAlgorithm() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$maxCallStackDept = _ref.maxCallStackDepth, maxCallStackDepth = _ref$maxCallStackDept === undefined ? 500 : _ref$maxCallStackDept, _ref$maxTotalCallStac = _ref.maxTotalCallStackDepth, maxTotalCallStackDepth = _ref$maxTotalCallStac === undefined ? 0xFFFFFFFF : _ref$maxTotalCallStac, _ref$timeSlice = _ref.timeSlice, timeSlice = _ref$timeSlice === undefined ? 10 : _ref$timeSlice; _classCallCheck(this, AsyncAlgorithm); this.schedule = {}; this.schedule.MAX_DEPTH = maxCallStackDepth; this.schedule.MAX_TOTAL_DEPTH = maxTotalCallStackDepth; this.schedule.depth = 0; this.schedule.totalDepth = 0; this.schedule.timeSlice = timeSlice; } // do some work in a time slice, but in serial _createClass(AsyncAlgorithm, [{ key: 'doWork', value: function doWork(fn, callback) { var schedule = this.schedule; if (schedule.totalDepth >= schedule.MAX_TOTAL_DEPTH) { return callback(new Error('Maximum total call stack depth exceeded; canonicalization aborting.')); } (function work() { if (schedule.depth === schedule.MAX_DEPTH) { // stack too deep, run on next tick schedule.depth = 0; schedule.running = false; return util.nextTick(work); } // if not yet running, force run var now = Date.now(); if (!schedule.running) { schedule.start = Date.now(); schedule.deadline = schedule.start + schedule.timeSlice; } // TODO: should also include an estimate of expectedWorkTime if (now < schedule.deadline) { schedule.running = true; schedule.depth++; schedule.totalDepth++; return fn(function (err, result) { schedule.depth--; schedule.totalDepth--; callback(err, result); }); } // not enough time left in this slice, run after letting browser // do some other things schedule.depth = 0; schedule.running = false; util.setImmediate(work); })(); } // asynchronously loop }, { key: 'forEach', value: function forEach(iterable, fn, callback) { var self = this; var _iterator2 = void 0; var idx = 0; var length = void 0; if (Array.isArray(iterable)) { length = iterable.length; _iterator2 = function iterator() { if (idx === length) { return false; } _iterator2.value = iterable[idx++]; _iterator2.key = idx; return true; }; } else { var keys = Object.keys(iterable); length = keys.length; _iterator2 = function _iterator() { if (idx === length) { return false; } _iterator2.key = keys[idx++]; _iterator2.value = iterable[_iterator2.key]; return true; }; } (function iterate(err) { if (err) { return callback(err); } if (_iterator2()) { return self.doWork(function () { return fn(_iterator2.value, _iterator2.key, iterate); }); } callback(); })(); } // asynchronous waterfall }, { key: 'waterfall', value: function waterfall(fns, callback) { var self = this; self.forEach(fns, function (fn, idx, callback) { return self.doWork(fn, callback); }, callback); } // asynchronous while }, { key: 'whilst', value: function whilst(condition, fn, callback) { var self = this; (function loop(err) { if (err) { return callback(err); } if (!condition()) { return callback(); } self.doWork(fn, loop); })(); } }]); return AsyncAlgorithm; }(); /***/ }), /* 120 */ /***/ (function(module, exports, __webpack_require__) { /** * Secure Hash Algorithm with 160-bit digest (SHA-1) implementation. * * @author Dave Longley * * Copyright (c) 2010-2015 Digital Bazaar, Inc. */ var forge = __webpack_require__(24); __webpack_require__(47); __webpack_require__(70); var sha1 = module.exports = forge.sha1 = forge.sha1 || {}; forge.md.sha1 = forge.md.algorithms.sha1 = sha1; /** * Creates a SHA-1 message digest object. * * @return a message digest object. */ sha1.create = function() { // do initialization as necessary if(!_initialized) { _init(); } // SHA-1 state contains five 32-bit integers var _state = null; // input buffer var _input = forge.util.createBuffer(); // used for word storage var _w = new Array(80); // message digest object var md = { algorithm: 'sha1', blockLength: 64, digestLength: 20, // 56-bit length of message so far (does not including padding) messageLength: 0, // true message length fullMessageLength: null, // size of message length in bytes messageLengthSize: 8 }; /** * Starts the digest. * * @return this digest object. */ md.start = function() { // up to 56-bit message length for convenience md.messageLength = 0; // full message length (set md.messageLength64 for backwards-compatibility) md.fullMessageLength = md.messageLength64 = []; var int32s = md.messageLengthSize / 4; for(var i = 0; i < int32s; ++i) { md.fullMessageLength.push(0); } _input = forge.util.createBuffer(); _state = { h0: 0x67452301, h1: 0xEFCDAB89, h2: 0x98BADCFE, h3: 0x10325476, h4: 0xC3D2E1F0 }; return md; }; // start digest automatically for first time md.start(); /** * Updates the digest with the given message input. The given input can * treated as raw input (no encoding will be applied) or an encoding of * 'utf8' maybe given to encode the input using UTF-8. * * @param msg the message input to update with. * @param encoding the encoding to use (default: 'raw', other: 'utf8'). * * @return this digest object. */ md.update = function(msg, encoding) { if(encoding === 'utf8') { msg = forge.util.encodeUtf8(msg); } // update message length var len = msg.length; md.messageLength += len; len = [(len / 0x100000000) >>> 0, len >>> 0]; for(var i = md.fullMessageLength.length - 1; i >= 0; --i) { md.fullMessageLength[i] += len[1]; len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0); md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; len[0] = ((len[1] / 0x100000000) >>> 0); } // add bytes to input buffer _input.putBytes(msg); // process bytes _update(_state, _w, _input); // compact input buffer every 2K or if empty if(_input.read > 2048 || _input.length() === 0) { _input.compact(); } return md; }; /** * Produces the digest. * * @return a byte buffer containing the digest value. */ md.digest = function() { /* Note: Here we copy the remaining bytes in the input buffer and add the appropriate SHA-1 padding. Then we do the final update on a copy of the state so that if the user wants to get intermediate digests they can do so. */ /* Determine the number of bytes that must be added to the message to ensure its length is congruent to 448 mod 512. In other words, the data to be digested must be a multiple of 512 bits (or 128 bytes). This data includes the message, some padding, and the length of the message. Since the length of the message will be encoded as 8 bytes (64 bits), that means that the last segment of the data must have 56 bytes (448 bits) of message and padding. Therefore, the length of the message plus the padding must be congruent to 448 mod 512 because 512 - 128 = 448. In order to fill up the message length it must be filled with padding that begins with 1 bit followed by all 0 bits. Padding must *always* be present, so if the message length is already congruent to 448 mod 512, then 512 padding bits must be added. */ var finalBlock = forge.util.createBuffer(); finalBlock.putBytes(_input.bytes()); // compute remaining size to be digested (include message length size) var remaining = ( md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize); // add padding for overflow blockSize - overflow // _padding starts with 1 byte with first bit is set (byte value 128), then // there may be up to (blockSize - 1) other pad bytes var overflow = remaining & (md.blockLength - 1); finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); // serialize message length in bits in big-endian order; since length // is stored in bytes we multiply by 8 and add carry from next int var next, carry; var bits = md.fullMessageLength[0] * 8; for(var i = 0; i < md.fullMessageLength.length - 1; ++i) { next = md.fullMessageLength[i + 1] * 8; carry = (next / 0x100000000) >>> 0; bits += carry; finalBlock.putInt32(bits >>> 0); bits = next >>> 0; } finalBlock.putInt32(bits); var s2 = { h0: _state.h0, h1: _state.h1, h2: _state.h2, h3: _state.h3, h4: _state.h4 }; _update(s2, _w, finalBlock); var rval = forge.util.createBuffer(); rval.putInt32(s2.h0); rval.putInt32(s2.h1); rval.putInt32(s2.h2); rval.putInt32(s2.h3); rval.putInt32(s2.h4); return rval; }; return md; }; // sha-1 padding bytes not initialized yet var _padding = null; var _initialized = false; /** * Initializes the constant tables. */ function _init() { // create padding _padding = String.fromCharCode(128); _padding += forge.util.fillString(String.fromCharCode(0x00), 64); // now initialized _initialized = true; } /** * Updates a SHA-1 state with the given byte buffer. * * @param s the SHA-1 state to update. * @param w the array to use to store words. * @param bytes the byte buffer to update with. */ function _update(s, w, bytes) { // consume 512 bit (64 byte) chunks var t, a, b, c, d, e, f, i; var len = bytes.length(); while(len >= 64) { // the w array will be populated with sixteen 32-bit big-endian words // and then extended into 80 32-bit words according to SHA-1 algorithm // and for 32-79 using Max Locktyukhin's optimization // initialize hash value for this chunk a = s.h0; b = s.h1; c = s.h2; d = s.h3; e = s.h4; // round 1 for(i = 0; i < 16; ++i) { t = bytes.getInt32(); w[i] = t; f = d ^ (b & (c ^ d)); t = ((a << 5) | (a >>> 27)) + f + e + 0x5A827999 + t; e = d; d = c; // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug c = ((b << 30) | (b >>> 2)) >>> 0; b = a; a = t; } for(; i < 20; ++i) { t = (w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]); t = (t << 1) | (t >>> 31); w[i] = t; f = d ^ (b & (c ^ d)); t = ((a << 5) | (a >>> 27)) + f + e + 0x5A827999 + t; e = d; d = c; // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug c = ((b << 30) | (b >>> 2)) >>> 0; b = a; a = t; } // round 2 for(; i < 32; ++i) { t = (w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]); t = (t << 1) | (t >>> 31); w[i] = t; f = b ^ c ^ d; t = ((a << 5) | (a >>> 27)) + f + e + 0x6ED9EBA1 + t; e = d; d = c; // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug c = ((b << 30) | (b >>> 2)) >>> 0; b = a; a = t; } for(; i < 40; ++i) { t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]); t = (t << 2) | (t >>> 30); w[i] = t; f = b ^ c ^ d; t = ((a << 5) | (a >>> 27)) + f + e + 0x6ED9EBA1 + t; e = d; d = c; // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug c = ((b << 30) | (b >>> 2)) >>> 0; b = a; a = t; } // round 3 for(; i < 60; ++i) { t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]); t = (t << 2) | (t >>> 30); w[i] = t; f = (b & c) | (d & (b ^ c)); t = ((a << 5) | (a >>> 27)) + f + e + 0x8F1BBCDC + t; e = d; d = c; // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug c = ((b << 30) | (b >>> 2)) >>> 0; b = a; a = t; } // round 4 for(; i < 80; ++i) { t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]); t = (t << 2) | (t >>> 30); w[i] = t; f = b ^ c ^ d; t = ((a << 5) | (a >>> 27)) + f + e + 0xCA62C1D6 + t; e = d; d = c; // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug c = ((b << 30) | (b >>> 2)) >>> 0; b = a; a = t; } // update hash state s.h0 = (s.h0 + a) | 0; s.h1 = (s.h1 + b) | 0; s.h2 = (s.h2 + c) | 0; s.h3 = (s.h3 + d) | 0; s.h4 = (s.h4 + e) | 0; len -= 64; } } /***/ }), /* 121 */ /***/ (function(module, exports) { /** * Base-N/Base-X encoding/decoding functions. * * Original implementation from base-x: * https://github.com/cryptocoinjs/base-x * * Which is MIT licensed: * * The MIT License (MIT) * * Copyright base-x contributors (c) 2016 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ var api = {}; module.exports = api; // baseN alphabet indexes var _reverseAlphabets = {}; /** * BaseN-encodes a Uint8Array using the given alphabet. * * @param input the Uint8Array to encode. * @param maxline the maximum number of encoded characters per line to use, * defaults to none. * * @return the baseN-encoded output string. */ api.encode = function(input, alphabet, maxline) { if(typeof alphabet !== 'string') { throw new TypeError('"alphabet" must be a string.'); } if(maxline !== undefined && typeof maxline !== 'number') { throw new TypeError('"maxline" must be a number.'); } var output = ''; if(!(input instanceof Uint8Array)) { // assume forge byte buffer output = _encodeWithByteBuffer(input, alphabet); } else { var i = 0; var base = alphabet.length; var first = alphabet.charAt(0); var digits = [0]; for(i = 0; i < input.length; ++i) { for(var j = 0, carry = input[i]; j < digits.length; ++j) { carry += digits[j] << 8; digits[j] = carry % base; carry = (carry / base) | 0; } while(carry > 0) { digits.push(carry % base); carry = (carry / base) | 0; } } // deal with leading zeros for(i = 0; input[i] === 0 && i < input.length - 1; ++i) { output += first; } // convert digits to a string for(i = digits.length - 1; i >= 0; --i) { output += alphabet[digits[i]]; } } if(maxline) { var regex = new RegExp('.{1,' + maxline + '}', 'g'); output = output.match(regex).join('\r\n'); } return output; }; /** * Decodes a baseN-encoded (using the given alphabet) string to a * Uint8Array. * * @param input the baseN-encoded input string. * * @return the Uint8Array. */ api.decode = function(input, alphabet) { if(typeof input !== 'string') { throw new TypeError('"input" must be a string.'); } if(typeof alphabet !== 'string') { throw new TypeError('"alphabet" must be a string.'); } var table = _reverseAlphabets[alphabet]; if(!table) { // compute reverse alphabet table = _reverseAlphabets[alphabet] = []; for(var i = 0; i < alphabet.length; ++i) { table[alphabet.charCodeAt(i)] = i; } } // remove whitespace characters input = input.replace(/\s/g, ''); var base = alphabet.length; var first = alphabet.charAt(0); var bytes = [0]; for(var i = 0; i < input.length; i++) { var value = table[input.charCodeAt(i)]; if(value === undefined) { return; } for(var j = 0, carry = value; j < bytes.length; ++j) { carry += bytes[j] * base; bytes[j] = carry & 0xff; carry >>= 8; } while(carry > 0) { bytes.push(carry & 0xff); carry >>= 8; } } // deal with leading zeros for(var k = 0; input[k] === first && k < input.length - 1; ++k) { bytes.push(0); } if(typeof Buffer !== 'undefined') { return Buffer.from(bytes.reverse()); } return new Uint8Array(bytes.reverse()); }; function _encodeWithByteBuffer(input, alphabet) { var i = 0; var base = alphabet.length; var first = alphabet.charAt(0); var digits = [0]; for(i = 0; i < input.length(); ++i) { for(var j = 0, carry = input.at(i); j < digits.length; ++j) { carry += digits[j] << 8; digits[j] = carry % base; carry = (carry / base) | 0; } while(carry > 0) { digits.push(carry % base); carry = (carry / base) | 0; } } var output = ''; // deal with leading zeros for(i = 0; input.at(i) === 0 && i < input.length() - 1; ++i) { output += first; } // convert digits to a string for(i = digits.length - 1; i >= 0; --i) { output += alphabet[digits[i]]; } return output; } /***/ }), /* 122 */ /***/ (function(module, exports, __webpack_require__) { /** * Secure Hash Algorithm with 256-bit digest (SHA-256) implementation. * * See FIPS 180-2 for details. * * @author Dave Longley * * Copyright (c) 2010-2015 Digital Bazaar, Inc. */ var forge = __webpack_require__(24); __webpack_require__(47); __webpack_require__(70); var sha256 = module.exports = forge.sha256 = forge.sha256 || {}; forge.md.sha256 = forge.md.algorithms.sha256 = sha256; /** * Creates a SHA-256 message digest object. * * @return a message digest object. */ sha256.create = function() { // do initialization as necessary if(!_initialized) { _init(); } // SHA-256 state contains eight 32-bit integers var _state = null; // input buffer var _input = forge.util.createBuffer(); // used for word storage var _w = new Array(64); // message digest object var md = { algorithm: 'sha256', blockLength: 64, digestLength: 32, // 56-bit length of message so far (does not including padding) messageLength: 0, // true message length fullMessageLength: null, // size of message length in bytes messageLengthSize: 8 }; /** * Starts the digest. * * @return this digest object. */ md.start = function() { // up to 56-bit message length for convenience md.messageLength = 0; // full message length (set md.messageLength64 for backwards-compatibility) md.fullMessageLength = md.messageLength64 = []; var int32s = md.messageLengthSize / 4; for(var i = 0; i < int32s; ++i) { md.fullMessageLength.push(0); } _input = forge.util.createBuffer(); _state = { h0: 0x6A09E667, h1: 0xBB67AE85, h2: 0x3C6EF372, h3: 0xA54FF53A, h4: 0x510E527F, h5: 0x9B05688C, h6: 0x1F83D9AB, h7: 0x5BE0CD19 }; return md; }; // start digest automatically for first time md.start(); /** * Updates the digest with the given message input. The given input can * treated as raw input (no encoding will be applied) or an encoding of * 'utf8' maybe given to encode the input using UTF-8. * * @param msg the message input to update with. * @param encoding the encoding to use (default: 'raw', other: 'utf8'). * * @return this digest object. */ md.update = function(msg, encoding) { if(encoding === 'utf8') { msg = forge.util.encodeUtf8(msg); } // update message length var len = msg.length; md.messageLength += len; len = [(len / 0x100000000) >>> 0, len >>> 0]; for(var i = md.fullMessageLength.length - 1; i >= 0; --i) { md.fullMessageLength[i] += len[1]; len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0); md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; len[0] = ((len[1] / 0x100000000) >>> 0); } // add bytes to input buffer _input.putBytes(msg); // process bytes _update(_state, _w, _input); // compact input buffer every 2K or if empty if(_input.read > 2048 || _input.length() === 0) { _input.compact(); } return md; }; /** * Produces the digest. * * @return a byte buffer containing the digest value. */ md.digest = function() { /* Note: Here we copy the remaining bytes in the input buffer and add the appropriate SHA-256 padding. Then we do the final update on a copy of the state so that if the user wants to get intermediate digests they can do so. */ /* Determine the number of bytes that must be added to the message to ensure its length is congruent to 448 mod 512. In other words, the data to be digested must be a multiple of 512 bits (or 128 bytes). This data includes the message, some padding, and the length of the message. Since the length of the message will be encoded as 8 bytes (64 bits), that means that the last segment of the data must have 56 bytes (448 bits) of message and padding. Therefore, the length of the message plus the padding must be congruent to 448 mod 512 because 512 - 128 = 448. In order to fill up the message length it must be filled with padding that begins with 1 bit followed by all 0 bits. Padding must *always* be present, so if the message length is already congruent to 448 mod 512, then 512 padding bits must be added. */ var finalBlock = forge.util.createBuffer(); finalBlock.putBytes(_input.bytes()); // compute remaining size to be digested (include message length size) var remaining = ( md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize); // add padding for overflow blockSize - overflow // _padding starts with 1 byte with first bit is set (byte value 128), then // there may be up to (blockSize - 1) other pad bytes var overflow = remaining & (md.blockLength - 1); finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); // serialize message length in bits in big-endian order; since length // is stored in bytes we multiply by 8 and add carry from next int var next, carry; var bits = md.fullMessageLength[0] * 8; for(var i = 0; i < md.fullMessageLength.length - 1; ++i) { next = md.fullMessageLength[i + 1] * 8; carry = (next / 0x100000000) >>> 0; bits += carry; finalBlock.putInt32(bits >>> 0); bits = next >>> 0; } finalBlock.putInt32(bits); var s2 = { h0: _state.h0, h1: _state.h1, h2: _state.h2, h3: _state.h3, h4: _state.h4, h5: _state.h5, h6: _state.h6, h7: _state.h7 }; _update(s2, _w, finalBlock); var rval = forge.util.createBuffer(); rval.putInt32(s2.h0); rval.putInt32(s2.h1); rval.putInt32(s2.h2); rval.putInt32(s2.h3); rval.putInt32(s2.h4); rval.putInt32(s2.h5); rval.putInt32(s2.h6); rval.putInt32(s2.h7); return rval; }; return md; }; // sha-256 padding bytes not initialized yet var _padding = null; var _initialized = false; // table of constants var _k = null; /** * Initializes the constant tables. */ function _init() { // create padding _padding = String.fromCharCode(128); _padding += forge.util.fillString(String.fromCharCode(0x00), 64); // create K table for SHA-256 _k = [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; // now initialized _initialized = true; } /** * Updates a SHA-256 state with the given byte buffer. * * @param s the SHA-256 state to update. * @param w the array to use to store words. * @param bytes the byte buffer to update with. */ function _update(s, w, bytes) { // consume 512 bit (64 byte) chunks var t1, t2, s0, s1, ch, maj, i, a, b, c, d, e, f, g, h; var len = bytes.length(); while(len >= 64) { // the w array will be populated with sixteen 32-bit big-endian words // and then extended into 64 32-bit words according to SHA-256 for(i = 0; i < 16; ++i) { w[i] = bytes.getInt32(); } for(; i < 64; ++i) { // XOR word 2 words ago rot right 17, rot right 19, shft right 10 t1 = w[i - 2]; t1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10); // XOR word 15 words ago rot right 7, rot right 18, shft right 3 t2 = w[i - 15]; t2 = ((t2 >>> 7) | (t2 << 25)) ^ ((t2 >>> 18) | (t2 << 14)) ^ (t2 >>> 3); // sum(t1, word 7 ago, t2, word 16 ago) modulo 2^32 w[i] = (t1 + w[i - 7] + t2 + w[i - 16]) | 0; } // initialize hash value for this chunk a = s.h0; b = s.h1; c = s.h2; d = s.h3; e = s.h4; f = s.h5; g = s.h6; h = s.h7; // round function for(i = 0; i < 64; ++i) { // Sum1(e) s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7)); // Ch(e, f, g) (optimized the same way as SHA-1) ch = g ^ (e & (f ^ g)); // Sum0(a) s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10)); // Maj(a, b, c) (optimized the same way as SHA-1) maj = (a & b) | (c & (a ^ b)); // main algorithm t1 = h + s1 + ch + _k[i] + w[i]; t2 = s0 + maj; h = g; g = f; f = e; // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug // can't truncate with `| 0` e = (d + t1) >>> 0; d = c; c = b; b = a; // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug // can't truncate with `| 0` a = (t1 + t2) >>> 0; } // update hash state s.h0 = (s.h0 + a) | 0; s.h1 = (s.h1 + b) | 0; s.h2 = (s.h2 + c) | 0; s.h3 = (s.h3 + d) | 0; s.h4 = (s.h4 + e) | 0; s.h5 = (s.h5 + f) | 0; s.h6 = (s.h6 + g) | 0; s.h7 = (s.h7 + h) | 0; len -= 64; } } /***/ }), /* 123 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {// Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var formatRegExp = /%[sdj%]/g; exports.format = function(f) { if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') return '%'; if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) debugEnviron = process.env.NODE_DEBUG || ''; set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) ctx.depth = arguments[2]; if (arguments.length >= 4) ctx.colors = arguments[3]; if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) ctx.showHidden = false; if (isUndefined(ctx.depth)) ctx.depth = 2; if (isUndefined(ctx.colors)) ctx.colors = false; if (isUndefined(ctx.customInspect)) ctx.customInspect = true; if (ctx.colors) ctx.stylize = stylizeWithColor; return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold' : [1, 22], 'italic' : [3, 23], 'underline' : [4, 24], 'inverse' : [7, 27], 'white' : [37, 39], 'grey' : [90, 39], 'black' : [30, 39], 'blue' : [34, 39], 'cyan' : [36, 39], 'green' : [32, 39], 'magenta' : [35, 39], 'red' : [31, 39], 'yellow' : [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function(val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) return ctx.stylize('' + value, 'number'); if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) numLinesEst++; return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = __webpack_require__(124); function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = __webpack_require__(125); exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(67))) /***/ }), /* 124 */ /***/ (function(module, exports) { module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } /***/ }), /* 125 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } /***/ }), /* 126 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2016-2017 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var URDNA2015 = __webpack_require__(68); var util = __webpack_require__(14); module.exports = function (_URDNA) { _inherits(URDNA2012, _URDNA); function URDNA2012(options) { _classCallCheck(this, URDNA2012); var _this = _possibleConstructorReturn(this, (URDNA2012.__proto__ || Object.getPrototypeOf(URDNA2012)).call(this, options)); _this.name = 'URGNA2012'; _this.hashAlgorithm = 'sha1'; return _this; } // helper for modifying component during Hash First Degree Quads _createClass(URDNA2012, [{ key: 'modifyFirstDegreeComponent', value: function modifyFirstDegreeComponent(id, component, key) { if (component.termType !== 'BlankNode') { return component; } component = util.clone(component); if (key === 'name') { component.value = '_:g'; } else { component.value = component.value === id ? '_:a' : '_:z'; } return component; } // helper for getting a related predicate }, { key: 'getRelatedPredicate', value: function getRelatedPredicate(quad) { return quad.predicate.value; } // helper for creating hash to related blank nodes map }, { key: 'createHashToRelated', value: function createHashToRelated(id, issuer, callback) { var self = this; // 1) Create a hash to related blank nodes map for storing hashes that // identify related blank nodes. var hashToRelated = {}; // 2) Get a reference, quads, to the list of quads in the blank node to // quads map for the key identifier. var quads = self.blankNodeInfo[id].quads; // 3) For each quad in quads: self.forEach(quads, function (quad, idx, callback) { // 3.1) If the quad's subject is a blank node that does not match // identifier, set hash to the result of the Hash Related Blank Node // algorithm, passing the blank node identifier for subject as related, // quad, path identifier issuer as issuer, and p as position. var position = void 0; var related = void 0; if (quad.subject.termType === 'BlankNode' && quad.subject.value !== id) { related = quad.subject.value; position = 'p'; } else if (quad.object.termType === 'BlankNode' && quad.object.value !== id) { // 3.2) Otherwise, if quad's object is a blank node that does not match // identifier, to the result of the Hash Related Blank Node algorithm, // passing the blank node identifier for object as related, quad, path // identifier issuer as issuer, and r as position. related = quad.object.value; position = 'r'; } else { // 3.3) Otherwise, continue to the next quad. return callback(); } // 3.4) Add a mapping of hash to the blank node identifier for the // component that matched (subject or object) to hash to related blank // nodes map, adding an entry as necessary. self.hashRelatedBlankNode(related, quad, issuer, position, function (err, hash) { if (err) { return callback(err); } if (hash in hashToRelated) { hashToRelated[hash].push(related); } else { hashToRelated[hash] = [related]; } callback(); }); }, function (err) { return callback(err, hashToRelated); }); } }]); return URDNA2012; }(URDNA2015); /***/ }), /* 127 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2016 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var URDNA2015Sync = __webpack_require__(72); var util = __webpack_require__(14); module.exports = function (_URDNA2015Sync) { _inherits(URDNA2012Sync, _URDNA2015Sync); function URDNA2012Sync() { _classCallCheck(this, URDNA2012Sync); var _this = _possibleConstructorReturn(this, (URDNA2012Sync.__proto__ || Object.getPrototypeOf(URDNA2012Sync)).call(this)); _this.name = 'URGNA2012'; _this.hashAlgorithm = 'sha1'; return _this; } // helper for modifying component during Hash First Degree Quads _createClass(URDNA2012Sync, [{ key: 'modifyFirstDegreeComponent', value: function modifyFirstDegreeComponent(id, component, key) { if (component.termType !== 'BlankNode') { return component; } component = util.clone(component); if (key === 'name') { component.value = '_:g'; } else { component.value = component.value === id ? '_:a' : '_:z'; } return component; } // helper for getting a related predicate }, { key: 'getRelatedPredicate', value: function getRelatedPredicate(quad) { return quad.predicate.value; } // helper for creating hash to related blank nodes map }, { key: 'createHashToRelated', value: function createHashToRelated(id, issuer) { var self = this; // 1) Create a hash to related blank nodes map for storing hashes that // identify related blank nodes. var hashToRelated = {}; // 2) Get a reference, quads, to the list of quads in the blank node to // quads map for the key identifier. var quads = self.blankNodeInfo[id].quads; // 3) For each quad in quads: for (var i = 0; i < quads.length; ++i) { // 3.1) If the quad's subject is a blank node that does not match // identifier, set hash to the result of the Hash Related Blank Node // algorithm, passing the blank node identifier for subject as related, // quad, path identifier issuer as issuer, and p as position. var quad = quads[i]; var position = void 0; var related = void 0; if (quad.subject.termType === 'BlankNode' && quad.subject.value !== id) { related = quad.subject.value; position = 'p'; } else if (quad.object.termType === 'BlankNode' && quad.object.value !== id) { // 3.2) Otherwise, if quad's object is a blank node that does not match // identifier, to the result of the Hash Related Blank Node algorithm, // passing the blank node identifier for object as related, quad, path // identifier issuer as issuer, and r as position. related = quad.object.value; position = 'r'; } else { // 3.3) Otherwise, continue to the next quad. continue; } // 3.4) Add a mapping of hash to the blank node identifier for the // component that matched (subject or object) to hash to related blank // nodes map, adding an entry as necessary. var hash = self.hashRelatedBlankNode(related, quad, issuer, position); if (hash in hashToRelated) { hashToRelated[hash].push(related); } else { hashToRelated[hash] = [related]; } } return hashToRelated; } }]); return URDNA2012Sync; }(URDNA2015Sync); /***/ }), /* 128 */ /***/ (function(module, exports) { /* (ignored) */ /***/ }), /* 129 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ // TODO: move `NQuads` to its own package module.exports = __webpack_require__(45).NQuads; /***/ }), /* 130 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ /* global Node, XMLSerializer */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var _require = __webpack_require__(25), RDF_LANGSTRING = _require.RDF_LANGSTRING, RDF_PLAIN_LITERAL = _require.RDF_PLAIN_LITERAL, RDF_OBJECT = _require.RDF_OBJECT, RDF_XML_LITERAL = _require.RDF_XML_LITERAL, XSD_STRING = _require.XSD_STRING; var _Node = void 0; if (typeof Node !== 'undefined') { _Node = Node; } else { _Node = { ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12 }; } module.exports = function () { function Rdfa() { _classCallCheck(this, Rdfa); } _createClass(Rdfa, [{ key: 'parse', /** * Parses the RDF dataset found via the data object from the RDFa API. * * @param data the RDFa API data object. * * @return the RDF dataset. */ value: function parse(data) { var dataset = {}; dataset['@default'] = []; var subjects = data.getSubjects(); for (var si = 0; si < subjects.length; ++si) { var subject = subjects[si]; if (subject === null) { continue; } // get all related triples var triples = data.getSubjectTriples(subject); if (triples === null) { continue; } var predicates = triples.predicates; for (var predicate in predicates) { // iterate over objects var objects = predicates[predicate].objects; for (var oi = 0; oi < objects.length; ++oi) { var object = objects[oi]; // create RDF triple var triple = {}; // add subject if (subject.indexOf('_:') === 0) { triple.subject = { type: 'blank node', value: subject }; } else { triple.subject = { type: 'IRI', value: subject }; } // add predicate if (predicate.indexOf('_:') === 0) { triple.predicate = { type: 'blank node', value: predicate }; } else { triple.predicate = { type: 'IRI', value: predicate }; } // serialize XML literal var value = object.value; if (object.type === RDF_XML_LITERAL) { // initialize XMLSerializer var _XMLSerializer = getXMLSerializerClass(); var serializer = new _XMLSerializer(); value = ''; for (var x = 0; x < object.value.length; x++) { if (object.value[x].nodeType === _Node.ELEMENT_NODE) { value += serializer.serializeToString(object.value[x]); } else if (object.value[x].nodeType === _Node.TEXT_NODE) { value += object.value[x].nodeValue; } } } // add object triple.object = {}; // object is an IRI if (object.type === RDF_OBJECT) { if (object.value.indexOf('_:') === 0) { triple.object.type = 'blank node'; } else { triple.object.type = 'IRI'; } } else { // object is a literal triple.object.type = 'literal'; if (object.type === RDF_PLAIN_LITERAL) { if (object.language) { triple.object.datatype = RDF_LANGSTRING; triple.object.language = object.language; } else { triple.object.datatype = XSD_STRING; } } else { triple.object.datatype = object.type; } } triple.object.value = value; // add triple to dataset in default graph dataset['@default'].push(triple); } } } return dataset; } }]); return Rdfa; }(); function getXMLSerializerClass() { if (typeof XMLSerializer === 'undefined') { return __webpack_require__(49).XMLSerializer; } return XMLSerializer; } /***/ }), /* 131 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var JsonLdError = __webpack_require__(6); var _require = __webpack_require__(4), _isArray = _require.isArray, _isObject = _require.isObject, _isEmptyObject = _require.isEmptyObject, _isString = _require.isString; var _require2 = __webpack_require__(5), _isList = _require2.isList, _isValue = _require2.isValue, _isGraph = _require2.isGraph; var _require3 = __webpack_require__(15), _expandIri = _require3.expandIri, _getContextValue = _require3.getContextValue, _isKeyword = _require3.isKeyword, _processContext = _require3.process; var _require4 = __webpack_require__(26), _isAbsoluteIri = _require4.isAbsolute; var _require5 = __webpack_require__(3), _addValue = _require5.addValue, _validateTypeValue = _require5.validateTypeValue, _getValues = _require5.getValues; var api = {}; module.exports = api; /** * Recursively expands an element using the given context. Any context in * the element will be removed. All context URLs must have been retrieved * before calling this method. * * @param activeCtx the context to use. * @param activeProperty the property for the element, null for none. * @param element the element to expand. * @param options the expansion options. * @param insideList true if the element is a list, false if not. * @param expansionMap(info) a function that can be used to custom map * unmappable values (or to throw an error when they are detected); * if this function returns `undefined` then the default behavior * will be used. * * @return a Promise that resolves to the expanded value. */ api.expand = function (_ref) { var activeCtx = _ref.activeCtx, _ref$activeProperty = _ref.activeProperty, activeProperty = _ref$activeProperty === undefined ? null : _ref$activeProperty, element = _ref.element, _ref$options = _ref.options, options = _ref$options === undefined ? {} : _ref$options, _ref$insideList = _ref.insideList, insideList = _ref$insideList === undefined ? false : _ref$insideList, _ref$expansionMap = _ref.expansionMap, expansionMap = _ref$expansionMap === undefined ? function () { return undefined; } : _ref$expansionMap; // nothing to expand if (element === null || element === undefined) { return null; } // disable framing if activeProperty is @default if (activeProperty === '@default') { options = Object.assign({}, options, { isFrame: false }); } if (!_isArray(element) && !_isObject(element)) { // drop free-floating scalars that are not in lists unless custom mapped if (!insideList && (activeProperty === null || _expandIri(activeCtx, activeProperty, { vocab: true }) === '@graph')) { // TODO: use `await` to support async var mapped = expansionMap({ unmappedValue: element, activeCtx: activeCtx, activeProperty: activeProperty, options: options, insideList: insideList }); if (mapped === undefined) { return null; } return mapped; } // expand element according to value expansion rules return _expandValue({ activeCtx: activeCtx, activeProperty: activeProperty, value: element }); } // recursively expand array if (_isArray(element)) { var _rval = []; var container = _getContextValue(activeCtx, activeProperty, '@container') || []; insideList = insideList || container.includes('@list'); for (var i = 0; i < element.length; ++i) { // expand element var e = api.expand({ activeCtx: activeCtx, activeProperty: activeProperty, element: element[i], options: options, expansionMap: expansionMap }); if (insideList && (_isArray(e) || _isList(e))) { // lists of lists are illegal throw new JsonLdError('Invalid JSON-LD syntax; lists of lists are not permitted.', 'jsonld.SyntaxError', { code: 'list of lists' }); } if (e === null) { // TODO: add `await` for async support e = expansionMap({ unmappedValue: element[i], activeCtx: activeCtx, activeProperty: activeProperty, parent: element, index: i, options: options, expandedParent: _rval, insideList: insideList }); if (e === undefined) { continue; } } if (_isArray(e)) { _rval = _rval.concat(e); } else { _rval.push(e); } } return _rval; } // recursively expand object: // if element has a context, process it if ('@context' in element) { activeCtx = _processContext({ activeCtx: activeCtx, localCtx: element['@context'], options: options }); } // look for scoped context on @type var keys = Object.keys(element).sort(); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; var expandedProperty = _expandIri(activeCtx, key, { vocab: true }); if (expandedProperty === '@type') { // set scopped contexts from @type var _types = [].concat(element[key]); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = _types[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var type = _step2.value; var ctx = _getContextValue(activeCtx, type, '@context'); if (ctx) { activeCtx = _processContext({ activeCtx: activeCtx, localCtx: ctx, options: options }); } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } } // expand the active property } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var expandedActiveProperty = _expandIri(activeCtx, activeProperty, { vocab: true }); // process each key and value in element, ignoring @nest content var rval = {}; _expandObject({ activeCtx: activeCtx, activeProperty: activeProperty, expandedActiveProperty: expandedActiveProperty, element: element, expandedParent: rval, options: options, insideList: insideList, expansionMap: expansionMap }); // get property count on expanded output keys = Object.keys(rval); var count = keys.length; if ('@value' in rval) { // @value must only have @language or @type if ('@type' in rval && '@language' in rval) { throw new JsonLdError('Invalid JSON-LD syntax; an element containing "@value" may not ' + 'contain both "@type" and "@language".', 'jsonld.SyntaxError', { code: 'invalid value object', element: rval }); } var validCount = count - 1; if ('@type' in rval) { validCount -= 1; } if ('@index' in rval) { validCount -= 1; } if ('@language' in rval) { validCount -= 1; } if (validCount !== 0) { throw new JsonLdError('Invalid JSON-LD syntax; an element containing "@value" may only ' + 'have an "@index" property and at most one other property ' + 'which can be "@type" or "@language".', 'jsonld.SyntaxError', { code: 'invalid value object', element: rval }); } var values = rval['@value'] === null ? [] : [].concat(rval['@value']); var types = _getValues(rval, '@type'); // drop null @values unless custom mapped if (values.length === 0) { // TODO: use `await` to support async var _mapped = expansionMap({ unmappedValue: rval, activeCtx: activeCtx, activeProperty: activeProperty, element: element, options: options, insideList: insideList }); if (_mapped !== undefined) { rval = _mapped; } else { rval = null; } } else if (!values.every(function (v) { return _isString(v) || _isEmptyObject(v); }) && '@language' in rval) { // if @language is present, @value must be a string throw new JsonLdError('Invalid JSON-LD syntax; only strings may be language-tagged.', 'jsonld.SyntaxError', { code: 'invalid language-tagged value', element: rval }); } else if (!types.every(function (t) { return _isAbsoluteIri(t) && !(_isString(t) && t.indexOf('_:') === 0) || _isEmptyObject(t); })) { throw new JsonLdError('Invalid JSON-LD syntax; an element containing "@value" and "@type" ' + 'must have an absolute IRI for the value of "@type".', 'jsonld.SyntaxError', { code: 'invalid typed value', element: rval }); } } else if ('@type' in rval && !_isArray(rval['@type'])) { // convert @type to an array rval['@type'] = [rval['@type']]; } else if ('@set' in rval || '@list' in rval) { // handle @set and @list if (count > 1 && !(count === 2 && '@index' in rval)) { throw new JsonLdError('Invalid JSON-LD syntax; if an element has the property "@set" ' + 'or "@list", then it can have at most one other property that is ' + '"@index".', 'jsonld.SyntaxError', { code: 'invalid set or list object', element: rval }); } // optimize away @set if ('@set' in rval) { rval = rval['@set']; keys = Object.keys(rval); count = keys.length; } } else if (count === 1 && '@language' in rval) { // drop objects with only @language unless custom mapped // TODO: use `await` to support async var _mapped2 = expansionMap(rval, { unmappedValue: rval, activeCtx: activeCtx, activeProperty: activeProperty, element: element, options: options, insideList: insideList }); if (_mapped2 !== undefined) { rval = _mapped2; } else { rval = null; } } // drop certain top-level objects that do not occur in lists, unless custom // mapped if (_isObject(rval) && !options.keepFreeFloatingNodes && !insideList && (activeProperty === null || expandedActiveProperty === '@graph')) { // drop empty object, top-level @value/@list, or object with only @id if (count === 0 || '@value' in rval || '@list' in rval || count === 1 && '@id' in rval) { // TODO: use `await` to support async var _mapped3 = expansionMap({ unmappedValue: rval, activeCtx: activeCtx, activeProperty: activeProperty, element: element, options: options, insideList: insideList }); if (_mapped3 !== undefined) { rval = _mapped3; } else { rval = null; } } } return rval; }; /** * Expand each key and value of element adding to result * * @param activeCtx the context to use. * @param activeProperty the property for the element. * @param expandedActiveProperty the expansion of activeProperty * @param element the element to expand. * @param expandedParent the expanded result into which to add values. * @param options the expansion options. * @param insideList true if the element is a list, false if not. * @param expansionMap(info) a function that can be used to custom map * unmappable values (or to throw an error when they are detected); * if this function returns `undefined` then the default behavior * will be used. */ function _expandObject(_ref2) { var activeCtx = _ref2.activeCtx, activeProperty = _ref2.activeProperty, expandedActiveProperty = _ref2.expandedActiveProperty, element = _ref2.element, expandedParent = _ref2.expandedParent, _ref2$options = _ref2.options, options = _ref2$options === undefined ? {} : _ref2$options, insideList = _ref2.insideList, expansionMap = _ref2.expansionMap; var keys = Object.keys(element).sort(); var nests = []; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = keys[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var key = _step3.value; var value = element[key]; var expandedValue = void 0; // skip @context if (key === '@context') { continue; } // expand property var expandedProperty = _expandIri(activeCtx, key, { vocab: true }); // drop non-absolute IRI keys that aren't keywords unless custom mapped if (expandedProperty === null || !(_isAbsoluteIri(expandedProperty) || _isKeyword(expandedProperty))) { // TODO: use `await` to support async expandedProperty = expansionMap({ unmappedProperty: key, activeCtx: activeCtx, activeProperty: activeProperty, parent: element, options: options, insideList: insideList, value: value, expandedParent: expandedParent }); if (expandedProperty === undefined) { continue; } } if (_isKeyword(expandedProperty)) { if (expandedActiveProperty === '@reverse') { throw new JsonLdError('Invalid JSON-LD syntax; a keyword cannot be used as a @reverse ' + 'property.', 'jsonld.SyntaxError', { code: 'invalid reverse property map', value: value }); } if (expandedProperty in expandedParent) { throw new JsonLdError('Invalid JSON-LD syntax; colliding keywords detected.', 'jsonld.SyntaxError', { code: 'colliding keywords', keyword: expandedProperty }); } } // syntax error if @id is not a string if (expandedProperty === '@id') { if (!_isString(value)) { if (!options.isFrame) { throw new JsonLdError('Invalid JSON-LD syntax; "@id" value must a string.', 'jsonld.SyntaxError', { code: 'invalid @id value', value: value }); } if (_isObject(value)) { // empty object is a wildcard if (!_isEmptyObject(value)) { throw new JsonLdError('Invalid JSON-LD syntax; "@id" value an empty object or array ' + 'of strings, if framing', 'jsonld.SyntaxError', { code: 'invalid @id value', value: value }); } } else if (_isArray(value)) { if (!value.every(function (v) { return _isString(v); })) { throw new JsonLdError('Invalid JSON-LD syntax; "@id" value an empty object or array ' + 'of strings, if framing', 'jsonld.SyntaxError', { code: 'invalid @id value', value: value }); } } else { throw new JsonLdError('Invalid JSON-LD syntax; "@id" value an empty object or array ' + 'of strings, if framing', 'jsonld.SyntaxError', { code: 'invalid @id value', value: value }); } } _addValue(expandedParent, '@id', [].concat(value).map(function (v) { return _isString(v) ? _expandIri(activeCtx, v, { base: true }) : v; }), { propertyIsArray: options.isFrame }); continue; } if (expandedProperty === '@type') { _validateTypeValue(value); _addValue(expandedParent, '@type', [].concat(value).map(function (v) { return _isString(v) ? _expandIri(activeCtx, v, { base: true, vocab: true }) : v; }), { propertyIsArray: options.isFrame }); continue; } // @graph must be an array or an object if (expandedProperty === '@graph' && !(_isObject(value) || _isArray(value))) { throw new JsonLdError('Invalid JSON-LD syntax; "@graph" value must not be an ' + 'object or an array.', 'jsonld.SyntaxError', { code: 'invalid @graph value', value: value }); } // @value must not be an object or an array (unless framing) if (expandedProperty === '@value') { if ((_isObject(value) || _isArray(value)) && !options.isFrame) { throw new JsonLdError('Invalid JSON-LD syntax; "@value" value must not be an ' + 'object or an array.', 'jsonld.SyntaxError', { code: 'invalid value object value', value: value }); } _addValue(expandedParent, '@value', value, { propertyIsArray: options.isFrame }); continue; } // @language must be a string if (expandedProperty === '@language') { if (value === null) { // drop null @language values, they expand as if they didn't exist continue; } if (!_isString(value) && !options.isFrame) { throw new JsonLdError('Invalid JSON-LD syntax; "@language" value must be a string.', 'jsonld.SyntaxError', { code: 'invalid language-tagged string', value: value }); } // ensure language value is lowercase value = [].concat(value).map(function (v) { return _isString(v) ? v.toLowerCase() : v; }); _addValue(expandedParent, '@language', value, { propertyIsArray: options.isFrame }); continue; } // @index must be a string if (expandedProperty === '@index') { if (!_isString(value)) { throw new JsonLdError('Invalid JSON-LD syntax; "@index" value must be a string.', 'jsonld.SyntaxError', { code: 'invalid @index value', value: value }); } _addValue(expandedParent, '@index', value); continue; } // @reverse must be an object if (expandedProperty === '@reverse') { if (!_isObject(value)) { throw new JsonLdError('Invalid JSON-LD syntax; "@reverse" value must be an object.', 'jsonld.SyntaxError', { code: 'invalid @reverse value', value: value }); } expandedValue = api.expand({ activeCtx: activeCtx, activeProperty: '@reverse', element: value, options: options, expansionMap: expansionMap }); // properties double-reversed if ('@reverse' in expandedValue) { for (var property in expandedValue['@reverse']) { _addValue(expandedParent, property, expandedValue['@reverse'][property], { propertyIsArray: true }); } } // FIXME: can this be merged with code below to simplify? // merge in all reversed properties var reverseMap = expandedParent['@reverse'] || null; for (var _property in expandedValue) { if (_property === '@reverse') { continue; } if (reverseMap === null) { reverseMap = expandedParent['@reverse'] = {}; } _addValue(reverseMap, _property, [], { propertyIsArray: true }); var items = expandedValue[_property]; for (var ii = 0; ii < items.length; ++ii) { var item = items[ii]; if (_isValue(item) || _isList(item)) { throw new JsonLdError('Invalid JSON-LD syntax; "@reverse" value must not be a ' + '@value or an @list.', 'jsonld.SyntaxError', { code: 'invalid reverse property value', value: expandedValue }); } _addValue(reverseMap, _property, item, { propertyIsArray: true }); } } continue; } // nested keys if (expandedProperty === '@nest') { nests.push(key); continue; } // use potential scoped context for key var termCtx = activeCtx; var ctx = _getContextValue(activeCtx, key, '@context'); if (ctx) { termCtx = _processContext({ activeCtx: activeCtx, localCtx: ctx, options: options }); } var container = _getContextValue(termCtx, key, '@container') || []; if (container.includes('@language') && _isObject(value)) { // handle language map container (skip if value is not an object) expandedValue = _expandLanguageMap(termCtx, value); } else if (container.includes('@index') && _isObject(value)) { // handle index container (skip if value is not an object) var asGraph = container.includes('@graph'); expandedValue = _expandIndexMap({ activeCtx: termCtx, options: options, activeProperty: key, value: value, expansionMap: expansionMap, asGraph: asGraph, indexKey: '@index' }); } else if (container.includes('@id') && _isObject(value)) { // handle id container (skip if value is not an object) var _asGraph = container.includes('@graph'); expandedValue = _expandIndexMap({ activeCtx: termCtx, options: options, activeProperty: key, value: value, expansionMap: expansionMap, asGraph: _asGraph, indexKey: '@id' }); } else if (container.includes('@type') && _isObject(value)) { // handle type container (skip if value is not an object) expandedValue = _expandIndexMap({ activeCtx: termCtx, options: options, activeProperty: key, value: value, expansionMap: expansionMap, asGraph: false, indexKey: '@type' }); } else { // recurse into @list or @set var isList = expandedProperty === '@list'; if (isList || expandedProperty === '@set') { var nextActiveProperty = activeProperty; if (isList && expandedActiveProperty === '@graph') { nextActiveProperty = null; } expandedValue = api.expand({ activeCtx: termCtx, activeProperty: nextActiveProperty, element: value, options: options, insideList: isList, expansionMap: expansionMap }); if (isList && _isList(expandedValue)) { throw new JsonLdError('Invalid JSON-LD syntax; lists of lists are not permitted.', 'jsonld.SyntaxError', { code: 'list of lists' }); } } else { // recursively expand value with key as new active property expandedValue = api.expand({ activeCtx: termCtx, activeProperty: key, element: value, options: options, insideList: false, expansionMap: expansionMap }); } } // drop null values if property is not @value if (expandedValue === null && expandedProperty !== '@value') { // TODO: use `await` to support async expandedValue = expansionMap({ unmappedValue: value, expandedProperty: expandedProperty, activeCtx: termCtx, activeProperty: activeProperty, parent: element, options: options, insideList: insideList, key: key, expandedParent: expandedParent }); if (expandedValue === undefined) { continue; } } // convert expanded value to @list if container specifies it if (expandedProperty !== '@list' && !_isList(expandedValue) && container.includes('@list')) { // ensure expanded value is an array expandedValue = _isArray(expandedValue) ? expandedValue : [expandedValue]; expandedValue = { '@list': expandedValue }; } // convert expanded value to @graph if container specifies it // and value is not, itself, a graph // index cases handled above if (container.includes('@graph') && !container.some(function (key) { return key === '@id' || key === '@index'; }) && !_isGraph(expandedValue)) { // ensure expanded value is an array expandedValue = [].concat(expandedValue); expandedValue = { '@graph': expandedValue }; } // FIXME: can this be merged with code above to simplify? // merge in reverse properties if (termCtx.mappings[key] && termCtx.mappings[key].reverse) { var _reverseMap = expandedParent['@reverse'] = expandedParent['@reverse'] || {}; if (!_isArray(expandedValue)) { expandedValue = [expandedValue]; } for (var _ii = 0; _ii < expandedValue.length; ++_ii) { var _item = expandedValue[_ii]; if (_isValue(_item) || _isList(_item)) { throw new JsonLdError('Invalid JSON-LD syntax; "@reverse" value must not be a ' + '@value or an @list.', 'jsonld.SyntaxError', { code: 'invalid reverse property value', value: expandedValue }); } _addValue(_reverseMap, expandedProperty, _item, { propertyIsArray: true }); } continue; } // add value for property // use an array except for certain keywords var useArray = !['@index', '@id', '@type', '@value', '@language'].includes(expandedProperty); _addValue(expandedParent, expandedProperty, expandedValue, { propertyIsArray: useArray }); } // expand each nested key } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = nests[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { var _key = _step4.value; var nestedValues = _isArray(element[_key]) ? element[_key] : [element[_key]]; var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { for (var _iterator5 = nestedValues[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { var nv = _step5.value; if (!_isObject(nv) || Object.keys(nv).some(function (k) { return _expandIri(activeCtx, k, { vocab: true }) === '@value'; })) { throw new JsonLdError('Invalid JSON-LD syntax; nested value must be a node object.', 'jsonld.SyntaxError', { code: 'invalid @nest value', value: nv }); } _expandObject({ activeCtx: activeCtx, activeProperty: activeProperty, expandedActiveProperty: expandedActiveProperty, element: nv, expandedParent: expandedParent, options: options, insideList: insideList, expansionMap: expansionMap }); } } catch (err) { _didIteratorError5 = true; _iteratorError5 = err; } finally { try { if (!_iteratorNormalCompletion5 && _iterator5.return) { _iterator5.return(); } } finally { if (_didIteratorError5) { throw _iteratorError5; } } } } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } } /** * Expands the given value by using the coercion and keyword rules in the * given context. * * @param activeCtx the active context to use. * @param activeProperty the active property the value is associated with. * @param value the value to expand. * * @return the expanded value. */ function _expandValue(_ref3) { var activeCtx = _ref3.activeCtx, activeProperty = _ref3.activeProperty, value = _ref3.value; // nothing to expand if (value === null || value === undefined) { return null; } // special-case expand @id and @type (skips '@id' expansion) var expandedProperty = _expandIri(activeCtx, activeProperty, { vocab: true }); if (expandedProperty === '@id') { return _expandIri(activeCtx, value, { base: true }); } else if (expandedProperty === '@type') { return _expandIri(activeCtx, value, { vocab: true, base: true }); } // get type definition from context var type = _getContextValue(activeCtx, activeProperty, '@type'); // do @id expansion (automatic for @graph) if ((type === '@id' || expandedProperty === '@graph') && _isString(value)) { return { '@id': _expandIri(activeCtx, value, { base: true }) }; } // do @id expansion w/vocab if (type === '@vocab' && _isString(value)) { return { '@id': _expandIri(activeCtx, value, { vocab: true, base: true }) }; } // do not expand keyword values if (_isKeyword(expandedProperty)) { return value; } var rval = {}; if (type && !['@id', '@vocab'].includes(type)) { // other type rval['@type'] = type; } else if (_isString(value)) { // check for language tagging for strings var language = _getContextValue(activeCtx, activeProperty, '@language'); if (language !== null) { rval['@language'] = language; } } // do conversion of values that aren't basic JSON types to strings if (!['boolean', 'number', 'string'].includes(typeof value === 'undefined' ? 'undefined' : _typeof(value))) { value = value.toString(); } rval['@value'] = value; return rval; } /** * Expands a language map. * * @param activeCtx the active context to use. * @param languageMap the language map to expand. * * @return the expanded language map. */ function _expandLanguageMap(activeCtx, languageMap) { var rval = []; var keys = Object.keys(languageMap).sort(); var _iteratorNormalCompletion6 = true; var _didIteratorError6 = false; var _iteratorError6 = undefined; try { for (var _iterator6 = keys[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { var key = _step6.value; var expandedKey = _expandIri(activeCtx, key, { vocab: true }); var val = languageMap[key]; if (!_isArray(val)) { val = [val]; } var _iteratorNormalCompletion7 = true; var _didIteratorError7 = false; var _iteratorError7 = undefined; try { for (var _iterator7 = val[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { var item = _step7.value; if (item === null) { // null values are allowed (8.5) but ignored (3.1) continue; } if (!_isString(item)) { throw new JsonLdError('Invalid JSON-LD syntax; language map values must be strings.', 'jsonld.SyntaxError', { code: 'invalid language map value', languageMap: languageMap }); } var _val = { '@value': item }; if (expandedKey !== '@none') { _val['@language'] = key.toLowerCase(); } rval.push(_val); } } catch (err) { _didIteratorError7 = true; _iteratorError7 = err; } finally { try { if (!_iteratorNormalCompletion7 && _iterator7.return) { _iterator7.return(); } } finally { if (_didIteratorError7) { throw _iteratorError7; } } } } } catch (err) { _didIteratorError6 = true; _iteratorError6 = err; } finally { try { if (!_iteratorNormalCompletion6 && _iterator6.return) { _iterator6.return(); } } finally { if (_didIteratorError6) { throw _iteratorError6; } } } return rval; } function _expandIndexMap(_ref4) { var activeCtx = _ref4.activeCtx, options = _ref4.options, activeProperty = _ref4.activeProperty, value = _ref4.value, expansionMap = _ref4.expansionMap, asGraph = _ref4.asGraph, indexKey = _ref4.indexKey; var rval = []; var keys = Object.keys(value).sort(); var _iteratorNormalCompletion8 = true; var _didIteratorError8 = false; var _iteratorError8 = undefined; try { for (var _iterator8 = keys[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { var key = _step8.value; // if indexKey is @type, there may be a context defined for it var ctx = _getContextValue(activeCtx, key, '@context'); if (ctx) { activeCtx = _processContext({ activeCtx: activeCtx, localCtx: ctx, options: options }); } var val = value[key]; if (!_isArray(val)) { val = [val]; } // expand for @type, but also for @none var expandedKey = _expandIri(activeCtx, key, { vocab: true }); if (indexKey === '@id') { // expand document relative key = _expandIri(activeCtx, key, { base: true }); } else if (indexKey === '@type') { key = expandedKey; } val = api.expand({ activeCtx: activeCtx, activeProperty: activeProperty, element: val, options: options, insideList: false, expansionMap: expansionMap }); var _iteratorNormalCompletion9 = true; var _didIteratorError9 = false; var _iteratorError9 = undefined; try { for (var _iterator9 = val[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { var item = _step9.value; // If this is also a @graph container, turn items into graphs if (asGraph && !_isGraph(item)) { item = { '@graph': [item] }; } if (indexKey === '@type') { if (expandedKey === '@none') { // ignore @none } else if (item['@type']) { item['@type'] = [key].concat(item['@type']); } else { item['@type'] = [key]; } } else if (expandedKey !== '@none' && !(indexKey in item)) { item[indexKey] = key; } rval.push(item); } } catch (err) { _didIteratorError9 = true; _iteratorError9 = err; } finally { try { if (!_iteratorNormalCompletion9 && _iterator9.return) { _iterator9.return(); } } finally { if (_didIteratorError9) { throw _iteratorError9; } } } } } catch (err) { _didIteratorError8 = true; _iteratorError8 = err; } finally { try { if (!_iteratorNormalCompletion8 && _iterator8.return) { _iterator8.return(); } } finally { if (_didIteratorError8) { throw _iteratorError8; } } } return rval; } /***/ }), /* 132 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var _require = __webpack_require__(3), clone = _require.clone; module.exports = function () { /** * Creates an active context cache. * * @param size the maximum size of the cache. */ function ActiveContextCache() { var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100; _classCallCheck(this, ActiveContextCache); this.order = []; this.cache = {}; this.size = size; } _createClass(ActiveContextCache, [{ key: 'get', value: function get(activeCtx, localCtx) { var key1 = JSON.stringify(activeCtx); var key2 = JSON.stringify(localCtx); var level1 = this.cache[key1]; if (level1 && key2 in level1) { return level1[key2]; } return null; } }, { key: 'set', value: function set(activeCtx, localCtx, result) { if (this.order.length === this.size) { var entry = this.order.shift(); delete this.cache[entry.activeCtx][entry.localCtx]; } var key1 = JSON.stringify(activeCtx); var key2 = JSON.stringify(localCtx); this.order.push({ activeCtx: key1, localCtx: key2 }); if (!(key1 in this.cache)) { this.cache[key1] = {}; } this.cache[key1][key2] = clone(result); } }]); return ActiveContextCache; }(); /***/ }), /* 133 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _require = __webpack_require__(5), _isSubjectReference = _require.isSubjectReference; var _require2 = __webpack_require__(33), _createMergedNodeMap = _require2.createMergedNodeMap; var api = {}; module.exports = api; /** * Performs JSON-LD flattening. * * @param input the expanded JSON-LD to flatten. * * @return the flattened output. */ api.flatten = function (input) { var defaultGraph = _createMergedNodeMap(input); // produce flattened output var flattened = []; var keys = Object.keys(defaultGraph).sort(); for (var ki = 0; ki < keys.length; ++ki) { var node = defaultGraph[keys[ki]]; // only add full subjects to top-level if (!_isSubjectReference(node)) { flattened.push(node); } } return flattened; }; /***/ }), /* 134 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var graphTypes = __webpack_require__(5); var types = __webpack_require__(4); var util = __webpack_require__(3); // constants var _require = __webpack_require__(25), RDF_LIST = _require.RDF_LIST, RDF_FIRST = _require.RDF_FIRST, RDF_REST = _require.RDF_REST, RDF_NIL = _require.RDF_NIL, RDF_TYPE = _require.RDF_TYPE, XSD_BOOLEAN = _require.XSD_BOOLEAN, XSD_DOUBLE = _require.XSD_DOUBLE, XSD_INTEGER = _require.XSD_INTEGER, XSD_STRING = _require.XSD_STRING; var api = {}; module.exports = api; /** * Converts an RDF dataset to JSON-LD. * * @param dataset the RDF dataset. * @param options the RDF serialization options. * * @return a Promise that resolves to the JSON-LD output. */ api.fromRDF = function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(dataset, _ref) { var _ref$useRdfType = _ref.useRdfType, useRdfType = _ref$useRdfType === undefined ? false : _ref$useRdfType, _ref$useNativeTypes = _ref.useNativeTypes, useNativeTypes = _ref$useNativeTypes === undefined ? false : _ref$useNativeTypes; var defaultGraph, graphMap, referencedOnce, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, quad, name, nodeMap, s, p, o, node, objectIsNode, value, object, graphObject, nil, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, usage, property, head, list, listNodes, nodeKeyCount, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, listNode, result, subjects, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator4, _step4, subject, _node, graph, _graphObject, graphSubjects, _iteratorNormalCompletion5, _didIteratorError5, _iteratorError5, _iterator5, _step5, graphSubject, _node2; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: defaultGraph = {}; graphMap = { '@default': defaultGraph }; referencedOnce = {}; _iteratorNormalCompletion = true; _didIteratorError = false; _iteratorError = undefined; _context.prev = 6; _iterator = dataset[Symbol.iterator](); case 8: if (_iteratorNormalCompletion = (_step = _iterator.next()).done) { _context.next = 30; break; } quad = _step.value; // TODO: change 'name' to 'graph' name = quad.graph.termType === 'DefaultGraph' ? '@default' : quad.graph.value; if (!(name in graphMap)) { graphMap[name] = {}; } if (name !== '@default' && !(name in defaultGraph)) { defaultGraph[name] = { '@id': name }; } nodeMap = graphMap[name]; // get subject, predicate, object s = quad.subject.value; p = quad.predicate.value; o = quad.object; if (!(s in nodeMap)) { nodeMap[s] = { '@id': s }; } node = nodeMap[s]; objectIsNode = o.termType.endsWith('Node'); if (objectIsNode && !(o.value in nodeMap)) { nodeMap[o.value] = { '@id': o.value }; } if (!(p === RDF_TYPE && !useRdfType && objectIsNode)) { _context.next = 24; break; } util.addValue(node, '@type', o.value, { propertyIsArray: true }); return _context.abrupt('continue', 27); case 24: value = _RDFToObject(o, useNativeTypes); util.addValue(node, p, value, { propertyIsArray: true }); // object may be an RDF list/partial list node but we can't know easily // until all triples are read if (objectIsNode) { if (o.value === RDF_NIL) { // track rdf:nil uniquely per graph object = nodeMap[o.value]; if (!('usages' in object)) { object.usages = []; } object.usages.push({ node: node, property: p, value: value }); } else if (o.value in referencedOnce) { // object referenced more than once referencedOnce[o.value] = false; } else { // keep track of single reference referencedOnce[o.value] = { node: node, property: p, value: value }; } } case 27: _iteratorNormalCompletion = true; _context.next = 8; break; case 30: _context.next = 36; break; case 32: _context.prev = 32; _context.t0 = _context['catch'](6); _didIteratorError = true; _iteratorError = _context.t0; case 36: _context.prev = 36; _context.prev = 37; if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } case 39: _context.prev = 39; if (!_didIteratorError) { _context.next = 42; break; } throw _iteratorError; case 42: return _context.finish(39); case 43: return _context.finish(36); case 44: _context.t1 = regeneratorRuntime.keys(graphMap); case 45: if ((_context.t2 = _context.t1()).done) { _context.next = 125; break; } name = _context.t2.value; graphObject = graphMap[name]; // no @lists to be converted, continue if (RDF_NIL in graphObject) { _context.next = 50; break; } return _context.abrupt('continue', 45); case 50: // iterate backwards through each RDF list nil = graphObject[RDF_NIL]; if (nil.usages) { _context.next = 53; break; } return _context.abrupt('continue', 45); case 53: _iteratorNormalCompletion2 = true; _didIteratorError2 = false; _iteratorError2 = undefined; _context.prev = 56; _iterator2 = nil.usages[Symbol.iterator](); case 58: if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) { _context.next = 108; break; } usage = _step2.value; node = usage.node; property = usage.property; head = usage.value; list = []; listNodes = []; // ensure node is a well-formed list node; it must: // 1. Be referenced only once. // 2. Have an array for rdf:first that has 1 item. // 3. Have an array for rdf:rest that has 1 item. // 4. Have no keys other than: @id, rdf:first, rdf:rest, and, // optionally, @type where the value is rdf:List. nodeKeyCount = Object.keys(node).length; case 66: if (!(property === RDF_REST && types.isObject(referencedOnce[node['@id']]) && types.isArray(node[RDF_FIRST]) && node[RDF_FIRST].length === 1 && types.isArray(node[RDF_REST]) && node[RDF_REST].length === 1 && (nodeKeyCount === 3 || nodeKeyCount === 4 && types.isArray(node['@type']) && node['@type'].length === 1 && node['@type'][0] === RDF_LIST))) { _context.next = 78; break; } list.push(node[RDF_FIRST][0]); listNodes.push(node['@id']); // get next node, moving backwards through list usage = referencedOnce[node['@id']]; node = usage.node; property = usage.property; head = usage.value; nodeKeyCount = Object.keys(node).length; // if node is not a blank node, then list head found if (graphTypes.isBlankNode(node)) { _context.next = 76; break; } return _context.abrupt('break', 78); case 76: _context.next = 66; break; case 78: if (!(property === RDF_FIRST)) { _context.next = 84; break; } if (!(node['@id'] === RDF_NIL)) { _context.next = 81; break; } return _context.abrupt('continue', 105); case 81: // preserve list head head = graphObject[head['@id']][RDF_REST][0]; list.pop(); listNodes.pop(); case 84: // transform list into @list object delete head['@id']; head['@list'] = list.reverse(); _iteratorNormalCompletion3 = true; _didIteratorError3 = false; _iteratorError3 = undefined; _context.prev = 89; for (_iterator3 = listNodes[Symbol.iterator](); !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { listNode = _step3.value; delete graphObject[listNode]; } _context.next = 97; break; case 93: _context.prev = 93; _context.t3 = _context['catch'](89); _didIteratorError3 = true; _iteratorError3 = _context.t3; case 97: _context.prev = 97; _context.prev = 98; if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } case 100: _context.prev = 100; if (!_didIteratorError3) { _context.next = 103; break; } throw _iteratorError3; case 103: return _context.finish(100); case 104: return _context.finish(97); case 105: _iteratorNormalCompletion2 = true; _context.next = 58; break; case 108: _context.next = 114; break; case 110: _context.prev = 110; _context.t4 = _context['catch'](56); _didIteratorError2 = true; _iteratorError2 = _context.t4; case 114: _context.prev = 114; _context.prev = 115; if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } case 117: _context.prev = 117; if (!_didIteratorError2) { _context.next = 120; break; } throw _iteratorError2; case 120: return _context.finish(117); case 121: return _context.finish(114); case 122: delete nil.usages; _context.next = 45; break; case 125: result = []; subjects = Object.keys(defaultGraph).sort(); _iteratorNormalCompletion4 = true; _didIteratorError4 = false; _iteratorError4 = undefined; _context.prev = 130; _iterator4 = subjects[Symbol.iterator](); case 132: if (_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done) { _context.next = 162; break; } subject = _step4.value; _node = defaultGraph[subject]; if (!(subject in graphMap)) { _context.next = 158; break; } graph = _node['@graph'] = []; _graphObject = graphMap[subject]; graphSubjects = Object.keys(_graphObject).sort(); _iteratorNormalCompletion5 = true; _didIteratorError5 = false; _iteratorError5 = undefined; _context.prev = 142; for (_iterator5 = graphSubjects[Symbol.iterator](); !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { graphSubject = _step5.value; _node2 = _graphObject[graphSubject]; // only add full subjects to top-level if (!graphTypes.isSubjectReference(_node2)) { graph.push(_node2); } } _context.next = 150; break; case 146: _context.prev = 146; _context.t5 = _context['catch'](142); _didIteratorError5 = true; _iteratorError5 = _context.t5; case 150: _context.prev = 150; _context.prev = 151; if (!_iteratorNormalCompletion5 && _iterator5.return) { _iterator5.return(); } case 153: _context.prev = 153; if (!_didIteratorError5) { _context.next = 156; break; } throw _iteratorError5; case 156: return _context.finish(153); case 157: return _context.finish(150); case 158: // only add full subjects to top-level if (!graphTypes.isSubjectReference(_node)) { result.push(_node); } case 159: _iteratorNormalCompletion4 = true; _context.next = 132; break; case 162: _context.next = 168; break; case 164: _context.prev = 164; _context.t6 = _context['catch'](130); _didIteratorError4 = true; _iteratorError4 = _context.t6; case 168: _context.prev = 168; _context.prev = 169; if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } case 171: _context.prev = 171; if (!_didIteratorError4) { _context.next = 174; break; } throw _iteratorError4; case 174: return _context.finish(171); case 175: return _context.finish(168); case 176: return _context.abrupt('return', result); case 177: case 'end': return _context.stop(); } } }, _callee, undefined, [[6, 32, 36, 44], [37,, 39, 43], [56, 110, 114, 122], [89, 93, 97, 105], [98,, 100, 104], [115,, 117, 121], [130, 164, 168, 176], [142, 146, 150, 158], [151,, 153, 157], [169,, 171, 175]]); })); return function (_x, _x2) { return _ref2.apply(this, arguments); }; }(); /** * Converts an RDF triple object to a JSON-LD object. * * @param o the RDF triple object to convert. * @param useNativeTypes true to output native types, false not to. * * @return the JSON-LD object. */ function _RDFToObject(o, useNativeTypes) { // convert NamedNode/BlankNode object to JSON-LD if (o.termType.endsWith('Node')) { return { '@id': o.value }; } // convert literal to JSON-LD var rval = { '@value': o.value }; // add language if (o.language) { rval['@language'] = o.language; } else { var type = o.datatype.value; if (!type) { type = XSD_STRING; } // use native types for certain xsd types if (useNativeTypes) { if (type === XSD_BOOLEAN) { if (rval['@value'] === 'true') { rval['@value'] = true; } else if (rval['@value'] === 'false') { rval['@value'] = false; } } else if (types.isNumeric(rval['@value'])) { if (type === XSD_INTEGER) { var i = parseInt(rval['@value'], 10); if (i.toFixed(0) === rval['@value']) { rval['@value'] = i; } } else if (type === XSD_DOUBLE) { rval['@value'] = parseFloat(rval['@value']); } } // do not add native type if (![XSD_BOOLEAN, XSD_INTEGER, XSD_DOUBLE, XSD_STRING].includes(type)) { rval['@type'] = type; } } else if (type !== XSD_STRING) { rval['@type'] = type; } } return rval; } /***/ }), /* 135 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _require = __webpack_require__(33), createNodeMap = _require.createNodeMap; var _require2 = __webpack_require__(15), isKeyword = _require2.isKeyword; var graphTypes = __webpack_require__(5); var types = __webpack_require__(4); var util = __webpack_require__(3); var _require3 = __webpack_require__(25), RDF_FIRST = _require3.RDF_FIRST, RDF_REST = _require3.RDF_REST, RDF_NIL = _require3.RDF_NIL, RDF_TYPE = _require3.RDF_TYPE, RDF_LANGSTRING = _require3.RDF_LANGSTRING, XSD_BOOLEAN = _require3.XSD_BOOLEAN, XSD_DOUBLE = _require3.XSD_DOUBLE, XSD_INTEGER = _require3.XSD_INTEGER, XSD_STRING = _require3.XSD_STRING; var _require4 = __webpack_require__(26), _isAbsoluteIri = _require4.isAbsolute; var api = {}; module.exports = api; /** * Outputs an RDF dataset for the expanded JSON-LD input. * * @param input the expanded JSON-LD input. * @param options the RDF serialization options. * * @return the RDF dataset. */ api.toRDF = function (input, options) { // create node map for default graph (and any named graphs) var issuer = new util.IdentifierIssuer('_:b'); var nodeMap = { '@default': {} }; createNodeMap(input, nodeMap, '@default', issuer); var dataset = []; var graphNames = Object.keys(nodeMap).sort(); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = graphNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var graphName = _step.value; var graphTerm = void 0; if (graphName === '@default') { graphTerm = { termType: 'DefaultGraph', value: '' }; } else if (_isAbsoluteIri(graphName)) { if (graphName.startsWith('_:')) { graphTerm = { termType: 'BlankNode' }; } else { graphTerm = { termType: 'NamedNode' }; } graphTerm.value = graphName; } else { // skip relative IRIs (not valid RDF) continue; } _graphToRDF(dataset, nodeMap[graphName], graphTerm, issuer, options); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return dataset; }; /** * Adds RDF quads for a particular graph to the given dataset. * * @param dataset the dataset to append RDF quads to. * @param graph the graph to create RDF quads for. * @param graphTerm the graph term for each quad. * @param issuer a IdentifierIssuer for assigning blank node names. * @param options the RDF serialization options. * * @return the array of RDF triples for the given graph. */ function _graphToRDF(dataset, graph, graphTerm, issuer, options) { var ids = Object.keys(graph).sort(); for (var i = 0; i < ids.length; ++i) { var id = ids[i]; var node = graph[id]; var properties = Object.keys(node).sort(); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = properties[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var property = _step2.value; var items = node[property]; if (property === '@type') { property = RDF_TYPE; } else if (isKeyword(property)) { continue; } var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = items[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var item = _step3.value; // RDF subject var subject = { termType: id.startsWith('_:') ? 'BlankNode' : 'NamedNode', value: id }; // skip relative IRI subjects (not valid RDF) if (!_isAbsoluteIri(id)) { continue; } // RDF predicate var predicate = { termType: property.startsWith('_:') ? 'BlankNode' : 'NamedNode', value: property }; // skip relative IRI predicates (not valid RDF) if (!_isAbsoluteIri(property)) { continue; } // skip blank node predicates unless producing generalized RDF if (predicate.termType === 'BlankNode' && !options.produceGeneralizedRdf) { continue; } // convert @list to triples if (graphTypes.isList(item)) { _listToRDF(item['@list'], issuer, subject, predicate, dataset, graphTerm); } else { // convert value or node object to triple var object = _objectToRDF(item); // skip null objects (they are relative IRIs) if (object) { dataset.push({ subject: subject, predicate: predicate, object: object, graph: graphTerm }); } } } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } } /** * Converts a @list value into linked list of blank node RDF quads * (an RDF collection). * * @param list the @list value. * @param issuer a IdentifierIssuer for assigning blank node names. * @param subject the subject for the head of the list. * @param predicate the predicate for the head of the list. * @param dataset the array of quads to append to. * @param graphTerm the graph term for each quad. */ function _listToRDF(list, issuer, subject, predicate, dataset, graphTerm) { var first = { termType: 'NamedNode', value: RDF_FIRST }; var rest = { termType: 'NamedNode', value: RDF_REST }; var nil = { termType: 'NamedNode', value: RDF_NIL }; var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = list[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { var item = _step4.value; var blankNode = { termType: 'BlankNode', value: issuer.getId() }; dataset.push({ subject: subject, predicate: predicate, object: blankNode, graph: graphTerm }); subject = blankNode; predicate = first; var object = _objectToRDF(item); // skip null objects (they are relative IRIs) if (object) { dataset.push({ subject: subject, predicate: predicate, object: object, graph: graphTerm }); } predicate = rest; } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } dataset.push({ subject: subject, predicate: predicate, object: nil, graph: graphTerm }); } /** * Converts a JSON-LD value object to an RDF literal or a JSON-LD string or * node object to an RDF resource. * * @param item the JSON-LD value or node object. * * @return the RDF literal or RDF resource. */ function _objectToRDF(item) { var object = {}; // convert value object to RDF if (graphTypes.isValue(item)) { object.termType = 'Literal'; object.value = undefined; object.datatype = { termType: 'NamedNode' }; var value = item['@value']; var datatype = item['@type'] || null; // convert to XSD datatypes as appropriate if (types.isBoolean(value)) { object.value = value.toString(); object.datatype.value = datatype || XSD_BOOLEAN; } else if (types.isDouble(value) || datatype === XSD_DOUBLE) { if (!types.isDouble(value)) { value = parseFloat(value); } // canonical double representation object.value = value.toExponential(15).replace(/(\d)0*e\+?/, '$1E'); object.datatype.value = datatype || XSD_DOUBLE; } else if (types.isNumber(value)) { object.value = value.toFixed(0); object.datatype.value = datatype || XSD_INTEGER; } else if ('@language' in item) { object.value = value; object.datatype.value = datatype || RDF_LANGSTRING; object.language = item['@language']; } else { object.value = value; object.datatype.value = datatype || XSD_STRING; } } else { // convert string/node object to RDF var id = types.isObject(item) ? item['@id'] : item; object.termType = id.startsWith('_:') ? 'BlankNode' : 'NamedNode'; object.value = id; } // skip relative IRIs, not valid RDF if (object.termType === 'NamedNode' && !_isAbsoluteIri(object.value)) { return null; } return object; } /***/ }), /* 136 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var _require = __webpack_require__(15), isKeyword = _require.isKeyword; var graphTypes = __webpack_require__(5); var types = __webpack_require__(4); var util = __webpack_require__(3); var JsonLdError = __webpack_require__(6); var _require2 = __webpack_require__(33), _createNodeMap = _require2.createNodeMap, _mergeNodeMapGraphs = _require2.mergeNodeMapGraphs; var api = {}; module.exports = api; /** * Performs JSON-LD `merged` framing. * * @param input the expanded JSON-LD to frame. * @param frame the expanded JSON-LD frame to use. * @param options the framing options. * * @return the framed output. */ api.frameMergedOrDefault = function (input, frame, options) { // create framing state var state = { options: options, graph: '@default', graphMap: { '@default': {} }, graphStack: [], subjectStack: [], link: {}, bnodeMap: {} }; // produce a map of all graphs and name each bnode // FIXME: currently uses subjects from @merged graph only var issuer = new util.IdentifierIssuer('_:b'); _createNodeMap(input, state.graphMap, '@default', issuer); if (options.merged) { state.graphMap['@merged'] = _mergeNodeMapGraphs(state.graphMap); state.graph = '@merged'; } state.subjects = state.graphMap[state.graph]; // frame the subjects var framed = []; api.frame(state, Object.keys(state.subjects).sort(), frame, framed); // If pruning blank nodes, find those to prune if (options.pruneBlankNodeIdentifiers) { // remove all blank nodes appearing only once, done in compaction options.bnodesToClear = Object.keys(state.bnodeMap).filter(function (id) { return state.bnodeMap[id].length === 1; }); } return framed; }; /** * Frames subjects according to the given frame. * * @param state the current framing state. * @param subjects the subjects to filter. * @param frame the frame. * @param parent the parent subject or top-level array. * @param property the parent property, initialized to null. */ api.frame = function (state, subjects, frame, parent) { var property = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; // validate the frame _validateFrame(frame); frame = frame[0]; // get flags for current frame var options = state.options; var flags = { embed: _getFrameFlag(frame, options, 'embed'), explicit: _getFrameFlag(frame, options, 'explicit'), requireAll: _getFrameFlag(frame, options, 'requireAll') }; // filter out subjects that match the frame var matches = _filterSubjects(state, subjects, frame, flags); // add matches to output var ids = Object.keys(matches).sort(); var _loop = function _loop(id) { var subject = matches[id]; if (flags.embed === '@link' && id in state.link) { // TODO: may want to also match an existing linked subject against // the current frame ... so different frames could produce different // subjects that are only shared in-memory when the frames are the same // add existing linked subject _addFrameOutput(parent, property, state.link[id]); return 'continue'; } /* Note: In order to treat each top-level match as a compartmentalized result, clear the unique embedded subjects map when the property is null, which only occurs at the top-level. */ if (property === null) { state.uniqueEmbeds = _defineProperty({}, state.graph, {}); } else { state.uniqueEmbeds[state.graph] = state.uniqueEmbeds[state.graph] || {}; } // start output for subject var output = {}; output['@id'] = id; if (id.indexOf('_:') === 0) { util.addValue(state.bnodeMap, id, output, { propertyIsArray: true }); } state.link[id] = output; // if embed is @never or if a circular reference would be created by an // embed, the subject cannot be embedded, just add the reference; // note that a circular reference won't occur when the embed flag is // `@link` as the above check will short-circuit before reaching this point if (flags.embed === '@never' || _createsCircularReference(subject, state.graph, state.subjectStack)) { _addFrameOutput(parent, property, output); return 'continue'; } // if only the last match should be embedded if (flags.embed === '@last') { // remove any existing embed if (id in state.uniqueEmbeds[state.graph]) { _removeEmbed(state, id); } state.uniqueEmbeds[state.graph][id] = { parent: parent, property: property }; } // push matching subject onto stack to enable circular embed checks state.subjectStack.push({ subject: subject, graph: state.graph }); // subject is also the name of a graph if (id in state.graphMap) { var recurse = false; var subframe = null; if (!('@graph' in frame)) { recurse = state.graph !== '@merged'; subframe = {}; } else { subframe = frame['@graph'][0]; if (!types.isObject(subframe)) { subframe = {}; } recurse = !(id === '@merged' || id === '@default'); } if (recurse) { state.graphStack.push(state.graph); state.graph = id; // recurse into graph api.frame(state, Object.keys(state.graphMap[id]).sort(), [subframe], output, '@graph'); state.graph = state.graphStack.pop; } } // iterate over subject properties var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = Object.keys(subject).sort()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var prop = _step2.value; // copy keywords to output if (isKeyword(prop)) { output[prop] = util.clone(subject[prop]); if (prop === '@type') { // count bnode values of @type var _iteratorNormalCompletion6 = true; var _didIteratorError6 = false; var _iteratorError6 = undefined; try { for (var _iterator6 = subject['@type'][Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { var type = _step6.value; if (type.indexOf('_:') === 0) { util.addValue(state.bnodeMap, type, output, { propertyIsArray: true }); } } } catch (err) { _didIteratorError6 = true; _iteratorError6 = err; } finally { try { if (!_iteratorNormalCompletion6 && _iterator6.return) { _iterator6.return(); } } finally { if (_didIteratorError6) { throw _iteratorError6; } } } } continue; } // explicit is on and property isn't in the frame, skip processing if (flags.explicit && !(prop in frame)) { continue; } // add objects var _iteratorNormalCompletion7 = true; var _didIteratorError7 = false; var _iteratorError7 = undefined; try { for (var _iterator7 = subject[prop][Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { var o = _step7.value; var _subframe2 = prop in frame ? frame[prop] : _createImplicitFrame(flags); // recurse into list if (graphTypes.isList(o)) { // add empty list var list = { '@list': [] }; _addFrameOutput(output, prop, list); // add list objects var src = o['@list']; for (var n in src) { o = src[n]; if (graphTypes.isSubjectReference(o)) { var _subframe3 = prop in frame ? frame[prop][0]['@list'] : _createImplicitFrame(flags); // recurse into subject reference api.frame(state, [o['@id']], _subframe3, list, '@list'); } else { // include other values automatically _addFrameOutput(list, '@list', util.clone(o)); } } continue; } if (graphTypes.isSubjectReference(o)) { // recurse into subject reference api.frame(state, [o['@id']], _subframe2, output, prop); } else if (_valueMatch(_subframe2[0], o)) { // include other values, if they match _addFrameOutput(output, prop, util.clone(o)); } } } catch (err) { _didIteratorError7 = true; _iteratorError7 = err; } finally { try { if (!_iteratorNormalCompletion7 && _iterator7.return) { _iterator7.return(); } } finally { if (_didIteratorError7) { throw _iteratorError7; } } } } // handle defaults } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = Object.keys(frame).sort()[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var _prop = _step3.value; // skip keywords if (isKeyword(_prop)) { continue; } // if omit default is off, then include default values for properties // that appear in the next frame but are not in the matching subject var next = frame[_prop][0] || {}; var omitDefaultOn = _getFrameFlag(next, options, 'omitDefault'); if (!omitDefaultOn && !(_prop in output)) { var preserve = '@null'; if ('@default' in next) { preserve = util.clone(next['@default']); } if (!types.isArray(preserve)) { preserve = [preserve]; } output[_prop] = [{ '@preserve': preserve }]; } } // if embed reverse values by finding nodes having this subject as a value // of the associated property } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } if ('@reverse' in frame) { var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = Object.keys(frame['@reverse']).sort()[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { var reverseProp = _step4.value; var _subframe = frame['@reverse'][reverseProp]; var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { for (var _iterator5 = Object.keys(state.subjects)[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { var _subject = _step5.value; var nodeValues = util.getValues(state.subjects[_subject], reverseProp); if (nodeValues.some(function (v) { return v['@id'] === id; })) { // node has property referencing this subject, recurse output['@reverse'] = output['@reverse'] || {}; util.addValue(output['@reverse'], reverseProp, [], { propertyIsArray: true }); api.frame(state, [_subject], _subframe, output['@reverse'][reverseProp], property); } } } catch (err) { _didIteratorError5 = true; _iteratorError5 = err; } finally { try { if (!_iteratorNormalCompletion5 && _iterator5.return) { _iterator5.return(); } } finally { if (_didIteratorError5) { throw _iteratorError5; } } } } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } } // add output to parent _addFrameOutput(parent, property, output); // pop matching subject from circular ref-checking stack state.subjectStack.pop(); }; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = ids[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var id = _step.value; var _ret = _loop(id); if (_ret === 'continue') continue; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } }; /** * Creates an implicit frame when recursing through subject matches. If * a frame doesn't have an explicit frame for a particular property, then * a wildcard child frame will be created that uses the same flags that the * parent frame used. * * @param flags the current framing flags. * * @return the implicit frame. */ function _createImplicitFrame(flags) { var frame = {}; for (var key in flags) { if (flags[key] !== undefined) { frame['@' + key] = [flags[key]]; } } return [frame]; } /** * Checks the current subject stack to see if embedding the given subject * would cause a circular reference. * * @param subjectToEmbed the subject to embed. * @param graph the graph the subject to embed is in. * @param subjectStack the current stack of subjects. * * @return true if a circular reference would be created, false if not. */ function _createsCircularReference(subjectToEmbed, graph, subjectStack) { for (var i = subjectStack.length - 1; i >= 0; --i) { var _subject2 = subjectStack[i]; if (_subject2.graph === graph && _subject2.subject['@id'] === subjectToEmbed['@id']) { return true; } } return false; } /** * Gets the frame flag value for the given flag name. * * @param frame the frame. * @param options the framing options. * @param name the flag name. * * @return the flag value. */ function _getFrameFlag(frame, options, name) { var flag = '@' + name; var rval = flag in frame ? frame[flag][0] : options[name]; if (name === 'embed') { // default is "@last" // backwards-compatibility support for "embed" maps: // true => "@last" // false => "@never" if (rval === true) { rval = '@last'; } else if (rval === false) { rval = '@never'; } else if (rval !== '@always' && rval !== '@never' && rval !== '@link') { rval = '@last'; } } return rval; } /** * Validates a JSON-LD frame, throwing an exception if the frame is invalid. * * @param frame the frame to validate. */ function _validateFrame(frame) { if (!types.isArray(frame) || frame.length !== 1 || !types.isObject(frame[0])) { throw new JsonLdError('Invalid JSON-LD syntax; a JSON-LD frame must be a single object.', 'jsonld.SyntaxError', { frame: frame }); } } /** * Returns a map of all of the subjects that match a parsed frame. * * @param state the current framing state. * @param subjects the set of subjects to filter. * @param frame the parsed frame. * @param flags the frame flags. * * @return all of the matched subjects. */ function _filterSubjects(state, subjects, frame, flags) { // filter subjects in @id order var rval = {}; var _iteratorNormalCompletion8 = true; var _didIteratorError8 = false; var _iteratorError8 = undefined; try { for (var _iterator8 = subjects[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { var id = _step8.value; var _subject3 = state.graphMap[state.graph][id]; if (_filterSubject(state, _subject3, frame, flags)) { rval[id] = _subject3; } } } catch (err) { _didIteratorError8 = true; _iteratorError8 = err; } finally { try { if (!_iteratorNormalCompletion8 && _iterator8.return) { _iterator8.return(); } } finally { if (_didIteratorError8) { throw _iteratorError8; } } } return rval; } /** * Returns true if the given subject matches the given frame. * * Matches either based on explicit type inclusion where the node has any * type listed in the frame. If the frame has empty types defined matches * nodes not having a @type. If the frame has a type of {} defined matches * nodes having any type defined. * * Otherwise, does duck typing, where the node must have all of the * properties defined in the frame. * * @param state the current framing state. * @param subject the subject to check. * @param frame the frame to check. * @param flags the frame flags. * * @return true if the subject matches, false if not. */ function _filterSubject(state, subject, frame, flags) { // check ducktype var wildcard = true; var matchesSome = false; var _loop2 = function _loop2(key) { var matchThis = false; var nodeValues = util.getValues(subject, key); var isEmpty = util.getValues(frame, key).length === 0; if (isKeyword(key)) { // skip non-@id and non-@type if (key !== '@id' && key !== '@type') { return 'continue'; } wildcard = false; // check @id for a specific @id value if (key === '@id') { // if @id is not a wildcard and is not empty, then match or not on // specific value if (frame['@id'].length >= 0 && !types.isEmptyObject(frame['@id'][0])) { return { v: frame['@id'].includes(nodeValues[0]) }; } matchThis = true; return 'continue'; } // check @type (object value means 'any' type, fall through to ducktyping) if ('@type' in frame) { if (isEmpty) { if (nodeValues.length > 0) { // don't match on no @type return { v: false }; } matchThis = true; } else if (frame['@type'].length === 1 && types.isEmptyObject(frame['@type'][0])) { // match on wildcard @type matchThis = nodeValues.length > 0; } else { var _loop3 = function _loop3(type) { if (nodeValues.some(function (tt) { return tt === type; })) { return { v: { v: true } }; } }; // match on a specific @type var _iteratorNormalCompletion9 = true; var _didIteratorError9 = false; var _iteratorError9 = undefined; try { for (var _iterator9 = frame['@type'][Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { var type = _step9.value; var _ret3 = _loop3(type); if ((typeof _ret3 === 'undefined' ? 'undefined' : _typeof(_ret3)) === "object") return _ret3.v; } } catch (err) { _didIteratorError9 = true; _iteratorError9 = err; } finally { try { if (!_iteratorNormalCompletion9 && _iterator9.return) { _iterator9.return(); } } finally { if (_didIteratorError9) { throw _iteratorError9; } } } return { v: false }; } } } // Forc a copy of this frame entry so it can be manipulated var thisFrame = util.getValues(frame, key)[0]; var hasDefault = false; if (thisFrame) { _validateFrame([thisFrame]); hasDefault = '@default' in thisFrame; } // no longer a wildcard pattern if frame has any non-keyword properties wildcard = false; // skip, but allow match if node has no value for property, and frame has a // default value if (nodeValues.length === 0 && hasDefault) { return 'continue'; } // if frame value is empty, don't match if subject has any value if (nodeValues.length > 0 && isEmpty) { return { v: false }; } if (thisFrame === undefined) { // node does not match if values is not empty and the value of property // in frame is match none. if (nodeValues.length > 0) { return { v: false }; } matchThis = true; } else if (types.isObject(thisFrame)) { // node matches if values is not empty and the value of property in frame // is wildcard matchThis = nodeValues.length > 0; } else { if (graphTypes.isValue(thisFrame)) { // match on any matching value matchThis = nodeValues.some(function (nv) { return _valueMatch(thisFrame, nv); }); } else if (graphTypes.isSubject(thisFrame) || graphTypes.isSubjectReference(thisFrame)) { matchThis = nodeValues.some(function (nv) { return _nodeMatch(state, thisFrame, nv, flags); }); } else if (graphTypes.isList(thisFrame)) { var listValue = thisFrame['@list'][0]; if (graphTypes.isList(nodeValues[0])) { var nodeListValues = nodeValues[0]['@list']; if (graphTypes.isValue(listValue)) { // match on any matching value matchThis = nodeListValues.some(function (lv) { return _valueMatch(listValue, lv); }); } else if (graphTypes.isSubject(listValue) || graphTypes.isSubjectReference(listValue)) { matchThis = nodeListValues.some(function (lv) { return _nodeMatch(state, listValue, lv, flags); }); } } else { // value must be a list to match matchThis = false; } } } // all non-defaulted values must match if requireAll is set if (!matchThis && flags.requireAll) { return { v: false }; } matchesSome = matchesSome || matchThis; }; for (var key in frame) { var _ret2 = _loop2(key); switch (_ret2) { case 'continue': continue; default: if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v; } } // return true if wildcard or subject matches some properties return wildcard || matchesSome; } /** * Removes an existing embed. * * @param state the current framing state. * @param id the @id of the embed to remove. */ function _removeEmbed(state, id) { // get existing embed var embeds = state.uniqueEmbeds[state.graph]; var embed = embeds[id]; var parent = embed.parent; var property = embed.property; // create reference to replace embed var subject = { '@id': id }; // remove existing embed if (types.isArray(parent)) { // replace subject with reference for (var i = 0; i < parent.length; ++i) { if (util.compareValues(parent[i], subject)) { parent[i] = subject; break; } } } else { // replace subject with reference var useArray = types.isArray(parent[property]); util.removeValue(parent, property, subject, { propertyIsArray: useArray }); util.addValue(parent, property, subject, { propertyIsArray: useArray }); } // recursively remove dependent dangling embeds var removeDependents = function removeDependents(id) { // get embed keys as a separate array to enable deleting keys in map var ids = Object.keys(embeds); var _iteratorNormalCompletion10 = true; var _didIteratorError10 = false; var _iteratorError10 = undefined; try { for (var _iterator10 = ids[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { var next = _step10.value; if (next in embeds && types.isObject(embeds[next].parent) && embeds[next].parent['@id'] === id) { delete embeds[next]; removeDependents(next); } } } catch (err) { _didIteratorError10 = true; _iteratorError10 = err; } finally { try { if (!_iteratorNormalCompletion10 && _iterator10.return) { _iterator10.return(); } } finally { if (_didIteratorError10) { throw _iteratorError10; } } } }; removeDependents(id); } /** * Adds framing output to the given parent. * * @param parent the parent to add to. * @param property the parent property. * @param output the output to add. */ function _addFrameOutput(parent, property, output) { if (types.isObject(parent)) { util.addValue(parent, property, output, { propertyIsArray: true }); } else { parent.push(output); } } /** * Node matches if it is a node, and matches the pattern as a frame. * * @param state the current framing state. * @param pattern used to match value * @param value to check * @param flags the frame flags. */ function _nodeMatch(state, pattern, value, flags) { if (!('@id' in value)) { return false; } var nodeObject = state.subjects[value['@id']]; return nodeObject && _filterSubject(state, nodeObject, pattern, flags); } /** * Value matches if it is a value and matches the value pattern * * * `pattern` is empty * * @values are the same, or `pattern[@value]` is a wildcard, and * * @types are the same or `value[@type]` is not null * and `pattern[@type]` is `{}`, or `value[@type]` is null * and `pattern[@type]` is null or `[]`, and * * @languages are the same or `value[@language]` is not null * and `pattern[@language]` is `{}`, or `value[@language]` is null * and `pattern[@language]` is null or `[]`. * * @param pattern used to match value * @param value to check */ function _valueMatch(pattern, value) { var v1 = value['@value']; var t1 = value['@type']; var l1 = value['@language']; var v2 = pattern['@value'] ? types.isArray(pattern['@value']) ? pattern['@value'] : [pattern['@value']] : []; var t2 = pattern['@type'] ? types.isArray(pattern['@type']) ? pattern['@type'] : [pattern['@type']] : []; var l2 = pattern['@language'] ? types.isArray(pattern['@language']) ? pattern['@language'] : [pattern['@language']] : []; if (v2.length === 0 && t2.length === 0 && l2.length === 0) { return true; } if (!(v2.includes(v1) || types.isEmptyObject(v2[0]))) { return false; } if (!(!t1 && t2.length === 0 || t2.includes(t1) || t1 && types.isEmptyObject(t2[0]))) { return false; } if (!(!l1 && l2.length === 0 || l2.includes(l1) || l1 && types.isEmptyObject(l2[0]))) { return false; } return true; } /***/ }), /* 137 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var JsonLdError = __webpack_require__(6); var _require = __webpack_require__(4), _isArray = _require.isArray, _isObject = _require.isObject, _isString = _require.isString; var _require2 = __webpack_require__(5), _isList = _require2.isList, _isValue = _require2.isValue, _isGraph = _require2.isGraph, _isSimpleGraph = _require2.isSimpleGraph, _isSubjectReference = _require2.isSubjectReference; var _require3 = __webpack_require__(15), _expandIri = _require3.expandIri, _getContextValue = _require3.getContextValue, _isKeyword = _require3.isKeyword, _processContext = _require3.process; var _require4 = __webpack_require__(26), _removeBase = _require4.removeBase; var _require5 = __webpack_require__(3), _addValue = _require5.addValue, _compareShortestLeast = _require5.compareShortestLeast; var api = {}; module.exports = api; /** * Recursively compacts an element using the given active context. All values * must be in expanded form before this method is called. * * @param activeCtx the active context to use. * @param activeProperty the compacted property associated with the element * to compact, null for none. * @param element the element to compact. * @param options the compaction options. * @param compactionMap the compaction map to use. * * @return the compacted value. */ api.compact = function (_ref) { var activeCtx = _ref.activeCtx, _ref$activeProperty = _ref.activeProperty, activeProperty = _ref$activeProperty === undefined ? null : _ref$activeProperty, element = _ref.element, _ref$options = _ref.options, options = _ref$options === undefined ? {} : _ref$options, _ref$compactionMap = _ref.compactionMap, compactionMap = _ref$compactionMap === undefined ? function () { return undefined; } : _ref$compactionMap; // recursively compact array if (_isArray(element)) { var rval = []; for (var i = 0; i < element.length; ++i) { // compact, dropping any null values unless custom mapped var compacted = api.compact({ activeCtx: activeCtx, activeProperty: activeProperty, element: element[i], options: options, compactionMap: compactionMap }); if (compacted === null) { // TODO: use `await` to support async compacted = compactionMap({ unmappedValue: element[i], activeCtx: activeCtx, activeProperty: activeProperty, parent: element, index: i, options: options }); if (compacted === undefined) { continue; } } rval.push(compacted); } if (options.compactArrays && rval.length === 1) { // use single element if no container is specified var container = _getContextValue(activeCtx, activeProperty, '@container') || []; if (container.length === 0) { rval = rval[0]; } } return rval; } // use any scoped context on activeProperty var ctx = _getContextValue(activeCtx, activeProperty, '@context'); if (ctx) { activeCtx = _processContext({ activeCtx: activeCtx, localCtx: ctx, options: options }); } // recursively compact object if (_isObject(element)) { if (options.link && '@id' in element && element['@id'] in options.link) { // check for a linked element to reuse var linked = options.link[element['@id']]; for (var _i = 0; _i < linked.length; ++_i) { if (linked[_i].expanded === element) { return linked[_i].compacted; } } } // do value compaction on @values and subject references if (_isValue(element) || _isSubjectReference(element)) { var _rval2 = api.compactValue({ activeCtx: activeCtx, activeProperty: activeProperty, value: element }); if (options.link && _isSubjectReference(element)) { // store linked element if (!(element['@id'] in options.link)) { options.link[element['@id']] = []; } options.link[element['@id']].push({ expanded: element, compacted: _rval2 }); } return _rval2; } // FIXME: avoid misuse of active property as an expanded property? var insideReverse = activeProperty === '@reverse'; var _rval = {}; if (options.link && '@id' in element) { // store linked element if (!(element['@id'] in options.link)) { options.link[element['@id']] = []; } options.link[element['@id']].push({ expanded: element, compacted: _rval }); } // apply any context defined on an alias of @type // if key is @type and any compacted value is a term having a local // context, overlay that context var types = element['@type'] || []; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = types[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var type = _step.value; var compactedType = api.compactIri({ activeCtx: activeCtx, iri: type, relativeTo: { vocab: true } }); // Use any scoped context defined on this value var _ctx = _getContextValue(activeCtx, compactedType, '@context'); if (_ctx) { activeCtx = _processContext({ activeCtx: activeCtx, localCtx: _ctx, options: options }); } } // process element keys in order } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var keys = Object.keys(element).sort(); var _loop = function _loop(expandedProperty) { var expandedValue = element[expandedProperty]; // compact @id and @type(s) if (expandedProperty === '@id' || expandedProperty === '@type') { var compactedValue = [].concat(expandedValue).map(function (expandedIri) { return api.compactIri({ activeCtx: activeCtx, iri: expandedIri, relativeTo: { vocab: expandedProperty === '@type' } }); }); if (compactedValue.length === 1) { compactedValue = compactedValue[0]; } // use keyword alias and add value var alias = api.compactIri({ activeCtx: activeCtx, iri: expandedProperty, relativeTo: { vocab: true } }); var isArray = _isArray(compactedValue) && expandedValue.length === 0; _addValue(_rval, alias, compactedValue, { propertyIsArray: isArray }); return 'continue'; } // handle @reverse if (expandedProperty === '@reverse') { // recursively compact expanded value var _compactedValue = api.compact({ activeCtx: activeCtx, activeProperty: '@reverse', element: expandedValue, options: options, compactionMap: compactionMap }); // handle double-reversed properties for (var compactedProperty in _compactedValue) { if (activeCtx.mappings[compactedProperty] && activeCtx.mappings[compactedProperty].reverse) { var value = _compactedValue[compactedProperty]; var _container = _getContextValue(activeCtx, compactedProperty, '@container') || []; var useArray = _container.includes('@set') || !options.compactArrays; _addValue(_rval, compactedProperty, value, { propertyIsArray: useArray }); delete _compactedValue[compactedProperty]; } } if (Object.keys(_compactedValue).length > 0) { // use keyword alias and add value var _alias = api.compactIri({ activeCtx: activeCtx, iri: expandedProperty, relativeTo: { vocab: true } }); _addValue(_rval, _alias, _compactedValue); } return 'continue'; } if (expandedProperty === '@preserve') { // compact using activeProperty var _compactedValue2 = api.compact({ activeCtx: activeCtx, activeProperty: activeProperty, element: expandedValue, options: options, compactionMap: compactionMap }); if (!(_isArray(_compactedValue2) && _compactedValue2.length === 0)) { _addValue(_rval, expandedProperty, _compactedValue2); } return 'continue'; } // handle @index property if (expandedProperty === '@index') { // drop @index if inside an @index container var _container2 = _getContextValue(activeCtx, activeProperty, '@container') || []; if (_container2.includes('@index')) { return 'continue'; } // use keyword alias and add value var _alias2 = api.compactIri({ activeCtx: activeCtx, iri: expandedProperty, relativeTo: { vocab: true } }); _addValue(_rval, _alias2, expandedValue); return 'continue'; } // skip array processing for keywords that aren't @graph or @list if (expandedProperty !== '@graph' && expandedProperty !== '@list' && _isKeyword(expandedProperty)) { // use keyword alias and add value as is var _alias3 = api.compactIri({ activeCtx: activeCtx, iri: expandedProperty, relativeTo: { vocab: true } }); _addValue(_rval, _alias3, expandedValue); return 'continue'; } // Note: expanded value must be an array due to expansion algorithm. if (!_isArray(expandedValue)) { throw new JsonLdError('JSON-LD expansion error; expanded value must be an array.', 'jsonld.SyntaxError'); } // preserve empty arrays if (expandedValue.length === 0) { var itemActiveProperty = api.compactIri({ activeCtx: activeCtx, iri: expandedProperty, value: expandedValue, relativeTo: { vocab: true }, reverse: insideReverse }); var nestProperty = itemActiveProperty in activeCtx.mappings ? activeCtx.mappings[itemActiveProperty]['@nest'] : null; var nestResult = _rval; if (nestProperty) { _checkNestProperty(activeCtx, nestProperty); if (!_isObject(_rval[nestProperty])) { _rval[nestProperty] = {}; } nestResult = _rval[nestProperty]; } _addValue(nestResult, itemActiveProperty, expandedValue, { propertyIsArray: true }); } // recusively process array values var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = expandedValue[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var expandedItem = _step3.value; // compact property and get container type var _itemActiveProperty = api.compactIri({ activeCtx: activeCtx, iri: expandedProperty, value: expandedItem, relativeTo: { vocab: true }, reverse: insideReverse }); // if itemActiveProperty is a @nest property, add values to nestResult, // otherwise rval var _nestProperty = _itemActiveProperty in activeCtx.mappings ? activeCtx.mappings[_itemActiveProperty]['@nest'] : null; var _nestResult = _rval; if (_nestProperty) { _checkNestProperty(activeCtx, _nestProperty); if (!_isObject(_rval[_nestProperty])) { _rval[_nestProperty] = {}; } _nestResult = _rval[_nestProperty]; } var _container3 = _getContextValue(activeCtx, _itemActiveProperty, '@container') || []; // get simple @graph or @list value if appropriate var isGraph = _isGraph(expandedItem); var isList = _isList(expandedItem); var inner = void 0; if (isList) { inner = expandedItem['@list']; } else if (isGraph) { inner = expandedItem['@graph']; } // recursively compact expanded item var compactedItem = api.compact({ activeCtx: activeCtx, activeProperty: _itemActiveProperty, element: isList || isGraph ? inner : expandedItem, options: options, compactionMap: compactionMap }); // handle @list if (isList) { // ensure @list value is an array if (!_isArray(compactedItem)) { compactedItem = [compactedItem]; } if (!_container3.includes('@list')) { // wrap using @list alias compactedItem = _defineProperty({}, api.compactIri({ activeCtx: activeCtx, iri: '@list', relativeTo: { vocab: true } }), compactedItem); // include @index from expanded @list, if any if ('@index' in expandedItem) { compactedItem[api.compactIri({ activeCtx: activeCtx, iri: '@index', relativeTo: { vocab: true } })] = expandedItem['@index']; } } else if (_itemActiveProperty in _nestResult) { // can't use @list container for more than 1 list throw new JsonLdError('JSON-LD compact error; property has a "@list" @container ' + 'rule but there is more than a single @list that matches ' + 'the compacted term in the document. Compaction might mix ' + 'unwanted items into the list.', 'jsonld.SyntaxError', { code: 'compaction to list of lists' }); } } // Graph object compaction cases if (isGraph) { if (_container3.includes('@graph') && (_container3.includes('@id') || _container3.includes('@index') && _isSimpleGraph(expandedItem))) { // get or create the map object var mapObject = void 0; if (_itemActiveProperty in _nestResult) { mapObject = _nestResult[_itemActiveProperty]; } else { _nestResult[_itemActiveProperty] = mapObject = {}; } // index on @id or @index or alias of @none var key = (_container3.includes('@id') ? expandedItem['@id'] : expandedItem['@index']) || api.compactIri({ activeCtx: activeCtx, iri: '@none', vocab: true }); // add compactedItem to map, using value of `@id` or a new blank // node identifier _addValue(mapObject, key, compactedItem, { propertyIsArray: !options.compactArrays || _container3.includes('@set') }); } else if (_container3.includes('@graph') && _isSimpleGraph(expandedItem)) { // container includes @graph but not @id or @index and value is a // simple graph object add compact value _addValue(_nestResult, _itemActiveProperty, compactedItem, { propertyIsArray: !options.compactArrays || _container3.includes('@set') }); } else { // wrap using @graph alias, remove array if only one item and // compactArrays not set if (_isArray(compactedItem) && compactedItem.length === 1 && options.compactArrays) { compactedItem = compactedItem[0]; } compactedItem = _defineProperty({}, api.compactIri({ activeCtx: activeCtx, iri: '@graph', relativeTo: { vocab: true } }), compactedItem); // include @id from expanded graph, if any if ('@id' in expandedItem) { compactedItem[api.compactIri({ activeCtx: activeCtx, iri: '@id', relativeTo: { vocab: true } })] = expandedItem['@id']; } // include @index from expanded graph, if any if ('@index' in expandedItem) { compactedItem[api.compactIri({ activeCtx: activeCtx, iri: '@index', relativeTo: { vocab: true } })] = expandedItem['@index']; } _addValue(_nestResult, _itemActiveProperty, compactedItem, { propertyIsArray: !options.compactArrays || _container3.includes('@set') }); } } else if (_container3.includes('@language') || _container3.includes('@index') || _container3.includes('@id') || _container3.includes('@type')) { // handle language and index maps // get or create the map object var _mapObject = void 0; if (_itemActiveProperty in _nestResult) { _mapObject = _nestResult[_itemActiveProperty]; } else { _nestResult[_itemActiveProperty] = _mapObject = {}; } var _key = void 0; if (_container3.includes('@language')) { // if container is a language map, simplify compacted value to // a simple string if (_isValue(compactedItem)) { compactedItem = compactedItem['@value']; } _key = expandedItem['@language']; } else if (_container3.includes('@index')) { _key = expandedItem['@index']; } else if (_container3.includes('@id')) { var idKey = api.compactIri({ activeCtx: activeCtx, iri: '@id', vocab: true }); _key = compactedItem[idKey]; delete compactedItem[idKey]; } else if (_container3.includes('@type')) { var typeKey = api.compactIri({ activeCtx: activeCtx, iri: '@type', vocab: true }); var _types = void 0; var _concat = [].concat(compactedItem[typeKey] || []); var _concat2 = _toArray(_concat); _key = _concat2[0]; _types = _concat2.slice(1); switch (_types.length) { case 0: delete compactedItem[typeKey]; break; case 1: compactedItem[typeKey] = _types[0]; break; default: compactedItem[typeKey] = _types; break; } } // if compacting this value which has no key, index on @none if (!_key) { _key = api.compactIri({ activeCtx: activeCtx, iri: '@none', vocab: true }); } // add compact value to map object using key from expanded value // based on the container type _addValue(_mapObject, _key, compactedItem, { propertyIsArray: _container3.includes('@set') }); } else { // use an array if: compactArrays flag is false, // @container is @set or @list , value is an empty // array, or key is @graph var _isArray2 = !options.compactArrays || _container3.includes('@set') || _container3.includes('@list') || _isArray(compactedItem) && compactedItem.length === 0 || expandedProperty === '@list' || expandedProperty === '@graph'; // add compact value _addValue(_nestResult, _itemActiveProperty, compactedItem, { propertyIsArray: _isArray2 }); } } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } }; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = keys[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var expandedProperty = _step2.value; var _ret = _loop(expandedProperty); if (_ret === 'continue') continue; } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } return _rval; } // only primitives remain which are already compact return element; }; /** * Compacts an IRI or keyword into a term or prefix if it can be. If the * IRI has an associated value it may be passed. * * @param activeCtx the active context to use. * @param iri the IRI to compact. * @param value the value to check or null. * @param relativeTo options for how to compact IRIs: * vocab: true to split after @vocab, false not to. * @param reverse true if a reverse property is being compacted, false if not. * * @return the compacted term, prefix, keyword alias, or the original IRI. */ api.compactIri = function (_ref2) { var activeCtx = _ref2.activeCtx, iri = _ref2.iri, _ref2$value = _ref2.value, value = _ref2$value === undefined ? null : _ref2$value, _ref2$relativeTo = _ref2.relativeTo, relativeTo = _ref2$relativeTo === undefined ? { vocab: false } : _ref2$relativeTo, _ref2$reverse = _ref2.reverse, reverse = _ref2$reverse === undefined ? false : _ref2$reverse; // can't compact null if (iri === null) { return iri; } var inverseCtx = activeCtx.getInverse(); // if term is a keyword, it may be compacted to a simple alias if (_isKeyword(iri) && iri in inverseCtx && '@none' in inverseCtx[iri] && '@type' in inverseCtx[iri]['@none'] && '@none' in inverseCtx[iri]['@none']['@type']) { return inverseCtx[iri]['@none']['@type']['@none']; } // use inverse context to pick a term if iri is relative to vocab if (relativeTo.vocab && iri in inverseCtx) { var defaultLanguage = activeCtx['@language'] || '@none'; // prefer @index if available in value var containers = []; if (_isObject(value) && '@index' in value && !('@graph' in value)) { containers.push('@index', '@index@set'); } // if value is a preserve object, use its value if (_isObject(value) && '@preserve' in value) { value = value['@preserve'][0]; } // prefer most specific container including @graph, prefering @set // variations if (_isGraph(value)) { // favor indexmap if the graph is indexed if ('@index' in value) { containers.push('@graph@index', '@graph@index@set', '@index', '@index@set'); } // favor idmap if the graph is has an @id if ('@id' in value) { containers.push('@graph@id', '@graph@id@set'); } containers.push('@graph', '@graph@set', '@set'); // allow indexmap if the graph is not indexed if (!('@index' in value)) { containers.push('@graph@index', '@graph@index@set', '@index', '@index@set'); } // allow idmap if the graph does not have an @id if (!('@id' in value)) { containers.push('@graph@id', '@graph@id@set'); } } else if (_isObject(value) && !_isValue(value)) { containers.push('@id', '@id@set', '@type', '@set@type'); } // defaults for term selection based on type/language var typeOrLanguage = '@language'; var typeOrLanguageValue = '@null'; if (reverse) { typeOrLanguage = '@type'; typeOrLanguageValue = '@reverse'; containers.push('@set'); } else if (_isList(value)) { // choose the most specific term that works for all elements in @list // only select @list containers if @index is NOT in value if (!('@index' in value)) { containers.push('@list'); } var list = value['@list']; if (list.length === 0) { // any empty list can be matched against any term that uses the // @list container regardless of @type or @language typeOrLanguage = '@any'; typeOrLanguageValue = '@none'; } else { var commonLanguage = list.length === 0 ? defaultLanguage : null; var commonType = null; for (var i = 0; i < list.length; ++i) { var item = list[i]; var itemLanguage = '@none'; var itemType = '@none'; if (_isValue(item)) { if ('@language' in item) { itemLanguage = item['@language']; } else if ('@type' in item) { itemType = item['@type']; } else { // plain literal itemLanguage = '@null'; } } else { itemType = '@id'; } if (commonLanguage === null) { commonLanguage = itemLanguage; } else if (itemLanguage !== commonLanguage && _isValue(item)) { commonLanguage = '@none'; } if (commonType === null) { commonType = itemType; } else if (itemType !== commonType) { commonType = '@none'; } // there are different languages and types in the list, so choose // the most generic term, no need to keep iterating the list if (commonLanguage === '@none' && commonType === '@none') { break; } } commonLanguage = commonLanguage || '@none'; commonType = commonType || '@none'; if (commonType !== '@none') { typeOrLanguage = '@type'; typeOrLanguageValue = commonType; } else { typeOrLanguageValue = commonLanguage; } } } else { if (_isValue(value)) { if ('@language' in value && !('@index' in value)) { containers.push('@language', '@language@set'); typeOrLanguageValue = value['@language']; } else if ('@type' in value) { typeOrLanguage = '@type'; typeOrLanguageValue = value['@type']; } } else { typeOrLanguage = '@type'; typeOrLanguageValue = '@id'; } containers.push('@set'); } // do term selection containers.push('@none'); // an index map can be used to index values using @none, so add as a low // priority if (_isObject(value) && !('@index' in value)) { // allow indexing even if no @index present containers.push('@index', '@index@set'); } // values without type or language can use @language map if (_isValue(value) && Object.keys(value).length === 1) { // allow indexing even if no @index present containers.push('@language', '@language@set'); } var term = _selectTerm(activeCtx, iri, value, containers, typeOrLanguage, typeOrLanguageValue); if (term !== null) { return term; } } // no term match, use @vocab if available if (relativeTo.vocab) { if ('@vocab' in activeCtx) { // determine if vocab is a prefix of the iri var vocab = activeCtx['@vocab']; if (iri.indexOf(vocab) === 0 && iri !== vocab) { // use suffix as relative iri if it is not a term in the active context var suffix = iri.substr(vocab.length); if (!(suffix in activeCtx.mappings)) { return suffix; } } } } // no term or @vocab match, check for possible CURIEs var choice = null; // TODO: make FastCurieMap a class with a method to do this lookup var partialMatches = []; var iriMap = activeCtx.fastCurieMap; // check for partial matches of against `iri`, which means look until // iri.length - 1, not full length var maxPartialLength = iri.length - 1; for (var _i2 = 0; _i2 < maxPartialLength && iri[_i2] in iriMap; ++_i2) { iriMap = iriMap[iri[_i2]]; if ('' in iriMap) { partialMatches.push(iriMap[''][0]); } } // check partial matches in reverse order to prefer longest ones first for (var _i3 = partialMatches.length - 1; _i3 >= 0; --_i3) { var entry = partialMatches[_i3]; var terms = entry.terms; var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = terms[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { var _term = _step4.value; // a CURIE is usable if: // 1. it has no mapping, OR // 2. value is null, which means we're not compacting an @value, AND // the mapping matches the IRI var curie = _term + ':' + iri.substr(entry.iri.length); var isUsableCurie = activeCtx.mappings[_term]._prefix && (!(curie in activeCtx.mappings) || value === null && activeCtx.mappings[curie]['@id'] === iri); // select curie if it is shorter or the same length but lexicographically // less than the current choice if (isUsableCurie && (choice === null || _compareShortestLeast(curie, choice) < 0)) { choice = curie; } } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } } // return chosen curie if (choice !== null) { return choice; } // compact IRI relative to base if (!relativeTo.vocab) { return _removeBase(activeCtx['@base'], iri); } // return IRI as is return iri; }; /** * Performs value compaction on an object with '@value' or '@id' as the only * property. * * @param activeCtx the active context. * @param activeProperty the active property that points to the value. * @param value the value to compact. * * @return the compaction result. */ api.compactValue = function (_ref3) { var activeCtx = _ref3.activeCtx, activeProperty = _ref3.activeProperty, value = _ref3.value; // value is a @value if (_isValue(value)) { // get context rules var _type = _getContextValue(activeCtx, activeProperty, '@type'); var language = _getContextValue(activeCtx, activeProperty, '@language'); var container = _getContextValue(activeCtx, activeProperty, '@container') || []; // whether or not the value has an @index that must be preserved var preserveIndex = '@index' in value && !container.includes('@index'); // if there's no @index to preserve ... if (!preserveIndex) { // matching @type or @language specified in context, compact value if (value['@type'] === _type || value['@language'] === language) { return value['@value']; } } // return just the value of @value if all are true: // 1. @value is the only key or @index isn't being preserved // 2. there is no default language or @value is not a string or // the key has a mapping with a null @language var keyCount = Object.keys(value).length; var isValueOnlyKey = keyCount === 1 || keyCount === 2 && '@index' in value && !preserveIndex; var hasDefaultLanguage = '@language' in activeCtx; var isValueString = _isString(value['@value']); var hasNullMapping = activeCtx.mappings[activeProperty] && activeCtx.mappings[activeProperty]['@language'] === null; if (isValueOnlyKey && (!hasDefaultLanguage || !isValueString || hasNullMapping)) { return value['@value']; } var rval = {}; // preserve @index if (preserveIndex) { rval[api.compactIri({ activeCtx: activeCtx, iri: '@index', relativeTo: { vocab: true } })] = value['@index']; } if ('@type' in value) { // compact @type IRI rval[api.compactIri({ activeCtx: activeCtx, iri: '@type', relativeTo: { vocab: true } })] = api.compactIri({ activeCtx: activeCtx, iri: value['@type'], relativeTo: { vocab: true } }); } else if ('@language' in value) { // alias @language rval[api.compactIri({ activeCtx: activeCtx, iri: '@language', relativeTo: { vocab: true } })] = value['@language']; } // alias @value rval[api.compactIri({ activeCtx: activeCtx, iri: '@value', relativeTo: { vocab: true } })] = value['@value']; return rval; } // value is a subject reference var expandedProperty = _expandIri(activeCtx, activeProperty, { vocab: true }); var type = _getContextValue(activeCtx, activeProperty, '@type'); var compacted = api.compactIri({ activeCtx: activeCtx, iri: value['@id'], relativeTo: { vocab: type === '@vocab' } }); // compact to scalar if (type === '@id' || type === '@vocab' || expandedProperty === '@graph') { return compacted; } return _defineProperty({}, api.compactIri({ activeCtx: activeCtx, iri: '@id', relativeTo: { vocab: true } }), compacted); }; /** * Removes the @preserve keywords as the last step of the compaction * algorithm when it is running on framed output. * * @param ctx the active context used to compact the input. * @param input the framed, compacted output. * @param options the compaction options used. * * @return the resulting output. */ api.removePreserve = function (ctx, input, options) { // recurse through arrays if (_isArray(input)) { var output = []; for (var i = 0; i < input.length; ++i) { var result = api.removePreserve(ctx, input[i], options); // drop nulls from arrays if (result !== null) { output.push(result); } } input = output; } else if (_isObject(input)) { // remove @preserve if ('@preserve' in input) { if (input['@preserve'] === '@null') { return null; } return input['@preserve']; } // skip @values if (_isValue(input)) { return input; } // recurse through @lists if (_isList(input)) { input['@list'] = api.removePreserve(ctx, input['@list'], options); return input; } // handle in-memory linked nodes var idAlias = api.compactIri({ activeCtx: ctx, iri: '@id', relativeTo: { vocab: true } }); if (idAlias in input) { var id = input[idAlias]; if (id in options.link) { var idx = options.link[id].indexOf(input); if (idx !== -1) { // already visited return options.link[id][idx]; } // prevent circular visitation options.link[id].push(input); } else { // prevent circular visitation options.link[id] = [input]; } } // recurse through properties var graphAlias = api.compactIri({ activeCtx: ctx, iri: '@graph', relativeTo: { vocab: true } }); for (var prop in input) { // potentially remove the id, if it is an unreference bnode if (prop === idAlias && options.bnodesToClear.includes(input[prop])) { delete input[idAlias]; continue; } var _result = api.removePreserve(ctx, input[prop], options); var container = _getContextValue(ctx, prop, '@container') || []; if (options.compactArrays && _isArray(_result) && _result.length === 1 && container.length === 0 && prop !== graphAlias) { _result = _result[0]; } input[prop] = _result; } } return input; }; /** * Picks the preferred compaction term from the given inverse context entry. * * @param activeCtx the active context. * @param iri the IRI to pick the term for. * @param value the value to pick the term for. * @param containers the preferred containers. * @param typeOrLanguage either '@type' or '@language'. * @param typeOrLanguageValue the preferred value for '@type' or '@language'. * * @return the preferred term. */ function _selectTerm(activeCtx, iri, value, containers, typeOrLanguage, typeOrLanguageValue) { if (typeOrLanguageValue === null) { typeOrLanguageValue = '@null'; } // preferences for the value of @type or @language var prefs = []; // determine prefs for @id based on whether or not value compacts to a term if ((typeOrLanguageValue === '@id' || typeOrLanguageValue === '@reverse') && _isSubjectReference(value)) { // prefer @reverse first if (typeOrLanguageValue === '@reverse') { prefs.push('@reverse'); } // try to compact value to a term var term = api.compactIri({ activeCtx: activeCtx, iri: value['@id'], relativeTo: { vocab: true } }); if (term in activeCtx.mappings && activeCtx.mappings[term] && activeCtx.mappings[term]['@id'] === value['@id']) { // prefer @vocab prefs.push.apply(prefs, ['@vocab', '@id']); } else { // prefer @id prefs.push.apply(prefs, ['@id', '@vocab']); } } else { prefs.push(typeOrLanguageValue); } prefs.push('@none'); var containerMap = activeCtx.inverse[iri]; for (var ci = 0; ci < containers.length; ++ci) { // if container not available in the map, continue var container = containers[ci]; if (!(container in containerMap)) { continue; } var typeOrLanguageValueMap = containerMap[container][typeOrLanguage]; for (var pi = 0; pi < prefs.length; ++pi) { // if type/language option not available in the map, continue var pref = prefs[pi]; if (!(pref in typeOrLanguageValueMap)) { continue; } // select term return typeOrLanguageValueMap[pref]; } } return null; } /** * The value of `@nest` in the term definition must either be `@nest`, or a term * which resolves to `@nest`. * * @param activeCtx the active context. * @param nestProperty a term in the active context or `@nest`. */ function _checkNestProperty(activeCtx, nestProperty) { if (_expandIri(activeCtx, nestProperty, { vocab: true }) !== '@nest') { throw new JsonLdError('JSON-LD compact error; nested property must have an @nest value ' + 'resolving to @nest.', 'jsonld.SyntaxError', { code: 'invalid @nest value' }); } } /***/ }), /* 138 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(3), parseLinkHeader = _require.parseLinkHeader, buildHeaders = _require.buildHeaders; var _require2 = __webpack_require__(25), LINK_HEADER_REL = _require2.LINK_HEADER_REL; var JsonLdError = __webpack_require__(6); var RequestQueue = __webpack_require__(50); /** * Creates a built-in node document loader. * * @param options the options to use: * secure: require all URLs to use HTTPS. * strictSSL: true to require SSL certificates to be valid, * false not to (default: true). * maxRedirects: the maximum number of redirects to permit, none by * default. * request: the object which will make the request, default is * provided by `https://www.npmjs.com/package/request`. * headers: an object (map) of headers which will be passed as request * headers for the requested document. Accept is not allowed. * * @return the node document loader. */ module.exports = function () { var loadDocument = function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(url, redirects) { var doc, result, _result, res, body, statusText, linkHeader; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(url.indexOf('http:') !== 0 && url.indexOf('https:') !== 0)) { _context.next = 2; break; } throw new JsonLdError('URL could not be dereferenced; only "http" and "https" URLs are ' + 'supported.', 'jsonld.InvalidUrl', { code: 'loading document failed', url: url }); case 2: if (!(secure && url.indexOf('https') !== 0)) { _context.next = 4; break; } throw new JsonLdError('URL could not be dereferenced; secure mode is enabled and ' + 'the URL\'s scheme is not "https".', 'jsonld.InvalidUrl', { code: 'loading document failed', url: url }); case 4: // TODO: disable cache until HTTP caching implemented doc = null; //cache.get(url); if (!(doc !== null)) { _context.next = 7; break; } return _context.abrupt('return', doc); case 7: result = void 0; _context.prev = 8; _context.next = 11; return _request(request, { url: url, headers: headers, strictSSL: strictSSL, followRedirect: false }); case 11: result = _context.sent; _context.next = 17; break; case 14: _context.prev = 14; _context.t0 = _context['catch'](8); throw new JsonLdError('URL could not be dereferenced, an error occurred.', 'jsonld.LoadDocumentError', { code: 'loading document failed', url: url, cause: _context.t0 }); case 17: _result = result, res = _result.res, body = _result.body; doc = { contextUrl: null, documentUrl: url, document: body || null }; // handle error statusText = http.STATUS_CODES[res.statusCode]; if (!(res.statusCode >= 400)) { _context.next = 22; break; } throw new JsonLdError('URL could not be dereferenced: ' + statusText, 'jsonld.InvalidUrl', { code: 'loading document failed', url: url, httpStatusCode: res.statusCode }); case 22: if (!(res.headers.link && res.headers['content-type'] !== 'application/ld+json')) { _context.next = 27; break; } // only 1 related link header permitted linkHeader = parseLinkHeader(res.headers.link)[LINK_HEADER_REL]; if (!Array.isArray(linkHeader)) { _context.next = 26; break; } throw new JsonLdError('URL could not be dereferenced, it has more than one associated ' + 'HTTP Link Header.', 'jsonld.InvalidUrl', { code: 'multiple context link headers', url: url }); case 26: if (linkHeader) { doc.contextUrl = linkHeader.target; } case 27: if (!(res.statusCode >= 300 && res.statusCode < 400 && res.headers.location)) { _context.next = 34; break; } if (!(redirects.length === maxRedirects)) { _context.next = 30; break; } throw new JsonLdError('URL could not be dereferenced; there were too many redirects.', 'jsonld.TooManyRedirects', { code: 'loading document failed', url: url, httpStatusCode: res.statusCode, redirects: redirects }); case 30: if (!(redirects.indexOf(url) !== -1)) { _context.next = 32; break; } throw new JsonLdError('URL could not be dereferenced; infinite redirection was detected.', 'jsonld.InfiniteRedirectDetected', { code: 'recursive context inclusion', url: url, httpStatusCode: res.statusCode, redirects: redirects }); case 32: redirects.push(url); return _context.abrupt('return', loadDocument(res.headers.location, redirects)); case 34: // cache for each redirected URL redirects.push(url); // TODO: disable cache until HTTP caching implemented /* for(let i = 0; i < redirects.length; ++i) { cache.set( redirects[i], {contextUrl: null, documentUrl: redirects[i], document: body}); } */ return _context.abrupt('return', doc); case 36: case 'end': return _context.stop(); } } }, _callee, this, [[8, 14]]); })); return function loadDocument(_x2, _x3) { return _ref2.apply(this, arguments); }; }(); var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { strictSSL: true, maxRedirects: -1, headers: {} }, secure = _ref.secure, _ref$strictSSL = _ref.strictSSL, strictSSL = _ref$strictSSL === undefined ? true : _ref$strictSSL, _ref$maxRedirects = _ref.maxRedirects, maxRedirects = _ref$maxRedirects === undefined ? -1 : _ref$maxRedirects, request = _ref.request, _ref$headers = _ref.headers, headers = _ref$headers === undefined ? {} : _ref$headers; headers = buildHeaders(headers); // TODO: use `r2` request = request || __webpack_require__(49); var http = __webpack_require__(49); // TODO: disable cache until HTTP caching implemented //const cache = new DocumentCache(); var queue = new RequestQueue(); return queue.wrapLoader(function (url) { return loadDocument(url, []); }); }; function _request(request, options) { return new Promise(function (resolve, reject) { request(options, function (err, res, body) { if (err) { reject(err); } else { resolve({ res: res, body: body }); } }); }); } /***/ }), /* 139 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(3), parseLinkHeader = _require.parseLinkHeader, buildHeaders = _require.buildHeaders; var _require2 = __webpack_require__(25), LINK_HEADER_REL = _require2.LINK_HEADER_REL; var JsonLdError = __webpack_require__(6); var RequestQueue = __webpack_require__(50); var REGEX_LINK_HEADER = /(^|(\r\n))link:/i; /** * Creates a built-in XMLHttpRequest document loader. * * @param options the options to use: * secure: require all URLs to use HTTPS. * headers: an object (map) of headers which will be passed as request * headers for the requested document. Accept is not allowed. * [xhr]: the XMLHttpRequest API to use. * * @return the XMLHttpRequest document loader. */ module.exports = function () { var loader = function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(url) { var req, doc, contentType, linkHeader; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(url.indexOf('http:') !== 0 && url.indexOf('https:') !== 0)) { _context.next = 2; break; } throw new JsonLdError('URL could not be dereferenced; only "http" and "https" URLs are ' + 'supported.', 'jsonld.InvalidUrl', { code: 'loading document failed', url: url }); case 2: if (!(secure && url.indexOf('https') !== 0)) { _context.next = 4; break; } throw new JsonLdError('URL could not be dereferenced; secure mode is enabled and ' + 'the URL\'s scheme is not "https".', 'jsonld.InvalidUrl', { code: 'loading document failed', url: url }); case 4: req = void 0; _context.prev = 5; _context.next = 8; return _get(xhr, url, headers); case 8: req = _context.sent; _context.next = 14; break; case 11: _context.prev = 11; _context.t0 = _context['catch'](5); throw new JsonLdError('URL could not be dereferenced, an error occurred.', 'jsonld.LoadDocumentError', { code: 'loading document failed', url: url, cause: _context.t0 }); case 14: if (!(req.status >= 400)) { _context.next = 16; break; } throw new JsonLdError('URL could not be dereferenced: ' + req.statusText, 'jsonld.LoadDocumentError', { code: 'loading document failed', url: url, httpStatusCode: req.status }); case 16: doc = { contextUrl: null, documentUrl: url, document: req.response }; // handle Link Header (avoid unsafe header warning by existence testing) contentType = req.getResponseHeader('Content-Type'); linkHeader = void 0; if (REGEX_LINK_HEADER.test(req.getAllResponseHeaders())) { linkHeader = req.getResponseHeader('Link'); } if (!(linkHeader && contentType !== 'application/ld+json')) { _context.next = 25; break; } // only 1 related link header permitted linkHeader = parseLinkHeader(linkHeader)[LINK_HEADER_REL]; if (!Array.isArray(linkHeader)) { _context.next = 24; break; } throw new JsonLdError('URL could not be dereferenced, it has more than one ' + 'associated HTTP Link Header.', 'jsonld.InvalidUrl', { code: 'multiple context link headers', url: url }); case 24: if (linkHeader) { doc.contextUrl = linkHeader.target; } case 25: return _context.abrupt('return', doc); case 26: case 'end': return _context.stop(); } } }, _callee, this, [[5, 11]]); })); return function loader(_x2) { return _ref2.apply(this, arguments); }; }(); var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { headers: {} }, secure = _ref.secure, _ref$headers = _ref.headers, headers = _ref$headers === undefined ? {} : _ref$headers, xhr = _ref.xhr; headers = buildHeaders(headers); var queue = new RequestQueue(); return queue.wrapLoader(loader); }; function _get(xhr, url, headers) { xhr = xhr || XMLHttpRequest; var req = new xhr(); return new Promise(function (resolve, reject) { req.onload = function () { return resolve(req); }; req.onerror = function (err) { return reject(err); }; req.open('GET', url, true); for (var k in headers) { req.setRequestHeader(k, headers[k]); } req.send(); }); } /***/ }), /* 140 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } module.exports = function (jsonld) { var JsonLdProcessor = function () { function JsonLdProcessor() { _classCallCheck(this, JsonLdProcessor); } _createClass(JsonLdProcessor, [{ key: 'toString', value: function toString() { return '[object JsonLdProcessor]'; } }]); return JsonLdProcessor; }(); Object.defineProperty(JsonLdProcessor, 'prototype', { writable: false, enumerable: false }); Object.defineProperty(JsonLdProcessor.prototype, 'constructor', { writable: true, enumerable: false, configurable: true, value: JsonLdProcessor }); // The Web IDL test harness will check the number of parameters defined in // the functions below. The number of parameters must exactly match the // required (non-optional) parameters of the JsonLdProcessor interface as // defined here: // https://www.w3.org/TR/json-ld-api/#the-jsonldprocessor-interface JsonLdProcessor.compact = function (input, ctx) { if (arguments.length < 2) { return Promise.reject(new TypeError('Could not compact, too few arguments.')); } return jsonld.compact(input, ctx); }; JsonLdProcessor.expand = function (input) { if (arguments.length < 1) { return Promise.reject(new TypeError('Could not expand, too few arguments.')); } return jsonld.expand(input); }; JsonLdProcessor.flatten = function (input) { if (arguments.length < 1) { return Promise.reject(new TypeError('Could not flatten, too few arguments.')); } return jsonld.flatten(input); }; return JsonLdProcessor; }; /***/ }), /* 141 */ /***/ (function(module, exports) { /* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */ module.exports = __webpack_amd_options__; /* WEBPACK VAR INJECTION */}.call(exports, {})) /***/ }) /******/ ]); });