@deephaven/console 0.46.1-beta.2 → 0.46.1-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/Console.js +66 -59
  2. package/dist/Console.js.map +1 -1
  3. package/dist/ConsoleInput.js +20 -16
  4. package/dist/ConsoleInput.js.map +1 -1
  5. package/dist/ConsoleMenu.js +73 -67
  6. package/dist/ConsoleMenu.js.map +1 -1
  7. package/dist/ConsoleStatusBar.js +17 -10
  8. package/dist/ConsoleStatusBar.js.map +1 -1
  9. package/dist/HeapUsage.js +89 -74
  10. package/dist/HeapUsage.js.map +1 -1
  11. package/dist/command-history/CommandHistory.js +43 -38
  12. package/dist/command-history/CommandHistory.js.map +1 -1
  13. package/dist/command-history/CommandHistoryActions.js +25 -22
  14. package/dist/command-history/CommandHistoryActions.js.map +1 -1
  15. package/dist/command-history/CommandHistoryItem.js +25 -21
  16. package/dist/command-history/CommandHistoryItem.js.map +1 -1
  17. package/dist/command-history/CommandHistoryItemTooltip.js +34 -21
  18. package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -1
  19. package/dist/common/Code.js +16 -12
  20. package/dist/common/Code.js.map +1 -1
  21. package/dist/common/ObjectIcon.js +5 -4
  22. package/dist/common/ObjectIcon.js.map +1 -1
  23. package/dist/console-history/ConsoleHistory.js +7 -6
  24. package/dist/console-history/ConsoleHistory.js.map +1 -1
  25. package/dist/console-history/ConsoleHistoryItem.js +35 -28
  26. package/dist/console-history/ConsoleHistoryItem.js.map +1 -1
  27. package/dist/console-history/ConsoleHistoryItemResult.js +12 -7
  28. package/dist/console-history/ConsoleHistoryItemResult.js.map +1 -1
  29. package/dist/console-history/ConsoleHistoryResultErrorMessage.js +41 -30
  30. package/dist/console-history/ConsoleHistoryResultErrorMessage.js.map +1 -1
  31. package/dist/console-history/ConsoleHistoryResultInProgress.js +15 -11
  32. package/dist/console-history/ConsoleHistoryResultInProgress.js.map +1 -1
  33. package/dist/csv/CsvInputBar.d.ts +1 -1
  34. package/dist/csv/CsvInputBar.d.ts.map +1 -1
  35. package/dist/csv/CsvInputBar.js +80 -60
  36. package/dist/csv/CsvInputBar.js.map +1 -1
  37. package/dist/csv/CsvOverlay.js +74 -50
  38. package/dist/csv/CsvOverlay.js.map +1 -1
  39. package/dist/csv/CsvParser.d.ts +4 -2
  40. package/dist/csv/CsvParser.d.ts.map +1 -1
  41. package/dist/csv/CsvParser.js +21 -7
  42. package/dist/csv/CsvParser.js.map +1 -1
  43. package/dist/csv/CsvTypeParser.d.ts +4 -3
  44. package/dist/csv/CsvTypeParser.d.ts.map +1 -1
  45. package/dist/csv/CsvTypeParser.js +16 -7
  46. package/dist/csv/CsvTypeParser.js.map +1 -1
  47. package/dist/csv/ZipStreamHelper.d.ts +14 -0
  48. package/dist/csv/ZipStreamHelper.d.ts.map +1 -0
  49. package/dist/csv/ZipStreamHelper.js +15 -0
  50. package/dist/csv/ZipStreamHelper.js.map +1 -0
  51. package/dist/log/LogLevelMenuItem.js +9 -6
  52. package/dist/log/LogLevelMenuItem.js.map +1 -1
  53. package/dist/log/LogView.js +51 -42
  54. package/dist/log/LogView.js.map +1 -1
  55. package/dist/notebook/Editor.js +2 -1
  56. package/dist/notebook/Editor.js.map +1 -1
  57. package/dist/notebook/ScriptEditor.js +27 -18
  58. package/dist/notebook/ScriptEditor.js.map +1 -1
  59. package/package.json +13 -13
@@ -8,6 +8,8 @@ import { Button, ContextActions, GLOBAL_SHORTCUTS } from '@deephaven/components'
8
8
  import { dhFileCsv, dhFileDownload, dhFileSpreadsheet, vsClippy, vsFileZip, vsTrash, vsWarning } from '@deephaven/icons';
9
9
  import "./CsvOverlay.css";
10
10
  import { assertNotNull, TextUtils } from '@deephaven/utils';
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ import { jsxs as _jsxs } from "react/jsx-runtime";
11
13
  var PASTED_VALUES = 'pasted values';
12
14
  var INVALID_MIME_TYPES = [/^audio.*/, /^font.*/, /^image.*/, /^video.*/];
13
15
  var VALID_EXTENSIONS = ['.csv', '.tsv', '.tab', '.psv', '.dsv', '.txt'];
@@ -178,60 +180,82 @@ class CsvOverlay extends Component {
178
180
  } = this.state;
179
181
  var error = dragError !== null && dragError !== void 0 ? dragError : dropError;
180
182
  var contextActions = this.makeContextMenuItems();
