Created
February 23, 2015 16:37
-
-
Save gregglind/4974c7397c3fb7d40819 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /******/ (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] = { | |
| /******/ exports: {}, | |
| /******/ id: moduleId, | |
| /******/ loaded: false | |
| /******/ }; | |
| /******/ | |
| /******/ // Execute the module function | |
| /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | |
| /******/ | |
| /******/ // Flag the module as loaded | |
| /******/ module.loaded = 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; | |
| /******/ | |
| /******/ // __webpack_public_path__ | |
| /******/ __webpack_require__.p = ""; | |
| /******/ | |
| /******/ // Load entry module and return exports | |
| /******/ return __webpack_require__(0); | |
| /******/ }) | |
| /************************************************************************/ | |
| /******/ ([ | |
| /* 0 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| "use strict"; | |
| var actions = __webpack_require__(4); | |
| var runner = __webpack_require__(1); | |
| var personinfo = __webpack_require__(5); | |
| var phonehome = __webpack_require__(6); | |
| var events = __webpack_require__(7); | |
| var merge = __webpack_require__(3).merge; | |
| function paramsToObj(search) { | |
| if (!search) | |
| return {}; | |
| search = search.startsWith("?") ? search.substring(1) : search; | |
| search = search.endsWith("/") ? search.substring(0, search.length - 1) : search; | |
| search = decodeURIComponent(search); | |
| try { | |
| return JSON.parse(search); | |
| } catch (e) { | |
| console.error("bad params:", decodeURIComponent(search)); | |
| } | |
| } | |
| function guessLocale(path, aNav) { | |
| path = path || window.location.pathname; | |
| var nav = aNav || navigator || {}; | |
| var ans; | |
| var re = (function(x) { | |
| return /^[a-z]{2,3}(|\-[a-z]{2})$/i.test(x); | |
| }); | |
| var possibles = path.split("/").filter(re); | |
| if (possibles.length) { | |
| ans = possibles.pop(); | |
| } else { | |
| ans = (navigator && navigator.language); | |
| } | |
| return ans; | |
| } | |
| var runtimeConfig = {}; | |
| if (typeof window !== "undefined") { | |
| runtimeConfig = paramsToObj(window.location.search); | |
| } | |
| var state; | |
| var mainloop = function(repairsList) { | |
| console.log("heartbeat main loop"); | |
| runner.runAll(repairsList, personinfo.personinfo, null).then(function() { | |
| actions.log("mainloop runAll callback"); | |
| }); | |
| }; | |
| var guessedLocale = guessLocale(); | |
| if (guessLocale) { | |
| personinfo.config.overrides.locale = guessedLocale; | |
| } | |
| for (var key in runtimeConfig) { | |
| var branch = runtimeConfig[key]; | |
| console.log(key, branch); | |
| switch (key) { | |
| case "runner": | |
| merge(runner.config, branch); | |
| break; | |
| case "personinfo": | |
| merge(personinfo.config.overrides, branch); | |
| break; | |
| case "phonehome": | |
| merge(phonehome.config, branch); | |
| break; | |
| default: | |
| break; | |
| } | |
| } | |
| var recipes = __webpack_require__(2); | |
| window.heartbeat = { | |
| actions: actions, | |
| runner: runner, | |
| personinfo: personinfo, | |
| recipes: recipes, | |
| events: events, | |
| main: mainloop | |
| }; | |
| console.log('heartbeat loaded'); | |
| console.log('to start (if not started): `heartbeat.main(heartbeat.recipes)`'); | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 1 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| "use strict"; | |
| var actions = __webpack_require__(4); | |
| var chai = __webpack_require__(12); | |
| var type = __webpack_require__(8); | |
| var config = {alwaysRun: false}; | |
| var validate = function(thing, rules) { | |
| var errors = []; | |
| rules.map(function(rule) { | |
| try { | |
| rule(thing); | |
| } catch (E) { | |
| errors.push(E); | |
| } | |
| }); | |
| return ([errors, errors.length === 0]); | |
| }; | |
| var validateConfig = function(config) { | |
| var rules = [function(c) { | |
| chai.expect(c.name).to.be.a("string"); | |
| }, function(c) { | |
| chai.expect(c.description).to.be.a("string"); | |
| }, function(c) { | |
| chai.expect(c.owner).to.be.a("string"); | |
| }, function(c) { | |
| chai.expect(c.version).to.be.a("number"); | |
| }, function(c) { | |
| chai.expect(c.run).to.be.a("function"); | |
| }, function(c) { | |
| chai.expect(c.shouldRun).to.be.a("function"); | |
| }]; | |
| return validate(config, rules); | |
| }; | |
| var validateRunAttempt = function(obj) { | |
| var rules = [function(c) { | |
| chai.expect(c).to.contain.keys('status', 'name'); | |
| }]; | |
| return validate(obj, rules); | |
| }; | |
| var attemptRun = function(recipe, state, myconfig) { | |
| myconfig = myconfig || config; | |
| return new Promise(function(resolve, reject) { | |
| var outcome = {}; | |
| var valid = validateConfig(recipe); | |
| if (!valid[1]) | |
| resolve({ | |
| status: "invalid-config", | |
| data: valid[0] | |
| }); | |
| if (myconfig.alwaysRun || recipe.shouldRun(state)) { | |
| var good = (function() { | |
| resolve({ | |
| name: recipe.name, | |
| status: "ok" | |
| }); | |
| }); | |
| var bad = (function() { | |
| reject({ | |
| name: recipe.name, | |
| status: "run-rejected" | |
| }); | |
| }); | |
| try { | |
| recipe.run(state).then(good, bad); | |
| } catch (err) { | |
| reject({ | |
| name: recipe.name, | |
| status: "exception" | |
| }); | |
| } | |
| } else { | |
| resolve({ | |
| name: recipe.name, | |
| status: "not-run" | |
| }); | |
| } | |
| }); | |
| }; | |
| var runAll = function(repairs, statePromiseFn, myconfig) { | |
| if (!type.isFunction(statePromiseFn)) { | |
| var p = statePromiseFn; | |
| statePromiseFn = (function() { | |
| return Promise.resolve(p); | |
| }); | |
| } | |
| var results = []; | |
| myconfig = myconfig || config; | |
| var P = Promise.resolve(true); | |
| var record = function(attempt) { | |
| results.push(attempt); | |
| }; | |
| var l = repairs.length; | |
| var $__0 = function(ii) { | |
| var repair = repairs[ii]; | |
| P = P.then((function() { | |
| return statePromiseFn().then((function(state) { | |
| return attemptRun(repair, state, myconfig); | |
| })); | |
| })).then(record, (function(obj) { | |
| record(obj); | |
| return Promise.resolve(true); | |
| })); | |
| }; | |
| for (var ii = 0; ii < l; ii++) { | |
| $__0(ii); | |
| } | |
| P = P.then((function() { | |
| return results; | |
| })); | |
| return P; | |
| }; | |
| exports.config = config; | |
| exports.validateConfig = validateConfig; | |
| exports.validateRunAttempt = validateRunAttempt; | |
| exports.runAll = runAll; | |
| exports.attemptRun = attemptRun; | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 2 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| "use strict"; | |
| var repairList = module.exports = []; | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 3 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /* WEBPACK VAR INJECTION */(function(module) {"use strict"; | |
| "use strict"; | |
| module.metadata = {"stability": "unstable"}; | |
| function merge(source) { | |
| var descriptor = {}; | |
| Array().slice.call(arguments, 1).filter(Boolean).forEach(function onEach(properties) { | |
| Object.getOwnPropertyNames(properties).forEach(function(name) { | |
| descriptor[name] = Object.getOwnPropertyDescriptor(properties, name); | |
| }); | |
| }); | |
| return Object.defineProperties(source, descriptor); | |
| } | |
| exports.merge = merge; | |
| function extend(source) { | |
| var rest = Array.slice(arguments, 1); | |
| rest.unshift(Object.create(source)); | |
| return merge.apply(null, rest); | |
| } | |
| exports.extend = extend; | |
| function has(obj, key) { | |
| return obj.hasOwnProperty(key); | |
| } | |
| ; | |
| exports.has = has; | |
| function each(obj, fn) { | |
| for (var key in obj) | |
| has(obj, key) && fn(obj[key], key, obj); | |
| } | |
| exports.each = each; | |
| function safeMerge(source) { | |
| Array.slice(arguments, 1).forEach(function onEach(obj) { | |
| for (var prop in obj) | |
| source[prop] = obj[prop]; | |
| }); | |
| return source; | |
| } | |
| exports.safeMerge = safeMerge; | |
| //# sourceMappingURL=<compileOutput> | |
| /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13)(module))) | |
| /***/ }, | |
| /* 4 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| "use strict"; | |
| var log = console.log.bind(console, "repair-logger:"); | |
| var actions = { | |
| showHeartbeat: __webpack_require__(9).showHeartbeat, | |
| personinfo: __webpack_require__(5).personinfo, | |
| log: log | |
| }; | |
| actions.record = actions.log.bind(actions.log, "RECORDING"); | |
| module.exports = actions; | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 5 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| "use strict"; | |
| var UITour = __webpack_require__(14); | |
| var $__0 = __webpack_require__(3), | |
| merge = $__0.merge, | |
| extend = $__0.extend; | |
| var type = __webpack_require__(8); | |
| var config = exports.config = { | |
| overrides: {}, | |
| timeout: 5000 | |
| }; | |
| var personinfo = function(tour, aConfig) { | |
| aConfig = extend({}, config, aConfig || {}); | |
| return new Promise(function(resolve, reject) { | |
| var already = false; | |
| var revise = (function(out, over) { | |
| over = over || aConfig.overrides; | |
| if (over && type.isObject(over) && Object.keys(over).length) { | |
| merge(out, over); | |
| out.flags.overrides = over; | |
| } | |
| return out; | |
| }); | |
| setTimeout((function() { | |
| if (already) | |
| return true; | |
| out.flags.timeout = aConfig.timeout; | |
| out.flags.incomplete = true; | |
| resolve(revise(out)); | |
| }), aConfig.timeout); | |
| tour = tour || UITour; | |
| var out = { | |
| updateChannel: "unkown", | |
| fxVersion: "unknown", | |
| locale: "unknown", | |
| flags: {} | |
| }; | |
| var avail = ["sync", "appinfo", "availableTargets", "selectedSearchEngine"]; | |
| var wanted = avail.length; | |
| var got = 0; | |
| var onGet = function(which, data) { | |
| switch (which) { | |
| case "appinfo": | |
| { | |
| out.updateChannel = data.defaultUpdateChannel; | |
| out.fxVersion = data.version; | |
| break; | |
| } | |
| case "sync": | |
| case "selectedSearchEngine": | |
| case "availableTargets": | |
| break; | |
| default: | |
| break; | |
| } | |
| got++; | |
| if (got >= wanted) { | |
| already = true; | |
| resolve(revise(out)); | |
| } | |
| }; | |
| avail.map(function(which) { | |
| tour.getConfiguration(which, function(data) { | |
| onGet(which, data); | |
| }); | |
| }); | |
| }); | |
| }; | |
| exports.personinfo = personinfo; | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 6 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| "use strict"; | |
| var request = __webpack_require__(10).request; | |
| var extend = __webpack_require__(3).extend; | |
| var personinfo = __webpack_require__(5); | |
| var validate = __webpack_require__(11).validate; | |
| var log = __webpack_require__(4).log; | |
| log = log.bind(log, "phonehome"); | |
| var config = exports.config = { | |
| phonehome: true, | |
| testing: true, | |
| url: "https://input.mozilla.org/api/v2/hb/", | |
| extraData: null | |
| }; | |
| var annotate = function(obj) { | |
| return new Promise(function(resolve, reject) { | |
| obj = extend({}, obj); | |
| obj.person_id = "NA"; | |
| obj.response_version = 1; | |
| obj.updated_ts = Date.now(); | |
| personinfo.personinfo().then(function(data) { | |
| obj.platform = "UNK"; | |
| obj.channel = data.updateChannel; | |
| obj.version = data.fxVersion; | |
| obj.locale = "UNK"; | |
| obj.build_id = "-"; | |
| obj.partner_id = "-"; | |
| obj.profile_age = 0; | |
| obj.profile_usage = {}; | |
| obj.addons = {"addons": data.addons || []}; | |
| obj.extra = { | |
| crashes: data.crashes || {}, | |
| engage: obj.flow_links, | |
| numflows: 0 | |
| }; | |
| obj.experiment_version = data.addonVersion || "-"; | |
| resolve(obj); | |
| }); | |
| }); | |
| }; | |
| var phonehome = function(dataObject, options) { | |
| dataObject = dataObject || {}; | |
| options = extend({}, config, options); | |
| dataObject.is_test = !!options.testing; | |
| return new Promise(function(resolve, reject) { | |
| var send = function(dataObject) { | |
| var args = [options.url, "POST", dataObject, {'Accept': 'application/json; indent=4'}, "application/json"]; | |
| if (options.phonehome) { | |
| return request.apply(null, args); | |
| } else { | |
| return args; | |
| } | |
| }; | |
| var addExtra = function(dataObject) { | |
| if (options.extraData) { | |
| dataObject.extra = extend({}, dataObject.extra || {}, options.extraData); | |
| } | |
| return dataObject; | |
| }; | |
| var wrap_valid = function(d) { | |
| return new Promise(function(resolve, reject) { | |
| try { | |
| resolve(validate(d)); | |
| } catch (exc) { | |
| reject(exc); | |
| } | |
| }); | |
| }; | |
| annotate(dataObject).then(addExtra).then(wrap_valid).then(send).then(resolve, reject); | |
| }); | |
| }; | |
| exports.phonehome = phonehome; | |
| exports.annotate = annotate; | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 7 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| "use strict"; | |
| var dispatchEvent = function(onto, message, data, bubbles, cancelable) { | |
| if (bubbles === undefined) | |
| bubbles = true; | |
| if (cancelable === undefined) | |
| cancelable = true; | |
| if (data === undefined) | |
| data = {}; | |
| var event = new CustomEvent(message, { | |
| detail: data, | |
| bubbles: bubbles, | |
| cancelable: cancelable | |
| }); | |
| onto.dispatchEvent(event); | |
| }; | |
| var message = function(namespace, aEventName, aData, options) { | |
| options = options || {}; | |
| var bubbles = options.bubbles !== undefined ? options.bubbles : true; | |
| var cancelable = options.cancelable !== undefined ? options.cancelable : true; | |
| var onto = options.onto || document; | |
| dispatchEvent(onto, namespace, { | |
| event: aEventName, | |
| params: aData | |
| }, bubbles, cancelable); | |
| }; | |
| var observe = function(namespace, callback, options) { | |
| options = options || {}; | |
| var onto = options.onto || document; | |
| var newFn = function(event) { | |
| var detail = event.detail || {}; | |
| callback(detail.event, detail.params); | |
| }; | |
| onto.addEventListener(namespace, newFn); | |
| return [onto, namespace, newFn]; | |
| }; | |
| var unobserve = function(observeResult) { | |
| var onto = observeResult[0]; | |
| var namespace = observeResult[1]; | |
| var fn = observeResult[2]; | |
| onto.removeEventListener(namespace, fn); | |
| return observeResult; | |
| }; | |
| exports.dispatchEvent = dispatchEvent; | |
| exports.message = message; | |
| exports.observe = observe; | |
| exports.unobserve = unobserve; | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 8 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /* WEBPACK VAR INJECTION */(function(module) {"use strict"; | |
| "use strict"; | |
| module.metadata = {"stability": "unstable"}; | |
| function isUndefined(value) { | |
| return value === undefined; | |
| } | |
| exports.isUndefined = isUndefined; | |
| function isNull(value) { | |
| return value === null; | |
| } | |
| exports.isNull = isNull; | |
| function isNil(value) { | |
| return value === null || value === undefined; | |
| } | |
| exports.isNil = isNil; | |
| function isBoolean(value) { | |
| return typeof value === "boolean"; | |
| } | |
| exports.isBoolean = isBoolean; | |
| function isString(value) { | |
| return typeof value === "string"; | |
| } | |
| exports.isString = isString; | |
| function isNumber(value) { | |
| return typeof value === "number"; | |
| } | |
| exports.isNumber = isNumber; | |
| function isRegExp(value) { | |
| return isObject(value) && instanceOf(value, RegExp); | |
| } | |
| exports.isRegExp = isRegExp; | |
| function isDate(value) { | |
| return isObject(value) && instanceOf(value, Date); | |
| } | |
| exports.isDate = isDate; | |
| function isFunction(value) { | |
| return typeof value === "function"; | |
| } | |
| exports.isFunction = isFunction; | |
| function isObject(value) { | |
| return typeof value === "object" && value !== null; | |
| } | |
| exports.isObject = isObject; | |
| var isArray = Array.isArray || function isArray(value) { | |
| Object.prototype.toString.call(value) === "[object Array]"; | |
| }; | |
| exports.isArray = isArray; | |
| function isArguments(value) { | |
| Object.prototype.toString.call(value) === "[object Arguments]"; | |
| } | |
| exports.isArguments = isArguments; | |
| var isMap = function(value) { | |
| return Object.prototype.toString.call(value) === "[object Map]"; | |
| }; | |
| exports.isMap = isMap; | |
| var isSet = function(value) { | |
| return Object.prototype.toString.call(value) === "[object Set]"; | |
| }; | |
| exports.isSet = isSet; | |
| function isPrimitive(value) { | |
| return !isFunction(value) && !isObject(value); | |
| } | |
| exports.isPrimitive = isPrimitive; | |
| function isFlat(object) { | |
| return isObject(object) && (isNull(Object.getPrototypeOf(object)) || isNull(Object.getPrototypeOf(Object.getPrototypeOf(object)))); | |
| } | |
| exports.isFlat = isFlat; | |
| function isEmpty(object) { | |
| if (isObject(object)) { | |
| for (var key in object) | |
| return false; | |
| return true; | |
| } | |
| return false; | |
| } | |
| exports.isEmpty = isEmpty; | |
| function isJSON(value, visited) { | |
| (visited || (visited = [])).push(value); | |
| return isPrimitive(value) || (isArray(value) && value.every(function(element) { | |
| return isJSON(element, visited); | |
| })) || (isFlat(value) && Object.keys(value).every(function(key) { | |
| var $ = Object.getOwnPropertyDescriptor(value, key); | |
| return ((!isObject($.value) || !~visited.indexOf($.value)) && !('get' in $) && !('set' in $) && isJSON($.value, visited)); | |
| })); | |
| } | |
| exports.isJSON = function(value) { | |
| return isJSON(value); | |
| }; | |
| function instanceOf(value, Type) { | |
| var isConstructorNameSame; | |
| var isConstructorSourceSame; | |
| var isInstanceOf = value instanceof Type; | |
| if (!isInstanceOf && value) { | |
| isConstructorNameSame = value.constructor.name === Type.name; | |
| isConstructorSourceSame = String(value.constructor) == String(Type); | |
| isInstanceOf = (isConstructorNameSame && isConstructorSourceSame) || instanceOf(Object.getPrototypeOf(value), Type); | |
| } | |
| return isInstanceOf; | |
| } | |
| exports.instanceOf = instanceOf; | |
| function source(value, indent, limit, offset, visited) { | |
| var result; | |
| var names; | |
| var nestingIndex; | |
| var isCompact = !isUndefined(limit); | |
| indent = indent || " "; | |
| offset = (offset || ""); | |
| result = ""; | |
| visited = visited || []; | |
| if (isUndefined(value)) { | |
| result += "undefined"; | |
| } else if (isNull(value)) { | |
| result += "null"; | |
| } else if (isString(value)) { | |
| result += '"' + value + '"'; | |
| } else if (isFunction(value)) { | |
| value = String(value).split("\n"); | |
| if (isCompact && value.length > 2) { | |
| value = value.splice(0, 2); | |
| value.push("...}"); | |
| } | |
| result += value.join("\n" + offset); | |
| } else if (isArray(value)) { | |
| if ((nestingIndex = (visited.indexOf(value) + 1))) { | |
| result = "#" + nestingIndex + "#"; | |
| } else { | |
| visited.push(value); | |
| if (isCompact) | |
| value = value.slice(0, limit); | |
| result += "[\n"; | |
| result += value.map(function(value) { | |
| return offset + indent + source(value, indent, limit, offset + indent, visited); | |
| }).join(",\n"); | |
| result += isCompact && value.length > limit ? ",\n" + offset + "...]" : "\n" + offset + "]"; | |
| } | |
| } else if (isObject(value)) { | |
| if ((nestingIndex = (visited.indexOf(value) + 1))) { | |
| result = "#" + nestingIndex + "#"; | |
| } else { | |
| visited.push(value); | |
| names = Object.keys(value); | |
| result += "{ // " + value + "\n"; | |
| result += (isCompact ? names.slice(0, limit) : names).map(function(name) { | |
| var _limit = isCompact ? limit - 1 : limit; | |
| var descriptor = Object.getOwnPropertyDescriptor(value, name); | |
| var result = offset + indent + "// "; | |
| var accessor; | |
| if (0 <= name.indexOf(" ")) | |
| name = '"' + name + '"'; | |
| if (descriptor.writable) | |
| result += "writable "; | |
| if (descriptor.configurable) | |
| result += "configurable "; | |
| if (descriptor.enumerable) | |
| result += "enumerable "; | |
| result += "\n"; | |
| if ("value" in descriptor) { | |
| result += offset + indent + name + ": "; | |
| result += source(descriptor.value, indent, _limit, indent + offset, visited); | |
| } else { | |
| if (descriptor.get) { | |
| result += offset + indent + "get " + name + " "; | |
| accessor = source(descriptor.get, indent, _limit, indent + offset, visited); | |
| result += accessor.substr(accessor.indexOf("{")); | |
| } | |
| if (descriptor.set) { | |
| result += offset + indent + "set " + name + " "; | |
| accessor = source(descriptor.set, indent, _limit, indent + offset, visited); | |
| result += accessor.substr(accessor.indexOf("{")); | |
| } | |
| } | |
| return result; | |
| }).join(",\n"); | |
| if (isCompact) { | |
| if (names.length > limit && limit > 0) { | |
| result += ",\n" + offset + indent + "//..."; | |
| } | |
| } else { | |
| if (names.length) | |
| result += ","; | |
| result += "\n" + offset + indent + '"__proto__": '; | |
| result += source(Object.getPrototypeOf(value), indent, 0, offset + indent); | |
| } | |
| result += "\n" + offset + "}"; | |
| } | |
| } else { | |
| result += String(value); | |
| } | |
| return result; | |
| } | |
| exports.source = function(value, indentation, limit) { | |
| return source(value, indentation, limit); | |
| }; | |
| //# sourceMappingURL=<compileOutput> | |
| /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13)(module))) | |
| /***/ }, | |
| /* 9 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| "use strict"; | |
| var UITour = __webpack_require__(14); | |
| var type = __webpack_require__(8); | |
| var log = console.log.bind(console, "repair-logger:"); | |
| var showHeartbeat = function(flowid, message, thanksMsg, engagementUrl, callback) { | |
| callback = type.isFunction(callback) ? callback : null; | |
| UITour.observe(function heartbeatCallback(aEventName, aData) { | |
| if (aEventName.indexOf("Heartbeat") === 0) { | |
| if (aData.flowId !== flowid) { | |
| return; | |
| } | |
| if (callback && type.isFunction(callback)) { | |
| callback(flowid, aEventName, aData); | |
| } | |
| } | |
| }); | |
| UITour.showHeartbeat(message, thanksMsg, flowid, engagementUrl); | |
| return {flowid: flowid}; | |
| }; | |
| module.exports.showHeartbeat = showHeartbeat; | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 10 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| function request(url, method, data, headers, contentType) { | |
| return new Promise(function(resolve, reject) { | |
| var req = new XMLHttpRequest(); | |
| req.open(method, url, true); | |
| req.setRequestHeader("Content-Type", contentType || 'application/json'); | |
| for (var field in headers) { | |
| req.setRequestHeader(field, headers[field]); | |
| } | |
| req.onload = function() { | |
| if (req.status >= 200 && req.status < 300 || req.status == 0) { | |
| resolve(req.response); | |
| } else { | |
| reject(Error(req.statusText)); | |
| } | |
| }; | |
| req.onerror = function(e) { | |
| reject(Error('Network Error')); | |
| }; | |
| req.send(JSON.stringify(data)); | |
| }); | |
| } | |
| exports.request = request; | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 11 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| "use strict"; | |
| "use strict"; | |
| var apiUtils = __webpack_require__(15); | |
| var vstring = function(name, emptyok) { | |
| var msgs = [" must be a non-empty string", " must be a string"]; | |
| return { | |
| is: ["string"], | |
| ok: function(val) { | |
| return emptyok || val.length > 0; | |
| }, | |
| msg: name + msgs[!!emptyok] | |
| }; | |
| }; | |
| var vScore = function(name) { | |
| return { | |
| is: ["number", 'null'], | |
| msg: name + " must be a Number or Null to be a Score" | |
| }; | |
| }; | |
| var vJsonableObject = function(name) { | |
| return { | |
| is: ['object'], | |
| ok: function(val) { | |
| return JSON.stringify(val)[0] === "{"; | |
| }, | |
| msg: name + " not jsonable, or not object" | |
| }; | |
| }; | |
| var vArray = function(name) { | |
| return { | |
| is: ['array'], | |
| msg: name + " not Array" | |
| }; | |
| }; | |
| var vNumber = function(name) { | |
| return { | |
| is: ["number"], | |
| msg: name + "not a Number" | |
| }; | |
| }; | |
| var vboolean = function(name) { | |
| return {is: ["boolean"]}; | |
| }; | |
| var vTimestamp = function(name) { | |
| return { | |
| is: ["number"], | |
| ok: function(val) { | |
| return val >= 0; | |
| }, | |
| msg: name + " doesn't look like a js timestamp or 0. Can't be negative." | |
| }; | |
| }; | |
| var validate = exports.validate = function(packet) { | |
| var rules = { | |
| "person_id": vstring('person_id', false), | |
| "survey_id": vstring('survey_id', false), | |
| "flow_id": vstring('flow_id', false), | |
| "question_id": vstring('question_id', false), | |
| "response_version": vNumber("response_version", false), | |
| "updated_ts": vTimestamp('updated_ts', false), | |
| "question_text": vstring('question_text', false), | |
| "variation_id": vstring('variation_id', false), | |
| "experiment_version": vstring('experiment_version', false), | |
| "score": vScore("score"), | |
| "max_score": vScore("max_score"), | |
| "flow_began_ts": vTimestamp("flow_began_ts"), | |
| "flow_offered_ts": vTimestamp("flow_offered_ts"), | |
| "flow_voted_ts": vTimestamp("flow_voted_ts"), | |
| "flow_engaged_ts": vTimestamp("flow_engaged_ts"), | |
| "platform": vstring('platform', false), | |
| "channel": vstring('channel', false), | |
| "version": vstring('version', false), | |
| "locale": vstring('locale', false), | |
| "build_id": vstring('build_id', false), | |
| "partner_id": vstring('partner_id', false), | |
| "profile_age": vNumber('profile_age'), | |
| "profile_usage": vJsonableObject("profile_usage"), | |
| "addons": vJsonableObject("addons"), | |
| "extra": vJsonableObject("extra"), | |
| "is_test": vboolean('is_test') | |
| }; | |
| return apiUtils.validateOptions(packet, rules); | |
| }; | |
| //# sourceMappingURL=<compileOutput> | |
| /***/ }, | |
| /* 12 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| module.exports = __webpack_require__(16); | |
| /***/ }, | |
| /* 13 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| module.exports = function(module) { | |
| if(!module.webpackPolyfill) { | |
| module.deprecate = function() {}; | |
| module.paths = []; | |
| // module.parent = undefined by default | |
| module.children = []; | |
| module.webpackPolyfill = 1; | |
| } | |
| return module; | |
| } | |
| /***/ }, | |
| /* 14 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /* This Source Code Form is subject to the terms of the Mozilla Public | |
| * License, v. 2.0. If a copy of the MPL was not distributed with this | |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| // create namespace | |
| if (typeof Mozilla == 'undefined') { | |
| var Mozilla = {}; | |
| } | |
| ;(function($) { | |
| 'use strict'; | |
| // create namespace | |
| if (typeof Mozilla.UITour == 'undefined') { | |
| Mozilla.UITour = {}; | |
| } | |
| var themeIntervalId = null; | |
| function _stopCyclingThemes() { | |
| if (themeIntervalId) { | |
| clearInterval(themeIntervalId); | |
| themeIntervalId = null; | |
| } | |
| } | |
| function _sendEvent(action, data) { | |
| var event = new CustomEvent('mozUITour', { | |
| bubbles: true, | |
| detail: { | |
| action: action, | |
| data: data || {} | |
| } | |
| }); | |
| document.dispatchEvent(event); | |
| } | |
| function _generateCallbackID() { | |
| return Math.random().toString(36).replace(/[^a-z]+/g, ''); | |
| } | |
| function _waitForCallback(callback) { | |
| var id = _generateCallbackID(); | |
| function listener(event) { | |
| if (typeof event.detail != 'object') | |
| return; | |
| if (event.detail.callbackID != id) | |
| return; | |
| document.removeEventListener('mozUITourResponse', listener); | |
| callback(event.detail.data); | |
| } | |
| document.addEventListener('mozUITourResponse', listener); | |
| return id; | |
| } | |
| var notificationListener = null; | |
| function _notificationListener(event) { | |
| if (typeof event.detail != 'object') | |
| return; | |
| if (typeof notificationListener != 'function') | |
| return; | |
| notificationListener(event.detail.event, event.detail.params); | |
| } | |
| Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY = 10 * 1000; | |
| Mozilla.UITour.CONFIGNAME_SYNC = 'sync'; | |
| Mozilla.UITour.CONFIGNAME_AVAILABLETARGETS = 'availableTargets'; | |
| Mozilla.UITour.ping = function(callback) { | |
| var data = {}; | |
| if (callback) { | |
| data.callbackID = _waitForCallback(callback); | |
| } | |
| _sendEvent('ping', data); | |
| }; | |
| Mozilla.UITour.observe = function(listener, callback) { | |
| notificationListener = listener; | |
| if (listener) { | |
| document.addEventListener('mozUITourNotification', | |
| _notificationListener); | |
| Mozilla.UITour.ping(callback); | |
| } else { | |
| document.removeEventListener('mozUITourNotification', | |
| _notificationListener); | |
| } | |
| }; | |
| Mozilla.UITour.registerPageID = function(pageID) { | |
| _sendEvent('registerPageID', { | |
| pageID: pageID | |
| }); | |
| }; | |
| Mozilla.UITour.showHeartbeat = function(message, thankyouMessage, flowId, engagementURL) { | |
| _sendEvent('showHeartbeat', { | |
| message: message, | |
| thankyouMessage: thankyouMessage, | |
| flowId: flowId, | |
| engagementURL: engagementURL | |
| }); | |
| }; | |
| Mozilla.UITour.showHighlight = function(target, effect) { | |
| _sendEvent('showHighlight', { | |
| target: target, | |
| effect: effect | |
| }); | |
| }; | |
| Mozilla.UITour.hideHighlight = function() { | |
| _sendEvent('hideHighlight'); | |
| }; | |
| Mozilla.UITour.showInfo = function(target, title, text, icon, buttons, options) { | |
| var buttonData = []; | |
| if (Array.isArray(buttons)) { | |
| for (var i = 0; i < buttons.length; i++) { | |
| buttonData.push({ | |
| label: buttons[i].label, | |
| icon: buttons[i].icon, | |
| style: buttons[i].style, | |
| callbackID: _waitForCallback(buttons[i].callback) | |
| }); | |
| } | |
| } | |
| var closeButtonCallbackID, targetCallbackID; | |
| if (options && options.closeButtonCallback) | |
| closeButtonCallbackID = _waitForCallback(options.closeButtonCallback); | |
| if (options && options.targetCallback) | |
| targetCallbackID = _waitForCallback(options.targetCallback); | |
| _sendEvent('showInfo', { | |
| target: target, | |
| title: title, | |
| text: text, | |
| icon: icon, | |
| buttons: buttonData, | |
| closeButtonCallbackID: closeButtonCallbackID, | |
| targetCallbackID: targetCallbackID | |
| }); | |
| }; | |
| Mozilla.UITour.hideInfo = function() { | |
| _sendEvent('hideInfo'); | |
| }; | |
| Mozilla.UITour.previewTheme = function(theme) { | |
| _stopCyclingThemes(); | |
| _sendEvent('previewTheme', { | |
| theme: JSON.stringify(theme) | |
| }); | |
| }; | |
| Mozilla.UITour.resetTheme = function() { | |
| _stopCyclingThemes(); | |
| _sendEvent('resetTheme'); | |
| }; | |
| Mozilla.UITour.cycleThemes = function(themes, delay, callback) { | |
| _stopCyclingThemes(); | |
| if (!delay) { | |
| delay = Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY; | |
| } | |
| function nextTheme() { | |
| var theme = themes.shift(); | |
| themes.push(theme); | |
| _sendEvent('previewTheme', { | |
| theme: JSON.stringify(theme), | |
| state: true | |
| }); | |
| callback(theme); | |
| } | |
| themeIntervalId = setInterval(nextTheme, delay); | |
| nextTheme(); | |
| }; | |
| Mozilla.UITour.showMenu = function(name, callback) { | |
| var showCallbackID; | |
| if (callback) | |
| showCallbackID = _waitForCallback(callback); | |
| _sendEvent('showMenu', { | |
| name: name, | |
| showCallbackID: showCallbackID, | |
| }); | |
| }; | |
| Mozilla.UITour.hideMenu = function(name) { | |
| _sendEvent('hideMenu', { | |
| name: name | |
| }); | |
| }; | |
| Mozilla.UITour.startUrlbarCapture = function(text, url) { | |
| _sendEvent('startUrlbarCapture', { | |
| text: text, | |
| url: url | |
| }); | |
| }; | |
| Mozilla.UITour.endUrlbarCapture = function() { | |
| _sendEvent('endUrlbarCapture'); | |
| }; | |
| Mozilla.UITour.getConfiguration = function(configName, callback) { | |
| _sendEvent('getConfiguration', { | |
| callbackID: _waitForCallback(callback), | |
| configuration: configName, | |
| }); | |
| }; | |
| Mozilla.UITour.setConfiguration = function(configName, configValue) { | |
| _sendEvent('setConfiguration', { | |
| configuration: configName, | |
| value: configValue, | |
| }); | |
| }; | |
| Mozilla.UITour.showFirefoxAccounts = function() { | |
| _sendEvent('showFirefoxAccounts'); | |
| }; | |
| Mozilla.UITour.resetFirefox = function() { | |
| _sendEvent('resetFirefox'); | |
| }; | |
| Mozilla.UITour.addNavBarWidget= function(name, callback) { | |
| _sendEvent('addNavBarWidget', { | |
| name: name, | |
| callbackID: _waitForCallback(callback), | |
| }); | |
| }; | |
| Mozilla.UITour.setDefaultSearchEngine = function(identifier) { | |
| _sendEvent('setDefaultSearchEngine', { | |
| identifier: identifier, | |
| }); | |
| }; | |
| Mozilla.UITour.setTreatmentTag = function(name, value) { | |
| _sendEvent('setTreatmentTag', { | |
| name: name, | |
| value: value | |
| }); | |
| }; | |
| Mozilla.UITour.getTreatmentTag = function(name, callback) { | |
| _sendEvent('getTreatmentTag', { | |
| name: name, | |
| callbackID: _waitForCallback(callback) | |
| }); | |
| }; | |
| Mozilla.UITour.setSearchTerm = function(term) { | |
| _sendEvent('setSearchTerm', { | |
| term: term | |
| }); | |
| }; | |
| Mozilla.UITour.openSearchPanel = function(callback) { | |
| _sendEvent('openSearchPanel', { | |
| callbackID: _waitForCallback(callback) | |
| }); | |
| }; | |
| })(); | |
| // Make this library Require-able. | |
| if (typeof module !== 'undefined' && module.exports) { | |
| module.exports = Mozilla.UITour; | |
| } | |
| /***/ }, | |
| /* 15 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /* WEBPACK VAR INJECTION */(function(module) {"use strict"; | |
| "use strict"; | |
| module.metadata = {"stability": "deprecated"}; | |
| var union = __webpack_require__(17).union; | |
| var isNil = __webpack_require__(8).isNil; | |
| function merge(source) { | |
| var descriptor = {}; | |
| Array.slice(arguments, 1).filter(Boolean).forEach(function onEach(properties) { | |
| Object.getOwnPropertyNames(properties).forEach(function(name) { | |
| descriptor[name] = Object.getOwnPropertyDescriptor(properties, name); | |
| }); | |
| }); | |
| return Object.defineProperties(source, descriptor); | |
| } | |
| exports.merge = merge; | |
| var VALID_TYPES = ["array", "boolean", "function", "null", "number", "object", "string", "undefined"]; | |
| var isArray = Array.isArray; | |
| exports.validateOptions = function validateOptions(options, requirements) { | |
| options = options || {}; | |
| var validatedOptions = {}; | |
| var $__0 = function(key) { | |
| var isOptional = false; | |
| var mapThrew = false; | |
| var req = requirements[key]; | |
| var __okv = (key in options) ? [options[key], true] : [undefined, false]; | |
| var optsVal = __okv[0]; | |
| var keyInOpts = __okv[1]; | |
| if (req.map) { | |
| try { | |
| optsVal = req.map(optsVal); | |
| } catch (err) { | |
| if (err instanceof RequirementError) | |
| throw err; | |
| mapThrew = true; | |
| } | |
| } | |
| if (req.is) { | |
| var types = req.is; | |
| if (!isArray(types) && isArray(types.is)) | |
| types = types.is; | |
| if (isArray(types)) { | |
| isOptional = ['undefined', 'null'].every(function(v) { | |
| return ~types.indexOf(v); | |
| }); | |
| types.forEach(function(typ) { | |
| if (VALID_TYPES.indexOf(typ) < 0) { | |
| var msg = 'Internal error: invalid requirement type "' + typ + '".'; | |
| throw new Error(msg); | |
| } | |
| }); | |
| if (types.indexOf(getTypeOf(optsVal)) < 0) | |
| throw new RequirementError(key, req); | |
| } | |
| } | |
| if (req.ok && ((!isOptional || !isNil(optsVal)) && !req.ok(optsVal))) | |
| throw new RequirementError(key, req); | |
| if (keyInOpts || (req.map && !mapThrew && optsVal !== undefined)) | |
| validatedOptions[key] = optsVal; | |
| }; | |
| for (var key in requirements) { | |
| $__0(key); | |
| } | |
| return validatedOptions; | |
| }; | |
| var getTypeOf = exports.getTypeOf = function getTypeOf(val) { | |
| var typ = typeof(val); | |
| if (typ === "object") { | |
| if (!val) | |
| return "null"; | |
| if (isArray(val)) | |
| return "array"; | |
| } | |
| return typ; | |
| }; | |
| function RequirementError(key, requirement) { | |
| Error.call(this); | |
| this.name = "RequirementError"; | |
| var msg = requirement.msg; | |
| if (!msg) { | |
| msg = 'The option "' + key + '" '; | |
| msg += requirement.is ? "must be one of the following types: " + requirement.is.join(", ") : "is invalid."; | |
| } | |
| this.message = msg; | |
| } | |
| RequirementError.prototype = Object.create(Error.prototype); | |
| var string = {is: ['string', 'undefined', 'null']}; | |
| exports.string = string; | |
| var number = {is: ['number', 'undefined', 'null']}; | |
| exports.number = number; | |
| var boolean = {is: ['boolean', 'undefined', 'null']}; | |
| exports.boolean = boolean; | |
| var object = {is: ['object', 'undefined', 'null']}; | |
| exports.object = object; | |
| var isTruthyType = function(type) { | |
| return !(type === 'undefined' || type === 'null'); | |
| }; | |
| var findTypes = function(v) { | |
| while (!isArray(v) && v.is) | |
| v = v.is; | |
| return v; | |
| }; | |
| function required(req) { | |
| var types = (findTypes(req) || VALID_TYPES).filter(isTruthyType); | |
| return merge({}, req, {is: types}); | |
| } | |
| exports.required = required; | |
| function optional(req) { | |
| req = merge({is: []}, req); | |
| req.is = findTypes(req).filter(isTruthyType).concat('undefined', 'null'); | |
| return req; | |
| } | |
| exports.optional = optional; | |
| //# sourceMappingURL=<compileOutput> | |
| /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13)(module))) | |
| /***/ }, | |
| /* 16 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * chai | |
| * Copyright(c) 2011-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| var used = [] | |
| , exports = module.exports = {}; | |
| /*! | |
| * Chai version | |
| */ | |
| exports.version = '1.10.0'; | |
| /*! | |
| * Assertion Error | |
| */ | |
| exports.AssertionError = __webpack_require__(25); | |
| /*! | |
| * Utils for plugins (not exported) | |
| */ | |
| var util = __webpack_require__(24); | |
| /** | |
| * # .use(function) | |
| * | |
| * Provides a way to extend the internals of Chai | |
| * | |
| * @param {Function} | |
| * @returns {this} for chaining | |
| * @api public | |
| */ | |
| exports.use = function (fn) { | |
| if (!~used.indexOf(fn)) { | |
| fn(this, util); | |
| used.push(fn); | |
| } | |
| return this; | |
| }; | |
| /*! | |
| * Configuration | |
| */ | |
| var config = __webpack_require__(18); | |
| exports.config = config; | |
| /*! | |
| * Primary `Assertion` prototype | |
| */ | |
| var assertion = __webpack_require__(19); | |
| exports.use(assertion); | |
| /*! | |
| * Core Assertions | |
| */ | |
| var core = __webpack_require__(20); | |
| exports.use(core); | |
| /*! | |
| * Expect interface | |
| */ | |
| var expect = __webpack_require__(21); | |
| exports.use(expect); | |
| /*! | |
| * Should interface | |
| */ | |
| var should = __webpack_require__(22); | |
| exports.use(should); | |
| /*! | |
| * Assert interface | |
| */ | |
| var assert = __webpack_require__(23); | |
| exports.use(assert); | |
| /***/ }, | |
| /* 17 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /* WEBPACK VAR INJECTION */(function(module) {"use strict"; | |
| "use strict"; | |
| module.metadata = {"stability": "experimental"}; | |
| var has = exports.has = function has(array, element) { | |
| return !!~array.indexOf(element); | |
| }; | |
| var hasAny = exports.hasAny = function hasAny(array, elements) { | |
| if (arguments.length < 2) | |
| return false; | |
| if (!Array.isArray(elements)) | |
| elements = [elements]; | |
| return array.some(function(element) { | |
| return has(elements, element); | |
| }); | |
| }; | |
| var add = exports.add = function add(array, element) { | |
| var result; | |
| if ((result = !has(array, element))) | |
| array.push(element); | |
| return result; | |
| }; | |
| exports.remove = function remove(array, element) { | |
| var result; | |
| if ((result = has(array, element))) | |
| array.splice(array.indexOf(element), 1); | |
| return result; | |
| }; | |
| function unique(array) { | |
| return array.reduce(function(result, item) { | |
| add(result, item); | |
| return result; | |
| }, []); | |
| } | |
| ; | |
| exports.unique = unique; | |
| function union() { | |
| return unique(Array.concat.apply(null, arguments)); | |
| } | |
| ; | |
| exports.union = union; | |
| exports.flatten = function flatten(array) { | |
| var flat = []; | |
| for (var i = 0, | |
| l = array.length; i < l; i++) { | |
| flat = flat.concat(Array.isArray(array[i]) ? flatten(array[i]) : array[i]); | |
| } | |
| return flat; | |
| }; | |
| function find(array, predicate, fallback) { | |
| var index = 0; | |
| var count = array.length; | |
| while (index < count) { | |
| var value = array[index]; | |
| if (predicate(value)) | |
| return value; | |
| else | |
| index = index + 1; | |
| } | |
| return fallback; | |
| } | |
| exports.find = find; | |
| //# sourceMappingURL=<compileOutput> | |
| /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13)(module))) | |
| /***/ }, | |
| /* 18 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| module.exports = { | |
| /** | |
| * ### config.includeStack | |
| * | |
| * User configurable property, influences whether stack trace | |
| * is included in Assertion error message. Default of false | |
| * suppresses stack trace in the error message. | |
| * | |
| * chai.config.includeStack = true; // enable stack on error | |
| * | |
| * @param {Boolean} | |
| * @api public | |
| */ | |
| includeStack: false, | |
| /** | |
| * ### config.showDiff | |
| * | |
| * User configurable property, influences whether or not | |
| * the `showDiff` flag should be included in the thrown | |
| * AssertionErrors. `false` will always be `false`; `true` | |
| * will be true when the assertion has requested a diff | |
| * be shown. | |
| * | |
| * @param {Boolean} | |
| * @api public | |
| */ | |
| showDiff: true, | |
| /** | |
| * ### config.truncateThreshold | |
| * | |
| * User configurable property, sets length threshold for actual and | |
| * expected values in assertion errors. If this threshold is exceeded, | |
| * the value is truncated. | |
| * | |
| * Set it to zero if you want to disable truncating altogether. | |
| * | |
| * chai.config.truncateThreshold = 0; // disable truncating | |
| * | |
| * @param {Number} | |
| * @api public | |
| */ | |
| truncateThreshold: 40 | |
| }; | |
| /***/ }, | |
| /* 19 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * chai | |
| * http://chaijs.com | |
| * Copyright(c) 2011-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| var config = __webpack_require__(18); | |
| var NOOP = function() { }; | |
| module.exports = function (_chai, util) { | |
| /*! | |
| * Module dependencies. | |
| */ | |
| var AssertionError = _chai.AssertionError | |
| , flag = util.flag; | |
| /*! | |
| * Module export. | |
| */ | |
| _chai.Assertion = Assertion; | |
| /*! | |
| * Assertion Constructor | |
| * | |
| * Creates object for chaining. | |
| * | |
| * @api private | |
| */ | |
| function Assertion (obj, msg, stack) { | |
| flag(this, 'ssfi', stack || arguments.callee); | |
| flag(this, 'object', obj); | |
| flag(this, 'message', msg); | |
| } | |
| Object.defineProperty(Assertion, 'includeStack', { | |
| get: function() { | |
| console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); | |
| return config.includeStack; | |
| }, | |
| set: function(value) { | |
| console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); | |
| config.includeStack = value; | |
| } | |
| }); | |
| Object.defineProperty(Assertion, 'showDiff', { | |
| get: function() { | |
| console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); | |
| return config.showDiff; | |
| }, | |
| set: function(value) { | |
| console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); | |
| config.showDiff = value; | |
| } | |
| }); | |
| Assertion.addProperty = function (name, fn) { | |
| util.addProperty(this.prototype, name, fn); | |
| }; | |
| Assertion.addMethod = function (name, fn) { | |
| util.addMethod(this.prototype, name, fn); | |
| }; | |
| Assertion.addChainableMethod = function (name, fn, chainingBehavior) { | |
| util.addChainableMethod(this.prototype, name, fn, chainingBehavior); | |
| }; | |
| Assertion.addChainableNoop = function(name, fn) { | |
| util.addChainableMethod(this.prototype, name, NOOP, fn); | |
| }; | |
| Assertion.overwriteProperty = function (name, fn) { | |
| util.overwriteProperty(this.prototype, name, fn); | |
| }; | |
| Assertion.overwriteMethod = function (name, fn) { | |
| util.overwriteMethod(this.prototype, name, fn); | |
| }; | |
| Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) { | |
| util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior); | |
| }; | |
| /*! | |
| * ### .assert(expression, message, negateMessage, expected, actual) | |
| * | |
| * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. | |
| * | |
| * @name assert | |
| * @param {Philosophical} expression to be tested | |
| * @param {String or Function} message or function that returns message to display if fails | |
| * @param {String or Function} negatedMessage or function that returns negatedMessage to display if negated expression fails | |
| * @param {Mixed} expected value (remember to check for negation) | |
| * @param {Mixed} actual (optional) will default to `this.obj` | |
| * @api private | |
| */ | |
| Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) { | |
| var ok = util.test(this, arguments); | |
| if (true !== showDiff) showDiff = false; | |
| if (true !== config.showDiff) showDiff = false; | |
| if (!ok) { | |
| var msg = util.getMessage(this, arguments) | |
| , actual = util.getActual(this, arguments); | |
| throw new AssertionError(msg, { | |
| actual: actual | |
| , expected: expected | |
| , showDiff: showDiff | |
| }, (config.includeStack) ? this.assert : flag(this, 'ssfi')); | |
| } | |
| }; | |
| /*! | |
| * ### ._obj | |
| * | |
| * Quick reference to stored `actual` value for plugin developers. | |
| * | |
| * @api private | |
| */ | |
| Object.defineProperty(Assertion.prototype, '_obj', | |
| { get: function () { | |
| return flag(this, 'object'); | |
| } | |
| , set: function (val) { | |
| flag(this, 'object', val); | |
| } | |
| }); | |
| }; | |
| /***/ }, | |
| /* 20 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * chai | |
| * http://chaijs.com | |
| * Copyright(c) 2011-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| module.exports = function (chai, _) { | |
| var Assertion = chai.Assertion | |
| , toString = Object.prototype.toString | |
| , flag = _.flag; | |
| /** | |
| * ### Language Chains | |
| * | |
| * The following are provided as chainable getters to | |
| * improve the readability of your assertions. They | |
| * do not provide testing capabilities unless they | |
| * have been overwritten by a plugin. | |
| * | |
| * **Chains** | |
| * | |
| * - to | |
| * - be | |
| * - been | |
| * - is | |
| * - that | |
| * - and | |
| * - has | |
| * - have | |
| * - with | |
| * - at | |
| * - of | |
| * - same | |
| * | |
| * @name language chains | |
| * @api public | |
| */ | |
| [ 'to', 'be', 'been' | |
| , 'is', 'and', 'has', 'have' | |
| , 'with', 'that', 'at' | |
| , 'of', 'same' ].forEach(function (chain) { | |
| Assertion.addProperty(chain, function () { | |
| return this; | |
| }); | |
| }); | |
| /** | |
| * ### .not | |
| * | |
| * Negates any of assertions following in the chain. | |
| * | |
| * expect(foo).to.not.equal('bar'); | |
| * expect(goodFn).to.not.throw(Error); | |
| * expect({ foo: 'baz' }).to.have.property('foo') | |
| * .and.not.equal('bar'); | |
| * | |
| * @name not | |
| * @api public | |
| */ | |
| Assertion.addProperty('not', function () { | |
| flag(this, 'negate', true); | |
| }); | |
| /** | |
| * ### .deep | |
| * | |
| * Sets the `deep` flag, later used by the `equal` and | |
| * `property` assertions. | |
| * | |
| * expect(foo).to.deep.equal({ bar: 'baz' }); | |
| * expect({ foo: { bar: { baz: 'quux' } } }) | |
| * .to.have.deep.property('foo.bar.baz', 'quux'); | |
| * | |
| * @name deep | |
| * @api public | |
| */ | |
| Assertion.addProperty('deep', function () { | |
| flag(this, 'deep', true); | |
| }); | |
| /** | |
| * ### .a(type) | |
| * | |
| * The `a` and `an` assertions are aliases that can be | |
| * used either as language chains or to assert a value's | |
| * type. | |
| * | |
| * // typeof | |
| * expect('test').to.be.a('string'); | |
| * expect({ foo: 'bar' }).to.be.an('object'); | |
| * expect(null).to.be.a('null'); | |
| * expect(undefined).to.be.an('undefined'); | |
| * | |
| * // language chain | |
| * expect(foo).to.be.an.instanceof(Foo); | |
| * | |
| * @name a | |
| * @alias an | |
| * @param {String} type | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function an (type, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| type = type.toLowerCase(); | |
| var obj = flag(this, 'object') | |
| , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a '; | |
| this.assert( | |
| type === _.type(obj) | |
| , 'expected #{this} to be ' + article + type | |
| , 'expected #{this} not to be ' + article + type | |
| ); | |
| } | |
| Assertion.addChainableMethod('an', an); | |
| Assertion.addChainableMethod('a', an); | |
| /** | |
| * ### .include(value) | |
| * | |
| * The `include` and `contain` assertions can be used as either property | |
| * based language chains or as methods to assert the inclusion of an object | |
| * in an array or a substring in a string. When used as language chains, | |
| * they toggle the `contain` flag for the `keys` assertion. | |
| * | |
| * expect([1,2,3]).to.include(2); | |
| * expect('foobar').to.contain('foo'); | |
| * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo'); | |
| * | |
| * @name include | |
| * @alias contain | |
| * @param {Object|String|Number} obj | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function includeChainingBehavior () { | |
| flag(this, 'contains', true); | |
| } | |
| function include (val, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| var expected = false; | |
| if (_.type(obj) === 'array' && _.type(val) === 'object') { | |
| for (var i in obj) { | |
| if (_.eql(obj[i], val)) { | |
| expected = true; | |
| break; | |
| } | |
| } | |
| } else if (_.type(val) === 'object') { | |
| if (!flag(this, 'negate')) { | |
| for (var k in val) new Assertion(obj).property(k, val[k]); | |
| return; | |
| } | |
| var subset = {} | |
| for (var k in val) subset[k] = obj[k] | |
| expected = _.eql(subset, val); | |
| } else { | |
| expected = obj && ~obj.indexOf(val) | |
| } | |
| this.assert( | |
| expected | |
| , 'expected #{this} to include ' + _.inspect(val) | |
| , 'expected #{this} to not include ' + _.inspect(val)); | |
| } | |
| Assertion.addChainableMethod('include', include, includeChainingBehavior); | |
| Assertion.addChainableMethod('contain', include, includeChainingBehavior); | |
| /** | |
| * ### .ok | |
| * | |
| * Asserts that the target is truthy. | |
| * | |
| * expect('everthing').to.be.ok; | |
| * expect(1).to.be.ok; | |
| * expect(false).to.not.be.ok; | |
| * expect(undefined).to.not.be.ok; | |
| * expect(null).to.not.be.ok; | |
| * | |
| * Can also be used as a function, which prevents some linter errors. | |
| * | |
| * expect('everthing').to.be.ok(); | |
| * | |
| * @name ok | |
| * @api public | |
| */ | |
| Assertion.addChainableNoop('ok', function () { | |
| this.assert( | |
| flag(this, 'object') | |
| , 'expected #{this} to be truthy' | |
| , 'expected #{this} to be falsy'); | |
| }); | |
| /** | |
| * ### .true | |
| * | |
| * Asserts that the target is `true`. | |
| * | |
| * expect(true).to.be.true; | |
| * expect(1).to.not.be.true; | |
| * | |
| * Can also be used as a function, which prevents some linter errors. | |
| * | |
| * expect(true).to.be.true(); | |
| * | |
| * @name true | |
| * @api public | |
| */ | |
| Assertion.addChainableNoop('true', function () { | |
| this.assert( | |
| true === flag(this, 'object') | |
| , 'expected #{this} to be true' | |
| , 'expected #{this} to be false' | |
| , this.negate ? false : true | |
| ); | |
| }); | |
| /** | |
| * ### .false | |
| * | |
| * Asserts that the target is `false`. | |
| * | |
| * expect(false).to.be.false; | |
| * expect(0).to.not.be.false; | |
| * | |
| * Can also be used as a function, which prevents some linter errors. | |
| * | |
| * expect(false).to.be.false(); | |
| * | |
| * @name false | |
| * @api public | |
| */ | |
| Assertion.addChainableNoop('false', function () { | |
| this.assert( | |
| false === flag(this, 'object') | |
| , 'expected #{this} to be false' | |
| , 'expected #{this} to be true' | |
| , this.negate ? true : false | |
| ); | |
| }); | |
| /** | |
| * ### .null | |
| * | |
| * Asserts that the target is `null`. | |
| * | |
| * expect(null).to.be.null; | |
| * expect(undefined).not.to.be.null; | |
| * | |
| * Can also be used as a function, which prevents some linter errors. | |
| * | |
| * expect(null).to.be.null(); | |
| * | |
| * @name null | |
| * @api public | |
| */ | |
| Assertion.addChainableNoop('null', function () { | |
| this.assert( | |
| null === flag(this, 'object') | |
| , 'expected #{this} to be null' | |
| , 'expected #{this} not to be null' | |
| ); | |
| }); | |
| /** | |
| * ### .undefined | |
| * | |
| * Asserts that the target is `undefined`. | |
| * | |
| * expect(undefined).to.be.undefined; | |
| * expect(null).to.not.be.undefined; | |
| * | |
| * Can also be used as a function, which prevents some linter errors. | |
| * | |
| * expect(undefined).to.be.undefined(); | |
| * | |
| * @name undefined | |
| * @api public | |
| */ | |
| Assertion.addChainableNoop('undefined', function () { | |
| this.assert( | |
| undefined === flag(this, 'object') | |
| , 'expected #{this} to be undefined' | |
| , 'expected #{this} not to be undefined' | |
| ); | |
| }); | |
| /** | |
| * ### .exist | |
| * | |
| * Asserts that the target is neither `null` nor `undefined`. | |
| * | |
| * var foo = 'hi' | |
| * , bar = null | |
| * , baz; | |
| * | |
| * expect(foo).to.exist; | |
| * expect(bar).to.not.exist; | |
| * expect(baz).to.not.exist; | |
| * | |
| * Can also be used as a function, which prevents some linter errors. | |
| * | |
| * expect(foo).to.exist(); | |
| * | |
| * @name exist | |
| * @api public | |
| */ | |
| Assertion.addChainableNoop('exist', function () { | |
| this.assert( | |
| null != flag(this, 'object') | |
| , 'expected #{this} to exist' | |
| , 'expected #{this} to not exist' | |
| ); | |
| }); | |
| /** | |
| * ### .empty | |
| * | |
| * Asserts that the target's length is `0`. For arrays, it checks | |
| * the `length` property. For objects, it gets the count of | |
| * enumerable keys. | |
| * | |
| * expect([]).to.be.empty; | |
| * expect('').to.be.empty; | |
| * expect({}).to.be.empty; | |
| * | |
| * Can also be used as a function, which prevents some linter errors. | |
| * | |
| * expect([]).to.be.empty(); | |
| * | |
| * @name empty | |
| * @api public | |
| */ | |
| Assertion.addChainableNoop('empty', function () { | |
| var obj = flag(this, 'object') | |
| , expected = obj; | |
| if (Array.isArray(obj) || 'string' === typeof object) { | |
| expected = obj.length; | |
| } else if (typeof obj === 'object') { | |
| expected = Object.keys(obj).length; | |
| } | |
| this.assert( | |
| !expected | |
| , 'expected #{this} to be empty' | |
| , 'expected #{this} not to be empty' | |
| ); | |
| }); | |
| /** | |
| * ### .arguments | |
| * | |
| * Asserts that the target is an arguments object. | |
| * | |
| * function test () { | |
| * expect(arguments).to.be.arguments; | |
| * } | |
| * | |
| * Can also be used as a function, which prevents some linter errors. | |
| * | |
| * function test () { | |
| * expect(arguments).to.be.arguments(); | |
| * } | |
| * | |
| * @name arguments | |
| * @alias Arguments | |
| * @api public | |
| */ | |
| function checkArguments () { | |
| var obj = flag(this, 'object') | |
| , type = Object.prototype.toString.call(obj); | |
| this.assert( | |
| '[object Arguments]' === type | |
| , 'expected #{this} to be arguments but got ' + type | |
| , 'expected #{this} to not be arguments' | |
| ); | |
| } | |
| Assertion.addChainableNoop('arguments', checkArguments); | |
| Assertion.addChainableNoop('Arguments', checkArguments); | |
| /** | |
| * ### .equal(value) | |
| * | |
| * Asserts that the target is strictly equal (`===`) to `value`. | |
| * Alternately, if the `deep` flag is set, asserts that | |
| * the target is deeply equal to `value`. | |
| * | |
| * expect('hello').to.equal('hello'); | |
| * expect(42).to.equal(42); | |
| * expect(1).to.not.equal(true); | |
| * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' }); | |
| * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' }); | |
| * | |
| * @name equal | |
| * @alias equals | |
| * @alias eq | |
| * @alias deep.equal | |
| * @param {Mixed} value | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function assertEqual (val, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| if (flag(this, 'deep')) { | |
| return this.eql(val); | |
| } else { | |
| this.assert( | |
| val === obj | |
| , 'expected #{this} to equal #{exp}' | |
| , 'expected #{this} to not equal #{exp}' | |
| , val | |
| , this._obj | |
| , true | |
| ); | |
| } | |
| } | |
| Assertion.addMethod('equal', assertEqual); | |
| Assertion.addMethod('equals', assertEqual); | |
| Assertion.addMethod('eq', assertEqual); | |
| /** | |
| * ### .eql(value) | |
| * | |
| * Asserts that the target is deeply equal to `value`. | |
| * | |
| * expect({ foo: 'bar' }).to.eql({ foo: 'bar' }); | |
| * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]); | |
| * | |
| * @name eql | |
| * @alias eqls | |
| * @param {Mixed} value | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function assertEql(obj, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| this.assert( | |
| _.eql(obj, flag(this, 'object')) | |
| , 'expected #{this} to deeply equal #{exp}' | |
| , 'expected #{this} to not deeply equal #{exp}' | |
| , obj | |
| , this._obj | |
| , true | |
| ); | |
| } | |
| Assertion.addMethod('eql', assertEql); | |
| Assertion.addMethod('eqls', assertEql); | |
| /** | |
| * ### .above(value) | |
| * | |
| * Asserts that the target is greater than `value`. | |
| * | |
| * expect(10).to.be.above(5); | |
| * | |
| * Can also be used in conjunction with `length` to | |
| * assert a minimum length. The benefit being a | |
| * more informative error message than if the length | |
| * was supplied directly. | |
| * | |
| * expect('foo').to.have.length.above(2); | |
| * expect([ 1, 2, 3 ]).to.have.length.above(2); | |
| * | |
| * @name above | |
| * @alias gt | |
| * @alias greaterThan | |
| * @param {Number} value | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function assertAbove (n, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| if (flag(this, 'doLength')) { | |
| new Assertion(obj, msg).to.have.property('length'); | |
| var len = obj.length; | |
| this.assert( | |
| len > n | |
| , 'expected #{this} to have a length above #{exp} but got #{act}' | |
| , 'expected #{this} to not have a length above #{exp}' | |
| , n | |
| , len | |
| ); | |
| } else { | |
| this.assert( | |
| obj > n | |
| , 'expected #{this} to be above ' + n | |
| , 'expected #{this} to be at most ' + n | |
| ); | |
| } | |
| } | |
| Assertion.addMethod('above', assertAbove); | |
| Assertion.addMethod('gt', assertAbove); | |
| Assertion.addMethod('greaterThan', assertAbove); | |
| /** | |
| * ### .least(value) | |
| * | |
| * Asserts that the target is greater than or equal to `value`. | |
| * | |
| * expect(10).to.be.at.least(10); | |
| * | |
| * Can also be used in conjunction with `length` to | |
| * assert a minimum length. The benefit being a | |
| * more informative error message than if the length | |
| * was supplied directly. | |
| * | |
| * expect('foo').to.have.length.of.at.least(2); | |
| * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3); | |
| * | |
| * @name least | |
| * @alias gte | |
| * @param {Number} value | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function assertLeast (n, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| if (flag(this, 'doLength')) { | |
| new Assertion(obj, msg).to.have.property('length'); | |
| var len = obj.length; | |
| this.assert( | |
| len >= n | |
| , 'expected #{this} to have a length at least #{exp} but got #{act}' | |
| , 'expected #{this} to have a length below #{exp}' | |
| , n | |
| , len | |
| ); | |
| } else { | |
| this.assert( | |
| obj >= n | |
| , 'expected #{this} to be at least ' + n | |
| , 'expected #{this} to be below ' + n | |
| ); | |
| } | |
| } | |
| Assertion.addMethod('least', assertLeast); | |
| Assertion.addMethod('gte', assertLeast); | |
| /** | |
| * ### .below(value) | |
| * | |
| * Asserts that the target is less than `value`. | |
| * | |
| * expect(5).to.be.below(10); | |
| * | |
| * Can also be used in conjunction with `length` to | |
| * assert a maximum length. The benefit being a | |
| * more informative error message than if the length | |
| * was supplied directly. | |
| * | |
| * expect('foo').to.have.length.below(4); | |
| * expect([ 1, 2, 3 ]).to.have.length.below(4); | |
| * | |
| * @name below | |
| * @alias lt | |
| * @alias lessThan | |
| * @param {Number} value | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function assertBelow (n, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| if (flag(this, 'doLength')) { | |
| new Assertion(obj, msg).to.have.property('length'); | |
| var len = obj.length; | |
| this.assert( | |
| len < n | |
| , 'expected #{this} to have a length below #{exp} but got #{act}' | |
| , 'expected #{this} to not have a length below #{exp}' | |
| , n | |
| , len | |
| ); | |
| } else { | |
| this.assert( | |
| obj < n | |
| , 'expected #{this} to be below ' + n | |
| , 'expected #{this} to be at least ' + n | |
| ); | |
| } | |
| } | |
| Assertion.addMethod('below', assertBelow); | |
| Assertion.addMethod('lt', assertBelow); | |
| Assertion.addMethod('lessThan', assertBelow); | |
| /** | |
| * ### .most(value) | |
| * | |
| * Asserts that the target is less than or equal to `value`. | |
| * | |
| * expect(5).to.be.at.most(5); | |
| * | |
| * Can also be used in conjunction with `length` to | |
| * assert a maximum length. The benefit being a | |
| * more informative error message than if the length | |
| * was supplied directly. | |
| * | |
| * expect('foo').to.have.length.of.at.most(4); | |
| * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3); | |
| * | |
| * @name most | |
| * @alias lte | |
| * @param {Number} value | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function assertMost (n, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| if (flag(this, 'doLength')) { | |
| new Assertion(obj, msg).to.have.property('length'); | |
| var len = obj.length; | |
| this.assert( | |
| len <= n | |
| , 'expected #{this} to have a length at most #{exp} but got #{act}' | |
| , 'expected #{this} to have a length above #{exp}' | |
| , n | |
| , len | |
| ); | |
| } else { | |
| this.assert( | |
| obj <= n | |
| , 'expected #{this} to be at most ' + n | |
| , 'expected #{this} to be above ' + n | |
| ); | |
| } | |
| } | |
| Assertion.addMethod('most', assertMost); | |
| Assertion.addMethod('lte', assertMost); | |
| /** | |
| * ### .within(start, finish) | |
| * | |
| * Asserts that the target is within a range. | |
| * | |
| * expect(7).to.be.within(5,10); | |
| * | |
| * Can also be used in conjunction with `length` to | |
| * assert a length range. The benefit being a | |
| * more informative error message than if the length | |
| * was supplied directly. | |
| * | |
| * expect('foo').to.have.length.within(2,4); | |
| * expect([ 1, 2, 3 ]).to.have.length.within(2,4); | |
| * | |
| * @name within | |
| * @param {Number} start lowerbound inclusive | |
| * @param {Number} finish upperbound inclusive | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| Assertion.addMethod('within', function (start, finish, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object') | |
| , range = start + '..' + finish; | |
| if (flag(this, 'doLength')) { | |
| new Assertion(obj, msg).to.have.property('length'); | |
| var len = obj.length; | |
| this.assert( | |
| len >= start && len <= finish | |
| , 'expected #{this} to have a length within ' + range | |
| , 'expected #{this} to not have a length within ' + range | |
| ); | |
| } else { | |
| this.assert( | |
| obj >= start && obj <= finish | |
| , 'expected #{this} to be within ' + range | |
| , 'expected #{this} to not be within ' + range | |
| ); | |
| } | |
| }); | |
| /** | |
| * ### .instanceof(constructor) | |
| * | |
| * Asserts that the target is an instance of `constructor`. | |
| * | |
| * var Tea = function (name) { this.name = name; } | |
| * , Chai = new Tea('chai'); | |
| * | |
| * expect(Chai).to.be.an.instanceof(Tea); | |
| * expect([ 1, 2, 3 ]).to.be.instanceof(Array); | |
| * | |
| * @name instanceof | |
| * @param {Constructor} constructor | |
| * @param {String} message _optional_ | |
| * @alias instanceOf | |
| * @api public | |
| */ | |
| function assertInstanceOf (constructor, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var name = _.getName(constructor); | |
| this.assert( | |
| flag(this, 'object') instanceof constructor | |
| , 'expected #{this} to be an instance of ' + name | |
| , 'expected #{this} to not be an instance of ' + name | |
| ); | |
| }; | |
| Assertion.addMethod('instanceof', assertInstanceOf); | |
| Assertion.addMethod('instanceOf', assertInstanceOf); | |
| /** | |
| * ### .property(name, [value]) | |
| * | |
| * Asserts that the target has a property `name`, optionally asserting that | |
| * the value of that property is strictly equal to `value`. | |
| * If the `deep` flag is set, you can use dot- and bracket-notation for deep | |
| * references into objects and arrays. | |
| * | |
| * // simple referencing | |
| * var obj = { foo: 'bar' }; | |
| * expect(obj).to.have.property('foo'); | |
| * expect(obj).to.have.property('foo', 'bar'); | |
| * | |
| * // deep referencing | |
| * var deepObj = { | |
| * green: { tea: 'matcha' } | |
| * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ] | |
| * }; | |
| * expect(deepObj).to.have.deep.property('green.tea', 'matcha'); | |
| * expect(deepObj).to.have.deep.property('teas[1]', 'matcha'); | |
| * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha'); | |
| * | |
| * You can also use an array as the starting point of a `deep.property` | |
| * assertion, or traverse nested arrays. | |
| * | |
| * var arr = [ | |
| * [ 'chai', 'matcha', 'konacha' ] | |
| * , [ { tea: 'chai' } | |
| * , { tea: 'matcha' } | |
| * , { tea: 'konacha' } ] | |
| * ]; | |
| * | |
| * expect(arr).to.have.deep.property('[0][1]', 'matcha'); | |
| * expect(arr).to.have.deep.property('[1][2].tea', 'konacha'); | |
| * | |
| * Furthermore, `property` changes the subject of the assertion | |
| * to be the value of that property from the original object. This | |
| * permits for further chainable assertions on that property. | |
| * | |
| * expect(obj).to.have.property('foo') | |
| * .that.is.a('string'); | |
| * expect(deepObj).to.have.property('green') | |
| * .that.is.an('object') | |
| * .that.deep.equals({ tea: 'matcha' }); | |
| * expect(deepObj).to.have.property('teas') | |
| * .that.is.an('array') | |
| * .with.deep.property('[2]') | |
| * .that.deep.equals({ tea: 'konacha' }); | |
| * | |
| * @name property | |
| * @alias deep.property | |
| * @param {String} name | |
| * @param {Mixed} value (optional) | |
| * @param {String} message _optional_ | |
| * @returns value of property for chaining | |
| * @api public | |
| */ | |
| Assertion.addMethod('property', function (name, val, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var descriptor = flag(this, 'deep') ? 'deep property ' : 'property ' | |
| , negate = flag(this, 'negate') | |
| , obj = flag(this, 'object') | |
| , value = flag(this, 'deep') | |
| ? _.getPathValue(name, obj) | |
| : obj[name]; | |
| if (negate && undefined !== val) { | |
| if (undefined === value) { | |
| msg = (msg != null) ? msg + ': ' : ''; | |
| throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name)); | |
| } | |
| } else { | |
| this.assert( | |
| undefined !== value | |
| , 'expected #{this} to have a ' + descriptor + _.inspect(name) | |
| , 'expected #{this} to not have ' + descriptor + _.inspect(name)); | |
| } | |
| if (undefined !== val) { | |
| this.assert( | |
| val === value | |
| , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}' | |
| , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}' | |
| , val | |
| , value | |
| ); | |
| } | |
| flag(this, 'object', value); | |
| }); | |
| /** | |
| * ### .ownProperty(name) | |
| * | |
| * Asserts that the target has an own property `name`. | |
| * | |
| * expect('test').to.have.ownProperty('length'); | |
| * | |
| * @name ownProperty | |
| * @alias haveOwnProperty | |
| * @param {String} name | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function assertOwnProperty (name, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| this.assert( | |
| obj.hasOwnProperty(name) | |
| , 'expected #{this} to have own property ' + _.inspect(name) | |
| , 'expected #{this} to not have own property ' + _.inspect(name) | |
| ); | |
| } | |
| Assertion.addMethod('ownProperty', assertOwnProperty); | |
| Assertion.addMethod('haveOwnProperty', assertOwnProperty); | |
| /** | |
| * ### .length(value) | |
| * | |
| * Asserts that the target's `length` property has | |
| * the expected value. | |
| * | |
| * expect([ 1, 2, 3]).to.have.length(3); | |
| * expect('foobar').to.have.length(6); | |
| * | |
| * Can also be used as a chain precursor to a value | |
| * comparison for the length property. | |
| * | |
| * expect('foo').to.have.length.above(2); | |
| * expect([ 1, 2, 3 ]).to.have.length.above(2); | |
| * expect('foo').to.have.length.below(4); | |
| * expect([ 1, 2, 3 ]).to.have.length.below(4); | |
| * expect('foo').to.have.length.within(2,4); | |
| * expect([ 1, 2, 3 ]).to.have.length.within(2,4); | |
| * | |
| * @name length | |
| * @alias lengthOf | |
| * @param {Number} length | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| function assertLengthChain () { | |
| flag(this, 'doLength', true); | |
| } | |
| function assertLength (n, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| new Assertion(obj, msg).to.have.property('length'); | |
| var len = obj.length; | |
| this.assert( | |
| len == n | |
| , 'expected #{this} to have a length of #{exp} but got #{act}' | |
| , 'expected #{this} to not have a length of #{act}' | |
| , n | |
| , len | |
| ); | |
| } | |
| Assertion.addChainableMethod('length', assertLength, assertLengthChain); | |
| Assertion.addMethod('lengthOf', assertLength); | |
| /** | |
| * ### .match(regexp) | |
| * | |
| * Asserts that the target matches a regular expression. | |
| * | |
| * expect('foobar').to.match(/^foo/); | |
| * | |
| * @name match | |
| * @param {RegExp} RegularExpression | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| Assertion.addMethod('match', function (re, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| this.assert( | |
| re.exec(obj) | |
| , 'expected #{this} to match ' + re | |
| , 'expected #{this} not to match ' + re | |
| ); | |
| }); | |
| /** | |
| * ### .string(string) | |
| * | |
| * Asserts that the string target contains another string. | |
| * | |
| * expect('foobar').to.have.string('bar'); | |
| * | |
| * @name string | |
| * @param {String} string | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| Assertion.addMethod('string', function (str, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| new Assertion(obj, msg).is.a('string'); | |
| this.assert( | |
| ~obj.indexOf(str) | |
| , 'expected #{this} to contain ' + _.inspect(str) | |
| , 'expected #{this} to not contain ' + _.inspect(str) | |
| ); | |
| }); | |
| /** | |
| * ### .keys(key1, [key2], [...]) | |
| * | |
| * Asserts that the target has exactly the given keys, or | |
| * asserts the inclusion of some keys when using the | |
| * `include` or `contain` modifiers. | |
| * | |
| * expect({ foo: 1, bar: 2 }).to.have.keys(['foo', 'bar']); | |
| * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.keys('foo', 'bar'); | |
| * | |
| * @name keys | |
| * @alias key | |
| * @param {String...|Array} keys | |
| * @api public | |
| */ | |
| function assertKeys (keys) { | |
| var obj = flag(this, 'object') | |
| , str | |
| , ok = true; | |
| keys = keys instanceof Array | |
| ? keys | |
| : Array.prototype.slice.call(arguments); | |
| if (!keys.length) throw new Error('keys required'); | |
| var actual = Object.keys(obj) | |
| , expected = keys | |
| , len = keys.length; | |
| // Inclusion | |
| ok = keys.every(function(key){ | |
| return ~actual.indexOf(key); | |
| }); | |
| // Strict | |
| if (!flag(this, 'negate') && !flag(this, 'contains')) { | |
| ok = ok && keys.length == actual.length; | |
| } | |
| // Key string | |
| if (len > 1) { | |
| keys = keys.map(function(key){ | |
| return _.inspect(key); | |
| }); | |
| var last = keys.pop(); | |
| str = keys.join(', ') + ', and ' + last; | |
| } else { | |
| str = _.inspect(keys[0]); | |
| } | |
| // Form | |
| str = (len > 1 ? 'keys ' : 'key ') + str; | |
| // Have / include | |
| str = (flag(this, 'contains') ? 'contain ' : 'have ') + str; | |
| // Assertion | |
| this.assert( | |
| ok | |
| , 'expected #{this} to ' + str | |
| , 'expected #{this} to not ' + str | |
| , expected.sort() | |
| , actual.sort() | |
| , true | |
| ); | |
| } | |
| Assertion.addMethod('keys', assertKeys); | |
| Assertion.addMethod('key', assertKeys); | |
| /** | |
| * ### .throw(constructor) | |
| * | |
| * Asserts that the function target will throw a specific error, or specific type of error | |
| * (as determined using `instanceof`), optionally with a RegExp or string inclusion test | |
| * for the error's message. | |
| * | |
| * var err = new ReferenceError('This is a bad function.'); | |
| * var fn = function () { throw err; } | |
| * expect(fn).to.throw(ReferenceError); | |
| * expect(fn).to.throw(Error); | |
| * expect(fn).to.throw(/bad function/); | |
| * expect(fn).to.not.throw('good function'); | |
| * expect(fn).to.throw(ReferenceError, /bad function/); | |
| * expect(fn).to.throw(err); | |
| * expect(fn).to.not.throw(new RangeError('Out of range.')); | |
| * | |
| * Please note that when a throw expectation is negated, it will check each | |
| * parameter independently, starting with error constructor type. The appropriate way | |
| * to check for the existence of a type of error but for a message that does not match | |
| * is to use `and`. | |
| * | |
| * expect(fn).to.throw(ReferenceError) | |
| * .and.not.throw(/good function/); | |
| * | |
| * @name throw | |
| * @alias throws | |
| * @alias Throw | |
| * @param {ErrorConstructor} constructor | |
| * @param {String|RegExp} expected error message | |
| * @param {String} message _optional_ | |
| * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types | |
| * @returns error for chaining (null if no error) | |
| * @api public | |
| */ | |
| function assertThrows (constructor, errMsg, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| new Assertion(obj, msg).is.a('function'); | |
| var thrown = false | |
| , desiredError = null | |
| , name = null | |
| , thrownError = null; | |
| if (arguments.length === 0) { | |
| errMsg = null; | |
| constructor = null; | |
| } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) { | |
| errMsg = constructor; | |
| constructor = null; | |
| } else if (constructor && constructor instanceof Error) { | |
| desiredError = constructor; | |
| constructor = null; | |
| errMsg = null; | |
| } else if (typeof constructor === 'function') { | |
| name = constructor.prototype.name || constructor.name; | |
| if (name === 'Error' && constructor !== Error) { | |
| name = (new constructor()).name; | |
| } | |
| } else { | |
| constructor = null; | |
| } | |
| try { | |
| obj(); | |
| } catch (err) { | |
| // first, check desired error | |
| if (desiredError) { | |
| this.assert( | |
| err === desiredError | |
| , 'expected #{this} to throw #{exp} but #{act} was thrown' | |
| , 'expected #{this} to not throw #{exp}' | |
| , (desiredError instanceof Error ? desiredError.toString() : desiredError) | |
| , (err instanceof Error ? err.toString() : err) | |
| ); | |
| flag(this, 'object', err); | |
| return this; | |
| } | |
| // next, check constructor | |
| if (constructor) { | |
| this.assert( | |
| err instanceof constructor | |
| , 'expected #{this} to throw #{exp} but #{act} was thrown' | |
| , 'expected #{this} to not throw #{exp} but #{act} was thrown' | |
| , name | |
| , (err instanceof Error ? err.toString() : err) | |
| ); | |
| if (!errMsg) { | |
| flag(this, 'object', err); | |
| return this; | |
| } | |
| } | |
| // next, check message | |
| var message = 'object' === _.type(err) && "message" in err | |
| ? err.message | |
| : '' + err; | |
| if ((message != null) && errMsg && errMsg instanceof RegExp) { | |
| this.assert( | |
| errMsg.exec(message) | |
| , 'expected #{this} to throw error matching #{exp} but got #{act}' | |
| , 'expected #{this} to throw error not matching #{exp}' | |
| , errMsg | |
| , message | |
| ); | |
| flag(this, 'object', err); | |
| return this; | |
| } else if ((message != null) && errMsg && 'string' === typeof errMsg) { | |
| this.assert( | |
| ~message.indexOf(errMsg) | |
| , 'expected #{this} to throw error including #{exp} but got #{act}' | |
| , 'expected #{this} to throw error not including #{act}' | |
| , errMsg | |
| , message | |
| ); | |
| flag(this, 'object', err); | |
| return this; | |
| } else { | |
| thrown = true; | |
| thrownError = err; | |
| } | |
| } | |
| var actuallyGot = '' | |
| , expectedThrown = name !== null | |
| ? name | |
| : desiredError | |
| ? '#{exp}' //_.inspect(desiredError) | |
| : 'an error'; | |
| if (thrown) { | |
| actuallyGot = ' but #{act} was thrown' | |
| } | |
| this.assert( | |
| thrown === true | |
| , 'expected #{this} to throw ' + expectedThrown + actuallyGot | |
| , 'expected #{this} to not throw ' + expectedThrown + actuallyGot | |
| , (desiredError instanceof Error ? desiredError.toString() : desiredError) | |
| , (thrownError instanceof Error ? thrownError.toString() : thrownError) | |
| ); | |
| flag(this, 'object', thrownError); | |
| }; | |
| Assertion.addMethod('throw', assertThrows); | |
| Assertion.addMethod('throws', assertThrows); | |
| Assertion.addMethod('Throw', assertThrows); | |
| /** | |
| * ### .respondTo(method) | |
| * | |
| * Asserts that the object or class target will respond to a method. | |
| * | |
| * Klass.prototype.bar = function(){}; | |
| * expect(Klass).to.respondTo('bar'); | |
| * expect(obj).to.respondTo('bar'); | |
| * | |
| * To check if a constructor will respond to a static function, | |
| * set the `itself` flag. | |
| * | |
| * Klass.baz = function(){}; | |
| * expect(Klass).itself.to.respondTo('baz'); | |
| * | |
| * @name respondTo | |
| * @param {String} method | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| Assertion.addMethod('respondTo', function (method, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object') | |
| , itself = flag(this, 'itself') | |
| , context = ('function' === _.type(obj) && !itself) | |
| ? obj.prototype[method] | |
| : obj[method]; | |
| this.assert( | |
| 'function' === typeof context | |
| , 'expected #{this} to respond to ' + _.inspect(method) | |
| , 'expected #{this} to not respond to ' + _.inspect(method) | |
| ); | |
| }); | |
| /** | |
| * ### .itself | |
| * | |
| * Sets the `itself` flag, later used by the `respondTo` assertion. | |
| * | |
| * function Foo() {} | |
| * Foo.bar = function() {} | |
| * Foo.prototype.baz = function() {} | |
| * | |
| * expect(Foo).itself.to.respondTo('bar'); | |
| * expect(Foo).itself.not.to.respondTo('baz'); | |
| * | |
| * @name itself | |
| * @api public | |
| */ | |
| Assertion.addProperty('itself', function () { | |
| flag(this, 'itself', true); | |
| }); | |
| /** | |
| * ### .satisfy(method) | |
| * | |
| * Asserts that the target passes a given truth test. | |
| * | |
| * expect(1).to.satisfy(function(num) { return num > 0; }); | |
| * | |
| * @name satisfy | |
| * @param {Function} matcher | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| Assertion.addMethod('satisfy', function (matcher, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| var result = matcher(obj); | |
| this.assert( | |
| result | |
| , 'expected #{this} to satisfy ' + _.objDisplay(matcher) | |
| , 'expected #{this} to not satisfy' + _.objDisplay(matcher) | |
| , this.negate ? false : true | |
| , result | |
| ); | |
| }); | |
| /** | |
| * ### .closeTo(expected, delta) | |
| * | |
| * Asserts that the target is equal `expected`, to within a +/- `delta` range. | |
| * | |
| * expect(1.5).to.be.closeTo(1, 0.5); | |
| * | |
| * @name closeTo | |
| * @param {Number} expected | |
| * @param {Number} delta | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| Assertion.addMethod('closeTo', function (expected, delta, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| new Assertion(obj, msg).is.a('number'); | |
| if (_.type(expected) !== 'number' || _.type(delta) !== 'number') { | |
| throw new Error('the arguments to closeTo must be numbers'); | |
| } | |
| this.assert( | |
| Math.abs(obj - expected) <= delta | |
| , 'expected #{this} to be close to ' + expected + ' +/- ' + delta | |
| , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta | |
| ); | |
| }); | |
| function isSubsetOf(subset, superset, cmp) { | |
| return subset.every(function(elem) { | |
| if (!cmp) return superset.indexOf(elem) !== -1; | |
| return superset.some(function(elem2) { | |
| return cmp(elem, elem2); | |
| }); | |
| }) | |
| } | |
| /** | |
| * ### .members(set) | |
| * | |
| * Asserts that the target is a superset of `set`, | |
| * or that the target and `set` have the same strictly-equal (===) members. | |
| * Alternately, if the `deep` flag is set, set members are compared for deep | |
| * equality. | |
| * | |
| * expect([1, 2, 3]).to.include.members([3, 2]); | |
| * expect([1, 2, 3]).to.not.include.members([3, 2, 8]); | |
| * | |
| * expect([4, 2]).to.have.members([2, 4]); | |
| * expect([5, 2]).to.not.have.members([5, 2, 1]); | |
| * | |
| * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]); | |
| * | |
| * @name members | |
| * @param {Array} set | |
| * @param {String} message _optional_ | |
| * @api public | |
| */ | |
| Assertion.addMethod('members', function (subset, msg) { | |
| if (msg) flag(this, 'message', msg); | |
| var obj = flag(this, 'object'); | |
| new Assertion(obj).to.be.an('array'); | |
| new Assertion(subset).to.be.an('array'); | |
| var cmp = flag(this, 'deep') ? _.eql : undefined; | |
| if (flag(this, 'contains')) { | |
| return this.assert( | |
| isSubsetOf(subset, obj, cmp) | |
| , 'expected #{this} to be a superset of #{act}' | |
| , 'expected #{this} to not be a superset of #{act}' | |
| , obj | |
| , subset | |
| ); | |
| } | |
| this.assert( | |
| isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp) | |
| , 'expected #{this} to have the same members as #{act}' | |
| , 'expected #{this} to not have the same members as #{act}' | |
| , obj | |
| , subset | |
| ); | |
| }); | |
| }; | |
| /***/ }, | |
| /* 21 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * chai | |
| * Copyright(c) 2011-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| module.exports = function (chai, util) { | |
| chai.expect = function (val, message) { | |
| return new chai.Assertion(val, message); | |
| }; | |
| }; | |
| /***/ }, | |
| /* 22 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * chai | |
| * Copyright(c) 2011-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| module.exports = function (chai, util) { | |
| var Assertion = chai.Assertion; | |
| function loadShould () { | |
| // explicitly define this method as function as to have it's name to include as `ssfi` | |
| function shouldGetter() { | |
| if (this instanceof String || this instanceof Number) { | |
| return new Assertion(this.constructor(this), null, shouldGetter); | |
| } else if (this instanceof Boolean) { | |
| return new Assertion(this == true, null, shouldGetter); | |
| } | |
| return new Assertion(this, null, shouldGetter); | |
| } | |
| function shouldSetter(value) { | |
| // See https://github.com/chaijs/chai/issues/86: this makes | |
| // `whatever.should = someValue` actually set `someValue`, which is | |
| // especially useful for `global.should = require('chai').should()`. | |
| // | |
| // Note that we have to use [[DefineProperty]] instead of [[Put]] | |
| // since otherwise we would trigger this very setter! | |
| Object.defineProperty(this, 'should', { | |
| value: value, | |
| enumerable: true, | |
| configurable: true, | |
| writable: true | |
| }); | |
| } | |
| // modify Object.prototype to have `should` | |
| Object.defineProperty(Object.prototype, 'should', { | |
| set: shouldSetter | |
| , get: shouldGetter | |
| , configurable: true | |
| }); | |
| var should = {}; | |
| should.equal = function (val1, val2, msg) { | |
| new Assertion(val1, msg).to.equal(val2); | |
| }; | |
| should.Throw = function (fn, errt, errs, msg) { | |
| new Assertion(fn, msg).to.Throw(errt, errs); | |
| }; | |
| should.exist = function (val, msg) { | |
| new Assertion(val, msg).to.exist; | |
| } | |
| // negation | |
| should.not = {} | |
| should.not.equal = function (val1, val2, msg) { | |
| new Assertion(val1, msg).to.not.equal(val2); | |
| }; | |
| should.not.Throw = function (fn, errt, errs, msg) { | |
| new Assertion(fn, msg).to.not.Throw(errt, errs); | |
| }; | |
| should.not.exist = function (val, msg) { | |
| new Assertion(val, msg).to.not.exist; | |
| } | |
| should['throw'] = should['Throw']; | |
| should.not['throw'] = should.not['Throw']; | |
| return should; | |
| }; | |
| chai.should = loadShould; | |
| chai.Should = loadShould; | |
| }; | |
| /***/ }, | |
| /* 23 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * chai | |
| * Copyright(c) 2011-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| module.exports = function (chai, util) { | |
| /*! | |
| * Chai dependencies. | |
| */ | |
| var Assertion = chai.Assertion | |
| , flag = util.flag; | |
| /*! | |
| * Module export. | |
| */ | |
| /** | |
| * ### assert(expression, message) | |
| * | |
| * Write your own test expressions. | |
| * | |
| * assert('foo' !== 'bar', 'foo is not bar'); | |
| * assert(Array.isArray([]), 'empty arrays are arrays'); | |
| * | |
| * @param {Mixed} expression to test for truthiness | |
| * @param {String} message to display on error | |
| * @name assert | |
| * @api public | |
| */ | |
| var assert = chai.assert = function (express, errmsg) { | |
| var test = new Assertion(null, null, chai.assert); | |
| test.assert( | |
| express | |
| , errmsg | |
| , '[ negation message unavailable ]' | |
| ); | |
| }; | |
| /** | |
| * ### .fail(actual, expected, [message], [operator]) | |
| * | |
| * Throw a failure. Node.js `assert` module-compatible. | |
| * | |
| * @name fail | |
| * @param {Mixed} actual | |
| * @param {Mixed} expected | |
| * @param {String} message | |
| * @param {String} operator | |
| * @api public | |
| */ | |
| assert.fail = function (actual, expected, message, operator) { | |
| message = message || 'assert.fail()'; | |
| throw new chai.AssertionError(message, { | |
| actual: actual | |
| , expected: expected | |
| , operator: operator | |
| }, assert.fail); | |
| }; | |
| /** | |
| * ### .ok(object, [message]) | |
| * | |
| * Asserts that `object` is truthy. | |
| * | |
| * assert.ok('everything', 'everything is ok'); | |
| * assert.ok(false, 'this will fail'); | |
| * | |
| * @name ok | |
| * @param {Mixed} object to test | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.ok = function (val, msg) { | |
| new Assertion(val, msg).is.ok; | |
| }; | |
| /** | |
| * ### .notOk(object, [message]) | |
| * | |
| * Asserts that `object` is falsy. | |
| * | |
| * assert.notOk('everything', 'this will fail'); | |
| * assert.notOk(false, 'this will pass'); | |
| * | |
| * @name notOk | |
| * @param {Mixed} object to test | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notOk = function (val, msg) { | |
| new Assertion(val, msg).is.not.ok; | |
| }; | |
| /** | |
| * ### .equal(actual, expected, [message]) | |
| * | |
| * Asserts non-strict equality (`==`) of `actual` and `expected`. | |
| * | |
| * assert.equal(3, '3', '== coerces values to strings'); | |
| * | |
| * @name equal | |
| * @param {Mixed} actual | |
| * @param {Mixed} expected | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.equal = function (act, exp, msg) { | |
| var test = new Assertion(act, msg, assert.equal); | |
| test.assert( | |
| exp == flag(test, 'object') | |
| , 'expected #{this} to equal #{exp}' | |
| , 'expected #{this} to not equal #{act}' | |
| , exp | |
| , act | |
| ); | |
| }; | |
| /** | |
| * ### .notEqual(actual, expected, [message]) | |
| * | |
| * Asserts non-strict inequality (`!=`) of `actual` and `expected`. | |
| * | |
| * assert.notEqual(3, 4, 'these numbers are not equal'); | |
| * | |
| * @name notEqual | |
| * @param {Mixed} actual | |
| * @param {Mixed} expected | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notEqual = function (act, exp, msg) { | |
| var test = new Assertion(act, msg, assert.notEqual); | |
| test.assert( | |
| exp != flag(test, 'object') | |
| , 'expected #{this} to not equal #{exp}' | |
| , 'expected #{this} to equal #{act}' | |
| , exp | |
| , act | |
| ); | |
| }; | |
| /** | |
| * ### .strictEqual(actual, expected, [message]) | |
| * | |
| * Asserts strict equality (`===`) of `actual` and `expected`. | |
| * | |
| * assert.strictEqual(true, true, 'these booleans are strictly equal'); | |
| * | |
| * @name strictEqual | |
| * @param {Mixed} actual | |
| * @param {Mixed} expected | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.strictEqual = function (act, exp, msg) { | |
| new Assertion(act, msg).to.equal(exp); | |
| }; | |
| /** | |
| * ### .notStrictEqual(actual, expected, [message]) | |
| * | |
| * Asserts strict inequality (`!==`) of `actual` and `expected`. | |
| * | |
| * assert.notStrictEqual(3, '3', 'no coercion for strict equality'); | |
| * | |
| * @name notStrictEqual | |
| * @param {Mixed} actual | |
| * @param {Mixed} expected | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notStrictEqual = function (act, exp, msg) { | |
| new Assertion(act, msg).to.not.equal(exp); | |
| }; | |
| /** | |
| * ### .deepEqual(actual, expected, [message]) | |
| * | |
| * Asserts that `actual` is deeply equal to `expected`. | |
| * | |
| * assert.deepEqual({ tea: 'green' }, { tea: 'green' }); | |
| * | |
| * @name deepEqual | |
| * @param {Mixed} actual | |
| * @param {Mixed} expected | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.deepEqual = function (act, exp, msg) { | |
| new Assertion(act, msg).to.eql(exp); | |
| }; | |
| /** | |
| * ### .notDeepEqual(actual, expected, [message]) | |
| * | |
| * Assert that `actual` is not deeply equal to `expected`. | |
| * | |
| * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' }); | |
| * | |
| * @name notDeepEqual | |
| * @param {Mixed} actual | |
| * @param {Mixed} expected | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notDeepEqual = function (act, exp, msg) { | |
| new Assertion(act, msg).to.not.eql(exp); | |
| }; | |
| /** | |
| * ### .isTrue(value, [message]) | |
| * | |
| * Asserts that `value` is true. | |
| * | |
| * var teaServed = true; | |
| * assert.isTrue(teaServed, 'the tea has been served'); | |
| * | |
| * @name isTrue | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isTrue = function (val, msg) { | |
| new Assertion(val, msg).is['true']; | |
| }; | |
| /** | |
| * ### .isFalse(value, [message]) | |
| * | |
| * Asserts that `value` is false. | |
| * | |
| * var teaServed = false; | |
| * assert.isFalse(teaServed, 'no tea yet? hmm...'); | |
| * | |
| * @name isFalse | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isFalse = function (val, msg) { | |
| new Assertion(val, msg).is['false']; | |
| }; | |
| /** | |
| * ### .isNull(value, [message]) | |
| * | |
| * Asserts that `value` is null. | |
| * | |
| * assert.isNull(err, 'there was no error'); | |
| * | |
| * @name isNull | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isNull = function (val, msg) { | |
| new Assertion(val, msg).to.equal(null); | |
| }; | |
| /** | |
| * ### .isNotNull(value, [message]) | |
| * | |
| * Asserts that `value` is not null. | |
| * | |
| * var tea = 'tasty chai'; | |
| * assert.isNotNull(tea, 'great, time for tea!'); | |
| * | |
| * @name isNotNull | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isNotNull = function (val, msg) { | |
| new Assertion(val, msg).to.not.equal(null); | |
| }; | |
| /** | |
| * ### .isUndefined(value, [message]) | |
| * | |
| * Asserts that `value` is `undefined`. | |
| * | |
| * var tea; | |
| * assert.isUndefined(tea, 'no tea defined'); | |
| * | |
| * @name isUndefined | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isUndefined = function (val, msg) { | |
| new Assertion(val, msg).to.equal(undefined); | |
| }; | |
| /** | |
| * ### .isDefined(value, [message]) | |
| * | |
| * Asserts that `value` is not `undefined`. | |
| * | |
| * var tea = 'cup of chai'; | |
| * assert.isDefined(tea, 'tea has been defined'); | |
| * | |
| * @name isDefined | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isDefined = function (val, msg) { | |
| new Assertion(val, msg).to.not.equal(undefined); | |
| }; | |
| /** | |
| * ### .isFunction(value, [message]) | |
| * | |
| * Asserts that `value` is a function. | |
| * | |
| * function serveTea() { return 'cup of tea'; }; | |
| * assert.isFunction(serveTea, 'great, we can have tea now'); | |
| * | |
| * @name isFunction | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isFunction = function (val, msg) { | |
| new Assertion(val, msg).to.be.a('function'); | |
| }; | |
| /** | |
| * ### .isNotFunction(value, [message]) | |
| * | |
| * Asserts that `value` is _not_ a function. | |
| * | |
| * var serveTea = [ 'heat', 'pour', 'sip' ]; | |
| * assert.isNotFunction(serveTea, 'great, we have listed the steps'); | |
| * | |
| * @name isNotFunction | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isNotFunction = function (val, msg) { | |
| new Assertion(val, msg).to.not.be.a('function'); | |
| }; | |
| /** | |
| * ### .isObject(value, [message]) | |
| * | |
| * Asserts that `value` is an object (as revealed by | |
| * `Object.prototype.toString`). | |
| * | |
| * var selection = { name: 'Chai', serve: 'with spices' }; | |
| * assert.isObject(selection, 'tea selection is an object'); | |
| * | |
| * @name isObject | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isObject = function (val, msg) { | |
| new Assertion(val, msg).to.be.a('object'); | |
| }; | |
| /** | |
| * ### .isNotObject(value, [message]) | |
| * | |
| * Asserts that `value` is _not_ an object. | |
| * | |
| * var selection = 'chai' | |
| * assert.isNotObject(selection, 'tea selection is not an object'); | |
| * assert.isNotObject(null, 'null is not an object'); | |
| * | |
| * @name isNotObject | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isNotObject = function (val, msg) { | |
| new Assertion(val, msg).to.not.be.a('object'); | |
| }; | |
| /** | |
| * ### .isArray(value, [message]) | |
| * | |
| * Asserts that `value` is an array. | |
| * | |
| * var menu = [ 'green', 'chai', 'oolong' ]; | |
| * assert.isArray(menu, 'what kind of tea do we want?'); | |
| * | |
| * @name isArray | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isArray = function (val, msg) { | |
| new Assertion(val, msg).to.be.an('array'); | |
| }; | |
| /** | |
| * ### .isNotArray(value, [message]) | |
| * | |
| * Asserts that `value` is _not_ an array. | |
| * | |
| * var menu = 'green|chai|oolong'; | |
| * assert.isNotArray(menu, 'what kind of tea do we want?'); | |
| * | |
| * @name isNotArray | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isNotArray = function (val, msg) { | |
| new Assertion(val, msg).to.not.be.an('array'); | |
| }; | |
| /** | |
| * ### .isString(value, [message]) | |
| * | |
| * Asserts that `value` is a string. | |
| * | |
| * var teaOrder = 'chai'; | |
| * assert.isString(teaOrder, 'order placed'); | |
| * | |
| * @name isString | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isString = function (val, msg) { | |
| new Assertion(val, msg).to.be.a('string'); | |
| }; | |
| /** | |
| * ### .isNotString(value, [message]) | |
| * | |
| * Asserts that `value` is _not_ a string. | |
| * | |
| * var teaOrder = 4; | |
| * assert.isNotString(teaOrder, 'order placed'); | |
| * | |
| * @name isNotString | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isNotString = function (val, msg) { | |
| new Assertion(val, msg).to.not.be.a('string'); | |
| }; | |
| /** | |
| * ### .isNumber(value, [message]) | |
| * | |
| * Asserts that `value` is a number. | |
| * | |
| * var cups = 2; | |
| * assert.isNumber(cups, 'how many cups'); | |
| * | |
| * @name isNumber | |
| * @param {Number} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isNumber = function (val, msg) { | |
| new Assertion(val, msg).to.be.a('number'); | |
| }; | |
| /** | |
| * ### .isNotNumber(value, [message]) | |
| * | |
| * Asserts that `value` is _not_ a number. | |
| * | |
| * var cups = '2 cups please'; | |
| * assert.isNotNumber(cups, 'how many cups'); | |
| * | |
| * @name isNotNumber | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isNotNumber = function (val, msg) { | |
| new Assertion(val, msg).to.not.be.a('number'); | |
| }; | |
| /** | |
| * ### .isBoolean(value, [message]) | |
| * | |
| * Asserts that `value` is a boolean. | |
| * | |
| * var teaReady = true | |
| * , teaServed = false; | |
| * | |
| * assert.isBoolean(teaReady, 'is the tea ready'); | |
| * assert.isBoolean(teaServed, 'has tea been served'); | |
| * | |
| * @name isBoolean | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isBoolean = function (val, msg) { | |
| new Assertion(val, msg).to.be.a('boolean'); | |
| }; | |
| /** | |
| * ### .isNotBoolean(value, [message]) | |
| * | |
| * Asserts that `value` is _not_ a boolean. | |
| * | |
| * var teaReady = 'yep' | |
| * , teaServed = 'nope'; | |
| * | |
| * assert.isNotBoolean(teaReady, 'is the tea ready'); | |
| * assert.isNotBoolean(teaServed, 'has tea been served'); | |
| * | |
| * @name isNotBoolean | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.isNotBoolean = function (val, msg) { | |
| new Assertion(val, msg).to.not.be.a('boolean'); | |
| }; | |
| /** | |
| * ### .typeOf(value, name, [message]) | |
| * | |
| * Asserts that `value`'s type is `name`, as determined by | |
| * `Object.prototype.toString`. | |
| * | |
| * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object'); | |
| * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array'); | |
| * assert.typeOf('tea', 'string', 'we have a string'); | |
| * assert.typeOf(/tea/, 'regexp', 'we have a regular expression'); | |
| * assert.typeOf(null, 'null', 'we have a null'); | |
| * assert.typeOf(undefined, 'undefined', 'we have an undefined'); | |
| * | |
| * @name typeOf | |
| * @param {Mixed} value | |
| * @param {String} name | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.typeOf = function (val, type, msg) { | |
| new Assertion(val, msg).to.be.a(type); | |
| }; | |
| /** | |
| * ### .notTypeOf(value, name, [message]) | |
| * | |
| * Asserts that `value`'s type is _not_ `name`, as determined by | |
| * `Object.prototype.toString`. | |
| * | |
| * assert.notTypeOf('tea', 'number', 'strings are not numbers'); | |
| * | |
| * @name notTypeOf | |
| * @param {Mixed} value | |
| * @param {String} typeof name | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notTypeOf = function (val, type, msg) { | |
| new Assertion(val, msg).to.not.be.a(type); | |
| }; | |
| /** | |
| * ### .instanceOf(object, constructor, [message]) | |
| * | |
| * Asserts that `value` is an instance of `constructor`. | |
| * | |
| * var Tea = function (name) { this.name = name; } | |
| * , chai = new Tea('chai'); | |
| * | |
| * assert.instanceOf(chai, Tea, 'chai is an instance of tea'); | |
| * | |
| * @name instanceOf | |
| * @param {Object} object | |
| * @param {Constructor} constructor | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.instanceOf = function (val, type, msg) { | |
| new Assertion(val, msg).to.be.instanceOf(type); | |
| }; | |
| /** | |
| * ### .notInstanceOf(object, constructor, [message]) | |
| * | |
| * Asserts `value` is not an instance of `constructor`. | |
| * | |
| * var Tea = function (name) { this.name = name; } | |
| * , chai = new String('chai'); | |
| * | |
| * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea'); | |
| * | |
| * @name notInstanceOf | |
| * @param {Object} object | |
| * @param {Constructor} constructor | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notInstanceOf = function (val, type, msg) { | |
| new Assertion(val, msg).to.not.be.instanceOf(type); | |
| }; | |
| /** | |
| * ### .include(haystack, needle, [message]) | |
| * | |
| * Asserts that `haystack` includes `needle`. Works | |
| * for strings and arrays. | |
| * | |
| * assert.include('foobar', 'bar', 'foobar contains string "bar"'); | |
| * assert.include([ 1, 2, 3 ], 3, 'array contains value'); | |
| * | |
| * @name include | |
| * @param {Array|String} haystack | |
| * @param {Mixed} needle | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.include = function (exp, inc, msg) { | |
| new Assertion(exp, msg, assert.include).include(inc); | |
| }; | |
| /** | |
| * ### .notInclude(haystack, needle, [message]) | |
| * | |
| * Asserts that `haystack` does not include `needle`. Works | |
| * for strings and arrays. | |
| *i | |
| * assert.notInclude('foobar', 'baz', 'string not include substring'); | |
| * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value'); | |
| * | |
| * @name notInclude | |
| * @param {Array|String} haystack | |
| * @param {Mixed} needle | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notInclude = function (exp, inc, msg) { | |
| new Assertion(exp, msg, assert.notInclude).not.include(inc); | |
| }; | |
| /** | |
| * ### .match(value, regexp, [message]) | |
| * | |
| * Asserts that `value` matches the regular expression `regexp`. | |
| * | |
| * assert.match('foobar', /^foo/, 'regexp matches'); | |
| * | |
| * @name match | |
| * @param {Mixed} value | |
| * @param {RegExp} regexp | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.match = function (exp, re, msg) { | |
| new Assertion(exp, msg).to.match(re); | |
| }; | |
| /** | |
| * ### .notMatch(value, regexp, [message]) | |
| * | |
| * Asserts that `value` does not match the regular expression `regexp`. | |
| * | |
| * assert.notMatch('foobar', /^foo/, 'regexp does not match'); | |
| * | |
| * @name notMatch | |
| * @param {Mixed} value | |
| * @param {RegExp} regexp | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notMatch = function (exp, re, msg) { | |
| new Assertion(exp, msg).to.not.match(re); | |
| }; | |
| /** | |
| * ### .property(object, property, [message]) | |
| * | |
| * Asserts that `object` has a property named by `property`. | |
| * | |
| * assert.property({ tea: { green: 'matcha' }}, 'tea'); | |
| * | |
| * @name property | |
| * @param {Object} object | |
| * @param {String} property | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.property = function (obj, prop, msg) { | |
| new Assertion(obj, msg).to.have.property(prop); | |
| }; | |
| /** | |
| * ### .notProperty(object, property, [message]) | |
| * | |
| * Asserts that `object` does _not_ have a property named by `property`. | |
| * | |
| * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee'); | |
| * | |
| * @name notProperty | |
| * @param {Object} object | |
| * @param {String} property | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notProperty = function (obj, prop, msg) { | |
| new Assertion(obj, msg).to.not.have.property(prop); | |
| }; | |
| /** | |
| * ### .deepProperty(object, property, [message]) | |
| * | |
| * Asserts that `object` has a property named by `property`, which can be a | |
| * string using dot- and bracket-notation for deep reference. | |
| * | |
| * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green'); | |
| * | |
| * @name deepProperty | |
| * @param {Object} object | |
| * @param {String} property | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.deepProperty = function (obj, prop, msg) { | |
| new Assertion(obj, msg).to.have.deep.property(prop); | |
| }; | |
| /** | |
| * ### .notDeepProperty(object, property, [message]) | |
| * | |
| * Asserts that `object` does _not_ have a property named by `property`, which | |
| * can be a string using dot- and bracket-notation for deep reference. | |
| * | |
| * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong'); | |
| * | |
| * @name notDeepProperty | |
| * @param {Object} object | |
| * @param {String} property | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.notDeepProperty = function (obj, prop, msg) { | |
| new Assertion(obj, msg).to.not.have.deep.property(prop); | |
| }; | |
| /** | |
| * ### .propertyVal(object, property, value, [message]) | |
| * | |
| * Asserts that `object` has a property named by `property` with value given | |
| * by `value`. | |
| * | |
| * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good'); | |
| * | |
| * @name propertyVal | |
| * @param {Object} object | |
| * @param {String} property | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.propertyVal = function (obj, prop, val, msg) { | |
| new Assertion(obj, msg).to.have.property(prop, val); | |
| }; | |
| /** | |
| * ### .propertyNotVal(object, property, value, [message]) | |
| * | |
| * Asserts that `object` has a property named by `property`, but with a value | |
| * different from that given by `value`. | |
| * | |
| * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad'); | |
| * | |
| * @name propertyNotVal | |
| * @param {Object} object | |
| * @param {String} property | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.propertyNotVal = function (obj, prop, val, msg) { | |
| new Assertion(obj, msg).to.not.have.property(prop, val); | |
| }; | |
| /** | |
| * ### .deepPropertyVal(object, property, value, [message]) | |
| * | |
| * Asserts that `object` has a property named by `property` with value given | |
| * by `value`. `property` can use dot- and bracket-notation for deep | |
| * reference. | |
| * | |
| * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha'); | |
| * | |
| * @name deepPropertyVal | |
| * @param {Object} object | |
| * @param {String} property | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.deepPropertyVal = function (obj, prop, val, msg) { | |
| new Assertion(obj, msg).to.have.deep.property(prop, val); | |
| }; | |
| /** | |
| * ### .deepPropertyNotVal(object, property, value, [message]) | |
| * | |
| * Asserts that `object` has a property named by `property`, but with a value | |
| * different from that given by `value`. `property` can use dot- and | |
| * bracket-notation for deep reference. | |
| * | |
| * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha'); | |
| * | |
| * @name deepPropertyNotVal | |
| * @param {Object} object | |
| * @param {String} property | |
| * @param {Mixed} value | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.deepPropertyNotVal = function (obj, prop, val, msg) { | |
| new Assertion(obj, msg).to.not.have.deep.property(prop, val); | |
| }; | |
| /** | |
| * ### .lengthOf(object, length, [message]) | |
| * | |
| * Asserts that `object` has a `length` property with the expected value. | |
| * | |
| * assert.lengthOf([1,2,3], 3, 'array has length of 3'); | |
| * assert.lengthOf('foobar', 5, 'string has length of 6'); | |
| * | |
| * @name lengthOf | |
| * @param {Mixed} object | |
| * @param {Number} length | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.lengthOf = function (exp, len, msg) { | |
| new Assertion(exp, msg).to.have.length(len); | |
| }; | |
| /** | |
| * ### .throws(function, [constructor/string/regexp], [string/regexp], [message]) | |
| * | |
| * Asserts that `function` will throw an error that is an instance of | |
| * `constructor`, or alternately that it will throw an error with message | |
| * matching `regexp`. | |
| * | |
| * assert.throw(fn, 'function throws a reference error'); | |
| * assert.throw(fn, /function throws a reference error/); | |
| * assert.throw(fn, ReferenceError); | |
| * assert.throw(fn, ReferenceError, 'function throws a reference error'); | |
| * assert.throw(fn, ReferenceError, /function throws a reference error/); | |
| * | |
| * @name throws | |
| * @alias throw | |
| * @alias Throw | |
| * @param {Function} function | |
| * @param {ErrorConstructor} constructor | |
| * @param {RegExp} regexp | |
| * @param {String} message | |
| * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types | |
| * @api public | |
| */ | |
| assert.Throw = function (fn, errt, errs, msg) { | |
| if ('string' === typeof errt || errt instanceof RegExp) { | |
| errs = errt; | |
| errt = null; | |
| } | |
| var assertErr = new Assertion(fn, msg).to.Throw(errt, errs); | |
| return flag(assertErr, 'object'); | |
| }; | |
| /** | |
| * ### .doesNotThrow(function, [constructor/regexp], [message]) | |
| * | |
| * Asserts that `function` will _not_ throw an error that is an instance of | |
| * `constructor`, or alternately that it will not throw an error with message | |
| * matching `regexp`. | |
| * | |
| * assert.doesNotThrow(fn, Error, 'function does not throw'); | |
| * | |
| * @name doesNotThrow | |
| * @param {Function} function | |
| * @param {ErrorConstructor} constructor | |
| * @param {RegExp} regexp | |
| * @param {String} message | |
| * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types | |
| * @api public | |
| */ | |
| assert.doesNotThrow = function (fn, type, msg) { | |
| if ('string' === typeof type) { | |
| msg = type; | |
| type = null; | |
| } | |
| new Assertion(fn, msg).to.not.Throw(type); | |
| }; | |
| /** | |
| * ### .operator(val1, operator, val2, [message]) | |
| * | |
| * Compares two values using `operator`. | |
| * | |
| * assert.operator(1, '<', 2, 'everything is ok'); | |
| * assert.operator(1, '>', 2, 'this will fail'); | |
| * | |
| * @name operator | |
| * @param {Mixed} val1 | |
| * @param {String} operator | |
| * @param {Mixed} val2 | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.operator = function (val, operator, val2, msg) { | |
| if (!~['==', '===', '>', '>=', '<', '<=', '!=', '!=='].indexOf(operator)) { | |
| throw new Error('Invalid operator "' + operator + '"'); | |
| } | |
| var test = new Assertion(eval(val + operator + val2), msg); | |
| test.assert( | |
| true === flag(test, 'object') | |
| , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2) | |
| , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) ); | |
| }; | |
| /** | |
| * ### .closeTo(actual, expected, delta, [message]) | |
| * | |
| * Asserts that the target is equal `expected`, to within a +/- `delta` range. | |
| * | |
| * assert.closeTo(1.5, 1, 0.5, 'numbers are close'); | |
| * | |
| * @name closeTo | |
| * @param {Number} actual | |
| * @param {Number} expected | |
| * @param {Number} delta | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.closeTo = function (act, exp, delta, msg) { | |
| new Assertion(act, msg).to.be.closeTo(exp, delta); | |
| }; | |
| /** | |
| * ### .sameMembers(set1, set2, [message]) | |
| * | |
| * Asserts that `set1` and `set2` have the same members. | |
| * Order is not taken into account. | |
| * | |
| * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members'); | |
| * | |
| * @name sameMembers | |
| * @param {Array} set1 | |
| * @param {Array} set2 | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.sameMembers = function (set1, set2, msg) { | |
| new Assertion(set1, msg).to.have.same.members(set2); | |
| } | |
| /** | |
| * ### .includeMembers(superset, subset, [message]) | |
| * | |
| * Asserts that `subset` is included in `superset`. | |
| * Order is not taken into account. | |
| * | |
| * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members'); | |
| * | |
| * @name includeMembers | |
| * @param {Array} superset | |
| * @param {Array} subset | |
| * @param {String} message | |
| * @api public | |
| */ | |
| assert.includeMembers = function (superset, subset, msg) { | |
| new Assertion(superset, msg).to.include.members(subset); | |
| } | |
| /*! | |
| * Undocumented / untested | |
| */ | |
| assert.ifError = function (val, msg) { | |
| new Assertion(val, msg).to.not.be.ok; | |
| }; | |
| /*! | |
| * Aliases. | |
| */ | |
| (function alias(name, as){ | |
| assert[as] = assert[name]; | |
| return alias; | |
| }) | |
| ('Throw', 'throw') | |
| ('Throw', 'throws'); | |
| }; | |
| /***/ }, | |
| /* 24 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * chai | |
| * Copyright(c) 2011 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /*! | |
| * Main exports | |
| */ | |
| var exports = module.exports = {}; | |
| /*! | |
| * test utility | |
| */ | |
| exports.test = __webpack_require__(26); | |
| /*! | |
| * type utility | |
| */ | |
| exports.type = __webpack_require__(27); | |
| /*! | |
| * message utility | |
| */ | |
| exports.getMessage = __webpack_require__(28); | |
| /*! | |
| * actual utility | |
| */ | |
| exports.getActual = __webpack_require__(29); | |
| /*! | |
| * Inspect util | |
| */ | |
| exports.inspect = __webpack_require__(30); | |
| /*! | |
| * Object Display util | |
| */ | |
| exports.objDisplay = __webpack_require__(31); | |
| /*! | |
| * Flag utility | |
| */ | |
| exports.flag = __webpack_require__(32); | |
| /*! | |
| * Flag transferring utility | |
| */ | |
| exports.transferFlags = __webpack_require__(33); | |
| /*! | |
| * Deep equal utility | |
| */ | |
| exports.eql = __webpack_require__(42); | |
| /*! | |
| * Deep path value | |
| */ | |
| exports.getPathValue = __webpack_require__(34); | |
| /*! | |
| * Function name | |
| */ | |
| exports.getName = __webpack_require__(35); | |
| /*! | |
| * add Property | |
| */ | |
| exports.addProperty = __webpack_require__(36); | |
| /*! | |
| * add Method | |
| */ | |
| exports.addMethod = __webpack_require__(37); | |
| /*! | |
| * overwrite Property | |
| */ | |
| exports.overwriteProperty = __webpack_require__(38); | |
| /*! | |
| * overwrite Method | |
| */ | |
| exports.overwriteMethod = __webpack_require__(39); | |
| /*! | |
| * Add a chainable method | |
| */ | |
| exports.addChainableMethod = __webpack_require__(40); | |
| /*! | |
| * Overwrite chainable method | |
| */ | |
| exports.overwriteChainableMethod = __webpack_require__(41); | |
| /***/ }, | |
| /* 25 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * assertion-error | |
| * Copyright(c) 2013 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /*! | |
| * Return a function that will copy properties from | |
| * one object to another excluding any originally | |
| * listed. Returned function will create a new `{}`. | |
| * | |
| * @param {String} excluded properties ... | |
| * @return {Function} | |
| */ | |
| function exclude () { | |
| var excludes = [].slice.call(arguments); | |
| function excludeProps (res, obj) { | |
| Object.keys(obj).forEach(function (key) { | |
| if (!~excludes.indexOf(key)) res[key] = obj[key]; | |
| }); | |
| } | |
| return function extendExclude () { | |
| var args = [].slice.call(arguments) | |
| , i = 0 | |
| , res = {}; | |
| for (; i < args.length; i++) { | |
| excludeProps(res, args[i]); | |
| } | |
| return res; | |
| }; | |
| }; | |
| /*! | |
| * Primary Exports | |
| */ | |
| module.exports = AssertionError; | |
| /** | |
| * ### AssertionError | |
| * | |
| * An extension of the JavaScript `Error` constructor for | |
| * assertion and validation scenarios. | |
| * | |
| * @param {String} message | |
| * @param {Object} properties to include (optional) | |
| * @param {callee} start stack function (optional) | |
| */ | |
| function AssertionError (message, _props, ssf) { | |
| var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON') | |
| , props = extend(_props || {}); | |
| // default values | |
| this.message = message || 'Unspecified AssertionError'; | |
| this.showDiff = false; | |
| // copy from properties | |
| for (var key in props) { | |
| this[key] = props[key]; | |
| } | |
| // capture stack trace | |
| ssf = ssf || arguments.callee; | |
| if (ssf && Error.captureStackTrace) { | |
| Error.captureStackTrace(this, ssf); | |
| } | |
| } | |
| /*! | |
| * Inherit from Error.prototype | |
| */ | |
| AssertionError.prototype = Object.create(Error.prototype); | |
| /*! | |
| * Statically set name | |
| */ | |
| AssertionError.prototype.name = 'AssertionError'; | |
| /*! | |
| * Ensure correct constructor | |
| */ | |
| AssertionError.prototype.constructor = AssertionError; | |
| /** | |
| * Allow errors to be converted to JSON for static transfer. | |
| * | |
| * @param {Boolean} include stack (default: `true`) | |
| * @return {Object} object that can be `JSON.stringify` | |
| */ | |
| AssertionError.prototype.toJSON = function (stack) { | |
| var extend = exclude('constructor', 'toJSON', 'stack') | |
| , props = extend({ name: this.name }, this); | |
| // include stack if exists and not turned off | |
| if (false !== stack && this.stack) { | |
| props.stack = this.stack; | |
| } | |
| return props; | |
| }; | |
| /***/ }, | |
| /* 26 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - test utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /*! | |
| * Module dependancies | |
| */ | |
| var flag = __webpack_require__(32); | |
| /** | |
| * # test(object, expression) | |
| * | |
| * Test and object for expression. | |
| * | |
| * @param {Object} object (constructed Assertion) | |
| * @param {Arguments} chai.Assertion.prototype.assert arguments | |
| */ | |
| module.exports = function (obj, args) { | |
| var negate = flag(obj, 'negate') | |
| , expr = args[0]; | |
| return negate ? !expr : expr; | |
| }; | |
| /***/ }, | |
| /* 27 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - type utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /*! | |
| * Detectable javascript natives | |
| */ | |
| var natives = { | |
| '[object Arguments]': 'arguments' | |
| , '[object Array]': 'array' | |
| , '[object Date]': 'date' | |
| , '[object Function]': 'function' | |
| , '[object Number]': 'number' | |
| , '[object RegExp]': 'regexp' | |
| , '[object String]': 'string' | |
| }; | |
| /** | |
| * ### type(object) | |
| * | |
| * Better implementation of `typeof` detection that can | |
| * be used cross-browser. Handles the inconsistencies of | |
| * Array, `null`, and `undefined` detection. | |
| * | |
| * utils.type({}) // 'object' | |
| * utils.type(null) // `null' | |
| * utils.type(undefined) // `undefined` | |
| * utils.type([]) // `array` | |
| * | |
| * @param {Mixed} object to detect type of | |
| * @name type | |
| * @api private | |
| */ | |
| module.exports = function (obj) { | |
| var str = Object.prototype.toString.call(obj); | |
| if (natives[str]) return natives[str]; | |
| if (obj === null) return 'null'; | |
| if (obj === undefined) return 'undefined'; | |
| if (obj === Object(obj)) return 'object'; | |
| return typeof obj; | |
| }; | |
| /***/ }, | |
| /* 28 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - message composition utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /*! | |
| * Module dependancies | |
| */ | |
| var flag = __webpack_require__(32) | |
| , getActual = __webpack_require__(29) | |
| , inspect = __webpack_require__(30) | |
| , objDisplay = __webpack_require__(31); | |
| /** | |
| * ### .getMessage(object, message, negateMessage) | |
| * | |
| * Construct the error message based on flags | |
| * and template tags. Template tags will return | |
| * a stringified inspection of the object referenced. | |
| * | |
| * Message template tags: | |
| * - `#{this}` current asserted object | |
| * - `#{act}` actual value | |
| * - `#{exp}` expected value | |
| * | |
| * @param {Object} object (constructed Assertion) | |
| * @param {Arguments} chai.Assertion.prototype.assert arguments | |
| * @name getMessage | |
| * @api public | |
| */ | |
| module.exports = function (obj, args) { | |
| var negate = flag(obj, 'negate') | |
| , val = flag(obj, 'object') | |
| , expected = args[3] | |
| , actual = getActual(obj, args) | |
| , msg = negate ? args[2] : args[1] | |
| , flagMsg = flag(obj, 'message'); | |
| if(typeof msg === "function") msg = msg(); | |
| msg = msg || ''; | |
| msg = msg | |
| .replace(/#{this}/g, objDisplay(val)) | |
| .replace(/#{act}/g, objDisplay(actual)) | |
| .replace(/#{exp}/g, objDisplay(expected)); | |
| return flagMsg ? flagMsg + ': ' + msg : msg; | |
| }; | |
| /***/ }, | |
| /* 29 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - getActual utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * # getActual(object, [actual]) | |
| * | |
| * Returns the `actual` value for an Assertion | |
| * | |
| * @param {Object} object (constructed Assertion) | |
| * @param {Arguments} chai.Assertion.prototype.assert arguments | |
| */ | |
| module.exports = function (obj, args) { | |
| return args.length > 4 ? args[4] : obj._obj; | |
| }; | |
| /***/ }, | |
| /* 30 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| // This is (almost) directly from Node.js utils | |
| // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js | |
| var getName = __webpack_require__(35); | |
| var getProperties = __webpack_require__(43); | |
| var getEnumerableProperties = __webpack_require__(44); | |
| module.exports = inspect; | |
| /** | |
| * 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 {Boolean} showHidden Flag that shows hidden (not enumerable) | |
| * properties of objects. | |
| * @param {Number} depth Depth in which to descend in object. Default is 2. | |
| * @param {Boolean} colors Flag to turn on ANSI escape codes to color the | |
| * output. Default is false (no coloring). | |
| */ | |
| function inspect(obj, showHidden, depth, colors) { | |
| var ctx = { | |
| showHidden: showHidden, | |
| seen: [], | |
| stylize: function (str) { return str; } | |
| }; | |
| return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth)); | |
| } | |
| // Returns true if object is a DOM element. | |
| var isDOMElement = function (object) { | |
| if (typeof HTMLElement === 'object') { | |
| return object instanceof HTMLElement; | |
| } else { | |
| return object && | |
| typeof object === 'object' && | |
| object.nodeType === 1 && | |
| typeof object.nodeName === 'string'; | |
| } | |
| }; | |
| 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 (value && typeof value.inspect === 'function' && | |
| // 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); | |
| if (typeof ret !== 'string') { | |
| ret = formatValue(ctx, ret, recurseTimes); | |
| } | |
| return ret; | |
| } | |
| // Primitive types cannot have properties | |
| var primitive = formatPrimitive(ctx, value); | |
| if (primitive) { | |
| return primitive; | |
| } | |
| // If this is a DOM element, try to get the outer HTML. | |
| if (isDOMElement(value)) { | |
| if ('outerHTML' in value) { | |
| return value.outerHTML; | |
| // This value does not have an outerHTML attribute, | |
| // it could still be an XML element | |
| } else { | |
| // Attempt to serialize it | |
| try { | |
| if (document.xmlVersion) { | |
| var xmlSerializer = new XMLSerializer(); | |
| return xmlSerializer.serializeToString(value); | |
| } else { | |
| // Firefox 11- do not support outerHTML | |
| // It does, however, support innerHTML | |
| // Use the following to render the element | |
| var ns = "http://www.w3.org/1999/xhtml"; | |
| var container = document.createElementNS(ns, '_'); | |
| container.appendChild(value.cloneNode(false)); | |
| html = container.innerHTML | |
| .replace('><', '>' + value.innerHTML + '<'); | |
| container.innerHTML = ''; | |
| return html; | |
| } | |
| } catch (err) { | |
| // This could be a non-native DOM implementation, | |
| // continue with the normal flow: | |
| // printing the element as if it is an object. | |
| } | |
| } | |
| } | |
| // Look up the keys of the object. | |
| var visibleKeys = getEnumerableProperties(value); | |
| var keys = ctx.showHidden ? getProperties(value) : visibleKeys; | |
| // Some type of object without properties can be shortcutted. | |
| // In IE, errors have a single `stack` property, or if they are vanilla `Error`, | |
| // a `stack` plus `description` property; ignore those for consistency. | |
| if (keys.length === 0 || (isError(value) && ( | |
| (keys.length === 1 && keys[0] === 'stack') || | |
| (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack') | |
| ))) { | |
| if (typeof value === 'function') { | |
| var name = getName(value); | |
| var nameSuffix = name ? ': ' + name : ''; | |
| return ctx.stylize('[Function' + nameSuffix + ']', 'special'); | |
| } | |
| if (isRegExp(value)) { | |
| return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); | |
| } | |
| if (isDate(value)) { | |
| return ctx.stylize(Date.prototype.toUTCString.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 (typeof value === 'function') { | |
| var name = getName(value); | |
| var nameSuffix = name ? ': ' + name : ''; | |
| base = ' [Function' + nameSuffix + ']'; | |
| } | |
| // 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)) { | |
| return 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) { | |
| switch (typeof value) { | |
| case 'undefined': | |
| return ctx.stylize('undefined', 'undefined'); | |
| case 'string': | |
| var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') | |
| .replace(/'/g, "\\'") | |
| .replace(/\\"/g, '"') + '\''; | |
| return ctx.stylize(simple, 'string'); | |
| case 'number': | |
| if (value === 0 && (1/value) === -Infinity) { | |
| return ctx.stylize('-0', 'number'); | |
| } | |
| return ctx.stylize('' + value, 'number'); | |
| case 'boolean': | |
| return ctx.stylize('' + value, 'boolean'); | |
| } | |
| // For some reason typeof null is "object", so special case here. | |
| if (value === null) { | |
| 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 (Object.prototype.hasOwnProperty.call(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; | |
| if (value.__lookupGetter__) { | |
| if (value.__lookupGetter__(key)) { | |
| if (value.__lookupSetter__(key)) { | |
| str = ctx.stylize('[Getter/Setter]', 'special'); | |
| } else { | |
| str = ctx.stylize('[Getter]', 'special'); | |
| } | |
| } else { | |
| if (value.__lookupSetter__(key)) { | |
| str = ctx.stylize('[Setter]', 'special'); | |
| } | |
| } | |
| } | |
| if (visibleKeys.indexOf(key) < 0) { | |
| name = '[' + key + ']'; | |
| } | |
| if (!str) { | |
| if (ctx.seen.indexOf(value[key]) < 0) { | |
| if (recurseTimes === null) { | |
| str = formatValue(ctx, value[key], null); | |
| } else { | |
| str = formatValue(ctx, value[key], 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 (typeof name === 'undefined') { | |
| 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.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]; | |
| } | |
| function isArray(ar) { | |
| return Array.isArray(ar) || | |
| (typeof ar === 'object' && objectToString(ar) === '[object Array]'); | |
| } | |
| function isRegExp(re) { | |
| return typeof re === 'object' && objectToString(re) === '[object RegExp]'; | |
| } | |
| function isDate(d) { | |
| return typeof d === 'object' && objectToString(d) === '[object Date]'; | |
| } | |
| function isError(e) { | |
| return typeof e === 'object' && objectToString(e) === '[object Error]'; | |
| } | |
| function objectToString(o) { | |
| return Object.prototype.toString.call(o); | |
| } | |
| /***/ }, | |
| /* 31 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - flag utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /*! | |
| * Module dependancies | |
| */ | |
| var inspect = __webpack_require__(30); | |
| var config = __webpack_require__(18); | |
| /** | |
| * ### .objDisplay (object) | |
| * | |
| * Determines if an object or an array matches | |
| * criteria to be inspected in-line for error | |
| * messages or should be truncated. | |
| * | |
| * @param {Mixed} javascript object to inspect | |
| * @name objDisplay | |
| * @api public | |
| */ | |
| module.exports = function (obj) { | |
| var str = inspect(obj) | |
| , type = Object.prototype.toString.call(obj); | |
| if (config.truncateThreshold && str.length >= config.truncateThreshold) { | |
| if (type === '[object Function]') { | |
| return !obj.name || obj.name === '' | |
| ? '[Function]' | |
| : '[Function: ' + obj.name + ']'; | |
| } else if (type === '[object Array]') { | |
| return '[ Array(' + obj.length + ') ]'; | |
| } else if (type === '[object Object]') { | |
| var keys = Object.keys(obj) | |
| , kstr = keys.length > 2 | |
| ? keys.splice(0, 2).join(', ') + ', ...' | |
| : keys.join(', '); | |
| return '{ Object (' + kstr + ') }'; | |
| } else { | |
| return str; | |
| } | |
| } else { | |
| return str; | |
| } | |
| }; | |
| /***/ }, | |
| /* 32 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - flag utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * ### flag(object ,key, [value]) | |
| * | |
| * Get or set a flag value on an object. If a | |
| * value is provided it will be set, else it will | |
| * return the currently set value or `undefined` if | |
| * the value is not set. | |
| * | |
| * utils.flag(this, 'foo', 'bar'); // setter | |
| * utils.flag(this, 'foo'); // getter, returns `bar` | |
| * | |
| * @param {Object} object (constructed Assertion | |
| * @param {String} key | |
| * @param {Mixed} value (optional) | |
| * @name flag | |
| * @api private | |
| */ | |
| module.exports = function (obj, key, value) { | |
| var flags = obj.__flags || (obj.__flags = Object.create(null)); | |
| if (arguments.length === 3) { | |
| flags[key] = value; | |
| } else { | |
| return flags[key]; | |
| } | |
| }; | |
| /***/ }, | |
| /* 33 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - transferFlags utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * ### transferFlags(assertion, object, includeAll = true) | |
| * | |
| * Transfer all the flags for `assertion` to `object`. If | |
| * `includeAll` is set to `false`, then the base Chai | |
| * assertion flags (namely `object`, `ssfi`, and `message`) | |
| * will not be transferred. | |
| * | |
| * | |
| * var newAssertion = new Assertion(); | |
| * utils.transferFlags(assertion, newAssertion); | |
| * | |
| * var anotherAsseriton = new Assertion(myObj); | |
| * utils.transferFlags(assertion, anotherAssertion, false); | |
| * | |
| * @param {Assertion} assertion the assertion to transfer the flags from | |
| * @param {Object} object the object to transfer the flags too; usually a new assertion | |
| * @param {Boolean} includeAll | |
| * @name getAllFlags | |
| * @api private | |
| */ | |
| module.exports = function (assertion, object, includeAll) { | |
| var flags = assertion.__flags || (assertion.__flags = Object.create(null)); | |
| if (!object.__flags) { | |
| object.__flags = Object.create(null); | |
| } | |
| includeAll = arguments.length === 3 ? includeAll : true; | |
| for (var flag in flags) { | |
| if (includeAll || | |
| (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) { | |
| object.__flags[flag] = flags[flag]; | |
| } | |
| } | |
| }; | |
| /***/ }, | |
| /* 34 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - getPathValue utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * @see https://github.com/logicalparadox/filtr | |
| * MIT Licensed | |
| */ | |
| /** | |
| * ### .getPathValue(path, object) | |
| * | |
| * This allows the retrieval of values in an | |
| * object given a string path. | |
| * | |
| * var obj = { | |
| * prop1: { | |
| * arr: ['a', 'b', 'c'] | |
| * , str: 'Hello' | |
| * } | |
| * , prop2: { | |
| * arr: [ { nested: 'Universe' } ] | |
| * , str: 'Hello again!' | |
| * } | |
| * } | |
| * | |
| * The following would be the results. | |
| * | |
| * getPathValue('prop1.str', obj); // Hello | |
| * getPathValue('prop1.att[2]', obj); // b | |
| * getPathValue('prop2.arr[0].nested', obj); // Universe | |
| * | |
| * @param {String} path | |
| * @param {Object} object | |
| * @returns {Object} value or `undefined` | |
| * @name getPathValue | |
| * @api public | |
| */ | |
| var getPathValue = module.exports = function (path, obj) { | |
| var parsed = parsePath(path); | |
| return _getPathValue(parsed, obj); | |
| }; | |
| /*! | |
| * ## parsePath(path) | |
| * | |
| * Helper function used to parse string object | |
| * paths. Use in conjunction with `_getPathValue`. | |
| * | |
| * var parsed = parsePath('myobject.property.subprop'); | |
| * | |
| * ### Paths: | |
| * | |
| * * Can be as near infinitely deep and nested | |
| * * Arrays are also valid using the formal `myobject.document[3].property`. | |
| * | |
| * @param {String} path | |
| * @returns {Object} parsed | |
| * @api private | |
| */ | |
| function parsePath (path) { | |
| var str = path.replace(/\[/g, '.[') | |
| , parts = str.match(/(\\\.|[^.]+?)+/g); | |
| return parts.map(function (value) { | |
| var re = /\[(\d+)\]$/ | |
| , mArr = re.exec(value) | |
| if (mArr) return { i: parseFloat(mArr[1]) }; | |
| else return { p: value }; | |
| }); | |
| }; | |
| /*! | |
| * ## _getPathValue(parsed, obj) | |
| * | |
| * Helper companion function for `.parsePath` that returns | |
| * the value located at the parsed address. | |
| * | |
| * var value = getPathValue(parsed, obj); | |
| * | |
| * @param {Object} parsed definition from `parsePath`. | |
| * @param {Object} object to search against | |
| * @returns {Object|Undefined} value | |
| * @api private | |
| */ | |
| function _getPathValue (parsed, obj) { | |
| var tmp = obj | |
| , res; | |
| for (var i = 0, l = parsed.length; i < l; i++) { | |
| var part = parsed[i]; | |
| if (tmp) { | |
| if ('undefined' !== typeof part.p) | |
| tmp = tmp[part.p]; | |
| else if ('undefined' !== typeof part.i) | |
| tmp = tmp[part.i]; | |
| if (i == (l - 1)) res = tmp; | |
| } else { | |
| res = undefined; | |
| } | |
| } | |
| return res; | |
| }; | |
| /***/ }, | |
| /* 35 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - getName utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * # getName(func) | |
| * | |
| * Gets the name of a function, in a cross-browser way. | |
| * | |
| * @param {Function} a function (usually a constructor) | |
| */ | |
| module.exports = function (func) { | |
| if (func.name) return func.name; | |
| var match = /^\s?function ([^(]*)\(/.exec(func); | |
| return match && match[1] ? match[1] : ""; | |
| }; | |
| /***/ }, | |
| /* 36 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - addProperty utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * ### addProperty (ctx, name, getter) | |
| * | |
| * Adds a property to the prototype of an object. | |
| * | |
| * utils.addProperty(chai.Assertion.prototype, 'foo', function () { | |
| * var obj = utils.flag(this, 'object'); | |
| * new chai.Assertion(obj).to.be.instanceof(Foo); | |
| * }); | |
| * | |
| * Can also be accessed directly from `chai.Assertion`. | |
| * | |
| * chai.Assertion.addProperty('foo', fn); | |
| * | |
| * Then can be used as any other assertion. | |
| * | |
| * expect(myFoo).to.be.foo; | |
| * | |
| * @param {Object} ctx object to which the property is added | |
| * @param {String} name of property to add | |
| * @param {Function} getter function to be used for name | |
| * @name addProperty | |
| * @api public | |
| */ | |
| module.exports = function (ctx, name, getter) { | |
| Object.defineProperty(ctx, name, | |
| { get: function () { | |
| var result = getter.call(this); | |
| return result === undefined ? this : result; | |
| } | |
| , configurable: true | |
| }); | |
| }; | |
| /***/ }, | |
| /* 37 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - addMethod utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| var config = __webpack_require__(18); | |
| /** | |
| * ### .addMethod (ctx, name, method) | |
| * | |
| * Adds a method to the prototype of an object. | |
| * | |
| * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) { | |
| * var obj = utils.flag(this, 'object'); | |
| * new chai.Assertion(obj).to.be.equal(str); | |
| * }); | |
| * | |
| * Can also be accessed directly from `chai.Assertion`. | |
| * | |
| * chai.Assertion.addMethod('foo', fn); | |
| * | |
| * Then can be used as any other assertion. | |
| * | |
| * expect(fooStr).to.be.foo('bar'); | |
| * | |
| * @param {Object} ctx object to which the method is added | |
| * @param {String} name of method to add | |
| * @param {Function} method function to be used for name | |
| * @name addMethod | |
| * @api public | |
| */ | |
| var flag = __webpack_require__(32); | |
| module.exports = function (ctx, name, method) { | |
| ctx[name] = function () { | |
| var old_ssfi = flag(this, 'ssfi'); | |
| if (old_ssfi && config.includeStack === false) | |
| flag(this, 'ssfi', ctx[name]); | |
| var result = method.apply(this, arguments); | |
| return result === undefined ? this : result; | |
| }; | |
| }; | |
| /***/ }, | |
| /* 38 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - overwriteProperty utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * ### overwriteProperty (ctx, name, fn) | |
| * | |
| * Overwites an already existing property getter and provides | |
| * access to previous value. Must return function to use as getter. | |
| * | |
| * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) { | |
| * return function () { | |
| * var obj = utils.flag(this, 'object'); | |
| * if (obj instanceof Foo) { | |
| * new chai.Assertion(obj.name).to.equal('bar'); | |
| * } else { | |
| * _super.call(this); | |
| * } | |
| * } | |
| * }); | |
| * | |
| * | |
| * Can also be accessed directly from `chai.Assertion`. | |
| * | |
| * chai.Assertion.overwriteProperty('foo', fn); | |
| * | |
| * Then can be used as any other assertion. | |
| * | |
| * expect(myFoo).to.be.ok; | |
| * | |
| * @param {Object} ctx object whose property is to be overwritten | |
| * @param {String} name of property to overwrite | |
| * @param {Function} getter function that returns a getter function to be used for name | |
| * @name overwriteProperty | |
| * @api public | |
| */ | |
| module.exports = function (ctx, name, getter) { | |
| var _get = Object.getOwnPropertyDescriptor(ctx, name) | |
| , _super = function () {}; | |
| if (_get && 'function' === typeof _get.get) | |
| _super = _get.get | |
| Object.defineProperty(ctx, name, | |
| { get: function () { | |
| var result = getter(_super).call(this); | |
| return result === undefined ? this : result; | |
| } | |
| , configurable: true | |
| }); | |
| }; | |
| /***/ }, | |
| /* 39 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - overwriteMethod utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * ### overwriteMethod (ctx, name, fn) | |
| * | |
| * Overwites an already existing method and provides | |
| * access to previous function. Must return function | |
| * to be used for name. | |
| * | |
| * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) { | |
| * return function (str) { | |
| * var obj = utils.flag(this, 'object'); | |
| * if (obj instanceof Foo) { | |
| * new chai.Assertion(obj.value).to.equal(str); | |
| * } else { | |
| * _super.apply(this, arguments); | |
| * } | |
| * } | |
| * }); | |
| * | |
| * Can also be accessed directly from `chai.Assertion`. | |
| * | |
| * chai.Assertion.overwriteMethod('foo', fn); | |
| * | |
| * Then can be used as any other assertion. | |
| * | |
| * expect(myFoo).to.equal('bar'); | |
| * | |
| * @param {Object} ctx object whose method is to be overwritten | |
| * @param {String} name of method to overwrite | |
| * @param {Function} method function that returns a function to be used for name | |
| * @name overwriteMethod | |
| * @api public | |
| */ | |
| module.exports = function (ctx, name, method) { | |
| var _method = ctx[name] | |
| , _super = function () { return this; }; | |
| if (_method && 'function' === typeof _method) | |
| _super = _method; | |
| ctx[name] = function () { | |
| var result = method(_super).apply(this, arguments); | |
| return result === undefined ? this : result; | |
| } | |
| }; | |
| /***/ }, | |
| /* 40 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - addChainingMethod utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /*! | |
| * Module dependencies | |
| */ | |
| var transferFlags = __webpack_require__(33); | |
| var flag = __webpack_require__(32); | |
| var config = __webpack_require__(18); | |
| /*! | |
| * Module variables | |
| */ | |
| // Check whether `__proto__` is supported | |
| var hasProtoSupport = '__proto__' in Object; | |
| // Without `__proto__` support, this module will need to add properties to a function. | |
| // However, some Function.prototype methods cannot be overwritten, | |
| // and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69). | |
| var excludeNames = /^(?:length|name|arguments|caller)$/; | |
| // Cache `Function` properties | |
| var call = Function.prototype.call, | |
| apply = Function.prototype.apply; | |
| /** | |
| * ### addChainableMethod (ctx, name, method, chainingBehavior) | |
| * | |
| * Adds a method to an object, such that the method can also be chained. | |
| * | |
| * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) { | |
| * var obj = utils.flag(this, 'object'); | |
| * new chai.Assertion(obj).to.be.equal(str); | |
| * }); | |
| * | |
| * Can also be accessed directly from `chai.Assertion`. | |
| * | |
| * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior); | |
| * | |
| * The result can then be used as both a method assertion, executing both `method` and | |
| * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`. | |
| * | |
| * expect(fooStr).to.be.foo('bar'); | |
| * expect(fooStr).to.be.foo.equal('foo'); | |
| * | |
| * @param {Object} ctx object to which the method is added | |
| * @param {String} name of method to add | |
| * @param {Function} method function to be used for `name`, when called | |
| * @param {Function} chainingBehavior function to be called every time the property is accessed | |
| * @name addChainableMethod | |
| * @api public | |
| */ | |
| module.exports = function (ctx, name, method, chainingBehavior) { | |
| if (typeof chainingBehavior !== 'function') { | |
| chainingBehavior = function () { }; | |
| } | |
| var chainableBehavior = { | |
| method: method | |
| , chainingBehavior: chainingBehavior | |
| }; | |
| // save the methods so we can overwrite them later, if we need to. | |
| if (!ctx.__methods) { | |
| ctx.__methods = {}; | |
| } | |
| ctx.__methods[name] = chainableBehavior; | |
| Object.defineProperty(ctx, name, | |
| { get: function () { | |
| chainableBehavior.chainingBehavior.call(this); | |
| var assert = function assert() { | |
| var old_ssfi = flag(this, 'ssfi'); | |
| if (old_ssfi && config.includeStack === false) | |
| flag(this, 'ssfi', assert); | |
| var result = chainableBehavior.method.apply(this, arguments); | |
| return result === undefined ? this : result; | |
| }; | |
| // Use `__proto__` if available | |
| if (hasProtoSupport) { | |
| // Inherit all properties from the object by replacing the `Function` prototype | |
| var prototype = assert.__proto__ = Object.create(this); | |
| // Restore the `call` and `apply` methods from `Function` | |
| prototype.call = call; | |
| prototype.apply = apply; | |
| } | |
| // Otherwise, redefine all properties (slow!) | |
| else { | |
| var asserterNames = Object.getOwnPropertyNames(ctx); | |
| asserterNames.forEach(function (asserterName) { | |
| if (!excludeNames.test(asserterName)) { | |
| var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); | |
| Object.defineProperty(assert, asserterName, pd); | |
| } | |
| }); | |
| } | |
| transferFlags(this, assert); | |
| return assert; | |
| } | |
| , configurable: true | |
| }); | |
| }; | |
| /***/ }, | |
| /* 41 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - overwriteChainableMethod utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * ### overwriteChainableMethod (ctx, name, fn) | |
| * | |
| * Overwites an already existing chainable method | |
| * and provides access to the previous function or | |
| * property. Must return functions to be used for | |
| * name. | |
| * | |
| * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length', | |
| * function (_super) { | |
| * } | |
| * , function (_super) { | |
| * } | |
| * ); | |
| * | |
| * Can also be accessed directly from `chai.Assertion`. | |
| * | |
| * chai.Assertion.overwriteChainableMethod('foo', fn, fn); | |
| * | |
| * Then can be used as any other assertion. | |
| * | |
| * expect(myFoo).to.have.length(3); | |
| * expect(myFoo).to.have.length.above(3); | |
| * | |
| * @param {Object} ctx object whose method / property is to be overwritten | |
| * @param {String} name of method / property to overwrite | |
| * @param {Function} method function that returns a function to be used for name | |
| * @param {Function} chainingBehavior function that returns a function to be used for property | |
| * @name overwriteChainableMethod | |
| * @api public | |
| */ | |
| module.exports = function (ctx, name, method, chainingBehavior) { | |
| var chainableBehavior = ctx.__methods[name]; | |
| var _chainingBehavior = chainableBehavior.chainingBehavior; | |
| chainableBehavior.chainingBehavior = function () { | |
| var result = chainingBehavior(_chainingBehavior).call(this); | |
| return result === undefined ? this : result; | |
| }; | |
| var _method = chainableBehavior.method; | |
| chainableBehavior.method = function () { | |
| var result = method(_method).apply(this, arguments); | |
| return result === undefined ? this : result; | |
| }; | |
| }; | |
| /***/ }, | |
| /* 42 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| module.exports = __webpack_require__(45); | |
| /***/ }, | |
| /* 43 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - getProperties utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * ### .getProperties(object) | |
| * | |
| * This allows the retrieval of property names of an object, enumerable or not, | |
| * inherited or not. | |
| * | |
| * @param {Object} object | |
| * @returns {Array} | |
| * @name getProperties | |
| * @api public | |
| */ | |
| module.exports = function getProperties(object) { | |
| var result = Object.getOwnPropertyNames(subject); | |
| function addProperty(property) { | |
| if (result.indexOf(property) === -1) { | |
| result.push(property); | |
| } | |
| } | |
| var proto = Object.getPrototypeOf(subject); | |
| while (proto !== null) { | |
| Object.getOwnPropertyNames(proto).forEach(addProperty); | |
| proto = Object.getPrototypeOf(proto); | |
| } | |
| return result; | |
| }; | |
| /***/ }, | |
| /* 44 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * Chai - getEnumerableProperties utility | |
| * Copyright(c) 2012-2014 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /** | |
| * ### .getEnumerableProperties(object) | |
| * | |
| * This allows the retrieval of enumerable property names of an object, | |
| * inherited or not. | |
| * | |
| * @param {Object} object | |
| * @returns {Array} | |
| * @name getEnumerableProperties | |
| * @api public | |
| */ | |
| module.exports = function getEnumerableProperties(object) { | |
| var result = []; | |
| for (var name in object) { | |
| result.push(name); | |
| } | |
| return result; | |
| }; | |
| /***/ }, | |
| /* 45 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * deep-eql | |
| * Copyright(c) 2013 Jake Luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /*! | |
| * Module dependencies | |
| */ | |
| var type = __webpack_require__(47); | |
| /*! | |
| * Buffer.isBuffer browser shim | |
| */ | |
| var Buffer; | |
| try { Buffer = __webpack_require__(46).Buffer; } | |
| catch(ex) { | |
| Buffer = {}; | |
| Buffer.isBuffer = function() { return false; } | |
| } | |
| /*! | |
| * Primary Export | |
| */ | |
| module.exports = deepEqual; | |
| /** | |
| * Assert super-strict (egal) equality between | |
| * two objects of any type. | |
| * | |
| * @param {Mixed} a | |
| * @param {Mixed} b | |
| * @param {Array} memoised (optional) | |
| * @return {Boolean} equal match | |
| */ | |
| function deepEqual(a, b, m) { | |
| if (sameValue(a, b)) { | |
| return true; | |
| } else if ('date' === type(a)) { | |
| return dateEqual(a, b); | |
| } else if ('regexp' === type(a)) { | |
| return regexpEqual(a, b); | |
| } else if (Buffer.isBuffer(a)) { | |
| return bufferEqual(a, b); | |
| } else if ('arguments' === type(a)) { | |
| return argumentsEqual(a, b, m); | |
| } else if (!typeEqual(a, b)) { | |
| return false; | |
| } else if (('object' !== type(a) && 'object' !== type(b)) | |
| && ('array' !== type(a) && 'array' !== type(b))) { | |
| return sameValue(a, b); | |
| } else { | |
| return objectEqual(a, b, m); | |
| } | |
| } | |
| /*! | |
| * Strict (egal) equality test. Ensures that NaN always | |
| * equals NaN and `-0` does not equal `+0`. | |
| * | |
| * @param {Mixed} a | |
| * @param {Mixed} b | |
| * @return {Boolean} equal match | |
| */ | |
| function sameValue(a, b) { | |
| if (a === b) return a !== 0 || 1 / a === 1 / b; | |
| return a !== a && b !== b; | |
| } | |
| /*! | |
| * Compare the types of two given objects and | |
| * return if they are equal. Note that an Array | |
| * has a type of `array` (not `object`) and arguments | |
| * have a type of `arguments` (not `array`/`object`). | |
| * | |
| * @param {Mixed} a | |
| * @param {Mixed} b | |
| * @return {Boolean} result | |
| */ | |
| function typeEqual(a, b) { | |
| return type(a) === type(b); | |
| } | |
| /*! | |
| * Compare two Date objects by asserting that | |
| * the time values are equal using `saveValue`. | |
| * | |
| * @param {Date} a | |
| * @param {Date} b | |
| * @return {Boolean} result | |
| */ | |
| function dateEqual(a, b) { | |
| if ('date' !== type(b)) return false; | |
| return sameValue(a.getTime(), b.getTime()); | |
| } | |
| /*! | |
| * Compare two regular expressions by converting them | |
| * to string and checking for `sameValue`. | |
| * | |
| * @param {RegExp} a | |
| * @param {RegExp} b | |
| * @return {Boolean} result | |
| */ | |
| function regexpEqual(a, b) { | |
| if ('regexp' !== type(b)) return false; | |
| return sameValue(a.toString(), b.toString()); | |
| } | |
| /*! | |
| * Assert deep equality of two `arguments` objects. | |
| * Unfortunately, these must be sliced to arrays | |
| * prior to test to ensure no bad behavior. | |
| * | |
| * @param {Arguments} a | |
| * @param {Arguments} b | |
| * @param {Array} memoize (optional) | |
| * @return {Boolean} result | |
| */ | |
| function argumentsEqual(a, b, m) { | |
| if ('arguments' !== type(b)) return false; | |
| a = [].slice.call(a); | |
| b = [].slice.call(b); | |
| return deepEqual(a, b, m); | |
| } | |
| /*! | |
| * Get enumerable properties of a given object. | |
| * | |
| * @param {Object} a | |
| * @return {Array} property names | |
| */ | |
| function enumerable(a) { | |
| var res = []; | |
| for (var key in a) res.push(key); | |
| return res; | |
| } | |
| /*! | |
| * Simple equality for flat iterable objects | |
| * such as Arrays or Node.js buffers. | |
| * | |
| * @param {Iterable} a | |
| * @param {Iterable} b | |
| * @return {Boolean} result | |
| */ | |
| function iterableEqual(a, b) { | |
| if (a.length !== b.length) return false; | |
| var i = 0; | |
| var match = true; | |
| for (; i < a.length; i++) { | |
| if (a[i] !== b[i]) { | |
| match = false; | |
| break; | |
| } | |
| } | |
| return match; | |
| } | |
| /*! | |
| * Extension to `iterableEqual` specifically | |
| * for Node.js Buffers. | |
| * | |
| * @param {Buffer} a | |
| * @param {Mixed} b | |
| * @return {Boolean} result | |
| */ | |
| function bufferEqual(a, b) { | |
| if (!Buffer.isBuffer(b)) return false; | |
| return iterableEqual(a, b); | |
| } | |
| /*! | |
| * Block for `objectEqual` ensuring non-existing | |
| * values don't get in. | |
| * | |
| * @param {Mixed} object | |
| * @return {Boolean} result | |
| */ | |
| function isValue(a) { | |
| return a !== null && a !== undefined; | |
| } | |
| /*! | |
| * Recursively check the equality of two objects. | |
| * Once basic sameness has been established it will | |
| * defer to `deepEqual` for each enumerable key | |
| * in the object. | |
| * | |
| * @param {Mixed} a | |
| * @param {Mixed} b | |
| * @return {Boolean} result | |
| */ | |
| function objectEqual(a, b, m) { | |
| if (!isValue(a) || !isValue(b)) { | |
| return false; | |
| } | |
| if (a.prototype !== b.prototype) { | |
| return false; | |
| } | |
| var i; | |
| if (m) { | |
| for (i = 0; i < m.length; i++) { | |
| if ((m[i][0] === a && m[i][1] === b) | |
| || (m[i][0] === b && m[i][1] === a)) { | |
| return true; | |
| } | |
| } | |
| } else { | |
| m = []; | |
| } | |
| try { | |
| var ka = enumerable(a); | |
| var kb = enumerable(b); | |
| } catch (ex) { | |
| return false; | |
| } | |
| ka.sort(); | |
| kb.sort(); | |
| if (!iterableEqual(ka, kb)) { | |
| return false; | |
| } | |
| m.push([ a, b ]); | |
| var key; | |
| for (i = ka.length - 1; i >= 0; i--) { | |
| key = ka[i]; | |
| if (!deepEqual(a[key], b[key], m)) { | |
| return false; | |
| } | |
| } | |
| return true; | |
| } | |
| /***/ }, | |
| /* 46 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /* WEBPACK VAR INJECTION */(function(Buffer) {/*! | |
| * The buffer module from node.js, for the browser. | |
| * | |
| * @author Feross Aboukhadijeh <[email protected]> <http://feross.org> | |
| * @license MIT | |
| */ | |
| var base64 = __webpack_require__(51) | |
| var ieee754 = __webpack_require__(49) | |
| var isArray = __webpack_require__(50) | |
| exports.Buffer = Buffer | |
| exports.SlowBuffer = Buffer | |
| exports.INSPECT_MAX_BYTES = 50 | |
| Buffer.poolSize = 8192 // not used by this implementation | |
| var kMaxLength = 0x3fffffff | |
| /** | |
| * If `Buffer.TYPED_ARRAY_SUPPORT`: | |
| * === true Use Uint8Array implementation (fastest) | |
| * === false Use Object implementation (most compatible, even IE6) | |
| * | |
| * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, | |
| * Opera 11.6+, iOS 4.2+. | |
| * | |
| * Note: | |
| * | |
| * - Implementation must support adding new properties to `Uint8Array` instances. | |
| * Firefox 4-29 lacked support, fixed in Firefox 30+. | |
| * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. | |
| * | |
| * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. | |
| * | |
| * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of | |
| * incorrect length in some situations. | |
| * | |
| * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will | |
| * get the Object implementation, which is slower but will work correctly. | |
| */ | |
| Buffer.TYPED_ARRAY_SUPPORT = (function () { | |
| try { | |
| var buf = new ArrayBuffer(0) | |
| var arr = new Uint8Array(buf) | |
| arr.foo = function () { return 42 } | |
| return 42 === arr.foo() && // typed array instances can be augmented | |
| typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` | |
| new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` | |
| } catch (e) { | |
| return false | |
| } | |
| })() | |
| /** | |
| * Class: Buffer | |
| * ============= | |
| * | |
| * The Buffer constructor returns instances of `Uint8Array` that are augmented | |
| * with function properties for all the node `Buffer` API functions. We use | |
| * `Uint8Array` so that square bracket notation works as expected -- it returns | |
| * a single octet. | |
| * | |
| * By augmenting the instances, we can avoid modifying the `Uint8Array` | |
| * prototype. | |
| */ | |
| function Buffer (subject, encoding, noZero) { | |
| if (!(this instanceof Buffer)) | |
| return new Buffer(subject, encoding, noZero) | |
| var type = typeof subject | |
| // Find the length | |
| var length | |
| if (type === 'number') | |
| length = subject > 0 ? subject >>> 0 : 0 | |
| else if (type === 'string') { | |
| if (encoding === 'base64') | |
| subject = base64clean(subject) | |
| length = Buffer.byteLength(subject, encoding) | |
| } else if (type === 'object' && subject !== null) { // assume object is array-like | |
| if (subject.type === 'Buffer' && isArray(subject.data)) | |
| subject = subject.data | |
| length = +subject.length > 0 ? Math.floor(+subject.length) : 0 | |
| } else | |
| throw new TypeError('must start with number, buffer, array or string') | |
| if (this.length > kMaxLength) | |
| throw new RangeError('Attempt to allocate Buffer larger than maximum ' + | |
| 'size: 0x' + kMaxLength.toString(16) + ' bytes') | |
| var buf | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| // Preferred: Return an augmented `Uint8Array` instance for best performance | |
| buf = Buffer._augment(new Uint8Array(length)) | |
| } else { | |
| // Fallback: Return THIS instance of Buffer (created by `new`) | |
| buf = this | |
| buf.length = length | |
| buf._isBuffer = true | |
| } | |
| var i | |
| if (Buffer.TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') { | |
| // Speed optimization -- use set if we're copying from a typed array | |
| buf._set(subject) | |
| } else if (isArrayish(subject)) { | |
| // Treat array-ish objects as a byte array | |
| if (Buffer.isBuffer(subject)) { | |
| for (i = 0; i < length; i++) | |
| buf[i] = subject.readUInt8(i) | |
| } else { | |
| for (i = 0; i < length; i++) | |
| buf[i] = ((subject[i] % 256) + 256) % 256 | |
| } | |
| } else if (type === 'string') { | |
| buf.write(subject, 0, encoding) | |
| } else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT && !noZero) { | |
| for (i = 0; i < length; i++) { | |
| buf[i] = 0 | |
| } | |
| } | |
| return buf | |
| } | |
| Buffer.isBuffer = function (b) { | |
| return !!(b != null && b._isBuffer) | |
| } | |
| Buffer.compare = function (a, b) { | |
| if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) | |
| throw new TypeError('Arguments must be Buffers') | |
| var x = a.length | |
| var y = b.length | |
| for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {} | |
| if (i !== len) { | |
| x = a[i] | |
| y = b[i] | |
| } | |
| if (x < y) return -1 | |
| if (y < x) return 1 | |
| return 0 | |
| } | |
| Buffer.isEncoding = function (encoding) { | |
| switch (String(encoding).toLowerCase()) { | |
| case 'hex': | |
| case 'utf8': | |
| case 'utf-8': | |
| case 'ascii': | |
| case 'binary': | |
| case 'base64': | |
| case 'raw': | |
| case 'ucs2': | |
| case 'ucs-2': | |
| case 'utf16le': | |
| case 'utf-16le': | |
| return true | |
| default: | |
| return false | |
| } | |
| } | |
| Buffer.concat = function (list, totalLength) { | |
| if (!isArray(list)) throw new TypeError('Usage: Buffer.concat(list[, length])') | |
| if (list.length === 0) { | |
| return new Buffer(0) | |
| } else if (list.length === 1) { | |
| return list[0] | |
| } | |
| var i | |
| if (totalLength === undefined) { | |
| totalLength = 0 | |
| for (i = 0; i < list.length; i++) { | |
| totalLength += list[i].length | |
| } | |
| } | |
| var buf = new Buffer(totalLength) | |
| var pos = 0 | |
| for (i = 0; i < list.length; i++) { | |
| var item = list[i] | |
| item.copy(buf, pos) | |
| pos += item.length | |
| } | |
| return buf | |
| } | |
| Buffer.byteLength = function (str, encoding) { | |
| var ret | |
| str = str + '' | |
| switch (encoding || 'utf8') { | |
| case 'ascii': | |
| case 'binary': | |
| case 'raw': | |
| ret = str.length | |
| break | |
| case 'ucs2': | |
| case 'ucs-2': | |
| case 'utf16le': | |
| case 'utf-16le': | |
| ret = str.length * 2 | |
| break | |
| case 'hex': | |
| ret = str.length >>> 1 | |
| break | |
| case 'utf8': | |
| case 'utf-8': | |
| ret = utf8ToBytes(str).length | |
| break | |
| case 'base64': | |
| ret = base64ToBytes(str).length | |
| break | |
| default: | |
| ret = str.length | |
| } | |
| return ret | |
| } | |
| // pre-set for values that may exist in the future | |
| Buffer.prototype.length = undefined | |
| Buffer.prototype.parent = undefined | |
| // toString(encoding, start=0, end=buffer.length) | |
| Buffer.prototype.toString = function (encoding, start, end) { | |
| var loweredCase = false | |
| start = start >>> 0 | |
| end = end === undefined || end === Infinity ? this.length : end >>> 0 | |
| if (!encoding) encoding = 'utf8' | |
| if (start < 0) start = 0 | |
| if (end > this.length) end = this.length | |
| if (end <= start) return '' | |
| while (true) { | |
| switch (encoding) { | |
| case 'hex': | |
| return hexSlice(this, start, end) | |
| case 'utf8': | |
| case 'utf-8': | |
| return utf8Slice(this, start, end) | |
| case 'ascii': | |
| return asciiSlice(this, start, end) | |
| case 'binary': | |
| return binarySlice(this, start, end) | |
| case 'base64': | |
| return base64Slice(this, start, end) | |
| case 'ucs2': | |
| case 'ucs-2': | |
| case 'utf16le': | |
| case 'utf-16le': | |
| return utf16leSlice(this, start, end) | |
| default: | |
| if (loweredCase) | |
| throw new TypeError('Unknown encoding: ' + encoding) | |
| encoding = (encoding + '').toLowerCase() | |
| loweredCase = true | |
| } | |
| } | |
| } | |
| Buffer.prototype.equals = function (b) { | |
| if(!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') | |
| return Buffer.compare(this, b) === 0 | |
| } | |
| Buffer.prototype.inspect = function () { | |
| var str = '' | |
| var max = exports.INSPECT_MAX_BYTES | |
| if (this.length > 0) { | |
| str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') | |
| if (this.length > max) | |
| str += ' ... ' | |
| } | |
| return '<Buffer ' + str + '>' | |
| } | |
| Buffer.prototype.compare = function (b) { | |
| if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') | |
| return Buffer.compare(this, b) | |
| } | |
| // `get` will be removed in Node 0.13+ | |
| Buffer.prototype.get = function (offset) { | |
| console.log('.get() is deprecated. Access using array indexes instead.') | |
| return this.readUInt8(offset) | |
| } | |
| // `set` will be removed in Node 0.13+ | |
| Buffer.prototype.set = function (v, offset) { | |
| console.log('.set() is deprecated. Access using array indexes instead.') | |
| return this.writeUInt8(v, offset) | |
| } | |
| function hexWrite (buf, string, offset, length) { | |
| offset = Number(offset) || 0 | |
| var remaining = buf.length - offset | |
| if (!length) { | |
| length = remaining | |
| } else { | |
| length = Number(length) | |
| if (length > remaining) { | |
| length = remaining | |
| } | |
| } | |
| // must be an even number of digits | |
| var strLen = string.length | |
| if (strLen % 2 !== 0) throw new Error('Invalid hex string') | |
| if (length > strLen / 2) { | |
| length = strLen / 2 | |
| } | |
| for (var i = 0; i < length; i++) { | |
| var byte = parseInt(string.substr(i * 2, 2), 16) | |
| if (isNaN(byte)) throw new Error('Invalid hex string') | |
| buf[offset + i] = byte | |
| } | |
| return i | |
| } | |
| function utf8Write (buf, string, offset, length) { | |
| var charsWritten = blitBuffer(utf8ToBytes(string), buf, offset, length) | |
| return charsWritten | |
| } | |
| function asciiWrite (buf, string, offset, length) { | |
| var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length) | |
| return charsWritten | |
| } | |
| function binaryWrite (buf, string, offset, length) { | |
| return asciiWrite(buf, string, offset, length) | |
| } | |
| function base64Write (buf, string, offset, length) { | |
| var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length) | |
| return charsWritten | |
| } | |
| function utf16leWrite (buf, string, offset, length) { | |
| var charsWritten = blitBuffer(utf16leToBytes(string), buf, offset, length, 2) | |
| return charsWritten | |
| } | |
| Buffer.prototype.write = function (string, offset, length, encoding) { | |
| // Support both (string, offset, length, encoding) | |
| // and the legacy (string, encoding, offset, length) | |
| if (isFinite(offset)) { | |
| if (!isFinite(length)) { | |
| encoding = length | |
| length = undefined | |
| } | |
| } else { // legacy | |
| var swap = encoding | |
| encoding = offset | |
| offset = length | |
| length = swap | |
| } | |
| offset = Number(offset) || 0 | |
| var remaining = this.length - offset | |
| if (!length) { | |
| length = remaining | |
| } else { | |
| length = Number(length) | |
| if (length > remaining) { | |
| length = remaining | |
| } | |
| } | |
| encoding = String(encoding || 'utf8').toLowerCase() | |
| var ret | |
| switch (encoding) { | |
| case 'hex': | |
| ret = hexWrite(this, string, offset, length) | |
| break | |
| case 'utf8': | |
| case 'utf-8': | |
| ret = utf8Write(this, string, offset, length) | |
| break | |
| case 'ascii': | |
| ret = asciiWrite(this, string, offset, length) | |
| break | |
| case 'binary': | |
| ret = binaryWrite(this, string, offset, length) | |
| break | |
| case 'base64': | |
| ret = base64Write(this, string, offset, length) | |
| break | |
| case 'ucs2': | |
| case 'ucs-2': | |
| case 'utf16le': | |
| case 'utf-16le': | |
| ret = utf16leWrite(this, string, offset, length) | |
| break | |
| default: | |
| throw new TypeError('Unknown encoding: ' + encoding) | |
| } | |
| return ret | |
| } | |
| Buffer.prototype.toJSON = function () { | |
| return { | |
| type: 'Buffer', | |
| data: Array.prototype.slice.call(this._arr || this, 0) | |
| } | |
| } | |
| function base64Slice (buf, start, end) { | |
| if (start === 0 && end === buf.length) { | |
| return base64.fromByteArray(buf) | |
| } else { | |
| return base64.fromByteArray(buf.slice(start, end)) | |
| } | |
| } | |
| function utf8Slice (buf, start, end) { | |
| var res = '' | |
| var tmp = '' | |
| end = Math.min(buf.length, end) | |
| for (var i = start; i < end; i++) { | |
| if (buf[i] <= 0x7F) { | |
| res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i]) | |
| tmp = '' | |
| } else { | |
| tmp += '%' + buf[i].toString(16) | |
| } | |
| } | |
| return res + decodeUtf8Char(tmp) | |
| } | |
| function asciiSlice (buf, start, end) { | |
| var ret = '' | |
| end = Math.min(buf.length, end) | |
| for (var i = start; i < end; i++) { | |
| ret += String.fromCharCode(buf[i]) | |
| } | |
| return ret | |
| } | |
| function binarySlice (buf, start, end) { | |
| return asciiSlice(buf, start, end) | |
| } | |
| function hexSlice (buf, start, end) { | |
| var len = buf.length | |
| if (!start || start < 0) start = 0 | |
| if (!end || end < 0 || end > len) end = len | |
| var out = '' | |
| for (var i = start; i < end; i++) { | |
| out += toHex(buf[i]) | |
| } | |
| return out | |
| } | |
| function utf16leSlice (buf, start, end) { | |
| var bytes = buf.slice(start, end) | |
| var res = '' | |
| for (var i = 0; i < bytes.length; i += 2) { | |
| res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) | |
| } | |
| return res | |
| } | |
| Buffer.prototype.slice = function (start, end) { | |
| var len = this.length | |
| start = ~~start | |
| end = end === undefined ? len : ~~end | |
| if (start < 0) { | |
| start += len; | |
| if (start < 0) | |
| start = 0 | |
| } else if (start > len) { | |
| start = len | |
| } | |
| if (end < 0) { | |
| end += len | |
| if (end < 0) | |
| end = 0 | |
| } else if (end > len) { | |
| end = len | |
| } | |
| if (end < start) | |
| end = start | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| return Buffer._augment(this.subarray(start, end)) | |
| } else { | |
| var sliceLen = end - start | |
| var newBuf = new Buffer(sliceLen, undefined, true) | |
| for (var i = 0; i < sliceLen; i++) { | |
| newBuf[i] = this[i + start] | |
| } | |
| return newBuf | |
| } | |
| } | |
| /* | |
| * Need to make sure that buffer isn't trying to write out of bounds. | |
| */ | |
| function checkOffset (offset, ext, length) { | |
| if ((offset % 1) !== 0 || offset < 0) | |
| throw new RangeError('offset is not uint') | |
| if (offset + ext > length) | |
| throw new RangeError('Trying to access beyond buffer length') | |
| } | |
| Buffer.prototype.readUInt8 = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 1, this.length) | |
| return this[offset] | |
| } | |
| Buffer.prototype.readUInt16LE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 2, this.length) | |
| return this[offset] | (this[offset + 1] << 8) | |
| } | |
| Buffer.prototype.readUInt16BE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 2, this.length) | |
| return (this[offset] << 8) | this[offset + 1] | |
| } | |
| Buffer.prototype.readUInt32LE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 4, this.length) | |
| return ((this[offset]) | | |
| (this[offset + 1] << 8) | | |
| (this[offset + 2] << 16)) + | |
| (this[offset + 3] * 0x1000000) | |
| } | |
| Buffer.prototype.readUInt32BE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 4, this.length) | |
| return (this[offset] * 0x1000000) + | |
| ((this[offset + 1] << 16) | | |
| (this[offset + 2] << 8) | | |
| this[offset + 3]) | |
| } | |
| Buffer.prototype.readInt8 = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 1, this.length) | |
| if (!(this[offset] & 0x80)) | |
| return (this[offset]) | |
| return ((0xff - this[offset] + 1) * -1) | |
| } | |
| Buffer.prototype.readInt16LE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 2, this.length) | |
| var val = this[offset] | (this[offset + 1] << 8) | |
| return (val & 0x8000) ? val | 0xFFFF0000 : val | |
| } | |
| Buffer.prototype.readInt16BE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 2, this.length) | |
| var val = this[offset + 1] | (this[offset] << 8) | |
| return (val & 0x8000) ? val | 0xFFFF0000 : val | |
| } | |
| Buffer.prototype.readInt32LE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 4, this.length) | |
| return (this[offset]) | | |
| (this[offset + 1] << 8) | | |
| (this[offset + 2] << 16) | | |
| (this[offset + 3] << 24) | |
| } | |
| Buffer.prototype.readInt32BE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 4, this.length) | |
| return (this[offset] << 24) | | |
| (this[offset + 1] << 16) | | |
| (this[offset + 2] << 8) | | |
| (this[offset + 3]) | |
| } | |
| Buffer.prototype.readFloatLE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 4, this.length) | |
| return ieee754.read(this, offset, true, 23, 4) | |
| } | |
| Buffer.prototype.readFloatBE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 4, this.length) | |
| return ieee754.read(this, offset, false, 23, 4) | |
| } | |
| Buffer.prototype.readDoubleLE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 8, this.length) | |
| return ieee754.read(this, offset, true, 52, 8) | |
| } | |
| Buffer.prototype.readDoubleBE = function (offset, noAssert) { | |
| if (!noAssert) | |
| checkOffset(offset, 8, this.length) | |
| return ieee754.read(this, offset, false, 52, 8) | |
| } | |
| function checkInt (buf, value, offset, ext, max, min) { | |
| if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') | |
| if (value > max || value < min) throw new TypeError('value is out of bounds') | |
| if (offset + ext > buf.length) throw new TypeError('index out of range') | |
| } | |
| Buffer.prototype.writeUInt8 = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 1, 0xff, 0) | |
| if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) | |
| this[offset] = value | |
| return offset + 1 | |
| } | |
| function objectWriteUInt16 (buf, value, offset, littleEndian) { | |
| if (value < 0) value = 0xffff + value + 1 | |
| for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { | |
| buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> | |
| (littleEndian ? i : 1 - i) * 8 | |
| } | |
| } | |
| Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 2, 0xffff, 0) | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| this[offset] = value | |
| this[offset + 1] = (value >>> 8) | |
| } else objectWriteUInt16(this, value, offset, true) | |
| return offset + 2 | |
| } | |
| Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 2, 0xffff, 0) | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| this[offset] = (value >>> 8) | |
| this[offset + 1] = value | |
| } else objectWriteUInt16(this, value, offset, false) | |
| return offset + 2 | |
| } | |
| function objectWriteUInt32 (buf, value, offset, littleEndian) { | |
| if (value < 0) value = 0xffffffff + value + 1 | |
| for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { | |
| buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff | |
| } | |
| } | |
| Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 4, 0xffffffff, 0) | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| this[offset + 3] = (value >>> 24) | |
| this[offset + 2] = (value >>> 16) | |
| this[offset + 1] = (value >>> 8) | |
| this[offset] = value | |
| } else objectWriteUInt32(this, value, offset, true) | |
| return offset + 4 | |
| } | |
| Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 4, 0xffffffff, 0) | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| this[offset] = (value >>> 24) | |
| this[offset + 1] = (value >>> 16) | |
| this[offset + 2] = (value >>> 8) | |
| this[offset + 3] = value | |
| } else objectWriteUInt32(this, value, offset, false) | |
| return offset + 4 | |
| } | |
| Buffer.prototype.writeInt8 = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 1, 0x7f, -0x80) | |
| if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) | |
| if (value < 0) value = 0xff + value + 1 | |
| this[offset] = value | |
| return offset + 1 | |
| } | |
| Buffer.prototype.writeInt16LE = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 2, 0x7fff, -0x8000) | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| this[offset] = value | |
| this[offset + 1] = (value >>> 8) | |
| } else objectWriteUInt16(this, value, offset, true) | |
| return offset + 2 | |
| } | |
| Buffer.prototype.writeInt16BE = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 2, 0x7fff, -0x8000) | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| this[offset] = (value >>> 8) | |
| this[offset + 1] = value | |
| } else objectWriteUInt16(this, value, offset, false) | |
| return offset + 2 | |
| } | |
| Buffer.prototype.writeInt32LE = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| this[offset] = value | |
| this[offset + 1] = (value >>> 8) | |
| this[offset + 2] = (value >>> 16) | |
| this[offset + 3] = (value >>> 24) | |
| } else objectWriteUInt32(this, value, offset, true) | |
| return offset + 4 | |
| } | |
| Buffer.prototype.writeInt32BE = function (value, offset, noAssert) { | |
| value = +value | |
| offset = offset >>> 0 | |
| if (!noAssert) | |
| checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) | |
| if (value < 0) value = 0xffffffff + value + 1 | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| this[offset] = (value >>> 24) | |
| this[offset + 1] = (value >>> 16) | |
| this[offset + 2] = (value >>> 8) | |
| this[offset + 3] = value | |
| } else objectWriteUInt32(this, value, offset, false) | |
| return offset + 4 | |
| } | |
| function checkIEEE754 (buf, value, offset, ext, max, min) { | |
| if (value > max || value < min) throw new TypeError('value is out of bounds') | |
| if (offset + ext > buf.length) throw new TypeError('index out of range') | |
| } | |
| function writeFloat (buf, value, offset, littleEndian, noAssert) { | |
| if (!noAssert) | |
| checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) | |
| ieee754.write(buf, value, offset, littleEndian, 23, 4) | |
| return offset + 4 | |
| } | |
| Buffer.prototype.writeFloatLE = function (value, offset, noAssert) { | |
| return writeFloat(this, value, offset, true, noAssert) | |
| } | |
| Buffer.prototype.writeFloatBE = function (value, offset, noAssert) { | |
| return writeFloat(this, value, offset, false, noAssert) | |
| } | |
| function writeDouble (buf, value, offset, littleEndian, noAssert) { | |
| if (!noAssert) | |
| checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) | |
| ieee754.write(buf, value, offset, littleEndian, 52, 8) | |
| return offset + 8 | |
| } | |
| Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) { | |
| return writeDouble(this, value, offset, true, noAssert) | |
| } | |
| Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) { | |
| return writeDouble(this, value, offset, false, noAssert) | |
| } | |
| // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) | |
| Buffer.prototype.copy = function (target, target_start, start, end) { | |
| var source = this | |
| if (!start) start = 0 | |
| if (!end && end !== 0) end = this.length | |
| if (!target_start) target_start = 0 | |
| // Copy 0 bytes; we're done | |
| if (end === start) return | |
| if (target.length === 0 || source.length === 0) return | |
| // Fatal error conditions | |
| if (end < start) throw new TypeError('sourceEnd < sourceStart') | |
| if (target_start < 0 || target_start >= target.length) | |
| throw new TypeError('targetStart out of bounds') | |
| if (start < 0 || start >= source.length) throw new TypeError('sourceStart out of bounds') | |
| if (end < 0 || end > source.length) throw new TypeError('sourceEnd out of bounds') | |
| // Are we oob? | |
| if (end > this.length) | |
| end = this.length | |
| if (target.length - target_start < end - start) | |
| end = target.length - target_start + start | |
| var len = end - start | |
| if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { | |
| for (var i = 0; i < len; i++) { | |
| target[i + target_start] = this[i + start] | |
| } | |
| } else { | |
| target._set(this.subarray(start, start + len), target_start) | |
| } | |
| } | |
| // fill(value, start=0, end=buffer.length) | |
| Buffer.prototype.fill = function (value, start, end) { | |
| if (!value) value = 0 | |
| if (!start) start = 0 | |
| if (!end) end = this.length | |
| if (end < start) throw new TypeError('end < start') | |
| // Fill 0 bytes; we're done | |
| if (end === start) return | |
| if (this.length === 0) return | |
| if (start < 0 || start >= this.length) throw new TypeError('start out of bounds') | |
| if (end < 0 || end > this.length) throw new TypeError('end out of bounds') | |
| var i | |
| if (typeof value === 'number') { | |
| for (i = start; i < end; i++) { | |
| this[i] = value | |
| } | |
| } else { | |
| var bytes = utf8ToBytes(value.toString()) | |
| var len = bytes.length | |
| for (i = start; i < end; i++) { | |
| this[i] = bytes[i % len] | |
| } | |
| } | |
| return this | |
| } | |
| /** | |
| * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. | |
| * Added in Node 0.12. Only available in browsers that support ArrayBuffer. | |
| */ | |
| Buffer.prototype.toArrayBuffer = function () { | |
| if (typeof Uint8Array !== 'undefined') { | |
| if (Buffer.TYPED_ARRAY_SUPPORT) { | |
| return (new Buffer(this)).buffer | |
| } else { | |
| var buf = new Uint8Array(this.length) | |
| for (var i = 0, len = buf.length; i < len; i += 1) { | |
| buf[i] = this[i] | |
| } | |
| return buf.buffer | |
| } | |
| } else { | |
| throw new TypeError('Buffer.toArrayBuffer not supported in this browser') | |
| } | |
| } | |
| // HELPER FUNCTIONS | |
| // ================ | |
| var BP = Buffer.prototype | |
| /** | |
| * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods | |
| */ | |
| Buffer._augment = function (arr) { | |
| arr.constructor = Buffer | |
| arr._isBuffer = true | |
| // save reference to original Uint8Array get/set methods before overwriting | |
| arr._get = arr.get | |
| arr._set = arr.set | |
| // deprecated, will be removed in node 0.13+ | |
| arr.get = BP.get | |
| arr.set = BP.set | |
| arr.write = BP.write | |
| arr.toString = BP.toString | |
| arr.toLocaleString = BP.toString | |
| arr.toJSON = BP.toJSON | |
| arr.equals = BP.equals | |
| arr.compare = BP.compare | |
| arr.copy = BP.copy | |
| arr.slice = BP.slice | |
| arr.readUInt8 = BP.readUInt8 | |
| arr.readUInt16LE = BP.readUInt16LE | |
| arr.readUInt16BE = BP.readUInt16BE | |
| arr.readUInt32LE = BP.readUInt32LE | |
| arr.readUInt32BE = BP.readUInt32BE | |
| arr.readInt8 = BP.readInt8 | |
| arr.readInt16LE = BP.readInt16LE | |
| arr.readInt16BE = BP.readInt16BE | |
| arr.readInt32LE = BP.readInt32LE | |
| arr.readInt32BE = BP.readInt32BE | |
| arr.readFloatLE = BP.readFloatLE | |
| arr.readFloatBE = BP.readFloatBE | |
| arr.readDoubleLE = BP.readDoubleLE | |
| arr.readDoubleBE = BP.readDoubleBE | |
| arr.writeUInt8 = BP.writeUInt8 | |
| arr.writeUInt16LE = BP.writeUInt16LE | |
| arr.writeUInt16BE = BP.writeUInt16BE | |
| arr.writeUInt32LE = BP.writeUInt32LE | |
| arr.writeUInt32BE = BP.writeUInt32BE | |
| arr.writeInt8 = BP.writeInt8 | |
| arr.writeInt16LE = BP.writeInt16LE | |
| arr.writeInt16BE = BP.writeInt16BE | |
| arr.writeInt32LE = BP.writeInt32LE | |
| arr.writeInt32BE = BP.writeInt32BE | |
| arr.writeFloatLE = BP.writeFloatLE | |
| arr.writeFloatBE = BP.writeFloatBE | |
| arr.writeDoubleLE = BP.writeDoubleLE | |
| arr.writeDoubleBE = BP.writeDoubleBE | |
| arr.fill = BP.fill | |
| arr.inspect = BP.inspect | |
| arr.toArrayBuffer = BP.toArrayBuffer | |
| return arr | |
| } | |
| var INVALID_BASE64_RE = /[^+\/0-9A-z]/g | |
| function base64clean (str) { | |
| // Node strips out invalid characters like \n and \t from the string, base64-js does not | |
| str = stringtrim(str).replace(INVALID_BASE64_RE, '') | |
| // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not | |
| while (str.length % 4 !== 0) { | |
| str = str + '=' | |
| } | |
| return str | |
| } | |
| function stringtrim (str) { | |
| if (str.trim) return str.trim() | |
| return str.replace(/^\s+|\s+$/g, '') | |
| } | |
| function isArrayish (subject) { | |
| return isArray(subject) || Buffer.isBuffer(subject) || | |
| subject && typeof subject === 'object' && | |
| typeof subject.length === 'number' | |
| } | |
| function toHex (n) { | |
| if (n < 16) return '0' + n.toString(16) | |
| return n.toString(16) | |
| } | |
| function utf8ToBytes (str) { | |
| var byteArray = [] | |
| for (var i = 0; i < str.length; i++) { | |
| var b = str.charCodeAt(i) | |
| if (b <= 0x7F) { | |
| byteArray.push(b) | |
| } else { | |
| var start = i | |
| if (b >= 0xD800 && b <= 0xDFFF) i++ | |
| var h = encodeURIComponent(str.slice(start, i+1)).substr(1).split('%') | |
| for (var j = 0; j < h.length; j++) { | |
| byteArray.push(parseInt(h[j], 16)) | |
| } | |
| } | |
| } | |
| return byteArray | |
| } | |
| function asciiToBytes (str) { | |
| var byteArray = [] | |
| for (var i = 0; i < str.length; i++) { | |
| // Node's code seems to be doing this and not & 0x7F.. | |
| byteArray.push(str.charCodeAt(i) & 0xFF) | |
| } | |
| return byteArray | |
| } | |
| function utf16leToBytes (str) { | |
| var c, hi, lo | |
| var byteArray = [] | |
| for (var i = 0; i < str.length; i++) { | |
| c = str.charCodeAt(i) | |
| hi = c >> 8 | |
| lo = c % 256 | |
| byteArray.push(lo) | |
| byteArray.push(hi) | |
| } | |
| return byteArray | |
| } | |
| function base64ToBytes (str) { | |
| return base64.toByteArray(str) | |
| } | |
| function blitBuffer (src, dst, offset, length, unitSize) { | |
| if (unitSize) length -= length % unitSize; | |
| for (var i = 0; i < length; i++) { | |
| if ((i + offset >= dst.length) || (i >= src.length)) | |
| break | |
| dst[i + offset] = src[i] | |
| } | |
| return i | |
| } | |
| function decodeUtf8Char (str) { | |
| try { | |
| return decodeURIComponent(str) | |
| } catch (err) { | |
| return String.fromCharCode(0xFFFD) // UTF 8 invalid char | |
| } | |
| } | |
| /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(46).Buffer)) | |
| /***/ }, | |
| /* 47 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| module.exports = __webpack_require__(48); | |
| /***/ }, | |
| /* 48 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /*! | |
| * type-detect | |
| * Copyright(c) 2013 jake luer <[email protected]> | |
| * MIT Licensed | |
| */ | |
| /*! | |
| * Primary Exports | |
| */ | |
| var exports = module.exports = getType; | |
| /*! | |
| * Detectable javascript natives | |
| */ | |
| var natives = { | |
| '[object Array]': 'array' | |
| , '[object RegExp]': 'regexp' | |
| , '[object Function]': 'function' | |
| , '[object Arguments]': 'arguments' | |
| , '[object Date]': 'date' | |
| }; | |
| /** | |
| * ### typeOf (obj) | |
| * | |
| * Use several different techniques to determine | |
| * the type of object being tested. | |
| * | |
| * | |
| * @param {Mixed} object | |
| * @return {String} object type | |
| * @api public | |
| */ | |
| function getType (obj) { | |
| var str = Object.prototype.toString.call(obj); | |
| if (natives[str]) return natives[str]; | |
| if (obj === null) return 'null'; | |
| if (obj === undefined) return 'undefined'; | |
| if (obj === Object(obj)) return 'object'; | |
| return typeof obj; | |
| } | |
| exports.Library = Library; | |
| /** | |
| * ### Library | |
| * | |
| * Create a repository for custom type detection. | |
| * | |
| * ```js | |
| * var lib = new type.Library; | |
| * ``` | |
| * | |
| */ | |
| function Library () { | |
| this.tests = {}; | |
| } | |
| /** | |
| * #### .of (obj) | |
| * | |
| * Expose replacement `typeof` detection to the library. | |
| * | |
| * ```js | |
| * if ('string' === lib.of('hello world')) { | |
| * // ... | |
| * } | |
| * ``` | |
| * | |
| * @param {Mixed} object to test | |
| * @return {String} type | |
| */ | |
| Library.prototype.of = getType; | |
| /** | |
| * #### .define (type, test) | |
| * | |
| * Add a test to for the `.test()` assertion. | |
| * | |
| * Can be defined as a regular expression: | |
| * | |
| * ```js | |
| * lib.define('int', /^[0-9]+$/); | |
| * ``` | |
| * | |
| * ... or as a function: | |
| * | |
| * ```js | |
| * lib.define('bln', function (obj) { | |
| * if ('boolean' === lib.of(obj)) return true; | |
| * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ]; | |
| * if ('string' === lib.of(obj)) obj = obj.toLowerCase(); | |
| * return !! ~blns.indexOf(obj); | |
| * }); | |
| * ``` | |
| * | |
| * @param {String} type | |
| * @param {RegExp|Function} test | |
| * @api public | |
| */ | |
| Library.prototype.define = function (type, test) { | |
| if (arguments.length === 1) return this.tests[type]; | |
| this.tests[type] = test; | |
| return this; | |
| }; | |
| /** | |
| * #### .test (obj, test) | |
| * | |
| * Assert that an object is of type. Will first | |
| * check natives, and if that does not pass it will | |
| * use the user defined custom tests. | |
| * | |
| * ```js | |
| * assert(lib.test('1', 'int')); | |
| * assert(lib.test('yes', 'bln')); | |
| * ``` | |
| * | |
| * @param {Mixed} object | |
| * @param {String} type | |
| * @return {Boolean} result | |
| * @api public | |
| */ | |
| Library.prototype.test = function (obj, type) { | |
| if (type === getType(obj)) return true; | |
| var test = this.tests[type]; | |
| if (test && 'regexp' === getType(test)) { | |
| return test.test(obj); | |
| } else if (test && 'function' === getType(test)) { | |
| return test(obj); | |
| } else { | |
| throw new ReferenceError('Type test "' + type + '" not defined or invalid.'); | |
| } | |
| }; | |
| /***/ }, | |
| /* 49 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| exports.read = function(buffer, offset, isLE, mLen, nBytes) { | |
| var e, m, | |
| eLen = nBytes * 8 - mLen - 1, | |
| eMax = (1 << eLen) - 1, | |
| eBias = eMax >> 1, | |
| nBits = -7, | |
| i = isLE ? (nBytes - 1) : 0, | |
| d = isLE ? -1 : 1, | |
| s = buffer[offset + i]; | |
| i += d; | |
| e = s & ((1 << (-nBits)) - 1); | |
| s >>= (-nBits); | |
| nBits += eLen; | |
| for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8); | |
| m = e & ((1 << (-nBits)) - 1); | |
| e >>= (-nBits); | |
| nBits += mLen; | |
| for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8); | |
| if (e === 0) { | |
| e = 1 - eBias; | |
| } else if (e === eMax) { | |
| return m ? NaN : ((s ? -1 : 1) * Infinity); | |
| } else { | |
| m = m + Math.pow(2, mLen); | |
| e = e - eBias; | |
| } | |
| return (s ? -1 : 1) * m * Math.pow(2, e - mLen); | |
| }; | |
| exports.write = function(buffer, value, offset, isLE, mLen, nBytes) { | |
| var e, m, c, | |
| eLen = nBytes * 8 - mLen - 1, | |
| eMax = (1 << eLen) - 1, | |
| eBias = eMax >> 1, | |
| rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0), | |
| i = isLE ? 0 : (nBytes - 1), | |
| d = isLE ? 1 : -1, | |
| s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; | |
| value = Math.abs(value); | |
| if (isNaN(value) || value === Infinity) { | |
| m = isNaN(value) ? 1 : 0; | |
| e = eMax; | |
| } else { | |
| e = Math.floor(Math.log(value) / Math.LN2); | |
| if (value * (c = Math.pow(2, -e)) < 1) { | |
| e--; | |
| c *= 2; | |
| } | |
| if (e + eBias >= 1) { | |
| value += rt / c; | |
| } else { | |
| value += rt * Math.pow(2, 1 - eBias); | |
| } | |
| if (value * c >= 2) { | |
| e++; | |
| c /= 2; | |
| } | |
| if (e + eBias >= eMax) { | |
| m = 0; | |
| e = eMax; | |
| } else if (e + eBias >= 1) { | |
| m = (value * c - 1) * Math.pow(2, mLen); | |
| e = e + eBias; | |
| } else { | |
| m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); | |
| e = 0; | |
| } | |
| } | |
| for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8); | |
| e = (e << mLen) | m; | |
| eLen += mLen; | |
| for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8); | |
| buffer[offset + i - d] |= s * 128; | |
| }; | |
| /***/ }, | |
| /* 50 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| /** | |
| * isArray | |
| */ | |
| var isArray = Array.isArray; | |
| /** | |
| * toString | |
| */ | |
| var str = Object.prototype.toString; | |
| /** | |
| * Whether or not the given `val` | |
| * is an array. | |
| * | |
| * example: | |
| * | |
| * isArray([]); | |
| * // > true | |
| * isArray(arguments); | |
| * // > false | |
| * isArray(''); | |
| * // > false | |
| * | |
| * @param {mixed} val | |
| * @return {bool} | |
| */ | |
| module.exports = isArray || function (val) { | |
| return !! val && '[object Array]' == str.call(val); | |
| }; | |
| /***/ }, | |
| /* 51 */ | |
| /***/ function(module, exports, __webpack_require__) { | |
| var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | |
| ;(function (exports) { | |
| 'use strict'; | |
| var Arr = (typeof Uint8Array !== 'undefined') | |
| ? Uint8Array | |
| : Array | |
| var PLUS = '+'.charCodeAt(0) | |
| var SLASH = '/'.charCodeAt(0) | |
| var NUMBER = '0'.charCodeAt(0) | |
| var LOWER = 'a'.charCodeAt(0) | |
| var UPPER = 'A'.charCodeAt(0) | |
| function decode (elt) { | |
| var code = elt.charCodeAt(0) | |
| if (code === PLUS) | |
| return 62 // '+' | |
| if (code === SLASH) | |
| return 63 // '/' | |
| if (code < NUMBER) | |
| return -1 //no match | |
| if (code < NUMBER + 10) | |
| return code - NUMBER + 26 + 26 | |
| if (code < UPPER + 26) | |
| return code - UPPER | |
| if (code < LOWER + 26) | |
| return code - LOWER + 26 | |
| } | |
| function b64ToByteArray (b64) { | |
| var i, j, l, tmp, placeHolders, arr | |
| if (b64.length % 4 > 0) { | |
| throw new Error('Invalid string. Length must be a multiple of 4') | |
| } | |
| // the number of equal signs (place holders) | |
| // if there are two placeholders, than the two characters before it | |
| // represent one byte | |
| // if there is only one, then the three characters before it represent 2 bytes | |
| // this is just a cheap hack to not do indexOf twice | |
| var len = b64.length | |
| placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 | |
| // base64 is 4/3 + up to two characters of the original data | |
| arr = new Arr(b64.length * 3 / 4 - placeHolders) | |
| // if there are placeholders, only get up to the last complete 4 chars | |
| l = placeHolders > 0 ? b64.length - 4 : b64.length | |
| var L = 0 | |
| function push (v) { | |
| arr[L++] = v | |
| } | |
| for (i = 0, j = 0; i < l; i += 4, j += 3) { | |
| tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) | |
| push((tmp & 0xFF0000) >> 16) | |
| push((tmp & 0xFF00) >> 8) | |
| push(tmp & 0xFF) | |
| } | |
| if (placeHolders === 2) { | |
| tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) | |
| push(tmp & 0xFF) | |
| } else if (placeHolders === 1) { | |
| tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) | |
| push((tmp >> 8) & 0xFF) | |
| push(tmp & 0xFF) | |
| } | |
| return arr | |
| } | |
| function uint8ToBase64 (uint8) { | |
| var i, | |
| extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes | |
| output = "", | |
| temp, length | |
| function encode (num) { | |
| return lookup.charAt(num) | |
| } | |
| function tripletToBase64 (num) { | |
| return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) | |
| } | |
| // go through the array every three bytes, we'll deal with trailing stuff later | |
| for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { | |
| temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) | |
| output += tripletToBase64(temp) | |
| } | |
| // pad the end with zeros, but make sure to not forget the extra bytes | |
| switch (extraBytes) { | |
| case 1: | |
| temp = uint8[uint8.length - 1] | |
| output += encode(temp >> 2) | |
| output += encode((temp << 4) & 0x3F) | |
| output += '==' | |
| break | |
| case 2: | |
| temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) | |
| output += encode(temp >> 10) | |
| output += encode((temp >> 4) & 0x3F) | |
| output += encode((temp << 2) & 0x3F) | |
| output += '=' | |
| break | |
| } | |
| return output | |
| } | |
| exports.toByteArray = b64ToByteArray | |
| exports.fromByteArray = uint8ToBase64 | |
| }(false ? (this.base64js = {}) : exports)) | |
| /***/ } | |
| /******/ ]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment