@deephaven/console 0.5.2-matplotlib.2 → 0.6.0

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