@deephaven/console 0.50.1-beta.5 → 0.51.1-beta.0

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.
Files changed (36) hide show
  1. package/dist/Console.js.map +1 -1
  2. package/dist/ConsoleInput.d.ts.map +1 -1
  3. package/dist/ConsoleInput.js +36 -46
  4. package/dist/ConsoleInput.js.map +1 -1
  5. package/dist/ConsoleMenu.js.map +1 -1
  6. package/dist/ConsoleStatusBar.js.map +1 -1
  7. package/dist/HeapUsage.js.map +1 -1
  8. package/dist/command-history/CommandHistory.js.map +1 -1
  9. package/dist/command-history/CommandHistoryActions.js.map +1 -1
  10. package/dist/command-history/CommandHistoryItem.js.map +1 -1
  11. package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -1
  12. package/dist/command-history/CommandHistoryViewportUpdater.js.map +1 -1
  13. package/dist/common/Code.js.map +1 -1
  14. package/dist/common/ConsoleConstants.js.map +1 -1
  15. package/dist/common/ConsoleUtils.js.map +1 -1
  16. package/dist/common/ObjectIcon.js.map +1 -1
  17. package/dist/console-history/ConsoleHistory.js.map +1 -1
  18. package/dist/console-history/ConsoleHistoryItem.js.map +1 -1
  19. package/dist/console-history/ConsoleHistoryItemResult.js.map +1 -1
  20. package/dist/console-history/ConsoleHistoryResultErrorMessage.js.map +1 -1
  21. package/dist/console-history/ConsoleHistoryResultInProgress.js.map +1 -1
  22. package/dist/csv/CsvFormats.js.map +1 -1
  23. package/dist/csv/CsvInputBar.js.map +1 -1
  24. package/dist/csv/CsvOverlay.js.map +1 -1
  25. package/dist/csv/CsvParser.js.map +1 -1
  26. package/dist/csv/CsvTypeParser.js.map +1 -1
  27. package/dist/csv/NewTableColumnTypes.js.map +1 -1
  28. package/dist/csv/ZipStreamHelper.js.map +1 -1
  29. package/dist/log/LogLevelMenuItem.js.map +1 -1
  30. package/dist/log/LogView.js.map +1 -1
  31. package/dist/monaco/MonacoProviders.js.map +1 -1
  32. package/dist/monaco/MonacoUtils.js.map +1 -1
  33. package/dist/notebook/Editor.js.map +1 -1
  34. package/dist/notebook/ScriptEditor.js.map +1 -1
  35. package/dist/notebook/ScriptEditorUtils.js.map +1 -1
  36. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"CsvParser.js","names":["Papa","Log","assertNotNull","DbNameValidator","CsvTypeParser","makeZipStreamHelper","log","module","ZIP_CONSOLIDATE_CHUNKS","CsvParser","generateHeaderRecursive","n","header","char","concat","Math","floor","String","fromCharCode","constructor","onFileCompleted","session","file","type","readHeaders","onProgress","onError","timeZone","isZip","tables","rowCount","rowsProcessed","chunks","totalChunks","ceil","size","LocalChunkSize","isComplete","zipProgress","numConsolidated","isCancelled","handleChunk","bind","handleError","handleComplete","handleNodeUpdate","handleCreateTable","config","delimiter","newline","escapeChar","dynamicTyping","error","skipEmptyLines","chunk","complete","fastMode","cancel","transpose","numColumns","array","numRows","length","columns","Array","fill","map","r","row","Error","c","value","shouldTrim","trim","nullCheck","nullString","parse","handleParseDone","types","File","Blob","zipStream","resume","typeParser","result","parser","debug2","abort","forEach","t","close","data","headers","legalizeColumnNames","slice","generateHeaders","consolidateChunks","index","e","consolidatedChunks","i","uploadConsolidatedChunks","toUpload","undefined","pause","newTable","then","table","progress","round","catch","results","meta","aborted","metadata","percent","push"],"sources":["../../src/csv/CsvParser.ts"],"sourcesContent":["import Papa, { ParseLocalConfig, Parser, ParseResult } from 'papaparse';\nimport Log from '@deephaven/log';\nimport { assertNotNull, DbNameValidator } from '@deephaven/utils';\nimport type { IdeSession, Table } from '@deephaven/jsapi-types';\nimport type { JSZipObject } from 'jszip';\nimport CsvTypeParser from './CsvTypeParser';\nimport { CsvTypes } from './CsvFormats';\nimport makeZipStreamHelper from './ZipStreamHelper';\n\nconst log = Log.module('CsvParser');\n\n// This is based on jszip streaming ~15 KB chunks to papa parse\n// Want to consolidate to ~10 MB chunks\nconst ZIP_CONSOLIDATE_CHUNKS = 650;\n\ninterface CsvParserConstructor {\n onFileCompleted: (tables: Table[]) => void;\n session: IdeSession;\n file: File | Blob | JSZipObject;\n type: CsvTypes;\n readHeaders: boolean;\n onProgress: (progressValue: number) => boolean;\n onError: (e: unknown) => void;\n timeZone: string;\n isZip: boolean;\n}\n\n/**\n * Parser a CSV file in chunks and returns a table handle for each chunk.\n */\nclass CsvParser {\n // Generates column names A-Z, AA-AZ, BA-BZ, etc...\n static generateHeaders = (numColumns: number): string[] => {\n const headers = [];\n for (let i = 0; i < numColumns; i += 1) {\n headers.push(CsvParser.generateHeaderRecursive(i));\n }\n return headers;\n };\n\n static generateHeaderRecursive(n: number): string {\n let header = '';\n let char = n;\n if (n >= 26) {\n header = header.concat(\n CsvParser.generateHeaderRecursive(Math.floor(n / 26) - 1)\n );\n char = n % 26;\n }\n return header.concat(String.fromCharCode(65 + char));\n }\n\n constructor({\n onFileCompleted,\n session,\n file,\n type,\n readHeaders = true,\n onProgress,\n onError,\n timeZone,\n isZip,\n }: CsvParserConstructor) {\n this.onFileCompleted = onFileCompleted;\n this.session = session;\n this.file = file;\n this.isZip = isZip;\n this.type = type;\n this.readHeaders = readHeaders;\n this.timeZone = timeZone;\n this.onProgress = onProgress;\n this.onError = onError;\n this.tables = [];\n this.rowCount = 0;\n this.rowsProcessed = 0;\n this.chunks = 0;\n this.totalChunks = isZip\n ? 0\n : Math.ceil((file as Blob).size / Papa.LocalChunkSize);\n this.isComplete = false;\n this.zipProgress = 0;\n this.numConsolidated = 0;\n this.isCancelled = false;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n this.handleCreateTable = this.handleCreateTable.bind(this);\n\n this.config = {\n delimiter: type.delimiter,\n newline: type.newline as '\\r\\n' | '\\n' | '\\r' | undefined,\n escapeChar: type.escapeChar,\n dynamicTyping: false,\n error: this.handleError,\n skipEmptyLines: type.skipEmptyLines,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n fastMode: false,\n };\n }\n\n onFileCompleted: (tables: Table[]) => void;\n\n session: IdeSession;\n\n file: File | Blob | JSZipObject;\n\n isZip: boolean;\n\n type: CsvTypes;\n\n readHeaders: boolean;\n\n timeZone: string;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n tables: Table[];\n\n headers?: string[];\n\n types?: string[];\n\n rowCount: number;\n\n rowsProcessed: number;\n\n chunks: number;\n\n totalChunks: number;\n\n isComplete: boolean;\n\n zipProgress: number;\n\n consolidatedChunks?: string[][];\n\n numConsolidated: number;\n\n isCancelled: boolean;\n\n config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;\n\n cancel(): void {\n this.isCancelled = true;\n }\n\n transpose(numColumns: number, array: string[][]): string[][] {\n const numRows = array.length;\n const columns = new Array(numColumns)\n .fill(null)\n .map(() => new Array(numRows));\n for (let r = 0; r < numRows; r += 1) {\n const row = array[r];\n if (row.length < numColumns) {\n throw new Error(\n `Insufficient columns. Expected ${numColumns} but found ${row.length}\\n${row}`\n );\n }\n for (let c = 0; c < numColumns; c += 1) {\n const value = this.type.shouldTrim ? array[r][c].trim() : array[r][c];\n columns[c][r] = this.nullCheck(value);\n }\n }\n return columns as string[][];\n }\n\n nullCheck(value: string): string {\n return value === this.type.nullString ? '' : value;\n }\n\n parse(): void {\n const handleParseDone = (types: string[], rowCount: number): void => {\n this.types = types;\n this.rowCount = rowCount;\n\n if (this.file instanceof File || this.file instanceof Blob) {\n Papa.parse(this.file, this.config);\n } else {\n const zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);\n // This is actually a stream, but papaparse TS doesn't like it\n Papa.parse(zipStream as unknown as Blob, this.config);\n // The stream needs to be manually resumed since jszip starts paused\n // Papaparse does not call resume and assumes the stream is already reading\n zipStream.resume();\n }\n };\n const typeParser = new CsvTypeParser(\n handleParseDone,\n this.file,\n this.readHeaders,\n this.config,\n this.type.nullString,\n this.onProgress,\n this.onError,\n this.totalChunks,\n this.isZip,\n this.type.shouldTrim\n );\n typeParser.parse();\n }\n\n handleChunk(result: ParseResult<string[]>, parser: Parser): void {\n const { readHeaders, onError, handleCreateTable, isZip, tables } = this;\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n parser.abort();\n tables.forEach(t => t.close());\n return;\n }\n let { data } = result;\n if (!this.headers) {\n if (readHeaders) {\n this.headers = DbNameValidator.legalizeColumnNames(data[0]);\n data = data.slice(1);\n } else {\n this.headers = CsvParser.generateHeaders(data[0].length);\n }\n }\n\n let columns: string[][] = [];\n try {\n columns = this.transpose(this.headers.length, data);\n if (isZip) {\n // Zip file chunks are tiny, so consolidate them to avoid create thousands of small tables\n this.consolidateChunks(columns, parser);\n } else {\n const index = this.chunks;\n this.chunks += 1;\n handleCreateTable(index, columns, parser);\n }\n } catch (e: unknown) {\n onError(e);\n }\n }\n\n consolidateChunks(columns: string[][], parser: Parser): void {\n if (!this.consolidatedChunks) {\n this.consolidatedChunks = columns.slice();\n } else {\n for (let i = 0; i < columns.length; i += 1) {\n this.consolidatedChunks[i] = this.consolidatedChunks[i].concat(\n columns[i]\n );\n }\n }\n this.numConsolidated += 1;\n if (this.numConsolidated >= ZIP_CONSOLIDATE_CHUNKS || this.isComplete) {\n this.uploadConsolidatedChunks(parser);\n }\n }\n\n uploadConsolidatedChunks(parser: Parser | null): void {\n const { handleCreateTable } = this;\n const index = this.chunks;\n this.chunks += 1;\n const toUpload = this.consolidatedChunks?.slice();\n this.consolidatedChunks = undefined;\n this.numConsolidated = 0;\n assertNotNull(toUpload);\n handleCreateTable(index, toUpload, parser);\n }\n\n handleCreateTable(\n index: number,\n columns: string[][],\n parser: Parser | null\n ): void {\n const {\n session,\n tables,\n onFileCompleted,\n totalChunks,\n types,\n onProgress,\n onError,\n } = this;\n if (parser) {\n parser.pause();\n }\n assertNotNull(this.headers);\n assertNotNull(types);\n\n this.rowsProcessed += columns[0].length;\n\n session\n .newTable(this.headers, types, columns, this.timeZone)\n .then(table => {\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n if (parser) {\n parser.abort();\n }\n tables.forEach(t => t.close());\n return;\n }\n if (parser) {\n parser.resume();\n }\n tables[index] = table;\n // This accounts for 50% of parsing plus 50% already done by the type parser\n let progress = 0;\n if (totalChunks > 0) {\n progress = Math.round((tables.length / totalChunks) * 50) + 50;\n } else {\n // The zip file can be read entirely while in the middle of parsing\n // Since we know the number of rows from the type parsing, use that for progress\n progress = Math.round((this.rowsProcessed / this.rowCount) * 50) + 50;\n }\n log.debug2(`CSV parser progress ${progress}`);\n onProgress(progress);\n if (this.isComplete && tables.length === this.chunks) {\n log.debug2('CSV parser complete.');\n onFileCompleted(tables);\n }\n })\n .catch(e => {\n if (!this.isComplete && parser) {\n parser.abort();\n }\n onError(e);\n });\n }\n\n handleComplete(results: ParseResult<unknown>): void {\n // results is undefined for a succesful parse, but has meta data for an abort\n if (results == null || results.meta.aborted == null) {\n this.isComplete = true;\n // Check if there are any consolidated chunks left over from a zip file\n if (this.consolidatedChunks) {\n this.uploadConsolidatedChunks(null);\n }\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvParser;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CsvParser.js","names":["Papa","Log","assertNotNull","DbNameValidator","CsvTypeParser","makeZipStreamHelper","log","module","ZIP_CONSOLIDATE_CHUNKS","CsvParser","generateHeaderRecursive","n","header","char","concat","Math","floor","String","fromCharCode","constructor","_ref","onFileCompleted","session","file","type","readHeaders","onProgress","onError","timeZone","isZip","_defineProperty","tables","rowCount","rowsProcessed","chunks","totalChunks","ceil","size","LocalChunkSize","isComplete","zipProgress","numConsolidated","isCancelled","handleChunk","bind","handleError","handleComplete","handleNodeUpdate","handleCreateTable","config","delimiter","newline","escapeChar","dynamicTyping","error","skipEmptyLines","chunk","complete","fastMode","cancel","transpose","numColumns","array","numRows","length","columns","Array","fill","map","r","row","Error","c","value","shouldTrim","trim","nullCheck","nullString","parse","handleParseDone","types","File","Blob","zipStream","resume","typeParser","result","parser","debug2","abort","forEach","t","close","data","headers","legalizeColumnNames","slice","generateHeaders","consolidateChunks","index","e","consolidatedChunks","i","uploadConsolidatedChunks","_this$consolidatedChu","toUpload","undefined","pause","newTable","then","table","progress","round","catch","results","meta","aborted","metadata","percent","push"],"sources":["../../src/csv/CsvParser.ts"],"sourcesContent":["import Papa, { ParseLocalConfig, Parser, ParseResult } from 'papaparse';\nimport Log from '@deephaven/log';\nimport { assertNotNull, DbNameValidator } from '@deephaven/utils';\nimport type { IdeSession, Table } from '@deephaven/jsapi-types';\nimport type { JSZipObject } from 'jszip';\nimport CsvTypeParser from './CsvTypeParser';\nimport { CsvTypes } from './CsvFormats';\nimport makeZipStreamHelper from './ZipStreamHelper';\n\nconst log = Log.module('CsvParser');\n\n// This is based on jszip streaming ~15 KB chunks to papa parse\n// Want to consolidate to ~10 MB chunks\nconst ZIP_CONSOLIDATE_CHUNKS = 650;\n\ninterface CsvParserConstructor {\n onFileCompleted: (tables: Table[]) => void;\n session: IdeSession;\n file: File | Blob | JSZipObject;\n type: CsvTypes;\n readHeaders: boolean;\n onProgress: (progressValue: number) => boolean;\n onError: (e: unknown) => void;\n timeZone: string;\n isZip: boolean;\n}\n\n/**\n * Parser a CSV file in chunks and returns a table handle for each chunk.\n */\nclass CsvParser {\n // Generates column names A-Z, AA-AZ, BA-BZ, etc...\n static generateHeaders = (numColumns: number): string[] => {\n const headers = [];\n for (let i = 0; i < numColumns; i += 1) {\n headers.push(CsvParser.generateHeaderRecursive(i));\n }\n return headers;\n };\n\n static generateHeaderRecursive(n: number): string {\n let header = '';\n let char = n;\n if (n >= 26) {\n header = header.concat(\n CsvParser.generateHeaderRecursive(Math.floor(n / 26) - 1)\n );\n char = n % 26;\n }\n return header.concat(String.fromCharCode(65 + char));\n }\n\n constructor({\n onFileCompleted,\n session,\n file,\n type,\n readHeaders = true,\n onProgress,\n onError,\n timeZone,\n isZip,\n }: CsvParserConstructor) {\n this.onFileCompleted = onFileCompleted;\n this.session = session;\n this.file = file;\n this.isZip = isZip;\n this.type = type;\n this.readHeaders = readHeaders;\n this.timeZone = timeZone;\n this.onProgress = onProgress;\n this.onError = onError;\n this.tables = [];\n this.rowCount = 0;\n this.rowsProcessed = 0;\n this.chunks = 0;\n this.totalChunks = isZip\n ? 0\n : Math.ceil((file as Blob).size / Papa.LocalChunkSize);\n this.isComplete = false;\n this.zipProgress = 0;\n this.numConsolidated = 0;\n this.isCancelled = false;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n this.handleCreateTable = this.handleCreateTable.bind(this);\n\n this.config = {\n delimiter: type.delimiter,\n newline: type.newline as '\\r\\n' | '\\n' | '\\r' | undefined,\n escapeChar: type.escapeChar,\n dynamicTyping: false,\n error: this.handleError,\n skipEmptyLines: type.skipEmptyLines,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n fastMode: false,\n };\n }\n\n onFileCompleted: (tables: Table[]) => void;\n\n session: IdeSession;\n\n file: File | Blob | JSZipObject;\n\n isZip: boolean;\n\n type: CsvTypes;\n\n readHeaders: boolean;\n\n timeZone: string;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n tables: Table[];\n\n headers?: string[];\n\n types?: string[];\n\n rowCount: number;\n\n rowsProcessed: number;\n\n chunks: number;\n\n totalChunks: number;\n\n isComplete: boolean;\n\n zipProgress: number;\n\n consolidatedChunks?: string[][];\n\n numConsolidated: number;\n\n isCancelled: boolean;\n\n config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;\n\n cancel(): void {\n this.isCancelled = true;\n }\n\n transpose(numColumns: number, array: string[][]): string[][] {\n const numRows = array.length;\n const columns = new Array(numColumns)\n .fill(null)\n .map(() => new Array(numRows));\n for (let r = 0; r < numRows; r += 1) {\n const row = array[r];\n if (row.length < numColumns) {\n throw new Error(\n `Insufficient columns. Expected ${numColumns} but found ${row.length}\\n${row}`\n );\n }\n for (let c = 0; c < numColumns; c += 1) {\n const value = this.type.shouldTrim ? array[r][c].trim() : array[r][c];\n columns[c][r] = this.nullCheck(value);\n }\n }\n return columns as string[][];\n }\n\n nullCheck(value: string): string {\n return value === this.type.nullString ? '' : value;\n }\n\n parse(): void {\n const handleParseDone = (types: string[], rowCount: number): void => {\n this.types = types;\n this.rowCount = rowCount;\n\n if (this.file instanceof File || this.file instanceof Blob) {\n Papa.parse(this.file, this.config);\n } else {\n const zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);\n // This is actually a stream, but papaparse TS doesn't like it\n Papa.parse(zipStream as unknown as Blob, this.config);\n // The stream needs to be manually resumed since jszip starts paused\n // Papaparse does not call resume and assumes the stream is already reading\n zipStream.resume();\n }\n };\n const typeParser = new CsvTypeParser(\n handleParseDone,\n this.file,\n this.readHeaders,\n this.config,\n this.type.nullString,\n this.onProgress,\n this.onError,\n this.totalChunks,\n this.isZip,\n this.type.shouldTrim\n );\n typeParser.parse();\n }\n\n handleChunk(result: ParseResult<string[]>, parser: Parser): void {\n const { readHeaders, onError, handleCreateTable, isZip, tables } = this;\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n parser.abort();\n tables.forEach(t => t.close());\n return;\n }\n let { data } = result;\n if (!this.headers) {\n if (readHeaders) {\n this.headers = DbNameValidator.legalizeColumnNames(data[0]);\n data = data.slice(1);\n } else {\n this.headers = CsvParser.generateHeaders(data[0].length);\n }\n }\n\n let columns: string[][] = [];\n try {\n columns = this.transpose(this.headers.length, data);\n if (isZip) {\n // Zip file chunks are tiny, so consolidate them to avoid create thousands of small tables\n this.consolidateChunks(columns, parser);\n } else {\n const index = this.chunks;\n this.chunks += 1;\n handleCreateTable(index, columns, parser);\n }\n } catch (e: unknown) {\n onError(e);\n }\n }\n\n consolidateChunks(columns: string[][], parser: Parser): void {\n if (!this.consolidatedChunks) {\n this.consolidatedChunks = columns.slice();\n } else {\n for (let i = 0; i < columns.length; i += 1) {\n this.consolidatedChunks[i] = this.consolidatedChunks[i].concat(\n columns[i]\n );\n }\n }\n this.numConsolidated += 1;\n if (this.numConsolidated >= ZIP_CONSOLIDATE_CHUNKS || this.isComplete) {\n this.uploadConsolidatedChunks(parser);\n }\n }\n\n uploadConsolidatedChunks(parser: Parser | null): void {\n const { handleCreateTable } = this;\n const index = this.chunks;\n this.chunks += 1;\n const toUpload = this.consolidatedChunks?.slice();\n this.consolidatedChunks = undefined;\n this.numConsolidated = 0;\n assertNotNull(toUpload);\n handleCreateTable(index, toUpload, parser);\n }\n\n handleCreateTable(\n index: number,\n columns: string[][],\n parser: Parser | null\n ): void {\n const {\n session,\n tables,\n onFileCompleted,\n totalChunks,\n types,\n onProgress,\n onError,\n } = this;\n if (parser) {\n parser.pause();\n }\n assertNotNull(this.headers);\n assertNotNull(types);\n\n this.rowsProcessed += columns[0].length;\n\n session\n .newTable(this.headers, types, columns, this.timeZone)\n .then(table => {\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n if (parser) {\n parser.abort();\n }\n tables.forEach(t => t.close());\n return;\n }\n if (parser) {\n parser.resume();\n }\n tables[index] = table;\n // This accounts for 50% of parsing plus 50% already done by the type parser\n let progress = 0;\n if (totalChunks > 0) {\n progress = Math.round((tables.length / totalChunks) * 50) + 50;\n } else {\n // The zip file can be read entirely while in the middle of parsing\n // Since we know the number of rows from the type parsing, use that for progress\n progress = Math.round((this.rowsProcessed / this.rowCount) * 50) + 50;\n }\n log.debug2(`CSV parser progress ${progress}`);\n onProgress(progress);\n if (this.isComplete && tables.length === this.chunks) {\n log.debug2('CSV parser complete.');\n onFileCompleted(tables);\n }\n })\n .catch(e => {\n if (!this.isComplete && parser) {\n parser.abort();\n }\n onError(e);\n });\n }\n\n handleComplete(results: ParseResult<unknown>): void {\n // results is undefined for a succesful parse, but has meta data for an abort\n if (results == null || results.meta.aborted == null) {\n this.isComplete = true;\n // Check if there are any consolidated chunks left over from a zip file\n if (this.consolidatedChunks) {\n this.uploadConsolidatedChunks(null);\n }\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvParser;\n"],"mappings":";;;AAAA,OAAOA,IAAI,MAAiD,WAAW;AACvE,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,aAAa,EAAEC,eAAe,QAAQ,kBAAkB;AAAC,OAG3DC,aAAa;AAAA,OAEbC,mBAAmB;AAE1B,IAAMC,GAAG,GAAGL,GAAG,CAACM,MAAM,CAAC,WAAW,CAAC;;AAEnC;AACA;AACA,IAAMC,sBAAsB,GAAG,GAAG;AAclC;AACA;AACA;AACA,MAAMC,SAAS,CAAC;EACd;;EASA,OAAOC,uBAAuBA,CAACC,CAAS,EAAU;IAChD,IAAIC,MAAM,GAAG,EAAE;IACf,IAAIC,IAAI,GAAGF,CAAC;IACZ,IAAIA,CAAC,IAAI,EAAE,EAAE;MACXC,MAAM,GAAGA,MAAM,CAACE,MAAM,CACpBL,SAAS,CAACC,uBAAuB,CAACK,IAAI,CAACC,KAAK,CAACL,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAC1D,CAAC;MACDE,IAAI,GAAGF,CAAC,GAAG,EAAE;IACf;IACA,OAAOC,MAAM,CAACE,MAAM,CAACG,MAAM,CAACC,YAAY,CAAC,EAAE,GAAGL,IAAI,CAAC,CAAC;EACtD;EAEAM,WAAWA,CAAAC,IAAA,EAUc;IAAA,IAVb;MACVC,eAAe;MACfC,OAAO;MACPC,IAAI;MACJC,IAAI;MACJC,WAAW,GAAG,IAAI;MAClBC,UAAU;MACVC,OAAO;MACPC,QAAQ;MACRC;IACoB,CAAC,GAAAT,IAAA;IAAAU,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IACrB,IAAI,CAACT,eAAe,GAAGA,eAAe;IACtC,IAAI,CAACC,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACM,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACL,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACC,WAAW,GAAGA,WAAW;IAC9B,IAAI,CAACG,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACF,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACI,MAAM,GAAG,EAAE;IAChB,IAAI,CAACC,QAAQ,GAAG,CAAC;IACjB,IAAI,CAACC,aAAa,GAAG,CAAC;IACtB,IAAI,CAACC,MAAM,GAAG,CAAC;IACf,IAAI,CAACC,WAAW,GAAGN,KAAK,GACpB,CAAC,GACDd,IAAI,CAACqB,IAAI,CAAEb,IAAI,CAAUc,IAAI,GAAGrC,IAAI,CAACsC,cAAc,CAAC;IACxD,IAAI,CAACC,UAAU,GAAG,KAAK;IACvB,IAAI,CAACC,WAAW,GAAG,CAAC;IACpB,IAAI,CAACC,eAAe,GAAG,CAAC;IACxB,IAAI,CAACC,WAAW,GAAG,KAAK;IAExB,IAAI,CAACC,WAAW,GAAG,IAAI,CAACA,WAAW,CAACC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACC,WAAW,GAAG,IAAI,CAACA,WAAW,CAACD,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACE,cAAc,GAAG,IAAI,CAACA,cAAc,CAACF,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACG,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACH,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACI,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACJ,IAAI,CAAC,IAAI,CAAC;IAE1D,IAAI,CAACK,MAAM,GAAG;MACZC,SAAS,EAAE1B,IAAI,CAAC0B,SAAS;MACzBC,OAAO,EAAE3B,IAAI,CAAC2B,OAA2C;MACzDC,UAAU,EAAE5B,IAAI,CAAC4B,UAAU;MAC3BC,aAAa,EAAE,KAAK;MACpBC,KAAK,EAAE,IAAI,CAACT,WAAW;MACvBU,cAAc,EAAE/B,IAAI,CAAC+B,cAAc;MACnCC,KAAK,EAAE,IAAI,CAACb,WAAW;MACvBc,QAAQ,EAAE,IAAI,CAACX,cAAc;MAC7BY,QAAQ,EAAE;IACZ,CAAC;EACH;EA8CAC,MAAMA,CAAA,EAAS;IACb,IAAI,CAACjB,WAAW,GAAG,IAAI;EACzB;EAEAkB,SAASA,CAACC,UAAkB,EAAEC,KAAiB,EAAc;IAC3D,IAAMC,OAAO,GAAGD,KAAK,CAACE,MAAM;IAC5B,IAAMC,OAAO,GAAG,IAAIC,KAAK,CAACL,UAAU,CAAC,CAClCM,IAAI,CAAC,IAAI,CAAC,CACVC,GAAG,CAAC,MAAM,IAAIF,KAAK,CAACH,OAAO,CAAC,CAAC;IAChC,KAAK,IAAIM,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGN,OAAO,EAAEM,CAAC,IAAI,CAAC,EAAE;MACnC,IAAMC,GAAG,GAAGR,KAAK,CAACO,CAAC,CAAC;MACpB,IAAIC,GAAG,CAACN,MAAM,GAAGH,UAAU,EAAE;QAC3B,MAAM,IAAIU,KAAK,mCAAAzD,MAAA,CACqB+C,UAAU,iBAAA/C,MAAA,CAAcwD,GAAG,CAACN,MAAM,QAAAlD,MAAA,CAAKwD,GAAG,CAC9E,CAAC;MACH;MACA,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGX,UAAU,EAAEW,CAAC,IAAI,CAAC,EAAE;QACtC,IAAMC,KAAK,GAAG,IAAI,CAACjD,IAAI,CAACkD,UAAU,GAAGZ,KAAK,CAACO,CAAC,CAAC,CAACG,CAAC,CAAC,CAACG,IAAI,CAAC,CAAC,GAAGb,KAAK,CAACO,CAAC,CAAC,CAACG,CAAC,CAAC;QACrEP,OAAO,CAACO,CAAC,CAAC,CAACH,CAAC,CAAC,GAAG,IAAI,CAACO,SAAS,CAACH,KAAK,CAAC;MACvC;IACF;IACA,OAAOR,OAAO;EAChB;EAEAW,SAASA,CAACH,KAAa,EAAU;IAC/B,OAAOA,KAAK,KAAK,IAAI,CAACjD,IAAI,CAACqD,UAAU,GAAG,EAAE,GAAGJ,KAAK;EACpD;EAEAK,KAAKA,CAAA,EAAS;IACZ,IAAMC,eAAe,GAAGA,CAACC,KAAe,EAAEhD,QAAgB,KAAW;MACnE,IAAI,CAACgD,KAAK,GAAGA,KAAK;MAClB,IAAI,CAAChD,QAAQ,GAAGA,QAAQ;MAExB,IAAI,IAAI,CAACT,IAAI,YAAY0D,IAAI,IAAI,IAAI,CAAC1D,IAAI,YAAY2D,IAAI,EAAE;QAC1DlF,IAAI,CAAC8E,KAAK,CAAC,IAAI,CAACvD,IAAI,EAAE,IAAI,CAAC0B,MAAM,CAAC;MACpC,CAAC,MAAM;QACL,IAAMkC,SAAS,GAAG9E,mBAAmB,CAAC,IAAI,CAACkB,IAAI,EAAE,IAAI,CAACwB,gBAAgB,CAAC;QACvE;QACA/C,IAAI,CAAC8E,KAAK,CAACK,SAAS,EAAqB,IAAI,CAAClC,MAAM,CAAC;QACrD;QACA;QACAkC,SAAS,CAACC,MAAM,CAAC,CAAC;MACpB;IACF,CAAC;IACD,IAAMC,UAAU,GAAG,IAAIjF,aAAa,CAClC2E,eAAe,EACf,IAAI,CAACxD,IAAI,EACT,IAAI,CAACE,WAAW,EAChB,IAAI,CAACwB,MAAM,EACX,IAAI,CAACzB,IAAI,CAACqD,UAAU,EACpB,IAAI,CAACnD,UAAU,EACf,IAAI,CAACC,OAAO,EACZ,IAAI,CAACQ,WAAW,EAChB,IAAI,CAACN,KAAK,EACV,IAAI,CAACL,IAAI,CAACkD,UACZ,CAAC;IACDW,UAAU,CAACP,KAAK,CAAC,CAAC;EACpB;EAEAnC,WAAWA,CAAC2C,MAA6B,EAAEC,MAAc,EAAQ;IAC/D,IAAM;MAAE9D,WAAW;MAAEE,OAAO;MAAEqB,iBAAiB;MAAEnB,KAAK;MAAEE;IAAO,CAAC,GAAG,IAAI;IACvE,IAAI,IAAI,CAACW,WAAW,EAAE;MACpBpC,GAAG,CAACkF,MAAM,CAAC,uBAAuB,CAAC;MACnCD,MAAM,CAACE,KAAK,CAAC,CAAC;MACd1D,MAAM,CAAC2D,OAAO,CAACC,CAAC,IAAIA,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC;MAC9B;IACF;IACA,IAAI;MAAEC;IAAK,CAAC,GAAGP,MAAM;IACrB,IAAI,CAAC,IAAI,CAACQ,OAAO,EAAE;MACjB,IAAIrE,WAAW,EAAE;QACf,IAAI,CAACqE,OAAO,GAAG3F,eAAe,CAAC4F,mBAAmB,CAACF,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3DA,IAAI,GAAGA,IAAI,CAACG,KAAK,CAAC,CAAC,CAAC;MACtB,CAAC,MAAM;QACL,IAAI,CAACF,OAAO,GAAGrF,SAAS,CAACwF,eAAe,CAACJ,IAAI,CAAC,CAAC,CAAC,CAAC7B,MAAM,CAAC;MAC1D;IACF;IAEA,IAAIC,OAAmB,GAAG,EAAE;IAC5B,IAAI;MACFA,OAAO,GAAG,IAAI,CAACL,SAAS,CAAC,IAAI,CAACkC,OAAO,CAAC9B,MAAM,EAAE6B,IAAI,CAAC;MACnD,IAAIhE,KAAK,EAAE;QACT;QACA,IAAI,CAACqE,iBAAiB,CAACjC,OAAO,EAAEsB,MAAM,CAAC;MACzC,CAAC,MAAM;QACL,IAAMY,KAAK,GAAG,IAAI,CAACjE,MAAM;QACzB,IAAI,CAACA,MAAM,IAAI,CAAC;QAChBc,iBAAiB,CAACmD,KAAK,EAAElC,OAAO,EAAEsB,MAAM,CAAC;MAC3C;IACF,CAAC,CAAC,OAAOa,CAAU,EAAE;MACnBzE,OAAO,CAACyE,CAAC,CAAC;IACZ;EACF;EAEAF,iBAAiBA,CAACjC,OAAmB,EAAEsB,MAAc,EAAQ;IAC3D,IAAI,CAAC,IAAI,CAACc,kBAAkB,EAAE;MAC5B,IAAI,CAACA,kBAAkB,GAAGpC,OAAO,CAAC+B,KAAK,CAAC,CAAC;IAC3C,CAAC,MAAM;MACL,KAAK,IAAIM,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGrC,OAAO,CAACD,MAAM,EAAEsC,CAAC,IAAI,CAAC,EAAE;QAC1C,IAAI,CAACD,kBAAkB,CAACC,CAAC,CAAC,GAAG,IAAI,CAACD,kBAAkB,CAACC,CAAC,CAAC,CAACxF,MAAM,CAC5DmD,OAAO,CAACqC,CAAC,CACX,CAAC;MACH;IACF;IACA,IAAI,CAAC7D,eAAe,IAAI,CAAC;IACzB,IAAI,IAAI,CAACA,eAAe,IAAIjC,sBAAsB,IAAI,IAAI,CAAC+B,UAAU,EAAE;MACrE,IAAI,CAACgE,wBAAwB,CAAChB,MAAM,CAAC;IACvC;EACF;EAEAgB,wBAAwBA,CAAChB,MAAqB,EAAQ;IAAA,IAAAiB,qBAAA;IACpD,IAAM;MAAExD;IAAkB,CAAC,GAAG,IAAI;IAClC,IAAMmD,KAAK,GAAG,IAAI,CAACjE,MAAM;IACzB,IAAI,CAACA,MAAM,IAAI,CAAC;IAChB,IAAMuE,QAAQ,IAAAD,qBAAA,GAAG,IAAI,CAACH,kBAAkB,cAAAG,qBAAA,uBAAvBA,qBAAA,CAAyBR,KAAK,CAAC,CAAC;IACjD,IAAI,CAACK,kBAAkB,GAAGK,SAAS;IACnC,IAAI,CAACjE,eAAe,GAAG,CAAC;IACxBvC,aAAa,CAACuG,QAAQ,CAAC;IACvBzD,iBAAiB,CAACmD,KAAK,EAAEM,QAAQ,EAAElB,MAAM,CAAC;EAC5C;EAEAvC,iBAAiBA,CACfmD,KAAa,EACblC,OAAmB,EACnBsB,MAAqB,EACf;IACN,IAAM;MACJjE,OAAO;MACPS,MAAM;MACNV,eAAe;MACfc,WAAW;MACX6C,KAAK;MACLtD,UAAU;MACVC;IACF,CAAC,GAAG,IAAI;IACR,IAAI4D,MAAM,EAAE;MACVA,MAAM,CAACoB,KAAK,CAAC,CAAC;IAChB;IACAzG,aAAa,CAAC,IAAI,CAAC4F,OAAO,CAAC;IAC3B5F,aAAa,CAAC8E,KAAK,CAAC;IAEpB,IAAI,CAAC/C,aAAa,IAAIgC,OAAO,CAAC,CAAC,CAAC,CAACD,MAAM;IAEvC1C,OAAO,CACJsF,QAAQ,CAAC,IAAI,CAACd,OAAO,EAAEd,KAAK,EAAEf,OAAO,EAAE,IAAI,CAACrC,QAAQ,CAAC,CACrDiF,IAAI,CAACC,KAAK,IAAI;MACb,IAAI,IAAI,CAACpE,WAAW,EAAE;QACpBpC,GAAG,CAACkF,MAAM,CAAC,uBAAuB,CAAC;QACnC,IAAID,MAAM,EAAE;UACVA,MAAM,CAACE,KAAK,CAAC,CAAC;QAChB;QACA1D,MAAM,CAAC2D,OAAO,CAACC,CAAC,IAAIA,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC;QAC9B;MACF;MACA,IAAIL,MAAM,EAAE;QACVA,MAAM,CAACH,MAAM,CAAC,CAAC;MACjB;MACArD,MAAM,CAACoE,KAAK,CAAC,GAAGW,KAAK;MACrB;MACA,IAAIC,QAAQ,GAAG,CAAC;MAChB,IAAI5E,WAAW,GAAG,CAAC,EAAE;QACnB4E,QAAQ,GAAGhG,IAAI,CAACiG,KAAK,CAAEjF,MAAM,CAACiC,MAAM,GAAG7B,WAAW,GAAI,EAAE,CAAC,GAAG,EAAE;MAChE,CAAC,MAAM;QACL;QACA;QACA4E,QAAQ,GAAGhG,IAAI,CAACiG,KAAK,CAAE,IAAI,CAAC/E,aAAa,GAAG,IAAI,CAACD,QAAQ,GAAI,EAAE,CAAC,GAAG,EAAE;MACvE;MACA1B,GAAG,CAACkF,MAAM,wBAAA1E,MAAA,CAAwBiG,QAAQ,CAAE,CAAC;MAC7CrF,UAAU,CAACqF,QAAQ,CAAC;MACpB,IAAI,IAAI,CAACxE,UAAU,IAAIR,MAAM,CAACiC,MAAM,KAAK,IAAI,CAAC9B,MAAM,EAAE;QACpD5B,GAAG,CAACkF,MAAM,CAAC,sBAAsB,CAAC;QAClCnE,eAAe,CAACU,MAAM,CAAC;MACzB;IACF,CAAC,CAAC,CACDkF,KAAK,CAACb,CAAC,IAAI;MACV,IAAI,CAAC,IAAI,CAAC7D,UAAU,IAAIgD,MAAM,EAAE;QAC9BA,MAAM,CAACE,KAAK,CAAC,CAAC;MAChB;MACA9D,OAAO,CAACyE,CAAC,CAAC;IACZ,CAAC,CAAC;EACN;EAEAtD,cAAcA,CAACoE,OAA6B,EAAQ;IAClD;IACA,IAAIA,OAAO,IAAI,IAAI,IAAIA,OAAO,CAACC,IAAI,CAACC,OAAO,IAAI,IAAI,EAAE;MACnD,IAAI,CAAC7E,UAAU,GAAG,IAAI;MACtB;MACA,IAAI,IAAI,CAAC8D,kBAAkB,EAAE;QAC3B,IAAI,CAACE,wBAAwB,CAAC,IAAI,CAAC;MACrC;IACF;EACF;EAEA1D,WAAWA,CAACS,KAAc,EAAQ;IAChC,IAAM;MAAE3B;IAAQ,CAAC,GAAG,IAAI;IACxBA,OAAO,CAAC2B,KAAK,CAAC;EAChB;EAEAP,gBAAgBA,CAACsE,QAA6B,EAAQ;IACpD,IAAI,CAAC7E,WAAW,GAAG6E,QAAQ,CAACC,OAAO;EACrC;AACF;AAACxF,eAAA,CA7TKrB,SAAS,qBAEaoD,UAAkB,IAAe;EACzD,IAAMiC,OAAO,GAAG,EAAE;EAClB,KAAK,IAAIQ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGzC,UAAU,EAAEyC,CAAC,IAAI,CAAC,EAAE;IACtCR,OAAO,CAACyB,IAAI,CAAC9G,SAAS,CAACC,uBAAuB,CAAC4F,CAAC,CAAC,CAAC;EACpD;EACA,OAAOR,OAAO;AAChB,CAAC;AAuTH,eAAerF,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"CsvTypeParser.js","names":["assertNotNull","Papa","NewTableColumnTypes","makeZipStreamHelper","UNKNOWN","MAX_INT","MIN_INT","DATE_TIME_REGEX","LOCAL_TIME_REGEX","CsvTypeParser","determineType","value","type","nullString","STRING","INTEGER","checkInteger","LONG","checkLong","DOUBLE","checkDouble","BOOLEAN","checkBoolean","DATE_TIME","checkDateTime","LOCAL_TIME","checkLocalTime","getTypeFromUnknown","isNotParsableNumber","s","isNaN","noCommas","replace","getNumberType","includes","lower","toLowerCase","test","maxIntLength","startsWith","length","intValue","parseInt","constructor","onFileCompleted","file","readHeaders","parentConfig","onProgress","onError","totalChunks","isZip","shouldTrim","chunks","rowCount","zipProgress","handleChunk","bind","handleComplete","handleError","handleNodeUpdate","config","error","chunk","complete","parse","File","Blob","zipStream","resume","result","parser","data","types","abort","Array","fill","slice","cloneTypes","forEach","row","i","trim","progress","Math","round","isCancelled","results","meta","aborted","map","metadata","percent"],"sources":["../../src/csv/CsvTypeParser.ts"],"sourcesContent":["import type { JSZipObject } from 'jszip';\nimport { assertNotNull } from '@deephaven/utils';\nimport Papa, { Parser, ParseResult, ParseLocalConfig } from 'papaparse';\n// Intentionally using isNaN rather than Number.isNaN\n/* eslint-disable no-restricted-globals */\nimport NewTableColumnTypes from './NewTableColumnTypes';\nimport makeZipStreamHelper from './ZipStreamHelper';\n\n// Initially column types start as unknown\nconst UNKNOWN = 'unknown';\n\nconst MAX_INT = 2147483647;\nconst MIN_INT = -2147483648;\n\nconst DATE_TIME_REGEX =\n /^[0-9]{4}-[0-1][0-9]-[0-3][0-9][ T][0-2][0-9]:[0-5][0-9]:[0-6][0-9](?:\\.[0-9]{1,9})?(?: [a-zA-Z]+)?$/;\nconst LOCAL_TIME_REGEX =\n /^([0-9]+T)?([0-9]+):([0-9]+)(:[0-9]+)?(?:\\.[0-9]{1,9})?$/;\n\n/**\n * Determines the type of each column in a CSV file by parsing it and looking at every value.\n */\nclass CsvTypeParser {\n static determineType(\n value: string,\n type: string,\n nullString: string | null\n ): string {\n if (!value || value === nullString) {\n // A null tells us nothing about the type\n return type;\n }\n\n switch (type) {\n case NewTableColumnTypes.STRING:\n // Strings never get promoted\n return NewTableColumnTypes.STRING;\n case NewTableColumnTypes.INTEGER:\n return CsvTypeParser.checkInteger(value);\n case NewTableColumnTypes.LONG:\n return CsvTypeParser.checkLong(value);\n case NewTableColumnTypes.DOUBLE:\n return CsvTypeParser.checkDouble(value);\n case NewTableColumnTypes.BOOLEAN:\n return CsvTypeParser.checkBoolean(value);\n case NewTableColumnTypes.DATE_TIME:\n return CsvTypeParser.checkDateTime(value);\n case NewTableColumnTypes.LOCAL_TIME:\n return CsvTypeParser.checkLocalTime(value);\n default:\n return CsvTypeParser.getTypeFromUnknown(value);\n }\n }\n\n // Allows for cusomt rules in addition to isNaN\n static isNotParsableNumber(s: string): boolean {\n return (\n isNaN(s as unknown as number) || s === 'Infinity' || s === '-Infinity'\n );\n }\n\n static checkInteger(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n return CsvTypeParser.getNumberType(noCommas);\n }\n\n static checkLong(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n if (noCommas.includes('.')) {\n return NewTableColumnTypes.DOUBLE;\n }\n\n return NewTableColumnTypes.LONG;\n }\n\n static checkDouble(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n return NewTableColumnTypes.DOUBLE;\n }\n\n static checkBoolean(value: string): string {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === 'false') {\n return NewTableColumnTypes.BOOLEAN;\n }\n return NewTableColumnTypes.STRING;\n }\n\n static checkDateTime(value: string): string {\n if (DATE_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.DATE_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n static checkLocalTime(value: string): string {\n if (LOCAL_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.LOCAL_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n static getTypeFromUnknown(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === 'false') {\n return NewTableColumnTypes.BOOLEAN;\n }\n\n if (DATE_TIME_REGEX.test(value) && value.includes(':')) {\n return NewTableColumnTypes.DATE_TIME;\n }\n\n if (LOCAL_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.LOCAL_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n return CsvTypeParser.getNumberType(noCommas);\n }\n\n static getNumberType(value: string): string {\n if (value.includes('.')) {\n return NewTableColumnTypes.DOUBLE;\n }\n\n // Fast length check\n const maxIntLength = value.startsWith('-') ? 11 : 10;\n if (value.length > maxIntLength) {\n return NewTableColumnTypes.LONG;\n }\n\n // Slower parseInt check\n const intValue = parseInt(value, 10);\n if (intValue > MAX_INT || intValue < MIN_INT) {\n return NewTableColumnTypes.LONG;\n }\n\n return NewTableColumnTypes.INTEGER;\n }\n\n constructor(\n onFileCompleted: (types: string[], rowCount: number) => void,\n file: File | Blob | JSZipObject,\n readHeaders: boolean,\n parentConfig: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>,\n nullString: string | null,\n onProgress: (progressValue: number) => boolean,\n onError: (e: unknown) => void,\n totalChunks: number,\n isZip: boolean,\n shouldTrim: boolean\n ) {\n this.onFileCompleted = onFileCompleted;\n this.file = file;\n this.readHeaders = readHeaders;\n this.nullString = nullString;\n this.onProgress = onProgress;\n this.onError = onError;\n this.chunks = 0;\n this.totalChunks = totalChunks;\n this.rowCount = 0;\n this.isZip = isZip;\n this.shouldTrim = shouldTrim;\n this.zipProgress = 0;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n\n this.config = {\n ...parentConfig,\n error: this.handleError,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n };\n }\n\n onFileCompleted: (types: string[], rowCount: number) => void;\n\n file: File | Blob | JSZipObject;\n\n readHeaders: boolean;\n\n nullString: string | null;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n types?: string[];\n\n chunks: number;\n\n totalChunks: number;\n\n rowCount: number;\n\n isZip: boolean;\n\n shouldTrim: boolean;\n\n zipProgress: number;\n\n config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;\n\n parse(): void {\n if (this.file instanceof File || this.file instanceof Blob) {\n Papa.parse(this.file, this.config);\n } else {\n const zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);\n // This is actually a stream, but papaparse TS doesn't like it\n Papa.parse(zipStream as unknown as Blob, this.config);\n // The stream needs to be manually resumed since jszip starts paused\n // Papaparse does not call resume and assumes the stream is already reading\n zipStream.resume();\n }\n }\n\n handleChunk(result: ParseResult<string[]>, parser: Parser): void {\n let { data } = result;\n if (!this.types) {\n if (data == null || data.length === 0) {\n parser.abort();\n this.onError('Error parsing CSV: no data in file.');\n return;\n }\n this.types = new Array(data[0].length).fill(UNKNOWN);\n if (this.readHeaders) {\n // If headers are being read from the file, remove them from type analysis\n data = data.slice(1);\n }\n }\n\n this.rowCount += data.length;\n\n assertNotNull(this.types);\n\n const cloneTypes = [...this.types];\n\n data.forEach(row => {\n if (row.length >= cloneTypes.length) {\n for (let i = 0; i < cloneTypes.length; i += 1) {\n cloneTypes[i] = CsvTypeParser.determineType(\n this.shouldTrim ? row[i].trim() : row[i],\n cloneTypes[i],\n this.nullString\n );\n }\n this.types = cloneTypes;\n } else {\n parser.abort();\n this.onError(\n `Error parsing CSV: Insufficient data in row.\\nExpected length ${cloneTypes.length} but found ${row.length}.\\nRow = ${row}`\n );\n }\n });\n\n this.chunks += 1;\n // 50 because the type parsing accounts for 50% of the parsing\n let progress = 0;\n if (this.totalChunks > 0) {\n progress = Math.round((this.chunks / this.totalChunks) * 50);\n } else {\n progress = Math.round(this.zipProgress / 2);\n }\n const isCancelled = this.onProgress(progress);\n if (isCancelled) {\n parser.abort();\n }\n }\n\n handleComplete(results: ParseResult<unknown>): void {\n const { types, onFileCompleted } = this;\n // results is undefined for a succesful parse, but has meta data for an abort\n assertNotNull(types);\n if (results == null || !results.meta.aborted) {\n onFileCompleted(\n types.map(type =>\n // If the type is still unknown or a local time, just map it to a string.\n // Local times are not supported by the backend in DHC, and probably should have more context to parse safely anyway (such as a date or a time zone).\n // In these cases, we just map it to a string, and the user can use an `.update_view` later if they want to parse it into a different type.\n type === UNKNOWN || type === NewTableColumnTypes.LOCAL_TIME\n ? NewTableColumnTypes.STRING\n : type\n ),\n this.rowCount\n );\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvTypeParser;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CsvTypeParser.js","names":["assertNotNull","Papa","NewTableColumnTypes","makeZipStreamHelper","UNKNOWN","MAX_INT","MIN_INT","DATE_TIME_REGEX","LOCAL_TIME_REGEX","CsvTypeParser","determineType","value","type","nullString","STRING","INTEGER","checkInteger","LONG","checkLong","DOUBLE","checkDouble","BOOLEAN","checkBoolean","DATE_TIME","checkDateTime","LOCAL_TIME","checkLocalTime","getTypeFromUnknown","isNotParsableNumber","s","isNaN","noCommas","replace","getNumberType","includes","lower","toLowerCase","test","maxIntLength","startsWith","length","intValue","parseInt","constructor","onFileCompleted","file","readHeaders","parentConfig","onProgress","onError","totalChunks","isZip","shouldTrim","_defineProperty","chunks","rowCount","zipProgress","handleChunk","bind","handleComplete","handleError","handleNodeUpdate","config","_objectSpread","error","chunk","complete","parse","File","Blob","zipStream","resume","result","parser","data","types","abort","Array","fill","slice","cloneTypes","forEach","row","i","trim","concat","progress","Math","round","isCancelled","results","meta","aborted","map","metadata","percent"],"sources":["../../src/csv/CsvTypeParser.ts"],"sourcesContent":["import type { JSZipObject } from 'jszip';\nimport { assertNotNull } from '@deephaven/utils';\nimport Papa, { Parser, ParseResult, ParseLocalConfig } from 'papaparse';\n// Intentionally using isNaN rather than Number.isNaN\n/* eslint-disable no-restricted-globals */\nimport NewTableColumnTypes from './NewTableColumnTypes';\nimport makeZipStreamHelper from './ZipStreamHelper';\n\n// Initially column types start as unknown\nconst UNKNOWN = 'unknown';\n\nconst MAX_INT = 2147483647;\nconst MIN_INT = -2147483648;\n\nconst DATE_TIME_REGEX =\n /^[0-9]{4}-[0-1][0-9]-[0-3][0-9][ T][0-2][0-9]:[0-5][0-9]:[0-6][0-9](?:\\.[0-9]{1,9})?(?: [a-zA-Z]+)?$/;\nconst LOCAL_TIME_REGEX =\n /^([0-9]+T)?([0-9]+):([0-9]+)(:[0-9]+)?(?:\\.[0-9]{1,9})?$/;\n\n/**\n * Determines the type of each column in a CSV file by parsing it and looking at every value.\n */\nclass CsvTypeParser {\n static determineType(\n value: string,\n type: string,\n nullString: string | null\n ): string {\n if (!value || value === nullString) {\n // A null tells us nothing about the type\n return type;\n }\n\n switch (type) {\n case NewTableColumnTypes.STRING:\n // Strings never get promoted\n return NewTableColumnTypes.STRING;\n case NewTableColumnTypes.INTEGER:\n return CsvTypeParser.checkInteger(value);\n case NewTableColumnTypes.LONG:\n return CsvTypeParser.checkLong(value);\n case NewTableColumnTypes.DOUBLE:\n return CsvTypeParser.checkDouble(value);\n case NewTableColumnTypes.BOOLEAN:\n return CsvTypeParser.checkBoolean(value);\n case NewTableColumnTypes.DATE_TIME:\n return CsvTypeParser.checkDateTime(value);\n case NewTableColumnTypes.LOCAL_TIME:\n return CsvTypeParser.checkLocalTime(value);\n default:\n return CsvTypeParser.getTypeFromUnknown(value);\n }\n }\n\n // Allows for cusomt rules in addition to isNaN\n static isNotParsableNumber(s: string): boolean {\n return (\n isNaN(s as unknown as number) || s === 'Infinity' || s === '-Infinity'\n );\n }\n\n static checkInteger(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n return CsvTypeParser.getNumberType(noCommas);\n }\n\n static checkLong(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n if (noCommas.includes('.')) {\n return NewTableColumnTypes.DOUBLE;\n }\n\n return NewTableColumnTypes.LONG;\n }\n\n static checkDouble(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n return NewTableColumnTypes.DOUBLE;\n }\n\n static checkBoolean(value: string): string {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === 'false') {\n return NewTableColumnTypes.BOOLEAN;\n }\n return NewTableColumnTypes.STRING;\n }\n\n static checkDateTime(value: string): string {\n if (DATE_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.DATE_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n static checkLocalTime(value: string): string {\n if (LOCAL_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.LOCAL_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n static getTypeFromUnknown(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === 'false') {\n return NewTableColumnTypes.BOOLEAN;\n }\n\n if (DATE_TIME_REGEX.test(value) && value.includes(':')) {\n return NewTableColumnTypes.DATE_TIME;\n }\n\n if (LOCAL_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.LOCAL_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n return CsvTypeParser.getNumberType(noCommas);\n }\n\n static getNumberType(value: string): string {\n if (value.includes('.')) {\n return NewTableColumnTypes.DOUBLE;\n }\n\n // Fast length check\n const maxIntLength = value.startsWith('-') ? 11 : 10;\n if (value.length > maxIntLength) {\n return NewTableColumnTypes.LONG;\n }\n\n // Slower parseInt check\n const intValue = parseInt(value, 10);\n if (intValue > MAX_INT || intValue < MIN_INT) {\n return NewTableColumnTypes.LONG;\n }\n\n return NewTableColumnTypes.INTEGER;\n }\n\n constructor(\n onFileCompleted: (types: string[], rowCount: number) => void,\n file: File | Blob | JSZipObject,\n readHeaders: boolean,\n parentConfig: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>,\n nullString: string | null,\n onProgress: (progressValue: number) => boolean,\n onError: (e: unknown) => void,\n totalChunks: number,\n isZip: boolean,\n shouldTrim: boolean\n ) {\n this.onFileCompleted = onFileCompleted;\n this.file = file;\n this.readHeaders = readHeaders;\n this.nullString = nullString;\n this.onProgress = onProgress;\n this.onError = onError;\n this.chunks = 0;\n this.totalChunks = totalChunks;\n this.rowCount = 0;\n this.isZip = isZip;\n this.shouldTrim = shouldTrim;\n this.zipProgress = 0;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n\n this.config = {\n ...parentConfig,\n error: this.handleError,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n };\n }\n\n onFileCompleted: (types: string[], rowCount: number) => void;\n\n file: File | Blob | JSZipObject;\n\n readHeaders: boolean;\n\n nullString: string | null;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n types?: string[];\n\n chunks: number;\n\n totalChunks: number;\n\n rowCount: number;\n\n isZip: boolean;\n\n shouldTrim: boolean;\n\n zipProgress: number;\n\n config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;\n\n parse(): void {\n if (this.file instanceof File || this.file instanceof Blob) {\n Papa.parse(this.file, this.config);\n } else {\n const zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);\n // This is actually a stream, but papaparse TS doesn't like it\n Papa.parse(zipStream as unknown as Blob, this.config);\n // The stream needs to be manually resumed since jszip starts paused\n // Papaparse does not call resume and assumes the stream is already reading\n zipStream.resume();\n }\n }\n\n handleChunk(result: ParseResult<string[]>, parser: Parser): void {\n let { data } = result;\n if (!this.types) {\n if (data == null || data.length === 0) {\n parser.abort();\n this.onError('Error parsing CSV: no data in file.');\n return;\n }\n this.types = new Array(data[0].length).fill(UNKNOWN);\n if (this.readHeaders) {\n // If headers are being read from the file, remove them from type analysis\n data = data.slice(1);\n }\n }\n\n this.rowCount += data.length;\n\n assertNotNull(this.types);\n\n const cloneTypes = [...this.types];\n\n data.forEach(row => {\n if (row.length >= cloneTypes.length) {\n for (let i = 0; i < cloneTypes.length; i += 1) {\n cloneTypes[i] = CsvTypeParser.determineType(\n this.shouldTrim ? row[i].trim() : row[i],\n cloneTypes[i],\n this.nullString\n );\n }\n this.types = cloneTypes;\n } else {\n parser.abort();\n this.onError(\n `Error parsing CSV: Insufficient data in row.\\nExpected length ${cloneTypes.length} but found ${row.length}.\\nRow = ${row}`\n );\n }\n });\n\n this.chunks += 1;\n // 50 because the type parsing accounts for 50% of the parsing\n let progress = 0;\n if (this.totalChunks > 0) {\n progress = Math.round((this.chunks / this.totalChunks) * 50);\n } else {\n progress = Math.round(this.zipProgress / 2);\n }\n const isCancelled = this.onProgress(progress);\n if (isCancelled) {\n parser.abort();\n }\n }\n\n handleComplete(results: ParseResult<unknown>): void {\n const { types, onFileCompleted } = this;\n // results is undefined for a succesful parse, but has meta data for an abort\n assertNotNull(types);\n if (results == null || !results.meta.aborted) {\n onFileCompleted(\n types.map(type =>\n // If the type is still unknown or a local time, just map it to a string.\n // Local times are not supported by the backend in DHC, and probably should have more context to parse safely anyway (such as a date or a time zone).\n // In these cases, we just map it to a string, and the user can use an `.update_view` later if they want to parse it into a different type.\n type === UNKNOWN || type === NewTableColumnTypes.LOCAL_TIME\n ? NewTableColumnTypes.STRING\n : type\n ),\n this.rowCount\n );\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvTypeParser;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NewTableColumnTypes.js","names":["NewTableColumnTypes"],"sources":["../../src/csv/NewTableColumnTypes.ts"],"sourcesContent":["/**\n * Valid column types to be used for a call to newTable.\n */\nclass NewTableColumnTypes {\n static INTEGER = 'int';\n\n static LONG = 'long';\n\n static DOUBLE = 'double';\n\n static BOOLEAN = 'bool';\n\n static STRING = 'string';\n\n static DATE_TIME = 'datetime';\n\n static LOCAL_TIME = 'localtime';\n}\n\nexport default NewTableColumnTypes;\n"],"mappings":";;;AAAA;AACA;AACA;AACA,MAAMA,mBAAmB,CAAC;AAczB,gBAdKA,mBAAmB,aACN,KAAK;AAAA,gBADlBA,mBAAmB,UAGT,MAAM;AAAA,gBAHhBA,mBAAmB,YAKP,QAAQ;AAAA,gBALpBA,mBAAmB,aAON,MAAM;AAAA,gBAPnBA,mBAAmB,YASP,QAAQ;AAAA,gBATpBA,mBAAmB,eAWJ,UAAU;AAAA,gBAXzBA,mBAAmB,gBAaH,WAAW;AAGjC,eAAeA,mBAAmB"}
1
+ {"version":3,"file":"NewTableColumnTypes.js","names":["NewTableColumnTypes","_defineProperty"],"sources":["../../src/csv/NewTableColumnTypes.ts"],"sourcesContent":["/**\n * Valid column types to be used for a call to newTable.\n */\nclass NewTableColumnTypes {\n static INTEGER = 'int';\n\n static LONG = 'long';\n\n static DOUBLE = 'double';\n\n static BOOLEAN = 'bool';\n\n static STRING = 'string';\n\n static DATE_TIME = 'datetime';\n\n static LOCAL_TIME = 'localtime';\n}\n\nexport default NewTableColumnTypes;\n"],"mappings":";;;AAAA;AACA;AACA;AACA,MAAMA,mBAAmB,CAAC;AAczBC,eAAA,CAdKD,mBAAmB,aACN,KAAK;AAAAC,eAAA,CADlBD,mBAAmB,UAGT,MAAM;AAAAC,eAAA,CAHhBD,mBAAmB,YAKP,QAAQ;AAAAC,eAAA,CALpBD,mBAAmB,aAON,MAAM;AAAAC,eAAA,CAPnBD,mBAAmB,YASP,QAAQ;AAAAC,eAAA,CATpBD,mBAAmB,eAWJ,UAAU;AAAAC,eAAA,CAXzBD,mBAAmB,gBAaH,WAAW;AAGjC,eAAeA,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ZipStreamHelper.js","names":["makeZipStreamHelper","zipObj","onUpdate","helper","internalStream","readable","read","removeListener","on","_","metadata"],"sources":["../../src/csv/ZipStreamHelper.ts"],"sourcesContent":["import type { JSZipObject, OnUpdateCallback, JSZipStreamHelper } from 'jszip';\n\n/**\n * This is used to help papaparse understand our stream.\n * It uses these fields for feature detection, but never actually calls read()\n * https://github.com/mholt/PapaParse/blob/master/papaparse.js#L244\n */\ninterface ZipStreamHelper extends JSZipStreamHelper<string> {\n readable: boolean;\n read(): void;\n removeListener(): void;\n}\n\nexport default function makeZipStreamHelper(\n zipObj: JSZipObject,\n onUpdate: OnUpdateCallback\n): ZipStreamHelper {\n const helper: ZipStreamHelper = (\n zipObj as JSZipObject & {\n // The type could be anything except nodebuffer from https://stuk.github.io/jszip/documentation/api_zipobject/internal_stream.html\n // We only need it as a string though\n // JSZip types don't include this method for some reason\n internalStream(type: 'string'): JSZipStreamHelper<string>;\n }\n ).internalStream('string') as ZipStreamHelper;\n\n helper.readable = true;\n helper.read = () => false;\n helper.removeListener = () => false;\n helper.on('data', (_, metadata) => onUpdate(metadata));\n\n return helper;\n}\n"],"mappings":"AAEA;AACA;AACA;AACA;AACA;;AAOA,eAAe,SAASA,mBAAmB,CACzCC,MAAmB,EACnBC,QAA0B,EACT;EACjB,IAAMC,MAAuB,GAC3BF,MAAM,CAMNG,cAAc,CAAC,QAAQ,CAAoB;EAE7CD,MAAM,CAACE,QAAQ,GAAG,IAAI;EACtBF,MAAM,CAACG,IAAI,GAAG,MAAM,KAAK;EACzBH,MAAM,CAACI,cAAc,GAAG,MAAM,KAAK;EACnCJ,MAAM,CAACK,EAAE,CAAC,MAAM,EAAE,CAACC,CAAC,EAAEC,QAAQ,KAAKR,QAAQ,CAACQ,QAAQ,CAAC,CAAC;EAEtD,OAAOP,MAAM;AACf"}
1
+ {"version":3,"file":"ZipStreamHelper.js","names":["makeZipStreamHelper","zipObj","onUpdate","helper","internalStream","readable","read","removeListener","on","_","metadata"],"sources":["../../src/csv/ZipStreamHelper.ts"],"sourcesContent":["import type { JSZipObject, OnUpdateCallback, JSZipStreamHelper } from 'jszip';\n\n/**\n * This is used to help papaparse understand our stream.\n * It uses these fields for feature detection, but never actually calls read()\n * https://github.com/mholt/PapaParse/blob/master/papaparse.js#L244\n */\ninterface ZipStreamHelper extends JSZipStreamHelper<string> {\n readable: boolean;\n read(): void;\n removeListener(): void;\n}\n\nexport default function makeZipStreamHelper(\n zipObj: JSZipObject,\n onUpdate: OnUpdateCallback\n): ZipStreamHelper {\n const helper: ZipStreamHelper = (\n zipObj as JSZipObject & {\n // The type could be anything except nodebuffer from https://stuk.github.io/jszip/documentation/api_zipobject/internal_stream.html\n // We only need it as a string though\n // JSZip types don't include this method for some reason\n internalStream(type: 'string'): JSZipStreamHelper<string>;\n }\n ).internalStream('string') as ZipStreamHelper;\n\n helper.readable = true;\n helper.read = () => false;\n helper.removeListener = () => false;\n helper.on('data', (_, metadata) => onUpdate(metadata));\n\n return helper;\n}\n"],"mappings":"AAEA;AACA;AACA;AACA;AACA;;AAOA,eAAe,SAASA,mBAAmBA,CACzCC,MAAmB,EACnBC,QAA0B,EACT;EACjB,IAAMC,MAAuB,GAC3BF,MAAM,CAMNG,cAAc,CAAC,QAAQ,CAAoB;EAE7CD,MAAM,CAACE,QAAQ,GAAG,IAAI;EACtBF,MAAM,CAACG,IAAI,GAAG,MAAM,KAAK;EACzBH,MAAM,CAACI,cAAc,GAAG,MAAM,KAAK;EACnCJ,MAAM,CAACK,EAAE,CAAC,MAAM,EAAE,CAACC,CAAC,EAAEC,QAAQ,KAAKR,QAAQ,CAACQ,QAAQ,CAAC,CAAC;EAEtD,OAAOP,MAAM;AACf"}
@@ -1 +1 @@
1
- {"version":3,"file":"LogLevelMenuItem.js","names":["React","PureComponent","classNames","UISwitch","LogLevelMenuItem","constructor","props","handleSwitchClick","bind","logLevel","onClick","render","on"],"sources":["../../src/log/LogLevelMenuItem.tsx"],"sourcesContent":["// Port of https://github.com/react-bootstrap/react-bootstrap/blob/master/src/Collapse.js\nimport React, { PureComponent, ReactElement } from 'react';\nimport classNames from 'classnames';\nimport { UISwitch } from '@deephaven/components';\nimport './LogLevelMenuItem.scss';\n\ninterface LogLevelMenuItemProps {\n logLevel: string;\n on: boolean;\n onClick: (logLevel: string) => void;\n}\n\nclass LogLevelMenuItem extends PureComponent<\n LogLevelMenuItemProps,\n Record<string, never>\n> {\n constructor(props: LogLevelMenuItemProps) {\n super(props);\n\n this.handleSwitchClick = this.handleSwitchClick.bind(this);\n }\n\n handleSwitchClick(): void {\n const { logLevel, onClick } = this.props;\n onClick(logLevel);\n }\n\n render(): ReactElement {\n const { logLevel, on } = this.props;\n return (\n <div className={classNames('log-level-menu-item', logLevel)}>\n <UISwitch on={on} onClick={this.handleSwitchClick} />\n {logLevel}\n </div>\n );\n }\n}\n\nexport default LogLevelMenuItem;\n"],"mappings":"AAAA;AACA,OAAOA,KAAK,IAAIC,aAAa,QAAsB,OAAO;AAC1D,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,QAAQ,QAAQ,uBAAuB;AAAC;AAAA;AAAA;AASjD,MAAMC,gBAAgB,SAASH,aAAa,CAG1C;EACAI,WAAW,CAACC,KAA4B,EAAE;IACxC,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAAC;EAC5D;EAEAD,iBAAiB,GAAS;IACxB,IAAM;MAAEE,QAAQ;MAAEC;IAAQ,CAAC,GAAG,IAAI,CAACJ,KAAK;IACxCI,OAAO,CAACD,QAAQ,CAAC;EACnB;EAEAE,MAAM,GAAiB;IACrB,IAAM;MAAEF,QAAQ;MAAEG;IAAG,CAAC,GAAG,IAAI,CAACN,KAAK;IACnC,oBACE;MAAK,SAAS,EAAEJ,UAAU,CAAC,qBAAqB,EAAEO,QAAQ,CAAE;MAAA,wBAC1D,KAAC,QAAQ;QAAC,EAAE,EAAEG,EAAG;QAAC,OAAO,EAAE,IAAI,CAACL;MAAkB,EAAG,EACpDE,QAAQ;IAAA,EACL;EAEV;AACF;AAEA,eAAeL,gBAAgB"}
1
+ {"version":3,"file":"LogLevelMenuItem.js","names":["React","PureComponent","classNames","UISwitch","jsx","_jsx","jsxs","_jsxs","LogLevelMenuItem","constructor","props","handleSwitchClick","bind","logLevel","onClick","render","on","className","children"],"sources":["../../src/log/LogLevelMenuItem.tsx"],"sourcesContent":["// Port of https://github.com/react-bootstrap/react-bootstrap/blob/master/src/Collapse.js\nimport React, { PureComponent, ReactElement } from 'react';\nimport classNames from 'classnames';\nimport { UISwitch } from '@deephaven/components';\nimport './LogLevelMenuItem.scss';\n\ninterface LogLevelMenuItemProps {\n logLevel: string;\n on: boolean;\n onClick: (logLevel: string) => void;\n}\n\nclass LogLevelMenuItem extends PureComponent<\n LogLevelMenuItemProps,\n Record<string, never>\n> {\n constructor(props: LogLevelMenuItemProps) {\n super(props);\n\n this.handleSwitchClick = this.handleSwitchClick.bind(this);\n }\n\n handleSwitchClick(): void {\n const { logLevel, onClick } = this.props;\n onClick(logLevel);\n }\n\n render(): ReactElement {\n const { logLevel, on } = this.props;\n return (\n <div className={classNames('log-level-menu-item', logLevel)}>\n <UISwitch on={on} onClick={this.handleSwitchClick} />\n {logLevel}\n </div>\n );\n }\n}\n\nexport default LogLevelMenuItem;\n"],"mappings":"AAAA;AACA,OAAOA,KAAK,IAAIC,aAAa,QAAsB,OAAO;AAC1D,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,QAAQ,QAAQ,uBAAuB;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AASjD,MAAMC,gBAAgB,SAASP,aAAa,CAG1C;EACAQ,WAAWA,CAACC,KAA4B,EAAE;IACxC,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAAC;EAC5D;EAEAD,iBAAiBA,CAAA,EAAS;IACxB,IAAM;MAAEE,QAAQ;MAAEC;IAAQ,CAAC,GAAG,IAAI,CAACJ,KAAK;IACxCI,OAAO,CAACD,QAAQ,CAAC;EACnB;EAEAE,MAAMA,CAAA,EAAiB;IACrB,IAAM;MAAEF,QAAQ;MAAEG;IAAG,CAAC,GAAG,IAAI,CAACN,KAAK;IACnC,oBACEH,KAAA;MAAKU,SAAS,EAAEf,UAAU,CAAC,qBAAqB,EAAEW,QAAQ,CAAE;MAAAK,QAAA,gBAC1Db,IAAA,CAACF,QAAQ;QAACa,EAAE,EAAEA,EAAG;QAACF,OAAO,EAAE,IAAI,CAACH;MAAkB,CAAE,CAAC,EACpDE,QAAQ;IAAA,CACN,CAAC;EAEV;AACF;AAEA,eAAeL,gBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"LogView.js","names":["React","PureComponent","Button","DropdownMenu","vsGear","dhTrashUndo","assertNotNull","monaco","ConsoleUtils","LogLevel","LogLevelMenuItem","MonacoUtils","LogView","getLogText","logItem","date","Date","micros","timestamp","formatTimestamp","logLevel","message","constructor","props","handleClearClick","bind","handleFlushTimeout","handleLogMessage","handleMenuItemClick","handleResetClick","handleResize","handleToggleAllClick","logLevelMenuItems","editorContainer","bufferedMessages","messages","state","shownLogLevels","componentDidMount","resetLogLevels","initMonaco","startListening","window","addEventListener","componentDidUpdate","prevProps","prevState","updateDimensions","refreshLogText","session","stopListening","clearLogs","componentWillUnmount","stopFlushTimer","destroyMonaco","removeEventListener","getMenuActions","actions","push","menuElement","group","order","AllLogLevels","i","on","title","element","length","isEnabled","DefaultLogLevels","some","level","setState","cancelListener","onLogMessage","undefined","editor","create","copyWithSyntaxHighlighting","fixedOverflowWidgets","folding","fontFamily","glyphMargin","language","lineDecorationsWidth","lineNumbers","lineNumbersMinChars","minimap","enabled","readOnly","renderLineHighlight","scrollBeyondLastLine","value","wordWrap","KeyCode","Escape","KeyMod","Shift","forEach","keybindings","disableKeyBindings","addAction","id","label","keybindingContext","run","position","getPosition","setPosition","dispose","triggerFindWidget","focus","trigger","toggleAll","isAllEnabled","updatedLogLevels","toggleLogLevel","updateLogLevels","appendLogText","text","model","getModel","line","getLineCount","column","getLineLength","isBottomVisible","edits","range","startLineNumber","startColumn","endLineNumber","endColumn","forceMoveMarkers","applyEdits","lineCount","revealLine","truncateLogIfNecessary","logText","charAt","trimRight","setValue","maxLogSize","splice","truncateSize","scrollToBottom","isLineVisible","visibleRanges","getVisibleRanges","isLogItemVisible","flush","queue","flushTimer","setTimeout","bufferTimeout","clearTimeout","layout","render","popperOptions","placement","STDOUT","ERROR","FATAL","STDERR","WARN","INFO","DEBUG","TRACE"],"sources":["../../src/log/LogView.tsx"],"sourcesContent":["import React, { PureComponent, ReactElement } from 'react';\nimport { Button, DropdownActions, DropdownMenu } from '@deephaven/components';\nimport { vsGear, dhTrashUndo } from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\nimport type { IdeSession, LogItem } from '@deephaven/jsapi-types';\nimport { Placement } from 'popper.js';\nimport * as monaco from 'monaco-editor';\nimport ConsoleUtils from '../common/ConsoleUtils';\nimport LogLevel from './LogLevel';\nimport './LogView.scss';\nimport LogLevelMenuItem from './LogLevelMenuItem';\nimport { MonacoUtils } from '../monaco';\n\ninterface LogViewProps {\n session: IdeSession;\n}\n\ninterface LogViewState {\n shownLogLevels: Record<string, boolean>;\n}\n/**\n * Log view contents. Uses a monaco editor to display/search the contents of the log.\n */\nclass LogView extends PureComponent<LogViewProps, LogViewState> {\n static DefaultLogLevels = [\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n ];\n\n static AllLogLevels = [\n LogLevel.INFO,\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n LogLevel.DEBUG,\n LogLevel.TRACE,\n ];\n\n /** ms to buffer log messages before processing them */\n static bufferTimeout = 16;\n\n /** Maximum number of messages to store in the log */\n static maxLogSize = 131072;\n\n static truncateSize = 65536;\n\n static getLogText(logItem: LogItem): string {\n const date = new Date(logItem.micros / 1000);\n const timestamp = ConsoleUtils.formatTimestamp(date);\n return `${timestamp} ${logItem.logLevel} ${logItem.message}`;\n }\n\n constructor(props: LogViewProps) {\n super(props);\n\n this.handleClearClick = this.handleClearClick.bind(this);\n this.handleFlushTimeout = this.handleFlushTimeout.bind(this);\n this.handleLogMessage = this.handleLogMessage.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleResetClick = this.handleResetClick.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleToggleAllClick = this.handleToggleAllClick.bind(this);\n\n this.logLevelMenuItems = {};\n\n this.editorContainer = null;\n\n this.bufferedMessages = [];\n this.messages = [];\n\n this.state = {\n shownLogLevels: {},\n };\n }\n\n componentDidMount(): void {\n this.resetLogLevels();\n this.initMonaco();\n this.startListening();\n\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(prevProps: LogViewProps, prevState: LogViewState): void {\n this.updateDimensions();\n\n const { shownLogLevels } = this.state;\n if (prevState.shownLogLevels !== shownLogLevels) {\n this.refreshLogText();\n }\n\n const { session } = this.props;\n if (prevProps.session !== session) {\n this.stopListening();\n this.startListening();\n // clear logs when starting a new console\n this.clearLogs();\n }\n }\n\n componentWillUnmount(): void {\n this.stopFlushTimer();\n this.stopListening();\n this.destroyMonaco();\n\n window.removeEventListener('resize', this.handleResize);\n }\n\n cancelListener?: () => void | null;\n\n editor?: monaco.editor.IStandaloneCodeEditor;\n\n editorContainer: HTMLDivElement | null;\n\n logLevelMenuItems: Record<string, LogLevelMenuItem>;\n\n flushTimer?: ReturnType<typeof setTimeout>;\n\n bufferedMessages: LogItem[];\n\n messages: LogItem[];\n\n getMenuActions(shownLogLevels: Record<string, boolean>): DropdownActions {\n const actions = [];\n\n actions.push({\n menuElement: (\n <div className=\"log-level-menu-title\">Display Log Levels</div>\n ),\n group: 1,\n order: 10,\n });\n\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const on =\n shownLogLevels[logLevel] != null ? shownLogLevels[logLevel] : false;\n actions.push({\n title: logLevel,\n group: 1,\n order: i + 100,\n\n menuElement: (\n <LogLevelMenuItem\n logLevel={logLevel}\n on={on}\n onClick={this.handleMenuItemClick}\n ref={element => {\n if (element != null) {\n this.logLevelMenuItems[logLevel] = element;\n }\n }}\n />\n ),\n });\n }\n\n actions.push({\n group: 1,\n order: 1000,\n menuElement: (\n <div className=\"log-level-menu-controls\">\n <Button\n kind=\"ghost\"\n className=\"log-level-toggle-all\"\n onClick={this.handleToggleAllClick}\n >\n Toggle All\n </Button>\n <Button kind=\"ghost\" onClick={this.handleResetClick}>\n Reset\n </Button>\n </div>\n ),\n });\n\n return actions;\n }\n\n resetLogLevels(): void {\n const shownLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const isEnabled = LogView.DefaultLogLevels.some(\n level => level === logLevel\n );\n shownLogLevels[logLevel] = isEnabled;\n }\n\n this.setState({ shownLogLevels });\n }\n\n startListening(): void {\n const { session } = this.props;\n this.cancelListener = session.onLogMessage(this.handleLogMessage);\n }\n\n stopListening(): void {\n if (this.cancelListener != null) {\n this.cancelListener();\n this.cancelListener = undefined;\n }\n }\n\n initMonaco(): void {\n assertNotNull(this.editorContainer);\n this.editor = monaco.editor.create(this.editorContainer, {\n copyWithSyntaxHighlighting: false,\n fixedOverflowWidgets: true,\n folding: false,\n fontFamily: 'Fira Mono',\n glyphMargin: false,\n language: 'log',\n lineDecorationsWidth: 0,\n lineNumbers: 'off',\n lineNumbersMinChars: 0,\n minimap: { enabled: false },\n readOnly: true,\n renderLineHighlight: 'none',\n scrollBeyondLastLine: false,\n value: '',\n wordWrap: 'on',\n });\n\n // Override default Monaco keybindings for `escape` and `shift-escape`\n [\n [monaco.KeyCode.Escape],\n [monaco.KeyMod.Shift | monaco.KeyCode.Escape], // eslint-disable-line no-bitwise\n ].forEach(keybindings => {\n assertNotNull(this.editor);\n\n // Monaco default behavior is for escape key to close the find widget.\n // Instead, capture it and do nothing. Same for shift-escape.\n MonacoUtils.disableKeyBindings(this.editor, keybindings);\n\n // Restore regular escape to clear selection, when editorText has focus.\n this.editor.addAction({\n id: 'clear-selection-on-escape',\n label: '',\n keybindings: [monaco.KeyCode.Escape],\n keybindingContext: 'findWidgetVisible && editorTextFocus',\n run: () => {\n const position = this.editor?.getPosition();\n assertNotNull(position);\n this.editor?.setPosition(position);\n },\n });\n });\n }\n\n destroyMonaco(): void {\n if (this.editor) {\n this.editor.dispose();\n this.editor = undefined;\n }\n }\n\n triggerFindWidget(): void {\n // The actions.find action can no longer be triggered when the editor is not in focus, with monaco 0.22.x.\n // As a workaround, just focus the editor before triggering the action\n // https://github.com/microsoft/monaco-editor/issues/2355\n this.editor?.focus();\n this.editor?.trigger('keyboard', 'actions.find', undefined);\n }\n\n toggleAll(): void {\n const { shownLogLevels } = this.state;\n let isAllEnabled = true;\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n if (!shownLogLevels[logLevel]) {\n isAllEnabled = false;\n break;\n }\n }\n\n if (isAllEnabled) {\n this.setState({ shownLogLevels: {} });\n } else {\n const updatedLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n updatedLogLevels[logLevel] = true;\n }\n this.setState({ shownLogLevels: updatedLogLevels });\n }\n }\n\n toggleLogLevel(logLevel: string): void {\n const { shownLogLevels } = this.state;\n const isEnabled = shownLogLevels[logLevel];\n const updatedLogLevels: Record<string, boolean> = {};\n updatedLogLevels[logLevel] = !isEnabled;\n this.updateLogLevels(updatedLogLevels);\n }\n\n updateLogLevels(updatedLogLevels: Record<string, boolean>): void {\n let { shownLogLevels } = this.state;\n shownLogLevels = { ...shownLogLevels, ...updatedLogLevels };\n this.setState({ shownLogLevels });\n }\n\n appendLogText(text: string): void {\n if (!this.editor) {\n return;\n }\n\n const model = this.editor.getModel();\n let line = model?.getLineCount();\n assertNotNull(line);\n let column = model?.getLineLength(line);\n assertNotNull(column);\n const isBottomVisible = this.isBottomVisible();\n\n const edits = [];\n if (column > 0) {\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column + 1,\n endLineNumber: line,\n endColumn: column + 1,\n },\n text: '\\n',\n forceMoveMarkers: true,\n });\n line += 1;\n column = 0;\n }\n\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column,\n endLineNumber: line,\n endColumn: column,\n },\n text,\n forceMoveMarkers: true,\n });\n\n model?.applyEdits(edits);\n\n if (isBottomVisible) {\n const lineCount = model?.getLineCount();\n assertNotNull(lineCount);\n this.editor.revealLine(lineCount, 1);\n }\n }\n\n /**\n * Refresh the contents of the log component with the updated filter text\n */\n refreshLogText(): void {\n if (!this.editor) {\n return;\n }\n\n this.truncateLogIfNecessary();\n\n const { shownLogLevels } = this.state;\n const isBottomVisible = this.isBottomVisible();\n\n let text = '';\n for (let i = 0; i < this.messages.length; i += 1) {\n const message = this.messages[i];\n if (shownLogLevels[message.logLevel]) {\n const logText = LogView.getLogText(message);\n if (logText.length > 0) {\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n }\n }\n text = text.trimRight();\n\n this.editor.setValue(text);\n\n if (isBottomVisible) {\n const line = this.editor.getModel()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n this.stopFlushTimer();\n this.bufferedMessages = [];\n }\n\n truncateLogIfNecessary(): void {\n if (this.messages.length > LogView.maxLogSize) {\n this.messages = this.messages.splice(\n this.messages.length - LogView.truncateSize\n );\n }\n }\n\n scrollToBottom(): void {\n if (!this.editor) {\n return;\n }\n\n const line = this.editor?.getModel?.()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n isBottomVisible(): boolean {\n if (!this.editor) {\n return true;\n }\n\n const model = this.editor.getModel();\n const line = model?.getLineCount();\n\n assertNotNull(line);\n return this.isLineVisible(line);\n }\n\n isLineVisible(line: number): boolean {\n const visibleRanges = this.editor?.getVisibleRanges();\n if (visibleRanges == null || visibleRanges.length === 0) {\n return false;\n }\n\n for (let i = 0; i < visibleRanges.length; i += 1) {\n const range = visibleRanges[i];\n if (range.startLineNumber <= line && line <= range.endLineNumber) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Checks if the given log message is visible with the current filters */\n isLogItemVisible(message: LogItem): boolean {\n const { shownLogLevels } = this.state;\n return shownLogLevels[message.logLevel];\n }\n\n flush(): void {\n let text = '';\n for (let i = 0; i < this.bufferedMessages.length; i += 1) {\n const message = this.bufferedMessages[i];\n const logText = LogView.getLogText(message);\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n\n this.bufferedMessages = [];\n\n this.appendLogText(text);\n }\n\n queue(message: LogItem): void {\n this.bufferedMessages.push(message);\n if (this.bufferedMessages.length === 1) {\n this.flushTimer = setTimeout(\n this.handleFlushTimeout,\n LogView.bufferTimeout\n );\n }\n }\n\n stopFlushTimer(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = undefined;\n }\n }\n\n updateDimensions(): void {\n if (this.editor) {\n this.editor.layout();\n }\n }\n\n handleClearClick(): void {\n this.clearLogs();\n }\n\n clearLogs(): void {\n this.messages = [];\n this.refreshLogText();\n }\n\n handleFlushTimeout(): void {\n this.stopFlushTimer();\n this.flush();\n }\n\n handleLogMessage(message: LogItem): void {\n this.messages.push(message);\n\n if (this.editor && this.isLogItemVisible(message)) {\n this.queue(message);\n }\n }\n\n handleMenuItemClick(logLevel: string): void {\n this.toggleLogLevel(logLevel);\n }\n\n handleResetClick(): void {\n this.resetLogLevels();\n }\n\n handleResize(): void {\n this.updateDimensions();\n }\n\n handleToggleAllClick(): void {\n this.toggleAll();\n }\n\n render(): ReactElement {\n const popperOptions = { placement: 'bottom-end' as Placement };\n const { shownLogLevels } = this.state;\n const actions = this.getMenuActions(shownLogLevels);\n return (\n <div className=\"log-pane h-100 w-100\">\n <div className=\"log-pane-menu\">\n <Button\n kind=\"ghost\"\n className=\"btn-clear-logs\"\n onClick={this.handleClearClick}\n icon={dhTrashUndo}\n tooltip=\"Clear log\"\n />\n <Button\n kind=\"ghost\"\n className=\"btn-link-icon btn-overflow\"\n icon={vsGear}\n tooltip=\"Log Settings\"\n onClick={() => {\n // no-op: click is handled in `DropdownMenu'\n }}\n >\n <DropdownMenu\n actions={actions}\n popperClassName=\"log-level-menu-popper\"\n popperOptions={popperOptions}\n />\n </Button>\n </div>\n <div\n className=\"log-pane-editor h-100 w-100\"\n ref={editorContainer => {\n this.editorContainer = editorContainer;\n }}\n />\n </div>\n );\n }\n}\n\nexport default LogView;\n"],"mappings":"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"}
1
+ {"version":3,"file":"LogView.js","names":["React","PureComponent","Button","DropdownMenu","vsGear","dhTrashUndo","assertNotNull","monaco","ConsoleUtils","LogLevel","LogLevelMenuItem","MonacoUtils","jsx","_jsx","jsxs","_jsxs","LogView","getLogText","logItem","date","Date","micros","timestamp","formatTimestamp","concat","logLevel","message","constructor","props","_defineProperty","handleClearClick","bind","handleFlushTimeout","handleLogMessage","handleMenuItemClick","handleResetClick","handleResize","handleToggleAllClick","logLevelMenuItems","editorContainer","bufferedMessages","messages","state","shownLogLevels","componentDidMount","resetLogLevels","initMonaco","startListening","window","addEventListener","componentDidUpdate","prevProps","prevState","updateDimensions","refreshLogText","session","stopListening","clearLogs","componentWillUnmount","stopFlushTimer","destroyMonaco","removeEventListener","getMenuActions","_this","actions","push","menuElement","className","children","group","order","_loop","AllLogLevels","i","on","title","onClick","ref","element","length","kind","_loop2","isEnabled","DefaultLogLevels","some","level","setState","cancelListener","onLogMessage","undefined","editor","create","copyWithSyntaxHighlighting","fixedOverflowWidgets","folding","fontFamily","glyphMargin","language","lineDecorationsWidth","lineNumbers","lineNumbersMinChars","minimap","enabled","readOnly","renderLineHighlight","scrollBeyondLastLine","value","wordWrap","KeyCode","Escape","KeyMod","Shift","forEach","keybindings","disableKeyBindings","addAction","id","label","keybindingContext","run","_this$editor","_this$editor2","position","getPosition","setPosition","dispose","triggerFindWidget","_this$editor3","_this$editor4","focus","trigger","toggleAll","isAllEnabled","updatedLogLevels","toggleLogLevel","updateLogLevels","_objectSpread","appendLogText","text","model","getModel","line","getLineCount","column","getLineLength","isBottomVisible","edits","range","startLineNumber","startColumn","endLineNumber","endColumn","forceMoveMarkers","applyEdits","lineCount","revealLine","truncateLogIfNecessary","logText","charAt","trimRight","setValue","_this$editor$getModel","maxLogSize","splice","truncateSize","scrollToBottom","_this$editor5","_this$editor5$getMode","_this$editor5$getMode2","call","isLineVisible","_this$editor6","visibleRanges","getVisibleRanges","isLogItemVisible","flush","queue","flushTimer","setTimeout","bufferTimeout","clearTimeout","layout","render","popperOptions","placement","icon","tooltip","popperClassName","STDOUT","ERROR","FATAL","STDERR","WARN","INFO","DEBUG","TRACE"],"sources":["../../src/log/LogView.tsx"],"sourcesContent":["import React, { PureComponent, ReactElement } from 'react';\nimport { Button, DropdownActions, DropdownMenu } from '@deephaven/components';\nimport { vsGear, dhTrashUndo } from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\nimport type { IdeSession, LogItem } from '@deephaven/jsapi-types';\nimport { Placement } from 'popper.js';\nimport * as monaco from 'monaco-editor';\nimport ConsoleUtils from '../common/ConsoleUtils';\nimport LogLevel from './LogLevel';\nimport './LogView.scss';\nimport LogLevelMenuItem from './LogLevelMenuItem';\nimport { MonacoUtils } from '../monaco';\n\ninterface LogViewProps {\n session: IdeSession;\n}\n\ninterface LogViewState {\n shownLogLevels: Record<string, boolean>;\n}\n/**\n * Log view contents. Uses a monaco editor to display/search the contents of the log.\n */\nclass LogView extends PureComponent<LogViewProps, LogViewState> {\n static DefaultLogLevels = [\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n ];\n\n static AllLogLevels = [\n LogLevel.INFO,\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n LogLevel.DEBUG,\n LogLevel.TRACE,\n ];\n\n /** ms to buffer log messages before processing them */\n static bufferTimeout = 16;\n\n /** Maximum number of messages to store in the log */\n static maxLogSize = 131072;\n\n static truncateSize = 65536;\n\n static getLogText(logItem: LogItem): string {\n const date = new Date(logItem.micros / 1000);\n const timestamp = ConsoleUtils.formatTimestamp(date);\n return `${timestamp} ${logItem.logLevel} ${logItem.message}`;\n }\n\n constructor(props: LogViewProps) {\n super(props);\n\n this.handleClearClick = this.handleClearClick.bind(this);\n this.handleFlushTimeout = this.handleFlushTimeout.bind(this);\n this.handleLogMessage = this.handleLogMessage.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleResetClick = this.handleResetClick.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleToggleAllClick = this.handleToggleAllClick.bind(this);\n\n this.logLevelMenuItems = {};\n\n this.editorContainer = null;\n\n this.bufferedMessages = [];\n this.messages = [];\n\n this.state = {\n shownLogLevels: {},\n };\n }\n\n componentDidMount(): void {\n this.resetLogLevels();\n this.initMonaco();\n this.startListening();\n\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(prevProps: LogViewProps, prevState: LogViewState): void {\n this.updateDimensions();\n\n const { shownLogLevels } = this.state;\n if (prevState.shownLogLevels !== shownLogLevels) {\n this.refreshLogText();\n }\n\n const { session } = this.props;\n if (prevProps.session !== session) {\n this.stopListening();\n this.startListening();\n // clear logs when starting a new console\n this.clearLogs();\n }\n }\n\n componentWillUnmount(): void {\n this.stopFlushTimer();\n this.stopListening();\n this.destroyMonaco();\n\n window.removeEventListener('resize', this.handleResize);\n }\n\n cancelListener?: () => void | null;\n\n editor?: monaco.editor.IStandaloneCodeEditor;\n\n editorContainer: HTMLDivElement | null;\n\n logLevelMenuItems: Record<string, LogLevelMenuItem>;\n\n flushTimer?: ReturnType<typeof setTimeout>;\n\n bufferedMessages: LogItem[];\n\n messages: LogItem[];\n\n getMenuActions(shownLogLevels: Record<string, boolean>): DropdownActions {\n const actions = [];\n\n actions.push({\n menuElement: (\n <div className=\"log-level-menu-title\">Display Log Levels</div>\n ),\n group: 1,\n order: 10,\n });\n\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const on =\n shownLogLevels[logLevel] != null ? shownLogLevels[logLevel] : false;\n actions.push({\n title: logLevel,\n group: 1,\n order: i + 100,\n\n menuElement: (\n <LogLevelMenuItem\n logLevel={logLevel}\n on={on}\n onClick={this.handleMenuItemClick}\n ref={element => {\n if (element != null) {\n this.logLevelMenuItems[logLevel] = element;\n }\n }}\n />\n ),\n });\n }\n\n actions.push({\n group: 1,\n order: 1000,\n menuElement: (\n <div className=\"log-level-menu-controls\">\n <Button\n kind=\"ghost\"\n className=\"log-level-toggle-all\"\n onClick={this.handleToggleAllClick}\n >\n Toggle All\n </Button>\n <Button kind=\"ghost\" onClick={this.handleResetClick}>\n Reset\n </Button>\n </div>\n ),\n });\n\n return actions;\n }\n\n resetLogLevels(): void {\n const shownLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const isEnabled = LogView.DefaultLogLevels.some(\n level => level === logLevel\n );\n shownLogLevels[logLevel] = isEnabled;\n }\n\n this.setState({ shownLogLevels });\n }\n\n startListening(): void {\n const { session } = this.props;\n this.cancelListener = session.onLogMessage(this.handleLogMessage);\n }\n\n stopListening(): void {\n if (this.cancelListener != null) {\n this.cancelListener();\n this.cancelListener = undefined;\n }\n }\n\n initMonaco(): void {\n assertNotNull(this.editorContainer);\n this.editor = monaco.editor.create(this.editorContainer, {\n copyWithSyntaxHighlighting: false,\n fixedOverflowWidgets: true,\n folding: false,\n fontFamily: 'Fira Mono',\n glyphMargin: false,\n language: 'log',\n lineDecorationsWidth: 0,\n lineNumbers: 'off',\n lineNumbersMinChars: 0,\n minimap: { enabled: false },\n readOnly: true,\n renderLineHighlight: 'none',\n scrollBeyondLastLine: false,\n value: '',\n wordWrap: 'on',\n });\n\n // Override default Monaco keybindings for `escape` and `shift-escape`\n [\n [monaco.KeyCode.Escape],\n [monaco.KeyMod.Shift | monaco.KeyCode.Escape], // eslint-disable-line no-bitwise\n ].forEach(keybindings => {\n assertNotNull(this.editor);\n\n // Monaco default behavior is for escape key to close the find widget.\n // Instead, capture it and do nothing. Same for shift-escape.\n MonacoUtils.disableKeyBindings(this.editor, keybindings);\n\n // Restore regular escape to clear selection, when editorText has focus.\n this.editor.addAction({\n id: 'clear-selection-on-escape',\n label: '',\n keybindings: [monaco.KeyCode.Escape],\n keybindingContext: 'findWidgetVisible && editorTextFocus',\n run: () => {\n const position = this.editor?.getPosition();\n assertNotNull(position);\n this.editor?.setPosition(position);\n },\n });\n });\n }\n\n destroyMonaco(): void {\n if (this.editor) {\n this.editor.dispose();\n this.editor = undefined;\n }\n }\n\n triggerFindWidget(): void {\n // The actions.find action can no longer be triggered when the editor is not in focus, with monaco 0.22.x.\n // As a workaround, just focus the editor before triggering the action\n // https://github.com/microsoft/monaco-editor/issues/2355\n this.editor?.focus();\n this.editor?.trigger('keyboard', 'actions.find', undefined);\n }\n\n toggleAll(): void {\n const { shownLogLevels } = this.state;\n let isAllEnabled = true;\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n if (!shownLogLevels[logLevel]) {\n isAllEnabled = false;\n break;\n }\n }\n\n if (isAllEnabled) {\n this.setState({ shownLogLevels: {} });\n } else {\n const updatedLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n updatedLogLevels[logLevel] = true;\n }\n this.setState({ shownLogLevels: updatedLogLevels });\n }\n }\n\n toggleLogLevel(logLevel: string): void {\n const { shownLogLevels } = this.state;\n const isEnabled = shownLogLevels[logLevel];\n const updatedLogLevels: Record<string, boolean> = {};\n updatedLogLevels[logLevel] = !isEnabled;\n this.updateLogLevels(updatedLogLevels);\n }\n\n updateLogLevels(updatedLogLevels: Record<string, boolean>): void {\n let { shownLogLevels } = this.state;\n shownLogLevels = { ...shownLogLevels, ...updatedLogLevels };\n this.setState({ shownLogLevels });\n }\n\n appendLogText(text: string): void {\n if (!this.editor) {\n return;\n }\n\n const model = this.editor.getModel();\n let line = model?.getLineCount();\n assertNotNull(line);\n let column = model?.getLineLength(line);\n assertNotNull(column);\n const isBottomVisible = this.isBottomVisible();\n\n const edits = [];\n if (column > 0) {\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column + 1,\n endLineNumber: line,\n endColumn: column + 1,\n },\n text: '\\n',\n forceMoveMarkers: true,\n });\n line += 1;\n column = 0;\n }\n\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column,\n endLineNumber: line,\n endColumn: column,\n },\n text,\n forceMoveMarkers: true,\n });\n\n model?.applyEdits(edits);\n\n if (isBottomVisible) {\n const lineCount = model?.getLineCount();\n assertNotNull(lineCount);\n this.editor.revealLine(lineCount, 1);\n }\n }\n\n /**\n * Refresh the contents of the log component with the updated filter text\n */\n refreshLogText(): void {\n if (!this.editor) {\n return;\n }\n\n this.truncateLogIfNecessary();\n\n const { shownLogLevels } = this.state;\n const isBottomVisible = this.isBottomVisible();\n\n let text = '';\n for (let i = 0; i < this.messages.length; i += 1) {\n const message = this.messages[i];\n if (shownLogLevels[message.logLevel]) {\n const logText = LogView.getLogText(message);\n if (logText.length > 0) {\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n }\n }\n text = text.trimRight();\n\n this.editor.setValue(text);\n\n if (isBottomVisible) {\n const line = this.editor.getModel()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n this.stopFlushTimer();\n this.bufferedMessages = [];\n }\n\n truncateLogIfNecessary(): void {\n if (this.messages.length > LogView.maxLogSize) {\n this.messages = this.messages.splice(\n this.messages.length - LogView.truncateSize\n );\n }\n }\n\n scrollToBottom(): void {\n if (!this.editor) {\n return;\n }\n\n const line = this.editor?.getModel?.()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n isBottomVisible(): boolean {\n if (!this.editor) {\n return true;\n }\n\n const model = this.editor.getModel();\n const line = model?.getLineCount();\n\n assertNotNull(line);\n return this.isLineVisible(line);\n }\n\n isLineVisible(line: number): boolean {\n const visibleRanges = this.editor?.getVisibleRanges();\n if (visibleRanges == null || visibleRanges.length === 0) {\n return false;\n }\n\n for (let i = 0; i < visibleRanges.length; i += 1) {\n const range = visibleRanges[i];\n if (range.startLineNumber <= line && line <= range.endLineNumber) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Checks if the given log message is visible with the current filters */\n isLogItemVisible(message: LogItem): boolean {\n const { shownLogLevels } = this.state;\n return shownLogLevels[message.logLevel];\n }\n\n flush(): void {\n let text = '';\n for (let i = 0; i < this.bufferedMessages.length; i += 1) {\n const message = this.bufferedMessages[i];\n const logText = LogView.getLogText(message);\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n\n this.bufferedMessages = [];\n\n this.appendLogText(text);\n }\n\n queue(message: LogItem): void {\n this.bufferedMessages.push(message);\n if (this.bufferedMessages.length === 1) {\n this.flushTimer = setTimeout(\n this.handleFlushTimeout,\n LogView.bufferTimeout\n );\n }\n }\n\n stopFlushTimer(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = undefined;\n }\n }\n\n updateDimensions(): void {\n if (this.editor) {\n this.editor.layout();\n }\n }\n\n handleClearClick(): void {\n this.clearLogs();\n }\n\n clearLogs(): void {\n this.messages = [];\n this.refreshLogText();\n }\n\n handleFlushTimeout(): void {\n this.stopFlushTimer();\n this.flush();\n }\n\n handleLogMessage(message: LogItem): void {\n this.messages.push(message);\n\n if (this.editor && this.isLogItemVisible(message)) {\n this.queue(message);\n }\n }\n\n handleMenuItemClick(logLevel: string): void {\n this.toggleLogLevel(logLevel);\n }\n\n handleResetClick(): void {\n this.resetLogLevels();\n }\n\n handleResize(): void {\n this.updateDimensions();\n }\n\n handleToggleAllClick(): void {\n this.toggleAll();\n }\n\n render(): ReactElement {\n const popperOptions = { placement: 'bottom-end' as Placement };\n const { shownLogLevels } = this.state;\n const actions = this.getMenuActions(shownLogLevels);\n return (\n <div className=\"log-pane h-100 w-100\">\n <div className=\"log-pane-menu\">\n <Button\n kind=\"ghost\"\n className=\"btn-clear-logs\"\n onClick={this.handleClearClick}\n icon={dhTrashUndo}\n tooltip=\"Clear log\"\n />\n <Button\n kind=\"ghost\"\n className=\"btn-link-icon btn-overflow\"\n icon={vsGear}\n tooltip=\"Log Settings\"\n onClick={() => {\n // no-op: click is handled in `DropdownMenu'\n }}\n >\n <DropdownMenu\n actions={actions}\n popperClassName=\"log-level-menu-popper\"\n popperOptions={popperOptions}\n />\n </Button>\n </div>\n <div\n className=\"log-pane-editor h-100 w-100\"\n ref={editorContainer => {\n this.editorContainer = editorContainer;\n }}\n />\n </div>\n );\n }\n}\n\nexport default LogView;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MonacoProviders.js","names":["PureComponent","monaco","Log","log","module","MonacoProviders","lspToMonacoKind","kind","monacoKinds","languages","CompletionItemKind","Text","Method","Function","Constructor","Field","Variable","Class","Interface","Module","Property","Unit","Value","Enum","Keyword","Snippet","Color","File","Reference","Folder","EnumMember","Constant","Struct","Event","Operator","TypeParameter","lspToMonacoRange","range","start","end","startLineNumber","line","startColumn","character","endLineNumber","endColumn","monacoToLspPosition","position","lineNumber","column","constructor","props","handleCompletionRequest","bind","handleSignatureRequest","handleHoverRequest","componentDidMount","language","session","registeredCompletionProvider","registerCompletionItemProvider","provideCompletionItems","triggerCharacters","getSignatureHelp","registeredSignatureProvider","registerSignatureHelpProvider","provideSignatureHelp","signatureHelpTriggerCharacters","getHover","registeredHoverProvider","registerHoverProvider","provideHover","componentWillUnmount","dispose","model","context","propModel","params","textDocument","uri","version","getVersionId","completionItems","getCompletionItems","debug","monacoCompletionItems","then","items","suggestions","map","item","label","detail","documentation","sortText","filterText","textEdit","insertTextFormat","value","insertText","text","insertTextRules","incomplete","catch","error","token","defaultResult","signatures","activeSignature","activeParameter","signatureItems","monacoSignatures","parameters","length","hover","monacoHover","hoverItem","contents","hoverContents","render"],"sources":["../../src/monaco/MonacoProviders.tsx"],"sourcesContent":["/**\n * Completion provider for a code session\n */\nimport { PureComponent } from 'react';\nimport * as monaco from 'monaco-editor';\nimport Log from '@deephaven/log';\nimport type {\n DocumentRange,\n IdeSession,\n Position,\n} from '@deephaven/jsapi-types';\n\nconst log = Log.module('MonacoCompletionProvider');\n\ninterface MonacoProviderProps {\n model: monaco.editor.ITextModel;\n session: IdeSession;\n language: string;\n}\n\n/**\n * Registers a completion provider with monaco for the language and session provided.\n */\nclass MonacoProviders extends PureComponent<\n MonacoProviderProps,\n Record<string, never>\n> {\n /**\n * Converts LSP CompletionItemKind to Monaco CompletionItemKind\n * Defaults to Variable if no LSP kind was provided\n * https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#completionItemKind\n *\n * @param kind The LSP kind\n * @returns Monaco kind\n */\n static lspToMonacoKind(kind: number | undefined): number {\n const monacoKinds = monaco.languages.CompletionItemKind;\n switch (kind) {\n case 1:\n return monacoKinds.Text;\n case 2:\n return monacoKinds.Method;\n case 3:\n return monacoKinds.Function;\n case 4:\n return monacoKinds.Constructor;\n case 5:\n return monacoKinds.Field;\n case 6:\n return monacoKinds.Variable;\n case 7:\n return monacoKinds.Class;\n case 8:\n return monacoKinds.Interface;\n case 9:\n return monacoKinds.Module;\n case 10:\n return monacoKinds.Property;\n case 11:\n return monacoKinds.Unit;\n case 12:\n return monacoKinds.Value;\n case 13:\n return monacoKinds.Enum;\n case 14:\n return monacoKinds.Keyword;\n case 15:\n return monacoKinds.Snippet;\n case 16:\n return monacoKinds.Color;\n case 17:\n return monacoKinds.File;\n case 18:\n return monacoKinds.Reference;\n case 19:\n return monacoKinds.Folder;\n case 20:\n return monacoKinds.EnumMember;\n case 21:\n return monacoKinds.Constant;\n case 22:\n return monacoKinds.Struct;\n case 23:\n return monacoKinds.Event;\n case 24:\n return monacoKinds.Operator;\n case 25:\n return monacoKinds.TypeParameter;\n default:\n return monacoKinds.Variable;\n }\n }\n\n /**\n * Converts an LSP document range to a monaco range\n * Accounts for LSP indexing from 0 and monaco indexing from 1\n *\n * @param range The LSP document range to convert\n * @returns The corresponding monaco range\n */\n static lspToMonacoRange(range: DocumentRange): monaco.IRange {\n const { start, end } = range;\n\n // Monaco expects the columns/ranges to start at 1. LSP starts at 0\n return {\n startLineNumber: start.line + 1,\n startColumn: start.character + 1,\n endLineNumber: end.line + 1,\n endColumn: end.character + 1,\n };\n }\n\n /**\n * Converts a monaco position to an LSP position\n * Accounts for LSP indexing from 0 and monaco indexing from 1\n *\n * @param position The monaco position\n * @returns The corresponding LSP position\n */\n static monacoToLspPosition(position: monaco.IPosition): Position {\n // Monaco 1-indexes Position. LSP 0-indexes Position\n return {\n line: position.lineNumber - 1,\n character: position.column - 1,\n };\n }\n\n constructor(props: MonacoProviderProps) {\n super(props);\n\n this.handleCompletionRequest = this.handleCompletionRequest.bind(this);\n this.handleSignatureRequest = this.handleSignatureRequest.bind(this);\n this.handleHoverRequest = this.handleHoverRequest.bind(this);\n }\n\n componentDidMount(): void {\n const { language, session } = this.props;\n\n this.registeredCompletionProvider =\n monaco.languages.registerCompletionItemProvider(language, {\n provideCompletionItems: this.handleCompletionRequest,\n triggerCharacters: ['.', '\"', \"'\"],\n });\n\n if (session.getSignatureHelp) {\n this.registeredSignatureProvider =\n monaco.languages.registerSignatureHelpProvider(language, {\n provideSignatureHelp: this.handleSignatureRequest,\n signatureHelpTriggerCharacters: ['(', ','],\n });\n }\n\n if (session.getHover) {\n this.registeredHoverProvider = monaco.languages.registerHoverProvider(\n language,\n {\n provideHover: this.handleHoverRequest,\n }\n );\n }\n }\n\n componentWillUnmount(): void {\n this.registeredCompletionProvider?.dispose();\n this.registeredSignatureProvider?.dispose();\n this.registeredHoverProvider?.dispose();\n }\n\n registeredCompletionProvider?: monaco.IDisposable;\n\n registeredSignatureProvider?: monaco.IDisposable;\n\n registeredHoverProvider?: monaco.IDisposable;\n\n handleCompletionRequest(\n model: monaco.editor.ITextModel,\n position: monaco.Position,\n context: monaco.languages.CompletionContext\n ): monaco.languages.ProviderResult<monaco.languages.CompletionList> {\n const { model: propModel, session } = this.props;\n if (model !== propModel) {\n return null;\n }\n\n const params = {\n textDocument: {\n uri: `${model.uri}`,\n version: model.getVersionId(),\n },\n position: MonacoProviders.monacoToLspPosition(position),\n context,\n };\n\n const completionItems = session.getCompletionItems(params);\n log.debug('Requested completion items', params);\n\n const monacoCompletionItems = completionItems\n .then(items => {\n log.debug('Completion items received: ', params, items);\n\n const suggestions = items.map(item => {\n const {\n label,\n kind,\n detail,\n documentation,\n sortText,\n filterText,\n textEdit,\n insertTextFormat,\n } = item;\n\n return {\n label,\n kind: MonacoProviders.lspToMonacoKind(kind),\n detail,\n documentation:\n documentation?.kind === 'markdown'\n ? documentation\n : documentation?.value,\n sortText,\n filterText,\n insertText: textEdit.text,\n // We are basically guessing that LSP's insertTextFormat===2 is\n // semantically equivalent to monaco's insertTextRules===4.\n // Why microsoft is using almost-but-not-LSP apis is beyond me....\n insertTextRules: insertTextFormat === 2 ? 4 : insertTextFormat,\n range: MonacoProviders.lspToMonacoRange(textEdit.range),\n };\n });\n\n return {\n incomplete: true,\n suggestions,\n };\n })\n .catch((error: unknown) => {\n log.error('There was an error retrieving completion items', error);\n return { suggestions: [] };\n });\n\n return monacoCompletionItems;\n }\n\n handleSignatureRequest(\n model: monaco.editor.ITextModel,\n position: monaco.Position,\n token: monaco.CancellationToken,\n context: monaco.languages.SignatureHelpContext\n ): monaco.languages.ProviderResult<monaco.languages.SignatureHelpResult> {\n const defaultResult: monaco.languages.SignatureHelpResult = {\n value: {\n signatures: [],\n activeSignature: 0,\n activeParameter: 0,\n },\n dispose: () => {\n /* no-op */\n },\n };\n\n const { model: propModel, session } = this.props;\n if (model !== propModel || !session.getSignatureHelp) {\n return null;\n }\n\n const params = {\n textDocument: {\n uri: `${model.uri}`,\n version: model.getVersionId(),\n },\n position: MonacoProviders.monacoToLspPosition(position),\n context,\n };\n\n const signatureItems = session.getSignatureHelp(params);\n log.debug('Requested signature help', params);\n\n const monacoSignatures = signatureItems\n .then(items => {\n log.debug('Signatures received: ', params, signatureItems);\n const signatures = items.map(item => {\n const { label, documentation, parameters } = item;\n\n return {\n documentation:\n documentation?.kind === 'markdown'\n ? documentation\n : documentation?.value,\n label,\n parameters: parameters ?? [],\n };\n });\n\n if (signatures.length === 0) {\n return defaultResult;\n }\n\n // For now we will assume we only autocomplete Python w/ 1 signature\n // For multiple signatures, this may need to be sent through the request as context\n const activeSignature = 0;\n\n return {\n value: {\n signatures,\n activeSignature,\n activeParameter: items[activeSignature].activeParameter,\n },\n dispose: () => {\n /* no-op */\n },\n };\n })\n .catch((error: unknown) => {\n log.error('There was an error retrieving completion items', error);\n return defaultResult;\n });\n\n return monacoSignatures;\n }\n\n handleHoverRequest(\n model: monaco.editor.ITextModel,\n position: monaco.Position\n ): monaco.languages.ProviderResult<monaco.languages.Hover> {\n const { model: propModel, session } = this.props;\n if (model !== propModel || !session.getHover) {\n return null;\n }\n\n const params = {\n textDocument: {\n uri: `${model.uri}`,\n version: model.getVersionId(),\n },\n position: MonacoProviders.monacoToLspPosition(position),\n };\n\n const hover = session.getHover(params);\n log.debug('Requested hover', params);\n\n const monacoHover = hover\n .then(hoverItem => {\n log.debug('Hover received: ', params, hoverItem);\n const { contents: hoverContents } = hoverItem;\n\n return {\n contents: hoverContents ? [hoverContents] : [],\n };\n })\n .catch((error: unknown) => {\n log.error('There was an error retrieving hover', error);\n return { contents: [] };\n });\n\n return monacoHover;\n }\n\n render(): null {\n return null;\n }\n}\n\nexport default MonacoProviders;\n"],"mappings":"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"}
1
+ {"version":3,"file":"MonacoProviders.js","names":["PureComponent","monaco","Log","log","module","MonacoProviders","lspToMonacoKind","kind","monacoKinds","languages","CompletionItemKind","Text","Method","Function","Constructor","Field","Variable","Class","Interface","Module","Property","Unit","Value","Enum","Keyword","Snippet","Color","File","Reference","Folder","EnumMember","Constant","Struct","Event","Operator","TypeParameter","lspToMonacoRange","range","start","end","startLineNumber","line","startColumn","character","endLineNumber","endColumn","monacoToLspPosition","position","lineNumber","column","constructor","props","_defineProperty","handleCompletionRequest","bind","handleSignatureRequest","handleHoverRequest","componentDidMount","language","session","registeredCompletionProvider","registerCompletionItemProvider","provideCompletionItems","triggerCharacters","getSignatureHelp","registeredSignatureProvider","registerSignatureHelpProvider","provideSignatureHelp","signatureHelpTriggerCharacters","getHover","registeredHoverProvider","registerHoverProvider","provideHover","componentWillUnmount","_this$registeredCompl","_this$registeredSigna","_this$registeredHover","dispose","model","context","propModel","params","textDocument","uri","concat","version","getVersionId","completionItems","getCompletionItems","debug","monacoCompletionItems","then","items","suggestions","map","item","label","detail","documentation","sortText","filterText","textEdit","insertTextFormat","value","insertText","text","insertTextRules","incomplete","catch","error","token","defaultResult","signatures","activeSignature","activeParameter","signatureItems","monacoSignatures","parameters","length","hover","monacoHover","hoverItem","contents","hoverContents","render"],"sources":["../../src/monaco/MonacoProviders.tsx"],"sourcesContent":["/**\n * Completion provider for a code session\n */\nimport { PureComponent } from 'react';\nimport * as monaco from 'monaco-editor';\nimport Log from '@deephaven/log';\nimport type {\n DocumentRange,\n IdeSession,\n Position,\n} from '@deephaven/jsapi-types';\n\nconst log = Log.module('MonacoCompletionProvider');\n\ninterface MonacoProviderProps {\n model: monaco.editor.ITextModel;\n session: IdeSession;\n language: string;\n}\n\n/**\n * Registers a completion provider with monaco for the language and session provided.\n */\nclass MonacoProviders extends PureComponent<\n MonacoProviderProps,\n Record<string, never>\n> {\n /**\n * Converts LSP CompletionItemKind to Monaco CompletionItemKind\n * Defaults to Variable if no LSP kind was provided\n * https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#completionItemKind\n *\n * @param kind The LSP kind\n * @returns Monaco kind\n */\n static lspToMonacoKind(kind: number | undefined): number {\n const monacoKinds = monaco.languages.CompletionItemKind;\n switch (kind) {\n case 1:\n return monacoKinds.Text;\n case 2:\n return monacoKinds.Method;\n case 3:\n return monacoKinds.Function;\n case 4:\n return monacoKinds.Constructor;\n case 5:\n return monacoKinds.Field;\n case 6:\n return monacoKinds.Variable;\n case 7:\n return monacoKinds.Class;\n case 8:\n return monacoKinds.Interface;\n case 9:\n return monacoKinds.Module;\n case 10:\n return monacoKinds.Property;\n case 11:\n return monacoKinds.Unit;\n case 12:\n return monacoKinds.Value;\n case 13:\n return monacoKinds.Enum;\n case 14:\n return monacoKinds.Keyword;\n case 15:\n return monacoKinds.Snippet;\n case 16:\n return monacoKinds.Color;\n case 17:\n return monacoKinds.File;\n case 18:\n return monacoKinds.Reference;\n case 19:\n return monacoKinds.Folder;\n case 20:\n return monacoKinds.EnumMember;\n case 21:\n return monacoKinds.Constant;\n case 22:\n return monacoKinds.Struct;\n case 23:\n return monacoKinds.Event;\n case 24:\n return monacoKinds.Operator;\n case 25:\n return monacoKinds.TypeParameter;\n default:\n return monacoKinds.Variable;\n }\n }\n\n /**\n * Converts an LSP document range to a monaco range\n * Accounts for LSP indexing from 0 and monaco indexing from 1\n *\n * @param range The LSP document range to convert\n * @returns The corresponding monaco range\n */\n static lspToMonacoRange(range: DocumentRange): monaco.IRange {\n const { start, end } = range;\n\n // Monaco expects the columns/ranges to start at 1. LSP starts at 0\n return {\n startLineNumber: start.line + 1,\n startColumn: start.character + 1,\n endLineNumber: end.line + 1,\n endColumn: end.character + 1,\n };\n }\n\n /**\n * Converts a monaco position to an LSP position\n * Accounts for LSP indexing from 0 and monaco indexing from 1\n *\n * @param position The monaco position\n * @returns The corresponding LSP position\n */\n static monacoToLspPosition(position: monaco.IPosition): Position {\n // Monaco 1-indexes Position. LSP 0-indexes Position\n return {\n line: position.lineNumber - 1,\n character: position.column - 1,\n };\n }\n\n constructor(props: MonacoProviderProps) {\n super(props);\n\n this.handleCompletionRequest = this.handleCompletionRequest.bind(this);\n this.handleSignatureRequest = this.handleSignatureRequest.bind(this);\n this.handleHoverRequest = this.handleHoverRequest.bind(this);\n }\n\n componentDidMount(): void {\n const { language, session } = this.props;\n\n this.registeredCompletionProvider =\n monaco.languages.registerCompletionItemProvider(language, {\n provideCompletionItems: this.handleCompletionRequest,\n triggerCharacters: ['.', '\"', \"'\"],\n });\n\n if (session.getSignatureHelp) {\n this.registeredSignatureProvider =\n monaco.languages.registerSignatureHelpProvider(language, {\n provideSignatureHelp: this.handleSignatureRequest,\n signatureHelpTriggerCharacters: ['(', ','],\n });\n }\n\n if (session.getHover) {\n this.registeredHoverProvider = monaco.languages.registerHoverProvider(\n language,\n {\n provideHover: this.handleHoverRequest,\n }\n );\n }\n }\n\n componentWillUnmount(): void {\n this.registeredCompletionProvider?.dispose();\n this.registeredSignatureProvider?.dispose();\n this.registeredHoverProvider?.dispose();\n }\n\n registeredCompletionProvider?: monaco.IDisposable;\n\n registeredSignatureProvider?: monaco.IDisposable;\n\n registeredHoverProvider?: monaco.IDisposable;\n\n handleCompletionRequest(\n model: monaco.editor.ITextModel,\n position: monaco.Position,\n context: monaco.languages.CompletionContext\n ): monaco.languages.ProviderResult<monaco.languages.CompletionList> {\n const { model: propModel, session } = this.props;\n if (model !== propModel) {\n return null;\n }\n\n const params = {\n textDocument: {\n uri: `${model.uri}`,\n version: model.getVersionId(),\n },\n position: MonacoProviders.monacoToLspPosition(position),\n context,\n };\n\n const completionItems = session.getCompletionItems(params);\n log.debug('Requested completion items', params);\n\n const monacoCompletionItems = completionItems\n .then(items => {\n log.debug('Completion items received: ', params, items);\n\n const suggestions = items.map(item => {\n const {\n label,\n kind,\n detail,\n documentation,\n sortText,\n filterText,\n textEdit,\n insertTextFormat,\n } = item;\n\n return {\n label,\n kind: MonacoProviders.lspToMonacoKind(kind),\n detail,\n documentation:\n documentation?.kind === 'markdown'\n ? documentation\n : documentation?.value,\n sortText,\n filterText,\n insertText: textEdit.text,\n // We are basically guessing that LSP's insertTextFormat===2 is\n // semantically equivalent to monaco's insertTextRules===4.\n // Why microsoft is using almost-but-not-LSP apis is beyond me....\n insertTextRules: insertTextFormat === 2 ? 4 : insertTextFormat,\n range: MonacoProviders.lspToMonacoRange(textEdit.range),\n };\n });\n\n return {\n incomplete: true,\n suggestions,\n };\n })\n .catch((error: unknown) => {\n log.error('There was an error retrieving completion items', error);\n return { suggestions: [] };\n });\n\n return monacoCompletionItems;\n }\n\n handleSignatureRequest(\n model: monaco.editor.ITextModel,\n position: monaco.Position,\n token: monaco.CancellationToken,\n context: monaco.languages.SignatureHelpContext\n ): monaco.languages.ProviderResult<monaco.languages.SignatureHelpResult> {\n const defaultResult: monaco.languages.SignatureHelpResult = {\n value: {\n signatures: [],\n activeSignature: 0,\n activeParameter: 0,\n },\n dispose: () => {\n /* no-op */\n },\n };\n\n const { model: propModel, session } = this.props;\n if (model !== propModel || !session.getSignatureHelp) {\n return null;\n }\n\n const params = {\n textDocument: {\n uri: `${model.uri}`,\n version: model.getVersionId(),\n },\n position: MonacoProviders.monacoToLspPosition(position),\n context,\n };\n\n const signatureItems = session.getSignatureHelp(params);\n log.debug('Requested signature help', params);\n\n const monacoSignatures = signatureItems\n .then(items => {\n log.debug('Signatures received: ', params, signatureItems);\n const signatures = items.map(item => {\n const { label, documentation, parameters } = item;\n\n return {\n documentation:\n documentation?.kind === 'markdown'\n ? documentation\n : documentation?.value,\n label,\n parameters: parameters ?? [],\n };\n });\n\n if (signatures.length === 0) {\n return defaultResult;\n }\n\n // For now we will assume we only autocomplete Python w/ 1 signature\n // For multiple signatures, this may need to be sent through the request as context\n const activeSignature = 0;\n\n return {\n value: {\n signatures,\n activeSignature,\n activeParameter: items[activeSignature].activeParameter,\n },\n dispose: () => {\n /* no-op */\n },\n };\n })\n .catch((error: unknown) => {\n log.error('There was an error retrieving completion items', error);\n return defaultResult;\n });\n\n return monacoSignatures;\n }\n\n handleHoverRequest(\n model: monaco.editor.ITextModel,\n position: monaco.Position\n ): monaco.languages.ProviderResult<monaco.languages.Hover> {\n const { model: propModel, session } = this.props;\n if (model !== propModel || !session.getHover) {\n return null;\n }\n\n const params = {\n textDocument: {\n uri: `${model.uri}`,\n version: model.getVersionId(),\n },\n position: MonacoProviders.monacoToLspPosition(position),\n };\n\n const hover = session.getHover(params);\n log.debug('Requested hover', params);\n\n const monacoHover = hover\n .then(hoverItem => {\n log.debug('Hover received: ', params, hoverItem);\n const { contents: hoverContents } = hoverItem;\n\n return {\n contents: hoverContents ? [hoverContents] : [],\n };\n })\n .catch((error: unknown) => {\n log.error('There was an error retrieving hover', error);\n return { contents: [] };\n });\n\n return monacoHover;\n }\n\n render(): null {\n return null;\n }\n}\n\nexport default MonacoProviders;\n"],"mappings":";;;AAAA;AACA;AACA;AACA,SAASA,aAAa,QAAQ,OAAO;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAOC,GAAG,MAAM,gBAAgB;AAOhC,IAAMC,GAAG,GAAGD,GAAG,CAACE,MAAM,CAAC,0BAA0B,CAAC;AAQlD;AACA;AACA;AACA,MAAMC,eAAe,SAASL,aAAa,CAGzC;EACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOM,eAAeA,CAACC,IAAwB,EAAU;IACvD,IAAMC,WAAW,GAAGP,MAAM,CAACQ,SAAS,CAACC,kBAAkB;IACvD,QAAQH,IAAI;MACV,KAAK,CAAC;QACJ,OAAOC,WAAW,CAACG,IAAI;MACzB,KAAK,CAAC;QACJ,OAAOH,WAAW,CAACI,MAAM;MAC3B,KAAK,CAAC;QACJ,OAAOJ,WAAW,CAACK,QAAQ;MAC7B,KAAK,CAAC;QACJ,OAAOL,WAAW,CAACM,WAAW;MAChC,KAAK,CAAC;QACJ,OAAON,WAAW,CAACO,KAAK;MAC1B,KAAK,CAAC;QACJ,OAAOP,WAAW,CAACQ,QAAQ;MAC7B,KAAK,CAAC;QACJ,OAAOR,WAAW,CAACS,KAAK;MAC1B,KAAK,CAAC;QACJ,OAAOT,WAAW,CAACU,SAAS;MAC9B,KAAK,CAAC;QACJ,OAAOV,WAAW,CAACW,MAAM;MAC3B,KAAK,EAAE;QACL,OAAOX,WAAW,CAACY,QAAQ;MAC7B,KAAK,EAAE;QACL,OAAOZ,WAAW,CAACa,IAAI;MACzB,KAAK,EAAE;QACL,OAAOb,WAAW,CAACc,KAAK;MAC1B,KAAK,EAAE;QACL,OAAOd,WAAW,CAACe,IAAI;MACzB,KAAK,EAAE;QACL,OAAOf,WAAW,CAACgB,OAAO;MAC5B,KAAK,EAAE;QACL,OAAOhB,WAAW,CAACiB,OAAO;MAC5B,KAAK,EAAE;QACL,OAAOjB,WAAW,CAACkB,KAAK;MAC1B,KAAK,EAAE;QACL,OAAOlB,WAAW,CAACmB,IAAI;MACzB,KAAK,EAAE;QACL,OAAOnB,WAAW,CAACoB,SAAS;MAC9B,KAAK,EAAE;QACL,OAAOpB,WAAW,CAACqB,MAAM;MAC3B,KAAK,EAAE;QACL,OAAOrB,WAAW,CAACsB,UAAU;MAC/B,KAAK,EAAE;QACL,OAAOtB,WAAW,CAACuB,QAAQ;MAC7B,KAAK,EAAE;QACL,OAAOvB,WAAW,CAACwB,MAAM;MAC3B,KAAK,EAAE;QACL,OAAOxB,WAAW,CAACyB,KAAK;MAC1B,KAAK,EAAE;QACL,OAAOzB,WAAW,CAAC0B,QAAQ;MAC7B,KAAK,EAAE;QACL,OAAO1B,WAAW,CAAC2B,aAAa;MAClC;QACE,OAAO3B,WAAW,CAACQ,QAAQ;IAC/B;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAOoB,gBAAgBA,CAACC,KAAoB,EAAiB;IAC3D,IAAM;MAAEC,KAAK;MAAEC;IAAI,CAAC,GAAGF,KAAK;;IAE5B;IACA,OAAO;MACLG,eAAe,EAAEF,KAAK,CAACG,IAAI,GAAG,CAAC;MAC/BC,WAAW,EAAEJ,KAAK,CAACK,SAAS,GAAG,CAAC;MAChCC,aAAa,EAAEL,GAAG,CAACE,IAAI,GAAG,CAAC;MAC3BI,SAAS,EAAEN,GAAG,CAACI,SAAS,GAAG;IAC7B,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAOG,mBAAmBA,CAACC,QAA0B,EAAY;IAC/D;IACA,OAAO;MACLN,IAAI,EAAEM,QAAQ,CAACC,UAAU,GAAG,CAAC;MAC7BL,SAAS,EAAEI,QAAQ,CAACE,MAAM,GAAG;IAC/B,CAAC;EACH;EAEAC,WAAWA,CAACC,KAA0B,EAAE;IACtC,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAEb,IAAI,CAACC,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACC,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACD,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACE,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACF,IAAI,CAAC,IAAI,CAAC;EAC9D;EAEAG,iBAAiBA,CAAA,EAAS;IACxB,IAAM;MAAEC,QAAQ;MAAEC;IAAQ,CAAC,GAAG,IAAI,CAACR,KAAK;IAExC,IAAI,CAACS,4BAA4B,GAC/B3D,MAAM,CAACQ,SAAS,CAACoD,8BAA8B,CAACH,QAAQ,EAAE;MACxDI,sBAAsB,EAAE,IAAI,CAACT,uBAAuB;MACpDU,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG;IACnC,CAAC,CAAC;IAEJ,IAAIJ,OAAO,CAACK,gBAAgB,EAAE;MAC5B,IAAI,CAACC,2BAA2B,GAC9BhE,MAAM,CAACQ,SAAS,CAACyD,6BAA6B,CAACR,QAAQ,EAAE;QACvDS,oBAAoB,EAAE,IAAI,CAACZ,sBAAsB;QACjDa,8BAA8B,EAAE,CAAC,GAAG,EAAE,GAAG;MAC3C,CAAC,CAAC;IACN;IAEA,IAAIT,OAAO,CAACU,QAAQ,EAAE;MACpB,IAAI,CAACC,uBAAuB,GAAGrE,MAAM,CAACQ,SAAS,CAAC8D,qBAAqB,CACnEb,QAAQ,EACR;QACEc,YAAY,EAAE,IAAI,CAAChB;MACrB,CACF,CAAC;IACH;EACF;EAEAiB,oBAAoBA,CAAA,EAAS;IAAA,IAAAC,qBAAA,EAAAC,qBAAA,EAAAC,qBAAA;IAC3B,CAAAF,qBAAA,OAAI,CAACd,4BAA4B,cAAAc,qBAAA,uBAAjCA,qBAAA,CAAmCG,OAAO,CAAC,CAAC;IAC5C,CAAAF,qBAAA,OAAI,CAACV,2BAA2B,cAAAU,qBAAA,uBAAhCA,qBAAA,CAAkCE,OAAO,CAAC,CAAC;IAC3C,CAAAD,qBAAA,OAAI,CAACN,uBAAuB,cAAAM,qBAAA,uBAA5BA,qBAAA,CAA8BC,OAAO,CAAC,CAAC;EACzC;EAQAxB,uBAAuBA,CACrByB,KAA+B,EAC/B/B,QAAyB,EACzBgC,OAA2C,EACuB;IAClE,IAAM;MAAED,KAAK,EAAEE,SAAS;MAAErB;IAAQ,CAAC,GAAG,IAAI,CAACR,KAAK;IAChD,IAAI2B,KAAK,KAAKE,SAAS,EAAE;MACvB,OAAO,IAAI;IACb;IAEA,IAAMC,MAAM,GAAG;MACbC,YAAY,EAAE;QACZC,GAAG,KAAAC,MAAA,CAAKN,KAAK,CAACK,GAAG,CAAE;QACnBE,OAAO,EAAEP,KAAK,CAACQ,YAAY,CAAC;MAC9B,CAAC;MACDvC,QAAQ,EAAE1C,eAAe,CAACyC,mBAAmB,CAACC,QAAQ,CAAC;MACvDgC;IACF,CAAC;IAED,IAAMQ,eAAe,GAAG5B,OAAO,CAAC6B,kBAAkB,CAACP,MAAM,CAAC;IAC1D9E,GAAG,CAACsF,KAAK,CAAC,4BAA4B,EAAER,MAAM,CAAC;IAE/C,IAAMS,qBAAqB,GAAGH,eAAe,CAC1CI,IAAI,CAACC,KAAK,IAAI;MACbzF,GAAG,CAACsF,KAAK,CAAC,6BAA6B,EAAER,MAAM,EAAEW,KAAK,CAAC;MAEvD,IAAMC,WAAW,GAAGD,KAAK,CAACE,GAAG,CAACC,IAAI,IAAI;QACpC,IAAM;UACJC,KAAK;UACLzF,IAAI;UACJ0F,MAAM;UACNC,aAAa;UACbC,QAAQ;UACRC,UAAU;UACVC,QAAQ;UACRC;QACF,CAAC,GAAGP,IAAI;QAER,OAAO;UACLC,KAAK;UACLzF,IAAI,EAAEF,eAAe,CAACC,eAAe,CAACC,IAAI,CAAC;UAC3C0F,MAAM;UACNC,aAAa,EACX,CAAAA,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAE3F,IAAI,MAAK,UAAU,GAC9B2F,aAAa,GACbA,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEK,KAAK;UAC1BJ,QAAQ;UACRC,UAAU;UACVI,UAAU,EAAEH,QAAQ,CAACI,IAAI;UACzB;UACA;UACA;UACAC,eAAe,EAAEJ,gBAAgB,KAAK,CAAC,GAAG,CAAC,GAAGA,gBAAgB;UAC9DjE,KAAK,EAAEhC,eAAe,CAAC+B,gBAAgB,CAACiE,QAAQ,CAAChE,KAAK;QACxD,CAAC;MACH,CAAC,CAAC;MAEF,OAAO;QACLsE,UAAU,EAAE,IAAI;QAChBd;MACF,CAAC;IACH,CAAC,CAAC,CACDe,KAAK,CAAEC,KAAc,IAAK;MACzB1G,GAAG,CAAC0G,KAAK,CAAC,gDAAgD,EAAEA,KAAK,CAAC;MAClE,OAAO;QAAEhB,WAAW,EAAE;MAAG,CAAC;IAC5B,CAAC,CAAC;IAEJ,OAAOH,qBAAqB;EAC9B;EAEAnC,sBAAsBA,CACpBuB,KAA+B,EAC/B/B,QAAyB,EACzB+D,KAA+B,EAC/B/B,OAA8C,EACyB;IACvE,IAAMgC,aAAmD,GAAG;MAC1DR,KAAK,EAAE;QACLS,UAAU,EAAE,EAAE;QACdC,eAAe,EAAE,CAAC;QAClBC,eAAe,EAAE;MACnB,CAAC;MACDrC,OAAO,EAAEA,CAAA,KAAM;QACb;MAAA;IAEJ,CAAC;IAED,IAAM;MAAEC,KAAK,EAAEE,SAAS;MAAErB;IAAQ,CAAC,GAAG,IAAI,CAACR,KAAK;IAChD,IAAI2B,KAAK,KAAKE,SAAS,IAAI,CAACrB,OAAO,CAACK,gBAAgB,EAAE;MACpD,OAAO,IAAI;IACb;IAEA,IAAMiB,MAAM,GAAG;MACbC,YAAY,EAAE;QACZC,GAAG,KAAAC,MAAA,CAAKN,KAAK,CAACK,GAAG,CAAE;QACnBE,OAAO,EAAEP,KAAK,CAACQ,YAAY,CAAC;MAC9B,CAAC;MACDvC,QAAQ,EAAE1C,eAAe,CAACyC,mBAAmB,CAACC,QAAQ,CAAC;MACvDgC;IACF,CAAC;IAED,IAAMoC,cAAc,GAAGxD,OAAO,CAACK,gBAAgB,CAACiB,MAAM,CAAC;IACvD9E,GAAG,CAACsF,KAAK,CAAC,0BAA0B,EAAER,MAAM,CAAC;IAE7C,IAAMmC,gBAAgB,GAAGD,cAAc,CACpCxB,IAAI,CAACC,KAAK,IAAI;MACbzF,GAAG,CAACsF,KAAK,CAAC,uBAAuB,EAAER,MAAM,EAAEkC,cAAc,CAAC;MAC1D,IAAMH,UAAU,GAAGpB,KAAK,CAACE,GAAG,CAACC,IAAI,IAAI;QACnC,IAAM;UAAEC,KAAK;UAAEE,aAAa;UAAEmB;QAAW,CAAC,GAAGtB,IAAI;QAEjD,OAAO;UACLG,aAAa,EACX,CAAAA,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAE3F,IAAI,MAAK,UAAU,GAC9B2F,aAAa,GACbA,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEK,KAAK;UAC1BP,KAAK;UACLqB,UAAU,EAAEA,UAAU,aAAVA,UAAU,cAAVA,UAAU,GAAI;QAC5B,CAAC;MACH,CAAC,CAAC;MAEF,IAAIL,UAAU,CAACM,MAAM,KAAK,CAAC,EAAE;QAC3B,OAAOP,aAAa;MACtB;;MAEA;MACA;MACA,IAAME,eAAe,GAAG,CAAC;MAEzB,OAAO;QACLV,KAAK,EAAE;UACLS,UAAU;UACVC,eAAe;UACfC,eAAe,EAAEtB,KAAK,CAACqB,eAAe,CAAC,CAACC;QAC1C,CAAC;QACDrC,OAAO,EAAEA,CAAA,KAAM;UACb;QAAA;MAEJ,CAAC;IACH,CAAC,CAAC,CACD+B,KAAK,CAAEC,KAAc,IAAK;MACzB1G,GAAG,CAAC0G,KAAK,CAAC,gDAAgD,EAAEA,KAAK,CAAC;MAClE,OAAOE,aAAa;IACtB,CAAC,CAAC;IAEJ,OAAOK,gBAAgB;EACzB;EAEA5D,kBAAkBA,CAChBsB,KAA+B,EAC/B/B,QAAyB,EACgC;IACzD,IAAM;MAAE+B,KAAK,EAAEE,SAAS;MAAErB;IAAQ,CAAC,GAAG,IAAI,CAACR,KAAK;IAChD,IAAI2B,KAAK,KAAKE,SAAS,IAAI,CAACrB,OAAO,CAACU,QAAQ,EAAE;MAC5C,OAAO,IAAI;IACb;IAEA,IAAMY,MAAM,GAAG;MACbC,YAAY,EAAE;QACZC,GAAG,KAAAC,MAAA,CAAKN,KAAK,CAACK,GAAG,CAAE;QACnBE,OAAO,EAAEP,KAAK,CAACQ,YAAY,CAAC;MAC9B,CAAC;MACDvC,QAAQ,EAAE1C,eAAe,CAACyC,mBAAmB,CAACC,QAAQ;IACxD,CAAC;IAED,IAAMwE,KAAK,GAAG5D,OAAO,CAACU,QAAQ,CAACY,MAAM,CAAC;IACtC9E,GAAG,CAACsF,KAAK,CAAC,iBAAiB,EAAER,MAAM,CAAC;IAEpC,IAAMuC,WAAW,GAAGD,KAAK,CACtB5B,IAAI,CAAC8B,SAAS,IAAI;MACjBtH,GAAG,CAACsF,KAAK,CAAC,kBAAkB,EAAER,MAAM,EAAEwC,SAAS,CAAC;MAChD,IAAM;QAAEC,QAAQ,EAAEC;MAAc,CAAC,GAAGF,SAAS;MAE7C,OAAO;QACLC,QAAQ,EAAEC,aAAa,GAAG,CAACA,aAAa,CAAC,GAAG;MAC9C,CAAC;IACH,CAAC,CAAC,CACDf,KAAK,CAAEC,KAAc,IAAK;MACzB1G,GAAG,CAAC0G,KAAK,CAAC,qCAAqC,EAAEA,KAAK,CAAC;MACvD,OAAO;QAAEa,QAAQ,EAAE;MAAG,CAAC;IACzB,CAAC,CAAC;IAEJ,OAAOF,WAAW;EACpB;EAEAI,MAAMA,CAAA,EAAS;IACb,OAAO,IAAI;EACb;AACF;AAEA,eAAevH,eAAe"}