From b21c467c54ce2f21017f8e80a1f8a75569b29f8b Mon Sep 17 00:00:00 2001 From: Ruben van de Ven Date: Sat, 22 Sep 2018 19:22:05 +0200 Subject: [PATCH] New styling WIP, with square images --- gulpfile.js | 21 +- index.html | 8 +- rubenvandeven.jsonld | 41 +- src/js/jsonld.js | 19306 -------------------------------------- src/js/portfolio.js | 171 +- src/scss/portfolio.scss | 189 +- 6 files changed, 272 insertions(+), 19464 deletions(-) delete mode 100644 src/js/jsonld.js diff --git a/gulpfile.js b/gulpfile.js index a3c4e52..a944bc4 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -6,6 +6,10 @@ var rename = require('gulp-rename'); var uglify = require('gulp-uglify'); var sourcemaps = require('gulp-sourcemaps'); var browserSync = require('browser-sync'); +var jsonld = require('jsonld'); + + +var through = require('through2') // todo: rollup for d3 & possibly jsonld var paths = { @@ -19,7 +23,7 @@ var paths = { }, "data": { "src": "./rubenvandeven.jsonld", - "dest": "./assets/rubenvandeven.jsonld" + "dest": "./assets/js/" } }; @@ -47,9 +51,24 @@ gulp.task('scripts', function() { .pipe(gulp.dest(paths.scripts.dest)) // save .min.js }); +gulp.task('jsonld', function(){ + return gulp.src(paths.data.src) + .pipe(through.obj(function (file, enc, callback) { + let data = JSON.parse(file.contents.toString(enc)); + var transformedFile = file.clone(); + // console.log(data); + jsonld.flatten(data, {"@context": "https://schema.org/"}, (err, flattened)=> { + transformedFile.contents = Buffer.from(JSON.stringify(flattened), enc); + callback(null, transformedFile) + }); + })) + .pipe(gulp.dest(paths.data.dest)); +}); + var watchStylesAndScripts = function() { gulp.watch(paths.styles.src,['styles']); gulp.watch(paths.scripts.src,['scripts', browserSync.reload]); + gulp.watch([paths.data.src], ['jsonld', browserSync.reload]); } gulp.task('watch', watchStylesAndScripts); diff --git a/index.html b/index.html index 64bb38c..d6993f9 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - + @@ -44,6 +44,10 @@ + + + +
@@ -52,6 +56,8 @@
Show: + ... +
diff --git a/rubenvandeven.jsonld b/rubenvandeven.jsonld index a2156b6..9bcedbe 100644 --- a/rubenvandeven.jsonld +++ b/rubenvandeven.jsonld @@ -4,11 +4,25 @@ "url": "https://rubenvandeven.com", "author": { + "@id": "https://rubenvandeven.com/ruben", "@type": "Person", "name": "Ruben van de Ven", "email": "info@rubenvandeven.com", "nationality": "The Netherlands", + "jobTitle": "digital artist / researcher of software culture", "@reverse": { + "member": [ + { + "@id": "http://plottingd.at/a", + "@type": "PerformingGroup", + "name": "PlottingD.at/a", + "url": "http://plottingd.at/a", + "description": "A collaboration between Ruben van de Ven and Cristina Cochior.", + "member": [ + {"@id": "http://randomizer.info"} + ] + } + ], "author": [ { "@type": "MediaObject", @@ -56,7 +70,7 @@ "@reverse": { "workFeatured": [ { - "@id": "kick2018exhibit", + "@id": "https://rubenvandeven.com/#kick2018exhibit", "@type": "ExhibitionEvent", "name": "KickstART", "location": { @@ -68,7 +82,7 @@ "endDate": "2018-03-28" }, { - "@id": "in4artSalon", + "@id": "https://rubenvandeven.com/#in4artSalon", "@type": "ExhibitionEvent", "name": "Salon VI - Innovatism", "location": { @@ -92,7 +106,7 @@ "@reverse": { "workFeatured": { - "@id": "kick2018exhibit" + "@id": "https://rubenvandeven.com/#kick2018exhibit" } }, "image": [ @@ -106,7 +120,7 @@ "@reverse": { "workFeatured": { - "@id": "kick2018exhibit" + "@id": "https://rubenvandeven.com/#kick2018exhibit" } }, "image": [ @@ -126,7 +140,7 @@ "name": "The Black Box Concern", "url": "....", "location": { - "@id": "v2_" + "@id": "https://rubenvandeven.com/#v2_" }, "startDate": "2017-12", "workFeatured": [] @@ -140,7 +154,7 @@ { "@type": "MediaObject", "name": "Emotion Hero", - "description": "Emotion recognition software is being used both as a tool for \u2018objective\u2019 measurements as well as a tool for training one\u2019s facial expressions, eg. for job interviews. Emotion Hero is a literal translation of the paradoxical relation between these applications of the technology.\n\nEmotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device (see Google Play<\/a>). Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face (eg. \u201cYou showed on 10% Joy when you had to show 100%, smile 99.32% more.\u201d), revealing that rather than being a window into the brain, the face is a controllable surface.\n\nThe second part is a projection that shows the aggregated scores of the game. In order to substantiate their discourse, companies in facial expression measurement employ a huge amount of data collection and processing. The results are displayed in a fixed grid, recalling historical practices that, trough extensive measurement and administration, also aimed to delineate something which is conceptually undelineated: think of Duchenne de Boulogne, Lombroso, and Charcot.\n\nEmotion Hero is a playful invitation to open up the box of expression analysis to reveal the assumptions that underlie this technology.\n\nThe game's emotional intelligence is powered by Affectiva (I was also interviewed<\/a> by them). This project is produced as part of the Summer Sessions Network for Talent Development<\/a> in a co-production of Arquivo 237 and V2_ Lab for the Unstable Media, with support of the Creative Industries Fund NL.\nIt has been exhibited at the State Festival 2016<\/a> (Berlin, DE) and Digital <Dis>orders (Frankfurt, DE).", + "description": "Emotion recognition software is being used both as a tool for \u2018objective\u2019 measurements as well as a tool for training one\u2019s facial expressions, eg. for job interviews. Emotion Hero is a literal translation of the paradoxical relation between these applications of the technology.\n\nEmotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device (see Google Play<\/a>). Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face (eg. \u201cYou showed on 10% Joy when you had to show 100%, smile 99.32% more.\u201d), revealing that rather than being a window into the brain, the face is a controllable surface.\n\nThe second part is a projection that shows the aggregated scores of the game. In order to substantiate their discourse, companies in facial expression measurement employ a huge amount of data collection and processing. The results are displayed in a fixed grid, recalling historical practices that, trough extensive measurement and administration, also aimed to delineate something which is conceptually undelineated: think of Duchenne de Boulogne, Lombroso, and Charcot.\n\nEmotion Hero is a playful invitation to open up the box of expression analysis to reveal the assumptions that underlie this technology.\nThe game's emotional intelligence is powered by Affectiva (I was also interviewed<\/a> by them). This project is produced as part of the Summer Sessions Network for Talent Development<\/a> in a co-production of Arquivo 237 and V2_ Lab for the Unstable Media, with support of the Creative Industries Fund NL.\nIt has been exhibited at the State Festival 2016<\/a> (Berlin, DE) and Digital <Dis>orders (Frankfurt, DE).", "url": "https://emotionhero.com", "@reverse": { "workFeatured": [ @@ -190,7 +204,7 @@ }, "startDate": "2017-09", "endDate": "2017-09", - "organiser": { "@id":"v2_" }, + "organiser": { "@id":"vhttps://rubenvandeven.com/#2_" }, "funded": "Creative Industries Fund", "workFeatured": [] }, @@ -209,7 +223,7 @@ "workFeatured": [] }, { - "@id": "codesandmodes", + "@id": "https://rubenvandeven.com/#codesandmodes", "@type": "ExhibitionEvent", "name": "Codes & Modes II", "organiser": "Integrated Media Arts MFA", @@ -223,7 +237,7 @@ "workFeatured": [] }, { - "@id": "stateofemotion", + "@id": "https://rubenvandeven.com/#stateofemotion", "@type": "ExhibitionEvent", "name": "STATE of Emotion", "location": { @@ -293,7 +307,7 @@ "name": "Test_Lab the Graduation Edition", "url": "...", "location": { - "@id": "v2_", + "@id": "https://rubenvandeven.com/#v2_", "@type": "Place", "name": "V2_", "address": "Rotterdam" @@ -334,6 +348,7 @@ "dateCreated": "2016", "description": "...", "author": { + "@id": "http://randomizer.info", "@type": "Person", "name": "Cristina Cochior", "url": "http://randomizer.info" @@ -412,10 +427,10 @@ "@reverse": { "workFeatured": [ { - "@id": "codesandmodes" + "@id": "https://rubenvandeven.com/#codesandmodes" }, { - "@id": "stateofemotion" + "@id": "https://rubenvandeven.com/#stateofemotion" }, { "@type": "ExhibitionEvent", @@ -424,7 +439,7 @@ "startDate": "2015-06", "endDate": "2015-06", "location": { - "@id": "v2_" + "@id": "https://rubenvandeven.com/#v2_" } } ] diff --git a/src/js/jsonld.js b/src/js/jsonld.js deleted file mode 100644 index 6d2b878..0000000 --- a/src/js/jsonld.js +++ /dev/null @@ -1,19306 +0,0 @@ -(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, {})) - -/***/ }) -/******/ ]); -}); \ No newline at end of file diff --git a/src/js/portfolio.js b/src/js/portfolio.js index 076da9b..2ed2ba4 100644 --- a/src/js/portfolio.js +++ b/src/js/portfolio.js @@ -79,19 +79,23 @@ function jsonLdToGraph(data){ } var graph; +// map nodes to their ID var nodeMap = {}; -jsonld.flatten(window.location.protocol + "//" + window.location.host + "/rubenvandeven.jsonld", {"@context": "https://schema.org/"},(err, flattened)=> { - console.log(err); - data = flattened; - graph = jsonLdToGraph(flattened['@graph']); - // create a map of nodes by id. - for(let i in graph.nodes) { - nodeMap[graph.nodes[i]['id']] = graph.nodes[i]; - } - // console.log(graph); - startGraph(graph); -}); - +// TODO: map node IDs to their linked node IDs +var linkMap = {}; +// TODO: use linkMap to create breadcrumbs per node +var breadcrumbs = {}; +// load the flattened jsonld file +const requestPromise = fetch('/assets/js/rubenvandeven.jsonld') + .then(r => r.json()) + .then(data => { + graph = jsonLdToGraph(data['@graph']); + // create a map of nodes by id. + for(let i in graph.nodes) { + nodeMap[graph.nodes[i]['id']] = graph.nodes[i]; + } + startGraph(graph); + }); function inCircle(dx, dy, r) { // fastest check if in circle: https://stackoverflow.com/a/7227057 @@ -109,6 +113,43 @@ function inCircle(dx, dy, r) { } } +function createLinkMap(graph) { + let linkMap = {}; + for(let link of graph['links']){ + if(typeof linkMap[link['source']] == 'undefined') { + linkMap[link['source']] = []; + } + linkMap[link['source']][linkMap[link['source']].length] = {'id': link['target'], 'name': link['name']}; + + + if(typeof linkMap[link['target']] == 'undefined') { + linkMap[link['target']] = []; + } + linkMap[link['target']][linkMap[link['target']].length] = {'id': link['source'], 'name': link['name']}; + } + return linkMap; +} + +// TODO: make sure, 'shortest' path is favoured. +function createBreadcrumbs(linkMap, srcId) { + let crumbs = {}; + let path = []; + let collectLinks = function(srcId, path){ + if(typeof crumbs[srcId] !== 'undefined') { + return; + } + crumbs[srcId] = path.slice(); + path[path.length] = srcId; + let links = linkMap[srcId]; + // collect links, append given list & skip srcId + for(let link of links) { + collectLinks(link['id'], path.slice()); + } + } + collectLinks(srcId, path); + return crumbs; +} + var nodePositions = {}; function startGraph(graph){ @@ -116,11 +157,16 @@ function startGraph(graph){ // config var nodeSize = 40; var selectedNodeSize = 140; +var firstNodeId = "https://rubenvandeven.com/ruben"; // set some vars var currentNodeIdx = 0; var currentNodePositionRadius = 0; var types = {}; + +linkMap = createLinkMap(graph); +breadcrumbs = createBreadcrumbs(linkMap, firstNodeId); + for (let nodeIdx in graph['nodes']) { let type = graph['nodes'][nodeIdx]["type"]; if(typeof types[type] == 'undefined') { @@ -130,19 +176,26 @@ for (let nodeIdx in graph['nodes']) { } var graphControlsEl = document.getElementById('graphControls'); var typeLinksEl = document.getElementById('typeLinks'); +var moreTypeLinksEl = document.getElementById('moreTypeLinks'); var relLinksEl = document.getElementById('relLinks'); // make controls +let i = 0; for (let typeName in types) { let typeLinkEl = document.createElement("li"); let typeLinkAEl = document.createElement("a"); + let typeLinkCountEl = document.createElement("span"); + typeLinkCountEl.innerHTML = types[typeName].length; typeLinkAEl.innerHTML = typeName; typeLinkAEl.addEventListener('click', function(){ centerByType(typeName); // positionNodesInCenter(types[typeName]); }); typeLinkEl.append(typeLinkAEl); - typeLinksEl.appendChild(typeLinkEl); + typeLinkEl.append(typeLinkCountEl); + (i < 5 ? typeLinksEl: moreTypeLinksEl).appendChild(typeLinkEl); + i++; + // typeLinksEl.appendChild(typeLinkEl); } @@ -237,6 +290,7 @@ var positionNodesInCenter = function(idxs) { nodeEls[nIdx].classList.add('visibleNode'); } else { nodeEls[nIdx].classList.remove('centeredNode'); + nodeEls[nIdx].classList.remove('visibleNode'); } }); @@ -319,9 +373,16 @@ var setDetails = function(nodeDatum, nodeIdx) { nodeDetailEl.removeChild(nodeDetailEl.lastChild); } - + // TODO: replace relUp & relDown with linkMap let relUp = []; let relDown = []; + let breadcrumbsEl = document.createElement('div'); + breadcrumbsEl.classList.add('breadcrumbs'); + for(let crumbNodeId of breadcrumbs[nodeDatum['id']]) { + breadcrumbsEl.innerHTML += ` ${getNodeTitle(nodeMap[crumbNodeId])}`; + } + nodeDetailEl.appendChild(breadcrumbsEl); + let titleAttr = getTitleAttribute(nodeDatum); let titleEl = document.createElement('h2'); titleEl.innerHTML = getNodeTitle(nodeDatum); @@ -457,30 +518,14 @@ var selectNode = function(idx){ // set global var positionNodesInCenter(idx); - /* DISABLED: Make selected nodes bigger - // update collision: the selected node should get plenty of space. - simulation.force("collision").radius(function(d, idx){ - if(typeof nodePositions[idx] != 'undefined'){ - return selectedNodeSize * 1.2; - } - return nodeSize * 1.1; - }); - node.each(function(d, idx, nodeEls){ - let nodeEl = nodeEls[idx]; - let nodeD3 = d3.select(nodeEl); - let circleD3 = nodeD3.select('circle'); + let currentCrumbs = breadcrumbs[nodeDatum['id']].slice(); + currentCrumbs[currentCrumbs.length] = nodeDatum['id']; + console.log(currentCrumbs); - if(typeof nodePositions[idx] !== 'undefined') { - circleD3.transition(selectedNodeTransition).attr('r', selectedNodeSize); - // nodeEl.getElementsByTagName("circle")[0].attributes.r.value = selectedNodeSize; - } else { - circleD3.transition(selectedNodeTransition).attr('r', nodeSize); - // nodeEl.getElementsByTagName("circle")[0].attributes.r.value = nodeSize; - } - }); - */ + // set active links. let linkedIdxs = []; link.each(function(d,idx,linkEls,q){ + // set nodes 'visible'/highlighted when linked to active node if(d.source == nodeDatum || d.target == nodeDatum) { linkEls[idx].classList.add('activeLink','visibleLink'); linkEls[idx].getElementsByTagName("line")[0].setAttribute("marker-end", "url(#arrowHeadSelected)"); @@ -491,11 +536,19 @@ var selectNode = function(idx){ } return r; }).classed('visibleNode', true); - } else { linkEls[idx].classList.remove('activeLink'); linkEls[idx].getElementsByTagName("line")[0].setAttribute("marker-end", "url(#arrowHead)"); } + // check if link is part of breadcrumb trail + let posSrc = currentCrumbs.indexOf(d.source['id']); + let posTrg = currentCrumbs.indexOf(d.target['id']); + if(posSrc > -1 && posTrg > -1 && Math.abs(posSrc - posTrg) == 1) { + linkEls[idx].classList.add('breadcrumbLink'); + // linkEls[idx].getElementsByTagName("line")[0].setAttribute("marker-end", "url(#arrowHeadSelected)"); + } else { + linkEls[idx].classList.remove('breadcrumbLink'); + } }); let i = linkedIdxs.indexOf(idx); @@ -542,8 +595,8 @@ simulation.force('centerActive', function force(alpha) { return; } - n.vx += dx * k /5; - n.vy += dy * k /5; + n.vx += dx * k*3; + n.vy += dy * k*3; } }); }); @@ -597,10 +650,7 @@ node.append('circle') .attr("r", nodeSize) .attr("class", "nodeBg") ; -node.append('circle') - .attr("r", nodeSize * 1.08) // nodeSize + margin - .attr("class", "highlightCircle") - ; + node.append('text') .append("textPath") @@ -608,17 +658,28 @@ node.append('text') .text(getNodeTitle); node.each(function(d) { + let n = d3.select(this); if(!d.contentUrl) { - return; + n.append('circle') + .attr("r", nodeSize * 1.08) // nodeSize + margin + .attr("class", "highlightCircle") + ; + } else { + n.append('svg:image') + .attr("xlink:href", d.contentUrl) + .attr("width", nodeSize*2) + .attr("height", nodeSize*2) + .attr("transform","translate(-"+nodeSize+" -"+nodeSize+")") + // .attr("clip-path","url(#clipNodeImage)") + .attr("preserveAspectRatio","xMidYMid slice") + ; + n.append('rect') + .attr("width", nodeSize * 1.08 * 2) // nodeSize + margin + .attr("height", nodeSize * 1.08 * 2) // nodeSize + margin + .attr("transform","translate(-"+nodeSize * 1.08 +" -"+nodeSize * 1.08 +")") + .attr("class", "highlightCircle") + ; } - d3.select(this).append('svg:image') - .attr("xlink:href", d.contentUrl) - .attr("width", nodeSize*2) - .attr("height", nodeSize*2) - .attr("transform","translate(-"+nodeSize+" -"+nodeSize+")") - .attr("clip-path","url(#clipNodeImage)") - .attr("preserveAspectRatio","xMidYMid slice") - ; }); // node.append("title") @@ -713,6 +774,10 @@ function ticked() { let x = d.source.x + dx; let y = d.source.y + dy; let deg = Math.atan(dy / dx) * 180 / Math.PI; + // if dx/dy == 0/0 -> deg == NaN + if(isNaN(deg)) { + return ""; + } return "translate("+x+" "+y+") rotate("+deg+") translate(0, -10)"; }); // linkPath.attr("d", function(d) { @@ -797,7 +862,7 @@ function moveViewboxPx(dx, dy){ // start by selecting the first node :-) // selectNode(currentNodeIdx+1); // positionNodesInCenter(currentNodeIdx); -selectNode(currentNodeIdx); //deselectNode(); -closeDetails(); +selectNode(graph['nodes'].length - 1); +// closeDetails(); // hide details at first // positionNodesInCenter(currentNodeIdx+1); } diff --git a/src/scss/portfolio.scss b/src/scss/portfolio.scss index 98d21d3..5450e69 100644 --- a/src/scss/portfolio.scss +++ b/src/scss/portfolio.scss @@ -6,36 +6,9 @@ $detailSlideMobile: -30vh; body{ margin:0;overflow: hidden; - font-family: sans-serif; -/* background: #fceabb; -background: -moz-linear-gradient(-45deg, #fceabb 0%, #fccd4d 50%, #f8b500 51%, #fbdf93 100%); -background: -webkit-linear-gradient(-45deg, #fceabb 0%,#fccd4d 50%,#f8b500 51%,#fbdf93 100%); -background: linear-gradient(135deg, #fceabb 0%,#fccd4d 50%,#f8b500 51%,#fbdf93 100%); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fceabb', endColorstr='#fbdf93',GradientType=1 ); */ -/*background: #f7fbfc; -background: -moz-linear-gradient(45deg, #f7fbfc 0%, #d9edf2 40%, #add9e4 100%); -background: -webkit-linear-gradient(45deg, #f7fbfc 0%,#d9edf2 40%,#add9e4 100%); -background: linear-gradient(45deg, #f7fbfc 0%,#d9edf2 40%,#add9e4 100%); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7fbfc', endColorstr='#add9e4',GradientType=1 );*/ -/*background: #e2e2e2; -background: -moz-linear-gradient(45deg, #e2e2e2 0%, #dbdbdb 50%, #d1d1d1 51%, #fefefe 100%); -background: -webkit-linear-gradient(45deg, #e2e2e2 0%,#dbdbdb 50%,#d1d1d1 51%,#fefefe 100%); -background: linear-gradient(45deg, #e2e2e2 0%,#dbdbdb 50%,#d1d1d1 51%,#fefefe 100%); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e2e2e2', endColorstr='#fefefe',GradientType=1 );*/ -/*background: #d2dfed; -background: -moz-linear-gradient(45deg, #d2dfed 0%, #c8d7eb 26%, #bed0ea 51%, #a6c0e3 51%, #afc7e8 62%, #bad0ef 75%, #99b5db 88%, #799bc8 100%); -background: -webkit-linear-gradient(45deg, #d2dfed 0%,#c8d7eb 26%,#bed0ea 51%,#a6c0e3 51%,#afc7e8 62%,#bad0ef 75%,#99b5db 88%,#799bc8 100%); -background: linear-gradient(45deg, #d2dfed 0%,#c8d7eb 26%,#bed0ea 51%,#a6c0e3 51%,#afc7e8 62%,#bad0ef 75%,#99b5db 88%,#799bc8 100%); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#d2dfed', endColorstr='#799bc8',GradientType=1 );*/ -background: #d2dfed; -background: -moz-linear-gradient(45deg, #d2dfed 0%, #afc1d8 13%, #d5e0ef 28%, #bed0ea 51%, #a8c0dd 51%, #c0d0e5 63%, #bad0ef 75%, #a2bad8 88%, #799bc8 100%); -background: -webkit-linear-gradient(45deg, #d2dfed 0%,#afc1d8 13%,#d5e0ef 28%,#bed0ea 51%,#a8c0dd 51%,#c0d0e5 63%,#bad0ef 75%,#a2bad8 88%,#799bc8 100%); -background: linear-gradient(45deg, #d2dfed 0%,#afc1d8 13%,#d5e0ef 28%,#bed0ea 51%,#a8c0dd 51%,#c0d0e5 63%,#bad0ef 75%,#a2bad8 88%,#799bc8 100%); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#d2dfed', endColorstr='#799bc8',GradientType=1 ); -height: 100vh; -/*-moz-animation: bgShift 5s infinite; -background-size: 400% 400%;*/ -// font-size:18px; + font-family: "CMU Bright", sans-serif; + height: 100vh; + background: black; } a, a:link, a:visited{ @@ -69,80 +42,116 @@ g.node{ stroke: blue; stroke-width: 0; transition: stroke-width .5s; - opacity: 0; - pointer-events: none; - transition: opacity 1s; -} -g.node.visibleNode/* , g.node.ImageObject */ -{ opacity: 1; - pointer-events: auto; -} -g.node circle.highlightCircle{ - fill: none; - stroke-width:0px; - stroke-dasharray: 3 2; -} -g.node:hover circle.highlightCircle{ - stroke-width: 1px; - stroke: blue; -} -g.node:active circle.highlightCircle{ - stroke-width:1px; - stroke: red; -} -g.node.centeredNode circle.highlightCircle{ - stroke-width:1px; - stroke: red; -} -/* g.node.selectedNode circle.highlightCircle{ - stroke-width:1px; - stroke: red; -} */ -g.node.drag{ - cursor:grabbing; -} -.node text{ - text-anchor: start; + // pointer-events: none; + transition: opacity 1s; + + &.visibleNode{ + opacity: 1; + pointer-events: auto; + *{ + // transform: scale(1); + } + } + + *{ + // transform: scale(.4); + } + + .highlightCircle{ + fill: none; + stroke-width:0px; + stroke-dasharray: 3 2; + } + + &:hover .highlightCircle{ + stroke-width: 1px; + stroke: yellow; + } + + &.drag{ + cursor: grabbing; + } + + text{ + text-anchor: start; + font-family: "CMU Bright", sans-serif; + font-size: 10pt; + } } + .relationship{ display:none; + // opacity: .2; + + &.visibleLink{ + display:block; + // opacity: 1; + + } + + line{ + fill:none; + stroke: #999; + stroke-width: 2px; + + } + + text{ + fill:black; + font-family: "Noto Mono", monospace; + font-size: 9pt; + // font-size: 75%; + display:none; + } + &.activeLink{ + line{ + stroke: white; + } + text{ + fill:white; + display:block; + } + } + &.breadcrumbLink{ + display: block; + + line { + stroke: yellow !important; + display: block; + } + text{ + fill: yellow !important; + display:block; + } + } } -.relationship.visibleLink{ - display:block; -} -.relationship line{ - fill:none; - stroke: #999; - stroke-width: 2px; -} -.relationship text{ - fill:black; - /* text-transform: lowercase; */ - font-size: 75%; - display:none; -} -.relationship.activeLink text{ - fill:white; - display:block; -} -.relationship.activeLink line{ - stroke: white; -} + circle.nodeBg{ fill: white; - /*stroke-width:.2em;*/ - fill:url(#blueGrad); + // fill: url(#img1); + // fill:url(#blueGrad); + stroke-width: 3px; + stroke: black; + + .visibleNode & { + stroke: yellow; + } .MediaObject & { - fill:url(#orangeGrad); + // fill:url(#orangeGrad); } .Person & { - fill:url(#redGrad); + // fill:url(#redGrad); } .PublicationEvent & { - fill:url(#limeGrad); + // fill:url(#limeGrad); + } + + .centeredNode &{ + fill: yellow; + stroke: yellow; } } text{