4.0.4 • Published 21 days ago

dexie v4.0.4

Weekly downloads
81,311
License
Apache-2.0
Repository
github
Last release
21 days ago

Dexie.js

NPM Version Build Status

Dexie.js is a wrapper library for indexedDB - the standard database in the browser. https://dexie.org

Why?

Dexie solves three main issues with the native IndexedDB API:

  1. Ambiguous error handling
  2. Poor queries
  3. Code complexity

Dexie provides a neat database API with a well thought-through API design, robust error handling, extendability, change tracking awareness and extended KeyRange support (case insensitive search, set matches and OR operations).

Hello World

<!doctype html>
<html>
 <head>
  <script src="https://unpkg.com/dexie@latest/dist/dexie.js"></script>
  <script>
   //
   // Declare Database
   //
   var db = new Dexie("FriendDatabase");
   db.version(1).stores({
     friends: "++id,name,age"
   });

   //
   // Manipulate and Query Database
   //
   db.friends.add({name: "Josephine", age: 21}).then(function() {
       return db.friends.where("age").below(25).toArray();
   }).then(function (youngFriends) {
       alert ("My young friends: " + JSON.stringify(youngFriends));
   }).catch(function (e) {
       alert ("Error: " + (e.stack || e));
   });
  </script>
 </head>
</html>

Yes, it's that simple.

An equivalent modern version (works in all modern browsers):

<!doctype html>
<html>
 <head>
  <script type="module">
   import Dexie from "https://unpkg.com/dexie@latest/dist/modern/dexie.mjs";
   //
   // Declare Database
   //
   const db = new Dexie("FriendDatabase");
   db.version(1).stores({
     friends: "++id,name,age"
   });

   //
   // Manipulate and Query Database
   //
   try {
     await db.friends.add({name: "Josephine", age: 21});
     const youngFriends = await db.friends.where("age").below(25).toArray();
     alert (`My young friends: ${JSON.stringify(youngFriends)}`);
   } catch (e) {
     alert (`Error: ${e}`);
   }
  </script>
 </head>
</html>

Tutorial

API Reference

Samples

Performance

Dexie has kick-ass performance. Its bulk methods take advantage of a lesser-known feature in IndexedDB that makes it possible to store stuff without listening to every onsuccess event. This speeds up the performance to a maximum.

Supported operations

above(key): Collection;
aboveOrEqual(key): Collection;
add(item, key?): Promise;
and(filter: (x) => boolean): Collection;
anyOf(keys[]): Collection;
anyOfIgnoreCase(keys: string[]): Collection;
below(key): Collection;
belowOrEqual(key): Collection;
between(lower, upper, includeLower?, includeUpper?): Collection;
bulkAdd(items: Array): Promise;
bulkDelete(keys: Array): Promise;
bulkPut(items: Array): Promise;
clear(): Promise;
count(): Promise;
delete(key): Promise;
distinct(): Collection;
each(callback: (obj) => any): Promise;
eachKey(callback: (key) => any): Promise;
eachPrimaryKey(callback: (key) => any): Promise;
eachUniqueKey(callback: (key) => any): Promise;
equals(key): Collection;
equalsIgnoreCase(key): Collection;
filter(fn: (obj) => boolean): Collection;
first(): Promise;
get(key): Promise;
inAnyRange(ranges): Collection;
keys(): Promise;
last(): Promise;
limit(n: number): Collection;
modify(changeCallback: (obj: T, ctx:{value: T}) => void): Promise;
modify(changes: { [keyPath: string]: any } ): Promise;
noneOf(keys: Array): Collection;
notEqual(key): Collection;
offset(n: number): Collection;
or(indexOrPrimayKey: string): WhereClause;
orderBy(index: string): Collection;
primaryKeys(): Promise;
put(item: T, key?: Key): Promise;
reverse(): Collection;
sortBy(keyPath: string): Promise;
startsWith(key: string): Collection;
startsWithAnyOf(prefixes: string[]): Collection;
startsWithAnyOfIgnoreCase(prefixes: string[]): Collection;
startsWithIgnoreCase(key: string): Collection;
toArray(): Promise;
toCollection(): Collection;
uniqueKeys(): Promise;
until(filter: (value) => boolean, includeStopEntry?: boolean): Collection;
update(key: Key, changes: { [keyPath: string]: any }): Promise;

This is a mix of methods from WhereClause, Table and Collection. Dive into the API reference to see the details.

Hello World (Typescript)

import Dexie, { Table } from 'dexie';

interface Friend {
    id?: number;
    name?: string;
    age?: number;
}

//
// Declare Database
//
class FriendDatabase extends Dexie {
    public friends!: Table<Friend, number>; // id is number in this case

    public constructor() {
        super("FriendDatabase");
        this.version(1).stores({
            friends: "++id,name,age"
        });
    }
}

