@deephaven/console 0.5.2-matplotlib.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Console.d.ts +3 -0
- package/dist/Console.d.ts.map +1 -1
- package/dist/Console.js +807 -871
- package/dist/Console.js.map +1 -1
- package/dist/ConsoleInput.d.ts +1 -38
- package/dist/ConsoleInput.d.ts.map +1 -1
- package/dist/ConsoleInput.js +331 -436
- package/dist/ConsoleInput.js.map +1 -1
- package/dist/ConsoleMenu.js +159 -215
- package/dist/ConsoleMenu.js.map +1 -1
- package/dist/ConsolePropTypes.js +1 -1
- package/dist/ConsolePropTypes.js.map +1 -1
- package/dist/ConsoleShortcuts.js +2 -2
- package/dist/ConsoleShortcuts.js.map +1 -1
- package/dist/ConsoleStatusBar.js +85 -125
- package/dist/ConsoleStatusBar.js.map +1 -1
- package/dist/StoragePropTypes.js +2 -2
- package/dist/StoragePropTypes.js.map +1 -1
- package/dist/command-history/CommandHistory.css +5 -2
- package/dist/command-history/CommandHistory.css.map +1 -1
- package/dist/command-history/CommandHistory.d.ts +5 -0
- package/dist/command-history/CommandHistory.d.ts.map +1 -1
- package/dist/command-history/CommandHistory.js +303 -391
- package/dist/command-history/CommandHistory.js.map +1 -1
- package/dist/command-history/CommandHistoryActions.css +4 -0
- package/dist/command-history/CommandHistoryActions.css.map +1 -1
- package/dist/command-history/CommandHistoryActions.d.ts.map +1 -1
- package/dist/command-history/CommandHistoryActions.js +40 -79
- package/dist/command-history/CommandHistoryActions.js.map +1 -1
- package/dist/command-history/CommandHistoryItem.css +1 -1
- package/dist/command-history/CommandHistoryItem.d.ts +5 -0
- package/dist/command-history/CommandHistoryItem.d.ts.map +1 -1
- package/dist/command-history/CommandHistoryItem.js +15 -9
- package/dist/command-history/CommandHistoryItem.js.map +1 -1
- package/dist/command-history/CommandHistoryItemTooltip.d.ts +1 -40
- package/dist/command-history/CommandHistoryItemTooltip.d.ts.map +1 -1
- package/dist/command-history/CommandHistoryItemTooltip.js +139 -189
- package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -1
- package/dist/command-history/CommandHistoryViewportUpdater.js +30 -35
- package/dist/command-history/CommandHistoryViewportUpdater.js.map +1 -1
- package/dist/command-history/index.js +5 -5
- package/dist/command-history/index.js.map +1 -1
- package/dist/common/Code.js +34 -70
- package/dist/common/Code.js.map +1 -1
- package/dist/common/ConsoleConstants.js +3 -24
- package/dist/common/ConsoleConstants.js.map +1 -1
- package/dist/common/ConsoleUtils.d.ts +1 -3
- package/dist/common/ConsoleUtils.d.ts.map +1 -1
- package/dist/common/ConsoleUtils.js +60 -94
- package/dist/common/ConsoleUtils.js.map +1 -1
- package/dist/common/ObjectIcon.js +4 -2
- package/dist/common/ObjectIcon.js.map +1 -1
- package/dist/common/index.d.js +1 -34
- package/dist/common/index.d.js.map +1 -1
- package/dist/common/index.js +4 -4
- package/dist/common/index.js.map +1 -1
- package/dist/console-history/ConsoleHistory.js +27 -63
- package/dist/console-history/ConsoleHistory.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItem.js +116 -154
- package/dist/console-history/ConsoleHistoryItem.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItemResult.js +4 -2
- package/dist/console-history/ConsoleHistoryItemResult.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultErrorMessage.js +94 -132
- package/dist/console-history/ConsoleHistoryResultErrorMessage.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultInProgress.js +42 -76
- package/dist/console-history/ConsoleHistoryResultInProgress.js.map +1 -1
- package/dist/console-history/index.js +5 -5
- package/dist/console-history/index.js.map +1 -1
- package/dist/csv/CsvFormats.js +14 -28
- package/dist/csv/CsvFormats.js.map +1 -1
- package/dist/csv/CsvInputBar.css +25 -23
- package/dist/csv/CsvInputBar.css.map +1 -1
- package/dist/csv/CsvInputBar.d.ts +2 -45
- package/dist/csv/CsvInputBar.d.ts.map +1 -1
- package/dist/csv/CsvInputBar.js +298 -372
- package/dist/csv/CsvInputBar.js.map +1 -1
- package/dist/csv/CsvOverlay.js +197 -243
- package/dist/csv/CsvOverlay.js.map +1 -1
- package/dist/csv/CsvParser.js +186 -209
- package/dist/csv/CsvParser.js.map +1 -1
- package/dist/csv/CsvTypeParser.js +185 -210
- package/dist/csv/CsvTypeParser.js.map +1 -1
- package/dist/csv/NewTableColumnTypes.js +1 -5
- package/dist/csv/NewTableColumnTypes.js.map +1 -1
- package/dist/index.js +14 -14
- package/dist/index.js.map +1 -1
- package/dist/log/LogLevelMenuItem.js +24 -58
- package/dist/log/LogLevelMenuItem.js.map +1 -1
- package/dist/log/LogView.js +429 -484
- package/dist/log/LogView.js.map +1 -1
- package/dist/monaco/MonacoCompletionProvider.js +92 -124
- package/dist/monaco/MonacoCompletionProvider.js.map +1 -1
- package/dist/monaco/MonacoUtils.js +315 -331
- package/dist/monaco/MonacoUtils.js.map +1 -1
- package/dist/monaco/index.js +2 -2
- package/dist/monaco/index.js.map +1 -1
- package/dist/monaco/lang/db.js +3 -3
- package/dist/monaco/lang/db.js.map +1 -1
- package/dist/monaco/lang/groovy.js +3 -3
- package/dist/monaco/lang/groovy.js.map +1 -1
- package/dist/monaco/lang/log.js +3 -3
- package/dist/monaco/lang/log.js.map +1 -1
- package/dist/monaco/lang/python.js +3 -3
- package/dist/monaco/lang/python.js.map +1 -1
- package/dist/monaco/lang/scala.js +5 -5
- package/dist/monaco/lang/scala.js.map +1 -1
- package/dist/notebook/Editor.js +101 -141
- package/dist/notebook/Editor.js.map +1 -1
- package/dist/notebook/ScriptEditor.js +261 -301
- package/dist/notebook/ScriptEditor.js.map +1 -1
- package/dist/notebook/ScriptEditorUtils.js +26 -42
- package/dist/notebook/ScriptEditorUtils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/csv/CsvOverlay.jsx"],"names":["React","Component","PropTypes","FontAwesomeIcon","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","PASTED_VALUES","INVALID_MIME_TYPES","CsvOverlay","props","handleSelectFile","bind","handleFiles","handleDrop","unstageFile","handleMenuPaste","handlePasteEvent","fileElem","createRef","divElem","state","selectedFileName","dropError","current","addEventListener","focus","removeEventListener","value","click","event","stopPropagation","preventDefault","handleFile","target","files","e","clearDragError","dragError","dataTransfer","items","file","getAsFile","isValidExtension","name","setState","FILE_TYPE_ERROR","onFileOpened","onPaste","onError","uploadInProgress","navigator","clipboard","readText","then","clipText","title","icon","action","shortcut","PASTE","disabled","error","contextActions","makeContextMenuItems","handleDragOver","display","getIcon","item","kind","find","invalid","test","type","endsWith","fileName","propTypes","func","isRequired","string","bool","defaultProps"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { ContextActions, GLOBAL_SHORTCUTS } from '@deephaven/components';\nimport {\n dhFileCsv,\n dhFileDownload,\n dhFileSpreadsheet,\n vsClippy,\n vsFileZip,\n vsTrash,\n vsWarning,\n} from '@deephaven/icons';\nimport './CsvOverlay.scss';\n\nconst PASTED_VALUES = 'pasted values';\n\nconst INVALID_MIME_TYPES = [/^audio.*/, /^font.*/, /^image.*/, /^video.*/];\n\n/**\n * Overlay that is displayed when uploading a CSV file.\n */\nclass CsvOverlay extends Component {\n static MULTIPLE_FILE_ERROR = 'Please select one file';\n\n static FILE_TYPE_ERROR = 'Filetype not supported.';\n\n static isValidDropItem(item) {\n return (\n item &&\n item.kind === 'file' &&\n !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type))\n );\n }\n\n static isValidExtension(name) {\n return (\n name.endsWith('.csv') ||\n name.endsWith('.zip') ||\n name.endsWith('.tsv') ||\n name.endsWith('.tab') ||\n name.endsWith('.psv') ||\n name.endsWith('.dsv') ||\n name.endsWith('.txt')\n );\n }\n\n static handleDragOver(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n static getIcon(fileName) {\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) {\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 dropError: null,\n };\n }\n\n componentDidMount() {\n this.divElem.current.addEventListener('paste', this.handlePasteEvent);\n this.divElem.current.focus();\n }\n\n componentWillUnmount() {\n this.divElem.current.removeEventListener('paste', this.handlePasteEvent);\n }\n\n handleSelectFile() {\n this.fileElem.current.value = null;\n this.fileElem.current.click();\n }\n\n handleFiles(event) {\n event.stopPropagation();\n event.preventDefault();\n this.handleFile(event.target.files[0]);\n }\n\n handleDrop(e) {\n const { clearDragError, dragError } = this.props;\n e.preventDefault();\n e.stopPropagation();\n\n if (dragError) {\n clearDragError();\n return;\n }\n\n if (!e.dataTransfer || !e.dataTransfer.items) {\n return;\n }\n\n const file = e.dataTransfer.items[0].getAsFile();\n if (CsvOverlay.isValidExtension(file.name)) {\n this.handleFile(file);\n } else {\n this.setState({\n dropError: CsvOverlay.FILE_TYPE_ERROR,\n });\n }\n }\n\n unstageFile(event) {\n const { onFileOpened } = this.props;\n event.stopPropagation();\n event.preventDefault();\n onFileOpened(null);\n this.setState({\n selectedFileName: '',\n dropError: null,\n });\n }\n\n handleFile(file) {\n const { onFileOpened } = this.props;\n onFileOpened(file);\n this.setState({\n selectedFileName: file.name,\n dropError: null,\n });\n }\n\n handleMenuPaste() {\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: null,\n });\n })\n .catch(e => onError(e));\n }\n\n handlePasteEvent(event) {\n event.stopPropagation();\n event.preventDefault();\n this.handleMenuPaste();\n }\n\n makeContextMenuItems() {\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 render() {\n const { 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=\".csv, .tsv, .tab, .zip, .psv, .dsv, .txt\"\n style={{ display: 'none' }}\n onChange={this.handleFiles}\n />\n {!selectedFileName && !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\n type=\"button\"\n className=\"btn btn-primary\"\n onClick={this.handleSelectFile}\n >\n Select File...\n </button>\n </div>\n )}\n {selectedFileName && !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 type=\"button\"\n className=\"btn btn-link btn-link-icon ml-2\"\n onClick={this.unstageFile}\n >\n <FontAwesomeIcon icon={vsTrash} />\n </button>\n )}\n </label>\n </div>\n </div>\n )}\n {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>\n Please select a .csv, .tsv, .tab, .psv, .dsv, .txt or .zip\n </label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nCsvOverlay.propTypes = {\n onFileOpened: PropTypes.func.isRequired,\n onPaste: PropTypes.func.isRequired,\n clearDragError: PropTypes.func.isRequired,\n dragError: PropTypes.string,\n onError: PropTypes.func.isRequired,\n uploadInProgress: PropTypes.bool.isRequired,\n};\n\nCsvOverlay.defaultProps = {\n dragError: null,\n};\n\nexport default CsvOverlay;\n"],"file":"CsvOverlay.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/csv/CsvOverlay.jsx"],"names":["React","Component","PropTypes","FontAwesomeIcon","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","PASTED_VALUES","INVALID_MIME_TYPES","CsvOverlay","isValidDropItem","item","kind","find","invalid","test","type","isValidExtension","name","endsWith","handleDragOver","e","preventDefault","stopPropagation","getIcon","fileName","constructor","props","handleSelectFile","bind","handleFiles","handleDrop","unstageFile","handleMenuPaste","handlePasteEvent","fileElem","createRef","divElem","state","selectedFileName","dropError","componentDidMount","current","addEventListener","focus","componentWillUnmount","removeEventListener","value","click","event","handleFile","target","files","clearDragError","dragError","dataTransfer","items","file","getAsFile","setState","FILE_TYPE_ERROR","onFileOpened","onPaste","onError","uploadInProgress","navigator","clipboard","readText","then","clipText","catch","makeContextMenuItems","title","icon","action","shortcut","PASTE","disabled","render","error","contextActions","display","propTypes","func","isRequired","string","bool","defaultProps"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { ContextActions, GLOBAL_SHORTCUTS } from '@deephaven/components';\nimport {\n dhFileCsv,\n dhFileDownload,\n dhFileSpreadsheet,\n vsClippy,\n vsFileZip,\n vsTrash,\n vsWarning,\n} from '@deephaven/icons';\nimport './CsvOverlay.scss';\n\nconst PASTED_VALUES = 'pasted values';\n\nconst INVALID_MIME_TYPES = [/^audio.*/, /^font.*/, /^image.*/, /^video.*/];\n\n/**\n * Overlay that is displayed when uploading a CSV file.\n */\nclass CsvOverlay extends Component {\n static MULTIPLE_FILE_ERROR = 'Please select one file';\n\n static FILE_TYPE_ERROR = 'Filetype not supported.';\n\n static isValidDropItem(item) {\n return (\n item &&\n item.kind === 'file' &&\n !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type))\n );\n }\n\n static isValidExtension(name) {\n return (\n name.endsWith('.csv') ||\n name.endsWith('.zip') ||\n name.endsWith('.tsv') ||\n name.endsWith('.tab') ||\n name.endsWith('.psv') ||\n name.endsWith('.dsv') ||\n name.endsWith('.txt')\n );\n }\n\n static handleDragOver(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n static getIcon(fileName) {\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) {\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 dropError: null,\n };\n }\n\n componentDidMount() {\n this.divElem.current.addEventListener('paste', this.handlePasteEvent);\n this.divElem.current.focus();\n }\n\n componentWillUnmount() {\n this.divElem.current.removeEventListener('paste', this.handlePasteEvent);\n }\n\n handleSelectFile() {\n this.fileElem.current.value = null;\n this.fileElem.current.click();\n }\n\n handleFiles(event) {\n event.stopPropagation();\n event.preventDefault();\n this.handleFile(event.target.files[0]);\n }\n\n handleDrop(e) {\n const { clearDragError, dragError } = this.props;\n e.preventDefault();\n e.stopPropagation();\n\n if (dragError) {\n clearDragError();\n return;\n }\n\n if (!e.dataTransfer || !e.dataTransfer.items) {\n return;\n }\n\n const file = e.dataTransfer.items[0].getAsFile();\n if (CsvOverlay.isValidExtension(file.name)) {\n this.handleFile(file);\n } else {\n this.setState({\n dropError: CsvOverlay.FILE_TYPE_ERROR,\n });\n }\n }\n\n unstageFile(event) {\n const { onFileOpened } = this.props;\n event.stopPropagation();\n event.preventDefault();\n onFileOpened(null);\n this.setState({\n selectedFileName: '',\n dropError: null,\n });\n }\n\n handleFile(file) {\n const { onFileOpened } = this.props;\n onFileOpened(file);\n this.setState({\n selectedFileName: file.name,\n dropError: null,\n });\n }\n\n handleMenuPaste() {\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: null,\n });\n })\n .catch(e => onError(e));\n }\n\n handlePasteEvent(event) {\n event.stopPropagation();\n event.preventDefault();\n this.handleMenuPaste();\n }\n\n makeContextMenuItems() {\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 render() {\n const { 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=\".csv, .tsv, .tab, .zip, .psv, .dsv, .txt\"\n style={{ display: 'none' }}\n onChange={this.handleFiles}\n />\n {!selectedFileName && !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\n type=\"button\"\n className=\"btn btn-primary\"\n onClick={this.handleSelectFile}\n >\n Select File...\n </button>\n </div>\n )}\n {selectedFileName && !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 type=\"button\"\n className=\"btn btn-link btn-link-icon ml-2\"\n onClick={this.unstageFile}\n >\n <FontAwesomeIcon icon={vsTrash} />\n </button>\n )}\n </label>\n </div>\n </div>\n )}\n {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>\n Please select a .csv, .tsv, .tab, .psv, .dsv, .txt or .zip\n </label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nCsvOverlay.propTypes = {\n onFileOpened: PropTypes.func.isRequired,\n onPaste: PropTypes.func.isRequired,\n clearDragError: PropTypes.func.isRequired,\n dragError: PropTypes.string,\n onError: PropTypes.func.isRequired,\n uploadInProgress: PropTypes.bool.isRequired,\n};\n\nCsvOverlay.defaultProps = {\n dragError: null,\n};\n\nexport default CsvOverlay;\n"],"file":"CsvOverlay.js"}
|
package/dist/csv/CsvParser.js
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
2
|
-
|
|
3
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
4
|
-
|
|
5
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
6
|
-
|
|
7
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
2
|
|
|
9
3
|
import Papa from 'papaparse';
|
|
10
4
|
import Log from '@deephaven/log';
|
|
11
5
|
import { DbNameValidator } from '@deephaven/utils';
|
|
12
|
-
import CsvTypeParser from
|
|
6
|
+
import CsvTypeParser from "./CsvTypeParser.js";
|
|
13
7
|
var log = Log.module('CsvParser'); // This is based on jszip streaming ~15 KB chunks to papa parse
|
|
14
8
|
// Want to consolidate to ~10 MB chunks
|
|
15
9
|
|
|
@@ -18,21 +12,32 @@ var ZIP_CONSOLIDATE_CHUNKS = 650;
|
|
|
18
12
|
* Parser a CSV file in chunks and returns a table handle for each chunk.
|
|
19
13
|
*/
|
|
20
14
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
_classCallCheck(this, CsvParser);
|
|
15
|
+
class CsvParser {
|
|
16
|
+
// Generates column names A-Z, AA-AZ, BA-BZ, etc...
|
|
17
|
+
static generateHeaderRecursive(n) {
|
|
18
|
+
var header = '';
|
|
19
|
+
var char = n;
|
|
20
|
+
|
|
21
|
+
if (n >= 26) {
|
|
22
|
+
header = header.concat(CsvParser.generateHeaderRecursive(Math.floor(n / 26) - 1));
|
|
23
|
+
char = n % 26;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return header.concat(String.fromCharCode(65 + char));
|
|
27
|
+
}
|
|
35
28
|
|
|
29
|
+
constructor(_ref) {
|
|
30
|
+
var {
|
|
31
|
+
onFileCompleted,
|
|
32
|
+
session,
|
|
33
|
+
file,
|
|
34
|
+
type,
|
|
35
|
+
readHeaders = true,
|
|
36
|
+
onProgress,
|
|
37
|
+
onError,
|
|
38
|
+
timeZone,
|
|
39
|
+
isZip
|
|
40
|
+
} = _ref;
|
|
36
41
|
this.onFileCompleted = onFileCompleted;
|
|
37
42
|
this.session = session;
|
|
38
43
|
this.file = file;
|
|
@@ -70,230 +75,202 @@ var CsvParser = /*#__PURE__*/function () {
|
|
|
70
75
|
};
|
|
71
76
|
}
|
|
72
77
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
this.isCancelled = true;
|
|
77
|
-
}
|
|
78
|
-
}, {
|
|
79
|
-
key: "transpose",
|
|
80
|
-
value: function transpose(numColumns, array) {
|
|
81
|
-
var numRows = array.length;
|
|
82
|
-
var columns = new Array(numColumns).fill(null).map(function () {
|
|
83
|
-
return new Array(numRows);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
for (var r = 0; r < numRows; r += 1) {
|
|
87
|
-
var row = array[r];
|
|
88
|
-
|
|
89
|
-
if (row.length < numColumns) {
|
|
90
|
-
throw new Error("Insufficient columns. Expected ".concat(numColumns, " but found ").concat(row.length, "\n").concat(row));
|
|
91
|
-
}
|
|
78
|
+
cancel() {
|
|
79
|
+
this.isCancelled = true;
|
|
80
|
+
}
|
|
92
81
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
}
|
|
82
|
+
transpose(numColumns, array) {
|
|
83
|
+
var numRows = array.length;
|
|
84
|
+
var columns = new Array(numColumns).fill(null).map(() => new Array(numRows));
|
|
98
85
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}, {
|
|
102
|
-
key: "nullCheck",
|
|
103
|
-
value: function nullCheck(value) {
|
|
104
|
-
return value === this.type.nullString ? '' : value;
|
|
105
|
-
}
|
|
106
|
-
}, {
|
|
107
|
-
key: "parse",
|
|
108
|
-
value: function parse() {
|
|
109
|
-
var _this = this;
|
|
110
|
-
|
|
111
|
-
var handleParseDone = function handleParseDone(types) {
|
|
112
|
-
var toParse = _this.isZip ? _this.file.nodeStream('nodebuffer', _this.handleNodeUpdate) : _this.file;
|
|
113
|
-
_this.types = types;
|
|
114
|
-
Papa.parse(toParse, _this.config);
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
var typeParser = new CsvTypeParser(handleParseDone, this.file, this.readHeaders, this.config, this.type.nullString, this.onProgress, this.onError, this.totalChunks, this.isZip, this.type.shouldTrim);
|
|
118
|
-
typeParser.parse();
|
|
119
|
-
}
|
|
120
|
-
}, {
|
|
121
|
-
key: "handleChunk",
|
|
122
|
-
value: function handleChunk(result, parser) {
|
|
123
|
-
var readHeaders = this.readHeaders,
|
|
124
|
-
onError = this.onError,
|
|
125
|
-
handleCreateTable = this.handleCreateTable,
|
|
126
|
-
isZip = this.isZip,
|
|
127
|
-
tables = this.tables;
|
|
86
|
+
for (var r = 0; r < numRows; r += 1) {
|
|
87
|
+
var row = array[r];
|
|
128
88
|
|
|
129
|
-
if (
|
|
130
|
-
|
|
131
|
-
parser.abort();
|
|
132
|
-
tables.forEach(function (t) {
|
|
133
|
-
return t.close();
|
|
134
|
-
});
|
|
135
|
-
return;
|
|
89
|
+
if (row.length < numColumns) {
|
|
90
|
+
throw new Error("Insufficient columns. Expected ".concat(numColumns, " but found ").concat(row.length, "\n").concat(row));
|
|
136
91
|
}
|
|
137
92
|
|
|
138
|
-
var
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (readHeaders) {
|
|
142
|
-
this.headers = DbNameValidator.legalizeColumnNames(data[0]);
|
|
143
|
-
data = data.slice(1);
|
|
144
|
-
} else {
|
|
145
|
-
this.headers = CsvParser.generateHeaders(data[0].length);
|
|
146
|
-
}
|
|
93
|
+
for (var c = 0; c < numColumns; c += 1) {
|
|
94
|
+
var value = this.type.shouldTrim ? array[r][c].trim() : array[r][c];
|
|
95
|
+
columns[c][r] = this.nullCheck(value);
|
|
147
96
|
}
|
|
97
|
+
}
|
|
148
98
|
|
|
149
|
-
|
|
99
|
+
return columns;
|
|
100
|
+
}
|
|
150
101
|
|
|
151
|
-
|
|
152
|
-
|
|
102
|
+
nullCheck(value) {
|
|
103
|
+
return value === this.type.nullString ? '' : value;
|
|
104
|
+
}
|
|
153
105
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
106
|
+
parse() {
|
|
107
|
+
var handleParseDone = types => {
|
|
108
|
+
var toParse = this.isZip ? this.file.nodeStream('nodebuffer', this.handleNodeUpdate) : this.file;
|
|
109
|
+
this.types = types;
|
|
110
|
+
Papa.parse(toParse, this.config);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
var typeParser = new CsvTypeParser(handleParseDone, this.file, this.readHeaders, this.config, this.type.nullString, this.onProgress, this.onError, this.totalChunks, this.isZip, this.type.shouldTrim);
|
|
114
|
+
typeParser.parse();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
handleChunk(result, parser) {
|
|
118
|
+
var {
|
|
119
|
+
readHeaders,
|
|
120
|
+
onError,
|
|
121
|
+
handleCreateTable,
|
|
122
|
+
isZip,
|
|
123
|
+
tables
|
|
124
|
+
} = this;
|
|
125
|
+
|
|
126
|
+
if (this.isCancelled) {
|
|
127
|
+
log.debug2('CSV parser cancelled.');
|
|
128
|
+
parser.abort();
|
|
129
|
+
tables.forEach(t => t.close());
|
|
130
|
+
return;
|
|
165
131
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
132
|
+
|
|
133
|
+
var {
|
|
134
|
+
data
|
|
135
|
+
} = result;
|
|
136
|
+
|
|
137
|
+
if (!this.headers) {
|
|
138
|
+
if (readHeaders) {
|
|
139
|
+
this.headers = DbNameValidator.legalizeColumnNames(data[0]);
|
|
140
|
+
data = data.slice(1);
|
|
171
141
|
} else {
|
|
172
|
-
|
|
173
|
-
this.consolidatedChunks[i] = this.consolidatedChunks[i].concat(columns[i]);
|
|
174
|
-
}
|
|
142
|
+
this.headers = CsvParser.generateHeaders(data[0].length);
|
|
175
143
|
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
var columns = [];
|
|
176
147
|
|
|
177
|
-
|
|
148
|
+
try {
|
|
149
|
+
columns = this.transpose(this.headers.length, data);
|
|
178
150
|
|
|
179
|
-
if (
|
|
180
|
-
|
|
151
|
+
if (isZip) {
|
|
152
|
+
// Zip file chunks are tiny, so consolidate them to avoid create thousands of small tables
|
|
153
|
+
this.consolidateChunks(columns, parser);
|
|
154
|
+
} else {
|
|
155
|
+
var index = this.chunks;
|
|
156
|
+
this.chunks += 1;
|
|
157
|
+
handleCreateTable(index, columns, parser);
|
|
181
158
|
}
|
|
159
|
+
} catch (e) {
|
|
160
|
+
onError(e);
|
|
182
161
|
}
|
|
183
|
-
}
|
|
184
|
-
key: "uploadConsolidatedChunks",
|
|
185
|
-
value: function uploadConsolidatedChunks(parser) {
|
|
186
|
-
var handleCreateTable = this.handleCreateTable;
|
|
187
|
-
var index = this.chunks;
|
|
188
|
-
this.chunks += 1;
|
|
189
|
-
var toUpload = this.consolidatedChunks.slice();
|
|
190
|
-
this.consolidatedChunks = null;
|
|
191
|
-
this.numConsolidated = 0;
|
|
192
|
-
handleCreateTable(index, toUpload, parser);
|
|
193
|
-
}
|
|
194
|
-
}, {
|
|
195
|
-
key: "handleCreateTable",
|
|
196
|
-
value: function handleCreateTable(index, columns, parser) {
|
|
197
|
-
var _this2 = this;
|
|
198
|
-
|
|
199
|
-
var session = this.session,
|
|
200
|
-
tables = this.tables,
|
|
201
|
-
onFileCompleted = this.onFileCompleted,
|
|
202
|
-
totalChunks = this.totalChunks,
|
|
203
|
-
types = this.types,
|
|
204
|
-
onProgress = this.onProgress,
|
|
205
|
-
onError = this.onError;
|
|
162
|
+
}
|
|
206
163
|
|
|
207
|
-
|
|
208
|
-
|
|
164
|
+
consolidateChunks(columns, parser) {
|
|
165
|
+
if (!this.consolidatedChunks) {
|
|
166
|
+
this.consolidatedChunks = columns.slice();
|
|
167
|
+
} else {
|
|
168
|
+
for (var i = 0; i < columns.length; i += 1) {
|
|
169
|
+
this.consolidatedChunks[i] = this.consolidatedChunks[i].concat(columns[i]);
|
|
209
170
|
}
|
|
171
|
+
}
|
|
210
172
|
|
|
211
|
-
|
|
212
|
-
if (_this2.isCancelled) {
|
|
213
|
-
log.debug2('CSV parser cancelled.');
|
|
173
|
+
this.numConsolidated += 1;
|
|
214
174
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
175
|
+
if (this.numConsolidated >= ZIP_CONSOLIDATE_CHUNKS || this.isComplete) {
|
|
176
|
+
this.uploadConsolidatedChunks(parser);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
218
179
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
180
|
+
uploadConsolidatedChunks(parser) {
|
|
181
|
+
var {
|
|
182
|
+
handleCreateTable
|
|
183
|
+
} = this;
|
|
184
|
+
var index = this.chunks;
|
|
185
|
+
this.chunks += 1;
|
|
186
|
+
var toUpload = this.consolidatedChunks.slice();
|
|
187
|
+
this.consolidatedChunks = null;
|
|
188
|
+
this.numConsolidated = 0;
|
|
189
|
+
handleCreateTable(index, toUpload, parser);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
handleCreateTable(index, columns, parser) {
|
|
193
|
+
var {
|
|
194
|
+
session,
|
|
195
|
+
tables,
|
|
196
|
+
onFileCompleted,
|
|
197
|
+
totalChunks,
|
|
198
|
+
types,
|
|
199
|
+
onProgress,
|
|
200
|
+
onError
|
|
201
|
+
} = this;
|
|
202
|
+
|
|
203
|
+
if (parser) {
|
|
204
|
+
parser.pause();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
session.newTable(this.headers, types, columns, this.timeZone).then(table => {
|
|
208
|
+
if (this.isCancelled) {
|
|
209
|
+
log.debug2('CSV parser cancelled.');
|
|
224
210
|
|
|
225
211
|
if (parser) {
|
|
226
|
-
parser.
|
|
212
|
+
parser.abort();
|
|
227
213
|
}
|
|
228
214
|
|
|
229
|
-
tables
|
|
215
|
+
tables.forEach(t => t.close());
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
230
218
|
|
|
231
|
-
|
|
219
|
+
if (parser) {
|
|
220
|
+
parser.resume();
|
|
221
|
+
}
|
|
232
222
|
|
|
233
|
-
|
|
234
|
-
progress = Math.round(tables.length / totalChunks * 50) + 50;
|
|
235
|
-
} else {
|
|
236
|
-
progress = Math.round(50 + _this2.zipProgress / 2);
|
|
237
|
-
}
|
|
223
|
+
tables[index] = table; // This accounts for 50% of parsing plus 50% already done by the type parser
|
|
238
224
|
|
|
239
|
-
|
|
240
|
-
onProgress(progress);
|
|
225
|
+
var progress = 0;
|
|
241
226
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
if (!_this2.isComplete && parser) {
|
|
248
|
-
parser.abort();
|
|
249
|
-
}
|
|
227
|
+
if (totalChunks > 0) {
|
|
228
|
+
progress = Math.round(tables.length / totalChunks * 50) + 50;
|
|
229
|
+
} else {
|
|
230
|
+
progress = Math.round(50 + this.zipProgress / 2);
|
|
231
|
+
}
|
|
250
232
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
// results is undefined for a succesful parse, but has meta data for an abort
|
|
258
|
-
if (!results || !results.meta.aborted) {
|
|
259
|
-
this.isComplete = true; // Check if there are any consolidated chunks left over from a zip file
|
|
260
|
-
|
|
261
|
-
if (this.consolidatedChunks) {
|
|
262
|
-
this.uploadConsolidatedChunks(null);
|
|
263
|
-
}
|
|
233
|
+
log.debug2("CSV parser progress ".concat(progress));
|
|
234
|
+
onProgress(progress);
|
|
235
|
+
|
|
236
|
+
if (this.isComplete && tables.length === this.chunks) {
|
|
237
|
+
log.debug2('CSV parser complete.');
|
|
238
|
+
onFileCompleted(tables);
|
|
264
239
|
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
value: function handleError(error) {
|
|
269
|
-
var onError = this.onError;
|
|
270
|
-
onError(error);
|
|
271
|
-
}
|
|
272
|
-
}, {
|
|
273
|
-
key: "handleNodeUpdate",
|
|
274
|
-
value: function handleNodeUpdate(metadata) {
|
|
275
|
-
this.zipProgress = metadata.percent;
|
|
276
|
-
}
|
|
277
|
-
}], [{
|
|
278
|
-
key: "generateHeaderRecursive",
|
|
279
|
-
value: // Generates column names A-Z, AA-AZ, BA-BZ, etc...
|
|
280
|
-
function generateHeaderRecursive(n) {
|
|
281
|
-
var header = '';
|
|
282
|
-
var _char = n;
|
|
283
|
-
|
|
284
|
-
if (n >= 26) {
|
|
285
|
-
header = header.concat(CsvParser.generateHeaderRecursive(Math.floor(n / 26) - 1));
|
|
286
|
-
_char = n % 26;
|
|
240
|
+
}).catch(e => {
|
|
241
|
+
if (!this.isComplete && parser) {
|
|
242
|
+
parser.abort();
|
|
287
243
|
}
|
|
288
244
|
|
|
289
|
-
|
|
245
|
+
onError(e);
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
handleComplete(results) {
|
|
250
|
+
// results is undefined for a succesful parse, but has meta data for an abort
|
|
251
|
+
if (!results || !results.meta.aborted) {
|
|
252
|
+
this.isComplete = true; // Check if there are any consolidated chunks left over from a zip file
|
|
253
|
+
|
|
254
|
+
if (this.consolidatedChunks) {
|
|
255
|
+
this.uploadConsolidatedChunks(null);
|
|
256
|
+
}
|
|
290
257
|
}
|
|
291
|
-
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
handleError(error) {
|
|
261
|
+
var {
|
|
262
|
+
onError
|
|
263
|
+
} = this;
|
|
264
|
+
onError(error);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
handleNodeUpdate(metadata) {
|
|
268
|
+
this.zipProgress = metadata.percent;
|
|
269
|
+
}
|
|
292
270
|
|
|
293
|
-
|
|
294
|
-
}();
|
|
271
|
+
}
|
|
295
272
|
|
|
296
|
-
_defineProperty(CsvParser, "generateHeaders",
|
|
273
|
+
_defineProperty(CsvParser, "generateHeaders", numColumns => {
|
|
297
274
|
var headers = [];
|
|
298
275
|
|
|
299
276
|
for (var i = 0; i < numColumns; i += 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/csv/CsvParser.js"],"names":["Papa","Log","DbNameValidator","CsvTypeParser","log","module","ZIP_CONSOLIDATE_CHUNKS","CsvParser","onFileCompleted","session","file","type","readHeaders","onProgress","onError","timeZone","isZip","tables","headers","types","chunks","totalChunks","Math","ceil","size","LocalChunkSize","isComplete","zipProgress","consolidatedChunks","numConsolidated","isCancelled","handleChunk","bind","handleError","handleComplete","handleNodeUpdate","handleCreateTable","config","delimiter","newline","escapeChar","dynamicTyping","error","skipEmptyLines","chunk","complete","fastMode","numColumns","array","numRows","length","columns","Array","fill","map","r","row","Error","c","value","shouldTrim","trim","nullCheck","nullString","handleParseDone","toParse","nodeStream","parse","typeParser","result","parser","debug2","abort","forEach","t","close","data","legalizeColumnNames","slice","generateHeaders","transpose","consolidateChunks","index","e","i","concat","uploadConsolidatedChunks","toUpload","pause","newTable","then","table","resume","progress","round","results","meta","aborted","metadata","percent","n","header","char","generateHeaderRecursive","floor","String","fromCharCode","push"],"mappings":"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","sourcesContent":["import Papa from 'papaparse';\nimport Log from '@deephaven/log';\nimport { DbNameValidator } from '@deephaven/utils';\nimport CsvTypeParser from './CsvTypeParser';\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\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 => {\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) {\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 }) {\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.headers = null;\n this.types = null;\n this.chunks = 0;\n this.totalChunks = isZip ? 0 : Math.ceil(file.size / Papa.LocalChunkSize);\n this.isComplete = false;\n this.zipProgress = 0;\n this.consolidatedChunks = null;\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,\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 cancel() {\n this.isCancelled = true;\n }\n\n transpose(numColumns, array) {\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;\n }\n\n nullCheck(value) {\n return value === this.type.nullString ? '' : value;\n }\n\n parse() {\n const handleParseDone = types => {\n const toParse = this.isZip\n ? this.file.nodeStream('nodebuffer', this.handleNodeUpdate)\n : this.file;\n this.types = types;\n Papa.parse(toParse, this.config);\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, parser) {\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 = [];\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) {\n onError(e);\n }\n }\n\n consolidateChunks(columns, parser) {\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) {\n const { handleCreateTable } = this;\n const index = this.chunks;\n this.chunks += 1;\n const toUpload = this.consolidatedChunks.slice();\n this.consolidatedChunks = null;\n this.numConsolidated = 0;\n handleCreateTable(index, toUpload, parser);\n }\n\n handleCreateTable(index, columns, parser) {\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 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 progress = Math.round(50 + this.zipProgress / 2);\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) {\n // results is undefined for a succesful parse, but has meta data for an abort\n if (!results || !results.meta.aborted) {\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) {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata) {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvParser;\n"],"file":"CsvParser.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/csv/CsvParser.js"],"names":["Papa","Log","DbNameValidator","CsvTypeParser","log","module","ZIP_CONSOLIDATE_CHUNKS","CsvParser","generateHeaderRecursive","n","header","char","concat","Math","floor","String","fromCharCode","constructor","onFileCompleted","session","file","type","readHeaders","onProgress","onError","timeZone","isZip","tables","headers","types","chunks","totalChunks","ceil","size","LocalChunkSize","isComplete","zipProgress","consolidatedChunks","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","toParse","nodeStream","typeParser","result","parser","debug2","abort","forEach","t","close","data","legalizeColumnNames","slice","generateHeaders","consolidateChunks","index","e","i","uploadConsolidatedChunks","toUpload","pause","newTable","then","table","resume","progress","round","catch","results","meta","aborted","metadata","percent","push"],"mappings":"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","sourcesContent":["import Papa from 'papaparse';\nimport Log from '@deephaven/log';\nimport { DbNameValidator } from '@deephaven/utils';\nimport CsvTypeParser from './CsvTypeParser';\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\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 => {\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) {\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 }) {\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.headers = null;\n this.types = null;\n this.chunks = 0;\n this.totalChunks = isZip ? 0 : Math.ceil(file.size / Papa.LocalChunkSize);\n this.isComplete = false;\n this.zipProgress = 0;\n this.consolidatedChunks = null;\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,\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 cancel() {\n this.isCancelled = true;\n }\n\n transpose(numColumns, array) {\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;\n }\n\n nullCheck(value) {\n return value === this.type.nullString ? '' : value;\n }\n\n parse() {\n const handleParseDone = types => {\n const toParse = this.isZip\n ? this.file.nodeStream('nodebuffer', this.handleNodeUpdate)\n : this.file;\n this.types = types;\n Papa.parse(toParse, this.config);\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, parser) {\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 = [];\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) {\n onError(e);\n }\n }\n\n consolidateChunks(columns, parser) {\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) {\n const { handleCreateTable } = this;\n const index = this.chunks;\n this.chunks += 1;\n const toUpload = this.consolidatedChunks.slice();\n this.consolidatedChunks = null;\n this.numConsolidated = 0;\n handleCreateTable(index, toUpload, parser);\n }\n\n handleCreateTable(index, columns, parser) {\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 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 progress = Math.round(50 + this.zipProgress / 2);\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) {\n // results is undefined for a succesful parse, but has meta data for an abort\n if (!results || !results.meta.aborted) {\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) {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata) {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvParser;\n"],"file":"CsvParser.js"}
|