@shaxpir/squilt 1.0.0 → 1.1.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 +289 -1
- package/dist/ast/AlterTableQuery.d.ts +32 -0
- package/dist/ast/AlterTableQuery.js +60 -0
- package/dist/ast/BetweenExpression.d.ts +10 -0
- package/dist/ast/BetweenExpression.js +18 -0
- package/dist/ast/CastExpression.d.ts +13 -0
- package/dist/ast/CastExpression.js +25 -0
- package/dist/ast/CollateExpression.d.ts +18 -0
- package/dist/ast/CollateExpression.js +30 -0
- package/dist/ast/CreateIndexQuery.d.ts +25 -0
- package/dist/ast/CreateIndexQuery.js +64 -0
- package/dist/ast/CreateTableQuery.d.ts +57 -0
- package/dist/ast/CreateTableQuery.js +79 -0
- package/dist/ast/CreateViewQuery.d.ts +34 -0
- package/dist/ast/CreateViewQuery.js +61 -0
- package/dist/ast/CreateVirtualTableQuery.d.ts +32 -0
- package/dist/ast/CreateVirtualTableQuery.js +74 -0
- package/dist/ast/DeleteQuery.d.ts +17 -0
- package/dist/ast/DeleteQuery.js +43 -0
- package/dist/ast/DropIndexQuery.d.ts +14 -0
- package/dist/ast/DropIndexQuery.js +35 -0
- package/dist/ast/DropTableQuery.d.ts +14 -0
- package/dist/ast/DropTableQuery.js +35 -0
- package/dist/ast/DropViewQuery.d.ts +11 -0
- package/dist/ast/DropViewQuery.js +24 -0
- package/dist/ast/FunctionExpression.d.ts +21 -0
- package/dist/ast/FunctionExpression.js +40 -1
- package/dist/ast/FunctionName.d.ts +1 -1
- package/dist/ast/FunctionName.js +1 -1
- package/dist/ast/InsertQuery.d.ts +24 -1
- package/dist/ast/InsertQuery.js +49 -1
- package/dist/ast/Operator.d.ts +2 -0
- package/dist/ast/Operator.js +3 -1
- package/dist/ast/SelectQuery.d.ts +4 -0
- package/dist/ast/SelectQuery.js +11 -1
- package/dist/ast/SubqueryExpression.d.ts +18 -0
- package/dist/ast/SubqueryExpression.js +27 -0
- package/dist/ast/UpdateQuery.d.ts +24 -0
- package/dist/ast/UpdateQuery.js +51 -0
- package/dist/ast/WindowExpression.d.ts +51 -0
- package/dist/ast/WindowExpression.js +61 -0
- package/dist/ast/WindowSpecification.d.ts +46 -0
- package/dist/ast/WindowSpecification.js +60 -0
- package/dist/builder/QueryBuilder.d.ts +20 -0
- package/dist/builder/QueryBuilder.js +41 -1
- package/dist/builder/Shorthand.d.ts +51 -0
- package/dist/builder/Shorthand.js +125 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.js +59 -3
- package/dist/renderer/CompactQueryRenderer.d.ts +34 -2
- package/dist/renderer/CompactQueryRenderer.js +272 -2
- package/dist/renderer/IndentedQueryRenderer.d.ts +34 -2
- package/dist/renderer/IndentedQueryRenderer.js +289 -3
- package/dist/renderer/QueryRenderer.d.ts +11 -1
- package/dist/renderer/QueryRenderer.js +1 -1
- package/dist/validate/CommonQueryValidator.d.ts +31 -1
- package/dist/validate/CommonQueryValidator.js +253 -4
- package/dist/validate/QueryValidator.d.ts +10 -1
- package/dist/validate/QueryValidator.js +1 -1
- package/dist/validate/SQLiteQueryValidator.d.ts +16 -1
- package/dist/validate/SQLiteQueryValidator.js +32 -3
- package/dist/visitor/ParamCollector.d.ts +30 -0
- package/dist/visitor/ParamCollector.js +109 -2
- package/dist/visitor/QueryIdentityTransformer.d.ts +30 -0
- package/dist/visitor/QueryIdentityTransformer.js +217 -2
- package/dist/visitor/SqlTreeNodeVisitor.d.ts +30 -0
- package/dist/visitor/SqlTreeNodeVisitor.js +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -73,6 +73,287 @@ query.toSQL(new IndentedQueryRenderer(2));
|
|
|
73
73
|
// LIMIT 10
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
+
### Delete Queries
|
|
77
|
+
|
|
78
|
+
Build DELETE statements with optional WHERE clauses:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
import { DELETE_FROM, EQ, COLUMN, PARAM, AND, LT } from '@shaxpir/squilt';
|
|
82
|
+
|
|
83
|
+
// Simple delete
|
|
84
|
+
const deleteAll = DELETE_FROM('temp_files');
|
|
85
|
+
console.log(deleteAll.toSQL());
|
|
86
|
+
// DELETE FROM temp_files
|
|
87
|
+
|
|
88
|
+
// Delete with conditions
|
|
89
|
+
const deleteOld = DELETE_FROM('logs')
|
|
90
|
+
.where(AND(
|
|
91
|
+
EQ(COLUMN('level'), 'debug'),
|
|
92
|
+
LT(COLUMN('created_at'), PARAM('cutoffDate'))
|
|
93
|
+
));
|
|
94
|
+
console.log(deleteOld.toSQL());
|
|
95
|
+
// DELETE FROM logs WHERE ((level = 'debug') AND (created_at < ?))
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
DELETE queries support subqueries in WHERE clauses:
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { DELETE_FROM, SELECT, FROM, COLUMN, IN, EXISTS, EQ } from '@shaxpir/squilt';
|
|
102
|
+
|
|
103
|
+
// Delete using IN with subquery
|
|
104
|
+
const bannedUsers = SELECT(FROM('banned_users'), COLUMN('id'));
|
|
105
|
+
const deleteComments = DELETE_FROM('comments')
|
|
106
|
+
.where(IN(COLUMN('user_id'), bannedUsers));
|
|
107
|
+
console.log(deleteComments.toSQL());
|
|
108
|
+
// DELETE FROM comments WHERE (user_id IN (SELECT id FROM banned_users))
|
|
109
|
+
|
|
110
|
+
// Delete using EXISTS with correlated subquery
|
|
111
|
+
const deleteOrders = DELETE_FROM('orders')
|
|
112
|
+
.where(EXISTS(
|
|
113
|
+
SELECT(FROM('refunds'), COLUMN('*'))
|
|
114
|
+
.where(EQ(COLUMN('refunds', 'order_id'), COLUMN('orders', 'id')))
|
|
115
|
+
));
|
|
116
|
+
console.log(deleteOrders.toSQL());
|
|
117
|
+
// DELETE FROM orders WHERE EXISTS (SELECT * FROM refunds WHERE (refunds.order_id = orders.id))
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Update Queries
|
|
121
|
+
|
|
122
|
+
Build UPDATE statements with SET clauses and optional WHERE:
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
import { UPDATE, EQ, COLUMN, PARAM } from '@shaxpir/squilt';
|
|
126
|
+
import { StringLiteral, NumberLiteral } from '@shaxpir/squilt';
|
|
127
|
+
|
|
128
|
+
// Simple update
|
|
129
|
+
const updateStatus = UPDATE('users')
|
|
130
|
+
.set('status', new StringLiteral('active'))
|
|
131
|
+
.set('last_login', PARAM('loginTime'))
|
|
132
|
+
.where(EQ(COLUMN('id'), PARAM('userId')));
|
|
133
|
+
console.log(updateStatus.toSQL());
|
|
134
|
+
// UPDATE users SET status = 'active', last_login = ? WHERE (id = ?)
|
|
135
|
+
|
|
136
|
+
// Update multiple columns
|
|
137
|
+
const bulkUpdate = UPDATE('products')
|
|
138
|
+
.set('price', new NumberLiteral(99))
|
|
139
|
+
.set('on_sale', new NumberLiteral(1))
|
|
140
|
+
.set('discount', new NumberLiteral(10))
|
|
141
|
+
.where(EQ(COLUMN('category'), 'electronics'));
|
|
142
|
+
console.log(bulkUpdate.toSQL());
|
|
143
|
+
// UPDATE products SET price = 99, on_sale = 1, discount = 10 WHERE (category = 'electronics')
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### RETURNING Clause (SQLite 3.35+)
|
|
147
|
+
|
|
148
|
+
Get back affected rows from INSERT, UPDATE, and DELETE statements:
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
import { INSERT, UPDATE, DELETE_FROM, COLUMN, PARAM, EQ, ALIAS, FN } from '@shaxpir/squilt';
|
|
152
|
+
|
|
153
|
+
// INSERT with RETURNING
|
|
154
|
+
const createUser = INSERT('users', ['name', 'email'], [PARAM('name'), PARAM('email')])
|
|
155
|
+
.returning(COLUMN('id'), COLUMN('created_at'));
|
|
156
|
+
console.log(createUser.toSQL());
|
|
157
|
+
// INSERT INTO users (name, email) VALUES (?, ?) RETURNING id, created_at
|
|
158
|
+
|
|
159
|
+
// UPDATE with RETURNING
|
|
160
|
+
const updateUser = UPDATE('users')
|
|
161
|
+
.set('status', 'active')
|
|
162
|
+
.where(EQ(COLUMN('id'), PARAM('userId')))
|
|
163
|
+
.returning(COLUMN('id'), COLUMN('status'), COLUMN('updated_at'));
|
|
164
|
+
console.log(updateUser.toSQL());
|
|
165
|
+
// UPDATE users SET status = 'active' WHERE (id = ?) RETURNING id, status, updated_at
|
|
166
|
+
|
|
167
|
+
// DELETE with RETURNING
|
|
168
|
+
const deleteInactive = DELETE_FROM('users')
|
|
169
|
+
.where(EQ(COLUMN('status'), 'inactive'))
|
|
170
|
+
.returning(COLUMN('id'), COLUMN('email'));
|
|
171
|
+
console.log(deleteInactive.toSQL());
|
|
172
|
+
// DELETE FROM users WHERE (status = 'inactive') RETURNING id, email
|
|
173
|
+
|
|
174
|
+
// RETURNING with aliased expressions
|
|
175
|
+
const insertWithAlias = INSERT('orders', ['total'], [PARAM('total')])
|
|
176
|
+
.returning(
|
|
177
|
+
COLUMN('id'),
|
|
178
|
+
ALIAS(FN('DATETIME', COLUMN('created_at')), 'order_time')
|
|
179
|
+
);
|
|
180
|
+
console.log(insertWithAlias.toSQL());
|
|
181
|
+
// INSERT INTO orders (total) VALUES (?) RETURNING id, DATETIME(created_at) AS order_time
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### INSERT ... SELECT
|
|
185
|
+
|
|
186
|
+
Insert rows from a query result:
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
import { INSERT_INTO, SELECT, FROM, COLUMN, EQ, LT, PARAM } from '@shaxpir/squilt';
|
|
190
|
+
|
|
191
|
+
// Basic INSERT ... SELECT
|
|
192
|
+
const archiveOrders = INSERT_INTO('archive_orders')
|
|
193
|
+
.columns('id', 'user_id', 'total')
|
|
194
|
+
.fromSelect(
|
|
195
|
+
SELECT(FROM('orders'), COLUMN('id'), COLUMN('user_id'), COLUMN('total'))
|
|
196
|
+
.where(LT(COLUMN('created_at'), PARAM('cutoff')))
|
|
197
|
+
);
|
|
198
|
+
console.log(archiveOrders.toSQL());
|
|
199
|
+
// INSERT INTO archive_orders (id, user_id, total)
|
|
200
|
+
// SELECT id, user_id, total FROM orders WHERE (created_at < ?)
|
|
201
|
+
|
|
202
|
+
// INSERT OR REPLACE ... SELECT
|
|
203
|
+
const syncData = INSERT_INTO('local_cache')
|
|
204
|
+
.orReplace()
|
|
205
|
+
.columns('id', 'data')
|
|
206
|
+
.fromSelect(
|
|
207
|
+
SELECT(FROM('remote_data'), COLUMN('id'), COLUMN('data'))
|
|
208
|
+
);
|
|
209
|
+
console.log(syncData.toSQL());
|
|
210
|
+
// INSERT OR REPLACE INTO local_cache (id, data) SELECT id, data FROM remote_data
|
|
211
|
+
|
|
212
|
+
// With RETURNING clause
|
|
213
|
+
const copyWithIds = INSERT_INTO('new_table')
|
|
214
|
+
.columns('name', 'value')
|
|
215
|
+
.fromSelect(SELECT(FROM('old_table'), COLUMN('name'), COLUMN('value')))
|
|
216
|
+
.returning(COLUMN('id'));
|
|
217
|
+
console.log(copyWithIds.toSQL());
|
|
218
|
+
// INSERT INTO new_table (name, value) SELECT name, value FROM old_table RETURNING id
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Set Operations: UNION, INTERSECT, EXCEPT
|
|
222
|
+
|
|
223
|
+
Combine query results with set operations:
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
import { SELECT, FROM, COLUMN, EQ } from '@shaxpir/squilt';
|
|
227
|
+
|
|
228
|
+
// UNION - combine results from multiple queries (already supported)
|
|
229
|
+
const allEmails = SELECT(FROM('customers'), COLUMN('email'))
|
|
230
|
+
.union(SELECT(FROM('subscribers'), COLUMN('email')));
|
|
231
|
+
console.log(allEmails.toSQL());
|
|
232
|
+
// SELECT email FROM customers UNION SELECT email FROM subscribers
|
|
233
|
+
|
|
234
|
+
// INTERSECT - rows that appear in both queries
|
|
235
|
+
const commonEmails = SELECT(FROM('subscribers'), COLUMN('email'))
|
|
236
|
+
.intersect(SELECT(FROM('customers'), COLUMN('email')));
|
|
237
|
+
console.log(commonEmails.toSQL());
|
|
238
|
+
// SELECT email FROM subscribers INTERSECT SELECT email FROM customers
|
|
239
|
+
|
|
240
|
+
// EXCEPT - rows in first query but not in second
|
|
241
|
+
const activeUsers = SELECT(FROM('all_users'), COLUMN('id'))
|
|
242
|
+
.except(SELECT(FROM('banned_users'), COLUMN('user_id')));
|
|
243
|
+
console.log(activeUsers.toSQL());
|
|
244
|
+
// SELECT id FROM all_users EXCEPT SELECT user_id FROM banned_users
|
|
245
|
+
|
|
246
|
+
// Combine multiple set operations
|
|
247
|
+
const complexSet = SELECT(FROM('set_a'), COLUMN('id'))
|
|
248
|
+
.union(SELECT(FROM('set_b'), COLUMN('id')))
|
|
249
|
+
.intersect(SELECT(FROM('set_c'), COLUMN('id')))
|
|
250
|
+
.except(SELECT(FROM('set_d'), COLUMN('id')));
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### UPSERT (ON CONFLICT) (SQLite 3.24+)
|
|
254
|
+
|
|
255
|
+
Insert-or-update operations using SQLite's upsert syntax:
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
import { INSERT, PARAM, COLUMN, EQ } from '@shaxpir/squilt';
|
|
259
|
+
|
|
260
|
+
// ON CONFLICT DO UPDATE - update existing rows on conflict
|
|
261
|
+
const upsertUser = INSERT('users', ['id', 'name', 'email'], [PARAM('id'), PARAM('name'), PARAM('email')])
|
|
262
|
+
.onConflict('id')
|
|
263
|
+
.doUpdate({ name: PARAM('name'), email: PARAM('email') });
|
|
264
|
+
console.log(upsertUser.toSQL());
|
|
265
|
+
// INSERT INTO users (id, name, email) VALUES (?, ?, ?)
|
|
266
|
+
// ON CONFLICT (id) DO UPDATE SET name = ?, email = ?
|
|
267
|
+
|
|
268
|
+
// ON CONFLICT DO NOTHING - silently ignore conflicts
|
|
269
|
+
const insertIfNotExists = INSERT('events', ['id', 'data'], [PARAM('id'), PARAM('data')])
|
|
270
|
+
.onConflict('id')
|
|
271
|
+
.doNothing();
|
|
272
|
+
console.log(insertIfNotExists.toSQL());
|
|
273
|
+
// INSERT INTO events (id, data) VALUES (?, ?) ON CONFLICT (id) DO NOTHING
|
|
274
|
+
|
|
275
|
+
// Multiple conflict columns
|
|
276
|
+
const upsertRole = INSERT('user_roles', ['user_id', 'role_id', 'assigned_at'], [PARAM('userId'), PARAM('roleId'), PARAM('now')])
|
|
277
|
+
.onConflict('user_id', 'role_id')
|
|
278
|
+
.doUpdate({ assigned_at: PARAM('now') });
|
|
279
|
+
console.log(upsertRole.toSQL());
|
|
280
|
+
// INSERT INTO user_roles (user_id, role_id, assigned_at) VALUES (?, ?, ?)
|
|
281
|
+
// ON CONFLICT (user_id, role_id) DO UPDATE SET assigned_at = ?
|
|
282
|
+
|
|
283
|
+
// With WHERE clause on conflict (conditional upsert)
|
|
284
|
+
const conditionalUpsert = INSERT('users', ['id', 'name'], [PARAM('id'), PARAM('name')])
|
|
285
|
+
.onConflict('id')
|
|
286
|
+
.onConflictWhere(EQ(COLUMN('active'), true))
|
|
287
|
+
.doUpdate({ name: PARAM('name') });
|
|
288
|
+
console.log(conditionalUpsert.toSQL());
|
|
289
|
+
// INSERT INTO users (id, name) VALUES (?, ?)
|
|
290
|
+
// ON CONFLICT (id) WHERE (active = 1) DO UPDATE SET name = ?
|
|
291
|
+
|
|
292
|
+
// With RETURNING clause
|
|
293
|
+
const upsertWithReturn = INSERT('counters', ['counter_key', 'value'], [PARAM('key'), PARAM('value')])
|
|
294
|
+
.onConflict('counter_key')
|
|
295
|
+
.doUpdate({ value: PARAM('value') })
|
|
296
|
+
.returning(COLUMN('counter_key'), COLUMN('value'));
|
|
297
|
+
console.log(upsertWithReturn.toSQL());
|
|
298
|
+
// INSERT INTO counters (counter_key, value) VALUES (?, ?)
|
|
299
|
+
// ON CONFLICT (counter_key) DO UPDATE SET value = ?
|
|
300
|
+
// RETURNING counter_key, value
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### DROP TABLE and DROP INDEX
|
|
304
|
+
|
|
305
|
+
Remove tables and indexes from the database:
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
import { DROP_TABLE, DROP_INDEX } from '@shaxpir/squilt';
|
|
309
|
+
|
|
310
|
+
// Simple DROP TABLE
|
|
311
|
+
const dropUsers = DROP_TABLE('users');
|
|
312
|
+
console.log(dropUsers.toSQL());
|
|
313
|
+
// DROP TABLE users
|
|
314
|
+
|
|
315
|
+
// DROP TABLE IF EXISTS
|
|
316
|
+
const dropCache = DROP_TABLE('cache').ifExists();
|
|
317
|
+
console.log(dropCache.toSQL());
|
|
318
|
+
// DROP TABLE IF EXISTS cache
|
|
319
|
+
|
|
320
|
+
// Simple DROP INDEX
|
|
321
|
+
const dropIndex = DROP_INDEX('idx_users_email');
|
|
322
|
+
console.log(dropIndex.toSQL());
|
|
323
|
+
// DROP INDEX idx_users_email
|
|
324
|
+
|
|
325
|
+
// DROP INDEX IF EXISTS
|
|
326
|
+
const dropOldIndex = DROP_INDEX('idx_old').ifExists();
|
|
327
|
+
console.log(dropOldIndex.toSQL());
|
|
328
|
+
// DROP INDEX IF EXISTS idx_old
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Range Queries with BETWEEN
|
|
332
|
+
|
|
333
|
+
Use BETWEEN for range comparisons:
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
import { SELECT, FROM, COLUMN, BETWEEN, NOT_BETWEEN, PARAM, AND } from '@shaxpir/squilt';
|
|
337
|
+
|
|
338
|
+
// Price range query
|
|
339
|
+
const priceFilter = SELECT(FROM('products'), COLUMN('*'))
|
|
340
|
+
.where(BETWEEN(COLUMN('price'), 10, 100));
|
|
341
|
+
console.log(priceFilter.toSQL());
|
|
342
|
+
// SELECT * FROM products WHERE (price BETWEEN 10 AND 100)
|
|
343
|
+
|
|
344
|
+
// Date range with parameters
|
|
345
|
+
const dateFilter = SELECT(FROM('orders'), COLUMN('*'))
|
|
346
|
+
.where(BETWEEN(COLUMN('created_at'), PARAM('startDate'), PARAM('endDate')));
|
|
347
|
+
console.log(dateFilter.toSQL());
|
|
348
|
+
// SELECT * FROM orders WHERE (created_at BETWEEN ? AND ?)
|
|
349
|
+
|
|
350
|
+
// Exclude a range with NOT BETWEEN
|
|
351
|
+
const excludeRange = SELECT(FROM('employees'), COLUMN('*'))
|
|
352
|
+
.where(NOT_BETWEEN(COLUMN('salary'), 50000, 100000));
|
|
353
|
+
console.log(excludeRange.toSQL());
|
|
354
|
+
// SELECT * FROM employees WHERE (salary NOT BETWEEN 50000 AND 100000)
|
|
355
|
+
```
|
|
356
|
+
|
|
76
357
|
### Parameterized Queries
|
|
77
358
|
|
|
78
359
|
Use named parameters for safe value binding:
|
|
@@ -109,14 +390,21 @@ const params = query.accept(new ParamCollectingVisitor({ userId: 42 }));
|
|
|
109
390
|
| `SELECT_DISTINCT(...args)` | Create a SELECT DISTINCT query |
|
|
110
391
|
| `FROM(table)` | Create a FROM clause |
|
|
111
392
|
| `COLUMN(name)` or `COLUMN(table, name)` | Reference a column |
|
|
393
|
+
| `ALIAS(expr, name)` | Create an aliased expression |
|
|
112
394
|
| `EQ`, `NOT_EQ`, `GT`, `LT`, `GTE`, `LTE` | Comparison operators |
|
|
395
|
+
| `BETWEEN`, `NOT_BETWEEN` | Range operators |
|
|
113
396
|
| `AND`, `OR`, `NOT` | Logical operators |
|
|
114
397
|
| `LIKE`, `IN`, `NOT_IN` | Pattern matching |
|
|
115
398
|
| `JOIN`, `LEFT_JOIN`, `CROSS_JOIN` | Join clauses |
|
|
116
399
|
| `FN(name, ...args)` | Function calls |
|
|
117
400
|
| `CASE([...cases])` | CASE expressions |
|
|
118
401
|
| `WITH(name, query)` | Common Table Expressions |
|
|
119
|
-
| `
|
|
402
|
+
| `UNION`, `INTERSECT`, `EXCEPT` | Set operations |
|
|
403
|
+
| `INSERT`, `INSERT_INTO`, `INSERT_OR_REPLACE` | Insert statements |
|
|
404
|
+
| `UPDATE(table)` | Update statements |
|
|
405
|
+
| `DELETE_FROM(table)` | Delete statements |
|
|
406
|
+
| `DROP_TABLE(table)` | Drop table statements |
|
|
407
|
+
| `DROP_INDEX(index)` | Drop index statements |
|
|
120
408
|
|
|
121
409
|
### Renderers
|
|
122
410
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { QueryRenderer } from "../renderer/QueryRenderer";
|
|
2
|
+
import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
|
|
3
|
+
import { SqlTreeNode } from "./Abstractions";
|
|
4
|
+
import { ColumnType, ColumnConstraints, ColumnDefinition } from "./CreateTableQuery";
|
|
5
|
+
export type AlterTableOperation = {
|
|
6
|
+
type: 'ADD_COLUMN';
|
|
7
|
+
column: ColumnDefinition;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'RENAME_COLUMN';
|
|
10
|
+
oldName: string;
|
|
11
|
+
newName: string;
|
|
12
|
+
} | {
|
|
13
|
+
type: 'DROP_COLUMN';
|
|
14
|
+
columnName: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'RENAME_TABLE';
|
|
17
|
+
newTableName: string;
|
|
18
|
+
};
|
|
19
|
+
export declare class AlterTableQuery implements SqlTreeNode {
|
|
20
|
+
private _tableName;
|
|
21
|
+
private _operation;
|
|
22
|
+
constructor(tableName: string);
|
|
23
|
+
static create(tableName: string): AlterTableQuery;
|
|
24
|
+
addColumn(name: string, type: ColumnType, constraints?: ColumnConstraints): AlterTableQuery;
|
|
25
|
+
renameColumn(oldName: string, newName: string): AlterTableQuery;
|
|
26
|
+
dropColumn(columnName: string): AlterTableQuery;
|
|
27
|
+
renameTo(newTableName: string): AlterTableQuery;
|
|
28
|
+
get tableName(): string;
|
|
29
|
+
get operation(): AlterTableOperation | null;
|
|
30
|
+
toSQL(renderer?: QueryRenderer): string;
|
|
31
|
+
accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
|
|
32
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AlterTableQuery = void 0;
|
|
4
|
+
const IndentedQueryRenderer_1 = require("../renderer/IndentedQueryRenderer");
|
|
5
|
+
// Represents an ALTER TABLE statement
|
|
6
|
+
class AlterTableQuery {
|
|
7
|
+
constructor(tableName) {
|
|
8
|
+
this._operation = null;
|
|
9
|
+
this._tableName = tableName;
|
|
10
|
+
}
|
|
11
|
+
static create(tableName) {
|
|
12
|
+
return new AlterTableQuery(tableName);
|
|
13
|
+
}
|
|
14
|
+
addColumn(name, type, constraints = {}) {
|
|
15
|
+
this._operation = {
|
|
16
|
+
type: 'ADD_COLUMN',
|
|
17
|
+
column: { name, type, constraints }
|
|
18
|
+
};
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
renameColumn(oldName, newName) {
|
|
22
|
+
this._operation = {
|
|
23
|
+
type: 'RENAME_COLUMN',
|
|
24
|
+
oldName,
|
|
25
|
+
newName
|
|
26
|
+
};
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
dropColumn(columnName) {
|
|
30
|
+
this._operation = {
|
|
31
|
+
type: 'DROP_COLUMN',
|
|
32
|
+
columnName
|
|
33
|
+
};
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
renameTo(newTableName) {
|
|
37
|
+
this._operation = {
|
|
38
|
+
type: 'RENAME_TABLE',
|
|
39
|
+
newTableName
|
|
40
|
+
};
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
get tableName() {
|
|
44
|
+
return this._tableName;
|
|
45
|
+
}
|
|
46
|
+
get operation() {
|
|
47
|
+
return this._operation;
|
|
48
|
+
}
|
|
49
|
+
toSQL(renderer) {
|
|
50
|
+
if (!renderer) {
|
|
51
|
+
renderer = new IndentedQueryRenderer_1.IndentedQueryRenderer(2);
|
|
52
|
+
}
|
|
53
|
+
return this.accept(renderer);
|
|
54
|
+
}
|
|
55
|
+
accept(visitor) {
|
|
56
|
+
return visitor.visitAlterTableQuery(this);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.AlterTableQuery = AlterTableQuery;
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWx0ZXJUYWJsZVF1ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FzdC9BbHRlclRhYmxlUXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkVBQTBFO0FBYTFFLHNDQUFzQztBQUN0QyxNQUFhLGVBQWU7SUFLMUIsWUFBWSxTQUFpQjtRQUZyQixlQUFVLEdBQStCLElBQUksQ0FBQztRQUdwRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBRU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFpQjtRQUNwQyxPQUFPLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxTQUFTLENBQUMsSUFBWSxFQUFFLElBQWdCLEVBQUUsY0FBaUMsRUFBRTtRQUNsRixJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLElBQUksRUFBRSxZQUFZO1lBQ2xCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxZQUFZLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixJQUFJLEVBQUUsZUFBZTtZQUNyQixPQUFPO1lBQ1AsT0FBTztTQUNSLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxVQUFVLENBQUMsVUFBa0I7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixJQUFJLEVBQUUsYUFBYTtZQUNuQixVQUFVO1NBQ1gsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLFFBQVEsQ0FBQyxZQUFvQjtRQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLElBQUksRUFBRSxjQUFjO1lBQ3BCLFlBQVk7U0FDYixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQXdCO1FBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLFFBQVEsR0FBRyxJQUFJLDZDQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBSSxPQUE4QjtRQUM3QyxPQUFPLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFoRUQsMENBZ0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5kZW50ZWRRdWVyeVJlbmRlcmVyIH0gZnJvbSBcIi4uL3JlbmRlcmVyL0luZGVudGVkUXVlcnlSZW5kZXJlclwiO1xuaW1wb3J0IHsgUXVlcnlSZW5kZXJlciB9IGZyb20gXCIuLi9yZW5kZXJlci9RdWVyeVJlbmRlcmVyXCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcbmltcG9ydCB7IFNxbFRyZWVOb2RlIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBDb2x1bW5Db25zdHJhaW50cywgQ29sdW1uRGVmaW5pdGlvbiB9IGZyb20gXCIuL0NyZWF0ZVRhYmxlUXVlcnlcIjtcblxuLy8gVHlwZXMgb2YgQUxURVIgVEFCTEUgb3BlcmF0aW9uc1xuZXhwb3J0IHR5cGUgQWx0ZXJUYWJsZU9wZXJhdGlvbiA9XG4gIHwgeyB0eXBlOiAnQUREX0NPTFVNTic7IGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbiB9XG4gIHwgeyB0eXBlOiAnUkVOQU1FX0NPTFVNTic7IG9sZE5hbWU6IHN0cmluZzsgbmV3TmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdEUk9QX0NPTFVNTic7IGNvbHVtbk5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnUkVOQU1FX1RBQkxFJzsgbmV3VGFibGVOYW1lOiBzdHJpbmcgfTtcblxuLy8gUmVwcmVzZW50cyBhbiBBTFRFUiBUQUJMRSBzdGF0ZW1lbnRcbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlUXVlcnkgaW1wbGVtZW50cyBTcWxUcmVlTm9kZSB7XG5cbiAgcHJpdmF0ZSBfdGFibGVOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX29wZXJhdGlvbjogQWx0ZXJUYWJsZU9wZXJhdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHRhYmxlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFibGVOYW1lID0gdGFibGVOYW1lO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUodGFibGVOYW1lOiBzdHJpbmcpOiBBbHRlclRhYmxlUXVlcnkge1xuICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgYWRkQ29sdW1uKG5hbWU6IHN0cmluZywgdHlwZTogQ29sdW1uVHlwZSwgY29uc3RyYWludHM6IENvbHVtbkNvbnN0cmFpbnRzID0ge30pOiBBbHRlclRhYmxlUXVlcnkge1xuICAgIHRoaXMuX29wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdBRERfQ09MVU1OJyxcbiAgICAgIGNvbHVtbjogeyBuYW1lLCB0eXBlLCBjb25zdHJhaW50cyB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb2x1bW4ob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpOiBBbHRlclRhYmxlUXVlcnkge1xuICAgIHRoaXMuX29wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdSRU5BTUVfQ09MVU1OJyxcbiAgICAgIG9sZE5hbWUsXG4gICAgICBuZXdOYW1lXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBkcm9wQ29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZyk6IEFsdGVyVGFibGVRdWVyeSB7XG4gICAgdGhpcy5fb3BlcmF0aW9uID0ge1xuICAgICAgdHlwZTogJ0RST1BfQ09MVU1OJyxcbiAgICAgIGNvbHVtbk5hbWVcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZVRvKG5ld1RhYmxlTmFtZTogc3RyaW5nKTogQWx0ZXJUYWJsZVF1ZXJ5IHtcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB7XG4gICAgICB0eXBlOiAnUkVOQU1FX1RBQkxFJyxcbiAgICAgIG5ld1RhYmxlTmFtZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9wZXJhdGlvbigpOiBBbHRlclRhYmxlT3BlcmF0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyB0b1NRTChyZW5kZXJlcj86IFF1ZXJ5UmVuZGVyZXIpOiBzdHJpbmcge1xuICAgIGlmICghcmVuZGVyZXIpIHtcbiAgICAgIHJlbmRlcmVyID0gbmV3IEluZGVudGVkUXVlcnlSZW5kZXJlcigyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWNjZXB0KHJlbmRlcmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8VD4odmlzaXRvcjogU3FsVHJlZU5vZGVWaXNpdG9yPFQ+KTogVCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBbHRlclRhYmxlUXVlcnkodGhpcyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AliasableExpression, Expression } from "./Abstractions";
|
|
2
|
+
import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
|
|
3
|
+
export declare class BetweenExpression extends AliasableExpression {
|
|
4
|
+
readonly operand: Expression;
|
|
5
|
+
readonly low: Expression;
|
|
6
|
+
readonly high: Expression;
|
|
7
|
+
readonly not: boolean;
|
|
8
|
+
constructor(operand: Expression, low: Expression, high: Expression, not?: boolean);
|
|
9
|
+
accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
|
|
10
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BetweenExpression = void 0;
|
|
4
|
+
const Abstractions_1 = require("./Abstractions");
|
|
5
|
+
class BetweenExpression extends Abstractions_1.AliasableExpression {
|
|
6
|
+
constructor(operand, low, high, not = false) {
|
|
7
|
+
super();
|
|
8
|
+
this.operand = operand;
|
|
9
|
+
this.low = low;
|
|
10
|
+
this.high = high;
|
|
11
|
+
this.not = not;
|
|
12
|
+
}
|
|
13
|
+
accept(visitor) {
|
|
14
|
+
return visitor.visitBetweenExpression(this);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.BetweenExpression = BetweenExpression;
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmV0d2VlbkV4cHJlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L0JldHdlZW5FeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFpRTtBQUdqRSxNQUFhLGlCQUFrQixTQUFRLGtDQUFtQjtJQU14RCxZQUFZLE9BQW1CLEVBQUUsR0FBZSxFQUFFLElBQWdCLEVBQUUsTUFBZSxLQUFLO1FBQ3RGLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBRU0sTUFBTSxDQUFJLE9BQThCO1FBQzdDLE9BQU8sT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7Q0FDRjtBQWpCRCw4Q0FpQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbGlhc2FibGVFeHByZXNzaW9uLCBFeHByZXNzaW9uIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcblxuZXhwb3J0IGNsYXNzIEJldHdlZW5FeHByZXNzaW9uIGV4dGVuZHMgQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyByZWFkb25seSBvcGVyYW5kOiBFeHByZXNzaW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgbG93OiBFeHByZXNzaW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgaGlnaDogRXhwcmVzc2lvbjtcbiAgcHVibGljIHJlYWRvbmx5IG5vdDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcGVyYW5kOiBFeHByZXNzaW9uLCBsb3c6IEV4cHJlc3Npb24sIGhpZ2g6IEV4cHJlc3Npb24sIG5vdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm9wZXJhbmQgPSBvcGVyYW5kO1xuICAgIHRoaXMubG93ID0gbG93O1xuICAgIHRoaXMuaGlnaCA9IGhpZ2g7XG4gICAgdGhpcy5ub3QgPSBub3Q7XG4gIH1cblxuICBwdWJsaWMgYWNjZXB0PFQ+KHZpc2l0b3I6IFNxbFRyZWVOb2RlVmlzaXRvcjxUPik6IFQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QmV0d2VlbkV4cHJlc3Npb24odGhpcyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AliasableExpression, Expression } from "./Abstractions";
|
|
2
|
+
import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
|
|
3
|
+
/**
|
|
4
|
+
* Represents a CAST expression: CAST(expression AS type)
|
|
5
|
+
*/
|
|
6
|
+
export declare class CastExpression extends AliasableExpression {
|
|
7
|
+
private _expression;
|
|
8
|
+
private _targetType;
|
|
9
|
+
constructor(expression: Expression, targetType: string);
|
|
10
|
+
get expression(): Expression;
|
|
11
|
+
get targetType(): string;
|
|
12
|
+
accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
|
|
13
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CastExpression = void 0;
|
|
4
|
+
const Abstractions_1 = require("./Abstractions");
|
|
5
|
+
/**
|
|
6
|
+
* Represents a CAST expression: CAST(expression AS type)
|
|
7
|
+
*/
|
|
8
|
+
class CastExpression extends Abstractions_1.AliasableExpression {
|
|
9
|
+
constructor(expression, targetType) {
|
|
10
|
+
super();
|
|
11
|
+
this._expression = expression;
|
|
12
|
+
this._targetType = targetType;
|
|
13
|
+
}
|
|
14
|
+
get expression() {
|
|
15
|
+
return this._expression;
|
|
16
|
+
}
|
|
17
|
+
get targetType() {
|
|
18
|
+
return this._targetType;
|
|
19
|
+
}
|
|
20
|
+
accept(visitor) {
|
|
21
|
+
return visitor.visitCastExpression(this);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.CastExpression = CastExpression;
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FzdEV4cHJlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L0Nhc3RFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFpRTtBQUdqRTs7R0FFRztBQUNILE1BQWEsY0FBZSxTQUFRLGtDQUFtQjtJQUlyRCxZQUFZLFVBQXNCLEVBQUUsVUFBa0I7UUFDcEQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU0sTUFBTSxDQUFJLE9BQThCO1FBQzdDLE9BQU8sT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQXJCRCx3Q0FxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbGlhc2FibGVFeHByZXNzaW9uLCBFeHByZXNzaW9uIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgQ0FTVCBleHByZXNzaW9uOiBDQVNUKGV4cHJlc3Npb24gQVMgdHlwZSlcbiAqL1xuZXhwb3J0IGNsYXNzIENhc3RFeHByZXNzaW9uIGV4dGVuZHMgQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IEV4cHJlc3Npb247XG4gIHByaXZhdGUgX3RhcmdldFR5cGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBFeHByZXNzaW9uLCB0YXJnZXRUeXBlOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHRoaXMuX3RhcmdldFR5cGUgPSB0YXJnZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIHJldHVybiB0aGlzLl9leHByZXNzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCB0YXJnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhcmdldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgYWNjZXB0PFQ+KHZpc2l0b3I6IFNxbFRyZWVOb2RlVmlzaXRvcjxUPik6IFQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q2FzdEV4cHJlc3Npb24odGhpcyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AliasableExpression, Expression } from "./Abstractions";
|
|
2
|
+
import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
|
|
3
|
+
/**
|
|
4
|
+
* Represents a COLLATE expression: expression COLLATE collation_name
|
|
5
|
+
*
|
|
6
|
+
* SQLite built-in collations:
|
|
7
|
+
* - BINARY: Compares using memcmp()
|
|
8
|
+
* - NOCASE: Case-insensitive ASCII comparison
|
|
9
|
+
* - RTRIM: Like BINARY but ignores trailing spaces
|
|
10
|
+
*/
|
|
11
|
+
export declare class CollateExpression extends AliasableExpression {
|
|
12
|
+
private _expression;
|
|
13
|
+
private _collation;
|
|
14
|
+
constructor(expression: Expression, collation: string);
|
|
15
|
+
get expression(): Expression;
|
|
16
|
+
get collation(): string;
|
|
17
|
+
accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
|
|
18
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CollateExpression = void 0;
|
|
4
|
+
const Abstractions_1 = require("./Abstractions");
|
|
5
|
+
/**
|
|
6
|
+
* Represents a COLLATE expression: expression COLLATE collation_name
|
|
7
|
+
*
|
|
8
|
+
* SQLite built-in collations:
|
|
9
|
+
* - BINARY: Compares using memcmp()
|
|
10
|
+
* - NOCASE: Case-insensitive ASCII comparison
|
|
11
|
+
* - RTRIM: Like BINARY but ignores trailing spaces
|
|
12
|
+
*/
|
|
13
|
+
class CollateExpression extends Abstractions_1.AliasableExpression {
|
|
14
|
+
constructor(expression, collation) {
|
|
15
|
+
super();
|
|
16
|
+
this._expression = expression;
|
|
17
|
+
this._collation = collation;
|
|
18
|
+
}
|
|
19
|
+
get expression() {
|
|
20
|
+
return this._expression;
|
|
21
|
+
}
|
|
22
|
+
get collation() {
|
|
23
|
+
return this._collation;
|
|
24
|
+
}
|
|
25
|
+
accept(visitor) {
|
|
26
|
+
return visitor.visitCollateExpression(this);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.CollateExpression = CollateExpression;
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGF0ZUV4cHJlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L0NvbGxhdGVFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFpRTtBQUdqRTs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxrQ0FBbUI7SUFJeEQsWUFBWSxVQUFzQixFQUFFLFNBQWlCO1FBQ25ELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVNLE1BQU0sQ0FBSSxPQUE4QjtRQUM3QyxPQUFPLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUFyQkQsOENBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWxpYXNhYmxlRXhwcmVzc2lvbiwgRXhwcmVzc2lvbiB9IGZyb20gXCIuL0Fic3RyYWN0aW9uc1wiO1xuaW1wb3J0IHsgU3FsVHJlZU5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL3Zpc2l0b3IvU3FsVHJlZU5vZGVWaXNpdG9yXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIENPTExBVEUgZXhwcmVzc2lvbjogZXhwcmVzc2lvbiBDT0xMQVRFIGNvbGxhdGlvbl9uYW1lXG4gKlxuICogU1FMaXRlIGJ1aWx0LWluIGNvbGxhdGlvbnM6XG4gKiAtIEJJTkFSWTogQ29tcGFyZXMgdXNpbmcgbWVtY21wKClcbiAqIC0gTk9DQVNFOiBDYXNlLWluc2Vuc2l0aXZlIEFTQ0lJIGNvbXBhcmlzb25cbiAqIC0gUlRSSU06IExpa2UgQklOQVJZIGJ1dCBpZ25vcmVzIHRyYWlsaW5nIHNwYWNlc1xuICovXG5leHBvcnQgY2xhc3MgQ29sbGF0ZUV4cHJlc3Npb24gZXh0ZW5kcyBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgcHJpdmF0ZSBfZXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcbiAgcHJpdmF0ZSBfY29sbGF0aW9uOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogRXhwcmVzc2lvbiwgY29sbGF0aW9uOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHRoaXMuX2NvbGxhdGlvbiA9IGNvbGxhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwcmVzc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sbGF0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8VD4odmlzaXRvcjogU3FsVHJlZU5vZGVWaXNpdG9yPFQ+KTogVCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb2xsYXRlRXhwcmVzc2lvbih0aGlzKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { QueryRenderer } from "../renderer/QueryRenderer";
|
|
2
|
+
import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
|
|
3
|
+
import { Expression, SqlTreeNode } from "./Abstractions";
|
|
4
|
+
export declare class CreateIndexQuery implements SqlTreeNode {
|
|
5
|
+
private _indexName;
|
|
6
|
+
private _tableName;
|
|
7
|
+
private _columns;
|
|
8
|
+
private _unique;
|
|
9
|
+
private _ifNotExists;
|
|
10
|
+
private _where;
|
|
11
|
+
constructor(indexName: string);
|
|
12
|
+
static create(indexName: string): CreateIndexQuery;
|
|
13
|
+
on(tableName: string, columns: string | string[]): CreateIndexQuery;
|
|
14
|
+
unique(): CreateIndexQuery;
|
|
15
|
+
ifNotExists(): CreateIndexQuery;
|
|
16
|
+
where(expression: Expression): CreateIndexQuery;
|
|
17
|
+
get indexName(): string;
|
|
18
|
+
get tableName(): string;
|
|
19
|
+
get columns(): string[];
|
|
20
|
+
get isUnique(): boolean;
|
|
21
|
+
get hasIfNotExists(): boolean;
|
|
22
|
+
get whereExpression(): Expression | null;
|
|
23
|
+
toSQL(renderer?: QueryRenderer): string;
|
|
24
|
+
accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
|
|
25
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreateIndexQuery = void 0;
|
|
4
|
+
const IndentedQueryRenderer_1 = require("../renderer/IndentedQueryRenderer");
|
|
5
|
+
// Represents a CREATE INDEX statement
|
|
6
|
+
class CreateIndexQuery {
|
|
7
|
+
constructor(indexName) {
|
|
8
|
+
this._tableName = '';
|
|
9
|
+
this._columns = [];
|
|
10
|
+
this._unique = false;
|
|
11
|
+
this._ifNotExists = false;
|
|
12
|
+
this._where = null;
|
|
13
|
+
this._indexName = indexName;
|
|
14
|
+
}
|
|
15
|
+
static create(indexName) {
|
|
16
|
+
return new CreateIndexQuery(indexName);
|
|
17
|
+
}
|
|
18
|
+
on(tableName, columns) {
|
|
19
|
+
this._tableName = tableName;
|
|
20
|
+
this._columns = Array.isArray(columns) ? columns : [columns];
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
unique() {
|
|
24
|
+
this._unique = true;
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
ifNotExists() {
|
|
28
|
+
this._ifNotExists = true;
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
where(expression) {
|
|
32
|
+
this._where = expression;
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
get indexName() {
|
|
36
|
+
return this._indexName;
|
|
37
|
+
}
|
|
38
|
+
get tableName() {
|
|
39
|
+
return this._tableName;
|
|
40
|
+
}
|
|
41
|
+
get columns() {
|
|
42
|
+
return this._columns;
|
|
43
|
+
}
|
|
44
|
+
get isUnique() {
|
|
45
|
+
return this._unique;
|
|
46
|
+
}
|
|
47
|
+
get hasIfNotExists() {
|
|
48
|
+
return this._ifNotExists;
|
|
49
|
+
}
|
|
50
|
+
get whereExpression() {
|
|
51
|
+
return this._where;
|
|
52
|
+
}
|
|
53
|
+
toSQL(renderer) {
|
|
54
|
+
if (!renderer) {
|
|
55
|
+
renderer = new IndentedQueryRenderer_1.IndentedQueryRenderer(2);
|
|
56
|
+
}
|
|
57
|
+
return this.accept(renderer);
|
|
58
|
+
}
|
|
59
|
+
accept(visitor) {
|
|
60
|
+
return visitor.visitCreateIndexQuery(this);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.CreateIndexQuery = CreateIndexQuery;
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JlYXRlSW5kZXhRdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hc3QvQ3JlYXRlSW5kZXhRdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2RUFBMEU7QUFLMUUsc0NBQXNDO0FBQ3RDLE1BQWEsZ0JBQWdCO0lBUzNCLFlBQVksU0FBaUI7UUFOckIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsV0FBTSxHQUFzQixJQUFJLENBQUM7UUFHdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBaUI7UUFDcEMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxFQUFFLENBQUMsU0FBaUIsRUFBRSxPQUEwQjtRQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxLQUFLLENBQUMsVUFBc0I7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQXdCO1FBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLFFBQVEsR0FBRyxJQUFJLDZDQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBSSxPQUE4QjtRQUM3QyxPQUFPLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUF4RUQsNENBd0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5kZW50ZWRRdWVyeVJlbmRlcmVyIH0gZnJvbSBcIi4uL3JlbmRlcmVyL0luZGVudGVkUXVlcnlSZW5kZXJlclwiO1xuaW1wb3J0IHsgUXVlcnlSZW5kZXJlciB9IGZyb20gXCIuLi9yZW5kZXJlci9RdWVyeVJlbmRlcmVyXCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcbmltcG9ydCB7IEV4cHJlc3Npb24sIFNxbFRyZWVOb2RlIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5cbi8vIFJlcHJlc2VudHMgYSBDUkVBVEUgSU5ERVggc3RhdGVtZW50XG5leHBvcnQgY2xhc3MgQ3JlYXRlSW5kZXhRdWVyeSBpbXBsZW1lbnRzIFNxbFRyZWVOb2RlIHtcblxuICBwcml2YXRlIF9pbmRleE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfdGFibGVOYW1lOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfY29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBfdW5pcXVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lmTm90RXhpc3RzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3doZXJlOiBFeHByZXNzaW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoaW5kZXhOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pbmRleE5hbWUgPSBpbmRleE5hbWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShpbmRleE5hbWU6IHN0cmluZyk6IENyZWF0ZUluZGV4UXVlcnkge1xuICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhRdWVyeShpbmRleE5hbWUpO1xuICB9XG5cbiAgcHVibGljIG9uKHRhYmxlTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IENyZWF0ZUluZGV4UXVlcnkge1xuICAgIHRoaXMuX3RhYmxlTmFtZSA9IHRhYmxlTmFtZTtcbiAgICB0aGlzLl9jb2x1bW5zID0gQXJyYXkuaXNBcnJheShjb2x1bW5zKSA/IGNvbHVtbnMgOiBbY29sdW1uc107XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgdW5pcXVlKCk6IENyZWF0ZUluZGV4UXVlcnkge1xuICAgIHRoaXMuX3VuaXF1ZSA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgaWZOb3RFeGlzdHMoKTogQ3JlYXRlSW5kZXhRdWVyeSB7XG4gICAgdGhpcy5faWZOb3RFeGlzdHMgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHdoZXJlKGV4cHJlc3Npb246IEV4cHJlc3Npb24pOiBDcmVhdGVJbmRleFF1ZXJ5IHtcbiAgICB0aGlzLl93aGVyZSA9IGV4cHJlc3Npb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbmRleE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1VuaXF1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdW5pcXVlO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNJZk5vdEV4aXN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faWZOb3RFeGlzdHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdoZXJlRXhwcmVzc2lvbigpOiBFeHByZXNzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3doZXJlO1xuICB9XG5cbiAgcHVibGljIHRvU1FMKHJlbmRlcmVyPzogUXVlcnlSZW5kZXJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFyZW5kZXJlcikge1xuICAgICAgcmVuZGVyZXIgPSBuZXcgSW5kZW50ZWRRdWVyeVJlbmRlcmVyKDIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hY2NlcHQocmVuZGVyZXIpO1xuICB9XG5cbiAgcHVibGljIGFjY2VwdDxUPih2aXNpdG9yOiBTcWxUcmVlTm9kZVZpc2l0b3I8VD4pOiBUIHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdENyZWF0ZUluZGV4UXVlcnkodGhpcyk7XG4gIH1cbn1cbiJdfQ==
|