sqlite-worker
Advanced tools
Comparing version 0.4.11 to 0.5.0
@@ -1,1 +0,1 @@ | ||
self.sqliteWorker=function(e){"use strict";const t=new WeakMap,n=(e,...n)=>{const{t:o,v:s}=((e,t)=>{const n=[e[0]],o=[];for(let s=0,c=0,l=0,{length:a}=t;c<a;c++)t[c]instanceof r?n[s]+=t[c].v+e[c+1]:(o[l++]=c,n[++s]=e[c+1]);return{t:n,v:o}})(e,n),c=t.get(e)||t.set(e,{}).get(e);return(c[o]||(c[o]=[o])).concat(s.map((e=>n[e])))};function r(e){this.v=e}const o=(e,t)=>(r,...o)=>new Promise(((c,a)=>{r.some(l)&&a(s(new Error("SQLITE_ERROR: SQL injection hazard")));const[i,...u]=n(r,...o);e[t](i.join("?"),u,((e,t)=>{e?a(e):c(t)}))})),s=e=>(e.code="SQLITE_ERROR",e),c=(e,...t)=>new r(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(e,...t)),l=e=>e.includes("?");function a(e){return{all:o(e,"all"),get:o(e,"get"),query:o(e,"run"),raw:c}}const{assign:i}=Object,u="function"==typeof importScripts,d=u?".":(document.currentScript&&document.currentScript.src||new URL("tmp.js",document.baseURI).href).replace(/\/[^/]*$/,""),m=t=>new Promise(((n,r)=>{const o=()=>{const e=self.module.exports;delete self.exports,self.module=void 0,n(e)};if(self.exports={},self.module={exports:e},u)importScripts(t),o();else{const{head:e}=document;i(e.appendChild(document.createElement("script")),{onload(){e.removeChild(this),o()},onerror:r,src:t})}})),p="sqlite",f="buffer",h=(e,t=1)=>new Promise(((n,r)=>{i(indexedDB.open(e,t),{onupgradeneeded({target:{result:e,transaction:t}}){e.objectStoreNames.contains(p)||e.createObjectStore(p).createIndex(f,f,{unique:!0}),i(t,{oncomplete(){n(e)}})},onsuccess({target:{result:e}}){n(e)},onerror:r})}));function w({columns:e,values:t}){for(let{length:n}=t,r=0;r<n;r++){const n=t[r],o={};for(let{length:t}=e,r=0;r<t;r++)o[e[r]]=n[r];this.push(o)}}return(e={})=>new Promise(((t,n)=>{const r=e.dist||d;m(r+"/sql-wasm.js").then((({default:o})=>{Promise.all([h(e.name||"sqlite-worker"),o({locateFile:e=>r+"/"+e})]).then((([r,{Database:o}])=>{const s=e=>r.transaction([p],e).objectStore(p);i(s("readonly").get(f),{onsuccess(){let n=Promise.resolve();const{result:r}=this,c=new o(r||e.database||new Uint8Array(0)),l=()=>{n=n.then((()=>new Promise(((t,n)=>{const r=c.export();i(s("readwrite").put(r,f).transaction,{oncomplete(){t(),e.update&&e.update(r)},onabort:n,onerror:n})}))))};r||l();const{all:u,get:d,query:m,raw:p}=a({all(e,t,n){try{const r=c.exec(e,t),o=[];r.forEach(w,o),n(null,o)}catch(e){n(e)}},get(e,t,n){try{const r=c.exec(e+" LIMIT 1",t),o=[];r.forEach(w,o),n(null,o.shift()||null)}catch(e){n(e)}},run(e,t,n){try{n(null,c.run(e,t))}catch(e){n(e)}}});let h=0;t({all:u,get:d,raw:p,query(t){return/\b(?:INSERT|DELETE|UPDATE)\b/i.test(t[0])&&(clearTimeout(h),h=setTimeout(l,e.timeout||250)),m.apply(this,arguments)}})},onerror:n})}),n)}))}))}({}); | ||
self.sqliteWorker=function(e){"use strict";const t=new WeakMap,n=(e,...n)=>{const{t:r,v:s}=((e,t)=>{const n=[e[0]],r=[];for(let s=0,c=0,l=0,{length:a}=t;c<a;c++)t[c]instanceof o?n[s]+=t[c].v+e[c+1]:(r[l++]=c,n[++s]=e[c+1]);return{t:n,v:r}})(e,n),c=t.get(e)||t.set(e,{}).get(e);return(c[r]||(c[r]=[r])).concat(s.map((e=>n[e])))};function o(e){this.v=e}const r=(e,t)=>(o,...r)=>new Promise(((c,a)=>{o.some(l)&&a(s(new Error("SQLITE_ERROR: SQL injection hazard")));const[i,...u]=n(o,...r);e[t](i.join("?"),u,((e,t)=>{e?a(e):c(t)}))})),s=e=>(e.code="SQLITE_ERROR",e),c=(e,...t)=>new o(function(e){for(var t=e[0],n=1,o=arguments.length;n<o;n++)t+=arguments[n]+e[n];return t}(e,...t)),l=e=>e.includes("?");function a(e){return{all:r(e,"all"),get:r(e,"get"),query:r(e,"run"),raw:c}}const{assign:i}=Object,u="function"==typeof importScripts,d=t=>new Promise(((n,o)=>{const r=()=>{const e=self.module.exports;delete self.exports,self.module=void 0,n(e)};if(self.exports={},self.module={exports:e},u)importScripts(t),r();else{const{head:e}=document;i(e.appendChild(document.createElement("script")),{onload(){e.removeChild(this),r()},onerror:o,src:t})}})),m="sqlite",f="buffer",p=(e,t=1)=>new Promise(((n,o)=>{i(indexedDB.open(e,t),{onupgradeneeded({target:{result:e,transaction:t}}){e.objectStoreNames.contains(m)||e.createObjectStore(m).createIndex(f,f,{unique:!0}),i(t,{oncomplete(){n(e)}})},onsuccess({target:{result:e}}){n(e)},onerror:o})}));function h({columns:e,values:t}){for(let{length:n}=t,o=0;o<n;o++){const n=t[o],r={};for(let{length:t}=e,o=0;o<t;o++)r[e[o]]=n[o];this.push(r)}}return(e={})=>new Promise(((t,n)=>{const o=e.dist||".";d(o+"/sql-wasm.js").then((({default:r})=>{Promise.all([p(e.name||"sqlite-worker"),r({locateFile:e=>o+"/"+e})]).then((([o,{Database:r}])=>{const s=e=>o.transaction([m],e).objectStore(m);i(s("readonly").get(f),{onsuccess(){let n=Promise.resolve();const{result:o}=this,c=new r(o||e.database||new Uint8Array(0)),l=()=>{n=n.then((()=>new Promise(((t,n)=>{const o=c.export();i(s("readwrite").put(o,f).transaction,{oncomplete(){t(),e.update&&e.update(o)},onabort:n,onerror:n})}))))};o||l();const{all:u,get:d,query:m,raw:p}=a({all(e,t,n){try{const o=c.exec(e,t),r=[];o.forEach(h,r),n(null,r)}catch(e){n(e)}},get(e,t,n){try{const o=c.exec(e+" LIMIT 1",t),r=[];o.forEach(h,r),n(null,r.shift()||null)}catch(e){n(e)}},run(e,t,n){try{n(null,c.run(e,t))}catch(e){n(e)}}});let g=0;t({all:u,get:d,raw:p,query(t){return/\b(?:INSERT|DELETE|UPDATE)\b/i.test(t[0])&&(clearTimeout(g),g=setTimeout(l,e.timeout||250)),m.apply(this,arguments)}})},onerror:n})}),n)}))}))}({}); |
{ | ||
"name": "sqlite-worker", | ||
"version": "0.4.11", | ||
"version": "0.5.0", | ||
"description": "A simple, and persistent, SQLite database for Web and Workers", | ||
"main": "./cjs/index.js", | ||
"scripts": { | ||
"build": "npm run import && npm run cjs && npm run rollup:es && npm run rollup:init && npm run rollup:sw && npm run rollup:worker", | ||
"build": "npm run import && npm run cjs && npm run rollup:es && npm run rollup:init && npm run rollup:sw && npm run rollup:sw-tables && npm run rollup:tables && npm run rollup:worker", | ||
"import": "cp node_modules/sql.js/dist/sql-wasm.{js,wasm} dist/", | ||
@@ -13,3 +13,5 @@ "cjs": "ascjs --no-default esm cjs && npm run cjs:fix", | ||
"rollup:init": "rollup --config rollup/init.config.js && sed -i 's/const dist = .*/const dist = \".\";/' dist/tmp.js && terser dist/tmp.js --module -c -m -o dist/init.js && rm dist/tmp.js", | ||
"rollup:sw": "rollup --config rollup/sw.config.js && sed -i 's/exports.init =/return/; s/var sqliteWorker =/self.sqliteWorker =/' dist/tmp.js && terser dist/tmp.js -c -m -o dist/sw.js && rm dist/tmp.js", | ||
"rollup:sw": "rollup --config rollup/sw.config.js && sed -i 's/const dist = .*/const dist = \".\";/; s/exports.init =/return/; s/var sqliteWorker =/self.sqliteWorker =/' dist/tmp.js && terser dist/tmp.js -c -m -o dist/sw.js && rm dist/tmp.js", | ||
"rollup:sw-tables": "rollup --config rollup/sw-tables.config.js && sed -i 's/const dist = .*/const dist = \".\";/; s/exports.init =/return/; s/var sqliteWorker =/self.sqliteWorker =/' dist/tmp.js && terser dist/tmp.js -c -m -o dist/sw-tables.js && rm dist/tmp.js", | ||
"rollup:tables": "rollup --config rollup/tables.config.js", | ||
"rollup:worker": "rollup --config rollup/worker.config.js && sed -i 's/const dist = .*//' dist/tmp.js && terser dist/tmp.js -c -m -o dist/worker.js && rm dist/tmp.js" | ||
@@ -56,2 +58,10 @@ }, | ||
}, | ||
"./sw-tables": { | ||
"import": "./dist/sw-tables.js", | ||
"default": "./dist/sw-tables.js" | ||
}, | ||
"./tables": { | ||
"import": "./dist/tables.js", | ||
"default": "./dist/tables.js" | ||
}, | ||
"./worker": { | ||
@@ -73,4 +83,5 @@ "import": "./esm/worker.js", | ||
"dependencies": { | ||
"sqlite-tables-handler": "^0.2.0", | ||
"sqlite-tag": "^1.1.0" | ||
} | ||
} |
@@ -80,6 +80,6 @@ # sqlite-worker | ||
// will add a `sqliteWorker` "global" initiator | ||
importScripts('../../dist/sw.js'); | ||
importScripts('./dist/sw.js'); | ||
/* ⚠ IMPORTANT ⚠ */ | ||
const dist = '../../dist/'; | ||
const dist = './dist/'; | ||
@@ -155,2 +155,53 @@ sqliteWorker({dist, name: 'my-db'}) | ||
### Extra Initialization Helpers | ||
The `sqlite-worker/tables` export helps defining, or modifying, tables at runtime, without needing to write complex logic, or queries. | ||
All it's needed, is a `tables` property that describe the table name and its fields, handled via [sqlite-tables-handler](https://github.com/WebReflection/sqlite-tables-handler#readme), before returning all module helpers. | ||
```js | ||
import {init, SQLiteWorker} from 'sqlite-worker/tables'; | ||
init({ | ||
name: 'test-db', | ||
// the tables schema | ||
tables: { | ||
todos: { | ||
id: 'INTEGER PRIMARY KEY', | ||
value: 'TEXT' | ||
} | ||
} | ||
}).then(async ({all, get, query, raw}) => { | ||
const {total} = await get`SELECT COUNT(id) as total FROM todos`; | ||
if (total < 1) { | ||
console.log('Inserting some value'); | ||
await query`INSERT INTO todos (value) VALUES (${'a'})`; | ||
await query`INSERT INTO todos (value) VALUES (${'b'})`; | ||
await query`INSERT INTO todos (value) VALUES (${'c'})`; | ||
} | ||
console.table(await all`SELECT * FROM todos`); | ||
}); | ||
``` | ||
For *Service Worker* one must use the `dist/sw-tables.js` file instead of `dist/sw.js`. | ||
```js | ||
importScripts('./dist/sw-tables.js'); | ||
sqliteWorker({ | ||
dist: './dist', | ||
name: 'my-db', | ||
tables: { | ||
todos: { | ||
id: 'INTEGER PRIMARY KEY', | ||
value: 'TEXT' | ||
} | ||
} | ||
}) | ||
.then(async ({all, get, query}) => { | ||
// ... | ||
}); | ||
``` | ||
## Compatibility | ||
@@ -157,0 +208,0 @@ |
1237972
30
831
214
2
+ Addedsqlite-tables-handler@^0.2.0
+ Addedsqlite-tables-handler@0.2.0(transitive)