web3ql-client 1.2.0

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.
Files changed (86) hide show
  1. package/README.md +66 -0
  2. package/contracts/PublicKeyRegistry.sol +87 -0
  3. package/dist/src/access.d.ts +176 -0
  4. package/dist/src/access.d.ts.map +1 -0
  5. package/dist/src/access.js +283 -0
  6. package/dist/src/access.js.map +1 -0
  7. package/dist/src/batch.d.ts +107 -0
  8. package/dist/src/batch.d.ts.map +1 -0
  9. package/dist/src/batch.js +188 -0
  10. package/dist/src/batch.js.map +1 -0
  11. package/dist/src/cli.d.ts +40 -0
  12. package/dist/src/cli.d.ts.map +1 -0
  13. package/dist/src/cli.js +361 -0
  14. package/dist/src/cli.js.map +1 -0
  15. package/dist/src/constraints.d.ts +126 -0
  16. package/dist/src/constraints.d.ts.map +1 -0
  17. package/dist/src/constraints.js +192 -0
  18. package/dist/src/constraints.js.map +1 -0
  19. package/dist/src/crypto.d.ts +118 -0
  20. package/dist/src/crypto.d.ts.map +1 -0
  21. package/dist/src/crypto.js +192 -0
  22. package/dist/src/crypto.js.map +1 -0
  23. package/dist/src/factory-client.d.ts +106 -0
  24. package/dist/src/factory-client.d.ts.map +1 -0
  25. package/dist/src/factory-client.js +202 -0
  26. package/dist/src/factory-client.js.map +1 -0
  27. package/dist/src/index-cache.d.ts +156 -0
  28. package/dist/src/index-cache.d.ts.map +1 -0
  29. package/dist/src/index-cache.js +265 -0
  30. package/dist/src/index-cache.js.map +1 -0
  31. package/dist/src/index.d.ts +60 -0
  32. package/dist/src/index.d.ts.map +1 -0
  33. package/dist/src/index.js +60 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/migrations.d.ts +114 -0
  36. package/dist/src/migrations.d.ts.map +1 -0
  37. package/dist/src/migrations.js +173 -0
  38. package/dist/src/migrations.js.map +1 -0
  39. package/dist/src/model.d.ts +198 -0
  40. package/dist/src/model.d.ts.map +1 -0
  41. package/dist/src/model.js +379 -0
  42. package/dist/src/model.js.map +1 -0
  43. package/dist/src/query.d.ts +155 -0
  44. package/dist/src/query.d.ts.map +1 -0
  45. package/dist/src/query.js +386 -0
  46. package/dist/src/query.js.map +1 -0
  47. package/dist/src/registry.d.ts +45 -0
  48. package/dist/src/registry.d.ts.map +1 -0
  49. package/dist/src/registry.js +80 -0
  50. package/dist/src/registry.js.map +1 -0
  51. package/dist/src/schema-manager.d.ts +109 -0
  52. package/dist/src/schema-manager.d.ts.map +1 -0
  53. package/dist/src/schema-manager.js +259 -0
  54. package/dist/src/schema-manager.js.map +1 -0
  55. package/dist/src/table-client.d.ts +156 -0
  56. package/dist/src/table-client.d.ts.map +1 -0
  57. package/dist/src/table-client.js +292 -0
  58. package/dist/src/table-client.js.map +1 -0
  59. package/dist/src/typed-table.d.ts +159 -0
  60. package/dist/src/typed-table.d.ts.map +1 -0
  61. package/dist/src/typed-table.js +246 -0
  62. package/dist/src/typed-table.js.map +1 -0
  63. package/dist/src/types.d.ts +48 -0
  64. package/dist/src/types.d.ts.map +1 -0
  65. package/dist/src/types.js +222 -0
  66. package/dist/src/types.js.map +1 -0
  67. package/keyManager.js +337 -0
  68. package/package.json +38 -0
  69. package/src/access.ts +421 -0
  70. package/src/batch.ts +259 -0
  71. package/src/cli.ts +349 -0
  72. package/src/constraints.ts +283 -0
  73. package/src/crypto.ts +239 -0
  74. package/src/factory-client.ts +237 -0
  75. package/src/index-cache.ts +351 -0
  76. package/src/index.ts +171 -0
  77. package/src/migrations.ts +215 -0
  78. package/src/model.ts +538 -0
  79. package/src/query.ts +508 -0
  80. package/src/registry.ts +100 -0
  81. package/src/schema-manager.ts +301 -0
  82. package/src/table-client.ts +393 -0
  83. package/src/typed-table.ts +340 -0
  84. package/src/types.ts +284 -0
  85. package/tsconfig.json +22 -0
  86. package/walletUtils.js +204 -0
