@sqlrooms/sql-editor 0.29.0-rc.2 → 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/dist/SqlEditor.js CHANGED
@@ -27,7 +27,7 @@ const SqlEditor = React.memo((props) => {
27
27
  const handleCreateTable = useCallback(() => {
28
28
  setCreateTableModalOpen(true);
29
29
  }, []);
30
- return (_jsxs("div", { className: "relative flex h-full w-full flex-col overflow-hidden", children: [_jsx(SqlEditorHeader, { title: "SQL Editor", showDocs: showDocs, documentationPanel: documentationPanel, onToggleDocs: handleToggleDocs }), _jsx("div", { className: "bg-muted h-full grow", children: _jsxs(ResizablePanelGroup, { direction: "horizontal", className: "h-full", children: [_jsx(ResizablePanel, { defaultSize: showDocs ? 70 : 100, children: _jsxs(ResizablePanelGroup, { direction: "vertical", className: "h-full", children: [_jsx(ResizablePanel, { defaultSize: 50, className: "flex flex-row", children: _jsxs(ResizablePanelGroup, { direction: "horizontal", children: [_jsx(ResizablePanel, { defaultSize: 20, children: _jsx(TableStructurePanel, { schema: schema }) }), _jsx(ResizableHandle, { withHandle: true }), _jsx(ResizablePanel, { defaultSize: 80, children: _jsx(QueryEditorPanel, {}) })] }) }), _jsx(ResizableHandle, { withHandle: true }), _jsx(ResizablePanel, { defaultSize: 50, children: _jsx(QueryResultPanel, { onRowClick: queryResultProps?.onRowClick, onRowDoubleClick: queryResultProps?.onRowDoubleClick, renderActions: () => (_jsx("div", { className: "flex gap-2", children: _jsxs(Button, { size: "xs", onClick: handleCreateTable, children: [_jsx(PlusIcon, { className: "h-4 w-4" }), "New table"] }) })) }) })] }) }), showDocs && (_jsxs(_Fragment, { children: [_jsx(ResizableHandle, { withHandle: true }), _jsx(ResizablePanel, { defaultSize: 30, children: documentationPanel })] }))] }) }), _jsx(CreateTableModal, { query: lastQuery, isOpen: createTableModalOpen, onClose: () => setCreateTableModalOpen(false), allowMultipleStatements: true, showSchemaSelection: true })] }));
30
+ return (_jsxs("div", { className: "relative flex h-full w-full flex-col overflow-hidden", children: [_jsx(SqlEditorHeader, { title: "SQL Editor", showDocs: showDocs, documentationPanel: documentationPanel, onToggleDocs: handleToggleDocs }), _jsx("div", { className: "bg-muted h-full grow", children: _jsxs(ResizablePanelGroup, { orientation: "horizontal", className: "h-full", children: [_jsx(ResizablePanel, { defaultSize: showDocs ? '70' : '100', children: _jsxs(ResizablePanelGroup, { orientation: "vertical", className: "h-full", children: [_jsx(ResizablePanel, { defaultSize: "50", className: "flex flex-row", children: _jsxs(ResizablePanelGroup, { orientation: "horizontal", children: [_jsx(ResizablePanel, { defaultSize: "20", children: _jsx(TableStructurePanel, { schema: schema }) }), _jsx(ResizableHandle, { withHandle: true }), _jsx(ResizablePanel, { defaultSize: "80", children: _jsx(QueryEditorPanel, {}) })] }) }), _jsx(ResizableHandle, { withHandle: true }), _jsx(ResizablePanel, { defaultSize: "50", children: _jsx(QueryResultPanel, { onRowClick: queryResultProps?.onRowClick, onRowDoubleClick: queryResultProps?.onRowDoubleClick, renderActions: () => (_jsx("div", { className: "flex gap-2", children: _jsxs(Button, { size: "xs", onClick: handleCreateTable, children: [_jsx(PlusIcon, { className: "h-4 w-4" }), "New table"] }) })) }) })] }) }), showDocs && (_jsxs(_Fragment, { children: [_jsx(ResizableHandle, { withHandle: true }), _jsx(ResizablePanel, { defaultSize: "30", children: documentationPanel })] }))] }) }), _jsx(CreateTableModal, { query: lastQuery, isOpen: createTableModalOpen, onClose: () => setCreateTableModalOpen(false), allowMultipleStatements: true, showSchemaSelection: true })] }));
31
31
  });
32
32
  SqlEditor.displayName = 'SqlEditor';
33
33
  export default SqlEditor;