181
- return /*#__PURE__*/React.createElement("div", {
183
+ return /*#__PURE__*/_jsxs("div", {
182
184
  ref: this.divElem,
183
185
  className: "csv-overlay fill-parent-absolute",
184
186
  onDragOver: CsvOverlay.handleDragOver,
185
187
  onDrop: this.handleDrop,
186
- tabIndex: -1
187
- }, /*#__PURE__*/React.createElement(ContextActions, {
188
- actions: contextActions
189
- }), /*#__PURE__*/React.createElement("input", {
190
- ref: this.fileElem,
191
- type: "file",
192
- id: "fileElem",
193
- accept: this.getAcceptString(allowZip),
194
- style: {
195
- display: 'none'
196
- },
197
- onChange: this.handleFiles,
198
- "data-testid": "fileElem"
199
- }), !selectedFileName && (error === undefined || error === '') && /*#__PURE__*/React.createElement("div", {
200
- className: "message-content"
201
- }, /*#__PURE__*/React.createElement("div", {
202
- className: "message-icon"
203
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
204
- icon: dhFileDownload
205
- })), /*#__PURE__*/React.createElement("label", null, "Drop file (or paste values) here to import"), /*#__PURE__*/React.createElement("div", {
206
- className: "message-small"
207
- }, /*#__PURE__*/React.createElement("label", null, "or")), /*#__PURE__*/React.createElement(Button, {
208
- kind: "primary",
209
- onClick: this.handleSelectFile
210
- }, "Select File...")), selectedFileName && (error === undefined || error === '') && /*#__PURE__*/React.createElement("div", {
211
- className: "selected-content"
212
- }, /*#__PURE__*/React.createElement("div", {
213
- className: "selected-icon"
214
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
215
- icon: CsvOverlay.getIcon(selectedFileName)
216
- })), /*#__PURE__*/React.createElement("div", {
217
- className: "selected-text"
218
- }, /*#__PURE__*/React.createElement("label", null, "Selected File"), /*#__PURE__*/React.createElement("label", {
219
- className: "selected-name"
220
- }, selectedFileName, !uploadInProgress && /*#__PURE__*/React.createElement(Button, {
221
- kind: "ghost",
222
- className: "ml-2",
223
- onClick: this.unstageFile,
224
- icon: vsTrash,
225
- tooltip: "Remove"
226
- })))), Boolean(error) && /*#__PURE__*/React.createElement("div", {
227
- className: "message-content"
228
- }, /*#__PURE__*/React.createElement("div", {
229
- className: "message-icon"
230
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
231
- icon: vsWarning
232
- })), /*#__PURE__*/React.createElement("label", null, error), error === CsvOverlay.FILE_TYPE_ERROR && /*#__PURE__*/React.createElement("div", {
233
- className: "message-small"
234
- }, /*#__PURE__*/React.createElement("label", null, this.getFileTypeErrorString(allowZip)))));
188
+ tabIndex: -1,
189
+ children: [/*#__PURE__*/_jsx(ContextActions, {
190
+ actions: contextActions
191
+ }), /*#__PURE__*/_jsx("input", {
192
+ ref: this.fileElem,
193
+ type: "file",
194
+ id: "fileElem",
195
+ accept: this.getAcceptString(allowZip),
196
+ style: {
197
+ display: 'none'
198
+ },
199
+ onChange: this.handleFiles,
200
+ "data-testid": "fileElem"
201
+ }), !selectedFileName && (error === undefined || error === '') && /*#__PURE__*/_jsxs("div", {
202
+ className: "message-content",
203
+ children: [/*#__PURE__*/_jsx("div", {
204
+ className: "message-icon",
205
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
206
+ icon: dhFileDownload
207
+ })
208
+ }), /*#__PURE__*/_jsx("label", {
209
+ children: "Drop file (or paste values) here to import"
210
+ }), /*#__PURE__*/_jsx("div", {
211
+ className: "message-small",
212
+ children: /*#__PURE__*/_jsx("label", {
213
+ children: "or"
214
+ })
215
+ }), /*#__PURE__*/_jsx(Button, {
216
+ kind: "primary",
217
+ onClick: this.handleSelectFile,
218
+ children: "Select File..."
219
+ })]
220
+ }), selectedFileName && (error === undefined || error === '') && /*#__PURE__*/_jsxs("div", {
221
+ className: "selected-content",
222
+ children: [/*#__PURE__*/_jsx("div", {
223
+ className: "selected-icon",
224
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
225
+ icon: CsvOverlay.getIcon(selectedFileName)
226
+ })
227
+ }), /*#__PURE__*/_jsxs("div", {
228
+ className: "selected-text",
229
+ children: [/*#__PURE__*/_jsx("label", {
230
+ children: "Selected File"
231
+ }), /*#__PURE__*/_jsxs("label", {
232
+ className: "selected-name",
233
+ children: [selectedFileName, !uploadInProgress && /*#__PURE__*/_jsx(Button, {
234
+ kind: "ghost",
235
+ className: "ml-2",
236
+ onClick: this.unstageFile,
237
+ icon: vsTrash,
238
+ tooltip: "Remove"
239
+ })]
240
+ })]
241
+ })]
242
+ }), Boolean(error) && /*#__PURE__*/_jsxs("div", {
243
+ className: "message-content",
244
+ children: [/*#__PURE__*/_jsx("div", {
245
+ className: "message-icon",
246
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
247
+ icon: vsWarning
248
+ })
249
+ }), /*#__PURE__*/_jsx("label", {
250
+ children: error
251
+ }), error === CsvOverlay.FILE_TYPE_ERROR && /*#__PURE__*/_jsx("div", {
252
+ className: "message-small",
253
+ children: /*#__PURE__*/_jsx("label", {
254
+ children: this.getFileTypeErrorString(allowZip)
255
+ })
256
+ })]
257
+ })]
258
+ });
235
259
  }
236
260
  }
