Comparing version 1.3.4 to 1.3.5
128
ini.js
@@ -0,3 +1,3 @@ | ||
exports.parse = exports.decode = decode | ||
exports.parse = exports.decode = decode | ||
exports.stringify = exports.encode = encode | ||
@@ -8,9 +8,10 @@ | ||
var eol = process.platform === "win32" ? "\r\n" : "\n" | ||
var eol = typeof process !== 'undefined' && | ||
process.platform === 'win32' ? '\r\n' : '\n' | ||
function encode (obj, opt) { | ||
var children = [] | ||
, out = "" | ||
var out = '' | ||
if (typeof opt === "string") { | ||
if (typeof opt === 'string') { | ||
opt = { | ||
@@ -25,3 +26,3 @@ section: opt, | ||
var separator = opt.whitespace ? " = " : "=" | ||
var separator = opt.whitespace ? ' = ' : '=' | ||
@@ -31,7 +32,6 @@ Object.keys(obj).forEach(function (k, _, __) { | ||
if (val && Array.isArray(val)) { | ||
val.forEach(function(item) { | ||
out += safe(k + "[]") + separator + safe(item) + "\n" | ||
}) | ||
} | ||
else if (val && typeof val === "object") { | ||
val.forEach(function (item) { | ||
out += safe(k + '[]') + separator + safe(item) + '\n' | ||
}) | ||
} else if (val && typeof val === 'object') { | ||
children.push(k) | ||
@@ -44,3 +44,3 @@ } else { | ||
if (opt.section && out.length) { | ||
out = "[" + safe(opt.section) + "]" + eol + out | ||
out = '[' + safe(opt.section) + ']' + eol + out | ||
} | ||
@@ -50,3 +50,3 @@ | ||
var nk = dotSplit(k).join('\\.') | ||
var section = (opt.section ? opt.section + "." : "") + nk | ||
var section = (opt.section ? opt.section + '.' : '') + nk | ||
var child = encode(obj[k], { | ||
@@ -67,7 +67,7 @@ section: section, | ||
return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002') | ||
.replace(/\\\./g, '\u0001') | ||
.split(/\./).map(function (part) { | ||
return part.replace(/\1/g, '\\.') | ||
.replace(/\2LITERAL\\1LITERAL\2/g, '\u0001') | ||
}) | ||
.replace(/\\\./g, '\u0001') | ||
.split(/\./).map(function (part) { | ||
return part.replace(/\1/g, '\\.') | ||
.replace(/\2LITERAL\\1LITERAL\2/g, '\u0001') | ||
}) | ||
} | ||
@@ -77,9 +77,7 @@ | ||
var out = {} | ||
, p = out | ||
, section = null | ||
, state = "START" | ||
// section |key = value | ||
, re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i | ||
, lines = str.split(/[\r\n]+/g) | ||
, section = null | ||
var p = out | ||
var section = null | ||
// section |key = value | ||
var re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i | ||
var lines = str.split(/[\r\n]+/g) | ||
@@ -96,3 +94,3 @@ lines.forEach(function (line, _, __) { | ||
var key = unsafe(match[2]) | ||
, value = match[3] ? unsafe((match[4] || "")) : true | ||
var value = match[3] ? unsafe(match[4]) : true | ||
switch (value) { | ||
@@ -105,10 +103,9 @@ case 'true': | ||
// Convert keys with '[]' suffix to an array | ||
if (key.length > 2 && key.slice(-2) === "[]") { | ||
key = key.substring(0, key.length - 2) | ||
if (!p[key]) { | ||
p[key] = [] | ||
} | ||
else if (!Array.isArray(p[key])) { | ||
p[key] = [p[key]] | ||
} | ||
if (key.length > 2 && key.slice(-2) === '[]') { | ||
key = key.substring(0, key.length - 2) | ||
if (!p[key]) { | ||
p[key] = [] | ||
} else if (!Array.isArray(p[key])) { | ||
p[key] = [p[key]] | ||
} | ||
} | ||
@@ -120,4 +117,3 @@ | ||
p[key].push(value) | ||
} | ||
else { | ||
} else { | ||
p[key] = value | ||
@@ -130,14 +126,20 @@ } | ||
Object.keys(out).filter(function (k, _, __) { | ||
if (!out[k] || typeof out[k] !== "object" || Array.isArray(out[k])) return false | ||
if (!out[k] || | ||
typeof out[k] !== 'object' || | ||
Array.isArray(out[k])) { | ||
return false | ||
} | ||
// see if the parent section is also an object. | ||
// if so, add it to that, and mark this one for deletion | ||
var parts = dotSplit(k) | ||
, p = out | ||
, l = parts.pop() | ||
, nl = l.replace(/\\\./g, '.') | ||
var p = out | ||
var l = parts.pop() | ||
var nl = l.replace(/\\\./g, '.') | ||
parts.forEach(function (part, _, __) { | ||
if (!p[part] || typeof p[part] !== "object") p[part] = {} | ||
if (!p[part] || typeof p[part] !== 'object') p[part] = {} | ||
p = p[part] | ||
}) | ||
if (p === out && nl === l) return false | ||
if (p === out && nl === l) { | ||
return false | ||
} | ||
p[nl] = out[k] | ||
@@ -153,23 +155,23 @@ return true | ||
function isQuoted (val) { | ||
return (val.charAt(0) === "\"" && val.slice(-1) === "\"") | ||
|| (val.charAt(0) === "'" && val.slice(-1) === "'") | ||
return (val.charAt(0) === '"' && val.slice(-1) === '"') || | ||
(val.charAt(0) === "'" && val.slice(-1) === "'") | ||
} | ||
function safe (val) { | ||
return ( typeof val !== "string" | ||
|| val.match(/[=\r\n]/) | ||
|| val.match(/^\[/) | ||
|| (val.length > 1 | ||
&& isQuoted(val)) | ||
|| val !== val.trim() ) | ||
? JSON.stringify(val) | ||
: val.replace(/;/g, '\\;').replace(/#/g, "\\#") | ||
return (typeof val !== 'string' || | ||
val.match(/[=\r\n]/) || | ||
val.match(/^\[/) || | ||
(val.length > 1 && | ||
isQuoted(val)) || | ||
val !== val.trim()) | ||
? JSON.stringify(val) | ||
: val.replace(/;/g, '\\;').replace(/#/g, '\\#') | ||
} | ||
function unsafe (val, doUnesc) { | ||
val = (val || "").trim() | ||
val = (val || '').trim() | ||
if (isQuoted(val)) { | ||
// remove the single quotes before calling JSON.parse | ||
if (val.charAt(0) === "'") { | ||
val = val.substr(1, val.length - 2); | ||
val = val.substr(1, val.length - 2) | ||
} | ||
@@ -180,14 +182,15 @@ try { val = JSON.parse(val) } catch (_) {} | ||
var esc = false | ||
var unesc = ""; | ||
var unesc = '' | ||
for (var i = 0, l = val.length; i < l; i++) { | ||
var c = val.charAt(i) | ||
if (esc) { | ||
if ("\\;#".indexOf(c) !== -1) | ||
if ('\\;#'.indexOf(c) !== -1) { | ||
unesc += c | ||
else | ||
unesc += "\\" + c | ||
} else { | ||
unesc += '\\' + c | ||
} | ||
esc = false | ||
} else if (";#".indexOf(c) !== -1) { | ||
} else if (';#'.indexOf(c) !== -1) { | ||
break | ||
} else if (c === "\\") { | ||
} else if (c === '\\') { | ||
esc = true | ||
@@ -198,7 +201,8 @@ } else { | ||
} | ||
if (esc) | ||
unesc += "\\" | ||
return unesc | ||
if (esc) { | ||
unesc += '\\' | ||
} | ||
return unesc.trim() | ||
} | ||
return val | ||
} |
@@ -5,3 +5,3 @@ { | ||
"description": "An ini encoder/decoder for node", | ||
"version": "1.3.4", | ||
"version": "1.3.5", | ||
"repository": { | ||
@@ -13,3 +13,7 @@ "type": "git", | ||
"scripts": { | ||
"test": "tap test/*.js" | ||
"pretest": "standard ini.js", | ||
"test": "tap test/*.js --100 -J", | ||
"preversion": "npm test", | ||
"postversion": "npm publish", | ||
"postpublish": "git push origin --all; git push origin --tags" | ||
}, | ||
@@ -21,3 +25,4 @@ "engines": { | ||
"devDependencies": { | ||
"tap": "^1.2.0" | ||
"standard": "^10.0.3", | ||
"tap": "^10.7.3 || 11" | ||
}, | ||
@@ -24,0 +29,0 @@ "license": "ISC", |
8932
174
2