Skip to content
Open

2.0.0 #1954

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
7d33a5b
refactor: strip out data handling from collection to data adapter
maxnowack Jul 11, 2025
53bdcba
test: update test for async CRUD operations
maxnowack Jul 11, 2025
5ec984f
refactor: move generic parameter Async to last position for cursor class
maxnowack Jul 14, 2025
35bbc28
refactor: implement better way for batch method signature
maxnowack Jul 14, 2025
b4c5d15
fix: return type for removeOne and removeMany in collection class
maxnowack Jul 14, 2025
2b9fa31
test: wait for update operations
maxnowack Jul 14, 2025
e38f77c
fix: allow undefined as options for query events
maxnowack Jul 14, 2025
1e5d3a9
fix: add default for activeQueries in DefaultDataAdapter
maxnowack Jul 14, 2025
8f567c8
fix: emit correct event with flushing query updates
maxnowack Jul 14, 2025
e120f08
fix: batch operations
maxnowack Jul 14, 2025
27f0f48
chore: remove AutoFetchCollection
maxnowack Jul 14, 2025
659c21c
fix: disposing of default data adapter
maxnowack Jul 15, 2025
5d24412
fix: return correct type during upsert
maxnowack Jul 15, 2025
01d8a31
fix: include id in error if item already exists
maxnowack Jul 15, 2025
3e84aca
fix: emit initial persistence events
maxnowack Jul 15, 2025
ce14723
fix: clone items during persistence load
maxnowack Jul 15, 2025
896debe
fix: rebuilding indices
maxnowack Jul 15, 2025
d9aa24d
fix: batch operations in collection
maxnowack Jul 15, 2025
b59ec33
test: fix event order in tests
maxnowack Jul 15, 2025
a4be162
fix: type and linting errors
maxnowack Jul 15, 2025
cd7e0ec
test: fix tests
maxnowack Jul 15, 2025
ed79c21
fix: set iterator filter in node 20
maxnowack Jul 16, 2025
b5721d5
fix: linting
maxnowack Aug 25, 2025
bfb9fe2
refactor: records to map in default data adapter
maxnowack Aug 27, 2025
aaba30c
fix: use query id for indexing
maxnowack Aug 27, 2025
cab1a35
fix: register queries for async operations
maxnowack Aug 27, 2025
db608c5
feat: add first draft of worker data adapter
maxnowack Aug 27, 2025
e367f80
refactor: move primaryKeyGenerator and upsert handling back to collec…
maxnowack Aug 27, 2025
8174d49
chore: remove MemoryAdapter type
maxnowack Aug 27, 2025
c74e29a
BREAKING CHANGE: indices are now specified as an array of strings
maxnowack Aug 27, 2025
01a3050
BREAKING CHANGE: rename PersistenceAdapter to StorageAdapter
maxnowack Aug 27, 2025
c4c0b75
BREAKING CHANGE: remove all persistence events on collection
maxnowack Aug 27, 2025
deeef1e
BREAKING CHANGE: refactor StorageAdapter api
maxnowack Aug 27, 2025
b2dcd94
fix: various bugs and make core package tests pass
maxnowack Aug 28, 2025
813880a
refactor: @signaldb/indexeddb to use new storage adapter api
maxnowack Aug 28, 2025
afeb491
chore: remove outdated TODO comments
maxnowack Aug 28, 2025
4aa8779
refactor: use ids instead of item positions for indexing
maxnowack Aug 29, 2025
fe6e5e8
refactor: move index creation related files to root of core package
maxnowack Aug 29, 2025
dd6cdd6
refactor: update indexeddb adapter to match new storage adapter api
maxnowack Aug 29, 2025
f93cfa2
refactor: @signaldb/fs to comply with new storage adapter api
maxnowack Aug 29, 2025
47a58fd
refactor: @signaldb/opfs to comply with new storage adapter api
maxnowack Aug 29, 2025
5502917
fix: linting
maxnowack Aug 29, 2025
25a88d5
refactor: @signaldb/localstorage to comply with new storage adapter api
maxnowack Aug 29, 2025
224384a
test: fix SyncManager tests
maxnowack Aug 30, 2025
08140c9
feat: implement indexing for localstorage adapter
maxnowack Aug 31, 2025
8b1a251
refactor: introduce generic-fs package
maxnowack Sep 1, 2025
8eeb9ef
docs: fixed naming in storage adapter readmes
maxnowack Sep 1, 2025
d15b951
feat: implement delta updating indices in local storage adapter
maxnowack Sep 1, 2025
d1c1572
feat: implement delta updating indices in generic fs adapter
maxnowack Sep 1, 2025
caed2ca
feat: implement delta updating indices in default data adapter
maxnowack Sep 1, 2025
9f8f018
refactor: require delta index updates in default data adapter
maxnowack Sep 1, 2025
0bfc907
feat: add AsyncDataAdapter
maxnowack Sep 1, 2025
b7d4919
test: fix async setup error during teardown
maxnowack Sep 1, 2025
33327aa
test: fix opfs adapter tests
maxnowack Sep 1, 2025
4c7d27c
fix: check for directory existence in opfs adapter
maxnowack Sep 1, 2025
3892d8a
test: ensure coverage for storage adapters
maxnowack Sep 1, 2025
d4803d2
test: more sync manager test coverage
maxnowack Sep 1, 2025
a5fce7a
chore: update vitest config
maxnowack Sep 1, 2025
b18a27d
test: add more util tests
maxnowack Sep 1, 2025
4b4b225
refactor: make isReady reactive and add ready method for promise impl…
maxnowack Sep 1, 2025
3f4a2fe
fix: improve id generator
maxnowack Sep 1, 2025
af93781
test: improve test coverage
maxnowack Sep 2, 2025
32711a3
feat: add AutoFetchDataAdapter
maxnowack Sep 2, 2025
a3820fa
docs: add upgrade guide for v2
maxnowack Sep 2, 2025
35c4084
fix: readyness and query execution for WorkerDataAdapter
maxnowack Sep 5, 2025
4766be9
test: update tests and ensure coverage
maxnowack Sep 5, 2025
6f2b26a
chore: fix package reference for generic-fs
maxnowack Sep 5, 2025
13dd150
chore: build generic-fs before storage adapters
maxnowack Sep 6, 2025
406a7ab
ci: build generic-fs before tests
maxnowack Sep 6, 2025
c9fc2a2
test: fix node 20 compatibility
maxnowack Sep 6, 2025
88913c1
test: fix coverage for missing lines
maxnowack Sep 6, 2025
645ccb4
test: increase coverage
maxnowack Sep 6, 2025
5c21025
docs: remove dead links
maxnowack Sep 7, 2025
71cf824
fix: linting
maxnowack Sep 8, 2025
5aeaf7c
chore: bump package versions to new beta
maxnowack Sep 8, 2025
c177830
fix: disallow id indexes in storage adapters
maxnowack Sep 9, 2025
d34c6c3
refactor(opfs): disable file sharding in opfs
maxnowack Sep 9, 2025
8fb9ecc
feat: add method for direct query execution to data adapter
maxnowack Sep 9, 2025
95d69e4
refactor: introduce dataAdapter option to SyncManager
maxnowack Sep 9, 2025
b04073d
fix: only unregister queries if they aren't active anymore
maxnowack Sep 11, 2025
8d44a20
test: update SyncManager tests
maxnowack Sep 11, 2025
3ec1602
fix: variable naming in AsyncDataAdapter
maxnowack Sep 11, 2025
be4e74e
chore: build packages in parallel
maxnowack Sep 17, 2025
7f369a9
fix: fallbacks in generic-fs adapter
maxnowack Sep 17, 2025
627147a
feat: implement batched method calls for worker data adapter
maxnowack Sep 17, 2025
1b3042f
fix: add warning if non-async query is executed outside reactive scope
maxnowack Sep 17, 2025
c2d6433
feat: add logging option to worker adapter
maxnowack Sep 17, 2025
2e1956a
fix: ensure async queries in SyncManager
maxnowack Sep 17, 2025
0944c4d
chore: externalize generic-fs module in opfs adapter
maxnowack Sep 17, 2025
b76938b
refactor: improve error handling in opfs adapter
maxnowack Sep 17, 2025
b496681
fix: add warning if local storage is not available in environment
maxnowack Sep 17, 2025
ef15517
style: ignore console.warn
maxnowack Sep 17, 2025
57d0266
fix: increase listener limit for query emitters
maxnowack Sep 17, 2025
905511d
fix: optimize query result caching in default data adapter
maxnowack Sep 18, 2025
b8716b8
fix: delta index updates for generic-fs adapter
maxnowack Sep 18, 2025
0e7d5c0
fix: query changes for old items in async data adapter
maxnowack Sep 18, 2025
66c5b93
refactor: change options parameter to be required in data adpter inte…
maxnowack Sep 18, 2025
f7260eb
refactor: improve index handling in local storage adapter
maxnowack Sep 18, 2025
c87ac57
refactor: indexeddb adapter to accept schema to initialize database
maxnowack Sep 18, 2025
2201fa9
test: fix the tests
maxnowack Sep 19, 2025
b7ab432
chore: bump package versions to v2.0.0-beta.1
maxnowack Sep 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/checks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,13 @@ jobs:
path: |
**/node_modules
key: ${{ runner.OS }}-modules-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }}
- name: unit testing
- name: prebuild packages
run: |
npm run build -w packages/base/core
npm run build -w packages/storage-adapters/generic-fs
npm run build -w packages/devtools/devtools
- name: unit testing
run: |
npm test -- --coverage --outputFile=test-report.junit.xml run
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
Expand Down
166 changes: 166 additions & 0 deletions .scripts/build-all.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
#!/usr/bin/env node
'use strict'

