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 @@
1
+ {"version":3,"sources":["../source/convertMapToSchema.test.js"],"names":["convertMapToSchema","describe","it","map","should","deep","equal","prop","type"],"mappings":"AAAA,OAAOA,kBAAP,MAA+B,sBAA/B;;AAEAC,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;AAYAH,qBAAmBG,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})"]}
@@ -174,17 +174,24 @@ export function parseValue(value, schemaEntry, options) {
174
174
  } else if (schemaEntry.type) {
175
175
  result = parseValueOfType(value, Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type, options);
176
176
  } else {
177
- throw new Error('Invalid schema entry: no .type and no .parse():\n\n' + JSON.stringify(schemaEntry, null, 2));
177
+ result = { value: value
178
+ // throw new Error('Invalid schema entry: no .type and no .parse():\n\n' + JSON.stringify(schemaEntry, null, 2))
179
+ };
178
180
  }
179
181
  // If errored then return the error.
180
182
  if (result.error) {
181
183
  return result;
182
184
  }
183
- if (result.value !== null && schemaEntry.validate) {
184
- try {
185
- schemaEntry.validate(result.value);
186
- } catch (error) {
187
- return { error: error.message };
185
+ if (result.value !== null) {
186
+ if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {
187
+ return { error: 'invalid' };
188
+ }
189
+ if (schemaEntry.validate) {
190
+ try {
191
+ schemaEntry.validate(result.value);
192
+ } catch (error) {
193
+ return { error: error.message };
194
+ }
188
195
  }
189
196
  }
190
197
  return result;
@@ -198,11 +205,11 @@ export function parseValue(value, schemaEntry, options) {
198
205
  */
199
206
  function parseCustomValue(value, parse) {
200
207
  try {
201
- var parsed = parse(value);
202
- if (parsed === undefined) {
208
+ value = parse(value);
209
+ if (value === undefined) {
203
210
  return { value: null };
204
211
  }
205
- return { value: parsed };
212
+ return { value: value };
206
213
  } catch (error) {
207
214
  return { error: error.message };
208
215
  }
@@ -280,6 +287,9 @@ function parseValueOfType(value, type, options) {
280
287
  return { error: 'invalid' };
281
288
 
282
289
  default:
290
+ if (typeof type === 'function') {
291
+ return parseCustomValue(value, type);
292
+ }
283
293
  throw new Error('Unknown schema type: ' + (type && type.name || type));
284
294
  }
285
295
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/convertToJson.js"],"names":["parseDate","Integer","isInteger","URL","isURL","Email","isEmail","DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","notEmpty","array","parseArray","map","_value","parseValue","required","column","prop","Object","keys","parse","parseCustomValue","parseValueOfType","Error","JSON","stringify","validate","message","parsed","String","Number","isFinite","parseFloat","Date","parseInt","date","properties","Boolean","name","getBlock","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":["parseDate","Integer","isInteger","URL","isURL","Email","isEmail","DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","notEmpty","array","parseArray","map","_value","parseValue","required","column","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","Number","isFinite","parseFloat","Date","parseInt","date","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"mappings":";;;;;;AAAA,OAAOA,SAAP,MAAsB,aAAtB;AACA,OAAOC,OAAP,IAAkBC,SAAlB,QAAmC,iBAAnC;AACA,OAAOC,GAAP,IAAcC,KAAd,QAA2B,aAA3B;AACA,OAAOC,KAAP,IAAgBC,OAAhB,QAA+B,eAA/B;;AAEA,IAAMC,kBAAkB;AACtBC,oBAAkB;;AAGpB;;;;;;;;AAJwB,CAAxB,CAYA,eAAe,UAASC,IAAT,EAAeC,MAAf,EAAuBC,OAAvB,EAAgC;AAC7C,MAAIA,OAAJ,EAAa;AACXA,2BACKJ,eADL,EAEKI,OAFL;AAID,GALD,MAKO;AACLA,cAAUJ,eAAV;AACD;;AAR4C,iBAazCI,OAbyC;AAAA,MAW3CH,gBAX2C,YAW3CA,gBAX2C;AAAA,MAY3CI,MAZ2C,YAY3CA,MAZ2C;;;AAe7CC,iBAAeH,MAAf;;AAEA,MAAIF,gBAAJ,EAAsB;AACpBC,WAAOK,UAAUL,IAAV,CAAP;AACD;;AAED,MAAMM,UAAUN,KAAK,CAAL,CAAhB;;AAEA,MAAMO,UAAU,EAAhB;AACA,MAAMC,SAAS,EAAf;;AAEA,OAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIT,KAAKU,MAAzB,EAAiCD,GAAjC,EAAsC;AACpC,QAAME,SAASC,KAAKX,MAAL,EAAaD,KAAKS,CAAL,CAAb,EAAsBA,IAAI,CAA1B,EAA6BH,OAA7B,EAAsCE,MAAtC,EAA8CN,OAA9C,CAAf;AACA,QAAIS,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;;AAED,SAASI,IAAT,CAAcX,MAAd,EAAsBc,GAAtB,EAA2BE,QAA3B,EAAqCX,OAArC,EAA8CE,MAA9C,EAAsDN,OAAtD,EAA+D;AAC7D,MAAMgB,SAAS,EAAf;;AAD6D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAElDC,GAFkD;;AAG3D,QAAMC,cAAcnB,OAAOkB,GAAP,CAApB;AACA,QAAME,iBAAiB,QAAOD,YAAYE,IAAnB,MAA4B,QAA5B,IAAwC,CAACC,MAAMC,OAAN,CAAcJ,YAAYE,IAA1B,CAAhE;AACA,QAAIG,WAAWV,IAAIT,QAAQoB,OAAR,CAAgBP,GAAhB,CAAJ,CAAf;AACA,QAAIM,aAAaE,SAAjB,EAA4B;AAC1BF,iBAAW,IAAX;AACD;AACD,QAAIG,cAAJ;AACA,QAAId,cAAJ;AACA,QAAIO,cAAJ,EAAoB;AAClBO,cAAQhB,KAAKQ,YAAYE,IAAjB,EAAuBP,GAAvB,EAA4BE,QAA5B,EAAsCX,OAAtC,EAA+CE,MAA/C,EAAuDN,OAAvD,CAAR;AACD,KAFD,MAEO;AACL,UAAIuB,aAAa,IAAjB,EAAuB;AACrBG,gBAAQ,IAAR;AACD,OAFD,MAGK,IAAIL,MAAMC,OAAN,CAAcJ,YAAYE,IAA1B,CAAJ,EAAqC;AACxC,YAAIO,WAAW,KAAf;AACA,YAAMC,QAAQC,WAAWN,QAAX,EAAqBO,GAArB,CAAyB,UAACC,MAAD,EAAY;AACjD,cAAMtB,SAASuB,WAAWD,MAAX,EAAmBb,WAAnB,EAAgClB,OAAhC,CAAf;AACA,cAAIS,OAAOG,KAAX,EAAkB;AAChBc,oBAAQK,MAAR;AACAnB,oBAAQH,OAAOG,KAAf;AACD;AACD,cAAIH,OAAOiB,KAAP,KAAiB,IAArB,EAA2B;AACzBC,uBAAW,IAAX;AACD;AACD,iBAAOlB,OAAOiB,KAAd;AACD,SAVa,CAAd;AAWA,YAAI,CAACd,KAAL,EAAY;AACVc,kBAAQC,WAAWC,KAAX,GAAmB,IAA3B;AACD;AACF,OAhBI,MAgBE;AACL,YAAMnB,SAASuB,WAAWT,QAAX,EAAqBL,WAArB,EAAkClB,OAAlC,CAAf;AACAY,gBAAQH,OAAOG,KAAf;AACAc,gBAAQd,QAAQW,QAAR,GAAmBd,OAAOiB,KAAlC;AACD;AACF;AACD,QAAI,CAACd,KAAD,IAAUc,UAAU,IAApB,IAA4BR,YAAYe,QAA5C,EAAsD;AACpDrB,cAAQ,UAAR;AACD;AACD,QAAIA,KAAJ,EAAW;AACTA,cAAQ;AACNA,oBADM;AAENC,aAAKE,WAAW,CAFV;AAGNmB,gBAAQjB,GAHF;AAINS;AAJM,OAAR;AAMA,UAAIR,YAAYE,IAAhB,EAAsB;AACpBR,cAAMQ,IAAN,GAAaF,YAAYE,IAAzB;AACD;AACDd,aAAOK,IAAP,CAAYC,KAAZ;AACD,KAXD,MAWO,IAAIc,UAAU,IAAd,EAAoB;AACzBV,aAAOE,YAAYiB,IAAnB,IAA2BT,KAA3B;AACD;AAvD0D;;AAE7D,wBAAkBU,OAAOC,IAAP,CAAYtC,MAAZ,CAAlB,yHAAuC;AAAA;;AAAA;;AAAA;AAsDtC;AACD,MAAIqC,OAAOC,IAAP,CAAYrB,MAAZ,EAAoBR,MAApB,GAA6B,CAAjC,EAAoC;AAClC,WAAOQ,MAAP;AACD;AACD,SAAO,IAAP;AACD;;AAED;;;;;;AAMA,OAAO,SAASgB,UAAT,CAAoBN,KAApB,EAA2BR,WAA3B,EAAwClB,OAAxC,EAAiD;AACtD,MAAI0B,UAAU,IAAd,EAAoB;AAClB,WAAO,EAAEA,OAAO,IAAT,EAAP;AACD;AACD,MAAIjB,eAAJ;AACA,MAAIS,YAAYoB,KAAhB,EAAuB;AACrB7B,aAAS8B,iBAAiBb,KAAjB,EAAwBR,YAAYoB,KAApC,CAAT;AACD,GAFD,MAEO,IAAIpB,YAAYE,IAAhB,EAAsB;AAC3BX,aAAS+B,iBAAiBd,KAAjB,EAAwBL,MAAMC,OAAN,CAAcJ,YAAYE,IAA1B,IAAkCF,YAAYE,IAAZ,CAAiB,CAAjB,CAAlC,GAAwDF,YAAYE,IAA5F,EAAkGpB,OAAlG,CAAT;AACD,GAFM,MAEA;AACLS,aAAS,EAAEiB,OAAOA;AAClB;AADS,KAAT;AAED;AACD;AACA,MAAIjB,OAAOG,KAAX,EAAkB;AAChB,WAAOH,MAAP;AACD;AACD,MAAIA,OAAOiB,KAAP,KAAiB,IAArB,EAA2B;AACzB,QAAIR,YAAYuB,KAAZ,IAAqBvB,YAAYuB,KAAZ,CAAkBjB,OAAlB,CAA0Bf,OAAOiB,KAAjC,IAA0C,CAAnE,EAAsE;AACpE,aAAO,EAAEd,OAAO,SAAT,EAAP;AACD;AACD,QAAIM,YAAYwB,QAAhB,EAA0B;AACxB,UAAI;AACFxB,oBAAYwB,QAAZ,CAAqBjC,OAAOiB,KAA5B;AACD,OAFD,CAEE,OAAOd,KAAP,EAAc;AACd,eAAO,EAAEA,OAAOA,MAAM+B,OAAf,EAAP;AACD;AACF;AACF;AACD,SAAOlC,MAAP;AACD;;AAED;;;;;;AAMA,SAAS8B,gBAAT,CAA0Bb,KAA1B,EAAiCY,KAAjC,EAAwC;AACtC,MAAI;AACFZ,YAAQY,MAAMZ,KAAN,CAAR;AACA,QAAIA,UAAUD,SAAd,EAAyB;AACvB,aAAO,EAAEC,OAAO,IAAT,EAAP;AACD;AACD,WAAO,EAAEA,YAAF,EAAP;AACD,GAND,CAME,OAAOd,KAAP,EAAc;AACd,WAAO,EAAEA,OAAOA,MAAM+B,OAAf,EAAP;AACD;AACF;;AAED;;;;;;AAMA,SAASH,gBAAT,CAA0Bd,KAA1B,EAAiCN,IAAjC,EAAuCpB,OAAvC,EAAgD;AAC9C,UAAQoB,IAAR;AACE,SAAKwB,MAAL;AACE,aAAO,EAAElB,YAAF,EAAP;;AAEF,SAAKmB,MAAL;AACA,SAAK,SAAL;AACA,SAAKvD,OAAL;AACE;AACA;AACA;AACA,UAAI,CAACwD,SAASpB,KAAT,CAAL,EAAsB;AACpB,eAAO,EAAEd,OAAO,SAAT,EAAP;AACD;AACD,UAAIQ,SAAS9B,OAAT,IAAoB,CAACC,UAAUmC,KAAV,CAAzB,EAA2C;AACzC,eAAO,EAAEd,OAAO,SAAT,EAAP;AACD;AACD;AACA;AACA;AACA,UAAI,OAAOc,KAAP,KAAiB,QAArB,EAA+B;AAC7BA,gBAAQqB,WAAWrB,KAAX,CAAR;AACD;AACD,aAAO,EAAEA,YAAF,EAAP;;AAEF,SAAK,KAAL;AACA,SAAKlC,GAAL;AACE,UAAI,CAACC,MAAMiC,KAAN,CAAL,EAAmB;AACjB,eAAO,EAAEd,OAAO,SAAT,EAAP;AACD;AACD,aAAO,EAAEc,YAAF,EAAP;;AAEF,SAAK,OAAL;AACA,SAAKhC,KAAL;AACE,UAAI,CAACC,QAAQ+B,KAAR,CAAL,EAAqB;AACnB,eAAO,EAAEd,OAAO,SAAT,EAAP;AACD;AACD,aAAO,EAAEc,YAAF,EAAP;;AAEF,SAAKsB,IAAL;AACE;AACA;AACA;AACA,UAAItB,iBAAiBsB,IAArB,EAA2B;AACzB,eAAO,EAAEtB,YAAF,EAAP;AACD;AACD,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC7B,YAAI,CAACoB,SAASpB,KAAT,CAAL,EAAsB;AACpB,iBAAO,EAAEd,OAAO,SAAT,EAAP;AACD;AACDc,gBAAQuB,SAASvB,KAAT,CAAR;AACA,YAAMwB,OAAO7D,UAAUqC,KAAV,EAAiB1B,QAAQmD,UAAzB,CAAb;AACA,YAAI,CAACD,IAAL,EAAW;AACT,iBAAO,EAAEtC,OAAO,SAAT,EAAP;AACD;AACD,eAAO,EAAEc,OAAOwB,IAAT,EAAP;AACD;AACD,aAAO,EAAEtC,OAAO,SAAT,EAAP;;AAEF,SAAKwC,OAAL;AACE,UAAI,OAAO1B,KAAP,KAAiB,SAArB,EAAgC;AAC9B,eAAO,EAAEA,YAAF,EAAP;AACD;AACD,aAAO,EAAEd,OAAO,SAAT,EAAP;;AAEF;AACE,UAAI,OAAOQ,IAAP,KAAgB,UAApB,EAAgC;AAC9B,eAAOmB,iBAAiBb,KAAjB,EAAwBN,IAAxB,CAAP;AACD;AACD,YAAM,IAAIiC,KAAJ,4BAAkCjC,QAAQA,KAAKkC,IAAb,IAAqBlC,IAAvD,EAAN;AApEJ;AAsED;;AAED,OAAO,SAASmC,QAAT,CAAkBC,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,QAAQN,SAASC,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;;AAED,OAAO,SAASsB,UAAT,CAAoB2B,MAApB,EAA4B;AACjC,MAAMM,SAAS,EAAf;AACA,MAAIC,QAAQ,CAAZ;AACA,SAAOA,QAAQP,OAAOhD,MAAtB,EAA8B;AAAA,oBACA+C,SAASC,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,SAASyB,MAAM,CAAN,EAASE,GAAT,CAAa,UAACmC,CAAD,EAAI1D,CAAJ;AAAA,WAAUqB,MAAME,GAAN,CAAU;AAAA,aAAOjB,IAAIN,CAAJ,CAAP;AAAA,KAAV,CAAV;AAAA,GAAb,CAAT;AAAA,CAAlB;;AAEA,SAASL,cAAT,CAAwBH,MAAxB,EAAgC;AAC9B,wBAAkBqC,OAAOC,IAAP,CAAYtC,MAAZ,CAAlB,yHAAuC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA5BkB,IAA4B;;AACrC,QAAMiD,QAAQnE,OAAOkB,IAAP,CAAd;AACA,QAAI,CAACiD,MAAM/B,IAAX,EAAiB;AACf,YAAM,IAAIkB,KAAJ,2CAAkDpC,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":["convertToJson","parseArray","getBlock","Integer","URL","Email","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","EMAIL","NAME","validate","Error","TRUE","FALSE","INVALID","true","false","rowMap","getTime"],"mappings":"AAAA,OAAOA,aAAP,IAAwBC,UAAxB,EAAoCC,QAApC,QAAoD,iBAApD;AACA,OAAOC,OAAP,MAAoB,iBAApB;AACA,OAAOC,GAAP,MAAgB,aAAhB;AACA,OAAOC,KAAP,MAAkB,eAAlB;;AAEA,IAAMC,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/BR,WAAS,cAAT,EAAyB,GAAzB,EAA8B,CAA9B,EAAiCS,MAAjC,CAAwCC,IAAxC,CAA6CC,KAA7C,CAAmD,CAAC,UAAD,EAAa,EAAb,CAAnD;AACAZ,aAAW,mBAAX,EAAgCU,MAAhC,CAAuCC,IAAvC,CAA4CC,KAA5C,CAAkD,CAAC,UAAD,EAAa,GAAb,CAAlD;AACA,EAHD;;AAKAH,IAAG,wBAAH,EAA6B,YAAM;AAAA,uBACTV,cAAc,CACtC,CACC,MADD,EAEC,QAFD,EAGC,SAHD,EAIC,QAJD,EAKC,OALD,CADsC,EAOnC,CACF,IAAIQ,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,wBACRV,cAAc,CACtC,CACC,QADD,CADsC,EAGnC,CACF,IADE,CAHmC,CAAd,EAMtB;AACFmB,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,wBACNV,cAAc,CACtC,CACC,OADD,CADsC,EAGnC,CACF,oDADE,CAHmC,EAKnC,CACF,IADE,CALmC,CAAd,EAQtB;AACFsC,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,wBAC0BV,cAAc,CACtC,CACC,SADD,CADsC,EAGnC,CACF,GADE,CAHmC,EAKnC,CACF,KADE,CALmC,CAAd,EAQtB;AACFwC,YAAS;AACRvB,UAAM,OADE;AAERC,UAAMf;AAFE;AADP,GARsB,CAD1B;AAAA,MACSwB,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,wBAC0BV,cAAc,CACtC,CACC,KADD,CADsC,EAGnC,CACF,oBADE,CAHmC,EAKnC,CACF,YADE,CALmC,CAAd,EAQtB;AACFI,QAAK;AACJa,UAAM,OADF;AAEJC,UAAMd;AAFF;AADH,GARsB,CAD1B;AAAA,MACSuB,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,wBAC0BV,cAAc,CACtC,CACC,OADD,CADsC,EAGnC,CACF,2BADE,CAHmC,EAKnC,CACF,KADE,CALmC,CAAd,EAQtB;AACF0C,UAAO;AACNzB,UAAM,OADA;AAENC,UAAMb;AAFA;AADL,GARsB,CAD1B;AAAA,MACSsB,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,wBACVV,cAAc,CACtC,CACC,MADD,CADsC,EAGnC,CACF,aADE,CAHmC,CAAd,EAMtB;AACF2C,SAAM;AACL1B,UAAM,MADD;AAELC,UAAMM,MAFD;AAGLU,cAAU,IAHL;AAILU,cAAU,kBAAClB,KAAD,EAAW;AACpB,SAAIA,UAAU,aAAd,EAA6B;AAC5B,YAAM,IAAImB,KAAJ,CAAU,cAAV,CAAN;AACA;AACD;AARI;AADJ,GANsB,CADU;AAAA,MAC3BlB,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,wBACVV,cAAc,CACtC,CACC,QADD,CADsC,EAGnC,CACF,QADE,CAHmC,CAAd,EAMtB;AACFmB,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,wBACXV,cAAc,CACtC,CACC,MADD,EAEC,OAFD,EAGC,SAHD,CADsC,EAKnC,CACF,IADE,EAEF,KAFE,EAGF,MAHE,CALmC,CAAd,EAUtB;AACF8C,SAAM;AACL7B,UAAM,MADD;AAELC,UAAMI,OAFD;AAGLY,cAAU;AAHL,IADJ;AAMFa,UAAO;AACN9B,UAAM,OADA;AAENC,UAAMI,OAFA;AAGNY,cAAU;AAHJ,IANL;AAWFc,YAAS;AACR/B,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;AACvBoC,SAAM,IADiB;AAEvBC,UAAO;AAFgB,GAAD,CAAvB;AAIA,EAzCD;;AA2CAxC,IAAG,uBAAH,EAA4B,YAAM;AAAA,yBACRV,cAAc,CACtC,CACC,MADD,EAEC,SAFD,CADsC,EAInC,CACF,KADE,EACK;AACP,KAFE,CAJmC,EAOnC,CACFM,IADE,EACI;AACN,KAFE,CAPmC,CAAd,EAWtB;AACFU,SAAM;AACLC,UAAM,MADD;AAELC,UAAMV,IAFD;AAGL;AACA0B,cAAU;AAJL,IADJ;AAOFc,YAAS;AACR/B,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,yBACdV,cAAc,CACtC,CACC,OADD,CADsC,EAGnC,CACF,KADE,CAHmC,CAAd,EAMtB;AACFyB,UAAO;AACNR,UAAM,OADA;AAENH,WAAO,iBAAM;AACZ,WAAM,IAAI+B,KAAJ,CAAU,SAAV,CAAN;AACA;AAJK;AADL,GANsB,CADc;AAAA,MAC/BlB,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,yBACTV,cAAc,CACtC,CACC,QADD,CADsC,EAGnC,CACF,QADE,CAHmC,CAAd,EAMtB;AACFmB,WAAQ;AACPF,UAAM,QADC;AAEPC,UAAME;AAFC;AADN,GANsB,EAWtB;AACF+B,WAAQ,CAAC,CAAD,EAAI,CAAJ;AADN,GAXsB,CADS;AAAA,MAC1BxB,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,KAAK8C,OAAL,KAAiB9C,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":["convertToJson","parseArray","getBlock","Integer","URL","Email","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","EMAIL","NAME","validate","Error","TRUE","FALSE","INVALID","true","false","rowMap","STATUS","oneOf","getTime"],"mappings":"AAAA,OAAOA,aAAP,IAAwBC,UAAxB,EAAoCC,QAApC,QAAoD,iBAApD;AACA,OAAOC,OAAP,MAAoB,iBAApB;AACA,OAAOC,GAAP,MAAgB,aAAhB;AACA,OAAOC,KAAP,MAAkB,eAAlB;;AAEA,IAAMC,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/BR,WAAS,cAAT,EAAyB,GAAzB,EAA8B,CAA9B,EAAiCS,MAAjC,CAAwCC,IAAxC,CAA6CC,KAA7C,CAAmD,CAAC,UAAD,EAAa,EAAb,CAAnD;AACAZ,aAAW,mBAAX,EAAgCU,MAAhC,CAAuCC,IAAvC,CAA4CC,KAA5C,CAAkD,CAAC,UAAD,EAAa,GAAb,CAAlD;AACA,EAHD;;AAKAH,IAAG,wBAAH,EAA6B,YAAM;AAAA,uBACTV,cAAc,CACtC,CACC,MADD,EAEC,QAFD,EAGC,SAHD,EAIC,QAJD,EAKC,OALD,EAMC,YAND,CADsC,EAQnC,CACF,IAAIQ,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,EAMF,gBANE,CARmC,CAAd,EAgBtB;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,IAlBL;AAwBFC,eAAY;AACXV,UAAM,WADK;AAEXC,QAFW,gBAENQ,KAFM,EAEC;AACX,YAAO,cAAP;AACA;AAJU;AAxBV,GAhBsB,CADS;AAAA,MAC1BE,IAD0B,kBAC1BA,IAD0B;AAAA,MACpBC,MADoB,kBACpBA,MADoB;;AAiDlCA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,EAAzB;;AAEA;AACAe,OAAK,CAAL,EAAQtB,IAAR,GAAesB,KAAK,CAAL,EAAQtB,IAAR,CAAawB,WAAb,EAAf;;AAEAF,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBP,SAAMA,KAAKwB,WAAL,EADiB;AAEvBC,WAAQ,GAFe;AAGvBC,UAAO,cAHgB;AAIvBC,cAAW,cAJY;AAKvBC,YAAS,IALc;AAMvBC,WAAQ;AANe,GAAD,CAAvB;AAQA,EA9DD;;AAgEAzB,IAAG,+CAAH,EAAoD,YAAM;AAAA,wBAChCV,cAAc,CACtC,CACC,MADD,EAEC,QAFD,EAGC,SAHD,EAIC,QAJD,CADsC,EAMnC,CACF,IAAIQ,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,KAFE,EAGF,IAHE,EAIF,KAJE,CANmC,CAAd,EAYtB;AACFC,SAAM;AACLC,UAAM;AADD,IADJ;AAIFE,WAAQ;AACPF,UAAM;AADC,IAJN;AAOFI,YAAS;AACRJ,UAAM;AADE,IAPP;AAUFM,WAAQ;AACPN,UAAM;AADC;AAVN,GAZsB,CADgC;AAAA,MACjDW,IADiD,mBACjDA,IADiD;AAAA,MAC3CC,MAD2C,mBAC3CA,MAD2C;;AA4BzDA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,EAAzB;;AAEA;AACAe,OAAK,CAAL,EAAQtB,IAAR,GAAesB,KAAK,CAAL,EAAQtB,IAAR,CAAawB,WAAb,EAAf;;AAEAF,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBP,SAAMA,KAAKwB,WAAL,EADiB;AAEvBC,WAAQ,GAFe;AAGvBG,YAAS,IAHc;AAIvBC,WAAQ;AAJe,GAAD,CAAvB;AAMA,EAvCD;;AAyCAzB,IAAG,uBAAH,EAA4B,YAAM;AAAA,wBACRV,cAAc,CACtC,CACC,QADD,CADsC,EAGnC,CACF,IADE,CAHmC,CAAd,EAMtB;AACFmB,WAAQ;AACPF,UAAM,QADC;AAEPC,UAAME,MAFC;AAGPgB,cAAU;AAHH;AADN,GANsB,CADQ;AAAA,MACzBR,IADyB,mBACzBA,IADyB;AAAA,MACnBC,MADmB,mBACnBA,MADmB;;AAejCA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBwB,UAAO,UADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,QAHiB;AAIzBrB,SAAME,MAJmB;AAKzBM,UAAO;AALkB,GAAD,CAAzB;;AAQAE,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,EAAvB;AACA,EAxBD;;AA0BAH,IAAG,qBAAH,EAA0B,YAAM;AAAA,wBACNV,cAAc,CACtC,CACC,OADD,CADsC,EAGnC,CACF,oDADE,CAHmC,EAKnC,CACF,IADE,CALmC,CAAd,EAQtB;AACFwC,UAAO;AACNvB,UAAM,OADA;AAENC,UAAM,CAACM,MAAD;AAFA;AADL,GARsB,CADM;AAAA,MACvBI,IADuB,mBACvBA,IADuB;AAAA,MACjBC,MADiB,mBACjBA,MADiB;;AAgB/BA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,EAAzB;;AAEAe,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvB4B,UAAO,CAAC,cAAD,EAAiB,sBAAjB,EAAyC,cAAzC;AADgB,GAAD,CAAvB;AAGA,EArBD;;AAuBA/B,IAAG,uBAAH,EAA4B,YAC5B;AAAA,wBAC0BV,cAAc,CACtC,CACC,SADD,CADsC,EAGnC,CACF,GADE,CAHmC,EAKnC,CACF,KADE,CALmC,CAAd,EAQtB;AACF0C,YAAS;AACRzB,UAAM,OADE;AAERC,UAAMf;AAFE;AADP,GARsB,CAD1B;AAAA,MACSyB,IADT,mBACSA,IADT;AAAA,MACeC,MADf,mBACeA,MADf;;AAgBCA,SAAOc,MAAP,CAAchC,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAgB,SAAO,CAAP,EAAUS,GAAV,CAAc3B,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAgB,SAAO,CAAP,EAAUU,MAAV,CAAiB5B,MAAjB,CAAwBE,KAAxB,CAA8B,SAA9B;AACAgB,SAAO,CAAP,EAAUQ,KAAV,CAAgB1B,MAAhB,CAAuBE,KAAvB,CAA6B,SAA7B;;AAEAe,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBa,UAAO;AADgB,GAAD,CAAvB;AAGA,EAzBD;;AA2BAhB,IAAG,mBAAH,EAAwB,YACxB;AAAA,wBAC0BV,cAAc,CACtC,CACC,KADD,CADsC,EAGnC,CACF,oBADE,CAHmC,EAKnC,CACF,YADE,CALmC,CAAd,EAQtB;AACFI,QAAK;AACJa,UAAM,OADF;AAEJC,UAAMd;AAFF;AADH,GARsB,CAD1B;AAAA,MACSwB,IADT,mBACSA,IADT;AAAA,MACeC,MADf,mBACeA,MADf;;AAgBCA,SAAOc,MAAP,CAAchC,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAgB,SAAO,CAAP,EAAUS,GAAV,CAAc3B,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAgB,SAAO,CAAP,EAAUU,MAAV,CAAiB5B,MAAjB,CAAwBE,KAAxB,CAA8B,KAA9B;AACAgB,SAAO,CAAP,EAAUQ,KAAV,CAAgB1B,MAAhB,CAAuBE,KAAvB,CAA6B,SAA7B;;AAEAe,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBa,UAAO;AADgB,GAAD,CAAvB;AAGA,EAzBD;;AA2BAhB,IAAG,qBAAH,EAA0B,YAC1B;AAAA,wBAC0BV,cAAc,CACtC,CACC,OADD,CADsC,EAGnC,CACF,2BADE,CAHmC,EAKnC,CACF,KADE,CALmC,CAAd,EAQtB;AACF4C,UAAO;AACN3B,UAAM,OADA;AAENC,UAAMb;AAFA;AADL,GARsB,CAD1B;AAAA,MACSuB,IADT,mBACSA,IADT;AAAA,MACeC,MADf,mBACeA,MADf;;AAgBCA,SAAOc,MAAP,CAAchC,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAgB,SAAO,CAAP,EAAUS,GAAV,CAAc3B,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACAgB,SAAO,CAAP,EAAUU,MAAV,CAAiB5B,MAAjB,CAAwBE,KAAxB,CAA8B,OAA9B;AACAgB,SAAO,CAAP,EAAUQ,KAAV,CAAgB1B,MAAhB,CAAuBE,KAAvB,CAA6B,SAA7B;;AAEAe,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBa,UAAO;AADgB,GAAD,CAAvB;AAGA,EAzBD;;AA2BAhB,IAAG,yBAAH,EAA8B,YAAM;AAAA,wBACVV,cAAc,CACtC,CACC,MADD,CADsC,EAGnC,CACF,aADE,CAHmC,CAAd,EAMtB;AACF6C,SAAM;AACL5B,UAAM,MADD;AAELC,UAAMM,MAFD;AAGLY,cAAU,IAHL;AAILU,cAAU,kBAACpB,KAAD,EAAW;AACpB,SAAIA,UAAU,aAAd,EAA6B;AAC5B,YAAM,IAAIqB,KAAJ,CAAU,cAAV,CAAN;AACA;AACD;AARI;AADJ,GANsB,CADU;AAAA,MAC3BnB,IAD2B,mBAC3BA,IAD2B;AAAA,MACrBC,MADqB,mBACrBA,MADqB;;AAoBnCA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBwB,UAAO,cADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,MAHiB;AAIzBrB,SAAMM,MAJmB;AAKzBE,UAAO;AALkB,GAAD,CAAzB;;AAQAE,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,EAAvB;AACA,EA7BD;;AA+BAH,IAAG,yBAAH,EAA8B,YAAM;AAAA,wBACVV,cAAc,CACtC,CACC,QADD,CADsC,EAGnC,CACF,QADE,CAHmC,CAAd,EAMtB;AACFmB,WAAQ;AACPF,UAAM,QADC;AAEPC,UAAME,MAFC;AAGPgB,cAAU;AAHH;AADN,GANsB,CADU;AAAA,MAC3BR,IAD2B,mBAC3BA,IAD2B;AAAA,MACrBC,MADqB,mBACrBA,MADqB;;AAenCA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBwB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,QAHiB;AAIzBrB,SAAME,MAJmB;AAKzBM,UAAO;AALkB,GAAD,CAAzB;;AAQAE,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,EAAvB;AACA,EAxBD;;AA0BAH,IAAG,0BAAH,EAA+B,YAAM;AAAA,yBACXV,cAAc,CACtC,CACC,MADD,EAEC,OAFD,EAGC,SAHD,CADsC,EAKnC,CACF,IADE,EAEF,KAFE,EAGF,MAHE,CALmC,CAAd,EAUtB;AACFgD,SAAM;AACL/B,UAAM,MADD;AAELC,UAAMI,OAFD;AAGLc,cAAU;AAHL,IADJ;AAMFa,UAAO;AACNhC,UAAM,OADA;AAENC,UAAMI,OAFA;AAGNc,cAAU;AAHJ,IANL;AAWFc,YAAS;AACRjC,UAAM,SADE;AAERC,UAAMI,OAFE;AAGRc,cAAU;AAHF;AAXP,GAVsB,CADW;AAAA,MAC5BR,IAD4B,oBAC5BA,IAD4B;AAAA,MACtBC,MADsB,oBACtBA,MADsB;;AA6BpCA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBwB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,SAHiB;AAIzBrB,SAAMI,OAJmB;AAKzBI,UAAO;AALkB,GAAD,CAAzB;;AAQAE,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBsC,SAAM,IADiB;AAEvBC,UAAO;AAFgB,GAAD,CAAvB;AAIA,EAzCD;;AA2CA1C,IAAG,uBAAH,EAA4B,YAAM;AAAA,yBACRV,cAAc,CACtC,CACC,MADD,EAEC,SAFD,CADsC,EAInC,CACF,KADE,EACK;AACP,KAFE,CAJmC,EAOnC,CACFM,IADE,EACI;AACN,KAFE,CAPmC,CAAd,EAWtB;AACFU,SAAM;AACLC,UAAM,MADD;AAELC,UAAMV,IAFD;AAGL;AACA4B,cAAU;AAJL,IADJ;AAOFc,YAAS;AACRjC,UAAM,SADE;AAERC,UAAMV,IAFE;AAGR;AACA4B,cAAU;AAJF;AAPP,GAXsB,CADQ;AAAA,MACzBR,IADyB,oBACzBA,IADyB;AAAA,MACnBC,MADmB,oBACnBA,MADmB;;AA2BjCA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBwB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,SAHiB;AAIzBrB,SAAMV,IAJmB;AAKzBkB,UAAO;AALkB,GAAD,EAMtB;AACFW,UAAO,SADL;AAEFC,QAAK,CAFH;AAGFC,WAAQ,SAHN;AAIFrB,SAAMV,IAJJ;AAKFkB,UAAO;AALL,GANsB,CAAzB;;AAcAE,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,CAAC;AACvBP;AADuB,GAAD,EAEpB;AACFA;AADE,GAFoB,CAAvB;AAKA,EA9CD;;AAgDAI,IAAG,6BAAH,EAAkC,YAAM;AAAA,yBACdV,cAAc,CACtC,CACC,OADD,EAEC,YAFD,CADsC,EAInC,CACF,KADE,EAEF,KAFE,CAJmC,CAAd,EAQtB;AACFyB,UAAO;AACNR,UAAM,OADA;AAENH,WAAO,iBAAM;AACZ,WAAM,IAAIiC,KAAJ,CAAU,SAAV,CAAN;AACA;AAJK,IADL;AAOFpB,eAAY;AACXV,UAAM,WADK;AAEXH,WAAO,iBAAM;AACZ,WAAM,IAAIiC,KAAJ,CAAU,SAAV,CAAN;AACA;AAJU;AAPV,GARsB,CADc;AAAA,MAC/BnB,IAD+B,oBAC/BA,IAD+B;AAAA,MACzBC,MADyB,oBACzBA,MADyB;;AAwBvCA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBwB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,OAHiB;AAIzBb,UAAO;AAJkB,GAAD,EAKtB;AACFW,UAAO,SADL;AAEFC,QAAK,CAFH;AAGFC,WAAQ,YAHN;AAIFb,UAAO;AAJL,GALsB,CAAzB;;AAYAE,OAAKjB,MAAL,CAAYC,IAAZ,CAAiBC,KAAjB,CAAuB,EAAvB;AACA,EArCD;;AAuCAH,IAAG,wBAAH,EAA6B,YAAM;AAAA,yBACTV,cAAc,CACtC,CACC,QADD,CADsC,EAGnC,CACF,QADE,CAHmC,CAAd,EAMtB;AACFmB,WAAQ;AACPF,UAAM,QADC;AAEPC,UAAME;AAFC;AADN,GANsB,EAWtB;AACFiC,WAAQ,CAAC,CAAD,EAAI,CAAJ;AADN,GAXsB,CADS;AAAA,MAC1BzB,IAD0B,oBAC1BA,IAD0B;AAAA,MACpBC,MADoB,oBACpBA,MADoB;;AAgBlCA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBwB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,QAHiB;AAIzBrB,SAAME,MAJmB;AAKzBM,UAAO;AALkB,GAAD,CAAzB;AAOA,EAvBD;;AAyBAhB,IAAG,iCAAH,EAAsC,YAAM;AAAA,yBAClBV,cAAc,CACtC,CACC,QADD,CADsC,EAItC,CACC,SADD,CAJsC,CAAd,EAOtB;AACFsD,WAAQ;AACPrC,UAAM,QADC;AAEPC,UAAMM,MAFC;AAGP+B,WAAO,CACN,SADM,EAEN,UAFM;AAHA;AADN,GAPsB,CADkB;AAAA,MACnC3B,IADmC,oBACnCA,IADmC;AAAA,MAC7BC,MAD6B,oBAC7BA,MAD6B;;AAmB3CA,SAAOc,MAAP,CAAchC,MAAd,CAAqBE,KAArB,CAA2B,CAA3B;AACA,EApBD;;AAsBAH,IAAG,qCAAH,EAA0C,YAAM;AAAA,yBACtBV,cAAc,CACtC,CACC,QADD,CADsC,EAItC,CACC,WADD,CAJsC,CAAd,EAOtB;AACFsD,WAAQ;AACPrC,UAAM,QADC;AAEPC,UAAMM,MAFC;AAGP+B,WAAO,CACN,SADM,EAEN,UAFM;AAHA;AADN,GAPsB,CADsB;AAAA,MACvC3B,IADuC,oBACvCA,IADuC;AAAA,MACjCC,MADiC,oBACjCA,MADiC;;AAmB/CA,SAAOlB,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC;AACzBwB,UAAO,SADkB;AAEzBC,QAAK,CAFoB;AAGzBC,WAAQ,QAHiB;AAIzBrB,SAAMM,MAJmB;AAKzBE,UAAO;AALkB,GAAD,CAAzB;AAOA,EA1BD;AA2BA,CAtfD;;AAyfA;AACA,SAASnB,oBAAT,CAA8BD,IAA9B,EAAoC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,QAAO,IAAIE,IAAJ,CAASF,KAAKkD,OAAL,KAAiBlD,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\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"]}
@@ -541,9 +541,12 @@ function parseFileNames(content, xml) {
541
541
  if (!fileNames.styles) {
542
542
  throw new Error('"styles.xml" file not found in the *.xlsx file');
543
543
  }
544
- if (!fileNames.sharedStrings) {
545
- throw new Error('"sharedStrings.xml" file not found in the *.xlsx file');
546
- }
544
+ // Seems like "sharedStrings.xml" is not required to exist.
545
+ // For example, when the spreadsheet doesn't contain any strings.
546
+ // https://github.com/catamphetamine/read-excel-file/issues/85
547
+ // if (!fileNames.sharedStrings) {
548
+ // throw new Error('"sharedStrings.xml" file not found in the *.xlsx file')
549
+ // }
547
550
  return fileNames;
548
551
  }
549
552
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/readXlsx.js"],"names":["parseDate","namespaces","a","r","rr","letters","readXlsx","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","dropEmptyRows","dropEmptyColumns","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":["parseDate","namespaces","a","r","rr","letters","readXlsx","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","dropEmptyRows","dropEmptyColumns","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}"]}
@@ -1,12 +1,22 @@
1
1
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
2
2
 
3
+ 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; }
4
+
3
5
  import readXlsx from './readXlsx';
4
6
  import convertToJson from './convertToJson';
7
+ import convertMapToSchema from './convertMapToSchema';
8
+
9
+ export default function readXlsxFileContents(entries, xml, _ref) {
10
+ var schema = _ref.schema,
11
+ map = _ref.map,
12
+ options = _objectWithoutProperties(_ref, ['schema', 'map']);
5
13
 
6
- export default function readXlsxFileContents(entries, xml, options) {
7
- var result = readXlsx(entries, xml, _extends({}, options, { properties: options.schema || options.properties }));
8
- if (options.schema) {
9
- return convertToJson(result.data, options.schema, _extends({}, options, { properties: result.properties }));
14
+ if (!schema && map) {
15
+ schema = convertMapToSchema(map);
16
+ }
17
+ var result = readXlsx(entries, xml, _extends({}, options, { properties: schema || options.properties }));
18
+ if (schema) {
19
+ return convertToJson(result.data, schema, _extends({}, options, { properties: result.properties }));
10
20
  }
11
21
  return result;
12
22
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/readXlsxFileContents.js"],"names":["readXlsx","convertToJson","readXlsxFileContents","entries","xml","options","result","properties","schema","data"],"mappings":";;AAAA,OAAOA,QAAP,MAAqB,YAArB;AACA,OAAOC,aAAP,MAA0B,iBAA1B;;AAEA,eAAe,SAASC,oBAAT,CAA8BC,OAA9B,EAAuCC,GAAvC,EAA4CC,OAA5C,EAAqD;AACnE,KAAMC,SAASN,SAASG,OAAT,EAAkBC,GAAlB,eAA4BC,OAA5B,IAAqCE,YAAYF,QAAQG,MAAR,IAAkBH,QAAQE,UAA3E,IAAf;AACA,KAAIF,QAAQG,MAAZ,EAAoB;AACnB,SAAOP,cAAcK,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":["readXlsx","convertToJson","convertMapToSchema","readXlsxFileContents","entries","xml","schema","map","options","result","properties","data"],"mappings":";;;;AAAA,OAAOA,QAAP,MAAqB,YAArB;AACA,OAAOC,aAAP,MAA0B,iBAA1B;AACA,OAAOC,kBAAP,MAA+B,sBAA/B;;AAEA,eAAe,SAASC,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,WAASJ,mBAAmBK,GAAnB,CAAT;AACA;AACD,KAAME,SAAST,SAASI,OAAT,EAAkBC,GAAlB,eAA4BG,OAA5B,IAAqCE,YAAYJ,UAAUE,QAAQE,UAAnE,IAAf;AACA,KAAIJ,MAAJ,EAAY;AACX,SAAOL,cAAcQ,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":["path","readXlsxFileNode","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,OAAOA,IAAP,MAAiB,MAAjB;;AAEA,OAAOC,gBAAP,MAA6B,oBAA7B;;AAEAC,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,SAAOd,iBAAiBD,KAAKgB,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":["path","readXlsxFileNode","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,6 @@
1
+ exports = module.exports = require('../commonjs/readXlsxFileNode').default
2
+ exports.Integer = require('../commonjs/types/Integer').default
3
+ exports.Email = require('../commonjs/types/Email').default
4
+ exports.URL = require('../commonjs/types/URL').default
5
+ exports.parseExcelDate = require('../commonjs/parseDate').default
6
+ exports['default'] = require('../commonjs/readXlsxFileNode').default
@@ -0,0 +1,23 @@
1
+ // See the discussion:
2
+ // https://github.com/catamphetamine/read-excel-file/issues/71
3
+
4
+ import { PathLike } from 'fs';
5
+ import { Stream } from 'stream';
6
+
7
+ import {
8
+ ParseWithSchemaOptions,
9
+ ParseWithMapOptions,
10
+ ParseWithoutSchemaOptions,
11
+ ParsedObjectsResult,
12
+ Row
13
+ } from '../types.d.ts';
14
+
15
+ export function parseExcelDate(excelSerialDate: number) : typeof Date;
16
+
17
+ export type Input = Stream | PathLike;
18
+
19
+ function readXlsxFile(input: Input, options: ParseWithSchemaOptions) : Promise<ParsedObjectsResult>;
20
+ function readXlsxFile(input: Input, options: ParseWithMapOptions) : Promise<ParsedObjectsResult>;
21
+ function readXlsxFile(input: Input, options?: ParseWithoutSchemaOptions) : Promise<Row[]>;
22
+
23
+ export default readXlsxFile;
package/node/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { default as default } from '../modules/readXlsxFileNode'
2
+ export { default as Integer } from '../modules/types/Integer'
3
+ export { default as Email } from '../modules/types/Email'
4
+ export { default as URL } from '../modules/types/URL'
5
+ export { default as parseExcelDate } from '../modules/parseDate'
@@ -0,0 +1,9 @@
1
+ {
2
+ "private": true,
3
+ "name": "read-excel-file-node",
4
+ "version": "1.0.0",
5
+ "main": "index.commonjs.js",
6
+ "module": "index.js",
7
+ "types.test": "./index.d.ts.test",
8
+ "sideEffects": false
9
+ }
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "read-excel-file",
3
- "version": "4.0.5",
4
- "description": "Read `*.xlsx` files in a browser or Node.js. Parse to JSON with a strict schema.",
3
+ "version": "4.1.0",
4
+ "description": "Read small to medium `*.xlsx` files in a browser or Node.js. Parse to JSON with a strict schema.",
5
5
  "module": "index.js",
6
6
  "sideEffects": false,
7
7
  "main": "index.commonjs.js",
8
+ "types.test": "./index.d.ts.test",
8
9
  "contributors": [
9
10
  {
10
11
  "name": "Trevor Dixon",
@@ -35,7 +36,7 @@
35
36
  "prepublish": "npm-run-all build test browser-build"
36
37
  },
37
38
  "dependencies": {
38
- "jszip": "3.1.5",
39
+ "jszip": "^3.5.0",
39
40
  "unzipper": "^0.9.15",
40
41
  "xmldom": "^0.1.27",
41
42
  "xpath": "0.0.27"
@@ -77,7 +78,7 @@
77
78
  },
78
79
  "repository": {
79
80
  "type": "git",
80
- "url": "https://github.com/catamphetamine/read-excel-file"
81
+ "url": "https://gitlab.com/catamphetamine/read-excel-file"
81
82
  },
82
83
  "keywords": [
83
84
  "excel",
@@ -88,7 +89,7 @@
88
89
  "author": "catamphetamine <purecatamphetamine@gmail.com>",
89
90
  "license": "MIT",
90
91
  "bugs": {
91
- "url": "https://github.com/catamphetamine/read-excel-file/issues"
92
+ "url": "https://gitlab.com/catamphetamine/read-excel-file/issues"
92
93
  },
93
- "homepage": "https://github.com/catamphetamine/read-excel-file#readme"
94
+ "homepage": "https://gitlab.com/catamphetamine/read-excel-file#readme"
94
95
  }
@@ -0,0 +1,2 @@
1
+ exports = module.exports = require('../commonjs/convertToJson').default
2
+ exports['default'] = require('../commonjs/convertToJson').default
@@ -0,0 +1,6 @@
1
+ import {
2
+ Row,
3
+ Schema
4
+ } from '../types.d.ts';
5
+
6
+ export default function convert(data: Row[], schema: Schema): object[];