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.
Files changed (213) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +45 -19
  3. package/bundle/read-excel-file.min.js +1 -1
  4. package/bundle/read-excel-file.min.js.map +1 -1
  5. package/commonjs/read/coordinates.js +7 -10
  6. package/commonjs/read/coordinates.js.map +1 -1
  7. package/commonjs/read/dropEmptyColumns.js +6 -18
  8. package/commonjs/read/dropEmptyColumns.js.map +1 -1
  9. package/commonjs/read/dropEmptyColumns.test.js.map +1 -1
  10. package/commonjs/read/dropEmptyRows.js +11 -23
  11. package/commonjs/read/dropEmptyRows.js.map +1 -1
  12. package/commonjs/read/dropEmptyRows.test.js.map +1 -1
  13. package/commonjs/read/getData.js +31 -43
  14. package/commonjs/read/getData.js.map +1 -1
  15. package/commonjs/read/isDateTimestamp.js +51 -40
  16. package/commonjs/read/isDateTimestamp.js.map +1 -1
  17. package/commonjs/read/parseCell.js +3 -10
  18. package/commonjs/read/parseCell.js.map +1 -1
  19. package/commonjs/read/parseCellValue.js +28 -59
  20. package/commonjs/read/parseCellValue.js.map +1 -1
  21. package/commonjs/read/parseCells.js +3 -7
  22. package/commonjs/read/parseCells.js.map +1 -1
  23. package/commonjs/read/parseDate.js +5 -5
  24. package/commonjs/read/parseDate.js.map +1 -1
  25. package/commonjs/read/parseDate.test.js.map +1 -1
  26. package/commonjs/read/parseDimensions.js +6 -18
  27. package/commonjs/read/parseDimensions.js.map +1 -1
  28. package/commonjs/read/parseFilePaths.js +4 -11
  29. package/commonjs/read/parseFilePaths.js.map +1 -1
  30. package/commonjs/read/parseProperties.js +6 -8
  31. package/commonjs/read/parseProperties.js.map +1 -1
  32. package/commonjs/read/parseSharedStrings.js +0 -3
  33. package/commonjs/read/parseSharedStrings.js.map +1 -1
  34. package/commonjs/read/parseSheet.js +3 -7
  35. package/commonjs/read/parseSheet.js.map +1 -1
  36. package/commonjs/read/parseStyles.js +13 -21
  37. package/commonjs/read/parseStyles.js.map +1 -1
  38. package/commonjs/read/readSheetNamesBrowser.js +0 -3
  39. package/commonjs/read/readSheetNamesBrowser.js.map +1 -1
  40. package/commonjs/read/readSheetNamesNode.js +0 -3
  41. package/commonjs/read/readSheetNamesNode.js.map +1 -1
  42. package/commonjs/read/readSheetNamesNode.test.js.map +1 -1
  43. package/commonjs/read/readSheetNamesWebWorker.js +0 -3
  44. package/commonjs/read/readSheetNamesWebWorker.js.map +1 -1
  45. package/commonjs/read/readXlsx.js +34 -42
  46. package/commonjs/read/readXlsx.js.map +1 -1
  47. package/commonjs/read/readXlsxFileBrowser.js +0 -5
  48. package/commonjs/read/readXlsxFileBrowser.js.map +1 -1
  49. package/commonjs/read/readXlsxFileContents.js +12 -22
  50. package/commonjs/read/readXlsxFileContents.js.map +1 -1
  51. package/commonjs/read/readXlsxFileNode.js +0 -5
  52. package/commonjs/read/readXlsxFileNode.js.map +1 -1
  53. package/commonjs/read/readXlsxFileNode.test.js.map +1 -1
  54. package/commonjs/read/readXlsxFileWebWorker.js +0 -5
  55. package/commonjs/read/readXlsxFileWebWorker.js.map +1 -1
  56. package/commonjs/read/schema/convertMapToSchema.js +1 -8
  57. package/commonjs/read/schema/convertMapToSchema.js.map +1 -1
  58. package/commonjs/read/schema/convertMapToSchema.test.js.map +1 -1
  59. package/commonjs/read/schema/convertToJson.js +143 -142
  60. package/commonjs/read/schema/convertToJson.js.map +1 -1
  61. package/commonjs/read/schema/convertToJson.legacy.js +60 -0
  62. package/commonjs/read/schema/convertToJson.legacy.js.map +1 -0
  63. package/commonjs/read/schema/convertToJson.legacy.test.js.map +1 -0
  64. package/commonjs/read/schema/convertToJson.spreadsheet.js +25 -0
  65. package/commonjs/read/schema/convertToJson.spreadsheet.js.map +1 -0
  66. package/commonjs/read/schema/convertToJson.spreadsheet.test.js.map +1 -0
  67. package/commonjs/read/schema/convertToJson.test.js.map +1 -1
  68. package/commonjs/read/unpackXlsxFileBrowser.js +3 -9
  69. package/commonjs/read/unpackXlsxFileBrowser.js.map +1 -1
  70. package/commonjs/read/unpackXlsxFileNode.js +9 -15
  71. package/commonjs/read/unpackXlsxFileNode.js.map +1 -1
  72. package/commonjs/types/Boolean.js +0 -4
  73. package/commonjs/types/Boolean.js.map +1 -1
  74. package/commonjs/types/Date.js +0 -12
  75. package/commonjs/types/Date.js.map +1 -1
  76. package/commonjs/types/Email.js +0 -7
  77. package/commonjs/types/Email.js.map +1 -1
  78. package/commonjs/types/Email.test.js.map +1 -1
  79. package/commonjs/types/Integer.js +0 -7
  80. package/commonjs/types/Integer.js.map +1 -1
  81. package/commonjs/types/Integer.test.js.map +1 -1
  82. package/commonjs/types/InvalidError.js +8 -28
  83. package/commonjs/types/InvalidError.js.map +1 -1
  84. package/commonjs/types/Number.js +2 -10
  85. package/commonjs/types/Number.js.map +1 -1
  86. package/commonjs/types/String.js +4 -11
  87. package/commonjs/types/String.js.map +1 -1
  88. package/commonjs/types/URL.js +5 -8
  89. package/commonjs/types/URL.js.map +1 -1
  90. package/commonjs/types/URL.test.js.map +1 -1
  91. package/commonjs/xml/dom.js +6 -25
  92. package/commonjs/xml/dom.js.map +1 -1
  93. package/commonjs/xml/xlsx.js +1 -24
  94. package/commonjs/xml/xlsx.js.map +1 -1
  95. package/commonjs/xml/xml.js +1 -4
  96. package/commonjs/xml/xml.js.map +1 -1
  97. package/commonjs/xml/xmlBrowser.js +1 -2
  98. package/commonjs/xml/xmlBrowser.js.map +1 -1
  99. package/commonjs/xml/xpath/xlsx-xpath.js +3 -16
  100. package/commonjs/xml/xpath/xlsx-xpath.js.map +1 -1
  101. package/commonjs/xml/xpath/xpathBrowser.js +3 -5
  102. package/commonjs/xml/xpath/xpathBrowser.js.map +1 -1
  103. package/commonjs/xml/xpath/xpathNode.js +1 -5
  104. package/commonjs/xml/xpath/xpathNode.js.map +1 -1
  105. package/map/index.cjs +2 -0
  106. package/map/index.cjs.js +7 -0
  107. package/map/index.d.ts +11 -0
  108. package/map/index.js +1 -0
  109. package/map/package.json +17 -0
  110. package/modules/read/coordinates.js +7 -8
  111. package/modules/read/coordinates.js.map +1 -1
  112. package/modules/read/dropEmptyColumns.js +6 -17
  113. package/modules/read/dropEmptyColumns.js.map +1 -1
  114. package/modules/read/dropEmptyColumns.test.js.map +1 -1
  115. package/modules/read/dropEmptyRows.js +11 -22
  116. package/modules/read/dropEmptyRows.js.map +1 -1
  117. package/modules/read/dropEmptyRows.test.js.map +1 -1
  118. package/modules/read/getData.js +31 -39
  119. package/modules/read/getData.js.map +1 -1
  120. package/modules/read/isDateTimestamp.js +52 -39
  121. package/modules/read/isDateTimestamp.js.map +1 -1
  122. package/modules/read/parseCell.js +6 -6
  123. package/modules/read/parseCell.js.map +1 -1
  124. package/modules/read/parseCellValue.js +30 -55
  125. package/modules/read/parseCellValue.js.map +1 -1
  126. package/modules/read/parseCells.js +3 -3
  127. package/modules/read/parseCells.js.map +1 -1
  128. package/modules/read/parseDate.js +5 -4
  129. package/modules/read/parseDate.js.map +1 -1
  130. package/modules/read/parseDate.test.js.map +1 -1
  131. package/modules/read/parseDimensions.js +9 -17
  132. package/modules/read/parseDimensions.js.map +1 -1
  133. package/modules/read/parseFilePaths.js +5 -10
  134. package/modules/read/parseFilePaths.js.map +1 -1
  135. package/modules/read/parseProperties.js +8 -7
  136. package/modules/read/parseProperties.js.map +1 -1
  137. package/modules/read/parseSharedStrings.js +0 -1
  138. package/modules/read/parseSharedStrings.js.map +1 -1
  139. package/modules/read/parseSheet.js +3 -2
  140. package/modules/read/parseSheet.js.map +1 -1
  141. package/modules/read/parseStyles.js +16 -21
  142. package/modules/read/parseStyles.js.map +1 -1
  143. package/modules/read/readSheetNamesBrowser.js +1 -1
  144. package/modules/read/readSheetNamesBrowser.js.map +1 -1
  145. package/modules/read/readSheetNamesNode.js +1 -1
  146. package/modules/read/readSheetNamesNode.js.map +1 -1
  147. package/modules/read/readSheetNamesNode.test.js.map +1 -1
  148. package/modules/read/readSheetNamesWebWorker.js +1 -1
  149. package/modules/read/readSheetNamesWebWorker.js.map +1 -1
  150. package/modules/read/readXlsx.js +37 -35
  151. package/modules/read/readXlsx.js.map +1 -1
  152. package/modules/read/readXlsxFileBrowser.js +1 -1
  153. package/modules/read/readXlsxFileBrowser.js.map +1 -1
  154. package/modules/read/readXlsxFileContents.js +12 -17
  155. package/modules/read/readXlsxFileContents.js.map +1 -1
  156. package/modules/read/readXlsxFileNode.js +1 -1
  157. package/modules/read/readXlsxFileNode.js.map +1 -1
  158. package/modules/read/readXlsxFileNode.test.js.map +1 -1
  159. package/modules/read/readXlsxFileWebWorker.js +1 -1
  160. package/modules/read/readXlsxFileWebWorker.js.map +1 -1
  161. package/modules/read/schema/convertMapToSchema.js +1 -7
  162. package/modules/read/schema/convertMapToSchema.js.map +1 -1
  163. package/modules/read/schema/convertMapToSchema.test.js.map +1 -1
  164. package/modules/read/schema/convertToJson.js +143 -133
  165. package/modules/read/schema/convertToJson.js.map +1 -1
  166. package/modules/read/schema/convertToJson.legacy.js +53 -0
  167. package/modules/read/schema/convertToJson.legacy.js.map +1 -0
  168. package/modules/read/schema/convertToJson.legacy.test.js.map +1 -0
  169. package/modules/read/schema/convertToJson.spreadsheet.js +19 -0
  170. package/modules/read/schema/convertToJson.spreadsheet.js.map +1 -0
  171. package/modules/read/schema/convertToJson.spreadsheet.test.js.map +1 -0
  172. package/modules/read/schema/convertToJson.test.js.map +1 -1
  173. package/modules/read/unpackXlsxFileBrowser.js +4 -7
  174. package/modules/read/unpackXlsxFileBrowser.js.map +1 -1
  175. package/modules/read/unpackXlsxFileNode.js +9 -7
  176. package/modules/read/unpackXlsxFileNode.js.map +1 -1
  177. package/modules/types/Boolean.js +0 -1
  178. package/modules/types/Boolean.js.map +1 -1
  179. package/modules/types/Date.js +0 -8
  180. package/modules/types/Date.js.map +1 -1
  181. package/modules/types/Email.js +0 -2
  182. package/modules/types/Email.js.map +1 -1
  183. package/modules/types/Email.test.js.map +1 -1
  184. package/modules/types/Integer.js +0 -2
  185. package/modules/types/Integer.js.map +1 -1
  186. package/modules/types/Integer.test.js.map +1 -1
  187. package/modules/types/InvalidError.js +7 -25
  188. package/modules/types/InvalidError.js.map +1 -1
  189. package/modules/types/Number.js +2 -7
  190. package/modules/types/Number.js.map +1 -1
  191. package/modules/types/String.js +4 -8
  192. package/modules/types/String.js.map +1 -1
  193. package/modules/types/URL.js +5 -4
  194. package/modules/types/URL.js.map +1 -1
  195. package/modules/types/URL.test.js.map +1 -1
  196. package/modules/xml/dom.js +6 -18
  197. package/modules/xml/dom.js.map +1 -1
  198. package/modules/xml/xlsx.js +4 -13
  199. package/modules/xml/xlsx.js.map +1 -1
  200. package/modules/xml/xml.js.map +1 -1
  201. package/modules/xml/xmlBrowser.js.map +1 -1
  202. package/modules/xml/xpath/xlsx-xpath.js +2 -1
  203. package/modules/xml/xpath/xlsx-xpath.js.map +1 -1
  204. package/modules/xml/xpath/xpathBrowser.js +3 -4
  205. package/modules/xml/xpath/xpathBrowser.js.map +1 -1
  206. package/modules/xml/xpath/xpathNode.js +1 -0
  207. package/modules/xml/xpath/xpathNode.js.map +1 -1
  208. package/package.json +6 -1
  209. package/schema/index.cjs +2 -2
  210. package/schema/index.cjs.js +2 -2
  211. package/schema/index.d.ts +7 -2
  212. package/schema/index.js +1 -1
  213. 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 _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; }
