@sqlrooms/sql-editor 0.29.0-rc.5 → 0.29.0-rc.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/dist/SqlCodeMirrorEditor.d.ts +2 -0
- package/dist/SqlCodeMirrorEditor.d.ts.map +1 -1
- package/dist/SqlCodeMirrorEditor.js +3 -3
- package/dist/SqlCodeMirrorEditor.js.map +1 -1
- package/dist/SqlEditor.d.ts.map +1 -1
- package/dist/SqlEditor.js +1 -1
- package/dist/SqlEditor.js.map +1 -1
- package/dist/SqlEditorModal.d.ts.map +1 -1
- package/dist/SqlEditorModal.js +1 -1
- package/dist/SqlEditorModal.js.map +1 -1
- package/dist/SqlEditorSlice.d.ts +41 -0
- package/dist/SqlEditorSlice.d.ts.map +1 -1
- package/dist/SqlEditorSlice.js +142 -50
- package/dist/SqlEditorSlice.js.map +1 -1
- package/dist/SqlQuery.d.ts +34 -0
- package/dist/SqlQuery.d.ts.map +1 -0
- package/dist/SqlQuery.js +51 -0
- package/dist/SqlQuery.js.map +1 -0
- package/dist/SqlQueryBlock.d.ts +20 -0
- package/dist/SqlQueryBlock.d.ts.map +1 -0
- package/dist/SqlQueryBlock.js +148 -0
- package/dist/SqlQueryBlock.js.map +1 -0
- package/dist/codemirror/extensions/completion.d.ts +5 -2
- package/dist/codemirror/extensions/completion.d.ts.map +1 -1
- package/dist/codemirror/extensions/completion.js +82 -22
- package/dist/codemirror/extensions/completion.js.map +1 -1
- package/dist/codemirror/extensions/duck-db/duck-db.d.ts.map +1 -1
- package/dist/codemirror/extensions/duck-db/duck-db.js +3 -3
- package/dist/codemirror/extensions/duck-db/duck-db.js.map +1 -1
- package/dist/codemirror/extensions/duck-db/duckdb-sql.d.ts +2 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql.d.ts.map +1 -1
- package/dist/codemirror/extensions/duck-db/duckdb-sql.js +33 -2
- package/dist/codemirror/extensions/duck-db/duckdb-sql.js.map +1 -1
- package/dist/codemirror/extensions/sql-keymap.d.ts.map +1 -1
- package/dist/codemirror/extensions/sql-keymap.js +7 -8
- package/dist/codemirror/extensions/sql-keymap.js.map +1 -1
- package/dist/codemirror/utils/schema-converter.d.ts.map +1 -1
- package/dist/codemirror/utils/schema-converter.js +56 -1
- package/dist/codemirror/utils/schema-converter.js.map +1 -1
- package/dist/components/QueryEditorPanel.d.ts +6 -0
- package/dist/components/QueryEditorPanel.d.ts.map +1 -1
- package/dist/components/QueryEditorPanel.js +6 -0
- package/dist/components/QueryEditorPanel.js.map +1 -1
- package/dist/components/QueryEditorPanelActions.d.ts +6 -0
- package/dist/components/QueryEditorPanelActions.d.ts.map +1 -1
- package/dist/components/QueryEditorPanelActions.js +17 -5
- package/dist/components/QueryEditorPanelActions.js.map +1 -1
- package/dist/components/QueryEditorPanelEditor.d.ts +8 -0
- package/dist/components/QueryEditorPanelEditor.d.ts.map +1 -1
- package/dist/components/QueryEditorPanelEditor.js +29 -9
- package/dist/components/QueryEditorPanelEditor.js.map +1 -1
- package/dist/components/QueryResultLimitSelect.d.ts.map +1 -1
- package/dist/components/QueryResultLimitSelect.js +3 -2
- package/dist/components/QueryResultLimitSelect.js.map +1 -1
- package/dist/components/QueryResultPanel.d.ts +8 -0
- package/dist/components/QueryResultPanel.d.ts.map +1 -1
- package/dist/components/QueryResultPanel.js +28 -13
- package/dist/components/QueryResultPanel.js.map +1 -1
- package/dist/components/SqlEditorHeader.d.ts +2 -0
- package/dist/components/SqlEditorHeader.d.ts.map +1 -1
- package/dist/components/SqlEditorHeader.js +3 -2
- package/dist/components/SqlEditorHeader.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +13 -12
|
@@ -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 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
|
+
{"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 SqlEditorQuery = SqlEditorSliceConfig['queries'][number];\n\nexport type EnsureSqlQueryOptions = {\n name?: string;\n query?: string;\n open?: boolean;\n select?: boolean;\n};\n\nexport type QueryResult =\n | {\n status: 'loading';\n isBeingAborted?: boolean;\n controller: AbortController;\n startedAt?: number;\n }\n | {status: 'aborted'; durationMs?: number; completedAt?: number}\n | {status: 'error'; error: string; durationMs?: number; completedAt?: number}\n | {\n status: 'success';\n type: 'pragma' | 'explain' | 'select';\n result: arrow.Table | undefined;\n query: string;\n lastQueryStatement: string;\n durationMs?: number;\n completedAt?: number;\n }\n | {\n status: 'success';\n type: 'exec';\n query: string;\n lastQueryStatement: string;\n durationMs?: number;\n completedAt?: number;\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 * Ensure an id-addressable query exists without requiring it to be an open\n * workbench tab.\n */\n ensureQuery(queryId: string, options?: EnsureSqlQueryOptions): SqlEditorQuery;\n\n /**\n * Remove an id-addressable query and its runtime result.\n */\n removeQuery(queryId: string): void;\n\n /**\n * Rename an id-addressable query.\n */\n renameQuery(queryId: string, name: string): void;\n\n /**\n * Run a query by id, optionally overriding its stored SQL text first.\n */\n runQueryById(queryId: string, query?: string): Promise<void>;\n\n /**\n * Abort a running query by id.\n */\n abortQueryById(queryId: string): void;\n\n /**\n * Clear the runtime result for a query id.\n */\n clearQueryResult(queryId: string): 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 ensureQuery: (queryId, options = {}) => {\n const now = Date.now();\n const existingQuery = get().sqlEditor.config.queries.find(\n (query) => query.id === queryId,\n );\n const shouldOpen = Boolean(options.open || options.select);\n const nextQuery: SqlEditorQuery = existingQuery\n ? {\n ...existingQuery,\n ...(options.name !== undefined ? {name: options.name} : {}),\n ...(options.query !== undefined ? {query: options.query} : {}),\n ...(options.select ? {lastOpenedAt: now} : {}),\n }\n : {\n id: queryId,\n name: options.name ?? 'SQL Query',\n query: options.query ?? '',\n ...(options.select ? {lastOpenedAt: now} : {}),\n };\n\n set((state) =>\n produce(state, (draft) => {\n const config = draft.sqlEditor.config;\n const index = config.queries.findIndex(\n (query) => query.id === queryId,\n );\n if (index >= 0) {\n config.queries[index] = nextQuery;\n } else {\n config.queries.push(nextQuery);\n }\n if (shouldOpen && !config.openTabs.includes(queryId)) {\n config.openTabs.push(queryId);\n }\n if (options.select) {\n config.selectedQueryId = queryId;\n }\n }),\n );\n\n return nextQuery;\n },\n\n removeQuery: (queryId) => {\n const currentResult = get().sqlEditor.queryResultsById[queryId];\n if (currentResult?.status === 'loading') {\n currentResult.controller.abort();\n }\n\n set((state) =>\n produce(state, (draft) => {\n const config = draft.sqlEditor.config;\n const wasSelected = config.selectedQueryId === queryId;\n config.queries = config.queries.filter(\n (query) => query.id !== queryId,\n );\n config.openTabs = config.openTabs.filter((id) => id !== queryId);\n delete draft.sqlEditor.queryResultsById[queryId];\n\n if (wasSelected) {\n const nextSelectedId =\n config.openTabs[0] ?? config.queries[0]?.id;\n if (nextSelectedId) {\n config.selectedQueryId = nextSelectedId;\n if (!config.openTabs.includes(nextSelectedId)) {\n config.openTabs.push(nextSelectedId);\n }\n } else {\n config.selectedQueryId = '';\n }\n }\n }),\n );\n },\n\n renameQuery: (queryId, name) => {\n set((state) =>\n produce(state, (draft) => {\n const query = draft.sqlEditor.config.queries.find(\n (candidate) => candidate.id === queryId,\n );\n if (query) {\n query.name = name || query.name;\n }\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 set((state) =>\n produce(state, (draft) => {\n const config = draft.sqlEditor.config;\n\n if (config.queries.length <= 1) {\n // Don't delete the last query\n return;\n }\n\n const wasSelected = config.selectedQueryId === queryId;\n const deletingOpenIndex = config.openTabs.indexOf(queryId);\n\n config.queries = config.queries.filter((q) => q.id !== queryId);\n config.openTabs = config.openTabs.filter(\n (id) => id !== queryId,\n );\n delete draft.sqlEditor.queryResultsById[queryId];\n\n // If we deleted the selected query, select another one\n if (wasSelected) {\n const newOpenTabs = config.openTabs;\n const remainingQueries = config.queries;\n\n if (newOpenTabs.length > 0) {\n // Select from remaining open tabs\n const baseIndex =\n deletingOpenIndex <= 0 ? 0 : deletingOpenIndex - 1;\n const newIndex = Math.min(\n baseIndex,\n newOpenTabs.length - 1,\n );\n const newSelectedId =\n newOpenTabs[newIndex] ?? remainingQueries[0]?.id;\n if (newSelectedId) {\n config.selectedQueryId = newSelectedId;\n const newSelectedQuery = 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 config.openTabs.push(queryToOpen.id);\n config.selectedQueryId = queryToOpen.id;\n queryToOpen.lastOpenedAt = Date.now();\n }\n }\n }\n }),\n );\n },\n\n renameQueryTab: (queryId, newName) => {\n get().sqlEditor.renameQuery(queryId, newName);\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.runQueryById(get().sqlEditor.config.selectedQueryId),\n\n abortCurrentQuery: () => {\n get().sqlEditor.abortQueryById(get().sqlEditor.config.selectedQueryId);\n },\n\n setQueryResultLimit: (limit) => {\n set((state) =>\n produce(state, (draft) => {\n draft.sqlEditor.queryResultLimit = limit;\n }),\n );\n },\n\n abortQueryById: (queryId) => {\n const currentResult = get().sqlEditor.queryResultsById[queryId];\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[queryId];\n if (result?.status === 'loading') {\n result.isBeingAborted = true;\n }\n }),\n );\n },\n\n clearQueryResult: (queryId) => {\n const currentResult = get().sqlEditor.queryResultsById[queryId];\n if (currentResult?.status === 'loading') {\n currentResult.controller.abort();\n }\n set((state) =>\n produce(state, (draft) => {\n delete draft.sqlEditor.queryResultsById[queryId];\n }),\n );\n },\n\n parseAndRunQuery: async (query): Promise<void> =>\n get().sqlEditor.runQueryById(\n get().sqlEditor.config.selectedQueryId,\n query,\n ),\n\n runQueryById: async (queryId, queryOverride): Promise<void> => {\n const storedQuery = get().sqlEditor.config.queries.find(\n (query) => query.id === queryId,\n );\n const query = queryOverride ?? storedQuery?.query ?? '';\n const existingResult =\n get().sqlEditor.queryResultsById[queryId];\n if (existingResult?.status === 'loading') {\n throw new Error('Query already running');\n }\n if (!query.trim()) {\n return;\n }\n\n get().sqlEditor.ensureQuery(queryId, {query});\n\n // Create abort controller for this query execution\n const queryController = new AbortController();\n const startedAt = Date.now();\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[queryId] = {\n status: 'loading',\n isBeingAborted: false,\n controller: queryController,\n startedAt,\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 durationMs: Date.now() - startedAt,\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 durationMs: Date.now() - startedAt,\n };\n } else if (/^(PRAGMA)/i.test(lastQueryStatement)) {\n queryResult = {\n status: 'success',\n type: 'pragma',\n query,\n lastQueryStatement,\n result,\n durationMs: Date.now() - startedAt,\n };\n } else {\n queryResult = {\n status: 'success',\n type: 'exec',\n query,\n lastQueryStatement,\n durationMs: Date.now() - startedAt,\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 = {\n status: 'aborted',\n durationMs: Date.now() - startedAt,\n };\n } else {\n queryResult = {\n status: 'error',\n error: errorMessage,\n durationMs: Date.now() - startedAt,\n };\n }\n }\n queryResult = {...queryResult, completedAt: Date.now()};\n\n // Update state without Immer since Arrow Tables don't play well with drafts.\n set((state) => {\n const currentResult = state.sqlEditor.queryResultsById[queryId];\n const queryStillExists = state.sqlEditor.config.queries.some(\n (candidate) => candidate.id === queryId,\n );\n if (\n !queryStillExists ||\n currentResult?.status !== 'loading' ||\n currentResult.controller !== queryController\n ) {\n return state;\n }\n\n return {\n ...state,\n sqlEditor: {\n ...state.sqlEditor,\n queryResultsById: {\n ...state.sqlEditor.queryResultsById,\n [queryId]: queryResult,\n },\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"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type FC, type PropsWithChildren, type ReactNode } from 'react';
|
|
2
|
+
import { type QueryResultPanelProps } from './components/QueryResultPanel';
|
|
3
|
+
export type SqlQueryRootProps = PropsWithChildren<{
|
|
4
|
+
queryId: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
initialQuery?: string;
|
|
7
|
+
readOnly?: boolean;
|
|
8
|
+
className?: string;
|
|
9
|
+
}>;
|
|
10
|
+
export type SqlQueryHeaderProps = PropsWithChildren<{
|
|
11
|
+
title?: ReactNode;
|
|
12
|
+
className?: string;
|
|
13
|
+
}>;
|
|
14
|
+
export type SqlQueryToolbarProps = PropsWithChildren<{
|
|
15
|
+
className?: string;
|
|
16
|
+
}>;
|
|
17
|
+
export type SqlQueryActionsProps = {
|
|
18
|
+
className?: string;
|
|
19
|
+
};
|
|
20
|
+
export type SqlQueryEditorProps = {
|
|
21
|
+
className?: string;
|
|
22
|
+
autoHeight?: boolean;
|
|
23
|
+
compact?: boolean;
|
|
24
|
+
};
|
|
25
|
+
export type SqlQueryResultsProps = Omit<QueryResultPanelProps, 'queryId'>;
|
|
26
|
+
export declare const SqlQuery: FC<SqlQueryRootProps> & {
|
|
27
|
+
Root: FC<SqlQueryRootProps>;
|
|
28
|
+
Header: FC<SqlQueryHeaderProps>;
|
|
29
|
+
Toolbar: FC<SqlQueryToolbarProps>;
|
|
30
|
+
Actions: FC<SqlQueryActionsProps>;
|
|
31
|
+
Editor: FC<SqlQueryEditorProps>;
|
|
32
|
+
Results: FC<SqlQueryResultsProps>;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=SqlQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqlQuery.d.ts","sourceRoot":"","sources":["../src/SqlQuery.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,EAAE,EACP,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,+BAA+B,CAAC;AAoBvC,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AA2BH,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;IAClD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AA0BH,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAQH,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAQF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAmBF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;AAO1E,eAAO,MAAM,QAAQ;;;;;;;CAOnB,CAAC"}
|
package/dist/SqlQuery.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, } from 'react';
|
|
3
|
+
import { cn } from '@sqlrooms/ui';
|
|
4
|
+
import { QueryEditorPanelActions } from './components/QueryEditorPanelActions';
|
|
5
|
+
import { QueryEditorPanelEditor } from './components/QueryEditorPanelEditor';
|
|
6
|
+
import { QueryResultPanel, } from './components/QueryResultPanel';
|
|
7
|
+
import { useStoreWithSqlEditor } from './SqlEditorSlice';
|
|
8
|
+
const SqlQueryContext = createContext(null);
|
|
9
|
+
function useSqlQueryContext() {
|
|
10
|
+
const context = useContext(SqlQueryContext);
|
|
11
|
+
if (!context) {
|
|
12
|
+
throw new Error('SqlQuery compound components must be used within SqlQuery.Root');
|
|
13
|
+
}
|
|
14
|
+
return context;
|
|
15
|
+
}
|
|
16
|
+
const SqlQueryRoot = ({ queryId, name, initialQuery, readOnly, className, children, }) => {
|
|
17
|
+
const ensureQuery = useStoreWithSqlEditor((state) => state.sqlEditor.ensureQuery);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
ensureQuery(queryId, { name, query: initialQuery });
|
|
20
|
+
}, [ensureQuery, initialQuery, name, queryId]);
|
|
21
|
+
return (_jsx(SqlQueryContext.Provider, { value: { queryId, readOnly }, children: _jsx("div", { className: cn('flex h-full min-h-0 flex-col', className), children: children }) }));
|
|
22
|
+
};
|
|
23
|
+
const SqlQueryHeader = ({ title, className, children, }) => {
|
|
24
|
+
if (!title && !children)
|
|
25
|
+
return null;
|
|
26
|
+
return (_jsxs("div", { className: cn('border-border flex items-center gap-2 border-b px-3 py-2', className), children: [title ? (_jsx("div", { className: "min-w-0 flex-1 truncate text-sm font-medium", children: title })) : null, children] }));
|
|
27
|
+
};
|
|
28
|
+
const SqlQueryToolbar = ({ className, children }) => (_jsx("div", { className: cn('flex items-center gap-2 px-3 py-2', className), children: children }));
|
|
29
|
+
const SqlQueryActions = ({ className }) => {
|
|
30
|
+
const { queryId, readOnly } = useSqlQueryContext();
|
|
31
|
+
if (readOnly)
|
|
32
|
+
return null;
|
|
33
|
+
return _jsx(QueryEditorPanelActions, { queryId: queryId, className: className });
|
|
34
|
+
};
|
|
35
|
+
const SqlQueryEditor = ({ className, autoHeight, compact, }) => {
|
|
36
|
+
const { queryId, readOnly } = useSqlQueryContext();
|
|
37
|
+
return (_jsx(QueryEditorPanelEditor, { queryId: queryId, readOnly: readOnly, className: className, autoHeight: autoHeight, compact: compact }));
|
|
38
|
+
};
|
|
39
|
+
const SqlQueryResults = (props) => {
|
|
40
|
+
const { queryId } = useSqlQueryContext();
|
|
41
|
+
return _jsx(QueryResultPanel, { ...props, queryId: queryId });
|
|
42
|
+
};
|
|
43
|
+
export const SqlQuery = Object.assign(SqlQueryRoot, {
|
|
44
|
+
Root: SqlQueryRoot,
|
|
45
|
+
Header: SqlQueryHeader,
|
|
46
|
+
Toolbar: SqlQueryToolbar,
|
|
47
|
+
Actions: SqlQueryActions,
|
|
48
|
+
Editor: SqlQueryEditor,
|
|
49
|
+
Results: SqlQueryResults,
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=SqlQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqlQuery.js","sourceRoot":"","sources":["../src/SqlQuery.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n type FC,\n type PropsWithChildren,\n type ReactNode,\n} from 'react';\nimport {cn} from '@sqlrooms/ui';\nimport {QueryEditorPanelActions} from './components/QueryEditorPanelActions';\nimport {QueryEditorPanelEditor} from './components/QueryEditorPanelEditor';\nimport {\n QueryResultPanel,\n type QueryResultPanelProps,\n} from './components/QueryResultPanel';\nimport {useStoreWithSqlEditor} from './SqlEditorSlice';\n\ntype SqlQueryContextValue = {\n queryId: string;\n readOnly?: boolean;\n};\n\nconst SqlQueryContext = createContext<SqlQueryContextValue | null>(null);\n\nfunction useSqlQueryContext() {\n const context = useContext(SqlQueryContext);\n if (!context) {\n throw new Error(\n 'SqlQuery compound components must be used within SqlQuery.Root',\n );\n }\n return context;\n}\n\nexport type SqlQueryRootProps = PropsWithChildren<{\n queryId: string;\n name?: string;\n initialQuery?: string;\n readOnly?: boolean;\n className?: string;\n}>;\n\nconst SqlQueryRoot: FC<SqlQueryRootProps> = ({\n queryId,\n name,\n initialQuery,\n readOnly,\n className,\n children,\n}) => {\n const ensureQuery = useStoreWithSqlEditor(\n (state) => state.sqlEditor.ensureQuery,\n );\n\n useEffect(() => {\n ensureQuery(queryId, {name, query: initialQuery});\n }, [ensureQuery, initialQuery, name, queryId]);\n\n return (\n <SqlQueryContext.Provider value={{queryId, readOnly}}>\n <div className={cn('flex h-full min-h-0 flex-col', className)}>\n {children}\n </div>\n </SqlQueryContext.Provider>\n );\n};\n\nexport type SqlQueryHeaderProps = PropsWithChildren<{\n title?: ReactNode;\n className?: string;\n}>;\n\nconst SqlQueryHeader: FC<SqlQueryHeaderProps> = ({\n title,\n className,\n children,\n}) => {\n if (!title && !children) return null;\n\n return (\n <div\n className={cn(\n 'border-border flex items-center gap-2 border-b px-3 py-2',\n className,\n )}\n >\n {title ? (\n <div className=\"min-w-0 flex-1 truncate text-sm font-medium\">\n {title}\n </div>\n ) : null}\n {children}\n </div>\n );\n};\n\nexport type SqlQueryToolbarProps = PropsWithChildren<{\n className?: string;\n}>;\n\nconst SqlQueryToolbar: FC<SqlQueryToolbarProps> = ({className, children}) => (\n <div className={cn('flex items-center gap-2 px-3 py-2', className)}>\n {children}\n </div>\n);\n\nexport type SqlQueryActionsProps = {\n className?: string;\n};\n\nconst SqlQueryActions: FC<SqlQueryActionsProps> = ({className}) => {\n const {queryId, readOnly} = useSqlQueryContext();\n if (readOnly) return null;\n return <QueryEditorPanelActions queryId={queryId} className={className} />;\n};\n\nexport type SqlQueryEditorProps = {\n className?: string;\n autoHeight?: boolean;\n compact?: boolean;\n};\n\nconst SqlQueryEditor: FC<SqlQueryEditorProps> = ({\n className,\n autoHeight,\n compact,\n}) => {\n const {queryId, readOnly} = useSqlQueryContext();\n return (\n <QueryEditorPanelEditor\n queryId={queryId}\n readOnly={readOnly}\n className={className}\n autoHeight={autoHeight}\n compact={compact}\n />\n );\n};\n\nexport type SqlQueryResultsProps = Omit<QueryResultPanelProps, 'queryId'>;\n\nconst SqlQueryResults: FC<SqlQueryResultsProps> = (props) => {\n const {queryId} = useSqlQueryContext();\n return <QueryResultPanel {...props} queryId={queryId} />;\n};\n\nexport const SqlQuery = Object.assign(SqlQueryRoot, {\n Root: SqlQueryRoot,\n Header: SqlQueryHeader,\n Toolbar: SqlQueryToolbar,\n Actions: SqlQueryActions,\n Editor: SqlQueryEditor,\n Results: SqlQueryResults,\n});\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { StatefulBlockDefinition, StatefulBlockRenderProps } from '@sqlrooms/blocks';
|
|
2
|
+
import type { BaseRoomStoreState } from '@sqlrooms/room-shell';
|
|
3
|
+
import { type ComponentType, type FC } from 'react';
|
|
4
|
+
import { type SqlEditorSliceState } from './SqlEditorSlice';
|
|
5
|
+
export type SqlQueryBlockProps = Partial<StatefulBlockRenderProps> & {
|
|
6
|
+
queryId?: string;
|
|
7
|
+
className?: string;
|
|
8
|
+
editorClassName?: string;
|
|
9
|
+
resultsClassName?: string;
|
|
10
|
+
compact?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare const SQL_QUERY_BLOCK_TYPE = "sql-query";
|
|
13
|
+
export declare const SqlQueryBlock: FC<SqlQueryBlockProps>;
|
|
14
|
+
export type CreateSqlQueryBlockDefinitionOptions<TRoomState extends BaseRoomStoreState & SqlEditorSliceState> = {
|
|
15
|
+
label?: string;
|
|
16
|
+
defaultTitle?: string;
|
|
17
|
+
render?: ComponentType<StatefulBlockRenderProps<TRoomState>>;
|
|
18
|
+
};
|
|
19
|
+
export declare function createSqlQueryBlockDefinition<TRoomState extends BaseRoomStoreState & SqlEditorSliceState>({ label, defaultTitle, render, }?: CreateSqlQueryBlockDefinitionOptions<TRoomState>): StatefulBlockDefinition<TRoomState>;
|
|
20
|
+
//# sourceMappingURL=SqlQueryBlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqlQueryBlock.d.ts","sourceRoot":"","sources":["../src/SqlQueryBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAkB7D,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAEf,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,wBAAwB,CAAC,GAAG;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAqDhD,CAAC;AA4UF,MAAM,MAAM,oCAAoC,CAC9C,UAAU,SAAS,kBAAkB,GAAG,mBAAmB,IACzD;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,aAAa,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,UAAU,SAAS,kBAAkB,GAAG,mBAAmB,EAC3D,EACA,KAAmB,EACnB,YAA0B,EAC1B,MAA6E,GAC9E,GAAE,oCAAoC,CAAC,UAAU,CAAM,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAuB7F"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { formatDateTime } from '@sqlrooms/utils';
|
|
3
|
+
import { Button, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, cn, Spinner, } from '@sqlrooms/ui';
|
|
4
|
+
import { ChevronDownIcon, ChevronRightIcon, Code2Icon, PlayIcon, SquareIcon, } from 'lucide-react';
|
|
5
|
+
import { useCallback, useEffect, useRef, useState, } from 'react';
|
|
6
|
+
import { SqlQuery } from './SqlQuery';
|
|
7
|
+
import { useStoreWithSqlEditor, } from './SqlEditorSlice';
|
|
8
|
+
export const SQL_QUERY_BLOCK_TYPE = 'sql-query';
|
|
9
|
+
export const SqlQueryBlock = ({ blockId, queryId, title, readOnly, className, editorClassName, resultsClassName, compact, }) => {
|
|
10
|
+
const resolvedQueryId = queryId ?? blockId;
|
|
11
|
+
if (!resolvedQueryId) {
|
|
12
|
+
return (_jsx("div", { className: "text-muted-foreground p-4 text-sm", children: "SQL query block is missing a query id." }));
|
|
13
|
+
}
|
|
14
|
+
if (compact) {
|
|
15
|
+
return (_jsx(CompactSqlQueryBlock, { queryId: resolvedQueryId, title: title, readOnly: readOnly, className: className, editorClassName: editorClassName, resultsClassName: resultsClassName }));
|
|
16
|
+
}
|
|
17
|
+
return (_jsxs(SqlQuery.Root, { queryId: resolvedQueryId, name: title ?? 'SQL Query', readOnly: readOnly, className: cn('bg-background h-full min-h-[420px]', className), children: [_jsx(SqlQuery.Header, { title: title ?? 'SQL Query', children: _jsx(SqlQuery.Actions, {}) }), _jsx("div", { className: "min-h-[220px] flex-1", children: _jsx(SqlQuery.Editor, { className: cn('min-h-[220px]', editorClassName) }) }), _jsx("div", { className: cn('border-border min-h-[220px] border-t', resultsClassName), children: _jsx(SqlQuery.Results, {}) })] }));
|
|
18
|
+
};
|
|
19
|
+
const CompactSqlQueryBlock = ({ queryId, title, readOnly, className, editorClassName, resultsClassName, }) => {
|
|
20
|
+
const runQueryById = useStoreWithSqlEditor((state) => state.sqlEditor.runQueryById);
|
|
21
|
+
const abortQueryById = useStoreWithSqlEditor((state) => state.sqlEditor.abortQueryById);
|
|
22
|
+
const queryResult = useStoreWithSqlEditor((state) => state.sqlEditor.queryResultsById[queryId]);
|
|
23
|
+
const isLoading = queryResult?.status === 'loading';
|
|
24
|
+
const isCancelling = isLoading && queryResult.isBeingAborted;
|
|
25
|
+
const [now, setNow] = useState(() => Date.now());
|
|
26
|
+
const resultCompletedAt = getQueryResultCompletedAt(queryResult);
|
|
27
|
+
const displayNow = Math.max(now, resultCompletedAt ?? now);
|
|
28
|
+
const resultLabel = getCompactResultLabel(queryResult, displayNow);
|
|
29
|
+
const resultTooltip = getCompactResultTooltip(queryResult, displayNow);
|
|
30
|
+
const [isQueryCollapsed, setIsQueryCollapsed] = useState(false);
|
|
31
|
+
const [isResultCollapsed, setIsResultCollapsed] = useState(false);
|
|
32
|
+
const [resultHeight, setResultHeight] = useState(256);
|
|
33
|
+
const resizeCleanupRef = useRef(null);
|
|
34
|
+
const handleResizeMouseDown = useCallback((event) => {
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
event.stopPropagation();
|
|
37
|
+
const startY = event.clientY;
|
|
38
|
+
const startHeight = resultHeight;
|
|
39
|
+
resizeCleanupRef.current?.();
|
|
40
|
+
const handleMouseMove = (moveEvent) => {
|
|
41
|
+
setResultHeight(Math.max(128, Math.round(startHeight + moveEvent.clientY - startY)));
|
|
42
|
+
};
|
|
43
|
+
const handleMouseUp = (upEvent) => {
|
|
44
|
+
setResultHeight(Math.max(128, Math.round(startHeight + upEvent.clientY - startY)));
|
|
45
|
+
resizeCleanupRef.current?.();
|
|
46
|
+
};
|
|
47
|
+
resizeCleanupRef.current = () => {
|
|
48
|
+
window.removeEventListener('mousemove', handleMouseMove);
|
|
49
|
+
window.removeEventListener('mouseup', handleMouseUp);
|
|
50
|
+
resizeCleanupRef.current = null;
|
|
51
|
+
};
|
|
52
|
+
window.addEventListener('mousemove', handleMouseMove);
|
|
53
|
+
window.addEventListener('mouseup', handleMouseUp);
|
|
54
|
+
}, [resultHeight]);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
return () => {
|
|
57
|
+
resizeCleanupRef.current?.();
|
|
58
|
+
};
|
|
59
|
+
}, []);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (!resultCompletedAt)
|
|
62
|
+
return;
|
|
63
|
+
const intervalId = window.setInterval(() => {
|
|
64
|
+
setNow(Date.now());
|
|
65
|
+
}, 30_000);
|
|
66
|
+
return () => window.clearInterval(intervalId);
|
|
67
|
+
}, [resultCompletedAt]);
|
|
68
|
+
return (_jsxs(SqlQuery.Root, { queryId: queryId, name: title ?? 'SQL Query', readOnly: readOnly, className: cn('bg-background relative min-h-0 overflow-visible rounded-md [&_.cm-editor]:rounded-t-md', className), children: [_jsx(Button, { size: "icon", variant: "ghost", className: "absolute top-2 -left-6 h-5 w-5 shrink-0 p-0", onClick: () => setIsQueryCollapsed((collapsed) => !collapsed), "aria-expanded": !isQueryCollapsed, "aria-label": isQueryCollapsed ? 'Expand query' : 'Collapse query', children: isQueryCollapsed ? (_jsx(ChevronRightIcon, { className: "h-3 w-3" })) : (_jsx(ChevronDownIcon, { className: "h-3 w-3" })) }), _jsxs("div", { className: cn('flex items-start gap-2 pr-2 pl-0', isQueryCollapsed ? 'py-1' : 'py-2'), children: [isQueryCollapsed ? (_jsx("div", { className: "text-muted-foreground min-w-0 flex-1 py-1 pl-4 text-xs italic", children: "Query collapsed" })) : (_jsx("div", { className: "min-w-0 flex-1", children: _jsx(SqlQuery.Editor, { autoHeight: true, compact: true, className: cn('text-sm [&_.cm-content]:pl-0 [&_.cm-line]:pl-0', editorClassName) }) })), readOnly ? null : (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { size: "icon", variant: isLoading ? 'destructive' : 'secondary', className: cn('shrink-0 rounded-md p-0', isQueryCollapsed ? 'mt-0.5 h-5 w-5' : 'mt-1 h-6 w-6'), onClick: () => isLoading
|
|
69
|
+
? abortQueryById(queryId)
|
|
70
|
+
: void runQueryById(queryId), disabled: isCancelling, "aria-label": isLoading ? 'Cancel query' : 'Run query', children: isCancelling ? (_jsx(Spinner, { className: cn('text-current', isQueryCollapsed ? 'h-2.5 w-2.5' : 'h-3 w-3') })) : isLoading ? (_jsx(SquareIcon, { className: isQueryCollapsed ? 'h-2.5 w-2.5' : 'h-3 w-3' })) : (_jsx(PlayIcon, { className: isQueryCollapsed ? 'h-2.5 w-2.5' : 'h-3 w-3' })) }) }), _jsx(TooltipContent, { align: "end", children: isLoading ? 'Cancel query' : 'Run query' })] }) }))] }), queryResult ? (_jsxs("div", { className: cn('border-border relative border-t', resultsClassName), children: [_jsx(Button, { size: "icon", variant: "ghost", className: "absolute top-2 -left-6 h-5 w-5 shrink-0 p-0", onClick: () => setIsResultCollapsed((collapsed) => !collapsed), "aria-expanded": !isResultCollapsed, "aria-label": isResultCollapsed ? 'Expand result' : 'Collapse result', children: isResultCollapsed ? (_jsx(ChevronRightIcon, { className: "h-3 w-3" })) : (_jsx(ChevronDownIcon, { className: "h-3 w-3" })) }), isResultCollapsed ? (_jsxs("div", { className: "bg-background flex items-center gap-2 py-2 pr-4 pl-4", children: [_jsx("div", { className: "text-muted-foreground min-w-0 flex-1 text-xs italic", children: "Result collapsed" }), resultTooltip ? (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("div", { className: "text-muted-foreground cursor-default text-right text-xs", children: resultLabel }) }), _jsx(TooltipContent, { align: "start", className: "space-y-1 text-xs", children: resultTooltip.map((line) => (_jsx("div", { children: line }, line))) })] }) })) : (_jsx("div", { className: "text-muted-foreground text-right text-xs", children: resultLabel }))] })) : (_jsxs("div", { className: "relative min-h-32 overflow-hidden rounded-b-md", style: { height: resultHeight }, children: [_jsx(SqlQuery.Results, { className: "h-full", dataTableClassName: "border-0", footerDetails: resultTooltip ? (_jsx(CompactResultTimestampTooltip, { label: resultLabel, lines: resultTooltip })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: resultLabel })) }), _jsx("div", { className: "absolute right-0 -bottom-4 left-0 z-10 flex h-3 cursor-row-resize items-start justify-center", onMouseDown: handleResizeMouseDown, role: "separator", "aria-orientation": "horizontal", "aria-label": "Resize query result height", children: _jsx("div", { className: "bg-muted-foreground/50 mt-0.5 h-1 w-10 rounded-full" }) })] }))] })) : null] }));
|
|
71
|
+
};
|
|
72
|
+
function CompactResultTimestampTooltip({ label, lines, }) {
|
|
73
|
+
return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "text-muted-foreground cursor-default text-xs", children: label }) }), _jsx(TooltipContent, { align: "start", className: "space-y-1 text-xs", children: lines.map((line) => (_jsx("div", { children: line }, line))) })] }) }));
|
|
74
|
+
}
|
|
75
|
+
function getCompactResultLabel(queryResult, now) {
|
|
76
|
+
if (!queryResult)
|
|
77
|
+
return '';
|
|
78
|
+
if (queryResult.status === 'loading')
|
|
79
|
+
return 'Running query...';
|
|
80
|
+
if (!queryResult.completedAt)
|
|
81
|
+
return 'Last run';
|
|
82
|
+
return formatCompactRelativeTime(queryResult.completedAt, now);
|
|
83
|
+
}
|
|
84
|
+
function getCompactResultTooltip(queryResult, now) {
|
|
85
|
+
if (!queryResult || queryResult.status === 'loading')
|
|
86
|
+
return undefined;
|
|
87
|
+
const completedAt = queryResult.completedAt;
|
|
88
|
+
const lines = [];
|
|
89
|
+
if (completedAt) {
|
|
90
|
+
lines.push(`Last run: ${formatCompactRelativeTime(completedAt, now)}`);
|
|
91
|
+
lines.push(`Completed: ${formatDateTime(completedAt)}`);
|
|
92
|
+
}
|
|
93
|
+
if (queryResult.durationMs != null) {
|
|
94
|
+
lines.push(`Query time: ${formatQueryDuration(queryResult.durationMs)}`);
|
|
95
|
+
}
|
|
96
|
+
if (queryResult.status === 'error')
|
|
97
|
+
lines.push('Status: Failed');
|
|
98
|
+
if (queryResult.status === 'aborted')
|
|
99
|
+
lines.push('Status: Cancelled');
|
|
100
|
+
return lines.length > 0 ? lines : undefined;
|
|
101
|
+
}
|
|
102
|
+
function getQueryResultCompletedAt(queryResult) {
|
|
103
|
+
return queryResult?.status === 'loading' ? undefined : queryResult?.completedAt;
|
|
104
|
+
}
|
|
105
|
+
function formatCompactRelativeTime(timestamp, now) {
|
|
106
|
+
const elapsedMs = Math.max(0, now - timestamp);
|
|
107
|
+
const elapsedSeconds = Math.floor(elapsedMs / 1000);
|
|
108
|
+
if (elapsedSeconds < 60)
|
|
109
|
+
return 'Just now';
|
|
110
|
+
const elapsedMinutes = Math.floor(elapsedSeconds / 60);
|
|
111
|
+
if (elapsedMinutes < 60)
|
|
112
|
+
return `${elapsedMinutes}m ago`;
|
|
113
|
+
const elapsedHours = Math.floor(elapsedMinutes / 60);
|
|
114
|
+
if (elapsedHours < 24)
|
|
115
|
+
return `${elapsedHours}h ago`;
|
|
116
|
+
const elapsedDays = Math.floor(elapsedHours / 24);
|
|
117
|
+
return `${elapsedDays}d ago`;
|
|
118
|
+
}
|
|
119
|
+
function formatQueryDuration(durationMs) {
|
|
120
|
+
if (durationMs < 1000)
|
|
121
|
+
return `${durationMs.toFixed(2)} ms`;
|
|
122
|
+
return `${(durationMs / 1000).toFixed(2)} s`;
|
|
123
|
+
}
|
|
124
|
+
export function createSqlQueryBlockDefinition({ label = 'SQL Query', defaultTitle = 'SQL Query', render = SqlQueryBlock, } = {}) {
|
|
125
|
+
return {
|
|
126
|
+
type: SQL_QUERY_BLOCK_TYPE,
|
|
127
|
+
label,
|
|
128
|
+
defaultTitle,
|
|
129
|
+
icon: Code2Icon,
|
|
130
|
+
capabilities: {
|
|
131
|
+
stateful: true,
|
|
132
|
+
executable: true,
|
|
133
|
+
},
|
|
134
|
+
ensureState: ({ blockId, title, getState }) => {
|
|
135
|
+
getState().sqlEditor.ensureQuery(blockId, {
|
|
136
|
+
name: title ?? defaultTitle,
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
deleteState: ({ blockId, getState }) => {
|
|
140
|
+
getState().sqlEditor.removeQuery(blockId);
|
|
141
|
+
},
|
|
142
|
+
rename: ({ blockId, title, getState }) => {
|
|
143
|
+
getState().sqlEditor.renameQuery(blockId, title);
|
|
144
|
+
},
|
|
145
|
+
render,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=SqlQueryBlock.js.map
|