@meanii/tinydb
Version:
tinydb is something, which you can use for as local non-sql database
111 lines • 14.5 kB
JavaScript
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==