const db = new FriendDatabase();

db.transaction('rw', db.friends, async() => {

    // Make sure we have something in DB:
    if ((await db.friends.where({name: 'Josephine'}).count()) === 0) {
        const id = await db.friends.add({name: "Josephine", age: 21});
        alert (`Addded friend with id ${id}`);
    }

    // Query:
    const youngFriends = await db.friends.where("age").below(25).toArray();

    // Show result:
    alert ("My young friends: " + JSON.stringify(youngFriends));

}).catch(e => {
    alert(e.stack || e);
});

Samples

https://dexie.org/docs/Samples

https://github.com/dexie/Dexie.js/tree/master/samples

Knowledge Base

https://dexie.org/docs/Questions-and-Answers

Website

https://dexie.org

Install over npm

npm install dexie

Download

For those who don't like package managers, here's the download links:

Legacy:

https://unpkg.com/dexie@latest/dist/dexie.min.js

https://unpkg.com/dexie@latest/dist/dexie.min.js.map

Modern:

https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs

https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs.map

Typings:

https://unpkg.com/dexie@latest/dist/dexie.d.ts

Contributing

See CONTRIBUTING.md

Build

pnpm install
pnpm run build

Test

pnpm test

Watch

pnpm run watch

Browser testing via LAMDBATEST

@web-client/plugin-component-vue@ben-ryder/lfb-toolkit@mdn/yari@arcaela/arcaela-jsrclinktestsmt-trend@zentek/zenfieldflintlia-script@voodux/voodux@tuist/preferences@pawi/preferences@liuli-moe/web-logger-storage-indexeddb@gui-one/commonng-ezbitsvelte-petit-libsconsole-core-portal-corehimaindus-trend@shubhamy/blendedhamaren_test_packagehamaren_test_parcelref-uieoapi-corekderno-editorpwa-startercra-template-pwa-starterskill-f3@infinitebrahmanuniverse/nolb-dex@datagrok/molecular-liability-browser@gratico/fsco-cc-componentss-formbuilderngx-albeom-librxdbopenfin-notificationskkxxx@everything-registry/sub-chunk-1474obsidian-clever-searchweb_log_pluginbuzzmsg-test@owlprotocol/crud-redux@owlprotocol/web3-reduxinyad-design-system-kwerbas-connectorwed-demowincardwho-is-hiring-dashboardhc-gis-sdk4hc-gis-sdk5huayuan-antd-repackwire-webapp-cryptoboxwordpress-api-wcjuepeiscm-antd-repackjusic-uijupyter-offlinenotebookxd_websocketibz-dynamic-coreibiz-coreibiz-femonitor-webicones-pluginideosidb-pull-blob-storeideanuxtha-store-browserhike-apphiddentreasures-jsispiredb.jswebapp-appswebapp-basejennifer5-frontendhorus-eyeshpen-jsonapiwrappex-localyz-zftzixian-vueluleiyu-agora-chatlyx-wincardlarge-file-uploaderzap-desktopyz-automalogs-rest-logging-common-library@graasp/apps-query-clientloggerdb@graphcentral/graph@hamaren01/test_skeleton@hanzo/chatmadison-data-store@gui-one/function-miniapp@gui-one/function@gui-one/function-h5@hako1912/use-indexeddb@gooddollar/web3sdk-v2mapsetting-ts@heat/svelte-graphqlmaplestory@grappa-xyz/grappa-sdk@grappa-xyz/sdk-js@grappa-xyz/sdk-nodegoals-storage-indexeddb
4.0.4

21 days ago

4.0.3

21 days ago

4.0.2

22 days ago

4.0.1

1 month ago

4.0.1-rc.1

1 month ago

3.2.7

1 month ago

4.0.1-beta.12

2 months ago

4.0.1-beta.14

2 months ago

4.0.1-beta.13

2 months ago

4.0.1-beta.11

3 months ago

3.2.6

3 months ago

4.0.1-beta.10

3 months ago

3.2.5

3 months ago

4.0.1-beta.9

3 months ago

4.0.1-beta.8

3 months ago

4.0.1-beta.7

3 months ago

4.0.1-beta.6

5 months ago

4.0.1-beta.5

5 months ago

4.0.1-alpha.25

10 months ago

4.0.1-alpha.26

7 months ago

4.0.1-alpha.27

7 months ago

4.0.1-beta.4

5 months ago

4.0.1-beta.2

5 months ago

4.0.1-beta.3

5 months ago

4.0.1-beta.1

7 months ago

4.0.1-alpha.24

10 months ago

4.0.1-alpha.23

10 months ago

4.0.1-alpha.20

11 months ago

4.0.1-alpha.21

11 months ago

4.0.1-alpha.22

11 months ago

3.2.4

11 months ago

4.0.1-alpha.13

11 months ago

