Comparing version 0.0.1 to 0.0.2
946
bundle.js
@@ -1,2 +0,2 @@ | ||
;(function(e,t,n){function r(n,i){if(!t[n]){if(!e[n]){var s=typeof require=="function"&&require;if(!i&&s)return s(n,!0);throw new Error("Cannot find module '"+n+"'")}var o=t[n]={exports:{}};e[n][0](function(t){var i=e[n][1][t];return r(i?i:t)},o,o.exports)}return t[n].exports}for(var i=0;i<n.length;i++)r(n[i]);return r})({1:[function(require,module,exports){ | ||
;(function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){ | ||
function xhr(url, callback, cors) { | ||
@@ -8,3 +8,3 @@ | ||
var x; | ||
var x, twoHundred = /^2\d\d$/; | ||
@@ -23,12 +23,15 @@ if (cors && ( | ||
function loaded() { | ||
if (twoHundred.test(x.status)) callback.call(x, null, x); | ||
else callback.call(x, x, null); | ||
} | ||
// Both `onreadystatechange` and `onload` can fire. `onreadystatechange` | ||
// has [been supported for longer](http://stackoverflow.com/a/9181508/229001). | ||
if ('onload' in x) { | ||
x.onload = function load() { | ||
callback.call(this, null, this); | ||
}; | ||
x.onload = loaded; | ||
} else { | ||
x.readystatechange = function readystate() { | ||
if (this.readyState === 4) { | ||
callback.call(this, null, this); | ||
x.onreadystatechange = function readystate() { | ||
if (x.readyState === 4) { | ||
loaded(); | ||
} | ||
@@ -41,3 +44,3 @@ }; | ||
x.onerror = function error(evt) { | ||
callback.call(this, evt); | ||
callback.call(this, evt, null); | ||
callback = function() { }; | ||
@@ -48,4 +51,13 @@ }; | ||
x.onprogress = function() { }; | ||
x.ontimeout = function() { }; | ||
x.ontimeout = function(evt) { | ||
callback.call(this, evt, null); | ||
callback = function() { }; | ||
}; | ||
x.onabort = function(evt) { | ||
callback.call(this, evt, null); | ||
callback = function() { }; | ||
}; | ||
// GET is the only supported HTTP Verb by XDomainRequest and is the | ||
@@ -87,2 +99,10 @@ // only one supported here. | ||
t.plan(2); | ||
xhr('http://b.tiles.mapbox.com/v3/foo.bar.json', function(err, resp) { | ||
t.equal(err.status, 404); | ||
t.equal(resp, undefined); | ||
}, true); | ||
}); | ||
test('handling a DNS error', function (t) { | ||
t.plan(2); | ||
xhr('http://btiles.mapbox.com/v3/tmcw.dem.json', function(err, resp) { | ||
@@ -315,3 +335,3 @@ t.equal(err.type, 'error'); | ||
})(require("__browserify_process")) | ||
},{"./lib/default_stream":5,"./lib/render":6,"./lib/test":7,"__browserify_process":4}],5:[function(require,module,exports){ | ||
},{"./lib/render":5,"./lib/default_stream":6,"./lib/test":7,"__browserify_process":4}],6:[function(require,module,exports){ | ||
var Stream = require('stream'); | ||
@@ -348,3 +368,181 @@ | ||
},{"stream":8}],8:[function(require,module,exports){ | ||
},{"stream":8}],9:[function(require,module,exports){ | ||
(function(process){function filter (xs, fn) { | ||
var res = []; | ||
for (var i = 0; i < xs.length; i++) { | ||
if (fn(xs[i], i, xs)) res.push(xs[i]); | ||
} | ||
return res; | ||
} | ||
// resolves . and .. elements in a path array with directory names there | ||
// must be no slashes, empty elements, or device names (c:\) in the array | ||
// (so also no leading and trailing slashes - it does not distinguish | ||
// relative and absolute paths) | ||
function normalizeArray(parts, allowAboveRoot) { | ||
// if the path tries to go above the root, `up` ends up > 0 | ||
var up = 0; | ||
for (var i = parts.length; i >= 0; i--) { | ||
var last = parts[i]; | ||
if (last == '.') { | ||
parts.splice(i, 1); | ||
} else if (last === '..') { | ||
parts.splice(i, 1); | ||
up++; | ||
} else if (up) { | ||
parts.splice(i, 1); | ||
up--; | ||
} | ||
} | ||
// if the path is allowed to go above the root, restore leading ..s | ||
if (allowAboveRoot) { | ||
for (; up--; up) { | ||
parts.unshift('..'); | ||
} | ||
} | ||
return parts; | ||
} | ||
// Regex to split a filename into [*, dir, basename, ext] | ||
// posix version | ||
var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/; | ||
// path.resolve([from ...], to) | ||
// posix version | ||
exports.resolve = function() { | ||
var resolvedPath = '', | ||
resolvedAbsolute = false; | ||
for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) { | ||
var path = (i >= 0) | ||
? arguments[i] | ||
: process.cwd(); | ||
// Skip empty and invalid entries | ||
if (typeof path !== 'string' || !path) { | ||
continue; | ||
} | ||
resolvedPath = path + '/' + resolvedPath; | ||
resolvedAbsolute = path.charAt(0) === '/'; | ||
} | ||
// At this point the path should be resolved to a full absolute path, but | ||
// handle relative paths to be safe (might happen when process.cwd() fails) | ||
// Normalize the path | ||
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { | ||
return !!p; | ||
}), !resolvedAbsolute).join('/'); | ||
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; | ||
}; | ||
// path.normalize(path) | ||
// posix version | ||
exports.normalize = function(path) { | ||
var isAbsolute = path.charAt(0) === '/', | ||
trailingSlash = path.slice(-1) === '/'; | ||
// Normalize the path | ||
path = normalizeArray(filter(path.split('/'), function(p) { | ||
return !!p; | ||
}), !isAbsolute).join('/'); | ||
if (!path && !isAbsolute) { | ||
path = '.'; | ||
} | ||
if (path && trailingSlash) { | ||
path += '/'; | ||
} | ||
return (isAbsolute ? '/' : '') + path; | ||
}; | ||
// posix version | ||
exports.join = function() { | ||
var paths = Array.prototype.slice.call(arguments, 0); | ||
return exports.normalize(filter(paths, function(p, index) { | ||
return p && typeof p === 'string'; | ||
}).join('/')); | ||
}; | ||
exports.dirname = function(path) { | ||
var dir = splitPathRe.exec(path)[1] || ''; | ||
var isWindows = false; | ||
if (!dir) { | ||
// No dirname | ||
return '.'; | ||
} else if (dir.length === 1 || | ||
(isWindows && dir.length <= 3 && dir.charAt(1) === ':')) { | ||
// It is just a slash or a drive letter with a slash | ||
return dir; | ||
} else { | ||
// It is a full dirname, strip trailing slash | ||
return dir.substring(0, dir.length - 1); | ||
} | ||
}; | ||
exports.basename = function(path, ext) { | ||
var f = splitPathRe.exec(path)[2] || ''; | ||
// TODO: make this comparison case-insensitive on windows? | ||
if (ext && f.substr(-1 * ext.length) === ext) { | ||
f = f.substr(0, f.length - ext.length); | ||
} | ||
return f; | ||
}; | ||
exports.extname = function(path) { | ||
return splitPathRe.exec(path)[3] || ''; | ||
}; | ||
exports.relative = function(from, to) { | ||
from = exports.resolve(from).substr(1); | ||
to = exports.resolve(to).substr(1); | ||
function trim(arr) { | ||
var start = 0; | ||
for (; start < arr.length; start++) { | ||
if (arr[start] !== '') break; | ||
} | ||
var end = arr.length - 1; | ||
for (; end >= 0; end--) { | ||
if (arr[end] !== '') break; | ||
} | ||
if (start > end) return []; | ||
return arr.slice(start, end - start + 1); | ||
} | ||
var fromParts = trim(from.split('/')); | ||
var toParts = trim(to.split('/')); | ||
var length = Math.min(fromParts.length, toParts.length); | ||
var samePartsLength = length; | ||
for (var i = 0; i < length; i++) { | ||
if (fromParts[i] !== toParts[i]) { | ||
samePartsLength = i; | ||
break; | ||
} | ||
} | ||
var outputParts = []; | ||
for (var i = samePartsLength; i < fromParts.length; i++) { | ||
outputParts.push('..'); | ||
} | ||
outputParts = outputParts.concat(toParts.slice(samePartsLength)); | ||
return outputParts.join('/'); | ||
}; | ||
})(require("__browserify_process")) | ||
},{"__browserify_process":4}],8:[function(require,module,exports){ | ||
var events = require('events'); | ||
@@ -470,3 +668,3 @@ var util = require('util'); | ||
},{"events":9,"util":10}],9:[function(require,module,exports){ | ||
},{"events":10,"util":11}],10:[function(require,module,exports){ | ||
(function(process){if (!process.EventEmitter) process.EventEmitter = function () {}; | ||
@@ -658,180 +856,2 @@ | ||
},{"__browserify_process":4}],11:[function(require,module,exports){ | ||
(function(process){function filter (xs, fn) { | ||
var res = []; | ||
for (var i = 0; i < xs.length; i++) { | ||
if (fn(xs[i], i, xs)) res.push(xs[i]); | ||
} | ||
return res; | ||
} | ||
// resolves . and .. elements in a path array with directory names there | ||
// must be no slashes, empty elements, or device names (c:\) in the array | ||
// (so also no leading and trailing slashes - it does not distinguish | ||
// relative and absolute paths) | ||
function normalizeArray(parts, allowAboveRoot) { | ||
// if the path tries to go above the root, `up` ends up > 0 | ||
var up = 0; | ||
for (var i = parts.length; i >= 0; i--) { | ||
var last = parts[i]; | ||
if (last == '.') { | ||
parts.splice(i, 1); | ||
} else if (last === '..') { | ||
parts.splice(i, 1); | ||
up++; | ||
} else if (up) { | ||
parts.splice(i, 1); | ||
up--; | ||
} | ||
} | ||
// if the path is allowed to go above the root, restore leading ..s | ||
if (allowAboveRoot) { | ||
for (; up--; up) { | ||
parts.unshift('..'); | ||
} | ||
} | ||
return parts; | ||
} | ||
// Regex to split a filename into [*, dir, basename, ext] | ||
// posix version | ||
var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/; | ||
// path.resolve([from ...], to) | ||
// posix version | ||
exports.resolve = function() { | ||
var resolvedPath = '', | ||
resolvedAbsolute = false; | ||
for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) { | ||
var path = (i >= 0) | ||
? arguments[i] | ||
: process.cwd(); | ||
// Skip empty and invalid entries | ||
if (typeof path !== 'string' || !path) { | ||
continue; | ||
} | ||
resolvedPath = path + '/' + resolvedPath; | ||
resolvedAbsolute = path.charAt(0) === '/'; | ||
} | ||
// At this point the path should be resolved to a full absolute path, but | ||
// handle relative paths to be safe (might happen when process.cwd() fails) | ||
// Normalize the path | ||
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { | ||
return !!p; | ||
}), !resolvedAbsolute).join('/'); | ||
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; | ||
}; | ||
// path.normalize(path) | ||
// posix version | ||
exports.normalize = function(path) { | ||
var isAbsolute = path.charAt(0) === '/', | ||
trailingSlash = path.slice(-1) === '/'; | ||
// Normalize the path | ||
path = normalizeArray(filter(path.split('/'), function(p) { | ||
return !!p; | ||
}), !isAbsolute).join('/'); | ||
if (!path && !isAbsolute) { | ||
path = '.'; | ||
} | ||
if (path && trailingSlash) { | ||
path += '/'; | ||
} | ||
return (isAbsolute ? '/' : '') + path; | ||
}; | ||
// posix version | ||
exports.join = function() { | ||
var paths = Array.prototype.slice.call(arguments, 0); | ||
return exports.normalize(filter(paths, function(p, index) { | ||
return p && typeof p === 'string'; | ||
}).join('/')); | ||
}; | ||
exports.dirname = function(path) { | ||
var dir = splitPathRe.exec(path)[1] || ''; | ||
var isWindows = false; | ||
if (!dir) { | ||
// No dirname | ||
return '.'; | ||
} else if (dir.length === 1 || | ||
(isWindows && dir.length <= 3 && dir.charAt(1) === ':')) { | ||
// It is just a slash or a drive letter with a slash | ||
return dir; | ||
} else { | ||
// It is a full dirname, strip trailing slash | ||
return dir.substring(0, dir.length - 1); | ||
} | ||
}; | ||
exports.basename = function(path, ext) { | ||
var f = splitPathRe.exec(path)[2] || ''; | ||
// TODO: make this comparison case-insensitive on windows? | ||
if (ext && f.substr(-1 * ext.length) === ext) { | ||
f = f.substr(0, f.length - ext.length); | ||
} | ||
return f; | ||
}; | ||
exports.extname = function(path) { | ||
return splitPathRe.exec(path)[3] || ''; | ||
}; | ||
exports.relative = function(from, to) { | ||
from = exports.resolve(from).substr(1); | ||
to = exports.resolve(to).substr(1); | ||
function trim(arr) { | ||
var start = 0; | ||
for (; start < arr.length; start++) { | ||
if (arr[start] !== '') break; | ||
} | ||
var end = arr.length - 1; | ||
for (; end >= 0; end--) { | ||
if (arr[end] !== '') break; | ||
} | ||
if (start > end) return []; | ||
return arr.slice(start, end - start + 1); | ||
} | ||
var fromParts = trim(from.split('/')); | ||
var toParts = trim(to.split('/')); | ||
var length = Math.min(fromParts.length, toParts.length); | ||
var samePartsLength = length; | ||
for (var i = 0; i < length; i++) { | ||
if (fromParts[i] !== toParts[i]) { | ||
samePartsLength = i; | ||
break; | ||
} | ||
} | ||
var outputParts = []; | ||
for (var i = samePartsLength; i < fromParts.length; i++) { | ||
outputParts.push('..'); | ||
} | ||
outputParts = outputParts.concat(toParts.slice(samePartsLength)); | ||
return outputParts.join('/'); | ||
}; | ||
})(require("__browserify_process")) | ||
},{"__browserify_process":4}],10:[function(require,module,exports){ | ||
var events = require('events'); | ||
@@ -1189,3 +1209,130 @@ | ||
},{"events":9}],7:[function(require,module,exports){ | ||
},{"events":10}],5:[function(require,module,exports){ | ||
var Stream = require('stream'); | ||
var json = typeof JSON === 'object' ? JSON : require('jsonify'); | ||
module.exports = Render; | ||
function Render () { | ||
Stream.call(this); | ||
this.readable = true; | ||
this.count = 0; | ||
this.fail = 0; | ||
this.pass = 0; | ||
} | ||
Render.prototype = new Stream; | ||
Render.prototype.pipe = function () { | ||
this.piped = true; | ||
return Stream.prototype.pipe.apply(this, arguments); | ||
}; | ||
Render.prototype.begin = function () { | ||
this.emit('data', 'TAP version 13\n'); | ||
}; | ||
Render.prototype.push = function (t) { | ||
var self = this; | ||
this.emit('data', '# ' + t.name + '\n'); | ||
t.on('result', function (res) { | ||
if (typeof res === 'string') { | ||
self.emit('data', '# ' + res + '\n'); | ||
return; | ||
} | ||
self.emit('data', encodeResult(res, self.count + 1)); | ||
self.count ++; | ||
if (res.ok) self.pass ++ | ||
else self.fail ++ | ||
}); | ||
}; | ||
Render.prototype.close = function () { | ||
this.emit('data', '\n1..' + this.count + '\n'); | ||
this.emit('data', '# tests ' + this.count + '\n'); | ||
this.emit('data', '# pass ' + this.pass + '\n'); | ||
if (this.fail) { | ||
this.emit('data', '# fail ' + this.fail + '\n'); | ||
} | ||
else { | ||
this.emit('data', '\n# ok\n'); | ||
} | ||
this.emit('end'); | ||
}; | ||
function encodeResult (res, count) { | ||
var output = ''; | ||
output += (res.ok ? 'ok ' : 'not ok ') + count; | ||
output += res.name ? ' ' + res.name.replace(/\s+/g, ' ') : ''; | ||
if (res.skip) output += ' # SKIP'; | ||
else if (res.todo) output += ' # TODO'; | ||
output += '\n'; | ||
if (!res.ok) { | ||
var outer = ' '; | ||
var inner = outer + ' '; | ||
output += outer + '---\n'; | ||
output += inner + 'operator: ' + res.operator + '\n'; | ||
var ex = json.stringify(res.expected, getSerialize()) || ''; | ||
var ac = json.stringify(res.actual, getSerialize()) || ''; | ||
if (Math.max(ex.length, ac.length) > 65) { | ||
output += inner + 'expected:\n' + inner + ' ' + ex + '\n'; | ||
output += inner + 'actual:\n' + inner + ' ' + ac + '\n'; | ||
} | ||
else { | ||
output += inner + 'expected: ' + ex + '\n'; | ||
output += inner + 'actual: ' + ac + '\n'; | ||
} | ||
if (res.at) { | ||
output += inner + 'at: ' + res.at + '\n'; | ||
} | ||
if (res.operator === 'error' && res.actual && res.actual.stack) { | ||
var lines = String(res.actual.stack).split('\n'); | ||
output += inner + 'stack:\n'; | ||
output += inner + ' ' + lines[0] + '\n'; | ||
for (var i = 1; i < lines.length; i++) { | ||
output += inner + lines[i] + '\n'; | ||
} | ||
} | ||
output += outer + '...\n'; | ||
} | ||
return output; | ||
} | ||
function getSerialize() { | ||
var seen = []; | ||
return function (key, value) { | ||
var ret = value; | ||
if (typeof value === 'object' && value) { | ||
var found = false | ||
for (var i = 0; i < seen.length; i++) { | ||
if (seen[i] === value) { | ||
found = true | ||
break; | ||
} | ||
} | ||
if (found) { | ||
ret = '[Circular]' | ||
} else { | ||
seen.push(value) | ||
} | ||
} | ||
return ret | ||
} | ||
} | ||
},{"stream":8,"jsonify":12}],7:[function(require,module,exports){ | ||
(function(process,__dirname){var EventEmitter = require('events').EventEmitter; | ||
@@ -1540,3 +1687,3 @@ var deepEqual = require('deep-equal'); | ||
})(require("__browserify_process"),"/../node_modules/tape/lib") | ||
},{"events":9,"path":11,"deep-equal":12,"defined":13,"__browserify_process":4}],12:[function(require,module,exports){ | ||
},{"events":10,"path":9,"deep-equal":13,"defined":14,"__browserify_process":4}],13:[function(require,module,exports){ | ||
var pSlice = Array.prototype.slice; | ||
@@ -1627,3 +1774,3 @@ var Object_keys = typeof Object.keys === 'function' | ||
},{}],13:[function(require,module,exports){ | ||
},{}],14:[function(require,module,exports){ | ||
module.exports = function () { | ||
@@ -1635,134 +1782,163 @@ for (var i = 0; i < arguments.length; i++) { | ||
},{}],6:[function(require,module,exports){ | ||
var Stream = require('stream'); | ||
var json = typeof JSON === 'object' ? JSON : require('jsonify'); | ||
},{}],12:[function(require,module,exports){ | ||
exports.parse = require('./lib/parse'); | ||
exports.stringify = require('./lib/stringify'); | ||
module.exports = Render; | ||
},{"./lib/stringify":15,"./lib/parse":16}],15:[function(require,module,exports){ | ||
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, | ||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, | ||
gap, | ||
indent, | ||
meta = { // table of character substitutions | ||
'\b': '\\b', | ||
'\t': '\\t', | ||
'\n': '\\n', | ||
'\f': '\\f', | ||
'\r': '\\r', | ||
'"' : '\\"', | ||
'\\': '\\\\' | ||
}, | ||
rep; | ||
function Render () { | ||
Stream.call(this); | ||
this.readable = true; | ||
this.count = 0; | ||
this.fail = 0; | ||
this.pass = 0; | ||
function quote(string) { | ||
// If the string contains no control characters, no quote characters, and no | ||
// backslash characters, then we can safely slap some quotes around it. | ||
// Otherwise we must also replace the offending characters with safe escape | ||
// sequences. | ||
escapable.lastIndex = 0; | ||
return escapable.test(string) ? '"' + string.replace(escapable, function (a) { | ||
var c = meta[a]; | ||
return typeof c === 'string' ? c : | ||
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); | ||
}) + '"' : '"' + string + '"'; | ||
} | ||
Render.prototype = new Stream; | ||
Render.prototype.pipe = function () { | ||
this.piped = true; | ||
return Stream.prototype.pipe.apply(this, arguments); | ||
}; | ||
Render.prototype.begin = function () { | ||
this.emit('data', 'TAP version 13\n'); | ||
}; | ||
Render.prototype.push = function (t) { | ||
var self = this; | ||
this.emit('data', '# ' + t.name + '\n'); | ||
function str(key, holder) { | ||
// Produce a string from holder[key]. | ||
var i, // The loop counter. | ||
k, // The member key. | ||
v, // The member value. | ||
length, | ||
mind = gap, | ||
partial, | ||
value = holder[key]; | ||
t.on('result', function (res) { | ||
if (typeof res === 'string') { | ||
self.emit('data', '# ' + res + '\n'); | ||
return; | ||
} | ||
self.emit('data', encodeResult(res, self.count + 1)); | ||
self.count ++; | ||
if (res.ok) self.pass ++ | ||
else self.fail ++ | ||
}); | ||
}; | ||
Render.prototype.close = function () { | ||
this.emit('data', '\n1..' + this.count + '\n'); | ||
this.emit('data', '# tests ' + this.count + '\n'); | ||
this.emit('data', '# pass ' + this.pass + '\n'); | ||
if (this.fail) { | ||
this.emit('data', '# fail ' + this.fail + '\n'); | ||
// If the value has a toJSON method, call it to obtain a replacement value. | ||
if (value && typeof value === 'object' && | ||
typeof value.toJSON === 'function') { | ||
value = value.toJSON(key); | ||
} | ||
else { | ||
this.emit('data', '\n# ok\n'); | ||
// If we were called with a replacer function, then call the replacer to | ||
// obtain a replacement value. | ||
if (typeof rep === 'function') { | ||
value = rep.call(holder, key, value); | ||
} | ||
this.emit('end'); | ||
}; | ||
function encodeResult (res, count) { | ||
var output = ''; | ||
output += (res.ok ? 'ok ' : 'not ok ') + count; | ||
output += res.name ? ' ' + res.name.replace(/\s+/g, ' ') : ''; | ||
if (res.skip) output += ' # SKIP'; | ||
else if (res.todo) output += ' # TODO'; | ||
output += '\n'; | ||
if (!res.ok) { | ||
var outer = ' '; | ||
var inner = outer + ' '; | ||
output += outer + '---\n'; | ||
output += inner + 'operator: ' + res.operator + '\n'; | ||
// What happens next depends on the value's type. | ||
switch (typeof value) { | ||
case 'string': | ||
return quote(value); | ||
var ex = json.stringify(res.expected, getSerialize()) || ''; | ||
var ac = json.stringify(res.actual, getSerialize()) || ''; | ||
case 'number': | ||
// JSON numbers must be finite. Encode non-finite numbers as null. | ||
return isFinite(value) ? String(value) : 'null'; | ||
if (Math.max(ex.length, ac.length) > 65) { | ||
output += inner + 'expected:\n' + inner + ' ' + ex + '\n'; | ||
output += inner + 'actual:\n' + inner + ' ' + ac + '\n'; | ||
} | ||
else { | ||
output += inner + 'expected: ' + ex + '\n'; | ||
output += inner + 'actual: ' + ac + '\n'; | ||
} | ||
if (res.at) { | ||
output += inner + 'at: ' + res.at + '\n'; | ||
} | ||
if (res.operator === 'error' && res.actual && res.actual.stack) { | ||
var lines = String(res.actual.stack).split('\n'); | ||
output += inner + 'stack:\n'; | ||
output += inner + ' ' + lines[0] + '\n'; | ||
for (var i = 1; i < lines.length; i++) { | ||
output += inner + lines[i] + '\n'; | ||
case 'boolean': | ||
case 'null': | ||
// If the value is a boolean or null, convert it to a string. Note: | ||
// typeof null does not produce 'null'. The case is included here in | ||
// the remote chance that this gets fixed someday. | ||
return String(value); | ||
case 'object': | ||
if (!value) return 'null'; | ||
gap += indent; | ||
partial = []; | ||
// Array.isArray | ||
if (Object.prototype.toString.apply(value) === '[object Array]') { | ||
length = value.length; | ||
for (i = 0; i < length; i += 1) { | ||
partial[i] = str(i, value) || 'null'; | ||
} | ||
// Join all of the elements together, separated with commas, and | ||
// wrap them in brackets. | ||
v = partial.length === 0 ? '[]' : gap ? | ||
'[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : | ||
'[' + partial.join(',') + ']'; | ||
gap = mind; | ||
return v; | ||
} | ||
} | ||
output += outer + '...\n'; | ||
} | ||
return output; | ||
} | ||
function getSerialize() { | ||
var seen = []; | ||
return function (key, value) { | ||
var ret = value; | ||
if (typeof value === 'object' && value) { | ||
var found = false | ||
for (var i = 0; i < seen.length; i++) { | ||
if (seen[i] === value) { | ||
found = true | ||
break; | ||
// If the replacer is an array, use it to select the members to be | ||
// stringified. | ||
if (rep && typeof rep === 'object') { | ||
length = rep.length; | ||
for (i = 0; i < length; i += 1) { | ||
k = rep[i]; | ||
if (typeof k === 'string') { | ||
v = str(k, value); | ||
if (v) { | ||
partial.push(quote(k) + (gap ? ': ' : ':') + v); | ||
} | ||
} | ||
} | ||
} | ||
if (found) { | ||
ret = '[Circular]' | ||
} else { | ||
seen.push(value) | ||
else { | ||
// Otherwise, iterate through all of the keys in the object. | ||
for (k in value) { | ||
if (Object.prototype.hasOwnProperty.call(value, k)) { | ||
v = str(k, value); | ||
if (v) { | ||
partial.push(quote(k) + (gap ? ': ' : ':') + v); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
// Join all of the member texts together, separated with commas, | ||
// and wrap them in braces. | ||
return ret | ||
v = partial.length === 0 ? '{}' : gap ? | ||
'{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : | ||
'{' + partial.join(',') + '}'; | ||
gap = mind; | ||
return v; | ||
} | ||
} | ||
},{"stream":8,"jsonify":14}],14:[function(require,module,exports){ | ||
exports.parse = require('./lib/parse'); | ||
exports.stringify = require('./lib/stringify'); | ||
module.exports = function (value, replacer, space) { | ||
var i; | ||
gap = ''; | ||
indent = ''; | ||
// If the space parameter is a number, make an indent string containing that | ||
// many spaces. | ||
if (typeof space === 'number') { | ||
for (i = 0; i < space; i += 1) { | ||
indent += ' '; | ||
} | ||
} | ||
// If the space parameter is a string, it will be used as the indent string. | ||
else if (typeof space === 'string') { | ||
indent = space; | ||
} | ||
},{"./lib/parse":15,"./lib/stringify":16}],15:[function(require,module,exports){ | ||
// If there is a replacer, it must be a function or an array. | ||
// Otherwise, throw an error. | ||
rep = replacer; | ||
if (replacer && typeof replacer !== 'function' | ||
&& (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { | ||
throw new Error('JSON.stringify'); | ||
} | ||
// Make a fake root object containing our value under the key of ''. | ||
// Return the result of stringifying the value. | ||
return str('', {'': value}); | ||
}; | ||
},{}],16:[function(require,module,exports){ | ||
var at, // The index of the current character | ||
@@ -2042,159 +2218,3 @@ ch, // The current character | ||
},{}],16:[function(require,module,exports){ | ||
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, | ||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, | ||
gap, | ||
indent, | ||
meta = { // table of character substitutions | ||
'\b': '\\b', | ||
'\t': '\\t', | ||
'\n': '\\n', | ||
'\f': '\\f', | ||
'\r': '\\r', | ||
'"' : '\\"', | ||
'\\': '\\\\' | ||
}, | ||
rep; | ||
function quote(string) { | ||
// If the string contains no control characters, no quote characters, and no | ||
// backslash characters, then we can safely slap some quotes around it. | ||
// Otherwise we must also replace the offending characters with safe escape | ||
// sequences. | ||
escapable.lastIndex = 0; | ||
return escapable.test(string) ? '"' + string.replace(escapable, function (a) { | ||
var c = meta[a]; | ||
return typeof c === 'string' ? c : | ||
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); | ||
}) + '"' : '"' + string + '"'; | ||
} | ||
function str(key, holder) { | ||
// Produce a string from holder[key]. | ||
var i, // The loop counter. | ||
k, // The member key. | ||
v, // The member value. | ||
length, | ||
mind = gap, | ||
partial, | ||
value = holder[key]; | ||
// If the value has a toJSON method, call it to obtain a replacement value. | ||
if (value && typeof value === 'object' && | ||
typeof value.toJSON === 'function') { | ||
value = value.toJSON(key); | ||
} | ||
// If we were called with a replacer function, then call the replacer to | ||
// obtain a replacement value. | ||
if (typeof rep === 'function') { | ||
value = rep.call(holder, key, value); | ||
} | ||
// What happens next depends on the value's type. | ||
switch (typeof value) { | ||
case 'string': | ||
return quote(value); | ||
case 'number': | ||
// JSON numbers must be finite. Encode non-finite numbers as null. | ||
return isFinite(value) ? String(value) : 'null'; | ||
case 'boolean': | ||
case 'null': | ||
// If the value is a boolean or null, convert it to a string. Note: | ||
// typeof null does not produce 'null'. The case is included here in | ||
// the remote chance that this gets fixed someday. | ||
return String(value); | ||
case 'object': | ||
if (!value) return 'null'; | ||
gap += indent; | ||
partial = []; | ||
// Array.isArray | ||
if (Object.prototype.toString.apply(value) === '[object Array]') { | ||
length = value.length; | ||
for (i = 0; i < length; i += 1) { | ||
partial[i] = str(i, value) || 'null'; | ||
} | ||
// Join all of the elements together, separated with commas, and | ||
// wrap them in brackets. | ||
v = partial.length === 0 ? '[]' : gap ? | ||
'[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : | ||
'[' + partial.join(',') + ']'; | ||
gap = mind; | ||
return v; | ||
} | ||
// If the replacer is an array, use it to select the members to be | ||
// stringified. | ||
if (rep && typeof rep === 'object') { | ||
length = rep.length; | ||
for (i = 0; i < length; i += 1) { | ||
k = rep[i]; | ||
if (typeof k === 'string') { | ||
v = str(k, value); | ||
if (v) { | ||
partial.push(quote(k) + (gap ? ': ' : ':') + v); | ||
} | ||
} | ||
} | ||
} | ||
else { | ||
// Otherwise, iterate through all of the keys in the object. | ||
for (k in value) { | ||
if (Object.prototype.hasOwnProperty.call(value, k)) { | ||
v = str(k, value); | ||
if (v) { | ||
partial.push(quote(k) + (gap ? ': ' : ':') + v); | ||
} | ||
} | ||
} | ||
} | ||
// Join all of the member texts together, separated with commas, | ||
// and wrap them in braces. | ||
v = partial.length === 0 ? '{}' : gap ? | ||
'{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : | ||
'{' + partial.join(',') + '}'; | ||
gap = mind; | ||
return v; | ||
} | ||
} | ||
module.exports = function (value, replacer, space) { | ||
var i; | ||
gap = ''; | ||
indent = ''; | ||
// If the space parameter is a number, make an indent string containing that | ||
// many spaces. | ||
if (typeof space === 'number') { | ||
for (i = 0; i < space; i += 1) { | ||
indent += ' '; | ||
} | ||
} | ||
// If the space parameter is a string, it will be used as the indent string. | ||
else if (typeof space === 'string') { | ||
indent = space; | ||
} | ||
// If there is a replacer, it must be a function or an array. | ||
// Otherwise, throw an error. | ||
rep = replacer; | ||
if (replacer && typeof replacer !== 'function' | ||
&& (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { | ||
throw new Error('JSON.stringify'); | ||
} | ||
// Make a fake root object containing our value under the key of ''. | ||
// Return the result of stringifying the value. | ||
return str('', {'': value}); | ||
}; | ||
},{}]},{},[2]) | ||
; |
@@ -7,3 +7,3 @@ function xhr(url, callback, cors) { | ||
var x, twoHundred = /^20\d$/; | ||
var x, twoHundred = /^2\d\d$/; | ||
@@ -22,13 +22,15 @@ if (cors && ( | ||
function loaded() { | ||
if (twoHundred.test(x.status)) callback.call(x, null, x); | ||
else callback.call(x, x, null); | ||
} | ||
// Both `onreadystatechange` and `onload` can fire. `onreadystatechange` | ||
// has [been supported for longer](http://stackoverflow.com/a/9181508/229001). | ||
if ('onload' in x) { | ||
x.onload = function load() { | ||
callback.call(this, null, this); | ||
}; | ||
x.onload = loaded; | ||
} else { | ||
x.onreadystatechange = function readystate() { | ||
if (this.readyState === 4) { | ||
if (twoHundred.test(this.status)) callback.call(this, null, this); | ||
else callback.call(this, this, null); | ||
if (x.readyState === 4) { | ||
loaded(); | ||
} | ||
@@ -41,3 +43,3 @@ }; | ||
x.onerror = function error(evt) { | ||
callback.call(this, evt); | ||
callback.call(this, evt, null); | ||
callback = function() { }; | ||
@@ -49,9 +51,9 @@ }; | ||
x.ontimeout = function() { | ||
callback.call(this, evt); | ||
x.ontimeout = function(evt) { | ||
callback.call(this, evt, null); | ||
callback = function() { }; | ||
}; | ||
x.onabort = function() { | ||
callback.call(this, evt); | ||
x.onabort = function(evt) { | ||
callback.call(this, evt, null); | ||
callback = function() { }; | ||
@@ -58,0 +60,0 @@ }; |
{ | ||
"name": "corslite", | ||
"version": "0.0.1", | ||
"version": "0.0.2", | ||
"description": "xhr for browsers and ie", | ||
@@ -15,3 +15,4 @@ "main": "corslite.js", | ||
"tape": "~0.3.3", | ||
"tap": "~0.4.0" | ||
"tap": "~0.4.0", | ||
"browserify": "~2.12.0" | ||
}, | ||
@@ -18,0 +19,0 @@ "testling": { |
@@ -24,2 +24,10 @@ var test = require('tape'), | ||
t.plan(2); | ||
xhr('http://b.tiles.mapbox.com/v3/foo.bar.json', function(err, resp) { | ||
t.equal(err.status, 404); | ||
t.equal(resp, undefined); | ||
}, true); | ||
}); | ||
test('handling a DNS error', function (t) { | ||
t.plan(2); | ||
xhr('http://btiles.mapbox.com/v3/tmcw.dem.json', function(err, resp) { | ||
@@ -26,0 +34,0 @@ t.equal(err.type, 'error'); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
90586
18
3
1965
3
1