1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- /**
- * 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;
- // }
- export { _asyncOptionalChain };
- //# sourceMappingURL=_asyncOptionalChain.js.map
|