Initial commit
This commit is contained in:
89
node_modules/postgres-array/index.js
generated
vendored
Normal file
89
node_modules/postgres-array/index.js
generated
vendored
Normal file
@ -0,0 +1,89 @@
|
||||
'use strict'
|
||||
|
||||
exports.parse = function (source, transform) {
|
||||
return parsePostgresArray(source, transform)
|
||||
}
|
||||
|
||||
function parsePostgresArray (source, transform, nested = false) {
|
||||
let character = ''
|
||||
let quote = false
|
||||
let position = 0
|
||||
let dimension = 0
|
||||
const entries = []
|
||||
let recorded = ''
|
||||
|
||||
const newEntry = function (includeEmpty) {
|
||||
let entry = recorded
|
||||
|
||||
if (entry.length > 0 || includeEmpty) {
|
||||
if (entry === 'NULL' && !includeEmpty) {
|
||||
entry = null
|
||||
}
|
||||
|
||||
if (entry !== null && transform) {
|
||||
entry = transform(entry)
|
||||
}
|
||||
|
||||
entries.push(entry)
|
||||
recorded = ''
|
||||
}
|
||||
}
|
||||
|
||||
if (source[0] === '[') {
|
||||
while (position < source.length) {
|
||||
const char = source[position++]
|
||||
|
||||
if (char === '=') { break }
|
||||
}
|
||||
}
|
||||
|
||||
while (position < source.length) {
|
||||
let escaped = false
|
||||
character = source[position++]
|
||||
|
||||
if (character === '\\') {
|
||||
character = source[position++]
|
||||
escaped = true
|
||||
}
|
||||
|
||||
if (character === '{' && !quote) {
|
||||
dimension++
|
||||
|
||||
if (dimension > 1) {
|
||||
const parser = parsePostgresArray(source.substr(position - 1), transform, true)
|
||||
|
||||
entries.push(parser.entries)
|
||||
position += parser.position - 2
|
||||
}
|
||||
} else if (character === '}' && !quote) {
|
||||
dimension--
|
||||
|
||||
if (!dimension) {
|
||||
newEntry()
|
||||
|
||||
if (nested) {
|
||||
return {
|
||||
entries,
|
||||
position
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (character === '"' && !escaped) {
|
||||
if (quote) {
|
||||
newEntry(true)
|
||||
}
|
||||
|
||||
quote = !quote
|
||||
} else if (character === ',' && !quote) {
|
||||
newEntry()
|
||||
} else {
|
||||
recorded += character
|
||||
}
|
||||
}
|
||||
|
||||
if (dimension !== 0) {
|
||||
throw new Error('array dimension not balanced')
|
||||
}
|
||||
|
||||
return entries
|
||||
}
|
||||
Reference in New Issue
Block a user