datakit
Version:
Simple JavaScript toolkit for data transform across JSON, CSV and YAML.
152 lines • 5.83 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.invokeUserFn = exports.loadUserFn = void 0;
var path = __importStar(require("path"));
var fs = __importStar(require("fs"));
var utils_1 = require("../../lib/utils");
var args_1 = require("./args");
var chalk_1 = __importDefault(require("chalk"));
//
// Loads a user function.
//
function loadUserFn(argv, exampleFn) {
var userFn;
if (argv.length < 1) {
throw new Error("Expected a user function, something like: \"".concat(exampleFn, "\""));
}
var fileOption = {
names: ["file", "f"],
placeholder: "<file-name>",
example: "my-file.js",
desc: "The name of the file to load the user function from.",
};
var fileName = (0, args_1.consumeOptionalArg)(argv, 0, fileOption);
var loadSourceCode = undefined;
if (fileName) {
var filePath_1 = path.resolve(fileName);
loadSourceCode = function () { return fs.readFileSync(filePath_1, "utf8"); };
try {
userFn = require(filePath_1);
fileName = path.basename(fileName);
}
catch (err) {
handleUserFnError(err, { loadSourceCode: loadSourceCode, fileName: fileName });
}
}
else {
fileName = "<anonymous>";
var sourceCode_1 = argv.shift();
loadSourceCode = function () { return sourceCode_1; };
try {
userFn = eval(sourceCode_1);
}
catch (err) {
handleUserFnError(err, { loadSourceCode: loadSourceCode, fileName: fileName });
}
}
if (!(0, utils_1.isFunction)(userFn)) {
throw new Error("Expected a user function! Got a ".concat(typeof (userFn)));
}
return {
fn: userFn,
details: {
loadSourceCode: loadSourceCode,
fileName: fileName,
},
};
}
exports.loadUserFn = loadUserFn;
//
// Wraps a user function for error handling.
//
function invokeUserFn(fn, details) {
try {
var result = fn();
if (result && result.catch) {
return result.catch(function (err) {
handleUserFnError(err, details);
});
}
return result;
}
catch (err) {
handleUserFnError(err, details);
}
}
exports.invokeUserFn = invokeUserFn;
//
// 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.
//
function firstLine(input) {
var newlineIndex = input.indexOf("\n");
if (newlineIndex > 0) {
return input.substring(0, newlineIndex).trimEnd();
}
else {
return input.trimEnd();
}
}
//# sourceMappingURL=user-fn.js.map