UNPKG

@meanii/tinydb

Version:

tinydb is something, which you can use for as local non-sql database

111 lines 14.5 kB
import path from 'path'; import fsp from 'node:fs/promises'; import { v4 as uuidv4 } from 'uuid'; /** * @discription TinyDb instance helps to manage a local json databases, which as many instances * @example: * const tinyDb = new Tinydb(`meanii-tinydb`) * await tinydb.write([{isUser: true}]) * * @author: anilchauhanxda@gmail.com - <https://github.com/meanii> */ export class Tinydb { constructor(database) { this.location = process.cwd(); /* getting the current working dir */ this.ACTIONS = { query: (data, query) => data.filter(item => item[Object.keys(query).pop()] !== Object.values(query).pop()), update: (data, query) => data.find(item => item[Object.keys(query).pop()] === Object.values(query).pop()) }; this.database = database; this.dbPath = path.join(this.location, `.${this.database}.json`); const _ = async () => await this.init(); } /** * this function helps to init the tinyDb to init the all processes, which is required to start before using it * @returns {Promise<void>} */ async init() { await fsp.appendFile(this.dbPath, ""); /* making sure, the db is exits or not */ } /** * this function helps to get all data from the database * @returns {Promise<Array>} */ get() { return new Promise(async (resolve) => { try { const data = JSON.parse(String(await fsp.readFile(this.dbPath)))?.db ?? []; return resolve(data); } catch (e) { return resolve([]); } }); } /** * this function helps to find an object and return it * @param query * @returns {Promise<null|*>} */ async findOne(query) { let data = await this.get(); const i = data.findIndex(key => key[Object.keys(query)[0]] === Object.values(query)[0]); if (i > -1) return data[i]; return null; } /** * this function helps to delete an object and return it * @param query * @returns {Promise<null|*>} */ async deleteMany(query) { let data = await this.get(); return this.write([...this.ACTIONS.query(data, query)]); } /** * this function helps to append data, to the db * @param data TinydbType * @returns {Promise<void>} */ async insertOne(data) { if (!data?._id) data._id = uuidv4(); const content = await this.get(); if (content.find(item => item._id === data._id)) throw new Error(`Primary key should be unique!`); content.push({ ...data, createdAt: new Date(), updatedAt: new Date() }); await this.write(content); return data; } /** * this function helps to upsert the object * @param query * @param object * @returns {Promise<void>} */ async findOneAndUpdate(query, object) { let data = await this.get(); if (!this.ACTIONS.update(data, query)) return data; await this.write([...this.ACTIONS.query(data, query), { ...this.ACTIONS.update(data, query), ...object, updatedAt: new Date() }]); return this.ACTIONS.update(data, query); } /** *this functions help to rewrite all data * @param object * @returns {Promise<void>} */ async write(object) { await fsp.writeFile(this.dbPath, JSON.stringify({ db: object }, null, "\t")); return await this.get(); } /** * this functions delete everything, which they have stored * @returns {Promise<void>} */ async purgeAll() { await fsp.unlink(this.dbPath); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlueWRiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RpbnlkYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUM7QUFDbkMsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJcEM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxNQUFNO0lBZWYsWUFBWSxRQUFnQjtRQWJsQixhQUFRLEdBQVcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBLENBQUMscUNBQXFDO1FBUS9ELFlBQU8sR0FBRztZQUN2QixLQUFLLEVBQUUsQ0FBQyxJQUF1QixFQUFFLEtBQXNCLEVBQXFCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pLLE1BQU0sRUFBRSxDQUFDLElBQXVCLEVBQUUsS0FBc0IsRUFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDakssQ0FBQTtRQUdHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsT0FBTyxDQUFDLENB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LENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUNsRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2pJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLEtBQUssQ0FBNEIsTUFBeUI7UUFDcEUsTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RSxPQUFPLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsUUFBUTtRQUNqQixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgVGlueURCTW9kZWxUeXBlIH0gZnJvbSBcIi4vdGlueWRiLnR5cGVcIjtcblxuXG4vKipcbiAqIEBkaXNjcmlwdGlvbiBUaW55RGIgaW5zdGFuY2UgaGVscHMgdG8gbWFuYWdlIGEgbG9jYWwganNvbiBkYXRhYmFzZXMsIHdoaWNoIGFzIG1hbnkgaW5zdGFuY2VzXG4gKiBAZXhhbXBsZTpcbiAqICBjb25zdCB0aW55RGIgPSBuZXcgVGlueWRiKGBtZWFuaWktdGlueWRiYClcbiAqICBhd2FpdCB0aW55ZGIud3JpdGUoW3tpc1VzZXI6IHRydWV9XSlcbiAqXG4gKiAgQGF1dGhvcjogYW5pbGNoYXVoYW54ZGFAZ21haWwuY29tIC0gPGh0dHBzOi8vZ2l0aHViLmNvbS9tZWFuaWk+XG4gKi9cbmV4cG9ydCBjbGFzcyBUaW55ZGIge1xuXG4gICAgcHJvdGVjdGVkIGxvY2F0aW9uOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpIC8qIGdldHRpbmcgdGhlIGN1cnJlbnQgd29ya2luZyBkaXIgKi9cbiAgICAvKipcbiAgICAgKiBpbml0IHBvaW50IFRpbnlEYlxuICAgICAqIEBwYXJhbSBkYXRhYmFzZSAtIGRhdGFiYXNlIG5hbWUsIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSwgaXQgaXMgZ29pbmcgdG8gYmUgZW5mb3JjZWQgdGhlIHN5c3RlbSB0byBjcmVhdGUgdGhlIGZpbGVcbiAgICAgKiB3ZWF0aGVyIGlmIGl0cyBhbHJlYWR5IGNyZWF0ZWQgb3Igbm90XG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhYmFzZTogc3RyaW5nXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYlBhdGg6IHN0cmluZ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgQUNUSU9OUyA9IHtcbiAgICAgICAgcXVlcnk6IChkYXRhOiBUaW55REJNb2RlbFR5cGVbXSwgcXVlcnk6IFRpbnlEQk1vZGVsVHlwZSk6IFRpbnlEQk1vZGVsVHlwZVtdID0+IGRhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbVtPYmplY3Qua2V5cyhxdWVyeSkucG9wKCldICE9PSBPYmplY3QudmFsdWVzKHF1ZXJ5KS5wb3AoKSksXG4gICAgICAgIHVwZGF0ZTogKGRhdGE6IFRpbnlEQk1vZGVsVHlwZVtdLCBxdWVyeTogVGlueURCTW9kZWxUeXBlKTogVGlueURCTW9kZWxUeXBlID0+IGRhdGEuZmluZChpdGVtID0+IGl0ZW1bT2JqZWN0LmtleXMocXVlcnkpLnBvcCgpXSA9PT0gT2JqZWN0LnZhbHVlcyhxdWVyeSkucG9wKCkpXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoZGF0YWJhc2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2VcbiAgICAgICAgdGhpcy5kYlBhdGggPSBwYXRoLmpvaW4odGhpcy5sb2NhdGlvbiwgYC4ke3RoaXMuZGF0YWJhc2V9Lmpzb25gKVxuICAgICAgICBjb25zdCBfID0gYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pbml0KClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGhlbHBzIHRvIGluaXQgdGhlIHRpbnlEYiB0byBpbml0IHRoZSBhbGwgcHJvY2Vzc2VzLCB3aGljaCBpcyByZXF1aXJlZCB0byBzdGFydCBiZWZvcmUgdXNpbmcgaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGZzcC5hcHBlbmRGaWxlKHRoaXMuZGJQYXRoLCBcIlwiKSAvKiBtYWtpbmcgc3VyZSwgdGhlIGRiIGlzIGV4aXRzIG9yIG5vdCAqL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgZnVuY3Rpb24gaGVscHMgdG8gZ2V0IGFsbCBkYXRhIGZyb20gdGhlIGRhdGFiYXNlXG4gICAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk+fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoKTogUHJvbWlzZTxUaW55REJNb2RlbFR5cGVbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoU3RyaW5nKGF3YWl0IGZzcC5yZWFkRmlsZSh0aGlzLmRiUGF0aCkpKT8uZGIgPz8gW11cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhKVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFtdKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgZnVuY3Rpb24gaGVscHMgdG8gZmluZCBhbiBvYmplY3QgYW5kIHJldHVybiBpdFxuICAgICAqIEBwYXJhbSBxdWVyeVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPG51bGx8Kj59XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGZpbmRPbmUocXVlcnk6IFRpbnlEQk1vZGVsVHlwZSk6IFByb21pc2U8bnVsbCB8IFRpbnlEQk1vZGVsVHlwZT4ge1xuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0KClcbiAgICAgICAgY29uc3QgaSA9IGRhdGEuZmluZEluZGV4KGtleSA9PiBrZXlbT2JqZWN0LmtleXMocXVlcnkpWzBdXSA9PT0gT2JqZWN0LnZhbHVlcyhxdWVyeSlbMF0pO1xuICAgICAgICBpZiAoaSA+IC0xKSByZXR1cm4gZGF0YVtpXTtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGhlbHBzIHRvIGRlbGV0ZSBhbiBvYmplY3QgYW5kIHJldHVybiBpdFxuICAgICAqIEBwYXJhbSBxdWVyeVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPG51bGx8Kj59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlTWFueTxUIGV4dGVuZHMgVGlueURCTW9kZWxUeXBlPihxdWVyeTogVCk6IFByb21pc2U8VGlueURCTW9kZWxUeXBlW10+IHtcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldCgpXG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlKFsuLi50aGlzLkFDVElPTlMucXVlcnkoZGF0YSwgcXVlcnkpXSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGhlbHBzIHRvIGFwcGVuZCBkYXRhLCB0byB0aGUgZGJcbiAgICAgKiBAcGFyYW0gZGF0YSBUaW55ZGJUeXBlXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGluc2VydE9uZTxUIGV4dGVuZHMgVGlueURCTW9kZWxUeXBlPihkYXRhOiBUKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICghZGF0YT8uX2lkKSBkYXRhLl9pZCA9IHV1aWR2NCgpXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldCgpXG4gICAgICAgIGlmIChjb250ZW50LmZpbmQoaXRlbSA9PiBpdGVtLl9pZCA9PT0gZGF0YS5faWQpKSB0aHJvdyBuZXcgRXJyb3IoYFByaW1hcnkga2V5IHNob3VsZCBiZSB1bmlxdWUhYClcbiAgICAgICAgY29udGVudC5wdXNoKHsgLi4uZGF0YSwgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSBhcyBuZXZlcilcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZShjb250ZW50KVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgZnVuY3Rpb24gaGVscHMgdG8gdXBzZXJ0IHRoZSBvYmplY3RcbiAgICAgKiBAcGFyYW0gcXVlcnlcbiAgICAgKiBAcGFyYW0gb2JqZWN0XG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGZpbmRPbmVBbmRVcGRhdGUocXVlcnk6IFRpbnlEQk1vZGVsVHlwZSwgb2JqZWN0OiBUaW55REJNb2RlbFR5cGUpOiBQcm9taXNlPFRpbnlEQk1vZGVsVHlwZT4ge1xuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0KClcbiAgICAgICAgaWYgKCF0aGlzLkFDVElPTlMudXBkYXRlKGRhdGEsIHF1ZXJ5KSkgcmV0dXJuIGRhdGFcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZShbLi4udGhpcy5BQ1RJT05TLnF1ZXJ5KGRhdGEsIHF1ZXJ5KSwgeyAuLi50aGlzLkFDVElPTlMudXBkYXRlKGRhdGEsIHF1ZXJ5KSwgLi4ub2JqZWN0LCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfV0pXG4gICAgICAgIHJldHVybiB0aGlzLkFDVElPTlMudXBkYXRlKGRhdGEsIHF1ZXJ5KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqdGhpcyBmdW5jdGlvbnMgaGVscCB0byByZXdyaXRlIGFsbCBkYXRhXG4gICAgICogQHBhcmFtIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgd3JpdGU8VCBleHRlbmRzIFRpbnlEQk1vZGVsVHlwZT4ob2JqZWN0OiBUaW55REJNb2RlbFR5cGVbXSk6IFByb21pc2U8VGlueURCTW9kZWxUeXBlW10+IHtcbiAgICAgICAgYXdhaXQgZnNwLndyaXRlRmlsZSh0aGlzLmRiUGF0aCwgSlNPTi5zdHJpbmdpZnkoeyBkYjogb2JqZWN0IH0sIG51bGwsIFwiXFx0XCIpKVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXQoKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgZnVuY3Rpb25zIGRlbGV0ZSBldmVyeXRoaW5nLCB3aGljaCB0aGV5IGhhdmUgc3RvcmVkXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHB1cmdlQWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBmc3AudW5saW5rKHRoaXMuZGJQYXRoKVxuICAgIH1cbn1cbiJdfQ==