62 lines
2.2 KiB
JavaScript
62 lines
2.2 KiB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
/**
|
|
* Polyfill for the optional chain operator, `?.`, given previous conversion of the expression into an array of values,
|
|
* descriptors, and functions, for situations in which at least one part of the expression is async.
|
|
*
|
|
* Adapted from Sucrase (https://github.com/alangpierce/sucrase) See
|
|
* https://github.com/alangpierce/sucrase/blob/265887868966917f3b924ce38dfad01fbab1329f/src/transformers/OptionalChainingNullishTransformer.ts#L15
|
|
*
|
|
* @param ops Array result of expression conversion
|
|
* @returns The value of the expression
|
|
*/
|
|
async function _asyncOptionalChain(ops) {
|
|
let lastAccessLHS = undefined;
|
|
let value = ops[0];
|
|
let i = 1;
|
|
while (i < ops.length) {
|
|
const op = ops[i] ;
|
|
const fn = ops[i + 1] ;
|
|
i += 2;
|
|
// by checking for loose equality to `null`, we catch both `null` and `undefined`
|
|
if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {
|
|
// really we're meaning to return `undefined` as an actual value here, but it saves bytes not to write it
|
|
return;
|
|
}
|
|
if (op === 'access' || op === 'optionalAccess') {
|
|
lastAccessLHS = value;
|
|
value = await fn(value);
|
|
} else if (op === 'call' || op === 'optionalCall') {
|
|
value = await fn((...args) => (value ).call(lastAccessLHS, ...args));
|
|
lastAccessLHS = undefined;
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
|
|
// Sucrase version:
|
|
// async function _asyncOptionalChain(ops) {
|
|
// let lastAccessLHS = undefined;
|
|
// let value = ops[0];
|
|
// let i = 1;
|
|
// while (i < ops.length) {
|
|
// const op = ops[i];
|
|
// const fn = ops[i + 1];
|
|
// i += 2;
|
|
// if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {
|
|
// return undefined;
|
|
// }
|
|
// if (op === 'access' || op === 'optionalAccess') {
|
|
// lastAccessLHS = value;
|
|
// value = await fn(value);
|
|
// } else if (op === 'call' || op === 'optionalCall') {
|
|
// value = await fn((...args) => value.call(lastAccessLHS, ...args));
|
|
// lastAccessLHS = undefined;
|
|
// }
|
|
// }
|
|
// return value;
|
|
// }
|
|
|
|
exports._asyncOptionalChain = _asyncOptionalChain;
|
|
//# sourceMappingURL=_asyncOptionalChain.js.map
|