237
261
  _defineProperty(CsvOverlay, "defaultProps", {
@@ -1 +1 @@
1
- {"version":3,"file":"CsvOverlay.js","names":["React","Component","memoize","FontAwesomeIcon","Button","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","assertNotNull","TextUtils","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","length","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","Boolean","getFileTypeErrorString"],"sources":["../../src/csv/CsvOverlay.tsx"],"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 Button,\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 != null &&\n item.kind === 'file' &&\n !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type))\n );\n }\n\n static isValidExtension(name: string, allowZip = false): boolean {\n return (\n VALID_EXTENSIONS.some(ext => name.endsWith(ext)) ||\n (allowZip && ZIP_EXTENSIONS.some(ext => name.endsWith(ext)))\n );\n }\n\n static handleDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n static getIcon(fileName: string): IconDefinition {\n if (fileName === PASTED_VALUES) {\n return vsClippy;\n }\n if (fileName.endsWith('.csv')) {\n return dhFileCsv;\n }\n if (fileName.endsWith('.zip')) {\n return vsFileZip;\n }\n return dhFileSpreadsheet;\n }\n\n constructor(props: CsvOverlayProps) {\n super(props);\n\n this.handleSelectFile = this.handleSelectFile.bind(this);\n this.handleFiles = this.handleFiles.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.unstageFile = this.unstageFile.bind(this);\n this.handleMenuPaste = this.handleMenuPaste.bind(this);\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n\n this.fileElem = React.createRef();\n this.divElem = React.createRef();\n\n this.state = {\n selectedFileName: '',\n };\n }\n\n componentDidMount(): void {\n this.divElem.current?.addEventListener('paste', this.handlePasteEvent);\n this.divElem.current?.focus();\n }\n\n componentWillUnmount(): void {\n this.divElem.current?.removeEventListener('paste', this.handlePasteEvent);\n }\n\n fileElem: RefObject<HTMLInputElement>;\n\n divElem: RefObject<HTMLDivElement>;\n\n handleSelectFile(): void {\n if (this.fileElem.current) {\n this.fileElem.current.value = '';\n this.fileElem.current?.click();\n }\n }\n\n handleFiles(event: ChangeEvent<HTMLInputElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { files } = event.target;\n if (files != null) {\n this.handleFile(files[0]);\n }\n }\n\n handleDrop(e: DragEvent<HTMLDivElement>): void {\n const { allowZip, clearDragError, dragError } = this.props;\n e.preventDefault();\n e.stopPropagation();\n\n if (dragError != null) {\n clearDragError();\n return;\n }\n\n if (\n e.dataTransfer == null ||\n e.dataTransfer.items == null ||\n e.dataTransfer.items.length === 0\n ) {\n return;\n }\n\n const file = e.dataTransfer.items[0].getAsFile();\n assertNotNull(file);\n if (CsvOverlay.isValidExtension(file.name, allowZip)) {\n this.handleFile(file);\n } else {\n this.setState({\n dropError: CsvOverlay.FILE_TYPE_ERROR,\n });\n }\n }\n\n unstageFile(event: MouseEvent<HTMLButtonElement>): void {\n const { onCancel } = this.props;\n event.stopPropagation();\n event.preventDefault();\n onCancel();\n this.setState({\n selectedFileName: '',\n dropError: undefined,\n });\n }\n\n handleFile(file: File): void {\n const { onFileOpened } = this.props;\n onFileOpened(file);\n this.setState({\n selectedFileName: file.name,\n dropError: undefined,\n });\n }\n\n handleMenuPaste(): void {\n const { onPaste, onError, uploadInProgress } = this.props;\n if (uploadInProgress) {\n return;\n }\n navigator.clipboard\n .readText()\n .then(clipText => {\n onPaste(clipText);\n this.setState({\n selectedFileName: PASTED_VALUES,\n dropError: undefined,\n });\n })\n .catch((e: unknown) => onError(e));\n }\n\n handlePasteEvent(event: ClipboardEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.handleMenuPaste();\n }\n\n makeContextMenuItems(): ContextAction[] {\n const { uploadInProgress } = this.props;\n return [\n {\n title: 'Paste',\n icon: vsClippy,\n action: this.handleMenuPaste,\n shortcut: GLOBAL_SHORTCUTS.PASTE,\n disabled: uploadInProgress,\n },\n ];\n }\n\n getValidExtensions = memoize((allowZip: boolean) =>\n allowZip ? [...VALID_EXTENSIONS, ...ZIP_EXTENSIONS] : [...VALID_EXTENSIONS]\n );\n\n getAcceptString = memoize((allowZip: boolean) =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize((allowZip: boolean) =>\n TextUtils.join(this.getValidExtensions(allowZip), 'or')\n );\n\n render(): ReactElement {\n const { allowZip, dragError, uploadInProgress } = this.props;\n const { selectedFileName, dropError } = this.state;\n const error = dragError ?? dropError;\n const contextActions = this.makeContextMenuItems();\n return (\n <div\n ref={this.divElem}\n className=\"csv-overlay fill-parent-absolute\"\n onDragOver={CsvOverlay.handleDragOver}\n onDrop={this.handleDrop}\n tabIndex={-1}\n >\n <ContextActions actions={contextActions} />\n <input\n ref={this.fileElem}\n type=\"file\"\n id=\"fileElem\"\n accept={this.getAcceptString(allowZip)}\n style={{ display: 'none' }}\n onChange={this.handleFiles}\n data-testid=\"fileElem\"\n />\n {!selectedFileName && (error === undefined || error === '') && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={dhFileDownload} />\n </div>\n <label>Drop file (or paste values) here to import</label>\n <div className=\"message-small\">\n <label>or</label>\n </div>\n <Button kind=\"primary\" onClick={this.handleSelectFile}>\n Select File...\n </Button>\n </div>\n )}\n {selectedFileName && (error === undefined || error === '') && (\n <div className=\"selected-content\">\n <div className=\"selected-icon\">\n <FontAwesomeIcon icon={CsvOverlay.getIcon(selectedFileName)} />\n </div>\n <div className=\"selected-text\">\n <label>Selected File</label>\n <label className=\"selected-name\">\n {selectedFileName}\n {!uploadInProgress && (\n <Button\n kind=\"ghost\"\n className=\"ml-2\"\n onClick={this.unstageFile}\n icon={vsTrash}\n tooltip=\"Remove\"\n />\n )}\n </label>\n </div>\n </div>\n )}\n {Boolean(error) && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={vsWarning} />\n </div>\n <label>{error}</label>\n {error === CsvOverlay.FILE_TYPE_ERROR && (\n <div className=\"message-small\">\n <label>{this.getFileTypeErrorString(allowZip)}</label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvOverlay;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CsvOverlay.js","names":["React","Component","memoize","FontAwesomeIcon","Button","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","assertNotNull","TextUtils","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","length","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","Boolean","getFileTypeErrorString"],"sources":["../../src/csv/CsvOverlay.tsx"],"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 Button,\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 != null &&\n item.kind === 'file' &&\n !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type))\n );\n }\n\n static isValidExtension(name: string, allowZip = false): boolean {\n return (\n VALID_EXTENSIONS.some(ext => name.endsWith(ext)) ||\n (allowZip && ZIP_EXTENSIONS.some(ext => name.endsWith(ext)))\n );\n }\n\n static handleDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n static getIcon(fileName: string): IconDefinition {\n if (fileName === PASTED_VALUES) {\n return vsClippy;\n }\n if (fileName.endsWith('.csv')) {\n return dhFileCsv;\n }\n if (fileName.endsWith('.zip')) {\n return vsFileZip;\n }\n return dhFileSpreadsheet;\n }\n\n constructor(props: CsvOverlayProps) {\n super(props);\n\n this.handleSelectFile = this.handleSelectFile.bind(this);\n this.handleFiles = this.handleFiles.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.unstageFile = this.unstageFile.bind(this);\n this.handleMenuPaste = this.handleMenuPaste.bind(this);\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n\n this.fileElem = React.createRef();\n this.divElem = React.createRef();\n\n this.state = {\n selectedFileName: '',\n };\n }\n\n componentDidMount(): void {\n this.divElem.current?.addEventListener('paste', this.handlePasteEvent);\n this.divElem.current?.focus();\n }\n\n componentWillUnmount(): void {\n this.divElem.current?.removeEventListener('paste', this.handlePasteEvent);\n }\n\n fileElem: RefObject<HTMLInputElement>;\n\n divElem: RefObject<HTMLDivElement>;\n\n handleSelectFile(): void {\n if (this.fileElem.current) {\n this.fileElem.current.value = '';\n this.fileElem.current?.click();\n }\n }\n\n handleFiles(event: ChangeEvent<HTMLInputElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { files } = event.target;\n if (files != null) {\n this.handleFile(files[0]);\n }\n }\n\n handleDrop(e: DragEvent<HTMLDivElement>): void {\n const { allowZip, clearDragError, dragError } = this.props;\n e.preventDefault();\n e.stopPropagation();\n\n if (dragError != null) {\n clearDragError();\n return;\n }\n\n if (\n e.dataTransfer == null ||\n e.dataTransfer.items == null ||\n e.dataTransfer.items.length === 0\n ) {\n return;\n }\n\n const file = e.dataTransfer.items[0].getAsFile();\n assertNotNull(file);\n if (CsvOverlay.isValidExtension(file.name, allowZip)) {\n this.handleFile(file);\n } else {\n this.setState({\n dropError: CsvOverlay.FILE_TYPE_ERROR,\n });\n }\n }\n\n unstageFile(event: MouseEvent<HTMLButtonElement>): void {\n const { onCancel } = this.props;\n event.stopPropagation();\n event.preventDefault();\n onCancel();\n this.setState({\n selectedFileName: '',\n dropError: undefined,\n });\n }\n\n handleFile(file: File): void {\n const { onFileOpened } = this.props;\n onFileOpened(file);\n this.setState({\n selectedFileName: file.name,\n dropError: undefined,\n });\n }\n\n handleMenuPaste(): void {\n const { onPaste, onError, uploadInProgress } = this.props;\n if (uploadInProgress) {\n return;\n }\n navigator.clipboard\n .readText()\n .then(clipText => {\n onPaste(clipText);\n this.setState({\n selectedFileName: PASTED_VALUES,\n dropError: undefined,\n });\n })\n .catch((e: unknown) => onError(e));\n }\n\n handlePasteEvent(event: ClipboardEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.handleMenuPaste();\n }\n\n makeContextMenuItems(): ContextAction[] {\n const { uploadInProgress } = this.props;\n return [\n {\n title: 'Paste',\n icon: vsClippy,\n action: this.handleMenuPaste,\n shortcut: GLOBAL_SHORTCUTS.PASTE,\n disabled: uploadInProgress,\n },\n ];\n }\n\n getValidExtensions = memoize((allowZip: boolean) =>\n allowZip ? [...VALID_EXTENSIONS, ...ZIP_EXTENSIONS] : [...VALID_EXTENSIONS]\n );\n\n getAcceptString = memoize((allowZip: boolean) =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize((allowZip: boolean) =>\n TextUtils.join(this.getValidExtensions(allowZip), 'or')\n );\n\n render(): ReactElement {\n const { allowZip, dragError, uploadInProgress } = this.props;\n const { selectedFileName, dropError } = this.state;\n const error = dragError ?? dropError;\n const contextActions = this.makeContextMenuItems();\n return (\n <div\n ref={this.divElem}\n className=\"csv-overlay fill-parent-absolute\"\n onDragOver={CsvOverlay.handleDragOver}\n onDrop={this.handleDrop}\n tabIndex={-1}\n >\n <ContextActions actions={contextActions} />\n <input\n ref={this.fileElem}\n type=\"file\"\n id=\"fileElem\"\n accept={this.getAcceptString(allowZip)}\n style={{ display: 'none' }}\n onChange={this.handleFiles}\n data-testid=\"fileElem\"\n />\n {!selectedFileName && (error === undefined || error === '') && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={dhFileDownload} />\n </div>\n <label>Drop file (or paste values) here to import</label>\n <div className=\"message-small\">\n <label>or</label>\n </div>\n <Button kind=\"primary\" onClick={this.handleSelectFile}>\n Select File...\n </Button>\n </div>\n )}\n {selectedFileName && (error === undefined || error === '') && (\n <div className=\"selected-content\">\n <div className=\"selected-icon\">\n <FontAwesomeIcon icon={CsvOverlay.getIcon(selectedFileName)} />\n </div>\n <div className=\"selected-text\">\n <label>Selected File</label>\n <label className=\"selected-name\">\n {selectedFileName}\n {!uploadInProgress && (\n <Button\n kind=\"ghost\"\n className=\"ml-2\"\n onClick={this.unstageFile}\n icon={vsTrash}\n tooltip=\"Remove\"\n />\n )}\n </label>\n </div>\n </div>\n )}\n {Boolean(error) && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={vsWarning} />\n </div>\n <label>{error}</label>\n {error === CsvOverlay.FILE_TYPE_ERROR && (\n <div className=\"message-small\">\n <label>{this.getFileTypeErrorString(allowZip)}</label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvOverlay;\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { CsvTypes } from './CsvFormats';
6
6
  interface CsvParserConstructor {
7
7
  onFileCompleted: (tables: Table[]) => void;
8
8
  session: IdeSession;
9
- file: Blob | JSZipObject;
9
+ file: File | Blob | JSZipObject;
10
10
  type: CsvTypes;
11
11
  readHeaders: boolean;
12
12
  onProgress: (progressValue: number) => boolean;
@@ -23,7 +23,7 @@ declare class CsvParser {
23
23
  constructor({ onFileCompleted, session, file, type, readHeaders, onProgress, onError, timeZone, isZip, }: CsvParserConstructor);
24
24
  onFileCompleted: (tables: Table[]) => void;
25
25
  session: IdeSession;
26
- file: Blob | JSZipObject;
26
+ file: File | Blob | JSZipObject;
27
27
  isZip: boolean;
28
28
  type: CsvTypes;
29
29
  readHeaders: boolean;
@@ -33,6 +33,8 @@ declare class CsvParser {
33
33
  tables: Table[];
34
34
  headers?: string[];
35
35
  types?: string[];
36
+ rowCount: number;
37
+ rowsProcessed: number;
36
38
  chunks: number;
37
39
  totalChunks: number;
38
40
  isComplete: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"CsvParser.d.ts","sourceRoot":"","sources":["../../src/csv/CsvParser.ts"],"names":[],"mappings":";AAAA,OAAa,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxE,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAQxC,UAAU,oBAAoB;IAC5B,eAAe,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAC3C,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,cAAM,SAAS;IAEb,MAAM,CAAC,eAAe,eAAgB,MAAM,KAAG,MAAM,EAAE,CAMrD;IAEF,MAAM,CAAC,uBAAuB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;gBAYrC,EACV,eAAe,EACf,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,WAAkB,EAClB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,KAAK,GACN,EAAE,oBAAoB;IAuCvB,eAAe,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAE3C,OAAO,EAAE,UAAU,CAAC;IAEpB,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC;IAEzB,KAAK,EAAE,OAAO,CAAC;IAEf,IAAI,EAAE,QAAQ,CAAC;IAEf,WAAW,EAAE,OAAO,CAAC;IAErB,QAAQ,EAAE,MAAM,CAAC;IAEjB,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IAE/C,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAE9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,MAAM,CAAC;IAEpB,UAAU,EAAE,OAAO,CAAC;IAEpB,WAAW,EAAE,MAAM,CAAC;IAEpB,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IAEhC,eAAe,EAAE,MAAM,CAAC;IAExB,WAAW,EAAE,OAAO,CAAC;IAErB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAEhE,MAAM,IAAI,IAAI;IAId,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE;IAoB5D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIhC,KAAK,IAAI,IAAI;IA4Bb,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAkChE,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAgB5D,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAWrD,iBAAiB,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EAAE,EACnB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,IAAI;IAoDP,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAWnD,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAKjC,gBAAgB,CAAC,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAGtD;AAED,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"CsvParser.d.ts","sourceRoot":"","sources":["../../src/csv/CsvParser.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import Papa from 'papaparse';
5
5
  import Log from '@deephaven/log';
6
6
  import { assertNotNull, DbNameValidator } from '@deephaven/utils';
7
7
  import CsvTypeParser from "./CsvTypeParser.js";
8
+ import makeZipStreamHelper from "./ZipStreamHelper.js";
8
9
  var log = Log.module('CsvParser');
9
10
 
10
11
  // This is based on jszip streaming ~15 KB chunks to papa parse
@@ -49,6 +50,8 @@ class CsvParser {
49
50
  _defineProperty(this, "tables", void 0);
50
51
  _defineProperty(this, "headers", void 0);
51
52
  _defineProperty(this, "types", void 0);
53
+ _defineProperty(this, "rowCount", void 0);
54
+ _defineProperty(this, "rowsProcessed", void 0);
52
55
  _defineProperty(this, "chunks", void 0);
53
56
  _defineProperty(this, "totalChunks", void 0);
54
57
  _defineProperty(this, "isComplete", void 0);
@@ -67,6 +70,8 @@ class CsvParser {
67
70
  this.onProgress = onProgress;
68
71
  this.onError = onError;
69
72
  this.tables = [];
73
+ this.rowCount = 0;
74
+ this.rowsProcessed = 0;
70
75
  this.chunks = 0;
71
76
  this.totalChunks = isZip ? 0 : Math.ceil(file.size / Papa.LocalChunkSize);
72
77
  this.isComplete = false;
@@ -112,13 +117,19 @@ class CsvParser {
112
117
  return value === this.type.nullString ? '' : value;
113
118
  }
114
119
  parse() {
115
- var handleParseDone = types => {
116
- var toParse = this.isZip ? this.file.nodeStream(
117
- // JsZip types are incorrect, thus the funny casting
118
- // Actual parameter is 'nodebuffer'
119
- 'nodebuffer', this.handleNodeUpdate) : this.file;
120
+ var handleParseDone = (types, rowCount) => {
120
121
  this.types = types;
121
- Papa.parse(toParse, this.config);
122
+ this.rowCount = rowCount;
123
+ if (this.file instanceof File || this.file instanceof Blob) {
124
+ Papa.parse(this.file, this.config);
125
+ } else {
126
+ var zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);
127
+ // This is actually a stream, but papaparse TS doesn't like it
128
+ Papa.parse(zipStream, this.config);
129
+ // The stream needs to be manually resumed since jszip starts paused
130
+ // Papaparse does not call resume and assumes the stream is already reading
131
+ zipStream.resume();
132
+ }
122
133
  };
123
134
  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);
124
135
  typeParser.parse();
@@ -204,6 +215,7 @@ class CsvParser {
204
215
  }
205
216
  assertNotNull(this.headers);
206
217
  assertNotNull(types);
218
+ this.rowsProcessed += columns[0].length;
207
219
  session.newTable(this.headers, types, columns, this.timeZone).then(table => {
208
220
  if (this.isCancelled) {
209
221
  log.debug2('CSV parser cancelled.');
@@ -222,7 +234,9 @@ class CsvParser {
222
234
  if (totalChunks > 0) {
223
235
  progress = Math.round(tables.length / totalChunks * 50) + 50;
224
236
  } else {
225
- progress = Math.round(50 + this.zipProgress / 2);
237
+ // The zip file can be read entirely while in the middle of parsing
238
+ // Since we know the number of rows from the type parsing, use that for progress
239
+ progress = Math.round(this.rowsProcessed / this.rowCount * 50) + 50;
226
240
  }
227
241
  log.debug2("CSV parser progress ".concat(progress));
228
242
  onProgress(progress);
@@ -1 +1 @@
1
- {"version":3,"file":"CsvParser.js","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"],"sources":["../../src/csv/CsvParser.ts"],"sourcesContent":["import Papa, { ParseLocalConfig, Parser, ParseResult } from 'papaparse';\nimport Log from '@deephaven/log';\nimport { assertNotNull, DbNameValidator } from '@deephaven/utils';\nimport type { IdeSession, Table } from '@deephaven/jsapi-types';\nimport type { JSZipObject } from 'jszip';\nimport CsvTypeParser from './CsvTypeParser';\nimport { CsvTypes } from './CsvFormats';\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 == null || results.meta.aborted == null) {\n this.isComplete = true;\n // Check if there are any consolidated chunks left over from a zip file\n if (this.consolidatedChunks) {\n this.uploadConsolidatedChunks(null);\n }\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvParser;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CsvParser.js","names":["Papa","Log","assertNotNull","DbNameValidator","CsvTypeParser","makeZipStreamHelper","log","module","ZIP_CONSOLIDATE_CHUNKS","CsvParser","generateHeaderRecursive","n","header","char","concat","Math","floor","String","fromCharCode","constructor","onFileCompleted","session","file","type","readHeaders","onProgress","onError","timeZone","isZip","tables","rowCount","rowsProcessed","chunks","totalChunks","ceil","size","LocalChunkSize","isComplete","zipProgress","numConsolidated","isCancelled","handleChunk","bind","handleError","handleComplete","handleNodeUpdate","handleCreateTable","config","delimiter","newline","escapeChar","dynamicTyping","error","skipEmptyLines","chunk","complete","fastMode","cancel","transpose","numColumns","array","numRows","length","columns","Array","fill","map","r","row","Error","c","value","shouldTrim","trim","nullCheck","nullString","parse","handleParseDone","types","File","Blob","zipStream","resume","typeParser","result","parser","debug2","abort","forEach","t","close","data","headers","legalizeColumnNames","slice","generateHeaders","consolidateChunks","index","e","consolidatedChunks","i","uploadConsolidatedChunks","toUpload","undefined","pause","newTable","then","table","progress","round","catch","results","meta","aborted","metadata","percent","push"],"sources":["../../src/csv/CsvParser.ts"],"sourcesContent":["import Papa, { ParseLocalConfig, Parser, ParseResult } from 'papaparse';\nimport Log from '@deephaven/log';\nimport { assertNotNull, DbNameValidator } from '@deephaven/utils';\nimport type { IdeSession, Table } from '@deephaven/jsapi-types';\nimport type { JSZipObject } from 'jszip';\nimport CsvTypeParser from './CsvTypeParser';\nimport { CsvTypes } from './CsvFormats';\nimport makeZipStreamHelper from './ZipStreamHelper';\n\nconst log = Log.module('CsvParser');\n\n// This is based on jszip streaming ~15 KB chunks to papa parse\n// Want to consolidate to ~10 MB chunks\nconst ZIP_CONSOLIDATE_CHUNKS = 650;\n\ninterface CsvParserConstructor {\n onFileCompleted: (tables: Table[]) => void;\n session: IdeSession;\n file: File | Blob | JSZipObject;\n type: CsvTypes;\n readHeaders: boolean;\n onProgress: (progressValue: number) => boolean;\n onError: (e: unknown) => void;\n timeZone: string;\n isZip: boolean;\n}\n\n/**\n * Parser a CSV file in chunks and returns a table handle for each chunk.\n */\nclass CsvParser {\n // Generates column names A-Z, AA-AZ, BA-BZ, etc...\n static generateHeaders = (numColumns: number): string[] => {\n const headers = [];\n for (let i = 0; i < numColumns; i += 1) {\n headers.push(CsvParser.generateHeaderRecursive(i));\n }\n return headers;\n };\n\n static generateHeaderRecursive(n: number): string {\n let header = '';\n let char = n;\n if (n >= 26) {\n header = header.concat(\n CsvParser.generateHeaderRecursive(Math.floor(n / 26) - 1)\n );\n char = n % 26;\n }\n return header.concat(String.fromCharCode(65 + char));\n }\n\n constructor({\n onFileCompleted,\n session,\n file,\n type,\n readHeaders = true,\n onProgress,\n onError,\n timeZone,\n isZip,\n }: CsvParserConstructor) {\n this.onFileCompleted = onFileCompleted;\n this.session = session;\n this.file = file;\n this.isZip = isZip;\n this.type = type;\n this.readHeaders = readHeaders;\n this.timeZone = timeZone;\n this.onProgress = onProgress;\n this.onError = onError;\n this.tables = [];\n this.rowCount = 0;\n this.rowsProcessed = 0;\n this.chunks = 0;\n this.totalChunks = isZip\n ? 0\n : Math.ceil((file as Blob).size / Papa.LocalChunkSize);\n this.isComplete = false;\n this.zipProgress = 0;\n this.numConsolidated = 0;\n this.isCancelled = false;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n this.handleCreateTable = this.handleCreateTable.bind(this);\n\n this.config = {\n delimiter: type.delimiter,\n newline: type.newline as '\\r\\n' | '\\n' | '\\r' | undefined,\n escapeChar: type.escapeChar,\n dynamicTyping: false,\n error: this.handleError,\n skipEmptyLines: type.skipEmptyLines,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n fastMode: false,\n };\n }\n\n onFileCompleted: (tables: Table[]) => void;\n\n session: IdeSession;\n\n file: File | Blob | JSZipObject;\n\n isZip: boolean;\n\n type: CsvTypes;\n\n readHeaders: boolean;\n\n timeZone: string;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n tables: Table[];\n\n headers?: string[];\n\n types?: string[];\n\n rowCount: number;\n\n rowsProcessed: number;\n\n chunks: number;\n\n totalChunks: number;\n\n isComplete: boolean;\n\n zipProgress: number;\n\n consolidatedChunks?: string[][];\n\n numConsolidated: number;\n\n isCancelled: boolean;\n\n config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;\n\n cancel(): void {\n this.isCancelled = true;\n }\n\n transpose(numColumns: number, array: string[][]): string[][] {\n const numRows = array.length;\n const columns = new Array(numColumns)\n .fill(null)\n .map(() => new Array(numRows));\n for (let r = 0; r < numRows; r += 1) {\n const row = array[r];\n if (row.length < numColumns) {\n throw new Error(\n `Insufficient columns. Expected ${numColumns} but found ${row.length}\\n${row}`\n );\n }\n for (let c = 0; c < numColumns; c += 1) {\n const value = this.type.shouldTrim ? array[r][c].trim() : array[r][c];\n columns[c][r] = this.nullCheck(value);\n }\n }\n return columns as string[][];\n }\n\n nullCheck(value: string): string {\n return value === this.type.nullString ? '' : value;\n }\n\n parse(): void {\n const handleParseDone = (types: string[], rowCount: number) => {\n this.types = types;\n this.rowCount = rowCount;\n\n if (this.file instanceof File || this.file instanceof Blob) {\n Papa.parse(this.file, this.config);\n } else {\n const zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);\n // This is actually a stream, but papaparse TS doesn't like it\n Papa.parse(zipStream as unknown as Blob, this.config);\n // The stream needs to be manually resumed since jszip starts paused\n // Papaparse does not call resume and assumes the stream is already reading\n zipStream.resume();\n }\n };\n const typeParser = new CsvTypeParser(\n handleParseDone,\n this.file,\n this.readHeaders,\n this.config,\n this.type.nullString,\n this.onProgress,\n this.onError,\n this.totalChunks,\n this.isZip,\n this.type.shouldTrim\n );\n typeParser.parse();\n }\n\n handleChunk(result: ParseResult<string[]>, parser: Parser): void {\n const { readHeaders, onError, handleCreateTable, isZip, tables } = this;\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n parser.abort();\n tables.forEach(t => t.close());\n return;\n }\n let { data } = result;\n if (!this.headers) {\n if (readHeaders) {\n this.headers = DbNameValidator.legalizeColumnNames(data[0]);\n data = data.slice(1);\n } else {\n this.headers = CsvParser.generateHeaders(data[0].length);\n }\n }\n\n let columns: string[][] = [];\n try {\n columns = this.transpose(this.headers.length, data);\n if (isZip) {\n // Zip file chunks are tiny, so consolidate them to avoid create thousands of small tables\n this.consolidateChunks(columns, parser);\n } else {\n const index = this.chunks;\n this.chunks += 1;\n handleCreateTable(index, columns, parser);\n }\n } catch (e: unknown) {\n onError(e);\n }\n }\n\n consolidateChunks(columns: string[][], parser: Parser): void {\n if (!this.consolidatedChunks) {\n this.consolidatedChunks = columns.slice();\n } else {\n for (let i = 0; i < columns.length; i += 1) {\n this.consolidatedChunks[i] = this.consolidatedChunks[i].concat(\n columns[i]\n );\n }\n }\n this.numConsolidated += 1;\n if (this.numConsolidated >= ZIP_CONSOLIDATE_CHUNKS || this.isComplete) {\n this.uploadConsolidatedChunks(parser);\n }\n }\n\n uploadConsolidatedChunks(parser: Parser | null): void {\n const { handleCreateTable } = this;\n const index = this.chunks;\n this.chunks += 1;\n const toUpload = this.consolidatedChunks?.slice();\n this.consolidatedChunks = undefined;\n this.numConsolidated = 0;\n assertNotNull(toUpload);\n handleCreateTable(index, toUpload, parser);\n }\n\n handleCreateTable(\n index: number,\n columns: string[][],\n parser: Parser | null\n ): void {\n const {\n session,\n tables,\n onFileCompleted,\n totalChunks,\n types,\n onProgress,\n onError,\n } = this;\n if (parser) {\n parser.pause();\n }\n assertNotNull(this.headers);\n assertNotNull(types);\n\n this.rowsProcessed += columns[0].length;\n\n session\n .newTable(this.headers, types, columns, this.timeZone)\n .then(table => {\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n if (parser) {\n parser.abort();\n }\n tables.forEach(t => t.close());\n return;\n }\n if (parser) {\n parser.resume();\n }\n tables[index] = table;\n // This accounts for 50% of parsing plus 50% already done by the type parser\n let progress = 0;\n if (totalChunks > 0) {\n progress = Math.round((tables.length / totalChunks) * 50) + 50;\n } else {\n // The zip file can be read entirely while in the middle of parsing\n // Since we know the number of rows from the type parsing, use that for progress\n progress = Math.round((this.rowsProcessed / this.rowCount) * 50) + 50;\n }\n log.debug2(`CSV parser progress ${progress}`);\n onProgress(progress);\n if (this.isComplete && tables.length === this.chunks) {\n log.debug2('CSV parser complete.');\n onFileCompleted(tables);\n }\n })\n .catch(e => {\n if (!this.isComplete && parser) {\n parser.abort();\n }\n onError(e);\n });\n }\n\n handleComplete(results: ParseResult<unknown>): void {\n // results is undefined for a succesful parse, but has meta data for an abort\n if (results == null || results.meta.aborted == null) {\n this.isComplete = true;\n // Check if there are any consolidated chunks left over from a zip file\n if (this.consolidatedChunks) {\n this.uploadConsolidatedChunks(null);\n }\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvParser;\n"],"mappings":"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"}
@@ -15,9 +15,9 @@ declare class CsvTypeParser {
15
15
  static checkLocalTime(value: string): string;
16
16
  static getTypeFromUnknown(value: string): string;
17
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;
18
+ constructor(onFileCompleted: (types: string[], rowCount: number) => void, file: 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[], rowCount: number) => void;
20
+ file: File | Blob | JSZipObject;
21
21
  readHeaders: boolean;
22
22
  nullString: string | null;
23
23
  onProgress: (progressValue: number) => boolean;
@@ -25,6 +25,7 @@ declare class CsvTypeParser {
25
25
  types?: string[];
26
26
  chunks: number;
27
27
  totalChunks: number;
28
+ rowCount: number;
28
29
  isZip: boolean;
29
30
  shouldTrim: boolean;
30
31
  zipProgress: number;
@@ -1 +1 @@
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;AAgBxE;;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;IAkBnD,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"}
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;AAiBxE;;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,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,EAC5D,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,EAC/B,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;IA4BrB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7D,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,CAAC;IAEhC,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,QAAQ,EAAE,MAAM,CAAC;IAEjB,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;IAab,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAqDhE,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAmBnD,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"}
@@ -7,7 +7,8 @@ import { assertNotNull } from '@deephaven/utils';
7
7
  import Papa from 'papaparse';
8
8
  // Intentionally using isNaN rather than Number.isNaN
9
9
  /* eslint-disable no-restricted-globals */
10
- import NewTableColumnTypes from "./NewTableColumnTypes.js"; // Initially column types start as unknown
10
+ import NewTableColumnTypes from "./NewTableColumnTypes.js";
11
+ import makeZipStreamHelper from "./ZipStreamHelper.js"; // Initially column types start as unknown
11
12
  var UNKNOWN = 'unknown';
12
13
  var MAX_INT = 2147483647;
13
14
  var MIN_INT = -2147483648;
@@ -136,6 +137,7 @@ class CsvTypeParser {
136
137
  _defineProperty(this, "types", void 0);
137
138
  _defineProperty(this, "chunks", void 0);
138
139
  _defineProperty(this, "totalChunks", void 0);
140
+ _defineProperty(this, "rowCount", void 0);
139
141
  _defineProperty(this, "isZip", void 0);
140
142
  _defineProperty(this, "shouldTrim", void 0);
141
143
  _defineProperty(this, "zipProgress", void 0);
@@ -148,6 +150,7 @@ class CsvTypeParser {
148
150
  this.onError = onError;
149
151
  this.chunks = 0;
150
152
  this.totalChunks = totalChunks;
153
+ this.rowCount = 0;
151
154
  this.isZip = isZip;
152
155
  this.shouldTrim = shouldTrim;
153
156
  this.zipProgress = 0;
@@ -162,11 +165,16 @@ class CsvTypeParser {
162
165
  });
163
166
  }
164
167
  parse() {
165
- var toParse = this.isZip ? this.file.nodeStream(
166
- // JsZip types are incorrect, thus the funny casting
167
- // Actual parameter is 'nodebuffer'
168
- 'nodebuffer', this.handleNodeUpdate) : this.file;
169
- Papa.parse(toParse, this.config);
168
+ if (this.file instanceof File || this.file instanceof Blob) {
169
+ Papa.parse(this.file, this.config);
170
+ } else {
171
+ var zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);
172
+ // This is actually a stream, but papaparse TS doesn't like it
173
+ Papa.parse(zipStream, this.config);
174
+ // The stream needs to be manually resumed since jszip starts paused
175
+ // Papaparse does not call resume and assumes the stream is already reading
176
+ zipStream.resume();
177
+ }
170
178
  }
171
179
  handleChunk(result, parser) {
172
180
  var {
@@ -184,6 +192,7 @@ class CsvTypeParser {
184
192
  data = data.slice(1);
185
193
  }
186
194
  }
195
+ this.rowCount += data.length;
187
196
  assertNotNull(this.types);
188
197
  var cloneTypes = [...this.types];
189
198
  data.forEach(row => {
@@ -222,7 +231,7 @@ class CsvTypeParser {
222
231
  // If the type is still unknown or a local time, just map it to a string.
223
232
  // Local times are not supported by the backend in DHC, and probably should have more context to parse safely anyway (such as a date or a time zone).
224
233
  // In these cases, we just map it to a string, and the user can use an `.update_view` later if they want to parse it into a different type.
225
- type === UNKNOWN || type === NewTableColumnTypes.LOCAL_TIME ? NewTableColumnTypes.STRING : type));
234
+ type === UNKNOWN || type === NewTableColumnTypes.LOCAL_TIME ? NewTableColumnTypes.STRING : type), this.rowCount);
226
235
  }
227
236
  }
228
237
  handleError(error) {