A Kotlin coroutines wrapper for IndexedDB.

Overview

badge Slack

Kotlin IndexedDB

A wrapper around IndexedDB which allows for access from Kotlin/JS code using suspend blocks and linear, non-callback based control flow.

Usage

The samples for usage here loosely follows several examples in Using IndexedDB.

As such, we'll define our example data type to match:

external interface Customer {
    var ssn: String
    var name: String
    var age: Int
    var email: String
}

Creation & Migration

Creating a Database and handling migrations are done together with the openDatabase function. The database name and desired version are passed in as arguments. If the desired version and the current version match, then the callback is not called. Otherwise, the callback is called in a VersionChangeTransaction scope. Generally, a chain of if blocks checking the oldVersion are sufficient for handling migrations, including migration from version 0 to 1:

val database = openDatabase("your-database-name", 1) { database, oldVersion, newVersion ->
    if (oldVersion < 1) {
        val store = database.createObjectStore("customers", KeyPath("ssn"))
        store.createIndex("name", KeyPath("name"), unique = false)
        store.createIndex("age", KeyPath("age"), unique = false)
        store.createIndex("email", KeyPath("email"), unique = true)
    }
}

Transactions, such as the lambda block of openData, are handled as suspend functions but with an important constraint: you must not call any suspend functions except for those provided by this library and scoped on Transaction (and its subclasses), and flow operations on the flow returned by Transaction.openCursor. Of course, it is also okay to call suspend functions which only suspend by calling other legal functions.

This constraint is forced by the design of IndexedDB auto-committing transactions when it detects no remaining callbacks, and failure to adhere to this can cause TransactionInactiveError to be thrown.

Writing Data

To add data to the Database created above, open a WriteTransaction, and then open the ObjectStore. Use WriteTransaction.add to guarantee insert-only behavior, and use WriteTransaction.put for insert-or-update.

Note that transactions must explicitly request every ObjectStore they reference at time of opening the transaction, even if the store is only used conditionally. Multiple WriteTransaction which share referenced ObjectStore will not be executed concurrently.

database.writeTransaction("customers") {
    val store = objectStore("customers")
    store.add(jsObject<Customer> { ssn = "333-33-3333"; name = "Alice"; age = 33; email = "[email protected]" })
    store.add(jsObject<Customer> { ssn = "444-44-4444"; name = "Bill"; age = 35; email = "[email protected]" })
    store.add(jsObject<Customer> { ssn = "555-55-5555"; name = "Charlie"; age = 29; email = "[email protected]" })
    store.add(jsObject<Customer> { ssn = "666-66-6666"; name = "Donna"; age = 31; email = "[email protected]" })
}

Reading Data

To read data, open a Transaction, and then open the ObjectStore. Use Transaction.get and Transaction.getAll to retrieve single items and retrieve bulk items, respectively.

As above, all object stores potentially used must be specified in advance. Unlike WriteTransaction, multiple read-only Transaction which share an ObjectStore can operate concurrently, but they still cannot operate concurrently with a WriteTransaction sharing that store.

val bill = database.transaction("customers") {
    objectStore("customers").get(Key("444-44-4444")) as Customer
}
assertEquals("Bill", bill.name)

Key Ranges and Indices

With an ObjectStore you can query on a previously created Index instead of the primary key. This is especially useful in combination with key ranges, and together more powerful queries can be constructed.

Three standard key ranges exist: lowerBound, upperBound, and bound (which combines the two). Warning: key range behavior on an array-typed index can have potentially unexpected behavior. As an example, the key [3, 0] is included in bound(arrayOf(2, 2), arrayOf(4, 4)).

val donna = database.transaction("customers") {
    objectStore("customers").index("age").get(bound(30, 32)) as Customer
}
assertEquals("Donna", donna.name)

Cursors

Cursors are excellent for optimizing complex queries. With either ObjectStore or Index, call Transaction.openCursor to return a Flow of CursorWithValue which emits once per row matching the query. The returned flow is cold and properly handles early collection termination. To get the value of the row currently pointed at by the cursor, call CursorWithValue.value.

