read-excel-file 4.0.5 → 4.1.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 (42) hide show
  1. package/.gitlab-ci.yml +15 -0
  2. package/CHANGELOG.md +27 -0
  3. package/LICENSE +1 -1
  4. package/README.md +110 -17
  5. package/bundle/index.html +22 -16
  6. package/bundle/read-excel-file.min.js +2 -2
  7. package/bundle/read-excel-file.min.js.map +1 -1
  8. package/commonjs/convertMapToSchema.js +41 -0
  9. package/commonjs/convertMapToSchema.js.map +1 -0
  10. package/commonjs/convertMapToSchema.test.js.map +1 -0
  11. package/commonjs/convertToJson.js +19 -9
  12. package/commonjs/convertToJson.js.map +1 -1
  13. package/commonjs/convertToJson.test.js.map +1 -1
  14. package/commonjs/readXlsx.js +6 -3
  15. package/commonjs/readXlsx.js.map +1 -1
  16. package/commonjs/readXlsxFileContents.js +17 -4
  17. package/commonjs/readXlsxFileContents.js.map +1 -1
  18. package/commonjs/readXlsxFileNode.test.js.map +1 -1
  19. package/index.d.ts.test +20 -0
  20. package/modules/convertMapToSchema.js +34 -0
  21. package/modules/convertMapToSchema.js.map +1 -0
  22. package/modules/convertMapToSchema.test.js.map +1 -0
  23. package/modules/convertToJson.js +19 -9
  24. package/modules/convertToJson.js.map +1 -1
  25. package/modules/convertToJson.test.js.map +1 -1
  26. package/modules/readXlsx.js +6 -3
  27. package/modules/readXlsx.js.map +1 -1
  28. package/modules/readXlsxFileContents.js +14 -4
  29. package/modules/readXlsxFileContents.js.map +1 -1
  30. package/modules/readXlsxFileNode.test.js.map +1 -1
  31. package/node/index.commonjs.js +6 -0
  32. package/node/index.d.ts.test +23 -0
  33. package/node/index.js +5 -0
  34. package/node/package.json +9 -0
  35. package/package.json +7 -6
  36. package/schema/index.commonjs.js +2 -0
  37. package/schema/index.d.ts.test +6 -0
  38. package/schema/index.js +1 -0
  39. package/schema/package.json +9 -0
  40. package/types.d.ts +80 -0
  41. package/website/index.html +105 -0
  42. package/node.js +0 -6
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
8
+
9
+ exports.default = convertMapToSchema;
10
+ function convertMapToSchema(map) {
11
+ var schema = {};
12
+ for (var _iterator = Object.keys(map), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
13
+ var _ref;
14
+
15
+ if (_isArray) {
16
+ if (_i >= _iterator.length) break;
17
+ _ref = _iterator[_i++];
18
+ } else {
19
+ _i = _iterator.next();
20
+ if (_i.done) break;
21
+ _ref = _i.value;
22
+ }
23
+
24
+ var key = _ref;
25
+
26
+ var prop = map[key];
27
+ var type = void 0;
28
+ if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'object') {
29
+ prop = Object.keys(map[key])[0];
30
+ type = convertMapToSchema(map[key][prop]);
31
+ }
32
+ schema[key] = {
33
+ prop: prop
34
+ };
35
+ if (type) {
36
+ schema[key].type = type;
37
+ }
38
+ }
39
+ return schema;
40
+ }
41
+ //# sourceMappingURL=convertMapToSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../source/convertMapToSchema.js"],"names":["convertMapToSchema","map","schema","Object","keys","key","prop","type"],"mappings":";;;;;;;;kBAAwBA,kB;AAAT,SAASA,kBAAT,CAA4BC,GAA5B,EAAiC;AAC/C,KAAMC,SAAS,EAAf;AACA,sBAAkBC,OAAOC,IAAP,CAAYH,GAAZ,CAAlB,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAzBI,GAAyB;;AACnC,MAAIC,OAAOL,IAAII,GAAJ,CAAX;AACA,MAAIE,aAAJ;AACA,MAAI,QAAOD,IAAP,yCAAOA,IAAP,OAAgB,QAApB,EAA8B;AAC7BA,UAAOH,OAAOC,IAAP,CAAYH,IAAII,GAAJ,CAAZ,EAAsB,CAAtB,CAAP;AACAE,UAAOP,mBAAmBC,IAAII,GAAJ,EAASC,IAAT,CAAnB,CAAP;AACA;AACDJ,SAAOG,GAAP,IAAc;AACbC;AADa,GAAd;AAGA,MAAIC,IAAJ,EAAU;AACTL,UAAOG,GAAP,EAAYE,IAAZ,GAAmBA,IAAnB;AACA;AACD;AACD,QAAOL,MAAP;AACA","file":"convertMapToSchema.js","sourcesContent":["export default function convertMapToSchema(map) {\r\n\tconst schema = {}\r\n\tfor (const key of Object.keys(map)) {\r\n\t\tlet prop = map[key]\r\n\t\tlet type\r\n\t\tif (typeof prop === 'object') {\r\n\t\t\tprop = Object.keys(map[key])[0]\r\n\t\t\ttype = convertMapToSchema(map[key][prop])\r\n\t\t}\r\n\t\tschema[key] = {\r\n\t\t\tprop\r\n\t\t}\r\n\t\tif (type) {\r\n\t\t\tschema[key].type = type\r\n\t\t}\r\n\t}\r\n\treturn schema\r\n}"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../source/convertMapToSchema.test.js"],"names":["describe","it","map","should","deep","equal","prop","type"],"mappings":";;AAAA;;;;;;AAEAA,SAAS,oBAAT,EAA+B,YAAM;AACpCC,IAAG,8BAAH,EAAmC,YAAM;AACxC,MAAMC,MAAM;AACX,iBAAc,MADH;AAEX,yBAAsB,kBAFX;AAGX,aAAU;AACT,cAAU;AACT,gBAAW,QADF;AAET,qBAAgB;AAFP;AADD,IAHC;AASX,cAAW,SATA;AAUX,aAAU;AAVC,GAAZ;AAYA,oCAAmBA,GAAnB,EAAwBC,MAAxB,CAA+BC,IAA/B,CAAoCC,KAApC,CAA0C;AACzC,iBAAc;AACbC,UAAM;AADO,IAD2B;AAIzC,yBAAsB;AACrBA,UAAM;AADe,IAJmB;AAOzC,aAAU;AACTA,UAAM,QADG;AAETC,UAAM;AACL,gBAAW;AACVD,YAAM;AADI,MADN;AAIL,qBAAgB;AACfA,YAAM;AADS;AAJX;AAFG,IAP+B;AAkBzC,cAAW;AACVA,UAAM;AADI,IAlB8B;AAqBzC,aAAU;AACTA,UAAM;AADG;AArB+B,GAA1C;AAyBA,EAtCD;AAuCA,CAxCD","file":"convertMapToSchema.test.js","sourcesContent":["import convertMapToSchema from './convertMapToSchema'\r\n\r\ndescribe('convertMapToSchema', () => {\r\n\tit('should convert map to schema', () => {\r\n\t\tconst map = {\r\n\t\t\t'START DATE': 'date',\r\n\t\t\t'NUMBER OF STUDENTS': 'numberOfStudents',\r\n\t\t\t'COURSE': {\r\n\t\t\t\t'course': {\r\n\t\t\t\t\t'IS FREE': 'isFree',\r\n\t\t\t\t\t'COURSE TITLE': 'title'\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'CONTACT': 'contact',\r\n\t\t\t'STATUS': 'status'\r\n\t\t}\r\n\t\tconvertMapToSchema(map).should.deep.equal({\r\n\t\t\t'START DATE': {\r\n\t\t\t\tprop: 'date'\r\n\t\t\t},\r\n\t\t\t'NUMBER OF STUDENTS': {\r\n\t\t\t\tprop: 'numberOfStudents'\r\n\t\t\t},\r\n\t\t\t'COURSE': {\r\n\t\t\t\tprop: 'course',\r\n\t\t\t\ttype: {\r\n\t\t\t\t\t'IS FREE': {\r\n\t\t\t\t\t\tprop: 'isFree'\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'COURSE TITLE': {\r\n\t\t\t\t\t\tprop: 'title'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'CONTACT': {\r\n\t\t\t\tprop: 'contact'\r\n\t\t\t},\r\n\t\t\t'STATUS': {\r\n\t\t\t\tprop: 'status'\r\n\t\t\t}\r\n\t\t})\r\n\t})\r\n})"]}
@@ -199,17 +199,24 @@ function parseValue(value, schemaEntry, options) {
199
199
  } else if (schemaEntry.type) {
200
200
  result = parseValueOfType(value, Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type, options);
201
201
  } else {
202
- throw new Error('Invalid schema entry: no .type and no .parse():\n\n' + JSON.stringify(schemaEntry, null, 2));
202
+ result = { value: value
203
+ // throw new Error('Invalid schema entry: no .type and no .parse():\n\n' + JSON.stringify(schemaEntry, null, 2))
204
+ };
203
205
  }
204
206
  // If errored then return the error.
205
207
  if (result.error) {
206
208
  return result;
207
209
  }