4.0.1-alpha.14

11 months ago

4.0.1-alpha.11

11 months ago

4.0.1-alpha.12

11 months ago

4.0.1-alpha.17

11 months ago

4.0.1-alpha.18

11 months ago

4.0.1-alpha.15

11 months ago

4.0.1-alpha.16

11 months ago

4.0.1-alpha.19

11 months ago

3.2.4-beta.1

11 months ago

4.0.1-alpha.10

1 year ago

4.0.1-alpha.8

1 year ago

3.2.3

1 year ago

4.0.1-alpha.6

1 year ago

4.0.1-alpha.7

1 year ago

4.0.0-alpha.4

2 years ago

4.0.0-alpha.3

2 years ago

3.2.2

2 years ago

3.0.4

2 years ago

4.0.0-alpha.2

2 years ago

4.0.0-alpha.1

2 years ago

3.2.1

2 years ago

3.2.1-beta.2

2 years ago

3.2.0

2 years ago

3.2.1-beta.1

2 years ago

3.2.0-rc.3

3 years ago

3.2.0-rc.2

3 years ago

3.2.0-rc.1

3 years ago

3.2.0-beta.3

3 years ago

3.2.0-beta-2

3 years ago

3.2.0-beta.1

3 years ago

3.1.0-beta.13

3 years ago

3.1.0-beta.12

3 years ago

3.1.0-beta.11

3 years ago

3.1.0-alpha.10

3 years ago

3.1.0-alpha.9

3 years ago

3.1.0-alpha.8

3 years ago

3.1.0-alpha.7

3 years ago

3.1.0-alpha.6

3 years ago

3.1.0-alpha.5

3 years ago

3.1.0-alpha.4

3 years ago

3.1.0-alpha.1

3 years ago

3.1.0-alpha.3

3 years ago

3.0.3

3 years ago

3.0.3-rc.4

4 years ago

3.0.3-rc.3

4 years ago

3.0.3-rc.2

4 years ago

3.0.3-rc.1

4 years ago

3.0.2

4 years ago

3.0.1

4 years ago

3.0.0

4 years ago

3.0.0-rc.7

4 years ago

3.0.0-rc.6

4 years ago

3.0.0-rc.5

4 years ago

3.0.0-rc.4

4 years ago

3.0.0-rc.3

4 years ago

3.0.0-rc.2

4 years ago

3.0.0-rc.1

5 years ago

3.0.0-beta.1

5 years ago

3.0.0-alpha.8

5 years ago

3.0.0-alpha.7

5 years ago

3.0.0-alpha.6

5 years ago

3.0.0-alpha.5

6 years ago

3.0.0-alpha.4

6 years ago

3.0.0-alpha.3

6 years ago

2.0.4

6 years ago

2.0.3

6 years ago

3.0.0-alpha.2

6 years ago

2.0.2

6 years ago

3.0.0-alpha.1

6 years ago

2.0.1

7 years ago

2.0.0

7 years ago

2.0.0-rc.1

7 years ago

2.0.0-beta.11

7 years ago

2.0.0-beta.10

7 years ago

2.0.0-beta.9

7 years ago

2.0.0-beta.8

7 years ago

2.0.0-beta.7

7 years ago

2.0.0-beta.6

7 years ago

2.0.0-beta.5

7 years ago

2.0.0-beta.4

8 years ago

1.5.1

8 years ago

2.0.0-beta.3

8 years ago

1.5.0

8 years ago

1.5.0-rc.6

8 years ago

1.5.0-rc.5

8 years ago

1.5.0-rc.4

8 years ago

1.5.0-rc.3

8 years ago

1.5.0-rc.2

8 years ago

2.0.0-beta.2

8 years ago

2.0.0-beta.1

8 years ago

1.5.0-rc

8 years ago

1.4.3-rc

8 years ago

1.4.2

8 years ago

1.4.1

8 years ago

1.4.0

8 years ago

1.4.0-rc.1

8 years ago

1.4.0-beta.3

8 years ago

1.4.0-beta2

8 years ago

1.4.0-beta

8 years ago

1.3.6

8 years ago

1.3.6-rc.1

8 years ago

1.3.6-beta.3

8 years ago

1.3.6-beta.2

8 years ago

1.3.6-beta.1

8 years ago

1.3.5-beta.2

8 years ago

1.3.5-beta

8 years ago

1.3.4

8 years ago

1.3.4-beta2

8 years ago

1.3.4-beta

8 years ago

1.3.3

8 years ago

1.3.2

8 years ago

1.3.1

8 years ago

1.3.0

8 years ago

1.2.0

9 years ago

1.1.0

9 years ago

1.0.4

9 years ago

1.0.3

9 years ago

1.0.2

9 years ago

1.0.1

9 years ago

1.0.0

9 years ago

0.9.9

10 years ago