/index-db-orm

a library for easy connection and work with client-side data base

Primary LanguageJavaScriptMIT LicenseMIT

index-db-orm

npm download download compress code coverage build status version product build develop build license

Promise based using indexDb for the browser.

Features

  • Supports the Promise API
  • Supports test mode
  • Simple syntax

Browser Support

Chrome Firefox Safari Opera Edge IE
Latest ✔ Latest ✔ Latest ✔ Latest ✔ Latest ✔ No

Installing

Using npm:

$ npm install index-db-orm

Using yarn:

$ yarn add index-db-orm

Example

DEMO EXAMPLE

note: CommonJS usage

const ormClass = require('index-db-orm').default;

build dataBase and stores

const ormClass = require('index-db-orm').default;

const orm = new ormClass();

orm.addDB({
        name: 'database1',
        stores: [
            {
                name: 'db1store1',
                indexes: [
                    {name: 'name', keyPath: 'name', option: {unique: false}},
                    {name: 'key', keyPath: 'key', option: {unique: true}},
                    {name: 'multiIndex', keyPath: ['name', 'key'], option: {unique: false}},
                ]
            },
            {
                name: 'db1store2',
                indexes: [
                    {name: 'name', keyPath: 'name', option: {unique: false}},
                ]
            },
        ]
    })
    .addDB({
        name: 'database2',
        stores: [
            {name: 'db2store1', indexes: []},
            {name: 'db2store2', keyPath: 'userId', indexes: []},
        ]
    })
    .build()
    .then(function (res) {
        console.log('on ready');
    })
    .catch(function (err) {
        console.error(err);
    });

    // Want to use async/await? Add the `async` keyword to your outer function/method.

    async function build() {
        try{
            const buildRes = orm
            .addDB({ ... })
            // .....
            .build()

             console.log('on ready');
        }catch(error){
            console.error(err);
        }
    }

NOTE: async/await is part of ECMAScript 2017 and is not supported in Internet Explorer and older browsers, so use with caution.

after build, can use crud operator.

Performing a Insert request

orm.insert('database1', 'db1store1', {
    'name': 'test name',
    'key': 'key 1',
    // add other key, value 
}).then(function (res) {
    console.log('on insert complete');
})
.catch(function (err) {
    console.error(err);
});

// Want to use directive mode
// orm.<db name>.<store name>.insert(data) <promise>

orm.database1.db1store1.insert({
    'name': 'test name',
    'key': 'key 1',
    // add other key, value 
}).then(function (res) {
    console.log('on insert complete');
})
.catch(function (err) {
    console.error(err);
});

Performing a Update request

orm.update('database1', 'db1store1', {
    '__pk': '<row key>',
    'name': 'test name',
    'key': 'key 1',
    // add other key, value 
}).then(function (res) {
    console.log('on update complete');
})
.catch(function (err) {
    console.error(err);
});

// Want to use directive mode
// orm.<db name>.<store name>.update(data) <promise>

orm.database1.db1store1.update({
    '__pk': '<row key>',
    'name': 'test name',
    'key': 'key 1',
    // add other key, value 
}).then(function (res) {
    console.log('on update complete');
})
.catch(function (err) {
    console.error(err);
});

Performing a Delete request

orm.delete('database1', 'db1store1', '<row key>')
.then(function (res) {
    console.log('on delete complete');
})
.catch(function (err) {
    console.error(err);
});

// Want to use directive mode
// orm.<db name>.<store name>.delete(pk) <promise>

orm.database1.db1store1.delete('<row key>')
.then(function (res) {
    console.log('on delete complete');
})
.catch(function (err) {
    console.error(err);
});

Performing a Find request

orm.find('database1', 'db1store1','<row key>')
.then(function (res) {
    console.log('on find row complete');
})
.catch(function (err) {
    console.error(err);
});

// Want to use directive mode
// orm.<db name>.<store name>.find(<row key>) <promise>

