react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / hawk / node_modules / hoek / lib / index.js
81154 views// Load modules12var Crypto = require('crypto');3var Path = require('path');4var Util = require('util');5var Escape = require('./escape');678// Declare internals910var internals = {};111213// Clone object or array1415exports.clone = function (obj, seen) {1617if (typeof obj !== 'object' ||18obj === null) {1920return obj;21}2223seen = seen || { orig: [], copy: [] };2425var lookup = seen.orig.indexOf(obj);26if (lookup !== -1) {27return seen.copy[lookup];28}2930var newObj;31var cloneDeep = false;3233if (!Array.isArray(obj)) {34if (Buffer.isBuffer(obj)) {35newObj = new Buffer(obj);36}37else if (obj instanceof Date) {38newObj = new Date(obj.getTime());39}40else if (obj instanceof RegExp) {41newObj = new RegExp(obj);42}43else {44var proto = Object.getPrototypeOf(obj);45if (proto &&46proto.isImmutable) {4748newObj = obj;49}50else {51newObj = Object.create(proto);52cloneDeep = true;53}54}55}56else {57newObj = [];58cloneDeep = true;59}6061seen.orig.push(obj);62seen.copy.push(newObj);6364if (cloneDeep) {65var keys = Object.getOwnPropertyNames(obj);66for (var i = 0, il = keys.length; i < il; ++i) {67var key = keys[i];68var descriptor = Object.getOwnPropertyDescriptor(obj, key);69if (descriptor.get ||70descriptor.set) {7172Object.defineProperty(newObj, key, descriptor);73}74else {75newObj[key] = exports.clone(obj[key], seen);76}77}78}7980return newObj;81};828384// Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied85/*eslint-disable */86exports.merge = function (target, source, isNullOverride /* = true */, isMergeArrays /* = true */) {87/*eslint-enable */88exports.assert(target && typeof target === 'object', 'Invalid target value: must be an object');89exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source value: must be null, undefined, or an object');9091if (!source) {92return target;93}9495if (Array.isArray(source)) {96exports.assert(Array.isArray(target), 'Cannot merge array onto an object');97if (isMergeArrays === false) { // isMergeArrays defaults to true98target.length = 0; // Must not change target assignment99}100101for (var i = 0, il = source.length; i < il; ++i) {102target.push(exports.clone(source[i]));103}104105return target;106}107108var keys = Object.keys(source);109for (var k = 0, kl = keys.length; k < kl; ++k) {110var key = keys[k];111var value = source[key];112if (value &&113typeof value === 'object') {114115if (!target[key] ||116typeof target[key] !== 'object' ||117(Array.isArray(target[key]) ^ Array.isArray(value)) ||118value instanceof Date ||119Buffer.isBuffer(value) ||120value instanceof RegExp) {121122target[key] = exports.clone(value);123}124else {125exports.merge(target[key], value, isNullOverride, isMergeArrays);126}127}128else {129if (value !== null &&130value !== undefined) { // Explicit to preserve empty strings131132target[key] = value;133}134else if (isNullOverride !== false) { // Defaults to true135target[key] = value;136}137}138}139140return target;141};142143144// Apply options to a copy of the defaults145146exports.applyToDefaults = function (defaults, options, isNullOverride) {147148exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object');149exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object');150151if (!options) { // If no options, return null152return null;153}154155var copy = exports.clone(defaults);156157if (options === true) { // If options is set to true, use defaults158return copy;159}160161return exports.merge(copy, options, isNullOverride === true, false);162};163164165// Clone an object except for the listed keys which are shallow copied166167exports.cloneWithShallow = function (source, keys) {168169if (!source ||170typeof source !== 'object') {171172return source;173}174175var storage = internals.store(source, keys); // Move shallow copy items to storage176var copy = exports.clone(source); // Deep copy the rest177internals.restore(copy, source, storage); // Shallow copy the stored items and restore178return copy;179};180181182internals.store = function (source, keys) {183184var storage = {};185for (var i = 0, il = keys.length; i < il; ++i) {186var key = keys[i];187var value = exports.reach(source, key);188if (value !== undefined) {189storage[key] = value;190internals.reachSet(source, key, undefined);191}192}193194return storage;195};196197198internals.restore = function (copy, source, storage) {199200var keys = Object.keys(storage);201for (var i = 0, il = keys.length; i < il; ++i) {202var key = keys[i];203internals.reachSet(copy, key, storage[key]);204internals.reachSet(source, key, storage[key]);205}206};207208209internals.reachSet = function (obj, key, value) {210211var path = key.split('.');212var ref = obj;213for (var i = 0, il = path.length; i < il; ++i) {214var segment = path[i];215if (i + 1 === il) {216ref[segment] = value;217}218219ref = ref[segment];220}221};222223224// Apply options to defaults except for the listed keys which are shallow copied from option without merging225226exports.applyToDefaultsWithShallow = function (defaults, options, keys) {227228exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object');229exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object');230exports.assert(keys && Array.isArray(keys), 'Invalid keys');231232if (!options) { // If no options, return null233return null;234}235236var copy = exports.cloneWithShallow(defaults, keys);237238if (options === true) { // If options is set to true, use defaults239return copy;240}241242var storage = internals.store(options, keys); // Move shallow copy items to storage243exports.merge(copy, options, false, false); // Deep copy the rest244internals.restore(copy, options, storage); // Shallow copy the stored items and restore245return copy;246};247248249// Deep object or array comparison250251exports.deepEqual = function (obj, ref, options, seen) {252253options = options || { prototype: true };254255var type = typeof obj;256257if (type !== typeof ref) {258return false;259}260261if (type !== 'object' ||262obj === null ||263ref === null) {264265if (obj === ref) { // Copied from Deep-eql, copyright(c) 2013 Jake Luer, [email protected], MIT Licensed, https://github.com/chaijs/deep-eql266return obj !== 0 || 1 / obj === 1 / ref; // -0 / +0267}268269return obj !== obj && ref !== ref; // NaN270}271272seen = seen || [];273if (seen.indexOf(obj) !== -1) {274return true; // If previous comparison failed, it would have stopped execution275}276277seen.push(obj);278279if (Array.isArray(obj)) {280if (!Array.isArray(ref)) {281return false;282}283284if (!options.part && obj.length !== ref.length) {285return false;286}287288for (var i = 0, il = obj.length; i < il; ++i) {289if (options.part) {290var found = false;291for (var r = 0, rl = ref.length; r < rl; ++r) {292if (exports.deepEqual(obj[i], ref[r], options, seen)) {293found = true;294break;295}296}297298return found;299}300301if (!exports.deepEqual(obj[i], ref[i], options, seen)) {302return false;303}304}305306return true;307}308309if (Buffer.isBuffer(obj)) {310if (!Buffer.isBuffer(ref)) {311return false;312}313314if (obj.length !== ref.length) {315return false;316}317318for (var j = 0, jl = obj.length; j < jl; ++j) {319if (obj[j] !== ref[j]) {320return false;321}322}323324return true;325}326327if (obj instanceof Date) {328return (ref instanceof Date && obj.getTime() === ref.getTime());329}330331if (obj instanceof RegExp) {332return (ref instanceof RegExp && obj.toString() === ref.toString());333}334335if (options.prototype) {336if (Object.getPrototypeOf(obj) !== Object.getPrototypeOf(ref)) {337return false;338}339}340341var keys = Object.getOwnPropertyNames(obj);342343if (!options.part && keys.length !== Object.getOwnPropertyNames(ref).length) {344return false;345}346347for (var k = 0, kl = keys.length; k < kl; ++k) {348var key = keys[k];349var descriptor = Object.getOwnPropertyDescriptor(obj, key);350if (descriptor.get) {351if (!exports.deepEqual(descriptor, Object.getOwnPropertyDescriptor(ref, key), options, seen)) {352return false;353}354}355else if (!exports.deepEqual(obj[key], ref[key], options, seen)) {356return false;357}358}359360return true;361};362363364// Remove duplicate items from array365366exports.unique = function (array, key) {367368var index = {};369var result = [];370371for (var i = 0, il = array.length; i < il; ++i) {372var id = (key ? array[i][key] : array[i]);373if (index[id] !== true) {374375result.push(array[i]);376index[id] = true;377}378}379380return result;381};382383384// Convert array into object385386exports.mapToObject = function (array, key) {387388if (!array) {389return null;390}391392var obj = {};393for (var i = 0, il = array.length; i < il; ++i) {394if (key) {395if (array[i][key]) {396obj[array[i][key]] = true;397}398}399else {400obj[array[i]] = true;401}402}403404return obj;405};406407408// Find the common unique items in two arrays409410exports.intersect = function (array1, array2, justFirst) {411412if (!array1 || !array2) {413return [];414}415416var common = [];417var hash = (Array.isArray(array1) ? exports.mapToObject(array1) : array1);418var found = {};419for (var i = 0, il = array2.length; i < il; ++i) {420if (hash[array2[i]] && !found[array2[i]]) {421if (justFirst) {422return array2[i];423}424425common.push(array2[i]);426found[array2[i]] = true;427}428}429430return (justFirst ? null : common);431};432433434// Test if the reference contains the values435436exports.contain = function (ref, values, options) {437438/*439string -> string(s)440array -> item(s)441object -> key(s)442object -> object (key:value)443*/444445var valuePairs = null;446if (typeof ref === 'object' &&447typeof values === 'object' &&448!Array.isArray(ref) &&449!Array.isArray(values)) {450451valuePairs = values;452values = Object.keys(values);453}454else {455values = [].concat(values);456}457458options = options || {}; // deep, once, only, part459460exports.assert(arguments.length >= 2, 'Insufficient arguments');461exports.assert(typeof ref === 'string' || typeof ref === 'object', 'Reference must be string or an object');462exports.assert(values.length, 'Values array cannot be empty');463464var compare, compareFlags;465if (options.deep) {466compare = exports.deepEqual;467468var hasOnly = options.hasOwnProperty('only'), hasPart = options.hasOwnProperty('part');469470compareFlags = {471prototype: hasOnly ? options.only : hasPart ? !options.part : false,472part: hasOnly ? !options.only : hasPart ? options.part : true473};474}475else {476compare = function (a, b) {477478return a === b;479};480}481482var misses = false;483var matches = new Array(values.length);484for (var i = 0, il = matches.length; i < il; ++i) {485matches[i] = 0;486}487488if (typeof ref === 'string') {489var pattern = '(';490for (i = 0, il = values.length; i < il; ++i) {491var value = values[i];492exports.assert(typeof value === 'string', 'Cannot compare string reference to non-string value');493pattern += (i ? '|' : '') + exports.escapeRegex(value);494}495496var regex = new RegExp(pattern + ')', 'g');497var leftovers = ref.replace(regex, function ($0, $1) {498499var index = values.indexOf($1);500++matches[index];501return ''; // Remove from string502});503504misses = !!leftovers;505}506else if (Array.isArray(ref)) {507for (i = 0, il = ref.length; i < il; ++i) {508for (var j = 0, jl = values.length, matched = false; j < jl && matched === false; ++j) {509matched = compare(values[j], ref[i], compareFlags) && j;510}511512if (matched !== false) {513++matches[matched];514}515else {516misses = true;517}518}519}520else {521var keys = Object.keys(ref);522for (i = 0, il = keys.length; i < il; ++i) {523var key = keys[i];524var pos = values.indexOf(key);525if (pos !== -1) {526if (valuePairs &&527!compare(valuePairs[key], ref[key], compareFlags)) {528529return false;530}531532++matches[pos];533}534else {535misses = true;536}537}538}539540var result = false;541for (i = 0, il = matches.length; i < il; ++i) {542result = result || !!matches[i];543if ((options.once && matches[i] > 1) ||544(!options.part && !matches[i])) {545546return false;547}548}549550if (options.only &&551misses) {552553return false;554}555556return result;557};558559560// Flatten array561562exports.flatten = function (array, target) {563564var result = target || [];565566for (var i = 0, il = array.length; i < il; ++i) {567if (Array.isArray(array[i])) {568exports.flatten(array[i], result);569}570else {571result.push(array[i]);572}573}574575return result;576};577578579// Convert an object key chain string ('a.b.c') to reference (object[a][b][c])580581exports.reach = function (obj, chain, options) {582583options = options || {};584if (typeof options === 'string') {585options = { separator: options };586}587588var path = chain.split(options.separator || '.');589var ref = obj;590for (var i = 0, il = path.length; i < il; ++i) {591var key = path[i];592if (key[0] === '-' && Array.isArray(ref)) {593key = key.slice(1, key.length);594key = ref.length - key;595}596597if (!ref ||598!ref.hasOwnProperty(key) ||599(typeof ref !== 'object' && options.functions === false)) { // Only object and function can have properties600601exports.assert(!options.strict || i + 1 === il, 'Missing segment', key, 'in reach path ', chain);602exports.assert(typeof ref === 'object' || options.functions === true || typeof ref !== 'function', 'Invalid segment', key, 'in reach path ', chain);603ref = options.default;604break;605}606607ref = ref[key];608}609610return ref;611};612613614exports.reachTemplate = function (obj, template, options) {615616return template.replace(/{([^}]+)}/g, function ($0, chain) {617618var value = exports.reach(obj, chain, options);619return (value === undefined || value === null ? '' : value);620});621};622623624exports.formatStack = function (stack) {625626var trace = [];627for (var i = 0, il = stack.length; i < il; ++i) {628var item = stack[i];629trace.push([item.getFileName(), item.getLineNumber(), item.getColumnNumber(), item.getFunctionName(), item.isConstructor()]);630}631632return trace;633};634635636exports.formatTrace = function (trace) {637638var display = [];639640for (var i = 0, il = trace.length; i < il; ++i) {641var row = trace[i];642display.push((row[4] ? 'new ' : '') + row[3] + ' (' + row[0] + ':' + row[1] + ':' + row[2] + ')');643}644645return display;646};647648649exports.callStack = function (slice) {650651// http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi652653var v8 = Error.prepareStackTrace;654Error.prepareStackTrace = function (err, stack) {655656return stack;657};658659var capture = {};660Error.captureStackTrace(capture, arguments.callee); /*eslint no-caller:0 */661var stack = capture.stack;662663Error.prepareStackTrace = v8;664665var trace = exports.formatStack(stack);666667if (slice) {668return trace.slice(slice);669}670671return trace;672};673674675exports.displayStack = function (slice) {676677var trace = exports.callStack(slice === undefined ? 1 : slice + 1);678679return exports.formatTrace(trace);680};681682683exports.abortThrow = false;684685686exports.abort = function (message, hideStack) {687688if (process.env.NODE_ENV === 'test' || exports.abortThrow === true) {689throw new Error(message || 'Unknown error');690}691692var stack = '';693if (!hideStack) {694stack = exports.displayStack(1).join('\n\t');695}696console.log('ABORT: ' + message + '\n\t' + stack);697process.exit(1);698};699700701exports.assert = function (condition /*, msg1, msg2, msg3 */) {702703if (condition) {704return;705}706707if (arguments.length === 2 && arguments[1] instanceof Error) {708throw arguments[1];709}710711var msgs = [];712for (var i = 1, il = arguments.length; i < il; ++i) {713if (arguments[i] !== '') {714msgs.push(arguments[i]); // Avoids Array.slice arguments leak, allowing for V8 optimizations715}716}717718msgs = msgs.map(function (msg) {719720return typeof msg === 'string' ? msg : msg instanceof Error ? msg.message : exports.stringify(msg);721});722throw new Error(msgs.join(' ') || 'Unknown error');723};724725726exports.Timer = function () {727728this.ts = 0;729this.reset();730};731732733exports.Timer.prototype.reset = function () {734735this.ts = Date.now();736};737738739exports.Timer.prototype.elapsed = function () {740741return Date.now() - this.ts;742};743744745exports.Bench = function () {746747this.ts = 0;748this.reset();749};750751752exports.Bench.prototype.reset = function () {753754this.ts = exports.Bench.now();755};756757758exports.Bench.prototype.elapsed = function () {759760return exports.Bench.now() - this.ts;761};762763764exports.Bench.now = function () {765766var ts = process.hrtime();767return (ts[0] * 1e3) + (ts[1] / 1e6);768};769770771// Escape string for Regex construction772773exports.escapeRegex = function (string) {774775// Escape ^$.*+-?=!:|\/()[]{},776return string.replace(/[\^\$\.\*\+\-\?\=\!\:\|\\\/\(\)\[\]\{\}\,]/g, '\\$&');777};778779780// Base64url (RFC 4648) encode781782exports.base64urlEncode = function (value, encoding) {783784var buf = (Buffer.isBuffer(value) ? value : new Buffer(value, encoding || 'binary'));785return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');786};787788789// Base64url (RFC 4648) decode790791exports.base64urlDecode = function (value, encoding) {792793if (value &&794!/^[\w\-]*$/.test(value)) {795796return new Error('Invalid character');797}798799try {800var buf = new Buffer(value, 'base64');801return (encoding === 'buffer' ? buf : buf.toString(encoding || 'binary'));802}803catch (err) {804return err;805}806};807808809// Escape attribute value for use in HTTP header810811exports.escapeHeaderAttribute = function (attribute) {812813// Allowed value characters: !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9, \, "814815exports.assert(/^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~\"\\]*$/.test(attribute), 'Bad attribute value (' + attribute + ')');816817return attribute.replace(/\\/g, '\\\\').replace(/\"/g, '\\"'); // Escape quotes and slash818};819820821exports.escapeHtml = function (string) {822823return Escape.escapeHtml(string);824};825826827exports.escapeJavaScript = function (string) {828829return Escape.escapeJavaScript(string);830};831832833exports.nextTick = function (callback) {834835return function () {836837var args = arguments;838process.nextTick(function () {839840callback.apply(null, args);841});842};843};844845846exports.once = function (method) {847848if (method._hoekOnce) {849return method;850}851852var once = false;853var wrapped = function () {854855if (!once) {856once = true;857method.apply(null, arguments);858}859};860861wrapped._hoekOnce = true;862863return wrapped;864};865866867exports.isAbsolutePath = function (path, platform) {868869if (!path) {870return false;871}872873if (Path.isAbsolute) { // node >= 0.11874return Path.isAbsolute(path);875}876877platform = platform || process.platform;878879// Unix880881if (platform !== 'win32') {882return path[0] === '/';883}884885// Windows886887return !!/^(?:[a-zA-Z]:[\\\/])|(?:[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/])/.test(path); // C:\ or \\something\something888};889890891exports.isInteger = function (value) {892893return (typeof value === 'number' &&894parseFloat(value) === parseInt(value, 10) &&895!isNaN(value));896};897898899exports.ignore = function () { };900901902exports.inherits = Util.inherits;903904905exports.format = Util.format;906907908exports.transform = function (source, transform, options) {909910exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source object: must be null, undefined, or an object');911912var result = {};913var keys = Object.keys(transform);914915for (var k = 0, kl = keys.length; k < kl; ++k) {916var key = keys[k];917var path = key.split('.');918var sourcePath = transform[key];919920exports.assert(typeof sourcePath === 'string', 'All mappings must be "." delineated strings');921922var segment;923var res = result;924925while (path.length > 1) {926segment = path.shift();927if (!res[segment]) {928res[segment] = {};929}930res = res[segment];931}932segment = path.shift();933res[segment] = exports.reach(source, sourcePath, options);934}935936return result;937};938939940exports.uniqueFilename = function (path, extension) {941942if (extension) {943extension = extension[0] !== '.' ? '.' + extension : extension;944}945else {946extension = '';947}948949path = Path.resolve(path);950var name = [Date.now(), process.pid, Crypto.randomBytes(8).toString('hex')].join('-') + extension;951return Path.join(path, name);952};953954955exports.stringify = function () {956957try {958return JSON.stringify.apply(null, arguments);959}960catch (err) {961return '[Cannot display object: ' + err.message + ']';962}963};964965966exports.shallow = function (source) {967968var target = {};969var keys = Object.keys(source);970for (var i = 0, il = keys.length; i < il; ++i) {971var key = keys[i];972target[key] = source[key];973}974975return target;976};977978979