Skip to content

Latest commit

 

History

History

db

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

$mol_db

Static typed facade for IndexedDB with simple API.

Teaser

type User = {
	name: string
	admin: boolean
}

// Static typed schema
type DB = {
	User: {
		Key: [ string ]
		Doc: User
		Indexes: {
			Name: [ string ]
		}
	}
}

// Automatic migrations
const db = await $mol_db< DB >( '$my_app',
	mig => mig.store_make( 'User' ),
	mig => {
		const { User } = mig.stores
		User.index_make( 'Name', [ 'name' ] )
	},
)

// Writing transaction
const { User } = db.change( 'User' ).stores
await User.put({ name: 'Jin', admin: true })

// Reading transaction
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' ] ),
	// mig => mig.stores.Articles.index_drop( 'full' ),
	// mig => mig.store_drop( 'Articles' ),
)

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()
// or
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'