Skip to content

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

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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