main
ts 74 lines 1.99 KB
Raw
1 /**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8 import {EvaluatorResult, doEval} from './evaluator';
9
10 export type SproutResult =
11 | {kind: 'success'; value: string}
12 | {kind: 'invalid'; value: string};
13
14 function stringify(result: EvaluatorResult): string {
15 return `(kind: ${result.kind}) ${result.value}${
16 result.logs.length > 0 ? `\nlogs: [${result.logs.toString()}]` : ''
17 }`;
18 }
19 function makeError(description: string, value: string): SproutResult {
20 return {
21 kind: 'invalid',
22 value: description + '\n' + value,
23 };
24 }
25 function logsEqual(a: Array<string>, b: Array<string>) {
26 if (a.length !== b.length) {
27 return false;
28 }
29 return a.every((val, idx) => val === b[idx]);
30 }
31 export function runSprout(
32 originalCode: string,
33 forgetCode: string,
34 ): SproutResult {
35 let forgetResult;
36 try {
37 (globalThis as any).__SNAP_EVALUATOR_MODE = 'forget';
38 forgetResult = doEval(forgetCode);
39 } catch (e) {
40 throw e;
41 } finally {
42 (globalThis as any).__SNAP_EVALUATOR_MODE = undefined;
43 }
44 if (forgetResult.kind === 'UnexpectedError') {
45 return makeError('Unexpected error in Forget runner', forgetResult.value);
46 }
47 if (originalCode.indexOf('@disableNonForgetInSprout') === -1) {
48 const nonForgetResult = doEval(originalCode);
49
50 if (nonForgetResult.kind === 'UnexpectedError') {
51 return makeError(
52 'Unexpected error in non-forget runner',
53 nonForgetResult.value,
54 );
55 } else if (
56 forgetResult.kind !== nonForgetResult.kind ||
57 forgetResult.value !== nonForgetResult.value ||
58 !logsEqual(forgetResult.logs, nonForgetResult.logs)
59 ) {
60 return makeError(
61 'Found differences in evaluator results',
62 `Non-forget (expected):
63 ${stringify(nonForgetResult)}
64 Forget:
65 ${stringify(forgetResult)}
66 `,
67 );
68 }
69 }
70 return {
71 kind: 'success',
72 value: stringify(forgetResult),
73 };
74 }