208
- if (result.value !== null && schemaEntry.validate) {
209
- try {
210
- schemaEntry.validate(result.value);
211
- } catch (error) {
212
- return { error: error.message };
210
+ if (result.value !== null) {
211
+ if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {
212
+ return { error: 'invalid' };
213
+ }
214
+ if (schemaEntry.validate) {
215
+ try {
216
+ schemaEntry.validate(result.value);
217
+ } catch (error) {
218
+ return { error: error.message };
219
+ }
213
220
  }
214
221
  }
215
222
  return result;
@@ -223,11 +230,11 @@ function parseValue(value, schemaEntry, options) {
223
230
  */
224
231
  function parseCustomValue(value, parse) {
225
232
  try {
226
- var parsed = parse(value);
227
- if (parsed === undefined) {
233
+ value = parse(value);
234
+ if (value === undefined) {
228
235
  return { value: null };
229
236
  }
230
- return { value: parsed };
237
+ return { value: value };
231
238
  } catch (error) {
232
239
  return { error: error.message };
233
240
  }
@@ -305,6 +312,9 @@ function parseValueOfType(value, type, options) {
305
312
  return { error: 'invalid' };
306
313
 
307
314
  default:
315
+ if (typeof type === 'function') {
316
+ return parseCustomValue(value, type);
317
+ }
308
318
  throw new Error('Unknown schema type: ' + (type && type.name || type));
309
319
  }
310
320
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/convertToJson.js"],"names":["data","schema","options","DEFAULT_OPTIONS","isColumnOriented","rowMap","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","parseValue","getBlock","parseArray","rowIndex","object","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","notEmpty","array","map","_value","required","column","prop","Object","keys","parse","parseCustomValue","parseValueOfType","Error","JSON","stringify","validate","message","parsed","String","Number","isFinite","parseFloat","Date","parseInt","date","properties","Boolean","name","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"mappings":"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","file":"convertToJson.js","sourcesContent":["import parseDate from './parseDate'\r\nimport Integer, { isInteger } from './types/Integer'\r\nimport URL, { isURL } from './types/URL'\r\nimport Email, { isEmail } from './types/Email'\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 {string[][]} 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 } = 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 - 1, columns, errors, options)\r\n if (result) {\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 error.row = rowMap[error.row] + 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 for (const key of Object.keys(schema)) {\r\n const schemaEntry = schema[key]\r\n const isNestedSchema = typeof schemaEntry.type === 'object' && !Array.isArray(schemaEntry.type)\r\n let rawValue = row[columns.indexOf(key)]\r\n if (rawValue === undefined) {\r\n rawValue = null\r\n }\r\n let value\r\n let error\r\n 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 }\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 value = error ? rawValue : result.value\r\n }\r\n }\r\n if (!error && value === null && schemaEntry.required) {\r\n error = 'required'\r\n }\r\n if (error) {\r\n error = {\r\n error,\r\n row: rowIndex + 1,\r\n column: key,\r\n value\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else if (value !== null) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n if (Object.keys(object).length > 0) {\r\n return object\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {string} 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(value, Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type, options)\r\n } else {\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 && 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 return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {string} 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 let parsed = parse(value)\r\n if (parsed === undefined) {\r\n return { value: null }\r\n }\r\n return { value: parsed }\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {string} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n return { value }\r\n\r\n case Number:\r\n case 'Integer':\r\n case Integer:\r\n // The global isFinite() function determines\r\n // whether the passed value is a finite number.\r\n // If needed, the parameter is first converted to a number.\r\n if (!isFinite(value)) {\r\n return { error: 'invalid' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid' }\r\n }\r\n // Convert strings to numbers.\r\n // Just an additional feature.\r\n // Won't happen when called from `readXlsx()`.\r\n if (typeof value === 'string') {\r\n value = parseFloat(value)\r\n }\r\n return { value }\r\n\r\n case 'URL':\r\n case URL:\r\n if (!isURL(value)) {\r\n return { error: 'invalid' }\r\n }\r\n return { value }\r\n\r\n case 'Email':\r\n case Email:\r\n if (!isEmail(value)) {\r\n return { error: 'invalid' }\r\n }\r\n return { value }\r\n\r\n case Date:\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n if (value instanceof Date) {\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (!isFinite(value)) {\r\n return { error: 'invalid' }\r\n }\r\n value = parseInt(value)\r\n const date = parseDate(value, options.properties)\r\n if (!date) {\r\n return { error: 'invalid' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid' }\r\n\r\n default:\r\n throw new Error(`Unknown schema type: ${type && type.name || type}`)\r\n }\r\n}\r\n\r\nexport function getBlock(string, endCharacter, startIndex) {\r\n let i = 0\r\n let substring = ''\r\n let character\r\n while (startIndex + i < string.length) {\r\n const character = string[startIndex + i]\r\n if (character === endCharacter) {\r\n return [substring, i]\r\n }\r\n else if (character === '\"') {\r\n const block = getBlock(string, '\"', startIndex + i + 1)\r\n substring += block[0]\r\n i += '\"'.length + block[1] + '\"'.length\r\n }\r\n else {\r\n substring += character\r\n i++\r\n }\r\n }\r\n return [substring, i]\r\n}\r\n\r\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}"]}
1
+ {"version":3,"sources":["../source/convertToJson.js"],"names":["data","schema","options","DEFAULT_OPTIONS","isColumnOriented","rowMap","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","parseValue","getBlock","parseArray","rowIndex","object","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","notEmpty","array","map","_value","required","column","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","Number","isFinite","parseFloat","Date","parseInt","date","properties","Boolean","Error","name","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"mappings":";;;;;;;;;;;;kBAiBe,UAASA,IAAT,EAAeC,MAAf,EAAuBC,OAAvB,EAAgC;AAC7C,MAAIA,OAAJ,EAAa;AACXA,2BACKC,eADL,EAEKD,OAFL;AAID,GALD,MAKO;AACLA,cAAUC,eAAV;AACD;;AAR4C,iBAazCD,OAbyC;AAAA,MAW3CE,gBAX2C,YAW3CA,gBAX2C;AAAA,MAY3CC,MAZ2C,YAY3CA,MAZ2C;;;AAe7CC,iBAAeL,MAAf;;AAEA,MAAIG,gBAAJ,EAAsB;AACpBJ,WAAOO,UAAUP,IAAV,CAAP;AACD;;AAED,MAAMQ,UAAUR,KAAK,CAAL,CAAhB;;AAEA,MAAMS,UAAU,EAAhB;AACA,MAAMC,SAAS,EAAf;;AAEA,OAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIX,KAAKY,MAAzB,EAAiCD,GAAjC,EAAsC;AACpC,QAAME,SAASC,KAAKb,MAAL,EAAaD,KAAKW,CAAL,CAAb,EAAsBA,IAAI,CAA1B,EAA6BH,OAA7B,EAAsCE,MAAtC,EAA8CR,OAA9C,CAAf;AACA,QAAIW,MAAJ,EAAY;AACVJ,cAAQM,IAAR,CAAaF,MAAb;AACD;AACF;;AAED;AACA,MAAIR,MAAJ,EAAY;AACV,yBAAoBK,MAApB,kHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjBM,KAAiB;;AAC1BA,YAAMC,GAAN,GAAYZ,OAAOW,MAAMC,GAAb,IAAoB,CAAhC;AACD;AACF;;AAED,SAAO;AACLC,UAAMT,OADD;AAELC;AAFK,GAAP;AAID,C;;QAuEeS,U,GAAAA,U;QAiIAC,Q,GAAAA,Q;QAsBAC,U,GAAAA,U;;AA3RhB;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,IAAMlB,kBAAkB;AACtBC,oBAAkB;;AAGpB;;;;;;;;AAJwB,CAAxB;;AA0DA,SAASU,IAAT,CAAcb,MAAd,EAAsBgB,GAAtB,EAA2BK,QAA3B,EAAqCd,OAArC,EAA8CE,MAA9C,EAAsDR,OAAtD,EAA+D;AAC7D,MAAMqB,SAAS,EAAf;;AAD6D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAElDC,GAFkD;;AAG3D,QAAMC,cAAcxB,OAAOuB,GAAP,CAApB;AACA,QAAME,iBAAiB,QAAOD,YAAYE,IAAnB,MAA4B,QAA5B,IAAwC,CAACC,MAAMC,OAAN,CAAcJ,YAAYE,IAA1B,CAAhE;AACA,QAAIG,WAAWb,IAAIT,QAAQuB,OAAR,CAAgBP,GAAhB,CAAJ,CAAf;AACA,QAAIM,aAAaE,SAAjB,EAA4B;AAC1BF,iBAAW,IAAX;AACD;AACD,QAAIG,cAAJ;AACA,QAAIjB,cAAJ;AACA,QAAIU,cAAJ,EAAoB;AAClBO,cAAQnB,KAAKW,YAAYE,IAAjB,EAAuBV,GAAvB,EAA4BK,QAA5B,EAAsCd,OAAtC,EAA+CE,MAA/C,EAAuDR,OAAvD,CAAR;AACD,KAFD,MAEO;AACL,UAAI4B,aAAa,IAAjB,EAAuB;AACrBG,gBAAQ,IAAR;AACD,OAFD,MAGK,IAAIL,MAAMC,OAAN,CAAcJ,YAAYE,IAA1B,CAAJ,EAAqC;AACxC,YAAIO,WAAW,KAAf;AACA,YAAMC,QAAQd,WAAWS,QAAX,EAAqBM,GAArB,CAAyB,UAACC,MAAD,EAAY;AACjD,cAAMxB,SAASM,WAAWkB,MAAX,EAAmBZ,WAAnB,EAAgCvB,OAAhC,CAAf;AACA,cAAIW,OAAOG,KAAX,EAAkB;AAChBiB,oBAAQI,MAAR;AACArB,oBAAQH,OAAOG,KAAf;AACD;AACD,cAAIH,OAAOoB,KAAP,KAAiB,IAArB,EAA2B;AACzBC,uBAAW,IAAX;AACD;AACD,iBAAOrB,OAAOoB,KAAd;AACD,SAVa,CAAd;AAWA,YAAI,CAACjB,KAAL,EAAY;AACViB,kBAAQC,WAAWC,KAAX,GAAmB,IAA3B;AACD;AACF,OAhBI,MAgBE;AACL,YAAMtB,SAASM,WAAWW,QAAX,EAAqBL,WAArB,EAAkCvB,OAAlC,CAAf;AACAc,gBAAQH,OAAOG,KAAf;AACAiB,gBAAQjB,QAAQc,QAAR,GAAmBjB,OAAOoB,KAAlC;AACD;AACF;AACD,QAAI,CAACjB,KAAD,IAAUiB,UAAU,IAApB,IAA4BR,YAAYa,QAA5C,EAAsD;AACpDtB,cAAQ,UAAR;AACD;AACD,QAAIA,KAAJ,EAAW;AACTA,cAAQ;AACNA,oBADM;AAENC,aAAKK,WAAW,CAFV;AAGNiB,gBAAQf,GAHF;AAINS;AAJM,OAAR;AAMA,UAAIR,YAAYE,IAAhB,EAAsB;AACpBX,cAAMW,IAAN,GAAaF,YAAYE,IAAzB;AACD;AACDjB,aAAOK,IAAP,CAAYC,KAAZ;AACD,KAXD,MAWO,IAAIiB,UAAU,IAAd,EAAoB;AACzBV,aAAOE,YAAYe,IAAnB,IAA2BP,KAA3B;AACD;AAvD0D;;AAE7D,wBAAkBQ,OAAOC,IAAP,CAAYzC,MAAZ,CAAlB,yHAAuC;AAAA;;AAAA;;AAAA;AAsDtC;AACD,MAAIwC,OAAOC,IAAP,CAAYnB,MAAZ,EAAoBX,MAApB,GAA6B,CAAjC,EAAoC;AAClC,WAAOW,MAAP;AACD;AACD,SAAO,IAAP;AACD;;AAED;;;;;;AAMO,SAASJ,UAAT,CAAoBc,KAApB,EAA2BR,WAA3B,EAAwCvB,OAAxC,EAAiD;AACtD,MAAI+B,UAAU,IAAd,EAAoB;AAClB,WAAO,EAAEA,OAAO,IAAT,EAAP;AACD;AACD,MAAIpB,eAAJ;AACA,MAAIY,YAAYkB,KAAhB,EAAuB;AACrB9B,aAAS+B,iBAAiBX,KAAjB,EAAwBR,YAAYkB,KAApC,CAAT;AACD,GAFD,MAEO,IAAIlB,YAAYE,IAAhB,EAAsB;AAC3Bd,aAASgC,iBAAiBZ,KAAjB,EAAwBL,MAAMC,OAAN,CAAcJ,YAAYE,IAA1B,IAAkCF,YAAYE,IAAZ,CAAiB,CAAjB,CAAlC,GAAwDF,YAAYE,IAA5F,EAAkGzB,OAAlG,CAAT;AACD,GAFM,MAEA;AACLW,aAAS,EAAEoB,OAAOA;AAClB;AADS,KAAT;AAED;AACD;AACA,MAAIpB,OAAOG,KAAX,EAAkB;AAChB,WAAOH,MAAP;AACD;AACD,MAAIA,OAAOoB,KAAP,KAAiB,IAArB,EAA2B;AACzB,QAAIR,YAAYqB,KAAZ,IAAqBrB,YAAYqB,KAAZ,CAAkBf,OAAlB,CAA0BlB,OAAOoB,KAAjC,IAA0C,CAAnE,EAAsE;AACpE,aAAO,EAAEjB,OAAO,SAAT,EAAP;AACD;AACD,QAAIS,YAAYsB,QAAhB,EAA0B;AACxB,UAAI;AACFtB,oBAAYsB,QAAZ,CAAqBlC,OAAOoB,KAA5B;AACD,OAFD,CAEE,OAAOjB,KAAP,EAAc;AACd,eAAO,EAAEA,OAAOA,MAAMgC,OAAf,EAAP;AACD;AACF;AACF;AACD,SAAOnC,MAAP;AACD;;AAED;;;;;;AAMA,SAAS+B,gBAAT,CAA0BX,KAA1B,EAAiCU,KAAjC,EAAwC;AACtC,MAAI;AACFV,YAAQU,MAAMV,KAAN,CAAR;AACA,QAAIA,UAAUD,SAAd,EAAyB;AACvB,aAAO,EAAEC,OAAO,IAAT,EAAP;AACD;AACD,WAAO,EAAEA,YAAF,EAAP;AACD,GAND,CAME,OAAOjB,KAAP,EAAc;AACd,WAAO,EAAEA,OAAOA,MAAMgC,OAAf,EAAP;AACD;AACF;;AAED;;;;;;AAMA,SAASH,gBAAT,CAA0BZ,KAA1B,EAAiCN,IAAjC,EAAuCzB,OAAvC,EAAgD;AAC9C,UAAQyB,IAAR;AACE,SAAKsB,MAAL;AACE,aAAO,EAAEhB,YAAF,EAAP;;AAEF,SAAKiB,MAAL;AACA,SAAK,SAAL;AACA;AACE;AACA;AACA;AACA,UAAI,CAACC,SAASlB,KAAT,CAAL,EAAsB;AACpB,eAAO,EAAEjB,OAAO,SAAT,EAAP;AACD;AACD,UAAIW,8BAAoB,CAAC,wBAAUM,KAAV,CAAzB,EAA2C;AACzC,eAAO,EAAEjB,OAAO,SAAT,EAAP;AACD;AACD;AACA;AACA;AACA,UAAI,OAAOiB,KAAP,KAAiB,QAArB,EAA+B;AAC7BA,gBAAQmB,WAAWnB,KAAX,CAAR;AACD;AACD,aAAO,EAAEA,YAAF,EAAP;;AAEF,SAAK,KAAL;AACA;AACE,UAAI,CAAC,gBAAMA,KAAN,CAAL,EAAmB;AACjB,eAAO,EAAEjB,OAAO,SAAT,EAAP;AACD;AACD,aAAO,EAAEiB,YAAF,EAAP;;AAEF,SAAK,OAAL;AACA;AACE,UAAI,CAAC,oBAAQA,KAAR,CAAL,EAAqB;AACnB,eAAO,EAAEjB,OAAO,SAAT,EAAP;AACD;AACD,aAAO,EAAEiB,YAAF,EAAP;;AAEF,SAAKoB,IAAL;AACE;AACA;AACA;AACA,UAAIpB,iBAAiBoB,IAArB,EAA2B;AACzB,eAAO,EAAEpB,YAAF,EAAP;AACD;AACD,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC7B,YAAI,CAACkB,SAASlB,KAAT,CAAL,EAAsB;AACpB,iBAAO,EAAEjB,OAAO,SAAT,EAAP;AACD;AACDiB,gBAAQqB,SAASrB,KAAT,CAAR;AACA,YAAMsB,OAAO,yBAAUtB,KAAV,EAAiB/B,QAAQsD,UAAzB,CAAb;AACA,YAAI,CAACD,IAAL,EAAW;AACT,iBAAO,EAAEvC,OAAO,SAAT,EAAP;AACD;AACD,eAAO,EAAEiB,OAAOsB,IAAT,EAAP;AACD;AACD,aAAO,EAAEvC,OAAO,SAAT,EAAP;;AAEF,SAAKyC,OAAL;AACE,UAAI,OAAOxB,KAAP,KAAiB,SAArB,EAAgC;AAC9B,eAAO,EAAEA,YAAF,EAAP;AACD;AACD,aAAO,EAAEjB,OAAO,SAAT,EAAP;;AAEF;AACE,UAAI,OAAOW,IAAP,KAAgB,UAApB,EAAgC;AAC9B,eAAOiB,iBAAiBX,KAAjB,EAAwBN,IAAxB,CAAP;AACD;AACD,YAAM,IAAI+B,KAAJ,4BAAkC/B,QAAQA,KAAKgC,IAAb,IAAqBhC,IAAvD,EAAN;AApEJ;AAsED;;AAEM,SAASP,QAAT,CAAkBwC,MAAlB,EAA0BC,YAA1B,EAAwCC,UAAxC,EAAoD;AACzD,MAAInD,IAAI,CAAR;AACA,MAAIoD,YAAY,EAAhB;AACA,MAAIC,kBAAJ;AACA,SAAOF,aAAanD,CAAb,GAAiBiD,OAAOhD,MAA/B,EAAuC;AACrC,QAAMoD,aAAYJ,OAAOE,aAAanD,CAApB,CAAlB;AACA,QAAIqD,eAAcH,YAAlB,EAAgC;AAC9B,aAAO,CAACE,SAAD,EAAYpD,CAAZ,CAAP;AACD,KAFD,MAGK,IAAIqD,eAAc,GAAlB,EAAuB;AAC1B,UAAMC,QAAQ7C,SAASwC,MAAT,EAAiB,GAAjB,EAAsBE,aAAanD,CAAb,GAAiB,CAAvC,CAAd;AACAoD,mBAAaE,MAAM,CAAN,CAAb;AACAtD,WAAK,IAAIC,MAAJ,GAAaqD,MAAM,CAAN,CAAb,GAAwB,IAAIrD,MAAjC;AACD,KAJI,MAKA;AACHmD,mBAAaC,UAAb;AACArD;AACD;AACF;AACD,SAAO,CAACoD,SAAD,EAAYpD,CAAZ,CAAP;AACD;;AAEM,SAASU,UAAT,CAAoBuC,MAApB,EAA4B;AACjC,MAAMM,SAAS,EAAf;AACA,MAAIC,QAAQ,CAAZ;AACA,SAAOA,QAAQP,OAAOhD,MAAtB,EAA8B;AAAA,oBACAQ,SAASwC,MAAT,EAAiB,GAAjB,EAAsBO,KAAtB,CADA;AAAA;AAAA,QACrBJ,SADqB;AAAA,QACVnD,MADU;;AAE5BuD,aAASvD,SAAS,IAAIA,MAAtB;AACAsD,WAAOnD,IAAP,CAAYgD,UAAUK,IAAV,EAAZ;AACD;AACD,SAAOF,MAAP;AACD;;AAED;AACA;AACA,IAAM3D,YAAY,SAAZA,SAAY;AAAA,SAAS4B,MAAM,CAAN,EAASC,GAAT,CAAa,UAACiC,CAAD,EAAI1D,CAAJ;AAAA,WAAUwB,MAAMC,GAAN,CAAU;AAAA,aAAOnB,IAAIN,CAAJ,CAAP;AAAA,KAAV,CAAV;AAAA,GAAb,CAAT;AAAA,CAAlB;;AAEA,SAASL,cAAT,CAAwBL,MAAxB,EAAgC;AAC9B,wBAAkBwC,OAAOC,IAAP,CAAYzC,MAAZ,CAAlB,yHAAuC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA5BuB,IAA4B;;AACrC,QAAM8C,QAAQrE,OAAOuB,IAAP,CAAd;AACA,QAAI,CAAC8C,MAAM9B,IAAX,EAAiB;AACf,YAAM,IAAIkB,KAAJ,2CAAkDlC,IAAlD,QAAN;AACD;AACF;AACF","file":"convertToJson.js","sourcesContent":["import parseDate from './parseDate'\r\nimport Integer, { isInteger } from './types/Integer'\r\nimport URL, { isURL } from './types/URL'\r\nimport Email, { isEmail } from './types/Email'\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 {string[][]} 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 } = 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 - 1, columns, errors, options)\r\n if (result) {\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 error.row = rowMap[error.row] + 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 for (const key of Object.keys(schema)) {\r\n const schemaEntry = schema[key]\r\n const isNestedSchema = typeof schemaEntry.type === 'object' && !Array.isArray(schemaEntry.type)\r\n let rawValue = row[columns.indexOf(key)]\r\n if (rawValue === undefined) {\r\n rawValue = null\r\n }\r\n let value\r\n let error\r\n 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 }\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 value = error ? rawValue : result.value\r\n }\r\n }\r\n if (!error && value === null && schemaEntry.required) {\r\n error = 'required'\r\n }\r\n if (error) {\r\n error = {\r\n error,\r\n row: rowIndex + 1,\r\n column: key,\r\n value\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else if (value !== null) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n if (Object.keys(object).length > 0) {\r\n return object\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {string} 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(value, Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type, options)\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' }\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 {string} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {string} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n return { value }\r\n\r\n case Number:\r\n case 'Integer':\r\n case Integer:\r\n // The global isFinite() function determines\r\n // whether the passed value is a finite number.\r\n // If needed, the parameter is first converted to a number.\r\n if (!isFinite(value)) {\r\n return { error: 'invalid' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid' }\r\n }\r\n // Convert strings to numbers.\r\n // Just an additional feature.\r\n // Won't happen when called from `readXlsx()`.\r\n if (typeof value === 'string') {\r\n value = parseFloat(value)\r\n }\r\n return { value }\r\n\r\n case 'URL':\r\n case URL:\r\n if (!isURL(value)) {\r\n return { error: 'invalid' }\r\n }\r\n return { value }\r\n\r\n case 'Email':\r\n case Email:\r\n if (!isEmail(value)) {\r\n return { error: 'invalid' }\r\n }\r\n return { value }\r\n\r\n case Date:\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n if (value instanceof Date) {\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (!isFinite(value)) {\r\n return { error: 'invalid' }\r\n }\r\n value = parseInt(value)\r\n const date = parseDate(value, options.properties)\r\n if (!date) {\r\n return { error: 'invalid' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid' }\r\n\r\n default:\r\n if (typeof type === 'function') {\r\n return parseCustomValue(value, type)\r\n }\r\n throw new Error(`Unknown schema type: ${type && type.name || type}`)\r\n }\r\n}\r\n\r\nexport function getBlock(string, endCharacter, startIndex) {\r\n let i = 0\r\n let substring = ''\r\n let character\r\n while (startIndex + i < string.length) {\r\n const character = string[startIndex + i]\r\n if (character === endCharacter) {\r\n return [substring, i]\r\n }\r\n else if (character === '\"') {\r\n const block = getBlock(string, '\"', startIndex + i + 1)\r\n substring += block[0]\r\n i += '\"'.length + block[1] + '\"'.length\r\n }\r\n else {\r\n substring += character\r\n i++\r\n }\r\n }\r\n return [substring, i]\r\n}\r\n\r\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}"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/convertToJson.test.js"],"names":["date","convertToUTCTimezone","Date","describe","it","should","deep","equal","parse","getTimezoneOffset","DATE","prop","type","NUMBER","Number","BOOLEAN","Boolean","STRING","String","PHONE","value","rows","errors","toISOString","number","phone","boolean","string","required","error","row","column","NAMES","names","INTEGER","length","URL","EMAIL","NAME","validate","Error","TRUE","FALSE","INVALID","true","false","rowMap","getTime"],"mappings":";;AAAA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,IAAMA,OAAOC,qBAAqB,IAAIC,IAAJ,CAAS,IAAT,EAAe,IAAI,CAAnB,EAAsB,EAAtB,EAA0B,EAA1B,CAArB,CAAb;;AAEAC,SAAS,eAAT,EAA0B,YAAM;AAC/BC,IAAG,qBAAH,EAA0B,YAAM;AAC/B,iCAAS,cAAT,EAAyB,GAAzB,EAA8B,CAA9B,EAAiCC,MAAjC,CAAwCC,IAAxC,CAA6CC,KAA7C,CAAmD,CAAC,UAAD,EAAa,EAAb,CAAnD;AACA,mCAAW,mBAAX,EAAgCF,MAAhC,CAAuCC,IAAvC,CAA4CC,KAA5C,CAAkD,CAAC,UAAD,EAAa,GAAb,CAAlD;AACA,EAHD;;AAKAH,IAAG,wBAAH,EAA6B,YAAM;AAAA,uBACT,8BAAc,CACtC,CACC,MADD,EAEC,QAFD,EAGC,SAHD,EAIC,QAJD,EAKC,OALD,CADsC,EAOnC,CACF,IAAIF,IAAJ,CAASA,KAAKM,KAAL,CAAW,YAAX,IAA2B,IAAIN,IAAJ,GAAWO,iBAAX,KAAiC,EAAjC,GAAsC,IAAjE,GAAwE,KAAK,EAAL,GAAU,EAAV,GAAe,IAAhG,CADE,EACqG;AACvG,OAFE,EAGF,IAHE,EAIF,KAJE,EAKF,gBALE,CAPmC,CAAd,EActB;AACFC,SAAM;AACLC,UAAM,MADD;AAELC,UAAMV;AACN;AAHK,IADJ;AAMFW,WAAQ;AACPF,UAAM,QADC;AAEPC,UAAME;AAFC,IANN;AAUFC,YAAS;AACRJ,UAAM,SADE;AAERC,UAAMI;AAFE,IAVP;AAcFC,WAAQ;AACPN,UAAM,QADC;AAEPC,UAAMM;AAFC,IAdN;AAkBFC,UAAO;AACNR,UAAM,OADA;AAENH,SAFM,iBAEAY,KAFA,EAEO;AACZ,YAAO,cAAP;AACA;AAJK;AAlBL,GAdsB,CADS;AAAA,MAC1BC,IAD0B,kBAC1BA,IAD0B;AAAA,MACpBC,MADoB,kBACpBA,MADoB;;AAyClCA,SAAOjB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,EAAzB;;AAEAc,OAAK,CAAL,EAAQrB,IAAR,GAAeqB,KAAK,CAAL,EAAQrB,IAAR,CAAauB,WAAb,EAAf;;AAEAF,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBP,SAAMA,KAAKuB,WAAL,EADiB;AAEvBC,WAAQ,GAFe;AAGvBC,UAAO,cAHgB;AAIvBC,YAAS,IAJc;AAKvBC,WAAQ;AALe,GAAD,CAAvB;AAOA,EApDD;;AAsDAvB,IAAG,uBAAH,EAA4B,YAAM;AAAA,wBACR,8BAAc,CACtC,CACC,QADD,CADsC,EAGnC,CACF,IADE,CAHmC,CAAd,EAMtB;AACFS,WAAQ;AACPF,UAAM,QADC;AAEPC,UAAME,MAFC;AAGPc,cAAU;AAHH;AADN,GANsB,CADQ;AAAA,MACzBP,IADyB,mBACzBA,IADyB;AAAA,MACnBC,MADmB,mBACnBA,MADmB;;AAejCA,SAAOjB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBsB,UAAO,UADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,QAHiB;AAIzBnB,SAAME,MAJmB;AAKzBM,UAAO;AALkB,GAAD,CAAzB;;AAQAC,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,EAAvB;AACA,EAxBD;;AA0BAH,IAAG,qBAAH,EAA0B,YAAM;AAAA,wBACN,8BAAc,CACtC,CACC,OADD,CADsC,EAGnC,CACF,oDADE,CAHmC,EAKnC,CACF,IADE,CALmC,CAAd,EAQtB;AACF4B,UAAO;AACNrB,UAAM,OADA;AAENC,UAAM,CAACM,MAAD;AAFA;AADL,GARsB,CADM;AAAA,MACvBG,IADuB,mBACvBA,IADuB;AAAA,MACjBC,MADiB,mBACjBA,MADiB;;AAgB/BA,SAAOjB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,EAAzB;;AAEAc,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvB0B,UAAO,CAAC,cAAD,EAAiB,sBAAjB,EAAyC,cAAzC;AADgB,GAAD,CAAvB;AAGA,EArBD;;AAuBA7B,IAAG,uBAAH,EAA4B,YAC5B;AAAA,wBAC0B,8BAAc,CACtC,CACC,SADD,CADsC,EAGnC,CACF,GADE,CAHmC,EAKnC,CACF,KADE,CALmC,CAAd,EAQtB;AACF8B,YAAS;AACRvB,UAAM,OADE;AAERC;AAFQ;AADP,GARsB,CAD1B;AAAA,MACSS,IADT,mBACSA,IADT;AAAA,MACeC,MADf,mBACeA,MADf;;AAgBCA,SAAOa,MAAP,CAAc9B,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAe,SAAO,CAAP,EAAUQ,GAAV,CAAczB,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAe,SAAO,CAAP,EAAUS,MAAV,CAAiB1B,MAAjB,CAAwBE,KAAxB,CAA8B,SAA9B;AACAe,SAAO,CAAP,EAAUO,KAAV,CAAgBxB,MAAhB,CAAuBE,KAAvB,CAA6B,SAA7B;;AAEAc,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBa,UAAO;AADgB,GAAD,CAAvB;AAGA,EAzBD;;AA2BAhB,IAAG,mBAAH,EAAwB,YACxB;AAAA,wBAC0B,8BAAc,CACtC,CACC,KADD,CADsC,EAGnC,CACF,oBADE,CAHmC,EAKnC,CACF,YADE,CALmC,CAAd,EAQtB;AACFgC,QAAK;AACJzB,UAAM,OADF;AAEJC;AAFI;AADH,GARsB,CAD1B;AAAA,MACSS,IADT,mBACSA,IADT;AAAA,MACeC,MADf,mBACeA,MADf;;AAgBCA,SAAOa,MAAP,CAAc9B,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAe,SAAO,CAAP,EAAUQ,GAAV,CAAczB,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAe,SAAO,CAAP,EAAUS,MAAV,CAAiB1B,MAAjB,CAAwBE,KAAxB,CAA8B,KAA9B;AACAe,SAAO,CAAP,EAAUO,KAAV,CAAgBxB,MAAhB,CAAuBE,KAAvB,CAA6B,SAA7B;;AAEAc,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBa,UAAO;AADgB,GAAD,CAAvB;AAGA,EAzBD;;AA2BAhB,IAAG,qBAAH,EAA0B,YAC1B;AAAA,wBAC0B,8BAAc,CACtC,CACC,OADD,CADsC,EAGnC,CACF,2BADE,CAHmC,EAKnC,CACF,KADE,CALmC,CAAd,EAQtB;AACFiC,UAAO;AACN1B,UAAM,OADA;AAENC;AAFM;AADL,GARsB,CAD1B;AAAA,MACSS,IADT,mBACSA,IADT;AAAA,MACeC,MADf,mBACeA,MADf;;AAgBCA,SAAOa,MAAP,CAAc9B,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAe,SAAO,CAAP,EAAUQ,GAAV,CAAczB,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAe,SAAO,CAAP,EAAUS,MAAV,CAAiB1B,MAAjB,CAAwBE,KAAxB,CAA8B,OAA9B;AACAe,SAAO,CAAP,EAAUO,KAAV,CAAgBxB,MAAhB,CAAuBE,KAAvB,CAA6B,SAA7B;;AAEAc,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBa,UAAO;AADgB,GAAD,CAAvB;AAGA,EAzBD;;AA2BAhB,IAAG,yBAAH,EAA8B,YAAM;AAAA,wBACV,8BAAc,CACtC,CACC,MADD,CADsC,EAGnC,CACF,aADE,CAHmC,CAAd,EAMtB;AACFkC,SAAM;AACL3B,UAAM,MADD;AAELC,UAAMM,MAFD;AAGLU,cAAU,IAHL;AAILW,cAAU,kBAACnB,KAAD,EAAW;AACpB,SAAIA,UAAU,aAAd,EAA6B;AAC5B,YAAM,IAAIoB,KAAJ,CAAU,cAAV,CAAN;AACA;AACD;AARI;AADJ,GANsB,CADU;AAAA,MAC3BnB,IAD2B,mBAC3BA,IAD2B;AAAA,MACrBC,MADqB,mBACrBA,MADqB;;AAoBnCA,SAAOjB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBsB,UAAO,cADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,MAHiB;AAIzBnB,SAAMM,MAJmB;AAKzBE,UAAO;AALkB,GAAD,CAAzB;;AAQAC,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,EAAvB;AACA,EA7BD;;AA+BAH,IAAG,yBAAH,EAA8B,YAAM;AAAA,wBACV,8BAAc,CACtC,CACC,QADD,CADsC,EAGnC,CACF,QADE,CAHmC,CAAd,EAMtB;AACFS,WAAQ;AACPF,UAAM,QADC;AAEPC,UAAME,MAFC;AAGPc,cAAU;AAHH;AADN,GANsB,CADU;AAAA,MAC3BP,IAD2B,mBAC3BA,IAD2B;AAAA,MACrBC,MADqB,mBACrBA,MADqB;;AAenCA,SAAOjB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBsB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,QAHiB;AAIzBnB,SAAME,MAJmB;AAKzBM,UAAO;AALkB,GAAD,CAAzB;;AAQAC,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,EAAvB;AACA,EAxBD;;AA0BAH,IAAG,0BAAH,EAA+B,YAAM;AAAA,wBACX,8BAAc,CACtC,CACC,MADD,EAEC,OAFD,EAGC,SAHD,CADsC,EAKnC,CACF,IADE,EAEF,KAFE,EAGF,MAHE,CALmC,CAAd,EAUtB;AACFqC,SAAM;AACL9B,UAAM,MADD;AAELC,UAAMI,OAFD;AAGLY,cAAU;AAHL,IADJ;AAMFc,UAAO;AACN/B,UAAM,OADA;AAENC,UAAMI,OAFA;AAGNY,cAAU;AAHJ,IANL;AAWFe,YAAS;AACRhC,UAAM,SADE;AAERC,UAAMI,OAFE;AAGRY,cAAU;AAHF;AAXP,GAVsB,CADW;AAAA,MAC5BP,IAD4B,mBAC5BA,IAD4B;AAAA,MACtBC,MADsB,mBACtBA,MADsB;;AA6BpCA,SAAOjB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBsB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,SAHiB;AAIzBnB,SAAMI,OAJmB;AAKzBI,UAAO;AALkB,GAAD,CAAzB;;AAQAC,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBqC,SAAM,IADiB;AAEvBC,UAAO;AAFgB,GAAD,CAAvB;AAIA,EAzCD;;AA2CAzC,IAAG,uBAAH,EAA4B,YAAM;AAAA,yBACR,8BAAc,CACtC,CACC,MADD,EAEC,SAFD,CADsC,EAInC,CACF,KADE,EACK;AACP,KAFE,CAJmC,EAOnC,CACFJ,IADE,EACI;AACN,KAFE,CAPmC,CAAd,EAWtB;AACFU,SAAM;AACLC,UAAM,MADD;AAELC,UAAMV,IAFD;AAGL;AACA0B,cAAU;AAJL,IADJ;AAOFe,YAAS;AACRhC,UAAM,SADE;AAERC,UAAMV,IAFE;AAGR;AACA0B,cAAU;AAJF;AAPP,GAXsB,CADQ;AAAA,MACzBP,IADyB,oBACzBA,IADyB;AAAA,MACnBC,MADmB,oBACnBA,MADmB;;AA2BjCA,SAAOjB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBsB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,SAHiB;AAIzBnB,SAAMV,IAJmB;AAKzBkB,UAAO;AALkB,GAAD,EAMtB;AACFS,UAAO,SADL;AAEFC,QAAK,CAFH;AAGFC,WAAQ,SAHN;AAIFnB,SAAMV,IAJJ;AAKFkB,UAAO;AALL,GANsB,CAAzB;;AAcAC,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBP;AADuB,GAAD,EAEpB;AACFA;AADE,GAFoB,CAAvB;AAKA,EA9CD;;AAgDAI,IAAG,6BAAH,EAAkC,YAAM;AAAA,yBACd,8BAAc,CACtC,CACC,OADD,CADsC,EAGnC,CACF,KADE,CAHmC,CAAd,EAMtB;AACFe,UAAO;AACNR,UAAM,OADA;AAENH,WAAO,iBAAM;AACZ,WAAM,IAAIgC,KAAJ,CAAU,SAAV,CAAN;AACA;AAJK;AADL,GANsB,CADc;AAAA,MAC/BnB,IAD+B,oBAC/BA,IAD+B;AAAA,MACzBC,MADyB,oBACzBA,MADyB;;AAgBvCA,SAAOjB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBsB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,OAHiB;AAIzBX,UAAO;AAJkB,GAAD,CAAzB;;AAOAC,OAAKhB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,EAAvB;AACA,EAxBD;;AA0BAH,IAAG,wBAAH,EAA6B,YAAM;AAAA,yBACT,8BAAc,CACtC,CACC,QADD,CADsC,EAGnC,CACF,QADE,CAHmC,CAAd,EAMtB;AACFS,WAAQ;AACPF,UAAM,QADC;AAEPC,UAAME;AAFC;AADN,GANsB,EAWtB;AACFgC,WAAQ,CAAC,CAAD,EAAI,CAAJ;AADN,GAXsB,CADS;AAAA,MAC1BzB,IAD0B,oBAC1BA,IAD0B;AAAA,MACpBC,MADoB,oBACpBA,MADoB;;AAgBlCA,SAAOjB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBsB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,QAHiB;AAIzBnB,SAAME,MAJmB;AAKzBM,UAAO;AALkB,GAAD,CAAzB;AAOA,EAvBD;AAwBA,CApYD;;AAuYA;AACA,SAASnB,oBAAT,CAA8BD,IAA9B,EAAoC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,QAAO,IAAIE,IAAJ,CAASF,KAAK+C,OAAL,KAAiB/C,KAAKS,iBAAL,KAA2B,EAA3B,GAAgC,IAA1D,CAAP;AACA","file":"convertToJson.test.js","sourcesContent":["import convertToJson, { parseArray, getBlock } from './convertToJson'\r\nimport Integer from './types/Integer'\r\nimport URL from './types/URL'\r\nimport Email from './types/Email'\r\n\r\nconst date = convertToUTCTimezone(new Date(2018, 3 - 1, 24, 12))\r\n\r\ndescribe('convertToJson', () => {\r\n\tit('should parse arrays', () => {\r\n\t\tgetBlock('abc\"de,f\"g,h', ',', 0).should.deep.equal(['abcde,fg', 10])\r\n\t\tparseArray(' abc\"de,f\"g , h ').should.deep.equal(['abcde,fg', 'h'])\r\n\t})\r\n\r\n\tit('should convert to json', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'DATE',\r\n\t\t\t\t'NUMBER',\r\n\t\t\t\t'BOOLEAN',\r\n\t\t\t\t'STRING',\r\n\t\t\t\t'PHONE'\r\n\t\t\t], [\r\n\t\t\t\tnew Date(Date.parse('03/24/2018') - new Date().getTimezoneOffset() * 60 * 1000 + 12 * 60 * 60 * 1000), // '43183', // '03/24/2018',\r\n\t\t\t\t'123',\r\n\t\t\t\ttrue,\r\n\t\t\t\t'abc',\r\n\t\t\t\t'(123) 456-7890'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tDATE: {\r\n\t\t\t\tprop: 'date',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\t// template: 'MM/DD/YYYY',\r\n\t\t\t},\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number\r\n\t\t\t},\r\n\t\t\tBOOLEAN: {\r\n\t\t\t\tprop: 'boolean',\r\n\t\t\t\ttype: Boolean\r\n\t\t\t},\r\n\t\t\tSTRING: {\r\n\t\t\t\tprop: 'string',\r\n\t\t\t\ttype: String\r\n\t\t\t},\r\n\t\t\tPHONE: {\r\n\t\t\t\tprop: 'phone',\r\n\t\t\t\tparse(value) {\r\n\t\t\t\t\treturn '+11234567890'\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([])\r\n\r\n\t\trows[0].date = rows[0].date.toISOString()\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tdate: date.toISOString(),\r\n\t\t\tnumber: 123,\r\n\t\t\tphone: '+11234567890',\r\n\t\t\tboolean: true,\r\n\t\t\tstring: 'abc'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should require fields', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NUMBER'\r\n\t\t\t], [\r\n\t\t\t\tnull\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number,\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'required',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'NUMBER',\r\n\t\t\ttype: Number,\r\n\t\t\tvalue: null\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should parse arrays', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NAMES'\r\n\t\t\t], [\r\n\t\t\t\t'Barack Obama, \"String, with, colons\", Donald Trump'\r\n\t\t\t], [\r\n\t\t\t\tnull\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNAMES: {\r\n\t\t\t\tprop: 'names',\r\n\t\t\t\ttype: [String]\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([])\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tnames: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should parse integers', () =>\r\n\t{\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'INTEGER'\r\n\t\t\t], [\r\n\t\t\t\t'1'\r\n\t\t\t], [\r\n\t\t\t\t'1.2'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tINTEGER: {\r\n\t\t\t\tprop: 'value',\r\n\t\t\t\ttype: Integer\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(1)\r\n\t\terrors[0].row.should.equal(2)\r\n\t\terrors[0].column.should.equal('INTEGER')\r\n\t\terrors[0].error.should.equal('invalid')\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tvalue: 1\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should parse URLs', () =>\r\n\t{\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'URL'\r\n\t\t\t], [\r\n\t\t\t\t'https://kremlin.ru'\r\n\t\t\t], [\r\n\t\t\t\t'kremlin.ru'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tURL: {\r\n\t\t\t\tprop: 'value',\r\n\t\t\t\ttype: URL\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(1)\r\n\t\terrors[0].row.should.equal(2)\r\n\t\terrors[0].column.should.equal('URL')\r\n\t\terrors[0].error.should.equal('invalid')\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tvalue: 'https://kremlin.ru'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should parse Emails', () =>\r\n\t{\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'EMAIL'\r\n\t\t\t], [\r\n\t\t\t\t'vladimir.putin@kremlin.ru'\r\n\t\t\t], [\r\n\t\t\t\t'123'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tEMAIL: {\r\n\t\t\t\tprop: 'value',\r\n\t\t\t\ttype: Email\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(1)\r\n\t\terrors[0].row.should.equal(2)\r\n\t\terrors[0].column.should.equal('EMAIL')\r\n\t\terrors[0].error.should.equal('invalid')\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tvalue: 'vladimir.putin@kremlin.ru'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should call .validate()', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NAME'\r\n\t\t\t], [\r\n\t\t\t\t'George Bush'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNAME: {\r\n\t\t\t\tprop: 'name',\r\n\t\t\t\ttype: String,\r\n\t\t\t\trequired: true,\r\n\t\t\t\tvalidate: (value) => {\r\n\t\t\t\t\tif (value === 'George Bush') {\r\n\t\t\t\t\t\tthrow new Error('custom-error')\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'custom-error',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'NAME',\r\n\t\t\ttype: String,\r\n\t\t\tvalue: 'George Bush'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should validate numbers', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NUMBER'\r\n\t\t\t], [\r\n\t\t\t\t'123abc'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number,\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'NUMBER',\r\n\t\t\ttype: Number,\r\n\t\t\tvalue: '123abc'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should validate booleans', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'TRUE',\r\n\t\t\t\t'FALSE',\r\n\t\t\t\t'INVALID'\r\n\t\t\t], [\r\n\t\t\t\ttrue,\r\n\t\t\t\tfalse,\r\n\t\t\t\t'TRUE'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tTRUE: {\r\n\t\t\t\tprop: 'true',\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\tFALSE: {\r\n\t\t\t\tprop: 'false',\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\tINVALID: {\r\n\t\t\t\tprop: 'invalid',\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'INVALID',\r\n\t\t\ttype: Boolean,\r\n\t\t\tvalue: 'TRUE'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\ttrue: true,\r\n\t\t\tfalse: false\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should validate dates', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'DATE',\r\n\t\t\t\t'INVALID'\r\n\t\t\t], [\r\n\t\t\t\t43183, // 03/24/2018',\r\n\t\t\t\t'-'\r\n\t\t\t], [\r\n\t\t\t\tdate, // 03/24/2018',,\r\n\t\t\t\t'-'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tDATE: {\r\n\t\t\t\tprop: 'date',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\t// template: 'MM/DD/YYYY',\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\tINVALID: {\r\n\t\t\t\tprop: 'invalid',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\t// template: 'MM/DD/YYYY',\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'INVALID',\r\n\t\t\ttype: Date,\r\n\t\t\tvalue: '-'\r\n\t\t}, {\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 2,\r\n\t\t\tcolumn: 'INVALID',\r\n\t\t\ttype: Date,\r\n\t\t\tvalue: '-'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tdate\r\n\t\t}, {\r\n\t\t\tdate\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should throw parse() errors', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'PHONE'\r\n\t\t\t], [\r\n\t\t\t\t'123'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tPHONE: {\r\n\t\t\t\tprop: 'phone',\r\n\t\t\t\tparse: () => {\r\n\t\t\t\t\tthrow new Error('invalid')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'PHONE',\r\n\t\t\tvalue: '123'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should map row numbers', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NUMBER'\r\n\t\t\t], [\r\n\t\t\t\t'123abc'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\trowMap: [2, 5]\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 6,\r\n\t\t\tcolumn: 'NUMBER',\r\n\t\t\ttype: Number,\r\n\t\t\tvalue: '123abc'\r\n\t\t}])\r\n\t})\r\n})\r\n\r\n\r\n// Converts timezone to UTC while preserving the same time\r\nfunction convertToUTCTimezone(date) {\r\n\t// Doesn't account for leap seconds but I guess that's ok\r\n\t// given that javascript's own `Date()` does not either.\r\n\t// https://www.timeanddate.com/time/leap-seconds-background.html\r\n\t//\r\n\t// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset\r\n\t//\r\n\treturn new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000)\r\n}\r\n"]}
1
+ {"version":3,"sources":["../source/convertToJson.test.js"],"names":["date","convertToUTCTimezone","Date","describe","it","should","deep","equal","parse","getTimezoneOffset","DATE","prop","type","NUMBER","Number","BOOLEAN","Boolean","STRING","String","PHONE","value","PHONE_TYPE","rows","errors","toISOString","number","phone","phoneType","boolean","string","required","error","row","column","NAMES","names","INTEGER","length","URL","EMAIL","NAME","validate","Error","TRUE","FALSE","INVALID","true","false","rowMap","STATUS","oneOf","getTime"],"mappings":"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","file":"convertToJson.test.js","sourcesContent":["import convertToJson, { parseArray, getBlock } from './convertToJson'\r\nimport Integer from './types/Integer'\r\nimport URL from './types/URL'\r\nimport Email from './types/Email'\r\n\r\nconst date = convertToUTCTimezone(new Date(2018, 3 - 1, 24, 12))\r\n\r\ndescribe('convertToJson', () => {\r\n\tit('should parse arrays', () => {\r\n\t\tgetBlock('abc\"de,f\"g,h', ',', 0).should.deep.equal(['abcde,fg', 10])\r\n\t\tparseArray(' abc\"de,f\"g , h ').should.deep.equal(['abcde,fg', 'h'])\r\n\t})\r\n\r\n\tit('should convert to json', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'DATE',\r\n\t\t\t\t'NUMBER',\r\n\t\t\t\t'BOOLEAN',\r\n\t\t\t\t'STRING',\r\n\t\t\t\t'PHONE',\r\n\t\t\t\t'PHONE_TYPE'\r\n\t\t\t], [\r\n\t\t\t\tnew Date(Date.parse('03/24/2018') - new Date().getTimezoneOffset() * 60 * 1000 + 12 * 60 * 60 * 1000), // '43183', // '03/24/2018',\r\n\t\t\t\t'123',\r\n\t\t\t\ttrue,\r\n\t\t\t\t'abc',\r\n\t\t\t\t'(123) 456-7890',\r\n\t\t\t\t'(123) 456-7890'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tDATE: {\r\n\t\t\t\tprop: 'date',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\t// template: 'MM/DD/YYYY',\r\n\t\t\t},\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number\r\n\t\t\t},\r\n\t\t\tBOOLEAN: {\r\n\t\t\t\tprop: 'boolean',\r\n\t\t\t\ttype: Boolean\r\n\t\t\t},\r\n\t\t\tSTRING: {\r\n\t\t\t\tprop: 'string',\r\n\t\t\t\ttype: String\r\n\t\t\t},\r\n\t\t\tPHONE: {\r\n\t\t\t\tprop: 'phone',\r\n\t\t\t\tparse(value) {\r\n\t\t\t\t\treturn '+11234567890'\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tPHONE_TYPE: {\r\n\t\t\t\tprop: 'phoneType',\r\n\t\t\t\ttype(value) {\r\n\t\t\t\t\treturn '+11234567890'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([])\r\n\r\n\t\t// Convert `Date` to `String` for equality check.\r\n\t\trows[0].date = rows[0].date.toISOString()\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tdate: date.toISOString(),\r\n\t\t\tnumber: 123,\r\n\t\t\tphone: '+11234567890',\r\n\t\t\tphoneType: '+11234567890',\r\n\t\t\tboolean: true,\r\n\t\t\tstring: 'abc'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should support schema entries with no `type`s', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'DATE',\r\n\t\t\t\t'NUMBER',\r\n\t\t\t\t'BOOLEAN',\r\n\t\t\t\t'STRING'\r\n\t\t\t], [\r\n\t\t\t\tnew Date(Date.parse('03/24/2018') - new Date().getTimezoneOffset() * 60 * 1000 + 12 * 60 * 60 * 1000), // '43183', // '03/24/2018',\r\n\t\t\t\t123,\r\n\t\t\t\ttrue,\r\n\t\t\t\t'abc'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tDATE: {\r\n\t\t\t\tprop: 'date'\r\n\t\t\t},\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number'\r\n\t\t\t},\r\n\t\t\tBOOLEAN: {\r\n\t\t\t\tprop: 'boolean'\r\n\t\t\t},\r\n\t\t\tSTRING: {\r\n\t\t\t\tprop: 'string'\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([])\r\n\r\n\t\t// Convert `Date` to `String` for equality check.\r\n\t\trows[0].date = rows[0].date.toISOString()\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tdate: date.toISOString(),\r\n\t\t\tnumber: 123,\r\n\t\t\tboolean: true,\r\n\t\t\tstring: 'abc'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should require fields', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NUMBER'\r\n\t\t\t], [\r\n\t\t\t\tnull\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number,\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'required',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'NUMBER',\r\n\t\t\ttype: Number,\r\n\t\t\tvalue: null\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should parse arrays', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NAMES'\r\n\t\t\t], [\r\n\t\t\t\t'Barack Obama, \"String, with, colons\", Donald Trump'\r\n\t\t\t], [\r\n\t\t\t\tnull\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNAMES: {\r\n\t\t\t\tprop: 'names',\r\n\t\t\t\ttype: [String]\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([])\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tnames: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should parse integers', () =>\r\n\t{\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'INTEGER'\r\n\t\t\t], [\r\n\t\t\t\t'1'\r\n\t\t\t], [\r\n\t\t\t\t'1.2'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tINTEGER: {\r\n\t\t\t\tprop: 'value',\r\n\t\t\t\ttype: Integer\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(1)\r\n\t\terrors[0].row.should.equal(2)\r\n\t\terrors[0].column.should.equal('INTEGER')\r\n\t\terrors[0].error.should.equal('invalid')\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tvalue: 1\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should parse URLs', () =>\r\n\t{\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'URL'\r\n\t\t\t], [\r\n\t\t\t\t'https://kremlin.ru'\r\n\t\t\t], [\r\n\t\t\t\t'kremlin.ru'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tURL: {\r\n\t\t\t\tprop: 'value',\r\n\t\t\t\ttype: URL\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(1)\r\n\t\terrors[0].row.should.equal(2)\r\n\t\terrors[0].column.should.equal('URL')\r\n\t\terrors[0].error.should.equal('invalid')\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tvalue: 'https://kremlin.ru'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should parse Emails', () =>\r\n\t{\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'EMAIL'\r\n\t\t\t], [\r\n\t\t\t\t'vladimir.putin@kremlin.ru'\r\n\t\t\t], [\r\n\t\t\t\t'123'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tEMAIL: {\r\n\t\t\t\tprop: 'value',\r\n\t\t\t\ttype: Email\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(1)\r\n\t\terrors[0].row.should.equal(2)\r\n\t\terrors[0].column.should.equal('EMAIL')\r\n\t\terrors[0].error.should.equal('invalid')\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tvalue: 'vladimir.putin@kremlin.ru'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should call .validate()', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NAME'\r\n\t\t\t], [\r\n\t\t\t\t'George Bush'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNAME: {\r\n\t\t\t\tprop: 'name',\r\n\t\t\t\ttype: String,\r\n\t\t\t\trequired: true,\r\n\t\t\t\tvalidate: (value) => {\r\n\t\t\t\t\tif (value === 'George Bush') {\r\n\t\t\t\t\t\tthrow new Error('custom-error')\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'custom-error',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'NAME',\r\n\t\t\ttype: String,\r\n\t\t\tvalue: 'George Bush'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should validate numbers', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NUMBER'\r\n\t\t\t], [\r\n\t\t\t\t'123abc'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number,\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'NUMBER',\r\n\t\t\ttype: Number,\r\n\t\t\tvalue: '123abc'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should validate booleans', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'TRUE',\r\n\t\t\t\t'FALSE',\r\n\t\t\t\t'INVALID'\r\n\t\t\t], [\r\n\t\t\t\ttrue,\r\n\t\t\t\tfalse,\r\n\t\t\t\t'TRUE'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tTRUE: {\r\n\t\t\t\tprop: 'true',\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\tFALSE: {\r\n\t\t\t\tprop: 'false',\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\tINVALID: {\r\n\t\t\t\tprop: 'invalid',\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'INVALID',\r\n\t\t\ttype: Boolean,\r\n\t\t\tvalue: 'TRUE'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\ttrue: true,\r\n\t\t\tfalse: false\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should validate dates', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'DATE',\r\n\t\t\t\t'INVALID'\r\n\t\t\t], [\r\n\t\t\t\t43183, // 03/24/2018',\r\n\t\t\t\t'-'\r\n\t\t\t], [\r\n\t\t\t\tdate, // 03/24/2018',,\r\n\t\t\t\t'-'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tDATE: {\r\n\t\t\t\tprop: 'date',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\t// template: 'MM/DD/YYYY',\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\tINVALID: {\r\n\t\t\t\tprop: 'invalid',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\t// template: 'MM/DD/YYYY',\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'INVALID',\r\n\t\t\ttype: Date,\r\n\t\t\tvalue: '-'\r\n\t\t}, {\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 2,\r\n\t\t\tcolumn: 'INVALID',\r\n\t\t\ttype: Date,\r\n\t\t\tvalue: '-'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tdate\r\n\t\t}, {\r\n\t\t\tdate\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should throw parse() errors', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'PHONE',\r\n\t\t\t\t'PHONE_TYPE'\r\n\t\t\t], [\r\n\t\t\t\t'123',\r\n\t\t\t\t'123'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tPHONE: {\r\n\t\t\t\tprop: 'phone',\r\n\t\t\t\tparse: () => {\r\n\t\t\t\t\tthrow new Error('invalid')\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tPHONE_TYPE: {\r\n\t\t\t\tprop: 'phoneType',\r\n\t\t\t\tparse: () => {\r\n\t\t\t\t\tthrow new Error('invalid')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'PHONE',\r\n\t\t\tvalue: '123'\r\n\t\t}, {\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'PHONE_TYPE',\r\n\t\t\tvalue: '123'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should map row numbers', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NUMBER'\r\n\t\t\t], [\r\n\t\t\t\t'123abc'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\trowMap: [2, 5]\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 6,\r\n\t\t\tcolumn: 'NUMBER',\r\n\t\t\ttype: Number,\r\n\t\t\tvalue: '123abc'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should validate \"oneOf\" (valid)', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'STATUS'\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t'STARTED'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tSTATUS: {\r\n\t\t\t\tprop: 'status',\r\n\t\t\t\ttype: String,\r\n\t\t\t\toneOf: [\r\n\t\t\t\t\t'STARTED',\r\n\t\t\t\t\t'FINISHED'\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(0)\r\n\t})\r\n\r\n\tit('should validate \"oneOf\" (not valid)', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'STATUS'\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t'SCHEDULED'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tSTATUS: {\r\n\t\t\t\tprop: 'status',\r\n\t\t\t\ttype: String,\r\n\t\t\t\toneOf: [\r\n\t\t\t\t\t'STARTED',\r\n\t\t\t\t\t'FINISHED'\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'STATUS',\r\n\t\t\ttype: String,\r\n\t\t\tvalue: 'SCHEDULED'\r\n\t\t}])\r\n\t})\r\n})\r\n\r\n\r\n// Converts timezone to UTC while preserving the same time\r\nfunction convertToUTCTimezone(date) {\r\n\t// Doesn't account for leap seconds but I guess that's ok\r\n\t// given that javascript's own `Date()` does not either.\r\n\t// https://www.timeanddate.com/time/leap-seconds-background.html\r\n\t//\r\n\t// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset\r\n\t//\r\n\treturn new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000)\r\n}\r\n"]}
@@ -555,9 +555,12 @@ function parseFileNames(content, xml) {
555
555
  if (!fileNames.styles) {
556
556
  throw new Error('"styles.xml" file not found in the *.xlsx file');
557
557
  }
558
- if (!fileNames.sharedStrings) {
559
- throw new Error('"sharedStrings.xml" file not found in the *.xlsx file');
560
- }
558
+ // Seems like "sharedStrings.xml" is not required to exist.
559
+ // For example, when the spreadsheet doesn't contain any strings.
560
+ // https://github.com/catamphetamine/read-excel-file/issues/85
561
+ // if (!fileNames.sharedStrings) {
562
+ // throw new Error('"sharedStrings.xml" file not found in the *.xlsx file')
563
+ // }
561
564
  return fileNames;
562
565
  }
563
566
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/readXlsx.js"],"names":["readXlsx","dropEmptyRows","dropEmptyColumns","namespaces","a","r","rr","letters","contents","xml","options","sheet","fileNames","parseFileNames","values","parseValues","sharedStrings","styles","parseStyles","properties","parseProperties","getSheets","sheets","map","name","sheetRelationId","_sheet","relationId","createSheetNotFoundError","parseSheet","cells","length","data","dimensions","leftTop","rightBottom","colsCount","column","rowsCount","row","Array","i","j","cell","value","transformData","rowMap","calculateDimensions","comparator","b","allRows","sort","allCols","minRow","maxRow","minCol","maxCol","colToInt","col","n","indexOf","CellCoords","coords","split","parseInt","trim","Cell","cellNode","getAttribute","select","textContent","undefined","parseFloat","style","numberFormat","id","dateFormat","template","smartDateParser","isDateTemplate","accessor","_","empty","splice","content","createDocument","node","strings","string","join","doc","baseStyles","parseCellStyle","numFmts","parseNumberFormatStyle","reduce","formats","format","xf","hasAttribute","xfId","numFmt","numberFormatId","book","workbookProperties","epoch1904","push","document","relationship","filePath","Error","tokens","token","sheetsList"],"mappings":"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","file":"readXlsx.js","sourcesContent":["import parseDate from './parseDate'\r\n\r\nconst namespaces = {\r\n a: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\r\n // This one seems to be for `r:id` attributes on `<sheet>`s.\r\n r: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\r\n // This one seems to be for `<Relationships/>` file.\r\n rr: 'http://schemas.openxmlformats.org/package/2006/relationships'\r\n}\r\n\r\n// Maps \"A1\"-like coordinates to `{ row, column }` numeric coordinates.\r\nconst letters = [\"\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"]\r\n\r\n/**\r\n * Reads an (unzipped) XLSX file structure into a 2D array of cells.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @param {number?} options.sheet - Workbook sheet id (`1` by default).\r\n * @param {string?} options.dateFormat - Date format, e.g. \"MM/DD/YY\". Values having this format template set will be parsed as dates.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @return {object} An object of shape `{ data, cells, properties }`. `data: string[][]` is an array of rows, each row being an array of cell values. `cells: string[][]` is an array of rows, each row being an array of cells. `properties: object` is the spreadsheet properties (e.g. whether date epoch is 1904 instead of 1900).\r\n */\r\nexport default function readXlsx(contents, xml, options = {}) {\r\n if (!options.sheet) {\r\n options = {\r\n sheet: 1,\r\n ...options\r\n }\r\n }\r\n\r\n // Some Excel editors don't want to use standard naming scheme for sheet files.\r\n // https://github.com/tidyverse/readxl/issues/104\r\n const fileNames = parseFileNames(contents['xl/_rels/workbook.xml.rels'], xml)\r\n // Default file path for \"shared strings\": \"xl/sharedStrings.xml\".\r\n const values = parseValues(contents[`xl/${fileNames.sharedStrings}`], xml)\r\n // Default file path for \"styles\": \"xl/styles.xml\".\r\n const styles = parseStyles(contents[`xl/${fileNames.styles}`], xml)\r\n const properties = parseProperties(contents['xl/workbook.xml'], xml)\r\n\r\n // A feature for getting the list of sheets in an Excel file.\r\n // https://github.com/catamphetamine/read-excel-file/issues/14\r\n if (options.getSheets) {\r\n return properties.sheets.map(({ name }) => ({\r\n name\r\n }))\r\n }\r\n\r\n // Find the sheet by name, or take the first one.\r\n let sheetRelationId\r\n if (typeof options.sheet === 'number') {\r\n const _sheet = properties.sheets[options.sheet - 1]\r\n sheetRelationId = _sheet && _sheet.relationId\r\n } else {\r\n for (const sheet of properties.sheets) {\r\n if (sheet.name === options.sheet) {\r\n sheetRelationId = sheet.relationId\r\n break\r\n }\r\n }\r\n }\r\n\r\n // If the sheet wasn't found then throw an error.\r\n // Example: \"xl/worksheets/sheet1.xml\".\r\n if (!sheetRelationId || !fileNames.sheets[sheetRelationId]) {\r\n throw createSheetNotFoundError(options.sheet, properties.sheets)\r\n }\r\n\r\n // Parse sheet data.\r\n const sheet = parseSheet(\r\n contents[`xl/${fileNames.sheets[sheetRelationId]}`],\r\n xml,\r\n values,\r\n styles,\r\n properties,\r\n options\r\n )\r\n\r\n // If the sheet is empty.\r\n if (sheet.cells.length === 0) {\r\n if (options.properties) {\r\n return {\r\n data: [],\r\n properties\r\n }\r\n }\r\n return []\r\n }\r\n\r\n const [ leftTop, rightBottom ] = sheet.dimensions\r\n\r\n const colsCount = (rightBottom.column - leftTop.column) + 1\r\n const rowsCount = (rightBottom.row - leftTop.row) + 1\r\n\r\n // `sheet.cells` seem to not necessarily be sorted by row and column.\r\n let data = new Array(rowsCount)\r\n let i = 0\r\n while (i < rowsCount) {\r\n data[i] = new Array(colsCount)\r\n let j = 0\r\n while (j < colsCount) {\r\n data[i][j] = null\r\n j++\r\n }\r\n i++\r\n }\r\n for (const cell of sheet.cells) {\r\n const row = cell.row - leftTop.row\r\n const column = cell.column - leftTop.column\r\n data[row][column] = cell.value\r\n }\r\n\r\n if (options.transformData) {\r\n data = options.transformData(data)\r\n }\r\n\r\n data = dropEmptyRows(dropEmptyColumns(data), options.rowMap)\r\n\r\n if (options.properties) {\r\n return {\r\n data,\r\n properties\r\n }\r\n }\r\n\r\n return data\r\n}\r\n\r\nfunction calculateDimensions (cells) {\r\n const comparator = (a, b) => a - b\r\n const allRows = cells.map(cell => cell.row).sort(comparator)\r\n const allCols = cells.map(cell => cell.column).sort(comparator)\r\n const minRow = allRows[0]\r\n const maxRow = allRows[allRows.length - 1]\r\n const minCol = allCols[0]\r\n const maxCol = allCols[allCols.length - 1]\r\n\r\n return [\r\n { row: minRow, column: minCol },\r\n { row: maxRow, column: maxCol }\r\n ]\r\n}\r\n\r\nfunction colToInt(col) {\r\n // `for ... of ...` would require Babel polyfill for iterating a string.\r\n let n = 0\r\n let i = 0\r\n while (i < col.length) {\r\n n *= 26\r\n n += letters.indexOf(col[i])\r\n i++\r\n }\r\n return n\r\n}\r\n\r\nfunction CellCoords(coords) {\r\n // Examples: \"AA2091\", \"R988\", \"B1\"\r\n coords = coords.split(/(\\d+)/)\r\n return [\r\n // Row.\r\n parseInt(coords[1]),\r\n // Column.\r\n colToInt(coords[0].trim())\r\n ]\r\n}\r\n\r\nfunction Cell(cellNode, sheet, xml, values, styles, properties, options) {\r\n const coords = CellCoords(cellNode.getAttribute('r'))\r\n\r\n let value = xml.select(sheet, cellNode, 'a:v', namespaces)[0]\r\n // For `xpath` `value` can be `undefined` while for native `DOMParser` it's `null`.\r\n // So using `value && ...` instead of `if (value !== undefined) { ... }` here.\r\n value = value && value.textContent\r\n\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n switch (cellNode.getAttribute('t')) {\r\n // If the cell contains formula string.\r\n case 'str':\r\n value = value.trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n // If the cell contains a \"shared\" string.\r\n case 's':\r\n // If a cell has no value then there's no `<c/>` element for it.\r\n // If a `<c/>` element exists then it's not empty.\r\n // The `<v/>`alue is a key in the \"shared strings\" dictionary of the\r\n // XLSX file, so look it up in the `values` dictionary by the numeric key.\r\n value = values[parseInt(value)].trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n case 'b':\r\n value = value === '1' ? true : false\r\n break\r\n\r\n case 'n':\r\n // Default type is \"n\".\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n default:\r\n if (value === undefined) {\r\n break\r\n }\r\n value = parseFloat(value)\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n const style = styles[parseInt(cellNode.getAttribute('s') || 0)]\r\n if ((style.numberFormat.id >= 14 && style.numberFormat.id <= 22) ||\r\n (style.numberFormat.id >= 45 && style.numberFormat.id <= 47) ||\r\n (options.dateFormat && style.numberFormat.template === options.dateFormat) ||\r\n (options.smartDateParser !== false && style.numberFormat.template && isDateTemplate(style.numberFormat.template))) {\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return {\r\n row : coords[0],\r\n column : coords[1],\r\n value\r\n }\r\n}\r\n\r\nexport function dropEmptyRows(data, rowMap, accessor = _ => _) {\r\n // Fill in row map.\r\n if (rowMap) {\r\n let j = 0\r\n while (j < data.length) {\r\n rowMap[j] = j\r\n j++\r\n }\r\n }\r\n // Drop empty rows.\r\n let i = data.length - 1\r\n while (i >= 0) {\r\n // Check if the row is empty.\r\n let empty = true\r\n for (const cell of data[i]) {\r\n if (accessor(cell) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n // Remove the empty row.\r\n if (empty) {\r\n data.splice(i, 1)\r\n if (rowMap) {\r\n rowMap.splice(i, 1)\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nexport function dropEmptyColumns(data, accessor = _ => _) {\r\n let i = data[0].length - 1\r\n while (i >= 0) {\r\n let empty = true\r\n for (const row of data) {\r\n if (accessor(row[i]) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n if (empty) {\r\n let j = 0;\r\n while (j < data.length) {\r\n data[j].splice(i, 1)\r\n j++\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nfunction parseSheet(content, xml, values, styles, properties, options) {\r\n const sheet = xml.createDocument(content)\r\n\r\n const cells = xml.select(sheet, null, '/a:worksheet/a:sheetData/a:row/a:c', namespaces).map(node => Cell(node, sheet, xml, values, styles, properties, options))\r\n\r\n if (cells.length === 0) {\r\n return { cells }\r\n }\r\n\r\n // \"//a:dimension/@ref\" causes \"RangeError: Maximum call stack size exceeded\" error.\r\n // That selector was in the legacy code I copy-pasted and no one knows why it was there.\r\n // let dimensions = xml.select(sheet, null, '//a:dimension/@ref', namespaces)[0]\r\n let dimensions = xml.select(sheet, null, '/a:worksheet/a:dimension/@ref', namespaces)[0]\r\n\r\n if (dimensions) {\r\n dimensions = dimensions.textContent.split(':').map(CellCoords).map(([row, column]) => ({\r\n row,\r\n column\r\n }))\r\n // When there's only a single cell on a sheet\r\n // there can sometimes be just \"A1\" for the dimensions string.\r\n if (dimensions.length === 1) {\r\n dimensions = [dimensions[0], dimensions[0]]\r\n }\r\n } else {\r\n dimensions = calculateDimensions(cells)\r\n }\r\n\r\n return { cells, dimensions }\r\n}\r\n\r\nfunction parseValues(content, xml) {\r\n if (!content) {\r\n return []\r\n }\r\n const strings = xml.createDocument(content)\r\n return xml.select(strings, null, '//a:si', namespaces)\r\n .map(string => xml.select(strings, string, './/a:t[not(ancestor::a:rPh)]', namespaces).map(_ => _.textContent).join(''))\r\n}\r\n\r\n// http://officeopenxml.com/SSstyles.php\r\nfunction parseStyles(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n // https://social.msdn.microsoft.com/Forums/sqlserver/en-US/708978af-b598-45c4-a598-d3518a5a09f0/howwhen-is-cellstylexfs-vs-cellxfs-applied-to-a-cell?forum=os_binaryfile\r\n // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/\r\n const doc = xml.createDocument(content)\r\n const baseStyles = xml.select(doc, null, '//a:styleSheet/a:cellStyleXfs/a:xf', namespaces).map(parseCellStyle);\r\n const numFmts = xml.select(doc, null, '//a:styleSheet/a:numFmts/a:numFmt', namespaces)\r\n .map(parseNumberFormatStyle)\r\n .reduce((formats, format) => {\r\n formats[format.id] = format\r\n return formats\r\n }, [])\r\n\r\n return xml.select(doc, null, '//a:styleSheet/a:cellXfs/a:xf', namespaces).map((xf) => {\r\n if (xf.hasAttribute('xfId')) {\r\n return {\r\n ...baseStyles[xf.xfId],\r\n ...parseCellStyle(xf, numFmts)\r\n }\r\n }\r\n return parseCellStyle(xf, numFmts)\r\n })\r\n}\r\n\r\nfunction parseNumberFormatStyle(numFmt) {\r\n return {\r\n id: numFmt.getAttribute('numFmtId'),\r\n template: numFmt.getAttribute('formatCode')\r\n }\r\n}\r\n\r\n// http://www.datypic.com/sc/ooxml/e-ssml_xf-2.html\r\nfunction parseCellStyle(xf, numFmts) {\r\n const style = {}\r\n if (xf.hasAttribute('numFmtId')) {\r\n const numberFormatId = xf.getAttribute('numFmtId')\r\n if (numFmts[numberFormatId]) {\r\n style.numberFormat = numFmts[numberFormatId]\r\n } else {\r\n style.numberFormat = { id: numberFormatId }\r\n }\r\n }\r\n return style\r\n}\r\n\r\n// I guess `xl/workbook.xml` file should always be present inside the *.xlsx archive.\r\nfunction parseProperties(content, xml) {\r\n const book = xml.createDocument(content)\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html\r\n const properties = {};\r\n // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel\r\n const workbookProperties = xml.select(book, null, '//a:workbookPr', namespaces)[0]\r\n if (workbookProperties && workbookProperties.getAttribute('date1904') === '1') {\r\n properties.epoch1904 = true\r\n }\r\n // Get sheets info (indexes, names, if they're available).\r\n // Example:\r\n // <sheets>\r\n // <sheet\r\n // xmlns:ns=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n // name=\"Sheet1\"\r\n // sheetId=\"1\"\r\n // ns:id=\"rId3\"/>\r\n // </sheets>\r\n // http://www.datypic.com/sc/ooxml/e-ssml_sheet-1.html\r\n properties.sheets = []\r\n let i = 0\r\n for (const sheet of xml.select(book, null, '//a:sheets/a:sheet', namespaces)) {\r\n if (sheet.getAttribute('name')) {\r\n properties.sheets.push({\r\n id: sheet.getAttribute('sheetId'),\r\n name: sheet.getAttribute('name'),\r\n relationId: sheet.getAttribute('r:id')\r\n })\r\n }\r\n i++\r\n }\r\n return properties;\r\n}\r\n\r\n/**\r\n * Returns sheet file paths.\r\n * Seems that the correct place to look for the\r\n * `sheetId` -> `filename` mapping seems to be in the\r\n * `xl/_rels/workbook.xml.rels` file.\r\n * https://github.com/tidyverse/readxl/issues/104\r\n * @param {string} content — `xl/_rels/workbook.xml.rels` file contents.\r\n * @param {object} xml\r\n * @return {object}\r\n */\r\nfunction parseFileNames(content, xml) {\r\n // Example:\r\n // <Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n // ...\r\n // <Relationship\r\n // Id=\"rId3\"\r\n // Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\"\r\n // Target=\"worksheets/sheet1.xml\"/>\r\n // </Relationships>\r\n const document = xml.createDocument(content)\r\n const fileNames = {\r\n sheets: {},\r\n sharedStrings: undefined,\r\n styles: undefined\r\n }\r\n for (const relationship of xml.select(document, null, '/rr:Relationships/rr:Relationship', namespaces)) {\r\n const filePath = relationship.getAttribute('Target')\r\n switch (relationship.getAttribute('Type')) {\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles':\r\n fileNames.styles = filePath\r\n break\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings':\r\n fileNames.sharedStrings = filePath\r\n break\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet':\r\n fileNames.sheets[relationship.getAttribute('Id')] = filePath\r\n break\r\n }\r\n }\r\n if (!fileNames.styles) {\r\n throw new Error('\"styles.xml\" file not found in the *.xlsx file')\r\n }\r\n if (!fileNames.sharedStrings) {\r\n throw new Error('\"sharedStrings.xml\" file not found in the *.xlsx file')\r\n }\r\n return fileNames\r\n}\r\n\r\nfunction isDateTemplate(template) {\r\n const tokens = template.split(/\\W+/)\r\n for (const token of tokens) {\r\n if (['MM', 'DD', 'YY', 'YYYY'].indexOf(token) < 0) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction createSheetNotFoundError(sheet, sheets) {\r\n const sheetsList = sheets && sheets.map((sheet, i) => `\"${sheet.name}\" (#${i + 1})`).join(', ')\r\n return new Error(`Sheet ${typeof sheet === 'number' ? '#' + sheet : '\"' + sheet + '\"'} not found in the *.xlsx file.${sheets ? ' Available sheets: ' + sheetsList + '.' : ''}`)\r\n}"]}
1
+ {"version":3,"sources":["../source/readXlsx.js"],"names":["readXlsx","dropEmptyRows","dropEmptyColumns","namespaces","a","r","rr","letters","contents","xml","options","sheet","fileNames","parseFileNames","values","parseValues","sharedStrings","styles","parseStyles","properties","parseProperties","getSheets","sheets","map","name","sheetRelationId","_sheet","relationId","createSheetNotFoundError","parseSheet","cells","length","data","dimensions","leftTop","rightBottom","colsCount","column","rowsCount","row","Array","i","j","cell","value","transformData","rowMap","calculateDimensions","comparator","b","allRows","sort","allCols","minRow","maxRow","minCol","maxCol","colToInt","col","n","indexOf","CellCoords","coords","split","parseInt","trim","Cell","cellNode","getAttribute","select","textContent","undefined","parseFloat","style","numberFormat","id","dateFormat","template","smartDateParser","isDateTemplate","accessor","_","empty","splice","content","createDocument","node","strings","string","join","doc","baseStyles","parseCellStyle","numFmts","parseNumberFormatStyle","reduce","formats","format","xf","hasAttribute","xfId","numFmt","numberFormatId","book","workbookProperties","epoch1904","push","document","relationship","filePath","Error","tokens","token","sheetsList"],"mappings":"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","file":"readXlsx.js","sourcesContent":["import parseDate from './parseDate'\r\n\r\nconst namespaces = {\r\n a: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\r\n // This one seems to be for `r:id` attributes on `<sheet>`s.\r\n r: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\r\n // This one seems to be for `<Relationships/>` file.\r\n rr: 'http://schemas.openxmlformats.org/package/2006/relationships'\r\n}\r\n\r\n// Maps \"A1\"-like coordinates to `{ row, column }` numeric coordinates.\r\nconst letters = [\"\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"]\r\n\r\n/**\r\n * Reads an (unzipped) XLSX file structure into a 2D array of cells.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @param {number?} options.sheet - Workbook sheet id (`1` by default).\r\n * @param {string?} options.dateFormat - Date format, e.g. \"MM/DD/YY\". Values having this format template set will be parsed as dates.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @return {object} An object of shape `{ data, cells, properties }`. `data: string[][]` is an array of rows, each row being an array of cell values. `cells: string[][]` is an array of rows, each row being an array of cells. `properties: object` is the spreadsheet properties (e.g. whether date epoch is 1904 instead of 1900).\r\n */\r\nexport default function readXlsx(contents, xml, options = {}) {\r\n if (!options.sheet) {\r\n options = {\r\n sheet: 1,\r\n ...options\r\n }\r\n }\r\n\r\n // Some Excel editors don't want to use standard naming scheme for sheet files.\r\n // https://github.com/tidyverse/readxl/issues/104\r\n const fileNames = parseFileNames(contents['xl/_rels/workbook.xml.rels'], xml)\r\n // Default file path for \"shared strings\": \"xl/sharedStrings.xml\".\r\n const values = parseValues(contents[`xl/${fileNames.sharedStrings}`], xml)\r\n // Default file path for \"styles\": \"xl/styles.xml\".\r\n const styles = parseStyles(contents[`xl/${fileNames.styles}`], xml)\r\n const properties = parseProperties(contents['xl/workbook.xml'], xml)\r\n\r\n // A feature for getting the list of sheets in an Excel file.\r\n // https://github.com/catamphetamine/read-excel-file/issues/14\r\n if (options.getSheets) {\r\n return properties.sheets.map(({ name }) => ({\r\n name\r\n }))\r\n }\r\n\r\n // Find the sheet by name, or take the first one.\r\n let sheetRelationId\r\n if (typeof options.sheet === 'number') {\r\n const _sheet = properties.sheets[options.sheet - 1]\r\n sheetRelationId = _sheet && _sheet.relationId\r\n } else {\r\n for (const sheet of properties.sheets) {\r\n if (sheet.name === options.sheet) {\r\n sheetRelationId = sheet.relationId\r\n break\r\n }\r\n }\r\n }\r\n\r\n // If the sheet wasn't found then throw an error.\r\n // Example: \"xl/worksheets/sheet1.xml\".\r\n if (!sheetRelationId || !fileNames.sheets[sheetRelationId]) {\r\n throw createSheetNotFoundError(options.sheet, properties.sheets)\r\n }\r\n\r\n // Parse sheet data.\r\n const sheet = parseSheet(\r\n contents[`xl/${fileNames.sheets[sheetRelationId]}`],\r\n xml,\r\n values,\r\n styles,\r\n properties,\r\n options\r\n )\r\n\r\n // If the sheet is empty.\r\n if (sheet.cells.length === 0) {\r\n if (options.properties) {\r\n return {\r\n data: [],\r\n properties\r\n }\r\n }\r\n return []\r\n }\r\n\r\n const [ leftTop, rightBottom ] = sheet.dimensions\r\n\r\n const colsCount = (rightBottom.column - leftTop.column) + 1\r\n const rowsCount = (rightBottom.row - leftTop.row) + 1\r\n\r\n // `sheet.cells` seem to not necessarily be sorted by row and column.\r\n let data = new Array(rowsCount)\r\n let i = 0\r\n while (i < rowsCount) {\r\n data[i] = new Array(colsCount)\r\n let j = 0\r\n while (j < colsCount) {\r\n data[i][j] = null\r\n j++\r\n }\r\n i++\r\n }\r\n for (const cell of sheet.cells) {\r\n const row = cell.row - leftTop.row\r\n const column = cell.column - leftTop.column\r\n data[row][column] = cell.value\r\n }\r\n\r\n if (options.transformData) {\r\n data = options.transformData(data)\r\n }\r\n\r\n data = dropEmptyRows(dropEmptyColumns(data), options.rowMap)\r\n\r\n if (options.properties) {\r\n return {\r\n data,\r\n properties\r\n }\r\n }\r\n\r\n return data\r\n}\r\n\r\nfunction calculateDimensions (cells) {\r\n const comparator = (a, b) => a - b\r\n const allRows = cells.map(cell => cell.row).sort(comparator)\r\n const allCols = cells.map(cell => cell.column).sort(comparator)\r\n const minRow = allRows[0]\r\n const maxRow = allRows[allRows.length - 1]\r\n const minCol = allCols[0]\r\n const maxCol = allCols[allCols.length - 1]\r\n\r\n return [\r\n { row: minRow, column: minCol },\r\n { row: maxRow, column: maxCol }\r\n ]\r\n}\r\n\r\nfunction colToInt(col) {\r\n // `for ... of ...` would require Babel polyfill for iterating a string.\r\n let n = 0\r\n let i = 0\r\n while (i < col.length) {\r\n n *= 26\r\n n += letters.indexOf(col[i])\r\n i++\r\n }\r\n return n\r\n}\r\n\r\nfunction CellCoords(coords) {\r\n // Examples: \"AA2091\", \"R988\", \"B1\"\r\n coords = coords.split(/(\\d+)/)\r\n return [\r\n // Row.\r\n parseInt(coords[1]),\r\n // Column.\r\n colToInt(coords[0].trim())\r\n ]\r\n}\r\n\r\nfunction Cell(cellNode, sheet, xml, values, styles, properties, options) {\r\n const coords = CellCoords(cellNode.getAttribute('r'))\r\n\r\n let value = xml.select(sheet, cellNode, 'a:v', namespaces)[0]\r\n // For `xpath` `value` can be `undefined` while for native `DOMParser` it's `null`.\r\n // So using `value && ...` instead of `if (value !== undefined) { ... }` here.\r\n value = value && value.textContent\r\n\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n switch (cellNode.getAttribute('t')) {\r\n // If the cell contains formula string.\r\n case 'str':\r\n value = value.trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n // If the cell contains a \"shared\" string.\r\n case 's':\r\n // If a cell has no value then there's no `<c/>` element for it.\r\n // If a `<c/>` element exists then it's not empty.\r\n // The `<v/>`alue is a key in the \"shared strings\" dictionary of the\r\n // XLSX file, so look it up in the `values` dictionary by the numeric key.\r\n value = values[parseInt(value)].trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n case 'b':\r\n value = value === '1' ? true : false\r\n break\r\n\r\n case 'n':\r\n // Default type is \"n\".\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n default:\r\n if (value === undefined) {\r\n break\r\n }\r\n value = parseFloat(value)\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n const style = styles[parseInt(cellNode.getAttribute('s') || 0)]\r\n if ((style.numberFormat.id >= 14 && style.numberFormat.id <= 22) ||\r\n (style.numberFormat.id >= 45 && style.numberFormat.id <= 47) ||\r\n (options.dateFormat && style.numberFormat.template === options.dateFormat) ||\r\n (options.smartDateParser !== false && style.numberFormat.template && isDateTemplate(style.numberFormat.template))) {\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return {\r\n row : coords[0],\r\n column : coords[1],\r\n value\r\n }\r\n}\r\n\r\nexport function dropEmptyRows(data, rowMap, accessor = _ => _) {\r\n // Fill in row map.\r\n if (rowMap) {\r\n let j = 0\r\n while (j < data.length) {\r\n rowMap[j] = j\r\n j++\r\n }\r\n }\r\n // Drop empty rows.\r\n let i = data.length - 1\r\n while (i >= 0) {\r\n // Check if the row is empty.\r\n let empty = true\r\n for (const cell of data[i]) {\r\n if (accessor(cell) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n // Remove the empty row.\r\n if (empty) {\r\n data.splice(i, 1)\r\n if (rowMap) {\r\n rowMap.splice(i, 1)\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nexport function dropEmptyColumns(data, accessor = _ => _) {\r\n let i = data[0].length - 1\r\n while (i >= 0) {\r\n let empty = true\r\n for (const row of data) {\r\n if (accessor(row[i]) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n if (empty) {\r\n let j = 0;\r\n while (j < data.length) {\r\n data[j].splice(i, 1)\r\n j++\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nfunction parseSheet(content, xml, values, styles, properties, options) {\r\n const sheet = xml.createDocument(content)\r\n\r\n const cells = xml.select(sheet, null, '/a:worksheet/a:sheetData/a:row/a:c', namespaces).map(node => Cell(node, sheet, xml, values, styles, properties, options))\r\n\r\n if (cells.length === 0) {\r\n return { cells }\r\n }\r\n\r\n // \"//a:dimension/@ref\" causes \"RangeError: Maximum call stack size exceeded\" error.\r\n // That selector was in the legacy code I copy-pasted and no one knows why it was there.\r\n // let dimensions = xml.select(sheet, null, '//a:dimension/@ref', namespaces)[0]\r\n let dimensions = xml.select(sheet, null, '/a:worksheet/a:dimension/@ref', namespaces)[0]\r\n\r\n if (dimensions) {\r\n dimensions = dimensions.textContent.split(':').map(CellCoords).map(([row, column]) => ({\r\n row,\r\n column\r\n }))\r\n // When there's only a single cell on a sheet\r\n // there can sometimes be just \"A1\" for the dimensions string.\r\n if (dimensions.length === 1) {\r\n dimensions = [dimensions[0], dimensions[0]]\r\n }\r\n } else {\r\n dimensions = calculateDimensions(cells)\r\n }\r\n\r\n return { cells, dimensions }\r\n}\r\n\r\nfunction parseValues(content, xml) {\r\n if (!content) {\r\n return []\r\n }\r\n const strings = xml.createDocument(content)\r\n return xml.select(strings, null, '//a:si', namespaces)\r\n .map(string => xml.select(strings, string, './/a:t[not(ancestor::a:rPh)]', namespaces).map(_ => _.textContent).join(''))\r\n}\r\n\r\n// http://officeopenxml.com/SSstyles.php\r\nfunction parseStyles(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n // https://social.msdn.microsoft.com/Forums/sqlserver/en-US/708978af-b598-45c4-a598-d3518a5a09f0/howwhen-is-cellstylexfs-vs-cellxfs-applied-to-a-cell?forum=os_binaryfile\r\n // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/\r\n const doc = xml.createDocument(content)\r\n const baseStyles = xml.select(doc, null, '//a:styleSheet/a:cellStyleXfs/a:xf', namespaces).map(parseCellStyle);\r\n const numFmts = xml.select(doc, null, '//a:styleSheet/a:numFmts/a:numFmt', namespaces)\r\n .map(parseNumberFormatStyle)\r\n .reduce((formats, format) => {\r\n formats[format.id] = format\r\n return formats\r\n }, [])\r\n\r\n return xml.select(doc, null, '//a:styleSheet/a:cellXfs/a:xf', namespaces).map((xf) => {\r\n if (xf.hasAttribute('xfId')) {\r\n return {\r\n ...baseStyles[xf.xfId],\r\n ...parseCellStyle(xf, numFmts)\r\n }\r\n }\r\n return parseCellStyle(xf, numFmts)\r\n })\r\n}\r\n\r\nfunction parseNumberFormatStyle(numFmt) {\r\n return {\r\n id: numFmt.getAttribute('numFmtId'),\r\n template: numFmt.getAttribute('formatCode')\r\n }\r\n}\r\n\r\n// http://www.datypic.com/sc/ooxml/e-ssml_xf-2.html\r\nfunction parseCellStyle(xf, numFmts) {\r\n const style = {}\r\n if (xf.hasAttribute('numFmtId')) {\r\n const numberFormatId = xf.getAttribute('numFmtId')\r\n if (numFmts[numberFormatId]) {\r\n style.numberFormat = numFmts[numberFormatId]\r\n } else {\r\n style.numberFormat = { id: numberFormatId }\r\n }\r\n }\r\n return style\r\n}\r\n\r\n// I guess `xl/workbook.xml` file should always be present inside the *.xlsx archive.\r\nfunction parseProperties(content, xml) {\r\n const book = xml.createDocument(content)\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html\r\n const properties = {};\r\n // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel\r\n const workbookProperties = xml.select(book, null, '//a:workbookPr', namespaces)[0]\r\n if (workbookProperties && workbookProperties.getAttribute('date1904') === '1') {\r\n properties.epoch1904 = true\r\n }\r\n // Get sheets info (indexes, names, if they're available).\r\n // Example:\r\n // <sheets>\r\n // <sheet\r\n // xmlns:ns=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n // name=\"Sheet1\"\r\n // sheetId=\"1\"\r\n // ns:id=\"rId3\"/>\r\n // </sheets>\r\n // http://www.datypic.com/sc/ooxml/e-ssml_sheet-1.html\r\n properties.sheets = []\r\n let i = 0\r\n for (const sheet of xml.select(book, null, '//a:sheets/a:sheet', namespaces)) {\r\n if (sheet.getAttribute('name')) {\r\n properties.sheets.push({\r\n id: sheet.getAttribute('sheetId'),\r\n name: sheet.getAttribute('name'),\r\n relationId: sheet.getAttribute('r:id')\r\n })\r\n }\r\n i++\r\n }\r\n return properties;\r\n}\r\n\r\n/**\r\n * Returns sheet file paths.\r\n * Seems that the correct place to look for the\r\n * `sheetId` -> `filename` mapping seems to be in the\r\n * `xl/_rels/workbook.xml.rels` file.\r\n * https://github.com/tidyverse/readxl/issues/104\r\n * @param {string} content — `xl/_rels/workbook.xml.rels` file contents.\r\n * @param {object} xml\r\n * @return {object}\r\n */\r\nfunction parseFileNames(content, xml) {\r\n // Example:\r\n // <Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n // ...\r\n // <Relationship\r\n // Id=\"rId3\"\r\n // Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\"\r\n // Target=\"worksheets/sheet1.xml\"/>\r\n // </Relationships>\r\n const document = xml.createDocument(content)\r\n const fileNames = {\r\n sheets: {},\r\n sharedStrings: undefined,\r\n styles: undefined\r\n }\r\n for (const relationship of xml.select(document, null, '/rr:Relationships/rr:Relationship', namespaces)) {\r\n const filePath = relationship.getAttribute('Target')\r\n switch (relationship.getAttribute('Type')) {\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles':\r\n fileNames.styles = filePath\r\n break\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings':\r\n fileNames.sharedStrings = filePath\r\n break\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet':\r\n fileNames.sheets[relationship.getAttribute('Id')] = filePath\r\n break\r\n }\r\n }\r\n if (!fileNames.styles) {\r\n throw new Error('\"styles.xml\" file not found in the *.xlsx file')\r\n }\r\n // Seems like \"sharedStrings.xml\" is not required to exist.\r\n // For example, when the spreadsheet doesn't contain any strings.\r\n // https://github.com/catamphetamine/read-excel-file/issues/85\r\n // if (!fileNames.sharedStrings) {\r\n // throw new Error('\"sharedStrings.xml\" file not found in the *.xlsx file')\r\n // }\r\n return fileNames\r\n}\r\n\r\nfunction isDateTemplate(template) {\r\n const tokens = template.split(/\\W+/)\r\n for (const token of tokens) {\r\n if (['MM', 'DD', 'YY', 'YYYY'].indexOf(token) < 0) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction createSheetNotFoundError(sheet, sheets) {\r\n const sheetsList = sheets && sheets.map((sheet, i) => `\"${sheet.name}\" (#${i + 1})`).join(', ')\r\n return new Error(`Sheet ${typeof sheet === 'number' ? '#' + sheet : '\"' + sheet + '\"'} not found in the *.xlsx file.${sheets ? ' Available sheets: ' + sheetsList + '.' : ''}`)\r\n}"]}
@@ -16,12 +16,25 @@ var _convertToJson = require('./convertToJson');
16
16
 
17
17
  var _convertToJson2 = _interopRequireDefault(_convertToJson);
18
18
 
19
+ var _convertMapToSchema = require('./convertMapToSchema');
20
+
21
+ var _convertMapToSchema2 = _interopRequireDefault(_convertMapToSchema);
22
+
19
23
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
24
 
21
- function readXlsxFileContents(entries, xml, options) {
22
- var result = (0, _readXlsx2.default)(entries, xml, _extends({}, options, { properties: options.schema || options.properties }));
23
- if (options.schema) {
24
- return (0, _convertToJson2.default)(result.data, options.schema, _extends({}, options, { properties: result.properties }));
25
+ function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
26
+
27
+ function readXlsxFileContents(entries, xml, _ref) {
28
+ var schema = _ref.schema,
29
+ map = _ref.map,
30
+ options = _objectWithoutProperties(_ref, ['schema', 'map']);
31
+
32
+ if (!schema && map) {
33
+ schema = (0, _convertMapToSchema2.default)(map);
34
+ }
35
+ var result = (0, _readXlsx2.default)(entries, xml, _extends({}, options, { properties: schema || options.properties }));
36
+ if (schema) {
37
+ return (0, _convertToJson2.default)(result.data, schema, _extends({}, options, { properties: result.properties }));
25
38
  }
26
39
  return result;
27
40
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/readXlsxFileContents.js"],"names":["readXlsxFileContents","entries","xml","options","result","properties","schema","data"],"mappings":";;;;;;;;kBAGwBA,oB;;AAHxB;;;;AACA;;;;;;AAEe,SAASA,oBAAT,CAA8BC,OAA9B,EAAuCC,GAAvC,EAA4CC,OAA5C,EAAqD;AACnE,KAAMC,SAAS,wBAASH,OAAT,EAAkBC,GAAlB,eAA4BC,OAA5B,IAAqCE,YAAYF,QAAQG,MAAR,IAAkBH,QAAQE,UAA3E,IAAf;AACA,KAAIF,QAAQG,MAAZ,EAAoB;AACnB,SAAO,6BAAcF,OAAOG,IAArB,EAA2BJ,QAAQG,MAAnC,eAAgDH,OAAhD,IAAyDE,YAAYD,OAAOC,UAA5E,IAAP;AACA;AACD,QAAOD,MAAP;AACA","file":"readXlsxFileContents.js","sourcesContent":["import readXlsx from './readXlsx'\r\nimport convertToJson from './convertToJson'\r\n\r\nexport default function readXlsxFileContents(entries, xml, options) {\r\n\tconst result = readXlsx(entries, xml, { ...options, properties: options.schema || options.properties })\r\n\tif (options.schema) {\r\n\t\treturn convertToJson(result.data, options.schema, { ...options, properties: result.properties })\r\n\t}\r\n\treturn result\r\n}"]}
1
+ {"version":3,"sources":["../source/readXlsxFileContents.js"],"names":["readXlsxFileContents","entries","xml","schema","map","options","result","properties","data"],"mappings":";;;;;;;;kBAIwBA,oB;;AAJxB;;;;AACA;;;;AACA;;;;;;;;AAEe,SAASA,oBAAT,CAA8BC,OAA9B,EAAuCC,GAAvC,QAAwE;AAAA,KAA1BC,MAA0B,QAA1BA,MAA0B;AAAA,KAAlBC,GAAkB,QAAlBA,GAAkB;AAAA,KAAVC,OAAU;;AACtF,KAAI,CAACF,MAAD,IAAWC,GAAf,EAAoB;AACnBD,WAAS,kCAAmBC,GAAnB,CAAT;AACA;AACD,KAAME,SAAS,wBAASL,OAAT,EAAkBC,GAAlB,eAA4BG,OAA5B,IAAqCE,YAAYJ,UAAUE,QAAQE,UAAnE,IAAf;AACA,KAAIJ,MAAJ,EAAY;AACX,SAAO,6BAAcG,OAAOE,IAArB,EAA2BL,MAA3B,eAAwCE,OAAxC,IAAiDE,YAAYD,OAAOC,UAApE,IAAP;AACA;AACD,QAAOD,MAAP;AACA","file":"readXlsxFileContents.js","sourcesContent":["import readXlsx from './readXlsx'\r\nimport convertToJson from './convertToJson'\r\nimport convertMapToSchema from './convertMapToSchema'\r\n\r\nexport default function readXlsxFileContents(entries, xml, { schema, map, ...options}) {\r\n\tif (!schema && map) {\r\n\t\tschema = convertMapToSchema(map)\r\n\t}\r\n\tconst result = readXlsx(entries, xml, { ...options, properties: schema || options.properties })\r\n\tif (schema) {\r\n\t\treturn convertToJson(result.data, schema, { ...options, properties: result.properties })\r\n\t}\r\n\treturn result\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/readXlsxFileNode.test.js"],"names":["describe","it","schema","prop","type","Date","template","Number","required","Boolean","String","parse","value","rowMap","resolve","__dirname","then","rows","errors","should","deep","equal","date","getTime","convertToUTCTimezone","numberOfStudents","course","isFree","cost","title","contact","getTimezoneOffset"],"mappings":";;AAAA;;;;AAEA;;;;;;AAEAA,SAAS,kBAAT,EAA6B,YAAM;AAClCC,IAAG,mDAAH,EAAwD,YAAM;AAC7D,MAAMC,SAAS;AACd,iBAAc;AACbC,UAAM,MADO;AAEbC,UAAMC,IAFO;AAGbC,cAAU;AAHG,IADA;AAMd,yBAAsB;AACrBH,UAAM,kBADe;AAErBC,UAAMG,MAFe;AAGrBC,cAAU;AAHW,IANR;AAWd,aAAU;AACTL,UAAM,QADG;AAETC,UAAM;AACL,gBAAW;AACVD,YAAM,QADI;AAEVC,YAAMK;AACN;AACA;AACA;AALU,MADN;AAQL,aAAQ;AACPN,YAAM,MADC;AAEPC,YAAMG;AAFC,MARH;AAYL,qBAAgB;AACfJ,YAAM,OADS;AAEfC,YAAMM;AAFS;AAZX;AAFG,IAXI;AA+Bd,cAAW;AACVP,UAAM,SADI;AAEVK,cAAU,IAFA;AAGVG,SAHU,iBAGJC,KAHI,EAGG;AACZ,YAAO,cAAP;AACA;AALS;AA/BG,GAAf;;AAwCA,MAAMC,SAAS,EAAf;;AAEA,SAAO,gCAAiB,eAAKC,OAAL,CAAaC,SAAb,EAAwB,kCAAxB,CAAjB,EAA8E,EAAEb,cAAF,EAAUW,cAAV,EAA9E,EAAkGG,IAAlG,CAAuG,gBAAsB;AAAA,OAAnBC,IAAmB,QAAnBA,IAAmB;AAAA,OAAbC,MAAa,QAAbA,MAAa;;AACnIA,UAAOC,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,EAAzB;AACAJ,QAAK,CAAL,EAAQK,IAAR,GAAeL,KAAK,CAAL,EAAQK,IAAR,CAAaC,OAAb,EAAf;AACAN,QAAKE,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBC,UAAME,qBAAqB,IAAInB,IAAJ,CAAS,IAAT,EAAe,CAAf,EAAkB,EAAlB,EAAsB,EAAtB,CAArB,EAAgDkB,OAAhD,EADiB;AAEvBE,sBAAkB,GAFK;AAGvBC,YAAQ;AACPC,aAAQ,KADD;AAEPC,WAAM,MAFC;AAGPC,YAAO;AAHA,KAHe;AAQvBC,aAAS;AARc,IAAD,CAAvB;AAUAjB,UAAOM,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC,CAAD,EAAI,CAAJ,CAAzB;AACA,GAdM,CAAP;AAeA,EA1DD;AA2DA,CA5DD;;AA8DA;AACA,SAASG,oBAAT,CAA8BF,IAA9B,EAAoC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,QAAO,IAAIjB,IAAJ,CAASiB,KAAKC,OAAL,KAAiBD,KAAKS,iBAAL,KAA2B,EAA3B,GAAgC,IAA1D,CAAP;AACA","file":"readXlsxFileNode.test.js","sourcesContent":["import path from 'path'\r\n\r\nimport readXlsxFileNode from './readXlsxFileNode'\r\n\r\ndescribe('readXlsxFileNode', () => {\r\n\tit('should read *.xlsx file on Node.js and parse JSON', () => {\r\n\t\tconst schema = {\r\n\t\t\t'START DATE': {\r\n\t\t\t\tprop: 'date',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\ttemplate: 'MM/DD/YYYY',\r\n\t\t\t},\r\n\t\t\t'NUMBER OF STUDENTS': {\r\n\t\t\t\tprop: 'numberOfStudents',\r\n\t\t\t\ttype: Number,\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\t'COURSE': {\r\n\t\t\t\tprop: 'course',\r\n\t\t\t\ttype: {\r\n\t\t\t\t\t'IS FREE': {\r\n\t\t\t\t\t\tprop: 'isFree',\r\n\t\t\t\t\t\ttype: Boolean\r\n\t\t\t\t\t\t// Excel stored booleans as numbers:\r\n\t\t\t\t\t\t// `1` is `true` and `0` is `false`.\r\n\t\t\t\t\t\t// Such numbers are parsed to booleans.\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'COST': {\r\n\t\t\t\t\t\tprop: 'cost',\r\n\t\t\t\t\t\ttype: Number\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'COURSE TITLE': {\r\n\t\t\t\t\t\tprop: 'title',\r\n\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'CONTACT': {\r\n\t\t\t\tprop: 'contact',\r\n\t\t\t\trequired: true,\r\n\t\t\t\tparse(value) {\r\n\t\t\t\t\treturn '+11234567890'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst rowMap = []\r\n\r\n\t\treturn readXlsxFileNode(path.resolve(__dirname, '../test/spreadsheets/course.xlsx'), { schema, rowMap }).then(({ rows, errors }) => {\r\n\t\t\terrors.should.deep.equal([])\r\n\t\t\trows[0].date = rows[0].date.getTime()\r\n\t\t\trows.should.deep.equal([{\r\n\t\t\t\tdate: convertToUTCTimezone(new Date(2018, 2, 24, 12)).getTime(),\r\n\t\t\t\tnumberOfStudents: 123,\r\n\t\t\t\tcourse: {\r\n\t\t\t\t\tisFree: false,\r\n\t\t\t\t\tcost: 210.45,\r\n\t\t\t\t\ttitle: 'Chemistry'\r\n\t\t\t\t},\r\n\t\t\t\tcontact: '+11234567890',\r\n\t\t\t}])\r\n\t\t\trowMap.should.deep.equal([0, 1])\r\n\t\t})\r\n\t})\r\n})\r\n\r\n// Converts timezone to UTC while preserving the same time\r\nfunction convertToUTCTimezone(date) {\r\n\t// Doesn't account for leap seconds but I guess that's ok\r\n\t// given that javascript's own `Date()` does not either.\r\n\t// https://www.timeanddate.com/time/leap-seconds-background.html\r\n\t//\r\n\t// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset\r\n\t//\r\n\treturn new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000)\r\n}\r\n"]}
1
+ {"version":3,"sources":["../source/readXlsxFileNode.test.js"],"names":["describe","it","schema","prop","type","Date","template","Number","required","Boolean","String","parse","value","rowMap","resolve","__dirname","then","rows","date","getTime","should","deep","equal","convertToUTCTimezone","numberOfStudents","course","isFree","cost","title","contact","map","errors","getTimezoneOffset"],"mappings":"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","file":"readXlsxFileNode.test.js","sourcesContent":["import path from 'path'\r\n\r\nimport readXlsxFileNode from './readXlsxFileNode'\r\n\r\ndescribe('readXlsxFileNode', () => {\r\n\tit('should read *.xlsx file on Node.js and parse it to JSON', () => {\r\n\t\tconst schema = {\r\n\t\t\t'START DATE': {\r\n\t\t\t\tprop: 'date',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\ttemplate: 'MM/DD/YYYY',\r\n\t\t\t},\r\n\t\t\t'NUMBER OF STUDENTS': {\r\n\t\t\t\tprop: 'numberOfStudents',\r\n\t\t\t\ttype: Number,\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\t'COURSE': {\r\n\t\t\t\tprop: 'course',\r\n\t\t\t\ttype: {\r\n\t\t\t\t\t'IS FREE': {\r\n\t\t\t\t\t\tprop: 'isFree',\r\n\t\t\t\t\t\ttype: Boolean\r\n\t\t\t\t\t\t// Excel stored booleans as numbers:\r\n\t\t\t\t\t\t// `1` is `true` and `0` is `false`.\r\n\t\t\t\t\t\t// Such numbers are parsed to booleans.\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'COST': {\r\n\t\t\t\t\t\tprop: 'cost',\r\n\t\t\t\t\t\ttype: Number\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'COURSE TITLE': {\r\n\t\t\t\t\t\tprop: 'title',\r\n\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'CONTACT': {\r\n\t\t\t\tprop: 'contact',\r\n\t\t\t\trequired: true,\r\n\t\t\t\tparse(value) {\r\n\t\t\t\t\treturn '+11234567890'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst rowMap = []\r\n\r\n\t\treturn readXlsxFileNode(path.resolve(__dirname, '../test/spreadsheets/course.xlsx'), { schema, rowMap }).then(({ rows }) => {\r\n\t\t\trows[0].date = rows[0].date.getTime()\r\n\t\t\trows.should.deep.equal([{\r\n\t\t\t\tdate: convertToUTCTimezone(new Date(2018, 2, 24, 12)).getTime(),\r\n\t\t\t\tnumberOfStudents: 123,\r\n\t\t\t\tcourse: {\r\n\t\t\t\t\tisFree: false,\r\n\t\t\t\t\tcost: 210.45,\r\n\t\t\t\t\ttitle: 'Chemistry'\r\n\t\t\t\t},\r\n\t\t\t\tcontact: '+11234567890'\r\n\t\t\t}])\r\n\t\t\trowMap.should.deep.equal([0, 1])\r\n\t\t})\r\n\t})\r\n\r\n\tit('should read *.xlsx file on Node.js and map it to JSON', () => {\r\n\t\tconst map = {\r\n\t\t\t'START DATE': 'date',\r\n\t\t\t'NUMBER OF STUDENTS': 'numberOfStudents',\r\n\t\t\t'COURSE': {\r\n\t\t\t\t'course': {\r\n\t\t\t\t\t'IS FREE': 'isFree',\r\n\t\t\t\t\t'COST': 'cost',\r\n\t\t\t\t\t'COURSE TITLE': 'title'\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'CONTACT': 'contact'\r\n\t\t}\r\n\r\n\t\tconst rowMap = []\r\n\r\n\t\treturn readXlsxFileNode(path.resolve(__dirname, '../test/spreadsheets/course.xlsx'), { map, rowMap }).then(({ rows, errors }) => {\r\n\t\t\terrors.should.deep.equal([])\r\n\t\t\trows[0].date = rows[0].date.getTime()\r\n\t\t\trows.should.deep.equal([{\r\n\t\t\t\tdate: convertToUTCTimezone(new Date(2018, 2, 24, 12)).getTime(),\r\n\t\t\t\tnumberOfStudents: 123,\r\n\t\t\t\tcourse: {\r\n\t\t\t\t\tisFree: false,\r\n\t\t\t\t\tcost: 210.45,\r\n\t\t\t\t\ttitle: 'Chemistry'\r\n\t\t\t\t},\r\n\t\t\t\tcontact: '(123) 456-7890'\r\n\t\t\t}])\r\n\t\t\trowMap.should.deep.equal([0, 1])\r\n\t\t})\r\n\t})\r\n})\r\n\r\n// Converts timezone to UTC while preserving the same time\r\nfunction convertToUTCTimezone(date) {\r\n\t// Doesn't account for leap seconds but I guess that's ok\r\n\t// given that javascript's own `Date()` does not either.\r\n\t// https://www.timeanddate.com/time/leap-seconds-background.html\r\n\t//\r\n\t// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset\r\n\t//\r\n\treturn new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000)\r\n}\r\n"]}
@@ -0,0 +1,20 @@
1
+ // See the discussion:
2
+ // https://github.com/catamphetamine/read-excel-file/issues/71
3
+
4
+ import {
5
+ ParseWithSchemaOptions,
6
+ ParseWithMapOptions,
7
+ ParseWithoutSchemaOptions,
8
+ ParsedObjectsResult,
9
+ Row
10
+ } from './types.d.ts';
11
+
12
+ export function parseExcelDate(excelSerialDate: number) : typeof Date;
13
+
14
+ export type Input = File
15
+
16
+ function readXlsxFile(input: Input, options: ParseWithSchemaOptions) : Promise<ParsedObjectsResult>;
17
+ function readXlsxFile(input: Input, options: ParseWithMapOptions) : Promise<ParsedObjectsResult>;
18
+ function readXlsxFile(input: Input, options?: ParseWithoutSchemaOptions) : Promise<Row[]>;
19
+
20
+ export default readXlsxFile;
@@ -0,0 +1,34 @@
1
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
2
+
3
+ export default function convertMapToSchema(map) {
4
+ var schema = {};
5
+ for (var _iterator = Object.keys(map), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
6
+ var _ref;
7
+
8
+ if (_isArray) {
9
+ if (_i >= _iterator.length) break;
10
+ _ref = _iterator[_i++];
11
+ } else {
12
+ _i = _iterator.next();
13
+ if (_i.done) break;
14
+ _ref = _i.value;
15
+ }
16
+
17
+ var key = _ref;
18
+
19
+ var prop = map[key];
20
+ var type = void 0;
21
+ if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'object') {
22
+ prop = Object.keys(map[key])[0];
23
+ type = convertMapToSchema(map[key][prop]);
24
+ }
25
+ schema[key] = {
26
+ prop: prop
27
+ };
28
+ if (type) {
29
+ schema[key].type = type;
30
+ }
31
+ }
32
+ return schema;
33
+ }
34
+ //# sourceMappingURL=convertMapToSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../source/convertMapToSchema.js"],"names":["convertMapToSchema","map","schema","Object","keys","key","prop","type"],"mappings":";;AAAA,eAAe,SAASA,kBAAT,CAA4BC,GAA5B,EAAiC;AAC/C,KAAMC,SAAS,EAAf;AACA,sBAAkBC,OAAOC,IAAP,CAAYH,GAAZ,CAAlB,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAzBI,GAAyB;;AACnC,MAAIC,OAAOL,IAAII,GAAJ,CAAX;AACA,MAAIE,aAAJ;AACA,MAAI,QAAOD,IAAP,yCAAOA,IAAP,OAAgB,QAApB,EAA8B;AAC7BA,UAAOH,OAAOC,IAAP,CAAYH,IAAII,GAAJ,CAAZ,EAAsB,CAAtB,CAAP;AACAE,UAAOP,mBAAmBC,IAAII,GAAJ,EAASC,IAAT,CAAnB,CAAP;AACA;AACDJ,SAAOG,GAAP,IAAc;AACbC;AADa,GAAd;AAGA,MAAIC,IAAJ,EAAU;AACTL,UAAOG,GAAP,EAAYE,IAAZ,GAAmBA,IAAnB;AACA;AACD;AACD,QAAOL,MAAP;AACA","file":"convertMapToSchema.js","sourcesContent":["export default function convertMapToSchema(map) {\r\n\tconst schema = {}\r\n\tfor (const key of Object.keys(map)) {\r\n\t\tlet prop = map[key]\r\n\t\tlet type\r\n\t\tif (typeof prop === 'object') {\r\n\t\t\tprop = Object.keys(map[key])[0]\r\n\t\t\ttype = convertMapToSchema(map[key][prop])\r\n\t\t}\r\n\t\tschema[key] = {\r\n\t\t\tprop\r\n\t\t}\r\n\t\tif (type) {\r\n\t\t\tschema[key].type = type\r\n\t\t}\r\n\t}\r\n\treturn schema\r\n}"]}