Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
a308b27
wip
stevensJourney Jul 11, 2025
1dd8450
wip
stevensJourney Jul 11, 2025
444eadc
cleanup docs
stevensJourney Jul 11, 2025
449c09a
use schema for internal names
stevensJourney Jul 14, 2025
560891d
improve API definitions
stevensJourney Jul 16, 2025
ad155d0
Type extracted types. Delete triggers should store previous values.
stevensJourney Jul 16, 2025
d88f44b
improve docs
stevensJourney Jul 17, 2025
6f3eb72
add test for zero columns
stevensJourney Jul 17, 2025
8c09ebb
cleanup
stevensJourney Jul 17, 2025
2007191
Add interfaces to docs
stevensJourney Jul 17, 2025
2ce5cd2
revert docs for now
stevensJourney Jul 17, 2025
680d8a2
add changeset
stevensJourney Jul 17, 2025
8999b78
Add helpers to prevent SQL injection for trigger when clauses.
stevensJourney Jul 29, 2025
9297564
Merge remote-tracking branch 'origin/main' into triggers
stevensJourney Jul 29, 2025
340d60c
cleanup docs and examples
stevensJourney Jul 29, 2025
34dec96
Merge remote-tracking branch 'origin/main' into triggers
stevensJourney Jul 29, 2025
337fb0c
Mark interfaces as experimental. Add warning if schema changed while …
stevensJourney Aug 11, 2025
c4f0c2c
Merge remote-tracking branch 'origin/main' into triggers
stevensJourney Aug 11, 2025
a5c0aa4
aggregate cleanup errors
stevensJourney Aug 11, 2025
0b15ad1
rename whenClause to sanitizeSQL
stevensJourney Aug 19, 2025
f3ed8dc
rename sanitizeSQL file
stevensJourney Aug 19, 2025
b1b400c
Update packages/common/src/client/triggers/TriggerManager.ts
stevensJourney Aug 19, 2025
f19eb64
Update packages/common/src/client/triggers/TriggerManager.ts
stevensJourney Aug 19, 2025
09753eb
Merge branch 'main' into triggers
stevensJourney Aug 21, 2025
1a193ba
Add unit tests for sql sanitization
stevensJourney Aug 25, 2025
1501c24
update when and operations
stevensJourney Aug 25, 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
8 changes: 8 additions & 0 deletions .changeset/tame-islands-deliver.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@powersync/common': minor
'@powersync/node': minor
'@powersync/react-native': minor
'@powersync/web': minor
---

Added SQLite trigger based table change tracking.
1 change: 1 addition & 0 deletions docs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,6 @@ docs/react-sdk/
docs/vue-sdk/
docs/web-sdk/
docs/tanstack-react-query-sdk
docs/node-sdk

.env
12 changes: 6 additions & 6 deletions docs/docusaurus.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { themes as prismThemes } from 'prism-react-renderer';
import type { TypeDocOptionMap } from 'typedoc';
import type { Config } from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic';
import type { Config } from '@docusaurus/types';
import type { PluginOptions } from 'docusaurus-plugin-typedoc';
import { DOC_FOLDER, packageMap } from './utils/packageMap';
import 'dotenv/config';
import { themes as prismThemes } from 'prism-react-renderer';
import type { TypeDocOptionMap } from 'typedoc';
import { DOC_FOLDER, packageMap } from './utils/packageMap';

const PROJECT_NAME = process.env.GH_PROJECT_NAME;

Expand Down Expand Up @@ -155,8 +155,8 @@ const config: Config = {
darkTheme: prismThemes.dracula
},
future: {
experimental_faster: true,
},
experimental_faster: true
}
} satisfies Preset.ThemeConfig
};

Expand Down
15 changes: 15 additions & 0 deletions packages/common/src/client/AbstractPowerSyncDatabase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ import {
type PowerSyncConnectionOptions,
type RequiredAdditionalConnectionOptions
} from './sync/stream/AbstractStreamingSyncImplementation.js';
import { TriggerManager } from './triggers/TriggerManager.js';
import { TriggerManagerImpl } from './triggers/TriggerManagerImpl.js';
import { DEFAULT_WATCH_THROTTLE_MS, WatchCompatibleQuery } from './watched/WatchedQuery.js';
import { OnChangeQueryProcessor } from './watched/processors/OnChangeQueryProcessor.js';
import { WatchedQueryComparator } from './watched/processors/comparators.js';
Expand Down Expand Up @@ -191,6 +193,12 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB

protected runExclusiveMutex: Mutex;

/**
* @experimental
* Allows creating SQLite triggers which can be used to track various operations on SQLite tables.
*/
readonly triggers: TriggerManager;

logger: ILogger;

constructor(options: PowerSyncDatabaseOptionsWithDBAdapter);
Expand Down Expand Up @@ -226,6 +234,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
this.ready = false;
this.sdkVersion = '';
this.runExclusiveMutex = new Mutex();

// Start async init
this.connectionManager = new ConnectionManager({
createSyncImplementation: async (connector, options) => {
Expand All @@ -252,7 +261,13 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
},
logger: this.logger
});

this._isReadyPromise = this.initialize();

this.triggers = new TriggerManagerImpl({
db: this,
schema: this.schema
});
}

/**
Expand Down
Loading