@sqlrooms/sql-editor 0.29.0-rc.1 → 0.29.0-rc.3
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 +13 -3
- package/dist/SqlCodeMirrorEditor.d.ts +29 -0
- package/dist/SqlCodeMirrorEditor.d.ts.map +1 -0
- package/dist/SqlCodeMirrorEditor.js +54 -0
- package/dist/SqlCodeMirrorEditor.js.map +1 -0
- package/dist/SqlEditor.js +1 -1
- package/dist/SqlEditor.js.map +1 -1
- package/dist/SqlMonacoEditor.d.ts +10 -4
- package/dist/SqlMonacoEditor.d.ts.map +1 -1
- package/dist/SqlMonacoEditor.js +51 -11
- package/dist/SqlMonacoEditor.js.map +1 -1
- package/dist/codemirror/extensions/completion.d.ts +12 -0
- package/dist/codemirror/extensions/completion.d.ts.map +1 -0
- package/dist/codemirror/extensions/completion.js +60 -0
- package/dist/codemirror/extensions/completion.js.map +1 -0
- package/dist/codemirror/extensions/create-sql-extension.d.ts +17 -0
- package/dist/codemirror/extensions/create-sql-extension.d.ts.map +1 -0
- package/dist/codemirror/extensions/create-sql-extension.js +20 -0
- package/dist/codemirror/extensions/create-sql-extension.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/duck-db.d.ts +9 -0
- package/dist/codemirror/extensions/duck-db/duck-db.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/duck-db.js +27 -0
- package/dist/codemirror/extensions/duck-db/duck-db.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-keywords.d.ts +2 -0
- package/dist/codemirror/extensions/duck-db/duckdb-keywords.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-keywords.js +487 -0
- package/dist/codemirror/extensions/duck-db/duckdb-keywords.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql-extension.d.ts +5 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql-extension.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql-extension.js +36 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql-extension.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql.d.ts +5 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql.js +11 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/index.d.ts +2 -0
- package/dist/codemirror/extensions/duck-db/index.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/index.js +2 -0
- package/dist/codemirror/extensions/duck-db/index.js.map +1 -0
- package/dist/codemirror/extensions/hover.d.ts +11 -0
- package/dist/codemirror/extensions/hover.d.ts.map +1 -0
- package/dist/codemirror/extensions/hover.js +55 -0
- package/dist/codemirror/extensions/hover.js.map +1 -0
- package/dist/codemirror/extensions/sql-keymap.d.ts +4 -0
- package/dist/codemirror/extensions/sql-keymap.d.ts.map +1 -0
- package/dist/codemirror/extensions/sql-keymap.js +25 -0
- package/dist/codemirror/extensions/sql-keymap.js.map +1 -0
- package/dist/codemirror/themes/sql-theme.d.ts +7 -0
- package/dist/codemirror/themes/sql-theme.d.ts.map +1 -0
- package/dist/codemirror/themes/sql-theme.js +55 -0
- package/dist/codemirror/themes/sql-theme.js.map +1 -0
- package/dist/codemirror/themes/sql-tooltip-theme.d.ts +7 -0
- package/dist/codemirror/themes/sql-tooltip-theme.d.ts.map +1 -0
- package/dist/codemirror/themes/sql-tooltip-theme.js +21 -0
- package/dist/codemirror/themes/sql-tooltip-theme.js.map +1 -0
- package/dist/codemirror/utils/schema-converter.d.ts +5 -0
- package/dist/codemirror/utils/schema-converter.d.ts.map +1 -0
- package/dist/codemirror/utils/schema-converter.js +9 -0
- package/dist/codemirror/utils/schema-converter.js.map +1 -0
- package/dist/components/CreateTableModal.d.ts.map +1 -1
- package/dist/components/CreateTableModal.js +5 -11
- package/dist/components/CreateTableModal.js.map +1 -1
- package/dist/components/FunctionDocumentation.d.ts +7 -0
- package/dist/components/FunctionDocumentation.d.ts.map +1 -0
- package/dist/components/FunctionDocumentation.js +44 -0
- package/dist/components/FunctionDocumentation.js.map +1 -0
- package/dist/components/QueryEditorPanelActions.d.ts.map +1 -1
- package/dist/components/QueryEditorPanelActions.js +3 -37
- package/dist/components/QueryEditorPanelActions.js.map +1 -1
- package/dist/components/QueryEditorPanelEditor.d.ts.map +1 -1
- package/dist/components/QueryEditorPanelEditor.js +11 -34
- package/dist/components/QueryEditorPanelEditor.js.map +1 -1
- package/dist/components/SchemaExplorer.d.ts +25 -0
- package/dist/components/SchemaExplorer.d.ts.map +1 -0
- package/dist/components/SchemaExplorer.js +20 -0
- package/dist/components/SchemaExplorer.js.map +1 -0
- package/dist/components/SqlColumnTooltip.d.ts +12 -0
- package/dist/components/SqlColumnTooltip.d.ts.map +1 -0
- package/dist/components/SqlColumnTooltip.js +15 -0
- package/dist/components/SqlColumnTooltip.js.map +1 -0
- package/dist/components/SqlColumnsTable.d.ts +10 -0
- package/dist/components/SqlColumnsTable.d.ts.map +1 -0
- package/dist/components/SqlColumnsTable.js +10 -0
- package/dist/components/SqlColumnsTable.js.map +1 -0
- package/dist/components/SqlTableTooltip.d.ts +9 -0
- package/dist/components/SqlTableTooltip.d.ts.map +1 -0
- package/dist/components/SqlTableTooltip.js +13 -0
- package/dist/components/SqlTableTooltip.js.map +1 -0
- package/dist/components/TableStructurePanel.d.ts +6 -3
- package/dist/components/TableStructurePanel.d.ts.map +1 -1
- package/dist/components/TableStructurePanel.js +8 -7
- package/dist/components/TableStructurePanel.js.map +1 -1
- package/dist/index.d.ts +21 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/qualified-name-parser.d.ts +41 -0
- package/dist/utils/qualified-name-parser.d.ts.map +1 -0
- package/dist/utils/qualified-name-parser.js +126 -0
- package/dist/utils/qualified-name-parser.js.map +1 -0
- package/package.json +23 -11
- package/dist/constants/functionSuggestions.d.ts +0 -6
- package/dist/constants/functionSuggestions.d.ts.map +0 -1
- package/dist/constants/functionSuggestions.js +0 -107
- package/dist/constants/functionSuggestions.js.map +0 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses a qualified column name into its components
|
|
3
|
+
* Supports:
|
|
4
|
+
* - columnName
|
|
5
|
+
* - tableName.columnName
|
|
6
|
+
* - schemaName.tableName.columnName
|
|
7
|
+
* - databaseName.schemaName.tableName.columnName
|
|
8
|
+
*/
|
|
9
|
+
export function parseQualifiedColumnName(word) {
|
|
10
|
+
const parts = word.split('.');
|
|
11
|
+
if (parts.length === 2) {
|
|
12
|
+
return {
|
|
13
|
+
tableName: parts[0],
|
|
14
|
+
columnName: parts[1],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
else if (parts.length === 3) {
|
|
18
|
+
return {
|
|
19
|
+
schemaName: parts[0],
|
|
20
|
+
tableName: parts[1],
|
|
21
|
+
columnName: parts[2],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
else if (parts.length === 4) {
|
|
25
|
+
return {
|
|
26
|
+
databaseName: parts[0],
|
|
27
|
+
schemaName: parts[1],
|
|
28
|
+
tableName: parts[2],
|
|
29
|
+
columnName: parts[3],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return { columnName: word };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parses a qualified table name into its components
|
|
38
|
+
* Supports:
|
|
39
|
+
* - tableName
|
|
40
|
+
* - schemaName.tableName
|
|
41
|
+
* - databaseName.schemaName.tableName
|
|
42
|
+
*/
|
|
43
|
+
export function parseQualifiedTableName(word) {
|
|
44
|
+
const parts = word.split('.');
|
|
45
|
+
if (parts.length === 2) {
|
|
46
|
+
return {
|
|
47
|
+
schemaName: parts[0],
|
|
48
|
+
tableName: parts[1],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
else if (parts.length === 3) {
|
|
52
|
+
return {
|
|
53
|
+
databaseName: parts[0],
|
|
54
|
+
schemaName: parts[1],
|
|
55
|
+
tableName: parts[2],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return { tableName: word };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Finds a table and column by qualified name (case-insensitive)
|
|
64
|
+
*/
|
|
65
|
+
export function findTableAndColumn(qualifiedName, tables) {
|
|
66
|
+
const { columnName, tableName, schemaName, databaseName } = qualifiedName;
|
|
67
|
+
for (const table of tables) {
|
|
68
|
+
// Check if table matches the qualification (case-insensitive)
|
|
69
|
+
if (databaseName &&
|
|
70
|
+
table.table.database?.localeCompare(databaseName, undefined, {
|
|
71
|
+
sensitivity: 'accent',
|
|
72
|
+
}) !== 0) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (schemaName &&
|
|
76
|
+
table.table.schema?.localeCompare(schemaName, undefined, {
|
|
77
|
+
sensitivity: 'accent',
|
|
78
|
+
}) !== 0) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (tableName &&
|
|
82
|
+
table.table.table?.localeCompare(tableName, undefined, {
|
|
83
|
+
sensitivity: 'accent',
|
|
84
|
+
}) !== 0) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// Find the column (case-insensitive)
|
|
88
|
+
const column = table.columns.find((col) => col.name?.localeCompare(columnName, undefined, {
|
|
89
|
+
sensitivity: 'accent',
|
|
90
|
+
}) === 0);
|
|
91
|
+
if (column) {
|
|
92
|
+
return { table, column };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Finds a table by qualified name (case-insensitive)
|
|
99
|
+
*/
|
|
100
|
+
export function findTable(qualifiedName, tables) {
|
|
101
|
+
const { tableName, schemaName, databaseName } = qualifiedName;
|
|
102
|
+
return tables.find((table) => {
|
|
103
|
+
// Match table name (case-insensitive)
|
|
104
|
+
if (table.table.table?.localeCompare(tableName, undefined, {
|
|
105
|
+
sensitivity: 'accent',
|
|
106
|
+
}) !== 0) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
// Match schema if specified
|
|
110
|
+
if (schemaName &&
|
|
111
|
+
table.table.schema?.localeCompare(schemaName, undefined, {
|
|
112
|
+
sensitivity: 'accent',
|
|
113
|
+
}) !== 0) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
// Match database if specified
|
|
117
|
+
if (databaseName &&
|
|
118
|
+
table.table.database?.localeCompare(databaseName, undefined, {
|
|
119
|
+
sensitivity: 'accent',
|
|
120
|
+
}) !== 0) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
return true;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=qualified-name-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qualified-name-parser.js","sourceRoot":"","sources":["../../src/utils/qualified-name-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DataTable, TableColumn} from '@sqlrooms/duckdb';\n\nexport interface ParsedQualifiedColumnName {\n columnName: string;\n tableName?: string;\n schemaName?: string;\n databaseName?: string;\n}\n\n/**\n * Parses a qualified column name into its components\n * Supports:\n * - columnName\n * - tableName.columnName\n * - schemaName.tableName.columnName\n * - databaseName.schemaName.tableName.columnName\n */\nexport function parseQualifiedColumnName(\n word: string,\n): ParsedQualifiedColumnName {\n const parts = word.split('.');\n\n if (parts.length === 2) {\n return {\n tableName: parts[0],\n columnName: parts[1]!,\n };\n } else if (parts.length === 3) {\n return {\n schemaName: parts[0],\n tableName: parts[1],\n columnName: parts[2]!,\n };\n } else if (parts.length === 4) {\n return {\n databaseName: parts[0],\n schemaName: parts[1],\n tableName: parts[2],\n columnName: parts[3]!,\n };\n } else {\n return {columnName: word};\n }\n}\n\nexport interface ParsedQualifiedTableName {\n tableName: string;\n schemaName?: string;\n databaseName?: string;\n}\n\n/**\n * Parses a qualified table name into its components\n * Supports:\n * - tableName\n * - schemaName.tableName\n * - databaseName.schemaName.tableName\n */\nexport function parseQualifiedTableName(\n word: string,\n): ParsedQualifiedTableName {\n const parts = word.split('.');\n\n if (parts.length === 2) {\n return {\n schemaName: parts[0],\n tableName: parts[1]!,\n };\n } else if (parts.length === 3) {\n return {\n databaseName: parts[0],\n schemaName: parts[1],\n tableName: parts[2]!,\n };\n } else {\n return {tableName: word};\n }\n}\n\n/**\n * Finds a table and column by qualified name (case-insensitive)\n */\nexport function findTableAndColumn(\n qualifiedName: ParsedQualifiedColumnName,\n tables: DataTable[],\n): {table: DataTable; column: TableColumn} | undefined {\n const {columnName, tableName, schemaName, databaseName} = qualifiedName;\n\n for (const table of tables) {\n // Check if table matches the qualification (case-insensitive)\n if (\n databaseName &&\n table.table.database?.localeCompare(databaseName, undefined, {\n sensitivity: 'accent',\n }) !== 0\n ) {\n continue;\n }\n if (\n schemaName &&\n table.table.schema?.localeCompare(schemaName, undefined, {\n sensitivity: 'accent',\n }) !== 0\n ) {\n continue;\n }\n if (\n tableName &&\n table.table.table?.localeCompare(tableName, undefined, {\n sensitivity: 'accent',\n }) !== 0\n ) {\n continue;\n }\n\n // Find the column (case-insensitive)\n const column = table.columns.find(\n (col) =>\n col.name?.localeCompare(columnName, undefined, {\n sensitivity: 'accent',\n }) === 0,\n );\n if (column) {\n return {table, column};\n }\n }\n\n return undefined;\n}\n\n/**\n * Finds a table by qualified name (case-insensitive)\n */\nexport function findTable(\n qualifiedName: ParsedQualifiedTableName,\n tables: DataTable[],\n): DataTable | undefined {\n const {tableName, schemaName, databaseName} = qualifiedName;\n\n return tables.find((table) => {\n // Match table name (case-insensitive)\n if (\n table.table.table?.localeCompare(tableName, undefined, {\n sensitivity: 'accent',\n }) !== 0\n ) {\n return false;\n }\n\n // Match schema if specified\n if (\n schemaName &&\n table.table.schema?.localeCompare(schemaName, undefined, {\n sensitivity: 'accent',\n }) !== 0\n ) {\n return false;\n }\n\n // Match database if specified\n if (\n databaseName &&\n table.table.database?.localeCompare(databaseName, undefined, {\n sensitivity: 'accent',\n }) !== 0\n ) {\n return false;\n }\n\n return true;\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/sql-editor",
|
|
3
|
-
"version": "0.29.0-rc.
|
|
3
|
+
"version": "0.29.0-rc.3",
|
|
4
4
|
"author": "SQLRooms Contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/sqlrooms/sqlrooms.git"
|
|
8
|
+
"url": "git+https://github.com/sqlrooms/sqlrooms.git"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist"
|
|
@@ -26,24 +26,36 @@
|
|
|
26
26
|
"typedoc": "typedoc"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
+
"@codemirror/autocomplete": "^6.20.0",
|
|
30
|
+
"@codemirror/lang-sql": "^6.8.0",
|
|
31
|
+
"@codemirror/language": "^6.10.0",
|
|
32
|
+
"@codemirror/state": "^6.4.0",
|
|
33
|
+
"@codemirror/view": "^6.33.0",
|
|
29
34
|
"@hookform/resolvers": "^5.0.0",
|
|
35
|
+
"@lezer/highlight": "^1.2.0",
|
|
36
|
+
"@marimo-team/codemirror-sql": "^0.2.0",
|
|
30
37
|
"@monaco-editor/react": "^4.7.0",
|
|
31
38
|
"@paralleldrive/cuid2": "^3.0.0",
|
|
32
|
-
"@sqlrooms/
|
|
33
|
-
"@sqlrooms/
|
|
34
|
-
"@sqlrooms/
|
|
35
|
-
"@sqlrooms/
|
|
36
|
-
"@sqlrooms/
|
|
37
|
-
"@sqlrooms/
|
|
38
|
-
"@sqlrooms/
|
|
39
|
-
"@sqlrooms/
|
|
39
|
+
"@sqlrooms/codemirror": "0.29.0-rc.3",
|
|
40
|
+
"@sqlrooms/data-table": "0.29.0-rc.3",
|
|
41
|
+
"@sqlrooms/db": "0.29.0-rc.3",
|
|
42
|
+
"@sqlrooms/duckdb": "0.29.0-rc.3",
|
|
43
|
+
"@sqlrooms/monaco-editor": "0.29.0-rc.3",
|
|
44
|
+
"@sqlrooms/room-shell": "0.29.0-rc.3",
|
|
45
|
+
"@sqlrooms/schema-tree": "0.29.0-rc.3",
|
|
46
|
+
"@sqlrooms/sql-editor-config": "0.29.0-rc.3",
|
|
47
|
+
"@sqlrooms/ui": "0.29.0-rc.3",
|
|
48
|
+
"@sqlrooms/utils": "0.29.0-rc.3",
|
|
40
49
|
"@tanstack/react-table": "^8.21.3",
|
|
41
50
|
"d3-dsv": "^3.0.1",
|
|
51
|
+
"es-toolkit": "^1.39.9",
|
|
42
52
|
"file-saver": "^2.0.5",
|
|
43
53
|
"immer": "^11.0.1",
|
|
44
54
|
"lucide-react": "^0.556.0",
|
|
45
55
|
"monaco-editor": "^0.55.1",
|
|
46
56
|
"react-hook-form": "^7.63.0",
|
|
57
|
+
"react-markdown": "^10.1.0",
|
|
58
|
+
"remark-gfm": "^4.0.1",
|
|
47
59
|
"zod": "^4.1.8"
|
|
48
60
|
},
|
|
49
61
|
"peerDependencies": {
|
|
@@ -58,5 +70,5 @@
|
|
|
58
70
|
"@types/react": "^19.1.13",
|
|
59
71
|
"@types/react-dom": "^19.1.9"
|
|
60
72
|
},
|
|
61
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "4ffaf6c31d41c27f96bd3e4f5e83d431968721c3"
|
|
62
74
|
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { DuckDbConnector } from '@sqlrooms/db';
|
|
2
|
-
export declare const getFunctionSuggestions: (connector: DuckDbConnector, wordBeforeCursor: string, limit?: number | undefined) => Promise<Iterable<{
|
|
3
|
-
name: string;
|
|
4
|
-
documentation: string;
|
|
5
|
-
}>>;
|
|
6
|
-
//# sourceMappingURL=functionSuggestions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"functionSuggestions.d.ts","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,eAAe,EAAY,MAAM,cAAc,CAAC;AAwDhF,eAAO,MAAM,sBAAsB;UAjDR,MAAM;mBAAiB,MAAM;GAiDqB,CAAC"}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
// Copyright 2022 Foursquare Labs, Inc. All Rights Reserved.
|
|
2
|
-
import { createTypedRowAccessor, escapeVal } from '@sqlrooms/db';
|
|
3
|
-
import { memoizeOnce } from '@sqlrooms/utils';
|
|
4
|
-
const getFunctionSuggestionsImpl = async (connector, wordBeforeCursor, limit = 100) => {
|
|
5
|
-
const result = await connector.query(`SELECT * FROM duckdb_functions()
|
|
6
|
-
WHERE function_name ILIKE ${escapeVal(wordBeforeCursor.replace(/([%_\\])/g, '\\$1') + '%')} ESCAPE '\\'
|
|
7
|
-
AND REGEXP_MATCHES(function_name, '^[A-Z]', 'i')
|
|
8
|
-
ORDER BY function_name
|
|
9
|
-
LIMIT ${limit}
|
|
10
|
-
`);
|
|
11
|
-
return Array.from(groupFunctionsByName(Array.from(createTypedRowAccessor({ arrowTable: result })).map(({ function_name, function_type, return_type, example, // older DuckDB versions
|
|
12
|
-
examples, parameters, parameter_types, description, }) => {
|
|
13
|
-
return {
|
|
14
|
-
name: function_name,
|
|
15
|
-
type: function_type,
|
|
16
|
-
returnType: return_type,
|
|
17
|
-
examples:
|
|
18
|
-
// older DuckDB versions have `example` string instead of `examples` array
|
|
19
|
-
examples?.toArray instanceof Function
|
|
20
|
-
? examples.toArray()
|
|
21
|
-
: typeof example === 'string'
|
|
22
|
-
? [example]
|
|
23
|
-
: [],
|
|
24
|
-
parameters: Array.from(parameters),
|
|
25
|
-
parameterTypes: Array.from(parameter_types),
|
|
26
|
-
description: description,
|
|
27
|
-
};
|
|
28
|
-
})).entries()).map(([name, rows]) => {
|
|
29
|
-
return { name, documentation: formatDocumentation(rows) };
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
// Memoized version of the function
|
|
33
|
-
export const getFunctionSuggestions = memoizeOnce(getFunctionSuggestionsImpl);
|
|
34
|
-
function groupFunctionsByName(functions) {
|
|
35
|
-
return functions.reduce((acc, fn) => {
|
|
36
|
-
if (!acc.has(fn.name)) {
|
|
37
|
-
acc.set(fn.name, []);
|
|
38
|
-
}
|
|
39
|
-
acc.get(fn.name)?.push(fn);
|
|
40
|
-
return acc;
|
|
41
|
-
}, new Map());
|
|
42
|
-
}
|
|
43
|
-
function formatDocumentation(functions) {
|
|
44
|
-
// if no overload, return empty string
|
|
45
|
-
if (!functions.length) {
|
|
46
|
-
return '';
|
|
47
|
-
}
|
|
48
|
-
return [
|
|
49
|
-
formatSignatures(functions),
|
|
50
|
-
formatDescription(functions),
|
|
51
|
-
formatExamples(functions),
|
|
52
|
-
]
|
|
53
|
-
.filter(Boolean)
|
|
54
|
-
.join('<br>');
|
|
55
|
-
}
|
|
56
|
-
function formatDescription(functions) {
|
|
57
|
-
// description is the same for all overloads, so we can take it from the first one
|
|
58
|
-
const description = functions[0]?.description;
|
|
59
|
-
return description ? `<i>${description}</i>` : '';
|
|
60
|
-
}
|
|
61
|
-
function formatExamples(functions, examplesToShow = 3) {
|
|
62
|
-
const examples = Array.from(new Set(functions.flatMap((fn) => fn.examples).filter(Boolean)))
|
|
63
|
-
.slice(0, examplesToShow)
|
|
64
|
-
.join('\n');
|
|
65
|
-
if (!examples) {
|
|
66
|
-
return '';
|
|
67
|
-
}
|
|
68
|
-
return `<br><b>Examples:</b><br><pre>${examples}</pre>`;
|
|
69
|
-
}
|
|
70
|
-
function formatSignatures(functions, overloadsToShow = 3) {
|
|
71
|
-
const overloadToShow = functions.slice(0, overloadsToShow);
|
|
72
|
-
const formattedOverloads = overloadToShow.map(formatSignature);
|
|
73
|
-
// print more overloads count message
|
|
74
|
-
const moreOverloadsCount = functions.length - overloadToShow.length;
|
|
75
|
-
const formattedMoreOverloads = moreOverloadsCount
|
|
76
|
-
? `(+${moreOverloadsCount} more overload)`
|
|
77
|
-
: '';
|
|
78
|
-
// build lines array
|
|
79
|
-
const lines = [
|
|
80
|
-
...formattedOverloads,
|
|
81
|
-
...(formattedMoreOverloads ? [formattedMoreOverloads] : []),
|
|
82
|
-
];
|
|
83
|
-
return `<pre>${lines.filter(Boolean).join('\n')}</pre>`;
|
|
84
|
-
}
|
|
85
|
-
function formatSignature({ name, parameterTypes, parameters, returnType, }) {
|
|
86
|
-
// format parameters
|
|
87
|
-
const params = parameters
|
|
88
|
-
.map((parameterName, index) => ({
|
|
89
|
-
parameterName,
|
|
90
|
-
parameterType: parameterTypes[index],
|
|
91
|
-
}))
|
|
92
|
-
.map(({ parameterName, parameterType }) => {
|
|
93
|
-
if (parameterType) {
|
|
94
|
-
return `${parameterName}: ${parameterType}`;
|
|
95
|
-
}
|
|
96
|
-
return parameterName;
|
|
97
|
-
})
|
|
98
|
-
.join(', ');
|
|
99
|
-
// format signature body
|
|
100
|
-
const signatureBody = `${name}(${params})`;
|
|
101
|
-
// if returnType is defined, add it to the signature
|
|
102
|
-
if (returnType) {
|
|
103
|
-
return `${signatureBody}: ${returnType}`;
|
|
104
|
-
}
|
|
105
|
-
return signatureBody;
|
|
106
|
-
}
|
|
107
|
-
//# sourceMappingURL=functionSuggestions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"functionSuggestions.js","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2022 Foursquare Labs, Inc. All Rights Reserved.\n\nimport {createTypedRowAccessor, DuckDbConnector, escapeVal} from '@sqlrooms/db';\nimport {memoizeOnce} from '@sqlrooms/utils';\n\nconst getFunctionSuggestionsImpl = async (\n connector: DuckDbConnector,\n wordBeforeCursor: string,\n limit = 100,\n): Promise<Iterable<{name: string; documentation: string}>> => {\n const result = await connector.query(\n `SELECT * FROM duckdb_functions()\n WHERE function_name ILIKE ${escapeVal(\n wordBeforeCursor.replace(/([%_\\\\])/g, '\\\\$1') + '%',\n )} ESCAPE '\\\\'\n AND REGEXP_MATCHES(function_name, '^[A-Z]', 'i')\n ORDER BY function_name\n LIMIT ${limit}\n `,\n );\n\n return Array.from(\n groupFunctionsByName(\n Array.from(createTypedRowAccessor({arrowTable: result})).map(\n ({\n function_name,\n function_type,\n return_type,\n example, // older DuckDB versions\n examples,\n parameters,\n parameter_types,\n description,\n }: Record<string, any>) => {\n return {\n name: function_name,\n type: function_type,\n returnType: return_type,\n examples:\n // older DuckDB versions have `example` string instead of `examples` array\n examples?.toArray instanceof Function\n ? examples.toArray()\n : typeof example === 'string'\n ? [example]\n : [],\n parameters: Array.from(parameters),\n parameterTypes: Array.from(parameter_types),\n description: description,\n };\n },\n ),\n ).entries(),\n ).map(([name, rows]) => {\n return {name, documentation: formatDocumentation(rows)};\n });\n};\n\n// Memoized version of the function\nexport const getFunctionSuggestions = memoizeOnce(getFunctionSuggestionsImpl);\n\ntype FunctionRow = {\n name: string;\n type: string;\n returnType: string;\n parameters: string[];\n parameterTypes: string[];\n description: string;\n examples: string[];\n};\n\nfunction groupFunctionsByName(\n functions: FunctionRow[],\n): Map<string, FunctionRow[]> {\n return functions.reduce((acc, fn) => {\n if (!acc.has(fn.name)) {\n acc.set(fn.name, []);\n }\n\n acc.get(fn.name)?.push(fn);\n\n return acc;\n }, new Map<string, FunctionRow[]>());\n}\n\nfunction formatDocumentation(functions: FunctionRow[]): string {\n // if no overload, return empty string\n if (!functions.length) {\n return '';\n }\n\n return [\n formatSignatures(functions),\n formatDescription(functions),\n formatExamples(functions),\n ]\n .filter(Boolean)\n .join('<br>');\n}\n\nfunction formatDescription(functions: FunctionRow[]): string {\n // description is the same for all overloads, so we can take it from the first one\n const description = functions[0]?.description;\n return description ? `<i>${description}</i>` : '';\n}\n\nfunction formatExamples(functions: FunctionRow[], examplesToShow = 3): string {\n const examples = Array.from(\n new Set(functions.flatMap((fn) => fn.examples).filter(Boolean)),\n )\n .slice(0, examplesToShow)\n .join('\\n');\n\n if (!examples) {\n return '';\n }\n\n return `<br><b>Examples:</b><br><pre>${examples}</pre>`;\n}\n\nfunction formatSignatures(\n functions: FunctionRow[],\n overloadsToShow = 3,\n): string {\n const overloadToShow = functions.slice(0, overloadsToShow);\n\n const formattedOverloads = overloadToShow.map(formatSignature);\n\n // print more overloads count message\n const moreOverloadsCount = functions.length - overloadToShow.length;\n const formattedMoreOverloads = moreOverloadsCount\n ? `(+${moreOverloadsCount} more overload)`\n : '';\n\n // build lines array\n const lines = [\n ...formattedOverloads,\n ...(formattedMoreOverloads ? [formattedMoreOverloads] : []),\n ];\n\n return `<pre>${lines.filter(Boolean).join('\\n')}</pre>`;\n}\n\nfunction formatSignature({\n name,\n parameterTypes,\n parameters,\n returnType,\n}: FunctionRow): string {\n // format parameters\n const params = parameters\n .map((parameterName, index) => ({\n parameterName,\n parameterType: parameterTypes[index],\n }))\n .map(({parameterName, parameterType}) => {\n if (parameterType) {\n return `${parameterName}: ${parameterType}`;\n }\n return parameterName;\n })\n .join(', ');\n\n // format signature body\n const signatureBody = `${name}(${params})`;\n\n // if returnType is defined, add it to the signature\n if (returnType) {\n return `${signatureBody}: ${returnType}`;\n }\n\n return signatureBody;\n}\n"]}
|