ravendb
Version:
RavenDB client for Node.js
151 lines • 4.25 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Assembler = void 0;
const node_events_1 = require("node:events");
const startObject = Ctr => function () {
if (this.done) {
this.done = false;
}
else {
this.stack.push(this.current, this.key);
}
this.current = new Ctr();
this.key = null;
};
class Assembler extends node_events_1.EventEmitter {
static connectTo(stream, options) {
return new Assembler(options).connectTo(stream);
}
stack;
current;
done;
key;
reviver;
constructor(options) {
super();
this.stack = [];
this.current = this.key = null;
this.done = true;
if (options) {
this.reviver = typeof options.reviver == 'function' && options.reviver;
if (this.reviver) {
this.stringValue = this._saveValue = this._saveValueWithReviver;
}
if (options.numberAsString) {
this.numberValue = this.stringValue;
}
}
}
connectTo(stream) {
stream.on('data', chunk => {
if (this[chunk.name]) {
this[chunk.name](chunk.value);
if (this.done)
this.emit('done', this);
}
});
return this;
}
get depth() {
return (this.stack.length >> 1) + (this.done ? 0 : 1);
}
get path() {
const path = [];
for (let i = 0; i < this.stack.length; i += 2) {
const key = this.stack[i + 1];
path.push(key === null ? this.stack[i].length : key);
}
return path;
}
dropToLevel(level) {
if (level < this.depth) {
if (level) {
const index = (level - 1) << 1;
this.current = this.stack[index];
this.key = this.stack[index + 1];
this.stack.splice(index);
}
else {
this.stack = [];
this.current = this.key = null;
this.done = true;
}
}
return this;
}
consume(chunk) {
this[chunk.name] && this[chunk.name](chunk.value);
return this;
}
keyValue(value) {
this.key = value;
}
//stringValue() - aliased below to _saveValue()
numberValue(value) {
this._saveValue(parseFloat(value));
}
nullValue() {
this._saveValue(null);
}
trueValue() {
this._saveValue(true);
}
falseValue() {
this._saveValue(false);
}
//startObject() - assigned below
endObject() {
if (this.stack.length) {
const value = this.current;
this.key = this.stack.pop();
this.current = this.stack.pop();
this._saveValue(value);
}
else {
this.done = true;
}
}
//startArray() - assigned below
//endArray() - aliased below to endObject()
_saveValue(value) {
if (this.done) {
this.current = value;
}
else {
if (this.current instanceof Array) {
this.current.push(value);
}
else {
this.current[this.key] = value;
this.key = null;
}
}
}
_saveValueWithReviver(value) {
if (this.done) {
this.current = this.reviver('', value);
}
else {
if (this.current instanceof Array) {
value = this.reviver('' + this.current.length, value);
this.current.push(value);
if (value === undefined) {
delete this.current[this.current.length - 1];
}
}
else {
value = this.reviver(this.key, value);
if (value !== undefined) {
this.current[this.key] = value;
}
this.key = null;
}
}
}
stringValue = this._saveValue;
startObject = startObject(Object);
startArray = startObject(Array);
endArray = this.endObject;
}
exports.Assembler = Assembler;
//# sourceMappingURL=Assembler.js.map