read-excel-file 5.4.6 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -1
- package/bundle/read-excel-file.min.js +1 -13
- package/bundle/read-excel-file.min.js.map +1 -1
- package/commonjs/read/parseCellValue.js +1 -1
- package/commonjs/read/parseCellValue.js.map +1 -1
- package/commonjs/read/schema/convertToJson.js +2 -2
- package/commonjs/read/schema/convertToJson.js.map +1 -1
- package/commonjs/read/unpackXlsxFileBrowser.js +25 -20
- package/commonjs/read/unpackXlsxFileBrowser.js.map +1 -1
- package/modules/read/parseCellValue.js +1 -1
- package/modules/read/parseCellValue.js.map +1 -1
- package/modules/read/schema/convertToJson.js +2 -2
- package/modules/read/schema/convertToJson.js.map +1 -1
- package/modules/read/unpackXlsxFileBrowser.js +25 -18
- package/modules/read/unpackXlsxFileBrowser.js.map +1 -1
- package/package.json +2 -2
- package/types.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCellValue.js","names":["parseCellValue","value","type","getInlineStringValue","getInlineStringXml","getStyleId","styles","values","properties","options","parseString","undefined","Error","sharedStringIndex","Number","isNaN","length","decodeError","parsedDate","Date","parsedNumber","isDateTimestamp","parseDate","TypeError","errorCode","trim"],"sources":["../../source/read/parseCellValue.js"],"sourcesContent":["import parseDate from './parseDate.js'\r\nimport isDateTimestamp from './isDateTimestamp.js'\r\n\r\n// Parses a string `value` of a cell.\r\nexport default function parseCellValue(value, type, {\r\n getInlineStringValue,\r\n getInlineStringXml,\r\n getStyleId,\r\n styles,\r\n values,\r\n properties,\r\n options\r\n}) {\r\n if (!type) {\r\n // Default cell type is \"n\" (numeric).\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n type = 'n'\r\n }\r\n\r\n // Available Excel cell types:\r\n // https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\n //\r\n // Some other document (seems to be old):\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n //\r\n switch (type) {\r\n // XLSX tends to store all strings as \"shared\" (indexed) ones\r\n // using \"s\" cell type (for saving on strage space).\r\n // \"str\" cell type is then generally only used for storing\r\n // formula-pre-calculated cell values.\r\n case 'str':\r\n value = parseString(value, options)\r\n break\r\n\r\n // Sometimes, XLSX stores strings as \"inline\" strings rather than \"shared\" (indexed) ones.\r\n // Perhaps the specification doesn't force it to use one or another.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"inlineStr\"><is><t>Test 123</t></is></c></row></sheetData>`.\r\n case 'inlineStr':\r\n value = getInlineStringValue()\r\n if (value === undefined) {\r\n throw new Error(`Unsupported \"inline string\" cell value structure: ${getInlineStringXml()}`)\r\n }\r\n value = parseString(value, options)\r\n break\r\n\r\n // XLSX tends to store string values as \"shared\" (indexed) ones.\r\n // \"Shared\" strings is a way for an Excel editor to reduce\r\n // the file size by storing \"commonly used\" strings in a dictionary\r\n // and then referring to such strings by their index in that dictionary.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"s\"><v>0</v></c></row></sheetData>`.\r\n case 's':\r\n // If a cell has no value then there's no `<c/>` element for it.\r\n // If a `<c/>` element exists then it's not empty.\r\n // The `<v/>`alue is a key in the \"shared strings\" dictionary of the\r\n // XLSX file, so look it up in the `values` dictionary by the numeric key.\r\n const sharedStringIndex = Number(value)\r\n if (isNaN(sharedStringIndex)) {\r\n throw new Error(`Invalid \"shared\" string index: ${value}`)\r\n }\r\n if (sharedStringIndex >= values.length) {\r\n throw new Error(`An out-of-bounds \"shared\" string index: ${value}`)\r\n }\r\n value = values[sharedStringIndex]\r\n value = parseString(value, options)\r\n break\r\n\r\n // Boolean (TRUE/FALSE) values are stored as either \"1\" or \"0\"\r\n // in cells of type \"b\".\r\n case 'b':\r\n if (value === '1') {\r\n value = true\r\n } else if (value === '0') {\r\n value = false\r\n } else {\r\n throw new Error(`Unsupported \"boolean\" cell value: ${value}`)\r\n }\r\n break\r\n\r\n // XLSX specification seems to support cells of type \"z\":\r\n // blank \"stub\" cells that should be ignored by data processing utilities.\r\n case 'z':\r\n value = undefined\r\n break\r\n\r\n // XLSX specification also defines cells of type \"e\" containing a numeric \"error\" code.\r\n // It's not clear what that means though.\r\n // They also wrote: \"and `w` property stores its common name\".\r\n // It's unclear what they meant by that.\r\n case 'e':\r\n value = decodeError(value)\r\n break\r\n\r\n // XLSX supports date cells of type \"d\", though seems like it (almost?) never\r\n // uses it for storing dates, preferring \"n\" numeric timestamp cells instead.\r\n // The value of a \"d\" cell is supposedly a string in \"ISO 8601\" format.\r\n // I haven't seen an XLSX file having such cells.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"d\"><v>2021-06-10T00:47:45.700Z</v></c></row></sheetData>`.\r\n case 'd':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedDate = new Date(value)\r\n if (isNaN(parsedDate)) {\r\n throw new Error(`Unsupported \"date\" cell value: ${value}`)\r\n }\r\n value = parsedDate\r\n break\r\n\r\n // Numeric cells have type \"n\".\r\n case 'n':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedNumber = Number(value)\r\n if (isNaN(parsedNumber)) {\r\n throw new Error(`Invalid \"numeric\" cell value: ${value}`)\r\n }\r\n value = parsedNumber\r\n // XLSX does have \"d\" type for dates, but it's not commonly used.\r\n // Instead, it prefers using \"n\" type for storing dates as timestamps.\r\n if (isDateTimestamp(value, getStyleId(), styles, options)) {\r\n // Parse the number as a date timestamp.\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n\r\n default:\r\n throw new TypeError(`Cell type not supported: ${type}`)\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return value\r\n}\r\n\r\n// Decodes numeric error code to a string code.\r\n// https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\nfunction decodeError(errorCode) {\r\n // While the error values are determined by the application,\r\n // the following are some example error values that could be used:\r\n switch (errorCode) {\r\n case 0x00:\r\n return '#NULL!'\r\n case 0x07:\r\n return '#DIV/0!'\r\n case 0x0F:\r\n return '#VALUE!'\r\n case 0x17:\r\n return '#REF!'\r\n case 0x1D:\r\n return '#NAME?'\r\n case 0x24:\r\n return '#NUM!'\r\n case 0x2A:\r\n return '#N/A'\r\n case 0x2B:\r\n return '#GETTING_DATA'\r\n default:\r\n // Such error code doesn't exist. I made it up.\r\n return `#ERROR_${errorCode}`\r\n }\r\n}\r\n\r\nfunction parseString(value, options) {\r\n // In some weird cases, a developer might want to disable\r\n // the automatic trimming of all strings.\r\n // For example, leading spaces might express a tree-like hierarchy.\r\n // https://github.com/catamphetamine/read-excel-file/pull/106#issuecomment-1136062917\r\n if (options.trim !== false) {\r\n value = value.trim()\r\n }\r\n if (value === '') {\r\n value = undefined\r\n }\r\n return value\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parseCellValue.js","names":["parseCellValue","value","type","getInlineStringValue","getInlineStringXml","getStyleId","styles","values","properties","options","parseString","undefined","Error","sharedStringIndex","Number","isNaN","length","decodeError","parsedDate","Date","valueOf","parsedNumber","isDateTimestamp","parseDate","TypeError","errorCode","trim"],"sources":["../../source/read/parseCellValue.js"],"sourcesContent":["import parseDate from './parseDate.js'\r\nimport isDateTimestamp from './isDateTimestamp.js'\r\n\r\n// Parses a string `value` of a cell.\r\nexport default function parseCellValue(value, type, {\r\n getInlineStringValue,\r\n getInlineStringXml,\r\n getStyleId,\r\n styles,\r\n values,\r\n properties,\r\n options\r\n}) {\r\n if (!type) {\r\n // Default cell type is \"n\" (numeric).\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n type = 'n'\r\n }\r\n\r\n // Available Excel cell types:\r\n // https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\n //\r\n // Some other document (seems to be old):\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n //\r\n switch (type) {\r\n // XLSX tends to store all strings as \"shared\" (indexed) ones\r\n // using \"s\" cell type (for saving on strage space).\r\n // \"str\" cell type is then generally only used for storing\r\n // formula-pre-calculated cell values.\r\n case 'str':\r\n value = parseString(value, options)\r\n break\r\n\r\n // Sometimes, XLSX stores strings as \"inline\" strings rather than \"shared\" (indexed) ones.\r\n // Perhaps the specification doesn't force it to use one or another.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"inlineStr\"><is><t>Test 123</t></is></c></row></sheetData>`.\r\n case 'inlineStr':\r\n value = getInlineStringValue()\r\n if (value === undefined) {\r\n throw new Error(`Unsupported \"inline string\" cell value structure: ${getInlineStringXml()}`)\r\n }\r\n value = parseString(value, options)\r\n break\r\n\r\n // XLSX tends to store string values as \"shared\" (indexed) ones.\r\n // \"Shared\" strings is a way for an Excel editor to reduce\r\n // the file size by storing \"commonly used\" strings in a dictionary\r\n // and then referring to such strings by their index in that dictionary.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"s\"><v>0</v></c></row></sheetData>`.\r\n case 's':\r\n // If a cell has no value then there's no `<c/>` element for it.\r\n // If a `<c/>` element exists then it's not empty.\r\n // The `<v/>`alue is a key in the \"shared strings\" dictionary of the\r\n // XLSX file, so look it up in the `values` dictionary by the numeric key.\r\n const sharedStringIndex = Number(value)\r\n if (isNaN(sharedStringIndex)) {\r\n throw new Error(`Invalid \"shared\" string index: ${value}`)\r\n }\r\n if (sharedStringIndex >= values.length) {\r\n throw new Error(`An out-of-bounds \"shared\" string index: ${value}`)\r\n }\r\n value = values[sharedStringIndex]\r\n value = parseString(value, options)\r\n break\r\n\r\n // Boolean (TRUE/FALSE) values are stored as either \"1\" or \"0\"\r\n // in cells of type \"b\".\r\n case 'b':\r\n if (value === '1') {\r\n value = true\r\n } else if (value === '0') {\r\n value = false\r\n } else {\r\n throw new Error(`Unsupported \"boolean\" cell value: ${value}`)\r\n }\r\n break\r\n\r\n // XLSX specification seems to support cells of type \"z\":\r\n // blank \"stub\" cells that should be ignored by data processing utilities.\r\n case 'z':\r\n value = undefined\r\n break\r\n\r\n // XLSX specification also defines cells of type \"e\" containing a numeric \"error\" code.\r\n // It's not clear what that means though.\r\n // They also wrote: \"and `w` property stores its common name\".\r\n // It's unclear what they meant by that.\r\n case 'e':\r\n value = decodeError(value)\r\n break\r\n\r\n // XLSX supports date cells of type \"d\", though seems like it (almost?) never\r\n // uses it for storing dates, preferring \"n\" numeric timestamp cells instead.\r\n // The value of a \"d\" cell is supposedly a string in \"ISO 8601\" format.\r\n // I haven't seen an XLSX file having such cells.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"d\"><v>2021-06-10T00:47:45.700Z</v></c></row></sheetData>`.\r\n case 'd':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedDate = new Date(value)\r\n if (isNaN(parsedDate.valueOf())) {\r\n throw new Error(`Unsupported \"date\" cell value: ${value}`)\r\n }\r\n value = parsedDate\r\n break\r\n\r\n // Numeric cells have type \"n\".\r\n case 'n':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedNumber = Number(value)\r\n if (isNaN(parsedNumber)) {\r\n throw new Error(`Invalid \"numeric\" cell value: ${value}`)\r\n }\r\n value = parsedNumber\r\n // XLSX does have \"d\" type for dates, but it's not commonly used.\r\n // Instead, it prefers using \"n\" type for storing dates as timestamps.\r\n if (isDateTimestamp(value, getStyleId(), styles, options)) {\r\n // Parse the number as a date timestamp.\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n\r\n default:\r\n throw new TypeError(`Cell type not supported: ${type}`)\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return value\r\n}\r\n\r\n// Decodes numeric error code to a string code.\r\n// https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\nfunction decodeError(errorCode) {\r\n // While the error values are determined by the application,\r\n // the following are some example error values that could be used:\r\n switch (errorCode) {\r\n case 0x00:\r\n return '#NULL!'\r\n case 0x07:\r\n return '#DIV/0!'\r\n case 0x0F:\r\n return '#VALUE!'\r\n case 0x17:\r\n return '#REF!'\r\n case 0x1D:\r\n return '#NAME?'\r\n case 0x24:\r\n return '#NUM!'\r\n case 0x2A:\r\n return '#N/A'\r\n case 0x2B:\r\n return '#GETTING_DATA'\r\n default:\r\n // Such error code doesn't exist. I made it up.\r\n return `#ERROR_${errorCode}`\r\n }\r\n}\r\n\r\nfunction parseString(value, options) {\r\n // In some weird cases, a developer might want to disable\r\n // the automatic trimming of all strings.\r\n // For example, leading spaces might express a tree-like hierarchy.\r\n // https://github.com/catamphetamine/read-excel-file/pull/106#issuecomment-1136062917\r\n if (options.trim !== false) {\r\n value = value.trim()\r\n }\r\n if (value === '') {\r\n value = undefined\r\n }\r\n return value\r\n}"],"mappings":"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"}
|
|
@@ -447,7 +447,7 @@ function parseValueOfType(value, type, options) {
|
|
|
447
447
|
// Sometimes a date can be heuristically detected.
|
|
448
448
|
// https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777
|
|
449
449
|
if (value instanceof Date) {
|
|
450
|
-
if (isNaN(value)) {
|
|
450
|
+
if (isNaN(value.valueOf())) {
|
|
451
451
|
return {
|
|
452
452
|
error: 'invalid',
|
|
453
453
|
reason: 'out_of_bounds'
|
|
@@ -476,7 +476,7 @@ function parseValueOfType(value, type, options) {
|
|
|
476
476
|
|
|
477
477
|
var date = (0, _parseDate["default"])(value, options.properties);
|
|
478
478
|
|
|
479
|
-
if (isNaN(date)) {
|
|
479
|
+
if (isNaN(date.valueOf())) {
|
|
480
480
|
return {
|
|
481
481
|
error: 'invalid',
|
|
482
482
|
reason: 'out_of_bounds'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertToJson.js","names":["DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","ignoreEmptyRows","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","isEmptyObject","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","reason","notEmpty","array","parseArray","map","_value","parseValue","required","column","includeNullValues","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","isNaN","isFinite","Number","Integer","stringifiedValue","isInteger","URL","isURL","Email","isEmail","Date","date","parseDate","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"sources":["../../../source/read/schema/convertToJson.js"],"sourcesContent":["import parseDate from '../parseDate.js'\r\n\r\nimport Integer, { isInteger } from '../../types/Integer.js'\r\nimport URL, { isURL } from '../../types/URL.js'\r\nimport Email, { isEmail } from '../../types/Email.js'\r\n\r\nconst DEFAULT_OPTIONS = {\r\n isColumnOriented: false\r\n}\r\n\r\n/**\r\n * Convert 2D array to nested objects.\r\n * If row oriented data, row 0 is dotted key names.\r\n * Column oriented data is transposed.\r\n * @param {any[][]} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @return {object[]}\r\n */\r\nexport default function(data, schema, options) {\r\n if (options) {\r\n options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n options = DEFAULT_OPTIONS\r\n }\r\n\r\n const {\r\n isColumnOriented,\r\n rowMap,\r\n ignoreEmptyRows\r\n } = options\r\n\r\n validateSchema(schema)\r\n\r\n if (isColumnOriented) {\r\n data = transpose(data)\r\n }\r\n\r\n const columns = data[0]\r\n\r\n const results = []\r\n const errors = []\r\n\r\n for (let i = 1; i < data.length; i++) {\r\n const result = read(schema, data[i], i, columns, errors, options)\r\n if (result !== null || ignoreEmptyRows === false) {\r\n results.push(result)\r\n }\r\n }\r\n\r\n // Correct error rows.\r\n if (rowMap) {\r\n for (const error of errors) {\r\n // Convert the `row` index in `data` to the\r\n // actual `row` index in the spreadsheet.\r\n // `- 1` converts row number to row index.\r\n // `+ 1` converts row index to row number.\r\n error.row = rowMap[error.row - 1] + 1\r\n }\r\n }\r\n\r\n return {\r\n rows: results,\r\n errors\r\n }\r\n}\r\n\r\nfunction read(schema, row, rowIndex, columns, errors, options) {\r\n const object = {}\r\n let isEmptyObject = true\r\n for (const key of Object.keys(schema)) {\r\n const schemaEntry = schema[key]\r\n const isNestedSchema = typeof schemaEntry.type === 'object' && !Array.isArray(schemaEntry.type)\r\n let rawValue = row[columns.indexOf(key)]\r\n if (rawValue === undefined) {\r\n rawValue = null\r\n }\r\n let value\r\n let error\r\n let reason\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, columns, errors, options)\r\n } else {\r\n if (rawValue === null) {\r\n value = null\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n let notEmpty = false\r\n const array = parseArray(rawValue).map((_value) => {\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n value = _value\r\n error = result.error\r\n reason = result.reason\r\n }\r\n if (result.value !== null) {\r\n notEmpty = true\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n value = notEmpty ? array : null\r\n }\r\n } else {\r\n const result = parseValue(rawValue, schemaEntry, options)\r\n error = result.error\r\n reason = result.reason\r\n value = error ? rawValue : result.value\r\n }\r\n }\r\n if (!error && value === null && schemaEntry.required) {\r\n error = 'required'\r\n }\r\n if (error) {\r\n error = {\r\n error,\r\n row: rowIndex + 1,\r\n column: key,\r\n value\r\n }\r\n if (reason) {\r\n error.reason = reason\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else {\r\n if (isEmptyObject && value !== null) {\r\n isEmptyObject = false\r\n }\r\n if (value !== null || options.includeNullValues) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n }\r\n if (isEmptyObject) {\r\n return null\r\n }\r\n return object\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {object} schemaEntry\r\n * @return {{ value: any, error: string }}\r\n */\r\nexport function parseValue(value, schemaEntry, options) {\r\n if (value === null) {\r\n return { value: null }\r\n }\r\n let result\r\n if (schemaEntry.parse) {\r\n result = parseCustomValue(value, schemaEntry.parse)\r\n } else if (schemaEntry.type) {\r\n result = parseValueOfType(\r\n value,\r\n // Supports parsing array types.\r\n // See `parseArray()` function for more details.\r\n // Example `type`: String[]\r\n // Input: 'Barack Obama, \"String, with, colons\", Donald Trump'\r\n // Output: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type,\r\n options\r\n )\r\n } else {\r\n result = { value: value }\r\n // throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid', reason: 'unknown' }\r\n }\r\n if (schemaEntry.validate) {\r\n try {\r\n schemaEntry.validate(result.value)\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {any} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string, reason?: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n if (typeof value === 'string') {\r\n return { value }\r\n }\r\n // Excel tends to perform a forced automatic convertion of string-type values\r\n // to number-type ones when the user has input them. Otherwise, users wouldn't\r\n // be able to perform formula calculations on those cell values because users\r\n // won't bother manually choosing a \"numeric\" cell type for each cell, and\r\n // even if they did, choosing a \"numeric\" cell type every time wouldn't be an\r\n // acceptable \"user experience\".\r\n //\r\n // So, if a cell value is supposed to be a string and Excel has automatically\r\n // converted it to a number, perform a backwards conversion.\r\n //\r\n if (typeof value === 'number') {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: String(value) }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Number:\r\n case Integer:\r\n // An XLSX file editing software might not always correctly\r\n // detect numeric values in string-type cells. Users won't bother\r\n // manually selecting a cell type, so the editing software has to guess\r\n // based on the user's input. One can assume that such auto-detection\r\n // might not always work.\r\n //\r\n // So, if a cell is supposed to be a numeric one, convert a string value to a number.\r\n //\r\n if (typeof value === 'string') {\r\n const stringifiedValue = value\r\n value = Number(value)\r\n if (String(value) !== stringifiedValue) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n }\r\n if (typeof value !== 'number') {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n // At this point, `value` can only be a number.\r\n //\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid', reason: 'not_an_integer' }\r\n }\r\n return { value }\r\n\r\n case URL:\r\n if (typeof value === 'string') {\r\n if (isURL(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_url' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Email:\r\n if (typeof value === 'string') {\r\n if (isEmail(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_an_email' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Date:\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n if (value instanceof Date) {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n const date = parseDate(value, options.properties)\r\n if (isNaN(date)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid', reason: 'not_a_date' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_boolean' }\r\n\r\n default:\r\n if (typeof type === 'function') {\r\n return parseCustomValue(value, type)\r\n }\r\n throw new Error(`Unknown schema type: ${type && type.name || type}`)\r\n }\r\n}\r\n\r\nexport function getBlock(string, endCharacter, startIndex) {\r\n let i = 0\r\n let substring = ''\r\n let character\r\n while (startIndex + i < string.length) {\r\n const character = string[startIndex + i]\r\n if (character === endCharacter) {\r\n return [substring, i]\r\n }\r\n else if (character === '\"') {\r\n const block = getBlock(string, '\"', startIndex + i + 1)\r\n substring += block[0]\r\n i += '\"'.length + block[1] + '\"'.length\r\n }\r\n else {\r\n substring += character\r\n i++\r\n }\r\n }\r\n return [substring, i]\r\n}\r\n\r\n/**\r\n * Parses a string of comma-separated substrings into an array of substrings.\r\n * (the `export` is just for tests)\r\n * @param {string} string — A string of comma-separated substrings.\r\n * @return {string[]} An array of substrings.\r\n */\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convertToJson.js","names":["DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","ignoreEmptyRows","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","isEmptyObject","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","reason","notEmpty","array","parseArray","map","_value","parseValue","required","column","includeNullValues","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","isNaN","isFinite","Number","Integer","stringifiedValue","isInteger","URL","isURL","Email","isEmail","Date","valueOf","date","parseDate","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"sources":["../../../source/read/schema/convertToJson.js"],"sourcesContent":["import parseDate from '../parseDate.js'\r\n\r\nimport Integer, { isInteger } from '../../types/Integer.js'\r\nimport URL, { isURL } from '../../types/URL.js'\r\nimport Email, { isEmail } from '../../types/Email.js'\r\n\r\nconst DEFAULT_OPTIONS = {\r\n isColumnOriented: false\r\n}\r\n\r\n/**\r\n * Convert 2D array to nested objects.\r\n * If row oriented data, row 0 is dotted key names.\r\n * Column oriented data is transposed.\r\n * @param {any[][]} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @return {object[]}\r\n */\r\nexport default function(data, schema, options) {\r\n if (options) {\r\n options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n options = DEFAULT_OPTIONS\r\n }\r\n\r\n const {\r\n isColumnOriented,\r\n rowMap,\r\n ignoreEmptyRows\r\n } = options\r\n\r\n validateSchema(schema)\r\n\r\n if (isColumnOriented) {\r\n data = transpose(data)\r\n }\r\n\r\n const columns = data[0]\r\n\r\n const results = []\r\n const errors = []\r\n\r\n for (let i = 1; i < data.length; i++) {\r\n const result = read(schema, data[i], i, columns, errors, options)\r\n if (result !== null || ignoreEmptyRows === false) {\r\n results.push(result)\r\n }\r\n }\r\n\r\n // Correct error rows.\r\n if (rowMap) {\r\n for (const error of errors) {\r\n // Convert the `row` index in `data` to the\r\n // actual `row` index in the spreadsheet.\r\n // `- 1` converts row number to row index.\r\n // `+ 1` converts row index to row number.\r\n error.row = rowMap[error.row - 1] + 1\r\n }\r\n }\r\n\r\n return {\r\n rows: results,\r\n errors\r\n }\r\n}\r\n\r\nfunction read(schema, row, rowIndex, columns, errors, options) {\r\n const object = {}\r\n let isEmptyObject = true\r\n for (const key of Object.keys(schema)) {\r\n const schemaEntry = schema[key]\r\n const isNestedSchema = typeof schemaEntry.type === 'object' && !Array.isArray(schemaEntry.type)\r\n let rawValue = row[columns.indexOf(key)]\r\n if (rawValue === undefined) {\r\n rawValue = null\r\n }\r\n let value\r\n let error\r\n let reason\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, columns, errors, options)\r\n } else {\r\n if (rawValue === null) {\r\n value = null\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n let notEmpty = false\r\n const array = parseArray(rawValue).map((_value) => {\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n value = _value\r\n error = result.error\r\n reason = result.reason\r\n }\r\n if (result.value !== null) {\r\n notEmpty = true\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n value = notEmpty ? array : null\r\n }\r\n } else {\r\n const result = parseValue(rawValue, schemaEntry, options)\r\n error = result.error\r\n reason = result.reason\r\n value = error ? rawValue : result.value\r\n }\r\n }\r\n if (!error && value === null && schemaEntry.required) {\r\n error = 'required'\r\n }\r\n if (error) {\r\n error = {\r\n error,\r\n row: rowIndex + 1,\r\n column: key,\r\n value\r\n }\r\n if (reason) {\r\n error.reason = reason\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else {\r\n if (isEmptyObject && value !== null) {\r\n isEmptyObject = false\r\n }\r\n if (value !== null || options.includeNullValues) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n }\r\n if (isEmptyObject) {\r\n return null\r\n }\r\n return object\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {object} schemaEntry\r\n * @return {{ value: any, error: string }}\r\n */\r\nexport function parseValue(value, schemaEntry, options) {\r\n if (value === null) {\r\n return { value: null }\r\n }\r\n let result\r\n if (schemaEntry.parse) {\r\n result = parseCustomValue(value, schemaEntry.parse)\r\n } else if (schemaEntry.type) {\r\n result = parseValueOfType(\r\n value,\r\n // Supports parsing array types.\r\n // See `parseArray()` function for more details.\r\n // Example `type`: String[]\r\n // Input: 'Barack Obama, \"String, with, colons\", Donald Trump'\r\n // Output: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type,\r\n options\r\n )\r\n } else {\r\n result = { value: value }\r\n // throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid', reason: 'unknown' }\r\n }\r\n if (schemaEntry.validate) {\r\n try {\r\n schemaEntry.validate(result.value)\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {any} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string, reason?: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n if (typeof value === 'string') {\r\n return { value }\r\n }\r\n // Excel tends to perform a forced automatic convertion of string-type values\r\n // to number-type ones when the user has input them. Otherwise, users wouldn't\r\n // be able to perform formula calculations on those cell values because users\r\n // won't bother manually choosing a \"numeric\" cell type for each cell, and\r\n // even if they did, choosing a \"numeric\" cell type every time wouldn't be an\r\n // acceptable \"user experience\".\r\n //\r\n // So, if a cell value is supposed to be a string and Excel has automatically\r\n // converted it to a number, perform a backwards conversion.\r\n //\r\n if (typeof value === 'number') {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: String(value) }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Number:\r\n case Integer:\r\n // An XLSX file editing software might not always correctly\r\n // detect numeric values in string-type cells. Users won't bother\r\n // manually selecting a cell type, so the editing software has to guess\r\n // based on the user's input. One can assume that such auto-detection\r\n // might not always work.\r\n //\r\n // So, if a cell is supposed to be a numeric one, convert a string value to a number.\r\n //\r\n if (typeof value === 'string') {\r\n const stringifiedValue = value\r\n value = Number(value)\r\n if (String(value) !== stringifiedValue) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n }\r\n if (typeof value !== 'number') {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n // At this point, `value` can only be a number.\r\n //\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid', reason: 'not_an_integer' }\r\n }\r\n return { value }\r\n\r\n case URL:\r\n if (typeof value === 'string') {\r\n if (isURL(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_url' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Email:\r\n if (typeof value === 'string') {\r\n if (isEmail(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_an_email' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Date:\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n if (value instanceof Date) {\r\n if (isNaN(value.valueOf())) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n const date = parseDate(value, options.properties)\r\n if (isNaN(date.valueOf())) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid', reason: 'not_a_date' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_boolean' }\r\n\r\n default:\r\n if (typeof type === 'function') {\r\n return parseCustomValue(value, type)\r\n }\r\n throw new Error(`Unknown schema type: ${type && type.name || type}`)\r\n }\r\n}\r\n\r\nexport function getBlock(string, endCharacter, startIndex) {\r\n let i = 0\r\n let substring = ''\r\n let character\r\n while (startIndex + i < string.length) {\r\n const character = string[startIndex + i]\r\n if (character === endCharacter) {\r\n return [substring, i]\r\n }\r\n else if (character === '\"') {\r\n const block = getBlock(string, '\"', startIndex + i + 1)\r\n substring += block[0]\r\n i += '\"'.length + block[1] + '\"'.length\r\n }\r\n else {\r\n substring += character\r\n i++\r\n }\r\n }\r\n return [substring, i]\r\n}\r\n\r\n/**\r\n * Parses a string of comma-separated substrings into an array of substrings.\r\n * (the `export` is just for tests)\r\n * @param {string} string — A string of comma-separated substrings.\r\n * @return {string[]} An array of substrings.\r\n */\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"],"mappings":"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"}
|
|
@@ -5,32 +5,37 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports["default"] = unpackXlsxFile;
|
|
7
7
|
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
8
|
+
var _fflate = require("fflate");
|
|
11
9
|
|
|
12
10
|
/**
|
|
13
11
|
* Reads XLSX file in a browser.
|
|
14
|
-
* @param {
|
|
12
|
+
* @param {File} file - A `File` object being uploaded in the browser.
|
|
15
13
|
* @return {Promise} Resolves to an object holding XLSX file entries.
|
|
16
14
|
*/
|
|
17
15
|
function unpackXlsxFile(file) {
|
|
18
|
-
var
|
|
19
|
-
return
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
});
|
|
31
|
-
})).then(function () {
|
|
32
|
-
return entries;
|
|
33
|
-
});
|
|
16
|
+
var startedAt = Date.now();
|
|
17
|
+
return file.arrayBuffer().then(function (fileBuffer) {
|
|
18
|
+
var archive = new Uint8Array(fileBuffer);
|
|
19
|
+
var contents = (0, _fflate.unzipSync)(archive);
|
|
20
|
+
return getContents(contents); // return new Promise((resolve, reject) => {
|
|
21
|
+
// unzip(archive, (error, contents) => {
|
|
22
|
+
// if (error) {
|
|
23
|
+
// return reject(error)
|
|
24
|
+
// }
|
|
25
|
+
// return resolve(getContents(contents))
|
|
26
|
+
// })
|
|
27
|
+
// })
|
|
34
28
|
});
|
|
35
29
|
}
|
|
30
|
+
|
|
31
|
+
function getContents(contents) {
|
|
32
|
+
var unzippedFiles = [];
|
|
33
|
+
|
|
34
|
+
for (var _i = 0, _Object$keys = Object.keys(contents); _i < _Object$keys.length; _i++) {
|
|
35
|
+
var key = _Object$keys[_i];
|
|
36
|
+
unzippedFiles[key] = (0, _fflate.strFromU8)(contents[key]);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return unzippedFiles;
|
|
40
|
+
}
|
|
36
41
|
//# sourceMappingURL=unpackXlsxFileBrowser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unpackXlsxFileBrowser.js","names":["unpackXlsxFile","file","
|
|
1
|
+
{"version":3,"file":"unpackXlsxFileBrowser.js","names":["unpackXlsxFile","file","startedAt","Date","now","arrayBuffer","then","fileBuffer","archive","Uint8Array","contents","unzipSync","getContents","unzippedFiles","Object","keys","key","strFromU8"],"sources":["../../source/read/unpackXlsxFileBrowser.js"],"sourcesContent":["import { unzipSync, strFromU8 } from 'fflate'\r\n\r\n/**\r\n * Reads XLSX file in a browser.\r\n * @param {File} file - A `File` object being uploaded in the browser.\r\n * @return {Promise} Resolves to an object holding XLSX file entries.\r\n */\r\nexport default function unpackXlsxFile(file) {\r\n\tconst startedAt = Date.now()\r\n\treturn file.arrayBuffer().then((fileBuffer) => {\r\n\t\tconst archive = new Uint8Array(fileBuffer)\r\n\t\tconst contents = unzipSync(archive)\r\n\t\treturn getContents(contents)\r\n\t\t// return new Promise((resolve, reject) => {\r\n\t\t// \tunzip(archive, (error, contents) => {\r\n\t\t// \t\tif (error) {\r\n\t\t// \t\t\treturn reject(error)\r\n\t\t// \t\t}\r\n\t\t// \t\treturn resolve(getContents(contents))\r\n\t\t// \t})\r\n\t\t// })\r\n\t})\r\n}\r\n\r\nfunction getContents(contents) {\r\n\tconst unzippedFiles = []\r\n\tfor (const key of Object.keys(contents)) {\r\n\t\tunzippedFiles[key] = strFromU8(contents[key])\r\n\t}\r\n\treturn unzippedFiles\r\n}"],"mappings":";;;;;;;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACe,SAASA,cAAT,CAAwBC,IAAxB,EAA8B;EAC5C,IAAMC,SAAS,GAAGC,IAAI,CAACC,GAAL,EAAlB;EACA,OAAOH,IAAI,CAACI,WAAL,GAAmBC,IAAnB,CAAwB,UAACC,UAAD,EAAgB;IAC9C,IAAMC,OAAO,GAAG,IAAIC,UAAJ,CAAeF,UAAf,CAAhB;IACA,IAAMG,QAAQ,GAAG,IAAAC,iBAAA,EAAUH,OAAV,CAAjB;IACA,OAAOI,WAAW,CAACF,QAAD,CAAlB,CAH8C,CAI9C;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACA,CAZM,CAAP;AAaA;;AAED,SAASE,WAAT,CAAqBF,QAArB,EAA+B;EAC9B,IAAMG,aAAa,GAAG,EAAtB;;EACA,gCAAkBC,MAAM,CAACC,IAAP,CAAYL,QAAZ,CAAlB,kCAAyC;IAApC,IAAMM,GAAG,mBAAT;IACJH,aAAa,CAACG,GAAD,CAAb,GAAqB,IAAAC,iBAAA,EAAUP,QAAQ,CAACM,GAAD,CAAlB,CAArB;EACA;;EACD,OAAOH,aAAP;AACA"}
|
|
@@ -107,7 +107,7 @@ export default function parseCellValue(value, type, _ref) {
|
|
|
107
107
|
|
|
108
108
|
var parsedDate = new Date(value);
|
|
109
109
|
|
|
110
|
-
if (isNaN(parsedDate)) {
|
|
110
|
+
if (isNaN(parsedDate.valueOf())) {
|
|
111
111
|
throw new Error("Unsupported \"date\" cell value: ".concat(value));
|
|
112
112
|
}
|
|
113
113
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCellValue.js","names":["parseDate","isDateTimestamp","parseCellValue","value","type","getInlineStringValue","getInlineStringXml","getStyleId","styles","values","properties","options","parseString","undefined","Error","sharedStringIndex","Number","isNaN","length","decodeError","parsedDate","Date","parsedNumber","TypeError","errorCode","trim"],"sources":["../../source/read/parseCellValue.js"],"sourcesContent":["import parseDate from './parseDate.js'\r\nimport isDateTimestamp from './isDateTimestamp.js'\r\n\r\n// Parses a string `value` of a cell.\r\nexport default function parseCellValue(value, type, {\r\n getInlineStringValue,\r\n getInlineStringXml,\r\n getStyleId,\r\n styles,\r\n values,\r\n properties,\r\n options\r\n}) {\r\n if (!type) {\r\n // Default cell type is \"n\" (numeric).\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n type = 'n'\r\n }\r\n\r\n // Available Excel cell types:\r\n // https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\n //\r\n // Some other document (seems to be old):\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n //\r\n switch (type) {\r\n // XLSX tends to store all strings as \"shared\" (indexed) ones\r\n // using \"s\" cell type (for saving on strage space).\r\n // \"str\" cell type is then generally only used for storing\r\n // formula-pre-calculated cell values.\r\n case 'str':\r\n value = parseString(value, options)\r\n break\r\n\r\n // Sometimes, XLSX stores strings as \"inline\" strings rather than \"shared\" (indexed) ones.\r\n // Perhaps the specification doesn't force it to use one or another.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"inlineStr\"><is><t>Test 123</t></is></c></row></sheetData>`.\r\n case 'inlineStr':\r\n value = getInlineStringValue()\r\n if (value === undefined) {\r\n throw new Error(`Unsupported \"inline string\" cell value structure: ${getInlineStringXml()}`)\r\n }\r\n value = parseString(value, options)\r\n break\r\n\r\n // XLSX tends to store string values as \"shared\" (indexed) ones.\r\n // \"Shared\" strings is a way for an Excel editor to reduce\r\n // the file size by storing \"commonly used\" strings in a dictionary\r\n // and then referring to such strings by their index in that dictionary.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"s\"><v>0</v></c></row></sheetData>`.\r\n case 's':\r\n // If a cell has no value then there's no `<c/>` element for it.\r\n // If a `<c/>` element exists then it's not empty.\r\n // The `<v/>`alue is a key in the \"shared strings\" dictionary of the\r\n // XLSX file, so look it up in the `values` dictionary by the numeric key.\r\n const sharedStringIndex = Number(value)\r\n if (isNaN(sharedStringIndex)) {\r\n throw new Error(`Invalid \"shared\" string index: ${value}`)\r\n }\r\n if (sharedStringIndex >= values.length) {\r\n throw new Error(`An out-of-bounds \"shared\" string index: ${value}`)\r\n }\r\n value = values[sharedStringIndex]\r\n value = parseString(value, options)\r\n break\r\n\r\n // Boolean (TRUE/FALSE) values are stored as either \"1\" or \"0\"\r\n // in cells of type \"b\".\r\n case 'b':\r\n if (value === '1') {\r\n value = true\r\n } else if (value === '0') {\r\n value = false\r\n } else {\r\n throw new Error(`Unsupported \"boolean\" cell value: ${value}`)\r\n }\r\n break\r\n\r\n // XLSX specification seems to support cells of type \"z\":\r\n // blank \"stub\" cells that should be ignored by data processing utilities.\r\n case 'z':\r\n value = undefined\r\n break\r\n\r\n // XLSX specification also defines cells of type \"e\" containing a numeric \"error\" code.\r\n // It's not clear what that means though.\r\n // They also wrote: \"and `w` property stores its common name\".\r\n // It's unclear what they meant by that.\r\n case 'e':\r\n value = decodeError(value)\r\n break\r\n\r\n // XLSX supports date cells of type \"d\", though seems like it (almost?) never\r\n // uses it for storing dates, preferring \"n\" numeric timestamp cells instead.\r\n // The value of a \"d\" cell is supposedly a string in \"ISO 8601\" format.\r\n // I haven't seen an XLSX file having such cells.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"d\"><v>2021-06-10T00:47:45.700Z</v></c></row></sheetData>`.\r\n case 'd':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedDate = new Date(value)\r\n if (isNaN(parsedDate)) {\r\n throw new Error(`Unsupported \"date\" cell value: ${value}`)\r\n }\r\n value = parsedDate\r\n break\r\n\r\n // Numeric cells have type \"n\".\r\n case 'n':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedNumber = Number(value)\r\n if (isNaN(parsedNumber)) {\r\n throw new Error(`Invalid \"numeric\" cell value: ${value}`)\r\n }\r\n value = parsedNumber\r\n // XLSX does have \"d\" type for dates, but it's not commonly used.\r\n // Instead, it prefers using \"n\" type for storing dates as timestamps.\r\n if (isDateTimestamp(value, getStyleId(), styles, options)) {\r\n // Parse the number as a date timestamp.\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n\r\n default:\r\n throw new TypeError(`Cell type not supported: ${type}`)\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return value\r\n}\r\n\r\n// Decodes numeric error code to a string code.\r\n// https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\nfunction decodeError(errorCode) {\r\n // While the error values are determined by the application,\r\n // the following are some example error values that could be used:\r\n switch (errorCode) {\r\n case 0x00:\r\n return '#NULL!'\r\n case 0x07:\r\n return '#DIV/0!'\r\n case 0x0F:\r\n return '#VALUE!'\r\n case 0x17:\r\n return '#REF!'\r\n case 0x1D:\r\n return '#NAME?'\r\n case 0x24:\r\n return '#NUM!'\r\n case 0x2A:\r\n return '#N/A'\r\n case 0x2B:\r\n return '#GETTING_DATA'\r\n default:\r\n // Such error code doesn't exist. I made it up.\r\n return `#ERROR_${errorCode}`\r\n }\r\n}\r\n\r\nfunction parseString(value, options) {\r\n // In some weird cases, a developer might want to disable\r\n // the automatic trimming of all strings.\r\n // For example, leading spaces might express a tree-like hierarchy.\r\n // https://github.com/catamphetamine/read-excel-file/pull/106#issuecomment-1136062917\r\n if (options.trim !== false) {\r\n value = value.trim()\r\n }\r\n if (value === '') {\r\n value = undefined\r\n }\r\n return value\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parseCellValue.js","names":["parseDate","isDateTimestamp","parseCellValue","value","type","getInlineStringValue","getInlineStringXml","getStyleId","styles","values","properties","options","parseString","undefined","Error","sharedStringIndex","Number","isNaN","length","decodeError","parsedDate","Date","valueOf","parsedNumber","TypeError","errorCode","trim"],"sources":["../../source/read/parseCellValue.js"],"sourcesContent":["import parseDate from './parseDate.js'\r\nimport isDateTimestamp from './isDateTimestamp.js'\r\n\r\n// Parses a string `value` of a cell.\r\nexport default function parseCellValue(value, type, {\r\n getInlineStringValue,\r\n getInlineStringXml,\r\n getStyleId,\r\n styles,\r\n values,\r\n properties,\r\n options\r\n}) {\r\n if (!type) {\r\n // Default cell type is \"n\" (numeric).\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n type = 'n'\r\n }\r\n\r\n // Available Excel cell types:\r\n // https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\n //\r\n // Some other document (seems to be old):\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n //\r\n switch (type) {\r\n // XLSX tends to store all strings as \"shared\" (indexed) ones\r\n // using \"s\" cell type (for saving on strage space).\r\n // \"str\" cell type is then generally only used for storing\r\n // formula-pre-calculated cell values.\r\n case 'str':\r\n value = parseString(value, options)\r\n break\r\n\r\n // Sometimes, XLSX stores strings as \"inline\" strings rather than \"shared\" (indexed) ones.\r\n // Perhaps the specification doesn't force it to use one or another.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"inlineStr\"><is><t>Test 123</t></is></c></row></sheetData>`.\r\n case 'inlineStr':\r\n value = getInlineStringValue()\r\n if (value === undefined) {\r\n throw new Error(`Unsupported \"inline string\" cell value structure: ${getInlineStringXml()}`)\r\n }\r\n value = parseString(value, options)\r\n break\r\n\r\n // XLSX tends to store string values as \"shared\" (indexed) ones.\r\n // \"Shared\" strings is a way for an Excel editor to reduce\r\n // the file size by storing \"commonly used\" strings in a dictionary\r\n // and then referring to such strings by their index in that dictionary.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"s\"><v>0</v></c></row></sheetData>`.\r\n case 's':\r\n // If a cell has no value then there's no `<c/>` element for it.\r\n // If a `<c/>` element exists then it's not empty.\r\n // The `<v/>`alue is a key in the \"shared strings\" dictionary of the\r\n // XLSX file, so look it up in the `values` dictionary by the numeric key.\r\n const sharedStringIndex = Number(value)\r\n if (isNaN(sharedStringIndex)) {\r\n throw new Error(`Invalid \"shared\" string index: ${value}`)\r\n }\r\n if (sharedStringIndex >= values.length) {\r\n throw new Error(`An out-of-bounds \"shared\" string index: ${value}`)\r\n }\r\n value = values[sharedStringIndex]\r\n value = parseString(value, options)\r\n break\r\n\r\n // Boolean (TRUE/FALSE) values are stored as either \"1\" or \"0\"\r\n // in cells of type \"b\".\r\n case 'b':\r\n if (value === '1') {\r\n value = true\r\n } else if (value === '0') {\r\n value = false\r\n } else {\r\n throw new Error(`Unsupported \"boolean\" cell value: ${value}`)\r\n }\r\n break\r\n\r\n // XLSX specification seems to support cells of type \"z\":\r\n // blank \"stub\" cells that should be ignored by data processing utilities.\r\n case 'z':\r\n value = undefined\r\n break\r\n\r\n // XLSX specification also defines cells of type \"e\" containing a numeric \"error\" code.\r\n // It's not clear what that means though.\r\n // They also wrote: \"and `w` property stores its common name\".\r\n // It's unclear what they meant by that.\r\n case 'e':\r\n value = decodeError(value)\r\n break\r\n\r\n // XLSX supports date cells of type \"d\", though seems like it (almost?) never\r\n // uses it for storing dates, preferring \"n\" numeric timestamp cells instead.\r\n // The value of a \"d\" cell is supposedly a string in \"ISO 8601\" format.\r\n // I haven't seen an XLSX file having such cells.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"d\"><v>2021-06-10T00:47:45.700Z</v></c></row></sheetData>`.\r\n case 'd':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedDate = new Date(value)\r\n if (isNaN(parsedDate.valueOf())) {\r\n throw new Error(`Unsupported \"date\" cell value: ${value}`)\r\n }\r\n value = parsedDate\r\n break\r\n\r\n // Numeric cells have type \"n\".\r\n case 'n':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedNumber = Number(value)\r\n if (isNaN(parsedNumber)) {\r\n throw new Error(`Invalid \"numeric\" cell value: ${value}`)\r\n }\r\n value = parsedNumber\r\n // XLSX does have \"d\" type for dates, but it's not commonly used.\r\n // Instead, it prefers using \"n\" type for storing dates as timestamps.\r\n if (isDateTimestamp(value, getStyleId(), styles, options)) {\r\n // Parse the number as a date timestamp.\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n\r\n default:\r\n throw new TypeError(`Cell type not supported: ${type}`)\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return value\r\n}\r\n\r\n// Decodes numeric error code to a string code.\r\n// https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\nfunction decodeError(errorCode) {\r\n // While the error values are determined by the application,\r\n // the following are some example error values that could be used:\r\n switch (errorCode) {\r\n case 0x00:\r\n return '#NULL!'\r\n case 0x07:\r\n return '#DIV/0!'\r\n case 0x0F:\r\n return '#VALUE!'\r\n case 0x17:\r\n return '#REF!'\r\n case 0x1D:\r\n return '#NAME?'\r\n case 0x24:\r\n return '#NUM!'\r\n case 0x2A:\r\n return '#N/A'\r\n case 0x2B:\r\n return '#GETTING_DATA'\r\n default:\r\n // Such error code doesn't exist. I made it up.\r\n return `#ERROR_${errorCode}`\r\n }\r\n}\r\n\r\nfunction parseString(value, options) {\r\n // In some weird cases, a developer might want to disable\r\n // the automatic trimming of all strings.\r\n // For example, leading spaces might express a tree-like hierarchy.\r\n // https://github.com/catamphetamine/read-excel-file/pull/106#issuecomment-1136062917\r\n if (options.trim !== false) {\r\n value = value.trim()\r\n }\r\n if (value === '') {\r\n value = undefined\r\n }\r\n return value\r\n}"],"mappings":"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"}
|
|
@@ -426,7 +426,7 @@ function parseValueOfType(value, type, options) {
|
|
|
426
426
|
// Sometimes a date can be heuristically detected.
|
|
427
427
|
// https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777
|
|
428
428
|
if (value instanceof Date) {
|
|
429
|
-
if (isNaN(value)) {
|
|
429
|
+
if (isNaN(value.valueOf())) {
|
|
430
430
|
return {
|
|
431
431
|
error: 'invalid',
|
|
432
432
|
reason: 'out_of_bounds'
|
|
@@ -455,7 +455,7 @@ function parseValueOfType(value, type, options) {
|
|
|
455
455
|
|
|
456
456
|
var date = parseDate(value, options.properties);
|
|
457
457
|
|
|
458
|
-
if (isNaN(date)) {
|
|
458
|
+
if (isNaN(date.valueOf())) {
|
|
459
459
|
return {
|
|
460
460
|
error: 'invalid',
|
|
461
461
|
reason: 'out_of_bounds'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertToJson.js","names":["parseDate","Integer","isInteger","URL","isURL","Email","isEmail","DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","ignoreEmptyRows","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","isEmptyObject","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","reason","notEmpty","array","parseArray","map","_value","parseValue","required","column","includeNullValues","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","isNaN","isFinite","Number","stringifiedValue","Date","date","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"sources":["../../../source/read/schema/convertToJson.js"],"sourcesContent":["import parseDate from '../parseDate.js'\r\n\r\nimport Integer, { isInteger } from '../../types/Integer.js'\r\nimport URL, { isURL } from '../../types/URL.js'\r\nimport Email, { isEmail } from '../../types/Email.js'\r\n\r\nconst DEFAULT_OPTIONS = {\r\n isColumnOriented: false\r\n}\r\n\r\n/**\r\n * Convert 2D array to nested objects.\r\n * If row oriented data, row 0 is dotted key names.\r\n * Column oriented data is transposed.\r\n * @param {any[][]} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @return {object[]}\r\n */\r\nexport default function(data, schema, options) {\r\n if (options) {\r\n options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n options = DEFAULT_OPTIONS\r\n }\r\n\r\n const {\r\n isColumnOriented,\r\n rowMap,\r\n ignoreEmptyRows\r\n } = options\r\n\r\n validateSchema(schema)\r\n\r\n if (isColumnOriented) {\r\n data = transpose(data)\r\n }\r\n\r\n const columns = data[0]\r\n\r\n const results = []\r\n const errors = []\r\n\r\n for (let i = 1; i < data.length; i++) {\r\n const result = read(schema, data[i], i, columns, errors, options)\r\n if (result !== null || ignoreEmptyRows === false) {\r\n results.push(result)\r\n }\r\n }\r\n\r\n // Correct error rows.\r\n if (rowMap) {\r\n for (const error of errors) {\r\n // Convert the `row` index in `data` to the\r\n // actual `row` index in the spreadsheet.\r\n // `- 1` converts row number to row index.\r\n // `+ 1` converts row index to row number.\r\n error.row = rowMap[error.row - 1] + 1\r\n }\r\n }\r\n\r\n return {\r\n rows: results,\r\n errors\r\n }\r\n}\r\n\r\nfunction read(schema, row, rowIndex, columns, errors, options) {\r\n const object = {}\r\n let isEmptyObject = true\r\n for (const key of Object.keys(schema)) {\r\n const schemaEntry = schema[key]\r\n const isNestedSchema = typeof schemaEntry.type === 'object' && !Array.isArray(schemaEntry.type)\r\n let rawValue = row[columns.indexOf(key)]\r\n if (rawValue === undefined) {\r\n rawValue = null\r\n }\r\n let value\r\n let error\r\n let reason\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, columns, errors, options)\r\n } else {\r\n if (rawValue === null) {\r\n value = null\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n let notEmpty = false\r\n const array = parseArray(rawValue).map((_value) => {\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n value = _value\r\n error = result.error\r\n reason = result.reason\r\n }\r\n if (result.value !== null) {\r\n notEmpty = true\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n value = notEmpty ? array : null\r\n }\r\n } else {\r\n const result = parseValue(rawValue, schemaEntry, options)\r\n error = result.error\r\n reason = result.reason\r\n value = error ? rawValue : result.value\r\n }\r\n }\r\n if (!error && value === null && schemaEntry.required) {\r\n error = 'required'\r\n }\r\n if (error) {\r\n error = {\r\n error,\r\n row: rowIndex + 1,\r\n column: key,\r\n value\r\n }\r\n if (reason) {\r\n error.reason = reason\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else {\r\n if (isEmptyObject && value !== null) {\r\n isEmptyObject = false\r\n }\r\n if (value !== null || options.includeNullValues) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n }\r\n if (isEmptyObject) {\r\n return null\r\n }\r\n return object\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {object} schemaEntry\r\n * @return {{ value: any, error: string }}\r\n */\r\nexport function parseValue(value, schemaEntry, options) {\r\n if (value === null) {\r\n return { value: null }\r\n }\r\n let result\r\n if (schemaEntry.parse) {\r\n result = parseCustomValue(value, schemaEntry.parse)\r\n } else if (schemaEntry.type) {\r\n result = parseValueOfType(\r\n value,\r\n // Supports parsing array types.\r\n // See `parseArray()` function for more details.\r\n // Example `type`: String[]\r\n // Input: 'Barack Obama, \"String, with, colons\", Donald Trump'\r\n // Output: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type,\r\n options\r\n )\r\n } else {\r\n result = { value: value }\r\n // throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid', reason: 'unknown' }\r\n }\r\n if (schemaEntry.validate) {\r\n try {\r\n schemaEntry.validate(result.value)\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {any} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string, reason?: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n if (typeof value === 'string') {\r\n return { value }\r\n }\r\n // Excel tends to perform a forced automatic convertion of string-type values\r\n // to number-type ones when the user has input them. Otherwise, users wouldn't\r\n // be able to perform formula calculations on those cell values because users\r\n // won't bother manually choosing a \"numeric\" cell type for each cell, and\r\n // even if they did, choosing a \"numeric\" cell type every time wouldn't be an\r\n // acceptable \"user experience\".\r\n //\r\n // So, if a cell value is supposed to be a string and Excel has automatically\r\n // converted it to a number, perform a backwards conversion.\r\n //\r\n if (typeof value === 'number') {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: String(value) }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Number:\r\n case Integer:\r\n // An XLSX file editing software might not always correctly\r\n // detect numeric values in string-type cells. Users won't bother\r\n // manually selecting a cell type, so the editing software has to guess\r\n // based on the user's input. One can assume that such auto-detection\r\n // might not always work.\r\n //\r\n // So, if a cell is supposed to be a numeric one, convert a string value to a number.\r\n //\r\n if (typeof value === 'string') {\r\n const stringifiedValue = value\r\n value = Number(value)\r\n if (String(value) !== stringifiedValue) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n }\r\n if (typeof value !== 'number') {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n // At this point, `value` can only be a number.\r\n //\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid', reason: 'not_an_integer' }\r\n }\r\n return { value }\r\n\r\n case URL:\r\n if (typeof value === 'string') {\r\n if (isURL(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_url' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Email:\r\n if (typeof value === 'string') {\r\n if (isEmail(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_an_email' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Date:\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n if (value instanceof Date) {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n const date = parseDate(value, options.properties)\r\n if (isNaN(date)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid', reason: 'not_a_date' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_boolean' }\r\n\r\n default:\r\n if (typeof type === 'function') {\r\n return parseCustomValue(value, type)\r\n }\r\n throw new Error(`Unknown schema type: ${type && type.name || type}`)\r\n }\r\n}\r\n\r\nexport function getBlock(string, endCharacter, startIndex) {\r\n let i = 0\r\n let substring = ''\r\n let character\r\n while (startIndex + i < string.length) {\r\n const character = string[startIndex + i]\r\n if (character === endCharacter) {\r\n return [substring, i]\r\n }\r\n else if (character === '\"') {\r\n const block = getBlock(string, '\"', startIndex + i + 1)\r\n substring += block[0]\r\n i += '\"'.length + block[1] + '\"'.length\r\n }\r\n else {\r\n substring += character\r\n i++\r\n }\r\n }\r\n return [substring, i]\r\n}\r\n\r\n/**\r\n * Parses a string of comma-separated substrings into an array of substrings.\r\n * (the `export` is just for tests)\r\n * @param {string} string — A string of comma-separated substrings.\r\n * @return {string[]} An array of substrings.\r\n */\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convertToJson.js","names":["parseDate","Integer","isInteger","URL","isURL","Email","isEmail","DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","ignoreEmptyRows","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","isEmptyObject","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","reason","notEmpty","array","parseArray","map","_value","parseValue","required","column","includeNullValues","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","isNaN","isFinite","Number","stringifiedValue","Date","valueOf","date","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"sources":["../../../source/read/schema/convertToJson.js"],"sourcesContent":["import parseDate from '../parseDate.js'\r\n\r\nimport Integer, { isInteger } from '../../types/Integer.js'\r\nimport URL, { isURL } from '../../types/URL.js'\r\nimport Email, { isEmail } from '../../types/Email.js'\r\n\r\nconst DEFAULT_OPTIONS = {\r\n isColumnOriented: false\r\n}\r\n\r\n/**\r\n * Convert 2D array to nested objects.\r\n * If row oriented data, row 0 is dotted key names.\r\n * Column oriented data is transposed.\r\n * @param {any[][]} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @return {object[]}\r\n */\r\nexport default function(data, schema, options) {\r\n if (options) {\r\n options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n options = DEFAULT_OPTIONS\r\n }\r\n\r\n const {\r\n isColumnOriented,\r\n rowMap,\r\n ignoreEmptyRows\r\n } = options\r\n\r\n validateSchema(schema)\r\n\r\n if (isColumnOriented) {\r\n data = transpose(data)\r\n }\r\n\r\n const columns = data[0]\r\n\r\n const results = []\r\n const errors = []\r\n\r\n for (let i = 1; i < data.length; i++) {\r\n const result = read(schema, data[i], i, columns, errors, options)\r\n if (result !== null || ignoreEmptyRows === false) {\r\n results.push(result)\r\n }\r\n }\r\n\r\n // Correct error rows.\r\n if (rowMap) {\r\n for (const error of errors) {\r\n // Convert the `row` index in `data` to the\r\n // actual `row` index in the spreadsheet.\r\n // `- 1` converts row number to row index.\r\n // `+ 1` converts row index to row number.\r\n error.row = rowMap[error.row - 1] + 1\r\n }\r\n }\r\n\r\n return {\r\n rows: results,\r\n errors\r\n }\r\n}\r\n\r\nfunction read(schema, row, rowIndex, columns, errors, options) {\r\n const object = {}\r\n let isEmptyObject = true\r\n for (const key of Object.keys(schema)) {\r\n const schemaEntry = schema[key]\r\n const isNestedSchema = typeof schemaEntry.type === 'object' && !Array.isArray(schemaEntry.type)\r\n let rawValue = row[columns.indexOf(key)]\r\n if (rawValue === undefined) {\r\n rawValue = null\r\n }\r\n let value\r\n let error\r\n let reason\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, columns, errors, options)\r\n } else {\r\n if (rawValue === null) {\r\n value = null\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n let notEmpty = false\r\n const array = parseArray(rawValue).map((_value) => {\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n value = _value\r\n error = result.error\r\n reason = result.reason\r\n }\r\n if (result.value !== null) {\r\n notEmpty = true\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n value = notEmpty ? array : null\r\n }\r\n } else {\r\n const result = parseValue(rawValue, schemaEntry, options)\r\n error = result.error\r\n reason = result.reason\r\n value = error ? rawValue : result.value\r\n }\r\n }\r\n if (!error && value === null && schemaEntry.required) {\r\n error = 'required'\r\n }\r\n if (error) {\r\n error = {\r\n error,\r\n row: rowIndex + 1,\r\n column: key,\r\n value\r\n }\r\n if (reason) {\r\n error.reason = reason\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else {\r\n if (isEmptyObject && value !== null) {\r\n isEmptyObject = false\r\n }\r\n if (value !== null || options.includeNullValues) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n }\r\n if (isEmptyObject) {\r\n return null\r\n }\r\n return object\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {object} schemaEntry\r\n * @return {{ value: any, error: string }}\r\n */\r\nexport function parseValue(value, schemaEntry, options) {\r\n if (value === null) {\r\n return { value: null }\r\n }\r\n let result\r\n if (schemaEntry.parse) {\r\n result = parseCustomValue(value, schemaEntry.parse)\r\n } else if (schemaEntry.type) {\r\n result = parseValueOfType(\r\n value,\r\n // Supports parsing array types.\r\n // See `parseArray()` function for more details.\r\n // Example `type`: String[]\r\n // Input: 'Barack Obama, \"String, with, colons\", Donald Trump'\r\n // Output: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type,\r\n options\r\n )\r\n } else {\r\n result = { value: value }\r\n // throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid', reason: 'unknown' }\r\n }\r\n if (schemaEntry.validate) {\r\n try {\r\n schemaEntry.validate(result.value)\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {any} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string, reason?: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n if (typeof value === 'string') {\r\n return { value }\r\n }\r\n // Excel tends to perform a forced automatic convertion of string-type values\r\n // to number-type ones when the user has input them. Otherwise, users wouldn't\r\n // be able to perform formula calculations on those cell values because users\r\n // won't bother manually choosing a \"numeric\" cell type for each cell, and\r\n // even if they did, choosing a \"numeric\" cell type every time wouldn't be an\r\n // acceptable \"user experience\".\r\n //\r\n // So, if a cell value is supposed to be a string and Excel has automatically\r\n // converted it to a number, perform a backwards conversion.\r\n //\r\n if (typeof value === 'number') {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: String(value) }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Number:\r\n case Integer:\r\n // An XLSX file editing software might not always correctly\r\n // detect numeric values in string-type cells. Users won't bother\r\n // manually selecting a cell type, so the editing software has to guess\r\n // based on the user's input. One can assume that such auto-detection\r\n // might not always work.\r\n //\r\n // So, if a cell is supposed to be a numeric one, convert a string value to a number.\r\n //\r\n if (typeof value === 'string') {\r\n const stringifiedValue = value\r\n value = Number(value)\r\n if (String(value) !== stringifiedValue) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n }\r\n if (typeof value !== 'number') {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n // At this point, `value` can only be a number.\r\n //\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid', reason: 'not_an_integer' }\r\n }\r\n return { value }\r\n\r\n case URL:\r\n if (typeof value === 'string') {\r\n if (isURL(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_url' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Email:\r\n if (typeof value === 'string') {\r\n if (isEmail(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_an_email' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Date:\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n if (value instanceof Date) {\r\n if (isNaN(value.valueOf())) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'invalid_number' }\r\n }\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n const date = parseDate(value, options.properties)\r\n if (isNaN(date.valueOf())) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid', reason: 'not_a_date' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_boolean' }\r\n\r\n default:\r\n if (typeof type === 'function') {\r\n return parseCustomValue(value, type)\r\n }\r\n throw new Error(`Unknown schema type: ${type && type.name || type}`)\r\n }\r\n}\r\n\r\nexport function getBlock(string, endCharacter, startIndex) {\r\n let i = 0\r\n let substring = ''\r\n let character\r\n while (startIndex + i < string.length) {\r\n const character = string[startIndex + i]\r\n if (character === endCharacter) {\r\n return [substring, i]\r\n }\r\n else if (character === '\"') {\r\n const block = getBlock(string, '\"', startIndex + i + 1)\r\n substring += block[0]\r\n i += '\"'.length + block[1] + '\"'.length\r\n }\r\n else {\r\n substring += character\r\n i++\r\n }\r\n }\r\n return [substring, i]\r\n}\r\n\r\n/**\r\n * Parses a string of comma-separated substrings into an array of substrings.\r\n * (the `export` is just for tests)\r\n * @param {string} string — A string of comma-separated substrings.\r\n * @return {string[]} An array of substrings.\r\n */\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"],"mappings":"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"}
|
|
@@ -1,27 +1,34 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { unzipSync, strFromU8 } from 'fflate';
|
|
2
2
|
/**
|
|
3
3
|
* Reads XLSX file in a browser.
|
|
4
|
-
* @param {
|
|
4
|
+
* @param {File} file - A `File` object being uploaded in the browser.
|
|
5
5
|
* @return {Promise} Resolves to an object holding XLSX file entries.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
export default function unpackXlsxFile(file) {
|
|
9
|
-
var
|
|
10
|
-
return
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
});
|
|
22
|
-
})).then(function () {
|
|
23
|
-
return entries;
|
|
24
|
-
});
|
|
9
|
+
var startedAt = Date.now();
|
|
10
|
+
return file.arrayBuffer().then(function (fileBuffer) {
|
|
11
|
+
var archive = new Uint8Array(fileBuffer);
|
|
12
|
+
var contents = unzipSync(archive);
|
|
13
|
+
return getContents(contents); // return new Promise((resolve, reject) => {
|
|
14
|
+
// unzip(archive, (error, contents) => {
|
|
15
|
+
// if (error) {
|
|
16
|
+
// return reject(error)
|
|
17
|
+
// }
|
|
18
|
+
// return resolve(getContents(contents))
|
|
19
|
+
// })
|
|
20
|
+
// })
|
|
25
21
|
});
|
|
26
22
|
}
|
|
23
|
+
|
|
24
|
+
function getContents(contents) {
|
|
25
|
+
var unzippedFiles = [];
|
|
26
|
+
|
|
27
|
+
for (var _i = 0, _Object$keys = Object.keys(contents); _i < _Object$keys.length; _i++) {
|
|
28
|
+
var key = _Object$keys[_i];
|
|
29
|
+
unzippedFiles[key] = strFromU8(contents[key]);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return unzippedFiles;
|
|
33
|
+
}
|
|
27
34
|
//# sourceMappingURL=unpackXlsxFileBrowser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unpackXlsxFileBrowser.js","names":["
|
|
1
|
+
{"version":3,"file":"unpackXlsxFileBrowser.js","names":["unzipSync","strFromU8","unpackXlsxFile","file","startedAt","Date","now","arrayBuffer","then","fileBuffer","archive","Uint8Array","contents","getContents","unzippedFiles","Object","keys","key"],"sources":["../../source/read/unpackXlsxFileBrowser.js"],"sourcesContent":["import { unzipSync, strFromU8 } from 'fflate'\r\n\r\n/**\r\n * Reads XLSX file in a browser.\r\n * @param {File} file - A `File` object being uploaded in the browser.\r\n * @return {Promise} Resolves to an object holding XLSX file entries.\r\n */\r\nexport default function unpackXlsxFile(file) {\r\n\tconst startedAt = Date.now()\r\n\treturn file.arrayBuffer().then((fileBuffer) => {\r\n\t\tconst archive = new Uint8Array(fileBuffer)\r\n\t\tconst contents = unzipSync(archive)\r\n\t\treturn getContents(contents)\r\n\t\t// return new Promise((resolve, reject) => {\r\n\t\t// \tunzip(archive, (error, contents) => {\r\n\t\t// \t\tif (error) {\r\n\t\t// \t\t\treturn reject(error)\r\n\t\t// \t\t}\r\n\t\t// \t\treturn resolve(getContents(contents))\r\n\t\t// \t})\r\n\t\t// })\r\n\t})\r\n}\r\n\r\nfunction getContents(contents) {\r\n\tconst unzippedFiles = []\r\n\tfor (const key of Object.keys(contents)) {\r\n\t\tunzippedFiles[key] = strFromU8(contents[key])\r\n\t}\r\n\treturn unzippedFiles\r\n}"],"mappings":"AAAA,SAASA,SAAT,EAAoBC,SAApB,QAAqC,QAArC;AAEA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,cAAT,CAAwBC,IAAxB,EAA8B;EAC5C,IAAMC,SAAS,GAAGC,IAAI,CAACC,GAAL,EAAlB;EACA,OAAOH,IAAI,CAACI,WAAL,GAAmBC,IAAnB,CAAwB,UAACC,UAAD,EAAgB;IAC9C,IAAMC,OAAO,GAAG,IAAIC,UAAJ,CAAeF,UAAf,CAAhB;IACA,IAAMG,QAAQ,GAAGZ,SAAS,CAACU,OAAD,CAA1B;IACA,OAAOG,WAAW,CAACD,QAAD,CAAlB,CAH8C,CAI9C;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACA,CAZM,CAAP;AAaA;;AAED,SAASC,WAAT,CAAqBD,QAArB,EAA+B;EAC9B,IAAME,aAAa,GAAG,EAAtB;;EACA,gCAAkBC,MAAM,CAACC,IAAP,CAAYJ,QAAZ,CAAlB,kCAAyC;IAApC,IAAMK,GAAG,mBAAT;IACJH,aAAa,CAACG,GAAD,CAAb,GAAqBhB,SAAS,CAACW,QAAQ,CAACK,GAAD,CAAT,CAA9B;EACA;;EACD,OAAOH,aAAP;AACA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "read-excel-file",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.5.0",
|
|
4
4
|
"description": "Read small to medium `*.xlsx` files in a browser or Node.js. Parse to JSON with a strict schema.",
|
|
5
5
|
"module": "index.js",
|
|
6
6
|
"main": "index.cjs",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@xmldom/xmldom": "^0.8.2",
|
|
46
|
-
"
|
|
46
|
+
"fflate": "^0.7.3",
|
|
47
47
|
"unzipper": "^0.10.11"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|