const fs = require('fs')
const path = require('path')
const { spawn } = require('child_process')
const os = require('os')

// --- Helpers ---------------------------------------------------------------
function runNpmBuild(cwd, options = {}) {
const { verbose = process.env.BUILD_VERBOSE === '1' || process.env.BUILD_VERBOSE === 'true' } = options
return new Promise((resolve, reject) => {
const cmd = process.platform === 'win32' ? 'npm.cmd' : 'npm'
const args = ['run', '-s', 'build'] // -s/--silent to quiet npm itself

const child = spawn(cmd, args, {
cwd,
stdio: ['ignore', 'pipe', 'pipe'],
})

let stdoutBuf = ''
let stderrBuf = ''

child.stdout.on('data', (chunk) => {
if (verbose) {
process.stdout.write(chunk)
} else {
stdoutBuf += chunk.toString()
}
})

child.stderr.on('data', (chunk) => {
if (verbose) {
process.stderr.write(chunk)
} else {
stderrBuf += chunk.toString()
}
})

child.on('error', reject)
child.on('close', (code) => {
if (code === 0) return resolve()
const tail = (stdoutBuf + '\n' + stderrBuf)
.split(/\r?\n/)
.slice(-40)
.join('\n')
const error = new Error(`Build failed in ${cwd} (exit code ${code}).\n--- Last output ---\n${tail}`)
reject(error)
})
})
}
async function runInPool(items, worker, concurrency) {
const results = Array.from({ length: items.length })
let index = 0
const workers = []
const errors = []
const runWorker = async () => {
while (true) {
const i = index++
if (i >= items.length) break
try {
results[i] = await worker(items[i], i)
} catch (error) {
errors.push(error)
}
}
}
const workerCount = Math.min(concurrency, items.length)
for (let i = 0; i < workerCount; i++) {
workers.push(runWorker())
}
await Promise.all(workers)
if (errors.length > 0) throw errors[0]
return results
}

