read-excel-file 4.0.8 → 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.
- package/CHANGELOG.md +11 -0
- package/README.md +53 -8
- package/bundle/read-excel-file.min.js +2 -2
- package/bundle/read-excel-file.min.js.map +1 -1
- package/commonjs/convertMapToSchema.js +41 -0
- package/commonjs/convertMapToSchema.js.map +1 -0
- package/commonjs/convertMapToSchema.test.js.map +1 -0
- package/commonjs/convertToJson.js +9 -4
- package/commonjs/convertToJson.js.map +1 -1
- package/commonjs/convertToJson.test.js.map +1 -1
- package/commonjs/readXlsxFileContents.js +17 -4
- package/commonjs/readXlsxFileContents.js.map +1 -1
- package/commonjs/readXlsxFileNode.test.js.map +1 -1
- package/index.d.ts.test +2 -0
- package/modules/convertMapToSchema.js +34 -0
- package/modules/convertMapToSchema.js.map +1 -0
- package/modules/convertMapToSchema.test.js.map +1 -0
- package/modules/convertToJson.js +9 -4
- package/modules/convertToJson.js.map +1 -1
- package/modules/convertToJson.test.js.map +1 -1
- package/modules/readXlsxFileContents.js +14 -4
- package/modules/readXlsxFileContents.js.map +1 -1
- package/modules/readXlsxFileNode.test.js.map +1 -1
- package/node/index.d.ts.test +2 -0
- package/package.json +1 -1
- package/types.d.ts +17 -2
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
8
|
+
|
|
9
|
+
exports.default = convertMapToSchema;
|
|
10
|
+
function convertMapToSchema(map) {
|
|
11
|
+
var schema = {};
|
|
12
|
+
for (var _iterator = Object.keys(map), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
|
13
|
+
var _ref;
|
|
14
|
+
|
|
15
|
+
if (_isArray) {
|
|
16
|
+
if (_i >= _iterator.length) break;
|
|
17
|
+
_ref = _iterator[_i++];
|
|
18
|
+
} else {
|
|
19
|
+
_i = _iterator.next();
|
|
20
|
+
if (_i.done) break;
|
|
21
|
+
_ref = _i.value;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var key = _ref;
|
|
25
|
+
|
|
26
|
+
var prop = map[key];
|
|
27
|
+
var type = void 0;
|
|
28
|
+
if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'object') {
|
|
29
|
+
prop = Object.keys(map[key])[0];
|
|
30
|
+
type = convertMapToSchema(map[key][prop]);
|
|
31
|
+
}
|
|
32
|
+
schema[key] = {
|
|
33
|
+
prop: prop
|
|
34
|
+
};
|
|
35
|
+
if (type) {
|
|
36
|
+
schema[key].type = type;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return schema;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=convertMapToSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../source/convertMapToSchema.js"],"names":["convertMapToSchema","map","schema","Object","keys","key","prop","type"],"mappings":";;;;;;;;kBAAwBA,kB;AAAT,SAASA,kBAAT,CAA4BC,GAA5B,EAAiC;AAC/C,KAAMC,SAAS,EAAf;AACA,sBAAkBC,OAAOC,IAAP,CAAYH,GAAZ,CAAlB,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAzBI,GAAyB;;AACnC,MAAIC,OAAOL,IAAII,GAAJ,CAAX;AACA,MAAIE,aAAJ;AACA,MAAI,QAAOD,IAAP,yCAAOA,IAAP,OAAgB,QAApB,EAA8B;AAC7BA,UAAOH,OAAOC,IAAP,CAAYH,IAAII,GAAJ,CAAZ,EAAsB,CAAtB,CAAP;AACAE,UAAOP,mBAAmBC,IAAII,GAAJ,EAASC,IAAT,CAAnB,CAAP;AACA;AACDJ,SAAOG,GAAP,IAAc;AACbC;AADa,GAAd;AAGA,MAAIC,IAAJ,EAAU;AACTL,UAAOG,GAAP,EAAYE,IAAZ,GAAmBA,IAAnB;AACA;AACD;AACD,QAAOL,MAAP;AACA","file":"convertMapToSchema.js","sourcesContent":["export default function convertMapToSchema(map) {\r\n\tconst schema = {}\r\n\tfor (const key of Object.keys(map)) {\r\n\t\tlet prop = map[key]\r\n\t\tlet type\r\n\t\tif (typeof prop === 'object') {\r\n\t\t\tprop = Object.keys(map[key])[0]\r\n\t\t\ttype = convertMapToSchema(map[key][prop])\r\n\t\t}\r\n\t\tschema[key] = {\r\n\t\t\tprop\r\n\t\t}\r\n\t\tif (type) {\r\n\t\t\tschema[key].type = type\r\n\t\t}\r\n\t}\r\n\treturn schema\r\n}"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../source/convertMapToSchema.test.js"],"names":["describe","it","map","should","deep","equal","prop","type"],"mappings":";;AAAA;;;;;;AAEAA,SAAS,oBAAT,EAA+B,YAAM;AACpCC,IAAG,8BAAH,EAAmC,YAAM;AACxC,MAAMC,MAAM;AACX,iBAAc,MADH;AAEX,yBAAsB,kBAFX;AAGX,aAAU;AACT,cAAU;AACT,gBAAW,QADF;AAET,qBAAgB;AAFP;AADD,IAHC;AASX,cAAW,SATA;AAUX,aAAU;AAVC,GAAZ;AAYA,oCAAmBA,GAAnB,EAAwBC,MAAxB,CAA+BC,IAA/B,CAAoCC,KAApC,CAA0C;AACzC,iBAAc;AACbC,UAAM;AADO,IAD2B;AAIzC,yBAAsB;AACrBA,UAAM;AADe,IAJmB;AAOzC,aAAU;AACTA,UAAM,QADG;AAETC,UAAM;AACL,gBAAW;AACVD,YAAM;AADI,MADN;AAIL,qBAAgB;AACfA,YAAM;AADS;AAJX;AAFG,IAP+B;AAkBzC,cAAW;AACVA,UAAM;AADI,IAlB8B;AAqBzC,aAAU;AACTA,UAAM;AADG;AArB+B,GAA1C;AAyBA,EAtCD;AAuCA,CAxCD","file":"convertMapToSchema.test.js","sourcesContent":["import convertMapToSchema from './convertMapToSchema'\r\n\r\ndescribe('convertMapToSchema', () => {\r\n\tit('should convert map to schema', () => {\r\n\t\tconst map = {\r\n\t\t\t'START DATE': 'date',\r\n\t\t\t'NUMBER OF STUDENTS': 'numberOfStudents',\r\n\t\t\t'COURSE': {\r\n\t\t\t\t'course': {\r\n\t\t\t\t\t'IS FREE': 'isFree',\r\n\t\t\t\t\t'COURSE TITLE': 'title'\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'CONTACT': 'contact',\r\n\t\t\t'STATUS': 'status'\r\n\t\t}\r\n\t\tconvertMapToSchema(map).should.deep.equal({\r\n\t\t\t'START DATE': {\r\n\t\t\t\tprop: 'date'\r\n\t\t\t},\r\n\t\t\t'NUMBER OF STUDENTS': {\r\n\t\t\t\tprop: 'numberOfStudents'\r\n\t\t\t},\r\n\t\t\t'COURSE': {\r\n\t\t\t\tprop: 'course',\r\n\t\t\t\ttype: {\r\n\t\t\t\t\t'IS FREE': {\r\n\t\t\t\t\t\tprop: 'isFree'\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'COURSE TITLE': {\r\n\t\t\t\t\t\tprop: 'title'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'CONTACT': {\r\n\t\t\t\tprop: 'contact'\r\n\t\t\t},\r\n\t\t\t'STATUS': {\r\n\t\t\t\tprop: 'status'\r\n\t\t\t}\r\n\t\t})\r\n\t})\r\n})"]}
|
|
@@ -199,7 +199,9 @@ function parseValue(value, schemaEntry, options) {
|
|
|
199
199
|
} else if (schemaEntry.type) {
|
|
200
200
|
result = parseValueOfType(value, Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type, options);
|
|
201
201
|
} else {
|
|
202
|
-
|
|
202
|
+
result = { value: value
|
|
203
|
+
// throw new Error('Invalid schema entry: no .type and no .parse():\n\n' + JSON.stringify(schemaEntry, null, 2))
|
|
204
|
+
};
|
|
203
205
|
}
|
|
204
206
|
// If errored then return the error.
|
|
205
207
|
if (result.error) {
|
|
@@ -228,11 +230,11 @@ function parseValue(value, schemaEntry, options) {
|
|
|
228
230
|
*/
|
|
229
231
|
function parseCustomValue(value, parse) {
|
|
230
232
|
try {
|
|
231
|
-
|
|
232
|
-
if (
|
|
233
|
+
value = parse(value);
|
|
234
|
+
if (value === undefined) {
|
|
233
235
|
return { value: null };
|
|
234
236
|
}
|
|
235
|
-
return { value:
|
|
237
|
+
return { value: value };
|
|
236
238
|
} catch (error) {
|
|
237
239
|
return { error: error.message };
|
|
238
240
|
}
|
|
@@ -310,6 +312,9 @@ function parseValueOfType(value, type, options) {
|
|
|
310
312
|
return { error: 'invalid' };
|
|
311
313
|
|
|
312
314
|
default:
|
|
315
|
+
if (typeof type === 'function') {
|
|
316
|
+
return parseCustomValue(value, type);
|
|
317
|
+
}
|
|
313
318
|
throw new Error('Unknown schema type: ' + (type && type.name || type));
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../source/convertToJson.js"],"names":["data","schema","options","DEFAULT_OPTIONS","isColumnOriented","rowMap","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","parseValue","getBlock","parseArray","rowIndex","object","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","notEmpty","array","map","_value","required","column","prop","Object","keys","parse","parseCustomValue","parseValueOfType","Error","JSON","stringify","oneOf","validate","message","parsed","String","Number","isFinite","parseFloat","Date","parseInt","date","properties","Boolean","name","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"mappings":"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","file":"convertToJson.js","sourcesContent":["import parseDate from './parseDate'\r\nimport Integer, { isInteger } from './types/Integer'\r\nimport URL, { isURL } from './types/URL'\r\nimport Email, { isEmail } from './types/Email'\r\n\r\nconst DEFAULT_OPTIONS = {\r\n isColumnOriented: false\r\n}\r\n\r\n/**\r\n * Convert 2D array to nested objects.\r\n * If row oriented data, row 0 is dotted key names.\r\n * Column oriented data is transposed.\r\n * @param {string[][]} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @return {object[]}\r\n */\r\nexport default function(data, schema, options) {\r\n if (options) {\r\n options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n options = DEFAULT_OPTIONS\r\n }\r\n\r\n const {\r\n isColumnOriented,\r\n rowMap\r\n } = options\r\n\r\n validateSchema(schema)\r\n\r\n if (isColumnOriented) {\r\n data = transpose(data)\r\n }\r\n\r\n const columns = data[0]\r\n\r\n const results = []\r\n const errors = []\r\n\r\n for (let i = 1; i < data.length; i++) {\r\n const result = read(schema, data[i], i - 1, columns, errors, options)\r\n if (result) {\r\n results.push(result)\r\n }\r\n }\r\n\r\n // Correct error rows.\r\n if (rowMap) {\r\n for (const error of errors) {\r\n error.row = rowMap[error.row] + 1\r\n }\r\n }\r\n\r\n return {\r\n rows: results,\r\n errors\r\n }\r\n}\r\n\r\nfunction read(schema, row, rowIndex, columns, errors, options) {\r\n const object = {}\r\n for (const key of Object.keys(schema)) {\r\n const schemaEntry = schema[key]\r\n const isNestedSchema = typeof schemaEntry.type === 'object' && !Array.isArray(schemaEntry.type)\r\n let rawValue = row[columns.indexOf(key)]\r\n if (rawValue === undefined) {\r\n rawValue = null\r\n }\r\n let value\r\n let error\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, columns, errors, options)\r\n } else {\r\n if (rawValue === null) {\r\n value = null\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n let notEmpty = false\r\n const array = parseArray(rawValue).map((_value) => {\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n value = _value\r\n error = result.error\r\n }\r\n if (result.value !== null) {\r\n notEmpty = true\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n value = notEmpty ? array : null\r\n }\r\n } else {\r\n const result = parseValue(rawValue, schemaEntry, options)\r\n error = result.error\r\n value = error ? rawValue : result.value\r\n }\r\n }\r\n if (!error && value === null && schemaEntry.required) {\r\n error = 'required'\r\n }\r\n if (error) {\r\n error = {\r\n error,\r\n row: rowIndex + 1,\r\n column: key,\r\n value\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else if (value !== null) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n if (Object.keys(object).length > 0) {\r\n return object\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {string} value\r\n * @param {object} schemaEntry\r\n * @return {{ value: any, error: string }}\r\n */\r\nexport function parseValue(value, schemaEntry, options) {\r\n if (value === null) {\r\n return { value: null }\r\n }\r\n let result\r\n if (schemaEntry.parse) {\r\n result = parseCustomValue(value, schemaEntry.parse)\r\n } else if (schemaEntry.type) {\r\n result = parseValueOfType(value, Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type, options)\r\n } else {\r\n throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\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 let parsed = parse(value)\r\n if (parsed === undefined) {\r\n return { value: null }\r\n }\r\n return { value: parsed }\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {string} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n return { value }\r\n\r\n case Number:\r\n case 'Integer':\r\n case Integer:\r\n // The global isFinite() function determines\r\n // whether the passed value is a finite number.\r\n // If needed, the parameter is first converted to a number.\r\n if (!isFinite(value)) {\r\n return { error: 'invalid' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid' }\r\n }\r\n // Convert strings to numbers.\r\n // Just an additional feature.\r\n // Won't happen when called from `readXlsx()`.\r\n if (typeof value === 'string') {\r\n value = parseFloat(value)\r\n }\r\n return { value }\r\n\r\n case 'URL':\r\n case URL:\r\n if (!isURL(value)) {\r\n return { error: 'invalid' }\r\n }\r\n return { value }\r\n\r\n case 'Email':\r\n case Email:\r\n if (!isEmail(value)) {\r\n return { error: 'invalid' }\r\n }\r\n return { value }\r\n\r\n case Date:\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n if (value instanceof Date) {\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (!isFinite(value)) {\r\n return { error: 'invalid' }\r\n }\r\n value = parseInt(value)\r\n const date = parseDate(value, options.properties)\r\n if (!date) {\r\n return { error: 'invalid' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid' }\r\n\r\n default:\r\n throw new Error(`Unknown schema type: ${type && type.name || type}`)\r\n }\r\n}\r\n\r\nexport function getBlock(string, endCharacter, startIndex) {\r\n let i = 0\r\n let substring = ''\r\n let character\r\n while (startIndex + i < string.length) {\r\n const character = string[startIndex + i]\r\n if (character === endCharacter) {\r\n return [substring, i]\r\n }\r\n else if (character === '\"') {\r\n const block = getBlock(string, '\"', startIndex + i + 1)\r\n substring += block[0]\r\n i += '\"'.length + block[1] + '\"'.length\r\n }\r\n else {\r\n substring += character\r\n i++\r\n }\r\n }\r\n return [substring, i]\r\n}\r\n\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"sources":["../source/convertToJson.js"],"names":["data","schema","options","DEFAULT_OPTIONS","isColumnOriented","rowMap","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","parseValue","getBlock","parseArray","rowIndex","object","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","notEmpty","array","map","_value","required","column","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","Number","isFinite","parseFloat","Date","parseInt","date","properties","Boolean","Error","name","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"mappings":"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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 result = { value: value }\r\n // throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid' }\r\n }\r\n if (schemaEntry.validate) {\r\n try {\r\n schemaEntry.validate(result.value)\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {string} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {string} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n return { value }\r\n\r\n case Number:\r\n case 'Integer':\r\n case Integer:\r\n // The global isFinite() function determines\r\n // whether the passed value is a finite number.\r\n // If needed, the parameter is first converted to a number.\r\n if (!isFinite(value)) {\r\n return { error: 'invalid' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid' }\r\n }\r\n // Convert strings to numbers.\r\n // Just an additional feature.\r\n // Won't happen when called from `readXlsx()`.\r\n if (typeof value === 'string') {\r\n value = parseFloat(value)\r\n }\r\n return { value }\r\n\r\n case 'URL':\r\n case URL:\r\n if (!isURL(value)) {\r\n return { error: 'invalid' }\r\n }\r\n return { value }\r\n\r\n case 'Email':\r\n case Email:\r\n if (!isEmail(value)) {\r\n return { error: 'invalid' }\r\n }\r\n return { value }\r\n\r\n case Date:\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n if (value instanceof Date) {\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (!isFinite(value)) {\r\n return { error: 'invalid' }\r\n }\r\n value = parseInt(value)\r\n const date = parseDate(value, options.properties)\r\n if (!date) {\r\n return { error: 'invalid' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid' }\r\n\r\n default:\r\n if (typeof type === 'function') {\r\n return parseCustomValue(value, type)\r\n }\r\n throw new Error(`Unknown schema type: ${type && type.name || type}`)\r\n }\r\n}\r\n\r\nexport function getBlock(string, endCharacter, startIndex) {\r\n let i = 0\r\n let substring = ''\r\n let character\r\n while (startIndex + i < string.length) {\r\n const character = string[startIndex + i]\r\n if (character === endCharacter) {\r\n return [substring, i]\r\n }\r\n else if (character === '\"') {\r\n const block = getBlock(string, '\"', startIndex + i + 1)\r\n substring += block[0]\r\n i += '\"'.length + block[1] + '\"'.length\r\n }\r\n else {\r\n substring += character\r\n i++\r\n }\r\n }\r\n return [substring, i]\r\n}\r\n\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../source/convertToJson.test.js"],"names":["date","convertToUTCTimezone","Date","describe","it","should","deep","equal","parse","getTimezoneOffset","DATE","prop","type","NUMBER","Number","BOOLEAN","Boolean","STRING","String","PHONE","value","rows","errors","toISOString","number","phone","boolean","string","required","error","row","column","NAMES","names","INTEGER","length","URL","EMAIL","NAME","validate","Error","TRUE","FALSE","INVALID","true","false","rowMap","STATUS","oneOf","getTime"],"mappings":"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","file":"convertToJson.test.js","sourcesContent":["import convertToJson, { parseArray, getBlock } from './convertToJson'\r\nimport Integer from './types/Integer'\r\nimport URL from './types/URL'\r\nimport Email from './types/Email'\r\n\r\nconst date = convertToUTCTimezone(new Date(2018, 3 - 1, 24, 12))\r\n\r\ndescribe('convertToJson', () => {\r\n\tit('should parse arrays', () => {\r\n\t\tgetBlock('abc\"de,f\"g,h', ',', 0).should.deep.equal(['abcde,fg', 10])\r\n\t\tparseArray(' abc\"de,f\"g , h ').should.deep.equal(['abcde,fg', 'h'])\r\n\t})\r\n\r\n\tit('should convert to json', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'DATE',\r\n\t\t\t\t'NUMBER',\r\n\t\t\t\t'BOOLEAN',\r\n\t\t\t\t'STRING',\r\n\t\t\t\t'PHONE'\r\n\t\t\t], [\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\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"]}
|
|
1
|
+
{"version":3,"sources":["../source/convertToJson.test.js"],"names":["date","convertToUTCTimezone","Date","describe","it","should","deep","equal","parse","getTimezoneOffset","DATE","prop","type","NUMBER","Number","BOOLEAN","Boolean","STRING","String","PHONE","value","PHONE_TYPE","rows","errors","toISOString","number","phone","phoneType","boolean","string","required","error","row","column","NAMES","names","INTEGER","length","URL","EMAIL","NAME","validate","Error","TRUE","FALSE","INVALID","true","false","rowMap","STATUS","oneOf","getTime"],"mappings":"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","file":"convertToJson.test.js","sourcesContent":["import convertToJson, { parseArray, getBlock } from './convertToJson'\r\nimport Integer from './types/Integer'\r\nimport URL from './types/URL'\r\nimport Email from './types/Email'\r\n\r\nconst date = convertToUTCTimezone(new Date(2018, 3 - 1, 24, 12))\r\n\r\ndescribe('convertToJson', () => {\r\n\tit('should parse arrays', () => {\r\n\t\tgetBlock('abc\"de,f\"g,h', ',', 0).should.deep.equal(['abcde,fg', 10])\r\n\t\tparseArray(' abc\"de,f\"g , h ').should.deep.equal(['abcde,fg', 'h'])\r\n\t})\r\n\r\n\tit('should convert to json', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'DATE',\r\n\t\t\t\t'NUMBER',\r\n\t\t\t\t'BOOLEAN',\r\n\t\t\t\t'STRING',\r\n\t\t\t\t'PHONE',\r\n\t\t\t\t'PHONE_TYPE'\r\n\t\t\t], [\r\n\t\t\t\tnew Date(Date.parse('03/24/2018') - new Date().getTimezoneOffset() * 60 * 1000 + 12 * 60 * 60 * 1000), // '43183', // '03/24/2018',\r\n\t\t\t\t'123',\r\n\t\t\t\ttrue,\r\n\t\t\t\t'abc',\r\n\t\t\t\t'(123) 456-7890',\r\n\t\t\t\t'(123) 456-7890'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tDATE: {\r\n\t\t\t\tprop: 'date',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\t// template: 'MM/DD/YYYY',\r\n\t\t\t},\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number\r\n\t\t\t},\r\n\t\t\tBOOLEAN: {\r\n\t\t\t\tprop: 'boolean',\r\n\t\t\t\ttype: Boolean\r\n\t\t\t},\r\n\t\t\tSTRING: {\r\n\t\t\t\tprop: 'string',\r\n\t\t\t\ttype: String\r\n\t\t\t},\r\n\t\t\tPHONE: {\r\n\t\t\t\tprop: 'phone',\r\n\t\t\t\tparse(value) {\r\n\t\t\t\t\treturn '+11234567890'\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tPHONE_TYPE: {\r\n\t\t\t\tprop: 'phoneType',\r\n\t\t\t\ttype(value) {\r\n\t\t\t\t\treturn '+11234567890'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([])\r\n\r\n\t\t// Convert `Date` to `String` for equality check.\r\n\t\trows[0].date = rows[0].date.toISOString()\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tdate: date.toISOString(),\r\n\t\t\tnumber: 123,\r\n\t\t\tphone: '+11234567890',\r\n\t\t\tphoneType: '+11234567890',\r\n\t\t\tboolean: true,\r\n\t\t\tstring: 'abc'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should support schema entries with no `type`s', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'DATE',\r\n\t\t\t\t'NUMBER',\r\n\t\t\t\t'BOOLEAN',\r\n\t\t\t\t'STRING'\r\n\t\t\t], [\r\n\t\t\t\tnew Date(Date.parse('03/24/2018') - new Date().getTimezoneOffset() * 60 * 1000 + 12 * 60 * 60 * 1000), // '43183', // '03/24/2018',\r\n\t\t\t\t123,\r\n\t\t\t\ttrue,\r\n\t\t\t\t'abc'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tDATE: {\r\n\t\t\t\tprop: 'date'\r\n\t\t\t},\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number'\r\n\t\t\t},\r\n\t\t\tBOOLEAN: {\r\n\t\t\t\tprop: 'boolean'\r\n\t\t\t},\r\n\t\t\tSTRING: {\r\n\t\t\t\tprop: 'string'\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([])\r\n\r\n\t\t// Convert `Date` to `String` for equality check.\r\n\t\trows[0].date = rows[0].date.toISOString()\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tdate: date.toISOString(),\r\n\t\t\tnumber: 123,\r\n\t\t\tboolean: true,\r\n\t\t\tstring: 'abc'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should require fields', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NUMBER'\r\n\t\t\t], [\r\n\t\t\t\tnull\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number,\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'required',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'NUMBER',\r\n\t\t\ttype: Number,\r\n\t\t\tvalue: null\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should parse arrays', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NAMES'\r\n\t\t\t], [\r\n\t\t\t\t'Barack Obama, \"String, with, colons\", Donald Trump'\r\n\t\t\t], [\r\n\t\t\t\tnull\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNAMES: {\r\n\t\t\t\tprop: 'names',\r\n\t\t\t\ttype: [String]\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([])\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tnames: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should parse integers', () =>\r\n\t{\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'INTEGER'\r\n\t\t\t], [\r\n\t\t\t\t'1'\r\n\t\t\t], [\r\n\t\t\t\t'1.2'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tINTEGER: {\r\n\t\t\t\tprop: 'value',\r\n\t\t\t\ttype: Integer\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(1)\r\n\t\terrors[0].row.should.equal(2)\r\n\t\terrors[0].column.should.equal('INTEGER')\r\n\t\terrors[0].error.should.equal('invalid')\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tvalue: 1\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should parse URLs', () =>\r\n\t{\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'URL'\r\n\t\t\t], [\r\n\t\t\t\t'https://kremlin.ru'\r\n\t\t\t], [\r\n\t\t\t\t'kremlin.ru'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tURL: {\r\n\t\t\t\tprop: 'value',\r\n\t\t\t\ttype: URL\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(1)\r\n\t\terrors[0].row.should.equal(2)\r\n\t\terrors[0].column.should.equal('URL')\r\n\t\terrors[0].error.should.equal('invalid')\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tvalue: 'https://kremlin.ru'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should parse Emails', () =>\r\n\t{\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'EMAIL'\r\n\t\t\t], [\r\n\t\t\t\t'vladimir.putin@kremlin.ru'\r\n\t\t\t], [\r\n\t\t\t\t'123'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tEMAIL: {\r\n\t\t\t\tprop: 'value',\r\n\t\t\t\ttype: Email\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(1)\r\n\t\terrors[0].row.should.equal(2)\r\n\t\terrors[0].column.should.equal('EMAIL')\r\n\t\terrors[0].error.should.equal('invalid')\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tvalue: 'vladimir.putin@kremlin.ru'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should call .validate()', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NAME'\r\n\t\t\t], [\r\n\t\t\t\t'George Bush'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNAME: {\r\n\t\t\t\tprop: 'name',\r\n\t\t\t\ttype: String,\r\n\t\t\t\trequired: true,\r\n\t\t\t\tvalidate: (value) => {\r\n\t\t\t\t\tif (value === 'George Bush') {\r\n\t\t\t\t\t\tthrow new Error('custom-error')\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'custom-error',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'NAME',\r\n\t\t\ttype: String,\r\n\t\t\tvalue: 'George Bush'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should validate numbers', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NUMBER'\r\n\t\t\t], [\r\n\t\t\t\t'123abc'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number,\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'NUMBER',\r\n\t\t\ttype: Number,\r\n\t\t\tvalue: '123abc'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should validate booleans', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'TRUE',\r\n\t\t\t\t'FALSE',\r\n\t\t\t\t'INVALID'\r\n\t\t\t], [\r\n\t\t\t\ttrue,\r\n\t\t\t\tfalse,\r\n\t\t\t\t'TRUE'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tTRUE: {\r\n\t\t\t\tprop: 'true',\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\tFALSE: {\r\n\t\t\t\tprop: 'false',\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\tINVALID: {\r\n\t\t\t\tprop: 'invalid',\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'INVALID',\r\n\t\t\ttype: Boolean,\r\n\t\t\tvalue: 'TRUE'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\ttrue: true,\r\n\t\t\tfalse: false\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should validate dates', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'DATE',\r\n\t\t\t\t'INVALID'\r\n\t\t\t], [\r\n\t\t\t\t43183, // 03/24/2018',\r\n\t\t\t\t'-'\r\n\t\t\t], [\r\n\t\t\t\tdate, // 03/24/2018',,\r\n\t\t\t\t'-'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tDATE: {\r\n\t\t\t\tprop: 'date',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\t// template: 'MM/DD/YYYY',\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\tINVALID: {\r\n\t\t\t\tprop: 'invalid',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\t// template: 'MM/DD/YYYY',\r\n\t\t\t\trequired: true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'INVALID',\r\n\t\t\ttype: Date,\r\n\t\t\tvalue: '-'\r\n\t\t}, {\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 2,\r\n\t\t\tcolumn: 'INVALID',\r\n\t\t\ttype: Date,\r\n\t\t\tvalue: '-'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([{\r\n\t\t\tdate\r\n\t\t}, {\r\n\t\t\tdate\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should throw parse() errors', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'PHONE',\r\n\t\t\t\t'PHONE_TYPE'\r\n\t\t\t], [\r\n\t\t\t\t'123',\r\n\t\t\t\t'123'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tPHONE: {\r\n\t\t\t\tprop: 'phone',\r\n\t\t\t\tparse: () => {\r\n\t\t\t\t\tthrow new Error('invalid')\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tPHONE_TYPE: {\r\n\t\t\t\tprop: 'phoneType',\r\n\t\t\t\tparse: () => {\r\n\t\t\t\t\tthrow new Error('invalid')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'PHONE',\r\n\t\t\tvalue: '123'\r\n\t\t}, {\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'PHONE_TYPE',\r\n\t\t\tvalue: '123'\r\n\t\t}])\r\n\r\n\t\trows.should.deep.equal([])\r\n\t})\r\n\r\n\tit('should map row numbers', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'NUMBER'\r\n\t\t\t], [\r\n\t\t\t\t'123abc'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tNUMBER: {\r\n\t\t\t\tprop: 'number',\r\n\t\t\t\ttype: Number\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\trowMap: [2, 5]\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 6,\r\n\t\t\tcolumn: 'NUMBER',\r\n\t\t\ttype: Number,\r\n\t\t\tvalue: '123abc'\r\n\t\t}])\r\n\t})\r\n\r\n\tit('should validate \"oneOf\" (valid)', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'STATUS'\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t'STARTED'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tSTATUS: {\r\n\t\t\t\tprop: 'status',\r\n\t\t\t\ttype: String,\r\n\t\t\t\toneOf: [\r\n\t\t\t\t\t'STARTED',\r\n\t\t\t\t\t'FINISHED'\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.length.should.equal(0)\r\n\t})\r\n\r\n\tit('should validate \"oneOf\" (not valid)', () => {\r\n\t\tconst { rows, errors } = convertToJson([\r\n\t\t\t[\r\n\t\t\t\t'STATUS'\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t'SCHEDULED'\r\n\t\t\t]\r\n\t\t], {\r\n\t\t\tSTATUS: {\r\n\t\t\t\tprop: 'status',\r\n\t\t\t\ttype: String,\r\n\t\t\t\toneOf: [\r\n\t\t\t\t\t'STARTED',\r\n\t\t\t\t\t'FINISHED'\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\terrors.should.deep.equal([{\r\n\t\t\terror: 'invalid',\r\n\t\t\trow: 1,\r\n\t\t\tcolumn: 'STATUS',\r\n\t\t\ttype: String,\r\n\t\t\tvalue: 'SCHEDULED'\r\n\t\t}])\r\n\t})\r\n})\r\n\r\n\r\n// Converts timezone to UTC while preserving the same time\r\nfunction convertToUTCTimezone(date) {\r\n\t// Doesn't account for leap seconds but I guess that's ok\r\n\t// given that javascript's own `Date()` does not either.\r\n\t// https://www.timeanddate.com/time/leap-seconds-background.html\r\n\t//\r\n\t// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset\r\n\t//\r\n\treturn new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000)\r\n}\r\n"]}
|
|
@@ -16,12 +16,25 @@ var _convertToJson = require('./convertToJson');
|
|
|
16
16
|
|
|
17
17
|
var _convertToJson2 = _interopRequireDefault(_convertToJson);
|
|
18
18
|
|
|
19
|
+
var _convertMapToSchema = require('./convertMapToSchema');
|
|
20
|
+
|
|
21
|
+
var _convertMapToSchema2 = _interopRequireDefault(_convertMapToSchema);
|
|
22
|
+
|
|
19
23
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
24
|
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
|
26
|
+
|
|
27
|
+
function readXlsxFileContents(entries, xml, _ref) {
|
|
28
|
+
var schema = _ref.schema,
|
|
29
|
+
map = _ref.map,
|
|
30
|
+
options = _objectWithoutProperties(_ref, ['schema', 'map']);
|
|
31
|
+
|
|
32
|
+
if (!schema && map) {
|
|
33
|
+
schema = (0, _convertMapToSchema2.default)(map);
|
|
34
|
+
}
|
|
35
|
+
var result = (0, _readXlsx2.default)(entries, xml, _extends({}, options, { properties: schema || options.properties }));
|
|
36
|
+
if (schema) {
|
|
37
|
+
return (0, _convertToJson2.default)(result.data, schema, _extends({}, options, { properties: result.properties }));
|
|
25
38
|
}
|
|
26
39
|
return result;
|
|
27
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../source/readXlsxFileContents.js"],"names":["readXlsxFileContents","entries","xml","options","result","properties","
|
|
1
|
+
{"version":3,"sources":["../source/readXlsxFileContents.js"],"names":["readXlsxFileContents","entries","xml","schema","map","options","result","properties","data"],"mappings":";;;;;;;;kBAIwBA,oB;;AAJxB;;;;AACA;;;;AACA;;;;;;;;AAEe,SAASA,oBAAT,CAA8BC,OAA9B,EAAuCC,GAAvC,QAAwE;AAAA,KAA1BC,MAA0B,QAA1BA,MAA0B;AAAA,KAAlBC,GAAkB,QAAlBA,GAAkB;AAAA,KAAVC,OAAU;;AACtF,KAAI,CAACF,MAAD,IAAWC,GAAf,EAAoB;AACnBD,WAAS,kCAAmBC,GAAnB,CAAT;AACA;AACD,KAAME,SAAS,wBAASL,OAAT,EAAkBC,GAAlB,eAA4BG,OAA5B,IAAqCE,YAAYJ,UAAUE,QAAQE,UAAnE,IAAf;AACA,KAAIJ,MAAJ,EAAY;AACX,SAAO,6BAAcG,OAAOE,IAArB,EAA2BL,MAA3B,eAAwCE,OAAxC,IAAiDE,YAAYD,OAAOC,UAApE,IAAP;AACA;AACD,QAAOD,MAAP;AACA","file":"readXlsxFileContents.js","sourcesContent":["import readXlsx from './readXlsx'\r\nimport convertToJson from './convertToJson'\r\nimport convertMapToSchema from './convertMapToSchema'\r\n\r\nexport default function readXlsxFileContents(entries, xml, { schema, map, ...options}) {\r\n\tif (!schema && map) {\r\n\t\tschema = convertMapToSchema(map)\r\n\t}\r\n\tconst result = readXlsx(entries, xml, { ...options, properties: schema || options.properties })\r\n\tif (schema) {\r\n\t\treturn convertToJson(result.data, schema, { ...options, properties: result.properties })\r\n\t}\r\n\treturn result\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../source/readXlsxFileNode.test.js"],"names":["describe","it","schema","prop","type","Date","template","Number","required","Boolean","String","parse","value","rowMap","resolve","__dirname","then","rows","
|
|
1
|
+
{"version":3,"sources":["../source/readXlsxFileNode.test.js"],"names":["describe","it","schema","prop","type","Date","template","Number","required","Boolean","String","parse","value","rowMap","resolve","__dirname","then","rows","date","getTime","should","deep","equal","convertToUTCTimezone","numberOfStudents","course","isFree","cost","title","contact","map","errors","getTimezoneOffset"],"mappings":"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","file":"readXlsxFileNode.test.js","sourcesContent":["import path from 'path'\r\n\r\nimport readXlsxFileNode from './readXlsxFileNode'\r\n\r\ndescribe('readXlsxFileNode', () => {\r\n\tit('should read *.xlsx file on Node.js and parse it to JSON', () => {\r\n\t\tconst schema = {\r\n\t\t\t'START DATE': {\r\n\t\t\t\tprop: 'date',\r\n\t\t\t\ttype: Date,\r\n\t\t\t\ttemplate: 'MM/DD/YYYY',\r\n\t\t\t},\r\n\t\t\t'NUMBER OF STUDENTS': {\r\n\t\t\t\tprop: 'numberOfStudents',\r\n\t\t\t\ttype: Number,\r\n\t\t\t\trequired: true\r\n\t\t\t},\r\n\t\t\t'COURSE': {\r\n\t\t\t\tprop: 'course',\r\n\t\t\t\ttype: {\r\n\t\t\t\t\t'IS FREE': {\r\n\t\t\t\t\t\tprop: 'isFree',\r\n\t\t\t\t\t\ttype: Boolean\r\n\t\t\t\t\t\t// Excel stored booleans as numbers:\r\n\t\t\t\t\t\t// `1` is `true` and `0` is `false`.\r\n\t\t\t\t\t\t// Such numbers are parsed to booleans.\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'COST': {\r\n\t\t\t\t\t\tprop: 'cost',\r\n\t\t\t\t\t\ttype: Number\r\n\t\t\t\t\t},\r\n\t\t\t\t\t'COURSE TITLE': {\r\n\t\t\t\t\t\tprop: 'title',\r\n\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'CONTACT': {\r\n\t\t\t\tprop: 'contact',\r\n\t\t\t\trequired: true,\r\n\t\t\t\tparse(value) {\r\n\t\t\t\t\treturn '+11234567890'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst rowMap = []\r\n\r\n\t\treturn readXlsxFileNode(path.resolve(__dirname, '../test/spreadsheets/course.xlsx'), { schema, rowMap }).then(({ rows }) => {\r\n\t\t\trows[0].date = rows[0].date.getTime()\r\n\t\t\trows.should.deep.equal([{\r\n\t\t\t\tdate: convertToUTCTimezone(new Date(2018, 2, 24, 12)).getTime(),\r\n\t\t\t\tnumberOfStudents: 123,\r\n\t\t\t\tcourse: {\r\n\t\t\t\t\tisFree: false,\r\n\t\t\t\t\tcost: 210.45,\r\n\t\t\t\t\ttitle: 'Chemistry'\r\n\t\t\t\t},\r\n\t\t\t\tcontact: '+11234567890'\r\n\t\t\t}])\r\n\t\t\trowMap.should.deep.equal([0, 1])\r\n\t\t})\r\n\t})\r\n\r\n\tit('should read *.xlsx file on Node.js and map it to JSON', () => {\r\n\t\tconst map = {\r\n\t\t\t'START DATE': 'date',\r\n\t\t\t'NUMBER OF STUDENTS': 'numberOfStudents',\r\n\t\t\t'COURSE': {\r\n\t\t\t\t'course': {\r\n\t\t\t\t\t'IS FREE': 'isFree',\r\n\t\t\t\t\t'COST': 'cost',\r\n\t\t\t\t\t'COURSE TITLE': 'title'\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'CONTACT': 'contact'\r\n\t\t}\r\n\r\n\t\tconst rowMap = []\r\n\r\n\t\treturn readXlsxFileNode(path.resolve(__dirname, '../test/spreadsheets/course.xlsx'), { map, rowMap }).then(({ rows, errors }) => {\r\n\t\t\terrors.should.deep.equal([])\r\n\t\t\trows[0].date = rows[0].date.getTime()\r\n\t\t\trows.should.deep.equal([{\r\n\t\t\t\tdate: convertToUTCTimezone(new Date(2018, 2, 24, 12)).getTime(),\r\n\t\t\t\tnumberOfStudents: 123,\r\n\t\t\t\tcourse: {\r\n\t\t\t\t\tisFree: false,\r\n\t\t\t\t\tcost: 210.45,\r\n\t\t\t\t\ttitle: 'Chemistry'\r\n\t\t\t\t},\r\n\t\t\t\tcontact: '(123) 456-7890'\r\n\t\t\t}])\r\n\t\t\trowMap.should.deep.equal([0, 1])\r\n\t\t})\r\n\t})\r\n})\r\n\r\n// Converts timezone to UTC while preserving the same time\r\nfunction convertToUTCTimezone(date) {\r\n\t// Doesn't account for leap seconds but I guess that's ok\r\n\t// given that javascript's own `Date()` does not either.\r\n\t// https://www.timeanddate.com/time/leap-seconds-background.html\r\n\t//\r\n\t// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset\r\n\t//\r\n\treturn new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000)\r\n}\r\n"]}
|
package/index.d.ts.test
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
ParseWithSchemaOptions,
|
|
6
|
+
ParseWithMapOptions,
|
|
6
7
|
ParseWithoutSchemaOptions,
|
|
7
8
|
ParsedObjectsResult,
|
|
8
9
|
Row
|
|
@@ -13,6 +14,7 @@ export function parseExcelDate(excelSerialDate: number) : typeof Date;
|
|
|
13
14
|
export type Input = File
|
|
14
15
|
|
|
15
16
|
function readXlsxFile(input: Input, options: ParseWithSchemaOptions) : Promise<ParsedObjectsResult>;
|
|
17
|
+
function readXlsxFile(input: Input, options: ParseWithMapOptions) : Promise<ParsedObjectsResult>;
|
|
16
18
|
function readXlsxFile(input: Input, options?: ParseWithoutSchemaOptions) : Promise<Row[]>;
|
|
17
19
|
|
|
18
20
|
export default readXlsxFile;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
2
|
+
|
|
3
|
+
export default function convertMapToSchema(map) {
|
|
4
|
+
var schema = {};
|
|
5
|
+
for (var _iterator = Object.keys(map), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
|
6
|
+
var _ref;
|
|
7
|
+
|
|
8
|
+
if (_isArray) {
|
|
9
|
+
if (_i >= _iterator.length) break;
|
|
10
|
+
_ref = _iterator[_i++];
|
|
11
|
+
} else {
|
|
12
|
+
_i = _iterator.next();
|
|
13
|
+
if (_i.done) break;
|
|
14
|
+
_ref = _i.value;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
var key = _ref;
|
|
18
|
+
|
|
19
|
+
var prop = map[key];
|
|
20
|
+
var type = void 0;
|
|
21
|
+
if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'object') {
|
|
22
|
+
prop = Object.keys(map[key])[0];
|
|
23
|
+
type = convertMapToSchema(map[key][prop]);
|
|
24
|
+
}
|
|
25
|
+
schema[key] = {
|
|
26
|
+
prop: prop
|
|
27
|
+
};
|
|
28
|
+
if (type) {
|
|
29
|
+
schema[key].type = type;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return schema;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=convertMapToSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../source/convertMapToSchema.js"],"names":["convertMapToSchema","map","schema","Object","keys","key","prop","type"],"mappings":";;AAAA,eAAe,SAASA,kBAAT,CAA4BC,GAA5B,EAAiC;AAC/C,KAAMC,SAAS,EAAf;AACA,sBAAkBC,OAAOC,IAAP,CAAYH,GAAZ,CAAlB,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAzBI,GAAyB;;AACnC,MAAIC,OAAOL,IAAII,GAAJ,CAAX;AACA,MAAIE,aAAJ;AACA,MAAI,QAAOD,IAAP,yCAAOA,IAAP,OAAgB,QAApB,EAA8B;AAC7BA,UAAOH,OAAOC,IAAP,CAAYH,IAAII,GAAJ,CAAZ,EAAsB,CAAtB,CAAP;AACAE,UAAOP,mBAAmBC,IAAII,GAAJ,EAASC,IAAT,CAAnB,CAAP;AACA;AACDJ,SAAOG,GAAP,IAAc;AACbC;AADa,GAAd;AAGA,MAAIC,IAAJ,EAAU;AACTL,UAAOG,GAAP,EAAYE,IAAZ,GAAmBA,IAAnB;AACA;AACD;AACD,QAAOL,MAAP;AACA","file":"convertMapToSchema.js","sourcesContent":["export default function convertMapToSchema(map) {\r\n\tconst schema = {}\r\n\tfor (const key of Object.keys(map)) {\r\n\t\tlet prop = map[key]\r\n\t\tlet type\r\n\t\tif (typeof prop === 'object') {\r\n\t\t\tprop = Object.keys(map[key])[0]\r\n\t\t\ttype = convertMapToSchema(map[key][prop])\r\n\t\t}\r\n\t\tschema[key] = {\r\n\t\t\tprop\r\n\t\t}\r\n\t\tif (type) {\r\n\t\t\tschema[key].type = type\r\n\t\t}\r\n\t}\r\n\treturn schema\r\n}"]}
|
|
@@ -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})"]}
|
package/modules/convertToJson.js
CHANGED
|
@@ -174,7 +174,9 @@ 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
|
-
|
|
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) {
|
|
@@ -203,11 +205,11 @@ export function parseValue(value, schemaEntry, options) {
|
|
|
203
205
|
*/
|
|
204
206
|
function parseCustomValue(value, parse) {
|
|
205
207
|
try {
|
|
206
|
-
|
|
207
|
-
if (
|
|
208
|
+
value = parse(value);
|
|
209
|
+
if (value === undefined) {
|
|
208
210
|
return { value: null };
|
|
209
211
|
}
|
|
210
|
-
return { value:
|
|
212
|
+
return { value: value };
|
|
211
213
|
} catch (error) {
|
|
212
214
|
return { error: error.message };
|
|
213
215
|
}
|
|
@@ -285,6 +287,9 @@ function parseValueOfType(value, type, options) {
|
|
|
285
287
|
return { error: 'invalid' };
|
|
286
288
|
|
|
287
289
|
default:
|
|
290
|
+
if (typeof type === 'function') {
|
|
291
|
+
return parseCustomValue(value, type);
|
|
292
|
+
}
|
|
288
293
|
throw new Error('Unknown schema type: ' + (type && type.name || type));
|
|
289
294
|
}
|
|
290
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","oneOf","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) {\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 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":"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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 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}"]}
|