-
Notifications
You must be signed in to change notification settings - Fork 1
/
ldbx.min.js
7 lines (7 loc) · 7.43 KB
/
ldbx.min.js
1
2
3
4
5
6
7
/* LDBX Version 1.2.5
Author : ikhbalfuady@gmail.com
This some utilities script to help you manage localStorage data
the style syntax similary like laravel eloquent to help you easy to understod the query
avail to save, update, delete, get all & get single
*/
class DB{constructor(){if(this.key=null,"undefined"!=typeof Storage)return!0;return alert("Sorry! No Web Storage support.."),!1}valueFormater(e){return"true"===e||"false"!==e&&(isNaN(e)?e:Number(e))}getFormat(e){var t="str";return"number"==typeof e&&(t="num"),"object"==typeof e&&(t="obj"),"boolean "==typeof e&&(t="bol"),t}setter(e){var t=this.getFormat(e);return"obj"==t&&(e=JSON.stringify(e)),t+"|"+e}formater(e){if(!e)return console.warn(`Failed to extract data [${this.key}]`,e),null;let[t,s]=e.split("|");return"obj"===t?JSON.parse(s):"num"===t?parseFloat(s):"bol"===t?"true"===s:s}save(e,t){this.key=e,localStorage.setItem(e,this.setter(t))}get(e){this.key=e;var t=localStorage.getItem(e);return this.formater(t)}remove(e){return this.key=e,localStorage.removeItem(e)}}class LDBX{constructor(e=null,t=!0,s=!0){"object"==typeof e&&(e.table?this.tableName=e.table:this.console("Table name not defined, plese make object with name 'table' if you using object config params!"),e.softDelete&&(this.softDelete=e.softDelete),e.showLog&&(this.showLog=e.showLog)),this.tableName=e,this.showLog=t,this.softDelete=s,this.onlyData=s?"active":"all",this.whereCondition=[],this.orderCondition=[],this.belongsToRelation=[],this.hasManyRelation=[],this.DB=new DB}getFillableColumn(e){var t=[];for(k in e)t.push(k);return t}resetProps(){this.whereCondition=[],this.orderCondition=[],this.belongsToRelation=[],this.hasManyRelation=[],this.onlyData=this.softDelete?"active":"all"}UUID(e=""){var t,s=Math.random,a="";do a+=(t=s()).toString(16).substr(3,6);while(a.length<30);return a.substr(0,8)+e+a.substr(8,4)+e+"4"+a.substr(12,3)+e+((4*t|0)+8).toString(16)+a.substr(15,3)+e+a.substr(18,12)}console(e,t="info"){var s={info:{color:"#041b24",background:"#2ba6d6"},warning:{color:"#041b24",background:"#f5ab00"},success:{color:"#041b24",background:"#0fd644"},danger:{color:"#fff",background:"#f00702"}};let a=`color: ${s[t].color}background: ${s[t].background}font-size: 11pxpadding: 5px`;var r="%c[LDBX]⇒ "+e;this.showLog&&("info"===t?console.info(r,a):"warning"===t?console.warn(r,a):"danger"===t?console.error(r,a):console.debug(r,a))}dateNow(){let e=new Date,t=e.getFullYear(),s=`0${e.getMonth()+1}`.slice(-2),a=`0${e.getDate()}`.slice(-2),r=`0${e.getHours()}`.slice(-2),o=`0${e.getMinutes()}`.slice(-2);return`${t}-${s}-${a} ${r}:${o}`}hasData(){var e=this.DB.get(this.tableName);return e&&e.length?(this.console(`[hasData] ${this.tableName} : true`,"info"),!0):(this.console(`[hasData] ${this.tableName} : false`,"info"),!1)}fixStructure(e){var t=this.fetch(this.tableName)||[];let s=e.includes("id");s||e.push("id"),t=t.map(t=>{let s={};return e.forEach(e=>{s[e]=t[e]||null}),s}),this.DB.save(this.tableName,t),console.info(`Success updating structure [${this.tableName}]`,e,t)}fetch(e,t=[],s=""){let a=performance.now();var r=this.DB.get(e)||[],o=[];if(r&&(o=t.length?this.query(r,t):this.handleSoftDeleteData(r)),this.orderCondition.length)for(let i of this.orderCondition)o=i.dateFormat?this.sortByDateFormat(o,i.key,i.type):this.sortBy(o,i.key,i.type);let n=performance.now();return this.console(`${s} Query ${o.length} of '${e}' Execution time: ${n-a} ms`,"info"),o}sortBy(e,t,s="asc"){return e.sort((e,a)=>{let r="string"==typeof e[t]?e[t].toUpperCase():e[t],o="string"==typeof a[t]?a[t].toUpperCase():a[t];return r>o?"asc"===s?1:-1:r<o?"asc"===s?-1:1:0})}sortByDateFormat(e,t,s="asc"){return e.sort((e,a)=>{let r=new Date(e[t]),o=new Date(a[t]);return"asc"===s?r-o:o-r})}handleSoftDeleteObj(e){let t=!1;return this.softDelete&&("active"!==this.onlyData||e.deleted_at)?"trash"===this.onlyData&&e.deleted_at?t=!0:"all"===this.onlyData&&e.deleted_at&&(t=!0):t=!0,t}handleSoftDeleteData(e){var t=[];for(let s=0;s<e.length;s++)e[s]&&this.handleSoftDeleteObj(e[s])&&t.push(e[s]);return t}compareValues(e,t="asc"){return function(s,a){if(!s.hasOwnProperty(e)||!a.hasOwnProperty(e))return 0;let r="string"==typeof s[e]?s[e].toUpperCase():s[e],o="string"==typeof a[e]?a[e].toUpperCase():a[e];return r>o?"asc"===t?1:-1:r<o?"asc"===t?-1:1:0}}operator(e,t,s){var a=!1;return"="===e&&t===s&&(a=!0),">"===e&&t>s&&(a=!0),">="===e&&t>=s&&(a=!0),"<"===e&&t<s&&(a=!0),"<="===e&&t<=s&&(a=!0),"like"===e&&t.includes(s)&&(a=!0),"N"===e&&null===t&&(a=!0),"NN"===e&&null!==t&&(a=!0),Array.isArray(s)&&"IN"===e&&s.includes(t)&&(a=!0),Array.isArray(s)&&"NIN"===e&&!s.includes(t)&&(a=!0),a}query(e,t=[]){console.log("asd",this.tableName,this.onlyData);var s=t?t.length:0;if(0===s)return e;var a=[],r=0;for(let o of e){r+=1;var i=0;for(let n of t){var l=o[n.key],h=n.value?n.value:null;this.operator(n.operator,l,h)&&(i+=1)}i===s&&this.handleSoftDeleteObj(o)&&a.push(o)}return a}trashed(){return this.onlyData="trash",this}withTrashed(){return this.onlyData="all",this}orderBy(e,t="asc",s=!1){return this.orderCondition.push({key:e,type:t,dateFormat:s}),this}where(e,t,s){var a={key:e,operator:s?t:"=",value:s||t};return"n"===a.operator.toLowerCase()&&(a={key:e,operator:"N",value:null}),"nn"===a.operator.toLowerCase()&&(a={key:e,operator:"NN",value:null}),"in"===a.operator.toLowerCase()&&(a={key:e,operator:"IN",value:s}),"nin"===a.operator.toLowerCase()&&(a={key:e,operator:"NIN",value:s}),this.whereCondition.push(a),this}collectRelation(e){return e.map(e=>(this.belongsToRelation.length&&(e=this.getRelation(e,"belongsTo")),this.hasManyRelation.length&&(e=this.getRelation(e,"hasMany")),e))}getRelation(e,t="belongsTo"){return this[`${t}Relation`].map(s=>{let a=this.fetch(s.tableName,[{key:s.targetKey,operator:"=",value:e[s.foreignKey]}]);a&&a.length&&("belongsTo"===t&&(e[s.newObjectName]=a[0]),"hasMany"===t&&(e[s.newObjectName]=a))}),e}belongsTo(e,t,s,a="id"){return this.belongsToRelation.push({tableName:e,foreignKey:t,newObjectName:s,targetKey:a}),this}hasMany(e,t,s,a="id"){return this.hasManyRelation.push({tableName:e,foreignKey:t,newObjectName:s,targetKey:a}),this}get(){var e=this.fetch(this.tableName,this.whereCondition);return console.log("get",this.onlyData,e),e=this.collectRelation(e),this.resetProps(),e}first(){var e=this.fetch(this.tableName,this.whereCondition);return e=this.collectRelation(e),this.resetProps(),e.length?e[0]:null}find(e){return this.where("id",e).first()}save(e){let t=this.UUID(),s=this.dateNow(),a=this.dateNow();e.id&&(t=e.id);let r=this.DB.get(this.tableName),o=r?[...r,{...e,id:t,created_at:s,updated_at:a,deleted_at:null}]:[{...e,id:t,created_at:s,updated_at:a,deleted_at:null}];return this.DB.save(this.tableName,o),this.console(`Success saving [${this.tableName}]`,"success"),this.resetProps(),{...e,id:t}}update(e){e.updated_at=this.dateNow();var t=this.fetch(this.tableName,[]);let s=t.findIndex(t=>t.id===e.id);return s>=0?(t[s]=e,this.DB.save(this.tableName,t),this.console(`Succes updating [${this.tableName}]`,"success"),this.resetProps(),e):(this.console(`update:: index of id [${e.id}] not found in data "${this.tableName}" `,"danger"),!1)}truncate(){return this.DB.remove(this.tableName)}delete(e,t=!1){var s=this.fetch(this.tableName,[]);let a=s.findIndex(t=>t.id===e);if(!(a>=0))return this.console(`delete: index of id [${e}] not found in data "${this.tableName}" `,"danger"),!1;if(this.softDelete&&!1===t)s[a].deleted_at=this.dateNow(),this.DB.save(this.tableName,s);else{let r=s.slice(0,a).concat(s.slice(a+1));this.DB.save(this.tableName,r)}this.console(`Succes updating [${this.tableName}]`,"success")}}