read-excel-file 5.7.0 → 5.8.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 +10 -0
- package/README.md +45 -19
- package/bundle/read-excel-file.min.js +1 -1
- package/bundle/read-excel-file.min.js.map +1 -1
- package/commonjs/read/coordinates.js +7 -10
- package/commonjs/read/coordinates.js.map +1 -1
- package/commonjs/read/dropEmptyColumns.js +6 -18
- package/commonjs/read/dropEmptyColumns.js.map +1 -1
- package/commonjs/read/dropEmptyColumns.test.js.map +1 -1
- package/commonjs/read/dropEmptyRows.js +11 -23
- package/commonjs/read/dropEmptyRows.js.map +1 -1
- package/commonjs/read/dropEmptyRows.test.js.map +1 -1
- package/commonjs/read/getData.js +31 -43
- package/commonjs/read/getData.js.map +1 -1
- package/commonjs/read/isDateTimestamp.js +51 -40
- package/commonjs/read/isDateTimestamp.js.map +1 -1
- package/commonjs/read/parseCell.js +3 -10
- package/commonjs/read/parseCell.js.map +1 -1
- package/commonjs/read/parseCellValue.js +28 -59
- package/commonjs/read/parseCellValue.js.map +1 -1
- package/commonjs/read/parseCells.js +3 -7
- package/commonjs/read/parseCells.js.map +1 -1
- package/commonjs/read/parseDate.js +5 -5
- package/commonjs/read/parseDate.js.map +1 -1
- package/commonjs/read/parseDate.test.js.map +1 -1
- package/commonjs/read/parseDimensions.js +6 -18
- package/commonjs/read/parseDimensions.js.map +1 -1
- package/commonjs/read/parseFilePaths.js +4 -11
- package/commonjs/read/parseFilePaths.js.map +1 -1
- package/commonjs/read/parseProperties.js +6 -8
- package/commonjs/read/parseProperties.js.map +1 -1
- package/commonjs/read/parseSharedStrings.js +0 -3
- package/commonjs/read/parseSharedStrings.js.map +1 -1
- package/commonjs/read/parseSheet.js +3 -7
- package/commonjs/read/parseSheet.js.map +1 -1
- package/commonjs/read/parseStyles.js +13 -21
- package/commonjs/read/parseStyles.js.map +1 -1
- package/commonjs/read/readSheetNamesBrowser.js +0 -3
- package/commonjs/read/readSheetNamesBrowser.js.map +1 -1
- package/commonjs/read/readSheetNamesNode.js +0 -3
- package/commonjs/read/readSheetNamesNode.js.map +1 -1
- package/commonjs/read/readSheetNamesNode.test.js.map +1 -1
- package/commonjs/read/readSheetNamesWebWorker.js +0 -3
- package/commonjs/read/readSheetNamesWebWorker.js.map +1 -1
- package/commonjs/read/readXlsx.js +34 -42
- package/commonjs/read/readXlsx.js.map +1 -1
- package/commonjs/read/readXlsxFileBrowser.js +0 -5
- package/commonjs/read/readXlsxFileBrowser.js.map +1 -1
- package/commonjs/read/readXlsxFileContents.js +12 -22
- package/commonjs/read/readXlsxFileContents.js.map +1 -1
- package/commonjs/read/readXlsxFileNode.js +0 -5
- package/commonjs/read/readXlsxFileNode.js.map +1 -1
- package/commonjs/read/readXlsxFileNode.test.js.map +1 -1
- package/commonjs/read/readXlsxFileWebWorker.js +0 -5
- package/commonjs/read/readXlsxFileWebWorker.js.map +1 -1
- package/commonjs/read/schema/convertMapToSchema.js +1 -8
- package/commonjs/read/schema/convertMapToSchema.js.map +1 -1
- package/commonjs/read/schema/convertMapToSchema.test.js.map +1 -1
- package/commonjs/read/schema/convertToJson.js +143 -142
- package/commonjs/read/schema/convertToJson.js.map +1 -1
- package/commonjs/read/schema/convertToJson.legacy.js +60 -0
- package/commonjs/read/schema/convertToJson.legacy.js.map +1 -0
- package/commonjs/read/schema/convertToJson.legacy.test.js.map +1 -0
- package/commonjs/read/schema/convertToJson.spreadsheet.js +25 -0
- package/commonjs/read/schema/convertToJson.spreadsheet.js.map +1 -0
- package/commonjs/read/schema/convertToJson.spreadsheet.test.js.map +1 -0
- package/commonjs/read/schema/convertToJson.test.js.map +1 -1
- package/commonjs/read/unpackXlsxFileBrowser.js +3 -9
- package/commonjs/read/unpackXlsxFileBrowser.js.map +1 -1
- package/commonjs/read/unpackXlsxFileNode.js +9 -15
- package/commonjs/read/unpackXlsxFileNode.js.map +1 -1
- package/commonjs/types/Boolean.js +0 -4
- package/commonjs/types/Boolean.js.map +1 -1
- package/commonjs/types/Date.js +0 -12
- package/commonjs/types/Date.js.map +1 -1
- package/commonjs/types/Email.js +0 -7
- package/commonjs/types/Email.js.map +1 -1
- package/commonjs/types/Email.test.js.map +1 -1
- package/commonjs/types/Integer.js +0 -7
- package/commonjs/types/Integer.js.map +1 -1
- package/commonjs/types/Integer.test.js.map +1 -1
- package/commonjs/types/InvalidError.js +8 -28
- package/commonjs/types/InvalidError.js.map +1 -1
- package/commonjs/types/Number.js +2 -10
- package/commonjs/types/Number.js.map +1 -1
- package/commonjs/types/String.js +4 -11
- package/commonjs/types/String.js.map +1 -1
- package/commonjs/types/URL.js +5 -8
- package/commonjs/types/URL.js.map +1 -1
- package/commonjs/types/URL.test.js.map +1 -1
- package/commonjs/xml/dom.js +6 -25
- package/commonjs/xml/dom.js.map +1 -1
- package/commonjs/xml/xlsx.js +1 -24
- package/commonjs/xml/xlsx.js.map +1 -1
- package/commonjs/xml/xml.js +1 -4
- package/commonjs/xml/xml.js.map +1 -1
- package/commonjs/xml/xmlBrowser.js +1 -2
- package/commonjs/xml/xmlBrowser.js.map +1 -1
- package/commonjs/xml/xpath/xlsx-xpath.js +3 -16
- package/commonjs/xml/xpath/xlsx-xpath.js.map +1 -1
- package/commonjs/xml/xpath/xpathBrowser.js +3 -5
- package/commonjs/xml/xpath/xpathBrowser.js.map +1 -1
- package/commonjs/xml/xpath/xpathNode.js +1 -5
- package/commonjs/xml/xpath/xpathNode.js.map +1 -1
- package/map/index.cjs +2 -0
- package/map/index.cjs.js +7 -0
- package/map/index.d.ts +11 -0
- package/map/index.js +1 -0
- package/map/package.json +17 -0
- package/modules/read/coordinates.js +7 -8
- package/modules/read/coordinates.js.map +1 -1
- package/modules/read/dropEmptyColumns.js +6 -17
- package/modules/read/dropEmptyColumns.js.map +1 -1
- package/modules/read/dropEmptyColumns.test.js.map +1 -1
- package/modules/read/dropEmptyRows.js +11 -22
- package/modules/read/dropEmptyRows.js.map +1 -1
- package/modules/read/dropEmptyRows.test.js.map +1 -1
- package/modules/read/getData.js +31 -39
- package/modules/read/getData.js.map +1 -1
- package/modules/read/isDateTimestamp.js +52 -39
- package/modules/read/isDateTimestamp.js.map +1 -1
- package/modules/read/parseCell.js +6 -6
- package/modules/read/parseCell.js.map +1 -1
- package/modules/read/parseCellValue.js +30 -55
- package/modules/read/parseCellValue.js.map +1 -1
- package/modules/read/parseCells.js +3 -3
- package/modules/read/parseCells.js.map +1 -1
- package/modules/read/parseDate.js +5 -4
- package/modules/read/parseDate.js.map +1 -1
- package/modules/read/parseDate.test.js.map +1 -1
- package/modules/read/parseDimensions.js +9 -17
- package/modules/read/parseDimensions.js.map +1 -1
- package/modules/read/parseFilePaths.js +5 -10
- package/modules/read/parseFilePaths.js.map +1 -1
- package/modules/read/parseProperties.js +8 -7
- package/modules/read/parseProperties.js.map +1 -1
- package/modules/read/parseSharedStrings.js +0 -1
- package/modules/read/parseSharedStrings.js.map +1 -1
- package/modules/read/parseSheet.js +3 -2
- package/modules/read/parseSheet.js.map +1 -1
- package/modules/read/parseStyles.js +16 -21
- package/modules/read/parseStyles.js.map +1 -1
- package/modules/read/readSheetNamesBrowser.js +1 -1
- package/modules/read/readSheetNamesBrowser.js.map +1 -1
- package/modules/read/readSheetNamesNode.js +1 -1
- package/modules/read/readSheetNamesNode.js.map +1 -1
- package/modules/read/readSheetNamesNode.test.js.map +1 -1
- package/modules/read/readSheetNamesWebWorker.js +1 -1
- package/modules/read/readSheetNamesWebWorker.js.map +1 -1
- package/modules/read/readXlsx.js +37 -35
- package/modules/read/readXlsx.js.map +1 -1
- package/modules/read/readXlsxFileBrowser.js +1 -1
- package/modules/read/readXlsxFileBrowser.js.map +1 -1
- package/modules/read/readXlsxFileContents.js +12 -17
- package/modules/read/readXlsxFileContents.js.map +1 -1
- package/modules/read/readXlsxFileNode.js +1 -1
- package/modules/read/readXlsxFileNode.js.map +1 -1
- package/modules/read/readXlsxFileNode.test.js.map +1 -1
- package/modules/read/readXlsxFileWebWorker.js +1 -1
- package/modules/read/readXlsxFileWebWorker.js.map +1 -1
- package/modules/read/schema/convertMapToSchema.js +1 -7
- package/modules/read/schema/convertMapToSchema.js.map +1 -1
- package/modules/read/schema/convertMapToSchema.test.js.map +1 -1
- package/modules/read/schema/convertToJson.js +143 -133
- package/modules/read/schema/convertToJson.js.map +1 -1
- package/modules/read/schema/convertToJson.legacy.js +53 -0
- package/modules/read/schema/convertToJson.legacy.js.map +1 -0
- package/modules/read/schema/convertToJson.legacy.test.js.map +1 -0
- package/modules/read/schema/convertToJson.spreadsheet.js +19 -0
- package/modules/read/schema/convertToJson.spreadsheet.js.map +1 -0
- package/modules/read/schema/convertToJson.spreadsheet.test.js.map +1 -0
- package/modules/read/schema/convertToJson.test.js.map +1 -1
- package/modules/read/unpackXlsxFileBrowser.js +4 -7
- package/modules/read/unpackXlsxFileBrowser.js.map +1 -1
- package/modules/read/unpackXlsxFileNode.js +9 -7
- package/modules/read/unpackXlsxFileNode.js.map +1 -1
- package/modules/types/Boolean.js +0 -1
- package/modules/types/Boolean.js.map +1 -1
- package/modules/types/Date.js +0 -8
- package/modules/types/Date.js.map +1 -1
- package/modules/types/Email.js +0 -2
- package/modules/types/Email.js.map +1 -1
- package/modules/types/Email.test.js.map +1 -1
- package/modules/types/Integer.js +0 -2
- package/modules/types/Integer.js.map +1 -1
- package/modules/types/Integer.test.js.map +1 -1
- package/modules/types/InvalidError.js +7 -25
- package/modules/types/InvalidError.js.map +1 -1
- package/modules/types/Number.js +2 -7
- package/modules/types/Number.js.map +1 -1
- package/modules/types/String.js +4 -8
- package/modules/types/String.js.map +1 -1
- package/modules/types/URL.js +5 -4
- package/modules/types/URL.js.map +1 -1
- package/modules/types/URL.test.js.map +1 -1
- package/modules/xml/dom.js +6 -18
- package/modules/xml/dom.js.map +1 -1
- package/modules/xml/xlsx.js +4 -13
- package/modules/xml/xlsx.js.map +1 -1
- package/modules/xml/xml.js.map +1 -1
- package/modules/xml/xmlBrowser.js.map +1 -1
- package/modules/xml/xpath/xlsx-xpath.js +2 -1
- package/modules/xml/xpath/xlsx-xpath.js.map +1 -1
- package/modules/xml/xpath/xpathBrowser.js +3 -4
- package/modules/xml/xpath/xpathBrowser.js.map +1 -1
- package/modules/xml/xpath/xpathNode.js +1 -0
- package/modules/xml/xpath/xpathNode.js.map +1 -1
- package/package.json +6 -1
- package/schema/index.cjs +2 -2
- package/schema/index.cjs.js +2 -2
- package/schema/index.d.ts +7 -2
- package/schema/index.js +1 -1
- package/types.d.ts +26 -3
|
@@ -1,176 +1,191 @@
|
|
|
1
1
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
|
-
|
|
3
2
|
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."); }
|
|
4
|
-
|
|
5
|
-
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
6
|
-
|
|
3
|
+
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; } }
|
|
7
4
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
8
|
-
|
|
9
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
10
|
-
|
|
5
|
+
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); }
|
|
11
6
|
function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
12
|
-
|
|
13
7
|
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); }
|
|
14
|
-
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
function
|
|
18
|
-
|
|
19
|
-
function
|
|
20
|
-
|
|
21
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
22
|
-
|
|
8
|
+
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; }
|
|
9
|
+
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; }
|
|
10
|
+
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; }
|
|
11
|
+
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; }
|
|
12
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
13
|
+
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); }
|
|
23
14
|
import NumberType from '../../types/Number.js';
|
|
24
15
|
import StringType from '../../types/String.js';
|
|
25
16
|
import BooleanType from '../../types/Boolean.js';
|
|
26
17
|
import DateType from '../../types/Date.js';
|
|
27
18
|
var DEFAULT_OPTIONS = {
|
|
28
|
-
|
|
19
|
+
schemaPropertyValueForMissingColumn: undefined,
|
|
20
|
+
schemaPropertyValueForUndefinedCellValue: undefined,
|
|
21
|
+
schemaPropertyValueForNullCellValue: null,
|
|
22
|
+
schemaPropertyShouldSkipRequiredValidationForMissingColumn: function schemaPropertyShouldSkipRequiredValidationForMissingColumn() {
|
|
23
|
+
return false;
|
|
24
|
+
},
|
|
25
|
+
// `getEmptyObjectValue(object, { path })` applies to both the top-level object
|
|
26
|
+
// and any of its sub-objects.
|
|
27
|
+
getEmptyObjectValue: function getEmptyObjectValue() {
|
|
28
|
+
return null;
|
|
29
|
+
},
|
|
30
|
+
getEmptyArrayValue: function getEmptyArrayValue() {
|
|
31
|
+
return null;
|
|
32
|
+
},
|
|
33
|
+
isColumnOriented: false,
|
|
34
|
+
arrayValueSeparator: ','
|
|
29
35
|
};
|
|
36
|
+
|
|
30
37
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
38
|
+
* (this function is exported from `read-excel-file/map`)
|
|
39
|
+
* Converts spreadsheet-alike data structure into an array of objects.
|
|
40
|
+
* The first row should be the list of column headers.
|
|
34
41
|
* @param {any[][]} data - An array of rows, each row being an array of cells.
|
|
35
42
|
* @param {object} schema
|
|
43
|
+
* @param {object} [options]
|
|
44
|
+
* @param {null} [options.schemaPropertyValueForMissingColumn] — 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 `schemaPropertyValueForMissingColumn: null` to set such "missing column" properties to `null` in the output objects.
|
|
45
|
+
* @param {null} [options.schemaPropertyValueForNullCellValue] — By default, when it encounters a `null` value in a cell in input `data`, it sets it to `undefined` in the output object. Pass `schemaPropertyValueForNullCellValue: null` to make it set such values as `null`s in output objects.
|
|
46
|
+
* @param {null} [options.schemaPropertyValueForUndefinedCellValue] — By default, when it encounters an `undefined` value in a cell in input `data`, it it sets it to `undefined` in the output object. Pass `schemaPropertyValueForUndefinedCellValue: null` to make it set such values as `null`s in output objects.
|
|
47
|
+
* @param {boolean} [options.schemaPropertyShouldSkipRequiredValidationForMissingColumn(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 `schemaPropertyShouldSkipRequiredValidationForMissingColumn(column, { object })` to disable `required` validation for missing columns in some or all cases.
|
|
48
|
+
* @param {function} [options.getEmptyObjectValue(object, { path })] — By default, it returns `null` for an "empty" resulting object. One could override that value using `getEmptyObjectValue(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.
|
|
49
|
+
* @param {function} [getEmptyArrayValue(array, { path })] — By default, it returns `null` for an "empty" array value. One could override that value using `getEmptyArrayValue(array, { path })` parameter.
|
|
50
|
+
* @param {boolean} [options.isColumnOriented] — By default, the headers are assumed to be the first row in the `data`. Pass `isColumnOriented: true` if the headers are the first column in the `data`. i.e. if `data` is "transposed".
|
|
51
|
+
* @param {object} [options.rowIndexMap] — Custom row index mapping `data` rows. If present, will overwrite the indexes of `data` rows with the indexes from this `rowIndexMap`.
|
|
36
52
|
* @return {object[]}
|
|
37
53
|
*/
|
|
38
|
-
|
|
39
54
|
export default function (data, schema, options) {
|
|
40
55
|
if (options) {
|
|
41
56
|
options = _objectSpread(_objectSpread({}, DEFAULT_OPTIONS), options);
|
|
42
57
|
} else {
|
|
43
58
|
options = DEFAULT_OPTIONS;
|
|
44
59
|
}
|
|
45
|
-
|
|
46
60
|
var _options = options,
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
ignoreEmptyRows = _options.ignoreEmptyRows;
|
|
61
|
+
isColumnOriented = _options.isColumnOriented,
|
|
62
|
+
rowIndexMap = _options.rowIndexMap;
|
|
50
63
|
validateSchema(schema);
|
|
51
|
-
|
|
52
64
|
if (isColumnOriented) {
|
|
53
65
|
data = transpose(data);
|
|
54
66
|
}
|
|
55
|
-
|
|
56
67
|
var columns = data[0];
|
|
57
68
|
var results = [];
|
|
58
69
|
var errors = [];
|
|
59
|
-
|
|
60
70
|
for (var i = 1; i < data.length; i++) {
|
|
61
|
-
var result = read(schema, data[i], i, columns, errors, options);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
results.push(result);
|
|
65
|
-
}
|
|
66
|
-
} // Correct error rows.
|
|
67
|
-
|
|
71
|
+
var result = read(schema, data[i], i, undefined, columns, errors, options);
|
|
72
|
+
results.push(result);
|
|
73
|
+
}
|
|
68
74
|
|
|
69
|
-
if
|
|
75
|
+
// Set the correct `row` number in `errors` if a custom `rowIndexMap` is supplied.
|
|
76
|
+
if (rowIndexMap) {
|
|
70
77
|
for (var _iterator = _createForOfIteratorHelperLoose(errors), _step; !(_step = _iterator()).done;) {
|
|
71
78
|
var error = _step.value;
|
|
72
79
|
// Convert the `row` index in `data` to the
|
|
73
80
|
// actual `row` index in the spreadsheet.
|
|
74
81
|
// `- 1` converts row number to row index.
|
|
75
82
|
// `+ 1` converts row index to row number.
|
|
76
|
-
error.row =
|
|
83
|
+
error.row = rowIndexMap[error.row - 1] + 1;
|
|
77
84
|
}
|
|
78
85
|
}
|
|
79
|
-
|
|
80
86
|
return {
|
|
81
87
|
rows: results,
|
|
82
88
|
errors: errors
|
|
83
89
|
};
|
|
84
90
|
}
|
|
85
|
-
|
|
86
|
-
function read(schema, row, rowIndex, columns, errors, options) {
|
|
91
|
+
function read(schema, row, rowIndex, path, columns, errors, options) {
|
|
87
92
|
var object = {};
|
|
88
93
|
var isEmptyObject = true;
|
|
89
|
-
|
|
90
94
|
var createError = function createError(_ref) {
|
|
91
95
|
var column = _ref.column,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
96
|
+
value = _ref.value,
|
|
97
|
+
errorMessage = _ref.error,
|
|
98
|
+
reason = _ref.reason;
|
|
95
99
|
var error = {
|
|
96
100
|
error: errorMessage,
|
|
97
101
|
row: rowIndex + 1,
|
|
98
102
|
column: column,
|
|
99
103
|
value: value
|
|
100
104
|
};
|
|
101
|
-
|
|
102
105
|
if (reason) {
|
|
103
106
|
error.reason = reason;
|
|
104
107
|
}
|
|
105
|
-
|
|
106
108
|
if (schema[column].type) {
|
|
107
109
|
error.type = schema[column].type;
|
|
108
110
|
}
|
|
109
|
-
|
|
110
111
|
return error;
|
|
111
112
|
};
|
|
112
|
-
|
|
113
113
|
var pendingRequiredChecks = [];
|
|
114
114
|
|
|
115
|
+
// For each schema entry.
|
|
115
116
|
var _loop = function _loop() {
|
|
116
117
|
var key = _Object$keys[_i];
|
|
117
118
|
var schemaEntry = schema[key];
|
|
118
119
|
var isNestedSchema = _typeof(schemaEntry.type) === 'object' && !Array.isArray(schemaEntry.type);
|
|
119
|
-
var rawValue = row[columns.indexOf(key)];
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
121
|
+
// The path of this property inside the resulting object.
|
|
122
|
+
var propertyPath = "".concat(path || '', ".").concat(schemaEntry.prop);
|
|
124
123
|
|
|
125
|
-
|
|
126
|
-
var
|
|
127
|
-
var
|
|
124
|
+
// Read the cell value for the schema entry.
|
|
125
|
+
var cellValue;
|
|
126
|
+
var columnIndex = columns.indexOf(key);
|
|
127
|
+
var isMissingColumn = columnIndex < 0;
|
|
128
|
+
if (!isMissingColumn) {
|
|
129
|
+
cellValue = row[columnIndex];
|
|
130
|
+
}
|
|
131
|
+
var value;
|
|
132
|
+
var error;
|
|
133
|
+
var reason;
|
|
128
134
|
|
|
135
|
+
// Get property `value` from cell value.
|
|
129
136
|
if (isNestedSchema) {
|
|
130
|
-
value = read(schemaEntry.type, row, rowIndex, columns, errors, options);
|
|
137
|
+
value = read(schemaEntry.type, row, rowIndex, propertyPath, columns, errors, options);
|
|
131
138
|
} else {
|
|
132
|
-
if (
|
|
133
|
-
value =
|
|
139
|
+
if (isMissingColumn) {
|
|
140
|
+
value = options.schemaPropertyValueForMissingColumn;
|
|
141
|
+
} else if (cellValue === undefined) {
|
|
142
|
+
value = options.schemaPropertyValueForUndefinedCellValue;
|
|
143
|
+
} else if (cellValue === null) {
|
|
144
|
+
value = options.schemaPropertyValueForNullCellValue;
|
|
134
145
|
} else if (Array.isArray(schemaEntry.type)) {
|
|
135
|
-
var
|
|
136
|
-
|
|
146
|
+
var array = parseArray(cellValue, options.arrayValueSeparator).map(function (_value) {
|
|
147
|
+
if (error) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
137
150
|
var result = parseValue(_value, schemaEntry, options);
|
|
138
|
-
|
|
139
151
|
if (result.error) {
|
|
152
|
+
// In case of an error, `value` won't be returned and will just be reported
|
|
153
|
+
// as part of an `error` object, so it's fine assigning just an element of the array.
|
|
140
154
|
value = _value;
|
|
141
155
|
error = result.error;
|
|
142
156
|
reason = result.reason;
|
|
143
157
|
}
|
|
144
|
-
|
|
145
|
-
if (result.value !== null) {
|
|
146
|
-
notEmpty = true;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
158
|
return result.value;
|
|
150
159
|
});
|
|
151
|
-
|
|
152
160
|
if (!error) {
|
|
153
|
-
|
|
161
|
+
var isEmpty = array.every(isEmptyValue);
|
|
162
|
+
value = isEmpty ? options.getEmptyArrayValue(array, {
|
|
163
|
+
path: propertyPath
|
|
164
|
+
}) : array;
|
|
154
165
|
}
|
|
155
166
|
} else {
|
|
156
|
-
var result = parseValue(
|
|
167
|
+
var result = parseValue(cellValue, schemaEntry, options);
|
|
157
168
|
error = result.error;
|
|
158
169
|
reason = result.reason;
|
|
159
|
-
value = error ?
|
|
170
|
+
value = error ? cellValue : result.value;
|
|
160
171
|
}
|
|
161
172
|
}
|
|
162
173
|
|
|
163
|
-
if
|
|
164
|
-
|
|
174
|
+
// Apply `required` validation if the value is "empty".
|
|
175
|
+
if (!error && isEmptyValue(value)) {
|
|
176
|
+
if (schemaEntry.required) {
|
|
177
|
+
// Will perform this `required()` validation in the end,
|
|
178
|
+
// when all properties of the mapped object have been mapped.
|
|
165
179
|
pendingRequiredChecks.push({
|
|
166
|
-
column: key
|
|
180
|
+
column: key,
|
|
181
|
+
value: value,
|
|
182
|
+
isMissingColumn: isMissingColumn
|
|
167
183
|
});
|
|
168
|
-
} else if (schemaEntry.required === true) {
|
|
169
|
-
error = 'required';
|
|
170
184
|
}
|
|
171
185
|
}
|
|
172
|
-
|
|
173
186
|
if (error) {
|
|
187
|
+
// If there was an error then the property value in the `object` will be `undefined`,
|
|
188
|
+
// i.e it won't add the property value to the mapped object.
|
|
174
189
|
errors.push(createError({
|
|
175
190
|
column: key,
|
|
176
191
|
value: value,
|
|
@@ -178,60 +193,73 @@ function read(schema, row, rowIndex, columns, errors, options) {
|
|
|
178
193
|
reason: reason
|
|
179
194
|
}));
|
|
180
195
|
} else {
|
|
181
|
-
|
|
196
|
+
// Possibly unmark the mapped object as "empty".
|
|
197
|
+
if (isEmptyObject && !isEmptyValue(value)) {
|
|
182
198
|
isEmptyObject = false;
|
|
183
199
|
}
|
|
184
|
-
|
|
185
|
-
|
|
200
|
+
// Set the value in the mapped object.
|
|
201
|
+
// Skip setting `undefined` values because they're already `undefined`.
|
|
202
|
+
if (value !== undefined) {
|
|
186
203
|
object[schemaEntry.prop] = value;
|
|
187
204
|
}
|
|
188
205
|
}
|
|
189
206
|
};
|
|
190
|
-
|
|
191
207
|
for (var _i = 0, _Object$keys = Object.keys(schema); _i < _Object$keys.length; _i++) {
|
|
192
208
|
_loop();
|
|
193
209
|
}
|
|
194
210
|
|
|
211
|
+
// Return `null` for an "empty" mapped object.
|
|
195
212
|
if (isEmptyObject) {
|
|
196
|
-
return
|
|
213
|
+
return options.getEmptyObjectValue(object, {
|
|
214
|
+
path: path
|
|
215
|
+
});
|
|
197
216
|
}
|
|
198
217
|
|
|
218
|
+
// Perform any `required` validations.
|
|
199
219
|
for (var _i2 = 0, _pendingRequiredCheck = pendingRequiredChecks; _i2 < _pendingRequiredCheck.length; _i2++) {
|
|
200
|
-
var
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
220
|
+
var _pendingRequiredCheck2 = _pendingRequiredCheck[_i2],
|
|
221
|
+
column = _pendingRequiredCheck2.column,
|
|
222
|
+
value = _pendingRequiredCheck2.value,
|
|
223
|
+
isMissingColumn = _pendingRequiredCheck2.isMissingColumn;
|
|
224
|
+
// Can optionally skip `required` validation for missing columns.
|
|
225
|
+
var skipRequiredValidation = isMissingColumn && options.schemaPropertyShouldSkipRequiredValidationForMissingColumn(column, {
|
|
226
|
+
object: object
|
|
227
|
+
});
|
|
228
|
+
if (!skipRequiredValidation) {
|
|
229
|
+
var required = schema[column].required;
|
|
230
|
+
var isRequired = typeof required === 'boolean' ? required : required(object);
|
|
231
|
+
if (isRequired) {
|
|
232
|
+
errors.push(createError({
|
|
233
|
+
column: column,
|
|
234
|
+
value: value,
|
|
235
|
+
error: 'required'
|
|
236
|
+
}));
|
|
237
|
+
}
|
|
209
238
|
}
|
|
210
239
|
}
|
|
211
240
|
|
|
241
|
+
// Return the mapped object.
|
|
212
242
|
return object;
|
|
213
243
|
}
|
|
244
|
+
|
|
214
245
|
/**
|
|
215
246
|
* Converts textual value to a javascript typed value.
|
|
216
247
|
* @param {any} value
|
|
217
248
|
* @param {object} schemaEntry
|
|
218
249
|
* @return {{ value: any, error: string }}
|
|
219
250
|
*/
|
|
220
|
-
|
|
221
|
-
|
|
222
251
|
export function parseValue(value, schemaEntry, options) {
|
|
223
252
|
if (value === null) {
|
|
224
253
|
return {
|
|
225
254
|
value: null
|
|
226
255
|
};
|
|
227
256
|
}
|
|
228
|
-
|
|
229
257
|
var result;
|
|
230
|
-
|
|
231
258
|
if (schemaEntry.parse) {
|
|
232
259
|
result = parseCustomValue(value, schemaEntry.parse);
|
|
233
260
|
} else if (schemaEntry.type) {
|
|
234
|
-
result = parseValueOfType(value,
|
|
261
|
+
result = parseValueOfType(value,
|
|
262
|
+
// Supports parsing array types.
|
|
235
263
|
// See `parseArray()` function for more details.
|
|
236
264
|
// Example `type`: String[]
|
|
237
265
|
// Input: 'Barack Obama, "String, with, colons", Donald Trump'
|
|
@@ -240,14 +268,13 @@ export function parseValue(value, schemaEntry, options) {
|
|
|
240
268
|
} else {
|
|
241
269
|
result = {
|
|
242
270
|
value: value
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
271
|
+
};
|
|
272
|
+
// throw new Error('Invalid schema entry: no .type and no .parse():\n\n' + JSON.stringify(schemaEntry, null, 2))
|
|
273
|
+
}
|
|
274
|
+
// If errored then return the error.
|
|
247
275
|
if (result.error) {
|
|
248
276
|
return result;
|
|
249
277
|
}
|
|
250
|
-
|
|
251
278
|
if (result.value !== null) {
|
|
252
279
|
if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {
|
|
253
280
|
return {
|
|
@@ -255,7 +282,6 @@ export function parseValue(value, schemaEntry, options) {
|
|
|
255
282
|
reason: 'unknown'
|
|
256
283
|
};
|
|
257
284
|
}
|
|
258
|
-
|
|
259
285
|
if (schemaEntry.validate) {
|
|
260
286
|
try {
|
|
261
287
|
schemaEntry.validate(result.value);
|
|
@@ -266,26 +292,23 @@ export function parseValue(value, schemaEntry, options) {
|
|
|
266
292
|
}
|
|
267
293
|
}
|
|
268
294
|
}
|
|
269
|
-
|
|
270
295
|
return result;
|
|
271
296
|
}
|
|
297
|
+
|
|
272
298
|
/**
|
|
273
299
|
* Converts textual value to a custom value using supplied `.parse()`.
|
|
274
300
|
* @param {any} value
|
|
275
301
|
* @param {function} parse
|
|
276
302
|
* @return {{ value: any, error: string }}
|
|
277
303
|
*/
|
|
278
|
-
|
|
279
304
|
function parseCustomValue(value, parse) {
|
|
280
305
|
try {
|
|
281
306
|
value = parse(value);
|
|
282
|
-
|
|
283
307
|
if (value === undefined) {
|
|
284
308
|
return {
|
|
285
309
|
value: null
|
|
286
310
|
};
|
|
287
311
|
}
|
|
288
|
-
|
|
289
312
|
return {
|
|
290
313
|
value: value
|
|
291
314
|
};
|
|
@@ -293,57 +316,46 @@ function parseCustomValue(value, parse) {
|
|
|
293
316
|
var result = {
|
|
294
317
|
error: error.message
|
|
295
318
|
};
|
|
296
|
-
|
|
297
319
|
if (error.reason) {
|
|
298
320
|
result.reason = error.reason;
|
|
299
321
|
}
|
|
300
|
-
|
|
301
322
|
return result;
|
|
302
323
|
}
|
|
303
324
|
}
|
|
325
|
+
|
|
304
326
|
/**
|
|
305
327
|
* Converts textual value to a javascript typed value.
|
|
306
328
|
* @param {any} value
|
|
307
329
|
* @param {} type
|
|
308
330
|
* @return {{ value: (string|number|Date|boolean), error: string, reason?: string }}
|
|
309
331
|
*/
|
|
310
|
-
|
|
311
|
-
|
|
312
332
|
function parseValueOfType(value, type, options) {
|
|
313
333
|
switch (type) {
|
|
314
334
|
case String:
|
|
315
335
|
return parseCustomValue(value, StringType);
|
|
316
|
-
|
|
317
336
|
case Number:
|
|
318
337
|
return parseCustomValue(value, NumberType);
|
|
319
|
-
|
|
320
338
|
case Date:
|
|
321
339
|
return parseCustomValue(value, function (value) {
|
|
322
340
|
return DateType(value, {
|
|
323
341
|
properties: options.properties
|
|
324
342
|
});
|
|
325
343
|
});
|
|
326
|
-
|
|
327
344
|
case Boolean:
|
|
328
345
|
return parseCustomValue(value, BooleanType);
|
|
329
|
-
|
|
330
346
|
default:
|
|
331
347
|
if (typeof type === 'function') {
|
|
332
348
|
return parseCustomValue(value, type);
|
|
333
349
|
}
|
|
334
|
-
|
|
335
350
|
throw new Error("Unsupported schema type: ".concat(type && type.name || type));
|
|
336
351
|
}
|
|
337
352
|
}
|
|
338
|
-
|
|
339
353
|
export function getBlock(string, endCharacter, startIndex) {
|
|
340
354
|
var i = 0;
|
|
341
355
|
var substring = '';
|
|
342
356
|
var character;
|
|
343
|
-
|
|
344
357
|
while (startIndex + i < string.length) {
|
|
345
358
|
var _character = string[startIndex + i];
|
|
346
|
-
|
|
347
359
|
if (_character === endCharacter) {
|
|
348
360
|
return [substring, i];
|
|
349
361
|
} else if (_character === '"') {
|
|
@@ -355,34 +367,31 @@ export function getBlock(string, endCharacter, startIndex) {
|
|
|
355
367
|
i++;
|
|
356
368
|
}
|
|
357
369
|
}
|
|
358
|
-
|
|
359
370
|
return [substring, i];
|
|
360
371
|
}
|
|
372
|
+
|
|
361
373
|
/**
|
|
362
374
|
* Parses a string of comma-separated substrings into an array of substrings.
|
|
363
375
|
* (the `export` is just for tests)
|
|
364
376
|
* @param {string} string — A string of comma-separated substrings.
|
|
365
377
|
* @return {string[]} An array of substrings.
|
|
366
378
|
*/
|
|
367
|
-
|
|
368
|
-
export function parseArray(string) {
|
|
379
|
+
export function parseArray(string, arrayValueSeparator) {
|
|
369
380
|
var blocks = [];
|
|
370
381
|
var index = 0;
|
|
371
|
-
|
|
372
382
|
while (index < string.length) {
|
|
373
|
-
var _getBlock = getBlock(string,
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
index += length + ','.length;
|
|
383
|
+
var _getBlock = getBlock(string, arrayValueSeparator, index),
|
|
384
|
+
_getBlock2 = _slicedToArray(_getBlock, 2),
|
|
385
|
+
substring = _getBlock2[0],
|
|
386
|
+
length = _getBlock2[1];
|
|
387
|
+
index += length + arrayValueSeparator.length;
|
|
379
388
|
blocks.push(substring.trim());
|
|
380
389
|
}
|
|
381
|
-
|
|
382
390
|
return blocks;
|
|
383
|
-
}
|
|
384
|
-
// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript
|
|
391
|
+
}
|
|
385
392
|
|
|
393
|
+
// Transpose a 2D array.
|
|
394
|
+
// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript
|
|
386
395
|
var transpose = function transpose(array) {
|
|
387
396
|
return array[0].map(function (_, i) {
|
|
388
397
|
return array.map(function (row) {
|
|
@@ -390,15 +399,16 @@ var transpose = function transpose(array) {
|
|
|
390
399
|
});
|
|
391
400
|
});
|
|
392
401
|
};
|
|
393
|
-
|
|
394
402
|
function validateSchema(schema) {
|
|
395
403
|
for (var _i3 = 0, _Object$keys2 = Object.keys(schema); _i3 < _Object$keys2.length; _i3++) {
|
|
396
404
|
var key = _Object$keys2[_i3];
|
|
397
405
|
var entry = schema[key];
|
|
398
|
-
|
|
399
406
|
if (!entry.prop) {
|
|
400
407
|
throw new Error("\"prop\" not defined for schema entry \"".concat(key, "\"."));
|
|
401
408
|
}
|
|
402
409
|
}
|
|
403
410
|
}
|
|
411
|
+
function isEmptyValue(value) {
|
|
412
|
+
return value === undefined || value === null;
|
|
413
|
+
}
|
|
404
414
|
//# sourceMappingURL=convertToJson.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertToJson.js","names":["NumberType","StringType","BooleanType","DateType","DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","ignoreEmptyRows","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","isEmptyObject","createError","column","value","errorMessage","reason","type","pendingRequiredChecks","key","schemaEntry","isNestedSchema","Array","isArray","rawValue","indexOf","undefined","notEmpty","array","parseArray","map","_value","parseValue","required","includeNullValues","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","Number","Date","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"sources":["../../../source/read/schema/convertToJson.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\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\r\n const createError = ({\r\n column,\r\n value,\r\n error: errorMessage,\r\n reason\r\n }) => {\r\n const error = {\r\n error: errorMessage,\r\n row: rowIndex + 1,\r\n column,\r\n value\r\n }\r\n if (reason) {\r\n error.reason = reason\r\n }\r\n if (schema[column].type) {\r\n error.type = schema[column].type\r\n }\r\n return error\r\n }\r\n\r\n const pendingRequiredChecks = []\r\n\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\r\n let rawValue = row[columns.indexOf(key)]\r\n if (rawValue === undefined) {\r\n rawValue = null\r\n }\r\n\r\n let value\r\n let error\r\n let reason\r\n\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\r\n if (!error && value === null) {\r\n if (typeof schemaEntry.required === 'function') {\r\n pendingRequiredChecks.push({ column: key })\r\n } else if (schemaEntry.required === true) {\r\n error = 'required'\r\n }\r\n }\r\n\r\n if (error) {\r\n errors.push(createError({\r\n column: key,\r\n value,\r\n error,\r\n reason\r\n }))\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\r\n if (isEmptyObject) {\r\n return null\r\n }\r\n\r\n for (const { column } of pendingRequiredChecks) {\r\n const required = schema[column].required(object)\r\n if (required) {\r\n errors.push(createError({\r\n column,\r\n value: null,\r\n error: 'required'\r\n }))\r\n }\r\n }\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 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\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 return parseCustomValue(value, StringType)\r\n\r\n case Number:\r\n return parseCustomValue(value, NumberType)\r\n\r\n case Date:\r\n return parseCustomValue(value, (value) => DateType(value, { properties: options.properties }))\r\n\r\n case Boolean:\r\n return parseCustomValue(value, BooleanType)\r\n\r\n default:\r\n if (typeof type === 'function') {\r\n return parseCustomValue(value, type)\r\n }\r\n throw new Error(`Unsupported 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":["NumberType","StringType","BooleanType","DateType","DEFAULT_OPTIONS","schemaPropertyValueForMissingColumn","undefined","schemaPropertyValueForUndefinedCellValue","schemaPropertyValueForNullCellValue","schemaPropertyShouldSkipRequiredValidationForMissingColumn","getEmptyObjectValue","getEmptyArrayValue","isColumnOriented","arrayValueSeparator","data","schema","options","_objectSpread","_options","rowIndexMap","validateSchema","transpose","columns","results","errors","i","length","result","read","push","_iterator","_createForOfIteratorHelperLoose","_step","done","error","value","row","rows","rowIndex","path","object","isEmptyObject","createError","_ref","column","errorMessage","reason","type","pendingRequiredChecks","_loop","key","_Object$keys","_i","schemaEntry","isNestedSchema","_typeof","Array","isArray","propertyPath","concat","prop","cellValue","columnIndex","indexOf","isMissingColumn","array","parseArray","map","_value","parseValue","isEmpty","every","isEmptyValue","required","Object","keys","_i2","_pendingRequiredCheck","_pendingRequiredCheck2","skipRequiredValidation","isRequired","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","Number","Date","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","_getBlock","_getBlock2","_slicedToArray","trim","_","_i3","_Object$keys2","entry"],"sources":["../../../source/read/schema/convertToJson.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\nconst DEFAULT_OPTIONS = {\r\n schemaPropertyValueForMissingColumn: undefined,\r\n schemaPropertyValueForUndefinedCellValue: undefined,\r\n schemaPropertyValueForNullCellValue: null,\r\n schemaPropertyShouldSkipRequiredValidationForMissingColumn: () => false,\r\n // `getEmptyObjectValue(object, { path })` applies to both the top-level object\r\n // and any of its sub-objects.\r\n getEmptyObjectValue: () => null,\r\n getEmptyArrayValue: () => null,\r\n isColumnOriented: false,\r\n arrayValueSeparator: ','\r\n}\r\n\r\n/**\r\n * (this function is exported from `read-excel-file/map`)\r\n * Converts spreadsheet-alike data structure into an array of objects.\r\n * The first row should be the list of column headers.\r\n * @param {any[][]} 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 {null} [options.schemaPropertyValueForMissingColumn] — 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 `schemaPropertyValueForMissingColumn: null` to set such \"missing column\" properties to `null` in the output objects.\r\n * @param {null} [options.schemaPropertyValueForNullCellValue] — By default, when it encounters a `null` value in a cell in input `data`, it sets it to `undefined` in the output object. Pass `schemaPropertyValueForNullCellValue: null` to make it set such values as `null`s in output objects.\r\n * @param {null} [options.schemaPropertyValueForUndefinedCellValue] — By default, when it encounters an `undefined` value in a cell in input `data`, it it sets it to `undefined` in the output object. Pass `schemaPropertyValueForUndefinedCellValue: null` to make it set such values as `null`s in output objects.\r\n * @param {boolean} [options.schemaPropertyShouldSkipRequiredValidationForMissingColumn(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 `schemaPropertyShouldSkipRequiredValidationForMissingColumn(column, { object })` to disable `required` validation for missing columns in some or all cases.\r\n * @param {function} [options.getEmptyObjectValue(object, { path })] — By default, it returns `null` for an \"empty\" resulting object. One could override that value using `getEmptyObjectValue(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} [getEmptyArrayValue(array, { path })] — By default, it returns `null` for an \"empty\" array value. One could override that value using `getEmptyArrayValue(array, { path })` parameter.\r\n * @param {boolean} [options.isColumnOriented] — By default, the headers are assumed to be the first row in the `data`. Pass `isColumnOriented: true` if the headers are the first column in the `data`. i.e. if `data` is \"transposed\".\r\n * @param {object} [options.rowIndexMap] — Custom row index mapping `data` rows. If present, will overwrite the indexes of `data` rows with the indexes from this `rowIndexMap`.\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 rowIndexMap\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, undefined, columns, errors, options)\r\n results.push(result)\r\n }\r\n\r\n // Set the correct `row` number in `errors` if a custom `rowIndexMap` is supplied.\r\n if (rowIndexMap) {\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 = rowIndexMap[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, path, columns, errors, options) {\r\n const object = {}\r\n let isEmptyObject = true\r\n\r\n const createError = ({\r\n column,\r\n value,\r\n error: errorMessage,\r\n reason\r\n }) => {\r\n const error = {\r\n error: errorMessage,\r\n row: rowIndex + 1,\r\n column,\r\n value\r\n }\r\n if (reason) {\r\n error.reason = reason\r\n }\r\n if (schema[column].type) {\r\n error.type = schema[column].type\r\n }\r\n return error\r\n }\r\n\r\n const pendingRequiredChecks = []\r\n\r\n // For each schema entry.\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\r\n // The path of this property inside the resulting object.\r\n const propertyPath = `${path || ''}.${schemaEntry.prop}`\r\n\r\n // Read the cell value for the schema entry.\r\n let cellValue\r\n const columnIndex = columns.indexOf(key)\r\n const isMissingColumn = columnIndex < 0\r\n if (!isMissingColumn) {\r\n cellValue = row[columnIndex]\r\n }\r\n\r\n let value\r\n let error\r\n let reason\r\n\r\n // Get property `value` from cell value.\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, propertyPath, columns, errors, options)\r\n } else {\r\n if (isMissingColumn) {\r\n value = options.schemaPropertyValueForMissingColumn\r\n }\r\n else if (cellValue === undefined) {\r\n value = options.schemaPropertyValueForUndefinedCellValue\r\n }\r\n else if (cellValue === null) {\r\n value = options.schemaPropertyValueForNullCellValue\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n const array = parseArray(cellValue, options.arrayValueSeparator).map((_value) => {\r\n if (error) {\r\n return\r\n }\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n // In case of an error, `value` won't be returned and will just be reported\r\n // as part of an `error` object, so it's fine assigning just an element of the array.\r\n value = _value\r\n error = result.error\r\n reason = result.reason\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n const isEmpty = array.every(isEmptyValue)\r\n value = isEmpty ? options.getEmptyArrayValue(array, { path: propertyPath }) : array\r\n }\r\n } else {\r\n const result = parseValue(cellValue, schemaEntry, options)\r\n error = result.error\r\n reason = result.reason\r\n value = error ? cellValue : result.value\r\n }\r\n }\r\n\r\n // Apply `required` validation if the value is \"empty\".\r\n if (!error && isEmptyValue(value)) {\r\n if (schemaEntry.required) {\r\n // Will perform this `required()` validation in the end,\r\n // when all properties of the mapped object have been mapped.\r\n pendingRequiredChecks.push({ column: key, value, isMissingColumn })\r\n }\r\n }\r\n\r\n if (error) {\r\n // If there was an error then the property value in the `object` will be `undefined`,\r\n // i.e it won't add the property value to the mapped object.\r\n errors.push(createError({\r\n column: key,\r\n value,\r\n error,\r\n reason\r\n }))\r\n } else {\r\n // Possibly unmark the mapped object as \"empty\".\r\n if (isEmptyObject && !isEmptyValue(value)) {\r\n isEmptyObject = false\r\n }\r\n // Set the value in the mapped object.\r\n // Skip setting `undefined` values because they're already `undefined`.\r\n if (value !== undefined) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n }\r\n\r\n // Return `null` for an \"empty\" mapped object.\r\n if (isEmptyObject) {\r\n return options.getEmptyObjectValue(object, { path })\r\n }\r\n\r\n // Perform any `required` validations.\r\n for (const { column, value, isMissingColumn } of pendingRequiredChecks) {\r\n // Can optionally skip `required` validation for missing columns.\r\n const skipRequiredValidation = isMissingColumn && options.schemaPropertyShouldSkipRequiredValidationForMissingColumn(column, { object })\r\n if (!skipRequiredValidation) {\r\n const { required } = schema[column]\r\n const isRequired = typeof required === 'boolean' ? required : required(object)\r\n if (isRequired) {\r\n errors.push(createError({\r\n column,\r\n value,\r\n error: 'required'\r\n }))\r\n }\r\n }\r\n }\r\n\r\n // Return the mapped object.\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 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\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 return parseCustomValue(value, StringType)\r\n\r\n case Number:\r\n return parseCustomValue(value, NumberType)\r\n\r\n case Date:\r\n return parseCustomValue(value, (value) => DateType(value, { properties: options.properties }))\r\n\r\n case Boolean:\r\n return parseCustomValue(value, BooleanType)\r\n\r\n default:\r\n if (typeof type === 'function') {\r\n return parseCustomValue(value, type)\r\n }\r\n throw new Error(`Unsupported 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, arrayValueSeparator) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, arrayValueSeparator, index)\r\n index += length + arrayValueSeparator.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}\r\n\r\nfunction isEmptyValue(value) {\r\n return value === undefined || value === null\r\n}"],"mappings":"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"}
|