UNPKG

@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
// 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