@sqlrooms/sql-editor 0.24.4 → 0.24.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"functionSuggestions.d.ts","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,eAAe,EAEhB,MAAM,kBAAkB,CAAC;AA8C1B,eAAO,MAAM,sBAAsB;UAvCR,MAAM;mBAAiB,MAAM;GAuCqB,CAAC"}
1
+ {"version":3,"file":"functionSuggestions.d.ts","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,eAAe,EAEhB,MAAM,kBAAkB,CAAC;AAwD1B,eAAO,MAAM,sBAAsB;UAjDR,MAAM;mBAAiB,MAAM;GAiDqB,CAAC"}
@@ -2,26 +2,28 @@
2
2
  import { createTypedRowAccessor, escapeVal, } from '@sqlrooms/duckdb';
3
3
  import { memoizeOnce } from '@sqlrooms/utils';
4
4
  const getFunctionSuggestionsImpl = async (connector, wordBeforeCursor, limit = 100) => {
5
- const result = await connector.query(`SELECT
6
- function_name as name,
7
- function_type as type,
8
- return_type as returnType,
9
- examples,
10
- parameters,
11
- parameter_types as parameterTypes,
12
- description
13
- FROM duckdb_functions()
14
- WHERE name ILIKE ${escapeVal(wordBeforeCursor.replace(/([%_\\])/g, '\\$1') + '%')} ESCAPE '\\'
15
- AND REGEXP_MATCHES(name,'^[A-Z]', 'i')
16
- ORDER BY name
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
17
9
  LIMIT ${limit}
18
10
  `);
19
- return Array.from(groupFunctionsByName(Array.from(createTypedRowAccessor({ arrowTable: result })).map((row) => {
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, }) => {
20
13
  return {
21
- ...row,
22
- parameterTypes: Array.from(row.parameterTypes),
23
- parameters: Array.from(row.parameters),
24
- examples: Array.from(row.examples),
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,
25
27
  };
26
28
  })).entries()).map(([name, rows]) => {
27
29
  return { name, documentation: formatDocumentation(rows) };
@@ -1 +1 @@
1
- {"version":3,"file":"functionSuggestions.js","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2022 Foursquare Labs, Inc. All Rights Reserved.\n\nimport {\n createTypedRowAccessor,\n DuckDbConnector,\n escapeVal,\n} from '@sqlrooms/duckdb';\nimport { memoizeOnce } from '@sqlrooms/utils';\n\nconst getFunctionSuggestionsImpl = async (\n connector: DuckDbConnector,\n wordBeforeCursor: string,\n limit = 100,\n): Promise<Iterable<{name: string; documentation: string}>> => {\n const result = await connector.query(\n `SELECT \n function_name as name,\n function_type as type,\n return_type as returnType,\n examples,\n parameters,\n parameter_types as parameterTypes,\n description\n FROM duckdb_functions()\n WHERE name ILIKE ${escapeVal(\n wordBeforeCursor.replace(/([%_\\\\])/g, '\\\\$1') + '%',\n )} ESCAPE '\\\\'\n AND REGEXP_MATCHES(name,'^[A-Z]', 'i')\n ORDER BY name\n LIMIT ${limit}\n `,\n );\n\n return Array.from(\n groupFunctionsByName(\n Array.from(createTypedRowAccessor({arrowTable: result})).map(\n (row: FunctionRow) => {\n return {\n ...row,\n parameterTypes: Array.from(row.parameterTypes),\n parameters: Array.from(row.parameters),\n examples: Array.from(row.examples),\n };\n },\n ),\n ).entries(),\n ).map(([name, rows]) => {\n return {name, documentation: formatDocumentation(rows)};\n });\n};\n\n// Memoized version of the function\nexport const getFunctionSuggestions = memoizeOnce(getFunctionSuggestionsImpl);\n\ntype FunctionRow = {\n name: string;\n type: string;\n returnType: string;\n parameters: string[];\n parameterTypes: string[];\n description: string;\n examples: string[];\n};\n\nfunction groupFunctionsByName(\n functions: FunctionRow[],\n): Map<string, FunctionRow[]> {\n return functions.reduce((acc, fn) => {\n if (!acc.has(fn.name)) {\n acc.set(fn.name, []);\n }\n\n acc.get(fn.name)?.push(fn);\n\n return acc;\n }, new Map<string, FunctionRow[]>());\n}\n\nfunction formatDocumentation(functions: FunctionRow[]): string {\n // if no overload, return empty string\n if (!functions.length) {\n return '';\n }\n\n return [\n formatSignatures(functions),\n formatDescription(functions),\n formatExamples(functions),\n ]\n .filter(Boolean)\n .join('<br>');\n}\n\nfunction formatDescription(functions: FunctionRow[]): string {\n // description is the same for all overloads, so we can take it from the first one\n const description = functions[0]?.description;\n return description ? `<i>${description}</i>` : '';\n}\n\nfunction formatExamples(functions: FunctionRow[], examplesToShow = 3): string {\n const examples = Array.from(\n new Set(functions.flatMap((fn) => fn.examples).filter(Boolean)),\n )\n .slice(0, examplesToShow)\n .join('\\n');\n\n if (!examples) {\n return '';\n }\n\n return `<br><b>Examples:</b><br><pre>${examples}</pre>`;\n}\n\nfunction formatSignatures(\n functions: FunctionRow[],\n overloadsToShow = 3,\n): string {\n const overloadToShow = functions.slice(0, overloadsToShow);\n\n const formattedOverloads = overloadToShow.map(formatSignature);\n\n // print more overloads count message\n const moreOverloadsCount = functions.length - overloadToShow.length;\n const formattedMoreOverloads = moreOverloadsCount\n ? `(+${moreOverloadsCount} more overload)`\n : '';\n\n // build lines array\n const lines = [\n ...formattedOverloads,\n ...(formattedMoreOverloads ? [formattedMoreOverloads] : []),\n ];\n\n return `<pre>${lines.filter(Boolean).join('\\n')}</pre>`;\n}\n\nfunction formatSignature({\n name,\n parameterTypes,\n parameters,\n returnType,\n}: FunctionRow): string {\n // format parameters\n const params = parameters\n .map((parameterName, index) => ({\n parameterName,\n parameterType: parameterTypes[index],\n }))\n .map(({parameterName, parameterType}) => {\n if (parameterType) {\n return `${parameterName}: ${parameterType}`;\n }\n return parameterName;\n })\n .join(', ');\n\n // format signature body\n const signatureBody = `${name}(${params})`;\n\n // if returnType is defined, add it to the signature\n if (returnType) {\n return `${signatureBody}: ${returnType}`;\n }\n\n return signatureBody;\n}\n"]}
1
+ {"version":3,"file":"functionSuggestions.js","sourceRoot":"","sources":["../../src/constants/functionSuggestions.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2022 Foursquare Labs, Inc. All Rights Reserved.\n\nimport {\n createTypedRowAccessor,\n DuckDbConnector,\n escapeVal,\n} from '@sqlrooms/duckdb';\nimport {memoizeOnce} from '@sqlrooms/utils';\n\nconst getFunctionSuggestionsImpl = async (\n connector: DuckDbConnector,\n wordBeforeCursor: string,\n limit = 100,\n): Promise<Iterable<{name: string; documentation: string}>> => {\n const result = await connector.query(\n `SELECT * FROM duckdb_functions()\n WHERE function_name ILIKE ${escapeVal(\n wordBeforeCursor.replace(/([%_\\\\])/g, '\\\\$1') + '%',\n )} ESCAPE '\\\\'\n AND REGEXP_MATCHES(function_name, '^[A-Z]', 'i')\n ORDER BY function_name\n LIMIT ${limit}\n `,\n );\n\n return Array.from(\n groupFunctionsByName(\n Array.from(createTypedRowAccessor({arrowTable: result})).map(\n ({\n function_name,\n function_type,\n return_type,\n example, // older DuckDB versions\n examples,\n parameters,\n parameter_types,\n description,\n }: Record<string, any>) => {\n return {\n name: function_name,\n type: function_type,\n returnType: return_type,\n examples:\n // older DuckDB versions have `example` string instead of `examples` array\n examples?.toArray instanceof Function\n ? examples.toArray()\n : typeof example === 'string'\n ? [example]\n : [],\n parameters: Array.from(parameters),\n parameterTypes: Array.from(parameter_types),\n description: description,\n };\n },\n ),\n ).entries(),\n ).map(([name, rows]) => {\n return {name, documentation: formatDocumentation(rows)};\n });\n};\n\n// Memoized version of the function\nexport const getFunctionSuggestions = memoizeOnce(getFunctionSuggestionsImpl);\n\ntype FunctionRow = {\n name: string;\n type: string;\n returnType: string;\n parameters: string[];\n parameterTypes: string[];\n description: string;\n examples: string[];\n};\n\nfunction groupFunctionsByName(\n functions: FunctionRow[],\n): Map<string, FunctionRow[]> {\n return functions.reduce((acc, fn) => {\n if (!acc.has(fn.name)) {\n acc.set(fn.name, []);\n }\n\n acc.get(fn.name)?.push(fn);\n\n return acc;\n }, new Map<string, FunctionRow[]>());\n}\n\nfunction formatDocumentation(functions: FunctionRow[]): string {\n // if no overload, return empty string\n if (!functions.length) {\n return '';\n }\n\n return [\n formatSignatures(functions),\n formatDescription(functions),\n formatExamples(functions),\n ]\n .filter(Boolean)\n .join('<br>');\n}\n\nfunction formatDescription(functions: FunctionRow[]): string {\n // description is the same for all overloads, so we can take it from the first one\n const description = functions[0]?.description;\n return description ? `<i>${description}</i>` : '';\n}\n\nfunction formatExamples(functions: FunctionRow[], examplesToShow = 3): string {\n const examples = Array.from(\n new Set(functions.flatMap((fn) => fn.examples).filter(Boolean)),\n )\n .slice(0, examplesToShow)\n .join('\\n');\n\n if (!examples) {\n return '';\n }\n\n return `<br><b>Examples:</b><br><pre>${examples}</pre>`;\n}\n\nfunction formatSignatures(\n functions: FunctionRow[],\n overloadsToShow = 3,\n): string {\n const overloadToShow = functions.slice(0, overloadsToShow);\n\n const formattedOverloads = overloadToShow.map(formatSignature);\n\n // print more overloads count message\n const moreOverloadsCount = functions.length - overloadToShow.length;\n const formattedMoreOverloads = moreOverloadsCount\n ? `(+${moreOverloadsCount} more overload)`\n : '';\n\n // build lines array\n const lines = [\n ...formattedOverloads,\n ...(formattedMoreOverloads ? [formattedMoreOverloads] : []),\n ];\n\n return `<pre>${lines.filter(Boolean).join('\\n')}</pre>`;\n}\n\nfunction formatSignature({\n name,\n parameterTypes,\n parameters,\n returnType,\n}: FunctionRow): string {\n // format parameters\n const params = parameters\n .map((parameterName, index) => ({\n parameterName,\n parameterType: parameterTypes[index],\n }))\n .map(({parameterName, parameterType}) => {\n if (parameterType) {\n return `${parameterName}: ${parameterType}`;\n }\n return parameterName;\n })\n .join(', ');\n\n // format signature body\n const signatureBody = `${name}(${params})`;\n\n // if returnType is defined, add it to the signature\n if (returnType) {\n return `${signatureBody}: ${returnType}`;\n }\n\n return signatureBody;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/sql-editor",
3
- "version": "0.24.4",
3
+ "version": "0.24.5",
4
4
  "private": false,
5
5
  "author": "Ilya Boyandin <ilya@boyandin.me>",
6
6
  "license": "MIT",
@@ -28,16 +28,16 @@
28
28
  "dependencies": {
29
29
  "@hookform/resolvers": "^3.10.0",
30
30
  "@monaco-editor/react": "^4.7.0",
31
- "@sqlrooms/data-table": "0.24.4",
32
- "@sqlrooms/duckdb": "0.24.4",
33
- "@sqlrooms/layout": "0.24.4",
34
- "@sqlrooms/monaco-editor": "0.24.4",
35
- "@sqlrooms/room-config": "0.24.4",
36
- "@sqlrooms/room-shell": "0.24.4",
37
- "@sqlrooms/schema-tree": "0.24.4",
38
- "@sqlrooms/sql-editor-config": "0.24.4",
39
- "@sqlrooms/ui": "0.24.4",
40
- "@sqlrooms/utils": "0.24.4",
31
+ "@sqlrooms/data-table": "0.24.5",
32
+ "@sqlrooms/duckdb": "0.24.5",
33
+ "@sqlrooms/layout": "0.24.5",
34
+ "@sqlrooms/monaco-editor": "0.24.5",
35
+ "@sqlrooms/room-config": "0.24.5",
36
+ "@sqlrooms/room-shell": "0.24.5",
37
+ "@sqlrooms/schema-tree": "0.24.5",
38
+ "@sqlrooms/sql-editor-config": "0.24.5",
39
+ "@sqlrooms/ui": "0.24.5",
40
+ "@sqlrooms/utils": "0.24.5",
41
41
  "d3-dsv": "^3.0.1",
42
42
  "file-saver": "^2.0.5",
43
43
  "immer": "^10.1.1",
@@ -58,5 +58,5 @@
58
58
  "@types/react": "^19.1.7",
59
59
  "@types/react-dom": "^19.1.6"
60
60
  },
61
- "gitHead": "fa0f592f6816218da76e1fbb74c5b6b4b173404f"
61
+ "gitHead": "393aee155a8954a9e5b7e792e6f98118182f2cc3"
62
62
  }