jdb-lite
Version:
A lightweight schema-based JSON database library with validation
113 lines • 3.85 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ObjectId = exports.Schema = exports.JsonSchemaDB = void 0;
const database_1 = require("./database");
const schema_1 = require("./schema");
Object.defineProperty(exports, "Schema", { enumerable: true, get: function () { return schema_1.Schema; } });
const objectid_1 = require("./objectid");
Object.defineProperty(exports, "ObjectId", { enumerable: true, get: function () { return objectid_1.ObjectId; } });
const model_1 = require("./model");
class EventEmitter {
constructor() {
this.events = {};
}
on(event, listener) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(listener);
return this;
}
emit(event, ...args) {
if (!this.events[event]) {
return false;
}
this.events[event].forEach(listener => listener(...args));
return true;
}
off(event, listener) {
if (!this.events[event]) {
return this;
}
this.events[event] = this.events[event].filter(l => l !== listener);
return this;
}
}
class JsonSchemaDBConnection extends EventEmitter {
constructor(dbPath) {
super();
this.readyState = 0; // 0: disconnected, 1: connected
this.models = {};
this.collections = {};
this.name = 'jdb-lite';
this.host = 'localhost';
this.port = 0;
this.db = new database_1.DatabaseManager(dbPath);
this.readyState = 1;
}
async close() {
this.readyState = 0;
this.emit('close');
}
getDatabase() {
return this.db;
}
}
class JsonSchemaDBStatic {
constructor() {
this.Schema = schema_1.Schema;
this.Types = { ObjectId: objectid_1.ObjectId };
this._models = {};
this.connection = new JsonSchemaDBConnection('.db_json');
}
async connect(uri = '.db_json', options) {
if (this.connection) {
await this.connection.close();
}
this.connection = new JsonSchemaDBConnection(uri);
// Emit connection events
setTimeout(() => {
this.connection.emit('connected');
this.connection.emit('open');
}, 0);
return this.connection;
}
async disconnect() {
if (this.connection) {
await this.connection.close();
}
}
model(name, schema) {
if (!schema && this._models[name]) {
return this._models[name];
}
if (!schema) {
throw new Error(`Schema hasn't been registered for model "${name}".`);
}
const model = (0, model_1.createModel)(name, schema, this.connection.getDatabase());
this._models[name] = model;
this.connection.models[name] = model;
return model;
}
}
exports.JsonSchemaDB = JsonSchemaDBStatic;
// Create the default instance
const jsonDB = new JsonSchemaDBStatic();
// Export both the instance and the class for flexibility
exports.default = jsonDB;
__exportStar(require("./types"), exports);
//# sourceMappingURL=index.js.map