Skip to content

tsc compile proposal-explicit-resource-management different from babel and swc #58234

@loynoir

Description

@loynoir

🔎 Search Terms

  • proposal-explicit-resource-management

  • using

  • babel

  • swc

🕗 Version & Regression Information

  • This is a crash
  • This changed between versions 5.4.5__ and _______
  • This changed in commit or PR _______
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about _________
  • I was unable to test this on prior versions because _______

⏯ Playground Link

No response

💻 Code

import { deepStrictEqual } from 'node:assert'
import process from 'node:process'

let i = 0
/** @type {any} */
let err
try {
  await using _x1 = {
    async [Symbol.asyncDispose]() {
      throw [1, ++i]
    }
  }

  await using _x2 = {
    async [Symbol.asyncDispose]() {
      throw [2, ++i]
    }
  }

  await using _x3 = {
    async [Symbol.asyncDispose]() {
      throw [3, ++i]
    }
  }

  await using _x4 = {
    async [Symbol.asyncDispose]() {
      throw [4, ++i]
    }
  }

  throw [5, ++i]
} catch (e) {
  err = e
}

switch (process.env['TRANSPILER']) {
  case 'tsc':
    deepStrictEqual(err.error, [1, 5])
    deepStrictEqual(err.suppressed.error, [2, 4])
    deepStrictEqual(err.suppressed.suppressed.error, [3, 3])
    deepStrictEqual(err.suppressed.suppressed.suppressed.error, [4, 2])
    deepStrictEqual(err.suppressed.suppressed.suppressed.suppressed, [5, 1])
    break
  case 'swc':
    deepStrictEqual(err.suppressed, [1, 5])
    deepStrictEqual(err.error.suppressed, [2, 4])
    deepStrictEqual(err.error.error.suppressed, [3, 3])
    deepStrictEqual(err.error.error.error.suppressed, [4, 2])
    deepStrictEqual(err.error.error.error.error, [5, 1])
    break
  case 'babel':
    deepStrictEqual(err.suppressed, [1, 5])
    deepStrictEqual(err.error.suppressed, [2, 4])
    deepStrictEqual(err.error.error.suppressed, [3, 3])
    deepStrictEqual(err.error.error.error.suppressed, [4, 2])
    deepStrictEqual(err.error.error.error.error, [5, 1])
    break
  default:
    // break
    throw new Error()
}

// export { err }
$ yarn tsc --version \
    && yarn swc --version \
    && yarn babel --version \
    && yarn tsc --build \
    && yarn swc ./reproduce.mjs -o ./swc/reproduce.mjs \
    && yarn babel --plugins @babel/plugin-proposal-explicit-resource-management ./reproduce.mjs -o ./babel/reproduce.mjs \
    && TRANSPILER=tsc node ./tsc/reproduce.mjs \
    && TRANSPILER=swc node ./swc/reproduce.mjs \
    && TRANSPILER=babel node ./babel/reproduce.mjs \
    && echo OK
+ yarn tsc --version
Version 5.4.5
+ yarn swc --version

@swc/cli: 0.3.12
@swc/core: 1.4.14

+ yarn babel --version
7.24.1 (@babel/core 7.24.4)
+ yarn tsc --build
+ yarn swc ./reproduce.mjs -o ./swc/reproduce.mjs
Successfully compiled 1 file with swc.
+ yarn babel --plugins @babel/plugin-proposal-explicit-resource-management ./reproduce.mjs -o ./babel/reproduce.mjs
+ TRANSPILER=tsc
+ node ./tsc/reproduce.mjs
+ TRANSPILER=swc
+ node ./swc/reproduce.mjs
+ TRANSPILER=babel
+ node ./babel/reproduce.mjs
+ echo OK
OK

🙁 Actual behavior

tsc and swc and babel does not have same runtime behavior.

🙂 Expected behavior

tsc and swc and babel have same runtime behavior.

Additional information about the issue

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions