UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

88 lines 12.7 kB
"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 = testRun.controller ? getExecutionContext(testRun.controller, options) : (0, execution_context_1.createExecutionContext)(testRun); 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdC1ydW4vZXhlY3V0ZS1qcy1leHByZXNzaW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJCQUFrQztBQUVsQyxrREFLOEI7QUFFOUIsb0RBQXlHO0FBQ3pHLG1GQUlxRDtBQUVyRCwyQ0FJcUI7QUFFckIsa0ZBQXdEO0FBRXhELDJGQUEyRjtBQUMzRixTQUFTLFdBQVcsQ0FBRSxVQUFVLEVBQUUsU0FBUztJQUN2QyxPQUFPLG1CQUFtQiwwQkFBYyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUztRQUNyRSxVQUFVLEdBQUcsS0FBSztRQUNsQixLQUFLLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUUsR0FBRztJQUM1QixJQUFJLEdBQUcsQ0FBQyxlQUFlLEVBQUU7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRO1lBQ2IsT0FBTyxFQUFFLENBQUM7UUFFZCxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNmLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUVsQyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFNUMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksRUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxVQUFVLENBQUMsZUFBZSxFQUFFO1NBQ3ZDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNWO0lBRUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxvQ0FBd0IsQ0FBQyxDQUFDO0lBRXRFLElBQUksQ0FBQyxNQUFNO1FBQ1AsT0FBTyxFQUFFLENBQUM7SUFFZCxNQUFNLElBQUksR0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQsU0FBUyw0QkFBNEI7SUFDakMsT0FBTztRQUNILFFBQVEsRUFBSSwwQkFBYztRQUMxQixVQUFVLEVBQUUsNkJBQWlCO0tBQ2hDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBRSxjQUFjLEVBQUUsT0FBTyxHQUFHLDJDQUF1QjtJQUMzRSxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUVyRCw0Q0FBNEM7SUFDNUMsSUFBQSxxQ0FBaUIsRUFBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFcEMsT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFFLEdBQUc7SUFDeEIsT0FBTyxHQUFHLFlBQVksc0JBQVk7UUFDM0IsR0FBRyxZQUFZLDhCQUFvQjtRQUNuQyxHQUFHLFlBQVksa0JBQVE7UUFDdkIsR0FBRyxZQUFZLHdCQUFjLENBQUM7QUFDekMsQ0FBQztBQUVELFNBQWdCLG1CQUFtQixDQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTztJQUM3RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUEsMENBQXNCLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFFcEMsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLEVBQUUsQ0FBQztJQUVwRCxPQUFPLElBQUEsaUJBQVksRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFSRCxrREFRQztBQUVNLEtBQUssVUFBVSx3QkFBd0IsQ0FBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxvQkFBb0I7SUFDL0YsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO1FBQ2pDLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRTdCLE1BQU0sT0FBTyxHQUFhLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsRSxNQUFNLFlBQVksR0FBUSw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTlELElBQUk7UUFDQSxPQUFPLE1BQU0sSUFBQSxpQkFBWSxFQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO0tBQ3pFO0lBQ0QsT0FBTyxHQUFHLEVBQUU7UUFDUixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELElBQUksV0FBVyxHQUFVLElBQUksQ0FBQztRQUU5QixJQUFJLEdBQUcsQ0FBQyxlQUFlLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxXQUFXLEdBQUcsSUFBSSw4Q0FBbUMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7O1lBRS9GLFdBQVcsR0FBRyxJQUFJLHNDQUEyQixDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUzRixJQUFJLG9CQUFvQjtZQUNwQixNQUFNLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sV0FBVyxDQUFDO0tBQ3JCO0FBQ0wsQ0FBQztBQXpCRCw0REF5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBydW5JbkNvbnRleHQgfSBmcm9tICd2bSc7XG5cbmltcG9ydCB7XG4gICAgR2VuZXJhbEVycm9yLFxuICAgIFRlc3RDb21waWxhdGlvbkVycm9yLFxuICAgIEFQSUVycm9yLFxuICAgIENvbXBvc2l0ZUVycm9yLFxufSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5cbmltcG9ydCB7IFVuY2F1Z2h0RXJyb3JJbkN1c3RvbVNjcmlwdCwgVW5jYXVnaHRUZXN0Q2FmZUVycm9ySW5DdXN0b21TY3JpcHQgfSBmcm9tICcuLi8uLi9lcnJvcnMvdGVzdC1ydW4nO1xuaW1wb3J0IHtcbiAgICBzZXRDb250ZXh0T3B0aW9ucyxcbiAgICBERUZBVUxUX0NPTlRFWFRfT1BUSU9OUyxcbiAgICBjcmVhdGVFeGVjdXRpb25Db250ZXh0LFxufSBmcm9tICcuLi8uLi9hcGkvdGVzdC1jb250cm9sbGVyL2V4ZWN1dGlvbi1jb250ZXh0JztcblxuaW1wb3J0IHtcbiAgICBFUlJPUl9MSU5FX0NPTFVNTl9SRUdFWFAsXG4gICAgRVJST1JfRklMRU5BTUUsXG4gICAgRVJST1JfTElORV9PRkZTRVQsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuaW1wb3J0IFRlc3RSdW5UcmFja2VyIGZyb20gJy4uLy4uL2FwaS90ZXN0LXJ1bi10cmFja2VyJztcblxuLy8gTk9URTogZG8gbm90IGJlYXV0aWZ5IHRoaXMgY29kZSBzaW5jZSBvZmZzZXRzIGZvciBlcnJvciBsaW5lcyBhbmQgY29sdW1ucyBhcmUgY29kZWQgaGVyZVxuZnVuY3Rpb24gd3JhcEluQXN5bmMgKGV4cHJlc3Npb24sIHRlc3RSdW5JZCkge1xuICAgIHJldHVybiBgKGFzeW5jIGZ1bmN0aW9uICR7VGVzdFJ1blRyYWNrZXIuZ2V0TWFya2VkRm5OYW1lKHRlc3RSdW5JZCl9ICgpIHtcXG5gICtcbiAgICAgICAgICAgZXhwcmVzc2lvbiArICc7XFxuJyArXG4gICAgICAgICAgICd9KTsnO1xufVxuXG5mdW5jdGlvbiBnZXRFcnJvckxpbmVDb2x1bW4gKGVycikge1xuICAgIGlmIChlcnIuaXNUZXN0Q2FmZUVycm9yKSB7XG4gICAgICAgIGlmICghZXJyLmNhbGxzaXRlKVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuXG4gICAgICAgIGlmIChlcnIuY2FsbHNpdGUuaWQpXG4gICAgICAgICAgICByZXR1cm4geyBsaW5lOiAwLCBjb2x1bW46IDAgfTtcblxuICAgICAgICBjb25zdCBzdGFja0ZyYW1lcyA9IGVyci5jYWxsc2l0ZS5zdGFja0ZyYW1lcyB8fCBbXTtcbiAgICAgICAgY29uc3QgZnJhbWVJbmRleCAgPSBlcnIuY2FsbHNpdGUuY2FsbHNpdGVGcmFtZUlkeDtcbiAgICAgICAgY29uc3Qgc3RhY2tGcmFtZSAgPSBzdGFja0ZyYW1lc1tmcmFtZUluZGV4XTtcblxuICAgICAgICByZXR1cm4gc3RhY2tGcmFtZSA/IHtcbiAgICAgICAgICAgIGxpbmU6ICAgc3RhY2tGcmFtZS5nZXRMaW5lTnVtYmVyKCksXG4gICAgICAgICAgICBjb2x1bW46IHN0YWNrRnJhbWUuZ2V0Q29sdW1uTnVtYmVyKCksXG4gICAgICAgIH0gOiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBlcnIuc3RhY2sgJiYgZXJyLnN0YWNrLm1hdGNoKEVSUk9SX0xJTkVfQ09MVU1OX1JFR0VYUCk7XG5cbiAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgcmV0dXJuIHt9O1xuXG4gICAgY29uc3QgbGluZSAgID0gcmVzdWx0WzFdID8gcGFyc2VJbnQocmVzdWx0WzFdLCAxMCkgOiB2b2lkIDA7XG4gICAgY29uc3QgY29sdW1uID0gcmVzdWx0WzJdID8gcGFyc2VJbnQocmVzdWx0WzJdLCAxMCkgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4geyBsaW5lLCBjb2x1bW4gfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JGb3JtYXR0aW5nT3B0aW9ucyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZW5hbWU6ICAgRVJST1JfRklMRU5BTUUsXG4gICAgICAgIGxpbmVPZmZzZXQ6IEVSUk9SX0xJTkVfT0ZGU0VULFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldEV4ZWN1dGlvbkNvbnRleHQgKHRlc3RDb250cm9sbGVyLCBvcHRpb25zID0gREVGQVVMVF9DT05URVhUX09QVElPTlMpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGVzdENvbnRyb2xsZXIuZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byBhdm9pZCB0aGlzIGFzc2lnbm1lbnRcbiAgICBzZXRDb250ZXh0T3B0aW9ucyhjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBpc1J1bnRpbWVFcnJvciAoZXJyKSB7XG4gICAgcmV0dXJuIGVyciBpbnN0YW5jZW9mIEdlbmVyYWxFcnJvciB8fFxuICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBUZXN0Q29tcGlsYXRpb25FcnJvciB8fFxuICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBBUElFcnJvciB8fFxuICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBDb21wb3NpdGVFcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVKc0V4cHJlc3Npb24gKGV4cHJlc3Npb24sIHRlc3RSdW4sIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGVzdFJ1bi5jb250cm9sbGVyID9cbiAgICAgICAgZ2V0RXhlY3V0aW9uQ29udGV4dCh0ZXN0UnVuLmNvbnRyb2xsZXIsIG9wdGlvbnMpIDpcbiAgICAgICAgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCh0ZXN0UnVuKTtcblxuICAgIGNvbnN0IGVycm9yT3B0aW9ucyA9IGNyZWF0ZUVycm9yRm9ybWF0dGluZ09wdGlvbnMoKTtcblxuICAgIHJldHVybiBydW5JbkNvbnRleHQoZXhwcmVzc2lvbiwgY29udGV4dCwgZXJyb3JPcHRpb25zKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbiAoZXhwcmVzc2lvbiwgdGVzdFJ1biwgY2FsbHNpdGUsIG9uQmVmb3JlUmFpc2luZ0Vycm9yKSB7XG4gICAgaWYgKCFleHByZXNzaW9uIHx8ICFleHByZXNzaW9uLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgY29uc3QgY29udGV4dCAgICAgICAgICAgPSBnZXRFeGVjdXRpb25Db250ZXh0KHRlc3RSdW4uY29udHJvbGxlcik7XG4gICAgY29uc3QgZXJyb3JPcHRpb25zICAgICAgPSBjcmVhdGVFcnJvckZvcm1hdHRpbmdPcHRpb25zKGV4cHJlc3Npb24pO1xuICAgIGNvbnN0IHdyYXBwZWRFeHByZXNzaW9uID0gd3JhcEluQXN5bmMoZXhwcmVzc2lvbiwgdGVzdFJ1bi5pZCk7XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuSW5Db250ZXh0KHdyYXBwZWRFeHByZXNzaW9uLCBjb250ZXh0LCBlcnJvck9wdGlvbnMpKCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgeyBsaW5lLCBjb2x1bW4gfSA9IGdldEVycm9yTGluZUNvbHVtbihlcnIpO1xuICAgICAgICBsZXQgcmVzdWx0RXJyb3IgICAgICAgID0gbnVsbDtcblxuICAgICAgICBpZiAoZXJyLmlzVGVzdENhZmVFcnJvciB8fCBpc1J1bnRpbWVFcnJvcihlcnIpKVxuICAgICAgICAgICAgcmVzdWx0RXJyb3IgPSBuZXcgVW5jYXVnaHRUZXN0Q2FmZUVycm9ySW5DdXN0b21TY3JpcHQoZXJyLCBleHByZXNzaW9uLCBsaW5lLCBjb2x1bW4sIGNhbGxzaXRlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzdWx0RXJyb3IgPSBuZXcgVW5jYXVnaHRFcnJvckluQ3VzdG9tU2NyaXB0KGVyciwgZXhwcmVzc2lvbiwgbGluZSwgY29sdW1uLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgaWYgKG9uQmVmb3JlUmFpc2luZ0Vycm9yKVxuICAgICAgICAgICAgYXdhaXQgb25CZWZvcmVSYWlzaW5nRXJyb3IocmVzdWx0RXJyb3IpO1xuXG4gICAgICAgIHRocm93IHJlc3VsdEVycm9yO1xuICAgIH1cbn1cbiJdfQ==