16
-
17
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
18
-
19
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
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
- isColumnOriented: false
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
- * Convert 2D array to nested objects.
32
- * If row oriented data, row 0 is dotted key names.
33
- * Column oriented data is transposed.
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
- isColumnOriented = _options.isColumnOriented,
48
- rowMap = _options.rowMap,
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
- if (result !== null || ignoreEmptyRows === false) {
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 (rowMap) {
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 = rowMap[error.row - 1] + 1;
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
- value = _ref.value,
93
- errorMessage = _ref.error,
94
- reason = _ref.reason;
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
- if (rawValue === undefined) {
122
- rawValue = null;
123
- }
121
+ // The path of this property inside the resulting object.
122
+ var propertyPath = "".concat(path || '', ".").concat(schemaEntry.prop);
124
123
 
125
- var value = void 0;
126
- var error = void 0;
127
- var reason = void 0;
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 (rawValue === null) {
133
- value = null;
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 notEmpty = false;
136
- var array = parseArray(rawValue).map(function (_value) {
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
- value = notEmpty ? array : null;
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(rawValue, schemaEntry, options);
167
+ var result = parseValue(cellValue, schemaEntry, options);
157
168
  error = result.error;
158
169
  reason = result.reason;
159
- value = error ? rawValue : result.value;
170
+ value = error ? cellValue : result.value;
160
171
  }
161
172
  }
162
173
 
163
- if (!error && value === null) {
164
- if (typeof schemaEntry.required === 'function') {
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
- if (isEmptyObject && value !== null) {
196
+ // Possibly unmark the mapped object as "empty".
197
+ if (isEmptyObject && !isEmptyValue(value)) {
182
198
  isEmptyObject = false;
183
199
  }
184
-
185
- if (value !== null || options.includeNullValues) {
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 null;
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 column = _pendingRequiredCheck[_i2].column;
201
- var required = schema[column].required(object);
202
-
203
- if (required) {
204
- errors.push(createError({
205
- column: column,
206
- value: null,
207
- error: 'required'
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, // Supports parsing array types.
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
- }; // throw new Error('Invalid schema entry: no .type and no .parse():\n\n' + JSON.stringify(schemaEntry, null, 2))
244
- } // If errored then return the error.
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, ',', index),
374
- _getBlock2 = _slicedToArray(_getBlock, 2),
375
- substring = _getBlock2[0],
376
- length = _getBlock2[1];
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
- } // Transpose a 2D array.
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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"}