orm.database1.db1store1.find('<row key>')
.then(function (res) {
    console.log('on find row complete');
})
.catch(function (err) {
    console.error(err);
});

Performing a Select all request

orm.all('database1', 'db1store1')
.then(function (res) {
    console.log('on all select complete');
})
.catch(function (err) {
    console.error(err);
});

// Want to use directive mode
// orm.<db name>.<store name>.all() <promise>

orm.database1.db1store1.all()
.then(function (res) {
    console.log('on all select complete');
})
.catch(function (err) {
    console.error(err);
});

Performing a Select as paginate request

orm.paginate('database1', 'db1store1',1,10)
.then(function (res) {
    console.log('on paginate select complete');
})
.catch(function (err) {
    console.error(err);
});

// Want to use directive mode
// orm.<db name>.<store name>.paginate(<?page number>,<?limit row>) <promise>

orm.database1.db1store1.paginate(1,10)
.then(function (res) {
    console.log('on paginate select complete');
})
.catch(function (err) {
    console.error(err);
});

Performing a Where request

orm.where('database1', 'db1store1','name','=','test name').all()
.then(function (res) {
    console.log('on where complete select');
})
.catch(function (err) {
    console.error(err);
});

// Want to use directive mode
// orm.<db name>.<store name>.paginate(<?page number>,<?limit row>) <promise>

orm.database1.db1store1.where('name','=','test name').all()
.then(function (res) {
    console.log('on where complete select');
})
.catch(function (err) {
    console.error(err);
});

As can use more where request too

orm.where('database1', 'db1store1','name','=','test name')
    .where('database1', 'db1store1','key','=','key 1')
    .all()
    .then(function (res) {
        console.log('on where complete select');
    })
    .catch(function (err) {
        console.error(err);
    });

// Want to use directive mode
// orm.<db name>.<store name>.paginate(<?page number>,<?limit row>) <promise>

orm.database1.db1store1.where('name','=','test name')
    .where('database1', 'db1store1','key','=','key 1').all()
    .then(function (res) {
        console.log('on where complete select');
    })
    .catch(function (err) {
        console.error(err);
    });

ORM API

Use

For use orm, must be create a instance of class. instance of class as two mode product (default) , test. in test mode using of fake-indexeddb for test.

const ormClass = require('index-db-orm').default;

const orm = new ormClass('product'); // product mode
const orm = new ormClass('test'); // test mode

Build DataBase and Stores

After created instance, must be mapping of database and stores to instance.

orm
    .addDB({
        name: 'dbName', // {string} dbName
        stores: [
            {
                name: "storeName1", // {string} storeName
                indexes: [
                    {
                        name: 'indexName',  // {string} indexName 
                        keyPath: 'keyPath', // {string, array<string>} keyPath 
                        option: {
                            unique: false
                        } // {Object}  indexOption , default {unique: false}
                    },
                    // add more index
                ]
            },
            // add more store
        ],
        onRebuild: function(){

        }, // {function} onRebuild , event run when database need updated
    })
    // add more DB
    .build()
    .then((response)=>{
        console.log('build db complete!!!')
    })
    .catch((error)=>{
        console.error('build error')
    })

also you can use onRebuild as

orm.onRebuildDB("dataBaseName", function () {
  console.log("rebuild event )))))))))))))))))))))");
})

DataBase API

method name input output description
getAllDatabases promise <array> return all database list
getDataBase {string} name promise <object> return a database info by name
getDataBaseVersion {string} name promise <number> return a database version by name
removeAllDataBase promise <orm> remove all database
removeDataBase {string} name promise <orm> remvoe database by name
onRebuildDB {string} name , {function} event orm set event, active this event when database will updated

Store API