async function listSubdirs(directory) {
try {
const entries = await fs.promises.readdir(directory, { withFileTypes: true })
return entries
.filter(entry => entry.isDirectory())
.map(entry => path.join(directory, entry.name))
} catch {
return []
}
}

async function hasBuildScript(directory) {
try {
const packageJson = await fs.promises.readFile(path.join(directory, 'package.json'), 'utf8')
const package_ = JSON.parse(packageJson)
return Boolean(package_ && package_.scripts && package_.scripts.build)
} catch {
return false
}
}

// --- Main -----------------------------------------------------------------
(async function main() {
const repoRoot = path.resolve(__dirname, '..')

// 1) Build base/core first
const coreDirectory = path.join(repoRoot, 'packages', 'base', 'core')
await runNpmBuild(coreDirectory)
console.log(`Built ${path.relative(repoRoot, coreDirectory)}`)

// 2) Build storage-adapters/generic-fs second
const genericFsDirectory = path.join(
repoRoot,
'packages',
'storage-adapters',
'generic-fs',
)
await runNpmBuild(genericFsDirectory)
console.log(`Built ${path.relative(repoRoot, genericFsDirectory)}`)

// 3) Build everything else in parallel
const groups = [
{ dir: path.join(repoRoot, 'packages', 'base'), exclude: new Set(['core']) },
{ dir: path.join(repoRoot, 'packages', 'devtools'), exclude: new Set() },
{ dir: path.join(repoRoot, 'packages', 'integrations'), exclude: new Set() },
{
dir: path.join(repoRoot, 'packages', 'storage-adapters'),
exclude: new Set(['generic-fs']),
},
{ dir: path.join(repoRoot, 'packages', 'reactivity-adapters'), exclude: new Set() },
]

/** Collect package directories that actually have a build script */
const directoriesToBuild = []
for (const g of groups) {
const subdirs = await listSubdirs(g.dir)
for (const d of subdirs) {
const name = path.basename(d)
if (g.exclude.has(name)) continue
if (await hasBuildScript(d)) {
directoriesToBuild.push(d)
} else {
console.log(`[skip] ${path.relative(repoRoot, d)} (no npm run build)`)
}
}
}

if (directoriesToBuild.length === 0) {
console.log('Nothing else to build.')
return
}

const cpuCount = os.cpus ? os.cpus().length : 1
const maxConcurrency = Math.max(1, Number.parseInt(process.env.BUILD_CONCURRENCY || '', 10) || cpuCount)

console.log(`Building ${directoriesToBuild.length} packages in parallel (up to ${maxConcurrency} workers)`)
await runInPool(
directoriesToBuild,
async (directory) => {
await runNpmBuild(directory)
console.log(`Built ${path.relative(repoRoot, directory)}`)
},
maxConcurrency,
)

console.log('✅ All builds completed successfully.')
})().catch((error) => {
console.error('❌ build-all failed:\n', error && error.stack ? error.stack : error)
process.exit(1)
})
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ All packages are in the `packages` folder. In the folder are some sub-folders to
- `sync`: Contains `@signaldb/sync`
- `integrations`: Contains all integrations to frameworks like React for example.
- `reactivity-adapters`: Contains all reactivity adapters of SignalDB.
- `persistence-adapters`: Contains all persistence adapters of SignalDB.
- `storage-adapters`: Contains all storage adapters of SignalDB.

