"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeAsyncJsExpression = exports.executeJsExpression = void 0; const vm_1 = require("vm"); const runtime_1 = require("../../errors/runtime"); const test_run_1 = require("../../errors/test-run"); const execution_context_1 = require("../../api/test-controller/execution-context"); const constants_1 = require("./constants"); const test_run_tracker_1 = __importDefault(require("../../api/test-run-tracker")); // NOTE: do not beautify this code since offsets for error lines and columns are coded here function wrapInAsync(expression, testRunId) { return `(async function ${test_run_tracker_1.default.getMarkedFnName(testRunId)} () {\n` + expression + ';\n' + '});'; } function getErrorLineColumn(err) { if (err.isTestCafeError) { if (!err.callsite) return {}; if (err.callsite.id) return { line: 0, column: 0 }; const stackFrames = err.callsite.stackFrames || []; const frameIndex = err.callsite.callsiteFrameIdx; const stackFrame = stackFrames[frameIndex]; return stackFrame ? { line: stackFrame.getLineNumber(), column: stackFrame.getColumnNumber(), } : {}; } const result = err.stack && err.stack.match(constants_1.ERROR_LINE_COLUMN_REGEXP); if (!result) return {}; const line = result[1] ? parseInt(result[1], 10) : void 0; const column = result[2] ? parseInt(result[2], 10) : void 0; return { line, column }; } function createErrorFormattingOptions() { return { filename: constants_1.ERROR_FILENAME, lineOffset: constants_1.ERROR_LINE_OFFSET, }; } function getExecutionContext(testController, options = execution_context_1.DEFAULT_CONTEXT_OPTIONS) { const context = testController.getExecutionContext(); // TODO: Find a way to avoid this assignment (0, execution_context_1.setContextOptions)(context, options); return context; } function isRuntimeError(err) { return err instanceof runtime_1.GeneralError || err instanceof runtime_1.TestCompilationError || err instanceof runtime_1.APIError || err instanceof runtime_1.CompositeError; } function executeJsExpression(expression, testRun, options) { const context = getExecutionContext(testRun.controller, options); const errorOptions = createErrorFormattingOptions(); return (0, vm_1.runInContext)(expression, context, errorOptions); } exports.executeJsExpression = executeJsExpression; async function executeAsyncJsExpression(expression, testRun, callsite, onBeforeRaisingError) { if (!expression || !expression.length) return Promise.resolve(); const context = getExecutionContext(testRun.controller); const errorOptions = createErrorFormattingOptions(expression); const wrappedExpression = wrapInAsync(expression, testRun.id); try { return await (0, vm_1.runInContext)(wrappedExpression, context, errorOptions)(); } catch (err) { const { line, column } = getErrorLineColumn(err); let resultError = null; if (err.isTestCafeError || isRuntimeError(err)) resultError = new test_run_1.UncaughtTestCafeErrorInCustomScript(err, expression, line, column, callsite); else resultError = new test_run_1.UncaughtErrorInCustomScript(err, expression, line, column, callsite); if (onBeforeRaisingError) await onBeforeRaisingError(resultError); throw resultError; } } exports.executeAsyncJsExpression = executeAsyncJsExpression; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdC1ydW4vZXhlY3V0ZS1qcy1leHByZXNzaW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJCQUFrQztBQUVsQyxrREFLOEI7QUFFOUIsb0RBQXlHO0FBQ3pHLG1GQUF5RztBQUV6RywyQ0FJcUI7QUFFckIsa0ZBQXdEO0FBRXhELDJGQUEyRjtBQUMzRixTQUFTLFdBQVcsQ0FBRSxVQUFVLEVBQUUsU0FBUztJQUN2QyxPQUFPLG1CQUFtQiwwQkFBYyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUztRQUNyRSxVQUFVLEdBQUcsS0FBSztRQUNsQixLQUFLLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUUsR0FBRztJQUM1QixJQUFJLEdBQUcsQ0FBQyxlQUFlLEVBQUU7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRO1lBQ2IsT0FBTyxFQUFFLENBQUM7UUFFZCxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNmLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUVsQyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFNUMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksRUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxVQUFVLENBQUMsZUFBZSxFQUFFO1NBQ3ZDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNWO0lBRUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxD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RSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFM0YsSUFBSSxvQkFBb0I7WUFDcEIsTUFBTSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU1QyxNQUFNLFdBQVcsQ0FBQztLQUNyQjtBQUNMLENBQUM7QUF6QkQsNERBeUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcnVuSW5Db250ZXh0IH0gZnJvbSAndm0nO1xuXG5pbXBvcnQge1xuICAgIEdlbmVyYWxFcnJvcixcbiAgICBUZXN0Q29tcGlsYXRpb25FcnJvcixcbiAgICBBUElFcnJvcixcbiAgICBDb21wb3NpdGVFcnJvcixcbn0gZnJvbSAnLi4vLi4vZXJyb3JzL3J1bnRpbWUnO1xuXG5pbXBvcnQgeyBVbmNhdWdodEVycm9ySW5DdXN0b21TY3JpcHQsIFVuY2F1Z2h0VGVzdENhZmVFcnJvckluQ3VzdG9tU2NyaXB0IH0gZnJvbSAnLi4vLi4vZXJyb3JzL3Rlc3QtcnVuJztcbmltcG9ydCB7IHNldENvbnRleHRPcHRpb25zLCBERUZBVUxUX0NPTlRFWFRfT1BUSU9OUyB9IGZyb20gJy4uLy4uL2FwaS90ZXN0LWNvbnRyb2xsZXIvZXhlY3V0aW9uLWNvbnRleHQnO1xuXG5pbXBvcnQge1xuICAgIEVSUk9SX0xJTkVfQ09MVU1OX1JFR0VYUCxcbiAgICBFUlJPUl9GSUxFTkFNRSxcbiAgICBFUlJPUl9MSU5FX09GRlNFVCxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5pbXBvcnQgVGVzdFJ1blRyYWNrZXIgZnJvbSAnLi4vLi4vYXBpL3Rlc3QtcnVuLXRyYWNrZXInO1xuXG4vLyBOT1RFOiBkbyBub3QgYmVhdXRpZnkgdGhpcyBjb2RlIHNpbmNlIG9mZnNldHMgZm9yIGVycm9yIGxpbmVzIGFuZCBjb2x1bW5zIGFyZSBjb2RlZCBoZXJlXG5mdW5jdGlvbiB3cmFwSW5Bc3luYyAoZXhwcmVzc2lvbiwgdGVzdFJ1bklkKSB7XG4gICAgcmV0dXJuIGAoYXN5bmMgZnVuY3Rpb24gJHtUZXN0UnVuVHJhY2tlci5nZXRNYXJrZWRGbk5hbWUodGVzdFJ1bklkKX0gKCkge1xcbmAgK1xuICAgICAgICAgICBleHByZXNzaW9uICsgJztcXG4nICtcbiAgICAgICAgICAgJ30pOyc7XG59XG5cbmZ1bmN0aW9uIGdldEVycm9yTGluZUNvbHVtbiAoZXJyKSB7XG4gICAgaWYgKGVyci5pc1Rlc3RDYWZlRXJyb3IpIHtcbiAgICAgICAgaWYgKCFlcnIuY2FsbHNpdGUpXG4gICAgICAgICAgICByZXR1cm4ge307XG5cbiAgICAgICAgaWYgKGVyci5jYWxsc2l0ZS5pZClcbiAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IDAsIGNvbHVtbjogMCB9O1xuXG4gICAgICAgIGNvbnN0IHN0YWNrRnJhbWVzID0gZXJyLmNhbGxzaXRlLnN0YWNrRnJhbWVzIHx8IFtdO1xuICAgICAgICBjb25zdCBmcmFtZUluZGV4ICA9IGVyci5jYWxsc2l0ZS5jYWxsc2l0ZUZyYW1lSWR4O1xuICAgICAgICBjb25zdCBzdGFja0ZyYW1lICA9IHN0YWNrRnJhbWVzW2ZyYW1lSW5kZXhdO1xuXG4gICAgICAgIHJldHVybiBzdGFja0ZyYW1lID8ge1xuICAgICAgICAgICAgbGluZTogICBzdGFja0ZyYW1lLmdldExpbmVOdW1iZXIoKSxcbiAgICAgICAgICAgIGNvbHVtbjogc3RhY2tGcmFtZS5nZXRDb2x1bW5OdW1iZXIoKSxcbiAgICAgICAgfSA6IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGVyci5zdGFjayAmJiBlcnIuc3RhY2subWF0Y2goRVJST1JfTElORV9DT0xVTU5fUkVHRVhQKTtcblxuICAgIGlmICghcmVzdWx0KVxuICAgICAgICByZXR1cm4ge307XG5cbiAgICBjb25zdCBsaW5lICAgPSByZXN1bHRbMV0gPyBwYXJzZUludChyZXN1bHRbMV0sIDEwKSA6IHZvaWQgMDtcbiAgICBjb25zdCBjb2x1bW4gPSByZXN1bHRbMl0gPyBwYXJzZUludChyZXN1bHRbMl0sIDEwKSA6IHZvaWQgMDtcblxuICAgIHJldHVybiB7IGxpbmUsIGNvbHVtbiB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFcnJvckZvcm1hdHRpbmdPcHRpb25zICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaWxlbmFtZTogICBFUlJPUl9GSUxFTkFNRSxcbiAgICAgICAgbGluZU9mZnNldDogRVJST1JfTElORV9PRkZTRVQsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhlY3V0aW9uQ29udGV4dCAodGVzdENvbnRyb2xsZXIsIG9wdGlvbnMgPSBERUZBVUxUX0NPTlRFWFRfT1BUSU9OUykge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0ZXN0Q29udHJvbGxlci5nZXRFeGVjdXRpb25Db250ZXh0KCk7XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIGF2b2lkIHRoaXMgYXNzaWdubWVudFxuICAgIHNldENvbnRleHRPcHRpb25zKGNvbnRleHQsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIGlzUnVudGltZUVycm9yIChlcnIpIHtcbiAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgR2VuZXJhbEVycm9yIHx8XG4gICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFRlc3RDb21waWxhdGlvbkVycm9yIHx8XG4gICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEFQSUVycm9yIHx8XG4gICAgICAgICAgIGVyciBpbnN0YW5jZW9mIENvbXBvc2l0ZUVycm9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZUpzRXhwcmVzc2lvbiAoZXhwcmVzc2lvbiwgdGVzdFJ1biwgb3B0aW9ucykge1xuICAgIGNvbnN0IGNvbnRleHQgICAgICA9IGdldEV4ZWN1dGlvbkNvbnRleHQodGVzdFJ1bi5jb250cm9sbGVyLCBvcHRpb25zKTtcbiAgICBjb25zdCBlcnJvck9wdGlvbnMgPSBjcmVhdGVFcnJvckZvcm1hdHRpbmdPcHRpb25zKCk7XG5cbiAgICByZXR1cm4gcnVuSW5Db250ZXh0KGV4cHJlc3Npb24sIGNvbnRleHQsIGVycm9yT3B0aW9ucyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXN5bmNKc0V4cHJlc3Npb24gKGV4cHJlc3Npb24sIHRlc3RSdW4sIGNhbGxzaXRlLCBvbkJlZm9yZVJhaXNpbmdFcnJvcikge1xuICAgIGlmICghZXhwcmVzc2lvbiB8fCAhZXhwcmVzc2lvbi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIGNvbnN0IGNvbnRleHQgICAgICAgICAgID0gZ2V0RXhlY3V0aW9uQ29udGV4dCh0ZXN0UnVuLmNvbnRyb2xsZXIpO1xuICAgIGNvbnN0IGVycm9yT3B0aW9ucyAgICAgID0gY3JlYXRlRXJyb3JGb3JtYXR0aW5nT3B0aW9ucyhleHByZXNzaW9uKTtcbiAgICBjb25zdCB3cmFwcGVkRXhwcmVzc2lvbiA9IHdyYXBJbkFzeW5jKGV4cHJlc3Npb24sIHRlc3RSdW4uaWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bkluQ29udGV4dCh3cmFwcGVkRXhwcmVzc2lvbiwgY29udGV4dCwgZXJyb3JPcHRpb25zKSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IHsgbGluZSwgY29sdW1uIH0gPSBnZXRFcnJvckxpbmVDb2x1bW4oZXJyKTtcbiAgICAgICAgbGV0IHJlc3VsdEVycm9yICAgICAgICA9IG51bGw7XG5cbiAgICAgICAgaWYgKGVyci5pc1Rlc3RDYWZlRXJyb3IgfHwgaXNSdW50aW1lRXJyb3IoZXJyKSlcbiAgICAgICAgICAgIHJlc3VsdEVycm9yID0gbmV3IFVuY2F1Z2h0VGVzdENhZmVFcnJvckluQ3VzdG9tU2NyaXB0KGVyciwgZXhwcmVzc2lvbiwgbGluZSwgY29sdW1uLCBjYWxsc2l0ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdEVycm9yID0gbmV3IFVuY2F1Z2h0RXJyb3JJbkN1c3RvbVNjcmlwdChlcnIsIGV4cHJlc3Npb24sIGxpbmUsIGNvbHVtbiwgY2FsbHNpdGUpO1xuXG4gICAgICAgIGlmIChvbkJlZm9yZVJhaXNpbmdFcnJvcilcbiAgICAgICAgICAgIGF3YWl0IG9uQmVmb3JlUmFpc2luZ0Vycm9yKHJlc3VsdEVycm9yKTtcblxuICAgICAgICB0aHJvdyByZXN1bHRFcnJvcjtcbiAgICB9XG59XG4iXX0=