UNPKG

10.6 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const vm_1 = require("vm");
4const runtime_1 = require("../errors/runtime");
5const test_run_1 = require("../errors/test-run");
6const execution_context_1 = require("../api/test-controller/execution-context");
7const ERROR_LINE_COLUMN_REGEXP = /\[JS code\]:(\d+):(\d+)/;
8const ERROR_LINE_OFFSET = -1;
9// NOTE: do not beautify this code since offsets for error lines and columns are coded here
10function wrapInAsync(expression) {
11 return '(async function() {\n' +
12 expression + ';\n' +
13 '});';
14}
15function getErrorLineColumn(err) {
16 if (err.isTestCafeError) {
17 if (!err.callsite)
18 return {};
19 const stackFrames = err.callsite.stackFrames || [];
20 const frameIndex = err.callsite.callsiteFrameIdx;
21 const stackFrame = stackFrames[frameIndex];
22 return stackFrame ? {
23 line: stackFrame.getLineNumber(),
24 column: stackFrame.getColumnNumber()
25 } : {};
26 }
27 const result = err.stack && err.stack.match(ERROR_LINE_COLUMN_REGEXP);
28 if (!result)
29 return {};
30 const line = result[1] ? parseInt(result[1], 10) : void 0;
31 const column = result[2] ? parseInt(result[2], 10) : void 0;
32 return { line, column };
33}
34function createErrorFormattingOptions() {
35 return {
36 filename: '[JS code]',
37 lineOffset: ERROR_LINE_OFFSET
38 };
39}
40function getExecutionContext(testController, options = {}) {
41 const context = testController.getExecutionContext();
42 // TODO: Find a way to avoid this assignment
43 execution_context_1.setContextOptions(context, options);
44 return context;
45}
46function isRuntimeError(err) {
47 return err instanceof runtime_1.GeneralError ||
48 err instanceof runtime_1.TestCompilationError ||
49 err instanceof runtime_1.APIError ||
50 err instanceof runtime_1.CompositeError;
51}
52function executeJsExpression(expression, testRun, options) {
53 const context = getExecutionContext(testRun.controller, options);
54 const errorOptions = createErrorFormattingOptions();
55 return vm_1.runInContext(expression, context, errorOptions);
56}
57exports.executeJsExpression = executeJsExpression;
58async function executeAsyncJsExpression(expression, testRun, callsite) {
59 if (!expression || !expression.length)
60 return Promise.resolve();
61 const context = getExecutionContext(testRun.controller);
62 const errorOptions = createErrorFormattingOptions(expression);
63 try {
64 return await vm_1.runInContext(wrapInAsync(expression), context, errorOptions)();
65 }
66 catch (err) {
67 const { line, column } = getErrorLineColumn(err);
68 if (err.isTestCafeError || isRuntimeError(err))
69 throw new test_run_1.UncaughtTestCafeErrorInCustomScript(err, expression, line, column, callsite);
70 throw new test_run_1.UncaughtErrorInCustomScript(err, expression, line, column, callsite);
71 }
72}
73exports.executeAsyncJsExpression = executeAsyncJsExpression;
74//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS1qcy1leHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QtcnVuL2V4ZWN1dGUtanMtZXhwcmVzc2lvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJCQUFrQztBQUNsQywrQ0FLMkI7QUFDM0IsaURBQXNHO0FBQ3RHLGdGQUE2RTtBQUU3RSxNQUFNLHdCQUF3QixHQUFHLHlCQUF5QixDQUFDO0FBQzNELE1BQU0saUJBQWlCLEdBQVUsQ0FBQyxDQUFDLENBQUM7QUFFcEMsMkZBQTJGO0FBQzNGLFNBQVMsV0FBVyxDQUFFLFVBQVU7SUFDNUIsT0FBTyx1QkFBdUI7UUFDdkIsVUFBVSxHQUFHLEtBQUs7UUFDbEIsS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFFLEdBQUc7SUFDNUIsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUTtZQUNiLE9BQU8sRUFBRSxDQUFDO1FBRWQsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQ25ELE1BQU0sVUFBVSxHQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7UUFDbEQsTUFBTSxVQUFVLEdBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTVDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUksVUFBVSxDQUFDLGFBQWEsRUFBRTtZQUNsQyxNQUFNLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRTtTQUN2QyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDVjtJQUVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUV0RSxJQUFJLENBQUMsTUFBTTtRQUNQLE9BQU8sRUFBRSxDQUFDO0lBRWQsTUFBTSxJQUFJLEdBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsNEJBQTRCO0lBQ2pDLE9BQU87UUFDSCxRQUFRLEVBQUksV0FBVztRQUN2QixVQUFVLEVBQUUsaUJBQWlCO0tBQ2hDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBRSxjQUFjLEVBQUUsT0FBTyxHQUFHLEVBQUU7SUFDdEQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFFckQsNENBQTRDO0lBQzVDLHFDQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVwQyxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUUsR0FBRztJQUN4QixPQUFPLEdBQUcsWUFBWSxzQkFBWTtRQUMzQixHQUFHLFlBQVksOEJBQW9CO1FBQ25DLEdBQUcsWUFBWSxrQkFBUTtRQUN2QixHQUFHLFlBQVksd0JBQWMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPO0lBQzdELE1BQU0sT0FBTyxHQUFRLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLEVBQUUsQ0FBQztJQUVwRCxPQUFPLGlCQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBTEQsa0RBS0M7QUFFTSxLQUFLLFVBQVUsd0JBQXdCLENBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3pFLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtRQUNqQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUU3QixNQUFNLE9BQU8sR0FBUSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0QsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFOUQsSUFBSTtRQUNBLE9BQU8sTUFBTSxpQkFBWSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztLQUMvRTtJQUNELE9BQU8sR0FBRyxFQUFFO1FBQ1IsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqRCxJQUFJLEdBQUcsQ0FBQyxlQUFlLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxNQUFNLElBQUksOENBQW1DLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTNGLE1BQU0sSUFBSSxzQ0FBMkIsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDbEY7QUFDTCxDQUFDO0FBbEJELDREQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJ1bkluQ29udGV4dCB9IGZyb20gJ3ZtJztcbmltcG9ydCB7XG4gICAgR2VuZXJhbEVycm9yLFxuICAgIFRlc3RDb21waWxhdGlvbkVycm9yLFxuICAgIEFQSUVycm9yLFxuICAgIENvbXBvc2l0ZUVycm9yXG59IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFVuY2F1Z2h0RXJyb3JJbkN1c3RvbVNjcmlwdCwgVW5jYXVnaHRUZXN0Q2FmZUVycm9ySW5DdXN0b21TY3JpcHQgfSBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4nO1xuaW1wb3J0IHsgc2V0Q29udGV4dE9wdGlvbnMgfSBmcm9tICcuLi9hcGkvdGVzdC1jb250cm9sbGVyL2V4ZWN1dGlvbi1jb250ZXh0JztcblxuY29uc3QgRVJST1JfTElORV9DT0xVTU5fUkVHRVhQID0gL1xcW0pTIGNvZGVcXF06KFxcZCspOihcXGQrKS87XG5jb25zdCBFUlJPUl9MSU5FX09GRlNFVCAgICAgICAgPSAtMTtcblxuLy8gTk9URTogZG8gbm90IGJlYXV0aWZ5IHRoaXMgY29kZSBzaW5jZSBvZmZzZXRzIGZvciBlcnJvciBsaW5lcyBhbmQgY29sdW1ucyBhcmUgY29kZWQgaGVyZVxuZnVuY3Rpb24gd3JhcEluQXN5bmMgKGV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gJyhhc3luYyBmdW5jdGlvbigpIHtcXG4nICtcbiAgICAgICAgICAgZXhwcmVzc2lvbiArICc7XFxuJyArXG4gICAgICAgICAgICd9KTsnO1xufVxuXG5mdW5jdGlvbiBnZXRFcnJvckxpbmVDb2x1bW4gKGVycikge1xuICAgIGlmIChlcnIuaXNUZXN0Q2FmZUVycm9yKSB7XG4gICAgICAgIGlmICghZXJyLmNhbGxzaXRlKVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuXG4gICAgICAgIGNvbnN0IHN0YWNrRnJhbWVzID0gZXJyLmNhbGxzaXRlLnN0YWNrRnJhbWVzIHx8IFtdO1xuICAgICAgICBjb25zdCBmcmFtZUluZGV4ICA9IGVyci5jYWxsc2l0ZS5jYWxsc2l0ZUZyYW1lSWR4O1xuICAgICAgICBjb25zdCBzdGFja0ZyYW1lICA9IHN0YWNrRnJhbWVzW2ZyYW1lSW5kZXhdO1xuXG4gICAgICAgIHJldHVybiBzdGFja0ZyYW1lID8ge1xuICAgICAgICAgICAgbGluZTogICBzdGFja0ZyYW1lLmdldExpbmVOdW1iZXIoKSxcbiAgICAgICAgICAgIGNvbHVtbjogc3RhY2tGcmFtZS5nZXRDb2x1bW5OdW1iZXIoKVxuICAgICAgICB9IDoge307XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gZXJyLnN0YWNrICYmIGVyci5zdGFjay5tYXRjaChFUlJPUl9MSU5FX0NPTFVNTl9SRUdFWFApO1xuXG4gICAgaWYgKCFyZXN1bHQpXG4gICAgICAgIHJldHVybiB7fTtcblxuICAgIGNvbnN0IGxpbmUgICA9IHJlc3VsdFsxXSA/IHBhcnNlSW50KHJlc3VsdFsxXSwgMTApIDogdm9pZCAwO1xuICAgIGNvbnN0IGNvbHVtbiA9IHJlc3VsdFsyXSA/IHBhcnNlSW50KHJlc3VsdFsyXSwgMTApIDogdm9pZCAwO1xuXG4gICAgcmV0dXJuIHsgbGluZSwgY29sdW1uIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yRm9ybWF0dGluZ09wdGlvbnMgKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVuYW1lOiAgICdbSlMgY29kZV0nLFxuICAgICAgICBsaW5lT2Zmc2V0OiBFUlJPUl9MSU5FX09GRlNFVFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldEV4ZWN1dGlvbkNvbnRleHQgKHRlc3RDb250cm9sbGVyLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGVzdENvbnRyb2xsZXIuZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byBhdm9pZCB0aGlzIGFzc2lnbm1lbnRcbiAgICBzZXRDb250ZXh0T3B0aW9ucyhjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBpc1J1bnRpbWVFcnJvciAoZXJyKSB7XG4gICAgcmV0dXJuIGVyciBpbnN0YW5jZW9mIEdlbmVyYWxFcnJvciB8fFxuICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBUZXN0Q29tcGlsYXRpb25FcnJvciB8fFxuICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBBUElFcnJvciB8fFxuICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBDb21wb3NpdGVFcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVKc0V4cHJlc3Npb24gKGV4cHJlc3Npb24sIHRlc3RSdW4sIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250ZXh0ICAgICAgPSBnZXRFeGVjdXRpb25Db250ZXh0KHRlc3RSdW4uY29udHJvbGxlciwgb3B0aW9ucyk7XG4gICAgY29uc3QgZXJyb3JPcHRpb25zID0gY3JlYXRlRXJyb3JGb3JtYXR0aW5nT3B0aW9ucygpO1xuXG4gICAgcmV0dXJuIHJ1bkluQ29udGV4dChleHByZXNzaW9uLCBjb250ZXh0LCBlcnJvck9wdGlvbnMpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uIChleHByZXNzaW9uLCB0ZXN0UnVuLCBjYWxsc2l0ZSkge1xuICAgIGlmICghZXhwcmVzc2lvbiB8fCAhZXhwcmVzc2lvbi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIGNvbnN0IGNvbnRleHQgICAgICA9IGdldEV4ZWN1dGlvbkNvbnRleHQodGVzdFJ1bi5jb250cm9sbGVyKTtcbiAgICBjb25zdCBlcnJvck9wdGlvbnMgPSBjcmVhdGVFcnJvckZvcm1hdHRpbmdPcHRpb25zKGV4cHJlc3Npb24pO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bkluQ29udGV4dCh3cmFwSW5Bc3luYyhleHByZXNzaW9uKSwgY29udGV4dCwgZXJyb3JPcHRpb25zKSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IHsgbGluZSwgY29sdW1uIH0gPSBnZXRFcnJvckxpbmVDb2x1bW4oZXJyKTtcblxuICAgICAgICBpZiAoZXJyLmlzVGVzdENhZmVFcnJvciB8fCBpc1J1bnRpbWVFcnJvcihlcnIpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuY2F1Z2h0VGVzdENhZmVFcnJvckluQ3VzdG9tU2NyaXB0KGVyciwgZXhwcmVzc2lvbiwgbGluZSwgY29sdW1uLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgdGhyb3cgbmV3IFVuY2F1Z2h0RXJyb3JJbkN1c3RvbVNjcmlwdChlcnIsIGV4cHJlc3Npb24sIGxpbmUsIGNvbHVtbiwgY2FsbHNpdGUpO1xuICAgIH1cbn1cbiJdfQ==
\No newline at end of file