@@ -0,0 +1,361 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @file cli.ts
4
+ * @notice Web3QL CLI — manage databases, tables, and records from the terminal.
5
+ *
6
+ * Install globally:
7
+ * npm install -g @web3ql/sdk
8
+ * web3ql --help
9
+ *
10
+ * Or run via npx:
11
+ * npx @web3ql/sdk <command>
12
+ *
13
+ * Requires a .env file (or env vars):
14
+ * PRIVATE_KEY=0x...
15
+ * RPC_URL=https://...
16
+ * FACTORY_ADDRESS=0x...
17
+ * REGISTRY_ADDRESS=0x...
18
+ *
19
+ * ─────────────────────────────────────────────────────────────
20
+ * Commands
21
+ * ─────────────────────────────────────────────────────────────
22
+ * web3ql db list — list your databases
23
+ * web3ql db create <name> — create a new database
24
+ *
25
+ * web3ql table list <dbAddress> — list tables in a database
26
+ * web3ql table create <dbAddress> "<SQL>" — create table from SQL
27
+ * web3ql table schema <tableAddress> — print schema for a table
28
+ *
29
+ * web3ql record write <tableAddress> <id> '<json>' — write a record
30
+ * web3ql record read <tableAddress> <id> — read + decrypt a record
31
+ * web3ql record list <tableAddress> — list your records
32
+ * web3ql record delete <tableAddress> <id> — delete a record
33
+ *
34
+ * web3ql query <tableAddress> --where "age > 18" --order "name asc" --limit 10
35
+ *
36
+ * web3ql info — show connected wallet + factory
37
+ * ─────────────────────────────────────────────────────────────
38
+ */
39
+ import { ethers } from 'ethers';
40
+ import { Web3QLClient } from './factory-client.js';
41
+ import { deriveKeypairFromWallet } from './crypto.js';
42
+ // ─────────────────────────────────────────────────────────────
43
+ // Env + provider setup
44
+ // ─────────────────────────────────────────────────────────────
45
+ function requireEnv(name) {
46
+ const v = process.env[name];
47
+ if (!v) {
48
+ console.error(`\x1b[31mError:\x1b[0m Missing environment variable: ${name}`);
49
+ process.exit(1);
50
+ }
51
+ return v;
52
+ }
53
+ async function setup() {
54
+ // Support .env file via dotenvx if available
55
+ try {
56
+ const { config } = await import('@dotenvx/dotenvx');
57
+ config({ quiet: true });
58
+ }
59
+ catch { /* no dotenvx installed — rely on process.env */ }
60
+ const privateKey = requireEnv('PRIVATE_KEY');
61
+ const rpcUrl = requireEnv('RPC_URL');
62
+ const factory = requireEnv('FACTORY_ADDRESS');
63
+ const registry = process.env['REGISTRY_ADDRESS'] ?? '';
64
+ const provider = new ethers.JsonRpcProvider(rpcUrl);
65
+ const signer = new ethers.Wallet(privateKey, provider);
66
+ const keypair = await deriveKeypairFromWallet(signer);
67
+ const client = new Web3QLClient(factory, signer, keypair, registry);
68
+ const address = await signer.getAddress();
69
+ return { client, signer, keypair, address, factory, registry };
70
+ }
71
+ // ─────────────────────────────────────────────────────────────
72
+ // Formatting helpers
73
+ // ─────────────────────────────────────────────────────────────
74
+ const C = {
75
+ reset: '\x1b[0m',
76
+ bold: '\x1b[1m',
77
+ dim: '\x1b[2m',
78
+ green: '\x1b[32m',
79
+ cyan: '\x1b[36m',
80
+ yellow: '\x1b[33m',
81
+ red: '\x1b[31m',
82
+ };
83
+ function head(text) {
84
+ console.log(`\n${C.bold}${C.cyan}${text}${C.reset}`);
85
+ }
86
+ function ok(text) { console.log(`${C.green}✔${C.reset} ${text}`); }
87
+ function info(text) { console.log(`${C.dim}${text}${C.reset}`); }
88
+ function row(label, value) {
89
+ console.log(` ${C.bold}${label.padEnd(16)}${C.reset} ${value}`);
90
+ }
91
+ function shortAddr(addr) {
92
+ return `${addr.slice(0, 6)}…${addr.slice(-4)}`;
93
+ }
94
+ // ─────────────────────────────────────────────────────────────
95
+ // Command handlers
96
+ // ─────────────────────────────────────────────────────────────
97
+ async function cmdInfo() {
98
+ const { address, factory, registry } = await setup();
99
+ head('Web3QL — connection info');
100
+ row('Wallet', address);
101
+ row('Factory', factory);
102
+ row('Registry', registry ?? '(not set)');
103
+ console.log();
104
+ }
105
+ async function cmdDbList() {
106
+ const { client, address } = await setup();
107
+ head('Your databases');
108
+ const dbs = await client.getDatabases(address);
109
+ if (!dbs.length) {
110
+ info('No databases found.');
111
+ return;
112
+ }
113
+ dbs.forEach((addr, i) => {
114
+ console.log(` ${C.cyan}${i + 1}.${C.reset} ${addr}`);
115
+ });
116
+ console.log();
117
+ }
118
+ async function cmdDbCreate(name) {
119
+ const { client } = await setup();
120
+ head(`Creating database: ${name}`);
121
+ const db = await client.createDatabase(name);
122
+ ok(`Deployed! Address: ${db.address}`);
123
+ }
124
+ async function cmdTableList(dbAddress) {
125
+ const { client } = await setup();
126
+ head(`Tables in ${shortAddr(dbAddress)}`);
127
+ const db = client.database(dbAddress);
128
+ const tables = await db.listTables();
129
+ if (!tables.length) {
130
+ info('No tables.');
131
+ return;
132
+ }
133
+ tables.forEach((t, i) => {
134
+ console.log(` ${C.cyan}${i + 1}.${C.reset} ${t}`);
135
+ });
136
+ console.log();
137
+ }
138
+ async function cmdTableCreate(dbAddress, sql) {
139
+ const { client } = await setup();
140
+ head('Creating table');
141
+ info(sql);
142
+ // For CLI, pass empty schemaBytes — user should compile schema separately
143
+ const db = client.database(dbAddress);
144
+ // Extract table name from SQL for the name param
145
+ const nameMatch = sql.match(/CREATE\s+TABLE\s+([a-zA-Z_][a-zA-Z0-9_]*)/i);
146
+ const tableName = nameMatch?.[1] ?? 'table';
147
+ const addr = await db.createTable(tableName, '0x');
148
+ ok(`Table created! Address: ${addr}`);
149
+ }
150
+ async function cmdTableSchema(tableAddress) {
151
+ const { client } = await setup();
152
+ const { signer, keypair } = await setup();
153
+ const { EncryptedTableClient } = await import('./table-client.js');
154
+ const table = new EncryptedTableClient(tableAddress, signer, keypair);
155
+ head(`Schema — ${shortAddr(tableAddress)}`);
156
+ try {
157
+ const schemaHex = await table.getSchema();
158
+ if (!schemaHex || schemaHex === '0x') {
159
+ info('No schema found.');
160
+ return;
161
+ }
162
+ const bytes = Buffer.from(schemaHex.slice(2), 'hex');
163
+ console.log(bytes.toString('utf8'));
164
+ }
165
+ catch {
166
+ info('Schema not available (table may use raw bytes storage).');
167
+ }
168
+ }
169
+ async function cmdRecordWrite(tableAddress, id, jsonStr) {
170
+ const { signer, keypair } = await setup();
171
+ const { EncryptedTableClient } = await import('./table-client.js');
172
+ const table = new EncryptedTableClient(tableAddress, signer, keypair);
173
+ const data = JSON.parse(jsonStr);
174
+ head(`Writing record ${id} → ${shortAddr(tableAddress)}`);
175
+ const key = table.deriveKey(tableAddress, id);
176
+ const receipt = await table.writeRaw(key, JSON.stringify(data));
177
+ ok(`Written! Tx: ${receipt.hash}`);
178
+ }
179
+ async function cmdRecordRead(tableAddress, id) {
180
+ const { signer, keypair } = await setup();
181
+ const { EncryptedTableClient } = await import('./table-client.js');
182
+ const table = new EncryptedTableClient(tableAddress, signer, keypair);
183
+ head(`Record ${id} — ${shortAddr(tableAddress)}`);
184
+ try {
185
+ const key = table.deriveKey(tableAddress, id);
186
+ const plaintext = await table.readPlaintext(key);
187
+ console.log(JSON.stringify(JSON.parse(plaintext), null, 2));
188
+ }
189
+ catch (e) {
190
+ console.error(`${C.red}Error:${C.reset}`, e.message);
191
+ }
192
+ }
193
+ async function cmdRecordList(tableAddress, limitN = 20) {
194
+ const { signer, keypair, address } = await setup();
195
+ const { EncryptedTableClient } = await import('./table-client.js');
196
+ const table = new EncryptedTableClient(tableAddress, signer, keypair);
197
+ head(`Records owned by ${shortAddr(address)} in ${shortAddr(tableAddress)}`);
198
+ const keys = await table.listOwnerRecords(address, 0n, BigInt(limitN));
199
+ if (!keys.length) {
200
+ info('No records.');
201
+ return;
202
+ }
203
+ for (const key of keys) {
204
+ try {
205
+ const plain = await table.readPlaintext(key);
206
+ const parsed = JSON.parse(plain);
207
+ console.log(`\n ${C.cyan}Key:${C.reset} ${key}`);
208
+ console.log(' ' + JSON.stringify(parsed));
209
+ }
210
+ catch { /* skip unreadable */ }
211
+ }
212
+ console.log();
213
+ }
214
+ async function cmdRecordDelete(tableAddress, id) {
215
+ const { signer, keypair } = await setup();
216
+ const { EncryptedTableClient } = await import('./table-client.js');
217
+ const table = new EncryptedTableClient(tableAddress, signer, keypair);
218
+ head(`Deleting record ${id}`);
219
+ const key = table.deriveKey(tableAddress, id);
220
+ const receipt = await table.deleteRecord(key);
221
+ ok(`Deleted! Tx: ${receipt.hash}`);
222
+ }
223
+ // ─────────────────────────────────────────────────────────────
224
+ // Help
225
+ // ─────────────────────────────────────────────────────────────
226
+ function printHelp() {
227
+ console.log(`
228
+ ${C.bold}${C.cyan}Web3QL CLI${C.reset} — on-chain encrypted database management
229
+
230
+ ${C.bold}USAGE${C.reset}
231
+ web3ql <command> [options]
232
+
233
+ ${C.bold}COMMANDS${C.reset}
234
+ ${C.green}info${C.reset} Show wallet + factory info
235
+ ${C.green}db list${C.reset} List your databases
236
+ ${C.green}db create <name>${C.reset} Deploy a new database
237
+ ${C.green}table list <dbAddress>${C.reset} List tables in a database
238
+ ${C.green}table create <dbAddress> "<SQL>"${C.reset} Create a table from SQL
239
+ ${C.green}table schema <tableAddress>${C.reset} Print table schema
240
+ ${C.green}record write <table> <id> '<json>'${C.reset} Write an encrypted record
241
+ ${C.green}record read <table> <id>${C.reset} Read + decrypt a record
242
+ ${C.green}record list <table> [limit]${C.reset} List your records
243
+ ${C.green}record delete <table> <id>${C.reset} Soft-delete a record
244
+
245
+ ${C.bold}ENV VARS${C.reset}
246
+ PRIVATE_KEY Ethereum private key (0x...)
247
+ RPC_URL JSON-RPC endpoint
248
+ FACTORY_ADDRESS Web3QL factory contract address
249
+ REGISTRY_ADDRESS Public key registry address (optional)
250
+
251
+ ${C.bold}EXAMPLE${C.reset}
252
+ export PRIVATE_KEY=0xabc...
253
+ export RPC_URL=https://forno.celo.org
254
+ export FACTORY_ADDRESS=0x2cfE...
255
+ web3ql info
256
+ web3ql db create myapp
257
+ web3ql table list 0xDB_ADDR
258
+ `);
259
+ }
260
+ // ─────────────────────────────────────────────────────────────
261
+ // Argument router
262
+ // ─────────────────────────────────────────────────────────────
263
+ async function main() {
264
+ const args = process.argv.slice(2);
265
+ const cmd = args[0];
266
+ try {
267
+ if (!cmd || cmd === '--help' || cmd === '-h') {
268
+ printHelp();
269
+ return;
270
+ }
271
+ if (cmd === 'info') {
272
+ await cmdInfo();
273
+ return;
274
+ }
275
+ if (cmd === 'db') {
276
+ const sub = args[1];
277
+ if (sub === 'list') {
278
+ await cmdDbList();
279
+ return;
280
+ }
281
+ if (sub === 'create') {
282
+ if (!args[2]) {
283
+ console.error('Usage: web3ql db create <name>');
284
+ process.exit(1);
285
+ }
286
+ await cmdDbCreate(args[2]);
287
+ return;
288
+ }
289
+ }
290
+ if (cmd === 'table') {
291
+ const sub = args[1];
292
+ if (sub === 'list') {
293
+ if (!args[2]) {
294
+ console.error('Usage: web3ql table list <dbAddress>');
295
+ process.exit(1);
296
+ }
297
+ await cmdTableList(args[2]);
298
+ return;
299
+ }
300
+ if (sub === 'create') {
301
+ if (!args[2] || !args[3]) {
302
+ console.error('Usage: web3ql table create <dbAddress> "<SQL>"');
303
+ process.exit(1);
304
+ }
305
+ await cmdTableCreate(args[2], args[3]);
306
+ return;
307
+ }
308
+ if (sub === 'schema') {
309
+ if (!args[2]) {
310
+ console.error('Usage: web3ql table schema <tableAddress>');
311
+ process.exit(1);
312
+ }
313
+ await cmdTableSchema(args[2]);
314
+ return;
315
+ }
316
+ }
317
+ if (cmd === 'record') {
318
+ const sub = args[1];
319
+ if (sub === 'write') {
320
+ if (!args[2] || !args[3] || !args[4]) {
321
+ console.error('Usage: web3ql record write <table> <id> \'<json>\'');
322
+ process.exit(1);
323
+ }
324
+ await cmdRecordWrite(args[2], BigInt(args[3]), args[4]);
325
+ return;
326
+ }
327
+ if (sub === 'read') {
328
+ if (!args[2] || !args[3]) {
329
+ console.error('Usage: web3ql record read <table> <id>');
330
+ process.exit(1);
331
+ }
332
+ await cmdRecordRead(args[2], BigInt(args[3]));
333
+ return;
334
+ }
335
+ if (sub === 'list') {
336
+ if (!args[2]) {
337
+ console.error('Usage: web3ql record list <table> [limit]');
338
+ process.exit(1);
339
+ }
340
+ await cmdRecordList(args[2], args[3] ? parseInt(args[3]) : 20);
341
+ return;
342
+ }
343
+ if (sub === 'delete') {
344
+ if (!args[2] || !args[3]) {
345
+ console.error('Usage: web3ql record delete <table> <id>');
346
+ process.exit(1);
347
+ }
348
+ await cmdRecordDelete(args[2], BigInt(args[3]));
349
+ return;
350
+ }
351
+ }
352
+ console.error(`${C.red}Unknown command:${C.reset} ${cmd}\nRun \`web3ql --help\` for usage.`);
353
+ process.exit(1);
354
+ }
355
+ catch (err) {
356
+ console.error(`${C.red}Error:${C.reset}`, err.message);
357
+ process.exit(1);
358
+ }
359
+ }
360
+ main();
361
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @file constraints.ts
3
+ * @notice Web3QL v1.2 — integrity constraint engine.
4
+ *
5
+ * Constraints live in the SDK layer (off-chain) with the following guarantees:
6
+ *
7
+ * • PRIMARY KEY uniqueness — contract enforces at write (requires exists() pre-check)
8
+ * • UNIQUE — SDK maintains an in-memory seen-values set per column
9
+ * • DEFAULT / NOT NULL — enforced by types.ts validateAndEncode()
10
+ * • CHECK — per-column validation function
11
+ * • FOREIGN KEY — SDK reads target table at write time
12
+ * • AUTO_INCREMENT — SDK-maintained counter (persisted in a meta record)
13
+ * • ON DELETE CASCADE — SDK fetches referencing records and deletes them
14
+ *
15
+ * None of these require contract changes for CHECK/UNIQUE (client-side enforcement).
16
+ * PK uniqueness IS enforced at the contract level via `recordExists`.
17
+ *
18
+ * Usage:
19
+ * ─────────────────────────────────────────────────────────────
20
+ * const constraints = new ConstraintEngine([
21
+ * { type: 'unique', column: 'email' },
22
+ * { type: 'check', column: 'age', check: (v) => Number(v) >= 0 },
23
+ * { type: 'fk', column: 'userId', references: { table: userTable, column: 'id' } },
24
+ * ]);
25
+ *
26
+ * // Before writing:
27
+ * await constraints.validate(row, existingRows);
28
+ *
29
+ * // Get next AUTO_INCREMENT id:
30
+ * const nextId = await constraints.nextId(tableAddress, client);
31
+ * ─────────────────────────────────────────────────────────────
32
+ */
33
+ import type { EncryptedTableClient } from './table-client.js';
34
+ export interface UniqueConstraint {
35
+ type: 'unique';
36
+ column: string;
37
+ }
38
+ export interface CheckConstraint {
39
+ type: 'check';
40
+ column: string;
41
+ /** Return true if the value is valid. Throw or return false to reject. */
42
+ check: (value: unknown, row: Record<string, unknown>) => boolean | Promise<boolean>;
43
+ /** Optional human-readable constraint name for error messages. */
44
+ name?: string;
45
+ }
46
+ export interface ForeignKeyConstraint {
47
+ type: 'fk';
48
+ column: string;
49
+ references: {
50
+ /** EncryptedTableClient for the target table. */
51
+ table: EncryptedTableClient;
52
+ /** Column in the target table that holds the referenced key. */
53
+ column: string;
54
+ /** Table name — needed to derive the bytes32 key. */
55
+ tableName: string;
56
+ };
57
+ /** What to do when the referenced record is deleted. Default: 'restrict' */
58
+ onDelete?: 'restrict' | 'cascade' | 'setNull';
59
+ }
60
+ export interface NotNullConstraint {
61
+ type: 'notNull';
62
+ column: string;
63
+ }
64
+ export type Constraint = UniqueConstraint | CheckConstraint | ForeignKeyConstraint | NotNullConstraint;
65
+ export declare class ConstraintViolation extends Error {
66
+ readonly constraintType: string;
67
+ readonly column: string;
68
+ constructor(constraintType: string, column: string, message: string);
69
+ }
70
+ export declare class ConstraintEngine {
71
+ private constraints;
72
+ constructor(constraints?: Constraint[]);
73
+ /**
74
+ * Validate a new/updated row against all constraints.
75
+ *
76
+ * @param row The row being written (fully encoded, post validateAndEncode).
77
+ * @param existingRows Already-decoded rows from the same table (for UNIQUE checks).
78
+ * Pass an empty array if fetching is not possible.
79
+ */
80
+ validate(row: Record<string, unknown>, existingRows?: Record<string, unknown>[]): Promise<void>;
81
+ private _checkNotNull;
82
+ private _checkUnique;
83
+ private _checkCheck;
84
+ private _checkForeignKey;
85
+ /**
86
+ * ON DELETE CASCADE — delete all records in this table that reference
87
+ * the deleted row in the foreign-key column.
88
+ *
89
+ * @param deletedValue The primary-key value of the deleted parent record.
90
+ * @param fkColumn The column in this table that holds the FK.
91
+ * @param ownedRecords All decoded records in this table (to find referencing rows).
92
+ * @param deleteRecord Callback to actually delete a record by its bytes32 key.
93
+ */
94
+ onDeleteCascade(deletedValue: unknown, fkColumn: string, ownedRecords: {
95
+ key: string;
96
+ data: Record<string, unknown>;
97
+ }[], deleteRecord: (key: string) => Promise<unknown>): Promise<void>;
98
+ }
99
+ /**
100
+ * Client-side AUTO_INCREMENT counter backed by a special meta record on-chain.
101
+ *
102
+ * The counter is stored as a JSON record encrypted for the table owner under
103
+ * the key `keccak256("__auto_increment__" + tableName)`.
104
+ *
105
+ * ⚠ This is NOT atomic across multiple concurrent writers.
106
+ * For single-writer tables (personal data), it is safe.
107
+ * For multi-writer tables, use a relay-maintained counter (v1.2).
108
+ */
109
+ export declare class AutoIncrementCounter {
110
+ private tableName;
111
+ private client;
112
+ private metaKey;
113
+ constructor(tableName: string, client: EncryptedTableClient);
114
+ /**
115
+ * Read the current counter value. Returns 0 if not yet initialised.
116
+ */
117
+ current(): Promise<bigint>;
118
+ /**
119
+ * Atomically increment and return the next ID.
120
+ * Reads current → increments → writes new value → returns incremented.
121
+ */
122
+ next(): Promise<bigint>;
123
+ /** Reset the counter (use with caution — may cause PK collisions). */
124
+ reset(to?: bigint): Promise<void>;
125
+ }
126
+ //# sourceMappingURL=constraints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints.d.ts","sourceRoot":"","sources":["../../src/constraints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAM9D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAI,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAI,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,KAAK,EAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrF,kEAAkE;IAClE,IAAI,CAAC,EAAG,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAQ,IAAI,CAAC;IACjB,MAAM,EAAM,MAAM,CAAC;IACnB,UAAU,EAAE;QACV,iDAAiD;QACjD,KAAK,EAAG,oBAAoB,CAAC;QAC7B,gEAAgE;QAChE,MAAM,EAAE,MAAM,CAAC;QACf,qDAAqD;QACrD,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAI,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,UAAU,GAClB,gBAAgB,GAChB,eAAe,GACf,oBAAoB,GACpB,iBAAiB,CAAC;AAMtB,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,cAAc,EAAE,MAAM;aACtB,MAAM,EAAU,MAAM;gBADtB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAU,MAAM,EACtC,OAAO,EAAE,MAAM;CAKlB;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAe;gBAEtB,WAAW,GAAE,UAAU,EAAO;IAI1C;;;;;;OAMG;IACG,QAAQ,CACZ,GAAG,EAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAO,GAC5C,OAAO,CAAC,IAAI,CAAC;IAmBhB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,YAAY;YAiBN,WAAW;YAWX,gBAAgB;IAkB9B;;;;;;;;OAQG;IACG,eAAe,CACnB,YAAY,EAAG,OAAO,EACtB,QAAQ,EAAO,MAAM,EACrB,YAAY,EAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,EAC/D,YAAY,EAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC/C,OAAO,CAAC,IAAI,CAAC;CAQjB;AAMD;;;;;;;;;GASG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAW;gBAEd,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB;IAM3D;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAYhC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAc7B,sEAAsE;IAChE,KAAK,CAAC,EAAE,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAS5C"}