{"id":19752550,"url":"https://github.com/na2axl/jsondb-js","last_synced_at":"2026-04-16T18:05:14.342Z","repository":{"id":57285695,"uuid":"67800267","full_name":"na2axl/jsondb-js","owner":"na2axl","description":"Manages JSON files as databases with JSONDB Query Language (JQL)","archived":false,"fork":false,"pushed_at":"2018-03-26T00:40:00.000Z","size":714,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-22T21:42:25.205Z","etag":null,"topics":["database-management","jql","jql-query","json-files","jsondb","nodejs","prepared-queries","query-jsondb","query-language"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/na2axl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-09T13:15:20.000Z","updated_at":"2019-11-26T15:22:13.000Z","dependencies_parsed_at":"2022-09-15T02:50:44.837Z","dependency_job_id":null,"html_url":"https://github.com/na2axl/jsondb-js","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/na2axl/jsondb-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/na2axl%2Fjsondb-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/na2axl%2Fjsondb-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/na2axl%2Fjsondb-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/na2axl%2Fjsondb-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/na2axl","download_url":"https://codeload.github.com/na2axl/jsondb-js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/na2axl%2Fjsondb-js/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267345269,"owners_count":24072488,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-27T02:00:11.917Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database-management","jql","jql-query","json-files","jsondb","nodejs","prepared-queries","query-jsondb","query-language"],"created_at":"2024-11-12T02:49:33.323Z","updated_at":"2025-10-14T17:27:22.178Z","avatar_url":"https://github.com/na2axl.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JSONDB\nManage local databases with JSON files and JSONDB Query Language (JQL)\n\n[![MIT License](https://img.shields.io/badge/license-GPLv3-blue.svg)](https://github.com/na2axl/jsondb-js/blob/master/LICENSE)\n\n\n## What's that ?\nJSONDB is a database manager using JSON files and a custom query\nlanguage named **JQL** (**J**SONDB **Q**uery **L**anguage).\n\n## Features\n* Database management with servers, databases and tables\n* Secure connections to servers with username and password\n* Sync and async operations\n* Easy custom query language\n* Supported JQL queries:\n    * select()\n    * insert()\n    * replace()\n    * delete()\n    * update()\n    * truncate()\n    * count()\n\n## Getting Started\n_Full API and documentation will be soon available on the JSONDB website..._\n\n### Install using npm\nJSONDB can be installed through npm:\n```sh\n$ npm install jsondb-js\n```\n\n### Instantiate JSONDB\n```javascript\nvar JSONDB = require(\"jsondb-js\");\nvar jdb = new JSONDB();\n```\n\n### Create a server\nIf you don't have created a server yet, then:\n```javascript\n// Sync\njdb.createServer('server_name', 'username', 'password', connect);\n\n// Async\njdb.async.createServer('server_name', 'username', 'password', function (error) {\n    if (error) {\n        throw error;\n    }\n});\n```\nIt's useful to check if the destination folder doesn't exist before create a server to avoid errors.\n```javascript\n// Sync\nif (!jdb.serverExists('server_name')) {\n    // Then... create a server\n}\n\n// Async\njdb.async.serverExists('server_name', function(exists) {\n    if (!exists) {\n        // Then... create a server\n    }\n});\n```\n\n### Connect to a server\nOnce instantiated, you have to connect to a server before send queries.\n```javascript\n// Sync\nvar db = jdb.connect('server_name', 'username', 'password', 'database_name');\n// or...\nvar db = jdb.connect('server_name', 'username', 'password');\n\n// Async\njdb.async.connect('server_name', 'user_name', 'password', 'database_name', function (error, db) {\n    if (error) {\n        throw error;\n    }\n    // db is now a server connection...\n});\n// or...\njdb.async.connect('server_name', 'user_name', 'password', function (error, db) {\n    if (error) {\n        throw error;\n    }\n    // db is now a server connection...\n});\n```\n* The `server_name` is the name of the folder which represents a server (a folder which contains databases). This folder have to be created with `jdb.createServer()`\n* The `username` and the `password` are the information used to connect to the server. These information are the same used when creating the server\n* The `database_name` is the name of the database to use with current connection. This parameter is optional and can be set manually later.\n\n### Create a database\nAfter connection to a server, you can create a database:\n```javascript\n// Sync\ndb.createDatabase('database_name');\n\n// Async\ndb.async.createDatabase('database_name', function(error) {\n    if (error) {\n        throw error;\n    }\n});\n```\nYou can also check if the database exist before the creation.\n```javascript\n// Sync\nif (!db.databaseExists('database_name')) {\n    // Then... create a database\n}\n\n// Async\ndb.async.databaseExists('database_name', function (exists) {\n    if (!exists) {\n        // Then... create a database\n    }\n});\n```\n\n### Use a database\nThe database to use can be set using the `jdb.connect()` method, or manually using `jdb.setDatabase()` method after a connection to a server:\n```javascript\ndb.setDatabase('database_name');\n```\n\n### Create a table\nOnce JSONDB is properly connected to a server and use a database, you can create a table in this database:\n```javascript\n// Sync\ndb.createTable('table_name', prototype);\n\n// Async\ndb.async.createTable('table_name', prototype, function(error) {\n    if (error) {\n        throw error;\n    }\n});\n```\nThe `prototype` is an object of `column_name`: `column_properties` pairs.\n\n#### Column properties\nThere is a list of currently supported column properties:\n* `type`: Defines the type of values that the column accepts. Supported types are:\n    * `int`, `integer`, `number`\n    * `decimal`, `float`\n    * `string`\n    * `char`\n    * `bool`, `boolean`\n    * `array`\n* `default`: Sets the default value of column\n* `max_length`: Used by some type:\n    * When used with `float`, the number of decimals is reduced to his value\n    * When used with `string`, the number of characters is reduced to his value\n    (starting with the first character)\n* `auto_increment`: Defines if a column will be an auto incremented column. When used, the column is automatically set to UNIQUE KEY\n* `primary_key`: Defines if a column is a PRIMARY KEY\n* `unique_key`: Defines if a column is an UNIQUE KEY\n\n### Send a query\nJSONDB can send both direct and prepared queries.\n\n#### Direct queries\n```javascript\n// ---\n// Sync\n// ---\nvar results = db.query('my_query_string');\n\n//// Specially for select() and count() queries\n// You can change the fecth mode\nresults.setFetchMode(JSONDB.FETCH_ARRAY);\n// or...\nresults.setFetchMode(JSONDB.FETCH_CLASS, MyCustomClass);\n// Explore results using a while loop (sync)\nwhile (result = results.fetch()) {\n    // Do stuff with result...\n}\n// Explore results using recursion (async)\nresults.async.fetch(function(error, result, next) {\n    if (error) {\n        throw error;\n    }\n    // Stop the resursion when there is no data\n    if (result !== false) {\n        // Do stuff with result..\n        next(); // Important to call the same callback function with the next data    \n    }\n});\n\n// -----\n\n// ---\n// Async\n// ---\ndb.async.query('my_query_string', function(error, results) {\n    if (error) {\n        throw error;\n    }\n    //// Specially for select() and count() queries\n    // You can change the fecth mode\n    results.setFetchMode(JSONDB.FETCH_ARRAY);\n    // or...\n    results.setFetchMode(JSONDB.FETCH_CLASS, MyCustomClass);\n    // Explore results using a while loop (sync)\n    while (result = results.fetch()) {\n        // Do stuff with result...\n    }\n    // Explore results using recursion (async)\n    results.async.fetch(function(error, result, next) {\n        if (error) {\n            throw error;\n        }\n        // Stop the resursion when there is no data\n        if (result !== false) {\n            // Do stuff with result..\n            next(); // Important to call the same callback function with the next data    \n        }\n    });\n});\n```\n\n#### Prepared queries\n```javascript\n// ---\n// Sync\n// ---\nvar query = db.prepare('my_prepared_query');\nquery.bindValue(':key1', val1, JSONDB.PARAM_INT);\nquery.bindValue(':key2', val2, JSONDB.PARAM_STRING);\nquery.bindValue(':key3', val3, JSONDB.PARAM_BOOL);\nquery.bindValue(':key4', val4, JSONDB.PARAM_NULL);\nquery.bindValue(':key5', val5, JSONDB.PARAM_ARRAY);\n// Execute query synchronously...\nvar results = query.execute();\n// Execute query asynchronously...`\nquery.async.execute(function(error, results) {\n    if (error) {\n        throw error;\n    }\n    // Do stuff with results...\n});\n\n// -----\n\n// ---\n// Async\n// ---\njdb.async.prepare('my_prepared_query', function(error, query) {\n    if (error) {\n        throw error;\n    }\n    query.bindValue(':key1', val1, JSONDB.PARAM_INT);\n    query.bindValue(':key2', val2, JSONDB.PARAM_STRING);\n    query.bindValue(':key3', val3, JSONDB.PARAM_BOOL);\n    query.bindValue(':key4', val4, JSONDB.PARAM_NULL);\n    query.bindValue(':key5', val5, JSONDB.PARAM_ARRAY);\n    // Execute query synchronously...\n    var results = query.execute();\n    // Execute query asynchronously...`\n    query.async.execute(function(error, results) {\n        if (error) {\n            throw error;\n        }\n        // Do stuff with results...\n    });\n});\n```\n\n### JQL (JSONDB Query Language)\nThe JQL is the query language used in JSONDB. It's a very easy language based on _extensions_.\nA JQL query is in this form:\n```javascript\ndb.query('table_name.query(parameters,...).extension1().extension2()...');\n```\n\n#### Query Examples\n\n##### select()\nSelect all from table `users` where `username` = `id` and `password` = `pass` or where `mail` = `id` and `password` = `pass`\n```javascript\nvar id = JSONDB.quote(form_data.id);\nvar pass = JSONDB.quote(form_data.password);\ndb.query(\"users.select(*).where(username=\" + id + \",password=\" + pass + \").where(mail=\" + id + \",password=\" + pass + \")\");\n```\n\nSelect `username` and `mail` from table `users` where `activated` = `true`, order the results by `username` with `desc`endant method, limit the results to the `10` users after the `5`th.\n```javascript\ndb.query(\"users.select(username,mail).where(activated=true).order(username,desc).limit(5,10)\");\n```\n\n##### insert()\nInsert a new user in table `users`\n```javascript\nvar username = JSONDB.quote(form_data.username);\nvar pass = JSONDB.quote(form_data.password);\nvar mail = JSONDB.quote(form_data.mail);\ndb.query(\"users.insert(\" + username + \",\" + pass + \",\" + mail + \").in(username,password,mail)\");\n```\nMultiple insertion...\n```javascript\ndb.query(\"users.insert(\" + username1 + \",\" + pass1 + \",\" + mail1 + \").and(\" + username2 + \",\" + pass2 + \",\" + mail2 + \").and(\" + username3 + \",\" + pass3 + \",\" + mail3 + \").in(username,password,mail)\");\n```\n\n##### replace()\nReplace information of the first user\n```javascript\ndb.query(\"users.replace(\" + username + \",\" + pass + \",\" + mail + \").in(username,password,mail)\");\n```\nMultiple replacement...\n```javascript\ndb.query(\"users.replace(\" + username1 + \",\" + pass1 + \",\" + mail1 + \").and(\" + username2 + \",\" + pass2 + \",\" + mail2 + \").and(\" + username3 + \",\" + pass3 + \",\" + mail3 + \").in(username,password,mail)\");\n```\n\n##### delete()\nDelete all users\n```javascript\ndb.query(\"users.delete()\");\n```\nDelete all banished users\n```javascript\ndb.query(\"users.delete().where(banished = true)\");\n```\nDelete a specific user\n```javascript\ndb.query(\"users.delete().where(username = \" + username + \", mail = \" + mail + \")\");\n```\n\n##### update()\nActivate all users\n```javascript\ndb.query(\"users.update(activated).with(true)\");\n```\nUpdate my information ;-)\n```javascript\ndb.query(\"users.update(mail, password, activated, banished).with(\" + mail + \", \" + username + \", true, false).where(username = 'na2axl')\");\n```\n\n##### truncate()\nReset the table `users`\n```javascript\ndb.query(\"users.truncate()\");\n```\n\n##### count()\nCount all banished users\n```javascript\ndb.query(\"users.count(*).as(banished_nb).where(banished = true)\");\n```\nCount all users and group by `activated`\n```javascript\ndb.query(\"users.count(*).as(users_nb).group(activated)\");\n```\n\n#### Query functions\n\n##### sha1()\nReturns the sha1 of a text. **Exemple**: Update an old password by a new one:\n```javascript\nvar old_password = your_sha1_encrypt_function(form_data.old);\nvar new_password = form_data.new;\nvar query = db.prepare(\"users.insert(sha1(:new)).in(password).where(sha1(password) = :old)\");\nquery.bindValue(':new', new_password);\nquery.bindValue(':old', old_password);\nquery.execute();\n```\n\n##### md5()\nReturns the md5 of a text. **Exemple**:\n```javascript\nvar result = db.query(\"users.select(md5(username)).as(username_hash).where(username = 'na2axl')\");\n```\n\n##### time()\nReturns the timestamp.\n\n##### now()\nReturns the date of today in the form `year-month-day h:m:s`. You can change the form of the date by using identifiers as parameters:\n| Identifier | Value |\n|------------|-------|\n| %a | The day in 3 letters (Mon) |\n| %A | The full day (Monday) |\n| %d | The day of the month with a leading zero (06) |\n| %m | The month of the year with a leading zero (12) |\n| %e | The month of the wear without a leading zero |\n| %w | The day of the week without a leading zero |\n| %W | The day of the week with a leading zero |\n| %b | The month in 3 letters (Jan) |\n| %B | The full month (January) |\n| %y | The last two digits of the year (16) |\n| %Y | The full year (2016) |\n| %H | The hour with a leading 0 (09) |\n| %k | The hour without a leading 0 (9) |\n| %M | The minutes |\n| %S | The seconds |\n**Exemple**:\n```javascript\ndb.query(\"users.update(last_acitity).with(now('%d/%m/%Y %H:%M:%S').where(username = 'na2axl'))\");\n```\n\n##### lowercase()\nReturns the lower case version of a text.\n\n##### uppercase()\nReturns the upper case version of a text.\n\n##### ucfirst()\nUpper case the first letter and lower case all others in a text.\n\n##### strlen()\nReturns the number of characters in a text.\n\n#### Supported JQL operators\n\n* `a = b` : `a` equal to `b`\n* `a != b` : `a` different than `b`\n* `a \u003c\u003e b` : `a` different than `b`\n* `a \u003e= b` : `a` superior or equal to `b`\n* `a \u003c= b` : `a` inferior or equal to `b`\n* `a \u003c b` : `a` inferior to `b`\n* `a \u003e b` : `a` superior to `b`\n* `a %= b` : `a % b === 0`\n* `a %! b` : `a % b !== 0`\n\n\n## Full example\n### Sync version\n```javascript\nvar JSONDB = require(\"jsondb-js\");\n\nvar jdb = new JSONDB();\n\nif (!jdb.serverExists('test')) {\n    jdb.createServer('test', 'root', '');\n}\n\nvar db = jdb.connect('test', 'root', '');\n\nif (!db.databaseExists('test_database')) {\n    db.createDatabase('test_database');\n}\n\ndb.setDatabase('test_database');\n\nif (!db.tableExists('users')) {\n    db.createTable('users', { 'id': {'type': 'int', 'auto_increment': true, 'primary_key': true},\n                              'name': {'type': 'string', 'max_length': 30, 'not_null': true},\n                              'last_name': {'type': 'string', 'max_length': 30, 'not_null': true},\n                              'username': {'type': 'string', 'max_length': 15, 'unique_key': true},\n                              'mail': {'type': 'string', 'unique_key': true},\n                              'password': {'type': 'string', 'not_null': true},\n                              'website': {'type': 'string'},\n                              'activated': {'type': 'bool', 'default': false},\n                              'banished': {'type': 'bool', 'default': false} });\n}\n\n// A prepared query\nvar query = db.prepare(\"users.insert(:name, :sname, :username, :mail, sha1(:pass)).in(name, last_name, username, mail, password)\");\nquery.bindValue(':name', 'Nana', JSONDB.PARAM_STRING);\nquery.bindValue(':sname', 'Axel', JSONDB.PARAM_STRING);\nquery.bindValue(':username', 'na2axl', JSONDB.PARAM_STRING);\nquery.bindValue(':mail', 'ax.lnana@outlook.com', JSONDB.PARAM_STRING);\nquery.bindValue(':pass', '00%a_ComPLEx-PassWord%00', JSONDB.PARAM_STRING);\nquery.execute();\n\n// After some insertions...\n\n// Select all users\nvar results = db.query('users.select(id, name, last_name, username)');\n\n// Fetch with class mapping\nvar User = function () {};\nUser.prototype.id = 0;\nUser.prototype.name = '';\nUser.prototype.last_name = '';\nUser.prototype.username = '';\nUser.prototype.getInfo = function () {\n    return \"The user with ID: \" + this.id + \"has the name: \" + this.name + \" \" + this.last_name + \" and the username \" + this.username + \".\";\n};\n\nwhile (result = results.fetch(JSONDB.FETCH_CLASS, User)) {\n    console.log(result.getInfo());\n}\n```\n\n### Async version\n```javascript\nvar JSONDB = require(\"jsondb-js\");\n\nvar jdb = new JSONDB();\n\n// Class used for mapping\nvar User = function () {};\nUser.prototype.id = 0;\nUser.prototype.name = '';\nUser.prototype.last_name = '';\nUser.prototype.username = '';\nUser.prototype.getInfo = function () {\n    return \"The user with ID: \" + this.id + \" has the name: \" + this.name + \" \" + this.last_name + \" and the username \" + this.username + \".\";\n};\n\njdb.async.serverExists('test', function (exists) {\n    if (!exists) {\n        jdb.createServer('test', 'root', '');\n    }\n\n    jdb.async.connect('test', 'root', '', function (error, db) {\n        if (error) {\n            throw error;\n        }\n\n        db.async.databaseExists('test_database', function (exists) {\n            if (!exists) {\n                db.createDatabase('test_database');\n            }\n            db.setDatabase('test_database');\n\n            db.async.tableExists('users', function (exists) {\n                if (!exists) {\n                    db.createTable('users', { 'id': {'type': 'int', 'auto_increment': true, 'primary_key': true},\n                        'name': {'type': 'string', 'max_length': 30, 'not_null': true},\n                        'last_name': {'type': 'string', 'max_length': 30, 'not_null': true},\n                        'username': {'type': 'string', 'max_length': 15, 'unique_key': true},\n                        'mail': {'type': 'string', 'unique_key': true},\n                        'password': {'type': 'string', 'not_null': true},\n                        'website': {'type': 'string'},\n                        'activated': {'type': 'bool', 'default': false},\n                        'banished': {'type': 'bool', 'default': false} });\n                }\n\n                // A prepared query\n                db.async.prepare(\"users.insert(:name, :sname, :username, :mail, sha1(:pass)).in(name, last_name, username, mail, password)\", function (error, query) {\n                    if (error) {\n                        throw error;\n                    }\n                    query.bindValue(':name', 'Nana', JSONDB.PARAM_STRING);\n                    query.bindValue(':sname', 'Axel', JSONDB.PARAM_STRING);\n                    query.bindValue(':username', 'na2axl', JSONDB.PARAM_STRING);\n                    query.bindValue(':mail', 'ax.lnana@outlook.com', JSONDB.PARAM_STRING);\n                    query.bindValue(':pass', '00%a_ComPLEx-PassWord%00', JSONDB.PARAM_STRING);\n                    query.async.execute(function (error , result) {\n                        if (error) {\n                            throw error;\n                        }\n                        // Is an insert() query, so result is a boolean...\n\n                        // After some insertions...\n\n                        // Select all users\n                        db.async.query('users.select(id, name, last_name, username)', function (error, results) {\n                            if (error) {\n                                throw error;\n                            }\n                            // Is an select() query, so results is a QueryResult object...\n                            results.async.fetch(JSONDB.FETCH_CLASS, User, function (error, current, next) {\n                                if (error) {\n                                    throw error;\n                                }\n                                if (current !== false) {\n                                    console.log(current.getInfo());\n                                    next();\n                                }\n                            });\n                        });\n                    });\n                });\n            });\n        });\n    });\n});\n```\n\nAfter the execution of (one of) these scripts, the table **users** will be a .json file which will contain:\n```json\n{\n    \"prototype\": [\"#rowid\",\"id\",\"name\",\"last_name\",\"username\",\"mail\",\"password\",\"website\",\"activated\",\"banished\"],\n    \"properties\": {\n        \"last_insert_id\":1,\n        \"last_valid_row_id\":1,\n        \"last_link_id\":1,\n        \"primary_keys\":[\"id\"],\n        \"unique_keys\":[\"id\",\"username\",\"mail\"],\n        \"id\": {\n            \"type\":\"int\",\n            \"auto_increment\":true,\n            \"primary_key\":true,\n            \"unique_key\":true,\n            \"not_null\":true\n        },\n        \"name\": {\n            \"type\":\"string\",\n            \"max_length\":30,\n            \"not_null\":true\n        },\n        \"last_name\": {\n            \"type\":\"string\",\n            \"max_length\":30,\n            \"not_null\":true\n        },\n        \"username\": {\n            \"type\":\"string\",\n            \"max_length\":15,\n            \"unique_key\":true,\n            \"not_null\":true\n        },\n        \"mail\": {\n            \"type\":\"string\",\n            \"unique_key\":true,\n            \"not_null\":true\n        },\n        \"password\": {\n            \"type\":\"string\",\n            \"not_null\":true\n        },\n        \"website\": {\n            \"type\":\"string\"\n        },\n        \"activated\": {\n            \"type\":\"bool\",\n            \"default\":false\n        },\n        \"banished\": {\n            \"type\":\"bool\",\n            \"default\":false\n        }\n    },\n    \"data\": {\n        \"#1\": {\n            \"#rowid\":1,\n            \"id\":1,\n            \"name\":\"Nana\",\n            \"last_name\":\"Axel\",\n            \"username\":\"na2axl\",\n            \"mail\":\"ax.lnana@outlook.com\",\n            \"password\":\"589d3c90f3f75752673ab0ccb2690832f2e15610\",\n            \"website\":null,\n            \"activated\":false,\n            \"banished\":false\n        }\n    }\n}\n```\n\n## Contribution\nFound a bug? Have a feature request? Want to contribute to this project? Please, feel free to create\na [new issue](https://github.com/na2axl/jsondb-js/issues/new \"Open a new issue\") on GitHub, or fork this code, hack it,\nand make a pull request !\n\n## Authors\n* **Axel Nana**: \u003cax.lnana@outlook.com\u003e - [https://tutorialcenters.tk](https://tutorialcenters.tk \"Write your tutorial !\")\n\n## Contributors\nNo one... maybe you ! \n\n## Copyright\n(c) 2016 Centers Technologies. Licensed under GPL-3.0 ([read license](https://github.com/na2axl/jsondb-js/blob/master/LICENSE)).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fna2axl%2Fjsondb-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fna2axl%2Fjsondb-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fna2axl%2Fjsondb-js/lists"}