@sqlrooms/sql-editor 0.6.0 → 0.7.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 (58) hide show
  1. package/README.md +291 -0
  2. package/dist/CreateTableModal.d.ts.map +1 -1
  3. package/dist/CreateTableModal.js +10 -4
  4. package/dist/CreateTableModal.js.map +1 -1
  5. package/dist/SqlEditor.d.ts +1 -14
  6. package/dist/SqlEditor.d.ts.map +1 -1
  7. package/dist/SqlEditor.js +111 -183
  8. package/dist/SqlEditor.js.map +1 -1
  9. package/dist/SqlEditorModal.d.ts.map +1 -1
  10. package/dist/SqlEditorModal.js +8 -4
  11. package/dist/SqlEditorModal.js.map +1 -1
  12. package/dist/SqlEditorSlice.d.ts +102 -5
  13. package/dist/SqlEditorSlice.d.ts.map +1 -1
  14. package/dist/SqlEditorSlice.js +107 -30
  15. package/dist/SqlEditorSlice.js.map +1 -1
  16. package/dist/SqlMonacoEditor.d.ts +30 -0
  17. package/dist/SqlMonacoEditor.d.ts.map +1 -0
  18. package/dist/SqlMonacoEditor.js +205 -0
  19. package/dist/SqlMonacoEditor.js.map +1 -0
  20. package/dist/SqlQueryDataSourcesPanel.js +2 -3
  21. package/dist/SqlQueryDataSourcesPanel.js.map +1 -1
  22. package/dist/components/internal/SqlMonacoEditor.d.ts +36 -0
  23. package/dist/components/internal/SqlMonacoEditor.d.ts.map +1 -0
  24. package/dist/components/internal/SqlMonacoEditor.js +219 -0
  25. package/dist/components/internal/SqlMonacoEditor.js.map +1 -0
  26. package/dist/constants/duckdb-dialect.d.ts +73 -0
  27. package/dist/constants/duckdb-dialect.d.ts.map +1 -0
  28. package/dist/constants/duckdb-dialect.js +392 -0
  29. package/dist/constants/duckdb-dialect.js.map +1 -0
  30. package/dist/constants/duckdb.d.ts +73 -0
  31. package/dist/constants/duckdb.d.ts.map +1 -0
  32. package/dist/constants/duckdb.js +392 -0
  33. package/dist/constants/duckdb.js.map +1 -0
  34. package/dist/hooks/index.d.ts +5 -0
  35. package/dist/hooks/index.d.ts.map +1 -0
  36. package/dist/hooks/index.js +5 -0
  37. package/dist/hooks/index.js.map +1 -0
  38. package/dist/hooks/useMonacoEditor.d.ts +13 -0
  39. package/dist/hooks/useMonacoEditor.d.ts.map +1 -0
  40. package/dist/hooks/useMonacoEditor.js +78 -0
  41. package/dist/hooks/useMonacoEditor.js.map +1 -0
  42. package/dist/hooks/useQueryExecution.d.ts +17 -0
  43. package/dist/hooks/useQueryExecution.d.ts.map +1 -0
  44. package/dist/hooks/useQueryExecution.js +61 -0
  45. package/dist/hooks/useQueryExecution.js.map +1 -0
  46. package/dist/hooks/useQueryTabManagement.d.ts +41 -0
  47. package/dist/hooks/useQueryTabManagement.d.ts.map +1 -0
  48. package/dist/hooks/useQueryTabManagement.js +95 -0
  49. package/dist/hooks/useQueryTabManagement.js.map +1 -0
  50. package/dist/hooks/useTableManagement.d.ts +14 -0
  51. package/dist/hooks/useTableManagement.d.ts.map +1 -0
  52. package/dist/hooks/useTableManagement.js +46 -0
  53. package/dist/hooks/useTableManagement.js.map +1 -0
  54. package/dist/index.d.ts +2 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +2 -2
  57. package/dist/index.js.map +1 -1
  58. package/package.json +12 -9