## ✅ Committing your changes

Expand Down
9 changes: 5 additions & 4 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,13 @@ export default withMermaid({
{ text: 'Core Concepts', link: '/core-concepts/' },
{ text: 'Querying Data', link: '/queries/' },
{ text: 'Data manipulation', link: '/data-manipulation/' },
{ text: 'Data Persistence', link: '/data-persistence/' },
{ text: 'Data Storage', link: '/data-persistence/' },
{ text: 'Reactivity', link: '/reactivity/' },
{ text: 'Synchronization', link: '/sync/' },
{ text: 'ORM', link: '/orm/' },
{ text: 'Developer Tools', link: '/devtools/' },
{ text: 'Schema Validation', link: '/schema-validation/' },
{ text: 'Upgrade to v2', link: '/upgrade/v2/' },
{ text: 'Upgrade to v1', link: '/upgrade/v1/' },
],
},
Expand Down Expand Up @@ -156,9 +157,8 @@ export default withMermaid({
{ text: 'createIndex', link: '/reference/core/createindex/' },
{ text: 'createIndexProvider', link: '/reference/core/createindexprovider/' },
{ text: 'createMemoryAdapter', link: '/reference/core/creatememoryadapter/' },
{ text: 'createPersistenceAdapter', link: '/reference/core/createpersistenceadapter/' },
{ text: 'createStorageAdapter', link: '/reference/core/createstorageadapter/' },
{ text: 'createReactivityAdapter', link: '/reference/core/createreactivityadapter/' },
{ text: 'combinePersistenceAdapters', link: '/reference/core/combinepersistenceadapters/' },
],
},
{ text: '@signaldb/sync', link: '/reference/sync/' },
Expand All @@ -171,7 +171,7 @@ export default withMermaid({
],
},
{
text: 'Persistence Adapters',
text: 'Storage Adapters',
items: [
{ text: '@signaldb/fs', link: '/reference/fs/' },
{ text: '@signaldb/indexeddb', link: '/reference/indexeddb/' },
Expand Down Expand Up @@ -311,6 +311,7 @@ export default withMermaid({
'/reactivity/vue.html': '/reference/vue/',
'/reactivity/vue/index.html': '/reference/vue/',
'/reference/core/index.html': '/reference/',
'/reference/core/createpersistenceadapter/index.html': '/reference/core/createstorageadapter/',
'/replication.html': '/sync/',
'/replication/appwrite/index.html': '/sync/',
'/replication/firebase/index.html': '/sync/',
Expand Down
2 changes: 1 addition & 1 deletion docs/changelog/fs/index.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Changelog for [`@signaldb/fs`](https://www.npmjs.com/package/@signaldb/fs)

<!--@include: ../../../packages/persistence-adapters/fs/CHANGELOG.md{10,}-->
<!--@include: ../../../packages/storage-adapters/fs/CHANGELOG.md{10,}-->
2 changes: 1 addition & 1 deletion docs/changelog/indexeddb/index.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Changelog for [`@signaldb/indexeddb`](https://www.npmjs.com/package/@signaldb/indexeddb)

<!--@include: ../../../packages/persistence-adapters/indexeddb/CHANGELOG.md{10,}-->
<!--@include: ../../../packages/storage-adapters/indexeddb/CHANGELOG.md{10,}-->
2 changes: 1 addition & 1 deletion docs/changelog/localstorage/index.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Changelog for [`@signaldb/localstorage`](https://www.npmjs.com/package/@signaldb/localstorage)

<!--@include: ../../../packages/persistence-adapters/localstorage/CHANGELOG.md{10,}-->
<!--@include: ../../../packages/storage-adapters/localstorage/CHANGELOG.md{10,}-->
2 changes: 1 addition & 1 deletion docs/changelog/opfs/index.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Changelog for [`@signaldb/opfs`](https://www.npmjs.com/package/@signaldb/opfs)

<!--@include: ../../../packages/persistence-adapters/opfs/CHANGELOG.md{10,}-->
<!--@include: ../../../packages/storage-adapters/opfs/CHANGELOG.md{10,}-->
10 changes: 5 additions & 5 deletions docs/core-concepts/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,12 @@ You can also create a MemoryAdapter on your own. See the [createMemoryAdapter re

SignalDB only stores the data in memory and it will be lost when the memory is flushed (e.g. page reload).

Normally you don't want to lose data and you want to persist it. This is where persistence adapters come in.
Normally you don't want to lose data and you want to persist it. This is where storage adapters come in.

Persistence adapters in SignalDB play a critical role in ensuring that your data remains intact across multiple user sessions or application reloads. These adapters facilitate data persistence by providing a standard interface for storing and retrieving data, thereby abstracting from the specifics of the underlying storage mechanism.
Storage adapters in SignalDB play a critical role in ensuring that your data remains intact across multiple user sessions or application reloads. These adapters facilitate data persistence by providing a standard interface for storing and retrieving data, thereby abstracting from the specifics of the underlying storage mechanism.

A persistence adapter provides the necessary code to interact with a specific storage medium, such as localStorage, IndexedDB, or even a remote server. The role of the adapter is to translate the high-level operations that you perform on your data (such as saving or loading a document) into low-level operations that the storage medium can understand.
A storage adapter provides the necessary code to interact with a specific storage medium, such as localStorage, IndexedDB, or even a remote server. The role of the adapter is to translate the high-level operations that you perform on your data (such as saving or loading a document) into low-level operations that the storage medium can understand.

The main benefit of using persistence adapters is flexibility. Because they provide an abstraction layer over the storage system, you can switch between different storage systems with minimal impact on the rest of your code.
The main benefit of using storage adapters is flexibility. Because they provide an abstraction layer over the storage system, you can switch between different storage systems with minimal impact on the rest of your code.

See also the [persistence adapters](/data-persistence/) documentation page.
See also the [storage adapters](/data-persistence/) documentation page.
22 changes: 11 additions & 11 deletions docs/data-persistence/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,33 @@ head:
content: https://signaldb.js.org/data-persistence/
- - meta
- name: og:title
content: Data Persistence Adapters | SignalDB
content: Storage Adapters | SignalDB
- - meta
- name: og:description
content: Learn how Data Persistence Adapters in SignalDB provide an abstraction layer over different storage systems like localStorage, IndexedDB, and remote servers.
content: Learn how Storage Adapters in SignalDB provide an abstraction layer over different storage systems like localStorage, IndexedDB, and remote servers.
- - meta
- name: description
content: Learn how Data Persistence Adapters in SignalDB provide an abstraction layer over different storage systems like localStorage, IndexedDB, and remote servers.
content: Learn how Storage Adapters in SignalDB provide an abstraction layer over different storage systems like localStorage, IndexedDB, and remote servers.
- - meta
- name: keywords
content: data persistence, adapters, SignalDB, localStorage, IndexedDB, remote server, data storage, data retrieval, storage abstraction
content: data persistence, storage, adapters, SignalDB, localStorage, IndexedDB, remote server, data storage, data retrieval, storage abstraction
---
# Data Persistence Adapters
# Storage Adapters

Persistence adapters in SignalDB provide the mechanism for storing and retrieving data, ensuring that your data is kept safe across sessions and reloads of your application.
Storage adapters in SignalDB provide the mechanism for storing and retrieving data, ensuring that your data is kept safe across sessions and reloads of your application.

These adapters interact with the underlying storage medium, such as localStorage, IndexedDB, or even a remote server, and handle the specifics of those storage systems while providing a consistent interface for data operations in your application.

Persistence adapters are responsible for transforming the high-level operations you perform on your data (such as saving a document or loading a collection) into the low-level operations that the specific storage system can understand and perform.
Storage adapters are responsible for transforming the high-level operations you perform on your data (such as saving a document or loading a collection) into the low-level operations that the specific storage system can understand and perform.

The main benefit of using persistence adapters is the abstraction they provide. They allow SignalDB to remain agnostic to the underlying storage system. This means that you can switch between different systems without changing the rest of your code.
The main benefit of using storage adapters is the abstraction they provide. They allow SignalDB to remain agnostic to the underlying storage system. This means that you can switch between different systems without changing the rest of your code.

The follwing persistence adapters are currently available:
The follwing storage adapters are currently available:

- [IndexedDB](/reference/indexeddb/)
- [localStorage](/reference/localstorage/)
- [OPFS](/reference/opfs/)
- [FileSystem](/reference/fs/)

Building your own persistence adapter for your speicific use case is also possible and pretty straight forward.
See [`createPersistenceAdapter`](/reference/core/createpersistenceadapter/) for more information.
Building your own storage adapter for your speicific use case is also possible and pretty straight forward.
See [`createStorageAdapter`](/reference/core/createstorageadapter/) for more information.
2 changes: 1 addition & 1 deletion docs/reference/core/collection/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ Parameters
* name: An optional name for the collection to make it easier to identify. This name will also be used in the developer tools.
* memory: A [MemoryAdapter](/core-concepts/#memory-adapters) for storing items in memory.
* reactivity: A [ReactivityAdapter](/reactivity/) for enabling reactivity.
* persistence: A [PersistenceAdapter](/data-persistence/) for enabling persistent storage.
* persistence: A [StorageAdapter](/data-persistence/) for enabling persistent storage.
* transform: A transformation function to be applied to items. The document that should be transformed is passed as the only parameter. The function should return the transformed document (e.g. `(doc: T) => U`)
* indices: An array of [IndexProvider](/reference/core/createindexprovider/) objects for creating indices on the collection.
* primaryKeyGenerator: A function that generates a unique ID for the item. If not provided, a default generator will be used.
Expand Down
39 changes: 0 additions & 39 deletions docs/reference/core/combinepersistenceadapters/index.md

This file was deleted.

Loading
Loading