summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/ini/lib/ini.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/ini/lib/ini.js')
-rw-r--r--deps/npm/node_modules/ini/lib/ini.js115
1 files changed, 81 insertions, 34 deletions
diff --git a/deps/npm/node_modules/ini/lib/ini.js b/deps/npm/node_modules/ini/lib/ini.js
index d05682b606..763c829c6f 100644
--- a/deps/npm/node_modules/ini/lib/ini.js
+++ b/deps/npm/node_modules/ini/lib/ini.js
@@ -1,49 +1,70 @@
const { hasOwnProperty } = Object.prototype
-/* istanbul ignore next */
-const eol = typeof process !== 'undefined' &&
- process.platform === 'win32' ? '\r\n' : '\n'
+const encode = (obj, opt = {}) => {
+ if (typeof opt === 'string') {
+ opt = { section: opt }
+ }
+ opt.align = opt.align === true
+ opt.newline = opt.newline === true
+ opt.sort = opt.sort === true
+ opt.whitespace = opt.whitespace === true || opt.align === true
+ /* istanbul ignore next */
+ opt.platform = opt.platform || process?.platform
+ opt.bracketedArray = opt.bracketedArray !== false
-const encode = (obj, opt) => {
+ /* istanbul ignore next */
+ const eol = opt.platform === 'win32' ? '\r\n' : '\n'
+ const separator = opt.whitespace ? ' = ' : '='
const children = []
- let out = ''
- if (typeof opt === 'string') {
- opt = {
- section: opt,
- whitespace: false,
- }
- } else {
- opt = opt || Object.create(null)
- opt.whitespace = opt.whitespace === true
+ const keys = opt.sort ? Object.keys(obj).sort() : Object.keys(obj)
+
+ let padToChars = 0
+ // If aligning on the separator, then padToChars is determined as follows:
+ // 1. Get the keys
+ // 2. Exclude keys pointing to objects unless the value is null or an array
+ // 3. Add `[]` to array keys
+ // 4. Ensure non empty set of keys
+ // 5. Reduce the set to the longest `safe` key
+ // 6. Get the `safe` length
+ if (opt.align) {
+ padToChars = safe(
+ (
+ keys
+ .filter(k => obj[k] === null || Array.isArray(obj[k]) || typeof obj[k] !== 'object')
+ .map(k => Array.isArray(obj[k]) ? `${k}[]` : k)
+ )
+ .concat([''])
+ .reduce((a, b) => safe(a).length >= safe(b).length ? a : b)
+ ).length
}
- const separator = opt.whitespace ? ' = ' : '='
+ let out = ''
+ const arraySuffix = opt.bracketedArray ? '[]' : ''
- for (const k of Object.keys(obj)) {
+ for (const k of keys) {
const val = obj[k]
if (val && Array.isArray(val)) {
for (const item of val) {
- out += safe(k + '[]') + separator + safe(item) + eol
+ out += safe(`${k}${arraySuffix}`).padEnd(padToChars, ' ') + separator + safe(item) + eol
}
} else if (val && typeof val === 'object') {
children.push(k)
} else {
- out += safe(k) + separator + safe(val) + eol
+ out += safe(k).padEnd(padToChars, ' ') + separator + safe(val) + eol
}
}
if (opt.section && out.length) {
- out = '[' + safe(opt.section) + ']' + eol + out
+ out = '[' + safe(opt.section) + ']' + (opt.newline ? eol + eol : eol) + out
}
for (const k of children) {
- const nk = dotSplit(k).join('\\.')
+ const nk = splitSections(k, '.').join('\\.')
const section = (opt.section ? opt.section + '.' : '') + nk
- const { whitespace } = opt
const child = encode(obj[k], {
+ ...opt,
section,
- whitespace,
})
if (out.length && child.length) {
out += eol
@@ -55,24 +76,44 @@ const encode = (obj, opt) => {
return out
}
-const dotSplit = str =>
- str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002')
- .replace(/\\\./g, '\u0001')
- .split(/\./)
- .map(part =>
- part.replace(/\1/g, '\\.')
- .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001'))
+function splitSections (str, separator) {
+ var lastMatchIndex = 0
+ var lastSeparatorIndex = 0
+ var nextIndex = 0
+ var sections = []
+
+ do {
+ nextIndex = str.indexOf(separator, lastMatchIndex)
-const decode = str => {
+ if (nextIndex !== -1) {
+ lastMatchIndex = nextIndex + separator.length
+
+ if (nextIndex > 0 && str[nextIndex - 1] === '\\') {
+ continue
+ }
+
+ sections.push(str.slice(lastSeparatorIndex, nextIndex))
+ lastSeparatorIndex = nextIndex + separator.length
+ }
+ } while (nextIndex !== -1)
+
+ sections.push(str.slice(lastSeparatorIndex))
+
+ return sections
+}
+
+const decode = (str, opt = {}) => {
+ opt.bracketedArray = opt.bracketedArray !== false
const out = Object.create(null)
let p = out
let section = null
- // section |key = value
- const re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i
+ // section |key = value
+ const re = /^\[([^\]]*)\]\s*$|^([^=]+)(=(.*))?$/i
const lines = str.split(/[\r\n]+/g)
+ const duplicates = {}
for (const line of lines) {
- if (!line || line.match(/^\s*[;#]/)) {
+ if (!line || line.match(/^\s*[;#]/) || line.match(/^\s*$/)) {
continue
}
const match = line.match(re)
@@ -91,7 +132,13 @@ const decode = str => {
continue
}
const keyRaw = unsafe(match[2])
- const isArray = keyRaw.length > 2 && keyRaw.slice(-2) === '[]'
+ let isArray
+ if (opt.bracketedArray) {
+ isArray = keyRaw.length > 2 && keyRaw.slice(-2) === '[]'
+ } else {
+ duplicates[keyRaw] = (duplicates?.[keyRaw] || 0) + 1
+ isArray = duplicates[keyRaw] > 1
+ }
const key = isArray ? keyRaw.slice(0, -2) : keyRaw
if (key === '__proto__') {
continue
@@ -132,7 +179,7 @@ const decode = str => {
// see if the parent section is also an object.
// if so, add it to that, and mark this one for deletion
- const parts = dotSplit(k)
+ const parts = splitSections(k, '.')
p = out
const l = parts.pop()
const nl = l.replace(/\\\./g, '.')