@deephaven/console 0.15.1-beta.2 → 0.15.2-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Console.d.ts +129 -121
- package/dist/Console.d.ts.map +1 -1
- package/dist/Console.js +98 -99
- package/dist/Console.js.map +1 -1
- package/dist/ConsoleInput.d.ts +47 -43
- package/dist/ConsoleInput.d.ts.map +1 -1
- package/dist/ConsoleInput.js +111 -73
- package/dist/ConsoleInput.js.map +1 -1
- package/dist/ConsoleMenu.d.ts +24 -22
- package/dist/ConsoleMenu.d.ts.map +1 -1
- package/dist/ConsoleMenu.js +7 -12
- package/dist/ConsoleMenu.js.map +1 -1
- package/dist/ConsolePropTypes.d.ts +2 -2
- package/dist/ConsolePropTypes.d.ts.map +1 -1
- package/dist/ConsolePropTypes.js.map +1 -1
- package/dist/ConsoleStatusBar.d.ts +26 -29
- package/dist/ConsoleStatusBar.d.ts.map +1 -1
- package/dist/ConsoleStatusBar.js +11 -12
- package/dist/ConsoleStatusBar.js.map +1 -1
- package/dist/StoragePropTypes.d.ts +2 -2
- package/dist/StoragePropTypes.d.ts.map +1 -1
- package/dist/StoragePropTypes.js.map +1 -1
- package/dist/command-history/CommandHistory.d.ts +52 -77
- package/dist/command-history/CommandHistory.d.ts.map +1 -1
- package/dist/command-history/CommandHistory.js +12 -14
- package/dist/command-history/CommandHistory.js.map +1 -1
- package/dist/command-history/CommandHistoryActions.d.ts +11 -19
- package/dist/command-history/CommandHistoryActions.d.ts.map +1 -1
- package/dist/command-history/CommandHistoryActions.js +4 -19
- package/dist/command-history/CommandHistoryActions.js.map +1 -1
- package/dist/command-history/CommandHistoryItem.d.ts +15 -21
- package/dist/command-history/CommandHistoryItem.d.ts.map +1 -1
- package/dist/command-history/CommandHistoryItem.js +1 -10
- package/dist/command-history/CommandHistoryItem.js.map +1 -1
- package/dist/command-history/CommandHistoryItemTooltip.d.ts +34 -31
- package/dist/command-history/CommandHistoryItemTooltip.d.ts.map +1 -1
- package/dist/command-history/CommandHistoryItemTooltip.js +28 -36
- package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -1
- package/dist/command-history/CommandHistoryTypes.d.ts +19 -0
- package/dist/command-history/CommandHistoryTypes.d.ts.map +1 -0
- package/dist/command-history/CommandHistoryTypes.js +2 -0
- package/dist/command-history/CommandHistoryTypes.js.map +1 -0
- package/dist/command-history/index.d.ts +5 -5
- package/dist/command-history/index.d.ts.map +1 -1
- package/dist/command-history/index.js.map +1 -1
- package/dist/common/Code.d.ts +10 -11
- package/dist/common/Code.d.ts.map +1 -1
- package/dist/common/Code.js +5 -5
- package/dist/common/Code.js.map +1 -1
- package/dist/common/ConsoleUtils.d.ts +20 -8
- package/dist/common/ConsoleUtils.d.ts.map +1 -1
- package/dist/common/ConsoleUtils.js +34 -10
- package/dist/common/ConsoleUtils.js.map +1 -1
- package/dist/console-history/ConsoleHistory.d.ts +19 -18
- package/dist/console-history/ConsoleHistory.d.ts.map +1 -1
- package/dist/console-history/ConsoleHistory.js +5 -9
- package/dist/console-history/ConsoleHistory.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItem.d.ts +21 -44
- package/dist/console-history/ConsoleHistoryItem.d.ts.map +1 -1
- package/dist/console-history/ConsoleHistoryItem.js +12 -28
- package/dist/console-history/ConsoleHistoryItem.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItemResult.d.ts +13 -9
- package/dist/console-history/ConsoleHistoryItemResult.d.ts.map +1 -1
- package/dist/console-history/ConsoleHistoryItemResult.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultErrorMessage.d.ts +25 -21
- package/dist/console-history/ConsoleHistoryResultErrorMessage.d.ts.map +1 -1
- package/dist/console-history/ConsoleHistoryResultErrorMessage.js +15 -9
- package/dist/console-history/ConsoleHistoryResultErrorMessage.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultInProgress.d.ts +21 -17
- package/dist/console-history/ConsoleHistoryResultInProgress.d.ts.map +1 -1
- package/dist/console-history/ConsoleHistoryResultInProgress.js +12 -10
- package/dist/console-history/ConsoleHistoryResultInProgress.js.map +1 -1
- package/dist/console-history/ConsoleHistoryTypes.d.ts +19 -0
- package/dist/console-history/ConsoleHistoryTypes.d.ts.map +1 -0
- package/dist/console-history/ConsoleHistoryTypes.js +2 -0
- package/dist/console-history/ConsoleHistoryTypes.js.map +1 -0
- package/dist/console-history/index.d.ts +5 -5
- package/dist/console-history/index.d.ts.map +1 -1
- package/dist/console-history/index.js.map +1 -1
- package/dist/csv/CsvFormats.d.ts +13 -12
- package/dist/csv/CsvFormats.d.ts.map +1 -1
- package/dist/csv/CsvFormats.js +8 -8
- package/dist/csv/CsvFormats.js.map +1 -1
- package/dist/csv/CsvInputBar.d.ts +46 -38
- package/dist/csv/CsvInputBar.d.ts.map +1 -1
- package/dist/csv/CsvInputBar.js +15 -23
- package/dist/csv/CsvInputBar.js.map +1 -1
- package/dist/csv/CsvOverlay.d.ts +40 -40
- package/dist/csv/CsvOverlay.d.ts.map +1 -1
- package/dist/csv/CsvOverlay.js +38 -29
- package/dist/csv/CsvOverlay.js.map +1 -1
- package/dist/csv/CsvParser.d.ts +44 -46
- package/dist/csv/CsvParser.d.ts.map +1 -1
- package/dist/csv/CsvParser.js +53 -8
- package/dist/csv/CsvParser.js.map +1 -1
- package/dist/csv/CsvTypeParser.d.ts +32 -27
- package/dist/csv/CsvTypeParser.d.ts.map +1 -1
- package/dist/csv/CsvTypeParser.js +42 -8
- package/dist/csv/CsvTypeParser.js.map +1 -1
- package/dist/csv/NewTableColumnTypes.d.ts +1 -1
- package/dist/csv/NewTableColumnTypes.d.ts.map +1 -1
- package/dist/csv/NewTableColumnTypes.js.map +1 -1
- package/dist/declaration.d.js +2 -0
- package/dist/declaration.d.js.map +1 -0
- package/dist/index.d.ts +14 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/log/LogLevel.d.ts +1 -1
- package/dist/log/LogLevel.d.ts.map +1 -1
- package/dist/log/LogLevel.js.map +1 -1
- package/dist/log/LogLevelMenuItem.d.ts +11 -12
- package/dist/log/LogLevelMenuItem.d.ts.map +1 -1
- package/dist/log/LogLevelMenuItem.js +0 -6
- package/dist/log/LogLevelMenuItem.js.map +1 -1
- package/dist/log/LogView.d.ts +40 -47
- package/dist/log/LogView.d.ts.map +1 -1
- package/dist/log/LogView.js +65 -29
- package/dist/log/LogView.js.map +1 -1
- package/dist/monaco/MonacoCompletionProvider.d.ts +19 -19
- package/dist/monaco/MonacoCompletionProvider.d.ts.map +1 -1
- package/dist/monaco/MonacoCompletionProvider.js +11 -15
- package/dist/monaco/MonacoCompletionProvider.js.map +1 -1
- package/dist/monaco/MonacoUtils.d.ts +77 -20
- package/dist/monaco/MonacoUtils.d.ts.map +1 -1
- package/dist/monaco/MonacoUtils.js +32 -24
- package/dist/monaco/MonacoUtils.js.map +1 -1
- package/dist/monaco/index.d.ts +3 -2
- package/dist/monaco/index.d.ts.map +1 -1
- package/dist/monaco/index.js.map +1 -1
- package/dist/monaco/lang/Language.d.ts +7 -0
- package/dist/monaco/lang/Language.d.ts.map +1 -0
- package/dist/monaco/lang/Language.js +2 -0
- package/dist/monaco/lang/Language.js.map +1 -0
- package/dist/monaco/lang/db.d.ts +3 -93
- package/dist/monaco/lang/db.d.ts.map +1 -1
- package/dist/monaco/lang/db.js +18 -3
- package/dist/monaco/lang/db.js.map +1 -1
- package/dist/monaco/lang/groovy.d.ts +3 -146
- package/dist/monaco/lang/groovy.d.ts.map +1 -1
- package/dist/monaco/lang/groovy.js +15 -2
- package/dist/monaco/lang/groovy.js.map +1 -1
- package/dist/monaco/lang/log.d.ts +3 -40
- package/dist/monaco/lang/log.d.ts.map +1 -1
- package/dist/monaco/lang/log.js +2 -1
- package/dist/monaco/lang/log.js.map +1 -1
- package/dist/monaco/lang/python.d.ts +3 -154
- package/dist/monaco/lang/python.d.ts.map +1 -1
- package/dist/monaco/lang/python.js +15 -2
- package/dist/monaco/lang/python.js.map +1 -1
- package/dist/monaco/lang/scala.d.ts +3 -140
- package/dist/monaco/lang/scala.d.ts.map +1 -1
- package/dist/monaco/lang/scala.js +10 -3
- package/dist/monaco/lang/scala.js.map +1 -1
- package/dist/notebook/Editor.d.ts +26 -27
- package/dist/notebook/Editor.d.ts.map +1 -1
- package/dist/notebook/Editor.js +23 -19
- package/dist/notebook/Editor.js.map +1 -1
- package/dist/notebook/ScriptEditor.d.ts +54 -51
- package/dist/notebook/ScriptEditor.d.ts.map +1 -1
- package/dist/notebook/ScriptEditor.js +45 -48
- package/dist/notebook/ScriptEditor.js.map +1 -1
- package/dist/notebook/ScriptEditorUtils.d.ts +15 -10
- package/dist/notebook/ScriptEditorUtils.d.ts.map +1 -1
- package/dist/notebook/ScriptEditorUtils.js +7 -7
- package/dist/notebook/ScriptEditorUtils.js.map +1 -1
- package/package.json +12 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/csv/CsvOverlay.jsx"],"names":["React","Component","PropTypes","memoize","FontAwesomeIcon","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","TextUtils","PASTED_VALUES","INVALID_MIME_TYPES","VALID_EXTENSIONS","ZIP_EXTENSIONS","CsvOverlay","isValidDropItem","item","kind","find","invalid","test","type","isValidExtension","name","allowZip","some","ext","endsWith","handleDragOver","e","preventDefault","stopPropagation","getIcon","fileName","constructor","props","getValidExtensions","join","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","getAcceptString","display","getFileTypeErrorString","propTypes","bool","func","isRequired","string","defaultProps"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport memoize from 'memoize-one';\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';\nimport { TextUtils } from '@deephaven/utils';\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 {\n static MULTIPLE_FILE_ERROR = 'Please select only 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, allowZip = false) {\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) {\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 { allowZip, 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, allowZip)) {\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 getValidExtensions = memoize(allowZip =>\n allowZip ? [...VALID_EXTENSIONS, ...ZIP_EXTENSIONS] : [...VALID_EXTENSIONS]\n );\n\n getAcceptString = memoize(allowZip =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize(allowZip =>\n TextUtils.join(this.getValidExtensions(allowZip), 'or')\n );\n\n render() {\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 && (\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>{this.getFileTypeErrorString(allowZip)}</label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nCsvOverlay.propTypes = {\n allowZip: PropTypes.bool,\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 allowZip: false,\n dragError: null,\n};\n\nexport default CsvOverlay;\n"],"file":"CsvOverlay.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/csv/CsvOverlay.tsx"],"names":["React","Component","memoize","FontAwesomeIcon","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","assertNotNull","TextUtils","PASTED_VALUES","INVALID_MIME_TYPES","VALID_EXTENSIONS","ZIP_EXTENSIONS","CsvOverlay","isValidDropItem","item","kind","find","invalid","test","type","isValidExtension","name","allowZip","some","ext","endsWith","handleDragOver","e","preventDefault","stopPropagation","getIcon","fileName","constructor","props","getValidExtensions","join","handleSelectFile","bind","handleFiles","handleDrop","unstageFile","handleMenuPaste","handlePasteEvent","fileElem","createRef","divElem","state","selectedFileName","componentDidMount","current","addEventListener","focus","componentWillUnmount","removeEventListener","value","click","event","files","target","handleFile","clearDragError","dragError","dataTransfer","items","file","getAsFile","setState","dropError","FILE_TYPE_ERROR","onCancel","undefined","onFileOpened","onPaste","onError","uploadInProgress","navigator","clipboard","readText","then","clipText","catch","makeContextMenuItems","title","icon","action","shortcut","PASTE","disabled","render","error","contextActions","getAcceptString","display","getFileTypeErrorString"],"mappings":";;AAAA,OAAOA,KAAP,IAEEC,SAFF,QAOO,OAPP;AAQA,OAAOC,OAAP,MAAoB,aAApB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAEEC,cAFF,EAGEC,gBAHF,QAIO,uBAJP;AAKA,SACEC,SADF,EAEEC,cAFF,EAGEC,iBAHF,EAKEC,QALF,EAMEC,SANF,EAOEC,OAPF,EAQEC,SARF,QASO,kBATP;;AAWA,SAASC,aAAT,EAAwBC,SAAxB,QAAyC,kBAAzC;AAkBA,IAAMC,aAAa,GAAG,eAAtB;AAEA,IAAMC,kBAAkB,GAAG,CAAC,UAAD,EAAa,SAAb,EAAwB,UAAxB,EAAoC,UAApC,CAA3B;AAEA,IAAMC,gBAAgB,GAAG,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,EAAyB,MAAzB,EAAiC,MAAjC,EAAyC,MAAzC,CAAzB;AAEA,IAAMC,cAAc,GAAG,CAAC,MAAD,CAAvB;AAEA;AACA;AACA;;AACA,MAAMC,UAAN,SAAyBlB,SAAzB,CAAqE;AAU7C,SAAfmB,eAAe,CAACC,IAAD,EAAkC;AACtD,WACEA,IAAI,IACJA,IAAI,CAACC,IAAL,KAAc,MADd,IAEA,CAACN,kBAAkB,CAACO,IAAnB,CAAwBC,OAAO,IAAIA,OAAO,CAACC,IAAR,CAAaJ,IAAI,CAACK,IAAlB,CAAnC,CAHH;AAKD;;AAEsB,SAAhBC,gBAAgB,CAACC,IAAD,EAA0C;AAAA,QAA3BC,QAA2B,uEAAhB,KAAgB;AAC/D,WACEZ,gBAAgB,CAACa,IAAjB,CAAsBC,GAAG,IAAIH,IAAI,CAACI,QAAL,CAAcD,GAAd,CAA7B,KACCF,QAAQ,IAAIX,cAAc,CAACY,IAAf,CAAoBC,GAAG,IAAIH,IAAI,CAACI,QAAL,CAAcD,GAAd,CAA3B,CAFf;AAID;;AAEoB,SAAdE,cAAc,CAACC,CAAD,EAAqB;AACxCA,IAAAA,CAAC,CAACC,cAAF;AACAD,IAAAA,CAAC,CAACE,eAAF;AACD;;AAEa,SAAPC,OAAO,CAACC,QAAD,EAAmC;AAC/C,QAAIA,QAAQ,KAAKvB,aAAjB,EAAgC;AAC9B,aAAON,QAAP;AACD;;AACD,QAAI6B,QAAQ,CAACN,QAAT,CAAkB,MAAlB,CAAJ,EAA+B;AAC7B,aAAO1B,SAAP;AACD;;AACD,QAAIgC,QAAQ,CAACN,QAAT,CAAkB,MAAlB,CAAJ,EAA+B;AAC7B,aAAOtB,SAAP;AACD;;AACD,WAAOF,iBAAP;AACD;;AAED+B,EAAAA,WAAW,CAACC,KAAD,EAAyB;AAClC,UAAMA,KAAN;;AADkC;;AAAA;;AAAA,gDAgIftC,OAAO,CAAC2B,QAAQ,IACnCA,QAAQ,GAAG,CAAC,GAAGZ,gBAAJ,EAAsB,GAAGC,cAAzB,CAAH,GAA8C,CAAC,GAAGD,gBAAJ,CAD5B,CAhIQ;;AAAA,6CAoIlBf,OAAO,CAAC2B,QAAQ,IAChC,KAAKY,kBAAL,CAAwBZ,QAAxB,EAAkCa,IAAlC,CAAuC,IAAvC,CADuB,CApIW;;AAAA,oDAwIXxC,OAAO,CAAC2B,QAAQ,IACvCf,SAAS,CAAC4B,IAAV,CAAe,KAAKD,kBAAL,CAAwBZ,QAAxB,CAAf,EAAkD,IAAlD,CAD8B,CAxII;;AAGlC,SAAKc,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBC,IAAtB,CAA2B,IAA3B,CAAxB;AACA,SAAKC,WAAL,GAAmB,KAAKA,WAAL,CAAiBD,IAAjB,CAAsB,IAAtB,CAAnB;AACA,SAAKE,UAAL,GAAkB,KAAKA,UAAL,CAAgBF,IAAhB,CAAqB,IAArB,CAAlB;AACA,SAAKG,WAAL,GAAmB,KAAKA,WAAL,CAAiBH,IAAjB,CAAsB,IAAtB,CAAnB;AACA,SAAKI,eAAL,GAAuB,KAAKA,eAAL,CAAqBJ,IAArB,CAA0B,IAA1B,CAAvB;AACA,SAAKK,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBL,IAAtB,CAA2B,IAA3B,CAAxB;AAEA,SAAKM,QAAL,gBAAgBlD,KAAK,CAACmD,SAAN,EAAhB;AACA,SAAKC,OAAL,gBAAepD,KAAK,CAACmD,SAAN,EAAf;AAEA,SAAKE,KAAL,GAAa;AACXC,MAAAA,gBAAgB,EAAE;AADP,KAAb;AAGD;;AAEDC,EAAAA,iBAAiB,GAAS;AAAA;;AACxB,kCAAKH,OAAL,CAAaI,OAAb,gFAAsBC,gBAAtB,CAAuC,OAAvC,EAAgD,KAAKR,gBAArD;AACA,mCAAKG,OAAL,CAAaI,OAAb,kFAAsBE,KAAtB;AACD;;AAEDC,EAAAA,oBAAoB,GAAS;AAAA;;AAC3B,mCAAKP,OAAL,CAAaI,OAAb,kFAAsBI,mBAAtB,CAA0C,OAA1C,EAAmD,KAAKX,gBAAxD;AACD;;AAMDN,EAAAA,gBAAgB,GAAS;AACvB,QAAI,KAAKO,QAAL,CAAcM,OAAlB,EAA2B;AAAA;;AACzB,WAAKN,QAAL,CAAcM,OAAd,CAAsBK,KAAtB,GAA8B,EAA9B;AACA,oCAAKX,QAAL,CAAcM,OAAd,gFAAuBM,KAAvB;AACD;AACF;;AAEDjB,EAAAA,WAAW,CAACkB,KAAD,EAA6C;AACtDA,IAAAA,KAAK,CAAC3B,eAAN;AACA2B,IAAAA,KAAK,CAAC5B,cAAN;AACA,QAAM;AAAE6B,MAAAA;AAAF,QAAYD,KAAK,CAACE,MAAxB;;AACA,QAAID,KAAK,IAAI,IAAb,EAAmB;AACjB,WAAKE,UAAL,CAAgBF,KAAK,CAAC,CAAD,CAArB;AACD;AACF;;AAEDlB,EAAAA,UAAU,CAACZ,CAAD,EAAqC;AAC7C,QAAM;AAAEL,MAAAA,QAAF;AAAYsC,MAAAA,cAAZ;AAA4BC,MAAAA;AAA5B,QAA0C,KAAK5B,KAArD;AACAN,IAAAA,CAAC,CAACC,cAAF;AACAD,IAAAA,CAAC,CAACE,eAAF;;AAEA,QAAIgC,SAAJ,EAAe;AACbD,MAAAA,cAAc;AACd;AACD;;AAED,QAAI,CAACjC,CAAC,CAACmC,YAAH,IAAmB,CAACnC,CAAC,CAACmC,YAAF,CAAeC,KAAvC,EAA8C;AAC5C;AACD;;AAED,QAAMC,IAAI,GAAGrC,CAAC,CAACmC,YAAF,CAAeC,KAAf,CAAqB,CAArB,EAAwBE,SAAxB,EAAb;AACA3D,IAAAA,aAAa,CAAC0D,IAAD,CAAb;;AACA,QAAIpD,UAAU,CAACQ,gBAAX,CAA4B4C,IAAI,CAAC3C,IAAjC,EAAuCC,QAAvC,CAAJ,EAAsD;AACpD,WAAKqC,UAAL,CAAgBK,IAAhB;AACD,KAFD,MAEO;AACL,WAAKE,QAAL,CAAc;AACZC,QAAAA,SAAS,EAAEvD,UAAU,CAACwD;AADV,OAAd;AAGD;AACF;;AAED5B,EAAAA,WAAW,CAACgB,KAAD,EAA6C;AACtD,QAAM;AAAEa,MAAAA;AAAF,QAAe,KAAKpC,KAA1B;AACAuB,IAAAA,KAAK,CAAC3B,eAAN;AACA2B,IAAAA,KAAK,CAAC5B,cAAN;AACAyC,IAAAA,QAAQ;AACR,SAAKH,QAAL,CAAc;AACZnB,MAAAA,gBAAgB,EAAE,EADN;AAEZoB,MAAAA,SAAS,EAAEG;AAFC,KAAd;AAID;;AAEDX,EAAAA,UAAU,CAACK,IAAD,EAAmB;AAC3B,QAAM;AAAEO,MAAAA;AAAF,QAAmB,KAAKtC,KAA9B;AACAsC,IAAAA,YAAY,CAACP,IAAD,CAAZ;AACA,SAAKE,QAAL,CAAc;AACZnB,MAAAA,gBAAgB,EAAEiB,IAAI,CAAC3C,IADX;AAEZ8C,MAAAA,SAAS,EAAEG;AAFC,KAAd;AAID;;AAED7B,EAAAA,eAAe,GAAS;AACtB,QAAM;AAAE+B,MAAAA,OAAF;AAAWC,MAAAA,OAAX;AAAoBC,MAAAA;AAApB,QAAyC,KAAKzC,KAApD;;AACA,QAAIyC,gBAAJ,EAAsB;AACpB;AACD;;AACDC,IAAAA,SAAS,CAACC,SAAV,CACGC,QADH,GAEGC,IAFH,CAEQC,QAAQ,IAAI;AAChBP,MAAAA,OAAO,CAACO,QAAD,CAAP;AACA,WAAKb,QAAL,CAAc;AACZnB,QAAAA,gBAAgB,EAAEvC,aADN;AAEZ2D,QAAAA,SAAS,EAAEG;AAFC,OAAd;AAID,KARH,EASGU,KATH,CASUrD,CAAD,IAAgB8C,OAAO,CAAC9C,CAAD,CAThC;AAUD;;AAEDe,EAAAA,gBAAgB,CAACc,KAAD,EAA8B;AAC5CA,IAAAA,KAAK,CAAC3B,eAAN;AACA2B,IAAAA,KAAK,CAAC5B,cAAN;AACA,SAAKa,eAAL;AACD;;AAEDwC,EAAAA,oBAAoB,GAAoB;AACtC,QAAM;AAAEP,MAAAA;AAAF,QAAuB,KAAKzC,KAAlC;AACA,WAAO,CACL;AACEiD,MAAAA,KAAK,EAAE,OADT;AAEEC,MAAAA,IAAI,EAAEjF,QAFR;AAGEkF,MAAAA,MAAM,EAAE,KAAK3C,eAHf;AAIE4C,MAAAA,QAAQ,EAAEvF,gBAAgB,CAACwF,KAJ7B;AAKEC,MAAAA,QAAQ,EAAEb;AALZ,KADK,CAAP;AASD;;AAcDc,EAAAA,MAAM,GAAiB;AACrB,QAAM;AAAElE,MAAAA,QAAF;AAAYuC,MAAAA,SAAZ;AAAuBa,MAAAA;AAAvB,QAA4C,KAAKzC,KAAvD;AACA,QAAM;AAAEc,MAAAA,gBAAF;AAAoBoB,MAAAA;AAApB,QAAkC,KAAKrB,KAA7C;AACA,QAAM2C,KAAK,GAAG5B,SAAS,IAAIM,SAA3B;AACA,QAAMuB,cAAc,GAAG,KAAKT,oBAAL,EAAvB;AACA,wBACE;AACE,MAAA,GAAG,EAAE,KAAKpC,OADZ;AAEE,MAAA,SAAS,EAAC,kCAFZ;AAGE,MAAA,UAAU,EAAEjC,UAAU,CAACc,cAHzB;AAIE,MAAA,MAAM,EAAE,KAAKa,UAJf;AAKE,MAAA,QAAQ,EAAE,CAAC;AALb,oBAOE,oBAAC,cAAD;AAAgB,MAAA,OAAO,EAAEmD;AAAzB,MAPF,eAQE;AACE,MAAA,GAAG,EAAE,KAAK/C,QADZ;AAEE,MAAA,IAAI,EAAC,MAFP;AAGE,MAAA,EAAE,EAAC,UAHL;AAIE,MAAA,MAAM,EAAE,KAAKgD,eAAL,CAAqBrE,QAArB,CAJV;AAKE,MAAA,KAAK,EAAE;AAAEsE,QAAAA,OAAO,EAAE;AAAX,OALT;AAME,MAAA,QAAQ,EAAE,KAAKtD,WANjB;AAOE,qBAAY;AAPd,MARF,EAiBG,CAACS,gBAAD,IAAqB,CAAC0C,KAAtB,iBACC;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,oBAAC,eAAD;AAAiB,MAAA,IAAI,EAAEzF;AAAvB,MADF,CADF,eAIE,gFAJF,eAKE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,wCADF,CALF,eAQE;AACE,MAAA,IAAI,EAAC,QADP;AAEE,MAAA,SAAS,EAAC,iBAFZ;AAGE,MAAA,OAAO,EAAE,KAAKoC;AAHhB,wBARF,CAlBJ,EAmCGW,gBAAgB,IAAI,CAAC0C,KAArB,iBACC;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,oBAAC,eAAD;AAAiB,MAAA,IAAI,EAAE7E,UAAU,CAACkB,OAAX,CAAmBiB,gBAAnB;AAAvB,MADF,CADF,eAIE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,mDADF,eAEE;AAAO,MAAA,SAAS,EAAC;AAAjB,OACGA,gBADH,EAEG,CAAC2B,gBAAD,iBACC;AACE,MAAA,IAAI,EAAC,QADP;AAEE,MAAA,SAAS,EAAC,iCAFZ;AAGE,MAAA,OAAO,EAAE,KAAKlC;AAHhB,oBAKE,oBAAC,eAAD;AAAiB,MAAA,IAAI,EAAEpC;AAAvB,MALF,CAHJ,CAFF,CAJF,CApCJ,EAyDGqF,KAAK,iBACJ;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,oBAAC,eAAD;AAAiB,MAAA,IAAI,EAAEpF;AAAvB,MADF,CADF,eAIE,mCAAQoF,KAAR,CAJF,EAKGA,KAAK,KAAK7E,UAAU,CAACwD,eAArB,iBACC;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,mCAAQ,KAAKyB,sBAAL,CAA4BvE,QAA5B,CAAR,CADF,CANJ,CA1DJ,CADF;AAyED;;AArQkE;;gBAA/DV,U,kBACkB;AACpBU,EAAAA,QAAQ,EAAE,KADU;AAEpBuC,EAAAA,SAAS,EAAE;AAFS,C;;gBADlBjD,U,yBAMyB,6B;;gBANzBA,U,qBAQqB,yB;;AAgQ3B,eAAeA,UAAf","sourcesContent":["import React, {\n ChangeEvent,\n Component,\n DragEvent,\n MouseEvent,\n ReactElement,\n RefObject,\n} from 'react';\nimport memoize from 'memoize-one';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n ContextAction,\n ContextActions,\n GLOBAL_SHORTCUTS,\n} from '@deephaven/components';\nimport {\n dhFileCsv,\n dhFileDownload,\n dhFileSpreadsheet,\n 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 &&\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) {\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 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 =>\n allowZip ? [...VALID_EXTENSIONS, ...ZIP_EXTENSIONS] : [...VALID_EXTENSIONS]\n );\n\n getAcceptString = memoize(allowZip =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize(allowZip =>\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 && (\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>{this.getFileTypeErrorString(allowZip)}</label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvOverlay;\n"],"file":"CsvOverlay.js"}
|
package/dist/csv/CsvParser.d.ts
CHANGED
|
@@ -1,61 +1,59 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ParseLocalConfig, Parser, ParseResult } from 'papaparse';
|
|
3
|
+
import { IdeSession, Table } from '@deephaven/jsapi-shim';
|
|
4
|
+
import type { JSZipObject } from 'jszip';
|
|
5
|
+
import { CsvTypes } from './CsvFormats';
|
|
6
|
+
interface CsvParserConstructor {
|
|
7
|
+
onFileCompleted: (tables: Table[]) => void;
|
|
8
|
+
session: IdeSession;
|
|
9
|
+
file: Blob | JSZipObject;
|
|
10
|
+
type: CsvTypes;
|
|
11
|
+
readHeaders: boolean;
|
|
12
|
+
onProgress: (progressValue: number) => boolean;
|
|
13
|
+
onError: (e: unknown) => void;
|
|
14
|
+
timeZone: string;
|
|
15
|
+
isZip: boolean;
|
|
16
|
+
}
|
|
2
17
|
/**
|
|
3
18
|
* Parser a CSV file in chunks and returns a table handle for each chunk.
|
|
4
19
|
*/
|
|
5
20
|
declare class CsvParser {
|
|
6
|
-
static generateHeaders: (numColumns:
|
|
7
|
-
static generateHeaderRecursive(n:
|
|
8
|
-
constructor({ onFileCompleted, session, file, type, readHeaders, onProgress, onError, timeZone, isZip, }:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
onProgress: any;
|
|
15
|
-
onError: any;
|
|
16
|
-
timeZone: any;
|
|
17
|
-
isZip: any;
|
|
18
|
-
});
|
|
19
|
-
onFileCompleted: any;
|
|
20
|
-
session: any;
|
|
21
|
-
file: any;
|
|
22
|
-
isZip: any;
|
|
23
|
-
type: any;
|
|
21
|
+
static generateHeaders: (numColumns: number) => string[];
|
|
22
|
+
static generateHeaderRecursive(n: number): string;
|
|
23
|
+
constructor({ onFileCompleted, session, file, type, readHeaders, onProgress, onError, timeZone, isZip, }: CsvParserConstructor);
|
|
24
|
+
onFileCompleted: (tables: Table[]) => void;
|
|
25
|
+
session: IdeSession;
|
|
26
|
+
file: Blob | JSZipObject;
|
|
27
|
+
isZip: boolean;
|
|
28
|
+
type: CsvTypes;
|
|
24
29
|
readHeaders: boolean;
|
|
25
|
-
timeZone:
|
|
26
|
-
onProgress:
|
|
27
|
-
onError:
|
|
28
|
-
tables:
|
|
29
|
-
headers
|
|
30
|
-
types
|
|
30
|
+
timeZone: string;
|
|
31
|
+
onProgress: (progressValue: number) => boolean;
|
|
32
|
+
onError: (e: unknown) => void;
|
|
33
|
+
tables: Table[];
|
|
34
|
+
headers?: string[];
|
|
35
|
+
types?: string[];
|
|
31
36
|
chunks: number;
|
|
32
37
|
totalChunks: number;
|
|
33
38
|
isComplete: boolean;
|
|
34
39
|
zipProgress: number;
|
|
35
|
-
consolidatedChunks
|
|
40
|
+
consolidatedChunks?: string[][];
|
|
36
41
|
numConsolidated: number;
|
|
37
42
|
isCancelled: boolean;
|
|
38
|
-
|
|
39
|
-
handleError(error: any): void;
|
|
40
|
-
handleComplete(results: any): void;
|
|
41
|
-
handleNodeUpdate(metadata: any): void;
|
|
42
|
-
handleCreateTable(index: any, columns: any, parser: any): void;
|
|
43
|
-
config: {
|
|
44
|
-
delimiter: any;
|
|
45
|
-
newline: any;
|
|
46
|
-
escapeChar: any;
|
|
47
|
-
dynamicTyping: boolean;
|
|
48
|
-
error: (error: any) => void;
|
|
49
|
-
skipEmptyLines: any;
|
|
50
|
-
chunk: (result: any, parser: any) => void;
|
|
51
|
-
complete: (results: any) => void;
|
|
52
|
-
fastMode: boolean;
|
|
53
|
-
};
|
|
43
|
+
config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;
|
|
54
44
|
cancel(): void;
|
|
55
|
-
transpose(numColumns:
|
|
56
|
-
nullCheck(value:
|
|
45
|
+
transpose(numColumns: number, array: string[][]): string[][];
|
|
46
|
+
nullCheck(value: string): string;
|
|
57
47
|
parse(): void;
|
|
58
|
-
|
|
59
|
-
|
|
48
|
+
handleChunk(result: ParseResult<string[]>, parser: Parser): void;
|
|
49
|
+
consolidateChunks(columns: string[][], parser: Parser): void;
|
|
50
|
+
uploadConsolidatedChunks(parser: Parser | null): void;
|
|
51
|
+
handleCreateTable(index: number, columns: string[][], parser: Parser | null): void;
|
|
52
|
+
handleComplete(results: ParseResult<unknown>): void;
|
|
53
|
+
handleError(error: unknown): void;
|
|
54
|
+
handleNodeUpdate(metadata: {
|
|
55
|
+
percent: number;
|
|
56
|
+
}): void;
|
|
60
57
|
}
|
|
58
|
+
export default CsvParser;
|
|
61
59
|
//# sourceMappingURL=CsvParser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvParser.d.ts","sourceRoot":"","sources":["../../src/csv/CsvParser.
|
|
1
|
+
{"version":3,"file":"CsvParser.d.ts","sourceRoot":"","sources":["../../src/csv/CsvParser.ts"],"names":[],"mappings":"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"}
|
package/dist/csv/CsvParser.js
CHANGED
|
@@ -2,16 +2,16 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
2
2
|
|
|
3
3
|
import Papa from 'papaparse';
|
|
4
4
|
import Log from '@deephaven/log';
|
|
5
|
-
import { DbNameValidator } from '@deephaven/utils';
|
|
5
|
+
import { assertNotNull, DbNameValidator } from '@deephaven/utils';
|
|
6
6
|
import CsvTypeParser from "./CsvTypeParser.js";
|
|
7
7
|
var log = Log.module('CsvParser'); // This is based on jszip streaming ~15 KB chunks to papa parse
|
|
8
8
|
// Want to consolidate to ~10 MB chunks
|
|
9
9
|
|
|
10
10
|
var ZIP_CONSOLIDATE_CHUNKS = 650;
|
|
11
|
+
|
|
11
12
|
/**
|
|
12
13
|
* Parser a CSV file in chunks and returns a table handle for each chunk.
|
|
13
14
|
*/
|
|
14
|
-
|
|
15
15
|
class CsvParser {
|
|
16
16
|
// Generates column names A-Z, AA-AZ, BA-BZ, etc...
|
|
17
17
|
static generateHeaderRecursive(n) {
|
|
@@ -38,6 +38,47 @@ class CsvParser {
|
|
|
38
38
|
timeZone,
|
|
39
39
|
isZip
|
|
40
40
|
} = _ref;
|
|
41
|
+
|
|
42
|
+
_defineProperty(this, "onFileCompleted", void 0);
|
|
43
|
+
|
|
44
|
+
_defineProperty(this, "session", void 0);
|
|
45
|
+
|
|
46
|
+
_defineProperty(this, "file", void 0);
|
|
47
|
+
|
|
48
|
+
_defineProperty(this, "isZip", void 0);
|
|
49
|
+
|
|
50
|
+
_defineProperty(this, "type", void 0);
|
|
51
|
+
|
|
52
|
+
_defineProperty(this, "readHeaders", void 0);
|
|
53
|
+
|
|
54
|
+
_defineProperty(this, "timeZone", void 0);
|
|
55
|
+
|
|
56
|
+
_defineProperty(this, "onProgress", void 0);
|
|
57
|
+
|
|
58
|
+
_defineProperty(this, "onError", void 0);
|
|
59
|
+
|
|
60
|
+
_defineProperty(this, "tables", void 0);
|
|
61
|
+
|
|
62
|
+
_defineProperty(this, "headers", void 0);
|
|
63
|
+
|
|
64
|
+
_defineProperty(this, "types", void 0);
|
|
65
|
+
|
|
66
|
+
_defineProperty(this, "chunks", void 0);
|
|
67
|
+
|
|
68
|
+
_defineProperty(this, "totalChunks", void 0);
|
|
69
|
+
|
|
70
|
+
_defineProperty(this, "isComplete", void 0);
|
|
71
|
+
|
|
72
|
+
_defineProperty(this, "zipProgress", void 0);
|
|
73
|
+
|
|
74
|
+
_defineProperty(this, "consolidatedChunks", void 0);
|
|
75
|
+
|
|
76
|
+
_defineProperty(this, "numConsolidated", void 0);
|
|
77
|
+
|
|
78
|
+
_defineProperty(this, "isCancelled", void 0);
|
|
79
|
+
|
|
80
|
+
_defineProperty(this, "config", void 0);
|
|
81
|
+
|
|
41
82
|
this.onFileCompleted = onFileCompleted;
|
|
42
83
|
this.session = session;
|
|
43
84
|
this.file = file;
|
|
@@ -48,13 +89,10 @@ class CsvParser {
|
|
|
48
89
|
this.onProgress = onProgress;
|
|
49
90
|
this.onError = onError;
|
|
50
91
|
this.tables = [];
|
|
51
|
-
this.headers = null;
|
|
52
|
-
this.types = null;
|
|
53
92
|
this.chunks = 0;
|
|
54
93
|
this.totalChunks = isZip ? 0 : Math.ceil(file.size / Papa.LocalChunkSize);
|
|
55
94
|
this.isComplete = false;
|
|
56
95
|
this.zipProgress = 0;
|
|
57
|
-
this.consolidatedChunks = null;
|
|
58
96
|
this.numConsolidated = 0;
|
|
59
97
|
this.isCancelled = false;
|
|
60
98
|
this.handleChunk = this.handleChunk.bind(this);
|
|
@@ -105,7 +143,9 @@ class CsvParser {
|
|
|
105
143
|
|
|
106
144
|
parse() {
|
|
107
145
|
var handleParseDone = types => {
|
|
108
|
-
var toParse = this.isZip ? this.file.nodeStream(
|
|
146
|
+
var toParse = this.isZip ? this.file.nodeStream( // JsZip types are incorrect, thus the funny casting
|
|
147
|
+
// Actual parameter is 'nodebuffer'
|
|
148
|
+
'nodebuffer', this.handleNodeUpdate) : this.file;
|
|
109
149
|
this.types = types;
|
|
110
150
|
Papa.parse(toParse, this.config);
|
|
111
151
|
};
|
|
@@ -178,14 +218,17 @@ class CsvParser {
|
|
|
178
218
|
}
|
|
179
219
|
|
|
180
220
|
uploadConsolidatedChunks(parser) {
|
|
221
|
+
var _this$consolidatedChu;
|
|
222
|
+
|
|
181
223
|
var {
|
|
182
224
|
handleCreateTable
|
|
183
225
|
} = this;
|
|
184
226
|
var index = this.chunks;
|
|
185
227
|
this.chunks += 1;
|
|
186
|
-
var toUpload = this.consolidatedChunks.slice();
|
|
187
|
-
this.consolidatedChunks =
|
|
228
|
+
var toUpload = (_this$consolidatedChu = this.consolidatedChunks) === null || _this$consolidatedChu === void 0 ? void 0 : _this$consolidatedChu.slice();
|
|
229
|
+
this.consolidatedChunks = undefined;
|
|
188
230
|
this.numConsolidated = 0;
|
|
231
|
+
assertNotNull(toUpload);
|
|
189
232
|
handleCreateTable(index, toUpload, parser);
|
|
190
233
|
}
|
|
191
234
|
|
|
@@ -204,6 +247,8 @@ class CsvParser {
|
|
|
204
247
|
parser.pause();
|
|
205
248
|
}
|
|
206
249
|
|
|
250
|
+
assertNotNull(this.headers);
|
|
251
|
+
assertNotNull(types);
|
|
207
252
|
session.newTable(this.headers, types, columns, this.timeZone).then(table => {
|
|
208
253
|
if (this.isCancelled) {
|
|
209
254
|
log.debug2('CSV parser cancelled.');
|
|
@@ -1 +1 @@
|
|
|
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":";;AAAA,OAAOA,IAAP,MAAiB,WAAjB;AACA,OAAOC,GAAP,MAAgB,gBAAhB;AACA,SAASC,eAAT,QAAgC,kBAAhC;OACOC,a;AAEP,IAAMC,GAAG,GAAGH,GAAG,CAACI,MAAJ,CAAW,WAAX,CAAZ,C,CAEA;AACA;;AACA,IAAMC,sBAAsB,GAAG,GAA/B;AAEA;AACA;AACA;;AACA,MAAMC,SAAN,CAAgB;AACd;AAS8B,SAAvBC,uBAAuB,CAACC,CAAD,EAAI;AAChC,QAAIC,MAAM,GAAG,EAAb;AACA,QAAIC,IAAI,GAAGF,CAAX;;AACA,QAAIA,CAAC,IAAI,EAAT,EAAa;AACXC,MAAAA,MAAM,GAAGA,MAAM,CAACE,MAAP,CACPL,SAAS,CAACC,uBAAV,CAAkCK,IAAI,CAACC,KAAL,CAAWL,CAAC,GAAG,EAAf,IAAqB,CAAvD,CADO,CAAT;AAGAE,MAAAA,IAAI,GAAGF,CAAC,GAAG,EAAX;AACD;;AACD,WAAOC,MAAM,CAACE,MAAP,CAAcG,MAAM,CAACC,YAAP,CAAoB,KAAKL,IAAzB,CAAd,CAAP;AACD;;AAEDM,EAAAA,WAAW,OAUR;AAAA,QAVS;AACVC,MAAAA,eADU;AAEVC,MAAAA,OAFU;AAGVC,MAAAA,IAHU;AAIVC,MAAAA,IAJU;AAKVC,MAAAA,WAAW,GAAG,IALJ;AAMVC,MAAAA,UANU;AAOVC,MAAAA,OAPU;AAQVC,MAAAA,QARU;AASVC,MAAAA;AATU,KAUT;AACD,SAAKR,eAAL,GAAuBA,eAAvB;AACA,SAAKC,OAAL,GAAeA,OAAf;AACA,SAAKC,IAAL,GAAYA,IAAZ;AACA,SAAKM,KAAL,GAAaA,KAAb;AACA,SAAKL,IAAL,GAAYA,IAAZ;AACA,SAAKC,WAAL,GAAmBA,WAAnB;AACA,SAAKG,QAAL,GAAgBA,QAAhB;AACA,SAAKF,UAAL,GAAkBA,UAAlB;AACA,SAAKC,OAAL,GAAeA,OAAf;AACA,SAAKG,MAAL,GAAc,EAAd;AACA,SAAKC,OAAL,GAAe,IAAf;AACA,SAAKC,KAAL,GAAa,IAAb;AACA,SAAKC,MAAL,GAAc,CAAd;AACA,SAAKC,WAAL,GAAmBL,KAAK,GAAG,CAAH,GAAOb,IAAI,CAACmB,IAAL,CAAUZ,IAAI,CAACa,IAAL,GAAYjC,IAAI,CAACkC,cAA3B,CAA/B;AACA,SAAKC,UAAL,GAAkB,KAAlB;AACA,SAAKC,WAAL,GAAmB,CAAnB;AACA,SAAKC,kBAAL,GAA0B,IAA1B;AACA,SAAKC,eAAL,GAAuB,CAAvB;AACA,SAAKC,WAAL,GAAmB,KAAnB;AAEA,SAAKC,WAAL,GAAmB,KAAKA,WAAL,CAAiBC,IAAjB,CAAsB,IAAtB,CAAnB;AACA,SAAKC,WAAL,GAAmB,KAAKA,WAAL,CAAiBD,IAAjB,CAAsB,IAAtB,CAAnB;AACA,SAAKE,cAAL,GAAsB,KAAKA,cAAL,CAAoBF,IAApB,CAAyB,IAAzB,CAAtB;AACA,SAAKG,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBH,IAAtB,CAA2B,IAA3B,CAAxB;AACA,SAAKI,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBJ,IAAvB,CAA4B,IAA5B,CAAzB;AAEA,SAAKK,MAAL,GAAc;AACZC,MAAAA,SAAS,EAAE1B,IAAI,CAAC0B,SADJ;AAEZC,MAAAA,OAAO,EAAE3B,IAAI,CAAC2B,OAFF;AAGZC,MAAAA,UAAU,EAAE5B,IAAI,CAAC4B,UAHL;AAIZC,MAAAA,aAAa,EAAE,KAJH;AAKZC,MAAAA,KAAK,EAAE,KAAKT,WALA;AAMZU,MAAAA,cAAc,EAAE/B,IAAI,CAAC+B,cANT;AAOZC,MAAAA,KAAK,EAAE,KAAKb,WAPA;AAQZc,MAAAA,QAAQ,EAAE,KAAKX,cARH;AASZY,MAAAA,QAAQ,EAAE;AATE,KAAd;AAWD;;AAEDC,EAAAA,MAAM,GAAG;AACP,SAAKjB,WAAL,GAAmB,IAAnB;AACD;;AAEDkB,EAAAA,SAAS,CAACC,UAAD,EAAaC,KAAb,EAAoB;AAC3B,QAAMC,OAAO,GAAGD,KAAK,CAACE,MAAtB;AACA,QAAMC,OAAO,GAAG,IAAIC,KAAJ,CAAUL,UAAV,EACbM,IADa,CACR,IADQ,EAEbC,GAFa,CAET,MAAM,IAAIF,KAAJ,CAAUH,OAAV,CAFG,CAAhB;;AAGA,SAAK,IAAIM,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGN,OAApB,EAA6BM,CAAC,IAAI,CAAlC,EAAqC;AACnC,UAAMC,GAAG,GAAGR,KAAK,CAACO,CAAD,CAAjB;;AACA,UAAIC,GAAG,CAACN,MAAJ,GAAaH,UAAjB,EAA6B;AAC3B,cAAM,IAAIU,KAAJ,0CAC8BV,UAD9B,wBACsDS,GAAG,CAACN,MAD1D,eACqEM,GADrE,EAAN;AAGD;;AACD,WAAK,IAAIE,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGX,UAApB,EAAgCW,CAAC,IAAI,CAArC,EAAwC;AACtC,YAAMC,KAAK,GAAG,KAAKjD,IAAL,CAAUkD,UAAV,GAAuBZ,KAAK,CAACO,CAAD,CAAL,CAASG,CAAT,EAAYG,IAAZ,EAAvB,GAA4Cb,KAAK,CAACO,CAAD,CAAL,CAASG,CAAT,CAA1D;AACAP,QAAAA,OAAO,CAACO,CAAD,CAAP,CAAWH,CAAX,IAAgB,KAAKO,SAAL,CAAeH,KAAf,CAAhB;AACD;AACF;;AACD,WAAOR,OAAP;AACD;;AAEDW,EAAAA,SAAS,CAACH,KAAD,EAAQ;AACf,WAAOA,KAAK,KAAK,KAAKjD,IAAL,CAAUqD,UAApB,GAAiC,EAAjC,GAAsCJ,KAA7C;AACD;;AAEDK,EAAAA,KAAK,GAAG;AACN,QAAMC,eAAe,GAAG/C,KAAK,IAAI;AAC/B,UAAMgD,OAAO,GAAG,KAAKnD,KAAL,GACZ,KAAKN,IAAL,CAAU0D,UAAV,CAAqB,YAArB,EAAmC,KAAKlC,gBAAxC,CADY,GAEZ,KAAKxB,IAFT;AAGA,WAAKS,KAAL,GAAaA,KAAb;AACA7B,MAAAA,IAAI,CAAC2E,KAAL,CAAWE,OAAX,EAAoB,KAAK/B,MAAzB;AACD,KAND;;AAOA,QAAMiC,UAAU,GAAG,IAAI5E,aAAJ,CACjByE,eADiB,EAEjB,KAAKxD,IAFY,EAGjB,KAAKE,WAHY,EAIjB,KAAKwB,MAJY,EAKjB,KAAKzB,IAAL,CAAUqD,UALO,EAMjB,KAAKnD,UANY,EAOjB,KAAKC,OAPY,EAQjB,KAAKO,WARY,EASjB,KAAKL,KATY,EAUjB,KAAKL,IAAL,CAAUkD,UAVO,CAAnB;AAYAQ,IAAAA,UAAU,CAACJ,KAAX;AACD;;AAEDnC,EAAAA,WAAW,CAACwC,MAAD,EAASC,MAAT,EAAiB;AAC1B,QAAM;AAAE3D,MAAAA,WAAF;AAAeE,MAAAA,OAAf;AAAwBqB,MAAAA,iBAAxB;AAA2CnB,MAAAA,KAA3C;AAAkDC,MAAAA;AAAlD,QAA6D,IAAnE;;AACA,QAAI,KAAKY,WAAT,EAAsB;AACpBnC,MAAAA,GAAG,CAAC8E,MAAJ,CAAW,uBAAX;AACAD,MAAAA,MAAM,CAACE,KAAP;AACAxD,MAAAA,MAAM,CAACyD,OAAP,CAAeC,CAAC,IAAIA,CAAC,CAACC,KAAF,EAApB;AACA;AACD;;AACD,QAAI;AAAEC,MAAAA;AAAF,QAAWP,MAAf;;AACA,QAAI,CAAC,KAAKpD,OAAV,EAAmB;AACjB,UAAIN,WAAJ,EAAiB;AACf,aAAKM,OAAL,GAAe1B,eAAe,CAACsF,mBAAhB,CAAoCD,IAAI,CAAC,CAAD,CAAxC,CAAf;AACAA,QAAAA,IAAI,GAAGA,IAAI,CAACE,KAAL,CAAW,CAAX,CAAP;AACD,OAHD,MAGO;AACL,aAAK7D,OAAL,GAAerB,SAAS,CAACmF,eAAV,CAA0BH,IAAI,CAAC,CAAD,CAAJ,CAAQ1B,MAAlC,CAAf;AACD;AACF;;AAED,QAAIC,OAAO,GAAG,EAAd;;AACA,QAAI;AACFA,MAAAA,OAAO,GAAG,KAAKL,SAAL,CAAe,KAAK7B,OAAL,CAAaiC,MAA5B,EAAoC0B,IAApC,CAAV;;AACA,UAAI7D,KAAJ,EAAW;AACT;AACA,aAAKiE,iBAAL,CAAuB7B,OAAvB,EAAgCmB,MAAhC;AACD,OAHD,MAGO;AACL,YAAMW,KAAK,GAAG,KAAK9D,MAAnB;AACA,aAAKA,MAAL,IAAe,CAAf;AACAe,QAAAA,iBAAiB,CAAC+C,KAAD,EAAQ9B,OAAR,EAAiBmB,MAAjB,CAAjB;AACD;AACF,KAVD,CAUE,OAAOY,CAAP,EAAU;AACVrE,MAAAA,OAAO,CAACqE,CAAD,CAAP;AACD;AACF;;AAEDF,EAAAA,iBAAiB,CAAC7B,OAAD,EAAUmB,MAAV,EAAkB;AACjC,QAAI,CAAC,KAAK5C,kBAAV,EAA8B;AAC5B,WAAKA,kBAAL,GAA0ByB,OAAO,CAAC2B,KAAR,EAA1B;AACD,KAFD,MAEO;AACL,WAAK,IAAIK,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGhC,OAAO,CAACD,MAA5B,EAAoCiC,CAAC,IAAI,CAAzC,EAA4C;AAC1C,aAAKzD,kBAAL,CAAwByD,CAAxB,IAA6B,KAAKzD,kBAAL,CAAwByD,CAAxB,EAA2BlF,MAA3B,CAC3BkD,OAAO,CAACgC,CAAD,CADoB,CAA7B;AAGD;AACF;;AACD,SAAKxD,eAAL,IAAwB,CAAxB;;AACA,QAAI,KAAKA,eAAL,IAAwBhC,sBAAxB,IAAkD,KAAK6B,UAA3D,EAAuE;AACrE,WAAK4D,wBAAL,CAA8Bd,MAA9B;AACD;AACF;;AAEDc,EAAAA,wBAAwB,CAACd,MAAD,EAAS;AAC/B,QAAM;AAAEpC,MAAAA;AAAF,QAAwB,IAA9B;AACA,QAAM+C,KAAK,GAAG,KAAK9D,MAAnB;AACA,SAAKA,MAAL,IAAe,CAAf;AACA,QAAMkE,QAAQ,GAAG,KAAK3D,kBAAL,CAAwBoD,KAAxB,EAAjB;AACA,SAAKpD,kBAAL,GAA0B,IAA1B;AACA,SAAKC,eAAL,GAAuB,CAAvB;AACAO,IAAAA,iBAAiB,CAAC+C,KAAD,EAAQI,QAAR,EAAkBf,MAAlB,CAAjB;AACD;;AAEDpC,EAAAA,iBAAiB,CAAC+C,KAAD,EAAQ9B,OAAR,EAAiBmB,MAAjB,EAAyB;AACxC,QAAM;AACJ9D,MAAAA,OADI;AAEJQ,MAAAA,MAFI;AAGJT,MAAAA,eAHI;AAIJa,MAAAA,WAJI;AAKJF,MAAAA,KALI;AAMJN,MAAAA,UANI;AAOJC,MAAAA;AAPI,QAQF,IARJ;;AASA,QAAIyD,MAAJ,EAAY;AACVA,MAAAA,MAAM,CAACgB,KAAP;AACD;;AACD9E,IAAAA,OAAO,CACJ+E,QADH,CACY,KAAKtE,OADjB,EAC0BC,KAD1B,EACiCiC,OADjC,EAC0C,KAAKrC,QAD/C,EAEG0E,IAFH,CAEQC,KAAK,IAAI;AACb,UAAI,KAAK7D,WAAT,EAAsB;AACpBnC,QAAAA,GAAG,CAAC8E,MAAJ,CAAW,uBAAX;;AACA,YAAID,MAAJ,EAAY;AACVA,UAAAA,MAAM,CAACE,KAAP;AACD;;AACDxD,QAAAA,MAAM,CAACyD,OAAP,CAAeC,CAAC,IAAIA,CAAC,CAACC,KAAF,EAApB;AACA;AACD;;AACD,UAAIL,MAAJ,EAAY;AACVA,QAAAA,MAAM,CAACoB,MAAP;AACD;;AACD1E,MAAAA,MAAM,CAACiE,KAAD,CAAN,GAAgBQ,KAAhB,CAZa,CAab;;AACA,UAAIE,QAAQ,GAAG,CAAf;;AACA,UAAIvE,WAAW,GAAG,CAAlB,EAAqB;AACnBuE,QAAAA,QAAQ,GAAGzF,IAAI,CAAC0F,KAAL,CAAY5E,MAAM,CAACkC,MAAP,GAAgB9B,WAAjB,GAAgC,EAA3C,IAAiD,EAA5D;AACD,OAFD,MAEO;AACLuE,QAAAA,QAAQ,GAAGzF,IAAI,CAAC0F,KAAL,CAAW,KAAK,KAAKnE,WAAL,GAAmB,CAAnC,CAAX;AACD;;AACDhC,MAAAA,GAAG,CAAC8E,MAAJ,+BAAkCoB,QAAlC;AACA/E,MAAAA,UAAU,CAAC+E,QAAD,CAAV;;AACA,UAAI,KAAKnE,UAAL,IAAmBR,MAAM,CAACkC,MAAP,KAAkB,KAAK/B,MAA9C,EAAsD;AACpD1B,QAAAA,GAAG,CAAC8E,MAAJ,CAAW,sBAAX;AACAhE,QAAAA,eAAe,CAACS,MAAD,CAAf;AACD;AACF,KA5BH,EA6BG6E,KA7BH,CA6BSX,CAAC,IAAI;AACV,UAAI,CAAC,KAAK1D,UAAN,IAAoB8C,MAAxB,EAAgC;AAC9BA,QAAAA,MAAM,CAACE,KAAP;AACD;;AACD3D,MAAAA,OAAO,CAACqE,CAAD,CAAP;AACD,KAlCH;AAmCD;;AAEDlD,EAAAA,cAAc,CAAC8D,OAAD,EAAU;AACtB;AACA,QAAI,CAACA,OAAD,IAAY,CAACA,OAAO,CAACC,IAAR,CAAaC,OAA9B,EAAuC;AACrC,WAAKxE,UAAL,GAAkB,IAAlB,CADqC,CAErC;;AACA,UAAI,KAAKE,kBAAT,EAA6B;AAC3B,aAAK0D,wBAAL,CAA8B,IAA9B;AACD;AACF;AACF;;AAEDrD,EAAAA,WAAW,CAACS,KAAD,EAAQ;AACjB,QAAM;AAAE3B,MAAAA;AAAF,QAAc,IAApB;AACAA,IAAAA,OAAO,CAAC2B,KAAD,CAAP;AACD;;AAEDP,EAAAA,gBAAgB,CAACgE,QAAD,EAAW;AACzB,SAAKxE,WAAL,GAAmBwE,QAAQ,CAACC,OAA5B;AACD;;AA3Pa;;gBAAVtG,S,qBAEqBmD,UAAU,IAAI;AACrC,MAAM9B,OAAO,GAAG,EAAhB;;AACA,OAAK,IAAIkE,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGpC,UAApB,EAAgCoC,CAAC,IAAI,CAArC,EAAwC;AACtClE,IAAAA,OAAO,CAACkF,IAAR,CAAavG,SAAS,CAACC,uBAAV,CAAkCsF,CAAlC,CAAb;AACD;;AACD,SAAOlE,OAAP;AACD,C;;AAsPH,eAAerB,SAAf","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.ts"],"names":["Papa","Log","assertNotNull","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","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","toParse","nodeStream","typeParser","result","parser","debug2","abort","forEach","t","close","data","headers","legalizeColumnNames","slice","generateHeaders","consolidateChunks","index","e","consolidatedChunks","i","uploadConsolidatedChunks","toUpload","undefined","pause","newTable","then","table","resume","progress","round","catch","results","meta","aborted","metadata","percent","push"],"mappings":"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","sourcesContent":["import Papa, { ParseLocalConfig, Parser, ParseResult } from 'papaparse';\nimport Log from '@deephaven/log';\nimport { assertNotNull, DbNameValidator } from '@deephaven/utils';\nimport { IdeSession, Table } from '@deephaven/jsapi-shim';\nimport type { JSZipObject } from 'jszip';\nimport CsvTypeParser from './CsvTypeParser';\nimport { CsvTypes } from './CsvFormats';\n\nconst log = Log.module('CsvParser');\n\n// This is based on jszip streaming ~15 KB chunks to papa parse\n// Want to consolidate to ~10 MB chunks\nconst ZIP_CONSOLIDATE_CHUNKS = 650;\n\ninterface CsvParserConstructor {\n onFileCompleted: (tables: Table[]) => void;\n session: IdeSession;\n file: 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.chunks = 0;\n this.totalChunks = isZip\n ? 0\n : Math.ceil((file as Blob).size / Papa.LocalChunkSize);\n this.isComplete = false;\n this.zipProgress = 0;\n this.numConsolidated = 0;\n this.isCancelled = false;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n this.handleCreateTable = this.handleCreateTable.bind(this);\n\n this.config = {\n delimiter: type.delimiter,\n newline: type.newline as '\\r\\n' | '\\n' | '\\r' | undefined,\n escapeChar: type.escapeChar,\n dynamicTyping: false,\n error: this.handleError,\n skipEmptyLines: type.skipEmptyLines,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n fastMode: false,\n };\n }\n\n onFileCompleted: (tables: Table[]) => void;\n\n session: IdeSession;\n\n file: Blob | JSZipObject;\n\n isZip: boolean;\n\n type: CsvTypes;\n\n readHeaders: boolean;\n\n timeZone: string;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n tables: Table[];\n\n headers?: string[];\n\n types?: string[];\n\n 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[]) => {\n const toParse = this.isZip\n ? (this.file as JSZipObject).nodeStream(\n // JsZip types are incorrect, thus the funny casting\n // Actual parameter is 'nodebuffer'\n 'nodebuffer' as 'nodestream',\n this.handleNodeUpdate\n )\n : (this.file as Blob);\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: 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 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: ParseResult<unknown>): void {\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: 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"],"file":"CsvParser.js"}
|
|
@@ -1,36 +1,41 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { JSZipObject } from 'jszip';
|
|
3
|
+
import { Parser, ParseResult, ParseLocalConfig } from 'papaparse';
|
|
2
4
|
/**
|
|
3
5
|
* Determines the type of each column in a CSV file by parsing it and looking at every value.
|
|
4
6
|
*/
|
|
5
7
|
declare class CsvTypeParser {
|
|
6
|
-
static determineType(value:
|
|
7
|
-
static isNotParsableNumber(s:
|
|
8
|
-
static checkInteger(value:
|
|
9
|
-
static checkLong(value:
|
|
10
|
-
static checkDouble(value:
|
|
11
|
-
static checkBoolean(value:
|
|
12
|
-
static checkDateTime(value:
|
|
13
|
-
static checkLocalTime(value:
|
|
14
|
-
static getTypeFromUnknown(value:
|
|
15
|
-
static getNumberType(value:
|
|
16
|
-
constructor(onFileCompleted:
|
|
17
|
-
onFileCompleted:
|
|
18
|
-
file:
|
|
19
|
-
readHeaders:
|
|
20
|
-
nullString:
|
|
21
|
-
onProgress:
|
|
22
|
-
onError:
|
|
23
|
-
types
|
|
8
|
+
static determineType(value: string, type: string, nullString: string | null): string;
|
|
9
|
+
static isNotParsableNumber(s: string): boolean;
|
|
10
|
+
static checkInteger(value: string): string;
|
|
11
|
+
static checkLong(value: string): string;
|
|
12
|
+
static checkDouble(value: string): string;
|
|
13
|
+
static checkBoolean(value: string): string;
|
|
14
|
+
static checkDateTime(value: string): string;
|
|
15
|
+
static checkLocalTime(value: string): string;
|
|
16
|
+
static getTypeFromUnknown(value: string): string;
|
|
17
|
+
static getNumberType(value: string): string;
|
|
18
|
+
constructor(onFileCompleted: (types: string[]) => void, file: Blob | JSZipObject, readHeaders: boolean, parentConfig: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>, nullString: string | null, onProgress: (progressValue: number) => boolean, onError: (e: unknown) => void, totalChunks: number, isZip: boolean, shouldTrim: boolean);
|
|
19
|
+
onFileCompleted: (types: string[]) => void;
|
|
20
|
+
file: Blob | JSZipObject;
|
|
21
|
+
readHeaders: boolean;
|
|
22
|
+
nullString: string | null;
|
|
23
|
+
onProgress: (progressValue: number) => boolean;
|
|
24
|
+
onError: (e: unknown) => void;
|
|
25
|
+
types?: string[];
|
|
24
26
|
chunks: number;
|
|
25
|
-
totalChunks:
|
|
26
|
-
isZip:
|
|
27
|
-
shouldTrim:
|
|
27
|
+
totalChunks: number;
|
|
28
|
+
isZip: boolean;
|
|
29
|
+
shouldTrim: boolean;
|
|
28
30
|
zipProgress: number;
|
|
29
|
-
|
|
30
|
-
handleComplete(results: any): void;
|
|
31
|
-
handleError(error: any): void;
|
|
32
|
-
handleNodeUpdate(metadata: any): void;
|
|
33
|
-
config: any;
|
|
31
|
+
config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;
|
|
34
32
|
parse(): void;
|
|
33
|
+
handleChunk(result: ParseResult<string[]>, parser: Parser): void;
|
|
34
|
+
handleComplete(results: ParseResult<unknown>): void;
|
|
35
|
+
handleError(error: unknown): void;
|
|
36
|
+
handleNodeUpdate(metadata: {
|
|
37
|
+
percent: number;
|
|
38
|
+
}): void;
|
|
35
39
|
}
|
|
40
|
+
export default CsvTypeParser;
|
|
36
41
|
//# sourceMappingURL=CsvTypeParser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvTypeParser.d.ts","sourceRoot":"","sources":["../../src/csv/CsvTypeParser.
|
|
1
|
+
{"version":3,"file":"CsvTypeParser.d.ts","sourceRoot":"","sources":["../../src/csv/CsvTypeParser.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAa,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAcxE;;GAEG;AACH,cAAM,aAAa;IACjB,MAAM,CAAC,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM;IA4BT,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAM9C,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAS1C,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAavC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IASzC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ1C,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ3C,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ5C,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAsBhD,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;gBAqBzC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EAC1C,IAAI,EAAE,IAAI,GAAG,WAAW,EACxB,WAAW,EAAE,OAAO,EACpB,YAAY,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,EACrE,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,EAC9C,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,EAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,OAAO;IA2BrB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAE3C,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC;IAEzB,WAAW,EAAE,OAAO,CAAC;IAErB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IAE/C,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAE9B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,MAAM,CAAC;IAEpB,KAAK,EAAE,OAAO,CAAC;IAEf,UAAU,EAAE,OAAO,CAAC;IAEpB,WAAW,EAAE,MAAM,CAAC;IAEpB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAEhE,KAAK,IAAI,IAAI;IAYb,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAmDhE,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAanD,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAKjC,gBAAgB,CAAC,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAGtD;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -4,10 +4,11 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
4
4
|
|
|
5
5
|
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; }
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
import { assertNotNull } from '@deephaven/utils';
|
|
8
|
+
import Papa from 'papaparse'; // Intentionally using isNaN rather than Number.isNaN
|
|
8
9
|
|
|
9
10
|
/* eslint-disable no-restricted-globals */
|
|
10
|
-
|
|
11
|
+
|
|
11
12
|
import NewTableColumnTypes from "./NewTableColumnTypes.js"; // Initially column types start al unknown
|
|
12
13
|
|
|
13
14
|
var UNKNOWN = 'unknown';
|
|
@@ -166,13 +167,38 @@ class CsvTypeParser {
|
|
|
166
167
|
}
|
|
167
168
|
|
|
168
169
|
constructor(onFileCompleted, file, readHeaders, parentConfig, nullString, onProgress, onError, totalChunks, isZip, shouldTrim) {
|
|
170
|
+
_defineProperty(this, "onFileCompleted", void 0);
|
|
171
|
+
|
|
172
|
+
_defineProperty(this, "file", void 0);
|
|
173
|
+
|
|
174
|
+
_defineProperty(this, "readHeaders", void 0);
|
|
175
|
+
|
|
176
|
+
_defineProperty(this, "nullString", void 0);
|
|
177
|
+
|
|
178
|
+
_defineProperty(this, "onProgress", void 0);
|
|
179
|
+
|
|
180
|
+
_defineProperty(this, "onError", void 0);
|
|
181
|
+
|
|
182
|
+
_defineProperty(this, "types", void 0);
|
|
183
|
+
|
|
184
|
+
_defineProperty(this, "chunks", void 0);
|
|
185
|
+
|
|
186
|
+
_defineProperty(this, "totalChunks", void 0);
|
|
187
|
+
|
|
188
|
+
_defineProperty(this, "isZip", void 0);
|
|
189
|
+
|
|
190
|
+
_defineProperty(this, "shouldTrim", void 0);
|
|
191
|
+
|
|
192
|
+
_defineProperty(this, "zipProgress", void 0);
|
|
193
|
+
|
|
194
|
+
_defineProperty(this, "config", void 0);
|
|
195
|
+
|
|
169
196
|
this.onFileCompleted = onFileCompleted;
|
|
170
197
|
this.file = file;
|
|
171
198
|
this.readHeaders = readHeaders;
|
|
172
199
|
this.nullString = nullString;
|
|
173
200
|
this.onProgress = onProgress;
|
|
174
201
|
this.onError = onError;
|
|
175
|
-
this.types = null;
|
|
176
202
|
this.chunks = 0;
|
|
177
203
|
this.totalChunks = totalChunks;
|
|
178
204
|
this.isZip = isZip;
|
|
@@ -190,7 +216,9 @@ class CsvTypeParser {
|
|
|
190
216
|
}
|
|
191
217
|
|
|
192
218
|
parse() {
|
|
193
|
-
var toParse = this.isZip ? this.file.nodeStream(
|
|
219
|
+
var toParse = this.isZip ? this.file.nodeStream( // JsZip types are incorrect, thus the funny casting
|
|
220
|
+
// Actual parameter is 'nodebuffer'
|
|
221
|
+
'nodebuffer', this.handleNodeUpdate) : this.file;
|
|
194
222
|
Papa.parse(toParse, this.config);
|
|
195
223
|
}
|
|
196
224
|
|
|
@@ -214,14 +242,18 @@ class CsvTypeParser {
|
|
|
214
242
|
}
|
|
215
243
|
}
|
|
216
244
|
|
|
245
|
+
assertNotNull(this.types);
|
|
246
|
+
var cloneTypes = [...this.types];
|
|
217
247
|
data.forEach(row => {
|
|
218
|
-
if (row.length >=
|
|
219
|
-
for (var i = 0; i <
|
|
220
|
-
|
|
248
|
+
if (row.length >= cloneTypes.length) {
|
|
249
|
+
for (var i = 0; i < cloneTypes.length; i += 1) {
|
|
250
|
+
cloneTypes[i] = CsvTypeParser.determineType(this.shouldTrim ? row[i].trim() : row[i], cloneTypes[i], this.nullString);
|
|
221
251
|
}
|
|
252
|
+
|
|
253
|
+
this.types = cloneTypes;
|
|
222
254
|
} else {
|
|
223
255
|
parser.abort();
|
|
224
|
-
this.onError("Error parsing CSV: Insufficient data in row.\nExpected length ".concat(
|
|
256
|
+
this.onError("Error parsing CSV: Insufficient data in row.\nExpected length ".concat(cloneTypes.length, " but found ").concat(row.length, ".\nRow = ").concat(row));
|
|
225
257
|
}
|
|
226
258
|
});
|
|
227
259
|
this.chunks += 1; // 50 because the type parsing accounts for 50% of the parsing
|
|
@@ -247,6 +279,8 @@ class CsvTypeParser {
|
|
|
247
279
|
onFileCompleted
|
|
248
280
|
} = this; // results is undefined for a succesful parse, but has meta data for an abort
|
|
249
281
|
|
|
282
|
+
assertNotNull(types);
|
|
283
|
+
|
|
250
284
|
if (!results || !results.meta.aborted) {
|
|
251
285
|
onFileCompleted(types.map(type => type === UNKNOWN ? NewTableColumnTypes.STRING : type));
|
|
252
286
|
}
|