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.
- package/README.md +66 -0
- package/contracts/PublicKeyRegistry.sol +87 -0
- package/dist/src/access.d.ts +176 -0
- package/dist/src/access.d.ts.map +1 -0
- package/dist/src/access.js +283 -0
- package/dist/src/access.js.map +1 -0
- package/dist/src/batch.d.ts +107 -0
- package/dist/src/batch.d.ts.map +1 -0
- package/dist/src/batch.js +188 -0
- package/dist/src/batch.js.map +1 -0
- package/dist/src/cli.d.ts +40 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +361 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/constraints.d.ts +126 -0
- package/dist/src/constraints.d.ts.map +1 -0
- package/dist/src/constraints.js +192 -0
- package/dist/src/constraints.js.map +1 -0
- package/dist/src/crypto.d.ts +118 -0
- package/dist/src/crypto.d.ts.map +1 -0
- package/dist/src/crypto.js +192 -0
- package/dist/src/crypto.js.map +1 -0
- package/dist/src/factory-client.d.ts +106 -0
- package/dist/src/factory-client.d.ts.map +1 -0
- package/dist/src/factory-client.js +202 -0
- package/dist/src/factory-client.js.map +1 -0
- package/dist/src/index-cache.d.ts +156 -0
- package/dist/src/index-cache.d.ts.map +1 -0
- package/dist/src/index-cache.js +265 -0
- package/dist/src/index-cache.js.map +1 -0
- package/dist/src/index.d.ts +60 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +60 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/migrations.d.ts +114 -0
- package/dist/src/migrations.d.ts.map +1 -0
- package/dist/src/migrations.js +173 -0
- package/dist/src/migrations.js.map +1 -0
- package/dist/src/model.d.ts +198 -0
- package/dist/src/model.d.ts.map +1 -0
- package/dist/src/model.js +379 -0
- package/dist/src/model.js.map +1 -0
- package/dist/src/query.d.ts +155 -0
- package/dist/src/query.d.ts.map +1 -0
- package/dist/src/query.js +386 -0
- package/dist/src/query.js.map +1 -0
- package/dist/src/registry.d.ts +45 -0
- package/dist/src/registry.d.ts.map +1 -0
- package/dist/src/registry.js +80 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/schema-manager.d.ts +109 -0
- package/dist/src/schema-manager.d.ts.map +1 -0
- package/dist/src/schema-manager.js +259 -0
- package/dist/src/schema-manager.js.map +1 -0
- package/dist/src/table-client.d.ts +156 -0
- package/dist/src/table-client.d.ts.map +1 -0
- package/dist/src/table-client.js +292 -0
- package/dist/src/table-client.js.map +1 -0
- package/dist/src/typed-table.d.ts +159 -0
- package/dist/src/typed-table.d.ts.map +1 -0
- package/dist/src/typed-table.js +246 -0
- package/dist/src/typed-table.js.map +1 -0
- package/dist/src/types.d.ts +48 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +222 -0
- package/dist/src/types.js.map +1 -0
- package/keyManager.js +337 -0
- package/package.json +38 -0
- package/src/access.ts +421 -0
- package/src/batch.ts +259 -0
- package/src/cli.ts +349 -0
- package/src/constraints.ts +283 -0
- package/src/crypto.ts +239 -0
- package/src/factory-client.ts +237 -0
- package/src/index-cache.ts +351 -0
- package/src/index.ts +171 -0
- package/src/migrations.ts +215 -0
- package/src/model.ts +538 -0
- package/src/query.ts +508 -0
- package/src/registry.ts +100 -0
- package/src/schema-manager.ts +301 -0
- package/src/table-client.ts +393 -0
- package/src/typed-table.ts +340 -0
- package/src/types.ts +284 -0
- package/tsconfig.json +22 -0
- package/walletUtils.js +204 -0
package/dist/src/cli.js
ADDED
|
@@ -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"}
|