@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqlQueryBlock.js","sourceRoot":"","sources":["../src/SqlQueryBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {\n StatefulBlockDefinition,\n StatefulBlockRenderProps,\n} from '@sqlrooms/blocks';\nimport type {BaseRoomStoreState} from '@sqlrooms/room-shell';\nimport {formatDateTime} from '@sqlrooms/utils';\nimport {\n Button,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n Spinner,\n} from '@sqlrooms/ui';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Code2Icon,\n PlayIcon,\n SquareIcon,\n} from 'lucide-react';\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ComponentType,\n type FC,\n type MouseEvent as ReactMouseEvent,\n} from 'react';\nimport {SqlQuery} from './SqlQuery';\nimport {\n useStoreWithSqlEditor,\n type QueryResult,\n type SqlEditorSliceState,\n} from './SqlEditorSlice';\n\nexport type SqlQueryBlockProps = Partial<StatefulBlockRenderProps> & {\n queryId?: string;\n className?: string;\n editorClassName?: string;\n resultsClassName?: string;\n compact?: boolean;\n};\n\nexport const SQL_QUERY_BLOCK_TYPE = 'sql-query';\n\nexport const SqlQueryBlock: FC<SqlQueryBlockProps> = ({\n blockId,\n queryId,\n title,\n readOnly,\n className,\n editorClassName,\n resultsClassName,\n compact,\n}) => {\n const resolvedQueryId = queryId ?? blockId;\n\n if (!resolvedQueryId) {\n return (\n <div className=\"text-muted-foreground p-4 text-sm\">\n SQL query block is missing a query id.\n </div>\n );\n }\n\n if (compact) {\n return (\n <CompactSqlQueryBlock\n queryId={resolvedQueryId}\n title={title}\n readOnly={readOnly}\n className={className}\n editorClassName={editorClassName}\n resultsClassName={resultsClassName}\n />\n );\n }\n\n return (\n <SqlQuery.Root\n queryId={resolvedQueryId}\n name={title ?? 'SQL Query'}\n readOnly={readOnly}\n className={cn('bg-background h-full min-h-[420px]', className)}\n >\n <SqlQuery.Header title={title ?? 'SQL Query'}>\n <SqlQuery.Actions />\n </SqlQuery.Header>\n <div className=\"min-h-[220px] flex-1\">\n <SqlQuery.Editor className={cn('min-h-[220px]', editorClassName)} />\n </div>\n <div\n className={cn('border-border min-h-[220px] border-t', resultsClassName)}\n >\n <SqlQuery.Results />\n </div>\n </SqlQuery.Root>\n );\n};\n\ntype CompactSqlQueryBlockProps = {\n queryId: string;\n title?: string;\n readOnly?: boolean;\n className?: string;\n editorClassName?: string;\n resultsClassName?: string;\n};\n\nconst CompactSqlQueryBlock: FC<CompactSqlQueryBlockProps> = ({\n queryId,\n title,\n readOnly,\n className,\n editorClassName,\n resultsClassName,\n}) => {\n const runQueryById = useStoreWithSqlEditor(\n (state) => state.sqlEditor.runQueryById,\n );\n const abortQueryById = useStoreWithSqlEditor(\n (state) => state.sqlEditor.abortQueryById,\n );\n const queryResult = useStoreWithSqlEditor(\n (state) => state.sqlEditor.queryResultsById[queryId],\n );\n const isLoading = queryResult?.status === 'loading';\n const isCancelling = isLoading && queryResult.isBeingAborted;\n const [now, setNow] = useState(() => Date.now());\n const resultCompletedAt = getQueryResultCompletedAt(queryResult);\n const displayNow = Math.max(now, resultCompletedAt ?? now);\n const resultLabel = getCompactResultLabel(queryResult, displayNow);\n const resultTooltip = getCompactResultTooltip(queryResult, displayNow);\n const [isQueryCollapsed, setIsQueryCollapsed] = useState(false);\n const [isResultCollapsed, setIsResultCollapsed] = useState(false);\n const [resultHeight, setResultHeight] = useState(256);\n const resizeCleanupRef = useRef<(() => void) | null>(null);\n\n const handleResizeMouseDown = useCallback(\n (event: ReactMouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const startY = event.clientY;\n const startHeight = resultHeight;\n resizeCleanupRef.current?.();\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n setResultHeight(\n Math.max(128, Math.round(startHeight + moveEvent.clientY - startY)),\n );\n };\n\n const handleMouseUp = (upEvent: MouseEvent) => {\n setResultHeight(\n Math.max(128, Math.round(startHeight + upEvent.clientY - startY)),\n );\n resizeCleanupRef.current?.();\n };\n\n resizeCleanupRef.current = () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n resizeCleanupRef.current = null;\n };\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n },\n [resultHeight],\n );\n\n useEffect(() => {\n return () => {\n resizeCleanupRef.current?.();\n };\n }, []);\n\n useEffect(() => {\n if (!resultCompletedAt) return;\n const intervalId = window.setInterval(() => {\n setNow(Date.now());\n }, 30_000);\n return () => window.clearInterval(intervalId);\n }, [resultCompletedAt]);\n\n return (\n <SqlQuery.Root\n queryId={queryId}\n name={title ?? 'SQL Query'}\n readOnly={readOnly}\n className={cn(\n 'bg-background relative min-h-0 overflow-visible rounded-md [&_.cm-editor]:rounded-t-md',\n className,\n )}\n >\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"absolute top-2 -left-6 h-5 w-5 shrink-0 p-0\"\n onClick={() => setIsQueryCollapsed((collapsed) => !collapsed)}\n aria-expanded={!isQueryCollapsed}\n aria-label={isQueryCollapsed ? 'Expand query' : 'Collapse query'}\n >\n {isQueryCollapsed ? (\n <ChevronRightIcon className=\"h-3 w-3\" />\n ) : (\n <ChevronDownIcon className=\"h-3 w-3\" />\n )}\n </Button>\n <div\n className={cn(\n 'flex items-start gap-2 pr-2 pl-0',\n isQueryCollapsed ? 'py-1' : 'py-2',\n )}\n >\n {isQueryCollapsed ? (\n <div className=\"text-muted-foreground min-w-0 flex-1 py-1 pl-4 text-xs italic\">\n Query collapsed\n </div>\n ) : (\n <div className=\"min-w-0 flex-1\">\n <SqlQuery.Editor\n autoHeight\n compact\n className={cn(\n 'text-sm [&_.cm-content]:pl-0 [&_.cm-line]:pl-0',\n editorClassName,\n )}\n />\n </div>\n )}\n {readOnly ? null : (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"icon\"\n variant={isLoading ? 'destructive' : 'secondary'}\n className={cn(\n 'shrink-0 rounded-md p-0',\n isQueryCollapsed ? 'mt-0.5 h-5 w-5' : 'mt-1 h-6 w-6',\n )}\n onClick={() =>\n isLoading\n ? abortQueryById(queryId)\n : void runQueryById(queryId)\n }\n disabled={isCancelling}\n aria-label={isLoading ? 'Cancel query' : 'Run query'}\n >\n {isCancelling ? (\n <Spinner\n className={cn(\n 'text-current',\n isQueryCollapsed ? 'h-2.5 w-2.5' : 'h-3 w-3',\n )}\n />\n ) : isLoading ? (\n <SquareIcon\n className={isQueryCollapsed ? 'h-2.5 w-2.5' : 'h-3 w-3'}\n />\n ) : (\n <PlayIcon\n className={isQueryCollapsed ? 'h-2.5 w-2.5' : 'h-3 w-3'}\n />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent align=\"end\">\n {isLoading ? 'Cancel query' : 'Run query'}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n {queryResult ? (\n <div className={cn('border-border relative border-t', resultsClassName)}>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"absolute top-2 -left-6 h-5 w-5 shrink-0 p-0\"\n onClick={() => setIsResultCollapsed((collapsed) => !collapsed)}\n aria-expanded={!isResultCollapsed}\n aria-label={isResultCollapsed ? 'Expand result' : 'Collapse result'}\n >\n {isResultCollapsed ? (\n <ChevronRightIcon className=\"h-3 w-3\" />\n ) : (\n <ChevronDownIcon className=\"h-3 w-3\" />\n )}\n </Button>\n {isResultCollapsed ? (\n <div className=\"bg-background flex items-center gap-2 py-2 pr-4 pl-4\">\n <div className=\"text-muted-foreground min-w-0 flex-1 text-xs italic\">\n Result collapsed\n </div>\n {resultTooltip ? (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"text-muted-foreground cursor-default text-right text-xs\">\n {resultLabel}\n </div>\n </TooltipTrigger>\n <TooltipContent align=\"start\" className=\"space-y-1 text-xs\">\n {resultTooltip.map((line) => (\n <div key={line}>{line}</div>\n ))}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n <div className=\"text-muted-foreground text-right text-xs\">\n {resultLabel}\n </div>\n )}\n </div>\n ) : (\n <div\n className=\"relative min-h-32 overflow-hidden rounded-b-md\"\n style={{height: resultHeight}}\n >\n <SqlQuery.Results\n className=\"h-full\"\n dataTableClassName=\"border-0\"\n footerDetails={\n resultTooltip ? (\n <CompactResultTimestampTooltip\n label={resultLabel}\n lines={resultTooltip}\n />\n ) : (\n <span className=\"text-muted-foreground text-xs\">\n {resultLabel}\n </span>\n )\n }\n />\n <div\n className=\"absolute right-0 -bottom-4 left-0 z-10 flex h-3 cursor-row-resize items-start justify-center\"\n onMouseDown={handleResizeMouseDown}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-label=\"Resize query result height\"\n >\n <div className=\"bg-muted-foreground/50 mt-0.5 h-1 w-10 rounded-full\" />\n </div>\n </div>\n )}\n </div>\n ) : null}\n </SqlQuery.Root>\n );\n};\n\nfunction CompactResultTimestampTooltip({\n label,\n lines,\n}: {\n label: string;\n lines: string[];\n}) {\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground cursor-default text-xs\">\n {label}\n </span>\n </TooltipTrigger>\n <TooltipContent align=\"start\" className=\"space-y-1 text-xs\">\n {lines.map((line) => (\n <div key={line}>{line}</div>\n ))}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nfunction getCompactResultLabel(queryResult: QueryResult | undefined, now: number) {\n if (!queryResult) return '';\n if (queryResult.status === 'loading') return 'Running query...';\n if (!queryResult.completedAt) return 'Last run';\n return formatCompactRelativeTime(queryResult.completedAt, now);\n}\n\nfunction getCompactResultTooltip(\n queryResult: QueryResult | undefined,\n now: number,\n) {\n if (!queryResult || queryResult.status === 'loading') return undefined;\n const completedAt = queryResult.completedAt;\n const lines: string[] = [];\n if (completedAt) {\n lines.push(`Last run: ${formatCompactRelativeTime(completedAt, now)}`);\n lines.push(`Completed: ${formatDateTime(completedAt)}`);\n }\n if (queryResult.durationMs != null) {\n lines.push(`Query time: ${formatQueryDuration(queryResult.durationMs)}`);\n }\n if (queryResult.status === 'error') lines.push('Status: Failed');\n if (queryResult.status === 'aborted') lines.push('Status: Cancelled');\n return lines.length > 0 ? lines : undefined;\n}\n\nfunction getQueryResultCompletedAt(queryResult: QueryResult | undefined) {\n return queryResult?.status === 'loading' ? undefined : queryResult?.completedAt;\n}\n\nfunction formatCompactRelativeTime(timestamp: number, now: number) {\n const elapsedMs = Math.max(0, now - timestamp);\n const elapsedSeconds = Math.floor(elapsedMs / 1000);\n if (elapsedSeconds < 60) return 'Just now';\n\n const elapsedMinutes = Math.floor(elapsedSeconds / 60);\n if (elapsedMinutes < 60) return `${elapsedMinutes}m ago`;\n\n const elapsedHours = Math.floor(elapsedMinutes / 60);\n if (elapsedHours < 24) return `${elapsedHours}h ago`;\n\n const elapsedDays = Math.floor(elapsedHours / 24);\n return `${elapsedDays}d ago`;\n}\n\nfunction formatQueryDuration(durationMs: number) {\n if (durationMs < 1000) return `${durationMs.toFixed(2)} ms`;\n return `${(durationMs / 1000).toFixed(2)} s`;\n}\n\nexport type CreateSqlQueryBlockDefinitionOptions<\n TRoomState extends BaseRoomStoreState & SqlEditorSliceState,\n> = {\n label?: string;\n defaultTitle?: string;\n render?: ComponentType<StatefulBlockRenderProps<TRoomState>>;\n};\n\nexport function createSqlQueryBlockDefinition<\n TRoomState extends BaseRoomStoreState & SqlEditorSliceState,\n>({\n label = 'SQL Query',\n defaultTitle = 'SQL Query',\n render = SqlQueryBlock as ComponentType<StatefulBlockRenderProps<TRoomState>>,\n}: CreateSqlQueryBlockDefinitionOptions<TRoomState> = {}): StatefulBlockDefinition<TRoomState> {\n return {\n type: SQL_QUERY_BLOCK_TYPE,\n label,\n defaultTitle,\n icon: Code2Icon,\n capabilities: {\n stateful: true,\n executable: true,\n },\n ensureState: ({blockId, title, getState}) => {\n getState().sqlEditor.ensureQuery(blockId, {\n name: title ?? defaultTitle,\n });\n },\n deleteState: ({blockId, getState}) => {\n getState().sqlEditor.removeQuery(blockId);\n },\n rename: ({blockId, title, getState}) => {\n getState().sqlEditor.renameQuery(blockId, title);\n },\n render,\n };\n}\n"]}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
import type { LRLanguage } from '@codemirror/language';
|
|
1
2
|
import type { Extension } from '@codemirror/state';
|
|
2
3
|
import type { GroupedFunctionSuggestion } from '@sqlrooms/db';
|
|
4
|
+
import { type DataTable } from '@sqlrooms/duckdb';
|
|
3
5
|
export interface CompletionContext {
|
|
4
|
-
|
|
6
|
+
language: LRLanguage;
|
|
7
|
+
currentSchemas: DataTable[];
|
|
5
8
|
getFunctionSuggestions?: (query: string) => Promise<GroupedFunctionSuggestion[]>;
|
|
6
9
|
}
|
|
7
10
|
/**
|
|
8
11
|
* Creates SQL completion extension with dynamic function docs and keywords.
|
|
9
12
|
* Complements marimo-sql's base SQL completions (keywords, tables, columns, CTEs).
|
|
10
13
|
*/
|
|
11
|
-
export declare function createCompletion({
|
|
14
|
+
export declare function createCompletion({ language, currentSchemas, getFunctionSuggestions, }: CompletionContext): Extension;
|
|
12
15
|
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/codemirror/extensions/completion.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/codemirror/extensions/completion.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAIjD,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAW,KAAK,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAK1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,UAAU,CAAC;IACrB,cAAc,EAAE,SAAS,EAAE,CAAC;IAC5B,sBAAsB,CAAC,EAAE,CACvB,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAC;CAC3C;AAqGD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,EACd,sBAAsB,GACvB,EAAE,iBAAiB,GAAG,SAAS,CA6D/B"}
|
|
@@ -1,11 +1,75 @@
|
|
|
1
|
-
import { autocompletion, } from '@codemirror/autocomplete';
|
|
1
|
+
import { autocompletion, ifNotIn, insertCompletionText, } from '@codemirror/autocomplete';
|
|
2
2
|
import { FunctionDocumentation } from '../../components/FunctionDocumentation';
|
|
3
3
|
import { renderComponentToDomElement } from '@sqlrooms/utils';
|
|
4
|
+
import { escapeId } from '@sqlrooms/duckdb';
|
|
5
|
+
const FUNCTION_INFO_DELAY_MS = 750;
|
|
6
|
+
const ACTIVATE_ON_TYPING_DELAY_MS = 500;
|
|
7
|
+
function createColumnCompletion(column) {
|
|
8
|
+
const applyIdentifier = (view, _completion, from, to) => {
|
|
9
|
+
const escaped = escapeId(column.name);
|
|
10
|
+
const previousCharacter = from > 0 ? view.state.sliceDoc(from - 1, from) : '';
|
|
11
|
+
const replaceFrom = escaped.startsWith('"') &&
|
|
12
|
+
(previousCharacter === '"' || previousCharacter === "'")
|
|
13
|
+
? from - 1
|
|
14
|
+
: from;
|
|
15
|
+
view.dispatch(insertCompletionText(view.state, escaped, replaceFrom, to));
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
label: column.name,
|
|
19
|
+
type: 'property',
|
|
20
|
+
detail: `${column.tableName} - ${column.type}`,
|
|
21
|
+
apply: applyIdentifier,
|
|
22
|
+
boost: 5,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function createColumnCompletionSource(tables) {
|
|
26
|
+
const options = tables.flatMap((table) => {
|
|
27
|
+
const tableName = table.table.table;
|
|
28
|
+
return table.columns.map((column) => createColumnCompletion({
|
|
29
|
+
name: column.name,
|
|
30
|
+
type: column.type,
|
|
31
|
+
tableName,
|
|
32
|
+
}));
|
|
33
|
+
});
|
|
34
|
+
return (completionContext) => {
|
|
35
|
+
if (options.length === 0) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const word = completionContext.matchBefore(/[\w-]*/);
|
|
39
|
+
if (!word || word.from === word.to) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const textBeforeCursor = completionContext.state.sliceDoc(Math.max(0, completionContext.pos - 200), completionContext.pos);
|
|
43
|
+
const previousCharacter = word.from > 0
|
|
44
|
+
? completionContext.state.sliceDoc(word.from - 1, word.from)
|
|
45
|
+
: '';
|
|
46
|
+
const isSingleQuotedPrefix = previousCharacter === "'";
|
|
47
|
+
if ((isSingleQuotedPrefix && !word.text.includes('-')) ||
|
|
48
|
+
/\.[\w-]*$/.test(textBeforeCursor) ||
|
|
49
|
+
/\b(from|join|into|update|table|describe|desc|attach)\s+(?:"[^"]*"?|[\w-]*)$/i.test(textBeforeCursor)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
from: word.from,
|
|
54
|
+
options,
|
|
55
|
+
validFor: /^[\w-]*$/,
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function delayedFunctionInfo(functions) {
|
|
60
|
+
return new Promise((resolve) => {
|
|
61
|
+
globalThis.setTimeout(() => {
|
|
62
|
+
resolve(renderComponentToDomElement(FunctionDocumentation, {
|
|
63
|
+
functions,
|
|
64
|
+
}));
|
|
65
|
+
}, FUNCTION_INFO_DELAY_MS);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
4
68
|
/**
|
|
5
69
|
* Creates SQL completion extension with dynamic function docs and keywords.
|
|
6
70
|
* Complements marimo-sql's base SQL completions (keywords, tables, columns, CTEs).
|
|
7
71
|
*/
|
|
8
|
-
export function createCompletion({
|
|
72
|
+
export function createCompletion({ language, currentSchemas, getFunctionSuggestions, }) {
|
|
9
73
|
const completionSource = async (completionContext) => {
|
|
10
74
|
const suggestions = [];
|
|
11
75
|
// Get word at cursor for matching
|
|
@@ -13,15 +77,6 @@ export function createCompletion({ getKeywordSuggestions, getFunctionSuggestions
|
|
|
13
77
|
if (!word || (word.from === word.to && !completionContext.explicit)) {
|
|
14
78
|
return null;
|
|
15
79
|
}
|
|
16
|
-
// Add keywords
|
|
17
|
-
const keywords = getKeywordSuggestions?.() ?? [];
|
|
18
|
-
keywords.forEach((keyword) => {
|
|
19
|
-
suggestions.push({
|
|
20
|
-
label: keyword,
|
|
21
|
-
type: 'keyword',
|
|
22
|
-
boost: 5,
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
80
|
// Add dynamic function suggestions with documentation
|
|
26
81
|
if (getFunctionSuggestions && word.text) {
|
|
27
82
|
try {
|
|
@@ -31,10 +86,8 @@ export function createCompletion({ getKeywordSuggestions, getFunctionSuggestions
|
|
|
31
86
|
label: name,
|
|
32
87
|
type: 'method',
|
|
33
88
|
detail: overloads[0]?.description ?? '',
|
|
34
|
-
info: () =>
|
|
35
|
-
|
|
36
|
-
}),
|
|
37
|
-
boost: 5,
|
|
89
|
+
info: () => delayedFunctionInfo(overloads),
|
|
90
|
+
boost: -20,
|
|
38
91
|
};
|
|
39
92
|
}));
|
|
40
93
|
}
|
|
@@ -46,15 +99,22 @@ export function createCompletion({ getKeywordSuggestions, getFunctionSuggestions
|
|
|
46
99
|
? {
|
|
47
100
|
from: word.from,
|
|
48
101
|
options: suggestions,
|
|
102
|
+
validFor: /^\w*$/,
|
|
49
103
|
}
|
|
50
104
|
: null;
|
|
51
105
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
106
|
+
return [
|
|
107
|
+
language.data.of({
|
|
108
|
+
autocomplete: ifNotIn(['LineComment', 'BlockComment'], createColumnCompletionSource(currentSchemas)),
|
|
109
|
+
}),
|
|
110
|
+
language.data.of({
|
|
111
|
+
autocomplete: ifNotIn(['QuotedIdentifier', 'String', 'LineComment', 'BlockComment', '.'], completionSource),
|
|
112
|
+
}),
|
|
113
|
+
autocompletion({
|
|
114
|
+
selectOnOpen: true,
|
|
115
|
+
filterStrict: true,
|
|
116
|
+
activateOnTypingDelay: ACTIVATE_ON_TYPING_DELAY_MS,
|
|
117
|
+
}),
|
|
118
|
+
];
|
|
59
119
|
}
|
|
60
120
|
//# sourceMappingURL=completion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/codemirror/extensions/completion.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/codemirror/extensions/completion.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type CompletionContext as CMCompletionContext,\n type Completion,\n type CompletionInfo,\n type CompletionSource,\n autocompletion,\n ifNotIn,\n insertCompletionText,\n} from '@codemirror/autocomplete';\nimport type {LRLanguage} from '@codemirror/language';\nimport type {Extension} from '@codemirror/state';\nimport type {EditorView} from '@codemirror/view';\nimport {FunctionDocumentation} from '../../components/FunctionDocumentation';\nimport {renderComponentToDomElement} from '@sqlrooms/utils';\nimport type {GroupedFunctionSuggestion} from '@sqlrooms/db';\nimport {escapeId, type DataTable} from '@sqlrooms/duckdb';\n\nconst FUNCTION_INFO_DELAY_MS = 750;\nconst ACTIVATE_ON_TYPING_DELAY_MS = 500;\n\nexport interface CompletionContext {\n language: LRLanguage;\n currentSchemas: DataTable[];\n getFunctionSuggestions?: (\n query: string,\n ) => Promise<GroupedFunctionSuggestion[]>;\n}\n\nfunction createColumnCompletion(column: {\n name: string;\n type: string;\n tableName: string;\n}): Completion {\n const applyIdentifier = (\n view: EditorView,\n _completion: Completion,\n from: number,\n to: number,\n ) => {\n const escaped = escapeId(column.name);\n const previousCharacter =\n from > 0 ? view.state.sliceDoc(from - 1, from) : '';\n const replaceFrom =\n escaped.startsWith('\"') &&\n (previousCharacter === '\"' || previousCharacter === \"'\")\n ? from - 1\n : from;\n\n view.dispatch(\n insertCompletionText(view.state, escaped, replaceFrom, to),\n );\n };\n\n return {\n label: column.name,\n type: 'property',\n detail: `${column.tableName} - ${column.type}`,\n apply: applyIdentifier,\n boost: 5,\n };\n}\n\nfunction createColumnCompletionSource(tables: DataTable[]): CompletionSource {\n const options = tables.flatMap((table): Completion[] => {\n const tableName = table.table.table;\n\n return table.columns.map((column) =>\n createColumnCompletion({\n name: column.name,\n type: column.type,\n tableName,\n }),\n );\n });\n\n return (completionContext: CMCompletionContext) => {\n if (options.length === 0) {\n return null;\n }\n\n const word = completionContext.matchBefore(/[\\w-]*/);\n if (!word || word.from === word.to) {\n return null;\n }\n\n const textBeforeCursor = completionContext.state.sliceDoc(\n Math.max(0, completionContext.pos - 200),\n completionContext.pos,\n );\n const previousCharacter =\n word.from > 0\n ? completionContext.state.sliceDoc(word.from - 1, word.from)\n : '';\n const isSingleQuotedPrefix = previousCharacter === \"'\";\n\n if (\n (isSingleQuotedPrefix && !word.text.includes('-')) ||\n /\\.[\\w-]*$/.test(textBeforeCursor) ||\n /\\b(from|join|into|update|table|describe|desc|attach)\\s+(?:\"[^\"]*\"?|[\\w-]*)$/i.test(\n textBeforeCursor,\n )\n ) {\n return null;\n }\n\n return {\n from: word.from,\n options,\n validFor: /^[\\w-]*$/,\n };\n };\n}\n\nfunction delayedFunctionInfo(\n functions: GroupedFunctionSuggestion['overloads'],\n): Promise<CompletionInfo> {\n return new Promise((resolve) => {\n globalThis.setTimeout(() => {\n resolve(\n renderComponentToDomElement(FunctionDocumentation, {\n functions,\n }),\n );\n }, FUNCTION_INFO_DELAY_MS);\n });\n}\n\n/**\n * Creates SQL completion extension with dynamic function docs and keywords.\n * Complements marimo-sql's base SQL completions (keywords, tables, columns, CTEs).\n */\nexport function createCompletion({\n language,\n currentSchemas,\n getFunctionSuggestions,\n}: CompletionContext): Extension {\n const completionSource: CompletionSource = async (\n completionContext: CMCompletionContext,\n ) => {\n const suggestions: Completion[] = [];\n\n // Get word at cursor for matching\n const word = completionContext.matchBefore(/\\w*/);\n if (!word || (word.from === word.to && !completionContext.explicit)) {\n return null;\n }\n\n // Add dynamic function suggestions with documentation\n if (getFunctionSuggestions && word.text) {\n try {\n const functionGroups = await getFunctionSuggestions(word.text);\n\n suggestions.push(\n ...functionGroups.map(({name, overloads}): Completion => {\n return {\n label: name,\n type: 'method',\n detail: overloads[0]?.description ?? '',\n info: () => delayedFunctionInfo(overloads),\n boost: -20,\n };\n }),\n );\n } catch (error) {\n console.error('Error fetching function suggestions:', error);\n }\n }\n\n return suggestions.length > 0\n ? {\n from: word.from,\n options: suggestions,\n validFor: /^\\w*$/,\n }\n : null;\n };\n\n return [\n language.data.of({\n autocomplete: ifNotIn(\n ['LineComment', 'BlockComment'],\n createColumnCompletionSource(currentSchemas),\n ),\n }),\n language.data.of({\n autocomplete: ifNotIn(\n ['QuotedIdentifier', 'String', 'LineComment', 'BlockComment', '.'],\n completionSource,\n ),\n }),\n autocompletion({\n selectOnOpen: true,\n filterStrict: true,\n activateOnTypingDelay: ACTIVATE_ON_TYPING_DELAY_MS,\n }),\n ];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duck-db.d.ts","sourceRoot":"","sources":["../../../../src/codemirror/extensions/duck-db/duck-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,SAAS,EACT,eAAe,EAGhB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"duck-db.d.ts","sourceRoot":"","sources":["../../../../src/codemirror/extensions/duck-db/duck-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,SAAS,EACT,eAAe,EAGhB,MAAM,kBAAkB,CAAC;AAO1B,KAAK,sBAAsB,GAAG;IAC5B,cAAc,EAAE,SAAS,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,cAAc,EACd,SAAS,GACV,EAAE,sBAAsB,GAAG,SAAS,EAAE,CAqBtC"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { getFunctionSuggestions, getFunctionDocumentation, } from '@sqlrooms/duckdb';
|
|
2
|
-
import { createDuckDbSql } from './duckdb-sql';
|
|
2
|
+
import { createDuckDbSql, SqlRoomsDuckDBDialect } from './duckdb-sql';
|
|
3
3
|
import { convertToSQLNamespace } from '../../utils/schema-converter';
|
|
4
4
|
import { createCompletion } from '../completion';
|
|
5
5
|
import { createDuckDbSqlExtension } from './duckdb-sql-extension';
|
|
6
6
|
import { createHover } from '../hover';
|
|
7
|
-
import { DUCKDB_SQL_KEYWORDS } from './duckdb-keywords';
|
|
8
7
|
export function createDuckDbExtension({ currentSchemas, connector, }) {
|
|
9
8
|
// Convert schema to SQLNamespace format
|
|
10
9
|
const schema = convertToSQLNamespace(currentSchemas);
|
|
11
10
|
return [
|
|
12
11
|
createDuckDbSql(schema),
|
|
13
12
|
createCompletion({
|
|
14
|
-
|
|
13
|
+
language: SqlRoomsDuckDBDialect.language,
|
|
14
|
+
currentSchemas,
|
|
15
15
|
getFunctionSuggestions: connector
|
|
16
16
|
? (query) => getFunctionSuggestions(connector, query)
|
|
17
17
|
: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duck-db.js","sourceRoot":"","sources":["../../../../src/codemirror/extensions/duck-db/duck-db.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"duck-db.js","sourceRoot":"","sources":["../../../../src/codemirror/extensions/duck-db/duck-db.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,eAAe,EAAE,qBAAqB,EAAC,MAAM,cAAc,CAAC;AACpE,OAAO,EAAC,qBAAqB,EAAC,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,WAAW,EAAC,MAAM,UAAU,CAAC;AAOrC,MAAM,UAAU,qBAAqB,CAAC,EACpC,cAAc,EACd,SAAS,GACc;IACvB,wCAAwC;IACxC,MAAM,MAAM,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAErD,OAAO;QACL,eAAe,CAAC,MAAM,CAAC;QACvB,gBAAgB,CAAC;YACf,QAAQ,EAAE,qBAAqB,CAAC,QAAQ;YACxC,cAAc;YACd,sBAAsB,EAAE,SAAS;gBAC/B,CAAC,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,KAAK,CAAC;gBAC7D,CAAC,CAAC,SAAS;SACd,CAAC;QACF,wBAAwB,CAAC,MAAM,EAAE,cAAc,CAAC;QAChD,WAAW,CAAC;YACV,wBAAwB,EAAE,SAAS;gBACjC,CAAC,CAAC,CAAC,YAAoB,EAAE,EAAE,CACvB,wBAAwB,CAAC,SAAS,EAAE,YAAY,CAAC;gBACrD,CAAC,CAAC,SAAS;SACd,CAAC;KACH,CAAC;AACJ,CAAC","sourcesContent":["import type {Extension} from '@codemirror/state';\nimport {\n DataTable,\n DuckDbConnector,\n getFunctionSuggestions,\n getFunctionDocumentation,\n} from '@sqlrooms/duckdb';\nimport {createDuckDbSql, SqlRoomsDuckDBDialect} from './duckdb-sql';\nimport {convertToSQLNamespace} from '../../utils/schema-converter';\nimport {createCompletion} from '../completion';\nimport {createDuckDbSqlExtension} from './duckdb-sql-extension';\nimport {createHover} from '../hover';\n\ntype DuckDbExtensionOptions = {\n currentSchemas: DataTable[];\n connector?: DuckDbConnector;\n};\n\nexport function createDuckDbExtension({\n currentSchemas,\n connector,\n}: DuckDbExtensionOptions): Extension[] {\n // Convert schema to SQLNamespace format\n const schema = convertToSQLNamespace(currentSchemas);\n\n return [\n createDuckDbSql(schema),\n createCompletion({\n language: SqlRoomsDuckDBDialect.language,\n currentSchemas,\n getFunctionSuggestions: connector\n ? (query: string) => getFunctionSuggestions(connector, query)\n : undefined,\n }),\n createDuckDbSqlExtension(schema, currentSchemas),\n createHover({\n getFunctionDocumentation: connector\n ? (functionName: string) =>\n getFunctionDocumentation(connector, functionName)\n : undefined,\n }),\n ];\n}\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { SQLDialect } from '@codemirror/lang-sql';
|
|
1
2
|
import type { SQLNamespace } from '@codemirror/lang-sql';
|
|
2
3
|
import { LanguageSupport } from '@codemirror/language';
|
|
4
|
+
export declare const SqlRoomsDuckDBDialect: SQLDialect;
|
|
3
5
|
/** Creates SQL language extension with DuckDB dialect and keyword completion */
|
|
4
6
|
export declare function createDuckDbSql(schema: SQLNamespace): LanguageSupport;
|
|
5
7
|
//# sourceMappingURL=duckdb-sql.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb-sql.d.ts","sourceRoot":"","sources":["../../../../src/codemirror/extensions/duck-db/duckdb-sql.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"duckdb-sql.d.ts","sourceRoot":"","sources":["../../../../src/codemirror/extensions/duck-db/duckdb-sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,UAAU,EAAC,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AAGrD,eAAO,MAAM,qBAAqB,YAKhC,CAAC;AAsBH,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,CAgBrE"}
|
|
@@ -1,11 +1,42 @@
|
|
|
1
|
-
import { sql } from '@codemirror/lang-sql';
|
|
1
|
+
import { sql, SQLDialect } from '@codemirror/lang-sql';
|
|
2
2
|
import { DuckDBDialect } from '@marimo-team/codemirror-sql/dialects';
|
|
3
|
+
import { DUCKDB_SQL_KEYWORDS } from './duckdb-keywords';
|
|
4
|
+
export const SqlRoomsDuckDBDialect = SQLDialect.define({
|
|
5
|
+
...DuckDBDialect.spec,
|
|
6
|
+
keywords: DUCKDB_SQL_KEYWORDS.map((keyword) => keyword.toLowerCase()).join(' '),
|
|
7
|
+
});
|
|
8
|
+
const STARTER_KEYWORD_SORT_TEXT = new Map([
|
|
9
|
+
'SELECT',
|
|
10
|
+
'FROM',
|
|
11
|
+
'WITH',
|
|
12
|
+
'CREATE',
|
|
13
|
+
'INSERT',
|
|
14
|
+
'UPDATE',
|
|
15
|
+
'DELETE',
|
|
16
|
+
'COPY',
|
|
17
|
+
'DESCRIBE',
|
|
18
|
+
'SHOW',
|
|
19
|
+
'EXPLAIN',
|
|
20
|
+
'SUMMARIZE',
|
|
21
|
+
'ATTACH',
|
|
22
|
+
'INSTALL',
|
|
23
|
+
'LOAD',
|
|
24
|
+
].map((keyword, index) => [keyword, String(index).padStart(2, '0')]));
|
|
3
25
|
/** Creates SQL language extension with DuckDB dialect and keyword completion */
|
|
4
26
|
export function createDuckDbSql(schema) {
|
|
5
27
|
return sql({
|
|
6
|
-
dialect:
|
|
28
|
+
dialect: SqlRoomsDuckDBDialect,
|
|
7
29
|
schema,
|
|
8
30
|
upperCaseKeywords: true,
|
|
31
|
+
keywordCompletion: (label, type) => {
|
|
32
|
+
const starterSortText = STARTER_KEYWORD_SORT_TEXT.get(label);
|
|
33
|
+
return {
|
|
34
|
+
label,
|
|
35
|
+
type,
|
|
36
|
+
boost: starterSortText ? 50 : 0,
|
|
37
|
+
sortText: starterSortText ?? label,
|
|
38
|
+
};
|
|
39
|
+
},
|
|
9
40
|
});
|
|
10
41
|
}
|
|
11
42
|
//# sourceMappingURL=duckdb-sql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb-sql.js","sourceRoot":"","sources":["../../../../src/codemirror/extensions/duck-db/duckdb-sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"duckdb-sql.js","sourceRoot":"","sources":["../../../../src/codemirror/extensions/duck-db/duckdb-sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAE,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAC,aAAa,EAAC,MAAM,sCAAsC,CAAC;AAGnE,OAAO,EAAC,mBAAmB,EAAC,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC,MAAM,CAAC;IACrD,GAAG,aAAa,CAAC,IAAI;IACrB,QAAQ,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CACxE,GAAG,CACJ;CACF,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,IAAI,GAAG,CACvC;IACE,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;IACV,MAAM;IACN,SAAS;IACT,WAAW;IACX,QAAQ;IACR,SAAS;IACT,MAAM;CACP,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CACrE,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,OAAO,GAAG,CAAC;QACT,OAAO,EAAE,qBAAqB;QAC9B,MAAM;QACN,iBAAiB,EAAE,IAAI;QACvB,iBAAiB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACjC,MAAM,eAAe,GAAG,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAE7D,OAAO;gBACL,KAAK;gBACL,IAAI;gBACJ,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/B,QAAQ,EAAE,eAAe,IAAI,KAAK;aACnC,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {sql, SQLDialect} from '@codemirror/lang-sql';\nimport {DuckDBDialect} from '@marimo-team/codemirror-sql/dialects';\nimport type {SQLNamespace} from '@codemirror/lang-sql';\nimport {LanguageSupport} from '@codemirror/language';\nimport {DUCKDB_SQL_KEYWORDS} from './duckdb-keywords';\n\nexport const SqlRoomsDuckDBDialect = SQLDialect.define({\n ...DuckDBDialect.spec,\n keywords: DUCKDB_SQL_KEYWORDS.map((keyword) => keyword.toLowerCase()).join(\n ' ',\n ),\n});\n\nconst STARTER_KEYWORD_SORT_TEXT = new Map(\n [\n 'SELECT',\n 'FROM',\n 'WITH',\n 'CREATE',\n 'INSERT',\n 'UPDATE',\n 'DELETE',\n 'COPY',\n 'DESCRIBE',\n 'SHOW',\n 'EXPLAIN',\n 'SUMMARIZE',\n 'ATTACH',\n 'INSTALL',\n 'LOAD',\n ].map((keyword, index) => [keyword, String(index).padStart(2, '0')]),\n);\n\n/** Creates SQL language extension with DuckDB dialect and keyword completion */\nexport function createDuckDbSql(schema: SQLNamespace): LanguageSupport {\n return sql({\n dialect: SqlRoomsDuckDBDialect,\n schema,\n upperCaseKeywords: true,\n keywordCompletion: (label, type) => {\n const starterSortText = STARTER_KEYWORD_SORT_TEXT.get(label);\n\n return {\n label,\n type,\n boost: starterSortText ? 50 : 0,\n sortText: starterSortText ?? label,\n };\n },\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-keymap.d.ts","sourceRoot":"","sources":["../../../src/codemirror/extensions/sql-keymap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sql-keymap.d.ts","sourceRoot":"","sources":["../../../src/codemirror/extensions/sql-keymap.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAGjD,2DAA2D;AAC3D,wBAAgB,eAAe,CAC7B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GACnC,SAAS,CAsBX"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
+
import { acceptCompletion } from '@codemirror/autocomplete';
|
|
1
2
|
import { keymap } from '@codemirror/view';
|
|
2
3
|
import { Prec } from '@codemirror/state';
|
|
3
4
|
/** Creates keymap extension with Cmd+Enter to run query */
|
|
4
5
|
export function createSqlKeymap(onRunQuery) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
return Prec.high(keymap.of([
|
|
10
|
-
{
|
|
6
|
+
const bindings = [{ key: 'Tab', run: acceptCompletion }];
|
|
7
|
+
if (onRunQuery) {
|
|
8
|
+
bindings.push({
|
|
11
9
|
key: 'Mod-Enter', // Cmd on Mac, Ctrl on Windows/Linux
|
|
12
10
|
run: (view) => {
|
|
13
11
|
const { state } = view;
|
|
@@ -19,7 +17,8 @@ export function createSqlKeymap(onRunQuery) {
|
|
|
19
17
|
onRunQuery(query);
|
|
20
18
|
return true; // Prevent default behavior
|
|
21
19
|
},
|
|
22
|
-
}
|
|
23
|
-
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return Prec.high(keymap.of(bindings));
|
|
24
23
|
}
|
|
25
24
|
//# sourceMappingURL=sql-keymap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-keymap.js","sourceRoot":"","sources":["../../../src/codemirror/extensions/sql-keymap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"sql-keymap.js","sourceRoot":"","sources":["../../../src/codemirror/extensions/sql-keymap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAC,MAAM,EAAkB,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAC,IAAI,EAAC,MAAM,mBAAmB,CAAC;AAIvC,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAC7B,UAAoC;IAEpC,MAAM,QAAQ,GAAiB,CAAC,EAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAC,CAAC,CAAC;IAErE,IAAI,UAAU,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,EAAE,WAAW,EAAE,oCAAoC;YACtD,GAAG,EAAE,CAAC,IAAgB,EAAE,EAAE;gBACxB,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC;gBACrB,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;gBAEvC,qCAAqC;gBACrC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK;oBAC3B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACtB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;gBAEjD,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO,IAAI,CAAC,CAAC,2BAA2B;YAC1C,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxC,CAAC","sourcesContent":["import {acceptCompletion} from '@codemirror/autocomplete';\nimport {keymap, type KeyBinding} from '@codemirror/view';\nimport {Prec} from '@codemirror/state';\nimport type {Extension} from '@codemirror/state';\nimport type {EditorView} from '@codemirror/view';\n\n/** Creates keymap extension with Cmd+Enter to run query */\nexport function createSqlKeymap(\n onRunQuery?: (query: string) => void,\n): Extension {\n const bindings: KeyBinding[] = [{key: 'Tab', run: acceptCompletion}];\n\n if (onRunQuery) {\n bindings.push({\n key: 'Mod-Enter', // Cmd on Mac, Ctrl on Windows/Linux\n run: (view: EditorView) => {\n const {state} = view;\n const selection = state.selection.main;\n\n // Get selected text or full document\n const query = selection.empty\n ? state.doc.toString()\n : state.sliceDoc(selection.from, selection.to);\n\n onRunQuery(query);\n return true; // Prevent default behavior\n },\n });\n }\n\n return Prec.high(keymap.of(bindings));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../../src/codemirror/utils/schema-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../../src/codemirror/utils/schema-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAwEhD,yFAAyF;AACzF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CA8BvE"}
|
|
@@ -1,8 +1,63 @@
|
|
|
1
|
+
function namespaceKey(name) {
|
|
2
|
+
return name.replace(/\./g, '\\.');
|
|
3
|
+
}
|
|
4
|
+
function isNamespaceRecord(value) {
|
|
5
|
+
return (!Array.isArray(value) &&
|
|
6
|
+
typeof value === 'object' &&
|
|
7
|
+
value !== null &&
|
|
8
|
+
!('self' in value));
|
|
9
|
+
}
|
|
10
|
+
function isNamespaceWithRecordChildren(value) {
|
|
11
|
+
return (!!value &&
|
|
12
|
+
!Array.isArray(value) &&
|
|
13
|
+
'children' in value &&
|
|
14
|
+
isNamespaceRecord(value.children));
|
|
15
|
+
}
|
|
16
|
+
function columnsNamespace(table) {
|
|
17
|
+
return table.columns.map((col) => ({
|
|
18
|
+
label: col.name,
|
|
19
|
+
type: 'property',
|
|
20
|
+
detail: col.type,
|
|
21
|
+
boost: 10,
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
function selfNamespace(label, type, children, detail, boost = 0) {
|
|
25
|
+
return {
|
|
26
|
+
self: {
|
|
27
|
+
label,
|
|
28
|
+
type,
|
|
29
|
+
detail,
|
|
30
|
+
boost,
|
|
31
|
+
},
|
|
32
|
+
children,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function getChildren(namespace, name) {
|
|
36
|
+
const key = namespaceKey(name);
|
|
37
|
+
const existing = namespace[key];
|
|
38
|
+
if (isNamespaceWithRecordChildren(existing)) {
|
|
39
|
+
return existing.children;
|
|
40
|
+
}
|
|
41
|
+
const children = isNamespaceRecord(existing) ? existing : {};
|
|
42
|
+
namespace[key] = selfNamespace(name, 'namespace', children, undefined, 15);
|
|
43
|
+
return children;
|
|
44
|
+
}
|
|
1
45
|
/** Converts SQLRooms DataTable[] to CodeMirror SQLNamespace format for autocompletion */
|
|
2
46
|
export function convertToSQLNamespace(tables) {
|
|
3
47
|
const namespace = {};
|
|
4
48
|
for (const table of tables) {
|
|
5
|
-
|
|
49
|
+
const tableName = table.table.table;
|
|
50
|
+
const columns = columnsNamespace(table);
|
|
51
|
+
const tableNamespace = selfNamespace(tableName, 'type', columns, table.isView ? 'View' : 'Table', 20);
|
|
52
|
+
namespace[namespaceKey(tableName)] = tableNamespace;
|
|
53
|
+
if (table.table.schema) {
|
|
54
|
+
getChildren(namespace, table.table.schema)[namespaceKey(tableName)] =
|
|
55
|
+
tableNamespace;
|
|
56
|
+
}
|
|
57
|
+
if (table.table.database && table.table.schema) {
|
|
58
|
+
const databaseNamespace = getChildren(namespace, table.table.database);
|
|
59
|
+
getChildren(databaseNamespace, table.table.schema)[namespaceKey(tableName)] = tableNamespace;
|
|
60
|
+
}
|
|
6
61
|
}
|
|
7
62
|
return namespace;
|
|
8
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-converter.js","sourceRoot":"","sources":["../../../src/codemirror/utils/schema-converter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema-converter.js","sourceRoot":"","sources":["../../../src/codemirror/utils/schema-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {SQLNamespace} from '@codemirror/lang-sql';\nimport type {DataTable} from '@sqlrooms/duckdb';\nimport type {Completion} from '@codemirror/autocomplete';\n\ntype NamespaceRecord = {[name: string]: SQLNamespace};\n\nfunction namespaceKey(name: string): string {\n return name.replace(/\\./g, '\\\\.');\n}\n\nfunction isNamespaceRecord(\n value: SQLNamespace | undefined,\n): value is NamespaceRecord {\n return (\n !Array.isArray(value) &&\n typeof value === 'object' &&\n value !== null &&\n !('self' in value)\n );\n}\n\nfunction isNamespaceWithRecordChildren(\n value: SQLNamespace | undefined,\n): value is {self: Completion; children: NamespaceRecord} {\n return (\n !!value &&\n !Array.isArray(value) &&\n 'children' in value &&\n isNamespaceRecord(value.children)\n );\n}\n\nfunction columnsNamespace(table: DataTable): readonly Completion[] {\n return table.columns.map((col) => ({\n label: col.name,\n type: 'property',\n detail: col.type,\n boost: 10,\n }));\n}\n\nfunction selfNamespace(\n label: string,\n type: Completion['type'],\n children: SQLNamespace,\n detail?: string,\n boost = 0,\n): SQLNamespace {\n return {\n self: {\n label,\n type,\n detail,\n boost,\n },\n children,\n };\n}\n\nfunction getChildren(namespace: NamespaceRecord, name: string): NamespaceRecord {\n const key = namespaceKey(name);\n const existing = namespace[key];\n\n if (isNamespaceWithRecordChildren(existing)) {\n return existing.children;\n }\n\n const children: NamespaceRecord = isNamespaceRecord(existing) ? existing : {};\n\n namespace[key] = selfNamespace(name, 'namespace', children, undefined, 15);\n return children;\n}\n\n/** Converts SQLRooms DataTable[] to CodeMirror SQLNamespace format for autocompletion */\nexport function convertToSQLNamespace(tables: DataTable[]): SQLNamespace {\n const namespace: NamespaceRecord = {};\n\n for (const table of tables) {\n const tableName = table.table.table;\n const columns = columnsNamespace(table);\n const tableNamespace = selfNamespace(\n tableName,\n 'type',\n columns,\n table.isView ? 'View' : 'Table',\n 20,\n );\n\n namespace[namespaceKey(tableName)] = tableNamespace;\n\n if (table.table.schema) {\n getChildren(namespace, table.table.schema)[namespaceKey(tableName)] =\n tableNamespace;\n }\n\n if (table.table.database && table.table.schema) {\n const databaseNamespace = getChildren(namespace, table.table.database);\n getChildren(databaseNamespace, table.table.schema)[\n namespaceKey(tableName)\n ] = tableNamespace;\n }\n }\n\n return namespace;\n}\n"]}
|
|
@@ -3,5 +3,11 @@ export interface QueryEditorPanelProps {
|
|
|
3
3
|
/** Custom class name for styling */
|
|
4
4
|
className?: string;
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Ready-made tabbed SQL workbench editor panel.
|
|
8
|
+
*
|
|
9
|
+
* Prefer `SqlQuery.Root` with `SqlQuery.Editor`, `SqlQuery.Actions`, and
|
|
10
|
+
* `SqlQuery.Results` when composing a single-query surface or embedded block.
|
|
11
|
+
*/
|
|
6
12
|
export declare const QueryEditorPanel: React.FC<QueryEditorPanelProps>;
|
|
7
13
|
//# sourceMappingURL=QueryEditorPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryEditorPanel.d.ts","sourceRoot":"","sources":["../../src/components/QueryEditorPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAuC5D,CAAC"}
|
|
1
|
+
{"version":3,"file":"QueryEditorPanel.d.ts","sourceRoot":"","sources":["../../src/components/QueryEditorPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAuC5D,CAAC"}
|
|
@@ -4,6 +4,12 @@ import { useStoreWithSqlEditor } from '../SqlEditorSlice';
|
|
|
4
4
|
import { QueryEditorPanelActions } from './QueryEditorPanelActions';
|
|
5
5
|
import { QueryEditorPanelEditor } from './QueryEditorPanelEditor';
|
|
6
6
|
import { QueryEditorPanelTabsList } from './QueryEditorPanelTabsList';
|
|
7
|
+
/**
|
|
8
|
+
* Ready-made tabbed SQL workbench editor panel.
|
|
9
|
+
*
|
|
10
|
+
* Prefer `SqlQuery.Root` with `SqlQuery.Editor`, `SqlQuery.Actions`, and
|
|
11
|
+
* `SqlQuery.Results` when composing a single-query surface or embedded block.
|
|
12
|
+
*/
|
|
7
13
|
export const QueryEditorPanel = ({ className, }) => {
|
|
8
14
|
const selectedQueryId = useStoreWithSqlEditor((s) => s.sqlEditor.config.selectedQueryId);
|
|
9
15
|
const openTabs = useStoreWithSqlEditor((s) => s.sqlEditor.config.openTabs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryEditorPanel.js","sourceRoot":"","sources":["../../src/components/QueryEditorPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAChC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAC,wBAAwB,EAAC,MAAM,4BAA4B,CAAC;AAOpE,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAChE,SAAS,GACV,EAAE,EAAE;IACH,MAAM,eAAe,GAAG,qBAAqB,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAC1C,CAAC;IACF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE3E,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE1D,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,sBAAsB;QACtB,4DAA4D;QAC5D,kBAAkB,EAClB,SAAS,CACV,aAED,eAAK,SAAS,EAAC,0DAA0D,aACvE,KAAC,wBAAwB,KAAG,EAC5B,cAAK,SAAS,EAAC,QAAQ,GAAG,EAC1B,KAAC,uBAAuB,KAAG,IACvB,EACL,cAAc,CAAC,CAAC,CAAC,CAChB,cAAK,SAAS,EAAC,kCAAkC,YAC/C,cAAK,SAAS,EAAC,sBAAsB,YACnC,cAAK,SAAS,EAAC,kBAAkB,YAC/B,KAAC,sBAAsB,IAAC,OAAO,EAAE,eAAe,GAAI,GAChD,GACF,GACF,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,uEAAuE,gCAEhF,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React from 'react';\nimport {cn} from '@sqlrooms/ui';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\nimport {QueryEditorPanelActions} from './QueryEditorPanelActions';\nimport {QueryEditorPanelEditor} from './QueryEditorPanelEditor';\nimport {QueryEditorPanelTabsList} from './QueryEditorPanelTabsList';\n\nexport interface QueryEditorPanelProps {\n /** Custom class name for styling */\n className?: string;\n}\n\nexport const QueryEditorPanel: React.FC<QueryEditorPanelProps> = ({\n className,\n}) => {\n const selectedQueryId = useStoreWithSqlEditor(\n (s) => s.sqlEditor.config.selectedQueryId,\n );\n const openTabs = useStoreWithSqlEditor((s) => s.sqlEditor.config.openTabs);\n\n const isSelectedOpen = openTabs.includes(selectedQueryId);\n\n return (\n <div\n className={cn(\n 'flex h-full flex-col',\n // this is for Monaco's completion menu to not being cut off\n 'overflow-visible',\n className,\n )}\n >\n <div className=\"border-border flex items-center gap-4 border-b px-2 pt-1\">\n <QueryEditorPanelTabsList />\n <div className=\"flex-1\" />\n <QueryEditorPanelActions />\n </div>\n {isSelectedOpen ? (\n <div className=\"bg-background h-full w-full py-1\">\n <div className=\"relative h-full grow\">\n <div className=\"absolute inset-0\">\n <QueryEditorPanelEditor queryId={selectedQueryId} />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"text-muted-foreground flex h-full items-center justify-center text-sm\">\n No open queries\n </div>\n )}\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"QueryEditorPanel.js","sourceRoot":"","sources":["../../src/components/QueryEditorPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAChC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAC,wBAAwB,EAAC,MAAM,4BAA4B,CAAC;AAOpE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAChE,SAAS,GACV,EAAE,EAAE;IACH,MAAM,eAAe,GAAG,qBAAqB,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAC1C,CAAC;IACF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE3E,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE1D,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,sBAAsB;QACtB,4DAA4D;QAC5D,kBAAkB,EAClB,SAAS,CACV,aAED,eAAK,SAAS,EAAC,0DAA0D,aACvE,KAAC,wBAAwB,KAAG,EAC5B,cAAK,SAAS,EAAC,QAAQ,GAAG,EAC1B,KAAC,uBAAuB,KAAG,IACvB,EACL,cAAc,CAAC,CAAC,CAAC,CAChB,cAAK,SAAS,EAAC,kCAAkC,YAC/C,cAAK,SAAS,EAAC,sBAAsB,YACnC,cAAK,SAAS,EAAC,kBAAkB,YAC/B,KAAC,sBAAsB,IAAC,OAAO,EAAE,eAAe,GAAI,GAChD,GACF,GACF,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,uEAAuE,gCAEhF,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React from 'react';\nimport {cn} from '@sqlrooms/ui';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\nimport {QueryEditorPanelActions} from './QueryEditorPanelActions';\nimport {QueryEditorPanelEditor} from './QueryEditorPanelEditor';\nimport {QueryEditorPanelTabsList} from './QueryEditorPanelTabsList';\n\nexport interface QueryEditorPanelProps {\n /** Custom class name for styling */\n className?: string;\n}\n\n/**\n * Ready-made tabbed SQL workbench editor panel.\n *\n * Prefer `SqlQuery.Root` with `SqlQuery.Editor`, `SqlQuery.Actions`, and\n * `SqlQuery.Results` when composing a single-query surface or embedded block.\n */\nexport const QueryEditorPanel: React.FC<QueryEditorPanelProps> = ({\n className,\n}) => {\n const selectedQueryId = useStoreWithSqlEditor(\n (s) => s.sqlEditor.config.selectedQueryId,\n );\n const openTabs = useStoreWithSqlEditor((s) => s.sqlEditor.config.openTabs);\n\n const isSelectedOpen = openTabs.includes(selectedQueryId);\n\n return (\n <div\n className={cn(\n 'flex h-full flex-col',\n // this is for Monaco's completion menu to not being cut off\n 'overflow-visible',\n className,\n )}\n >\n <div className=\"border-border flex items-center gap-4 border-b px-2 pt-1\">\n <QueryEditorPanelTabsList />\n <div className=\"flex-1\" />\n <QueryEditorPanelActions />\n </div>\n {isSelectedOpen ? (\n <div className=\"bg-background h-full w-full py-1\">\n <div className=\"relative h-full grow\">\n <div className=\"absolute inset-0\">\n <QueryEditorPanelEditor queryId={selectedQueryId} />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"text-muted-foreground flex h-full items-center justify-center text-sm\">\n No open queries\n </div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* @deprecated Prefer `SqlQuery.Actions` for newly composed single-query
|
|
4
|
+
* surfaces. This component remains for compatibility with the legacy tabbed
|
|
5
|
+
* query panel.
|
|
6
|
+
*/
|
|
2
7
|
export declare const QueryEditorPanelActions: React.FC<{
|
|
3
8
|
className?: string;
|
|
9
|
+
queryId?: string;
|
|
4
10
|
}>;
|
|
5
11
|
//# sourceMappingURL=QueryEditorPanelActions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryEditorPanelActions.d.ts","sourceRoot":"","sources":["../../src/components/QueryEditorPanelActions.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"QueryEditorPanelActions.d.ts","sourceRoot":"","sources":["../../src/components/QueryEditorPanelActions.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CA0DA,CAAC"}
|