read-excel-file 7.0.2 → 8.0.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 +37 -0
- package/README.md +212 -205
- package/browser/index.cjs +8 -5
- package/browser/index.d.ts +58 -16
- package/browser/index.js +7 -5
- package/browser/input.d.ts +1 -0
- package/bundle/read-excel-file.min.js +1 -1
- package/bundle/read-excel-file.min.js.map +1 -1
- package/commonjs/export/parseSheet.js +20 -0
- package/commonjs/export/parseSheet.js.map +1 -0
- package/commonjs/export/readSheetBrowser.js +29 -0
- package/commonjs/export/readSheetBrowser.js.map +1 -0
- package/commonjs/export/readSheetNode.js +29 -0
- package/commonjs/export/readSheetNode.js.map +1 -0
- package/commonjs/export/readSheetUniversal.js +29 -0
- package/commonjs/export/readSheetUniversal.js.map +1 -0
- package/commonjs/export/readSheetWebWorker.js +29 -0
- package/commonjs/export/readSheetWebWorker.js.map +1 -0
- package/commonjs/export/readXlsxFileBrowser.js +6 -8
- package/commonjs/export/readXlsxFileBrowser.js.map +1 -1
- package/commonjs/export/readXlsxFileNode.js +7 -9
- package/commonjs/export/readXlsxFileNode.js.map +1 -1
- package/commonjs/export/readXlsxFileUniversal.js +7 -9
- package/commonjs/export/readXlsxFileUniversal.js.map +1 -1
- package/commonjs/export/readXlsxFileWebWorker.js +6 -8
- package/commonjs/export/readXlsxFileWebWorker.js.map +1 -1
- package/commonjs/export/unpackXlsxFileBrowser.js +2 -1
- package/commonjs/export/unpackXlsxFileBrowser.js.map +1 -1
- package/commonjs/export/unpackXlsxFileNode.js +4 -3
- package/commonjs/export/unpackXlsxFileNode.js.map +1 -1
- package/commonjs/export/unpackXlsxFileUniversal.js +13 -3
- package/commonjs/export/unpackXlsxFileUniversal.js.map +1 -1
- package/commonjs/parseData/InvalidError.js.map +1 -0
- package/commonjs/parseData/parseData.js +503 -0
- package/commonjs/parseData/parseData.js.map +1 -0
- package/commonjs/parseData/parseData.test.js.map +1 -0
- package/commonjs/{types → parseData/types}/Boolean.js +1 -1
- package/commonjs/parseData/types/Boolean.js.map +1 -0
- package/commonjs/parseData/types/Date.js +21 -0
- package/commonjs/parseData/types/Date.js.map +1 -0
- package/commonjs/{types → parseData/types}/Number.js +1 -1
- package/commonjs/parseData/types/Number.js.map +1 -0
- package/commonjs/{types → parseData/types}/String.js +1 -1
- package/commonjs/parseData/types/String.js.map +1 -0
- package/commonjs/{types → parseData/types/additional}/Email.js +3 -3
- package/commonjs/parseData/types/additional/Email.js.map +1 -0
- package/commonjs/parseData/types/additional/Email.test.js.map +1 -0
- package/commonjs/{types → parseData/types/additional}/Integer.js +2 -2
- package/commonjs/parseData/types/additional/Integer.js.map +1 -0
- package/commonjs/parseData/types/additional/Integer.test.js.map +1 -0
- package/commonjs/{types → parseData/types/additional}/URL.js +3 -3
- package/commonjs/parseData/types/additional/URL.js.map +1 -0
- package/commonjs/parseData/types/additional/URL.test.js.map +1 -0
- package/commonjs/xlsx/{getData.js → convertCellsToData2dArray.js} +16 -37
- package/commonjs/xlsx/convertCellsToData2dArray.js.map +1 -0
- package/commonjs/xlsx/{isDateTimestamp.js → isDateFormat.js} +58 -56
- package/commonjs/xlsx/isDateFormat.js.map +1 -0
- package/commonjs/xlsx/isDateFormat.test.js.map +1 -0
- package/commonjs/xlsx/isDateFormatStyle.js +193 -0
- package/commonjs/xlsx/isDateFormatStyle.js.map +1 -0
- package/commonjs/xlsx/parseCell.js +16 -18
- package/commonjs/xlsx/parseCell.js.map +1 -1
- package/commonjs/xlsx/parseCellCoordinates.js +44 -0
- package/commonjs/xlsx/parseCellCoordinates.js.map +1 -0
- package/commonjs/xlsx/parseCellValue.js +14 -11
- package/commonjs/xlsx/parseCellValue.js.map +1 -1
- package/commonjs/xlsx/parseCells.js +14 -6
- package/commonjs/xlsx/parseCells.js.map +1 -1
- package/commonjs/xlsx/parseExcelDate.js +139 -0
- package/commonjs/xlsx/parseExcelDate.js.map +1 -0
- package/commonjs/xlsx/parseExcelDate.test.js.map +1 -0
- package/commonjs/xlsx/parseSheet.js +9 -11
- package/commonjs/xlsx/parseSheet.js.map +1 -1
- package/commonjs/xlsx/{parseDimensions.js → parseSheetDimensions.js} +7 -6
- package/commonjs/xlsx/parseSheetDimensions.js.map +1 -0
- package/commonjs/xlsx/parseSpreadsheetContents.js +96 -0
- package/commonjs/xlsx/parseSpreadsheetContents.js.map +1 -0
- package/commonjs/xlsx/parseSpreadsheetInfo.js +47 -0
- package/commonjs/xlsx/parseSpreadsheetInfo.js.map +1 -0
- package/commonjs/xlsx/reconstructSheetDimensionsFromSheetCells.js +29 -0
- package/commonjs/xlsx/reconstructSheetDimensionsFromSheetCells.js.map +1 -0
- package/commonjs/xml/xlsx.js +9 -9
- package/commonjs/xml/xlsx.js.map +1 -1
- package/commonjs/xml/xpath/xlsx-xpath.js +8 -8
- package/commonjs/xml/xpath/xlsx-xpath.js.map +1 -1
- package/commonjs/xml/xpath/xpathBrowser.js +4 -4
- package/commonjs/xml/xpath/xpathBrowser.js.map +1 -1
- package/commonjs/xml/xpath/xpathNode.js +2 -2
- package/commonjs/xml/xpath/xpathNode.js.map +1 -1
- package/modules/export/parseSheet.js +13 -0
- package/modules/export/parseSheet.js.map +1 -0
- package/modules/export/readSheetBrowser.js +23 -0
- package/modules/export/readSheetBrowser.js.map +1 -0
- package/modules/export/readSheetNode.js +23 -0
- package/modules/export/readSheetNode.js.map +1 -0
- package/modules/export/readSheetUniversal.js +23 -0
- package/modules/export/readSheetUniversal.js.map +1 -0
- package/modules/export/readSheetWebWorker.js +23 -0
- package/modules/export/readSheetWebWorker.js.map +1 -0
- package/modules/export/readXlsxFileBrowser.js +6 -8
- package/modules/export/readXlsxFileBrowser.js.map +1 -1
- package/modules/export/readXlsxFileNode.js +7 -9
- package/modules/export/readXlsxFileNode.js.map +1 -1
- package/modules/export/readXlsxFileUniversal.js +7 -9
- package/modules/export/readXlsxFileUniversal.js.map +1 -1
- package/modules/export/readXlsxFileWebWorker.js +6 -8
- package/modules/export/readXlsxFileWebWorker.js.map +1 -1
- package/modules/export/unpackXlsxFileBrowser.js +3 -1
- package/modules/export/unpackXlsxFileBrowser.js.map +1 -1
- package/modules/export/unpackXlsxFileNode.js +4 -3
- package/modules/export/unpackXlsxFileNode.js.map +1 -1
- package/modules/export/unpackXlsxFileUniversal.js +13 -3
- package/modules/export/unpackXlsxFileUniversal.js.map +1 -1
- package/modules/parseData/InvalidError.js.map +1 -0
- package/modules/parseData/parseData.js +494 -0
- package/modules/parseData/parseData.js.map +1 -0
- package/modules/parseData/parseData.test.js.map +1 -0
- package/modules/{types → parseData/types}/Boolean.js +1 -1
- package/modules/parseData/types/Boolean.js.map +1 -0
- package/modules/parseData/types/Date.js +14 -0
- package/modules/parseData/types/Date.js.map +1 -0
- package/modules/{types → parseData/types}/Number.js +1 -1
- package/modules/parseData/types/Number.js.map +1 -0
- package/modules/{types → parseData/types}/String.js +1 -1
- package/modules/parseData/types/String.js.map +1 -0
- package/modules/{types → parseData/types/additional}/Email.js +3 -3
- package/modules/parseData/types/additional/Email.js.map +1 -0
- package/modules/parseData/types/additional/Email.test.js.map +1 -0
- package/modules/{types → parseData/types/additional}/Integer.js +2 -2
- package/modules/parseData/types/additional/Integer.js.map +1 -0
- package/modules/parseData/types/additional/Integer.test.js.map +1 -0
- package/modules/{types → parseData/types/additional}/URL.js +3 -3
- package/modules/parseData/types/additional/URL.js.map +1 -0
- package/modules/parseData/types/additional/URL.test.js.map +1 -0
- package/modules/xlsx/{getData.js → convertCellsToData2dArray.js} +15 -36
- package/modules/xlsx/convertCellsToData2dArray.js.map +1 -0
- package/modules/xlsx/{isDateTimestamp.js → isDateFormat.js} +57 -55
- package/modules/xlsx/isDateFormat.js.map +1 -0
- package/modules/xlsx/isDateFormat.test.js.map +1 -0
- package/modules/xlsx/isDateFormatStyle.js +186 -0
- package/modules/xlsx/isDateFormatStyle.js.map +1 -0
- package/modules/xlsx/parseCell.js +17 -19
- package/modules/xlsx/parseCell.js.map +1 -1
- package/modules/xlsx/parseCellCoordinates.js +38 -0
- package/modules/xlsx/parseCellCoordinates.js.map +1 -0
- package/modules/xlsx/parseCellValue.js +14 -11
- package/modules/xlsx/parseCellValue.js.map +1 -1
- package/modules/xlsx/parseCells.js +14 -6
- package/modules/xlsx/parseCells.js.map +1 -1
- package/modules/xlsx/parseExcelDate.js +133 -0
- package/modules/xlsx/parseExcelDate.js.map +1 -0
- package/modules/xlsx/parseExcelDate.test.js.map +1 -0
- package/modules/xlsx/parseSheet.js +9 -11
- package/modules/xlsx/parseSheet.js.map +1 -1
- package/modules/xlsx/{parseDimensions.js → parseSheetDimensions.js} +4 -4
- package/modules/xlsx/parseSheetDimensions.js.map +1 -0
- package/modules/xlsx/parseSpreadsheetContents.js +91 -0
- package/modules/xlsx/parseSpreadsheetContents.js.map +1 -0
- package/modules/xlsx/parseSpreadsheetInfo.js +42 -0
- package/modules/xlsx/parseSpreadsheetInfo.js.map +1 -0
- package/modules/xlsx/reconstructSheetDimensionsFromSheetCells.js +23 -0
- package/modules/xlsx/reconstructSheetDimensionsFromSheetCells.js.map +1 -0
- package/modules/xml/xlsx.js +6 -6
- package/modules/xml/xlsx.js.map +1 -1
- package/modules/xml/xpath/xlsx-xpath.js +6 -6
- package/modules/xml/xpath/xlsx-xpath.js.map +1 -1
- package/modules/xml/xpath/xpathBrowser.js +4 -4
- package/modules/xml/xpath/xpathBrowser.js.map +1 -1
- package/modules/xml/xpath/xpathNode.js +2 -2
- package/modules/xml/xpath/xpathNode.js.map +1 -1
- package/node/index.cjs +8 -5
- package/node/index.d.ts +56 -21
- package/node/index.js +7 -5
- package/node/input.d.ts +5 -0
- package/package.json +1 -1
- package/rollup.config.mjs +1 -1
- package/types/parseData/parseData.d.ts +38 -0
- package/types/parseData/parseDataError.d.ts +239 -0
- package/types/parseData/parseDataSchema.d.ts +48 -0
- package/types/parseData/parseDataValueType.d.ts +45 -0
- package/types/types.d.ts +20 -0
- package/universal/index.cjs +8 -5
- package/universal/index.d.ts +58 -16
- package/universal/index.js +7 -5
- package/universal/input.d.ts +1 -0
- package/web-worker/index.cjs +8 -5
- package/web-worker/index.d.ts +58 -16
- package/web-worker/index.js +7 -5
- package/web-worker/input.d.ts +1 -0
- package/commonjs/export/readSheetNamesBrowser.js +0 -23
- package/commonjs/export/readSheetNamesBrowser.js.map +0 -1
- package/commonjs/export/readSheetNamesNode.js +0 -23
- package/commonjs/export/readSheetNamesNode.js.map +0 -1
- package/commonjs/export/readSheetNamesUniversal.js +0 -23
- package/commonjs/export/readSheetNamesUniversal.js.map +0 -1
- package/commonjs/export/readSheetNamesWebWorker.js +0 -23
- package/commonjs/export/readSheetNamesWebWorker.js.map +0 -1
- package/commonjs/types/Boolean.js.map +0 -1
- package/commonjs/types/Date.js +0 -36
- package/commonjs/types/Date.js.map +0 -1
- package/commonjs/types/Email.js.map +0 -1
- package/commonjs/types/Email.test.js.map +0 -1
- package/commonjs/types/Integer.js.map +0 -1
- package/commonjs/types/Integer.test.js.map +0 -1
- package/commonjs/types/InvalidError.js.map +0 -1
- package/commonjs/types/Number.js.map +0 -1
- package/commonjs/types/String.js.map +0 -1
- package/commonjs/types/URL.js.map +0 -1
- package/commonjs/types/URL.test.js.map +0 -1
- package/commonjs/xlsx/coordinates.js +0 -55
- package/commonjs/xlsx/coordinates.js.map +0 -1
- package/commonjs/xlsx/getData.js.map +0 -1
- package/commonjs/xlsx/isDateTimestamp.js.map +0 -1
- package/commonjs/xlsx/parseDate.js +0 -73
- package/commonjs/xlsx/parseDate.js.map +0 -1
- package/commonjs/xlsx/parseDate.test.js.map +0 -1
- package/commonjs/xlsx/parseDimensions.js.map +0 -1
- package/commonjs/xlsx/parseProperties.js +0 -46
- package/commonjs/xlsx/parseProperties.js.map +0 -1
- package/commonjs/xlsx/parseXlsxFileContents.js +0 -119
- package/commonjs/xlsx/parseXlsxFileContents.js.map +0 -1
- package/commonjs/xlsx/parseXlsxFileContentsWithOptionalSchema.js +0 -45
- package/commonjs/xlsx/parseXlsxFileContentsWithOptionalSchema.js.map +0 -1
- package/commonjs/xlsx/schema/mapToObjects.js +0 -482
- package/commonjs/xlsx/schema/mapToObjects.js.map +0 -1
- package/commonjs/xlsx/schema/mapToObjects.test.js.map +0 -1
- package/modules/export/readSheetNamesBrowser.js +0 -17
- package/modules/export/readSheetNamesBrowser.js.map +0 -1
- package/modules/export/readSheetNamesNode.js +0 -17
- package/modules/export/readSheetNamesNode.js.map +0 -1
- package/modules/export/readSheetNamesUniversal.js +0 -17
- package/modules/export/readSheetNamesUniversal.js.map +0 -1
- package/modules/export/readSheetNamesWebWorker.js +0 -17
- package/modules/export/readSheetNamesWebWorker.js.map +0 -1
- package/modules/types/Boolean.js.map +0 -1
- package/modules/types/Date.js +0 -29
- package/modules/types/Date.js.map +0 -1
- package/modules/types/Email.js.map +0 -1
- package/modules/types/Email.test.js.map +0 -1
- package/modules/types/Integer.js.map +0 -1
- package/modules/types/Integer.test.js.map +0 -1
- package/modules/types/InvalidError.js.map +0 -1
- package/modules/types/Number.js.map +0 -1
- package/modules/types/String.js.map +0 -1
- package/modules/types/URL.js.map +0 -1
- package/modules/types/URL.test.js.map +0 -1
- package/modules/xlsx/coordinates.js +0 -48
- package/modules/xlsx/coordinates.js.map +0 -1
- package/modules/xlsx/getData.js.map +0 -1
- package/modules/xlsx/isDateTimestamp.js.map +0 -1
- package/modules/xlsx/parseDate.js +0 -67
- package/modules/xlsx/parseDate.js.map +0 -1
- package/modules/xlsx/parseDate.test.js.map +0 -1
- package/modules/xlsx/parseDimensions.js.map +0 -1
- package/modules/xlsx/parseProperties.js +0 -41
- package/modules/xlsx/parseProperties.js.map +0 -1
- package/modules/xlsx/parseXlsxFileContents.js +0 -114
- package/modules/xlsx/parseXlsxFileContents.js.map +0 -1
- package/modules/xlsx/parseXlsxFileContentsWithOptionalSchema.js +0 -39
- package/modules/xlsx/parseXlsxFileContentsWithOptionalSchema.js.map +0 -1
- package/modules/xlsx/schema/mapToObjects.js +0 -472
- package/modules/xlsx/schema/mapToObjects.js.map +0 -1
- package/modules/xlsx/schema/mapToObjects.test.js.map +0 -1
- package/types.d.ts +0 -121
- /package/commonjs/{types → parseData}/InvalidError.js +0 -0
- /package/modules/{types → parseData}/InvalidError.js +0 -0
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = parseData;
|
|
7
|
+
exports.getNextSubstring = getNextSubstring;
|
|
8
|
+
exports.parseSeparatedSubstrings = parseSeparatedSubstrings;
|
|
9
|
+
exports.parseValue = parseValue;
|
|
10
|
+
var _Number = _interopRequireDefault(require("./types/Number.js"));
|
|
11
|
+
var _String = _interopRequireDefault(require("./types/String.js"));
|
|
12
|
+
var _Boolean = _interopRequireDefault(require("./types/Boolean.js"));
|
|
13
|
+
var _Date = _interopRequireDefault(require("./types/Date.js"));
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
15
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
16
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
18
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
19
|
+
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
20
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
21
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
22
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
23
|
+
function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }
|
|
24
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
25
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
26
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
27
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
28
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
29
|
+
/**
|
|
30
|
+
* Converts spreadsheet-alike data structure into an array of JSON objects.
|
|
31
|
+
*
|
|
32
|
+
* Parameters:
|
|
33
|
+
*
|
|
34
|
+
* * `data` — An array of rows, each row being an array of cells. The first row should be the list of column headers and the rest of the rows should be the data.
|
|
35
|
+
* * `schema` — A "to JSON" convertion schema (see above).
|
|
36
|
+
* * `options` — (optional) Schema conversion parameters of `read-excel-file`:
|
|
37
|
+
* * `propertyValueWhenColumnIsMissing` — By default, when some of the `schema` columns are missing in the input `data`, those properties are set to `undefined` in the output objects. Pass `propertyValueWhenColumnIsMissing: null` to set such "missing column" properties to `null` in the output objects.
|
|
38
|
+
* * `propertyValueWhenCellIsEmpty` — By default, when it encounters a `null` value in a cell in input `data`, it sets it to `undefined` in the output object. Pass `propertyValueWhenCellIsEmpty: null` to make it set such values as `null`s in output objects.
|
|
39
|
+
* // * `shouldSkipRequiredValidationWhenColumnIsMissing: (column: string, { object }) => boolean` — By default, it does apply `required` validation to `schema` properties for which columns are missing in the input `data`. One could pass a custom `shouldSkipRequiredValidationWhenColumnIsMissing(column, { object })` to disable `required` validation for missing columns in some or all cases.
|
|
40
|
+
* * `transformEmptyObject(object, { path? })` — By default, it returns `null` for "empty" objects. One could override that value using `transformEmptyObject(object, { path })` parameter. The value applies to both top-level object and any nested sub-objects in case of a nested schema, hence the additional (optional) `path?: string` parameter.
|
|
41
|
+
* * `transformEmptyArray(array, { path })` — By default, it returns `null` for an "empty" array value. One could override that value using `transformEmptyArray(array, { path })` parameter.
|
|
42
|
+
* * `arrayValueSeparator` — By default, it splits array-type cell values by a comma character.
|
|
43
|
+
*
|
|
44
|
+
* When parsing a property value, in case of an error, the value of that property is gonna be `undefined`.
|
|
45
|
+
*
|
|
46
|
+
* @param {SheetData} data - An array of rows, each row being an array of cells.
|
|
47
|
+
* @param {object} schema
|
|
48
|
+
* @param {object} [options]
|
|
49
|
+
* @param {any} [options.propertyValueWhenColumnIsMissing] — By default, when some of the `schema` columns are missing in the input `data`, those properties are set to `undefined` in the output objects. Pass `propertyValueWhenColumnIsMissing: null` to set such "missing column" properties to `null` in the output objects.
|
|
50
|
+
* @param {any} [options.propertyValueWhenCellIsEmpty] — By default, when it encounters a `null` value in a cell in input `data`, it leaves the value as is. Pass a custom `propertyValueWhenCellIsEmpty` to make it set such values to that value.
|
|
51
|
+
* // @param {boolean} [options.shouldSkipRequiredValidationWhenColumnIsMissing(column: string, { object })] — By default, it does apply `required` validation to `schema` properties for which columns are missing in the input `data`. One could pass a custom `shouldSkipRequiredValidationWhenColumnIsMissing(column, { object })` to disable `required` validation for missing columns in some or all cases.
|
|
52
|
+
* @param {function} [options.transformEmptyObject(object, { path })] — By default, it returns `null` for an "empty" resulting object. One could override that value using `transformEmptyObject(object, { path })` parameter. The value applies to both top-level object and any nested sub-objects in case of a nested schema, hence the additional `path?: string` parameter.
|
|
53
|
+
* @param {function} [options.transformEmptyArray(array, { path })] — By default, it returns `null` for an "empty" array value. One could override that value using `transformEmptyArray(array, { path })` parameter.
|
|
54
|
+
* @param {string} [options.arrayValueSeparator] — When specified, string values will be split by this separator to get the array.
|
|
55
|
+
* @return {object[]} — An array of objects of shape `{ object, errors }`. Either `object` or `errors` is going to be `undefined`.
|
|
56
|
+
*/
|
|
57
|
+
function parseData(data, schema, optionsCustom) {
|
|
58
|
+
validateSchema(schema);
|
|
59
|
+
var options = applyDefaultOptions(optionsCustom);
|
|
60
|
+
var _data = _toArray(data),
|
|
61
|
+
columns = _data[0],
|
|
62
|
+
dataRows = _data.slice(1);
|
|
63
|
+
return dataRows.map(function (dataRow) {
|
|
64
|
+
return parseDataRow(dataRow, schema, undefined, columns, options);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function parseDataRow(row, schema, path, columns, options) {
|
|
68
|
+
var object = {};
|
|
69
|
+
var errors = [];
|
|
70
|
+
var isEmptyObject = true;
|
|
71
|
+
var pendingRequiredValidations = [];
|
|
72
|
+
|
|
73
|
+
// For each property of the object.
|
|
74
|
+
for (var _i = 0, _Object$keys = Object.keys(schema); _i < _Object$keys.length; _i++) {
|
|
75
|
+
var key = _Object$keys[_i];
|
|
76
|
+
var _parseProperty = parseProperty(key, row, path, schema, columns, options),
|
|
77
|
+
propertyErrors = _parseProperty.errors,
|
|
78
|
+
pendingRequiredValidation = _parseProperty.pendingRequiredValidation,
|
|
79
|
+
value = _parseProperty.value;
|
|
80
|
+
if (propertyErrors) {
|
|
81
|
+
errors = errors.concat(propertyErrors);
|
|
82
|
+
} else {
|
|
83
|
+
object[key] = value;
|
|
84
|
+
// Will perform `required` validation later, when all properties have been parsed.
|
|
85
|
+
if (pendingRequiredValidation) {
|
|
86
|
+
pendingRequiredValidations.push(pendingRequiredValidation);
|
|
87
|
+
}
|
|
88
|
+
// Potentially unmark the object as "empty".
|
|
89
|
+
if (isEmptyObject && !isEmptyValue(value)) {
|
|
90
|
+
isEmptyObject = false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Perform basic `required` validations (i.e. when `required` property is a boolean).
|
|
96
|
+
for (var _i2 = 0, _pendingRequiredValid = pendingRequiredValidations; _i2 < _pendingRequiredValid.length; _i2++) {
|
|
97
|
+
var _pendingRequiredValid2 = _pendingRequiredValid[_i2],
|
|
98
|
+
required = _pendingRequiredValid2.required,
|
|
99
|
+
schemaEntry = _pendingRequiredValid2.schemaEntry,
|
|
100
|
+
_value = _pendingRequiredValid2.value;
|
|
101
|
+
if (required === true) {
|
|
102
|
+
errors.push(createError({
|
|
103
|
+
error: 'required',
|
|
104
|
+
schemaEntry: schemaEntry,
|
|
105
|
+
value: _value
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// If there were any errors, return them.
|
|
111
|
+
if (errors.length > 0) {
|
|
112
|
+
return {
|
|
113
|
+
errors: errors
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Perform "complex" `required` validations (i.e. when `required` property is a function).
|
|
118
|
+
// These "complex" `required` validations should only be performed when all properties
|
|
119
|
+
// of an object have been parsed correctly because these validations rely on the values
|
|
120
|
+
// of other properties.
|
|
121
|
+
for (var _i3 = 0, _pendingRequiredValid3 = pendingRequiredValidations; _i3 < _pendingRequiredValid3.length; _i3++) {
|
|
122
|
+
var _pendingRequiredValid4 = _pendingRequiredValid3[_i3],
|
|
123
|
+
_required = _pendingRequiredValid4.required,
|
|
124
|
+
_schemaEntry = _pendingRequiredValid4.schemaEntry,
|
|
125
|
+
_value2 = _pendingRequiredValid4.value;
|
|
126
|
+
if (typeof _required !== 'boolean' && _required(object)) {
|
|
127
|
+
errors.push(createError({
|
|
128
|
+
error: 'required',
|
|
129
|
+
schemaEntry: _schemaEntry,
|
|
130
|
+
value: _value2
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// If there were any "complex" `required` errors, return them.
|
|
136
|
+
if (errors.length > 0) {
|
|
137
|
+
return {
|
|
138
|
+
errors: errors
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Return `null` for an "empty" mapped object.
|
|
143
|
+
if (isEmptyObject) {
|
|
144
|
+
return {
|
|
145
|
+
object: options.transformEmptyObject(object, {
|
|
146
|
+
path: path
|
|
147
|
+
})
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
object: object
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function parseProperty(key, row, path, schema, columns, options) {
|
|
155
|
+
var schemaEntry = schema[key];
|
|
156
|
+
var columnIndex = schemaEntry.column ? columns.indexOf(schemaEntry.column) : undefined;
|
|
157
|
+
var isMissingColumn = columnIndex < 0;
|
|
158
|
+
|
|
159
|
+
// The path of this property inside the top-level object.
|
|
160
|
+
var propertyPath = "".concat(path ? path + '.' : '').concat(key);
|
|
161
|
+
var _ref = schemaEntry.schema ? parseNestedObject(row, schemaEntry.schema, propertyPath, columns, options) : isMissingColumn ? {
|
|
162
|
+
value: options.propertyValueWhenColumnIsMissing
|
|
163
|
+
} : parseDataCellValue(row[columnIndex], schemaEntry, propertyPath, options),
|
|
164
|
+
errors = _ref.errors,
|
|
165
|
+
value = _ref.value;
|
|
166
|
+
if (errors) {
|
|
167
|
+
return {
|
|
168
|
+
errors: errors
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Should apply `required` validation if the value is "empty".
|
|
173
|
+
var pendingRequiredValidation;
|
|
174
|
+
if (schemaEntry.required && isEmptyValue(value)) {
|
|
175
|
+
// // Can optionally skip `required` validation for certain missing columns.
|
|
176
|
+
// const skipRequiredValidation = isMissingColumn && options.shouldSkipRequiredValidationWhenColumnIsMissing(schemaEntry.column, { object: ... })
|
|
177
|
+
// if (!skipRequiredValidation) { ... }
|
|
178
|
+
|
|
179
|
+
// Will perform `required` validation in the end,
|
|
180
|
+
// when all properties of the object have been parsed.
|
|
181
|
+
// This is because `required` could also be a function of `object`.
|
|
182
|
+
pendingRequiredValidation = {
|
|
183
|
+
required: schemaEntry.required,
|
|
184
|
+
schemaEntry: schemaEntry,
|
|
185
|
+
value: value
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
value: value,
|
|
190
|
+
pendingRequiredValidation: pendingRequiredValidation
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function parseNestedObject(row, schema, propertyPath, columns, options) {
|
|
194
|
+
var _parseDataRow = parseDataRow(row, schema, propertyPath, columns, options),
|
|
195
|
+
object = _parseDataRow.object,
|
|
196
|
+
errors = _parseDataRow.errors;
|
|
197
|
+
return {
|
|
198
|
+
value: object,
|
|
199
|
+
errors: errors
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
function parseDataCellValue(cellValue, schemaEntry, propertyPath, options) {
|
|
203
|
+
var _parseDataCellValue_ = parseDataCellValue_(cellValue, schemaEntry, propertyPath, options),
|
|
204
|
+
propertyValue = _parseDataCellValue_.value,
|
|
205
|
+
errorMessage = _parseDataCellValue_.error,
|
|
206
|
+
reason = _parseDataCellValue_.reason;
|
|
207
|
+
if (errorMessage) {
|
|
208
|
+
var error = createError({
|
|
209
|
+
schemaEntry: schemaEntry,
|
|
210
|
+
value: cellValue,
|
|
211
|
+
error: errorMessage,
|
|
212
|
+
reason: reason
|
|
213
|
+
});
|
|
214
|
+
return {
|
|
215
|
+
errors: [error]
|
|
216
|
+
};
|
|
217
|
+
} else {
|
|
218
|
+
return {
|
|
219
|
+
value: propertyValue
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Converts a cell value value to a javascript typed value.
|
|
226
|
+
* @param {any} value
|
|
227
|
+
* @param {object} schemaEntry
|
|
228
|
+
* @param {string} propertyPath
|
|
229
|
+
* @param {object} options
|
|
230
|
+
* @return {{ value?: any, error?: string, reason?: string }}
|
|
231
|
+
*/
|
|
232
|
+
function parseDataCellValue_(cellValue, schemaEntry, propertyPath, options) {
|
|
233
|
+
if (cellValue === undefined) {
|
|
234
|
+
// This isn't supposed to be possible when reading spreadsheet data:
|
|
235
|
+
// cell values are always read as `null` when those cells are empty.
|
|
236
|
+
// It's currently impossible for `read-excel-file` to return `undefined` cell value.
|
|
237
|
+
// Here it uses some "sensible default" fallback by treating `undefined` as "column missing".
|
|
238
|
+
return {
|
|
239
|
+
value: options.propertyValueWhenColumnIsMissing
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
if (cellValue === null) {
|
|
243
|
+
return {
|
|
244
|
+
value: options.propertyValueWhenCellIsEmpty
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
if (Array.isArray(schemaEntry.type)) {
|
|
248
|
+
var errors = [];
|
|
249
|
+
var reasons = [];
|
|
250
|
+
var values = parseSeparatedSubstrings(cellValue, options.arrayValueSeparator).map(function (substring) {
|
|
251
|
+
// If any substring was already detected to be invalid
|
|
252
|
+
// don't attempt to parse any other substrings.
|
|
253
|
+
if (errors.length > 0) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
var _parseValue = parseValue(substring, schemaEntry, options),
|
|
257
|
+
value = _parseValue.value,
|
|
258
|
+
error = _parseValue.error,
|
|
259
|
+
reason = _parseValue.reason;
|
|
260
|
+
if (error) {
|
|
261
|
+
errors.push(error);
|
|
262
|
+
reasons.push(reason);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
return value;
|
|
266
|
+
});
|
|
267
|
+
if (errors.length > 0) {
|
|
268
|
+
return {
|
|
269
|
+
error: errors[0],
|
|
270
|
+
reason: reasons[0]
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
var isEmpty = values.every(isEmptyValue);
|
|
274
|
+
if (isEmpty) {
|
|
275
|
+
return {
|
|
276
|
+
value: options.transformEmptyArray(values, {
|
|
277
|
+
path: propertyPath
|
|
278
|
+
})
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
value: values
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
return parseValue(cellValue, schemaEntry, options);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Converts textual value to a javascript typed value.
|
|
290
|
+
* @param {any} value
|
|
291
|
+
* @param {object} schemaEntry
|
|
292
|
+
* @return {{ value: any, error: string }}
|
|
293
|
+
*/
|
|
294
|
+
function parseValue(value, schemaEntry, options) {
|
|
295
|
+
if (value === null) {
|
|
296
|
+
return {
|
|
297
|
+
value: null
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
var result;
|
|
301
|
+
if (schemaEntry.type) {
|
|
302
|
+
result = parseValueOfType(value,
|
|
303
|
+
// Supports parsing array types.
|
|
304
|
+
// See `parseSeparatedSubstrings()` function for more details.
|
|
305
|
+
// Example `type`: String[]
|
|
306
|
+
// Input: 'Barack Obama, "String, with, colons", Donald Trump'
|
|
307
|
+
// Output: ['Barack Obama', 'String, with, colons', 'Donald Trump']
|
|
308
|
+
Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type, options);
|
|
309
|
+
} else {
|
|
310
|
+
// The default `type` is `String`.
|
|
311
|
+
result = {
|
|
312
|
+
value: value
|
|
313
|
+
};
|
|
314
|
+
// throw new Error('Invalid schema entry: no `type` specified:\n\n' + JSON.stringify(schemaEntry, null, 2))
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// If errored then return the error.
|
|
318
|
+
if (result.error) {
|
|
319
|
+
return result;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Validate the value.
|
|
323
|
+
if (result.value !== null) {
|
|
324
|
+
// Perform `oneOf` validation.
|
|
325
|
+
if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {
|
|
326
|
+
return {
|
|
327
|
+
error: 'invalid',
|
|
328
|
+
reason: 'unknown'
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
// Perform `validate()` validation.
|
|
332
|
+
if (schemaEntry.validate) {
|
|
333
|
+
try {
|
|
334
|
+
schemaEntry.validate(result.value);
|
|
335
|
+
} catch (error) {
|
|
336
|
+
return {
|
|
337
|
+
error: error.message
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return result;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Converts cell value to a javascript typed value.
|
|
347
|
+
* @param {(string|number|boolean|Date)} value
|
|
348
|
+
* @param {function} type
|
|
349
|
+
* @return {object} Either `{ value: (string|number|Date|boolean) }` or `{ error: string, reason?: string }`
|
|
350
|
+
*/
|
|
351
|
+
function parseValueOfType(value, type) {
|
|
352
|
+
switch (type) {
|
|
353
|
+
case String:
|
|
354
|
+
return parseValueUsingTypeParser(value, _String["default"]);
|
|
355
|
+
case Number:
|
|
356
|
+
return parseValueUsingTypeParser(value, _Number["default"]);
|
|
357
|
+
case Date:
|
|
358
|
+
return parseValueUsingTypeParser(value, _Date["default"]);
|
|
359
|
+
case Boolean:
|
|
360
|
+
return parseValueUsingTypeParser(value, _Boolean["default"]);
|
|
361
|
+
default:
|
|
362
|
+
// Validate `type`
|
|
363
|
+
if (typeof type !== 'function') {
|
|
364
|
+
throw new Error("Unsupported schema `type`: ".concat(type && type.name || type));
|
|
365
|
+
}
|
|
366
|
+
return parseValueUsingTypeParser(value, type);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Converts textual value to a custom value using supplied `type`.
|
|
372
|
+
* @param {any} value
|
|
373
|
+
* @param {function} type
|
|
374
|
+
* @return {{ value: any, error: string }}
|
|
375
|
+
*/
|
|
376
|
+
function parseValueUsingTypeParser(value, type) {
|
|
377
|
+
try {
|
|
378
|
+
var parsedValue = type(value);
|
|
379
|
+
// Returning `undefined` from a `type` parser is treated as returning `null`.
|
|
380
|
+
if (parsedValue === undefined) {
|
|
381
|
+
return {
|
|
382
|
+
value: null
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
value: parsedValue
|
|
387
|
+
};
|
|
388
|
+
} catch (error) {
|
|
389
|
+
var result = {
|
|
390
|
+
error: error.message
|
|
391
|
+
};
|
|
392
|
+
if (error.reason) {
|
|
393
|
+
result.reason = error.reason;
|
|
394
|
+
}
|
|
395
|
+
return result;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
function getNextSubstring(string, endCharacter, startIndex) {
|
|
399
|
+
var i = 0;
|
|
400
|
+
var substring = '';
|
|
401
|
+
while (startIndex + i < string.length) {
|
|
402
|
+
var character = string[startIndex + i];
|
|
403
|
+
if (character === endCharacter) {
|
|
404
|
+
return [substring, i];
|
|
405
|
+
}
|
|
406
|
+
// Previously, it used to treat `"` character similar to how it's treated in `.csv` files:
|
|
407
|
+
// any commas inside quotes are ignored. But then I thought that it could introduce more
|
|
408
|
+
// issues than it was originally intending to fix, and it also didn't provide an "escape" mechanism.
|
|
409
|
+
// Overall, a decision was made to simplify the whole thing and drop the concept of quotes as special characters.
|
|
410
|
+
//
|
|
411
|
+
// else if (character === '"') {
|
|
412
|
+
// const quotedSubstring = getNextSubstring(string, '"', startIndex + i + 1)
|
|
413
|
+
// substring += quotedSubstring[0]
|
|
414
|
+
// i += '"'.length + quotedSubstring[1] + '"'.length
|
|
415
|
+
// }
|
|
416
|
+
else {
|
|
417
|
+
substring += character;
|
|
418
|
+
i++;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return [substring, i];
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Parses a string of comma-separated substrings into an array of substrings.
|
|
426
|
+
* (the `export` is just for tests)
|
|
427
|
+
* @param {string} string — A string of comma-separated substrings.
|
|
428
|
+
* @return {string[]} An array of substrings.
|
|
429
|
+
*/
|
|
430
|
+
function parseSeparatedSubstrings(string, arrayValueSeparator) {
|
|
431
|
+
var elements = [];
|
|
432
|
+
var index = 0;
|
|
433
|
+
while (index < string.length) {
|
|
434
|
+
var _getNextSubstring = getNextSubstring(string, arrayValueSeparator, index),
|
|
435
|
+
_getNextSubstring2 = _slicedToArray(_getNextSubstring, 2),
|
|
436
|
+
substring = _getNextSubstring2[0],
|
|
437
|
+
length = _getNextSubstring2[1];
|
|
438
|
+
index += length + arrayValueSeparator.length;
|
|
439
|
+
elements.push(substring.trim());
|
|
440
|
+
}
|
|
441
|
+
return elements;
|
|
442
|
+
}
|
|
443
|
+
function createError(_ref2) {
|
|
444
|
+
var schemaEntry = _ref2.schemaEntry,
|
|
445
|
+
value = _ref2.value,
|
|
446
|
+
errorMessage = _ref2.error,
|
|
447
|
+
reason = _ref2.reason;
|
|
448
|
+
var error = {
|
|
449
|
+
error: errorMessage,
|
|
450
|
+
column: schemaEntry.column,
|
|
451
|
+
value: value
|
|
452
|
+
};
|
|
453
|
+
if (reason) {
|
|
454
|
+
error.reason = reason;
|
|
455
|
+
}
|
|
456
|
+
// * Regular values specify a `type?` property, which is included in the `error` object.
|
|
457
|
+
// * Nested objects specify a `schema` property, which is not included in the `error` object.
|
|
458
|
+
if (schemaEntry.type) {
|
|
459
|
+
error.type = schemaEntry.type;
|
|
460
|
+
}
|
|
461
|
+
return error;
|
|
462
|
+
}
|
|
463
|
+
function validateSchema(schema) {
|
|
464
|
+
for (var _i4 = 0, _Object$keys2 = Object.keys(schema); _i4 < _Object$keys2.length; _i4++) {
|
|
465
|
+
var key = _Object$keys2[_i4];
|
|
466
|
+
var schemaEntry = schema[key];
|
|
467
|
+
// Validate that the `schema` is not using a deprecated `type: nestedSchema` format.
|
|
468
|
+
if (_typeof(schemaEntry.type) === 'object' && !Array.isArray(schemaEntry.type)) {
|
|
469
|
+
throw new Error('When defining a nested schema, use a `schema` property instead of a `type` property');
|
|
470
|
+
}
|
|
471
|
+
// Validate that every property has a source `column` title specified for it.
|
|
472
|
+
if (!schemaEntry.schema) {
|
|
473
|
+
if (!schemaEntry.column) {
|
|
474
|
+
throw new Error("\"column\" not defined for schema entry \"".concat(key, "\"."));
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
function isEmptyValue(value) {
|
|
480
|
+
return value === undefined || value === null;
|
|
481
|
+
}
|
|
482
|
+
var DEFAULT_OPTIONS = {
|
|
483
|
+
propertyValueWhenColumnIsMissing: undefined,
|
|
484
|
+
propertyValueWhenCellIsEmpty: null,
|
|
485
|
+
// shouldSkipRequiredValidationWhenColumnIsMissing: () => false,
|
|
486
|
+
// `transformEmptyObject(object, { path })` applies to both the top-level object
|
|
487
|
+
// and any of its nested objects.
|
|
488
|
+
transformEmptyObject: function transformEmptyObject() {
|
|
489
|
+
return null;
|
|
490
|
+
},
|
|
491
|
+
transformEmptyArray: function transformEmptyArray() {
|
|
492
|
+
return null;
|
|
493
|
+
},
|
|
494
|
+
arrayValueSeparator: ','
|
|
495
|
+
};
|
|
496
|
+
function applyDefaultOptions(options) {
|
|
497
|
+
if (options) {
|
|
498
|
+
return _objectSpread(_objectSpread({}, DEFAULT_OPTIONS), options);
|
|
499
|
+
} else {
|
|
500
|
+
return DEFAULT_OPTIONS;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
//# sourceMappingURL=parseData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseData.js","names":["_Number","_interopRequireDefault","require","_String","_Boolean","_Date","obj","__esModule","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","key","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","_typeof","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","iterator","constructor","prototype","_slicedToArray","arr","i","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","l","n","u","a","f","next","done","_toArray","_iterableToArray","minLen","_arrayLikeToArray","toString","slice","name","Array","from","test","len","arr2","iter","isArray","parseData","data","schema","optionsCustom","validateSchema","options","applyDefaultOptions","_data","columns","dataRows","map","dataRow","parseDataRow","row","path","object","errors","isEmptyObject","pendingRequiredValidations","_i","_Object$keys","_parseProperty","parseProperty","propertyErrors","pendingRequiredValidation","concat","isEmptyValue","_i2","_pendingRequiredValid","_pendingRequiredValid2","required","schemaEntry","createError","error","_i3","_pendingRequiredValid3","_pendingRequiredValid4","transformEmptyObject","columnIndex","column","indexOf","isMissingColumn","propertyPath","_ref","parseNestedObject","propertyValueWhenColumnIsMissing","parseDataCellValue","_parseDataRow","cellValue","_parseDataCellValue_","parseDataCellValue_","propertyValue","errorMessage","reason","propertyValueWhenCellIsEmpty","type","reasons","values","parseSeparatedSubstrings","arrayValueSeparator","substring","_parseValue","parseValue","isEmpty","every","transformEmptyArray","result","parseValueOfType","oneOf","validate","message","parseValueUsingTypeParser","StringType","NumberType","Date","DateType","Boolean","BooleanType","Error","parsedValue","getNextSubstring","string","endCharacter","startIndex","character","elements","index","_getNextSubstring","_getNextSubstring2","trim","_ref2","_i4","_Object$keys2","DEFAULT_OPTIONS"],"sources":["../../source/parseData/parseData.js"],"sourcesContent":["import NumberType from './types/Number.js'\r\nimport StringType from './types/String.js'\r\nimport BooleanType from './types/Boolean.js'\r\nimport DateType from './types/Date.js'\r\n\r\n/**\r\n * Converts spreadsheet-alike data structure into an array of JSON objects.\r\n *\r\n * Parameters:\r\n *\r\n * * `data` — An array of rows, each row being an array of cells. The first row should be the list of column headers and the rest of the rows should be the data.\r\n * * `schema` — A \"to JSON\" convertion schema (see above).\r\n * * `options` — (optional) Schema conversion parameters of `read-excel-file`:\r\n * * `propertyValueWhenColumnIsMissing` — By default, when some of the `schema` columns are missing in the input `data`, those properties are set to `undefined` in the output objects. Pass `propertyValueWhenColumnIsMissing: null` to set such \"missing column\" properties to `null` in the output objects.\r\n * * `propertyValueWhenCellIsEmpty` — By default, when it encounters a `null` value in a cell in input `data`, it sets it to `undefined` in the output object. Pass `propertyValueWhenCellIsEmpty: null` to make it set such values as `null`s in output objects.\r\n * // * `shouldSkipRequiredValidationWhenColumnIsMissing: (column: string, { object }) => boolean` — By default, it does apply `required` validation to `schema` properties for which columns are missing in the input `data`. One could pass a custom `shouldSkipRequiredValidationWhenColumnIsMissing(column, { object })` to disable `required` validation for missing columns in some or all cases.\r\n * * `transformEmptyObject(object, { path? })` — By default, it returns `null` for \"empty\" objects. One could override that value using `transformEmptyObject(object, { path })` parameter. The value applies to both top-level object and any nested sub-objects in case of a nested schema, hence the additional (optional) `path?: string` parameter.\r\n * * `transformEmptyArray(array, { path })` — By default, it returns `null` for an \"empty\" array value. One could override that value using `transformEmptyArray(array, { path })` parameter.\r\n * * `arrayValueSeparator` — By default, it splits array-type cell values by a comma character.\r\n *\r\n * When parsing a property value, in case of an error, the value of that property is gonna be `undefined`.\r\n *\r\n * @param {SheetData} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @param {object} [options]\r\n * @param {any} [options.propertyValueWhenColumnIsMissing] — By default, when some of the `schema` columns are missing in the input `data`, those properties are set to `undefined` in the output objects. Pass `propertyValueWhenColumnIsMissing: null` to set such \"missing column\" properties to `null` in the output objects.\r\n * @param {any} [options.propertyValueWhenCellIsEmpty] — By default, when it encounters a `null` value in a cell in input `data`, it leaves the value as is. Pass a custom `propertyValueWhenCellIsEmpty` to make it set such values to that value.\r\n * // @param {boolean} [options.shouldSkipRequiredValidationWhenColumnIsMissing(column: string, { object })] — By default, it does apply `required` validation to `schema` properties for which columns are missing in the input `data`. One could pass a custom `shouldSkipRequiredValidationWhenColumnIsMissing(column, { object })` to disable `required` validation for missing columns in some or all cases.\r\n * @param {function} [options.transformEmptyObject(object, { path })] — By default, it returns `null` for an \"empty\" resulting object. One could override that value using `transformEmptyObject(object, { path })` parameter. The value applies to both top-level object and any nested sub-objects in case of a nested schema, hence the additional `path?: string` parameter.\r\n * @param {function} [options.transformEmptyArray(array, { path })] — By default, it returns `null` for an \"empty\" array value. One could override that value using `transformEmptyArray(array, { path })` parameter.\r\n * @param {string} [options.arrayValueSeparator] — When specified, string values will be split by this separator to get the array.\r\n * @return {object[]} — An array of objects of shape `{ object, errors }`. Either `object` or `errors` is going to be `undefined`.\r\n */\r\nexport default function parseData(data, schema, optionsCustom) {\r\n validateSchema(schema)\r\n const options = applyDefaultOptions(optionsCustom)\r\n const [columns, ...dataRows] = data\r\n return dataRows.map((dataRow) => {\r\n return parseDataRow(dataRow, schema, undefined, columns, options)\r\n })\r\n}\r\n\r\nfunction parseDataRow(row, schema, path, columns, options) {\r\n const object = {}\r\n let errors = []\r\n\r\n let isEmptyObject = true\r\n\r\n const pendingRequiredValidations = []\r\n\r\n // For each property of the object.\r\n for (const key of Object.keys(schema)) {\r\n const {\r\n errors: propertyErrors,\r\n pendingRequiredValidation,\r\n value\r\n } = parseProperty(key, row, path, schema, columns, options)\r\n\r\n if (propertyErrors) {\r\n errors = errors.concat(propertyErrors)\r\n } else {\r\n object[key] = value\r\n // Will perform `required` validation later, when all properties have been parsed.\r\n if (pendingRequiredValidation) {\r\n pendingRequiredValidations.push(pendingRequiredValidation)\r\n }\r\n // Potentially unmark the object as \"empty\".\r\n if (isEmptyObject && !isEmptyValue(value)) {\r\n isEmptyObject = false\r\n }\r\n }\r\n }\r\n\r\n // Perform basic `required` validations (i.e. when `required` property is a boolean).\r\n for (const { required, schemaEntry, value } of pendingRequiredValidations) {\r\n if (required === true) {\r\n errors.push(createError({\r\n error: 'required',\r\n schemaEntry,\r\n value\r\n }))\r\n }\r\n }\r\n\r\n // If there were any errors, return them.\r\n if (errors.length > 0) {\r\n return { errors }\r\n }\r\n\r\n // Perform \"complex\" `required` validations (i.e. when `required` property is a function).\r\n // These \"complex\" `required` validations should only be performed when all properties\r\n // of an object have been parsed correctly because these validations rely on the values\r\n // of other properties.\r\n for (const { required, schemaEntry, value } of pendingRequiredValidations) {\r\n if (typeof required !== 'boolean' && required(object)) {\r\n errors.push(createError({\r\n error: 'required',\r\n schemaEntry,\r\n value\r\n }))\r\n }\r\n }\r\n\r\n // If there were any \"complex\" `required` errors, return them.\r\n if (errors.length > 0) {\r\n return { errors }\r\n }\r\n\r\n // Return `null` for an \"empty\" mapped object.\r\n if (isEmptyObject) {\r\n return {\r\n object: options.transformEmptyObject(object, { path })\r\n }\r\n }\r\n\r\n return { object }\r\n}\r\n\r\nfunction parseProperty(key, row, path, schema, columns, options) {\r\n const schemaEntry = schema[key]\r\n\r\n const columnIndex = schemaEntry.column ? columns.indexOf(schemaEntry.column) : undefined\r\n const isMissingColumn = columnIndex < 0\r\n\r\n // The path of this property inside the top-level object.\r\n const propertyPath = `${path ? path + '.' : ''}${key}`\r\n\r\n const {\r\n errors,\r\n value\r\n } = schemaEntry.schema\r\n ? parseNestedObject(row, schemaEntry.schema, propertyPath, columns, options)\r\n : (\r\n isMissingColumn\r\n ? { value: options.propertyValueWhenColumnIsMissing }\r\n : parseDataCellValue(row[columnIndex], schemaEntry, propertyPath, options)\r\n )\r\n\r\n if (errors) {\r\n return { errors }\r\n }\r\n\r\n // Should apply `required` validation if the value is \"empty\".\r\n let pendingRequiredValidation\r\n if (schemaEntry.required && isEmptyValue(value)) {\r\n // // Can optionally skip `required` validation for certain missing columns.\r\n // const skipRequiredValidation = isMissingColumn && options.shouldSkipRequiredValidationWhenColumnIsMissing(schemaEntry.column, { object: ... })\r\n // if (!skipRequiredValidation) { ... }\r\n\r\n // Will perform `required` validation in the end,\r\n // when all properties of the object have been parsed.\r\n // This is because `required` could also be a function of `object`.\r\n pendingRequiredValidation = {\r\n required: schemaEntry.required,\r\n schemaEntry,\r\n value\r\n }\r\n }\r\n\r\n return { value, pendingRequiredValidation }\r\n}\r\n\r\nfunction parseNestedObject(row, schema, propertyPath, columns, options) {\r\n const {\r\n object,\r\n errors\r\n } = parseDataRow(row, schema, propertyPath, columns, options)\r\n return {\r\n value: object,\r\n errors\r\n }\r\n}\r\n\r\nfunction parseDataCellValue(cellValue, schemaEntry, propertyPath, options) {\r\n const {\r\n value: propertyValue,\r\n error: errorMessage,\r\n reason\r\n } = parseDataCellValue_(cellValue, schemaEntry, propertyPath, options)\r\n\r\n if (errorMessage) {\r\n const error = createError({\r\n schemaEntry,\r\n value: cellValue,\r\n error: errorMessage,\r\n reason\r\n })\r\n return { errors: [error] }\r\n } else {\r\n return { value: propertyValue }\r\n }\r\n}\r\n\r\n/**\r\n * Converts a cell value value to a javascript typed value.\r\n * @param {any} value\r\n * @param {object} schemaEntry\r\n * @param {string} propertyPath\r\n * @param {object} options\r\n * @return {{ value?: any, error?: string, reason?: string }}\r\n */\r\nfunction parseDataCellValue_(cellValue, schemaEntry, propertyPath, options) {\r\n if (cellValue === undefined) {\r\n // This isn't supposed to be possible when reading spreadsheet data:\r\n // cell values are always read as `null` when those cells are empty.\r\n // It's currently impossible for `read-excel-file` to return `undefined` cell value.\r\n // Here it uses some \"sensible default\" fallback by treating `undefined` as \"column missing\".\r\n return {\r\n value: options.propertyValueWhenColumnIsMissing\r\n }\r\n }\r\n\r\n if (cellValue === null) {\r\n return {\r\n value: options.propertyValueWhenCellIsEmpty\r\n }\r\n }\r\n\r\n if (Array.isArray(schemaEntry.type)) {\r\n const errors = []\r\n const reasons = []\r\n const values = parseSeparatedSubstrings(cellValue, options.arrayValueSeparator).map((substring) => {\r\n // If any substring was already detected to be invalid\r\n // don't attempt to parse any other substrings.\r\n if (errors.length > 0) {\r\n return\r\n }\r\n const { value, error, reason } = parseValue(substring, schemaEntry, options)\r\n if (error) {\r\n errors.push(error)\r\n reasons.push(reason)\r\n return\r\n }\r\n return value\r\n })\r\n if (errors.length > 0) {\r\n return {\r\n error: errors[0],\r\n reason: reasons[0]\r\n }\r\n }\r\n const isEmpty = values.every(isEmptyValue)\r\n if (isEmpty) {\r\n return {\r\n value: options.transformEmptyArray(values, { path: propertyPath })\r\n }\r\n }\r\n return {\r\n value: values\r\n }\r\n }\r\n\r\n return parseValue(cellValue, schemaEntry, options)\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\r\n let result\r\n if (schemaEntry.type) {\r\n result = parseValueOfType(\r\n value,\r\n // Supports parsing array types.\r\n // See `parseSeparatedSubstrings()` 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 // The default `type` is `String`.\r\n result = { value: value }\r\n // throw new Error('Invalid schema entry: no `type` specified:\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n\r\n // Validate the value.\r\n if (result.value !== null) {\r\n // Perform `oneOf` validation.\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid', reason: 'unknown' }\r\n }\r\n // Perform `validate()` validation.\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\r\n return result\r\n}\r\n\r\n/**\r\n * Converts cell value to a javascript typed value.\r\n * @param {(string|number|boolean|Date)} value\r\n * @param {function} type\r\n * @return {object} Either `{ value: (string|number|Date|boolean) }` or `{ error: string, reason?: string }`\r\n */\r\nfunction parseValueOfType(value, type) {\r\n switch (type) {\r\n case String:\r\n return parseValueUsingTypeParser(value, StringType)\r\n\r\n case Number:\r\n return parseValueUsingTypeParser(value, NumberType)\r\n\r\n case Date:\r\n return parseValueUsingTypeParser(value, DateType)\r\n\r\n case Boolean:\r\n return parseValueUsingTypeParser(value, BooleanType)\r\n\r\n default:\r\n // Validate `type`\r\n if (typeof type !== 'function') {\r\n throw new Error(`Unsupported schema \\`type\\`: ${type && type.name || type}`)\r\n }\r\n return parseValueUsingTypeParser(value, type)\r\n }\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `type`.\r\n * @param {any} value\r\n * @param {function} type\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseValueUsingTypeParser(value, type) {\r\n try {\r\n const parsedValue = type(value)\r\n // Returning `undefined` from a `type` parser is treated as returning `null`.\r\n if (parsedValue === undefined) {\r\n return { value: null }\r\n }\r\n return { value: parsedValue }\r\n } catch (error) {\r\n const result = { error: error.message }\r\n if (error.reason) {\r\n result.reason = error.reason;\r\n }\r\n return result\r\n }\r\n}\r\n\r\nexport function getNextSubstring(string, endCharacter, startIndex) {\r\n let i = 0\r\n let substring = ''\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 // Previously, it used to treat `\"` character similar to how it's treated in `.csv` files:\r\n // any commas inside quotes are ignored. But then I thought that it could introduce more\r\n // issues than it was originally intending to fix, and it also didn't provide an \"escape\" mechanism.\r\n // Overall, a decision was made to simplify the whole thing and drop the concept of quotes as special characters.\r\n //\r\n // else if (character === '\"') {\r\n // const quotedSubstring = getNextSubstring(string, '\"', startIndex + i + 1)\r\n // substring += quotedSubstring[0]\r\n // i += '\"'.length + quotedSubstring[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 parseSeparatedSubstrings(string, arrayValueSeparator) {\r\n const elements = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getNextSubstring(string, arrayValueSeparator, index)\r\n index += length + arrayValueSeparator.length\r\n elements.push(substring.trim())\r\n }\r\n return elements\r\n}\r\n\r\nfunction createError({\r\n schemaEntry,\r\n value,\r\n error: errorMessage,\r\n reason\r\n}) {\r\n const error = {\r\n error: errorMessage,\r\n column: schemaEntry.column,\r\n value\r\n }\r\n if (reason) {\r\n error.reason = reason\r\n }\r\n // * Regular values specify a `type?` property, which is included in the `error` object.\r\n // * Nested objects specify a `schema` property, which is not included in the `error` object.\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n return error\r\n}\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const schemaEntry = schema[key]\r\n // Validate that the `schema` is not using a deprecated `type: nestedSchema` format.\r\n if (typeof schemaEntry.type === 'object' && !Array.isArray(schemaEntry.type)) {\r\n throw new Error('When defining a nested schema, use a `schema` property instead of a `type` property')\r\n }\r\n // Validate that every property has a source `column` title specified for it.\r\n if (!schemaEntry.schema) {\r\n if (!schemaEntry.column) {\r\n throw new Error(`\"column\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction isEmptyValue(value) {\r\n return value === undefined || value === null\r\n}\r\n\r\nconst DEFAULT_OPTIONS = {\r\n propertyValueWhenColumnIsMissing: undefined,\r\n propertyValueWhenCellIsEmpty: null,\r\n // shouldSkipRequiredValidationWhenColumnIsMissing: () => false,\r\n // `transformEmptyObject(object, { path })` applies to both the top-level object\r\n // and any of its nested objects.\r\n transformEmptyObject: () => null,\r\n transformEmptyArray: () => null,\r\n arrayValueSeparator: ','\r\n}\r\n\r\nfunction applyDefaultOptions(options) {\r\n if (options) {\r\n return {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n return DEFAULT_OPTIONS\r\n }\r\n}"],"mappings":"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"}
|