jsonify
Advanced tools
Comparing version 0.0.0 to 0.0.1
@@ -0,2 +1,4 @@ | ||
'use strict'; | ||
exports.parse = require('./lib/parse'); | ||
exports.stringify = require('./lib/stringify'); |
490
lib/parse.js
@@ -1,273 +0,261 @@ | ||
var at, // The index of the current character | ||
ch, // The current character | ||
escapee = { | ||
'"': '"', | ||
'\\': '\\', | ||
'/': '/', | ||
b: '\b', | ||
f: '\f', | ||
n: '\n', | ||
r: '\r', | ||
t: '\t' | ||
}, | ||
text, | ||
'use strict'; | ||
error = function (m) { | ||
// Call error when something is wrong. | ||
throw { | ||
name: 'SyntaxError', | ||
message: m, | ||
at: at, | ||
text: text | ||
}; | ||
}, | ||
next = function (c) { | ||
// If a c parameter is provided, verify that it matches the current character. | ||
if (c && c !== ch) { | ||
error("Expected '" + c + "' instead of '" + ch + "'"); | ||
} | ||
// Get the next character. When there are no more characters, | ||
// return the empty string. | ||
ch = text.charAt(at); | ||
at += 1; | ||
return ch; | ||
}, | ||
number = function () { | ||
// Parse a number value. | ||
var number, | ||
string = ''; | ||
if (ch === '-') { | ||
string = '-'; | ||
next('-'); | ||
} | ||
while (ch >= '0' && ch <= '9') { | ||
string += ch; | ||
next(); | ||
} | ||
if (ch === '.') { | ||
string += '.'; | ||
while (next() && ch >= '0' && ch <= '9') { | ||
string += ch; | ||
} | ||
} | ||
if (ch === 'e' || ch === 'E') { | ||
string += ch; | ||
next(); | ||
if (ch === '-' || ch === '+') { | ||
string += ch; | ||
next(); | ||
} | ||
while (ch >= '0' && ch <= '9') { | ||
string += ch; | ||
next(); | ||
} | ||
} | ||
number = +string; | ||
if (!isFinite(number)) { | ||
error("Bad number"); | ||
} else { | ||
return number; | ||
} | ||
}, | ||
string = function () { | ||
// Parse a string value. | ||
var hex, | ||
i, | ||
string = '', | ||
uffff; | ||
// When parsing for string values, we must look for " and \ characters. | ||
if (ch === '"') { | ||
while (next()) { | ||
if (ch === '"') { | ||
next(); | ||
return string; | ||
} else if (ch === '\\') { | ||
next(); | ||
if (ch === 'u') { | ||
uffff = 0; | ||
for (i = 0; i < 4; i += 1) { | ||
hex = parseInt(next(), 16); | ||
if (!isFinite(hex)) { | ||
break; | ||
} | ||
uffff = uffff * 16 + hex; | ||
} | ||
string += String.fromCharCode(uffff); | ||
} else if (typeof escapee[ch] === 'string') { | ||
string += escapee[ch]; | ||
} else { | ||
break; | ||
} | ||
} else { | ||
string += ch; | ||
} | ||
} | ||
} | ||
error("Bad string"); | ||
}, | ||
var at; // The index of the current character | ||
var ch; // The current character | ||
var escapee = { | ||
'"': '"', | ||
'\\': '\\', | ||
'/': '/', | ||
b: '\b', | ||
f: '\f', | ||
n: '\n', | ||
r: '\r', | ||
t: '\t' | ||
}; | ||
var text; | ||
white = function () { | ||
// Call error when something is wrong. | ||
function error(m) { | ||
throw { | ||
name: 'SyntaxError', | ||
message: m, | ||
at: at, | ||
text: text | ||
}; | ||
} | ||
// Skip whitespace. | ||
function next(c) { | ||
// If a c parameter is provided, verify that it matches the current character. | ||
if (c && c !== ch) { | ||
error("Expected '" + c + "' instead of '" + ch + "'"); | ||
} | ||
while (ch && ch <= ' ') { | ||
next(); | ||
} | ||
}, | ||
// Get the next character. When there are no more characters, return the empty string. | ||
word = function () { | ||
ch = text.charAt(at); | ||
at += 1; | ||
return ch; | ||
} | ||
// true, false, or null. | ||
function number() { | ||
// Parse a number value. | ||
var num; | ||
var str = ''; | ||
switch (ch) { | ||
case 't': | ||
next('t'); | ||
next('r'); | ||
next('u'); | ||
next('e'); | ||
return true; | ||
case 'f': | ||
next('f'); | ||
next('a'); | ||
next('l'); | ||
next('s'); | ||
next('e'); | ||
return false; | ||
case 'n': | ||
next('n'); | ||
next('u'); | ||
next('l'); | ||
next('l'); | ||
return null; | ||
} | ||
error("Unexpected '" + ch + "'"); | ||
}, | ||
if (ch === '-') { | ||
str = '-'; | ||
next('-'); | ||
} | ||
while (ch >= '0' && ch <= '9') { | ||
str += ch; | ||
next(); | ||
} | ||
if (ch === '.') { | ||
str += '.'; | ||
while (next() && ch >= '0' && ch <= '9') { | ||
str += ch; | ||
} | ||
} | ||
if (ch === 'e' || ch === 'E') { | ||
str += ch; | ||
next(); | ||
if (ch === '-' || ch === '+') { | ||
str += ch; | ||
next(); | ||
} | ||
while (ch >= '0' && ch <= '9') { | ||
str += ch; | ||
next(); | ||
} | ||
} | ||
num = Number(str); | ||
if (!isFinite(num)) { | ||
error('Bad number'); | ||
} | ||
return num; | ||
} | ||
value, // Place holder for the value function. | ||
function string() { | ||
// Parse a string value. | ||
var hex; | ||
var i; | ||
var str = ''; | ||
var uffff; | ||
array = function () { | ||
// When parsing for string values, we must look for " and \ characters. | ||
if (ch === '"') { | ||
while (next()) { | ||
if (ch === '"') { | ||
next(); | ||
return str; | ||
} else if (ch === '\\') { | ||
next(); | ||
if (ch === 'u') { | ||
uffff = 0; | ||
for (i = 0; i < 4; i += 1) { | ||
hex = parseInt(next(), 16); | ||
if (!isFinite(hex)) { | ||
break; | ||
} | ||
uffff = (uffff * 16) + hex; | ||
} | ||
str += String.fromCharCode(uffff); | ||
} else if (typeof escapee[ch] === 'string') { | ||
str += escapee[ch]; | ||
} else { | ||
break; | ||
} | ||
} else { | ||
str += ch; | ||
} | ||
} | ||
} | ||
error('Bad string'); | ||
} | ||
// Parse an array value. | ||
// Skip whitespace. | ||
function white() { | ||
while (ch && ch <= ' ') { | ||
next(); | ||
} | ||
} | ||
var array = []; | ||
// true, false, or null. | ||
function word() { | ||
switch (ch) { | ||
case 't': | ||
next('t'); | ||
next('r'); | ||
next('u'); | ||
next('e'); | ||
return true; | ||
case 'f': | ||
next('f'); | ||
next('a'); | ||
next('l'); | ||
next('s'); | ||
next('e'); | ||
return false; | ||
case 'n': | ||
next('n'); | ||
next('u'); | ||
next('l'); | ||
next('l'); | ||
return null; | ||
default: | ||
error("Unexpected '" + ch + "'"); | ||
} | ||
} | ||
if (ch === '[') { | ||
next('['); | ||
white(); | ||
if (ch === ']') { | ||
next(']'); | ||
return array; // empty array | ||
} | ||
while (ch) { | ||
array.push(value()); | ||
white(); | ||
if (ch === ']') { | ||
next(']'); | ||
return array; | ||
} | ||
next(','); | ||
white(); | ||
} | ||
} | ||
error("Bad array"); | ||
}, | ||
// Parse an array value. | ||
function array() { | ||
var arr = []; | ||
object = function () { | ||
if (ch === '[') { | ||
next('['); | ||
white(); | ||
if (ch === ']') { | ||
next(']'); | ||
return arr; // empty array | ||
} | ||
while (ch) { | ||
arr.push(value()); // eslint-disable-line no-use-before-define | ||
white(); | ||
if (ch === ']') { | ||
next(']'); | ||
return arr; | ||
} | ||
next(','); | ||
white(); | ||
} | ||
} | ||
error('Bad array'); | ||
} | ||
// Parse an object value. | ||
function object() { | ||
var key; | ||
var obj = {}; | ||
var key, | ||
object = {}; | ||
if (ch === '{') { | ||
next('{'); | ||
white(); | ||
if (ch === '}') { | ||
next('}'); | ||
return obj; // empty object | ||
} | ||
while (ch) { | ||
key = string(); | ||
white(); | ||
next(':'); | ||
if (Object.prototype.hasOwnProperty.call(obj, key)) { | ||
error('Duplicate key "' + key + '"'); | ||
} | ||
obj[key] = value(); // eslint-disable-line no-use-before-define | ||
white(); | ||
if (ch === '}') { | ||
next('}'); | ||
return obj; | ||
} | ||
next(','); | ||
white(); | ||
} | ||
} | ||
error('Bad object'); | ||
} | ||
if (ch === '{') { | ||
next('{'); | ||
white(); | ||
if (ch === '}') { | ||
next('}'); | ||
return object; // empty object | ||
} | ||
while (ch) { | ||
key = string(); | ||
white(); | ||
next(':'); | ||
if (Object.hasOwnProperty.call(object, key)) { | ||
error('Duplicate key "' + key + '"'); | ||
} | ||
object[key] = value(); | ||
white(); | ||
if (ch === '}') { | ||
next('}'); | ||
return object; | ||
} | ||
next(','); | ||
white(); | ||
} | ||
} | ||
error("Bad object"); | ||
}; | ||
// Parse a JSON value. It could be an object, an array, a string, a number, or a word. | ||
function value() { | ||
white(); | ||
switch (ch) { | ||
case '{': | ||
return object(); | ||
case '[': | ||
return array(); | ||
case '"': | ||
return string(); | ||
case '-': | ||
return number(); | ||
default: | ||
return ch >= '0' && ch <= '9' ? number() : word(); | ||
} | ||
} | ||
value = function () { | ||
// Return the json_parse function. It will have access to all of the above functions and variables. | ||
module.exports = function (source, reviver) { | ||
var result; | ||
// Parse a JSON value. It could be an object, an array, a string, a number, | ||
// or a word. | ||
text = source; | ||
at = 0; | ||
ch = ' '; | ||
result = value(); | ||
white(); | ||
if (ch) { | ||
error('Syntax error'); | ||
} | ||
white(); | ||
switch (ch) { | ||
case '{': | ||
return object(); | ||
case '[': | ||
return array(); | ||
case '"': | ||
return string(); | ||
case '-': | ||
return number(); | ||
default: | ||
return ch >= '0' && ch <= '9' ? number() : word(); | ||
} | ||
}; | ||
// If there is a reviver function, we recursively walk the new structure, | ||
// passing each name/value pair to the reviver function for possible | ||
// transformation, starting with a temporary root object that holds the result | ||
// in an empty key. If there is not a reviver function, we simply return the | ||
// result. | ||
// Return the json_parse function. It will have access to all of the above | ||
// functions and variables. | ||
module.exports = function (source, reviver) { | ||
var result; | ||
text = source; | ||
at = 0; | ||
ch = ' '; | ||
result = value(); | ||
white(); | ||
if (ch) { | ||
error("Syntax error"); | ||
} | ||
// If there is a reviver function, we recursively walk the new structure, | ||
// passing each name/value pair to the reviver function for possible | ||
// transformation, starting with a temporary root object that holds the result | ||
// in an empty key. If there is not a reviver function, we simply return the | ||
// result. | ||
return typeof reviver === 'function' ? (function walk(holder, key) { | ||
var k, v, value = holder[key]; | ||
if (value && typeof value === 'object') { | ||
for (k in value) { | ||
if (Object.prototype.hasOwnProperty.call(value, k)) { | ||
v = walk(value, k); | ||
if (v !== undefined) { | ||
value[k] = v; | ||
} else { | ||
delete value[k]; | ||
} | ||
} | ||
} | ||
} | ||
return reviver.call(holder, key, value); | ||
}({'': result}, '')) : result; | ||
return typeof reviver === 'function' ? (function walk(holder, key) { | ||
var k; | ||
var v; | ||
var val = holder[key]; | ||
if (val && typeof val === 'object') { | ||
for (k in value) { | ||
if (Object.prototype.hasOwnProperty.call(val, k)) { | ||
v = walk(val, k); | ||
if (typeof v === 'undefined') { | ||
delete val[k]; | ||
} else { | ||
val[k] = v; | ||
} | ||
} | ||
} | ||
} | ||
return reviver.call(holder, key, val); | ||
}({ '': result }, '')) : result; | ||
}; |
@@ -1,154 +0,151 @@ | ||
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; | ||
'use strict'; | ||
var escapable = /[\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; | ||
var gap; | ||
var indent; | ||
var meta = { // table of character substitutions | ||
'\b': '\\b', | ||
'\t': '\\t', | ||
'\n': '\\n', | ||
'\f': '\\f', | ||
'\r': '\\r', | ||
'"': '\\"', | ||
'\\': '\\\\' | ||
}; | ||
var 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 + '"'; | ||
// 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. | ||
// Produce a string from holder[key]. | ||
var i; // The loop counter. | ||
var k; // The member key. | ||
var v; // The member value. | ||
var length; | ||
var mind = gap; | ||
var partial; | ||
var value = holder[key]; | ||
v = partial.length === 0 ? '{}' : gap ? | ||
'{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : | ||
'{' + partial.join(',') + '}'; | ||
gap = mind; | ||
return v; | ||
} | ||
// 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; | ||
default: | ||
} | ||
} | ||
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; | ||
} | ||
var i; | ||
gap = ''; | ||
indent = ''; | ||
// 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}); | ||
// 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 += ' '; | ||
} | ||
} else if (typeof space === 'string') { | ||
// If the space parameter is a string, it will be used as the indent 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 }); | ||
}; |
{ | ||
"name" : "jsonify", | ||
"version" : "0.0.0", | ||
"description" : "JSON without touching any globals", | ||
"main" : "index.js", | ||
"directories" : { | ||
"lib" : ".", | ||
"test" : "test" | ||
}, | ||
"devDependencies" : { | ||
"tap" : "0.0.x", | ||
"garbage" : "0.0.x" | ||
}, | ||
"scripts" : { | ||
"test" : "tap test" | ||
}, | ||
"repository" : { | ||
"type" : "git", | ||
"url" : "http://github.com/substack/jsonify.git" | ||
}, | ||
"keywords" : [ | ||
"json", | ||
"browser" | ||
], | ||
"author" : { | ||
"name" : "Douglas Crockford", | ||
"url" : "http://crockford.com/" | ||
}, | ||
"license" : "Public Domain" | ||
"name": "jsonify", | ||
"version": "0.0.1", | ||
"description": "JSON without touching any globals", | ||
"main": "index.js", | ||
"directories": { | ||
"lib": ".", | ||
"test": "test" | ||
}, | ||
"devDependencies": { | ||
"@ljharb/eslint-config": "^21.0.0", | ||
"aud": "^2.0.1", | ||
"auto-changelog": "^2.4.0", | ||
"eslint": "=8.8.0", | ||
"garbage": "0.0.x", | ||
"in-publish": "^2.0.1", | ||
"npmignore": "^0.3.0", | ||
"safe-publish-latest": "^2.0.0", | ||
"tape": "^5.6.1" | ||
}, | ||
"scripts": { | ||
"prepack": "npmignore --auto --commentLines=autogenerated", | ||
"prepublishOnly": "safe-publish-latest", | ||
"prepublish": "not-in-publish || npm run prepublishOnly", | ||
"lint": "eslint --ext=js,mjs .", | ||
"pretest": "npm run lint", | ||
"tests-only": "tape 'test/**/*.js'", | ||
"test": "npm run tests-only", | ||
"posttest": "aud --production", | ||
"version": "auto-changelog && git add CHANGELOG.md", | ||
"postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "https://github.com/ljharb/jsonify.git" | ||
}, | ||
"keywords": [ | ||
"json", | ||
"browser" | ||
], | ||
"author": { | ||
"name": "Douglas Crockford", | ||
"url": "https://crockford.com/" | ||
}, | ||
"funding": { | ||
"url": "https://github.com/sponsors/ljharb" | ||
}, | ||
"license": "Public Domain", | ||
"auto-changelog": { | ||
"output": "CHANGELOG.md", | ||
"template": "keepachangelog", | ||
"unreleased": false, | ||
"commitLimit": false, | ||
"backfillLimit": false, | ||
"hideCredit": true | ||
}, | ||
"publishConfig": { | ||
"ignore": [ | ||
".github/workflows" | ||
] | ||
} | ||
} |
@@ -1,2 +0,5 @@ | ||
var test = require('tap').test; | ||
'use strict'; | ||
var test = require('tape'); | ||
var json = require('../'); | ||
@@ -6,12 +9,13 @@ var garbage = require('garbage'); | ||
test('parse', function (t) { | ||
for (var i = 0; i < 50; i++) { | ||
var s = JSON.stringify(garbage(50)); | ||
t.deepEqual( | ||
json.parse(s), | ||
JSON.parse(s) | ||
); | ||
} | ||
t.end(); | ||
for (var i = 0; i < 50; i++) { | ||
var s = JSON.stringify(garbage(50)); | ||
t.deepEqual( | ||
json.parse(s), | ||
JSON.parse(s), | ||
'comparing JSON.parse to jsonify.parse: run ' + (i + 1) | ||
); | ||
} | ||
t.end(); | ||
}); |
@@ -1,2 +0,4 @@ | ||
var test = require('tap').test; | ||
'use strict'; | ||
var test = require('tape'); | ||
var json = require('../'); | ||
@@ -6,11 +8,12 @@ var garbage = require('garbage'); | ||
test('stringify', function (t) { | ||
for (var i = 0; i < 50; i++) { | ||
var obj = garbage(50); | ||
t.equal( | ||
json.stringify(obj), | ||
JSON.stringify(obj) | ||
); | ||
} | ||
t.end(); | ||
for (var i = 0; i < 50; i++) { | ||
var obj = garbage(50); | ||
t.equal( | ||
json.stringify(obj), | ||
JSON.stringify(obj), | ||
'comparing JSON.stringify to jsonify.stringify: run ' + (i + 1) | ||
); | ||
} | ||
t.end(); | ||
}); |
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
Non-existent author
Supply chain riskThe package was published by an npm account that no longer exists.
Found 1 instance in 1 package
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
Found 1 instance in 1 package
19360
10
0
1
67
0
9
1