UNPKG

datakit

Version:

Simple JavaScript toolkit for data transform across JSON, CSV and YAML.

152 lines 5.83 kB
"use strict"; 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