├── adapters ├── mongo │ ├── Schema.js │ ├── Base.js │ └── index.js ├── localstorage.js ├── yamldb.js └── jsondb.js ├── tsconfig.json ├── language ├── tr.json └── en.json ├── package.json ├── typings └── index.d.ts ├── functions ├── yamldb.js └── jsondb.js ├── README.md └── file └── index.js /adapters/mongo/Schema.js: -------------------------------------------------------------------------------- 1 | const { Schema, model } = require("mongoose"); 2 | 3 | const Default = new Schema({ 4 | key: { 5 | type: Schema.Types.String, 6 | required: true 7 | }, 8 | value: { 9 | type: Schema.Types.Mixed, 10 | required: true 11 | } 12 | }); 13 | 14 | module.exports = (name) => { 15 | return typeof name === "string" ? model(name, Default) : model("JSON", Default); 16 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./file/*", 4 | "module": "commonjs", 5 | "target": "es5", 6 | "moduleResolution": "node", 7 | "experimentalDecorators": true, 8 | "emitDecoratorMetadata": true, 9 | "noUnusedLocals": true, 10 | "sourceMap": true, 11 | "declaration": false, 12 | "pretty": true, 13 | "strictNullChecks": true, 14 | "lib": [ "es2016","dom","scripthost" ] 15 | }, 16 | "include": [ 17 | "./typings/*" 18 | ], 19 | "exclude": [ 20 | "node_modules" 21 | ], 22 | "typeRoots": [ 23 | "./node_modules/@types" 24 | ] 25 | } -------------------------------------------------------------------------------- /language/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "errors": { 3 | "blankName": "[CroxyDB] Verinin adını gir. Sorun mu yaşıyorsun? Discord'uma gel ve istediğin her şeyi sor. https://discord.gg/h8XJYVDyKN", 4 | "blankData": "[CroxyDB] Ayarlanacak veriyi gir. Sorun mu yaşıyorsun? Discord'uma gel ve istediğin her şeyi sor. https://discord.gg/h8XJYVDyKN", 5 | "blankNumber": "[CroxyDB] Bir sayı gir. Sorun mu yaşıyorsun? Discord'uma gel ve istediğin her şeyi sor. https://discord.gg/h8XJYVDyKN", 6 | "oldVersion": "[CroxyDB] Görüşüne göre CroxyDB'nin eski bir sürümünü kullanıyorsun. Modülü güncellemek için 'npm update croxydb' kodunu kullan. Discord'uma katıl: https://discord.gg/h8XJYVDyKN" 7 | } 8 | } -------------------------------------------------------------------------------- /language/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "errors": { 3 | "blankName": "[CroxyDB] Please give me a database name. Are you having errors? Join my Discord server and ask anything. https://discord.gg/h8XJYVDyKN", 4 | "blankData": "[CroxyDB] Please give me a data. Are you having errors? Join my Discord server and ask anything. https://discord.gg/h8XJYVDyKN", 5 | "blankNumber": "[CroxyDB] Please give me a number. Are you having errors? Join my Discord server and ask anything. https://discord.gg/h8XJYVDyKN", 6 | "oldVersion": "[CroxyDB] It seems like you are using an outdated version of CroxyDB. Use 'npm update croxydb' to update module. Join my Discord server: https://discord.gg/h8XJYVDyKN" 7 | } 8 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": { 3 | "name": "CroxyTheDev" 4 | }, 5 | "bugs": { 6 | "url": "https://github.com/CroxyTheDev/croxydb/issues" 7 | }, 8 | "bundleDependencies": false, 9 | "deprecated": false, 10 | "description": "a JSON/YAML/LocalStorage database module", 11 | "homepage": "https://github.com/CroxyTheDev/croxydb#readme", 12 | "keywords": [ 13 | "croxy", 14 | "croxy-api", 15 | "croxyapi", 16 | "croxydb", 17 | "croxy-db", 18 | "json", 19 | "jsondb", 20 | "yaml", 21 | "yamldb", 22 | "local", 23 | "localstorage", 24 | "local storage", 25 | "node-json-db", 26 | "db", 27 | "mongo", 28 | "mongoose", 29 | "mongodb", 30 | "database" 31 | ], 32 | "license": "MIT", 33 | "main": "./file/index.js", 34 | "types": "./typings/index.d.ts", 35 | "name": "croxydb", 36 | "repository": { 37 | "type": "git", 38 | "url": "git+https://github.com/croxywastaken/croxydb.git" 39 | }, 40 | "version": "0.0.9" 41 | } 42 | -------------------------------------------------------------------------------- /typings/index.d.ts: -------------------------------------------------------------------------------- 1 | interface QuickDB { 2 | target?: string | null; 3 | table?: string; 4 | } 5 | 6 | declare const CroxyDB: { 7 | 8 | setLanguage:(language:"tr"|"en") => true; 9 | setReadable:(readable:boolean) => boolean; 10 | setNoBlankData:(noBlankData:boolean) => boolean; 11 | setAdapter:(adapter:"jsondb"|"localstorage"|"mongo"|"yamldb") => true; 12 | setFolder:(adapter:string) => true; 13 | setFile:(adapter:string) => true; 14 | 15 | set: (key: string, value: any) => any; 16 | delete: (key: string, value: any) => boolean; 17 | fetch: (key: string) => any; 18 | has: (key: string) => boolean; 19 | get: (key: string) => any; 20 | push: (key: string, value: any) => any[]; 21 | unpush: (key: string, value: any) => any[]; 22 | add: (key: string, value: number) => number; 23 | subtract: (key: string, value: number) => number; 24 | setByPriority: (key: string, value: any) => any; 25 | delByPriority: (key: string, value: any) => any; 26 | all: () => { [key: string]: any }; 27 | deleteAll: () => boolean; 28 | move: (QuickDB: QuickDB) => boolean; 29 | 30 | } 31 | 32 | export = CroxyDB; 33 | -------------------------------------------------------------------------------- /functions/yamldb.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const fs = require("fs"); 4 | 5 | module.exports.set = function (path, value, obj) { 6 | var schema = obj; 7 | var pList = path.split("."); 8 | var len = pList.length; 9 | for(var i = 0; i < len-1; i++) { 10 | var elem = pList[`${i}`]; 11 | if( typeof schema[`${elem}`] !== "object" ) { 12 | schema[`${elem}`] = {}; 13 | } 14 | schema = schema[`${elem}`]; 15 | } 16 | schema[pList[`${len-1}`]] = value; 17 | }; 18 | 19 | module.exports.get = function(obj, ...data) { 20 | return data.reduce(function(acc, key) { 21 | return acc[`${key}`]; 22 | }, obj); 23 | }; 24 | 25 | module.exports.remove = function(obj, path) { 26 | 27 | if (!obj || !path) { 28 | return; 29 | } 30 | 31 | if (typeof path === "string") { 32 | path = path.split("."); 33 | } 34 | 35 | for (var i = 0; i < path.length - 1; i++) { 36 | 37 | obj = obj[path[`${i}`]]; 38 | 39 | if (typeof obj === "undefined") { 40 | return; 41 | } 42 | } 43 | 44 | delete obj[path.pop()]; 45 | }; 46 | 47 | module.exports.fetchFiles = function(dbFolder, dbName) { 48 | 49 | if (fs.existsSync(`${dbFolder}`) === false){ 50 | fs.mkdirSync(`${dbFolder}`); 51 | if(fs.existsSync(`./${dbFolder}/${dbName}.yaml`) === false) { 52 | fs.writeFileSync(`./${dbFolder}/${dbName}.yaml`, "{}"); 53 | return; 54 | } 55 | } else { 56 | if(fs.existsSync(`./${dbFolder}/${dbName}.yaml`) === false) { 57 | fs.writeFileSync(`./${dbFolder}/${dbName}.yaml`, "{}"); 58 | } 59 | } 60 | 61 | }; 62 | 63 | -------------------------------------------------------------------------------- /adapters/mongo/Base.js: -------------------------------------------------------------------------------- 1 | const EventEmitter = require("events").EventEmitter; 2 | const mongoose = require("mongoose"); 3 | 4 | class Base extends EventEmitter { 5 | 6 | /** 7 | * Instantiates the base database. 8 | * This class is implemented by the main Database class. 9 | * @param {String} mongoURL Mongodb Database URL. 10 | * @returns {Base} 11 | * @example const db = new Base("mongodb://localhost/mydb"); 12 | */ 13 | constructor(mongoURL, connectionOptions={}) { 14 | super(); 15 | if (!mongoURL || !mongoURL.startsWith("mongodb")) throw new TypeError("No mongodb url was provided!"); 16 | if (typeof mongoURL !== "string") throw new TypeError(`Expected a string for mongodbURL, received ${typeof mongoURL}`); 17 | if (typeof connectionOptions !== "object") throw new TypeError(`Expected Object for connectionOptions, received ${typeof connectionOptions}`); 18 | 19 | this.mongoURI = mongoURL; 20 | 21 | this.options = connectionOptions; 22 | 23 | this._create(); 24 | 25 | mongoose.connection.on("error", (e) => { 26 | this.emit("error", e); 27 | }); 28 | mongoose.connection.on("open", () => { 29 | console.log("[CroxyDB Mongo] Connected. Discord: https://discord.gg/h8XJYVDyKN") 30 | this.emit("ready"); 31 | }); 32 | } 33 | 34 | 35 | _create() { 36 | mongoose.connect(this.mongoURI, { 37 | useNewUrlParser: true, 38 | useUnifiedTopology: true 39 | }); 40 | } 41 | 42 | _destroyDatabase() { 43 | mongoose.disconnect(); 44 | this.readyAt = undefined; 45 | } 46 | } 47 | 48 | module.exports = Base; -------------------------------------------------------------------------------- /functions/jsondb.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const fs = require("fs"); 4 | 5 | module.exports.set = function (path, value, obj) { 6 | var schema = obj; 7 | var pList = path.split("."); 8 | var len = pList.length; 9 | for(var i = 0; i < len-1; i++) { 10 | var elem = pList[`${i}`]; 11 | if( typeof schema[`${elem}`] !== "object" ) { 12 | schema[`${elem}`] = {}; 13 | } 14 | schema = schema[`${elem}`]; 15 | } 16 | schema[pList[`${len-1}`]] = value; 17 | }; 18 | 19 | module.exports.get = function(obj, ...data) { 20 | return data.reduce(function(acc, key) { 21 | return acc[`${key}`]; 22 | }, obj); 23 | }; 24 | 25 | module.exports.remove = function(obj, path) { 26 | 27 | if (!obj || !path) { 28 | return; 29 | } 30 | 31 | if (typeof path === "string") { 32 | path = path.split("."); 33 | } 34 | 35 | for (var i = 0; i < path.length - 1; i++) { 36 | 37 | obj = obj[path[`${i}`]]; 38 | 39 | if (typeof obj === "undefined") { 40 | return; 41 | } 42 | } 43 | 44 | delete obj[path.pop()]; 45 | }; 46 | 47 | module.exports.fetchFiles = function(dbFolder, dbName) { 48 | 49 | if (fs.existsSync(`${dbFolder}`) === false){ 50 | fs.mkdirSync(`${dbFolder}`); 51 | if(fs.existsSync(`./${dbFolder}/${dbName}.json`) === false) { 52 | fs.writeFileSync(`./${dbFolder}/${dbName}.json`, "{}"); 53 | return; 54 | } 55 | } else { 56 | if(fs.existsSync(`./${dbFolder}/${dbName}.json`) === false) { 57 | fs.writeFileSync(`./${dbFolder}/${dbName}.json`, "{}"); 58 | } 59 | } 60 | 61 | }; 62 | 63 | module.exports.removeEmptyData = function (obj) { 64 | 65 | var remove = function(obj) { 66 | Object.keys(obj).forEach(function(key) { 67 | if (obj[`${key}`] && typeof obj[`${key}`] === "object") { 68 | remove(obj[`${key}`]); 69 | } else if (obj[`${key}`] === null || obj[`${key}`]=== "") { 70 | delete obj[`${key}`]; 71 | } 72 | if (typeof obj[`${key}`] === "object" && Object.keys(obj[`${key}`]).length === 0) { 73 | delete obj[`${key}`]; 74 | } 75 | }); 76 | }; 77 | 78 | Object.keys(obj).forEach(function(key) { 79 | if (obj[`${key}`] && typeof obj[`${key}`] === "object") { 80 | remove(obj[`${key}`]); 81 | } else if (obj[`${key}`] === null || obj[`${key}`]=== "") { 82 | delete obj[`${key}`]; 83 | } 84 | if (typeof obj[`${key}`] === "object" && Object.keys(obj[`${key}`]).length === 0) { 85 | delete obj[`${key}`]; 86 | } 87 | }); 88 | 89 | }; 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CroxyDB 2 | 3 | [![Codacy Badge](https://api.codacy.com/project/badge/Grade/12341481f7db44c291844ab1d97cf602)](https://app.codacy.com/manual/CroxyTheDev/croxydb?utm_source=github.com&utm_medium=referral&utm_content=CroxyTheDev/croxydb&utm_campaign=Badge_Grade_Dashboard) ![Download](https://img.shields.io/npm/dt/croxydb.svg?style=flat-square) ![License](https://img.shields.io/npm/l/croxydb.svg?style=flat-square) 4 | 5 | # What's new in 0.0.8? 6 | - Fixed some bugs. 7 | - Added MongoDB support. 8 | 9 | > a database module 10 | 11 | Examples 12 | 13 | > Moving Data From Quick.DB 14 | 15 | ```js 16 | const db = require("croxydb"); 17 | const quickdb = require("quick.db"); 18 | 19 | db.move(quickdb) 20 | ``` 21 | 22 | > Normal Example 23 | 24 | ```js 25 | const db = require("croxydb") 26 | 27 | db.set("x.y.z", "abc") // abc 28 | 29 | db.get("x") // {y: {z: "abc"}} 30 | db.fetch("x") // {y: {z: "abc"}} 31 | db.all() // {x: {y: {z: "abc"}}} 32 | 33 | db.push("a", "hello") // ["hello"] 34 | db.push("a", "world") // ["hello", "world"] 35 | db.unpush("a", "hello") // ["world"] 36 | 37 | db.push("b", {test: "croxydb"}) // [{test: "croxydb"}] 38 | db.push("b", {test2: "croxydb2"}) // [{test: "croxydb"}, {test2: "croxydb2"}] 39 | db.delByPriority("b", 1) // [{test2: "croxydb"}] 40 | db.setByPriority("b", {newtest:"hey this is edited"}, 1) // [{newtest:"hey this is edited"}] 41 | 42 | db.has("x") // true 43 | db.delete("x") // true 44 | db.deleteAll() // true 45 | ``` 46 | 47 | > MongoDB Support (It is new feature, if you find any bugs join my [Discord](https://discord.gg/h8XJYVDyKN)) 48 | 49 | ```js 50 | const db = require("croxydb") 51 | db.setAdapter("mongo", 52 | { 53 | url: "Your Mongo URL", 54 | schema: "Schema" 55 | }) 56 | 57 | db.set("x.y.z", "abc") // abc 58 | 59 | db.get("x") // {y: {z: "abc"}} 60 | db.fetch("x") // {y: {z: "abc"}} 61 | db.all() // {x: {y: {z: "abc"}}} 62 | 63 | db.push("a", "hello") // ["hello"] 64 | db.push("a", "world") // ["hello", "world"] 65 | db.unpush("a", "hello") // ["world"] 66 | 67 | db.push("b", {test: "croxydb"}) // [{test: "croxydb"}] 68 | db.push("b", {test2: "croxydb2"}) // [{test: "croxydb"}, {test2: "croxydb2"}] 69 | db.delByPriority("b", 1) // [{test2: "croxydb"}] 70 | db.setByPriority("b", {newtest:"hey this is edited"}, 1) // [{newtest:"hey this is edited"}] 71 | 72 | db.has("x") // true 73 | db.delete("x") // true 74 | db.deleteAll() // true 75 | ``` 76 | 77 | > With Options Example 78 | 79 | ```js 80 | const db = require("croxydb") 81 | db.setReadable(true) // It makes readable your JSON DB file. 82 | db.noBlankData(true) // If you delete anything from object and new object size is less than 1, automaticly removes that object. 83 | db.setAdapter("yamldb") // It makes adapter as YAML adapter. Default adapter is JsonDB 84 | db.setFolder("folder") // You can set database folder name 85 | db.setFile("db") // You can set database file name 86 | 87 | db.set("x.y.z", "abc") // abc 88 | 89 | db.get("x") // {y: {z: "abc"}} 90 | db.fetch("x") // {y: {z: "abc"}} 91 | db.all() // {x: {y: {z: "abc"}}} 92 | 93 | db.push("a", "hello") // ["hello"] 94 | db.push("a", "world") // ["hello", "world"] 95 | db.unpush("a", "hello") // ["world"] 96 | 97 | db.push("b", {test: "croxydb"}) // [{test: "croxydb"}] 98 | db.push("b", {test2: "croxydb2"}) // [{test: "croxydb"}, {test2: "croxydb2"}] 99 | db.delByPriority("b", 1) // [{test2: "croxydb"}] 100 | db.setByPriority("b", {newtest:"hey this is edited"}, 1) // [{newtest:"hey this is edited"}] 101 | 102 | db.has("x") // true 103 | db.delete("x") // true 104 | db.deleteAll() // true 105 | ``` 106 | 107 | If you've any question, you can join to my Discord server: [Click me!](https://discord.gg/h8XJYVDyKN) 108 | -------------------------------------------------------------------------------- /adapters/localstorage.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { set, get, remove } = require("../functions/jsondb.js"); 3 | 4 | class WebDB { 5 | constructor(options) { 6 | this.dbName = options["dbName"]; 7 | } 8 | 9 | set(db, data) { 10 | 11 | if(!db) { 12 | throw new TypeError(this.message["errors"]["blankName"]); 13 | } 14 | 15 | if(!data) { 16 | throw new TypeError(this.message["errors"]["blankData"]); 17 | } 18 | 19 | var content = this.all(); 20 | set(db, data, content); 21 | 22 | localStorage.setItem(this.dbName, JSON.stringify(content)); 23 | 24 | return this.get(db); 25 | 26 | } 27 | 28 | get(db) { 29 | 30 | if(!db) { 31 | throw new TypeError(this.message["errors"]["blankName"]); 32 | } 33 | 34 | var content = this.all(); 35 | 36 | return get(content, ...db.split(".")); 37 | 38 | } 39 | 40 | fetch(db) { 41 | 42 | if(!db) { 43 | throw new TypeError(this.message["errors"]["blankName"]); 44 | } 45 | 46 | var content = this.all(); 47 | 48 | return get(content, ...db.split(".")); 49 | 50 | } 51 | 52 | has(db) { 53 | 54 | if(!db) { 55 | throw new TypeError(this.message["errors"]["blankName"]); 56 | } 57 | 58 | var content = this.all(); 59 | 60 | return get(content, ...db.split(".")) ? true : false; 61 | 62 | } 63 | 64 | delete(db) { 65 | 66 | if(!db) { 67 | throw new TypeError(this.message["errors"]["blankName"]); 68 | } 69 | 70 | var content = this.all(); 71 | 72 | if(!this.get(db)) { 73 | return false; 74 | } 75 | 76 | remove(content, db); 77 | 78 | localStorage.setItem(this.dbName, JSON.stringify(content)); 79 | 80 | return true; 81 | 82 | } 83 | 84 | add(db, number) { 85 | 86 | if(!db) { 87 | throw new TypeError(this.message["errors"]["blankName"]); 88 | } 89 | 90 | if(!number) { 91 | throw new TypeError(this.message["errors"]["blankData"]); 92 | } 93 | 94 | if(isNaN(number)) { 95 | throw new TypeError(this.message["errors"]["blankNumber"]); 96 | } 97 | 98 | this.set(db, Number(this.get(db) ? (isNaN(this.get(db)) ? Number(number) : this.get(db)+Number(number)) : Number(number))); 99 | 100 | return this.get(db); 101 | 102 | } 103 | 104 | subtract(db, number) { 105 | 106 | if(!db) { 107 | throw new TypeError(this.message["errors"]["blankName"]); 108 | } 109 | 110 | if(!number) { 111 | throw new TypeError(this.message["errors"]["blankData"]); 112 | } 113 | 114 | if(isNaN(number)) { 115 | throw new TypeError(this.message["errors"]["blankNumber"]); 116 | } 117 | 118 | if(this.get(db)-number <= 1) { 119 | this.delete(db); 120 | return (this.get(db) || 0); 121 | } 122 | 123 | if(!this.get(db)) { 124 | this.delete(db); 125 | return (this.get(db) || 0); 126 | } 127 | 128 | this.set(db, this.get(db) ? (this.get(db)-Number(number) <= 1 ? 1 : (isNaN(this.get(db)) ? 1 : this.get(db)-Number(number)) || 1) : 1); 129 | 130 | return this.get(db); 131 | 132 | } 133 | 134 | push(db, data) { 135 | 136 | if(!db) { 137 | throw new TypeError(this.message["errors"]["blankName"]); 138 | } 139 | 140 | if(!data) { 141 | throw new TypeError(this.message["errors"]["blankData"]); 142 | } 143 | 144 | var arr = []; 145 | 146 | if(this.get(db)) { 147 | if(typeof this.get(db) !== "object") { 148 | arr = []; 149 | } else { 150 | arr = this.get(db); 151 | } 152 | } 153 | 154 | arr.push(data); 155 | 156 | this.set(db, arr); 157 | 158 | return this.get(db); 159 | 160 | } 161 | 162 | unpush(db, data) { 163 | 164 | if(!db) { 165 | throw new TypeError(this.message["errors"]["blankName"]); 166 | } 167 | 168 | if(!data) { 169 | throw new TypeError(this.message["errors"]["blankData"]); 170 | } 171 | 172 | var arr = []; 173 | 174 | if(this.get(db)) { 175 | arr = this.get(db); 176 | } 177 | 178 | arr = arr.filter((x) => x !== data); 179 | 180 | this.set(db, arr); 181 | 182 | return this.get(db); 183 | 184 | } 185 | 186 | delByPriority(db, number) { 187 | 188 | if(!db) { 189 | throw new TypeError(this.message["errors"]["blankData"]); 190 | } 191 | 192 | if(!number) { 193 | throw new TypeError(this.message["errors"]["blankNumber"]); 194 | } 195 | 196 | if(isNaN(number)) { 197 | throw new TypeError(this.message["errors"]["blankNumber"]); 198 | } 199 | 200 | if(!this.get(db) || this.get(db).length < 1) { 201 | return false; 202 | } 203 | 204 | let content = this.get(db); 205 | let neww = []; 206 | 207 | if (typeof content !== "object") { 208 | return false; 209 | } 210 | 211 | for (let a = 0; a < content.length; a++) { 212 | if (a !== (number-1)) { 213 | neww.push(content[`${a}`]); 214 | } 215 | } 216 | 217 | this.set(db, neww); 218 | return this.get(db); 219 | 220 | } 221 | 222 | setByPriority(db, data, number) { 223 | 224 | if(!db) { 225 | throw new TypeError(this.message["errors"]["blankData"]); 226 | } 227 | 228 | if(!data) { 229 | throw new TypeError(this.message["errors"]["blankData"]); 230 | } 231 | 232 | if(!number) { 233 | throw new TypeError(this.message["errors"]["blankNumber"]); 234 | } 235 | 236 | if(isNaN(number)) { 237 | throw new TypeError(this.message["errors"]["blankNumber"]); 238 | } 239 | 240 | if(!this.get(db) || this.get(db).length < 1) { 241 | return false; 242 | } 243 | 244 | let content = this.get(db); 245 | let neww = []; 246 | 247 | if (typeof content !== "object") { 248 | return false; 249 | } 250 | 251 | for (let a = 0; a < content.length; a++) { 252 | let val = content[`${a}`]; 253 | 254 | if(a === (number-1)) { 255 | neww.push(data); 256 | } else { 257 | neww.push(val); 258 | } 259 | } 260 | 261 | this.set(db, neww); 262 | return this.get(db); 263 | 264 | } 265 | 266 | all() { 267 | 268 | return JSON.parse(localStorage.getItem(this.name) || "{}"); 269 | 270 | } 271 | 272 | deleteAll() { 273 | 274 | localStorage.setItem(this.dbName, JSON.stringify({})); 275 | 276 | return true; 277 | 278 | } 279 | 280 | } 281 | 282 | module.exports = WebDB; -------------------------------------------------------------------------------- /adapters/yamldb.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const fs = require("fs"); 4 | const functions = require("../functions/yamldb.js"); 5 | let YAML; 6 | 7 | class YamlDB { 8 | constructor(options) { 9 | this.dbName = options["dbName"]; 10 | this.dbFolder = options["dbFolder"]; 11 | 12 | try { 13 | YAML = require("yaml"); 14 | } catch (error) { 15 | throw new TypeError("You must install \"yaml\" module for use this adapter."); 16 | } 17 | 18 | functions.fetchFiles(this.dbFolder, this.dbName); 19 | } 20 | 21 | set(db, data) { 22 | functions.fetchFiles(this.dbFolder, this.dbName); 23 | 24 | if(!db) { 25 | throw new TypeError(this.message["errors"]["blankName"]); 26 | } 27 | 28 | if(!data) { 29 | throw new TypeError(this.message["errors"]["blankData"]); 30 | } 31 | 32 | var content = YAML.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.yaml`, "utf8")); 33 | functions.set(db, data, content); 34 | fs.writeFileSync(`./${this.dbFolder}/${this.dbName}.yaml`, YAML.stringify(content)); 35 | return this.get(db); 36 | 37 | 38 | } 39 | 40 | get(db) { 41 | 42 | if(!db) { 43 | throw new TypeError(this.message["errors"]["blankName"]); 44 | } 45 | 46 | var content = YAML.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.yaml`, "utf8")); 47 | 48 | try { 49 | return functions.get(content, ...db.split(".")); 50 | } catch(err) { 51 | return undefined; 52 | } 53 | 54 | } 55 | 56 | fetch(db) { 57 | 58 | if(!db) { 59 | throw new TypeError(this.message["errors"]["blankName"]); 60 | } 61 | 62 | var content = YAML.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.yaml`, "utf8")); 63 | 64 | try { 65 | return functions.get(content, ...db.split(".")); 66 | } catch(err) { 67 | return undefined; 68 | } 69 | 70 | } 71 | 72 | has(db) { 73 | 74 | if(!db) { 75 | throw new TypeError(this.message["errors"]["blankName"]); 76 | } 77 | 78 | var content = YAML.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.yaml`, "utf8")); 79 | 80 | try { 81 | return functions.get(content, ...db.split(".")) ? true : false; 82 | } catch(err) { 83 | return false; 84 | } 85 | 86 | } 87 | 88 | delete(db) { 89 | functions.fetchFiles(this.dbFolder, this.dbName); 90 | 91 | if(!db) { 92 | throw new TypeError(this.message["errors"]["blankName"]); 93 | } 94 | 95 | var content = YAML.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.yaml`, "utf8")); 96 | 97 | if(!this.get(db)) { 98 | return false; 99 | } 100 | 101 | functions.remove(content, db); 102 | 103 | fs.writeFileSync(`./${this.dbFolder}/${this.dbName}.yaml`, YAML.stringify(content)); 104 | 105 | return true; 106 | } 107 | 108 | add(db, number) { 109 | 110 | if(!db) { 111 | throw new TypeError(this.message["errors"]["blankName"]); 112 | } 113 | 114 | if(!number) { 115 | throw new TypeError(this.message["errors"]["blankData"]); 116 | } 117 | 118 | if(isNaN(number)) { 119 | throw new TypeError(this.message["errors"]["blankNumber"]); 120 | } 121 | 122 | this.set(db, Number(this.get(db) ? (isNaN(this.get(db)) ? Number(number) : this.get(db)+Number(number)) : Number(number))); 123 | 124 | return this.get(db); 125 | 126 | } 127 | 128 | subtract(db, number) { 129 | 130 | if(!db) { 131 | throw new TypeError(this.message["errors"]["blankName"]); 132 | } 133 | 134 | if(!number) { 135 | throw new TypeError(this.message["errors"]["blankData"]); 136 | } 137 | 138 | if(isNaN(number)) { 139 | throw new TypeError(this.message["errors"]["blankNumber"]); 140 | } 141 | 142 | if(this.get(db)-number < 1) { 143 | this.delete(db); 144 | return (this.get(db) || 0); 145 | } 146 | 147 | if(!this.get(db)) { 148 | this.delete(db); 149 | return (this.get(db) || 0); 150 | } 151 | 152 | this.set(db, this.get(db) ? (this.get(db)-Number(number) <= 1 ? 1 : (isNaN(this.get(db)) ? 1 : this.get(db)-Number(number)) || 1) : 1); 153 | 154 | return this.get(db); 155 | 156 | } 157 | 158 | push(db, data) { 159 | 160 | if(!db) { 161 | throw new TypeError(this.message["errors"]["blankName"]); 162 | } 163 | 164 | if(!data) { 165 | throw new TypeError(this.message["errors"]["blankData"]); 166 | } 167 | 168 | var arr = []; 169 | 170 | if(this.get(db)) { 171 | if(typeof this.get(db) !== "object") { 172 | arr = []; 173 | } else { 174 | arr = this.get(db); 175 | } 176 | } 177 | 178 | arr.push(data); 179 | 180 | this.set(db, arr); 181 | 182 | return this.get(db); 183 | 184 | } 185 | 186 | unpush(db, data) { 187 | 188 | if(!db) { 189 | throw new TypeError(this.message["errors"]["blankName"]); 190 | } 191 | 192 | if(!data) { 193 | throw new TypeError(this.message["errors"]["blankData"]); 194 | } 195 | 196 | var arr = []; 197 | 198 | if(this.get(db)) { 199 | arr = this.get(db); 200 | } 201 | 202 | arr = arr.filter((x) => x !== data); 203 | 204 | this.set(db, arr); 205 | 206 | return this.get(db); 207 | 208 | } 209 | 210 | delByPriority(db, number) { 211 | 212 | if(!db) { 213 | throw new TypeError(this.message["errors"]["blankData"]); 214 | } 215 | 216 | if(!number) { 217 | throw new TypeError(this.message["errors"]["blankNumber"]); 218 | } 219 | 220 | if(isNaN(number)) { 221 | throw new TypeError(this.message["errors"]["blankNumber"]); 222 | } 223 | 224 | if(!this.get(db) || this.get(db).length < 1) { 225 | return false; 226 | } 227 | 228 | let content = this.get(db); 229 | let neww = []; 230 | 231 | if (typeof content !== "object") { 232 | return false; 233 | } 234 | 235 | for (let a = 0; a < content.length; a++) { 236 | if (a !== (number-1)) { 237 | neww.push(content[`${a}`]); 238 | } 239 | } 240 | 241 | this.set(db, neww); 242 | return this.get(db); 243 | 244 | } 245 | 246 | setByPriority(db, data, number) { 247 | 248 | if(!db) { 249 | throw new TypeError(this.message["errors"]["blankData"]); 250 | } 251 | 252 | if(!data) { 253 | throw new TypeError(this.message["errors"]["blankData"]); 254 | } 255 | 256 | if(!number) { 257 | throw new TypeError(this.message["errors"]["blankNumber"]); 258 | } 259 | 260 | if(isNaN(number)) { 261 | throw new TypeError(this.message["errors"]["blankNumber"]); 262 | } 263 | 264 | if(!this.get(db) || this.get(db).length < 1) { 265 | return false; 266 | } 267 | 268 | let content = this.get(db); 269 | let neww = []; 270 | 271 | if (typeof content !== "object") { 272 | return false; 273 | } 274 | 275 | for (let a = 0; a < content.length; a++) { 276 | let val = content[`${a}`]; 277 | 278 | if(a === (number-1)) { 279 | neww.push(data); 280 | } else { 281 | neww.push(val); 282 | } 283 | } 284 | 285 | this.set(db, neww); 286 | return this.get(db); 287 | 288 | } 289 | 290 | all() { 291 | var content = YAML.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.yaml`, "utf8")); 292 | 293 | return content; 294 | } 295 | 296 | deleteAll() { 297 | 298 | fs.writeFileSync(`./${this.dbFolder}/${this.dbName}.yaml`, YAML.stringify({})); 299 | 300 | return true; 301 | 302 | } 303 | 304 | } 305 | 306 | module.exports = YamlDB; -------------------------------------------------------------------------------- /file/index.js: -------------------------------------------------------------------------------- 1 | const langs = ["tr", "en"]; 2 | 3 | module.exports = { 4 | setOptions() { 5 | var adapter = this.adapter || require("../adapters/jsondb"); 6 | this.options = { 7 | dbName: this.file || "croxydb", 8 | dbFolder: this.folder || "croxydb", 9 | noBlankData: this.noBlankData || false, 10 | readable: this.readable || false, 11 | language: this.lang ? this.lang : "en", 12 | isMongo: this.mongo, 13 | mongoOptions: this.mongoOptions || {} 14 | } 15 | this.message = this.lang ? require(`../language/${this.lang.toLowerCase()}.json`) : require(`../language/en.json`); 16 | this.adapter = adapter.set ? adapter : (this.mongo ? new adapter(this.options.mongoOptions) : new adapter(this.options)); 17 | fetch("https://registry.npmjs.org/croxydb/latest").then(async(res) => { 18 | res.json().then((data) => { 19 | if(require("../package.json").version !== data.version) { 20 | console.warn(this.message["errors"]["oldVersion"]) 21 | } 22 | }) 23 | }) 24 | }, 25 | 26 | setLanguage(lang) { 27 | this.lang = lang ? (langs.includes(lang.toLowerCase()) ? lang.toLowerCase() : "en") : "en"; 28 | this.message = require(`../language/${this.lang.toLowerCase()}.json`); 29 | this.setOptions(); 30 | return lang; 31 | }, 32 | 33 | setMongo(options) { 34 | try { 35 | require("mongoose"); 36 | } catch (error) { 37 | throw new TypeError("You must install \"mongoose\" to use this adapter."); 38 | } 39 | var adapter = require("../adapters/mongo/index"); 40 | this.adapter = adapter; 41 | this.mongo = true; 42 | this.mongoOptions = options; 43 | }, 44 | 45 | deleteMongo() { 46 | var adapter = require("../adapters/jsondb"); 47 | this.adapter = adapter; 48 | this.mongo = false; 49 | this.setOptions(); 50 | }, 51 | 52 | setAdapter(adapter, options = {}) { 53 | if(adapter !== "mongo") { 54 | var adapter = require("../adapters/"+adapter) || require("../adapters/jsondb"); 55 | this.adapter = adapter; 56 | this.mongo = false; 57 | this.setOptions(); 58 | return true; 59 | } else { 60 | try { 61 | require("mongoose"); 62 | require("deasync"); 63 | } catch (error) { 64 | throw new TypeError("You must install \"mongoose\" and \"deasync\" modules to use this adapter."); 65 | } 66 | var adapter = require("../adapters/mongo/index"); 67 | this.mongo = true; 68 | this.adapter = adapter; 69 | this.mongoOptions = options; 70 | this.setOptions(); 71 | return adapter; 72 | } 73 | }, 74 | 75 | setFolder(folder) { 76 | this.folder = folder; 77 | this.setOptions(); 78 | return true; 79 | }, 80 | 81 | setFile(file) { 82 | this.file = file; 83 | this.setOptions(); 84 | return true; 85 | }, 86 | 87 | setReadable(boolean) { 88 | this.readable = boolean ? (typeof boolean === "boolean" ? true : false) : false; 89 | this.setOptions(); 90 | return this.readable; 91 | }, 92 | 93 | setNoBlankData(boolean) { 94 | this.noBlankData = boolean ? (typeof boolean === "boolean" ? boolean : false) : false; 95 | this.setOptions(); 96 | return this.noBlankData; 97 | }, 98 | 99 | set(db, data) { 100 | this.setOptions(); 101 | if(!db) { 102 | throw new TypeError(this.message["errors"]["blankName"]); 103 | } 104 | 105 | if(!data) { 106 | throw new TypeError(this.message["errors"]["blankData"]); 107 | } 108 | 109 | return this.adapter.set(db, data); 110 | }, 111 | 112 | get(db) { 113 | this.setOptions(); 114 | if(!db) { 115 | throw new TypeError(this.message["errors"]["blankName"]); 116 | } 117 | 118 | try { 119 | return this.adapter.get(db); 120 | } catch(err) { 121 | return undefined; 122 | } 123 | 124 | }, 125 | 126 | fetch(db) { 127 | this.setOptions(); 128 | if(!db) { 129 | throw new TypeError(this.message["errors"]["blankName"]); 130 | } 131 | 132 | try { 133 | return this.adapter.get(db); 134 | } catch(err) { 135 | return undefined; 136 | } 137 | 138 | }, 139 | 140 | has(db) { 141 | this.setOptions(); 142 | if(!db) { 143 | throw new TypeError(this.message["errors"]["blankName"]); 144 | } 145 | 146 | try { 147 | return this.adapter.get(db) ? true : false; 148 | } catch(err) { 149 | return false; 150 | } 151 | 152 | }, 153 | 154 | delete(db) { 155 | this.setOptions(); 156 | if(!db) { 157 | throw new TypeError(this.message["errors"]["blankName"]); 158 | } 159 | 160 | try { 161 | return this.adapter.delete(db); 162 | } catch (err) { 163 | return false; 164 | } 165 | 166 | }, 167 | 168 | add(db, number) { 169 | this.setOptions(); 170 | if(!db) { 171 | throw new TypeError(this.message["errors"]["blankName"]); 172 | } 173 | 174 | if(!number) { 175 | throw new TypeError(this.message["errors"]["blankData"]); 176 | } 177 | 178 | if(isNaN(number)) { 179 | throw new TypeError(this.message["errors"]["blankNumber"]); 180 | } 181 | 182 | return this.adapter.add(db, number); 183 | 184 | }, 185 | 186 | subtract(db, number) { 187 | this.setOptions(); 188 | if(!db) { 189 | throw new TypeError(this.message["errors"]["blankName"]); 190 | } 191 | 192 | if(!number) { 193 | throw new TypeError(this.message["errors"]["blankData"]); 194 | } 195 | 196 | if(isNaN(number)) { 197 | throw new TypeError(this.message["errors"]["blankNumber"]); 198 | } 199 | 200 | return this.adapter.subtract(db, number); 201 | 202 | }, 203 | 204 | push(db, data) { 205 | this.setOptions(); 206 | if(!db) { 207 | throw new TypeError(this.message["errors"]["blankName"]); 208 | } 209 | 210 | if(!data) { 211 | throw new TypeError(this.message["errors"]["blankData"]); 212 | } 213 | 214 | return this.adapter.push(db, data); 215 | }, 216 | 217 | unpush(db, data) { 218 | this.setOptions(); 219 | if(!db) { 220 | throw new TypeError(this.message["errors"]["blankName"]); 221 | } 222 | 223 | if(!data) { 224 | throw new TypeError(this.message["errors"]["blankData"]); 225 | } 226 | 227 | return this.adapter.unpush(db, data); 228 | }, 229 | 230 | delByPriority(db, number) { 231 | this.setOptions(); 232 | if(!db) { 233 | throw new TypeError(this.message["errors"]["blankName"]); 234 | } 235 | 236 | if(!number) { 237 | throw new TypeError(this.message["errors"]["blankData"]); 238 | } 239 | 240 | if(isNaN(number)) { 241 | throw new TypeError(this.message["errors"]["blankNumber"]); 242 | } 243 | 244 | return this.adapter.delByPriority(db, number); 245 | 246 | }, 247 | 248 | setByPriority(db, data, number) { 249 | this.setOptions(); 250 | if(!db) { 251 | throw new TypeError(this.message["errors"]["blankName"]); 252 | } 253 | 254 | if(!data) { 255 | throw new TypeError(this.message["errors"]["blankData"]); 256 | } 257 | 258 | if(!number) { 259 | throw new TypeError(this.message["errors"]["blankData"]); 260 | } 261 | 262 | if(isNaN(number)) { 263 | throw new TypeError(this.message["errors"]["blankNumber"]); 264 | } 265 | 266 | return this.adapter.delByPriority(db, number); 267 | 268 | }, 269 | 270 | all() { 271 | this.setOptions(); 272 | return this.adapter.all(); 273 | 274 | }, 275 | 276 | deleteAll() { 277 | this.setOptions(); 278 | return this.adapter.deleteAll(); 279 | 280 | }, 281 | 282 | move(quickDB) { 283 | console.log("QuickDB to CroxyDB: Started copying database.") 284 | quickDB.fetchAll().map((data) => { 285 | this.adapter.set(data.ID, data.data) 286 | console.log(`QuickDB to CroxyDB: Copied ${data.ID}`) 287 | }) 288 | return true; 289 | } 290 | 291 | } -------------------------------------------------------------------------------- /adapters/jsondb.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const fs = require("fs"); 4 | const functions = require("../functions/jsondb.js"); 5 | 6 | class JsonDB { 7 | constructor(options) { 8 | this.dbName = options["dbName"]; 9 | this.dbFolder = options["dbFolder"]; 10 | this.noBlankData = options["noBlankData"] ? (typeof options["noBlankData"] === "boolean" ? options["noBlankData"] : false) : false; 11 | this.readable = options["readable"] ? (typeof options["readable"] === "boolean" ? true : false) : false; 12 | 13 | functions.fetchFiles(this.dbFolder, this.dbName); 14 | } 15 | 16 | set(db, data) { 17 | functions.fetchFiles(this.dbFolder, this.dbName); 18 | 19 | if(!db) { 20 | throw new TypeError(this.message["errors"]["blankName"]); 21 | } 22 | 23 | if(!data) { 24 | throw new TypeError(this.message["errors"]["blankData"]); 25 | } 26 | 27 | var content = JSON.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.json`, "utf8")); 28 | functions.set(db, data, content); 29 | 30 | if(this.readable) { 31 | fs.writeFileSync(`./${this.dbFolder}/${this.dbName}.json`, JSON.stringify(content, null, 2)); 32 | } else { 33 | fs.writeFileSync(`./${this.dbFolder}/${this.dbName}.json`, JSON.stringify(content)); 34 | } 35 | return this.get(db); 36 | 37 | } 38 | 39 | get(db) { 40 | 41 | if(!db) { 42 | throw new TypeError(this.message["errors"]["blankName"]); 43 | } 44 | 45 | var content = JSON.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.json`, "utf8")); 46 | 47 | try { 48 | return functions.get(content, ...db.split(".")); 49 | } catch(err) { 50 | return undefined; 51 | } 52 | 53 | } 54 | 55 | fetch(db) { 56 | 57 | if(!db) { 58 | throw new TypeError(this.message["errors"]["blankName"]); 59 | } 60 | 61 | var content = JSON.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.json`, "utf8")); 62 | 63 | try { 64 | return functions.get(content, ...db.split(".")); 65 | } catch(err) { 66 | return undefined; 67 | } 68 | 69 | } 70 | 71 | has(db) { 72 | 73 | if(!db) { 74 | throw new TypeError(this.message["errors"]["blankName"]); 75 | } 76 | 77 | var content = JSON.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.json`, "utf8")); 78 | 79 | try { 80 | return functions.get(content, ...db.split(".")) ? true : false; 81 | } catch(err) { 82 | return false; 83 | } 84 | 85 | } 86 | 87 | delete(db) { 88 | functions.fetchFiles(this.dbFolder, this.dbName); 89 | 90 | if(!db) { 91 | throw new TypeError(this.message["errors"]["blankName"]); 92 | } 93 | 94 | var content = JSON.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.json`, "utf8")); 95 | 96 | if(!this.get(db)) { 97 | return false; 98 | } 99 | 100 | functions.remove(content, db); 101 | 102 | if(this.noBlankData === true) { 103 | functions.removeEmptyData(content); 104 | } 105 | 106 | if(this.readable) { 107 | fs.writeFileSync(`./${this.dbFolder}/${this.dbName}.json`, JSON.stringify(content, null, 2)); 108 | } else { 109 | fs.writeFileSync(`./${this.dbFolder}/${this.dbName}.json`, JSON.stringify(content)); 110 | } 111 | 112 | return true; 113 | } 114 | 115 | add(db, number) { 116 | 117 | if(!db) { 118 | throw new TypeError(this.message["errors"]["blankName"]); 119 | } 120 | 121 | if(!number) { 122 | throw new TypeError(this.message["errors"]["blankData"]); 123 | } 124 | 125 | if(isNaN(number)) { 126 | throw new TypeError(this.message["errors"]["blankNumber"]); 127 | } 128 | 129 | this.set(db, Number(this.get(db) ? (isNaN(this.get(db)) ? Number(number) : this.get(db)+Number(number)) : Number(number))); 130 | 131 | return this.get(db); 132 | 133 | } 134 | 135 | subtract(db, number) { 136 | 137 | if(!db) { 138 | throw new TypeError(this.message["errors"]["blankName"]); 139 | } 140 | 141 | if(!number) { 142 | throw new TypeError(this.message["errors"]["blankData"]); 143 | } 144 | 145 | if(isNaN(number)) { 146 | throw new TypeError(this.message["errors"]["blankNumber"]); 147 | } 148 | 149 | if(this.get(db)-number < 1) { 150 | this.delete(db); 151 | return (this.get(db) || 0); 152 | } 153 | 154 | if(!this.get(db)) { 155 | this.delete(db); 156 | return (this.get(db) || 0); 157 | } 158 | 159 | this.set(db, this.get(db) ? (this.get(db)-Number(number) <= 1 ? 1 : (isNaN(this.get(db)) ? 1 : this.get(db)-Number(number)) || 1) : 1); 160 | return this.get(db); 161 | 162 | } 163 | 164 | push(db, data) { 165 | 166 | if(!db) { 167 | throw new TypeError(this.message["errors"]["blankName"]); 168 | } 169 | 170 | if(!data) { 171 | throw new TypeError(this.message["errors"]["blankData"]); 172 | } 173 | 174 | var arr = []; 175 | 176 | if(this.get(db)) { 177 | if(typeof this.get(db) !== "object") { 178 | arr = []; 179 | } else { 180 | arr = this.get(db); 181 | } 182 | } 183 | 184 | arr.push(data); 185 | 186 | this.set(db, arr); 187 | 188 | return this.get(db); 189 | 190 | } 191 | 192 | unpush(db, data) { 193 | 194 | if(!db) { 195 | throw new TypeError(this.message["errors"]["blankName"]); 196 | } 197 | 198 | if(!data) { 199 | throw new TypeError(this.message["errors"]["blankData"]); 200 | } 201 | 202 | var arr = []; 203 | 204 | if(this.get(db)) { 205 | arr = this.get(db); 206 | } 207 | 208 | arr = arr.filter((x) => x !== data); 209 | 210 | this.set(db, arr); 211 | 212 | return this.get(db); 213 | 214 | } 215 | 216 | delByPriority(db, number) { 217 | 218 | if(!db) { 219 | throw new TypeError(this.message["errors"]["blankData"]); 220 | } 221 | 222 | if(!number) { 223 | throw new TypeError(this.message["errors"]["blankNumber"]); 224 | } 225 | 226 | if(isNaN(number)) { 227 | throw new TypeError(this.message["errors"]["blankNumber"]); 228 | } 229 | 230 | if(!this.get(db) || this.get(db).length < 1) { 231 | return false; 232 | } 233 | 234 | let content = this.get(db); 235 | let neww = []; 236 | 237 | if (typeof content !== "object") { 238 | return false; 239 | } 240 | 241 | for (let a = 0; a < content.length; a++) { 242 | if (a !== (number-1)) { 243 | neww.push(content[`${a}`]); 244 | } 245 | } 246 | 247 | this.set(db, neww); 248 | return this.get(db); 249 | 250 | } 251 | 252 | setByPriority(db, data, number) { 253 | 254 | if(!db) { 255 | throw new TypeError(this.message["errors"]["blankData"]); 256 | } 257 | 258 | if(!data) { 259 | throw new TypeError(this.message["errors"]["blankData"]); 260 | } 261 | 262 | if(!number) { 263 | throw new TypeError(this.message["errors"]["blankNumber"]); 264 | } 265 | 266 | if(isNaN(number)) { 267 | throw new TypeError(this.message["errors"]["blankNumber"]); 268 | } 269 | 270 | if(!this.get(db) || this.get(db).length < 1) { 271 | return false; 272 | } 273 | 274 | let content = this.get(db); 275 | let neww = []; 276 | 277 | if (typeof content !== "object") { 278 | return false; 279 | } 280 | 281 | for (let a = 0; a < content.length; a++) { 282 | let val = content[`${a}`]; 283 | 284 | if(a === (number-1)) { 285 | neww.push(data); 286 | } else { 287 | neww.push(val); 288 | } 289 | } 290 | 291 | this.set(db, neww); 292 | return this.get(db); 293 | 294 | } 295 | 296 | all() { 297 | var content = JSON.parse(fs.readFileSync(`./${this.dbFolder}/${this.dbName}.json`, "utf8")); 298 | 299 | return content; 300 | } 301 | 302 | deleteAll() { 303 | 304 | fs.writeFileSync(`./${this.dbFolder}/${this.dbName}.json`, JSON.stringify({})); 305 | 306 | return true; 307 | 308 | } 309 | 310 | } 311 | 312 | module.exports = JsonDB; -------------------------------------------------------------------------------- /adapters/mongo/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const Base = require("./Base"); 3 | const Schema = require("./Schema"); 4 | const deasync = require("deasync"); 5 | 6 | class MongoDB extends Base { 7 | constructor(options) { 8 | super(options["url"]) 9 | 10 | this.schema = Schema(options["schema"]) 11 | } 12 | 13 | set(db, data) { 14 | if(!db) { 15 | throw new TypeError(this.message["errors"]["blankName"]); 16 | } 17 | 18 | if(!data) { 19 | throw new TypeError(this.message["errors"]["blankData"]); 20 | } 21 | 22 | return deasync(async (cb) => { 23 | let content = await this.schema.findOne({ key: db }); 24 | 25 | 26 | if (!content) { 27 | let _data = new this.schema({ 28 | key: db, 29 | value: data 30 | }); 31 | 32 | await _data.save().catch(e => { 33 | return this.emit("error", e); 34 | }); 35 | 36 | cb(null, this.get(db)); 37 | 38 | } else { 39 | await content.updateOne({ value: data }) 40 | cb(null, this.get(db)); 41 | } 42 | })(); 43 | } 44 | 45 | set(db, data) { 46 | 47 | if(!db) { 48 | throw new TypeError(this.message["errors"]["blankName"]); 49 | } 50 | 51 | if(!data) { 52 | throw new TypeError(this.message["errors"]["blankData"]); 53 | } 54 | 55 | return deasync(async (cb) => { 56 | let content = await this.schema.findOne({ 57 | key: db 58 | }); 59 | 60 | if (!content) { 61 | let _data = new this.schema({ 62 | key: db, 63 | value: data 64 | }); 65 | 66 | await _data.save().catch(e => { 67 | return this.emit("error", e); 68 | }); 69 | cb(null, data); 70 | 71 | } else { 72 | await this.schema.findOneAndUpdate({ 73 | key: db 74 | }, 75 | { 76 | value: data 77 | }); 78 | 79 | cb(null, data); 80 | } 81 | })(); 82 | } 83 | 84 | get(db) { 85 | 86 | if(!db) { 87 | throw new TypeError(this.message["errors"]["blankName"]); 88 | } 89 | 90 | return deasync(async (cb) => { 91 | let content = await this.schema.findOne({ 92 | key: db 93 | }); 94 | if(!content) return cb(null, undefined) 95 | cb(null, content.value); 96 | 97 | })(); 98 | } 99 | 100 | fetch(db) { 101 | 102 | return this.get(db); 103 | 104 | } 105 | 106 | has(db) { 107 | 108 | if(!db) { 109 | throw new TypeError(this.message["errors"]["blankName"]); 110 | } 111 | 112 | var data = this.get(db); 113 | if(data !== undefined) { 114 | return true; 115 | } else { 116 | return false; 117 | } 118 | 119 | } 120 | 121 | delete(db) { 122 | if(!db) { 123 | throw new TypeError(this.message["errors"]["blankName"]); 124 | } 125 | 126 | return deasync(async (cb) => { 127 | 128 | let content = await this.schema.findOneAndDelete({ 129 | key: db 130 | }); 131 | 132 | cb(null, true); 133 | 134 | })(); 135 | } 136 | 137 | add(db, number) { 138 | 139 | if(!db) { 140 | throw new TypeError(this.message["errors"]["blankName"]); 141 | } 142 | 143 | if(!number) { 144 | throw new TypeError(this.message["errors"]["blankNumber"]); 145 | } 146 | 147 | if(isNaN(number)) { 148 | throw new TypeError(this.message["errors"]["blankNumber"]); 149 | } 150 | 151 | return deasync(async (cb) => { 152 | let content = await this.schema.findOne({ 153 | key: db 154 | }); 155 | 156 | if (!content) { 157 | let _data = new this.schema({ 158 | key: db, 159 | value: number 160 | }); 161 | 162 | await _data.save().catch(e => { 163 | return this.emit("error", e); 164 | }); 165 | cb(null, number); 166 | 167 | } else { 168 | await this.schema.findOneAndUpdate({ 169 | key: db 170 | }, 171 | { $inc : {value : number} }); 172 | 173 | cb(null, content.value + number); 174 | } 175 | })(); 176 | 177 | } 178 | 179 | subtract(db, number) { 180 | 181 | if(!db) { 182 | throw new TypeError(this.message["errors"]["blankName"]); 183 | } 184 | 185 | if(!number) { 186 | throw new TypeError(this.message["errors"]["blankData"]); 187 | } 188 | 189 | if(isNaN(number)) { 190 | throw new TypeError(this.message["errors"]["blankNumber"]); 191 | } 192 | 193 | return this.add(db, parseInt(`-${number}`)) 194 | 195 | } 196 | 197 | push(db, data) { 198 | 199 | if(!db) { 200 | throw new TypeError(this.message["errors"]["blankName"]); 201 | } 202 | 203 | if(!data) { 204 | throw new TypeError(this.message["errors"]["blankData"]); 205 | } 206 | 207 | var arr = []; 208 | 209 | if(this.get(db)) { 210 | if(typeof this.get(db) !== "object") { 211 | arr = []; 212 | } else { 213 | arr = this.get(db); 214 | } 215 | } 216 | 217 | arr.push(data); 218 | 219 | this.set(db, arr); 220 | 221 | return this.get(db); 222 | 223 | } 224 | 225 | unpush(db, data) { 226 | 227 | if(!db) { 228 | throw new TypeError(this.message["errors"]["blankName"]); 229 | } 230 | 231 | if(!data) { 232 | throw new TypeError(this.message["errors"]["blankData"]); 233 | } 234 | 235 | var arr = []; 236 | 237 | if(this.get(db)) { 238 | arr = this.get(db); 239 | } 240 | 241 | arr = arr.filter((x) => x !== data); 242 | 243 | this.set(db, arr); 244 | 245 | return this.get(db); 246 | 247 | } 248 | 249 | delByPriority(db, number) { 250 | 251 | if(!db) { 252 | throw new TypeError(this.message["errors"]["blankData"]); 253 | } 254 | 255 | if(!number) { 256 | throw new TypeError(this.message["errors"]["blankNumber"]); 257 | } 258 | 259 | if(isNaN(number)) { 260 | throw new TypeError(this.message["errors"]["blankNumber"]); 261 | } 262 | 263 | if(!this.get(db) || this.get(db).length < 1) { 264 | return false; 265 | } 266 | 267 | let content = this.get(db); 268 | let neww = []; 269 | 270 | if (typeof content !== "object") { 271 | return false; 272 | } 273 | 274 | for (let a = 0; a < content.length; a++) { 275 | if (a !== (number-1)) { 276 | neww.push(content[`${a}`]); 277 | } 278 | } 279 | 280 | this.set(db, neww); 281 | return this.get(db); 282 | 283 | } 284 | 285 | setByPriority(db, data, number) { 286 | 287 | if(!db) { 288 | throw new TypeError(this.message["errors"]["blankData"]); 289 | } 290 | 291 | if(!data) { 292 | throw new TypeError(this.message["errors"]["blankData"]); 293 | } 294 | 295 | if(!number) { 296 | throw new TypeError(this.message["errors"]["blankNumber"]); 297 | } 298 | 299 | if(isNaN(number)) { 300 | throw new TypeError(this.message["errors"]["blankNumber"]); 301 | } 302 | 303 | if(!this.get(db) || this.get(db).length < 1) { 304 | return false; 305 | } 306 | 307 | let content = this.get(db); 308 | let neww = []; 309 | 310 | if (typeof content !== "object") { 311 | return false; 312 | } 313 | 314 | for (let a = 0; a < content.length; a++) { 315 | let val = content[`${a}`]; 316 | 317 | if(a === (number-1)) { 318 | neww.push(data); 319 | } else { 320 | neww.push(val); 321 | } 322 | } 323 | 324 | this.set(db, neww); 325 | return this.get(db); 326 | 327 | } 328 | 329 | all() { 330 | return deasync(async (cb) => { 331 | let content = await this.schema.find({}); 332 | 333 | cb(null, content); 334 | 335 | })(); 336 | } 337 | 338 | deleteAll() { 339 | 340 | return deasync(async (cb) => { 341 | await this.schema.deleteMany(); 342 | 343 | cb(null, {}); 344 | 345 | })(); 346 | 347 | } 348 | 349 | } 350 | 351 | module.exports = MongoDB; --------------------------------------------------------------------------------