@@ -1 +1 @@
1
- {"version":3,"file":"SqlEditor.js","sourceRoot":"","sources":["../src/SqlEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Button,\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from '@sqlrooms/ui';\nimport {PlusIcon} from 'lucide-react';\nimport React, {useCallback, useState} from 'react';\nimport CreateTableModal from './components/CreateTableModal';\nimport {QueryEditorPanel} from './components/QueryEditorPanel';\nimport {QueryResultPanel} from './components/QueryResultPanel';\nimport {SqlEditorHeader} from './components/SqlEditorHeader';\nimport {\n TableStructurePanel,\n TableStructurePanelProps,\n} from './components/TableStructurePanel';\nimport {useStoreWithSqlEditor} from './SqlEditorSlice';\n\nexport type SqlEditorProps = {\n /** The database schema to use. Defaults to '*'.\n * If '*' is provided, all tables will be shown.\n * If a function is provided, it will be used to filter the tables. */\n schema?: TableStructurePanelProps['schema'];\n /** Whether the SQL editor is currently visible */\n isOpen: boolean;\n /** Optional component to render SQL documentation in the side panel */\n documentationPanel?: React.ReactNode;\n /**\n * Props forwarded to `QueryResultPanel` to configure result behavior.\n * This provides a single entry point for table interactions.\n */\n queryResultProps?: Pick<\n React.ComponentProps<typeof QueryResultPanel>,\n 'onRowClick' | 'onRowDoubleClick'\n >;\n /** Callback fired when the SQL editor should be closed */\n onClose: () => void;\n};\n\nconst SqlEditor = React.memo<SqlEditorProps>((props) => {\n const {schema = '*', documentationPanel, queryResultProps} = props;\n\n const lastQuery = useStoreWithSqlEditor((s) => {\n const selectedId = s.sqlEditor.config.selectedQueryId;\n const qr = s.sqlEditor.queryResultsById[selectedId];\n if (qr?.status === 'success' && qr?.type === 'select') return qr.query;\n return s.sqlEditor.getCurrentQuery();\n });\n // UI state\n const [showDocs, setShowDocs] = useState(false);\n const [createTableModalOpen, setCreateTableModalOpen] = useState(false);\n\n // Handlers\n const handleToggleDocs = useCallback((show: boolean) => {\n setShowDocs(show);\n }, []);\n\n const handleCreateTable = useCallback(() => {\n setCreateTableModalOpen(true);\n }, []);\n\n return (\n <div className=\"relative flex h-full w-full flex-col overflow-hidden\">\n <SqlEditorHeader\n title=\"SQL Editor\"\n showDocs={showDocs}\n documentationPanel={documentationPanel}\n onToggleDocs={handleToggleDocs}\n />\n <div className=\"bg-muted h-full grow\">\n <ResizablePanelGroup direction=\"horizontal\" className=\"h-full\">\n <ResizablePanel defaultSize={showDocs ? 70 : 100}>\n <ResizablePanelGroup direction=\"vertical\" className=\"h-full\">\n <ResizablePanel defaultSize={50} className=\"flex flex-row\">\n <ResizablePanelGroup direction=\"horizontal\">\n <ResizablePanel defaultSize={20}>\n <TableStructurePanel schema={schema} />\n </ResizablePanel>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize={80}>\n <QueryEditorPanel />\n </ResizablePanel>\n </ResizablePanelGroup>\n </ResizablePanel>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize={50}>\n <QueryResultPanel\n onRowClick={queryResultProps?.onRowClick}\n onRowDoubleClick={queryResultProps?.onRowDoubleClick}\n renderActions={() => (\n <div className=\"flex gap-2\">\n <Button size=\"xs\" onClick={handleCreateTable}>\n <PlusIcon className=\"h-4 w-4\" />\n New table\n </Button>\n </div>\n )}\n />\n </ResizablePanel>\n </ResizablePanelGroup>\n </ResizablePanel>\n {showDocs && (\n <>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize={30}>\n {documentationPanel}\n </ResizablePanel>\n </>\n )}\n </ResizablePanelGroup>\n </div>\n <CreateTableModal\n query={lastQuery}\n isOpen={createTableModalOpen}\n onClose={() => setCreateTableModalOpen(false)}\n allowMultipleStatements={true}\n showSchemaSelection={true}\n />\n </div>\n );\n});\nSqlEditor.displayName = 'SqlEditor';\n\nexport default SqlEditor;\n"]}
1
+ {"version":3,"file":"SqlEditor.js","sourceRoot":"","sources":["../src/SqlEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Button,\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from '@sqlrooms/ui';\nimport {PlusIcon} from 'lucide-react';\nimport React, {useCallback, useState} from 'react';\nimport CreateTableModal from './components/CreateTableModal';\nimport {QueryEditorPanel} from './components/QueryEditorPanel';\nimport {QueryResultPanel} from './components/QueryResultPanel';\nimport {SqlEditorHeader} from './components/SqlEditorHeader';\nimport {\n TableStructurePanel,\n TableStructurePanelProps,\n} from './components/TableStructurePanel';\nimport {useStoreWithSqlEditor} from './SqlEditorSlice';\n\nexport type SqlEditorProps = {\n /** The database schema to use. Defaults to '*'.\n * If '*' is provided, all tables will be shown.\n * If a function is provided, it will be used to filter the tables. */\n schema?: TableStructurePanelProps['schema'];\n /** Whether the SQL editor is currently visible */\n isOpen: boolean;\n /** Optional component to render SQL documentation in the side panel */\n documentationPanel?: React.ReactNode;\n /**\n * Props forwarded to `QueryResultPanel` to configure result behavior.\n * This provides a single entry point for table interactions.\n */\n queryResultProps?: Pick<\n React.ComponentProps<typeof QueryResultPanel>,\n 'onRowClick' | 'onRowDoubleClick'\n >;\n /** Callback fired when the SQL editor should be closed */\n onClose: () => void;\n};\n\nconst SqlEditor = React.memo<SqlEditorProps>((props) => {\n const {schema = '*', documentationPanel, queryResultProps} = props;\n\n const lastQuery = useStoreWithSqlEditor((s) => {\n const selectedId = s.sqlEditor.config.selectedQueryId;\n const qr = s.sqlEditor.queryResultsById[selectedId];\n if (qr?.status === 'success' && qr?.type === 'select') return qr.query;\n return s.sqlEditor.getCurrentQuery();\n });\n // UI state\n const [showDocs, setShowDocs] = useState(false);\n const [createTableModalOpen, setCreateTableModalOpen] = useState(false);\n\n // Handlers\n const handleToggleDocs = useCallback((show: boolean) => {\n setShowDocs(show);\n }, []);\n\n const handleCreateTable = useCallback(() => {\n setCreateTableModalOpen(true);\n }, []);\n\n return (\n <div className=\"relative flex h-full w-full flex-col overflow-hidden\">\n <SqlEditorHeader\n title=\"SQL Editor\"\n showDocs={showDocs}\n documentationPanel={documentationPanel}\n onToggleDocs={handleToggleDocs}\n />\n <div className=\"bg-muted h-full grow\">\n <ResizablePanelGroup orientation=\"horizontal\" className=\"h-full\">\n <ResizablePanel defaultSize={showDocs ? '70' : '100'}>\n <ResizablePanelGroup orientation=\"vertical\" className=\"h-full\">\n <ResizablePanel defaultSize=\"50\" className=\"flex flex-row\">\n <ResizablePanelGroup orientation=\"horizontal\">\n <ResizablePanel defaultSize=\"20\">\n <TableStructurePanel schema={schema} />\n </ResizablePanel>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize=\"80\">\n <QueryEditorPanel />\n </ResizablePanel>\n </ResizablePanelGroup>\n </ResizablePanel>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize=\"50\">\n <QueryResultPanel\n onRowClick={queryResultProps?.onRowClick}\n onRowDoubleClick={queryResultProps?.onRowDoubleClick}\n renderActions={() => (\n <div className=\"flex gap-2\">\n <Button size=\"xs\" onClick={handleCreateTable}>\n <PlusIcon className=\"h-4 w-4\" />\n New table\n </Button>\n </div>\n )}\n />\n </ResizablePanel>\n </ResizablePanelGroup>\n </ResizablePanel>\n {showDocs && (\n <>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize=\"30\">\n {documentationPanel}\n </ResizablePanel>\n </>\n )}\n </ResizablePanelGroup>\n </div>\n <CreateTableModal\n query={lastQuery}\n isOpen={createTableModalOpen}\n onClose={() => setCreateTableModalOpen(false)}\n allowMultipleStatements={true}\n showSchemaSelection={true}\n />\n </div>\n );\n});\nSqlEditor.displayName = 'SqlEditor';\n\nexport default SqlEditor;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/sql-editor",
3
- "version": "0.29.0-rc.2",
3
+ "version": "0.29.0-rc.3",
4
4
  "author": "SQLRooms Contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,16 +36,16 @@
36
36
  "@marimo-team/codemirror-sql": "^0.2.0",
37
37
  "@monaco-editor/react": "^4.7.0",
38
38
  "@paralleldrive/cuid2": "^3.0.0",
39
- "@sqlrooms/codemirror": "0.29.0-rc.2",
40
- "@sqlrooms/data-table": "0.29.0-rc.2",
41
- "@sqlrooms/db": "0.29.0-rc.2",
42
- "@sqlrooms/duckdb": "0.29.0-rc.2",
43
- "@sqlrooms/monaco-editor": "0.29.0-rc.2",
44
- "@sqlrooms/room-shell": "0.29.0-rc.2",
45
- "@sqlrooms/schema-tree": "0.29.0-rc.2",
46
- "@sqlrooms/sql-editor-config": "0.29.0-rc.2",
47
- "@sqlrooms/ui": "0.29.0-rc.2",
48
- "@sqlrooms/utils": "0.29.0-rc.2",
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",
49
49
  "@tanstack/react-table": "^8.21.3",
50
50
  "d3-dsv": "^3.0.1",
51
51
  "es-toolkit": "^1.39.9",
@@ -70,5 +70,5 @@
70
70
  "@types/react": "^19.1.13",
71
71
  "@types/react-dom": "^19.1.9"
72
72
  },
73
- "gitHead": "5d511631992c1af8852ea79ced488867aad4a555"
73
+ "gitHead": "4ffaf6c31d41c27f96bd3e4f5e83d431968721c3"
74
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"]}