As an example we can find the first customer alphabetically with an age under 32:

val charlie = database.transaction("customers") {
    objectStore("customers")
        .index("name")
        .openCursor()
        .map { it.value as Customer }
        .first { it.age < 32 }
}
assertEquals("Charlie", charlie.name)

Cursors can also be used to update or delete the value at the current index by calling WriteTransaction.update and WriteTransaction.delete, respectively.

Setup

Gradle

Maven Central

IndexedDB can be configured via Gradle Kotlin DSL as follows:

repositories {
    mavenCentral()
}

dependencies {
    implementation("com.juul.indexeddb:core:$version")
}

If you prefer to work with the raw JavaScript API instead of the suspend-type wrappers, replace the implementation with com.juul.indexeddb:external:$version.

License

Copyright 2021 JUUL Labs, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • [CRITICAL] Public Repositories are Disabled for this Org

    [CRITICAL] Public Repositories are Disabled for this Org

    NOTE: Public Repos are disabled for this organization! Repository was automatically converted to a Private Repo. Please contact an admin to override.

    /cc @twyatt /cc @perl2ruby @jessecollier @zafarabbas @IamMrCupp @carterandrew

    opened by prevent-public-repos[bot] 3
  • Add only() method for creating Key instance

    Add only() method for creating Key instance

    Adds only() method to create only Key.

    usage

    store.openCursor(only(...)).collect {
        ...
    }
    

    Though openCursor(only(...)) is almost same as openCursor(Key(...)), It's confusing if only() method is absent.

    minor 
    opened by irgaly 2
  • reproducer: cursor moves forward in collect block

    reproducer: cursor moves forward in collect block

    This is a reproducer.

    Run

    Run in a browser by ./gradlew :reproducer:jsBrowserDevelopmentRun

    Code

    Output

    console log:

    1: cursor.value = {
      "id": 0,
      "name": "a"
    }
    2: delete()
    3: cursor.value = {
      "id": 0,
      "name": "a"
    }
    4: store.get()
    5: cursor.value = {
      "id": 1,
      "name": "b"
    }
    6: store.get()
    7: cursor.value = {
      "id": 2,
      "name": "c"
    }
    1: cursor.value = {
      "id": 2,
      "name": "c"
    }
    2: delete()
    CoroutineExceptionHandlerImpl.kt?59a9:11 DOMException: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
        at WriteTransaction.delete_t3salm_k$ (webpack-internal:///./kotlin/indexeddb-core.js:1097:48)
        at main$lambda$slambda$slambda$slambda.doResume_5yljmg_k$ (webpack-internal:///./kotlin/indexeddb-reproducer.js:97:59)
        at main$lambda$slambda$slambda$slambda.invoke_cb6tvv_k$ (webpack-internal:///./kotlin/indexeddb-reproducer.js:81:16)
        at sam$kotlinx_coroutines_flow_FlowCollector$0.l [as function_1] (webpack-internal:///./kotlin/indexeddb-reproducer.js:151:16)
        at sam$kotlinx_coroutines_flow_FlowCollector$0.emit_1fbrsb_k$ (webpack-internal:///./kotlin/indexeddb-reproducer.js:69:17)
        at $emitAllImplCOROUTINE$4.doResume_5yljmg_k$ (webpack-internal:///./kotlin/kotlinx.coroutines-kotlinx-coroutines-core-js-ir.js:8063:51)
        at CoroutineImpl.resumeWith_7onugl_k$ (webpack-internal:///./kotlin/kotlin-kotlin-stdlib-js-ir.js:16089:33)
        at CoroutineImpl.resumeWith_s3a3yh_k$ (webpack-internal:///./kotlin/kotlin-kotlin-stdlib-js-ir.js:16135:17)
        at resume (webpack-internal:///./kotlin/kotlinx.coroutines-kotlinx-coroutines-core-js-ir.js:9405:50)
        at resumeUnconfined (webpack-internal:///./kotlin/kotlinx.coroutines-kotlinx-coroutines-core-js-ir.js:9362:9)
    

    image

    opened by irgaly 2
  • Allow for manual cursor control

    Allow for manual cursor control

    @irgaly this should fix the issue you've shown in #75, although it'll require two changes to your code:

    • The openCursor() call needs to add an autoContinue = false parameter
    • You'll need to manually call cursor.`continue`() at the end of your collect block.

    Closes #75.

    minor 
    opened by cedrickcooke 1
  • cursor moves forward in collect block

    cursor moves forward in collect block

    Thank you for this very cool library. I'm using this library in my Kotlin Multiplatform project (https://github.com/irgaly/kottage/pull/58).

    It seems a cursor in collect block moves forward before completing the block.

    I make a reproducer on my fork repository: https://github.com/irgaly/indexeddb/pull/1


    steps to reproduce:

    • get a cursor Flow by openCursor()
    • collect cursor with block:
      • call two or more suspend functions in collect block. (that functions are indexeddb's transaction operations.)
      • -> now, cursor has moved forward

    expected behavior:

    • cursor stays current position until collect block completes.

    Code

    https://github.com/irgaly/indexeddb/blob/57f30479f8c8f82577718127f0e9c178135410b8/reproducer/src/jsMain/kotlin/reproducer/Main.kt

    fun main() {
        window.onload = {
            MainScope().launch {
                val database = openDatabase("test", 1) { database, old, new ->
                    if (old < 1) {
                        database.createObjectStore("store", KeyPath("id"))
                    }
                }
                database.writeTransaction("store") {
                    val store = objectStore("store")
                    store.clear()
                    store.add(jso<Data> { id = 0; name = "a" })
                    store.add(jso<Data> { id = 1; name = "b" })
                    store.add(jso<Data> { id = 2; name = "c" })
                    store.add(jso<Data> { id = 3; name = "d" })
                    store.add(jso<Data> { id = 4; name = "e" })
                    store.add(jso<Data> { id = 5; name = "f" })
                    store.add(jso<Data> { id = 6; name = "g" })
                    store.add(jso<Data> { id = 7; name = "h" })
                    store.add(jso<Data> { id = 8; name = "i" })
                    store.add(jso<Data> { id = 9; name = "j" })
                }
                database.writeTransaction("store") {
                    val store = objectStore("store")
                    store.openCursor()
                        .collect { cursor ->
                            console.log("1: cursor.value = ${JSON.stringify(cursor.value, null, "  ")}")
                            console.log("2: store.get()")
                            store.get(Key("other"))
                            console.log("3: cursor.value = ${JSON.stringify(cursor.value, null, "  ")}")
                            console.log("4: store.get()")
                            store.get(Key("other"))
                            console.log("5: cursor.value = ${JSON.stringify(cursor.value, null, "  ")}")
                            console.log("6: store.get()")
                            store.get(Key("other"))
                            console.log("7: cursor.value = ${JSON.stringify(cursor.value, null, "  ")}")
                            console.log("8: delete()")
                            cursor.delete()
                            console.log("9: cursor.value = ${JSON.stringify(cursor.value, null, "  ")}")
                        }
                }
            }
        }
    }
    
    fun <T : Any> jso(): T = js("({})") as T
    inline fun <T : Any> jso(block: T.() -> Unit): T = jso<T>().apply(block)
    
    external interface Data {
        var id: Int
        var name: String
    }
    

    Output

    environment: M1, macOS 12.6, Chrome 107.0.5304.87

    console log:

    1: cursor.value = {
      "id": 0,
      "name": "a"
    }
    2: store.get()
    3: cursor.value = {
      "id": 0,
      "name": "a"
    }
    4: store.get()
    5: cursor.value = {
      "id": 1,
      "name": "b"
    }
    6: store.get()
    7: cursor.value = {
      "id": 2,
      "name": "c"
    }
    8: delete()
    DOMException: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
        at WriteTransaction.delete_t3salm_k$ (webpack-internal:///./kotlin/indexeddb-core.js:1097:48)
        at main$lambda$slambda$slambda$slambda.doResume_5yljmg_k$ (webpack-internal:///./kotlin/indexeddb-reproducer.js:127:59)
        at CoroutineImpl.resumeWith_7onugl_k$ (webpack-internal:///./kotlin/kotlin-kotlin-stdlib-js-ir.js:16089:33)
        at CoroutineImpl.resumeWith_s3a3yh_k$ (webpack-internal:///./kotlin/kotlin-kotlin-stdlib-js-ir.js:16135:17)
        at resume (webpack-internal:///./kotlin/kotlinx.coroutines-kotlinx-coroutines-core-js-ir.js:9405:50)
        at resumeUnconfined (webpack-internal:///./kotlin/kotlinx.coroutines-kotlinx-coroutines-core-js-ir.js:9362:9)
        at dispatch (webpack-internal:///./kotlin/kotlinx.coroutines-kotlinx-coroutines-core-js-ir.js:9312:9)
        at dispatchResume (webpack-internal:///./kotlin/kotlinx.coroutines-kotlinx-coroutines-core-js-ir.js:955:5)
        at resumeImpl (webpack-internal:///./kotlin/kotlinx.coroutines-kotlinx-coroutines-core-js-ir.js:1011:11)
        at resumeImpl$default (webpack-internal:///./kotlin/kotlinx.coroutines-kotlinx-coroutines-core-js-ir.js:1037:12)
    

    image

    opened by irgaly 1
  • Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-core to v1.6.3

    Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-core to v1.6.3

    This PR contains the following updates:

    | Package | Update | Change | |---|---|---| | org.jetbrains.kotlinx:kotlinx-coroutines-core | patch | 1.6.1 -> 1.6.3 |


    Release Notes

    Kotlin/kotlinx.coroutines

    v1.6.3

    Compare Source

    • Updated atomicfu version to 0.17.3 (#​3321), fixing the projects using this library with JS IR failing to build (#​3305).

    v1.6.2

    Compare Source

    • Fixed a bug with ThreadLocalElement not being correctly updated when the most outer suspend function was called directly without kotlinx.coroutines (#​2930).
    • Fixed multiple data races: one that might have been affecting runBlocking event loop, and a benign data race in Mutex (#​3250, #​3251).
    • Obsolete TestCoroutineContext is removed, which fixes the kotlinx-coroutines-test JPMS package being split between kotlinx-coroutines-core and kotlinx-coroutines-test (#​3218).
    • Updated the ProGuard rules to further shrink the size of the resulting DEX file with coroutines (#​3111, #​3263). Thanks, @​agrieve!
    • Atomicfu is updated to 0.17.2, which includes a more efficient and robust JS IR transformer (#​3255).
    • Kotlin is updated to 1.6.21, Gradle version is updated to 7.4.2 (#​3281). Thanks, @​wojtek-kalicinski!
    • Various documentation improvements.

    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, click this checkbox.

    This PR has been generated by Renovate Bot.

    renovate 
    opened by juul-mobile-bot 1
  • Update dependency org.jetbrains.kotlin-wrappers:kotlin-extensions to v1.0.1-pre.306-kotlin-1.6.10

    Update dependency org.jetbrains.kotlin-wrappers:kotlin-extensions to v1.0.1-pre.306-kotlin-1.6.10

    This PR contains the following updates:

    | Package | Update | Change | |---|---|---| | org.jetbrains.kotlin-wrappers:kotlin-extensions | patch | 1.0.1-pre.304-kotlin-1.6.10 -> 1.0.1-pre.306-kotlin-1.6.10 |


    Configuration

    πŸ“… Schedule: At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, click this checkbox.

    This PR has been generated by Renovate Bot.

    renovate 
    opened by juul-mobile-bot 1
  • Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-core to v1.6.0

    Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-core to v1.6.0

    This PR contains the following updates:

    | Package | Update | Change | |---|---|---| | org.jetbrains.kotlinx:kotlinx-coroutines-core | minor | 1.5.2 -> 1.6.0 |


    Release Notes

    Kotlin/kotlinx.coroutines

    v1.6.0

    Compare Source

    Note that this is a full changelog relative to the 1.5.2 version. Changelog relative to 1.6.0-RC3 can be found at the end.

    kotlinx-coroutines-test rework
    Dispatchers
    • Introduced CoroutineDispatcher.limitedParallelism that allows obtaining a view of the original dispatcher with limited parallelism (#​2919).
    • Dispatchers.IO.limitedParallelism usages ignore the bound on the parallelism level of Dispatchers.IO itself to avoid starvation (#​2943).
    • Introduced new Dispatchers.shutdown method for containerized environments (#​2558).
    • newSingleThreadContext and newFixedThreadPoolContext are promoted to delicate API (#​2919).
    Breaking changes
    • When racing with cancellation, the future builder no longer reports unhandled exceptions into the global CoroutineExceptionHandler. Thanks @​vadimsemenov! (#​2774, #​2791).
    • Mutex.onLock is deprecated for removal (#​2794).
    • Dispatchers.Main is now used as the default source of time for delay and withTimeout when present(#​2972).
      • To opt-out from this behaviour, kotlinx.coroutines.main.delay system property can be set to false.
    • Java target of coroutines build is now 8 instead of 6 (#​1589).
    • Source-breaking change: extension collect no longer resolves when used with a non-in-place argument of a functional type. This is a candidate for a fix, uncovered after 1.6.0, see #​3107 for the additional details.
    Bug fixes and improvements
    • Kotlin is updated to 1.6.0.
    • Kotlin/Native new memory model is now supported in regular builds of coroutines conditionally depending on whether kotlin.native.binary.memoryModel is enabled (#​2914).
    • Introduced CopyableThreadContextElement for mutable context elements shared among multiple coroutines. Thanks @​yorickhenning! (#​2893).
    • transformWhile, awaitClose, ProducerScope, merge, runningFold, runingReduce, and scan are promoted to stable API (#​2971).
    • SharedFlow.subscriptionCount no longer conflates incoming updates and gives all subscribers a chance to observe a short-lived subscription (#​2488, #​2863, #​2871).
    • Flow exception transparency mechanism is improved to be more exception-friendly (#​3017, #​2860).
    • Cancellation from flat* operators that leverage multiple coroutines is no longer propagated upstream (#​2964).
    • SharedFlow.collect now returns Nothing (#​2789, #​2502).
    • DisposableHandle is now fun interface, and corresponding inline extension is removed (#​2790).
    • FlowCollector is now fun interface, and corresponding inline extension is removed (#​3047).
    • Deprecation level of all previously deprecated signatures is raised (#​3024).
    • The version file is shipped with each JAR as a resource (#​2941).
    • Unhandled exceptions on K/N are passed to the standard library function processUnhandledException (#​2981).
    • A direct executor is used for Task callbacks in kotlinx-coroutines-play-services (#​2990).
    • Metadata of coroutines artifacts leverages Gradle platform to have all versions of dependencies aligned (#​2865).
    • Default CoroutineExceptionHandler is loaded eagerly and does not invoke ServiceLoader on its exception-handling path (#​2552).
    • Fixed the R8 rules for ServiceLoader optimization (#​2880).
    • Fixed BlockHound integration false-positives (#​2894, #​2866, #​2937).
    • Fixed the exception handler being invoked several times on Android, thanks to @​1zaman (#​3056).
    • SendChannel.trySendBlocking is now available on Kotlin/Native (#​3064).
    • The exception recovery mechanism now uses ClassValue when available (#​2997).
    • JNA is updated to 5.9.0 to support Apple M1 (#​3001).
    • Obsolete method on internal Delay interface is deprecated (#​2979).
    • Support of deprecated CommonPool is removed.
    • @ExperimentalTime is no longer needed for methods that use Duration (#​3041).
    • JDK 1.6 is no longer required for building the project (#​3043).
    • New version of Dokka is used, fixing the memory leak when building the coroutines and providing brand new reference visuals (https://kotlin.github.io/kotlinx.coroutines/) (#​3051, #​3054).
    Changelog relative to version 1.6.0-RC3
    • Restored MPP binary compatibility on K/JS and K/N (#​3104).
    • Fixed Dispatchers.Main not being fully initialized on Android and Swing (#​3101).

    Configuration

    πŸ“… Schedule: At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, click this checkbox.

    This PR has been generated by Renovate Bot.

    renovate 
    opened by juul-mobile-bot 1
  • Update dependency org.jetbrains.kotlin-wrappers:kotlin-extensions to v1.0.1-pre.290-kotlin-1.6.10

    Update dependency org.jetbrains.kotlin-wrappers:kotlin-extensions to v1.0.1-pre.290-kotlin-1.6.10

    This PR contains the following updates:

    | Package | Update | Change | |---|---|---| | org.jetbrains.kotlin-wrappers:kotlin-extensions | patch | 1.0.1-pre.264-kotlin-1.5.31 -> 1.0.1-pre.290-kotlin-1.6.10 |


    Configuration

    πŸ“… Schedule: At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, click this checkbox.

    This PR has been generated by Renovate Bot.

    renovate 
    opened by juul-mobile-bot 1
  • Update dependency gradle to v7.6

    Update dependency gradle to v7.6

    This PR contains the following updates:

    | Package | Update | Change | |---|---|---| | gradle (source) | minor | 7.5.1 -> 7.6 |


    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Renovate Bot.

    renovate 
    opened by juul-mobile-bot 0
  • Update dependency org.jetbrains.kotlin.multiplatform to v1.7.22

    Update dependency org.jetbrains.kotlin.multiplatform to v1.7.22

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | org.jetbrains.kotlin.multiplatform (source) | plugin | patch | 1.7.21 -> 1.7.22 |


    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Renovate will not automatically rebase this PR, because other commits have been found.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Renovate Bot.

    renovate 
    opened by juul-mobile-bot 0
  • Update plugin kotlinter to v3.13.0

    Update plugin kotlinter to v3.13.0

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | org.jmailen.kotlinter | plugin | minor | 3.12.0 -> 3.13.0 |


    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Renovate Bot.

    renovate 
    opened by juul-mobile-bot 0
Releases(0.5.0)
  • 0.5.0(Nov 17, 2022)

  • 0.4.0(Nov 2, 2022)

  • 0.3.0(Oct 20, 2022)

    Big thanks to @ShaggyDemiurge who implemented the new features in this release

    • Use IDBCursor methods in the beginning of reading a cursor (#73)
    • Add count() method support (#72)

    🧰 Maintenance

    • Update plugin dokka to v1.7.20 (#71)
    • Update JamesIves/github-pages-deploy-action action to v4.4.1 (#70)
    • Update dependency org.jetbrains.kotlin.multiplatform to v1.7.20 (#69)
    • Update plugin maven-publish to v0.22.0 (#68)
    • Update plugin kotlinter to v3.12.0 (#67)
    • Change code owners to @JuulLabs/conx-kotlin-reviewers (#66)
    • Configure release drafter for automatic versioning (#64)
    • Require version label on pull requests (#65)
    • Update dependency gradle to v7.5.1 (#63)
    • Update dependency gradle to v7.5 (#62)
    • Update JamesIves/github-pages-deploy-action action to v4.4.0 (#61)
    • Update plugin dokka to v1.7.10 (#59)
    • Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-core to v1.6.4 (#58)
    • Update plugin maven-publish to v0.21.0 (#60)
    • Update plugin kotlinter to v3.11.1 (#53)
    • Update dependency org.jetbrains.kotlin.multiplatform to v1.7.10 (#57)
    • Use Temurin 11 JDK for CI (#56)
    • Drop SNAPSHOT publication (#55)
    • Update JamesIves/github-pages-deploy-action action to v4.3.4 (#54)
    • Update plugin dokka to v1.7.0 (#52)
    • Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-core to v1.6.3 (#49)
    • Update dependency org.jetbrains.kotlin.multiplatform to v1.7.0 (#51)
    • Update plugin maven-publish to v0.20.0 (#50)
    Source code(tar.gz)
    Source code(zip)
  • 0.2.3(May 4, 2022)

    Bug Fixes

    • Use Dispatchers.Unconfined during openDatabase by @cedrickcooke in https://github.com/JuulLabs/indexeddb/pull/48

    Maintenance

    • Update dependency gradle to v7.4.1 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/34
    • Automatically close/release on publication to Sonatype by @twyatt in https://github.com/JuulLabs/indexeddb/pull/33
    • Update actions/cache action to v3 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/35
    • Update plugin kotlin-multiplatform to v1.6.20 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/37
    • Update dependency gradle to v7.4.2 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/36
    • Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-core to v1.6.1 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/40
    • Update JamesIves/github-pages-deploy-action action to v4.3.0 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/41
    • Remove deprecated Gradle option by @twyatt in https://github.com/JuulLabs/indexeddb/pull/38
    • Drop usage of explicit Webpack version by @twyatt in https://github.com/JuulLabs/indexeddb/pull/39
    • Update plugin kotlinter to v3.10.0 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/42
    • Update plugin dokka to v1.6.20 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/43
    • Update plugin kotlin-multiplatform to v1.6.21 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/44
    • Update JamesIves/github-pages-deploy-action action to v4.3.2 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/45
    • Update plugin dokka to v1.6.21 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/47
    • Update JamesIves/github-pages-deploy-action action to v4.3.3 by @juul-mobile-bot in https://github.com/JuulLabs/indexeddb/pull/46

    Full Changelog: https://github.com/JuulLabs/indexeddb/compare/0.2.2...0.2.3

    Source code(tar.gz)
    Source code(zip)
  • 0.2.3-snapshot-unconfined-dispatcher(May 4, 2022)

  • 0.2.2(Mar 8, 2022)

    🧰 Maintenance

    • Update actions/checkout action to v3 (#32)
    • Update plugin maven-publish to v0.19.0 (#31)
    • Drop Kotlin/JS extensions and use internal jso instead (#28)
    • Update actions/setup-java action to v3 (#30)
    • Update plugin kotlinter to v3.9.0 (#26)
    • Update JamesIves/github-pages-deploy-action action to v4.2.5 (#22)
    • Update dependency gradle to v7.4 (#18)
    • Update JamesIves/github-pages-deploy-action action to v4.2.3 (#15)
    Source code(tar.gz)
    Source code(zip)
  • 0.2.1(Jan 11, 2022)

    Built against Kotlin 1.6.10.

    🧰 Maintenance

    • Update plugin maven-publish to v0.18.0 (#12)
    • Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-core to v1.6.0 (#8)
    • Categorize release drafts (#5)
    • Update plugin kotlinter to v3.8.0 (#11)
    • Update plugin dokka to v1.6.10 (#9)
    • Update plugin kotlin-multiplatform to v1.6.10 (#10)
    • Update JamesIves/github-pages-deploy-action action to v4.2.2 (#7)
    • Use Gradle version catalogs (#4)
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Nov 12, 2021)

  • 0.1.0(Nov 10, 2021)

A Kotlin DSL wrapper around the mikepenz/MaterialDrawer library.

MaterialDrawerKt Create navigation drawers in your Activities and Fragments without having to write any XML, in pure Kotlin code, with access to all t

MΓ‘rton Braun 517 Nov 19, 2022
πŸ”“ Kotlin version of the popular google/easypermissions wrapper library to simplify basic system permissions logic on Android M or higher.

EasyPermissions-ktx Kotlin version of the popular googlesample/easypermissions wrapper library to simplify basic system permissions logic on Android M

Madalin Valceleanu 326 Dec 23, 2022
A simple Kotlin wrapper around Anvil.

AnvilKotlin A simple Kotlin wrapper around Anvil. The only purpose of this library is to provide type safety to Anvil through Kotlin. Nothing more, no

Andre Artus 15 Oct 3, 2022
Android AsyncTask wrapper library, written in Kotlin

KillerTask This is a Kotlin Android library to create async background tasks. Inspired by TinyTask, but more beautiful and easy to use for Kotlin Andr

Inaka 26 Oct 3, 2022
A lightweight Kotlin friendly wrapper around Couchbase lite for Android.

CouchBaseKtx ?? Work In-Progress ?? A lightweight Kotlin friendly wrapper around Couchbase-lite for Android Read up a little bit of documentation abou

Jaya Surya Thotapalli 5 Feb 15, 2022
Netflix inspired OTT Home Screen, Contains implementation in Reactjs, Kotlin React Wrapper, Jetpack Compose Web

Netflix-Clone-React Practising React by building Netflix Clone Requirements TMDB api key : Add TMDB API key to AppApi.kt Learning Resourcce Build Netf

Chetan Gupta 61 Nov 13, 2022
Yaspeller-kt - Asynchronous Yandex.Speller API wrapper for Kotlin/JVM.

yaspeller-kt Asynchronous Yandex.Speller API wrapper for Kotlin/JVM. Installation repositories { maven { url 'https://jitpack.io' }

Mikhail Koshkin 6 Jun 27, 2022
⏰ A powerful and simple-to-use guilded wrapper made in Kotlin.

⏰ guilded-kt [WIP] A powerful yet simple-to-use guilded wrapper made entirely in Kotlin with supporting multiplatform. Take a look at an example of th

Gabriel 13 Jul 30, 2022
SavedStateFlow - A Kotlin StateFlow wrapper around SavedStateHandle

SavedStateFlow SavedStateFlow is a Kotlin StateFlow wrapper around SavedStateHan

Andrew Steinmetz 13 Aug 4, 2022
🎲 A powerful and simple-to-use guilded wrapper made in Kotlin.

?? deck [WIP] Deck is a powerful yet simple-to-use guilded wrapper made entirely in Kotlin with support to multiplatform. Implementating In case you'r

Gabriel 13 Jul 30, 2022
Permissionmanager is a small wrapper for handling permission requests.

Permissionmanager Permissionmanager is a small wrapper for handling permission requests. Installation Add jitpack to your repositories in Project buil

Thomas Cirksena 11 Nov 17, 2020
Dependency Injection library for Compose Multiplatform, Koin wrapper.

?? Cokoin Injection library for Compose (Multiplatform and Jetpack), Koin wrapper. It uses @Composable functions to configure KoinContext and Scopes.

Bruno Wieczorek 57 Dec 29, 2022
This library is a set of simple wrapper classes that are aimed to help you easily access android device information.

SysInfo Simple, single class wrapper to get device information from an android device. This library provides an easy way to access all the device info

Klejvi Kapaj 7 Dec 27, 2022
Wrapper of FusedLocationProviderClient for Android to support modern usage like LiveData and Flow

FancyLocationProvider Wrapper of FusedLocationProviderClient for Android to support modern usage like LiveData or Flow. Install Add Jitpack repository

Jintin 66 Aug 15, 2022
🧸 A multiplatform coroutine-based wrapper for popular platform-specific Redis client libraries

?? rekt ⚠️ WARNING! This project is experimental and may be missing essential features. Please let us know if you found any issues or have any suggest

Hexalite Network 3 Aug 31, 2022
🧸 A multiplatform coroutine-based wrapper for popular platform-specific Redis client libraries

?? rekt ⚠️ WARNING! This project is experimental and may be missing essential features. Please let us know if you found any issues or have any suggest

Southdust Team 3 Aug 31, 2022
Opinionated Redux-like implementation backed by Kotlin Coroutines and Kotlin Multiplatform Mobile

CoRed CoRed is Redux-like implementation that maintains the benefits of Redux's core idea without the boilerplate. No more action types, action creato

Kittinun Vantasin 28 Dec 10, 2022
Android To-Do MVVM Architecture App written in Kotlin.(ViewModel, ROOM, Livedata, Coroutines)

MVVM-To-Do-App A To-Do application written in kotlin using Android Architectural components What's new? Room + Coroutines - Upgraded Room to v2.1. Roo

Naveen T P 77 Dec 8, 2022
A Kotlin Android library for content provider queries with reactive streams and coroutines.

Pickpocket An Android library for content provider queries with reactive streams and coroutines. Calendar Contacts SMS MMS Files/Media Call Log Bookma

Chris Basinger 27 Nov 14, 2022