method name input output description
clearStore {string} dbName , {string} storeName promise <boolean> clear store by name
insert {string} dbName , {string} storeName , {object} data promise <object> insert data to store, promise <object> include __pk key
update {string} dbName , {string} storeName , {object} data promise <object> store update, data must include __pk key
delete {string} dbName , {string} storeName , {string,number} __pk promise <boolean> delete data from store
find {string} dbName , {string} storeName , {string,number,array} vlaue , ?{string} searchPk(=null) promise <boolean> find row in store by pk. searchPk must be include one of store indexes name
all {string} dbName , {string} storeName promise <array> return all row as array
paginate {string} dbName , {string} storeName , ?{number} page (= 1) , ?{number} total (= 20) promise <array> return row as paginate mode
count {string} dbName , {string} storeName , ?{object} query (= null) promise <numer> return count row
where {string} dbName , {string} storeName , {string} conditionIndex , {string} conditionOperator , {number, string, array} conditionValues object{build()} return all row by condition. conditionIndex must be include one of store indexes name. conditionOperator must include one of = , > , >= , <= , < , between , betweenInclude , like , %like , like% , %like% , match
where().all() {string} operation promise <array> operation include one of and , or
onInsert {string} dbName , {string} storeName , {function} event {string, number} eventKey set event, active this event when insert data to store
onUpdate {string} dbName , {string} storeName , {function} event {string, number} eventKey set event, active this event when update row of store
onDelete {string} dbName , {string} storeName , {function} event {string, number} eventKey set event, active this event when delete row from store
unbindInsert {string} dbName , {string} storeName , {string, number} keyEvent {object} orm remove onInsert event
unbindUpdate {string} dbName , {string} storeName , {string, number} keyEvent {object} orm remove onUpdate event
unbindDelete {string} dbName , {string} storeName , {string, number} keyEvent {object} orm remove onDelete event
unbindAllInsert {string} dbName , {string} storeName {object} orm remove onInsert all event
unbindAllUpdate {string} dbName , {string} storeName {object} orm remove onUpdate all event
unbindAllDelete {string} dbName , {string} storeName {object} orm remove onDelete all event

Direct Call Store API

directive Call method
orm.<dbName>.<storeName>.insert(data) orm.insert(dbName,storeName,data)
orm.<dbName>.<storeName>.update(data) orm.update(dbName,storeName,data)
orm.<dbName>.<storeName>.delete(__pk) orm.delete(dbName,storeName,__pk)
orm.<dbName>.<storeName>.find(value, searchPk) orm.find(dbName,storeName,value, searchPk)
orm.<dbName>.<storeName>.all() orm.all(dbName,storeName)
orm.<dbName>.<storeName>.count() orm.count(dbName,storeName)
orm.<dbName>.<storeName>.paginate(page, total) orm.paginate(dbName,storeName,page, total)
orm.<dbName>.<storeName>.orm.where(conditionIndex,conditionOperator,conditionValues) orm.where(dbName,storeName,conditionIndex,conditionOperator,conditionValues)
orm.<dbName>.<storeName>.orm.where..where...all(operation) orm.where()..where()...build(operation)
orm.<dbName>.<storeName>.onInsert(event) orm.onInsert(dbName,storeName,event)
orm.<dbName>.<storeName>.onUpdate(event) orm.onUpdate(dbName,storeName,event)
orm.<dbName>.<storeName>.onDelete(event) orm.onDelete(dbName,storeName,event)
orm.<dbName>.<storeName>.unbindInsert(keyEvent) orm.unbindInsert(dbName,storeName,keyEvent)
orm.<dbName>.<storeName>.unbindUpdate(keyEvent) orm.unbindUpdate(dbName,storeName,keyEvent)
orm.<dbName>.<storeName>.unbindDelete(keyEvent) orm.unbindDelete(dbName,storeName,keyEvent)
orm.<dbName>.<storeName>.unbindAllInsert() orm.unbindAllInsert(dbName,storeName)
orm.<dbName>.<storeName>.unbindAllUpdate() orm.unbindAllUpdate(dbName,storeName)
orm.<dbName>.<storeName>.unbindAllDelete() orm.unbindAllDelete(dbName,storeName)

Promises

index-db-orm depends on a native ES6 Promise implementation to be supported. If your environment doesn't support ES6 Promises, you can polyfill.

License

MIT