$mol_db
Static typed facade for IndexedDB with simple API.
Teaser
type User = {
name: string
admin: boolean
}
type DB = {
User: {
Key: [ string ]
Doc: User
Indexes: {
Name: [ string ]
}
}
}
const db = await $mol_db< DB >( '$my_app',
mig => mig.store_make( 'User' ),
mig => {
const { User } = mig.stores
User.index_make( 'Name', [ 'name' ] )
},
)
const { User } = db.change( 'User' ).stores
await User.put({ name: 'Jin', admin: true })
const { Name } = db.read( 'User' ).User.indexes
const jins = await Name.select([ 'Jin' ])
IndexedDB Structure
- Database contains named Stores
-
- Store contains Documents by primary keys and named Indexes
-
-
- Document contains any data
-
-
- Index points to Documents
DB life Cycle
DB Schema Example
type ACME = {
Users: {
Key: number
Doc: {
name: {
first: string
last: string
}
age: number
}
Indexes: {
names: [ string, string ]
ages: [ number ]
}
}
Articles: {
Key: string
Doc: {
title: string
content: string
}
Indexes: {
full: [ string, string ]
}
}
}
Open DB without Migrations
const db = await $$.$mol_db< ACME >( 'ACME' )
Open DB with automatic migrations
const db = await $$.$mol_db< ACME >( 'ACME',
mig => mig.store_make( 'Users' ),
mig => mig.stores.Users.index_make( 'ages', [ 'age' ] ),
mig => mig.stores.Users.index_make( 'names', [ 'name.first', 'name.last' ], true ),
mig => mig.store_make( 'Articles' ),
mig => mig.stores.Articles.index_make( 'full', [ 'title', 'content' ] ),
)
There is 5 migrations. And DB version is 6. After uncommenting last 2 rows, it applies 2 additional migrations and DB version will be 8.
Close DB Connection
db.destructor()
Delete DB
db.kill()
Transaction Life Cycle
Read Only Transactions
const { Users, Articles } = db.read( 'Users', 'Articles' )
Read/Write Trasactions
const trans = db.change( 'Users', 'Articles' )
const { Users, Articles } = trans.stores
trans.abort()
await trans.commit()
Uncommitted transaction without errors will be committed automatically. Any modification error aborts transaction.
Documents Life Cycle
By Primary key
Insert with Auto Incremental Primary Key
const key = await Users.put({
first: 'Jin',
last: 'Nin',
age: 36,
})
Put/Overwrite by Primary Key
await Users.put( {
first: 'Jin',
last: 'Nin',
age: 37,
}, 1 )
Get One By Primary Key
const user = await Users.get( 1 )
Select 10 By Primary Keys
const users = await Users.get( $mol_dom_context.IDBKeyRange.bound( 10, 50 ), 10 )
Count By Primary Keys
const count = await Users.count( $mol_dom_context.IDBKeyRange.bound( 10, 50 ) )
By Index
const { names, ages } = users.indexes
Get One By Index
const user = await names.get([ 'Jin', 'Nin' ])
Select 10 By Index
const users = await ages.get( [ 18 ], 10 )
Count By Primary Keys
const count = await Users.count([ 18 ])
Usage from NPM
npm install mol_db
import { $mol_db } from 'mol_db'