read-excel-file 5.4.0 → 5.4.3
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 +7 -0
- package/README.md +46 -0
- package/bundle/read-excel-file.min.js +1 -1
- package/bundle/read-excel-file.min.js.map +1 -1
- package/commonjs/read/schema/convertToJson.js +7 -5
- package/commonjs/read/schema/convertToJson.js.map +1 -1
- package/commonjs/read/schema/convertToJson.test.js.map +1 -1
- package/index.d.ts +4 -1
- package/modules/read/schema/convertToJson.js +7 -5
- package/modules/read/schema/convertToJson.js.map +1 -1
- package/modules/read/schema/convertToJson.test.js.map +1 -1
- package/node/index.d.ts +4 -1
- package/package.json +1 -1
- package/types.d.ts +2 -0
- package/web-worker/index.d.ts +4 -1
|
@@ -65,7 +65,8 @@ function _default(data, schema, options) {
|
|
|
65
65
|
|
|
66
66
|
var _options = options,
|
|
67
67
|
isColumnOriented = _options.isColumnOriented,
|
|
68
|
-
rowMap = _options.rowMap
|
|
68
|
+
rowMap = _options.rowMap,
|
|
69
|
+
ignoreEmptyRows = _options.ignoreEmptyRows;
|
|
69
70
|
validateSchema(schema);
|
|
70
71
|
|
|
71
72
|
if (isColumnOriented) {
|
|
@@ -77,9 +78,9 @@ function _default(data, schema, options) {
|
|
|
77
78
|
var errors = [];
|
|
78
79
|
|
|
79
80
|
for (var i = 1; i < data.length; i++) {
|
|
80
|
-
var result = read(schema, data[i], i
|
|
81
|
+
var result = read(schema, data[i], i, columns, errors, options);
|
|
81
82
|
|
|
82
|
-
if (result) {
|
|
83
|
+
if (result !== null || ignoreEmptyRows === false) {
|
|
83
84
|
results.push(result);
|
|
84
85
|
}
|
|
85
86
|
} // Correct error rows.
|
|
@@ -90,8 +91,9 @@ function _default(data, schema, options) {
|
|
|
90
91
|
var error = _step.value;
|
|
91
92
|
// Convert the `row` index in `data` to the
|
|
92
93
|
// actual `row` index in the spreadsheet.
|
|
93
|
-
//
|
|
94
|
-
|
|
94
|
+
// `- 1` converts row number to row index.
|
|
95
|
+
// `+ 1` converts row index to row number.
|
|
96
|
+
error.row = rowMap[error.row - 1] + 1;
|
|
95
97
|
}
|
|
96
98
|
}
|
|
97
99
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertToJson.js","names":["DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","isEmptyObject","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","reason","notEmpty","array","parseArray","map","_value","parseValue","required","column","includeNullValues","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","isFinite","Number","Integer","stringifiedValue","isInteger","URL","isURL","Email","isEmail","Date","isNaN","date","parseDate","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"sources":["../../../source/read/schema/convertToJson.js"],"sourcesContent":["import parseDate from '../parseDate.js'\r\n\r\nimport Integer, { isInteger } from '../../types/Integer.js'\r\nimport URL, { isURL } from '../../types/URL.js'\r\nimport Email, { isEmail } from '../../types/Email.js'\r\n\r\nconst DEFAULT_OPTIONS = {\r\n isColumnOriented: false\r\n}\r\n\r\n/**\r\n * Convert 2D array to nested objects.\r\n * If row oriented data, row 0 is dotted key names.\r\n * Column oriented data is transposed.\r\n * @param {any[][]} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @return {object[]}\r\n */\r\nexport default function(data, schema, options) {\r\n if (options) {\r\n options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n options = DEFAULT_OPTIONS\r\n }\r\n\r\n const {\r\n isColumnOriented,\r\n rowMap\r\n } = 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 // Convert the `row` index in `data` to the\r\n // actual `row` index in the spreadsheet.\r\n // The `1` compensates for the header row.\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 let isEmptyObject = true\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 let reason\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, columns, errors, options)\r\n } else {\r\n if (rawValue === null) {\r\n value = null\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n let notEmpty = false\r\n const array = parseArray(rawValue).map((_value) => {\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n value = _value\r\n error = result.error\r\n reason = result.reason\r\n }\r\n if (result.value !== null) {\r\n notEmpty = true\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n value = notEmpty ? array : null\r\n }\r\n } else {\r\n const result = parseValue(rawValue, schemaEntry, options)\r\n error = result.error\r\n reason = result.reason\r\n value = error ? rawValue : result.value\r\n }\r\n }\r\n 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 (reason) {\r\n error.reason = reason\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else {\r\n if (isEmptyObject && value !== null) {\r\n isEmptyObject = false\r\n }\r\n if (value !== null || options.includeNullValues) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n }\r\n if (isEmptyObject) {\r\n return null\r\n }\r\n return object\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {object} schemaEntry\r\n * @return {{ value: any, error: string }}\r\n */\r\nexport function parseValue(value, schemaEntry, options) {\r\n if (value === null) {\r\n return { value: null }\r\n }\r\n let result\r\n if (schemaEntry.parse) {\r\n result = parseCustomValue(value, schemaEntry.parse)\r\n } else if (schemaEntry.type) {\r\n result = parseValueOfType(\r\n value,\r\n // Supports parsing array types.\r\n // See `parseArray()` function for more details.\r\n // Example `type`: String[]\r\n // Input: 'Barack Obama, \"String, with, colons\", Donald Trump'\r\n // Output: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type,\r\n options\r\n )\r\n } else {\r\n result = { value: value }\r\n // throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid', reason: 'unknown' }\r\n }\r\n if (schemaEntry.validate) {\r\n try {\r\n schemaEntry.validate(result.value)\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {any} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n 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 {any} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string, reason?: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n if (typeof value === 'string') {\r\n return { value }\r\n }\r\n // Excel tends to perform a forced automatic convertion of string-type values\r\n // to number-type ones when the user has input them. Otherwise, users wouldn't\r\n // be able to perform formula calculations on those cell values because users\r\n // won't bother manually choosing a \"numeric\" cell type for each cell, and\r\n // even if they did, choosing a \"numeric\" cell type every time wouldn't be an\r\n // acceptable \"user experience\".\r\n //\r\n // So, if a cell value is supposed to be a string and Excel has automatically\r\n // converted it to a number, perform a backwards conversion.\r\n //\r\n if (typeof value === 'number') {\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (isFinite(value)) {\r\n return { value: String(value) }\r\n }\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Number:\r\n case Integer:\r\n // An XLSX file editing software might not always correctly\r\n // detect numeric values in string-type cells. Users won't bother\r\n // manually selecting a cell type, so the editing software has to guess\r\n // based on the user's input. One can assume that such auto-detection\r\n // might not always work.\r\n //\r\n // So, if a cell is supposed to be a numeric one, convert a string value to a number.\r\n //\r\n if (typeof value === 'string') {\r\n const stringifiedValue = value\r\n value = Number(value)\r\n if (String(value) !== stringifiedValue) {\r\n return { error: 'invalid', reason: 'not_a_number_string' }\r\n }\r\n } else if (typeof value !== 'number') {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n // At this point, `value` can only be a number.\r\n //\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid', reason: 'not_an_integer' }\r\n }\r\n return { value }\r\n\r\n case URL:\r\n if (typeof value === 'string') {\r\n if (isURL(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_url' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Email:\r\n if (typeof value === 'string') {\r\n if (isEmail(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_an_email' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\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 if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n value = Number(value)\r\n const date = parseDate(value, options.properties)\r\n if (isNaN(date)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_boolean' }\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\n/**\r\n * Parses a string of comma-separated substrings into an array of substrings.\r\n * (the `export` is just for tests)\r\n * @param {string} string — A string of comma-separated substrings.\r\n * @return {string[]} An array of substrings.\r\n */\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convertToJson.js","names":["DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","ignoreEmptyRows","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","isEmptyObject","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","reason","notEmpty","array","parseArray","map","_value","parseValue","required","column","includeNullValues","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","isFinite","Number","Integer","stringifiedValue","isInteger","URL","isURL","Email","isEmail","Date","isNaN","date","parseDate","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"sources":["../../../source/read/schema/convertToJson.js"],"sourcesContent":["import parseDate from '../parseDate.js'\r\n\r\nimport Integer, { isInteger } from '../../types/Integer.js'\r\nimport URL, { isURL } from '../../types/URL.js'\r\nimport Email, { isEmail } from '../../types/Email.js'\r\n\r\nconst DEFAULT_OPTIONS = {\r\n isColumnOriented: false\r\n}\r\n\r\n/**\r\n * Convert 2D array to nested objects.\r\n * If row oriented data, row 0 is dotted key names.\r\n * Column oriented data is transposed.\r\n * @param {any[][]} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @return {object[]}\r\n */\r\nexport default function(data, schema, options) {\r\n if (options) {\r\n options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n options = DEFAULT_OPTIONS\r\n }\r\n\r\n const {\r\n isColumnOriented,\r\n rowMap,\r\n ignoreEmptyRows\r\n } = options\r\n\r\n validateSchema(schema)\r\n\r\n if (isColumnOriented) {\r\n data = transpose(data)\r\n }\r\n\r\n const columns = data[0]\r\n\r\n const results = []\r\n const errors = []\r\n\r\n for (let i = 1; i < data.length; i++) {\r\n const result = read(schema, data[i], i, columns, errors, options)\r\n if (result !== null || ignoreEmptyRows === false) {\r\n results.push(result)\r\n }\r\n }\r\n\r\n // Correct error rows.\r\n if (rowMap) {\r\n for (const error of errors) {\r\n // Convert the `row` index in `data` to the\r\n // actual `row` index in the spreadsheet.\r\n // `- 1` converts row number to row index.\r\n // `+ 1` converts row index to row number.\r\n error.row = rowMap[error.row - 1] + 1\r\n }\r\n }\r\n\r\n return {\r\n rows: results,\r\n errors\r\n }\r\n}\r\n\r\nfunction read(schema, row, rowIndex, columns, errors, options) {\r\n const object = {}\r\n let isEmptyObject = true\r\n 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 let reason\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, columns, errors, options)\r\n } else {\r\n if (rawValue === null) {\r\n value = null\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n let notEmpty = false\r\n const array = parseArray(rawValue).map((_value) => {\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n value = _value\r\n error = result.error\r\n reason = result.reason\r\n }\r\n if (result.value !== null) {\r\n notEmpty = true\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n value = notEmpty ? array : null\r\n }\r\n } else {\r\n const result = parseValue(rawValue, schemaEntry, options)\r\n error = result.error\r\n reason = result.reason\r\n value = error ? rawValue : result.value\r\n }\r\n }\r\n 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 (reason) {\r\n error.reason = reason\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else {\r\n if (isEmptyObject && value !== null) {\r\n isEmptyObject = false\r\n }\r\n if (value !== null || options.includeNullValues) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n }\r\n if (isEmptyObject) {\r\n return null\r\n }\r\n return object\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {object} schemaEntry\r\n * @return {{ value: any, error: string }}\r\n */\r\nexport function parseValue(value, schemaEntry, options) {\r\n if (value === null) {\r\n return { value: null }\r\n }\r\n let result\r\n if (schemaEntry.parse) {\r\n result = parseCustomValue(value, schemaEntry.parse)\r\n } else if (schemaEntry.type) {\r\n result = parseValueOfType(\r\n value,\r\n // Supports parsing array types.\r\n // See `parseArray()` function for more details.\r\n // Example `type`: String[]\r\n // Input: 'Barack Obama, \"String, with, colons\", Donald Trump'\r\n // Output: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type,\r\n options\r\n )\r\n } else {\r\n result = { value: value }\r\n // throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid', reason: 'unknown' }\r\n }\r\n if (schemaEntry.validate) {\r\n try {\r\n schemaEntry.validate(result.value)\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {any} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n 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 {any} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string, reason?: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n if (typeof value === 'string') {\r\n return { value }\r\n }\r\n // Excel tends to perform a forced automatic convertion of string-type values\r\n // to number-type ones when the user has input them. Otherwise, users wouldn't\r\n // be able to perform formula calculations on those cell values because users\r\n // won't bother manually choosing a \"numeric\" cell type for each cell, and\r\n // even if they did, choosing a \"numeric\" cell type every time wouldn't be an\r\n // acceptable \"user experience\".\r\n //\r\n // So, if a cell value is supposed to be a string and Excel has automatically\r\n // converted it to a number, perform a backwards conversion.\r\n //\r\n if (typeof value === 'number') {\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (isFinite(value)) {\r\n return { value: String(value) }\r\n }\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Number:\r\n case Integer:\r\n // An XLSX file editing software might not always correctly\r\n // detect numeric values in string-type cells. Users won't bother\r\n // manually selecting a cell type, so the editing software has to guess\r\n // based on the user's input. One can assume that such auto-detection\r\n // might not always work.\r\n //\r\n // So, if a cell is supposed to be a numeric one, convert a string value to a number.\r\n //\r\n if (typeof value === 'string') {\r\n const stringifiedValue = value\r\n value = Number(value)\r\n if (String(value) !== stringifiedValue) {\r\n return { error: 'invalid', reason: 'not_a_number_string' }\r\n }\r\n } else if (typeof value !== 'number') {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n // At this point, `value` can only be a number.\r\n //\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid', reason: 'not_an_integer' }\r\n }\r\n return { value }\r\n\r\n case URL:\r\n if (typeof value === 'string') {\r\n if (isURL(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_url' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Email:\r\n if (typeof value === 'string') {\r\n if (isEmail(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_an_email' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\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 if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n value = Number(value)\r\n const date = parseDate(value, options.properties)\r\n if (isNaN(date)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_boolean' }\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\n/**\r\n * Parses a string of comma-separated substrings into an array of substrings.\r\n * (the `export` is just for tests)\r\n * @param {string} string — A string of comma-separated substrings.\r\n * @return {string[]} An array of substrings.\r\n */\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertToJson.test.js","names":["date","convertToUTCTimezone","Date","describe","it","getBlock","should","deep","equal","parseArray","convertToJson","parse","getTimezoneOffset","DATE","prop","type","NUMBER","Number","BOOLEAN","Boolean","STRING","String","PHONE","value","PHONE_TYPE","rows","errors","toISOString","number","phone","phoneType","string","required","error","row","column","NAMES","names","INTEGER","Integer","length","reason","URL","EMAIL","Email","NAME","validate","Error","TRUE","FALSE","INVALID","rowMap","STATUS","oneOf","A","B","C","CA","CB","a","b","c","includeNullValues","getTime"],"sources":["../../../source/read/schema/convertToJson.test.js"],"sourcesContent":["import convertToJson, { parseArray, getBlock } from './convertToJson.js'\r\n\r\nimport Integer from '../../types/Integer.js'\r\nimport URL from '../../types/URL.js'\r\nimport Email from '../../types/Email.js'\r\n\r\nconst date = convertToUTCTimezone(new Date(2018, 3 - 1, 24))\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), // '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},\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), // '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].should.deep.equal({\r\n\t\t\terror: 'invalid',\r\n\t\t\treason: 'not_an_integer',\r\n\t\t\trow: 2,\r\n\t\t\tcolumn: 'INTEGER',\r\n\t\t\ttype: Integer,\r\n\t\t\tvalue: '1.2'\r\n\t\t})\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\treason: 'not_a_number_string',\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\treason: 'not_a_boolean',\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\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\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\treason: 'not_a_number',\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\treason: 'not_a_number',\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\treason: 'not_a_number_string',\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\treason: 'unknown',\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\tit('should not include `null` values by default', function() {\r\n\t\tconst { rows } = convertToJson(\r\n\t\t\t[\r\n\t\t\t\t['A', 'B', 'CA', 'CB'],\r\n\t\t\t\t['a', 'b', 'ca', null],\r\n\t\t\t\t['a', null]\r\n\t\t\t],\r\n\t\t\t{\r\n\t\t\t\tA: {\r\n\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tB: {\r\n\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tC: {\r\n\t\t\t\t\tprop: 'c',\r\n \t\t\ttype: {\r\n\t\t\t\t\t\tCA: {\r\n\t\t\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tCB: {\r\n\t\t\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t}\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\trows.should.deep.equal([\r\n\t\t\t{ a: 'a', b: 'b', c: { a: 'ca' } },\r\n\t\t\t{ a: 'a' },\r\n\t\t])\r\n\t})\r\n\r\n\tit('should include `null` values when `includeNullValues: true` option is passed', function() {\r\n\t\tconst { rows } = convertToJson(\r\n\t\t\t[\r\n\t\t\t\t['A', 'B', 'CA', 'CB'],\r\n\t\t\t\t['a', 'b', 'ca', null],\r\n\t\t\t\t['a', null]\r\n\t\t\t],\r\n\t\t\t{\r\n\t\t\t\tA: {\r\n\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tB: {\r\n\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tC: {\r\n\t\t\t\t\tprop: 'c',\r\n \t\t\ttype: {\r\n\t\t\t\t\t\tCA: {\r\n\t\t\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tCB: {\r\n\t\t\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tincludeNullValues: true\r\n\t\t\t}\r\n\t\t)\r\n\r\n\t\trows.should.deep.equal([\r\n\t\t\t{ a: 'a', b: 'b', c: { a: 'ca', b: null } },\r\n\t\t\t{ a: 'a', b: null, c: null },\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convertToJson.test.js","names":["date","convertToUTCTimezone","Date","describe","it","getBlock","should","deep","equal","parseArray","convertToJson","parse","getTimezoneOffset","DATE","prop","type","NUMBER","Number","BOOLEAN","Boolean","STRING","String","PHONE","value","PHONE_TYPE","rows","errors","toISOString","number","phone","phoneType","string","required","error","row","column","NAMES","names","INTEGER","Integer","length","reason","URL","EMAIL","Email","NAME","validate","Error","TRUE","FALSE","INVALID","rowMap","STATUS","oneOf","A","B","C","CA","CB","a","b","c","includeNullValues","getTime"],"sources":["../../../source/read/schema/convertToJson.test.js"],"sourcesContent":["import convertToJson, { parseArray, getBlock } from './convertToJson.js'\r\n\r\nimport Integer from '../../types/Integer.js'\r\nimport URL from '../../types/URL.js'\r\nimport Email from '../../types/Email.js'\r\n\r\nconst date = convertToUTCTimezone(new Date(2018, 3 - 1, 24))\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), // '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},\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), // '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: 2,\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].should.deep.equal({\r\n\t\t\terror: 'invalid',\r\n\t\t\treason: 'not_an_integer',\r\n\t\t\trow: 3,\r\n\t\t\tcolumn: 'INTEGER',\r\n\t\t\ttype: Integer,\r\n\t\t\tvalue: '1.2'\r\n\t\t})\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(3)\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(3)\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: 2,\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\treason: 'not_a_number_string',\r\n\t\t\trow: 2,\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\treason: 'not_a_boolean',\r\n\t\t\trow: 2,\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\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\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\treason: 'not_a_number',\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\t\t\terror: 'invalid',\r\n\t\t\treason: 'not_a_number',\r\n\t\t\trow: 3,\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: 2,\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: 2,\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\treason: 'not_a_number_string',\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\treason: 'unknown',\r\n\t\t\trow: 2,\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\tit('should not include `null` values by default', function() {\r\n\t\tconst { rows } = convertToJson(\r\n\t\t\t[\r\n\t\t\t\t['A', 'B', 'CA', 'CB'],\r\n\t\t\t\t['a', 'b', 'ca', null],\r\n\t\t\t\t['a', null]\r\n\t\t\t],\r\n\t\t\t{\r\n\t\t\t\tA: {\r\n\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tB: {\r\n\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tC: {\r\n\t\t\t\t\tprop: 'c',\r\n \t\t\ttype: {\r\n\t\t\t\t\t\tCA: {\r\n\t\t\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tCB: {\r\n\t\t\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t}\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\trows.should.deep.equal([\r\n\t\t\t{ a: 'a', b: 'b', c: { a: 'ca' } },\r\n\t\t\t{ a: 'a' },\r\n\t\t])\r\n\t})\r\n\r\n\tit('should include `null` values when `includeNullValues: true` option is passed', function() {\r\n\t\tconst { rows } = convertToJson(\r\n\t\t\t[\r\n\t\t\t\t['A', 'B', 'CA', 'CB'],\r\n\t\t\t\t['a', 'b', 'ca', null],\r\n\t\t\t\t['a', null]\r\n\t\t\t],\r\n\t\t\t{\r\n\t\t\t\tA: {\r\n\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tB: {\r\n\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tC: {\r\n\t\t\t\t\tprop: 'c',\r\n \t\t\ttype: {\r\n\t\t\t\t\t\tCA: {\r\n\t\t\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tCB: {\r\n\t\t\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tincludeNullValues: true\r\n\t\t\t}\r\n\t\t)\r\n\r\n\t\trows.should.deep.equal([\r\n\t\t\t{ a: 'a', b: 'b', c: { a: 'ca', b: null } },\r\n\t\t\t{ a: 'a', b: null, c: null },\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"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -45,7 +45,8 @@ export default function (data, schema, options) {
|
|
|
45
45
|
|
|
46
46
|
var _options = options,
|
|
47
47
|
isColumnOriented = _options.isColumnOriented,
|
|
48
|
-
rowMap = _options.rowMap
|
|
48
|
+
rowMap = _options.rowMap,
|
|
49
|
+
ignoreEmptyRows = _options.ignoreEmptyRows;
|
|
49
50
|
validateSchema(schema);
|
|
50
51
|
|
|
51
52
|
if (isColumnOriented) {
|
|
@@ -57,9 +58,9 @@ export default function (data, schema, options) {
|
|
|
57
58
|
var errors = [];
|
|
58
59
|
|
|
59
60
|
for (var i = 1; i < data.length; i++) {
|
|
60
|
-
var result = read(schema, data[i], i
|
|
61
|
+
var result = read(schema, data[i], i, columns, errors, options);
|
|
61
62
|
|
|
62
|
-
if (result) {
|
|
63
|
+
if (result !== null || ignoreEmptyRows === false) {
|
|
63
64
|
results.push(result);
|
|
64
65
|
}
|
|
65
66
|
} // Correct error rows.
|
|
@@ -70,8 +71,9 @@ export default function (data, schema, options) {
|
|
|
70
71
|
var error = _step.value;
|
|
71
72
|
// Convert the `row` index in `data` to the
|
|
72
73
|
// actual `row` index in the spreadsheet.
|
|
73
|
-
//
|
|
74
|
-
|
|
74
|
+
// `- 1` converts row number to row index.
|
|
75
|
+
// `+ 1` converts row index to row number.
|
|
76
|
+
error.row = rowMap[error.row - 1] + 1;
|
|
75
77
|
}
|
|
76
78
|
}
|
|
77
79
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"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","isEmptyObject","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","reason","notEmpty","array","parseArray","map","_value","parseValue","required","column","includeNullValues","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","isFinite","Number","stringifiedValue","Date","isNaN","date","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"sources":["../../../source/read/schema/convertToJson.js"],"sourcesContent":["import parseDate from '../parseDate.js'\r\n\r\nimport Integer, { isInteger } from '../../types/Integer.js'\r\nimport URL, { isURL } from '../../types/URL.js'\r\nimport Email, { isEmail } from '../../types/Email.js'\r\n\r\nconst DEFAULT_OPTIONS = {\r\n isColumnOriented: false\r\n}\r\n\r\n/**\r\n * Convert 2D array to nested objects.\r\n * If row oriented data, row 0 is dotted key names.\r\n * Column oriented data is transposed.\r\n * @param {any[][]} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @return {object[]}\r\n */\r\nexport default function(data, schema, options) {\r\n if (options) {\r\n options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n options = DEFAULT_OPTIONS\r\n }\r\n\r\n const {\r\n isColumnOriented,\r\n rowMap\r\n } = 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 // Convert the `row` index in `data` to the\r\n // actual `row` index in the spreadsheet.\r\n // The `1` compensates for the header row.\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 let isEmptyObject = true\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 let reason\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, columns, errors, options)\r\n } else {\r\n if (rawValue === null) {\r\n value = null\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n let notEmpty = false\r\n const array = parseArray(rawValue).map((_value) => {\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n value = _value\r\n error = result.error\r\n reason = result.reason\r\n }\r\n if (result.value !== null) {\r\n notEmpty = true\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n value = notEmpty ? array : null\r\n }\r\n } else {\r\n const result = parseValue(rawValue, schemaEntry, options)\r\n error = result.error\r\n reason = result.reason\r\n value = error ? rawValue : result.value\r\n }\r\n }\r\n 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 (reason) {\r\n error.reason = reason\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else {\r\n if (isEmptyObject && value !== null) {\r\n isEmptyObject = false\r\n }\r\n if (value !== null || options.includeNullValues) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n }\r\n if (isEmptyObject) {\r\n return null\r\n }\r\n return object\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {object} schemaEntry\r\n * @return {{ value: any, error: string }}\r\n */\r\nexport function parseValue(value, schemaEntry, options) {\r\n if (value === null) {\r\n return { value: null }\r\n }\r\n let result\r\n if (schemaEntry.parse) {\r\n result = parseCustomValue(value, schemaEntry.parse)\r\n } else if (schemaEntry.type) {\r\n result = parseValueOfType(\r\n value,\r\n // Supports parsing array types.\r\n // See `parseArray()` function for more details.\r\n // Example `type`: String[]\r\n // Input: 'Barack Obama, \"String, with, colons\", Donald Trump'\r\n // Output: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type,\r\n options\r\n )\r\n } else {\r\n result = { value: value }\r\n // throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid', reason: 'unknown' }\r\n }\r\n if (schemaEntry.validate) {\r\n try {\r\n schemaEntry.validate(result.value)\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {any} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n 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 {any} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string, reason?: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n if (typeof value === 'string') {\r\n return { value }\r\n }\r\n // Excel tends to perform a forced automatic convertion of string-type values\r\n // to number-type ones when the user has input them. Otherwise, users wouldn't\r\n // be able to perform formula calculations on those cell values because users\r\n // won't bother manually choosing a \"numeric\" cell type for each cell, and\r\n // even if they did, choosing a \"numeric\" cell type every time wouldn't be an\r\n // acceptable \"user experience\".\r\n //\r\n // So, if a cell value is supposed to be a string and Excel has automatically\r\n // converted it to a number, perform a backwards conversion.\r\n //\r\n if (typeof value === 'number') {\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (isFinite(value)) {\r\n return { value: String(value) }\r\n }\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Number:\r\n case Integer:\r\n // An XLSX file editing software might not always correctly\r\n // detect numeric values in string-type cells. Users won't bother\r\n // manually selecting a cell type, so the editing software has to guess\r\n // based on the user's input. One can assume that such auto-detection\r\n // might not always work.\r\n //\r\n // So, if a cell is supposed to be a numeric one, convert a string value to a number.\r\n //\r\n if (typeof value === 'string') {\r\n const stringifiedValue = value\r\n value = Number(value)\r\n if (String(value) !== stringifiedValue) {\r\n return { error: 'invalid', reason: 'not_a_number_string' }\r\n }\r\n } else if (typeof value !== 'number') {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n // At this point, `value` can only be a number.\r\n //\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid', reason: 'not_an_integer' }\r\n }\r\n return { value }\r\n\r\n case URL:\r\n if (typeof value === 'string') {\r\n if (isURL(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_url' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Email:\r\n if (typeof value === 'string') {\r\n if (isEmail(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_an_email' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\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 if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n value = Number(value)\r\n const date = parseDate(value, options.properties)\r\n if (isNaN(date)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_boolean' }\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\n/**\r\n * Parses a string of comma-separated substrings into an array of substrings.\r\n * (the `export` is just for tests)\r\n * @param {string} string — A string of comma-separated substrings.\r\n * @return {string[]} An array of substrings.\r\n */\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convertToJson.js","names":["parseDate","Integer","isInteger","URL","isURL","Email","isEmail","DEFAULT_OPTIONS","isColumnOriented","data","schema","options","rowMap","ignoreEmptyRows","validateSchema","transpose","columns","results","errors","i","length","result","read","push","error","row","rows","rowIndex","object","isEmptyObject","key","schemaEntry","isNestedSchema","type","Array","isArray","rawValue","indexOf","undefined","value","reason","notEmpty","array","parseArray","map","_value","parseValue","required","column","includeNullValues","prop","Object","keys","parse","parseCustomValue","parseValueOfType","oneOf","validate","message","String","isFinite","Number","stringifiedValue","Date","isNaN","date","properties","Boolean","Error","name","getBlock","string","endCharacter","startIndex","substring","character","block","blocks","index","trim","_","entry"],"sources":["../../../source/read/schema/convertToJson.js"],"sourcesContent":["import parseDate from '../parseDate.js'\r\n\r\nimport Integer, { isInteger } from '../../types/Integer.js'\r\nimport URL, { isURL } from '../../types/URL.js'\r\nimport Email, { isEmail } from '../../types/Email.js'\r\n\r\nconst DEFAULT_OPTIONS = {\r\n isColumnOriented: false\r\n}\r\n\r\n/**\r\n * Convert 2D array to nested objects.\r\n * If row oriented data, row 0 is dotted key names.\r\n * Column oriented data is transposed.\r\n * @param {any[][]} data - An array of rows, each row being an array of cells.\r\n * @param {object} schema\r\n * @return {object[]}\r\n */\r\nexport default function(data, schema, options) {\r\n if (options) {\r\n options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options\r\n }\r\n } else {\r\n options = DEFAULT_OPTIONS\r\n }\r\n\r\n const {\r\n isColumnOriented,\r\n rowMap,\r\n ignoreEmptyRows\r\n } = options\r\n\r\n validateSchema(schema)\r\n\r\n if (isColumnOriented) {\r\n data = transpose(data)\r\n }\r\n\r\n const columns = data[0]\r\n\r\n const results = []\r\n const errors = []\r\n\r\n for (let i = 1; i < data.length; i++) {\r\n const result = read(schema, data[i], i, columns, errors, options)\r\n if (result !== null || ignoreEmptyRows === false) {\r\n results.push(result)\r\n }\r\n }\r\n\r\n // Correct error rows.\r\n if (rowMap) {\r\n for (const error of errors) {\r\n // Convert the `row` index in `data` to the\r\n // actual `row` index in the spreadsheet.\r\n // `- 1` converts row number to row index.\r\n // `+ 1` converts row index to row number.\r\n error.row = rowMap[error.row - 1] + 1\r\n }\r\n }\r\n\r\n return {\r\n rows: results,\r\n errors\r\n }\r\n}\r\n\r\nfunction read(schema, row, rowIndex, columns, errors, options) {\r\n const object = {}\r\n let isEmptyObject = true\r\n 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 let reason\r\n if (isNestedSchema) {\r\n value = read(schemaEntry.type, row, rowIndex, columns, errors, options)\r\n } else {\r\n if (rawValue === null) {\r\n value = null\r\n }\r\n else if (Array.isArray(schemaEntry.type)) {\r\n let notEmpty = false\r\n const array = parseArray(rawValue).map((_value) => {\r\n const result = parseValue(_value, schemaEntry, options)\r\n if (result.error) {\r\n value = _value\r\n error = result.error\r\n reason = result.reason\r\n }\r\n if (result.value !== null) {\r\n notEmpty = true\r\n }\r\n return result.value\r\n })\r\n if (!error) {\r\n value = notEmpty ? array : null\r\n }\r\n } else {\r\n const result = parseValue(rawValue, schemaEntry, options)\r\n error = result.error\r\n reason = result.reason\r\n value = error ? rawValue : result.value\r\n }\r\n }\r\n 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 (reason) {\r\n error.reason = reason\r\n }\r\n if (schemaEntry.type) {\r\n error.type = schemaEntry.type\r\n }\r\n errors.push(error)\r\n } else {\r\n if (isEmptyObject && value !== null) {\r\n isEmptyObject = false\r\n }\r\n if (value !== null || options.includeNullValues) {\r\n object[schemaEntry.prop] = value\r\n }\r\n }\r\n }\r\n if (isEmptyObject) {\r\n return null\r\n }\r\n return object\r\n}\r\n\r\n/**\r\n * Converts textual value to a javascript typed value.\r\n * @param {any} value\r\n * @param {object} schemaEntry\r\n * @return {{ value: any, error: string }}\r\n */\r\nexport function parseValue(value, schemaEntry, options) {\r\n if (value === null) {\r\n return { value: null }\r\n }\r\n let result\r\n if (schemaEntry.parse) {\r\n result = parseCustomValue(value, schemaEntry.parse)\r\n } else if (schemaEntry.type) {\r\n result = parseValueOfType(\r\n value,\r\n // Supports parsing array types.\r\n // See `parseArray()` function for more details.\r\n // Example `type`: String[]\r\n // Input: 'Barack Obama, \"String, with, colons\", Donald Trump'\r\n // Output: ['Barack Obama', 'String, with, colons', 'Donald Trump']\r\n Array.isArray(schemaEntry.type) ? schemaEntry.type[0] : schemaEntry.type,\r\n options\r\n )\r\n } else {\r\n result = { value: value }\r\n // throw new Error('Invalid schema entry: no .type and no .parse():\\n\\n' + JSON.stringify(schemaEntry, null, 2))\r\n }\r\n // If errored then return the error.\r\n if (result.error) {\r\n return result\r\n }\r\n if (result.value !== null) {\r\n if (schemaEntry.oneOf && schemaEntry.oneOf.indexOf(result.value) < 0) {\r\n return { error: 'invalid', reason: 'unknown' }\r\n }\r\n if (schemaEntry.validate) {\r\n try {\r\n schemaEntry.validate(result.value)\r\n } catch (error) {\r\n return { error: error.message }\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Converts textual value to a custom value using supplied `.parse()`.\r\n * @param {any} value\r\n * @param {function} parse\r\n * @return {{ value: any, error: string }}\r\n */\r\nfunction parseCustomValue(value, parse) {\r\n try {\r\n value = parse(value)\r\n if (value === undefined) {\r\n return { value: null }\r\n }\r\n return { value }\r\n } catch (error) {\r\n 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 {any} value\r\n * @param {} type\r\n * @return {{ value: (string|number|Date|boolean), error: string, reason?: string }}\r\n */\r\nfunction parseValueOfType(value, type, options) {\r\n switch (type) {\r\n case String:\r\n if (typeof value === 'string') {\r\n return { value }\r\n }\r\n // Excel tends to perform a forced automatic convertion of string-type values\r\n // to number-type ones when the user has input them. Otherwise, users wouldn't\r\n // be able to perform formula calculations on those cell values because users\r\n // won't bother manually choosing a \"numeric\" cell type for each cell, and\r\n // even if they did, choosing a \"numeric\" cell type every time wouldn't be an\r\n // acceptable \"user experience\".\r\n //\r\n // So, if a cell value is supposed to be a string and Excel has automatically\r\n // converted it to a number, perform a backwards conversion.\r\n //\r\n if (typeof value === 'number') {\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (isFinite(value)) {\r\n return { value: String(value) }\r\n }\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Number:\r\n case Integer:\r\n // An XLSX file editing software might not always correctly\r\n // detect numeric values in string-type cells. Users won't bother\r\n // manually selecting a cell type, so the editing software has to guess\r\n // based on the user's input. One can assume that such auto-detection\r\n // might not always work.\r\n //\r\n // So, if a cell is supposed to be a numeric one, convert a string value to a number.\r\n //\r\n if (typeof value === 'string') {\r\n const stringifiedValue = value\r\n value = Number(value)\r\n if (String(value) !== stringifiedValue) {\r\n return { error: 'invalid', reason: 'not_a_number_string' }\r\n }\r\n } else if (typeof value !== 'number') {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n // At this point, `value` can only be a number.\r\n //\r\n // The global `isFinite()` function filters out:\r\n // * NaN\r\n // * -Infinity\r\n // * Infinity\r\n //\r\n // All other values pass (including non-numbers).\r\n //\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n if (type === Integer && !isInteger(value)) {\r\n return { error: 'invalid', reason: 'not_an_integer' }\r\n }\r\n return { value }\r\n\r\n case URL:\r\n if (typeof value === 'string') {\r\n if (isURL(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_url' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\r\n\r\n case Email:\r\n if (typeof value === 'string') {\r\n if (isEmail(value)) {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_an_email' }\r\n }\r\n return { error: 'invalid', reason: 'not_a_string' }\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 if (isNaN(value)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value }\r\n }\r\n if (typeof value === 'number') {\r\n if (!isFinite(value)) {\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n }\r\n value = Number(value)\r\n const date = parseDate(value, options.properties)\r\n if (isNaN(date)) {\r\n return { error: 'invalid', reason: 'out_of_bounds' }\r\n }\r\n return { value: date }\r\n }\r\n return { error: 'invalid', reason: 'not_a_number' }\r\n\r\n case Boolean:\r\n if (typeof value === 'boolean') {\r\n return { value }\r\n }\r\n return { error: 'invalid', reason: 'not_a_boolean' }\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\n/**\r\n * Parses a string of comma-separated substrings into an array of substrings.\r\n * (the `export` is just for tests)\r\n * @param {string} string — A string of comma-separated substrings.\r\n * @return {string[]} An array of substrings.\r\n */\r\nexport function parseArray(string) {\r\n const blocks = []\r\n let index = 0\r\n while (index < string.length) {\r\n const [substring, length] = getBlock(string, ',', index)\r\n index += length + ','.length\r\n blocks.push(substring.trim())\r\n }\r\n return blocks\r\n}\r\n\r\n// Transpose a 2D array.\r\n// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript\r\nconst transpose = array => array[0].map((_, i) => array.map(row => row[i]))\r\n\r\nfunction validateSchema(schema) {\r\n for (const key of Object.keys(schema)) {\r\n const entry = schema[key]\r\n if (!entry.prop) {\r\n throw new Error(`\"prop\" not defined for schema entry \"${key}\".`)\r\n }\r\n }\r\n}"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"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","string","required","error","row","column","NAMES","names","INTEGER","length","reason","EMAIL","NAME","validate","Error","TRUE","FALSE","INVALID","rowMap","STATUS","oneOf","A","B","C","CA","CB","a","b","c","includeNullValues","getTime"],"sources":["../../../source/read/schema/convertToJson.test.js"],"sourcesContent":["import convertToJson, { parseArray, getBlock } from './convertToJson.js'\r\n\r\nimport Integer from '../../types/Integer.js'\r\nimport URL from '../../types/URL.js'\r\nimport Email from '../../types/Email.js'\r\n\r\nconst date = convertToUTCTimezone(new Date(2018, 3 - 1, 24))\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), // '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},\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), // '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].should.deep.equal({\r\n\t\t\terror: 'invalid',\r\n\t\t\treason: 'not_an_integer',\r\n\t\t\trow: 2,\r\n\t\t\tcolumn: 'INTEGER',\r\n\t\t\ttype: Integer,\r\n\t\t\tvalue: '1.2'\r\n\t\t})\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\treason: 'not_a_number_string',\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\treason: 'not_a_boolean',\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\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\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\treason: 'not_a_number',\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\treason: 'not_a_number',\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\treason: 'not_a_number_string',\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\treason: 'unknown',\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\tit('should not include `null` values by default', function() {\r\n\t\tconst { rows } = convertToJson(\r\n\t\t\t[\r\n\t\t\t\t['A', 'B', 'CA', 'CB'],\r\n\t\t\t\t['a', 'b', 'ca', null],\r\n\t\t\t\t['a', null]\r\n\t\t\t],\r\n\t\t\t{\r\n\t\t\t\tA: {\r\n\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tB: {\r\n\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tC: {\r\n\t\t\t\t\tprop: 'c',\r\n \t\t\ttype: {\r\n\t\t\t\t\t\tCA: {\r\n\t\t\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tCB: {\r\n\t\t\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t}\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\trows.should.deep.equal([\r\n\t\t\t{ a: 'a', b: 'b', c: { a: 'ca' } },\r\n\t\t\t{ a: 'a' },\r\n\t\t])\r\n\t})\r\n\r\n\tit('should include `null` values when `includeNullValues: true` option is passed', function() {\r\n\t\tconst { rows } = convertToJson(\r\n\t\t\t[\r\n\t\t\t\t['A', 'B', 'CA', 'CB'],\r\n\t\t\t\t['a', 'b', 'ca', null],\r\n\t\t\t\t['a', null]\r\n\t\t\t],\r\n\t\t\t{\r\n\t\t\t\tA: {\r\n\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tB: {\r\n\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tC: {\r\n\t\t\t\t\tprop: 'c',\r\n \t\t\ttype: {\r\n\t\t\t\t\t\tCA: {\r\n\t\t\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tCB: {\r\n\t\t\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tincludeNullValues: true\r\n\t\t\t}\r\n\t\t)\r\n\r\n\t\trows.should.deep.equal([\r\n\t\t\t{ a: 'a', b: 'b', c: { a: 'ca', b: null } },\r\n\t\t\t{ a: 'a', b: null, c: null },\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"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","string","required","error","row","column","NAMES","names","INTEGER","length","reason","EMAIL","NAME","validate","Error","TRUE","FALSE","INVALID","rowMap","STATUS","oneOf","A","B","C","CA","CB","a","b","c","includeNullValues","getTime"],"sources":["../../../source/read/schema/convertToJson.test.js"],"sourcesContent":["import convertToJson, { parseArray, getBlock } from './convertToJson.js'\r\n\r\nimport Integer from '../../types/Integer.js'\r\nimport URL from '../../types/URL.js'\r\nimport Email from '../../types/Email.js'\r\n\r\nconst date = convertToUTCTimezone(new Date(2018, 3 - 1, 24))\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), // '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},\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), // '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: 2,\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].should.deep.equal({\r\n\t\t\terror: 'invalid',\r\n\t\t\treason: 'not_an_integer',\r\n\t\t\trow: 3,\r\n\t\t\tcolumn: 'INTEGER',\r\n\t\t\ttype: Integer,\r\n\t\t\tvalue: '1.2'\r\n\t\t})\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(3)\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(3)\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: 2,\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\treason: 'not_a_number_string',\r\n\t\t\trow: 2,\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\treason: 'not_a_boolean',\r\n\t\t\trow: 2,\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\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\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\treason: 'not_a_number',\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\t\t\terror: 'invalid',\r\n\t\t\treason: 'not_a_number',\r\n\t\t\trow: 3,\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: 2,\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: 2,\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\treason: 'not_a_number_string',\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\treason: 'unknown',\r\n\t\t\trow: 2,\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\tit('should not include `null` values by default', function() {\r\n\t\tconst { rows } = convertToJson(\r\n\t\t\t[\r\n\t\t\t\t['A', 'B', 'CA', 'CB'],\r\n\t\t\t\t['a', 'b', 'ca', null],\r\n\t\t\t\t['a', null]\r\n\t\t\t],\r\n\t\t\t{\r\n\t\t\t\tA: {\r\n\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tB: {\r\n\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tC: {\r\n\t\t\t\t\tprop: 'c',\r\n \t\t\ttype: {\r\n\t\t\t\t\t\tCA: {\r\n\t\t\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tCB: {\r\n\t\t\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t}\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\trows.should.deep.equal([\r\n\t\t\t{ a: 'a', b: 'b', c: { a: 'ca' } },\r\n\t\t\t{ a: 'a' },\r\n\t\t])\r\n\t})\r\n\r\n\tit('should include `null` values when `includeNullValues: true` option is passed', function() {\r\n\t\tconst { rows } = convertToJson(\r\n\t\t\t[\r\n\t\t\t\t['A', 'B', 'CA', 'CB'],\r\n\t\t\t\t['a', 'b', 'ca', null],\r\n\t\t\t\t['a', null]\r\n\t\t\t],\r\n\t\t\t{\r\n\t\t\t\tA: {\r\n\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tB: {\r\n\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\ttype: String\r\n\t\t\t\t},\r\n\t\t\t\tC: {\r\n\t\t\t\t\tprop: 'c',\r\n \t\t\ttype: {\r\n\t\t\t\t\t\tCA: {\r\n\t\t\t\t\t\t\tprop: 'a',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tCB: {\r\n\t\t\t\t\t\t\tprop: 'b',\r\n\t\t\t\t\t\t\ttype: String\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tincludeNullValues: true\r\n\t\t\t}\r\n\t\t)\r\n\r\n\t\trows.should.deep.equal([\r\n\t\t\t{ a: 'a', b: 'b', c: { a: 'ca', b: null } },\r\n\t\t\t{ a: 'a', b: null, c: null },\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"],"mappings":"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"}
|