@worker-tools/deno-kv-storage
Version:
An implementation of the StorageArea (1,2,3) interface for Deno with an extensible system for supporting various database backends.
131 lines • 4.14 kB
JavaScript
// Based of https://github.com/bendrucker/postgres-array
// Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me). MIT License.
export function parseArray(source, transform, separator = ",") {
return new ArrayParser(source, transform, separator).parse();
}
class ArrayParser {
constructor(source, transform, separator) {
Object.defineProperty(this, "source", {
enumerable: true,
configurable: true,
writable: true,
value: source
});
Object.defineProperty(this, "transform", {
enumerable: true,
configurable: true,
writable: true,
value: transform
});
Object.defineProperty(this, "separator", {
enumerable: true,
configurable: true,
writable: true,
value: separator
});
Object.defineProperty(this, "position", {
enumerable: true,
configurable: true,
writable: true,
value: 0
});
Object.defineProperty(this, "entries", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
Object.defineProperty(this, "recorded", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
Object.defineProperty(this, "dimension", {
enumerable: true,
configurable: true,
writable: true,
value: 0
});
}
isEof() {
return this.position >= this.source.length;
}
nextCharacter() {
const character = this.source[this.position++];
if (character === "\\") {
return {
value: this.source[this.position++],
escaped: true,
};
}
return {
value: character,
escaped: false,
};
}
record(character) {
this.recorded.push(character);
}
newEntry(includeEmpty = false) {
let entry;
if (this.recorded.length > 0 || includeEmpty) {
entry = this.recorded.join("");
if (entry === "NULL" && !includeEmpty) {
entry = null;
}
if (entry !== null)
entry = this.transform(entry);
this.entries.push(entry);
this.recorded = [];
}
}
consumeDimensions() {
if (this.source[0] === "[") {
while (!this.isEof()) {
const char = this.nextCharacter();
if (char.value === "=")
break;
}
}
}
parse(nested = false) {
let character, parser, quote;
this.consumeDimensions();
while (!this.isEof()) {
character = this.nextCharacter();
if (character.value === "{" && !quote) {
this.dimension++;
if (this.dimension > 1) {
parser = new ArrayParser(this.source.substr(this.position - 1), this.transform, this.separator);
this.entries.push(parser.parse(true));
this.position += parser.position - 2;
}
}
else if (character.value === "}" && !quote) {
this.dimension--;
if (!this.dimension) {
this.newEntry();
if (nested)
return this.entries;
}
}
else if (character.value === '"' && !character.escaped) {
if (quote)
this.newEntry(true);
quote = !quote;
}
else if (character.value === this.separator && !quote) {
this.newEntry();
}
else {
this.record(character.value);
}
}
if (this.dimension !== 0) {
throw new Error("array dimension not balanced");
}
return this.entries;
}
}
//# sourceMappingURL=array_parser.js.map