@deephaven/console 1.7.2-beta.1 → 1.7.2-react-18-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Console.d.ts +1 -1
- package/dist/Console.d.ts.map +1 -1
- package/dist/Console.js +6 -8
- package/dist/Console.js.map +1 -1
- package/dist/ConsoleInput.js +30 -34
- package/dist/ConsoleInput.js.map +1 -1
- package/dist/ConsoleObjectsMenu.js +2 -3
- package/dist/ConsoleObjectsMenu.js.map +1 -1
- package/dist/ConsoleShortcuts.js +0 -1
- package/dist/ConsoleShortcuts.js.map +1 -1
- package/dist/ConsoleStatusBar.js +2 -3
- package/dist/ConsoleStatusBar.js.map +1 -1
- package/dist/HeapUsage.js +2 -3
- package/dist/HeapUsage.js.map +1 -1
- package/dist/command-history/CommandHistory.js +2 -3
- package/dist/command-history/CommandHistory.js.map +1 -1
- package/dist/command-history/CommandHistoryActions.js +1 -2
- package/dist/command-history/CommandHistoryActions.js.map +1 -1
- package/dist/command-history/CommandHistoryItem.d.ts +1 -6
- package/dist/command-history/CommandHistoryItem.d.ts.map +1 -1
- package/dist/command-history/CommandHistoryItem.js +5 -10
- package/dist/command-history/CommandHistoryItem.js.map +1 -1
- package/dist/command-history/CommandHistoryItemTooltip.js +2 -3
- package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -1
- package/dist/command-history/CommandHistoryStorage.js.map +1 -1
- package/dist/command-history/CommandHistoryTypes.js.map +1 -1
- package/dist/command-history/CommandHistoryViewportUpdater.js.map +1 -1
- package/dist/command-history/index.js.map +1 -1
- package/dist/common/Code.js.map +1 -1
- package/dist/common/ConsoleConstants.js.map +1 -1
- package/dist/common/ConsoleUtils.js.map +1 -1
- package/dist/common/ObjectIcon.js.map +1 -1
- package/dist/common/index.js.map +1 -1
- package/dist/console-history/ConsoleHistory.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItem.js +1 -2
- package/dist/console-history/ConsoleHistoryItem.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItemResult.d.ts +2 -10
- package/dist/console-history/ConsoleHistoryItemResult.d.ts.map +1 -1
- package/dist/console-history/ConsoleHistoryItemResult.js +1 -6
- package/dist/console-history/ConsoleHistoryItemResult.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultErrorMessage.js +1 -3
- package/dist/console-history/ConsoleHistoryResultErrorMessage.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultInProgress.js +1 -2
- package/dist/console-history/ConsoleHistoryResultInProgress.js.map +1 -1
- package/dist/console-history/ConsoleHistoryTypes.js.map +1 -1
- package/dist/console-history/index.js.map +1 -1
- package/dist/csv/CsvFormats.js.map +1 -1
- package/dist/csv/CsvInputBar.js +2 -3
- package/dist/csv/CsvInputBar.js.map +1 -1
- package/dist/csv/CsvOverlay.js +5 -6
- package/dist/csv/CsvOverlay.js.map +1 -1
- package/dist/csv/CsvParser.js +4 -3
- package/dist/csv/CsvParser.js.map +1 -1
- package/dist/csv/CsvTypeParser.js.map +1 -1
- package/dist/csv/ZipStreamHelper.js.map +1 -1
- package/dist/declaration.d.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/log/LogLevel.js.map +1 -1
- package/dist/log/LogLevelMenuItem.js +1 -2
- package/dist/log/LogLevelMenuItem.js.map +1 -1
- package/dist/log/LogView.js +9 -12
- package/dist/log/LogView.js.map +1 -1
- package/dist/monaco/MonacoProviders.js +3 -4
- package/dist/monaco/MonacoProviders.js.map +1 -1
- package/dist/monaco/MonacoThemeProvider.js +1 -2
- package/dist/monaco/MonacoThemeProvider.js.map +1 -1
- package/dist/monaco/MonacoUtils.js +1 -1
- package/dist/monaco/MonacoUtils.js.map +1 -1
- package/dist/monaco/RuffDefaultSettings.js +0 -1
- package/dist/monaco/RuffDefaultSettings.js.map +1 -1
- package/dist/monaco/RuffSettingsModal.js +5 -7
- package/dist/monaco/RuffSettingsModal.js.map +1 -1
- package/dist/monaco/index.js.map +1 -1
- package/dist/monaco/lang/Language.js.map +1 -1
- package/dist/monaco/lang/db.js +0 -1
- package/dist/monaco/lang/db.js.map +1 -1
- package/dist/monaco/lang/groovy.js +0 -1
- package/dist/monaco/lang/groovy.js.map +1 -1
- package/dist/monaco/lang/log.js.map +1 -1
- package/dist/monaco/lang/python.js +0 -1
- package/dist/monaco/lang/python.js.map +1 -1
- package/dist/monaco/lang/scala.js.map +1 -1
- package/dist/monaco/ruffSchema.js.map +1 -1
- package/dist/notebook/Editor.js +1 -1
- package/dist/notebook/Editor.js.map +1 -1
- package/dist/notebook/ScriptEditor.js +1 -3
- package/dist/notebook/ScriptEditor.js.map +1 -1
- package/dist/notebook/ScriptEditorUtils.js.map +1 -1
- package/package.json +14 -15
- package/dist/ConsolePropTypes.d.ts +0 -9
- package/dist/ConsolePropTypes.d.ts.map +0 -1
- package/dist/ConsolePropTypes.js +0 -10
- package/dist/ConsolePropTypes.js.map +0 -1
- package/dist/StoragePropTypes.d.ts +0 -14
- package/dist/StoragePropTypes.d.ts.map +0 -1
- package/dist/StoragePropTypes.js +0 -16
- package/dist/StoragePropTypes.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvFormats.js","names":["CsvFormats","fromExtension","fileName","endsWith","_defineProperty","Object","freeze","DEFAULT_CSV","name","delimiter","newline","undefined","escapeChar","shouldTrim","skipEmptyLines","nullString","TSV","APACHE_COMMON_CSV","EXCEL_CSV","MY_SQL_CSV","RFC4180_CSV","COLON_SV","SEMI_COLON_SV","PIPE_SV","SPACE_SV","AUTODETECT"],"sources":["../../src/csv/CsvFormats.ts"],"sourcesContent":["export type CsvTypes = (typeof CsvFormats.TYPES)[keyof typeof CsvFormats.TYPES];\n\nclass CsvFormats {\n static DEFAULT_TYPE = 'DEFAULT_CSV' as const;\n\n static AUTO = 'AUTODETECT' as const;\n\n static fromExtension(fileName: string): keyof typeof CsvFormats.TYPES {\n if (fileName.endsWith('.csv')) {\n return 'DEFAULT_CSV';\n }\n if (fileName.endsWith('.tsv') || fileName.endsWith('.tab')) {\n return 'TSV';\n }\n if (fileName.endsWith('.psv')) {\n return 'PIPE_SV';\n }\n return 'AUTODETECT';\n }\n\n static TYPES = Object.freeze({\n DEFAULT_CSV: {\n name: 'Default csv (trimmed)',\n delimiter: ',',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n TSV: {\n name: 'Tab seperated (tsv)',\n delimiter: '\\t',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n // From org.apache.commons.csv.CSVFormat#DEFAULT\n APACHE_COMMON_CSV: {\n name: 'Apache Common csv',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: null,\n },\n\n // From org.apache.commons.csv.CSVFormat#EXCEL\n EXCEL_CSV: {\n name: 'Excel csv (strict)',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: null,\n },\n\n // From org.apache.commons.csv.CSVFormat#MYSQL\n MY_SQL_CSV: {\n name: 'MySQL csv',\n delimiter: '\\t',\n newline: '\\n',\n escapeChar: '\\\\',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: '\\\\N',\n },\n\n // From org.apache.commons.csv.CSVFormat#RFC4180\n RFC4180_CSV: {\n name: 'RFC4180 csv',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: null,\n },\n\n COLON_SV: {\n name: ': colon sv',\n delimiter: ':',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n SEMI_COLON_SV: {\n name: '; semi-colon sv',\n delimiter: ';',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n PIPE_SV: {\n name: '| pipe separated (psv)',\n delimiter: '|',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n SPACE_SV: {\n name: '\" \" space sv',\n delimiter: ' ',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n AUTODETECT: {\n name: 'autodetect',\n delimiter: undefined, // autodetect\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n });\n}\n\nexport default CsvFormats;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CsvFormats.js","names":["CsvFormats","fromExtension","fileName","endsWith","_defineProperty","Object","freeze","DEFAULT_CSV","name","delimiter","newline","undefined","escapeChar","shouldTrim","skipEmptyLines","nullString","TSV","APACHE_COMMON_CSV","EXCEL_CSV","MY_SQL_CSV","RFC4180_CSV","COLON_SV","SEMI_COLON_SV","PIPE_SV","SPACE_SV","AUTODETECT"],"sources":["../../src/csv/CsvFormats.ts"],"sourcesContent":["export type CsvTypes = (typeof CsvFormats.TYPES)[keyof typeof CsvFormats.TYPES];\n\nclass CsvFormats {\n static DEFAULT_TYPE = 'DEFAULT_CSV' as const;\n\n static AUTO = 'AUTODETECT' as const;\n\n static fromExtension(fileName: string): keyof typeof CsvFormats.TYPES {\n if (fileName.endsWith('.csv')) {\n return 'DEFAULT_CSV';\n }\n if (fileName.endsWith('.tsv') || fileName.endsWith('.tab')) {\n return 'TSV';\n }\n if (fileName.endsWith('.psv')) {\n return 'PIPE_SV';\n }\n return 'AUTODETECT';\n }\n\n static TYPES = Object.freeze({\n DEFAULT_CSV: {\n name: 'Default csv (trimmed)',\n delimiter: ',',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n TSV: {\n name: 'Tab seperated (tsv)',\n delimiter: '\\t',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n // From org.apache.commons.csv.CSVFormat#DEFAULT\n APACHE_COMMON_CSV: {\n name: 'Apache Common csv',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: null,\n },\n\n // From org.apache.commons.csv.CSVFormat#EXCEL\n EXCEL_CSV: {\n name: 'Excel csv (strict)',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: null,\n },\n\n // From org.apache.commons.csv.CSVFormat#MYSQL\n MY_SQL_CSV: {\n name: 'MySQL csv',\n delimiter: '\\t',\n newline: '\\n',\n escapeChar: '\\\\',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: '\\\\N',\n },\n\n // From org.apache.commons.csv.CSVFormat#RFC4180\n RFC4180_CSV: {\n name: 'RFC4180 csv',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: null,\n },\n\n COLON_SV: {\n name: ': colon sv',\n delimiter: ':',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n SEMI_COLON_SV: {\n name: '; semi-colon sv',\n delimiter: ';',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n PIPE_SV: {\n name: '| pipe separated (psv)',\n delimiter: '|',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n SPACE_SV: {\n name: '\" \" space sv',\n delimiter: ' ',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n AUTODETECT: {\n name: 'autodetect',\n delimiter: undefined, // autodetect\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n });\n}\n\nexport default CsvFormats;\n"],"mappings":"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","ignoreList":[]}
|
package/dist/csv/CsvInputBar.js
CHANGED
|
@@ -10,8 +10,7 @@ import CsvOverlay from "./CsvOverlay.js";
|
|
|
10
10
|
import CsvParser from "./CsvParser.js";
|
|
11
11
|
import CsvFormats from "./CsvFormats.js";
|
|
12
12
|
import "./CsvInputBar.css";
|
|
13
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
|
-
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
14
|
var log = Log.module('CsvInputBar');
|
|
16
15
|
var TYPE_OPTIONS = Object.entries(CsvFormats.TYPES).map(_ref => {
|
|
17
16
|
var [key, value] = _ref;
|
|
@@ -67,7 +66,7 @@ class CsvInputBar extends Component {
|
|
|
67
66
|
tableName: fileTableName,
|
|
68
67
|
tableNameSet: true
|
|
69
68
|
});
|
|
70
|
-
(_this$inputRef$curren = this.inputRef.current) === null || _this$inputRef$curren === void 0
|
|
69
|
+
(_this$inputRef$curren = this.inputRef.current) === null || _this$inputRef$curren === void 0 || _this$inputRef$curren.focus();
|
|
71
70
|
} else if (file == null && prevProps.file != null || paste == null && prevProps.paste != null) {
|
|
72
71
|
// The file or paste was unstaged
|
|
73
72
|
this.setState({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvInputBar.js","names":["React","Component","classNames","Button","Checkbox","Select","Log","DbNameValidator","CsvOverlay","CsvParser","CsvFormats","jsx","_jsx","jsxs","_jsxs","log","module","TYPE_OPTIONS","Object","entries","TYPES","map","_ref","key","value","children","name","CsvInputBar","constructor","props","_defineProperty","handleUpload","bind","handleCancel","handleError","handleTableName","toggleFirstRowHeaders","handleProgress","handleCancelInProgress","handleQueryTypeChange","inputRef","createRef","state","tableName","tableNameSet","isFirstRowHeaders","showProgress","progressValue","type","DEFAULT_TYPE","parser","componentDidUpdate","prevProps","file","paste","_this$inputRef$curren","dotIndex","lastIndexOf","fileTableName","makeVariableName","substring","setState","current","focus","fromExtension","undefined","AUTO","componentWillUnmount","cancel","onClose","e","onError","error","event","target","stopPropagation","preventDefault","endsWith","handleZipFile","handleFile","Blob","isZip","arguments","length","info","concat","File","size","session","timeZone","onInProgress","handleParseDone","tables","bindTableToVariable","then","openTable","catch","mergeTables","table","forEach","t","close","onFileCompleted","readHeaders","onProgress","parse","zipFile","onUpdate","unzip","Error","files","csvFound","i","f","isValidExtension","onOpenTable","eventTargetValue","render","isNameInvalid","Boolean","className","onSubmit","htmlFor","ref","id","onChange","checked","kind","onClick","disabled","style","width"],"sources":["../../src/csv/CsvInputBar.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n Component,\n type FormEvent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport classNames from 'classnames';\nimport type { JSZipObject } from 'jszip';\nimport { Button, Checkbox, Select } from '@deephaven/components';\nimport type { dh } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { DbNameValidator } from '@deephaven/utils';\nimport CsvOverlay from './CsvOverlay';\nimport CsvParser from './CsvParser';\nimport CsvFormats from './CsvFormats';\nimport './CsvInputBar.scss';\n\nconst log = Log.module('CsvInputBar');\n\nconst TYPE_OPTIONS = Object.entries(CsvFormats.TYPES).map(([key, value]) => (\n <option key={key} value={key}>\n {value.name}\n </option>\n));\n\ninterface CsvInputBarProps {\n session: dh.IdeSession;\n onOpenTable: (name: string) => void;\n onClose: () => void;\n onUpdate: (update: string) => void;\n onError: (e: unknown) => void;\n file: File;\n paste?: string;\n onInProgress: (boolean: boolean) => void;\n timeZone: string;\n unzip?: (zipFile: File) => Promise<JSZipObject[]>;\n}\n\ninterface CsvInputBarState {\n tableName: string;\n tableNameSet: boolean;\n isFirstRowHeaders: boolean;\n showProgress: boolean;\n progressValue: number;\n type: keyof typeof CsvFormats.TYPES;\n parser: CsvParser | null;\n}\n/**\n * Input controls for CSV upload.\n */\nclass CsvInputBar extends Component<CsvInputBarProps, CsvInputBarState> {\n static defaultProps = {\n file: null,\n paste: null,\n unzip: null,\n };\n\n constructor(props: CsvInputBarProps) {\n super(props);\n\n this.handleUpload = this.handleUpload.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleTableName = this.handleTableName.bind(this);\n this.toggleFirstRowHeaders = this.toggleFirstRowHeaders.bind(this);\n this.handleProgress = this.handleProgress.bind(this);\n this.handleCancelInProgress = this.handleCancelInProgress.bind(this);\n this.handleQueryTypeChange = this.handleQueryTypeChange.bind(this);\n\n this.inputRef = React.createRef();\n\n this.state = {\n tableName: '',\n tableNameSet: false,\n isFirstRowHeaders: true,\n showProgress: false,\n progressValue: 0,\n type: CsvFormats.DEFAULT_TYPE,\n parser: null,\n };\n }\n\n // React documentation says it is fine to update state inside an if statment\n /* eslint-disable react/no-did-update-set-state */\n componentDidUpdate(prevProps: CsvInputBarProps): void {\n const { file, paste } = this.props;\n const { tableName, tableNameSet } = this.state;\n // Set the table name from a file\n if (!tableNameSet && file != null && !tableName) {\n const dotIndex = file.name.lastIndexOf('.');\n const fileTableName = DbNameValidator.makeVariableName(\n file.name.substring(0, dotIndex)\n );\n this.setState({\n tableName: fileTableName,\n tableNameSet: true,\n });\n this.inputRef.current?.focus();\n } else if (\n (file == null && prevProps.file != null) ||\n (paste == null && prevProps.paste != null)\n ) {\n // The file or paste was unstaged\n this.setState({\n tableName: '',\n tableNameSet: false,\n });\n }\n\n // Focus the name input field on paste\n if (paste != null && paste !== '' && !tableName && this.inputRef.current) {\n this.inputRef.current.focus();\n }\n\n // Determine parser type by file extension\n if (file != null && file !== prevProps.file) {\n this.setState({\n type: CsvFormats.fromExtension(file.name),\n });\n } else if (\n paste != null &&\n paste !== '' &&\n (prevProps.paste === undefined || prevProps.paste === '')\n ) {\n this.setState({\n type: CsvFormats.AUTO,\n });\n }\n }\n\n componentWillUnmount(): void {\n const { parser } = this.state;\n if (parser) {\n parser.cancel();\n }\n }\n\n inputRef: RefObject<HTMLInputElement>;\n\n handleCancel(): void {\n const { onClose } = this.props;\n onClose();\n }\n\n handleError(e: unknown): void {\n const { onClose, onError } = this.props;\n log.error(e);\n onError(e);\n onClose();\n }\n\n handleTableName(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({ tableName: event.target.value, tableNameSet: true });\n }\n\n toggleFirstRowHeaders(): void {\n const { isFirstRowHeaders } = this.state;\n this.setState({ isFirstRowHeaders: !isFirstRowHeaders });\n }\n\n handleUpload(event: FormEvent<HTMLFormElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { file, paste } = this.props;\n if (file != null) {\n if (file.name.endsWith('.zip')) {\n this.handleZipFile(file);\n } else {\n this.handleFile(file);\n }\n } else if (paste !== undefined && paste !== '') {\n this.handleFile(\n new Blob([paste], {\n type: 'text/plain',\n })\n );\n }\n }\n\n handleFile(file: File | Blob | JSZipObject, isZip = false): void {\n log.info(\n `Starting CSV parser for ${\n file instanceof File ? file.name : 'pasted values'\n } ${isZip ? '' : (file as Blob).size} bytes`\n );\n const { session, timeZone, onInProgress } = this.props;\n const { tableName, isFirstRowHeaders, type } = this.state;\n const handleParseDone = (tables: dh.Table[]): void => {\n // Do not bother merging just one table\n if (tables.length === 1) {\n session\n .bindTableToVariable(tables[0], tableName)\n .then(() => this.openTable())\n .catch(e => this.handleError(e));\n } else {\n session\n .mergeTables(tables)\n .then(table => {\n session\n .bindTableToVariable(table, tableName)\n .then(() => this.openTable())\n .catch(e => this.handleError(e));\n tables.forEach(t => t.close());\n })\n .catch(e => this.handleError(e));\n }\n };\n const parser = new CsvParser({\n onFileCompleted: handleParseDone,\n session,\n file,\n type: CsvFormats.TYPES[type],\n readHeaders: isFirstRowHeaders,\n onProgress: this.handleProgress,\n onError: this.handleError,\n timeZone,\n isZip,\n });\n parser.parse();\n this.setState({\n showProgress: true,\n parser,\n });\n // Note that calling onClose will set in progress to false\n onInProgress(true);\n }\n\n handleZipFile(zipFile: File): void {\n const { onUpdate, unzip } = this.props;\n if (unzip == null) {\n this.handleError(new Error('No support for zip files available.'));\n return;\n }\n\n unzip(zipFile)\n .then(files => {\n let csvFound = false;\n // Find the first Csv file in the zip and use that\n for (let i = 0; i < files.length; i += 1) {\n const f = files[i];\n if (CsvOverlay.isValidExtension(f.name)) {\n onUpdate(`Loading ${f.name} as csv from ${zipFile.name}`);\n csvFound = true;\n this.handleFile(f, true);\n break;\n }\n }\n if (!csvFound) {\n throw new Error(`No csv file found in ${zipFile.name}`);\n }\n })\n .catch(e => this.handleError(e));\n }\n\n handleProgress(progressValue: number): boolean {\n const { showProgress } = this.state;\n if (showProgress) {\n this.setState({\n progressValue,\n });\n }\n // Indicates to the caller that the upload has been cancelled\n return !showProgress;\n }\n\n // Cancels an in progress upload\n handleCancelInProgress(): void {\n const { onInProgress } = this.props;\n const { parser } = this.state;\n if (parser) {\n parser.cancel();\n }\n this.setState({\n showProgress: false,\n progressValue: 0,\n });\n onInProgress(false);\n }\n\n openTable(): void {\n const { onOpenTable, onClose } = this.props;\n const { tableName } = this.state;\n onOpenTable(tableName);\n onClose();\n }\n\n handleQueryTypeChange(eventTargetValue: string): void {\n this.setState({\n type: eventTargetValue as keyof typeof CsvFormats.TYPES,\n });\n }\n\n render(): ReactElement {\n const { file, paste } = this.props;\n const { tableName, isFirstRowHeaders, showProgress, progressValue, type } =\n this.state;\n // A blank table name is invalid for pasted values\n const isNameInvalid = Boolean(paste) && !tableName;\n return (\n <div className=\"csv-input-bar\">\n {!showProgress && (\n <form\n onSubmit={this.handleUpload}\n className=\"csv-input-bar-container form-inline\"\n >\n <div className=\"form-group\">\n <label htmlFor=\"tableNameInput\">Table name</label>\n <input\n ref={this.inputRef}\n id=\"tableNameInput\"\n type=\"text\"\n className={classNames('form-control', {\n 'is-invalid': isNameInvalid,\n })}\n value={tableName}\n onChange={this.handleTableName}\n />\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"formatSelect\">File format</label>\n <Select\n id=\"formatSelect\"\n className=\"custom-select\"\n value={type}\n onChange={this.handleQueryTypeChange}\n >\n {TYPE_OPTIONS}\n </Select>\n </div>\n <Checkbox\n className=\"firstRowHeaders\"\n checked={isFirstRowHeaders}\n onChange={this.toggleFirstRowHeaders}\n >\n First row is column headers\n </Checkbox>\n <div className=\"csv-input-buttons form-group\">\n <Button kind=\"secondary\" onClick={this.handleCancel}>\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n type=\"submit\"\n disabled={\n !(file !== null || (paste !== undefined && paste !== '')) ||\n !tableName\n }\n >\n Upload\n </Button>\n </div>\n </form>\n )}\n {showProgress && (\n <div className=\"csv-progress-container\">\n <label>Uploading Table</label>\n <div className=\"progress\">\n <div\n className=\"progress-bar bg-primary\"\n style={{ width: `${progressValue}%` }}\n aria-valuenow={progressValue}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </div>\n <label>{progressValue}%</label>\n <Button kind=\"primary\" onClick={this.handleCancelInProgress}>\n Cancel\n </Button>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvInputBar;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CsvInputBar.js","names":["React","Component","classNames","Button","Checkbox","Select","Log","DbNameValidator","CsvOverlay","CsvParser","CsvFormats","jsx","_jsx","jsxs","_jsxs","log","module","TYPE_OPTIONS","Object","entries","TYPES","map","_ref","key","value","children","name","CsvInputBar","constructor","props","_defineProperty","handleUpload","bind","handleCancel","handleError","handleTableName","toggleFirstRowHeaders","handleProgress","handleCancelInProgress","handleQueryTypeChange","inputRef","createRef","state","tableName","tableNameSet","isFirstRowHeaders","showProgress","progressValue","type","DEFAULT_TYPE","parser","componentDidUpdate","prevProps","file","paste","_this$inputRef$curren","dotIndex","lastIndexOf","fileTableName","makeVariableName","substring","setState","current","focus","fromExtension","undefined","AUTO","componentWillUnmount","cancel","onClose","e","onError","error","event","target","stopPropagation","preventDefault","endsWith","handleZipFile","handleFile","Blob","isZip","arguments","length","info","concat","File","size","session","timeZone","onInProgress","handleParseDone","tables","bindTableToVariable","then","openTable","catch","mergeTables","table","forEach","t","close","onFileCompleted","readHeaders","onProgress","parse","zipFile","onUpdate","unzip","Error","files","csvFound","i","f","isValidExtension","onOpenTable","eventTargetValue","render","isNameInvalid","Boolean","className","onSubmit","htmlFor","ref","id","onChange","checked","kind","onClick","disabled","style","width"],"sources":["../../src/csv/CsvInputBar.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n Component,\n type FormEvent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport classNames from 'classnames';\nimport type { JSZipObject } from 'jszip';\nimport { Button, Checkbox, Select } from '@deephaven/components';\nimport type { dh } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { DbNameValidator } from '@deephaven/utils';\nimport CsvOverlay from './CsvOverlay';\nimport CsvParser from './CsvParser';\nimport CsvFormats from './CsvFormats';\nimport './CsvInputBar.scss';\n\nconst log = Log.module('CsvInputBar');\n\nconst TYPE_OPTIONS = Object.entries(CsvFormats.TYPES).map(([key, value]) => (\n <option key={key} value={key}>\n {value.name}\n </option>\n));\n\ninterface CsvInputBarProps {\n session: dh.IdeSession;\n onOpenTable: (name: string) => void;\n onClose: () => void;\n onUpdate: (update: string) => void;\n onError: (e: unknown) => void;\n file: File;\n paste?: string;\n onInProgress: (boolean: boolean) => void;\n timeZone: string;\n unzip?: (zipFile: File) => Promise<JSZipObject[]>;\n}\n\ninterface CsvInputBarState {\n tableName: string;\n tableNameSet: boolean;\n isFirstRowHeaders: boolean;\n showProgress: boolean;\n progressValue: number;\n type: keyof typeof CsvFormats.TYPES;\n parser: CsvParser | null;\n}\n/**\n * Input controls for CSV upload.\n */\nclass CsvInputBar extends Component<CsvInputBarProps, CsvInputBarState> {\n static defaultProps = {\n file: null,\n paste: null,\n unzip: null,\n };\n\n constructor(props: CsvInputBarProps) {\n super(props);\n\n this.handleUpload = this.handleUpload.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleTableName = this.handleTableName.bind(this);\n this.toggleFirstRowHeaders = this.toggleFirstRowHeaders.bind(this);\n this.handleProgress = this.handleProgress.bind(this);\n this.handleCancelInProgress = this.handleCancelInProgress.bind(this);\n this.handleQueryTypeChange = this.handleQueryTypeChange.bind(this);\n\n this.inputRef = React.createRef();\n\n this.state = {\n tableName: '',\n tableNameSet: false,\n isFirstRowHeaders: true,\n showProgress: false,\n progressValue: 0,\n type: CsvFormats.DEFAULT_TYPE,\n parser: null,\n };\n }\n\n // React documentation says it is fine to update state inside an if statment\n /* eslint-disable react/no-did-update-set-state */\n componentDidUpdate(prevProps: CsvInputBarProps): void {\n const { file, paste } = this.props;\n const { tableName, tableNameSet } = this.state;\n // Set the table name from a file\n if (!tableNameSet && file != null && !tableName) {\n const dotIndex = file.name.lastIndexOf('.');\n const fileTableName = DbNameValidator.makeVariableName(\n file.name.substring(0, dotIndex)\n );\n this.setState({\n tableName: fileTableName,\n tableNameSet: true,\n });\n this.inputRef.current?.focus();\n } else if (\n (file == null && prevProps.file != null) ||\n (paste == null && prevProps.paste != null)\n ) {\n // The file or paste was unstaged\n this.setState({\n tableName: '',\n tableNameSet: false,\n });\n }\n\n // Focus the name input field on paste\n if (paste != null && paste !== '' && !tableName && this.inputRef.current) {\n this.inputRef.current.focus();\n }\n\n // Determine parser type by file extension\n if (file != null && file !== prevProps.file) {\n this.setState({\n type: CsvFormats.fromExtension(file.name),\n });\n } else if (\n paste != null &&\n paste !== '' &&\n (prevProps.paste === undefined || prevProps.paste === '')\n ) {\n this.setState({\n type: CsvFormats.AUTO,\n });\n }\n }\n\n componentWillUnmount(): void {\n const { parser } = this.state;\n if (parser) {\n parser.cancel();\n }\n }\n\n inputRef: RefObject<HTMLInputElement>;\n\n handleCancel(): void {\n const { onClose } = this.props;\n onClose();\n }\n\n handleError(e: unknown): void {\n const { onClose, onError } = this.props;\n log.error(e);\n onError(e);\n onClose();\n }\n\n handleTableName(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({ tableName: event.target.value, tableNameSet: true });\n }\n\n toggleFirstRowHeaders(): void {\n const { isFirstRowHeaders } = this.state;\n this.setState({ isFirstRowHeaders: !isFirstRowHeaders });\n }\n\n handleUpload(event: FormEvent<HTMLFormElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { file, paste } = this.props;\n if (file != null) {\n if (file.name.endsWith('.zip')) {\n this.handleZipFile(file);\n } else {\n this.handleFile(file);\n }\n } else if (paste !== undefined && paste !== '') {\n this.handleFile(\n new Blob([paste], {\n type: 'text/plain',\n })\n );\n }\n }\n\n handleFile(file: File | Blob | JSZipObject, isZip = false): void {\n log.info(\n `Starting CSV parser for ${\n file instanceof File ? file.name : 'pasted values'\n } ${isZip ? '' : (file as Blob).size} bytes`\n );\n const { session, timeZone, onInProgress } = this.props;\n const { tableName, isFirstRowHeaders, type } = this.state;\n const handleParseDone = (tables: dh.Table[]): void => {\n // Do not bother merging just one table\n if (tables.length === 1) {\n session\n .bindTableToVariable(tables[0], tableName)\n .then(() => this.openTable())\n .catch(e => this.handleError(e));\n } else {\n session\n .mergeTables(tables)\n .then(table => {\n session\n .bindTableToVariable(table, tableName)\n .then(() => this.openTable())\n .catch(e => this.handleError(e));\n tables.forEach(t => t.close());\n })\n .catch(e => this.handleError(e));\n }\n };\n const parser = new CsvParser({\n onFileCompleted: handleParseDone,\n session,\n file,\n type: CsvFormats.TYPES[type],\n readHeaders: isFirstRowHeaders,\n onProgress: this.handleProgress,\n onError: this.handleError,\n timeZone,\n isZip,\n });\n parser.parse();\n this.setState({\n showProgress: true,\n parser,\n });\n // Note that calling onClose will set in progress to false\n onInProgress(true);\n }\n\n handleZipFile(zipFile: File): void {\n const { onUpdate, unzip } = this.props;\n if (unzip == null) {\n this.handleError(new Error('No support for zip files available.'));\n return;\n }\n\n unzip(zipFile)\n .then(files => {\n let csvFound = false;\n // Find the first Csv file in the zip and use that\n for (let i = 0; i < files.length; i += 1) {\n const f = files[i];\n if (CsvOverlay.isValidExtension(f.name)) {\n onUpdate(`Loading ${f.name} as csv from ${zipFile.name}`);\n csvFound = true;\n this.handleFile(f, true);\n break;\n }\n }\n if (!csvFound) {\n throw new Error(`No csv file found in ${zipFile.name}`);\n }\n })\n .catch(e => this.handleError(e));\n }\n\n handleProgress(progressValue: number): boolean {\n const { showProgress } = this.state;\n if (showProgress) {\n this.setState({\n progressValue,\n });\n }\n // Indicates to the caller that the upload has been cancelled\n return !showProgress;\n }\n\n // Cancels an in progress upload\n handleCancelInProgress(): void {\n const { onInProgress } = this.props;\n const { parser } = this.state;\n if (parser) {\n parser.cancel();\n }\n this.setState({\n showProgress: false,\n progressValue: 0,\n });\n onInProgress(false);\n }\n\n openTable(): void {\n const { onOpenTable, onClose } = this.props;\n const { tableName } = this.state;\n onOpenTable(tableName);\n onClose();\n }\n\n handleQueryTypeChange(eventTargetValue: string): void {\n this.setState({\n type: eventTargetValue as keyof typeof CsvFormats.TYPES,\n });\n }\n\n render(): ReactElement {\n const { file, paste } = this.props;\n const { tableName, isFirstRowHeaders, showProgress, progressValue, type } =\n this.state;\n // A blank table name is invalid for pasted values\n const isNameInvalid = Boolean(paste) && !tableName;\n return (\n <div className=\"csv-input-bar\">\n {!showProgress && (\n <form\n onSubmit={this.handleUpload}\n className=\"csv-input-bar-container form-inline\"\n >\n <div className=\"form-group\">\n <label htmlFor=\"tableNameInput\">Table name</label>\n <input\n ref={this.inputRef}\n id=\"tableNameInput\"\n type=\"text\"\n className={classNames('form-control', {\n 'is-invalid': isNameInvalid,\n })}\n value={tableName}\n onChange={this.handleTableName}\n />\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"formatSelect\">File format</label>\n <Select\n id=\"formatSelect\"\n className=\"custom-select\"\n value={type}\n onChange={this.handleQueryTypeChange}\n >\n {TYPE_OPTIONS}\n </Select>\n </div>\n <Checkbox\n className=\"firstRowHeaders\"\n checked={isFirstRowHeaders}\n onChange={this.toggleFirstRowHeaders}\n >\n First row is column headers\n </Checkbox>\n <div className=\"csv-input-buttons form-group\">\n <Button kind=\"secondary\" onClick={this.handleCancel}>\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n type=\"submit\"\n disabled={\n !(file !== null || (paste !== undefined && paste !== '')) ||\n !tableName\n }\n >\n Upload\n </Button>\n </div>\n </form>\n )}\n {showProgress && (\n <div className=\"csv-progress-container\">\n <label>Uploading Table</label>\n <div className=\"progress\">\n <div\n className=\"progress-bar bg-primary\"\n style={{ width: `${progressValue}%` }}\n aria-valuenow={progressValue}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </div>\n <label>{progressValue}%</label>\n <Button kind=\"primary\" onClick={this.handleCancelInProgress}>\n Cancel\n </Button>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvInputBar;\n"],"mappings":"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","ignoreList":[]}
|
package/dist/csv/CsvOverlay.js
CHANGED
|
@@ -8,8 +8,7 @@ import { Button, ContextActions, GLOBAL_SHORTCUTS } from '@deephaven/components'
|
|
|
8
8
|
import { dhFileCsv, dhFileDownload, dhFileSpreadsheet, vsClippy, vsFileZip, vsTrash, vsWarning } from '@deephaven/icons';
|
|
9
9
|
import "./CsvOverlay.css";
|
|
10
10
|
import { assertNotNull, TextUtils } from '@deephaven/utils';
|
|
11
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
12
|
-
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
12
|
var PASTED_VALUES = 'pasted values';
|
|
14
13
|
var INVALID_MIME_TYPES = [/^audio.*/, /^font.*/, /^image.*/, /^video.*/];
|
|
15
14
|
var VALID_EXTENSIONS = ['.csv', '.tsv', '.tab', '.psv', '.dsv', '.txt'];
|
|
@@ -63,18 +62,18 @@ class CsvOverlay extends Component {
|
|
|
63
62
|
}
|
|
64
63
|
componentDidMount() {
|
|
65
64
|
var _this$divElem$current, _this$divElem$current2;
|
|
66
|
-
(_this$divElem$current = this.divElem.current) === null || _this$divElem$current === void 0
|
|
67
|
-
(_this$divElem$current2 = this.divElem.current) === null || _this$divElem$current2 === void 0
|
|
65
|
+
(_this$divElem$current = this.divElem.current) === null || _this$divElem$current === void 0 || _this$divElem$current.addEventListener('paste', this.handlePasteEvent);
|
|
66
|
+
(_this$divElem$current2 = this.divElem.current) === null || _this$divElem$current2 === void 0 || _this$divElem$current2.focus();
|
|
68
67
|
}
|
|
69
68
|
componentWillUnmount() {
|
|
70
69
|
var _this$divElem$current3;
|
|
71
|
-
(_this$divElem$current3 = this.divElem.current) === null || _this$divElem$current3 === void 0
|
|
70
|
+
(_this$divElem$current3 = this.divElem.current) === null || _this$divElem$current3 === void 0 || _this$divElem$current3.removeEventListener('paste', this.handlePasteEvent);
|
|
72
71
|
}
|
|
73
72
|
handleSelectFile() {
|
|
74
73
|
if (this.fileElem.current) {
|
|
75
74
|
var _this$fileElem$curren;
|
|
76
75
|
this.fileElem.current.value = '';
|
|
77
|
-
(_this$fileElem$curren = this.fileElem.current) === null || _this$fileElem$curren === void 0
|
|
76
|
+
(_this$fileElem$curren = this.fileElem.current) === null || _this$fileElem$curren === void 0 || _this$fileElem$curren.click();
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
79
|
handleFiles(event) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvOverlay.js","names":["React","Component","memoize","FontAwesomeIcon","Button","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","assertNotNull","TextUtils","jsx","_jsx","jsxs","_jsxs","PASTED_VALUES","INVALID_MIME_TYPES","VALID_EXTENSIONS","ZIP_EXTENSIONS","CsvOverlay","isValidDropItem","item","kind","find","invalid","test","type","isValidExtension","name","allowZip","arguments","length","undefined","some","ext","endsWith","handleDragOver","e","preventDefault","stopPropagation","getIcon","fileName","constructor","props","_defineProperty","getValidExtensions","join","handleSelectFile","bind","handleFiles","handleDrop","unstageFile","handleMenuPaste","handlePasteEvent","fileElem","createRef","divElem","state","selectedFileName","componentDidMount","_this$divElem$current","_this$divElem$current2","current","addEventListener","focus","componentWillUnmount","_this$divElem$current3","removeEventListener","_this$fileElem$curren","value","click","event","files","target","handleFile","clearDragError","dragError","dataTransfer","items","file","getAsFile","setState","dropError","FILE_TYPE_ERROR","onCancel","onFileOpened","onPaste","onError","uploadInProgress","navigator","clipboard","readText","then","clipText","catch","makeContextMenuItems","title","icon","action","shortcut","PASTE","disabled","render","error","contextActions","ref","className","onDragOver","onDrop","tabIndex","children","actions","id","accept","getAcceptString","style","display","onChange","onClick","tooltip","Boolean","getFileTypeErrorString"],"sources":["../../src/csv/CsvOverlay.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n Component,\n type DragEvent,\n type MouseEvent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport memoize from 'memoize-one';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n Button,\n type ContextAction,\n ContextActions,\n GLOBAL_SHORTCUTS,\n} from '@deephaven/components';\nimport {\n dhFileCsv,\n dhFileDownload,\n dhFileSpreadsheet,\n type IconDefinition,\n vsClippy,\n vsFileZip,\n vsTrash,\n vsWarning,\n} from '@deephaven/icons';\nimport './CsvOverlay.scss';\nimport { assertNotNull, TextUtils } from '@deephaven/utils';\n\ninterface CsvOverlayProps {\n allowZip: boolean;\n onFileOpened: (file: File) => void;\n onCancel: () => void;\n onPaste: (clipText: string) => void;\n clearDragError: () => void;\n dragError: string | null;\n onError: (e: unknown) => void;\n uploadInProgress: boolean;\n}\n\ninterface CsvOverlayState {\n selectedFileName: string;\n dropError?: string;\n}\n\nconst PASTED_VALUES = 'pasted values';\n\nconst INVALID_MIME_TYPES = [/^audio.*/, /^font.*/, /^image.*/, /^video.*/];\n\nconst VALID_EXTENSIONS = ['.csv', '.tsv', '.tab', '.psv', '.dsv', '.txt'];\n\nconst ZIP_EXTENSIONS = ['.zip'];\n\n/**\n * Overlay that is displayed when uploading a CSV file.\n */\nclass CsvOverlay extends Component<CsvOverlayProps, CsvOverlayState> {\n static defaultProps = {\n allowZip: false,\n dragError: null,\n };\n\n static MULTIPLE_FILE_ERROR = 'Please select only one file';\n\n static FILE_TYPE_ERROR = 'Filetype not supported.';\n\n static isValidDropItem(item: DataTransferItem): boolean {\n return (\n item != null &&\n item.kind === 'file' &&\n !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type))\n );\n }\n\n static isValidExtension(name: string, allowZip = false): boolean {\n return (\n VALID_EXTENSIONS.some(ext => name.endsWith(ext)) ||\n (allowZip && ZIP_EXTENSIONS.some(ext => name.endsWith(ext)))\n );\n }\n\n static handleDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n static getIcon(fileName: string): IconDefinition {\n if (fileName === PASTED_VALUES) {\n return vsClippy;\n }\n if (fileName.endsWith('.csv')) {\n return dhFileCsv;\n }\n if (fileName.endsWith('.zip')) {\n return vsFileZip;\n }\n return dhFileSpreadsheet;\n }\n\n constructor(props: CsvOverlayProps) {\n super(props);\n\n this.handleSelectFile = this.handleSelectFile.bind(this);\n this.handleFiles = this.handleFiles.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.unstageFile = this.unstageFile.bind(this);\n this.handleMenuPaste = this.handleMenuPaste.bind(this);\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n\n this.fileElem = React.createRef();\n this.divElem = React.createRef();\n\n this.state = {\n selectedFileName: '',\n };\n }\n\n componentDidMount(): void {\n this.divElem.current?.addEventListener('paste', this.handlePasteEvent);\n this.divElem.current?.focus();\n }\n\n componentWillUnmount(): void {\n this.divElem.current?.removeEventListener('paste', this.handlePasteEvent);\n }\n\n fileElem: RefObject<HTMLInputElement>;\n\n divElem: RefObject<HTMLDivElement>;\n\n handleSelectFile(): void {\n if (this.fileElem.current) {\n this.fileElem.current.value = '';\n this.fileElem.current?.click();\n }\n }\n\n handleFiles(event: ChangeEvent<HTMLInputElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { files } = event.target;\n if (files != null) {\n this.handleFile(files[0]);\n }\n }\n\n handleDrop(e: DragEvent<HTMLDivElement>): void {\n const { allowZip, clearDragError, dragError } = this.props;\n e.preventDefault();\n e.stopPropagation();\n\n if (dragError != null) {\n clearDragError();\n return;\n }\n\n if (\n e.dataTransfer == null ||\n e.dataTransfer.items == null ||\n e.dataTransfer.items.length === 0\n ) {\n return;\n }\n\n const file = e.dataTransfer.items[0].getAsFile();\n assertNotNull(file);\n if (CsvOverlay.isValidExtension(file.name, allowZip)) {\n this.handleFile(file);\n } else {\n this.setState({\n dropError: CsvOverlay.FILE_TYPE_ERROR,\n });\n }\n }\n\n unstageFile(event: MouseEvent<HTMLButtonElement>): void {\n const { onCancel } = this.props;\n event.stopPropagation();\n event.preventDefault();\n onCancel();\n this.setState({\n selectedFileName: '',\n dropError: undefined,\n });\n }\n\n handleFile(file: File): void {\n const { onFileOpened } = this.props;\n onFileOpened(file);\n this.setState({\n selectedFileName: file.name,\n dropError: undefined,\n });\n }\n\n handleMenuPaste(): void {\n const { onPaste, onError, uploadInProgress } = this.props;\n if (uploadInProgress) {\n return;\n }\n navigator.clipboard\n .readText()\n .then(clipText => {\n onPaste(clipText);\n this.setState({\n selectedFileName: PASTED_VALUES,\n dropError: undefined,\n });\n })\n .catch((e: unknown) => onError(e));\n }\n\n handlePasteEvent(event: ClipboardEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.handleMenuPaste();\n }\n\n makeContextMenuItems(): ContextAction[] {\n const { uploadInProgress } = this.props;\n return [\n {\n title: 'Paste',\n icon: vsClippy,\n action: this.handleMenuPaste,\n shortcut: GLOBAL_SHORTCUTS.PASTE,\n disabled: uploadInProgress,\n },\n ];\n }\n\n getValidExtensions = memoize((allowZip: boolean) =>\n allowZip ? [...VALID_EXTENSIONS, ...ZIP_EXTENSIONS] : [...VALID_EXTENSIONS]\n );\n\n getAcceptString = memoize((allowZip: boolean) =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize((allowZip: boolean) =>\n TextUtils.join(this.getValidExtensions(allowZip), 'or')\n );\n\n render(): ReactElement {\n const { allowZip, dragError, uploadInProgress } = this.props;\n const { selectedFileName, dropError } = this.state;\n const error = dragError ?? dropError;\n const contextActions = this.makeContextMenuItems();\n return (\n <div\n ref={this.divElem}\n className=\"csv-overlay fill-parent-absolute\"\n onDragOver={CsvOverlay.handleDragOver}\n onDrop={this.handleDrop}\n tabIndex={-1}\n >\n <ContextActions actions={contextActions} />\n <input\n ref={this.fileElem}\n type=\"file\"\n id=\"fileElem\"\n accept={this.getAcceptString(allowZip)}\n style={{ display: 'none' }}\n onChange={this.handleFiles}\n data-testid=\"fileElem\"\n />\n {!selectedFileName && (error === undefined || error === '') && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={dhFileDownload} />\n </div>\n <label>Drop file (or paste values) here to import</label>\n <div className=\"message-small\">\n <label>or</label>\n </div>\n <Button kind=\"primary\" onClick={this.handleSelectFile}>\n Select File...\n </Button>\n </div>\n )}\n {selectedFileName && (error === undefined || error === '') && (\n <div className=\"selected-content\">\n <div className=\"selected-icon\">\n <FontAwesomeIcon icon={CsvOverlay.getIcon(selectedFileName)} />\n </div>\n <div className=\"selected-text\">\n <label>Selected File</label>\n <label className=\"selected-name\">\n {selectedFileName}\n {!uploadInProgress && (\n <Button\n kind=\"ghost\"\n className=\"ml-2\"\n onClick={this.unstageFile}\n icon={vsTrash}\n tooltip=\"Remove\"\n />\n )}\n </label>\n </div>\n </div>\n )}\n {Boolean(error) && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={vsWarning} />\n </div>\n <label>{error}</label>\n {error === CsvOverlay.FILE_TYPE_ERROR && (\n <div className=\"message-small\">\n <label>{this.getFileTypeErrorString(allowZip)}</label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvOverlay;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CsvOverlay.js","names":["React","Component","memoize","FontAwesomeIcon","Button","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","assertNotNull","TextUtils","jsx","_jsx","jsxs","_jsxs","PASTED_VALUES","INVALID_MIME_TYPES","VALID_EXTENSIONS","ZIP_EXTENSIONS","CsvOverlay","isValidDropItem","item","kind","find","invalid","test","type","isValidExtension","name","allowZip","arguments","length","undefined","some","ext","endsWith","handleDragOver","e","preventDefault","stopPropagation","getIcon","fileName","constructor","props","_defineProperty","getValidExtensions","join","handleSelectFile","bind","handleFiles","handleDrop","unstageFile","handleMenuPaste","handlePasteEvent","fileElem","createRef","divElem","state","selectedFileName","componentDidMount","_this$divElem$current","_this$divElem$current2","current","addEventListener","focus","componentWillUnmount","_this$divElem$current3","removeEventListener","_this$fileElem$curren","value","click","event","files","target","handleFile","clearDragError","dragError","dataTransfer","items","file","getAsFile","setState","dropError","FILE_TYPE_ERROR","onCancel","onFileOpened","onPaste","onError","uploadInProgress","navigator","clipboard","readText","then","clipText","catch","makeContextMenuItems","title","icon","action","shortcut","PASTE","disabled","render","error","contextActions","ref","className","onDragOver","onDrop","tabIndex","children","actions","id","accept","getAcceptString","style","display","onChange","onClick","tooltip","Boolean","getFileTypeErrorString"],"sources":["../../src/csv/CsvOverlay.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n Component,\n type DragEvent,\n type MouseEvent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport memoize from 'memoize-one';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n Button,\n type ContextAction,\n ContextActions,\n GLOBAL_SHORTCUTS,\n} from '@deephaven/components';\nimport {\n dhFileCsv,\n dhFileDownload,\n dhFileSpreadsheet,\n type IconDefinition,\n vsClippy,\n vsFileZip,\n vsTrash,\n vsWarning,\n} from '@deephaven/icons';\nimport './CsvOverlay.scss';\nimport { assertNotNull, TextUtils } from '@deephaven/utils';\n\ninterface CsvOverlayProps {\n allowZip: boolean;\n onFileOpened: (file: File) => void;\n onCancel: () => void;\n onPaste: (clipText: string) => void;\n clearDragError: () => void;\n dragError: string | null;\n onError: (e: unknown) => void;\n uploadInProgress: boolean;\n}\n\ninterface CsvOverlayState {\n selectedFileName: string;\n dropError?: string;\n}\n\nconst PASTED_VALUES = 'pasted values';\n\nconst INVALID_MIME_TYPES = [/^audio.*/, /^font.*/, /^image.*/, /^video.*/];\n\nconst VALID_EXTENSIONS = ['.csv', '.tsv', '.tab', '.psv', '.dsv', '.txt'];\n\nconst ZIP_EXTENSIONS = ['.zip'];\n\n/**\n * Overlay that is displayed when uploading a CSV file.\n */\nclass CsvOverlay extends Component<CsvOverlayProps, CsvOverlayState> {\n static defaultProps = {\n allowZip: false,\n dragError: null,\n };\n\n static MULTIPLE_FILE_ERROR = 'Please select only one file';\n\n static FILE_TYPE_ERROR = 'Filetype not supported.';\n\n static isValidDropItem(item: DataTransferItem): boolean {\n return (\n item != null &&\n item.kind === 'file' &&\n !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type))\n );\n }\n\n static isValidExtension(name: string, allowZip = false): boolean {\n return (\n VALID_EXTENSIONS.some(ext => name.endsWith(ext)) ||\n (allowZip && ZIP_EXTENSIONS.some(ext => name.endsWith(ext)))\n );\n }\n\n static handleDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n static getIcon(fileName: string): IconDefinition {\n if (fileName === PASTED_VALUES) {\n return vsClippy;\n }\n if (fileName.endsWith('.csv')) {\n return dhFileCsv;\n }\n if (fileName.endsWith('.zip')) {\n return vsFileZip;\n }\n return dhFileSpreadsheet;\n }\n\n constructor(props: CsvOverlayProps) {\n super(props);\n\n this.handleSelectFile = this.handleSelectFile.bind(this);\n this.handleFiles = this.handleFiles.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.unstageFile = this.unstageFile.bind(this);\n this.handleMenuPaste = this.handleMenuPaste.bind(this);\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n\n this.fileElem = React.createRef();\n this.divElem = React.createRef();\n\n this.state = {\n selectedFileName: '',\n };\n }\n\n componentDidMount(): void {\n this.divElem.current?.addEventListener('paste', this.handlePasteEvent);\n this.divElem.current?.focus();\n }\n\n componentWillUnmount(): void {\n this.divElem.current?.removeEventListener('paste', this.handlePasteEvent);\n }\n\n fileElem: RefObject<HTMLInputElement>;\n\n divElem: RefObject<HTMLDivElement>;\n\n handleSelectFile(): void {\n if (this.fileElem.current) {\n this.fileElem.current.value = '';\n this.fileElem.current?.click();\n }\n }\n\n handleFiles(event: ChangeEvent<HTMLInputElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { files } = event.target;\n if (files != null) {\n this.handleFile(files[0]);\n }\n }\n\n handleDrop(e: DragEvent<HTMLDivElement>): void {\n const { allowZip, clearDragError, dragError } = this.props;\n e.preventDefault();\n e.stopPropagation();\n\n if (dragError != null) {\n clearDragError();\n return;\n }\n\n if (\n e.dataTransfer == null ||\n e.dataTransfer.items == null ||\n e.dataTransfer.items.length === 0\n ) {\n return;\n }\n\n const file = e.dataTransfer.items[0].getAsFile();\n assertNotNull(file);\n if (CsvOverlay.isValidExtension(file.name, allowZip)) {\n this.handleFile(file);\n } else {\n this.setState({\n dropError: CsvOverlay.FILE_TYPE_ERROR,\n });\n }\n }\n\n unstageFile(event: MouseEvent<HTMLButtonElement>): void {\n const { onCancel } = this.props;\n event.stopPropagation();\n event.preventDefault();\n onCancel();\n this.setState({\n selectedFileName: '',\n dropError: undefined,\n });\n }\n\n handleFile(file: File): void {\n const { onFileOpened } = this.props;\n onFileOpened(file);\n this.setState({\n selectedFileName: file.name,\n dropError: undefined,\n });\n }\n\n handleMenuPaste(): void {\n const { onPaste, onError, uploadInProgress } = this.props;\n if (uploadInProgress) {\n return;\n }\n navigator.clipboard\n .readText()\n .then(clipText => {\n onPaste(clipText);\n this.setState({\n selectedFileName: PASTED_VALUES,\n dropError: undefined,\n });\n })\n .catch((e: unknown) => onError(e));\n }\n\n handlePasteEvent(event: ClipboardEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.handleMenuPaste();\n }\n\n makeContextMenuItems(): ContextAction[] {\n const { uploadInProgress } = this.props;\n return [\n {\n title: 'Paste',\n icon: vsClippy,\n action: this.handleMenuPaste,\n shortcut: GLOBAL_SHORTCUTS.PASTE,\n disabled: uploadInProgress,\n },\n ];\n }\n\n getValidExtensions = memoize((allowZip: boolean) =>\n allowZip ? [...VALID_EXTENSIONS, ...ZIP_EXTENSIONS] : [...VALID_EXTENSIONS]\n );\n\n getAcceptString = memoize((allowZip: boolean) =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize((allowZip: boolean) =>\n TextUtils.join(this.getValidExtensions(allowZip), 'or')\n );\n\n render(): ReactElement {\n const { allowZip, dragError, uploadInProgress } = this.props;\n const { selectedFileName, dropError } = this.state;\n const error = dragError ?? dropError;\n const contextActions = this.makeContextMenuItems();\n return (\n <div\n ref={this.divElem}\n className=\"csv-overlay fill-parent-absolute\"\n onDragOver={CsvOverlay.handleDragOver}\n onDrop={this.handleDrop}\n tabIndex={-1}\n >\n <ContextActions actions={contextActions} />\n <input\n ref={this.fileElem}\n type=\"file\"\n id=\"fileElem\"\n accept={this.getAcceptString(allowZip)}\n style={{ display: 'none' }}\n onChange={this.handleFiles}\n data-testid=\"fileElem\"\n />\n {!selectedFileName && (error === undefined || error === '') && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={dhFileDownload} />\n </div>\n <label>Drop file (or paste values) here to import</label>\n <div className=\"message-small\">\n <label>or</label>\n </div>\n <Button kind=\"primary\" onClick={this.handleSelectFile}>\n Select File...\n </Button>\n </div>\n )}\n {selectedFileName && (error === undefined || error === '') && (\n <div className=\"selected-content\">\n <div className=\"selected-icon\">\n <FontAwesomeIcon icon={CsvOverlay.getIcon(selectedFileName)} />\n </div>\n <div className=\"selected-text\">\n <label>Selected File</label>\n <label className=\"selected-name\">\n {selectedFileName}\n {!uploadInProgress && (\n <Button\n kind=\"ghost\"\n className=\"ml-2\"\n onClick={this.unstageFile}\n icon={vsTrash}\n tooltip=\"Remove\"\n />\n )}\n </label>\n </div>\n </div>\n )}\n {Boolean(error) && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={vsWarning} />\n </div>\n <label>{error}</label>\n {error === CsvOverlay.FILE_TYPE_ERROR && (\n <div className=\"message-small\">\n <label>{this.getFileTypeErrorString(allowZip)}</label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvOverlay;\n"],"mappings":"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","ignoreList":[]}
|
package/dist/csv/CsvParser.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
var _CsvParser;
|
|
1
2
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
2
3
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
3
4
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
@@ -15,8 +16,6 @@ var ZIP_CONSOLIDATE_CHUNKS = 650;
|
|
|
15
16
|
* Parser a CSV file in chunks and returns a table handle for each chunk.
|
|
16
17
|
*/
|
|
17
18
|
class CsvParser {
|
|
18
|
-
// Generates column names A-Z, AA-AZ, BA-BZ, etc...
|
|
19
|
-
|
|
20
19
|
static generateHeaderRecursive(n) {
|
|
21
20
|
var header = '';
|
|
22
21
|
var char = n;
|
|
@@ -271,10 +270,12 @@ class CsvParser {
|
|
|
271
270
|
this.zipProgress = metadata.percent;
|
|
272
271
|
}
|
|
273
272
|
}
|
|
273
|
+
_CsvParser = CsvParser;
|
|
274
|
+
// Generates column names A-Z, AA-AZ, BA-BZ, etc...
|
|
274
275
|
_defineProperty(CsvParser, "generateHeaders", numColumns => {
|
|
275
276
|
var headers = [];
|
|
276
277
|
for (var i = 0; i < numColumns; i += 1) {
|
|
277
|
-
headers.push(
|
|
278
|
+
headers.push(_CsvParser.generateHeaderRecursive(i));
|
|
278
279
|
}
|
|
279
280
|
return headers;
|
|
280
281
|
});
|
|
@@ -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","_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, {\n type ParseLocalConfig,\n type Parser,\n type ParseResult,\n} from 'papaparse';\nimport Log from '@deephaven/log';\nimport { assertNotNull, DbNameValidator } from '@deephaven/utils';\nimport type { dh } from '@deephaven/jsapi-types';\nimport type { JSZipObject } from 'jszip';\nimport CsvTypeParser from './CsvTypeParser';\nimport { type 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: dh.Table[]) => void;\n session: dh.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: dh.Table[]) => void;\n\n session: dh.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: dh.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","_CsvParser","push"],"sources":["../../src/csv/CsvParser.ts"],"sourcesContent":["import Papa, {\n type ParseLocalConfig,\n type Parser,\n type ParseResult,\n} from 'papaparse';\nimport Log from '@deephaven/log';\nimport { assertNotNull, DbNameValidator } from '@deephaven/utils';\nimport type { dh } from '@deephaven/jsapi-types';\nimport type { JSZipObject } from 'jszip';\nimport CsvTypeParser from './CsvTypeParser';\nimport { type 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: dh.Table[]) => void;\n session: dh.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: dh.Table[]) => void;\n\n session: dh.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: dh.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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","ignoreList":[]}
|
|
@@ -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","_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, {\n type Parser,\n type ParseResult,\n type ParseLocalConfig,\n} from 'papaparse';\n// Intentionally using isNaN rather than Number.isNaN\n/* eslint-disable no-restricted-globals */\nimport { NewTableColumnTypes } from '@deephaven/jsapi-utils';\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, {\n type Parser,\n type ParseResult,\n type ParseLocalConfig,\n} from 'papaparse';\n// Intentionally using isNaN rather than Number.isNaN\n/* eslint-disable no-restricted-globals */\nimport { NewTableColumnTypes } from '@deephaven/jsapi-utils';\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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","ignoreList":[]}
|
|
@@ -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,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
|
+
{"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaration.d.js","names":[],"sources":["../src/declaration.d.ts"],"sourcesContent":["declare module '*.module.scss' {\n const content: Record<string, string>;\n export default content;\n}\n\ndeclare module '*.scss';\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"declaration.d.js","names":[],"sources":["../src/declaration.d.ts"],"sourcesContent":["declare module '*.module.scss' {\n const content: Record<string, string>;\n export default content;\n}\n\ndeclare module '*.scss';\n"],"mappings":"","ignoreList":[]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Console","default","ConsoleInput","SHORTCUTS","ConsoleStatusBar","MonacoUtils","Editor","ScriptEditor","ScriptEditorUtils","LogView","HeapUsage"],"sources":["../src/index.ts"],"sourcesContent":["import Console from './Console';\n\nexport default Console;\nexport { Console };\nexport { default as ConsoleInput } from './ConsoleInput';\nexport { default as SHORTCUTS } from './ConsoleShortcuts';\nexport { default as ConsoleStatusBar } from './ConsoleStatusBar';\nexport * from './monaco/MonacoThemeProvider';\nexport { default as MonacoUtils } from './monaco/MonacoUtils';\nexport { default as Editor, type EditorProps } from './notebook/Editor';\nexport { default as ScriptEditor } from './notebook/ScriptEditor';\nexport { default as ScriptEditorUtils } from './notebook/ScriptEditorUtils';\nexport * from './common';\nexport * from './command-history';\nexport * from './console-history';\nexport * from './monaco';\nexport { default as LogView } from './log/LogView';\nexport { default as HeapUsage } from './HeapUsage';\n"],"mappings":"OAAOA,OAAO;AAEd,eAAeA,OAAO;AACtB,SAASA,OAAO;AAAG,SACVC,OAAO,IAAIC,YAAY;AAAA,SACvBD,OAAO,IAAIE,SAAS;AAAA,SACpBF,OAAO,IAAIG,gBAAgB;AAAA;AAAA,SAE3BH,OAAO,IAAII,WAAW;AAAA,SACtBJ,OAAO,IAAIK,MAAM;AAAA,SACjBL,OAAO,IAAIM,YAAY;AAAA,SACvBN,OAAO,IAAIO,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,SAK5BP,OAAO,IAAIQ,OAAO;AAAA,SAClBR,OAAO,IAAIS,SAAS"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Console","default","ConsoleInput","SHORTCUTS","ConsoleStatusBar","MonacoUtils","Editor","ScriptEditor","ScriptEditorUtils","LogView","HeapUsage"],"sources":["../src/index.ts"],"sourcesContent":["import Console from './Console';\n\nexport default Console;\nexport { Console };\nexport { default as ConsoleInput } from './ConsoleInput';\nexport { default as SHORTCUTS } from './ConsoleShortcuts';\nexport { default as ConsoleStatusBar } from './ConsoleStatusBar';\nexport * from './monaco/MonacoThemeProvider';\nexport { default as MonacoUtils } from './monaco/MonacoUtils';\nexport { default as Editor, type EditorProps } from './notebook/Editor';\nexport { default as ScriptEditor } from './notebook/ScriptEditor';\nexport { default as ScriptEditorUtils } from './notebook/ScriptEditorUtils';\nexport * from './common';\nexport * from './command-history';\nexport * from './console-history';\nexport * from './monaco';\nexport { default as LogView } from './log/LogView';\nexport { default as HeapUsage } from './HeapUsage';\n"],"mappings":"OAAOA,OAAO;AAEd,eAAeA,OAAO;AACtB,SAASA,OAAO;AAAG,SACVC,OAAO,IAAIC,YAAY;AAAA,SACvBD,OAAO,IAAIE,SAAS;AAAA,SACpBF,OAAO,IAAIG,gBAAgB;AAAA;AAAA,SAE3BH,OAAO,IAAII,WAAW;AAAA,SACtBJ,OAAO,IAAIK,MAAM;AAAA,SACjBL,OAAO,IAAIM,YAAY;AAAA,SACvBN,OAAO,IAAIO,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,SAK5BP,OAAO,IAAIQ,OAAO;AAAA,SAClBR,OAAO,IAAIS,SAAS","ignoreList":[]}
|
package/dist/log/LogLevel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogLevel.js","names":["Object","freeze","FATAL","STDERR","ERROR","WARN","STDOUT","INFO","DEBUG","TRACE"],"sources":["../../src/log/LogLevel.ts"],"sourcesContent":["export default Object.freeze({\n FATAL: 'FATAL',\n STDERR: 'STDERR',\n ERROR: 'ERROR',\n WARN: 'WARN',\n STDOUT: 'STDOUT',\n INFO: 'INFO',\n DEBUG: 'DEBUG',\n TRACE: 'TRACE',\n});\n"],"mappings":"AAAA,eAAeA,MAAM,CAACC,MAAM,CAAC;EAC3BC,KAAK,EAAE,OAAO;EACdC,MAAM,EAAE,QAAQ;EAChBC,KAAK,EAAE,OAAO;EACdC,IAAI,EAAE,MAAM;EACZC,MAAM,EAAE,QAAQ;EAChBC,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE;AACT,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"LogLevel.js","names":["Object","freeze","FATAL","STDERR","ERROR","WARN","STDOUT","INFO","DEBUG","TRACE"],"sources":["../../src/log/LogLevel.ts"],"sourcesContent":["export default Object.freeze({\n FATAL: 'FATAL',\n STDERR: 'STDERR',\n ERROR: 'ERROR',\n WARN: 'WARN',\n STDOUT: 'STDOUT',\n INFO: 'INFO',\n DEBUG: 'DEBUG',\n TRACE: 'TRACE',\n});\n"],"mappings":"AAAA,eAAeA,MAAM,CAACC,MAAM,CAAC;EAC3BC,KAAK,EAAE,OAAO;EACdC,MAAM,EAAE,QAAQ;EAChBC,KAAK,EAAE,OAAO;EACdC,IAAI,EAAE,MAAM;EACZC,MAAM,EAAE,QAAQ;EAChBC,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE;AACT,CAAC,CAAC","ignoreList":[]}
|
|
@@ -3,8 +3,7 @@ import React, { PureComponent } from 'react';
|
|
|
3
3
|
import classNames from 'classnames';
|
|
4
4
|
import { UISwitch } from '@deephaven/components';
|
|
5
5
|
import "./LogLevelMenuItem.css";
|
|
6
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
-
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
7
|
class LogLevelMenuItem extends PureComponent {
|
|
9
8
|
constructor(props) {
|
|
10
9
|
super(props);
|