@3fv/dexie-orm

A sort-of ORM for Dexie

Usage no npm install needed!

<script type="module">
  import 3fvDexieOrm from 'https://cdn.skypack.dev/@3fv/dexie-orm';
</script>

README

Dexie ORM/Database Builder

Overview

Dexie Database Builder is a tool for quickly creating dexie database instances with class based schema's

It takes dexie, and applies a builder pattern to simplify configuration (sans upgrade at the moment, but that's fairly straightforward given the existing dexie support & the implementation of DexieDatabaseBuilder).

Examples

Node Node with single & tuple key example is available

React React example is available

import assert from "assert"
import dexieDatabaseBuilder from "@3fv/dexie-orm"

export class ExampleObject {
  id: string

  constructor(o: Partial<ExampleObject> = {}) {
    Object.assign(this, o)
  }
}


/**
 * Returns a promise with the value type
 * as follows:
 * 
 * Dexie & {
 *  objects: Dexie.Table<ExampleObject, "id">
 * }
 */ 
export async function createExampleDatabase() { 
  const db = await dexieDatabaseBuilder("example", 1)
    .table("objects", ExampleObject, "id" as const, "&id")
    .open()
  
  return db
}

/**
 * Add & read an `ExampleObject`
 */ 
export async function run() {
  const db = await createExampleDatabase() 
  
  // OBJECTS TABLE
  const objectsTable = db.objects
  
  // ADD
  const obj1 = new ExampleObject({
    id: "example-01"
  })

  const obj1Id = await objectsTable.add(obj1)
  const obj1Read = await objectsTable.get(obj1Id)
  assert(obj1Read instanceof ExampleObject, "not instance of ExampleObject")
  assert(obj1Read?.id === obj1?.id, "id's do not match")
  assert.deepEqual(obj1, obj1Read, "doesn't match deeply")

}

run().catch(err => {
  console.error("failed", err)
})

Notes

It's a properly configured hybrid module, so both commonjs & module/esm runtimes are fully supported & the resulting library will support tree shaking as long as side-effects are not created.

Which means, it'll work in the browser, with webpack or without, in node, with webpack or without (you will need a polyfill for indexeddb) AND will only include the base minimum in additional resources, because its modular implementation fully supports tree-shaking (I know I repeated myself).

Credit

Written with love in #NYC by @jglanz 3FV. Enjoy