@mondaydotcomorg/atp-compiler
Version:
Production-ready compiler for transforming async iteration patterns into resumable operations with checkpoint-based state management
88 lines • 3.96 kB
JavaScript
import * as t from '@babel/types';
/**
* Wrap batch result with post-processing for filter()
* Filter must return filtered ITEMS, not boolean results
*/
export function wrapFilterResult(batchCall, array, methodId) {
const resultsVar = `__filter_results_${methodId}`;
const indexVar = `__i_${methodId}`;
const arrayClone = t.cloneNode(array, true);
return t.awaitExpression(t.callExpression(t.arrowFunctionExpression([], t.blockStatement([
t.variableDeclaration('const', [
t.variableDeclarator(t.identifier(resultsVar), batchCall.argument),
]),
t.returnStatement(t.callExpression(t.memberExpression(arrayClone, t.identifier('filter')), [
t.arrowFunctionExpression([t.identifier('_'), t.identifier(indexVar)], t.callExpression(t.identifier('Boolean'), [
t.memberExpression(t.identifier(resultsVar), t.identifier(indexVar), true),
])),
])),
]), true), []));
}
/**
* Wrap batch result with post-processing for find()
* Find must return first matching ITEM (not boolean)
*/
export function wrapFindResult(batchCall, array, methodId) {
const resultsVar = `__find_results_${methodId}`;
const arrayClone = t.cloneNode(array, true);
return t.awaitExpression(t.callExpression(t.arrowFunctionExpression([], t.blockStatement([
t.variableDeclaration('const', [
t.variableDeclarator(t.identifier(resultsVar), batchCall.argument),
]),
t.returnStatement(t.callExpression(t.memberExpression(arrayClone, t.identifier('find')), [
t.arrowFunctionExpression([t.identifier('_'), t.identifier('__i')], t.callExpression(t.identifier('Boolean'), [
t.memberExpression(t.identifier(resultsVar), t.identifier('__i'), true),
])),
])),
]), true), []));
}
/**
* Wrap batch result with post-processing for some()
* Some must return boolean: true if ANY result is truthy
*/
export function wrapSomeResult(batchCall, methodId) {
const resultsVar = `__some_results_${methodId}`;
return t.awaitExpression(t.callExpression(t.arrowFunctionExpression([], t.blockStatement([
t.variableDeclaration('const', [
t.variableDeclarator(t.identifier(resultsVar), batchCall.argument),
]),
t.returnStatement(t.callExpression(t.memberExpression(t.identifier(resultsVar), t.identifier('some')), [
t.arrowFunctionExpression([t.identifier('r')], t.callExpression(t.identifier('Boolean'), [t.identifier('r')])),
])),
]), true), []));
}
/**
* Wrap batch result with post-processing for every()
* Every must return boolean: true if ALL results are truthy
*/
export function wrapEveryResult(batchCall, methodId) {
const resultsVar = `__every_results_${methodId}`;
return t.awaitExpression(t.callExpression(t.arrowFunctionExpression([], t.blockStatement([
t.variableDeclaration('const', [
t.variableDeclarator(t.identifier(resultsVar), batchCall.argument),
]),
t.returnStatement(t.callExpression(t.memberExpression(t.identifier(resultsVar), t.identifier('every')), [
t.arrowFunctionExpression([t.identifier('r')], t.callExpression(t.identifier('Boolean'), [t.identifier('r')])),
])),
]), true), []));
}
/**
* Wrap batch result if method needs post-processing
*/
export function wrapBatchResultIfNeeded(batchCall, methodName, array, methodId) {
switch (methodName) {
case 'filter':
return wrapFilterResult(batchCall, array, methodId);
case 'find':
return wrapFindResult(batchCall, array, methodId);
case 'some':
return wrapSomeResult(batchCall, methodId);
case 'every':
return wrapEveryResult(batchCall, methodId);
case 'forEach':
return batchCall;
default:
return batchCall;
}
}
//# sourceMappingURL=array-transformer-wrappers.js.map