@@ -0,0 +1,392 @@
1
+ /**
2
+ * DuckDB SQL language constants for Monaco Editor
3
+ */
4
+ // DuckDB specific keywords
5
+ export const DUCKDB_KEYWORDS = [
6
+ 'PRAGMA',
7
+ 'RETURNING',
8
+ 'QUALIFY',
9
+ 'PIVOT',
10
+ 'UNPIVOT',
11
+ 'EXCLUDE',
12
+ 'INCLUDE',
13
+ 'WINDOW',
14
+ 'FILTER',
15
+ 'WITHIN',
16
+ 'OVER',
17
+ 'PARTITION',
18
+ 'RANGE',
19
+ 'ROWS',
20
+ 'GROUPS',
21
+ 'PRECEDING',
22
+ 'FOLLOWING',
23
+ 'CURRENT',
24
+ 'ROW',
25
+ 'TIES',
26
+ 'OTHERS',
27
+ 'EXCLUDE',
28
+ 'RESPECT',
29
+ 'NULLS',
30
+ 'FIRST',
31
+ 'LAST',
32
+ 'MATERIALIZED',
33
+ 'RECURSIVE',
34
+ 'TEMPORARY',
35
+ 'TEMP',
36
+ 'UNLOGGED',
37
+ 'GLOBAL',
38
+ 'LOCAL',
39
+ 'STORED',
40
+ 'VIRTUAL',
41
+ 'DELIMITED',
42
+ 'CSV',
43
+ 'JSON',
44
+ 'COPY',
45
+ 'DESCRIBE',
46
+ 'EXPLAIN',
47
+ 'SUMMARIZE',
48
+ 'PROFILE',
49
+ 'LOAD',
50
+ 'INSTALL',
51
+ 'FORCE',
52
+ 'PARALLEL',
53
+ 'SEQUENTIAL',
54
+ 'PRAGMA',
55
+ // Standard SQL keywords
56
+ 'SELECT',
57
+ 'FROM',
58
+ 'WHERE',
59
+ 'GROUP',
60
+ 'BY',
61
+ 'HAVING',
62
+ 'ORDER',
63
+ 'LIMIT',
64
+ 'OFFSET',
65
+ 'INSERT',
66
+ 'INTO',
67
+ 'VALUES',
68
+ 'UPDATE',
69
+ 'SET',
70
+ 'DELETE',
71
+ 'CREATE',
72
+ 'ALTER',
73
+ 'DROP',
74
+ 'TABLE',
75
+ 'VIEW',
76
+ 'INDEX',
77
+ 'TRIGGER',
78
+ 'PROCEDURE',
79
+ 'FUNCTION',
80
+ 'DATABASE',
81
+ 'SCHEMA',
82
+ 'JOIN',
83
+ 'INNER',
84
+ 'LEFT',
85
+ 'RIGHT',
86
+ 'FULL',
87
+ 'OUTER',
88
+ 'CROSS',
89
+ 'NATURAL',
90
+ 'ON',
91
+ 'USING',
92
+ 'AND',
93
+ 'OR',
94
+ 'NOT',
95
+ 'NULL',
96
+ 'IS',
97
+ 'IN',
98
+ 'BETWEEN',
99
+ 'LIKE',
100
+ 'AS',
101
+ 'CASE',
102
+ 'WHEN',
103
+ 'THEN',
104
+ 'ELSE',
105
+ 'END',
106
+ 'DISTINCT',
107
+ 'ALL',
108
+ 'UNION',
109
+ 'INTERSECT',
110
+ 'EXCEPT',
111
+ 'WITH',
112
+ 'CAST',
113
+ 'PRIMARY',
114
+ 'KEY',
115
+ 'FOREIGN',
116
+ 'REFERENCES',
117
+ 'CONSTRAINT',
118
+ 'DEFAULT',
119
+ 'CHECK',
120
+ 'UNIQUE',
121
+ 'INDEX',
122
+ 'CASCADE',
123
+ 'RESTRICT',
124
+ 'ASC',
125
+ 'DESC',
126
+ 'IF',
127
+ 'EXISTS',
128
+ 'TRUE',
129
+ 'FALSE',
130
+ ];
131
+ // DuckDB functions
132
+ export const DUCKDB_FUNCTIONS = [
133
+ // Aggregate functions
134
+ 'ARRAY_AGG',
135
+ 'AVG',
136
+ 'BIT_AND',
137
+ 'BIT_OR',
138
+ 'BIT_XOR',
139
+ 'COUNT',
140
+ 'FIRST',
141
+ 'LAST',
142
+ 'LIST',
143
+ 'MAX',
144
+ 'MIN',
145
+ 'STRING_AGG',
146
+ 'SUM',
147
+ 'MEDIAN',
148
+ 'QUANTILE',
149
+ 'APPROX_COUNT_DISTINCT',
150
+ 'APPROX_QUANTILE',
151
+ // Window functions
152
+ 'ROW_NUMBER',
153
+ 'RANK',
154
+ 'DENSE_RANK',
155
+ 'PERCENT_RANK',
156
+ 'CUME_DIST',
157
+ 'NTILE',
158
+ 'LAG',
159
+ 'LEAD',
160
+ 'FIRST_VALUE',
161
+ 'LAST_VALUE',
162
+ 'NTH_VALUE',
163
+ // Date functions
164
+ 'AGE',
165
+ 'DATE_PART',
166
+ 'DATE_TRUNC',
167
+ 'EXTRACT',
168
+ 'GREATEST',
169
+ 'LEAST',
170
+ 'NOW',
171
+ 'CURRENT_DATE',
172
+ 'CURRENT_TIME',
173
+ 'CURRENT_TIMESTAMP',
174
+ 'EPOCH',
175
+ 'STRFTIME',
176
+ 'STRPTIME',
177
+ 'TO_TIMESTAMP',
178
+ // String functions
179
+ 'CONCAT',
180
+ 'LENGTH',
181
+ 'LOWER',
182
+ 'LPAD',
183
+ 'LTRIM',
184
+ 'REGEXP_MATCHES',
185
+ 'REGEXP_REPLACE',
186
+ 'REPEAT',
187
+ 'REPLACE',
188
+ 'REVERSE',
189
+ 'RIGHT',
190
+ 'RPAD',
191
+ 'RTRIM',
192
+ 'SPLIT',
193
+ 'SUBSTRING',
194
+ 'TRIM',
195
+ 'UPPER',
196
+ // Nested functions
197
+ 'LIST_EXTRACT',
198
+ 'LIST_ELEMENT',
199
+ 'LIST_VALUE',
200
+ 'STRUCT_EXTRACT',
201
+ 'STRUCT_PACK',
202
+ 'MAP',
203
+ 'MAP_EXTRACT',
204
+ // Math functions
205
+ 'ABS',
206
+ 'CEIL',
207
+ 'CEILING',
208
+ 'FLOOR',
209
+ 'ROUND',
210
+ 'SIGN',
211
+ 'SQRT',
212
+ 'CBRT',
213
+ 'EXP',
214
+ 'LN',
215
+ 'LOG',
216
+ 'POWER',
217
+ 'MOD',
218
+ 'RANDOM',
219
+ 'SETSEED',
220
+ 'ACOS',
221
+ 'ASIN',
222
+ 'ATAN',
223
+ 'ATAN2',
224
+ 'COS',
225
+ 'COT',
226
+ 'SIN',
227
+ 'TAN',
228
+ 'RADIANS',
229
+ 'DEGREES',
230
+ 'PI',
231
+ // Other functions
232
+ 'COALESCE',
233
+ 'NULLIF',
234
+ 'TYPEOF',
235
+ 'CURRENT_SCHEMA',
236
+ 'CURRENT_USER',
237
+ 'HASH',
238
+ 'UUID',
239
+ 'CHAR_LENGTH',
240
+ 'CHARACTER_LENGTH',
241
+ 'POSITION',
242
+ 'OVERLAY',
243
+ 'CONCAT_WS',
244
+ 'FORMAT',
245
+ 'TO_CHAR',
246
+ 'TO_DATE',
247
+ 'TO_NUMBER',
248
+ 'LOCALTIME',
249
+ 'LOCALTIMESTAMP',
250
+ 'JUSTIFY_DAYS',
251
+ 'JUSTIFY_HOURS',
252
+ 'JUSTIFY_INTERVAL',
253
+ 'MAKE_DATE',
254
+ 'MAKE_INTERVAL',
255
+ 'MAKE_TIME',
256
+ 'MAKE_TIMESTAMP',
257
+ 'CLOCK_TIMESTAMP',
258
+ 'STATEMENT_TIMESTAMP',
259
+ 'TRANSACTION_TIMESTAMP',
260
+ ];
261
+ // SQL operators
262
+ export const SQL_OPERATORS = [
263
+ '+',
264
+ '-',
265
+ '*',
266
+ '/',
267
+ '%',
268
+ '&',
269
+ '|',
270
+ '^',
271
+ '=',
272
+ '<>',
273
+ '!=',
274
+ '>',
275
+ '>=',
276
+ '<',
277
+ '<=',
278
+ '<<',
279
+ '>>',
280
+ '||',
281
+ '::',
282
+ '->>',
283
+ '->',
284
+ '~',
285
+ '!',
286
+ '@',
287
+ ];
288
+ // SQL variables
289
+ export const SQL_VARIABLES = [
290
+ '$1',
291
+ '$2',
292
+ '$3',
293
+ '$4',
294
+ '$5',
295
+ '$6',
296
+ '$7',
297
+ '$8',
298
+ '$9',
299
+ ];
300
+ // SQL pseudo columns
301
+ export const SQL_PSEUDO_COLUMNS = [
302
+ '$ACTION',
303
+ '$IDENTITY',
304
+ '$ROWGUID',
305
+ '$PARTITION',
306
+ ];
307
+ // SQL language configuration for Monaco Editor
308
+ export const SQL_LANGUAGE_CONFIGURATION = {
309
+ defaultToken: '',
310
+ tokenPostfix: '.sql',
311
+ ignoreCase: true,
312
+ brackets: [
313
+ { open: '[', close: ']', token: 'delimiter.square' },
314
+ { open: '(', close: ')', token: 'delimiter.parenthesis' },
315
+ ],
316
+ keywords: DUCKDB_KEYWORDS,
317
+ operators: SQL_OPERATORS,
318
+ builtinFunctions: DUCKDB_FUNCTIONS,
319
+ builtinVariables: SQL_VARIABLES,
320
+ pseudoColumns: SQL_PSEUDO_COLUMNS,
321
+ tokenizer: {
322
+ root: [
323
+ { include: '@comments' },
324
+ { include: '@whitespace' },
325
+ { include: '@numbers' },
326
+ { include: '@strings' },
327
+ { include: '@complexIdentifiers' },
328
+ { include: '@scopes' },
329
+ [/[;,.]/, 'delimiter'],
330
+ [/[()]/, '@brackets'],
331
+ [
332
+ /[\w@#$]+/,
333
+ {
334
+ cases: {
335
+ '@keywords': 'keyword',
336
+ '@operators': 'operator',
337
+ '@builtinFunctions': 'predefined',
338
+ '@builtinVariables': 'predefined',
339
+ '@pseudoColumns': 'predefined',
340
+ '@default': 'identifier',
341
+ },
342
+ },
343
+ ],
344
+ [/[<>=!%&+\-*/|~^]/, 'operator'],
345
+ ],
346
+ whitespace: [[/\s+/, 'white']],
347
+ comments: [
348
+ [/--+.*/, 'comment'],
349
+ [/\/\*/, { token: 'comment.quote', next: '@comment' }],
350
+ ],
351
+ comment: [
352
+ [/[^*/]+/, 'comment'],
353
+ [/\*\//, { token: 'comment.quote', next: '@pop' }],
354
+ [/./, 'comment'],
355
+ ],
356
+ numbers: [
357
+ [/0[xX][0-9a-fA-F]*/, 'number'],
358
+ [/[$][+-]*\d*(\.\d*)?/, 'number'],
359
+ [/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/, 'number'],
360
+ ],
361
+ strings: [
362
+ [/'/, { token: 'string', next: '@string' }],
363
+ [/"/, { token: 'string.double', next: '@stringDouble' }],
364
+ ],
365
+ string: [
366
+ [/[^']+/, 'string'],
367
+ [/''/, 'string'],
368
+ [/'/, { token: 'string', next: '@pop' }],
369
+ ],
370
+ stringDouble: [
371
+ [/[^"]+/, 'string.double'],
372
+ [/""/, 'string.double'],
373
+ [/"/, { token: 'string.double', next: '@pop' }],
374
+ ],
375
+ complexIdentifiers: [
376
+ [/\[/, { token: 'identifier.quote', next: '@bracketedIdentifier' }],
377
+ [/"/, { token: 'identifier.quote', next: '@quotedIdentifier' }],
378
+ ],
379
+ bracketedIdentifier: [
380
+ [/[^\]]+/, 'identifier'],
381
+ [/]]/, 'identifier'],
382
+ [/]/, { token: 'identifier.quote', next: '@pop' }],
383
+ ],
384
+ quotedIdentifier: [
385
+ [/[^"]+/, 'identifier'],
386
+ [/""/, 'identifier'],
387
+ [/"/, { token: 'identifier.quote', next: '@pop' }],
388
+ ],
389
+ scopes: [],
390
+ },
391
+ };
392
+ //# sourceMappingURL=duckdb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duckdb.js","sourceRoot":"","sources":["../../src/constants/duckdb.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DuckDB SQL language constants for Monaco Editor\n */\n\n// DuckDB specific keywords\nexport const DUCKDB_KEYWORDS = [\n 'PRAGMA',\n 'RETURNING',\n 'QUALIFY',\n 'PIVOT',\n 'UNPIVOT',\n 'EXCLUDE',\n 'INCLUDE',\n 'WINDOW',\n 'FILTER',\n 'WITHIN',\n 'OVER',\n 'PARTITION',\n 'RANGE',\n 'ROWS',\n 'GROUPS',\n 'PRECEDING',\n 'FOLLOWING',\n 'CURRENT',\n 'ROW',\n 'TIES',\n 'OTHERS',\n 'EXCLUDE',\n 'RESPECT',\n 'NULLS',\n 'FIRST',\n 'LAST',\n 'MATERIALIZED',\n 'RECURSIVE',\n 'TEMPORARY',\n 'TEMP',\n 'UNLOGGED',\n 'GLOBAL',\n 'LOCAL',\n 'STORED',\n 'VIRTUAL',\n 'DELIMITED',\n 'CSV',\n 'JSON',\n 'COPY',\n 'DESCRIBE',\n 'EXPLAIN',\n 'SUMMARIZE',\n 'PROFILE',\n 'LOAD',\n 'INSTALL',\n 'FORCE',\n 'PARALLEL',\n 'SEQUENTIAL',\n 'PRAGMA',\n // Standard SQL keywords\n 'SELECT',\n 'FROM',\n 'WHERE',\n 'GROUP',\n 'BY',\n 'HAVING',\n 'ORDER',\n 'LIMIT',\n 'OFFSET',\n 'INSERT',\n 'INTO',\n 'VALUES',\n 'UPDATE',\n 'SET',\n 'DELETE',\n 'CREATE',\n 'ALTER',\n 'DROP',\n 'TABLE',\n 'VIEW',\n 'INDEX',\n 'TRIGGER',\n 'PROCEDURE',\n 'FUNCTION',\n 'DATABASE',\n 'SCHEMA',\n 'JOIN',\n 'INNER',\n 'LEFT',\n 'RIGHT',\n 'FULL',\n 'OUTER',\n 'CROSS',\n 'NATURAL',\n 'ON',\n 'USING',\n 'AND',\n 'OR',\n 'NOT',\n 'NULL',\n 'IS',\n 'IN',\n 'BETWEEN',\n 'LIKE',\n 'AS',\n 'CASE',\n 'WHEN',\n 'THEN',\n 'ELSE',\n 'END',\n 'DISTINCT',\n 'ALL',\n 'UNION',\n 'INTERSECT',\n 'EXCEPT',\n 'WITH',\n 'CAST',\n 'PRIMARY',\n 'KEY',\n 'FOREIGN',\n 'REFERENCES',\n 'CONSTRAINT',\n 'DEFAULT',\n 'CHECK',\n 'UNIQUE',\n 'INDEX',\n 'CASCADE',\n 'RESTRICT',\n 'ASC',\n 'DESC',\n 'IF',\n 'EXISTS',\n 'TRUE',\n 'FALSE',\n];\n\n// DuckDB functions\nexport const DUCKDB_FUNCTIONS = [\n // Aggregate functions\n 'ARRAY_AGG',\n 'AVG',\n 'BIT_AND',\n 'BIT_OR',\n 'BIT_XOR',\n 'COUNT',\n 'FIRST',\n 'LAST',\n 'LIST',\n 'MAX',\n 'MIN',\n 'STRING_AGG',\n 'SUM',\n 'MEDIAN',\n 'QUANTILE',\n 'APPROX_COUNT_DISTINCT',\n 'APPROX_QUANTILE',\n // Window functions\n 'ROW_NUMBER',\n 'RANK',\n 'DENSE_RANK',\n 'PERCENT_RANK',\n 'CUME_DIST',\n 'NTILE',\n 'LAG',\n 'LEAD',\n 'FIRST_VALUE',\n 'LAST_VALUE',\n 'NTH_VALUE',\n // Date functions\n 'AGE',\n 'DATE_PART',\n 'DATE_TRUNC',\n 'EXTRACT',\n 'GREATEST',\n 'LEAST',\n 'NOW',\n 'CURRENT_DATE',\n 'CURRENT_TIME',\n 'CURRENT_TIMESTAMP',\n 'EPOCH',\n 'STRFTIME',\n 'STRPTIME',\n 'TO_TIMESTAMP',\n // String functions\n 'CONCAT',\n 'LENGTH',\n 'LOWER',\n 'LPAD',\n 'LTRIM',\n 'REGEXP_MATCHES',\n 'REGEXP_REPLACE',\n 'REPEAT',\n 'REPLACE',\n 'REVERSE',\n 'RIGHT',\n 'RPAD',\n 'RTRIM',\n 'SPLIT',\n 'SUBSTRING',\n 'TRIM',\n 'UPPER',\n // Nested functions\n 'LIST_EXTRACT',\n 'LIST_ELEMENT',\n 'LIST_VALUE',\n 'STRUCT_EXTRACT',\n 'STRUCT_PACK',\n 'MAP',\n 'MAP_EXTRACT',\n // Math functions\n 'ABS',\n 'CEIL',\n 'CEILING',\n 'FLOOR',\n 'ROUND',\n 'SIGN',\n 'SQRT',\n 'CBRT',\n 'EXP',\n 'LN',\n 'LOG',\n 'POWER',\n 'MOD',\n 'RANDOM',\n 'SETSEED',\n 'ACOS',\n 'ASIN',\n 'ATAN',\n 'ATAN2',\n 'COS',\n 'COT',\n 'SIN',\n 'TAN',\n 'RADIANS',\n 'DEGREES',\n 'PI',\n // Other functions\n 'COALESCE',\n 'NULLIF',\n 'TYPEOF',\n 'CURRENT_SCHEMA',\n 'CURRENT_USER',\n 'HASH',\n 'UUID',\n 'CHAR_LENGTH',\n 'CHARACTER_LENGTH',\n 'POSITION',\n 'OVERLAY',\n 'CONCAT_WS',\n 'FORMAT',\n 'TO_CHAR',\n 'TO_DATE',\n 'TO_NUMBER',\n 'LOCALTIME',\n 'LOCALTIMESTAMP',\n 'JUSTIFY_DAYS',\n 'JUSTIFY_HOURS',\n 'JUSTIFY_INTERVAL',\n 'MAKE_DATE',\n 'MAKE_INTERVAL',\n 'MAKE_TIME',\n 'MAKE_TIMESTAMP',\n 'CLOCK_TIMESTAMP',\n 'STATEMENT_TIMESTAMP',\n 'TRANSACTION_TIMESTAMP',\n];\n\n// SQL operators\nexport const SQL_OPERATORS = [\n '+',\n '-',\n '*',\n '/',\n '%',\n '&',\n '|',\n '^',\n '=',\n '<>',\n '!=',\n '>',\n '>=',\n '<',\n '<=',\n '<<',\n '>>',\n '||',\n '::',\n '->>',\n '->',\n '~',\n '!',\n '@',\n];\n\n// SQL variables\nexport const SQL_VARIABLES = [\n '$1',\n '$2',\n '$3',\n '$4',\n '$5',\n '$6',\n '$7',\n '$8',\n '$9',\n];\n\n// SQL pseudo columns\nexport const SQL_PSEUDO_COLUMNS = [\n '$ACTION',\n '$IDENTITY',\n '$ROWGUID',\n '$PARTITION',\n];\n\n// SQL language configuration for Monaco Editor\nexport const SQL_LANGUAGE_CONFIGURATION = {\n defaultToken: '',\n tokenPostfix: '.sql',\n ignoreCase: true,\n\n brackets: [\n {open: '[', close: ']', token: 'delimiter.square'},\n {open: '(', close: ')', token: 'delimiter.parenthesis'},\n ],\n\n keywords: DUCKDB_KEYWORDS,\n operators: SQL_OPERATORS,\n builtinFunctions: DUCKDB_FUNCTIONS,\n builtinVariables: SQL_VARIABLES,\n pseudoColumns: SQL_PSEUDO_COLUMNS,\n\n tokenizer: {\n root: [\n {include: '@comments'},\n {include: '@whitespace'},\n {include: '@numbers'},\n {include: '@strings'},\n {include: '@complexIdentifiers'},\n {include: '@scopes'},\n [/[;,.]/, 'delimiter'],\n [/[()]/, '@brackets'],\n [\n /[\\w@#$]+/,\n {\n cases: {\n '@keywords': 'keyword',\n '@operators': 'operator',\n '@builtinFunctions': 'predefined',\n '@builtinVariables': 'predefined',\n '@pseudoColumns': 'predefined',\n '@default': 'identifier',\n },\n },\n ],\n [/[<>=!%&+\\-*/|~^]/, 'operator'],\n ],\n whitespace: [[/\\s+/, 'white']],\n comments: [\n [/--+.*/, 'comment'],\n [/\\/\\*/, {token: 'comment.quote', next: '@comment'}],\n ],\n comment: [\n [/[^*/]+/, 'comment'],\n [/\\*\\//, {token: 'comment.quote', next: '@pop'}],\n [/./, 'comment'],\n ],\n numbers: [\n [/0[xX][0-9a-fA-F]*/, 'number'],\n [/[$][+-]*\\d*(\\.\\d*)?/, 'number'],\n [/((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][\\-+]?\\d+)?/, 'number'],\n ],\n strings: [\n [/'/, {token: 'string', next: '@string'}],\n [/\"/, {token: 'string.double', next: '@stringDouble'}],\n ],\n string: [\n [/[^']+/, 'string'],\n [/''/, 'string'],\n [/'/, {token: 'string', next: '@pop'}],\n ],\n stringDouble: [\n [/[^\"]+/, 'string.double'],\n [/\"\"/, 'string.double'],\n [/\"/, {token: 'string.double', next: '@pop'}],\n ],\n complexIdentifiers: [\n [/\\[/, {token: 'identifier.quote', next: '@bracketedIdentifier'}],\n [/\"/, {token: 'identifier.quote', next: '@quotedIdentifier'}],\n ],\n bracketedIdentifier: [\n [/[^\\]]+/, 'identifier'],\n [/]]/, 'identifier'],\n [/]/, {token: 'identifier.quote', next: '@pop'}],\n ],\n quotedIdentifier: [\n [/[^\"]+/, 'identifier'],\n [/\"\"/, 'identifier'],\n [/\"/, {token: 'identifier.quote', next: '@pop'}],\n ],\n scopes: [],\n },\n};\n"]}
@@ -0,0 +1,5 @@
1
+ export * from './useQueryTabManagement';
2
+ export * from './useTableManagement';
3
+ export * from './useQueryExecution';
4
+ export * from './useMonacoEditor';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './useQueryTabManagement'; // Deprecated - use SqlEditorSlice methods directly
2
+ export * from './useTableManagement';
3
+ export * from './useQueryExecution';
4
+ export * from './useMonacoEditor';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC,CAAC,mDAAmD;AAC5F,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC","sourcesContent":["export * from './useQueryTabManagement'; // Deprecated - use SqlEditorSlice methods directly\nexport * from './useTableManagement';\nexport * from './useQueryExecution';\nexport * from './useMonacoEditor';\n"]}
@@ -0,0 +1,13 @@
1
+ type EditorInstance = any;
2
+ type MonacoInstance = any;
3
+ /**
4
+ * Hook for managing Monaco editor instances and keyboard shortcuts
5
+ */
6
+ export declare function useMonacoEditor(): {
7
+ editorInstances: Record<string, any>;
8
+ handleEditorMount: (editor: EditorInstance, monaco: MonacoInstance, queryId: string, onRunQuery: () => Promise<void>) => void;
9
+ getQueryText: (queryId: string, defaultQuery: string) => string;
10
+ setRunQueryHandler: (handler: () => Promise<void>) => void;
11
+ };
12
+ export {};
13
+ //# sourceMappingURL=useMonacoEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMonacoEditor.d.ts","sourceRoot":"","sources":["../../src/hooks/useMonacoEditor.ts"],"names":[],"mappings":"AAEA,KAAK,cAAc,GAAG,GAAG,CAAC;AAC1B,KAAK,cAAc,GAAG,GAAG,CAAC;AAE1B;;GAEG;AACH,wBAAgB,eAAe;;gCAsBjB,cAAc,UACd,cAAc,WACb,MAAM,cACH,MAAM,OAAO,CAAC,IAAI,CAAC;4BAoBvB,MAAM,gBAAgB,MAAM,KAAG,MAAM;kCAhCA,MAAM,OAAO,CAAC,IAAI,CAAC;EAuFrE"}
@@ -0,0 +1,78 @@
1
+ import { useRef, useState, useEffect, useCallback } from 'react';
2
+ /**
3
+ * Hook for managing Monaco editor instances and keyboard shortcuts
4
+ */
5
+ export function useMonacoEditor() {
6
+ // Store editor instances for each query tab
7
+ const [editorInstances, setEditorInstances] = useState({});
8
+ // Use a ref for the run query function to avoid dependency issues
9
+ // This ref is NOT for Zustand selectors, it's for function reference stability
10
+ const handleRunQueryRef = useRef(async () => { });
11
+ /**
12
+ * Set the run query handler reference
13
+ */
14
+ const setRunQueryHandler = useCallback((handler) => {
15
+ handleRunQueryRef.current = handler;
16
+ }, []);
17
+ /**
18
+ * Handle editor mounting and setup keyboard shortcuts
19
+ */
20
+ const handleEditorMount = useCallback((editor, monaco, queryId, onRunQuery) => {
21
+ // Store the editor instance
22
+ setEditorInstances((prev) => ({
23
+ ...prev,
24
+ [queryId]: editor,
25
+ }));
26
+ // Add Cmd/Ctrl+Enter keyboard shortcut to run query
27
+ editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, () => {
28
+ void handleRunQueryRef.current();
29
+ });
30
+ }, []);
31
+ /**
32
+ * Get selected text or entire query from the editor
33
+ */
34
+ const getQueryText = useCallback((queryId, defaultQuery) => {
35
+ const editor = editorInstances[queryId];
36
+ if (!editor)
37
+ return defaultQuery;
38
+ const selection = editor.getSelection();
39
+ if (selection &&
40
+ !selection.isEmpty() &&
41
+ typeof editor.getModel().getValueInRange === 'function') {
42
+ // Return selected text
43
+ return editor.getModel().getValueInRange(selection);
44
+ }
45
+ // Return the entire query if no selection
46
+ return defaultQuery;
47
+ }, [editorInstances]);
48
+ /**
49
+ * Setup global keyboard shortcuts for running queries
50
+ */
51
+ useEffect(() => {
52
+ // This global event listener is a fallback for when the editor doesn't have focus
53
+ const handleKeyDown = (evt) => {
54
+ if (evt instanceof KeyboardEvent &&
55
+ evt.key === 'Enter' &&
56
+ (evt.metaKey || evt.ctrlKey || evt.shiftKey)) {
57
+ // Check if the event target is not part of the Monaco editor
58
+ const target = evt.target;
59
+ const isMonacoEditor = target.closest('.monaco-editor');
60
+ // Only handle the event if it's not already being handled by Monaco
61
+ if (!isMonacoEditor) {
62
+ void handleRunQueryRef.current();
63
+ }
64
+ }
65
+ };
66
+ globalThis.addEventListener('keydown', handleKeyDown);
67
+ return () => {
68
+ globalThis.removeEventListener('keydown', handleKeyDown);
69
+ };
70
+ }, []);
71
+ return {
72
+ editorInstances,
73
+ handleEditorMount,
74
+ getQueryText,
75
+ setRunQueryHandler,
76
+ };
77
+ }
78
+ //# sourceMappingURL=useMonacoEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMonacoEditor.js","sourceRoot":"","sources":["../../src/hooks/useMonacoEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import {useRef, useState, useEffect, useCallback} from 'react';\n\ntype EditorInstance = any;\ntype MonacoInstance = any;\n\n/**\n * Hook for managing Monaco editor instances and keyboard shortcuts\n */\nexport function useMonacoEditor() {\n // Store editor instances for each query tab\n const [editorInstances, setEditorInstances] = useState<\n Record<string, EditorInstance>\n >({});\n\n // Use a ref for the run query function to avoid dependency issues\n // This ref is NOT for Zustand selectors, it's for function reference stability\n const handleRunQueryRef = useRef<() => Promise<void>>(async () => {});\n\n /**\n * Set the run query handler reference\n */\n const setRunQueryHandler = useCallback((handler: () => Promise<void>) => {\n handleRunQueryRef.current = handler;\n }, []);\n\n /**\n * Handle editor mounting and setup keyboard shortcuts\n */\n const handleEditorMount = useCallback(\n (\n editor: EditorInstance,\n monaco: MonacoInstance,\n queryId: string,\n onRunQuery: () => Promise<void>,\n ) => {\n // Store the editor instance\n setEditorInstances((prev) => ({\n ...prev,\n [queryId]: editor,\n }));\n\n // Add Cmd/Ctrl+Enter keyboard shortcut to run query\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, () => {\n void handleRunQueryRef.current();\n });\n },\n [],\n );\n\n /**\n * Get selected text or entire query from the editor\n */\n const getQueryText = useCallback(\n (queryId: string, defaultQuery: string): string => {\n const editor = editorInstances[queryId];\n if (!editor) return defaultQuery;\n\n const selection = editor.getSelection();\n if (\n selection &&\n !selection.isEmpty() &&\n typeof editor.getModel().getValueInRange === 'function'\n ) {\n // Return selected text\n return editor.getModel().getValueInRange(selection);\n }\n\n // Return the entire query if no selection\n return defaultQuery;\n },\n [editorInstances],\n );\n\n /**\n * Setup global keyboard shortcuts for running queries\n */\n useEffect(() => {\n // This global event listener is a fallback for when the editor doesn't have focus\n const handleKeyDown = (evt: Event) => {\n if (\n evt instanceof KeyboardEvent &&\n evt.key === 'Enter' &&\n (evt.metaKey || evt.ctrlKey || evt.shiftKey)\n ) {\n // Check if the event target is not part of the Monaco editor\n const target = evt.target as HTMLElement;\n const isMonacoEditor = target.closest('.monaco-editor');\n\n // Only handle the event if it's not already being handled by Monaco\n if (!isMonacoEditor) {\n void handleRunQueryRef.current();\n }\n }\n };\n\n globalThis.addEventListener('keydown', handleKeyDown);\n\n return () => {\n globalThis.removeEventListener('keydown', handleKeyDown);\n };\n }, []);\n\n return {\n editorInstances,\n handleEditorMount,\n getQueryText,\n setRunQueryHandler,\n };\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import { Table } from 'apache-arrow';
2
+ /**
3
+ * Hook for executing SQL queries and managing results
4
+ */
5
+ export declare function useQueryExecution(schema?: string): {
6
+ results: Table<any> | undefined;
7
+ resultsTableData: {
8
+ data: ArrayLike<any>;
9
+ columns: import("@tanstack/table-core").ColumnDef<any, any>[];
10
+ } | undefined;
11
+ loading: boolean;
12
+ error: string | null;
13
+ runQuery: (q: string) => Promise<Table<any> | undefined>;
14
+ exportResults: () => void;
15
+ clearResults: () => void;
16
+ };
17
+ //# sourceMappingURL=useQueryExecution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQueryExecution.d.ts","sourceRoot":"","sources":["../../src/hooks/useQueryExecution.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAInC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,MAAe;;;;;;;;kBAkB3C,MAAM;;;EAgDnB"}
@@ -0,0 +1,61 @@
1
+ import { useState, useCallback } from 'react';
2
+ import { useArrowDataTable } from '@sqlrooms/data-table';
3
+ import { useStoreWithSqlEditor } from '../SqlEditorSlice';
4
+ /**
5
+ * Hook for executing SQL queries and managing results
6
+ */
7
+ export function useQueryExecution(schema = 'main') {
8
+ const [results, setResults] = useState();
9
+ const resultsTableData = useArrowDataTable(results);
10
+ const [loading, setLoading] = useState(false);
11
+ const [error, setError] = useState(null);
12
+ // Get functions from SqlEditorSlice directly
13
+ const executeQueryFromSlice = useStoreWithSqlEditor((s) => s.sqlEditor.executeQuery);
14
+ const exportResultsToCsv = useStoreWithSqlEditor((s) => s.sqlEditor.exportResultsToCsv);
15
+ /**
16
+ * Execute a SQL query
17
+ */
18
+ const runQuery = useCallback(async (q) => {
19
+ try {
20
+ setLoading(true);
21
+ setError(null);
22
+ const { results: queryResults, error: queryError } = await executeQueryFromSlice(q, schema);
23
+ if (queryError) {
24
+ setError(queryError);
25
+ setResults(undefined);
26
+ }
27
+ else if (queryResults) {
28
+ setResults(queryResults);
29
+ }
30
+ return queryResults;
31
+ }
32
+ finally {
33
+ setLoading(false);
34
+ }
35
+ }, [executeQueryFromSlice, schema]);
36
+ /**
37
+ * Export query results to CSV
38
+ */
39
+ const exportResults = useCallback(() => {
40
+ if (!results)
41
+ return;
42
+ exportResultsToCsv(results);
43
+ }, [exportResultsToCsv, results]);
44
+ /**
45
+ * Clear current query results
46
+ */
47
+ const clearResults = useCallback(() => {
48
+ setResults(undefined);
49
+ setError(null);
50
+ }, []);
51
+ return {
52
+ results,
53
+ resultsTableData,
54
+ loading,
55
+ error,
56
+ runQuery,
57
+ exportResults,
58
+ clearResults,
59
+ };
60
+ }
61
+ //# sourceMappingURL=useQueryExecution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQueryExecution.js","sourceRoot":"","sources":["../../src/hooks/useQueryExecution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAC,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB,MAAM;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAS,CAAC;IAChD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,6CAA6C;IAC7C,MAAM,qBAAqB,GAAG,qBAAqB,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAChC,CAAC;IACF,MAAM,kBAAkB,GAAG,qBAAqB,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CACtC,CAAC;IAEF;;OAEG;IACH,MAAM,QAAQ,GAAG,WAAW,CAC1B,KAAK,EAAE,CAAS,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEf,MAAM,EAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAC,GAC9C,MAAM,qBAAqB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAEzC,IAAI,UAAU,EAAE,CAAC;gBACf,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACrB,UAAU,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,YAAY,EAAE,CAAC;gBACxB,UAAU,CAAC,YAAY,CAAC,CAAC;YAC3B,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EACD,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAChC,CAAC;IAEF;;OAEG;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,EAAE,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC;IAElC;;OAEG;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,OAAO;QACP,gBAAgB;QAChB,OAAO;QACP,KAAK;QACL,QAAQ;QACR,aAAa;QACb,YAAY;KACb,CAAC;AACJ,CAAC","sourcesContent":["import {useState, useCallback} from 'react';\nimport {Table} from 'apache-arrow';\nimport {useArrowDataTable} from '@sqlrooms/data-table';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\n\n/**\n * Hook for executing SQL queries and managing results\n */\nexport function useQueryExecution(schema: string = 'main') {\n const [results, setResults] = useState<Table>();\n const resultsTableData = useArrowDataTable(results);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Get functions from SqlEditorSlice directly\n const executeQueryFromSlice = useStoreWithSqlEditor(\n (s) => s.sqlEditor.executeQuery,\n );\n const exportResultsToCsv = useStoreWithSqlEditor(\n (s) => s.sqlEditor.exportResultsToCsv,\n );\n\n /**\n * Execute a SQL query\n */\n const runQuery = useCallback(\n async (q: string) => {\n try {\n setLoading(true);\n setError(null);\n\n const {results: queryResults, error: queryError} =\n await executeQueryFromSlice(q, schema);\n\n if (queryError) {\n setError(queryError);\n setResults(undefined);\n } else if (queryResults) {\n setResults(queryResults);\n }\n\n return queryResults;\n } finally {\n setLoading(false);\n }\n },\n [executeQueryFromSlice, schema],\n );\n\n /**\n * Export query results to CSV\n */\n const exportResults = useCallback(() => {\n if (!results) return;\n exportResultsToCsv(results);\n }, [exportResultsToCsv, results]);\n\n /**\n * Clear current query results\n */\n const clearResults = useCallback(() => {\n setResults(undefined);\n setError(null);\n }, []);\n\n return {\n results,\n resultsTableData,\n loading,\n error,\n runQuery,\n exportResults,\n clearResults,\n };\n}\n"]}