Skip to content

Incorrect compilation of try-catch with async/await #423

@in19farkt

Description

@in19farkt

Current Behavior

My function

export async function getAccount(provider: Provider): Promise<string | null> {
  try {
    const accounts: string[] = await provider.send('eth_accounts'); // 1. provider.send returns undefined
    return accounts[0] || null; // 2. throw error 'Cannot read property '0' of undefined'
  } catch {
    warning('Some text'); // 3. log warning
  }

  return 'fallback account'; // 4. return 'fallback account'
}

compiled to

var getAccount = function getAccount(provider) {
  try {
    var _exit2 = false;

    var _temp2 = _catch(function () {
      return Promise.resolve(provider.send('eth_accounts')).then(function (accounts) { // 1. accounts === undefined
        _exit2 = true;
        return accounts[0] || null; // 2. throw error 'Cannot read property '0' of undefined'
      });
    }, function () {
      process.env.NODE_ENV !== "production" ? warning('Some text') : void 0; // 3. log warning
    });

    return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(function (_result) {
      return _exit2 ? _result : 'fallback account'; // 4. return undefined because _exit2 === true and _result === undefined
    }) : _exit2 ? _temp2 : 'fallback account');
  } catch (e) {
    return Promise.reject(e);
  }
};

Expected behavior

compiled to

var getAccount = function getAccount(provider) {
  try {
    var _exit2 = false;

    var _temp2 = _catch(function () {
      return Promise.resolve(provider.send('eth_accounts')).then(function (accounts) { // 1. accounts === undefined
-       _exit2 = true;
        return accounts[0] || null; // 2. throw error 'Cannot read property '0' of undefined'
+     }).then(function () {
+       _exit2 = true;
      });
    }, function () {
      process.env.NODE_ENV !== "production" ? warning('Some text') : void 0; // 3. log warning
    });

    return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(function (_result) {
-     return _exit2 ? _result : 'fallback account'; // 4. return undefined because _exit2 === true and _result === undefined
+     return _exit2 ? _result : 'fallback account'; // 4. return 'fallback account' because _exit2 === false
    }) : _exit2 ? _temp2 : 'fallback account');
  } catch (e) {
    return Promise.reject(e);
  }
};

Your environment

Software Version(s)
TSDX 0.12.0
TypeScript 3.7.2
npm/Yarn npm 6.12.0/yarn 1.21.1
Node v10.15.0
Operating System macOS Catalina 10.15.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind: bugSomething isn't workingscope: upstreamIssue in upstream dependencytopic: async-to-promisesRelated to bugs with babel-plugin-async-to-promises

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions