Comparing version 1.0.20 to 1.0.21
@@ -54,4 +54,9 @@ "use strict"; | ||
loadSourceCode = function () { return fs.readFileSync(filePath_1, "utf8"); }; | ||
userFn = require(filePath_1); | ||
fileName = path.basename(fileName); | ||
try { | ||
userFn = require(filePath_1); | ||
fileName = path.basename(fileName); | ||
} | ||
catch (err) { | ||
handleUserFnError(err, { loadSourceCode: loadSourceCode, fileName: fileName }); | ||
} | ||
} | ||
@@ -62,3 +67,8 @@ else { | ||
loadSourceCode = function () { return sourceCode_1; }; | ||
userFn = eval(sourceCode_1); | ||
try { | ||
userFn = eval(sourceCode_1); | ||
} | ||
catch (err) { | ||
handleUserFnError(err, { loadSourceCode: loadSourceCode, fileName: fileName }); | ||
} | ||
} | ||
@@ -82,27 +92,12 @@ if (!(0, utils_1.isFunction)(userFn)) { | ||
try { | ||
return fn(); | ||
var result = fn(); | ||
if (result && result.catch) { | ||
return result.catch(function (err) { | ||
handleUserFnError(err, details); | ||
}); | ||
} | ||
return result; | ||
} | ||
catch (err) { | ||
if (err.stack) { | ||
var matches = (new RegExp("".concat(details.fileName, ":(\\d+):(\\d+)"))).exec(err.stack); | ||
if (matches) { | ||
var message = err.message || firstLine(err.stack); | ||
var lineNumber = parseInt(matches[1]); | ||
var columnNumber = parseInt(matches[2]); | ||
console.error(chalk_1.default.red("Error: ") + message); | ||
console.error(" ".concat(chalk_1.default.cyan("-->"), " ").concat(details.fileName, ":").concat(lineNumber, ":").concat(columnNumber)); | ||
var sourceCode = details.loadSourceCode(); | ||
var sourceCodeLines = sourceCode.split("\n"); | ||
console.error(); | ||
console.error(sourceCodeLines.slice(Math.max(0, lineNumber - 3), lineNumber - 1).map(function (line) { return " " + line; }).join("\n")); | ||
console.error("".concat(chalk_1.default.red(" > ")).concat(sourceCodeLines[lineNumber - 1])); | ||
console.error(" ".repeat(columnNumber - 1) + chalk_1.default.red(" ^ " + message)); | ||
console.error(sourceCodeLines.slice(lineNumber, lineNumber + 3).map(function (line) { return " " + line; }).join("\n")); | ||
console.error(); | ||
console.error(err.stack.split("\n").map(function (line) { return " " + line; }).join("\n")); | ||
console.error(); | ||
throw new Error("Runtime error from user function"); | ||
} | ||
} | ||
throw err; | ||
handleUserFnError(err, details); | ||
} | ||
@@ -112,2 +107,39 @@ } | ||
// | ||
// Handles an error from user code. | ||
// | ||
function handleUserFnError(err, details) { | ||
if (err.stack) { | ||
var matches = (new RegExp("".concat(details.fileName, ":(\\d+):(\\d+)"))).exec(err.stack); | ||
if (matches) { | ||
var message = err.message || firstLine(err.stack); | ||
var lineNumber = parseInt(matches[1]); | ||
var columnNumber = parseInt(matches[2]); | ||
console.error(chalk_1.default.red("Error: ") + message); | ||
console.error(" ".concat(chalk_1.default.cyan("-->"), " ").concat(details.fileName, ":").concat(lineNumber, ":").concat(columnNumber)); | ||
var sourceCode = details.loadSourceCode(); | ||
var sourceCodeLines = sourceCode.split("\n"); | ||
console.error(); | ||
console.error(sourceCodeLines.slice(Math.max(0, lineNumber - 3), lineNumber - 1).map(function (line) { return " " + line; }).join("\n")); | ||
console.error("".concat(chalk_1.default.red(" > ")).concat(sourceCodeLines[lineNumber - 1])); | ||
console.error(" ".repeat(columnNumber - 1) + chalk_1.default.red(" ^ " + message)); | ||
console.error(sourceCodeLines.slice(lineNumber, lineNumber + 3).map(function (line) { return " " + line; }).join("\n")); | ||
console.error(); | ||
console.error(err.stack.split("\n").map(function (line) { return " " + line; }).join("\n")); | ||
console.error(); | ||
throw new Error("Runtime error from user function"); | ||
} | ||
else if (err.stack.startsWith("SyntaxError:")) { | ||
console.error(chalk_1.default.red("Syntax error: ") + err.message); | ||
var sourceCode = details.loadSourceCode(); | ||
console.error(); | ||
console.error(sourceCode); | ||
console.error(); | ||
console.error(err.stack.split("\n").map(function (line) { return " " + line; }).join("\n")); | ||
console.error(); | ||
throw new Error("Syntax error from user function"); | ||
} | ||
} | ||
throw err; | ||
} | ||
// | ||
// Extracts the first line of the input string and return it. | ||
@@ -114,0 +146,0 @@ // |
{ | ||
"name": "datakit", | ||
"version": "1.0.20", | ||
"version": "1.0.21", | ||
"description": "Simple JavaScript toolkit for data transform across JSON, CSV and YAML.", | ||
@@ -48,3 +48,5 @@ "main": "build/index.js", | ||
"test-err-2": "ts-node ./cli/map --file ./src/test/code/map-test-with-error.js < ./src/test/data/starwars/characters.json", | ||
"test-cmds": "ts-node ./cli/map \"r => runCmd(`echo ${r.Name}`)\" \"./src/test/data/cmds.csv\" | ts-node ./cli/map \"r => r.stdout\"" | ||
"test-cmd": "ts-node ./cli/map \"async r => await runCmd(`echo ${r.Name}`)\" \"./src/test/data/cmds.csv\" | ts-node ./cli/map \"r => r.stdout\"", | ||
"test-bad-cmd": "ts-node ./cli/map \"r => await runCmd(`echo ${r.Name}`)\" \"./src/test/data/cmds.csv\"", | ||
"test-length": "cat ./src/test/data/cmds.csv | ts-node ./cli/length" | ||
}, | ||
@@ -51,0 +53,0 @@ "bin": { |
Sorry, the diff of this file is not supported yet
303489
5245