@sqlrooms/sql-editor 0.28.0 → 0.29.0-rc.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.
@@ -1 +1 @@
1
- {"version":3,"file":"SqlEditorSlice.d.ts","sourceRoot":"","sources":["../src/SqlEditorSlice.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SqlEditorSlice.d.ts","sourceRoot":"","sources":["../src/SqlEditorSlice.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { createId } from '@paralleldrive/cuid2';
2
- import { getSqlErrorWithPointer, joinStatements, makeLimitQuery, separateLastStatement, } from '@sqlrooms/duckdb';
2
+ import { getSqlErrorWithPointer, joinStatements, makeLimitQuery, separateLastStatement, } from '@sqlrooms/db';
3
3
  import { createSlice, registerCommandsForOwner, unregisterCommandsForOwner, useBaseRoomShellStore, } from '@sqlrooms/room-shell';
4
4
  import { createDefaultSqlEditorConfig, } from '@sqlrooms/sql-editor-config';
5
5
  import { generateUniqueName } from '@sqlrooms/utils';
@@ -48,7 +48,7 @@ export function createSqlEditorSlice({ config = createDefaultSqlEditorConfig(),
48
48
  const now = Date.now();
49
49
  const newQuery = {
50
50
  id: createId(),
51
- name: generateUniqueName('Untitled', sqlEditorConfig.queries.map((q) => q.name)),
51
+ name: generateUniqueName('Untitled 1', sqlEditorConfig.queries.map((q) => q.name), ' '),
52
52
  query: initialQuery,
53
53
  lastOpenedAt: now,
54
54
  };
@@ -211,6 +211,7 @@ export function createSqlEditorSlice({ config = createDefaultSqlEditorConfig(),
211
211
  }));
212
212
  let queryResult;
213
213
  try {
214
+ const dbConnectors = get().db.connectors;
214
215
  const connector = await get().db.getConnector();
215
216
  const signal = queryController.signal;
216
217
  const { precedingStatements, lastStatement: lastQueryStatement } = separateLastStatement(query);
@@ -230,7 +231,13 @@ export function createSqlEditorSlice({ config = createDefaultSqlEditorConfig(),
230
231
  limit: get().sqlEditor.queryResultLimit,
231
232
  });
232
233
  const queryWithLimit = joinStatements(precedingStatements, limitedLastStatement);
233
- const result = await connector.query(queryWithLimit, { signal });
234
+ const result = dbConnectors?.runQuery
235
+ ? (await dbConnectors.runQuery({
236
+ sql: queryWithLimit,
237
+ queryType: 'arrow',
238
+ signal,
239
+ }))?.arrowTable
240
+ : await connector.query(queryWithLimit, { signal });
234
241
  queryResult = {
235
242
  status: 'success',
236
243
  type: 'select',
@@ -246,7 +253,15 @@ export function createSqlEditorSlice({ config = createDefaultSqlEditorConfig(),
246
253
  throw (`${parsedLastStatement.error_type} ${parsedLastStatement.error_subtype}: ${parsedLastStatement.error_message}` +
247
254
  `\n${getSqlErrorWithPointer(lastQueryStatement, Number(parsedLastStatement.position)).formatted}`);
248
255
  }
249
- const result = await connector.query(query, { signal });
256
+ const result = dbConnectors?.runQuery
257
+ ? (await dbConnectors.runQuery({
258
+ sql: query,
259
+ queryType: /^(EXPLAIN|PRAGMA)/i.test(lastQueryStatement)
260
+ ? 'arrow'
261
+ : 'exec',
262
+ signal,
263
+ }))?.arrowTable
264
+ : await connector.query(query, { signal });
250
265
  // EXPLAIN and PRAGMA are not detected as select queries
251
266
  // and we cannot wrap them in a SELECT * FROM,
252
267
  // but we can still execute them and return the result
@@ -351,7 +366,7 @@ function createSqlEditorCommands() {
351
366
  riskLevel: 'medium',
352
367
  },
353
368
  ui: {
354
- shortcut: 'Mod+Enter',
369
+ keystrokes: 'Mod+Enter',
355
370
  },
356
371
  isEnabled: ({ getState }) => {
357
372
  const state = getState();
@@ -1 +1 @@
1
- {"version":3,"file":"SqlEditorSlice.js","sourceRoot":"","sources":["../src/SqlEditorSlice.tsx"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n DuckDbSliceState,\n getSqlErrorWithPointer,\n joinStatements,\n makeLimitQuery,\n separateLastStatement,\n} from '@sqlrooms/duckdb';\nimport {\n BaseRoomStoreState,\n createSlice,\n registerCommandsForOwner,\n RoomCommand,\n RoomShellSliceState,\n StateCreator,\n unregisterCommandsForOwner,\n useBaseRoomShellStore,\n} from '@sqlrooms/room-shell';\nimport {\n createDefaultSqlEditorConfig,\n SqlEditorSliceConfig,\n} from '@sqlrooms/sql-editor-config';\nimport {generateUniqueName} from '@sqlrooms/utils';\nimport * as arrow from 'apache-arrow';\nimport {csvFormat} from 'd3-dsv';\nimport {saveAs} from 'file-saver';\nimport {produce} from 'immer';\nimport {z} from 'zod';\n\nconst SQL_EDITOR_COMMAND_OWNER = '@sqlrooms/sql-editor';\n\nexport type QueryResult =\n | {status: 'loading'; isBeingAborted?: boolean; controller: AbortController}\n | {status: 'aborted'}\n | {status: 'error'; error: string}\n | {\n status: 'success';\n type: 'pragma' | 'explain' | 'select';\n result: arrow.Table | undefined;\n query: string;\n lastQueryStatement: string;\n }\n | {\n status: 'success';\n type: 'exec';\n query: string;\n lastQueryStatement: string;\n };\n\nexport function isQueryWithResult(\n queryResult: QueryResult | undefined,\n): queryResult is QueryResult & {\n status: 'success';\n type: 'pragma' | 'explain' | 'select';\n} {\n return (\n queryResult?.status === 'success' &&\n (queryResult.type === 'pragma' ||\n queryResult.type === 'explain' ||\n queryResult.type === 'select')\n );\n}\n\nexport type SqlEditorSliceState = {\n sqlEditor: {\n initialize?: () => Promise<void>;\n destroy?: () => Promise<void>;\n config: SqlEditorSliceConfig;\n // Runtime state\n /**\n * Query results keyed by queryId (tab id).\n */\n queryResultsById: Record<string, QueryResult | undefined>;\n /** @deprecated */\n selectedTable?: string;\n /** @deprecated Use `useStoreWithSqlEditor((s) => s.db.isRefreshingTableSchemas)` instead. */\n isTablesLoading: boolean;\n /** @deprecated */\n tablesError?: string;\n\n queryResultLimit: number;\n /** Options for the result limit dropdown */\n queryResultLimitOptions: number[];\n\n /**\n * Set the config for the sql editor slice.\n */\n setConfig(config: SqlEditorSliceConfig): void;\n\n /**\n * Run the currently selected query.\n */\n parseAndRunQuery(query: string): Promise<void>;\n\n /**\n * Run the currently selected query.\n */\n parseAndRunCurrentQuery(): Promise<void>;\n\n /**\n * Abort the currently running query.\n */\n abortCurrentQuery(): void;\n\n /**\n * Export query results to CSV.\n * @deprecated Use `useExportToCsv` from `@sqlrooms/duckdb` instead.\n */\n exportResultsToCsv(results: arrow.Table, filename?: string): void;\n\n /**\n * Create a new query tab.\n * @param initialQuery - Optional initial query text.\n */\n createQueryTab(initialQuery?: string): {\n id: string;\n name: string;\n query: string;\n };\n\n /**\n * Delete a query tab.\n * @param queryId - The ID of the query to delete.\n */\n deleteQueryTab(queryId: string): void;\n\n /**\n * Rename a query tab.\n * @param queryId - The ID of the query to rename.\n * @param newName - The new name for the query.\n */\n renameQueryTab(queryId: string, newName: string): void;\n\n /**\n * Close a query tab.\n * @param queryId - The ID of the query to close.\n */\n closeQueryTab(queryId: string): void;\n\n /**\n * Open a closed tab id.\n * @param queryId - The ID of the query to open.\n */\n openQueryTab(queryId: string): void;\n\n /**\n * Set the list of open tab IDs. Used for reordering or opening tabs.\n * @param tabIds - The new list of open tab IDs.\n */\n setOpenTabs(tabIds: string[]): void;\n\n /**\n * Update the SQL text for a query.\n * @param queryId - The ID of the query to update.\n * @param queryText - The new SQL text.\n */\n updateQueryText(queryId: string, queryText: string): void;\n\n /**\n * Set the selected query tab.\n * @param queryId - The ID of the query to select.\n */\n setSelectedQueryId(queryId: string): void;\n\n /**\n * Get the currently selected query's SQL text.\n */\n getCurrentQuery(): string;\n\n /** @deprecated */\n selectTable(table: string | undefined): void;\n\n clearQueryResults(): void;\n\n setQueryResultLimit(limit: number): void;\n };\n};\n\nexport function createSqlEditorSlice({\n config = createDefaultSqlEditorConfig(),\n queryResultLimit = 100,\n queryResultLimitOptions = [100, 500, 1000],\n}: {\n config?: SqlEditorSliceConfig;\n queryResultLimit?: number;\n queryResultLimitOptions?: number[];\n} = {}): StateCreator<SqlEditorSliceState> {\n return createSlice<\n SqlEditorSliceState,\n BaseRoomStoreState & DuckDbSliceState & SqlEditorSliceState\n >((set, get, store) => {\n return {\n sqlEditor: {\n initialize: async () => {\n registerCommandsForOwner(\n store,\n SQL_EDITOR_COMMAND_OWNER,\n createSqlEditorCommands(),\n );\n },\n destroy: async () => {\n unregisterCommandsForOwner(store, SQL_EDITOR_COMMAND_OWNER);\n },\n config,\n // Initialize runtime state\n queryResultsById: {},\n isTablesLoading: false,\n queryResultLimit,\n queryResultLimitOptions,\n\n setConfig: (config) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config = config;\n }),\n );\n },\n\n exportResultsToCsv: (results, filename) => {\n if (!results) return;\n const blob = new Blob([csvFormat(results.toArray())], {\n type: 'text/plain;charset=utf-8',\n });\n saveAs(blob, filename || `export-${createId().substring(0, 5)}.csv`);\n },\n\n createQueryTab: (initialQuery = '') => {\n const sqlEditorConfig = get().sqlEditor.config;\n const now = Date.now();\n const newQuery = {\n id: createId(),\n name: generateUniqueName(\n 'Untitled',\n sqlEditorConfig.queries.map((q) => q.name),\n ),\n query: initialQuery,\n lastOpenedAt: now,\n };\n\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.queries.push(newQuery);\n draft.sqlEditor.config.openTabs.push(newQuery.id);\n draft.sqlEditor.config.selectedQueryId = newQuery.id;\n }),\n );\n\n return newQuery;\n },\n\n deleteQueryTab: (queryId) => {\n const sqlEditorConfig = get().sqlEditor.config;\n const queries = sqlEditorConfig.queries;\n const openTabs = sqlEditorConfig.openTabs;\n\n if (queries.length <= 1) {\n // Don't delete the last query\n return;\n }\n\n const wasSelected = sqlEditorConfig.selectedQueryId === queryId;\n const deletingOpenIndex = openTabs.indexOf(queryId);\n const filteredQueries = queries.filter((q) => q.id !== queryId);\n\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.queries = filteredQueries;\n draft.sqlEditor.config.openTabs = openTabs.filter(\n (id) => id !== queryId,\n );\n const {[queryId]: _removed, ...rest} =\n draft.sqlEditor.queryResultsById;\n draft.sqlEditor.queryResultsById = rest;\n\n // If we deleted the selected query, select another one\n if (wasSelected) {\n const newOpenTabs = draft.sqlEditor.config.openTabs;\n const remainingQueries = draft.sqlEditor.config.queries;\n\n if (newOpenTabs.length > 0) {\n // Select from remaining open tabs\n const newIndex =\n deletingOpenIndex === 0\n ? 0\n : Math.min(deletingOpenIndex - 1, newOpenTabs.length - 1);\n const newSelectedId = newOpenTabs[newIndex];\n if (newSelectedId) {\n draft.sqlEditor.config.selectedQueryId = newSelectedId;\n const newSelectedQuery =\n draft.sqlEditor.config.queries.find(\n (q) => q.id === newSelectedId,\n );\n if (newSelectedQuery) {\n newSelectedQuery.lastOpenedAt = Date.now();\n }\n }\n } else if (remainingQueries.length > 0) {\n // No open tabs left, open a closed query\n const queryToOpen = remainingQueries[0];\n if (queryToOpen) {\n draft.sqlEditor.config.openTabs.push(queryToOpen.id);\n draft.sqlEditor.config.selectedQueryId = queryToOpen.id;\n queryToOpen.lastOpenedAt = Date.now();\n }\n }\n }\n }),\n );\n },\n\n renameQueryTab: (queryId, newName) => {\n set((state) =>\n produce(state, (draft) => {\n const query = draft.sqlEditor.config.queries.find(\n (q) => q.id === queryId,\n );\n if (query) {\n query.name = newName || query.name;\n }\n }),\n );\n },\n\n closeQueryTab: (queryId) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.openTabs =\n draft.sqlEditor.config.openTabs.filter((id) => id !== queryId);\n }),\n );\n },\n\n openQueryTab: (queryId) => {\n set((state) =>\n produce(state, (draft) => {\n if (!draft.sqlEditor.config.openTabs.includes(queryId)) {\n draft.sqlEditor.config.openTabs.push(queryId);\n }\n draft.sqlEditor.config.selectedQueryId = queryId;\n const query = draft.sqlEditor.config.queries.find(\n (q) => q.id === queryId,\n );\n if (query) {\n query.lastOpenedAt = Date.now();\n }\n }),\n );\n },\n\n setOpenTabs: (tabIds) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.openTabs = tabIds;\n }),\n );\n },\n\n updateQueryText: (queryId, queryText) => {\n set((state) =>\n produce(state, (draft) => {\n const query = draft.sqlEditor.config.queries.find(\n (q) => q.id === queryId,\n );\n if (query) {\n query.query = queryText;\n }\n }),\n );\n },\n\n setSelectedQueryId: (queryId) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.selectedQueryId = queryId;\n const query = draft.sqlEditor.config.queries.find(\n (q) => q.id === queryId,\n );\n if (query) {\n query.lastOpenedAt = Date.now();\n }\n }),\n );\n },\n\n getCurrentQuery: () => {\n const sqlEditorConfig = get().sqlEditor.config;\n const selectedId = sqlEditorConfig.selectedQueryId;\n const query = sqlEditorConfig.queries.find(\n (q) => q.id === selectedId,\n );\n return query?.query || '';\n },\n\n /** @deprecated */\n selectTable: (table) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.selectedTable = table;\n }),\n );\n },\n\n clearQueryResults: () => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.queryResultsById = {};\n }),\n );\n },\n\n parseAndRunCurrentQuery: async (): Promise<void> =>\n get().sqlEditor.parseAndRunQuery(get().sqlEditor.getCurrentQuery()),\n\n abortCurrentQuery: () => {\n const selectedQueryId = get().sqlEditor.config.selectedQueryId;\n const currentResult =\n get().sqlEditor.queryResultsById[selectedQueryId];\n if (currentResult?.status === 'loading' && currentResult.controller) {\n currentResult.controller.abort();\n }\n\n set((state) =>\n produce(state, (draft) => {\n const result = draft.sqlEditor.queryResultsById[selectedQueryId];\n if (result?.status === 'loading') {\n result.isBeingAborted = true;\n }\n }),\n );\n },\n\n setQueryResultLimit: (limit) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.queryResultLimit = limit;\n }),\n );\n },\n\n parseAndRunQuery: async (query): Promise<void> => {\n const selectedQueryId = get().sqlEditor.config.selectedQueryId;\n const existingResult =\n get().sqlEditor.queryResultsById[selectedQueryId];\n if (existingResult?.status === 'loading') {\n throw new Error('Query already running');\n }\n if (!query.trim()) {\n return;\n }\n\n // Create abort controller for this query execution\n const queryController = new AbortController();\n\n // First update loading state and clear results\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.selectedTable = undefined;\n draft.sqlEditor.queryResultsById[selectedQueryId] = {\n status: 'loading',\n isBeingAborted: false,\n controller: queryController,\n };\n }),\n );\n\n let queryResult: QueryResult;\n try {\n const connector = await get().db.getConnector();\n const signal = queryController.signal;\n\n const {precedingStatements, lastStatement: lastQueryStatement} =\n separateLastStatement(query);\n const hasMultipleStatements = precedingStatements.length > 0;\n\n if (signal.aborted) {\n throw new Error('Query aborted');\n }\n\n const parsedLastStatement =\n await get().db.sqlSelectToJson(lastQueryStatement);\n\n if (signal.aborted) {\n throw new Error('Query aborted');\n }\n\n const isValidSelectQuery = !parsedLastStatement.error;\n\n if (isValidSelectQuery) {\n // Add limit to the last statement\n const limitedLastStatement = makeLimitQuery(lastQueryStatement, {\n sanitize: false, // should already be sanitized\n limit: get().sqlEditor.queryResultLimit,\n });\n const queryWithLimit = joinStatements(\n precedingStatements,\n limitedLastStatement,\n );\n const result = await connector.query(queryWithLimit, {signal});\n queryResult = {\n status: 'success',\n type: 'select',\n query,\n lastQueryStatement,\n result,\n };\n } else {\n // Run the complete query as it is\n if (\n parsedLastStatement.error &&\n parsedLastStatement.error_type !== 'not implemented'\n ) {\n throw (\n `${parsedLastStatement.error_type} ${parsedLastStatement.error_subtype}: ${parsedLastStatement.error_message}` +\n `\\n${getSqlErrorWithPointer(lastQueryStatement, Number(parsedLastStatement.position)).formatted}`\n );\n }\n\n const result = await connector.query(query, {signal});\n // EXPLAIN and PRAGMA are not detected as select queries\n // and we cannot wrap them in a SELECT * FROM,\n // but we can still execute them and return the result\n if (/^(EXPLAIN)/i.test(lastQueryStatement)) {\n queryResult = {\n status: 'success',\n type: 'explain',\n query,\n lastQueryStatement,\n result,\n };\n } else if (/^(PRAGMA)/i.test(lastQueryStatement)) {\n queryResult = {\n status: 'success',\n type: 'pragma',\n query,\n lastQueryStatement,\n result,\n };\n } else {\n queryResult = {\n status: 'success',\n type: 'exec',\n query,\n lastQueryStatement,\n };\n }\n }\n if (signal.aborted) {\n throw new Error('Query aborted');\n }\n // Refresh table schemas if there are multiple statements or if the\n // last statement is not a select query\n if (hasMultipleStatements || !isValidSelectQuery) {\n get().db.refreshTableSchemas();\n }\n if (signal.aborted) {\n throw new Error('Query aborted');\n }\n } catch (e) {\n console.error(e);\n const errorMessage = e instanceof Error ? e.message : String(e);\n if (\n errorMessage === 'Query aborted' ||\n queryController.signal.aborted\n ) {\n queryResult = {status: 'aborted'};\n } else {\n queryResult = {\n status: 'error',\n error: errorMessage,\n };\n }\n }\n\n // Update state without Immer since Arrow Tables don't play well with drafts.\n set((state) => ({\n ...state,\n sqlEditor: {\n ...state.sqlEditor,\n queryResultsById: {\n ...state.sqlEditor.queryResultsById,\n [selectedQueryId]: queryResult,\n },\n },\n }));\n },\n },\n } satisfies SqlEditorSliceState;\n });\n}\n\ntype RoomStateWithSqlEditor = RoomShellSliceState & SqlEditorSliceState;\n\ntype SqlEditorCommandStoreState = BaseRoomStoreState &\n DuckDbSliceState &\n SqlEditorSliceState;\n\nconst SqlEditorRunQueryCommandInput = z.object({\n query: z.string().describe('SQL query text to run.'),\n});\ntype SqlEditorRunQueryCommandInput = z.infer<\n typeof SqlEditorRunQueryCommandInput\n>;\n\nconst SqlEditorTabIdInput = z.object({\n queryId: z.string().describe('ID of the query tab.'),\n});\ntype SqlEditorTabIdInput = z.infer<typeof SqlEditorTabIdInput>;\n\nconst SqlEditorRenameTabInput = z.object({\n queryId: z.string().describe('ID of the query tab to rename.'),\n name: z.string().min(1).describe('New tab name.'),\n});\ntype SqlEditorRenameTabInput = z.infer<typeof SqlEditorRenameTabInput>;\n\nconst SqlEditorResultLimitInput = z.object({\n limit: z.number().int().positive().describe('Row limit for query results.'),\n});\ntype SqlEditorResultLimitInput = z.infer<typeof SqlEditorResultLimitInput>;\n\nfunction createSqlEditorCommands(): RoomCommand<SqlEditorCommandStoreState>[] {\n const ensureQueryTabExists = (\n state: SqlEditorCommandStoreState,\n queryId: string,\n ) => {\n if (!state.sqlEditor.config.queries.some((query) => query.id === queryId)) {\n throw new Error(`Unknown query tab \"${queryId}\".`);\n }\n };\n\n return [\n {\n id: 'sql-editor.run-current-query',\n name: 'Run current query',\n description: 'Execute the selected SQL query tab',\n group: 'SQL Editor',\n keywords: ['sql', 'run', 'execute', 'query'],\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'medium',\n },\n ui: {\n shortcut: 'Mod+Enter',\n },\n isEnabled: ({getState}) => {\n const state = getState();\n const selectedQueryId = state.sqlEditor.config.selectedQueryId;\n const queryResult = state.sqlEditor.queryResultsById[selectedQueryId];\n return (\n queryResult?.status !== 'loading' &&\n state.sqlEditor.getCurrentQuery().trim().length > 0\n );\n },\n execute: async ({getState}) => {\n await getState().sqlEditor.parseAndRunCurrentQuery();\n return {\n success: true,\n commandId: 'sql-editor.run-current-query',\n message: 'Executed current query.',\n };\n },\n },\n {\n id: 'sql-editor.run-query',\n name: 'Run query text',\n description: 'Execute an explicitly provided SQL query',\n group: 'SQL Editor',\n keywords: ['sql', 'run', 'execute', 'query', 'text'],\n inputSchema: SqlEditorRunQueryCommandInput,\n inputDescription: 'Provide query SQL to execute.',\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'medium',\n },\n execute: async ({getState}, input) => {\n const {query} = input as SqlEditorRunQueryCommandInput;\n await getState().sqlEditor.parseAndRunQuery(query);\n return {\n success: true,\n commandId: 'sql-editor.run-query',\n message: 'Executed SQL query.',\n };\n },\n },\n {\n id: 'sql-editor.abort-current-query',\n name: 'Abort current query',\n description: 'Cancel the currently running SQL query',\n group: 'SQL Editor',\n keywords: ['sql', 'abort', 'cancel', 'query'],\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n isEnabled: ({getState}) => {\n const state = getState();\n const selectedQueryId = state.sqlEditor.config.selectedQueryId;\n return (\n state.sqlEditor.queryResultsById[selectedQueryId]?.status ===\n 'loading'\n );\n },\n execute: ({getState}) => {\n getState().sqlEditor.abortCurrentQuery();\n return {\n success: true,\n commandId: 'sql-editor.abort-current-query',\n message: 'Abort signal sent to current query.',\n };\n },\n },\n {\n id: 'sql-editor.create-query-tab',\n name: 'Create query tab',\n description: 'Open a new SQL query tab',\n group: 'SQL Editor',\n keywords: ['sql', 'tab', 'new', 'query'],\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'low',\n },\n execute: ({getState}) => {\n const newTab = getState().sqlEditor.createQueryTab();\n return {\n success: true,\n commandId: 'sql-editor.create-query-tab',\n message: `Created query tab \"${newTab.name}\".`,\n data: {\n queryId: newTab.id,\n },\n };\n },\n },\n {\n id: 'sql-editor.select-query-tab',\n name: 'Select query tab',\n description: 'Switch active SQL query tab by ID',\n group: 'SQL Editor',\n keywords: ['sql', 'tab', 'select', 'switch'],\n inputSchema: SqlEditorTabIdInput,\n inputDescription: 'Provide queryId to activate.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n validateInput: (input, {getState}) => {\n ensureQueryTabExists(\n getState(),\n (input as SqlEditorTabIdInput).queryId,\n );\n },\n execute: ({getState}, input) => {\n const {queryId} = input as SqlEditorTabIdInput;\n getState().sqlEditor.setSelectedQueryId(queryId);\n return {\n success: true,\n commandId: 'sql-editor.select-query-tab',\n message: `Selected query tab \"${queryId}\".`,\n };\n },\n },\n {\n id: 'sql-editor.rename-query-tab',\n name: 'Rename query tab',\n description: 'Rename a SQL query tab by ID',\n group: 'SQL Editor',\n keywords: ['sql', 'tab', 'rename'],\n inputSchema: SqlEditorRenameTabInput,\n inputDescription: 'Provide queryId and name.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n validateInput: (input, {getState}) => {\n ensureQueryTabExists(\n getState(),\n (input as SqlEditorRenameTabInput).queryId,\n );\n },\n execute: ({getState}, input) => {\n const {queryId, name} = input as SqlEditorRenameTabInput;\n getState().sqlEditor.renameQueryTab(queryId, name);\n return {\n success: true,\n commandId: 'sql-editor.rename-query-tab',\n message: `Renamed query tab \"${queryId}\".`,\n };\n },\n },\n {\n id: 'sql-editor.delete-query-tab',\n name: 'Delete query tab',\n description: 'Delete a SQL query tab by ID',\n group: 'SQL Editor',\n keywords: ['sql', 'tab', 'delete', 'remove'],\n inputSchema: SqlEditorTabIdInput,\n inputDescription: 'Provide queryId to delete.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'medium',\n requiresConfirmation: true,\n },\n validateInput: (input, {getState}) => {\n const state = getState();\n ensureQueryTabExists(state, (input as SqlEditorTabIdInput).queryId);\n if (state.sqlEditor.config.queries.length <= 1) {\n throw new Error('Cannot delete the last remaining query tab.');\n }\n },\n execute: ({getState}, input) => {\n const {queryId} = input as SqlEditorTabIdInput;\n getState().sqlEditor.deleteQueryTab(queryId);\n return {\n success: true,\n commandId: 'sql-editor.delete-query-tab',\n message: `Deleted query tab \"${queryId}\".`,\n };\n },\n },\n {\n id: 'sql-editor.clear-query-results',\n name: 'Clear query results',\n description: 'Clear all cached SQL query results',\n group: 'SQL Editor',\n keywords: ['sql', 'clear', 'results'],\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n isEnabled: ({getState}) =>\n Object.keys(getState().sqlEditor.queryResultsById).length > 0,\n execute: ({getState}) => {\n getState().sqlEditor.clearQueryResults();\n return {\n success: true,\n commandId: 'sql-editor.clear-query-results',\n message: 'Cleared query results.',\n };\n },\n },\n {\n id: 'sql-editor.set-result-limit',\n name: 'Set query result limit',\n description: 'Set max rows returned for query result previews',\n group: 'SQL Editor',\n keywords: ['sql', 'limit', 'rows', 'result'],\n inputSchema: SqlEditorResultLimitInput,\n inputDescription: 'Provide positive integer limit.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n execute: ({getState}, input) => {\n const {limit} = input as SqlEditorResultLimitInput;\n getState().sqlEditor.setQueryResultLimit(limit);\n return {\n success: true,\n commandId: 'sql-editor.set-result-limit',\n message: `Set query result limit to ${limit}.`,\n };\n },\n },\n ];\n}\n\nexport function useStoreWithSqlEditor<T>(\n selector: (state: RoomStateWithSqlEditor) => T,\n): T {\n return useBaseRoomShellStore<RoomShellSliceState, T>((state) =>\n selector(state as unknown as RoomStateWithSqlEditor),\n );\n}\n"]}
1
+ {"version":3,"file":"SqlEditorSlice.js","sourceRoot":"","sources":["../src/SqlEditorSlice.tsx"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport type {DbSliceState} from '@sqlrooms/db';\nimport {\n getSqlErrorWithPointer,\n joinStatements,\n makeLimitQuery,\n separateLastStatement,\n} from '@sqlrooms/db';\nimport {\n BaseRoomStoreState,\n createSlice,\n registerCommandsForOwner,\n RoomCommand,\n RoomShellSliceState,\n StateCreator,\n unregisterCommandsForOwner,\n useBaseRoomShellStore,\n} from '@sqlrooms/room-shell';\nimport {\n createDefaultSqlEditorConfig,\n SqlEditorSliceConfig,\n} from '@sqlrooms/sql-editor-config';\nimport {generateUniqueName} from '@sqlrooms/utils';\nimport * as arrow from 'apache-arrow';\nimport {csvFormat} from 'd3-dsv';\nimport {saveAs} from 'file-saver';\nimport {produce} from 'immer';\nimport {z} from 'zod';\n\nconst SQL_EDITOR_COMMAND_OWNER = '@sqlrooms/sql-editor';\n\nexport type QueryResult =\n | {status: 'loading'; isBeingAborted?: boolean; controller: AbortController}\n | {status: 'aborted'}\n | {status: 'error'; error: string}\n | {\n status: 'success';\n type: 'pragma' | 'explain' | 'select';\n result: arrow.Table | undefined;\n query: string;\n lastQueryStatement: string;\n }\n | {\n status: 'success';\n type: 'exec';\n query: string;\n lastQueryStatement: string;\n };\n\nexport function isQueryWithResult(\n queryResult: QueryResult | undefined,\n): queryResult is QueryResult & {\n status: 'success';\n type: 'pragma' | 'explain' | 'select';\n} {\n return (\n queryResult?.status === 'success' &&\n (queryResult.type === 'pragma' ||\n queryResult.type === 'explain' ||\n queryResult.type === 'select')\n );\n}\n\nexport type SqlEditorSliceState = {\n sqlEditor: {\n initialize?: () => Promise<void>;\n destroy?: () => Promise<void>;\n config: SqlEditorSliceConfig;\n // Runtime state\n /**\n * Query results keyed by queryId (tab id).\n */\n queryResultsById: Record<string, QueryResult | undefined>;\n /** @deprecated */\n selectedTable?: string;\n /** @deprecated Use `useStoreWithSqlEditor((s) => s.db.isRefreshingTableSchemas)` instead. */\n isTablesLoading: boolean;\n /** @deprecated */\n tablesError?: string;\n\n queryResultLimit: number;\n /** Options for the result limit dropdown */\n queryResultLimitOptions: number[];\n\n /**\n * Set the config for the sql editor slice.\n */\n setConfig(config: SqlEditorSliceConfig): void;\n\n /**\n * Run the currently selected query.\n */\n parseAndRunQuery(query: string): Promise<void>;\n\n /**\n * Run the currently selected query.\n */\n parseAndRunCurrentQuery(): Promise<void>;\n\n /**\n * Abort the currently running query.\n */\n abortCurrentQuery(): void;\n\n /**\n * Export query results to CSV.\n * @deprecated Use `useExportToCsv` from `@sqlrooms/duckdb` instead.\n */\n exportResultsToCsv(results: arrow.Table, filename?: string): void;\n\n /**\n * Create a new query tab.\n * @param initialQuery - Optional initial query text.\n */\n createQueryTab(initialQuery?: string): {\n id: string;\n name: string;\n query: string;\n };\n\n /**\n * Delete a query tab.\n * @param queryId - The ID of the query to delete.\n */\n deleteQueryTab(queryId: string): void;\n\n /**\n * Rename a query tab.\n * @param queryId - The ID of the query to rename.\n * @param newName - The new name for the query.\n */\n renameQueryTab(queryId: string, newName: string): void;\n\n /**\n * Close a query tab.\n * @param queryId - The ID of the query to close.\n */\n closeQueryTab(queryId: string): void;\n\n /**\n * Open a closed tab id.\n * @param queryId - The ID of the query to open.\n */\n openQueryTab(queryId: string): void;\n\n /**\n * Set the list of open tab IDs. Used for reordering or opening tabs.\n * @param tabIds - The new list of open tab IDs.\n */\n setOpenTabs(tabIds: string[]): void;\n\n /**\n * Update the SQL text for a query.\n * @param queryId - The ID of the query to update.\n * @param queryText - The new SQL text.\n */\n updateQueryText(queryId: string, queryText: string): void;\n\n /**\n * Set the selected query tab.\n * @param queryId - The ID of the query to select.\n */\n setSelectedQueryId(queryId: string): void;\n\n /**\n * Get the currently selected query's SQL text.\n */\n getCurrentQuery(): string;\n\n /** @deprecated */\n selectTable(table: string | undefined): void;\n\n clearQueryResults(): void;\n\n setQueryResultLimit(limit: number): void;\n };\n};\n\nexport function createSqlEditorSlice({\n config = createDefaultSqlEditorConfig(),\n queryResultLimit = 100,\n queryResultLimitOptions = [100, 500, 1000],\n}: {\n config?: SqlEditorSliceConfig;\n queryResultLimit?: number;\n queryResultLimitOptions?: number[];\n} = {}): StateCreator<SqlEditorSliceState> {\n return createSlice<\n SqlEditorSliceState,\n BaseRoomStoreState & DbSliceState & SqlEditorSliceState\n >((set, get, store) => {\n return {\n sqlEditor: {\n initialize: async () => {\n registerCommandsForOwner(\n store,\n SQL_EDITOR_COMMAND_OWNER,\n createSqlEditorCommands(),\n );\n },\n destroy: async () => {\n unregisterCommandsForOwner(store, SQL_EDITOR_COMMAND_OWNER);\n },\n config,\n // Initialize runtime state\n queryResultsById: {},\n isTablesLoading: false,\n queryResultLimit,\n queryResultLimitOptions,\n\n setConfig: (config) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config = config;\n }),\n );\n },\n\n exportResultsToCsv: (results, filename) => {\n if (!results) return;\n const blob = new Blob([csvFormat(results.toArray())], {\n type: 'text/plain;charset=utf-8',\n });\n saveAs(blob, filename || `export-${createId().substring(0, 5)}.csv`);\n },\n\n createQueryTab: (initialQuery = '') => {\n const sqlEditorConfig = get().sqlEditor.config;\n const now = Date.now();\n const newQuery = {\n id: createId(),\n name: generateUniqueName(\n 'Untitled 1',\n sqlEditorConfig.queries.map((q) => q.name),\n ' ',\n ),\n query: initialQuery,\n lastOpenedAt: now,\n };\n\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.queries.push(newQuery);\n draft.sqlEditor.config.openTabs.push(newQuery.id);\n draft.sqlEditor.config.selectedQueryId = newQuery.id;\n }),\n );\n\n return newQuery;\n },\n\n deleteQueryTab: (queryId) => {\n const sqlEditorConfig = get().sqlEditor.config;\n const queries = sqlEditorConfig.queries;\n const openTabs = sqlEditorConfig.openTabs;\n\n if (queries.length <= 1) {\n // Don't delete the last query\n return;\n }\n\n const wasSelected = sqlEditorConfig.selectedQueryId === queryId;\n const deletingOpenIndex = openTabs.indexOf(queryId);\n const filteredQueries = queries.filter((q) => q.id !== queryId);\n\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.queries = filteredQueries;\n draft.sqlEditor.config.openTabs = openTabs.filter(\n (id) => id !== queryId,\n );\n const {[queryId]: _removed, ...rest} =\n draft.sqlEditor.queryResultsById;\n draft.sqlEditor.queryResultsById = rest;\n\n // If we deleted the selected query, select another one\n if (wasSelected) {\n const newOpenTabs = draft.sqlEditor.config.openTabs;\n const remainingQueries = draft.sqlEditor.config.queries;\n\n if (newOpenTabs.length > 0) {\n // Select from remaining open tabs\n const newIndex =\n deletingOpenIndex === 0\n ? 0\n : Math.min(deletingOpenIndex - 1, newOpenTabs.length - 1);\n const newSelectedId = newOpenTabs[newIndex];\n if (newSelectedId) {\n draft.sqlEditor.config.selectedQueryId = newSelectedId;\n const newSelectedQuery =\n draft.sqlEditor.config.queries.find(\n (q) => q.id === newSelectedId,\n );\n if (newSelectedQuery) {\n newSelectedQuery.lastOpenedAt = Date.now();\n }\n }\n } else if (remainingQueries.length > 0) {\n // No open tabs left, open a closed query\n const queryToOpen = remainingQueries[0];\n if (queryToOpen) {\n draft.sqlEditor.config.openTabs.push(queryToOpen.id);\n draft.sqlEditor.config.selectedQueryId = queryToOpen.id;\n queryToOpen.lastOpenedAt = Date.now();\n }\n }\n }\n }),\n );\n },\n\n renameQueryTab: (queryId, newName) => {\n set((state) =>\n produce(state, (draft) => {\n const query = draft.sqlEditor.config.queries.find(\n (q) => q.id === queryId,\n );\n if (query) {\n query.name = newName || query.name;\n }\n }),\n );\n },\n\n closeQueryTab: (queryId) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.openTabs =\n draft.sqlEditor.config.openTabs.filter((id) => id !== queryId);\n }),\n );\n },\n\n openQueryTab: (queryId) => {\n set((state) =>\n produce(state, (draft) => {\n if (!draft.sqlEditor.config.openTabs.includes(queryId)) {\n draft.sqlEditor.config.openTabs.push(queryId);\n }\n draft.sqlEditor.config.selectedQueryId = queryId;\n const query = draft.sqlEditor.config.queries.find(\n (q) => q.id === queryId,\n );\n if (query) {\n query.lastOpenedAt = Date.now();\n }\n }),\n );\n },\n\n setOpenTabs: (tabIds) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.openTabs = tabIds;\n }),\n );\n },\n\n updateQueryText: (queryId, queryText) => {\n set((state) =>\n produce(state, (draft) => {\n const query = draft.sqlEditor.config.queries.find(\n (q) => q.id === queryId,\n );\n if (query) {\n query.query = queryText;\n }\n }),\n );\n },\n\n setSelectedQueryId: (queryId) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.config.selectedQueryId = queryId;\n const query = draft.sqlEditor.config.queries.find(\n (q) => q.id === queryId,\n );\n if (query) {\n query.lastOpenedAt = Date.now();\n }\n }),\n );\n },\n\n getCurrentQuery: () => {\n const sqlEditorConfig = get().sqlEditor.config;\n const selectedId = sqlEditorConfig.selectedQueryId;\n const query = sqlEditorConfig.queries.find(\n (q) => q.id === selectedId,\n );\n return query?.query || '';\n },\n\n /** @deprecated */\n selectTable: (table) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.selectedTable = table;\n }),\n );\n },\n\n clearQueryResults: () => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.queryResultsById = {};\n }),\n );\n },\n\n parseAndRunCurrentQuery: async (): Promise<void> =>\n get().sqlEditor.parseAndRunQuery(get().sqlEditor.getCurrentQuery()),\n\n abortCurrentQuery: () => {\n const selectedQueryId = get().sqlEditor.config.selectedQueryId;\n const currentResult =\n get().sqlEditor.queryResultsById[selectedQueryId];\n if (currentResult?.status === 'loading' && currentResult.controller) {\n currentResult.controller.abort();\n }\n\n set((state) =>\n produce(state, (draft) => {\n const result = draft.sqlEditor.queryResultsById[selectedQueryId];\n if (result?.status === 'loading') {\n result.isBeingAborted = true;\n }\n }),\n );\n },\n\n setQueryResultLimit: (limit) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.queryResultLimit = limit;\n }),\n );\n },\n\n parseAndRunQuery: async (query): Promise<void> => {\n const selectedQueryId = get().sqlEditor.config.selectedQueryId;\n const existingResult =\n get().sqlEditor.queryResultsById[selectedQueryId];\n if (existingResult?.status === 'loading') {\n throw new Error('Query already running');\n }\n if (!query.trim()) {\n return;\n }\n\n // Create abort controller for this query execution\n const queryController = new AbortController();\n\n // First update loading state and clear results\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.selectedTable = undefined;\n draft.sqlEditor.queryResultsById[selectedQueryId] = {\n status: 'loading',\n isBeingAborted: false,\n controller: queryController,\n };\n }),\n );\n\n let queryResult: QueryResult;\n try {\n const dbConnectors = get().db.connectors;\n const connector = await get().db.getConnector();\n const signal = queryController.signal;\n\n const {precedingStatements, lastStatement: lastQueryStatement} =\n separateLastStatement(query);\n const hasMultipleStatements = precedingStatements.length > 0;\n\n if (signal.aborted) {\n throw new Error('Query aborted');\n }\n\n const parsedLastStatement =\n await get().db.sqlSelectToJson(lastQueryStatement);\n\n if (signal.aborted) {\n throw new Error('Query aborted');\n }\n\n const isValidSelectQuery = !parsedLastStatement.error;\n\n if (isValidSelectQuery) {\n // Add limit to the last statement\n const limitedLastStatement = makeLimitQuery(lastQueryStatement, {\n sanitize: false, // should already be sanitized\n limit: get().sqlEditor.queryResultLimit,\n });\n const queryWithLimit = joinStatements(\n precedingStatements,\n limitedLastStatement,\n );\n const result = dbConnectors?.runQuery\n ? (\n await dbConnectors.runQuery({\n sql: queryWithLimit,\n queryType: 'arrow',\n signal,\n })\n )?.arrowTable\n : await connector.query(queryWithLimit, {signal});\n queryResult = {\n status: 'success',\n type: 'select',\n query,\n lastQueryStatement,\n result,\n };\n } else {\n // Run the complete query as it is\n if (\n parsedLastStatement.error &&\n parsedLastStatement.error_type !== 'not implemented'\n ) {\n throw (\n `${parsedLastStatement.error_type} ${parsedLastStatement.error_subtype}: ${parsedLastStatement.error_message}` +\n `\\n${getSqlErrorWithPointer(lastQueryStatement, Number(parsedLastStatement.position)).formatted}`\n );\n }\n\n const result = dbConnectors?.runQuery\n ? (\n await dbConnectors.runQuery({\n sql: query,\n queryType: /^(EXPLAIN|PRAGMA)/i.test(lastQueryStatement)\n ? 'arrow'\n : 'exec',\n signal,\n })\n )?.arrowTable\n : await connector.query(query, {signal});\n // EXPLAIN and PRAGMA are not detected as select queries\n // and we cannot wrap them in a SELECT * FROM,\n // but we can still execute them and return the result\n if (/^(EXPLAIN)/i.test(lastQueryStatement)) {\n queryResult = {\n status: 'success',\n type: 'explain',\n query,\n lastQueryStatement,\n result,\n };\n } else if (/^(PRAGMA)/i.test(lastQueryStatement)) {\n queryResult = {\n status: 'success',\n type: 'pragma',\n query,\n lastQueryStatement,\n result,\n };\n } else {\n queryResult = {\n status: 'success',\n type: 'exec',\n query,\n lastQueryStatement,\n };\n }\n }\n if (signal.aborted) {\n throw new Error('Query aborted');\n }\n // Refresh table schemas if there are multiple statements or if the\n // last statement is not a select query\n if (hasMultipleStatements || !isValidSelectQuery) {\n get().db.refreshTableSchemas();\n }\n if (signal.aborted) {\n throw new Error('Query aborted');\n }\n } catch (e) {\n console.error(e);\n const errorMessage = e instanceof Error ? e.message : String(e);\n if (\n errorMessage === 'Query aborted' ||\n queryController.signal.aborted\n ) {\n queryResult = {status: 'aborted'};\n } else {\n queryResult = {\n status: 'error',\n error: errorMessage,\n };\n }\n }\n\n // Update state without Immer since Arrow Tables don't play well with drafts.\n set((state) => ({\n ...state,\n sqlEditor: {\n ...state.sqlEditor,\n queryResultsById: {\n ...state.sqlEditor.queryResultsById,\n [selectedQueryId]: queryResult,\n },\n },\n }));\n },\n },\n } satisfies SqlEditorSliceState;\n });\n}\n\ntype RoomStateWithSqlEditor = RoomShellSliceState & SqlEditorSliceState;\n\ntype SqlEditorCommandStoreState = BaseRoomStoreState &\n DbSliceState &\n SqlEditorSliceState;\n\nconst SqlEditorRunQueryCommandInput = z.object({\n query: z.string().describe('SQL query text to run.'),\n});\ntype SqlEditorRunQueryCommandInput = z.infer<\n typeof SqlEditorRunQueryCommandInput\n>;\n\nconst SqlEditorTabIdInput = z.object({\n queryId: z.string().describe('ID of the query tab.'),\n});\ntype SqlEditorTabIdInput = z.infer<typeof SqlEditorTabIdInput>;\n\nconst SqlEditorRenameTabInput = z.object({\n queryId: z.string().describe('ID of the query tab to rename.'),\n name: z.string().min(1).describe('New tab name.'),\n});\ntype SqlEditorRenameTabInput = z.infer<typeof SqlEditorRenameTabInput>;\n\nconst SqlEditorResultLimitInput = z.object({\n limit: z.number().int().positive().describe('Row limit for query results.'),\n});\ntype SqlEditorResultLimitInput = z.infer<typeof SqlEditorResultLimitInput>;\n\nfunction createSqlEditorCommands(): RoomCommand<SqlEditorCommandStoreState>[] {\n const ensureQueryTabExists = (\n state: SqlEditorCommandStoreState,\n queryId: string,\n ) => {\n if (!state.sqlEditor.config.queries.some((query) => query.id === queryId)) {\n throw new Error(`Unknown query tab \"${queryId}\".`);\n }\n };\n\n return [\n {\n id: 'sql-editor.run-current-query',\n name: 'Run current query',\n description: 'Execute the selected SQL query tab',\n group: 'SQL Editor',\n keywords: ['sql', 'run', 'execute', 'query'],\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'medium',\n },\n ui: {\n keystrokes: 'Mod+Enter',\n },\n isEnabled: ({getState}) => {\n const state = getState();\n const selectedQueryId = state.sqlEditor.config.selectedQueryId;\n const queryResult = state.sqlEditor.queryResultsById[selectedQueryId];\n return (\n queryResult?.status !== 'loading' &&\n state.sqlEditor.getCurrentQuery().trim().length > 0\n );\n },\n execute: async ({getState}) => {\n await getState().sqlEditor.parseAndRunCurrentQuery();\n return {\n success: true,\n commandId: 'sql-editor.run-current-query',\n message: 'Executed current query.',\n };\n },\n },\n {\n id: 'sql-editor.run-query',\n name: 'Run query text',\n description: 'Execute an explicitly provided SQL query',\n group: 'SQL Editor',\n keywords: ['sql', 'run', 'execute', 'query', 'text'],\n inputSchema: SqlEditorRunQueryCommandInput,\n inputDescription: 'Provide query SQL to execute.',\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'medium',\n },\n execute: async ({getState}, input) => {\n const {query} = input as SqlEditorRunQueryCommandInput;\n await getState().sqlEditor.parseAndRunQuery(query);\n return {\n success: true,\n commandId: 'sql-editor.run-query',\n message: 'Executed SQL query.',\n };\n },\n },\n {\n id: 'sql-editor.abort-current-query',\n name: 'Abort current query',\n description: 'Cancel the currently running SQL query',\n group: 'SQL Editor',\n keywords: ['sql', 'abort', 'cancel', 'query'],\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n isEnabled: ({getState}) => {\n const state = getState();\n const selectedQueryId = state.sqlEditor.config.selectedQueryId;\n return (\n state.sqlEditor.queryResultsById[selectedQueryId]?.status ===\n 'loading'\n );\n },\n execute: ({getState}) => {\n getState().sqlEditor.abortCurrentQuery();\n return {\n success: true,\n commandId: 'sql-editor.abort-current-query',\n message: 'Abort signal sent to current query.',\n };\n },\n },\n {\n id: 'sql-editor.create-query-tab',\n name: 'Create query tab',\n description: 'Open a new SQL query tab',\n group: 'SQL Editor',\n keywords: ['sql', 'tab', 'new', 'query'],\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'low',\n },\n execute: ({getState}) => {\n const newTab = getState().sqlEditor.createQueryTab();\n return {\n success: true,\n commandId: 'sql-editor.create-query-tab',\n message: `Created query tab \"${newTab.name}\".`,\n data: {\n queryId: newTab.id,\n },\n };\n },\n },\n {\n id: 'sql-editor.select-query-tab',\n name: 'Select query tab',\n description: 'Switch active SQL query tab by ID',\n group: 'SQL Editor',\n keywords: ['sql', 'tab', 'select', 'switch'],\n inputSchema: SqlEditorTabIdInput,\n inputDescription: 'Provide queryId to activate.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n validateInput: (input, {getState}) => {\n ensureQueryTabExists(\n getState(),\n (input as SqlEditorTabIdInput).queryId,\n );\n },\n execute: ({getState}, input) => {\n const {queryId} = input as SqlEditorTabIdInput;\n getState().sqlEditor.setSelectedQueryId(queryId);\n return {\n success: true,\n commandId: 'sql-editor.select-query-tab',\n message: `Selected query tab \"${queryId}\".`,\n };\n },\n },\n {\n id: 'sql-editor.rename-query-tab',\n name: 'Rename query tab',\n description: 'Rename a SQL query tab by ID',\n group: 'SQL Editor',\n keywords: ['sql', 'tab', 'rename'],\n inputSchema: SqlEditorRenameTabInput,\n inputDescription: 'Provide queryId and name.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n validateInput: (input, {getState}) => {\n ensureQueryTabExists(\n getState(),\n (input as SqlEditorRenameTabInput).queryId,\n );\n },\n execute: ({getState}, input) => {\n const {queryId, name} = input as SqlEditorRenameTabInput;\n getState().sqlEditor.renameQueryTab(queryId, name);\n return {\n success: true,\n commandId: 'sql-editor.rename-query-tab',\n message: `Renamed query tab \"${queryId}\".`,\n };\n },\n },\n {\n id: 'sql-editor.delete-query-tab',\n name: 'Delete query tab',\n description: 'Delete a SQL query tab by ID',\n group: 'SQL Editor',\n keywords: ['sql', 'tab', 'delete', 'remove'],\n inputSchema: SqlEditorTabIdInput,\n inputDescription: 'Provide queryId to delete.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'medium',\n requiresConfirmation: true,\n },\n validateInput: (input, {getState}) => {\n const state = getState();\n ensureQueryTabExists(state, (input as SqlEditorTabIdInput).queryId);\n if (state.sqlEditor.config.queries.length <= 1) {\n throw new Error('Cannot delete the last remaining query tab.');\n }\n },\n execute: ({getState}, input) => {\n const {queryId} = input as SqlEditorTabIdInput;\n getState().sqlEditor.deleteQueryTab(queryId);\n return {\n success: true,\n commandId: 'sql-editor.delete-query-tab',\n message: `Deleted query tab \"${queryId}\".`,\n };\n },\n },\n {\n id: 'sql-editor.clear-query-results',\n name: 'Clear query results',\n description: 'Clear all cached SQL query results',\n group: 'SQL Editor',\n keywords: ['sql', 'clear', 'results'],\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n isEnabled: ({getState}) =>\n Object.keys(getState().sqlEditor.queryResultsById).length > 0,\n execute: ({getState}) => {\n getState().sqlEditor.clearQueryResults();\n return {\n success: true,\n commandId: 'sql-editor.clear-query-results',\n message: 'Cleared query results.',\n };\n },\n },\n {\n id: 'sql-editor.set-result-limit',\n name: 'Set query result limit',\n description: 'Set max rows returned for query result previews',\n group: 'SQL Editor',\n keywords: ['sql', 'limit', 'rows', 'result'],\n inputSchema: SqlEditorResultLimitInput,\n inputDescription: 'Provide positive integer limit.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'low',\n },\n execute: ({getState}, input) => {\n const {limit} = input as SqlEditorResultLimitInput;\n getState().sqlEditor.setQueryResultLimit(limit);\n return {\n success: true,\n commandId: 'sql-editor.set-result-limit',\n message: `Set query result limit to ${limit}.`,\n };\n },\n },\n ];\n}\n\nexport function useStoreWithSqlEditor<T>(\n selector: (state: RoomStateWithSqlEditor) => T,\n): T {\n return useBaseRoomShellStore<RoomShellSliceState, T>((state) =>\n selector(state as unknown as RoomStateWithSqlEditor),\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
- import React from 'react';
1
+ import type { DataTable, DuckDbConnector } from '@sqlrooms/db';
2
2
  import type { MonacoEditorProps } from '@sqlrooms/monaco-editor';
3
- import type { DataTable, DuckDbConnector } from '@sqlrooms/duckdb';
3
+ import React from 'react';
4
4
  export interface SqlMonacoEditorProps extends Omit<MonacoEditorProps, 'language'> {
5
5
  connector?: DuckDbConnector;
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"SqlMonacoEditor.d.ts","sourceRoot":"","sources":["../src/SqlMonacoEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgD,MAAM,OAAO,CAAC;AAErE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAQ/D,OAAO,KAAK,EAAC,SAAS,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAGjE,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,iBAAiB,EACjB,UAAU,CACX;IACC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM;QACvB,YAAY,EAAE,SAAS,EAAE,CAAC;KAC3B,CAAC;CACH;AA2ND;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAiG1D,CAAC"}
1
+ {"version":3,"file":"SqlMonacoEditor.d.ts","sourceRoot":"","sources":["../src/SqlMonacoEditor.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,SAAS,EAAE,eAAe,EAAC,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAI/D,OAAO,KAAgD,MAAM,OAAO,CAAC;AAOrE,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,iBAAiB,EACjB,UAAU,CACX;IACC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM;QACvB,YAAY,EAAE,SAAS,EAAE,CAAC;KAC3B,CAAC;CACH;AA+ND;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAiG1D,CAAC"}
@@ -1,13 +1,17 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useMemo, useRef } from 'react';
3
2
  import { MonacoEditor } from '@sqlrooms/monaco-editor';
4
- import { DUCKDB_KEYWORDS, DUCKDB_FUNCTIONS, SQL_LANGUAGE_CONFIGURATION, } from './constants/duckdb-dialect';
5
3
  import { cn } from '@sqlrooms/ui';
4
+ import { useCallback, useEffect, useMemo, useRef } from 'react';
5
+ import { DUCKDB_FUNCTIONS, DUCKDB_KEYWORDS, SQL_LANGUAGE_CONFIGURATION, } from './constants/duckdb-dialect';
6
6
  import { getFunctionSuggestions } from './constants/functionSuggestions';
7
7
  const EDITOR_OPTIONS = {
8
8
  formatOnPaste: true,
9
9
  formatOnType: true,
10
10
  wordWrap: 'on',
11
+ scrollBeyondLastLine: false,
12
+ scrollbar: {
13
+ alwaysConsumeMouseWheel: false,
14
+ },
11
15
  };
12
16
  // Singleton guards to prevent re-registration on every editor mount (causes flashing)
13
17
  let sqlLanguageConfigured = false;
@@ -1 +1 @@
1
- {"version":3,"file":"SqlMonacoEditor.js","sourceRoot":"","sources":["../src/SqlMonacoEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {MonacoEditor} from '@sqlrooms/monaco-editor';\nimport type {MonacoEditorProps} from '@sqlrooms/monaco-editor';\nimport type {OnMount} from '@monaco-editor/react';\nimport type * as Monaco from 'monaco-editor';\nimport {\n DUCKDB_KEYWORDS,\n DUCKDB_FUNCTIONS,\n SQL_LANGUAGE_CONFIGURATION,\n} from './constants/duckdb-dialect';\nimport type {DataTable, DuckDbConnector} from '@sqlrooms/duckdb';\nimport {cn} from '@sqlrooms/ui';\nimport {getFunctionSuggestions} from './constants/functionSuggestions';\nexport interface SqlMonacoEditorProps extends Omit<\n MonacoEditorProps,\n 'language'\n> {\n connector?: DuckDbConnector;\n /**\n * Custom SQL keywords to add to the completion provider.\n *\n * Note: syntax highlighting is global and uses the built-in DuckDB dialect\n * (`DUCKDB_KEYWORDS` / `DUCKDB_FUNCTIONS`) to avoid per-editor global reconfiguration\n * (which can cause flashing). These are currently **completion-only**.\n */\n customKeywords?: string[];\n /**\n * Custom SQL functions to add to the completion provider.\n *\n * Note: syntax highlighting is global and uses the built-in DuckDB dialect\n * (`DUCKDB_KEYWORDS` / `DUCKDB_FUNCTIONS`) to avoid per-editor global reconfiguration\n * (which can cause flashing). These are currently **completion-only**.\n */\n customFunctions?: string[];\n /**\n * Table schemas for autocompletion\n */\n tableSchemas?: DataTable[];\n /**\n * Callback to get the latest table schemas\n * This is called from within provideCompletionItems to ensure we have the latest data\n */\n getLatestSchemas?: () => {\n tableSchemas: DataTable[];\n };\n}\n\nconst EDITOR_OPTIONS: MonacoEditorProps['options'] = {\n formatOnPaste: true,\n formatOnType: true,\n wordWrap: 'on',\n};\n\ntype MonacoInstance = typeof Monaco;\n\ntype SqlCompletionContext = {\n connector?: DuckDbConnector;\n tableSchemas: DataTable[];\n getLatestSchemas?: () => {tableSchemas: DataTable[]};\n customKeywords: string[];\n customFunctions: string[];\n};\n\n// Singleton guards to prevent re-registration on every editor mount (causes flashing)\nlet sqlLanguageConfigured = false;\nlet sqlCompletionProviderDisposable: Monaco.IDisposable | null = null;\n// Per-model context store so multiple SqlMonacoEditor instances don't clobber each other.\n// WeakMap is used so entries can be GC'd in long-lived apps.\nconst sqlCompletionContextByModel = new WeakMap<object, SqlCompletionContext>();\n\nfunction ensureSqlLanguageConfigured(monaco: MonacoInstance) {\n if (sqlLanguageConfigured) return;\n sqlLanguageConfigured = true;\n\n if (!monaco.languages.getLanguages().some((lang: any) => lang.id === 'sql')) {\n monaco.languages.register({id: 'sql'});\n }\n\n // Tokenization is GLOBAL. Keep it stable for DuckDB to avoid global re-tokenization\n // when multiple SqlMonacoEditors exist (tabs/modals) which can cause flashing.\n monaco.languages.setMonarchTokensProvider('sql', {\n ...SQL_LANGUAGE_CONFIGURATION,\n keywords: DUCKDB_KEYWORDS,\n builtinFunctions: DUCKDB_FUNCTIONS,\n } as any);\n}\n\nfunction ensureSqlCompletionProvider(monaco: MonacoInstance) {\n if (sqlCompletionProviderDisposable) return;\n\n sqlCompletionProviderDisposable =\n monaco.languages.registerCompletionItemProvider('sql', {\n triggerCharacters: [' ', '.', ',', '(', '='],\n provideCompletionItems: async (model: any, position: any) => {\n try {\n const ctx = sqlCompletionContextByModel.get(model) ?? {\n connector: undefined,\n tableSchemas: [],\n getLatestSchemas: undefined,\n customKeywords: [],\n customFunctions: [],\n };\n\n // Get the latest schemas if the callback is provided\n let currentSchemas = ctx.tableSchemas;\n if (ctx.getLatestSchemas) {\n const latest = ctx.getLatestSchemas();\n currentSchemas = latest.tableSchemas;\n }\n\n const suggestions: Monaco.languages.CompletionItem[] = [];\n const word = model.getWordUntilPosition(position);\n const range = {\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endColumn: word.endColumn,\n };\n\n // Get the text before the cursor to determine context\n const lineContent = model.getLineContent(position.lineNumber);\n const textBeforeCursor = lineContent\n .substring(0, position.column - 1)\n .trim()\n .toLowerCase();\n\n // Check if we're after a FROM, JOIN, or similar clause to prioritize table suggestions\n const isTableContext = /\\b(from|join|into|update|table)\\s+\\w*$/.test(\n textBeforeCursor,\n );\n\n // Check if we're after a table name and period to prioritize column suggestions\n const isColumnContext = /\\b(\\w+)\\.\\w*$/.test(textBeforeCursor);\n\n // Combine keywords and functions with custom ones\n const keywords = [...DUCKDB_KEYWORDS, ...ctx.customKeywords];\n const functions = [...DUCKDB_FUNCTIONS, ...ctx.customFunctions];\n\n // Add keyword suggestions (if not in a specific context)\n if (!isColumnContext) {\n keywords.forEach((keyword) => {\n suggestions.push({\n label: keyword,\n kind: monaco.languages.CompletionItemKind.Keyword,\n insertText: keyword,\n range: range,\n detail: 'Keyword',\n sortText: isTableContext ? 'z' + keyword : 'a' + keyword, // Lower priority in table context\n });\n });\n }\n\n // Add function suggestions (if not in a specific context)\n if (!isColumnContext) {\n functions.forEach((func) => {\n suggestions.push({\n label: func,\n kind: monaco.languages.CompletionItemKind.Function,\n insertText: func,\n range: range,\n detail: 'Function',\n sortText: isTableContext ? 'z' + func : 'b' + func, // Lower priority in table context\n });\n });\n if (ctx.connector) {\n const functionSuggestions = await getFunctionSuggestions(\n ctx.connector,\n word.word,\n );\n for (const {name, documentation} of functionSuggestions) {\n suggestions.push({\n label: name,\n insertText: name,\n documentation: {\n value: documentation,\n isTrusted: true,\n supportHtml: true,\n },\n range: range,\n kind: monaco.languages.CompletionItemKind.Function,\n sortText: isTableContext ? 'z' + name : 'b' + name, // Lower priority in table context\n });\n }\n }\n }\n\n // Add table and column suggestions from schemas\n currentSchemas.forEach((table) => {\n const tableName = table.tableName;\n\n // Add table suggestion\n suggestions.push({\n label: tableName,\n kind: monaco.languages.CompletionItemKind.Class,\n insertText: tableName,\n range: range,\n detail: 'Table',\n documentation: {\n value: `Table: ${tableName}`,\n isTrusted: true,\n },\n sortText: isTableContext ? 'a' + tableName : 'c' + tableName, // Higher priority in table context\n });\n\n // Extract table name from context if we're in a column context\n let contextTableName = '';\n if (isColumnContext) {\n const match = textBeforeCursor.match(/\\b(\\w+)\\.\\w*$/);\n if (match && match[1]) {\n contextTableName = match[1];\n }\n }\n\n // Only add columns for the current table if we're in a column context\n if (!isColumnContext || contextTableName === tableName) {\n // Add column suggestions\n table.columns.forEach((column) => {\n const columnName = column.name;\n const columnType = column.type;\n\n suggestions.push({\n label: columnName,\n kind: monaco.languages.CompletionItemKind.Field,\n insertText: columnName,\n range: range,\n detail: `Column (${columnType})`,\n documentation: {\n value: `Column from table ${tableName}`,\n isTrusted: true,\n },\n sortText:\n isColumnContext && contextTableName === tableName\n ? 'a' + columnName\n : 'd' + columnName,\n });\n\n // Only add table.column suggestions if not in a column context\n if (!isColumnContext) {\n suggestions.push({\n label: `${tableName}.${columnName}`,\n kind: monaco.languages.CompletionItemKind.Field,\n insertText: `${tableName}.${columnName}`,\n range: range,\n detail: `Column (${columnType})`,\n documentation: {\n value: `Column from table ${tableName}`,\n isTrusted: true,\n },\n sortText: 'e' + tableName + columnName,\n });\n }\n });\n }\n });\n\n return {suggestions};\n } catch (error) {\n console.error('Error in SQL completion provider:', error);\n return {suggestions: []};\n }\n },\n });\n}\n\n/**\n * A Monaco editor for editing SQL with DuckDB syntax highlighting and autocompletion\n * This is an internal component used by SqlEditor\n */\nexport const SqlMonacoEditor: React.FC<SqlMonacoEditorProps> = ({\n connector,\n customKeywords = [],\n customFunctions = [],\n tableSchemas = [],\n getLatestSchemas,\n onMount,\n className,\n options,\n ...restProps\n}) => {\n const modelRef = useRef<any>(null);\n\n // Update per-model context when props change\n useEffect(() => {\n const model = modelRef.current;\n if (!model) return;\n sqlCompletionContextByModel.set(model, {\n connector,\n tableSchemas,\n getLatestSchemas,\n customKeywords,\n customFunctions,\n });\n }, [\n connector,\n tableSchemas,\n getLatestSchemas,\n customKeywords,\n customFunctions,\n ]);\n\n // Backstop cleanup: if the React component unmounts before Monaco disposes the model,\n // ensure we don't hold on to context longer than necessary.\n useEffect(() => {\n return () => {\n const model = modelRef.current;\n if (model) sqlCompletionContextByModel.delete(model);\n };\n }, []);\n\n // Handle editor mounting to configure SQL language features\n const handleEditorDidMount = useCallback<OnMount>(\n (editor, monaco) => {\n ensureSqlLanguageConfigured(monaco);\n ensureSqlCompletionProvider(monaco);\n\n const model = editor.getModel?.();\n if (model) {\n modelRef.current = model;\n sqlCompletionContextByModel.set(model, {\n connector,\n tableSchemas,\n getLatestSchemas,\n customKeywords,\n customFunctions,\n });\n }\n\n // Cleanup on dispose\n if (model) {\n editor.onDidDispose(() => {\n sqlCompletionContextByModel.delete(model);\n });\n }\n\n // Call the original onMount if provided\n if (onMount) {\n onMount(editor, monaco);\n }\n },\n [\n connector,\n customKeywords,\n customFunctions,\n getLatestSchemas,\n onMount,\n tableSchemas,\n ],\n );\n\n const combinedOptions = useMemo(\n (): MonacoEditorProps['options'] => ({\n ...EDITOR_OPTIONS,\n ...options,\n }),\n [options],\n );\n return (\n <MonacoEditor\n language=\"sql\"\n onMount={handleEditorDidMount}\n className={cn('h-full', className)}\n options={combinedOptions}\n {...restProps}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"SqlMonacoEditor.js","sourceRoot":"","sources":["../src/SqlMonacoEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {OnMount} from '@monaco-editor/react';\nimport type {DataTable, DuckDbConnector} from '@sqlrooms/db';\nimport type {MonacoEditorProps} from '@sqlrooms/monaco-editor';\nimport {MonacoEditor} from '@sqlrooms/monaco-editor';\nimport {cn} from '@sqlrooms/ui';\nimport type * as Monaco from 'monaco-editor';\nimport React, {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {\n DUCKDB_FUNCTIONS,\n DUCKDB_KEYWORDS,\n SQL_LANGUAGE_CONFIGURATION,\n} from './constants/duckdb-dialect';\nimport {getFunctionSuggestions} from './constants/functionSuggestions';\nexport interface SqlMonacoEditorProps extends Omit<\n MonacoEditorProps,\n 'language'\n> {\n connector?: DuckDbConnector;\n /**\n * Custom SQL keywords to add to the completion provider.\n *\n * Note: syntax highlighting is global and uses the built-in DuckDB dialect\n * (`DUCKDB_KEYWORDS` / `DUCKDB_FUNCTIONS`) to avoid per-editor global reconfiguration\n * (which can cause flashing). These are currently **completion-only**.\n */\n customKeywords?: string[];\n /**\n * Custom SQL functions to add to the completion provider.\n *\n * Note: syntax highlighting is global and uses the built-in DuckDB dialect\n * (`DUCKDB_KEYWORDS` / `DUCKDB_FUNCTIONS`) to avoid per-editor global reconfiguration\n * (which can cause flashing). These are currently **completion-only**.\n */\n customFunctions?: string[];\n /**\n * Table schemas for autocompletion\n */\n tableSchemas?: DataTable[];\n /**\n * Callback to get the latest table schemas\n * This is called from within provideCompletionItems to ensure we have the latest data\n */\n getLatestSchemas?: () => {\n tableSchemas: DataTable[];\n };\n}\n\nconst EDITOR_OPTIONS: MonacoEditorProps['options'] = {\n formatOnPaste: true,\n formatOnType: true,\n wordWrap: 'on',\n scrollBeyondLastLine: false,\n scrollbar: {\n alwaysConsumeMouseWheel: false,\n },\n};\n\ntype MonacoInstance = typeof Monaco;\n\ntype SqlCompletionContext = {\n connector?: DuckDbConnector;\n tableSchemas: DataTable[];\n getLatestSchemas?: () => {tableSchemas: DataTable[]};\n customKeywords: string[];\n customFunctions: string[];\n};\n\n// Singleton guards to prevent re-registration on every editor mount (causes flashing)\nlet sqlLanguageConfigured = false;\nlet sqlCompletionProviderDisposable: Monaco.IDisposable | null = null;\n// Per-model context store so multiple SqlMonacoEditor instances don't clobber each other.\n// WeakMap is used so entries can be GC'd in long-lived apps.\nconst sqlCompletionContextByModel = new WeakMap<object, SqlCompletionContext>();\n\nfunction ensureSqlLanguageConfigured(monaco: MonacoInstance) {\n if (sqlLanguageConfigured) return;\n sqlLanguageConfigured = true;\n\n if (!monaco.languages.getLanguages().some((lang: any) => lang.id === 'sql')) {\n monaco.languages.register({id: 'sql'});\n }\n\n // Tokenization is GLOBAL. Keep it stable for DuckDB to avoid global re-tokenization\n // when multiple SqlMonacoEditors exist (tabs/modals) which can cause flashing.\n monaco.languages.setMonarchTokensProvider('sql', {\n ...SQL_LANGUAGE_CONFIGURATION,\n keywords: DUCKDB_KEYWORDS,\n builtinFunctions: DUCKDB_FUNCTIONS,\n } as any);\n}\n\nfunction ensureSqlCompletionProvider(monaco: MonacoInstance) {\n if (sqlCompletionProviderDisposable) return;\n\n sqlCompletionProviderDisposable =\n monaco.languages.registerCompletionItemProvider('sql', {\n triggerCharacters: [' ', '.', ',', '(', '='],\n provideCompletionItems: async (model: any, position: any) => {\n try {\n const ctx = sqlCompletionContextByModel.get(model) ?? {\n connector: undefined,\n tableSchemas: [],\n getLatestSchemas: undefined,\n customKeywords: [],\n customFunctions: [],\n };\n\n // Get the latest schemas if the callback is provided\n let currentSchemas = ctx.tableSchemas;\n if (ctx.getLatestSchemas) {\n const latest = ctx.getLatestSchemas();\n currentSchemas = latest.tableSchemas;\n }\n\n const suggestions: Monaco.languages.CompletionItem[] = [];\n const word = model.getWordUntilPosition(position);\n const range = {\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endColumn: word.endColumn,\n };\n\n // Get the text before the cursor to determine context\n const lineContent = model.getLineContent(position.lineNumber);\n const textBeforeCursor = lineContent\n .substring(0, position.column - 1)\n .trim()\n .toLowerCase();\n\n // Check if we're after a FROM, JOIN, or similar clause to prioritize table suggestions\n const isTableContext = /\\b(from|join|into|update|table)\\s+\\w*$/.test(\n textBeforeCursor,\n );\n\n // Check if we're after a table name and period to prioritize column suggestions\n const isColumnContext = /\\b(\\w+)\\.\\w*$/.test(textBeforeCursor);\n\n // Combine keywords and functions with custom ones\n const keywords = [...DUCKDB_KEYWORDS, ...ctx.customKeywords];\n const functions = [...DUCKDB_FUNCTIONS, ...ctx.customFunctions];\n\n // Add keyword suggestions (if not in a specific context)\n if (!isColumnContext) {\n keywords.forEach((keyword) => {\n suggestions.push({\n label: keyword,\n kind: monaco.languages.CompletionItemKind.Keyword,\n insertText: keyword,\n range: range,\n detail: 'Keyword',\n sortText: isTableContext ? 'z' + keyword : 'a' + keyword, // Lower priority in table context\n });\n });\n }\n\n // Add function suggestions (if not in a specific context)\n if (!isColumnContext) {\n functions.forEach((func) => {\n suggestions.push({\n label: func,\n kind: monaco.languages.CompletionItemKind.Function,\n insertText: func,\n range: range,\n detail: 'Function',\n sortText: isTableContext ? 'z' + func : 'b' + func, // Lower priority in table context\n });\n });\n if (ctx.connector) {\n const functionSuggestions = await getFunctionSuggestions(\n ctx.connector,\n word.word,\n );\n for (const {name, documentation} of functionSuggestions) {\n suggestions.push({\n label: name,\n insertText: name,\n documentation: {\n value: documentation,\n isTrusted: true,\n supportHtml: true,\n },\n range: range,\n kind: monaco.languages.CompletionItemKind.Function,\n sortText: isTableContext ? 'z' + name : 'b' + name, // Lower priority in table context\n });\n }\n }\n }\n\n // Add table and column suggestions from schemas\n currentSchemas.forEach((table) => {\n const tableName = table.tableName;\n\n // Add table suggestion\n suggestions.push({\n label: tableName,\n kind: monaco.languages.CompletionItemKind.Class,\n insertText: tableName,\n range: range,\n detail: 'Table',\n documentation: {\n value: `Table: ${tableName}`,\n isTrusted: true,\n },\n sortText: isTableContext ? 'a' + tableName : 'c' + tableName, // Higher priority in table context\n });\n\n // Extract table name from context if we're in a column context\n let contextTableName = '';\n if (isColumnContext) {\n const match = textBeforeCursor.match(/\\b(\\w+)\\.\\w*$/);\n if (match && match[1]) {\n contextTableName = match[1];\n }\n }\n\n // Only add columns for the current table if we're in a column context\n if (!isColumnContext || contextTableName === tableName) {\n // Add column suggestions\n table.columns.forEach((column) => {\n const columnName = column.name;\n const columnType = column.type;\n\n suggestions.push({\n label: columnName,\n kind: monaco.languages.CompletionItemKind.Field,\n insertText: columnName,\n range: range,\n detail: `Column (${columnType})`,\n documentation: {\n value: `Column from table ${tableName}`,\n isTrusted: true,\n },\n sortText:\n isColumnContext && contextTableName === tableName\n ? 'a' + columnName\n : 'd' + columnName,\n });\n\n // Only add table.column suggestions if not in a column context\n if (!isColumnContext) {\n suggestions.push({\n label: `${tableName}.${columnName}`,\n kind: monaco.languages.CompletionItemKind.Field,\n insertText: `${tableName}.${columnName}`,\n range: range,\n detail: `Column (${columnType})`,\n documentation: {\n value: `Column from table ${tableName}`,\n isTrusted: true,\n },\n sortText: 'e' + tableName + columnName,\n });\n }\n });\n }\n });\n\n return {suggestions};\n } catch (error) {\n console.error('Error in SQL completion provider:', error);\n return {suggestions: []};\n }\n },\n });\n}\n\n/**\n * A Monaco editor for editing SQL with DuckDB syntax highlighting and autocompletion\n * This is an internal component used by SqlEditor\n */\nexport const SqlMonacoEditor: React.FC<SqlMonacoEditorProps> = ({\n connector,\n customKeywords = [],\n customFunctions = [],\n tableSchemas = [],\n getLatestSchemas,\n onMount,\n className,\n options,\n ...restProps\n}) => {\n const modelRef = useRef<any>(null);\n\n // Update per-model context when props change\n useEffect(() => {\n const model = modelRef.current;\n if (!model) return;\n sqlCompletionContextByModel.set(model, {\n connector,\n tableSchemas,\n getLatestSchemas,\n customKeywords,\n customFunctions,\n });\n }, [\n connector,\n tableSchemas,\n getLatestSchemas,\n customKeywords,\n customFunctions,\n ]);\n\n // Backstop cleanup: if the React component unmounts before Monaco disposes the model,\n // ensure we don't hold on to context longer than necessary.\n useEffect(() => {\n return () => {\n const model = modelRef.current;\n if (model) sqlCompletionContextByModel.delete(model);\n };\n }, []);\n\n // Handle editor mounting to configure SQL language features\n const handleEditorDidMount = useCallback<OnMount>(\n (editor, monaco) => {\n ensureSqlLanguageConfigured(monaco);\n ensureSqlCompletionProvider(monaco);\n\n const model = editor.getModel?.();\n if (model) {\n modelRef.current = model;\n sqlCompletionContextByModel.set(model, {\n connector,\n tableSchemas,\n getLatestSchemas,\n customKeywords,\n customFunctions,\n });\n }\n\n // Cleanup on dispose\n if (model) {\n editor.onDidDispose(() => {\n sqlCompletionContextByModel.delete(model);\n });\n }\n\n // Call the original onMount if provided\n if (onMount) {\n onMount(editor, monaco);\n }\n },\n [\n connector,\n customKeywords,\n customFunctions,\n getLatestSchemas,\n onMount,\n tableSchemas,\n ],\n );\n\n const combinedOptions = useMemo(\n (): MonacoEditorProps['options'] => ({\n ...EDITOR_OPTIONS,\n ...options,\n }),\n [options],\n );\n return (\n <MonacoEditor\n language=\"sql\"\n onMount={handleEditorDidMount}\n className={cn('h-full', className)}\n options={combinedOptions}\n {...restProps}\n />\n );\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { zodResolver } from '@hookform/resolvers/zod';
3
- import { makeQualifiedTableName } from '@sqlrooms/duckdb';
3
+ import { makeQualifiedTableName } from '@sqlrooms/db';
4
4
  import { Alert, AlertDescription, Button, Checkbox, Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Form, FormControl, FormField, FormItem, FormLabel, FormMessage, Input, Label, Popover, PopoverContent, PopoverTrigger, Spinner, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, cn, } from '@sqlrooms/ui';
5
5
  import { Check, ChevronsUpDown, HelpCircle } from 'lucide-react';
6
6
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
@@ -1 +1 @@
1
- {"version":3,"file":"CreateTableModal.js","sourceRoot":"","sources":["../../src/components/CreateTableModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import {zodResolver} from '@hookform/resolvers/zod';\nimport {makeQualifiedTableName} from '@sqlrooms/duckdb';\nimport {SqlQueryDataSource} from '@sqlrooms/room-shell';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Spinner,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n} from '@sqlrooms/ui';\nimport {Check, ChevronsUpDown, HelpCircle} from 'lucide-react';\nimport {FC, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {useForm} from 'react-hook-form';\nimport * as z from 'zod';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\nimport {SqlMonacoEditor} from '../SqlMonacoEditor';\n\nconst VALID_TABLE_OR_COLUMN_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;\n\nconst formSchema = z.object({\n tableName: z\n .string()\n .min(1, 'Table name is required')\n .regex(\n VALID_TABLE_OR_COLUMN_REGEX,\n 'Only letters, digits and underscores are allowed; should not start with a digit',\n ),\n query: z.string().min(1, 'Query is required'),\n schema: z.string().optional(),\n database: z.string().optional(),\n replace: z.boolean(),\n temp: z.boolean(),\n view: z.boolean(),\n});\n\ntype FormValues = z.infer<typeof formSchema>;\n\n/**\n * Initial values for the create table form.\n */\nexport type CreateTableFormInitialValues = Partial<{\n tableName: string;\n replace: boolean;\n temp: boolean;\n view: boolean;\n schema: string;\n database: string;\n}>;\n\nexport type CreateTableModalProps = {\n query: string;\n isOpen: boolean;\n onClose: () => void;\n editDataSource?: SqlQueryDataSource;\n /**\n * Allow multiple statements in the query. When true, preceding statements\n * will be executed before the final SELECT is wrapped in CREATE TABLE/VIEW.\n */\n allowMultipleStatements?: boolean;\n /**\n * Show schema/database selection UI.\n * @default false\n */\n showSchemaSelection?: boolean;\n /**\n * @deprecated Use createTableFromQuery directly instead.\n * When not provided, the modal will call createTableFromQuery directly.\n */\n onAddOrUpdateSqlQuery?: (\n tableName: string,\n query: string,\n oldTableName?: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n /**\n * Additional class name for the dialog content.\n */\n className?: string;\n /**\n * Initial values for the form fields.\n */\n initialValues?: CreateTableFormInitialValues;\n};\n\ntype CreateTableFormProps = {\n query: string;\n onClose: () => void;\n onRequestClose: () => void;\n editDataSource?: SqlQueryDataSource;\n allowMultipleStatements?: boolean;\n showSchemaSelection?: boolean;\n onAddOrUpdateSqlQuery?: (\n tableName: string,\n query: string,\n oldTableName?: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n initialValues?: CreateTableFormInitialValues;\n onSubmittingChange?: (isSubmitting: boolean) => void;\n onRegisterCancel?: (cancel: () => void) => void;\n};\n\nconst isAbortError = (err: unknown): boolean => {\n if (err instanceof DOMException) {\n return err.name === 'AbortError';\n }\n if (err instanceof Error) {\n return err.name === 'AbortError' || /cancelled|canceled/i.test(err.message);\n }\n return false;\n};\n\n/**\n * Compact searchable combobox for selecting schema or database.\n */\nconst SchemaCombobox: FC<{\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n options: string[];\n placeholder: string;\n searchPlaceholder: string;\n emptyMessage: string;\n disabled?: boolean;\n}> = ({\n value,\n onChange,\n options,\n placeholder,\n searchPlaceholder,\n emptyMessage,\n disabled,\n}) => {\n const [open, setOpen] = useState(false);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className=\"h-9 w-full min-w-0 justify-between font-mono text-xs\"\n disabled={disabled}\n >\n <span className=\"min-w-0 truncate\">{value || placeholder}</span>\n <ChevronsUpDown className=\"ml-1 h-3 w-3 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[180px] p-0\">\n <Command>\n <CommandInput placeholder={searchPlaceholder} className=\"text-xs\" />\n <CommandList>\n <CommandEmpty className=\"text-xs\">{emptyMessage}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option}\n value={option}\n className=\"text-xs\"\n onSelect={(currentValue) => {\n onChange(currentValue === value ? undefined : currentValue);\n setOpen(false);\n }}\n >\n <Check\n className={cn(\n 'mr-2 h-3 w-3',\n value === option ? 'opacity-100' : 'opacity-0',\n )}\n />\n {option}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n};\n\n/**\n * Compact checkbox option with clickable label and tooltip.\n */\nconst OptionCheckbox: FC<{\n id: string;\n label: string;\n tooltip: string;\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n disabled?: boolean;\n}> = ({id, label, tooltip, checked, onCheckedChange, disabled}) => (\n <div className=\"flex items-center gap-1.5\">\n <Checkbox\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n className=\"h-3.5 w-3.5\"\n />\n <Label\n htmlFor={id}\n className={cn(\n 'cursor-pointer text-xs font-normal',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {label}\n </Label>\n <Tooltip>\n <TooltipTrigger asChild>\n <HelpCircle className=\"text-muted-foreground h-3 w-3 cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-[200px] text-xs\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n </div>\n);\n\nconst CreateTableForm: FC<CreateTableFormProps> = ({\n query,\n onClose,\n onRequestClose,\n editDataSource,\n allowMultipleStatements = false,\n showSchemaSelection = false,\n onAddOrUpdateSqlQuery,\n initialValues,\n onSubmittingChange,\n onRegisterCancel,\n}) => {\n const connector = useStoreWithSqlEditor((state) => state.db.connector);\n const createTableFromQuery = useStoreWithSqlEditor(\n (state) => state.db.createTableFromQuery,\n );\n const refreshTableSchemas = useStoreWithSqlEditor(\n (state) => state.db.refreshTableSchemas,\n );\n const tables = useStoreWithSqlEditor((state) => state.db.tables);\n const currentSchema = useStoreWithSqlEditor(\n (state) => state.db.currentSchema,\n );\n const currentDatabase = useStoreWithSqlEditor(\n (state) => state.db.currentDatabase,\n );\n\n // Extract unique schemas and databases from tables (excluding system ones)\n const {schemas, databases} = useMemo(() => {\n const schemaSet = new Set<string>();\n const databaseSet = new Set<string>();\n\n for (const table of tables) {\n if (table.table.schema && !table.table.schema.startsWith('pg_')) {\n schemaSet.add(table.table.schema);\n }\n if (table.table.database) {\n databaseSet.add(table.table.database);\n }\n }\n\n // Ensure current schema/database are included\n if (currentSchema) schemaSet.add(currentSchema);\n if (currentDatabase) databaseSet.add(currentDatabase);\n\n return {\n schemas: Array.from(schemaSet).sort(),\n databases: Array.from(databaseSet).sort(),\n };\n }, [tables, currentSchema, currentDatabase]);\n\n const form = useForm<FormValues>({\n resolver: zodResolver(formSchema as any),\n defaultValues: {\n tableName: editDataSource?.tableName ?? initialValues?.tableName ?? '',\n query: editDataSource?.sqlQuery ?? query.trim(),\n schema: initialValues?.schema ?? currentSchema,\n database: initialValues?.database ?? currentDatabase,\n replace: initialValues?.replace ?? false,\n temp: initialValues?.temp ?? false,\n view: initialValues?.view ?? false,\n },\n });\n\n const isSubmitting = form.formState.isSubmitting;\n const [isCancelling, setIsCancelling] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n };\n }, []);\n useEffect(() => {\n onSubmittingChange?.(isSubmitting);\n }, [isSubmitting, onSubmittingChange]);\n\n const onSubmit = useCallback(\n async (values: FormValues) => {\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n setIsCancelling(false);\n try {\n const {tableName, query, schema, database, replace, temp, view} =\n values;\n\n if (onAddOrUpdateSqlQuery) {\n // Legacy path: use the callback\n await onAddOrUpdateSqlQuery(\n tableName,\n query,\n editDataSource?.tableName,\n abortController.signal,\n );\n } else {\n // New path: call createTableFromQuery directly\n const qualifiedName =\n schema || database\n ? makeQualifiedTableName({table: tableName, schema, database})\n : tableName;\n\n await createTableFromQuery(qualifiedName, query, {\n replace,\n temp,\n view,\n allowMultipleStatements,\n abortSignal: abortController.signal,\n });\n\n // Refresh table schemas to show the new table\n await refreshTableSchemas();\n }\n\n form.reset();\n onClose();\n } catch (err) {\n if (isAbortError(err)) {\n return;\n }\n form.setError('root', {type: 'manual', message: `${err}`});\n } finally {\n abortControllerRef.current = null;\n setIsCancelling(false);\n }\n },\n [\n onAddOrUpdateSqlQuery,\n editDataSource?.tableName,\n createTableFromQuery,\n allowMultipleStatements,\n refreshTableSchemas,\n onClose,\n form,\n ],\n );\n\n const watchView = form.watch('view');\n const watchTemp = form.watch('temp');\n const watchTableName = form.watch('tableName');\n\n const handleCancel = useCallback(async () => {\n if (abortControllerRef.current) {\n setIsCancelling(true);\n abortControllerRef.current.abort();\n }\n }, []);\n useEffect(() => {\n onRegisterCancel?.(handleCancel);\n }, [handleCancel, onRegisterCancel]);\n\n return (\n <TooltipProvider delayDuration={200}>\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-4\">\n <DialogHeader>\n <DialogTitle>\n {editDataSource\n ? 'Edit table query'\n : watchView\n ? 'Create view from query'\n : 'Create table from query'}\n </DialogTitle>\n {!editDataSource && (\n <DialogDescription>\n {watchView\n ? 'Create a new view from an SQL query.'\n : 'Create a new table from the results of an SQL query.'}\n </DialogDescription>\n )}\n </DialogHeader>\n\n {form.formState.errors.root && (\n <Alert variant=\"destructive\">\n <AlertDescription className=\"font-mono text-xs whitespace-pre-wrap\">\n {form.formState.errors.root.message}\n </AlertDescription>\n </Alert>\n )}\n\n {/* Table name, schema, database in single row */}\n <div className=\"flex items-start gap-3\">\n <FormField\n control={form.control}\n name=\"tableName\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-2\">\n <FormLabel className=\"text-xs\">\n {watchView ? 'View name' : 'Table name'}\n </FormLabel>\n <FormControl>\n <Input\n {...field}\n className=\"h-9 font-mono text-xs\"\n autoFocus\n disabled={isSubmitting}\n />\n </FormControl>\n <FormMessage className=\"text-xs\" />\n </FormItem>\n )}\n />\n\n {showSchemaSelection && (\n <>\n <FormField\n control={form.control}\n name=\"schema\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-1\">\n <FormLabel className=\"text-xs\">Schema</FormLabel>\n <FormControl>\n <SchemaCombobox\n value={field.value}\n onChange={field.onChange}\n options={schemas}\n placeholder=\"Schema...\"\n searchPlaceholder=\"Search...\"\n emptyMessage=\"No schemas.\"\n disabled={isSubmitting}\n />\n </FormControl>\n </FormItem>\n )}\n />\n\n {(databases.length > 1 || watchTemp) && (\n <FormField\n control={form.control}\n name=\"database\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-1\">\n <FormLabel className=\"text-xs\">Database</FormLabel>\n <FormControl>\n <SchemaCombobox\n value={watchTemp ? 'temp' : field.value}\n onChange={field.onChange}\n options={databases}\n placeholder=\"Database...\"\n searchPlaceholder=\"Search...\"\n emptyMessage=\"No databases.\"\n disabled={isSubmitting || watchTemp}\n />\n </FormControl>\n </FormItem>\n )}\n />\n )}\n </>\n )}\n </div>\n\n <FormField\n control={form.control}\n name=\"query\"\n render={({field}) => (\n <FormItem className=\"relative flex h-[200px] flex-col\">\n <FormControl>\n <SqlMonacoEditor\n connector={connector}\n value={field.value}\n onChange={field.onChange}\n className=\"absolute inset-0 h-full w-full\"\n options={{\n scrollBeyondLastLine: false,\n automaticLayout: true,\n minimap: {enabled: false},\n wordWrap: 'on',\n folding: false,\n lineNumbers: 'off',\n readOnly: isSubmitting,\n fixedOverflowWidgets: false, // default true doesn't work well in a modal\n }}\n />\n </FormControl>\n <FormMessage className=\"text-xs\" />\n </FormItem>\n )}\n />\n\n {/* Compact options row */}\n {!onAddOrUpdateSqlQuery && (\n <div className=\"flex items-center gap-6 rounded-md border px-3 py-2\">\n <FormField\n control={form.control}\n name=\"view\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-view\"\n label=\"View\"\n tooltip=\"Create a view instead of a table. Views store the query, not the data.\"\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n />\n\n {/* <FormField\n control={form.control}\n name=\"temp\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-temp\"\n label=\"Temporary\"\n tooltip={`${watchView ? 'View' : 'Table'} will be deleted when the session ends.`}\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n /> */}\n\n <FormField\n control={form.control}\n name=\"replace\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-replace\"\n label=\"Overwrite\"\n tooltip={`Overwrite existing ${watchView ? 'view' : 'table'} with the same name if it exists.`}\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n />\n </div>\n )}\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onRequestClose}>\n Close\n </Button>\n <Button\n type={isSubmitting ? 'button' : 'submit'}\n onClick={isSubmitting ? handleCancel : undefined}\n disabled={isSubmitting ? isCancelling : !watchTableName?.trim()}\n >\n {isSubmitting && <Spinner className=\"mr-2\" />}\n {isSubmitting\n ? isCancelling\n ? 'Cancelling...'\n : 'Cancel'\n : editDataSource\n ? 'Update'\n : 'Create'}\n </Button>\n </DialogFooter>\n </form>\n </Form>\n </TooltipProvider>\n );\n};\n\nconst CreateTableModal: FC<CreateTableModalProps> = (props) => {\n const {\n isOpen,\n onClose,\n query,\n editDataSource,\n allowMultipleStatements,\n showSchemaSelection,\n onAddOrUpdateSqlQuery,\n className,\n initialValues,\n } = props;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isConfirmOpen, setIsConfirmOpen] = useState(false);\n const cancelRef = useRef<(() => void) | null>(null);\n\n const resetState = useCallback(() => {\n setIsSubmitting(false);\n setIsConfirmOpen(false);\n cancelRef.current = null;\n }, []);\n\n const handleClose = useCallback(() => {\n resetState();\n onClose();\n }, [onClose, resetState]);\n\n const handleRequestClose = useCallback(() => {\n if (!isSubmitting) {\n handleClose();\n return;\n }\n setIsConfirmOpen(true);\n }, [handleClose, isSubmitting]);\n\n const handleConfirmClose = useCallback(() => {\n cancelRef.current?.();\n handleClose();\n }, [handleClose]);\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n handleRequestClose();\n }\n }}\n >\n <DialogContent className={cn('w-3xl max-w-[80%]', className)}>\n {isOpen && (\n <CreateTableForm\n query={query}\n onClose={handleClose}\n onRequestClose={handleRequestClose}\n editDataSource={editDataSource}\n allowMultipleStatements={allowMultipleStatements}\n showSchemaSelection={showSchemaSelection}\n onAddOrUpdateSqlQuery={onAddOrUpdateSqlQuery}\n initialValues={initialValues}\n onSubmittingChange={setIsSubmitting}\n onRegisterCancel={(cancel) => {\n cancelRef.current = cancel;\n }}\n />\n )}\n </DialogContent>\n <Dialog open={isConfirmOpen} onOpenChange={setIsConfirmOpen}>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Cancel running query?</DialogTitle>\n <DialogDescription>\n A query is still running. Cancelling it will stop the query and\n close this dialog.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsConfirmOpen(false)}\n >\n Keep running\n </Button>\n <Button type=\"button\" onClick={handleConfirmClose}>\n Cancel & close\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </Dialog>\n );\n};\n\nexport default CreateTableModal;\n"]}
1
+ {"version":3,"file":"CreateTableModal.js","sourceRoot":"","sources":["../../src/components/CreateTableModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import {zodResolver} from '@hookform/resolvers/zod';\nimport {makeQualifiedTableName} from '@sqlrooms/db';\nimport {SqlQueryDataSource} from '@sqlrooms/room-shell';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Spinner,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n} from '@sqlrooms/ui';\nimport {Check, ChevronsUpDown, HelpCircle} from 'lucide-react';\nimport {FC, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {useForm} from 'react-hook-form';\nimport * as z from 'zod';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\nimport {SqlMonacoEditor} from '../SqlMonacoEditor';\n\nconst VALID_TABLE_OR_COLUMN_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;\n\nconst formSchema = z.object({\n tableName: z\n .string()\n .min(1, 'Table name is required')\n .regex(\n VALID_TABLE_OR_COLUMN_REGEX,\n 'Only letters, digits and underscores are allowed; should not start with a digit',\n ),\n query: z.string().min(1, 'Query is required'),\n schema: z.string().optional(),\n database: z.string().optional(),\n replace: z.boolean(),\n temp: z.boolean(),\n view: z.boolean(),\n});\n\ntype FormValues = z.infer<typeof formSchema>;\n\n/**\n * Initial values for the create table form.\n */\nexport type CreateTableFormInitialValues = Partial<{\n tableName: string;\n replace: boolean;\n temp: boolean;\n view: boolean;\n schema: string;\n database: string;\n}>;\n\nexport type CreateTableModalProps = {\n query: string;\n isOpen: boolean;\n onClose: () => void;\n editDataSource?: SqlQueryDataSource;\n /**\n * Allow multiple statements in the query. When true, preceding statements\n * will be executed before the final SELECT is wrapped in CREATE TABLE/VIEW.\n */\n allowMultipleStatements?: boolean;\n /**\n * Show schema/database selection UI.\n * @default false\n */\n showSchemaSelection?: boolean;\n /**\n * @deprecated Use createTableFromQuery directly instead.\n * When not provided, the modal will call createTableFromQuery directly.\n */\n onAddOrUpdateSqlQuery?: (\n tableName: string,\n query: string,\n oldTableName?: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n /**\n * Additional class name for the dialog content.\n */\n className?: string;\n /**\n * Initial values for the form fields.\n */\n initialValues?: CreateTableFormInitialValues;\n};\n\ntype CreateTableFormProps = {\n query: string;\n onClose: () => void;\n onRequestClose: () => void;\n editDataSource?: SqlQueryDataSource;\n allowMultipleStatements?: boolean;\n showSchemaSelection?: boolean;\n onAddOrUpdateSqlQuery?: (\n tableName: string,\n query: string,\n oldTableName?: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n initialValues?: CreateTableFormInitialValues;\n onSubmittingChange?: (isSubmitting: boolean) => void;\n onRegisterCancel?: (cancel: () => void) => void;\n};\n\nconst isAbortError = (err: unknown): boolean => {\n if (err instanceof DOMException) {\n return err.name === 'AbortError';\n }\n if (err instanceof Error) {\n return err.name === 'AbortError' || /cancelled|canceled/i.test(err.message);\n }\n return false;\n};\n\n/**\n * Compact searchable combobox for selecting schema or database.\n */\nconst SchemaCombobox: FC<{\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n options: string[];\n placeholder: string;\n searchPlaceholder: string;\n emptyMessage: string;\n disabled?: boolean;\n}> = ({\n value,\n onChange,\n options,\n placeholder,\n searchPlaceholder,\n emptyMessage,\n disabled,\n}) => {\n const [open, setOpen] = useState(false);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className=\"h-9 w-full min-w-0 justify-between font-mono text-xs\"\n disabled={disabled}\n >\n <span className=\"min-w-0 truncate\">{value || placeholder}</span>\n <ChevronsUpDown className=\"ml-1 h-3 w-3 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[180px] p-0\">\n <Command>\n <CommandInput placeholder={searchPlaceholder} className=\"text-xs\" />\n <CommandList>\n <CommandEmpty className=\"text-xs\">{emptyMessage}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option}\n value={option}\n className=\"text-xs\"\n onSelect={(currentValue) => {\n onChange(currentValue === value ? undefined : currentValue);\n setOpen(false);\n }}\n >\n <Check\n className={cn(\n 'mr-2 h-3 w-3',\n value === option ? 'opacity-100' : 'opacity-0',\n )}\n />\n {option}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n};\n\n/**\n * Compact checkbox option with clickable label and tooltip.\n */\nconst OptionCheckbox: FC<{\n id: string;\n label: string;\n tooltip: string;\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n disabled?: boolean;\n}> = ({id, label, tooltip, checked, onCheckedChange, disabled}) => (\n <div className=\"flex items-center gap-1.5\">\n <Checkbox\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n className=\"h-3.5 w-3.5\"\n />\n <Label\n htmlFor={id}\n className={cn(\n 'cursor-pointer text-xs font-normal',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {label}\n </Label>\n <Tooltip>\n <TooltipTrigger asChild>\n <HelpCircle className=\"text-muted-foreground h-3 w-3 cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-[200px] text-xs\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n </div>\n);\n\nconst CreateTableForm: FC<CreateTableFormProps> = ({\n query,\n onClose,\n onRequestClose,\n editDataSource,\n allowMultipleStatements = false,\n showSchemaSelection = false,\n onAddOrUpdateSqlQuery,\n initialValues,\n onSubmittingChange,\n onRegisterCancel,\n}) => {\n const connector = useStoreWithSqlEditor((state) => state.db.connector);\n const createTableFromQuery = useStoreWithSqlEditor(\n (state) => state.db.createTableFromQuery,\n );\n const refreshTableSchemas = useStoreWithSqlEditor(\n (state) => state.db.refreshTableSchemas,\n );\n const tables = useStoreWithSqlEditor((state) => state.db.tables);\n const currentSchema = useStoreWithSqlEditor(\n (state) => state.db.currentSchema,\n );\n const currentDatabase = useStoreWithSqlEditor(\n (state) => state.db.currentDatabase,\n );\n\n // Extract unique schemas and databases from tables (excluding system ones)\n const {schemas, databases} = useMemo(() => {\n const schemaSet = new Set<string>();\n const databaseSet = new Set<string>();\n\n for (const table of tables) {\n if (table.table.schema && !table.table.schema.startsWith('pg_')) {\n schemaSet.add(table.table.schema);\n }\n if (table.table.database) {\n databaseSet.add(table.table.database);\n }\n }\n\n // Ensure current schema/database are included\n if (currentSchema) schemaSet.add(currentSchema);\n if (currentDatabase) databaseSet.add(currentDatabase);\n\n return {\n schemas: Array.from(schemaSet).sort(),\n databases: Array.from(databaseSet).sort(),\n };\n }, [tables, currentSchema, currentDatabase]);\n\n const form = useForm<FormValues>({\n resolver: zodResolver(formSchema as any),\n defaultValues: {\n tableName: editDataSource?.tableName ?? initialValues?.tableName ?? '',\n query: editDataSource?.sqlQuery ?? query.trim(),\n schema: initialValues?.schema ?? currentSchema,\n database: initialValues?.database ?? currentDatabase,\n replace: initialValues?.replace ?? false,\n temp: initialValues?.temp ?? false,\n view: initialValues?.view ?? false,\n },\n });\n\n const isSubmitting = form.formState.isSubmitting;\n const [isCancelling, setIsCancelling] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n };\n }, []);\n useEffect(() => {\n onSubmittingChange?.(isSubmitting);\n }, [isSubmitting, onSubmittingChange]);\n\n const onSubmit = useCallback(\n async (values: FormValues) => {\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n setIsCancelling(false);\n try {\n const {tableName, query, schema, database, replace, temp, view} =\n values;\n\n if (onAddOrUpdateSqlQuery) {\n // Legacy path: use the callback\n await onAddOrUpdateSqlQuery(\n tableName,\n query,\n editDataSource?.tableName,\n abortController.signal,\n );\n } else {\n // New path: call createTableFromQuery directly\n const qualifiedName =\n schema || database\n ? makeQualifiedTableName({table: tableName, schema, database})\n : tableName;\n\n await createTableFromQuery(qualifiedName, query, {\n replace,\n temp,\n view,\n allowMultipleStatements,\n abortSignal: abortController.signal,\n });\n\n // Refresh table schemas to show the new table\n await refreshTableSchemas();\n }\n\n form.reset();\n onClose();\n } catch (err) {\n if (isAbortError(err)) {\n return;\n }\n form.setError('root', {type: 'manual', message: `${err}`});\n } finally {\n abortControllerRef.current = null;\n setIsCancelling(false);\n }\n },\n [\n onAddOrUpdateSqlQuery,\n editDataSource?.tableName,\n createTableFromQuery,\n allowMultipleStatements,\n refreshTableSchemas,\n onClose,\n form,\n ],\n );\n\n const watchView = form.watch('view');\n const watchTemp = form.watch('temp');\n const watchTableName = form.watch('tableName');\n\n const handleCancel = useCallback(async () => {\n if (abortControllerRef.current) {\n setIsCancelling(true);\n abortControllerRef.current.abort();\n }\n }, []);\n useEffect(() => {\n onRegisterCancel?.(handleCancel);\n }, [handleCancel, onRegisterCancel]);\n\n return (\n <TooltipProvider delayDuration={200}>\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-4\">\n <DialogHeader>\n <DialogTitle>\n {editDataSource\n ? 'Edit table query'\n : watchView\n ? 'Create view from query'\n : 'Create table from query'}\n </DialogTitle>\n {!editDataSource && (\n <DialogDescription>\n {watchView\n ? 'Create a new view from an SQL query.'\n : 'Create a new table from the results of an SQL query.'}\n </DialogDescription>\n )}\n </DialogHeader>\n\n {form.formState.errors.root && (\n <Alert variant=\"destructive\">\n <AlertDescription className=\"font-mono text-xs whitespace-pre-wrap\">\n {form.formState.errors.root.message}\n </AlertDescription>\n </Alert>\n )}\n\n {/* Table name, schema, database in single row */}\n <div className=\"flex items-start gap-3\">\n <FormField\n control={form.control}\n name=\"tableName\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-2\">\n <FormLabel className=\"text-xs\">\n {watchView ? 'View name' : 'Table name'}\n </FormLabel>\n <FormControl>\n <Input\n {...field}\n className=\"h-9 font-mono text-xs\"\n autoFocus\n disabled={isSubmitting}\n />\n </FormControl>\n <FormMessage className=\"text-xs\" />\n </FormItem>\n )}\n />\n\n {showSchemaSelection && (\n <>\n <FormField\n control={form.control}\n name=\"schema\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-1\">\n <FormLabel className=\"text-xs\">Schema</FormLabel>\n <FormControl>\n <SchemaCombobox\n value={field.value}\n onChange={field.onChange}\n options={schemas}\n placeholder=\"Schema...\"\n searchPlaceholder=\"Search...\"\n emptyMessage=\"No schemas.\"\n disabled={isSubmitting}\n />\n </FormControl>\n </FormItem>\n )}\n />\n\n {(databases.length > 1 || watchTemp) && (\n <FormField\n control={form.control}\n name=\"database\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-1\">\n <FormLabel className=\"text-xs\">Database</FormLabel>\n <FormControl>\n <SchemaCombobox\n value={watchTemp ? 'temp' : field.value}\n onChange={field.onChange}\n options={databases}\n placeholder=\"Database...\"\n searchPlaceholder=\"Search...\"\n emptyMessage=\"No databases.\"\n disabled={isSubmitting || watchTemp}\n />\n </FormControl>\n </FormItem>\n )}\n />\n )}\n </>\n )}\n </div>\n\n <FormField\n control={form.control}\n name=\"query\"\n render={({field}) => (\n <FormItem className=\"relative flex h-[200px] flex-col\">\n <FormControl>\n <SqlMonacoEditor\n connector={connector}\n value={field.value}\n onChange={field.onChange}\n className=\"absolute inset-0 h-full w-full\"\n options={{\n scrollBeyondLastLine: false,\n automaticLayout: true,\n minimap: {enabled: false},\n wordWrap: 'on',\n folding: false,\n lineNumbers: 'off',\n readOnly: isSubmitting,\n fixedOverflowWidgets: false, // default true doesn't work well in a modal\n }}\n />\n </FormControl>\n <FormMessage className=\"text-xs\" />\n </FormItem>\n )}\n />\n\n {/* Compact options row */}\n {!onAddOrUpdateSqlQuery && (\n <div className=\"flex items-center gap-6 rounded-md border px-3 py-2\">\n <FormField\n control={form.control}\n name=\"view\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-view\"\n label=\"View\"\n tooltip=\"Create a view instead of a table. Views store the query, not the data.\"\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n />\n\n {/* <FormField\n control={form.control}\n name=\"temp\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-temp\"\n label=\"Temporary\"\n tooltip={`${watchView ? 'View' : 'Table'} will be deleted when the session ends.`}\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n /> */}\n\n <FormField\n control={form.control}\n name=\"replace\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-replace\"\n label=\"Overwrite\"\n tooltip={`Overwrite existing ${watchView ? 'view' : 'table'} with the same name if it exists.`}\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n />\n </div>\n )}\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onRequestClose}>\n Close\n </Button>\n <Button\n type={isSubmitting ? 'button' : 'submit'}\n onClick={isSubmitting ? handleCancel : undefined}\n disabled={isSubmitting ? isCancelling : !watchTableName?.trim()}\n >\n {isSubmitting && <Spinner className=\"mr-2\" />}\n {isSubmitting\n ? isCancelling\n ? 'Cancelling...'\n : 'Cancel'\n : editDataSource\n ? 'Update'\n : 'Create'}\n </Button>\n </DialogFooter>\n </form>\n </Form>\n </TooltipProvider>\n );\n};\n\nconst CreateTableModal: FC<CreateTableModalProps> = (props) => {\n const {\n isOpen,\n onClose,\n query,\n editDataSource,\n allowMultipleStatements,\n showSchemaSelection,\n onAddOrUpdateSqlQuery,\n className,\n initialValues,\n } = props;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isConfirmOpen, setIsConfirmOpen] = useState(false);\n const cancelRef = useRef<(() => void) | null>(null);\n\n const resetState = useCallback(() => {\n setIsSubmitting(false);\n setIsConfirmOpen(false);\n cancelRef.current = null;\n }, []);\n\n const handleClose = useCallback(() => {\n resetState();\n onClose();\n }, [onClose, resetState]);\n\n const handleRequestClose = useCallback(() => {\n if (!isSubmitting) {\n handleClose();\n return;\n }\n setIsConfirmOpen(true);\n }, [handleClose, isSubmitting]);\n\n const handleConfirmClose = useCallback(() => {\n cancelRef.current?.();\n handleClose();\n }, [handleClose]);\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n handleRequestClose();\n }\n }}\n >\n <DialogContent className={cn('w-3xl max-w-[80%]', className)}>\n {isOpen && (\n <CreateTableForm\n query={query}\n onClose={handleClose}\n onRequestClose={handleRequestClose}\n editDataSource={editDataSource}\n allowMultipleStatements={allowMultipleStatements}\n showSchemaSelection={showSchemaSelection}\n onAddOrUpdateSqlQuery={onAddOrUpdateSqlQuery}\n initialValues={initialValues}\n onSubmittingChange={setIsSubmitting}\n onRegisterCancel={(cancel) => {\n cancelRef.current = cancel;\n }}\n />\n )}\n </DialogContent>\n <Dialog open={isConfirmOpen} onOpenChange={setIsConfirmOpen}>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Cancel running query?</DialogTitle>\n <DialogDescription>\n A query is still running. Cancelling it will stop the query and\n close this dialog.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsConfirmOpen(false)}\n >\n Keep running\n </Button>\n <Button type=\"button\" onClick={handleConfirmClose}>\n Cancel & close\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </Dialog>\n );\n};\n\nexport default CreateTableModal;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"QueryEditorPanelEditor.d.ts","sourceRoot":"","sources":["../../src/components/QueryEditorPanelEditor.tsx"],"names":[],"mappings":"AAkBA,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAsDA,CAAC"}
1
+ {"version":3,"file":"QueryEditorPanelEditor.d.ts","sourceRoot":"","sources":["../../src/components/QueryEditorPanelEditor.tsx"],"names":[],"mappings":"AAkBA,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CA6DA,CAAC"}
@@ -28,15 +28,22 @@ export const QueryEditorPanelEditor = ({ className, queryId }) => {
28
28
  // Handle editor mount
29
29
  const handleEditorMount = useCallback((editor, monaco) => {
30
30
  editorRef.current[queryId] = editor;
31
- // Add keyboard shortcut for running query
32
- editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, () => {
33
- const model = editor.getModel();
34
- const selection = editor.getSelection();
35
- if (model && selection && !selection.isEmpty()) {
36
- runQuery(model.getValueInRange(selection));
37
- }
38
- else {
39
- runQuery(editor.getValue());
31
+ // Use onKeyDown instead of addCommand to scope the shortcut
32
+ // to THIS specific editor instance. Monaco's addCommand registers
33
+ // globally, so the last editor mounted wins when multiple editors
34
+ // are on the page.
35
+ editor.onKeyDown((e) => {
36
+ if ((e.ctrlKey || e.metaKey) && e.keyCode === monaco.KeyCode.Enter) {
37
+ e.preventDefault();
38
+ e.stopPropagation();
39
+ const model = editor.getModel();
40
+ const selection = editor.getSelection();
41
+ if (model && selection && !selection.isEmpty()) {
42
+ runQuery(model.getValueInRange(selection));
43
+ }
44
+ else {
45
+ runQuery(editor.getValue());
46
+ }
40
47
  }
41
48
  });
42
49
  }, [queryId, runQuery]);
@@ -1 +1 @@
1
- {"version":3,"file":"QueryEditorPanelEditor.js","sourceRoot":"","sources":["../../src/components/QueryEditorPanelEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import {cn} from '@sqlrooms/ui';\nimport type * as Monaco from 'monaco-editor';\nimport {useCallback, useRef} from 'react';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\nimport {SqlMonacoEditor} from '../SqlMonacoEditor';\n\ntype EditorInstance = Monaco.editor.IStandaloneCodeEditor;\ntype MonacoInstance = typeof Monaco;\n\nconst MONACO_OPTIONS: Monaco.editor.IStandaloneEditorConstructionOptions = {\n scrollBeyondLastLine: false,\n automaticLayout: true,\n minimap: {enabled: false},\n wordWrap: 'on',\n quickSuggestions: true,\n suggestOnTriggerCharacters: true,\n};\n\nexport const QueryEditorPanelEditor: React.FC<{\n className?: string;\n queryId: string;\n}> = ({className, queryId}) => {\n const tableSchemas = useStoreWithSqlEditor((s) => s.db.tables);\n const runQuery = useStoreWithSqlEditor((s) => s.sqlEditor.parseAndRunQuery);\n const connector = useStoreWithSqlEditor((s) => s.db.connector);\n\n const queryText = useStoreWithSqlEditor(\n (s) => s.sqlEditor.config.queries.find((q) => q.id === queryId)?.query,\n );\n const updateQueryText = useStoreWithSqlEditor(\n (s) => s.sqlEditor.updateQueryText,\n );\n // Editor instance ref for keyboard shortcuts\n const editorRef = useRef<{\n [key: string]: EditorInstance;\n }>({});\n\n // Handle query text update\n const handleUpdateQuery = useCallback(\n (value: string | undefined) => {\n if (!value) return;\n updateQueryText(queryId, value);\n },\n [queryId, updateQueryText],\n );\n\n // Handle editor mount\n const handleEditorMount = useCallback(\n (editor: EditorInstance, monaco: MonacoInstance) => {\n editorRef.current[queryId] = editor;\n // Add keyboard shortcut for running query\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, () => {\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (model && selection && !selection.isEmpty()) {\n runQuery(model.getValueInRange(selection));\n } else {\n runQuery(editor.getValue());\n }\n });\n },\n [queryId, runQuery],\n );\n\n return (\n <SqlMonacoEditor\n connector={connector}\n value={queryText ?? ''}\n onChange={handleUpdateQuery}\n className={cn('h-full w-full grow', className)}\n options={MONACO_OPTIONS}\n onMount={handleEditorMount}\n tableSchemas={tableSchemas}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"QueryEditorPanelEditor.js","sourceRoot":"","sources":["../../src/components/QueryEditorPanelEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAEhC,OAAO,EAAC,WAAW,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAC;AAKnD,MAAM,cAAc,GAAuD;IACzE,oBAAoB,EAAE,KAAK;IAC3B,eAAe,EAAE,IAAI;IACrB,OAAO,EAAE,EAAC,OAAO,EAAE,KAAK,EAAC;IACzB,QAAQ,EAAE,IAAI;IACd,gBAAgB,EAAE,IAAI;IACtB,0BAA0B,EAAE,IAAI;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAG9B,CAAC,EAAC,SAAS,EAAE,OAAO,EAAC,EAAE,EAAE;IAC5B,MAAM,YAAY,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,qBAAqB,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,KAAK,CACvE,CAAC;IACF,MAAM,eAAe,GAAG,qBAAqB,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CACnC,CAAC;IACF,6CAA6C;IAC7C,MAAM,SAAS,GAAG,MAAM,CAErB,EAAE,CAAC,CAAC;IAEP,2BAA2B;IAC3B,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,KAAyB,EAAE,EAAE;QAC5B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC,EACD,CAAC,OAAO,EAAE,eAAe,CAAC,CAC3B,CAAC;IAEF,sBAAsB;IACtB,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,MAAsB,EAAE,MAAsB,EAAE,EAAE;QACjD,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;QACpC,4DAA4D;QAC5D,kEAAkE;QAClE,kEAAkE;QAClE,mBAAmB;QACnB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;YACrB,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnE,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,CAAC,CAAC,eAAe,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;gBACxC,IAAI,KAAK,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC/C,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC7C,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,OAAO,EAAE,QAAQ,CAAC,CACpB,CAAC;IAEF,OAAO,CACL,KAAC,eAAe,IACd,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC9C,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,iBAAiB,EAC1B,YAAY,EAAE,YAAY,GAC1B,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {cn} from '@sqlrooms/ui';\nimport type * as Monaco from 'monaco-editor';\nimport {useCallback, useRef} from 'react';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\nimport {SqlMonacoEditor} from '../SqlMonacoEditor';\n\ntype EditorInstance = Monaco.editor.IStandaloneCodeEditor;\ntype MonacoInstance = typeof Monaco;\n\nconst MONACO_OPTIONS: Monaco.editor.IStandaloneEditorConstructionOptions = {\n scrollBeyondLastLine: false,\n automaticLayout: true,\n minimap: {enabled: false},\n wordWrap: 'on',\n quickSuggestions: true,\n suggestOnTriggerCharacters: true,\n};\n\nexport const QueryEditorPanelEditor: React.FC<{\n className?: string;\n queryId: string;\n}> = ({className, queryId}) => {\n const tableSchemas = useStoreWithSqlEditor((s) => s.db.tables);\n const runQuery = useStoreWithSqlEditor((s) => s.sqlEditor.parseAndRunQuery);\n const connector = useStoreWithSqlEditor((s) => s.db.connector);\n\n const queryText = useStoreWithSqlEditor(\n (s) => s.sqlEditor.config.queries.find((q) => q.id === queryId)?.query,\n );\n const updateQueryText = useStoreWithSqlEditor(\n (s) => s.sqlEditor.updateQueryText,\n );\n // Editor instance ref for keyboard shortcuts\n const editorRef = useRef<{\n [key: string]: EditorInstance;\n }>({});\n\n // Handle query text update\n const handleUpdateQuery = useCallback(\n (value: string | undefined) => {\n if (!value) return;\n updateQueryText(queryId, value);\n },\n [queryId, updateQueryText],\n );\n\n // Handle editor mount\n const handleEditorMount = useCallback(\n (editor: EditorInstance, monaco: MonacoInstance) => {\n editorRef.current[queryId] = editor;\n // Use onKeyDown instead of addCommand to scope the shortcut\n // to THIS specific editor instance. Monaco's addCommand registers\n // globally, so the last editor mounted wins when multiple editors\n // are on the page.\n editor.onKeyDown((e) => {\n if ((e.ctrlKey || e.metaKey) && e.keyCode === monaco.KeyCode.Enter) {\n e.preventDefault();\n e.stopPropagation();\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (model && selection && !selection.isEmpty()) {\n runQuery(model.getValueInRange(selection));\n } else {\n runQuery(editor.getValue());\n }\n }\n });\n },\n [queryId, runQuery],\n );\n\n return (\n <SqlMonacoEditor\n connector={connector}\n value={queryText ?? ''}\n onChange={handleUpdateQuery}\n className={cn('h-full w-full grow', className)}\n options={MONACO_OPTIONS}\n onMount={handleEditorMount}\n tableSchemas={tableSchemas}\n />\n );\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { DataTablePaginated, useArrowDataTable } from '@sqlrooms/data-table';
3
- import { makeLimitQuery, separateLastStatement, useSql } from '@sqlrooms/duckdb';
3
+ import { makeLimitQuery, separateLastStatement, useSql } from '@sqlrooms/db';
4
4
  import { cn } from '@sqlrooms/ui';
5
5
  import { AlertCircle } from 'lucide-react';
6
6
  import { useMemo, useState } from 'react';
@@ -1 +1 @@
1
- {"version":3,"file":"SqlQueryPreview.js","sourceRoot":"","sources":["../../src/components/SqlQueryPreview.tsx"],"names":[],"mappings":"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","sourcesContent":["import {DataTablePaginated, useArrowDataTable} from '@sqlrooms/data-table';\nimport {makeLimitQuery, separateLastStatement, useSql} from '@sqlrooms/duckdb';\nimport {cn} from '@sqlrooms/ui';\nimport {AlertCircle} from 'lucide-react';\nimport React, {useMemo, useState} from 'react';\nimport {QueryResultLimitSelect} from './QueryResultLimitSelect';\n\nexport interface SqlQueryPreviewProps {\n /**\n * The SQL query to preview\n */\n query: string;\n /**\n * Custom class name\n */\n className?: string;\n /**\n * Default limit for results\n * @default 100\n */\n defaultLimit?: number;\n /**\n * Options for the limit dropdown\n * @default [100, 500, 1000]\n */\n limitOptions?: number[];\n}\n\n/**\n * SQL query preview component with validation and results display.\n * Only allows single SELECT statements.\n * Displays results without pagination (just limited rows).\n */\nexport const SqlQueryPreview: React.FC<SqlQueryPreviewProps> = ({\n query,\n className,\n defaultLimit = 100,\n limitOptions = [100, 500, 1000],\n}) => {\n const [limit, setLimit] = useState(defaultLimit);\n\n // Validate and prepare query\n const {limitedQuery, error} = useMemo(() => {\n if (!query.trim()) {\n return {limitedQuery: '', error: null};\n }\n\n const {precedingStatements, lastStatement} = separateLastStatement(query);\n\n // Only allow single statements\n if (precedingStatements.length > 0) {\n return {\n limitedQuery: '',\n error: 'Only single SELECT statements are allowed for preview',\n };\n }\n\n // Apply limit to the query\n const limited = makeLimitQuery(lastStatement, {\n limit,\n sanitize: true,\n });\n\n return {limitedQuery: limited, error: null};\n }, [query, limit]);\n\n // Execute query\n const queryResult = useSql({\n query: limitedQuery,\n enabled: !!limitedQuery,\n });\n\n const arrowTableData = useArrowDataTable(queryResult.data?.arrowTable);\n\n // Show error if validation failed\n if (error) {\n return (\n <div\n className={cn('flex items-center gap-2 p-3 text-red-500', className)}\n >\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n <span className=\"text-xs\">{error}</span>\n </div>\n );\n }\n\n // Don't render if no query\n if (!limitedQuery) {\n return null;\n }\n\n // Show query error\n if (queryResult.error) {\n return (\n <div className={cn('p-3', className)}>\n <pre className=\"text-xs leading-tight text-red-500\">\n {queryResult.error?.message ?? 'Unknown error'}\n </pre>\n </div>\n );\n }\n\n return (\n <div className={cn('flex h-full flex-col', className)}>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <DataTablePaginated\n {...arrowTableData}\n fontSize=\"text-xs\"\n isFetching={queryResult.isLoading}\n footerActions={\n <QueryResultLimitSelect\n value={limit}\n onChange={setLimit}\n options={limitOptions}\n />\n }\n />\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"SqlQueryPreview.js","sourceRoot":"","sources":["../../src/components/SqlQueryPreview.tsx"],"names":[],"mappings":"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","sourcesContent":["import {DataTablePaginated, useArrowDataTable} from '@sqlrooms/data-table';\nimport {makeLimitQuery, separateLastStatement, useSql} from '@sqlrooms/db';\nimport {cn} from '@sqlrooms/ui';\nimport {AlertCircle} from 'lucide-react';\nimport React, {useMemo, useState} from 'react';\nimport {QueryResultLimitSelect} from './QueryResultLimitSelect';\n\nexport interface SqlQueryPreviewProps {\n /**\n * The SQL query to preview\n */\n query: string;\n /**\n * Custom class name\n */\n className?: string;\n /**\n * Default limit for results\n * @default 100\n */\n defaultLimit?: number;\n /**\n * Options for the limit dropdown\n * @default [100, 500, 1000]\n */\n limitOptions?: number[];\n}\n\n/**\n * SQL query preview component with validation and results display.\n * Only allows single SELECT statements.\n * Displays results without pagination (just limited rows).\n */\nexport const SqlQueryPreview: React.FC<SqlQueryPreviewProps> = ({\n query,\n className,\n defaultLimit = 100,\n limitOptions = [100, 500, 1000],\n}) => {\n const [limit, setLimit] = useState(defaultLimit);\n\n // Validate and prepare query\n const {limitedQuery, error} = useMemo(() => {\n if (!query.trim()) {\n return {limitedQuery: '', error: null};\n }\n\n const {precedingStatements, lastStatement} = separateLastStatement(query);\n\n // Only allow single statements\n if (precedingStatements.length > 0) {\n return {\n limitedQuery: '',\n error: 'Only single SELECT statements are allowed for preview',\n };\n }\n\n // Apply limit to the query\n const limited = makeLimitQuery(lastStatement, {\n limit,\n sanitize: true,\n });\n\n return {limitedQuery: limited, error: null};\n }, [query, limit]);\n\n // Execute query\n const queryResult = useSql({\n query: limitedQuery,\n enabled: !!limitedQuery,\n });\n\n const arrowTableData = useArrowDataTable(queryResult.data?.arrowTable);\n\n // Show error if validation failed\n if (error) {\n return (\n <div\n className={cn('flex items-center gap-2 p-3 text-red-500', className)}\n >\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n <span className=\"text-xs\">{error}</span>\n </div>\n );\n }\n\n // Don't render if no query\n if (!limitedQuery) {\n return null;\n }\n\n // Show query error\n if (queryResult.error) {\n return (\n <div className={cn('p-3', className)}>\n <pre className=\"text-xs leading-tight text-red-500\">\n {queryResult.error?.message ?? 'Unknown error'}\n </pre>\n </div>\n );\n }\n\n return (\n <div className={cn('flex h-full flex-col', className)}>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <DataTablePaginated\n {...arrowTableData}\n fontSize=\"text-xs\"\n isFetching={queryResult.isLoading}\n footerActions={\n <QueryResultLimitSelect\n value={limit}\n onChange={setLimit}\n options={limitOptions}\n />\n }\n />\n </div>\n </div>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { DuckDbConnector } from '@sqlrooms/duckdb';
1
+ import { DuckDbConnector } from '@sqlrooms/db';
2
2
  export declare const getFunctionSuggestions: (connector: DuckDbConnector, wordBeforeCursor: string, limit?: number | undefined) => Promise<Iterable<{
3
3
  name: string;
4
4
  documentation: string;
@@ -1 +1 @@
1
- {"version":3,"file":"functionSuggestions.d.ts","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,eAAe,EAEhB,MAAM,kBAAkB,CAAC;AAwD1B,eAAO,MAAM,sBAAsB;UAjDR,MAAM;mBAAiB,MAAM;GAiDqB,CAAC"}
1
+ {"version":3,"file":"functionSuggestions.d.ts","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,eAAe,EAAY,MAAM,cAAc,CAAC;AAwDhF,eAAO,MAAM,sBAAsB;UAjDR,MAAM;mBAAiB,MAAM;GAiDqB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  // Copyright 2022 Foursquare Labs, Inc. All Rights Reserved.
2
- import { createTypedRowAccessor, escapeVal, } from '@sqlrooms/duckdb';
2
+ import { createTypedRowAccessor, escapeVal } from '@sqlrooms/db';
3
3
  import { memoizeOnce } from '@sqlrooms/utils';
4
4
  const getFunctionSuggestionsImpl = async (connector, wordBeforeCursor, limit = 100) => {
5
5
  const result = await connector.query(`SELECT * FROM duckdb_functions()
@@ -1 +1 @@
1
- {"version":3,"file":"functionSuggestions.js","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2022 Foursquare Labs, Inc. All Rights Reserved.\n\nimport {\n createTypedRowAccessor,\n DuckDbConnector,\n escapeVal,\n} from '@sqlrooms/duckdb';\nimport {memoizeOnce} from '@sqlrooms/utils';\n\nconst getFunctionSuggestionsImpl = async (\n connector: DuckDbConnector,\n wordBeforeCursor: string,\n limit = 100,\n): Promise<Iterable<{name: string; documentation: string}>> => {\n const result = await connector.query(\n `SELECT * FROM duckdb_functions()\n WHERE function_name ILIKE ${escapeVal(\n wordBeforeCursor.replace(/([%_\\\\])/g, '\\\\$1') + '%',\n )} ESCAPE '\\\\'\n AND REGEXP_MATCHES(function_name, '^[A-Z]', 'i')\n ORDER BY function_name\n LIMIT ${limit}\n `,\n );\n\n return Array.from(\n groupFunctionsByName(\n Array.from(createTypedRowAccessor({arrowTable: result})).map(\n ({\n function_name,\n function_type,\n return_type,\n example, // older DuckDB versions\n examples,\n parameters,\n parameter_types,\n description,\n }: Record<string, any>) => {\n return {\n name: function_name,\n type: function_type,\n returnType: return_type,\n examples:\n // older DuckDB versions have `example` string instead of `examples` array\n examples?.toArray instanceof Function\n ? examples.toArray()\n : typeof example === 'string'\n ? [example]\n : [],\n parameters: Array.from(parameters),\n parameterTypes: Array.from(parameter_types),\n description: description,\n };\n },\n ),\n ).entries(),\n ).map(([name, rows]) => {\n return {name, documentation: formatDocumentation(rows)};\n });\n};\n\n// Memoized version of the function\nexport const getFunctionSuggestions = memoizeOnce(getFunctionSuggestionsImpl);\n\ntype FunctionRow = {\n name: string;\n type: string;\n returnType: string;\n parameters: string[];\n parameterTypes: string[];\n description: string;\n examples: string[];\n};\n\nfunction groupFunctionsByName(\n functions: FunctionRow[],\n): Map<string, FunctionRow[]> {\n return functions.reduce((acc, fn) => {\n if (!acc.has(fn.name)) {\n acc.set(fn.name, []);\n }\n\n acc.get(fn.name)?.push(fn);\n\n return acc;\n }, new Map<string, FunctionRow[]>());\n}\n\nfunction formatDocumentation(functions: FunctionRow[]): string {\n // if no overload, return empty string\n if (!functions.length) {\n return '';\n }\n\n return [\n formatSignatures(functions),\n formatDescription(functions),\n formatExamples(functions),\n ]\n .filter(Boolean)\n .join('<br>');\n}\n\nfunction formatDescription(functions: FunctionRow[]): string {\n // description is the same for all overloads, so we can take it from the first one\n const description = functions[0]?.description;\n return description ? `<i>${description}</i>` : '';\n}\n\nfunction formatExamples(functions: FunctionRow[], examplesToShow = 3): string {\n const examples = Array.from(\n new Set(functions.flatMap((fn) => fn.examples).filter(Boolean)),\n )\n .slice(0, examplesToShow)\n .join('\\n');\n\n if (!examples) {\n return '';\n }\n\n return `<br><b>Examples:</b><br><pre>${examples}</pre>`;\n}\n\nfunction formatSignatures(\n functions: FunctionRow[],\n overloadsToShow = 3,\n): string {\n const overloadToShow = functions.slice(0, overloadsToShow);\n\n const formattedOverloads = overloadToShow.map(formatSignature);\n\n // print more overloads count message\n const moreOverloadsCount = functions.length - overloadToShow.length;\n const formattedMoreOverloads = moreOverloadsCount\n ? `(+${moreOverloadsCount} more overload)`\n : '';\n\n // build lines array\n const lines = [\n ...formattedOverloads,\n ...(formattedMoreOverloads ? [formattedMoreOverloads] : []),\n ];\n\n return `<pre>${lines.filter(Boolean).join('\\n')}</pre>`;\n}\n\nfunction formatSignature({\n name,\n parameterTypes,\n parameters,\n returnType,\n}: FunctionRow): string {\n // format parameters\n const params = parameters\n .map((parameterName, index) => ({\n parameterName,\n parameterType: parameterTypes[index],\n }))\n .map(({parameterName, parameterType}) => {\n if (parameterType) {\n return `${parameterName}: ${parameterType}`;\n }\n return parameterName;\n })\n .join(', ');\n\n // format signature body\n const signatureBody = `${name}(${params})`;\n\n // if returnType is defined, add it to the signature\n if (returnType) {\n return `${signatureBody}: ${returnType}`;\n }\n\n return signatureBody;\n}\n"]}
1
+ {"version":3,"file":"functionSuggestions.js","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2022 Foursquare Labs, Inc. All Rights Reserved.\n\nimport {createTypedRowAccessor, DuckDbConnector, escapeVal} from '@sqlrooms/db';\nimport {memoizeOnce} from '@sqlrooms/utils';\n\nconst getFunctionSuggestionsImpl = async (\n connector: DuckDbConnector,\n wordBeforeCursor: string,\n limit = 100,\n): Promise<Iterable<{name: string; documentation: string}>> => {\n const result = await connector.query(\n `SELECT * FROM duckdb_functions()\n WHERE function_name ILIKE ${escapeVal(\n wordBeforeCursor.replace(/([%_\\\\])/g, '\\\\$1') + '%',\n )} ESCAPE '\\\\'\n AND REGEXP_MATCHES(function_name, '^[A-Z]', 'i')\n ORDER BY function_name\n LIMIT ${limit}\n `,\n );\n\n return Array.from(\n groupFunctionsByName(\n Array.from(createTypedRowAccessor({arrowTable: result})).map(\n ({\n function_name,\n function_type,\n return_type,\n example, // older DuckDB versions\n examples,\n parameters,\n parameter_types,\n description,\n }: Record<string, any>) => {\n return {\n name: function_name,\n type: function_type,\n returnType: return_type,\n examples:\n // older DuckDB versions have `example` string instead of `examples` array\n examples?.toArray instanceof Function\n ? examples.toArray()\n : typeof example === 'string'\n ? [example]\n : [],\n parameters: Array.from(parameters),\n parameterTypes: Array.from(parameter_types),\n description: description,\n };\n },\n ),\n ).entries(),\n ).map(([name, rows]) => {\n return {name, documentation: formatDocumentation(rows)};\n });\n};\n\n// Memoized version of the function\nexport const getFunctionSuggestions = memoizeOnce(getFunctionSuggestionsImpl);\n\ntype FunctionRow = {\n name: string;\n type: string;\n returnType: string;\n parameters: string[];\n parameterTypes: string[];\n description: string;\n examples: string[];\n};\n\nfunction groupFunctionsByName(\n functions: FunctionRow[],\n): Map<string, FunctionRow[]> {\n return functions.reduce((acc, fn) => {\n if (!acc.has(fn.name)) {\n acc.set(fn.name, []);\n }\n\n acc.get(fn.name)?.push(fn);\n\n return acc;\n }, new Map<string, FunctionRow[]>());\n}\n\nfunction formatDocumentation(functions: FunctionRow[]): string {\n // if no overload, return empty string\n if (!functions.length) {\n return '';\n }\n\n return [\n formatSignatures(functions),\n formatDescription(functions),\n formatExamples(functions),\n ]\n .filter(Boolean)\n .join('<br>');\n}\n\nfunction formatDescription(functions: FunctionRow[]): string {\n // description is the same for all overloads, so we can take it from the first one\n const description = functions[0]?.description;\n return description ? `<i>${description}</i>` : '';\n}\n\nfunction formatExamples(functions: FunctionRow[], examplesToShow = 3): string {\n const examples = Array.from(\n new Set(functions.flatMap((fn) => fn.examples).filter(Boolean)),\n )\n .slice(0, examplesToShow)\n .join('\\n');\n\n if (!examples) {\n return '';\n }\n\n return `<br><b>Examples:</b><br><pre>${examples}</pre>`;\n}\n\nfunction formatSignatures(\n functions: FunctionRow[],\n overloadsToShow = 3,\n): string {\n const overloadToShow = functions.slice(0, overloadsToShow);\n\n const formattedOverloads = overloadToShow.map(formatSignature);\n\n // print more overloads count message\n const moreOverloadsCount = functions.length - overloadToShow.length;\n const formattedMoreOverloads = moreOverloadsCount\n ? `(+${moreOverloadsCount} more overload)`\n : '';\n\n // build lines array\n const lines = [\n ...formattedOverloads,\n ...(formattedMoreOverloads ? [formattedMoreOverloads] : []),\n ];\n\n return `<pre>${lines.filter(Boolean).join('\\n')}</pre>`;\n}\n\nfunction formatSignature({\n name,\n parameterTypes,\n parameters,\n returnType,\n}: FunctionRow): string {\n // format parameters\n const params = parameters\n .map((parameterName, index) => ({\n parameterName,\n parameterType: parameterTypes[index],\n }))\n .map(({parameterName, parameterType}) => {\n if (parameterType) {\n return `${parameterName}: ${parameterType}`;\n }\n return parameterName;\n })\n .join(', ');\n\n // format signature body\n const signatureBody = `${name}(${params})`;\n\n // if returnType is defined, add it to the signature\n if (returnType) {\n return `${signatureBody}: ${returnType}`;\n }\n\n return signatureBody;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/sql-editor",
3
- "version": "0.28.0",
3
+ "version": "0.29.0-rc.0",
4
4
  "author": "SQLRooms Contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -29,20 +29,20 @@
29
29
  "@hookform/resolvers": "^5.0.0",
30
30
  "@monaco-editor/react": "^4.7.0",
31
31
  "@paralleldrive/cuid2": "^3.0.0",
32
- "@sqlrooms/data-table": "0.28.0",
33
- "@sqlrooms/duckdb": "0.28.0",
34
- "@sqlrooms/monaco-editor": "0.28.0",
35
- "@sqlrooms/room-shell": "0.28.0",
36
- "@sqlrooms/schema-tree": "0.28.0",
37
- "@sqlrooms/sql-editor-config": "0.28.0",
38
- "@sqlrooms/ui": "0.28.0",
39
- "@sqlrooms/utils": "0.28.0",
32
+ "@sqlrooms/data-table": "0.29.0-rc.0",
33
+ "@sqlrooms/db": "0.29.0-rc.0",
34
+ "@sqlrooms/monaco-editor": "0.29.0-rc.0",
35
+ "@sqlrooms/room-shell": "0.29.0-rc.0",
36
+ "@sqlrooms/schema-tree": "0.29.0-rc.0",
37
+ "@sqlrooms/sql-editor-config": "0.29.0-rc.0",
38
+ "@sqlrooms/ui": "0.29.0-rc.0",
39
+ "@sqlrooms/utils": "0.29.0-rc.0",
40
40
  "@tanstack/react-table": "^8.21.3",
41
41
  "d3-dsv": "^3.0.1",
42
42
  "file-saver": "^2.0.5",
43
43
  "immer": "^11.0.1",
44
44
  "lucide-react": "^0.556.0",
45
- "monaco-editor": "^0.55.0",
45
+ "monaco-editor": "^0.55.1",
46
46
  "react-hook-form": "^7.63.0",
47
47
  "zod": "^4.1.8"
48
48
  },
@@ -58,5 +58,5 @@
58
58
  "@types/react": "^19.1.13",
59
59
  "@types/react-dom": "^19.1.9"
60
60
  },
61
- "gitHead": "dcac54f8adf77240e293c93d224a0ce9fd8142a9"
61
+ "gitHead": "afdb949c9601b4cdeaae966157a25a54aea2ae54"
62
62
  }