local-lite 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +421 -362
- package/dist/adapters/local/better-sqlite3.d.ts +2 -0
- package/dist/adapters/local/better-sqlite3.js +46 -25
- package/dist/adapters/local/expo-sqlite.d.ts +5 -1
- package/dist/adapters/local/expo-sqlite.js +40 -7
- package/dist/adapters/local/index.d.ts +1 -0
- package/dist/adapters/local/node-sqlite.d.ts +2 -0
- package/dist/adapters/local/node-sqlite.js +45 -22
- package/dist/adapters/local/op-sqlite.d.ts +1 -0
- package/dist/adapters/local/op-sqlite.js +6 -0
- package/dist/adapters/local/sql-js.d.ts +1 -0
- package/dist/adapters/local/sql-js.js +5 -0
- package/dist/adapters/network/index.js +33 -0
- package/dist/adapters/remote/convex.d.ts +2 -2
- package/dist/adapters/remote/convex.js +8 -12
- package/dist/adapters/remote/demo.d.ts +1 -1
- package/dist/adapters/remote/demo.js +3 -0
- package/dist/adapters/remote/firestore.d.ts +3 -2
- package/dist/adapters/remote/firestore.js +69 -46
- package/dist/adapters/remote/index.d.ts +6 -4
- package/dist/adapters/remote/supabase.d.ts +34 -6
- package/dist/adapters/remote/supabase.js +340 -79
- package/dist/config/index.js +7 -10
- package/dist/config/resolve-local.js +12 -1
- package/dist/config/resolve-remote.js +33 -28
- package/dist/config/types.d.ts +30 -5
- package/dist/core/client.d.ts +86 -3
- package/dist/core/client.js +423 -41
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.js +29 -0
- package/dist/core/outbox-store.d.ts +8 -4
- package/dist/core/outbox-store.js +84 -65
- package/dist/core/query.d.ts +8 -0
- package/dist/core/query.js +37 -0
- package/dist/core/schema-manager.d.ts +9 -0
- package/dist/core/schema-manager.js +68 -0
- package/dist/core/sync-worker.d.ts +38 -1
- package/dist/core/sync-worker.js +351 -104
- package/dist/core/table-manager.js +26 -29
- package/dist/core/types.d.ts +8 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -1
- package/dist/react/BenchmarkModal.d.ts +32 -0
- package/dist/react/BenchmarkModal.js +777 -0
- package/dist/react/SyncInspector.d.ts +31 -0
- package/dist/react/SyncInspector.js +655 -0
- package/dist/react/index.d.ts +49 -19
- package/dist/react/index.js +266 -95
- package/dist/react/runner.d.ts +7 -0
- package/dist/react/runner.js +42 -0
- package/dist/react/status.d.ts +24 -0
- package/dist/react/status.js +123 -0
- package/dist/react/theme.d.ts +18 -0
- package/dist/react/theme.js +46 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.js +20 -0
- package/package.json +138 -133
|
@@ -51,8 +51,19 @@ async function resolveLocalAdapter(config) {
|
|
|
51
51
|
// 9. Auto-open by name using expo-sqlite if available
|
|
52
52
|
if (typeof rawDb === 'string' || config.databaseName) {
|
|
53
53
|
const dbName = typeof rawDb === 'string' ? rawDb : (config.databaseName ?? 'local_lite.db');
|
|
54
|
+
let expoSqlite;
|
|
54
55
|
try {
|
|
55
|
-
|
|
56
|
+
if (typeof require === 'function') {
|
|
57
|
+
expoSqlite = require('expo-sqlite');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// ignore
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
if (!expoSqlite) {
|
|
65
|
+
expoSqlite = await import('expo-sqlite');
|
|
66
|
+
}
|
|
56
67
|
if (expoSqlite && typeof expoSqlite.openDatabaseAsync === 'function') {
|
|
57
68
|
const expoDb = await expoSqlite.openDatabaseAsync(dbName);
|
|
58
69
|
return new expo_sqlite_js_1.ExpoSQLiteAdapter(expoDb);
|
|
@@ -35,47 +35,52 @@ async function resolveRemoteAdapter(config) {
|
|
|
35
35
|
updatedAtColumn: config.convex.updatedAtColumn,
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
+
const getSupabaseOptions = () => ({
|
|
39
|
+
tables: config.tables,
|
|
40
|
+
primaryKey: config.primaryKey,
|
|
41
|
+
schema: config.supabase?.schema,
|
|
42
|
+
updatedAtColumn: config.supabase?.updatedAtColumn,
|
|
43
|
+
deletedColumn: config.supabase?.deletedColumn,
|
|
44
|
+
deletedValue: config.supabase?.deletedValue,
|
|
45
|
+
deletedAtColumn: config.supabase?.deletedAtColumn,
|
|
46
|
+
pushRpcName: config.supabase?.pushRpcName,
|
|
47
|
+
channelName: config.supabase?.channelName,
|
|
48
|
+
scopedTables: config.supabase?.scopedTables,
|
|
49
|
+
});
|
|
38
50
|
// 4. Supabase with pre-configured client
|
|
39
51
|
if (config.supabase?.client) {
|
|
40
|
-
return new supabase_js_1.SupabaseRemoteAdapter(config.supabase.client,
|
|
41
|
-
tables: config.tables,
|
|
42
|
-
primaryKey: config.primaryKey,
|
|
43
|
-
schema: config.supabase.schema,
|
|
44
|
-
updatedAtColumn: config.supabase.updatedAtColumn,
|
|
45
|
-
deletedColumn: config.supabase.deletedColumn,
|
|
46
|
-
deletedValue: config.supabase.deletedValue,
|
|
47
|
-
deletedAtColumn: config.supabase.deletedAtColumn,
|
|
48
|
-
pushRpcName: config.supabase.pushRpcName,
|
|
49
|
-
channelName: config.supabase.channelName,
|
|
50
|
-
});
|
|
52
|
+
return new supabase_js_1.SupabaseRemoteAdapter(config.supabase.client, getSupabaseOptions());
|
|
51
53
|
}
|
|
52
54
|
// 5. Supabase with URL + anonKey (lazy dynamic import)
|
|
53
55
|
if (config.supabase?.url && config.supabase?.anonKey) {
|
|
54
56
|
let supabaseModule;
|
|
57
|
+
// In CommonJS / React Native Metro environments, synchronous require avoids async chunk split failure
|
|
55
58
|
try {
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
if (typeof require === 'function') {
|
|
60
|
+
supabaseModule = require('@supabase/supabase-js');
|
|
61
|
+
}
|
|
58
62
|
}
|
|
59
63
|
catch {
|
|
60
|
-
|
|
64
|
+
// ignore
|
|
65
|
+
}
|
|
66
|
+
if (!supabaseModule && typeof globalThis?.supabase?.createClient === 'function') {
|
|
67
|
+
supabaseModule = globalThis.supabase;
|
|
68
|
+
}
|
|
69
|
+
if (!supabaseModule) {
|
|
70
|
+
try {
|
|
71
|
+
supabaseModule = await import('@supabase/supabase-js');
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
throw new Error('To initialize Supabase from url and anonKey, please install @supabase/supabase-js or provide a pre-configured client to config.supabase.client');
|
|
75
|
+
}
|
|
61
76
|
}
|
|
62
77
|
const createClientFn = supabaseModule.createClient || supabaseModule.default?.createClient;
|
|
63
78
|
const supabaseClient = createClientFn(config.supabase.url, config.supabase.anonKey);
|
|
64
|
-
return new supabase_js_1.SupabaseRemoteAdapter(supabaseClient,
|
|
65
|
-
tables: config.tables,
|
|
66
|
-
primaryKey: config.primaryKey,
|
|
67
|
-
schema: config.supabase.schema,
|
|
68
|
-
updatedAtColumn: config.supabase.updatedAtColumn,
|
|
69
|
-
deletedColumn: config.supabase.deletedColumn,
|
|
70
|
-
deletedValue: config.supabase.deletedValue,
|
|
71
|
-
deletedAtColumn: config.supabase.deletedAtColumn,
|
|
72
|
-
pushRpcName: config.supabase.pushRpcName,
|
|
73
|
-
channelName: config.supabase.channelName,
|
|
74
|
-
});
|
|
79
|
+
return new supabase_js_1.SupabaseRemoteAdapter(supabaseClient, getSupabaseOptions());
|
|
75
80
|
}
|
|
76
|
-
// 6.
|
|
77
|
-
if (config.inMemoryRemote
|
|
81
|
+
// 6. Explicitly selected demo backend only; never acknowledge writes into a temporary backend implicitly.
|
|
82
|
+
if (config.inMemoryRemote === true) {
|
|
78
83
|
return new demo_js_1.MemoryDemoRemoteAdapter(300);
|
|
79
84
|
}
|
|
80
|
-
throw new Error('No remote adapter configured. Please specify config.supabase, config.convex, config.firebase, or config.remote.');
|
|
85
|
+
throw new Error('No remote adapter configured. Please specify config.supabase, config.convex, config.firebase, or config.remote. For demos only, explicitly set config.inMemoryRemote: true.');
|
|
81
86
|
}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export interface SupabaseConfigOptions {
|
|
|
13
13
|
deletedAtColumn?: string;
|
|
14
14
|
pushRpcName?: string;
|
|
15
15
|
channelName?: string;
|
|
16
|
+
scopedTables?: string[];
|
|
16
17
|
}
|
|
17
18
|
export interface ConvexConfigOptions {
|
|
18
19
|
/**
|
|
@@ -74,7 +75,7 @@ export interface LocalLiteConfig {
|
|
|
74
75
|
*/
|
|
75
76
|
database?: any | string | (() => Promise<any> | any) | LocalDBAdapter;
|
|
76
77
|
/**
|
|
77
|
-
*
|
|
78
|
+
* Explicit database filename for the Expo convenience opener when database is not provided.
|
|
78
79
|
*/
|
|
79
80
|
databaseName?: string;
|
|
80
81
|
/**
|
|
@@ -89,7 +90,7 @@ export interface LocalLiteConfig {
|
|
|
89
90
|
migrations?: string[];
|
|
90
91
|
/**
|
|
91
92
|
* Automatically create tables and columns dynamically on the fly without manual SQL migrations.
|
|
92
|
-
*
|
|
93
|
+
* Opt-in (default: false). When true, tables in `tables` are created automatically,
|
|
93
94
|
* and any missing columns are added dynamically on insert/update/pull.
|
|
94
95
|
*/
|
|
95
96
|
autoSchema?: boolean;
|
|
@@ -114,9 +115,9 @@ export interface LocalLiteConfig {
|
|
|
114
115
|
*/
|
|
115
116
|
remote?: RemoteDBAdapter;
|
|
116
117
|
/**
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
* Default:
|
|
118
|
+
* Explicitly enable a temporary simulated remote for demos when no backend is provided.
|
|
119
|
+
* Acknowledged writes exist only in memory. Never enabled implicitly.
|
|
120
|
+
* Default: false
|
|
120
121
|
*/
|
|
121
122
|
inMemoryRemote?: boolean;
|
|
122
123
|
/**
|
|
@@ -131,6 +132,12 @@ export interface LocalLiteConfig {
|
|
|
131
132
|
* Periodic remote pull interval in ms. Default: 10000
|
|
132
133
|
*/
|
|
133
134
|
pullIntervalMs?: number;
|
|
135
|
+
/**
|
|
136
|
+
* Automatically pause recurring sync timers and listeners when the app is backgrounded
|
|
137
|
+
* (React Native AppState or Web Page Visibility API), and resume when foregrounded.
|
|
138
|
+
* Default: true
|
|
139
|
+
*/
|
|
140
|
+
autoPauseOnBackground?: boolean;
|
|
134
141
|
/**
|
|
135
142
|
* Maximum retry attempts for failed push items. Default: 5
|
|
136
143
|
*/
|
|
@@ -156,4 +163,22 @@ export interface LocalLiteConfig {
|
|
|
156
163
|
* Default: true
|
|
157
164
|
*/
|
|
158
165
|
autoInitialize?: boolean;
|
|
166
|
+
/**
|
|
167
|
+
* Start automatic sync after initialization. Default: true.
|
|
168
|
+
* Set false to initialize storage and queue writes without timers or subscriptions.
|
|
169
|
+
* Call client.syncWorker.start() to enable automatic sync, or push/pull manually.
|
|
170
|
+
*/
|
|
171
|
+
autoStart?: boolean;
|
|
172
|
+
/**
|
|
173
|
+
* Explicitly configured JSON column map per table name.
|
|
174
|
+
*/
|
|
175
|
+
jsonColumns?: Record<string, string[]>;
|
|
176
|
+
/**
|
|
177
|
+
* Automatically detect and hydrate stringified JSON objects and arrays across all columns.
|
|
178
|
+
*/
|
|
179
|
+
autoHydrateJSON?: boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Scoped synchronization filter (e.g. { business_id: '...' } or dynamic resolver callback).
|
|
182
|
+
*/
|
|
183
|
+
syncScope?: Record<string, any> | (() => Record<string, any> | Promise<Record<string, any>>);
|
|
159
184
|
}
|
package/dist/core/client.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { LocalDBAdapter, LocalTransaction } from '../adapters/local/index.js';
|
|
|
2
2
|
import { RemoteDBAdapter } from '../adapters/remote/index.js';
|
|
3
3
|
import { EventEmitter } from '../reactive/event-emitter.js';
|
|
4
4
|
import { SyncWorker } from './sync-worker.js';
|
|
5
|
-
import { SchemaManager } from './schema-manager.js';
|
|
5
|
+
import { SchemaManager, DBExecutable } from './schema-manager.js';
|
|
6
6
|
import { BatchMutation, ConflictResolver, ConflictStrategy, MutateOptions, NetworkStatusProvider, OutboxRecord, OutboxStatus, QueryOptions, RetryConfig, SyncMetrics, SyncOp, TableChangeEvent } from './types.js';
|
|
7
7
|
import { SyncLogger, CustomLogger, LogLevel } from '../utils/logger.js';
|
|
8
8
|
export interface LocalFirstClientConfig {
|
|
@@ -19,6 +19,13 @@ export interface LocalFirstClientConfig {
|
|
|
19
19
|
logLevel?: LogLevel;
|
|
20
20
|
autoSchema?: boolean;
|
|
21
21
|
tables?: string[];
|
|
22
|
+
migrations?: string[];
|
|
23
|
+
autoStart?: boolean;
|
|
24
|
+
coalesceOutbox?: boolean;
|
|
25
|
+
jsonColumns?: Record<string, string[]>;
|
|
26
|
+
autoHydrateJSON?: boolean;
|
|
27
|
+
syncScope?: Record<string, any> | (() => Record<string, any> | Promise<Record<string, any>>);
|
|
28
|
+
autoPauseOnBackground?: boolean;
|
|
22
29
|
}
|
|
23
30
|
export declare class TransactionalClient {
|
|
24
31
|
private parent;
|
|
@@ -32,7 +39,18 @@ export declare class TransactionalClient {
|
|
|
32
39
|
mutate(tableName: string, rowId: string, operation: SyncOp, payload: Record<string, any> | null, options?: MutateOptions): Promise<void>;
|
|
33
40
|
insert(tableName: string, rowIdOrPayload: string | Record<string, any>, payloadOrOptions?: Record<string, any> | MutateOptions, options?: MutateOptions): Promise<string>;
|
|
34
41
|
update(tableName: string, rowId: string, payload: Record<string, any>, options?: MutateOptions): Promise<void>;
|
|
42
|
+
updateMany(tableName: string, updates: Array<{
|
|
43
|
+
id: string;
|
|
44
|
+
payload: Record<string, any>;
|
|
45
|
+
}>, options?: MutateOptions): Promise<void>;
|
|
35
46
|
delete(tableName: string, rowId: string, options?: MutateOptions): Promise<void>;
|
|
47
|
+
findById<T = any>(tableName: string, id: string, options?: {
|
|
48
|
+
includeDeleted?: boolean;
|
|
49
|
+
}): Promise<T | null>;
|
|
50
|
+
findByIds<T = any>(tableName: string, ids: string[], options?: {
|
|
51
|
+
includeDeleted?: boolean;
|
|
52
|
+
}): Promise<T[]>;
|
|
53
|
+
findMany<T = any>(tableName: string, options?: QueryOptions): Promise<T[]>;
|
|
36
54
|
get rawTx(): LocalTransaction;
|
|
37
55
|
}
|
|
38
56
|
export declare class LocalFirstClient {
|
|
@@ -42,15 +60,32 @@ export declare class LocalFirstClient {
|
|
|
42
60
|
syncWorker: SyncWorker;
|
|
43
61
|
schemaManager: SchemaManager;
|
|
44
62
|
autoSchema: boolean;
|
|
63
|
+
coalesceOutbox: boolean;
|
|
45
64
|
tables: string[];
|
|
65
|
+
jsonColumns: Record<string, string[]>;
|
|
66
|
+
autoHydrateJSON: boolean;
|
|
46
67
|
private primaryKey;
|
|
68
|
+
private migrations;
|
|
69
|
+
private autoStart;
|
|
70
|
+
private initialization?;
|
|
47
71
|
constructor(config: LocalFirstClientConfig);
|
|
48
72
|
getPrimaryKey(): string;
|
|
73
|
+
/**
|
|
74
|
+
* Automatically deserializes JSON string columns into JavaScript objects/arrays.
|
|
75
|
+
*/
|
|
76
|
+
hydrateRow<T = any>(tableName: string, row: any): T;
|
|
77
|
+
/**
|
|
78
|
+
* Writes a mutation to the outbox table, optionally coalescing with existing PENDING records for the same row.
|
|
79
|
+
* Returns the affected outboxId, or undefined if an offline INSERT was deleted offline before pushing.
|
|
80
|
+
*/
|
|
81
|
+
recordOutboxMutation(tx: LocalTransaction, tableName: string, rowId: string, operation: SyncOp, payload: Record<string, any> | null, timestamp: number): Promise<string | undefined>;
|
|
49
82
|
/**
|
|
50
83
|
* Initializes the client: creates sync_outbox schema, ensures autoSchema tables if enabled,
|
|
51
|
-
* and starts
|
|
84
|
+
* applies migrations, and optionally starts automatic sync. Concurrent/repeated calls
|
|
85
|
+
* share initialization; failures can be retried. After stop(), explicitly start the worker.
|
|
52
86
|
*/
|
|
53
87
|
initialize(): Promise<void>;
|
|
88
|
+
private initializeStorage;
|
|
54
89
|
/**
|
|
55
90
|
* Performs an atomic dual-write: mutates the local data table AND writes
|
|
56
91
|
* to sync_outbox within the same database transaction.
|
|
@@ -87,6 +122,20 @@ export declare class LocalFirstClient {
|
|
|
87
122
|
* await client.update('todos', 'todo-1', { completed: 1 });
|
|
88
123
|
*/
|
|
89
124
|
update(tableName: string, rowId: string, payload: Record<string, any>, options?: MutateOptions): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Updates multiple records atomically in a single database transaction.
|
|
127
|
+
* Emits reactive change events and queues outbox entries together.
|
|
128
|
+
*
|
|
129
|
+
* Example:
|
|
130
|
+
* await client.updateMany('todos', [
|
|
131
|
+
* { id: 'todo-1', payload: { completed: 1 } },
|
|
132
|
+
* { id: 'todo-2', payload: { completed: 1 } },
|
|
133
|
+
* ]);
|
|
134
|
+
*/
|
|
135
|
+
updateMany(tableName: string, updates: Array<{
|
|
136
|
+
id: string;
|
|
137
|
+
payload: Record<string, any>;
|
|
138
|
+
}>, options?: MutateOptions): Promise<void>;
|
|
90
139
|
/**
|
|
91
140
|
* Convenience helper to delete a record by ID.
|
|
92
141
|
*
|
|
@@ -97,6 +146,7 @@ export declare class LocalFirstClient {
|
|
|
97
146
|
/**
|
|
98
147
|
* Reads records from a local SQLite table without requiring manual SQL.
|
|
99
148
|
* Supports where filtering with rich operators ($in, $gt, $contains, $or, etc.), order, limit, and offset.
|
|
149
|
+
* Pushes simple equality where clauses down to SQLite for high performance, with memory fallback.
|
|
100
150
|
* Gracefully returns [] if table or columns have not been populated yet on empty schemas.
|
|
101
151
|
*
|
|
102
152
|
* Example:
|
|
@@ -104,13 +154,30 @@ export declare class LocalFirstClient {
|
|
|
104
154
|
* const expensive = await client.findMany('properties', { where: { rent: { $gte: 2000 } } });
|
|
105
155
|
*/
|
|
106
156
|
findMany<T = any>(tableName: string, options?: QueryOptions): Promise<T[]>;
|
|
157
|
+
/**
|
|
158
|
+
* Internal findMany implementation shared between LocalFirstClient and TransactionalClient.
|
|
159
|
+
*/
|
|
160
|
+
findManyInternal<T = any>(db: DBExecutable, tableName: string, options?: QueryOptions): Promise<T[]>;
|
|
107
161
|
/**
|
|
108
162
|
* Finds a single record by primary key.
|
|
109
163
|
*
|
|
110
164
|
* Example:
|
|
111
165
|
* const tenant = await client.findById('tenants', 'ten-1');
|
|
112
166
|
*/
|
|
113
|
-
findById<T = any>(tableName: string, id: string
|
|
167
|
+
findById<T = any>(tableName: string, id: string, options?: {
|
|
168
|
+
includeDeleted?: boolean;
|
|
169
|
+
}): Promise<T | null>;
|
|
170
|
+
/**
|
|
171
|
+
* Finds multiple records by primary keys in a single batched SQL query.
|
|
172
|
+
* Eliminates the N-roundtrip bridge overhead of multiple findById calls.
|
|
173
|
+
* Automatically omits soft-deleted records unless includeDeleted: true.
|
|
174
|
+
*
|
|
175
|
+
* Example:
|
|
176
|
+
* const tenants = await client.findByIds('tenants', ['ten-1', 'ten-2', 'ten-3']);
|
|
177
|
+
*/
|
|
178
|
+
findByIds<T = any>(tableName: string, ids: string[], options?: {
|
|
179
|
+
includeDeleted?: boolean;
|
|
180
|
+
}): Promise<T[]>;
|
|
114
181
|
/**
|
|
115
182
|
* Tracks an existing mutation into sync_outbox without modifying the table.
|
|
116
183
|
* Can accept an external transaction `options.tx` for custom atomic SQL workflows.
|
|
@@ -146,8 +213,24 @@ export declare class LocalFirstClient {
|
|
|
146
213
|
* to query all remote records.
|
|
147
214
|
*/
|
|
148
215
|
resetSyncCursor(): Promise<void>;
|
|
216
|
+
/**
|
|
217
|
+
* Dynamically sets or updates the active sync scope.
|
|
218
|
+
*/
|
|
219
|
+
setSyncScope(scope?: Record<string, any> | (() => Record<string, any> | Promise<Record<string, any>>)): void;
|
|
149
220
|
/**
|
|
150
221
|
* Stops all active intervals, background sync loops, and network listeners.
|
|
151
222
|
*/
|
|
152
223
|
stop(): void;
|
|
224
|
+
/**
|
|
225
|
+
* Stops background sync workers, cleans up remote listeners,
|
|
226
|
+
* and closes the local database adapter connection (releasing native locks).
|
|
227
|
+
*/
|
|
228
|
+
close(): Promise<void>;
|
|
229
|
+
/**
|
|
230
|
+
* Resets local state by stopping sync and deleting or dropping all managed tables,
|
|
231
|
+
* clearing the sync_outbox and _sync_meta stores, and resetting the sync cursor.
|
|
232
|
+
*/
|
|
233
|
+
reset(options?: {
|
|
234
|
+
dropTables?: boolean;
|
|
235
|
+
}): Promise<void>;
|
|
153
236
|
}
|