1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const vm_1 = require("vm");
|
4 | const runtime_1 = require("../errors/runtime");
|
5 | const test_run_1 = require("../errors/test-run");
|
6 | const execution_context_1 = require("../api/test-controller/execution-context");
|
7 | const ERROR_LINE_COLUMN_REGEXP = /\[JS code\]:(\d+):(\d+)/;
|
8 | const ERROR_LINE_OFFSET = -1;
|
9 | // NOTE: do not beautify this code since offsets for error lines and columns are coded here
|
10 | function wrapInAsync(expression) {
|
11 | return '(async function() {\n' +
|
12 | expression + ';\n' +
|
13 | '});';
|
14 | }
|
15 | function 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 | }
|
34 | function createErrorFormattingOptions() {
|
35 | return {
|
36 | filename: '[JS code]',
|
37 | lineOffset: ERROR_LINE_OFFSET
|
38 | };
|
39 | }
|
40 | function 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 | }
|
46 | function 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 | }
|
52 | function executeJsExpression(expression, testRun, options) {
|
53 | const context = getExecutionContext(testRun.controller, options);
|
54 | const errorOptions = createErrorFormattingOptions();
|
55 | return vm_1.runInContext(expression, context, errorOptions);
|
56 | }
|
57 | exports.executeJsExpression = executeJsExpression;
|
58 | async 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 | }
|
73 | exports.executeAsyncJsExpression = executeAsyncJsExpression;
|
74 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS1qcy1leHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QtcnVuL2V4ZWN1dGUtanMtZXhwcmVzc2lvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJCQUFrQztBQUNsQywrQ0FLMkI7QUFDM0IsaURBQXNHO0FBQ3RHLGdGQUE2RTtBQUU3RSxNQUFNLHdCQUF3QixHQUFHLHlCQUF5QixDQUFDO0FBQzNELE1BQU0saUJBQWlCLEdBQVUsQ0FBQyxDQUFDLENBQUM7QUFFcEMsMkZBQTJGO0FBQzNGLFNBQVMsV0FBVyxDQUFFLFVBQVU7SUFDNUIsT0FBTyx1QkFBdUI7UUFDdkIsVUFBVSxHQUFHLEtBQUs7UUFDbEIsS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFFLEdBQUc7SUFDNUIsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUTtZQUNiLE9BQU8sRUFBRSxDQUFDO1FBRWQsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQ25ELE1BQU0sVUFBVSxHQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7UUFDbEQsTUFBTSxVQUFVLEdBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTVDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUksVUFBVSxDQUFDLGFBQWEsRUFBRTtZQUNsQyxNQUFNLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRTtTQUN2QyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDVjtJQUVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUV0RSxJQUFJLENBQUMsTUFBTTtRQUNQLE9BQU8sRUFBRSxDQUFDO0lBRWQsTUFBTSxJQUFJLEdBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsNEJBQTRCO0lBQ2pDLE9BQU87UUFDSCxRQUFRLEVBQUksV0FBVztRQUN2QixVQUFVLEVBQUUsaUJBQWlCO0tBQ2hDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBRSxjQUFjLEVBQUUsT0FBTyxHQUFHLEVBQUU7SUFDdEQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFFckQsNENBQTRDO0lBQzVDLHFDQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVwQyxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUUsR0FBRztJQUN4QixPQUFPLEdBQUcsWUFBWSxzQkFBWTtRQUMzQixHQUFHLFlBQVksOEJBQW9CO1FBQ25DLEdBQUcsWUFBWSxrQkFBUTtRQUN2QixHQUFHLFlBQVksd0JBQWMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPO0lBQzdELE1BQU0sT0FBTyxHQUFRLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLEVBQUUsQ0FBQztJQUVwRCxPQUFPLGlCQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBTEQsa0RBS0M7QUFFTSxLQUFLLFVBQVUsd0JBQXdCLENBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3pFLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtRQUNqQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUU3QixNQUFNLE9BQU8sR0FBUSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0QsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFOUQsSUFBSTtRQUNBLE9BQU8sTUFBTSxpQkFBWSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztLQUMvRTtJQUNELE9BQU8sR0FBRyxFQUFFO1FBQ1IsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqRCxJQUFJLEdBQUcsQ0FBQyxlQUFlLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxNQUFNLElBQUksOENBQW1DLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTNGLE1BQU0sSUFBSSxzQ0FBMkIsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDbEY7QUFDTCxDQUFDO0FBbEJELDREQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJ1bkluQ29udGV4dCB9IGZyb20gJ3ZtJztcbmltcG9ydCB7XG4gICAgR2VuZXJhbEVycm9yLFxuICAgIFRlc3RDb21waWxhdGlvbkVycm9yLFxuICAgIEFQSUVycm9yLFxuICAgIENvbXBvc2l0ZUVycm9yXG59IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFVuY2F1Z2h0RXJyb3JJbkN1c3RvbVNjcmlwdCwgVW5jYXVnaHRUZXN0Q2FmZUVycm9ySW5DdXN0b21TY3JpcHQgfSBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4nO1xuaW1wb3J0IHsgc2V0Q29udGV4dE9wdGlvbnMgfSBmcm9tICcuLi9hcGkvdGVzdC1jb250cm9sbGVyL2V4ZWN1dGlvbi1jb250ZXh0JztcblxuY29uc3QgRVJST1JfTElORV9DT0xVTU5fUkVHRVhQID0gL1xcW0pTIGNvZGVcXF06KFxcZCspOihcXGQrKS87XG5jb25zdCBFUlJPUl9MSU5FX09GRlNFVCAgICAgICAgPSAtMTtcblxuLy8gTk9URTogZG8gbm90IGJlYXV0aWZ5IHRoaXMgY29kZSBzaW5jZSBvZmZzZXRzIGZvciBlcnJvciBsaW5lcyBhbmQgY29sdW1ucyBhcmUgY29kZWQgaGVyZVxuZnVuY3Rpb24gd3JhcEluQXN5bmMgKGV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gJyhhc3luYyBmdW5jdGlvbigpIHtcXG4nICtcbiAgICAgICAgICAgZXhwcmVzc2lvbiArICc7XFxuJyArXG4gICAgICAgICAgICd9KTsnO1xufVxuXG5mdW5jdGlvbiBnZXRFcnJvckxpbmVDb2x1bW4gKGVycikge1xuICAgIGlmIChlcnIuaXNUZXN0Q2FmZUVycm9yKSB7XG4gICAgICAgIGlmICghZXJyLmNhbGxzaXRlKVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuXG4gICAgICAgIGNvbnN0IHN0YWNrRnJhbWVzID0gZXJyLmNhbGxzaXRlLnN0YWNrRnJhbWVzIHx8IFtdO1xuICAgICAgICBjb25zdCBmcmFtZUluZGV4ICA9IGVyci5jYWxsc2l0ZS5jYWxsc2l0ZUZyYW1lSWR4O1xuICAgICAgICBjb25zdCBzdGFja0ZyYW1lICA9IHN0YWNrRnJhbWVzW2ZyYW1lSW5kZXhdO1xuXG4gICAgICAgIHJldHVybiBzdGFja0ZyYW1lID8ge1xuICAgICAgICAgICAgbGluZTogICBzdGFja0ZyYW1lLmdldExpbmVOdW1iZXIoKSxcbiAgICAgICAgICAgIGNvbHVtbjogc3RhY2tGcmFtZS5nZXRDb2x1bW5OdW1iZXIoKVxuICAgICAgICB9IDoge307XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gZXJyLnN0YWNrICYmIGVyci5zdGFjay5tYXRjaChFUlJPUl9MSU5FX0NPTFVNTl9SRUdFWFApO1xuXG4gICAgaWYgKCFyZXN1bHQpXG4gICAgICAgIHJldHVybiB7fTtcblxuICAgIGNvbnN0IGxpbmUgICA9IHJlc3VsdFsxXSA/IHBhcnNlSW50KHJlc3VsdFsxXSwgMTApIDogdm9pZCAwO1xuICAgIGNvbnN0IGNvbHVtbiA9IHJlc3VsdFsyXSA/IHBhcnNlSW50KHJlc3VsdFsyXSwgMTApIDogdm9pZCAwO1xuXG4gICAgcmV0dXJuIHsgbGluZSwgY29sdW1uIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yRm9ybWF0dGluZ09wdGlvbnMgKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVuYW1lOiAgICdbSlMgY29kZV0nLFxuICAgICAgICBsaW5lT2Zmc2V0OiBFUlJPUl9MSU5FX09GRlNFVFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldEV4ZWN1dGlvbkNvbnRleHQgKHRlc3RDb250cm9sbGVyLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGVzdENvbnRyb2xsZXIuZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byBhdm9pZCB0aGlzIGFzc2lnbm1lbnRcbiAgICBzZXRDb250ZXh0T3B0aW9ucyhjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBpc1J1bnRpbWVFcnJvciAoZXJyKSB7XG4gICAgcmV0dXJuIGVyciBpbnN0YW5jZW9mIEdlbmVyYWxFcnJvciB8fFxuICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBUZXN0Q29tcGlsYXRpb25FcnJvciB8fFxuICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBBUElFcnJvciB8fFxuICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBDb21wb3NpdGVFcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVKc0V4cHJlc3Npb24gKGV4cHJlc3Npb24sIHRlc3RSdW4sIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250ZXh0ICAgICAgPSBnZXRFeGVjdXRpb25Db250ZXh0KHRlc3RSdW4uY29udHJvbGxlciwgb3B0aW9ucyk7XG4gICAgY29uc3QgZXJyb3JPcHRpb25zID0gY3JlYXRlRXJyb3JGb3JtYXR0aW5nT3B0aW9ucygpO1xuXG4gICAgcmV0dXJuIHJ1bkluQ29udGV4dChleHByZXNzaW9uLCBjb250ZXh0LCBlcnJvck9wdGlvbnMpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uIChleHByZXNzaW9uLCB0ZXN0UnVuLCBjYWxsc2l0ZSkge1xuICAgIGlmICghZXhwcmVzc2lvbiB8fCAhZXhwcmVzc2lvbi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIGNvbnN0IGNvbnRleHQgICAgICA9IGdldEV4ZWN1dGlvbkNvbnRleHQodGVzdFJ1bi5jb250cm9sbGVyKTtcbiAgICBjb25zdCBlcnJvck9wdGlvbnMgPSBjcmVhdGVFcnJvckZvcm1hdHRpbmdPcHRpb25zKGV4cHJlc3Npb24pO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bkluQ29udGV4dCh3cmFwSW5Bc3luYyhleHByZXNzaW9uKSwgY29udGV4dCwgZXJyb3JPcHRpb25zKSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IHsgbGluZSwgY29sdW1uIH0gPSBnZXRFcnJvckxpbmVDb2x1bW4oZXJyKTtcblxuICAgICAgICBpZiAoZXJyLmlzVGVzdENhZmVFcnJvciB8fCBpc1J1bnRpbWVFcnJvcihlcnIpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuY2F1Z2h0VGVzdENhZmVFcnJvckluQ3VzdG9tU2NyaXB0KGVyciwgZXhwcmVzc2lvbiwgbGluZSwgY29sdW1uLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgdGhyb3cgbmV3IFVuY2F1Z2h0RXJyb3JJbkN1c3RvbVNjcmlwdChlcnIsIGV4cHJlc3Npb24sIGxpbmUsIGNvbHVtbiwgY2FsbHNpdGUpO1xuICAgIH1cbn1cbiJdfQ== |
\ | No newline at end of file |