diff --git a/crates/oxc_transformer/src/es2022/class_properties/class.rs b/crates/oxc_transformer/src/es2022/class_properties/class.rs index d262fefa15e2c1..200882221e12b1 100644 --- a/crates/oxc_transformer/src/es2022/class_properties/class.rs +++ b/crates/oxc_transformer/src/es2022/class_properties/class.rs @@ -12,14 +12,14 @@ use oxc_traverse::{BoundIdentifier, TraverseCtx}; use crate::common::helper_loader::Helper; -use super::super::ClassStaticBlock; +use super::{super::ClassStaticBlock, ClassBindings}; use super::{ private_props::{PrivateProp, PrivateProps}, utils::{ create_assignment, create_underscore_ident_name, create_variable_declaration, exprs_into_stmts, }, - ClassName, ClassProperties, FxIndexMap, + ClassProperties, FxIndexMap, }; impl<'a, 'ctx> ClassProperties<'a, 'ctx> { @@ -58,10 +58,6 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { return 0; } - self.class_name = ClassName::Name(match &class.id { - Some(id) => id.name.as_str(), - None => "Class", - }); self.is_declaration = false; self.transform_class(class, ctx); @@ -104,10 +100,7 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { // TODO: Deduct static private props from `expr_count`. // Or maybe should store count and increment it when create private static props? // They're probably pretty rare, so it'll be rarely used. - expr_count += match &self.class_name { - ClassName::Binding(_) => 2, - ClassName::Name(_) => 1, - }; + expr_count += 1 + usize::from(self.class_bindings.temp.is_some()); let mut exprs = ctx.ast.vec_with_capacity(expr_count); @@ -141,7 +134,12 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { // Insert class + static property assignments + static blocks let class_expr = ctx.ast.move_expression(expr); - if let ClassName::Binding(binding) = &self.class_name { + if let Some(binding) = &self.class_bindings.temp { + // Insert `var _Class` statement, if it wasn't already in `transform_class` + if !self.temp_var_is_created { + self.ctx.var_declarations.insert_var(binding, None, ctx); + } + // `_Class = class {}` let assignment = create_assignment(binding, class_expr, ctx); exprs.push(assignment); @@ -179,10 +177,6 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { return; } - // Class declarations are always named, except for `export default class {}`, which is handled separately - let ident = class.id.as_ref().unwrap(); - self.class_name = ClassName::Binding(BoundIdentifier::from_binding_ident(ident)); - self.transform_class_declaration_impl(class, stmt_address, ctx); } @@ -190,29 +184,14 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { /// /// Separate function as this is only circumstance where have to deal with anonymous class declaration, /// and it's an uncommon case (can only be 1 per file). + // TODO: This method is now defunct. Can just have 1 `transform_class_declaration` function. pub(super) fn transform_class_export_default( &mut self, class: &mut Class<'a>, stmt_address: Address, ctx: &mut TraverseCtx<'a>, ) { - // Class declarations as default export may not have a name - self.class_name = match class.id.as_ref() { - Some(ident) => ClassName::Binding(BoundIdentifier::from_binding_ident(ident)), - None => ClassName::Name("Class"), - }; - self.transform_class_declaration_impl(class, stmt_address, ctx); - - // If class was unnamed `export default class {}`, and a binding is required, set its name. - // e.g. `export default class { static x = 1; }` -> `export default class _Class {}; _Class.x = 1;` - // TODO(improve-on-babel): Could avoid this if treated `export default class {}` as a class expression - // instead of a class declaration. - if class.id.is_none() { - if let ClassName::Binding(binding) = &self.class_name { - class.id = Some(binding.create_binding_identifier(ctx)); - } - } } fn transform_class_declaration_impl( @@ -227,6 +206,30 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { // TODO: Run other transforms on inserted statements. How? + if let Some(temp_binding) = &self.class_bindings.temp { + // Binding for class name is required + if let Some(ident) = &class.id { + // Insert `var _Class` statement, if it wasn't already in `transform_class` + if !self.temp_var_is_created { + self.ctx.var_declarations.insert_var(temp_binding, None, ctx); + } + + // Insert `_Class = Class` after class. + // TODO(improve-on-babel): Could just insert `var _Class = Class;` after class, + // rather than separate `var _Class` declaration. + let class_name = + BoundIdentifier::from_binding_ident(ident).create_read_expression(ctx); + let expr = create_assignment(temp_binding, class_name, ctx); + let stmt = ctx.ast.statement_expression(SPAN, expr); + self.insert_after_stmts.insert(0, stmt); + } else { + // Class must be default export `export default class {}`, as all other class declarations + // always have a name. Set class name. + *ctx.symbols_mut().get_flags_mut(temp_binding.symbol_id) = SymbolFlags::Class; + class.id = Some(temp_binding.create_binding_identifier(ctx)); + } + } + // Insert expressions before/after class if !self.insert_before.is_empty() { self.ctx.statement_injector.insert_many_before( @@ -343,24 +346,48 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { return; } - // Create temp var if class has any static props - if has_static_prop { - // TODO(improve-on-babel): Even though private static properties may not access - // class name, Babel still creates a temp var for class. That's unnecessary. - self.initialize_class_name_binding(ctx); - } + // Initialize class binding vars. + // Static prop in class expression or anonymous `export default class {}` always require + // temp var for class. Static prop in class declaration doesn't. + let mut class_name_binding = class.id.as_ref().map(BoundIdentifier::from_binding_ident); + + let need_temp_var = has_static_prop && (!self.is_declaration || class.id.is_none()); + self.temp_var_is_created = need_temp_var; + + let class_temp_binding = if need_temp_var { + let temp_binding = ClassBindings::create_temp_binding(class_name_binding.as_ref(), ctx); + if self.is_declaration { + // Anonymous `export default class {}`. Set class name binding to temp var. + // Actual class name will be set to this later. + class_name_binding = Some(temp_binding.clone()); + } else { + // Create temp var `var _Class;` statement. + // TODO(improve-on-babel): Inserting the temp var `var _Class` statement here is only + // to match Babel's output. It'd be simpler just to insert it at the end and get rid of + // `temp_var_is_created` that tracks whether it's done already or not. + self.ctx.var_declarations.insert_var(&temp_binding, None, ctx); + } + Some(temp_binding) + } else { + None + }; + + self.class_bindings = ClassBindings::new(class_name_binding, class_temp_binding); // Add entry to `private_props_stack` if private_props.is_empty() { self.private_props_stack.push(None); } else { - let class_binding = match &self.class_name { - ClassName::Binding(binding) => Some(binding.clone()), - ClassName::Name(_) => None, - }; + // `class_bindings.temp` in the `PrivateProps` entry is the temp var (if one has been created). + // Private fields in static prop initializers use the temp var in the transpiled output + // e.g. `_assertClassBrand(_Class, obj, _prop)`. + // At end of this function, if it's a class declaration, we set `class_bindings.temp` to be + // the binding for the class name, for when the class body is visited, because in the class + // body, private fields use the class name + // e.g. `_assertClassBrand(Class, obj, _prop)` (note `Class` not `_Class`). self.private_props_stack.push(Some(PrivateProps { props: private_props, - class_binding, + class_bindings: self.class_bindings.clone(), is_declaration: self.is_declaration, })); } @@ -407,6 +434,29 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { Self::insert_constructor(class, instance_inits, ctx); } } + + // Update class bindings prior to traversing class body and insertion of statements/expressions + // before/after the class. See comments on `ClassBindings`. + if let Some(private_props) = self.private_props_stack.last_mut() { + // Transfer state of `temp` binding from `private_props_stack` to `self`. + // A temp binding may have been created while transpiling private fields in + // static prop initializers. + // TODO: Do this where `class_bindings.temp` is consumed instead? + if let Some(temp_binding) = &private_props.class_bindings.temp { + self.class_bindings.temp = Some(temp_binding.clone()); + } + + // Static private fields reference class name (not temp var) in class declarations. + // `class Class { static #prop; method() { return obj.#prop; } }` + // -> `method() { return _assertClassBrand(Class, obj, _prop)._; }` + // (note `Class` in `_assertClassBrand(Class, ...)`, not `_Class`) + // So set "temp" binding to actual class name while visiting class body. + // Note: If declaration is `export default class {}` with no name, and class has static props, + // then class has had name binding created already above. So name binding is always `Some`. + if self.is_declaration { + private_props.class_bindings.temp = private_props.class_bindings.name.clone(); + } + } } /// Pop from private props stack. @@ -467,33 +517,21 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { self.insert_private_static_init_assignment(ident, value, ctx); } else { // Convert to assignment or `_defineProperty` call, depending on `loose` option - let ClassName::Binding(class_binding) = &self.class_name else { - // Binding is initialized in 1st pass in `transform_class` when a static prop is found - unreachable!(); + let class_binding = if self.is_declaration { + // Class declarations always have a name except `export default class {}`. + // For default export, binding is created when static prop found in 1st pass. + self.class_bindings.name.as_ref().unwrap() + } else { + // Binding is created when static prop found in 1st pass. + self.class_bindings.temp.as_ref().unwrap() }; + let assignee = class_binding.create_read_expression(ctx); let init_expr = self.create_init_assignment(prop, value, assignee, true, ctx); self.insert_expr_after_class(init_expr, ctx); } } - /// Create a binding for class name, if there isn't one already. - fn initialize_class_name_binding(&mut self, ctx: &mut TraverseCtx<'a>) -> &BoundIdentifier<'a> { - if let ClassName::Name(name) = &self.class_name { - let binding = if self.is_declaration { - ctx.generate_uid_in_current_scope(name, SymbolFlags::Class) - } else { - let flags = SymbolFlags::FunctionScopedVariable; - let binding = ctx.generate_uid_in_current_scope(name, flags); - self.ctx.var_declarations.insert_var(&binding, None, ctx); - binding - }; - self.class_name = ClassName::Binding(binding); - } - let ClassName::Binding(binding) = &self.class_name else { unreachable!() }; - binding - } - /// `assignee.foo = value` or `_defineProperty(assignee, "foo", value)` fn create_init_assignment( &mut self, diff --git a/crates/oxc_transformer/src/es2022/class_properties/class_bindings.rs b/crates/oxc_transformer/src/es2022/class_properties/class_bindings.rs new file mode 100644 index 00000000000000..5a5ba632bcc11b --- /dev/null +++ b/crates/oxc_transformer/src/es2022/class_properties/class_bindings.rs @@ -0,0 +1,103 @@ +use oxc_syntax::symbol::{SymbolFlags, SymbolId}; +use oxc_traverse::{BoundIdentifier, TraverseCtx}; + +/// Store for bindings for class. +/// +/// 1. Existing binding for class name (if class has a name). +/// 2. Temp var `_Class`, which may or may not be required. +/// +/// Temp var is required in the following circumstances: +/// * Class expression has static properties. +/// e.g. `C = class { x = 1; }` +/// * Class declaration has static properties and one of the static prop's initializers contains: +/// a. `this` +/// e.g. `class C { x = this; }` +/// b. Reference to class name +/// e.g. `class C { x = C; }` +/// c. A private field referring to one of the class's static private props. +/// e.g. `class C { static #x; static y = obj.#x; }` +/// +/// An instance of `ClassBindings` is stored in main `ClassProperties` transform, and a 2nd is stored +/// in `PrivateProps` for the class, if the class has any private properties. +/// If the class has private props, the instance of `ClassBindings` in `PrivateProps` is the source +/// of truth. +/// +/// The logic for when transpiled private fields use a reference to class name or class temp var +/// is unfortunately rather complicated. +/// +/// Transpiled private fields referring to a static private prop use: +/// * Class name when field is within class body and class has a name +/// e.g. `class C { static #x; method() { return obj.#x; } }` +/// * Temp var when field is within class body and class has no name +/// e.g. `C = class { static #x; method() { return obj.#x; } }` +/// * Temp var when field is within a static prop initializer. +/// e.g. `class C { static #x; y = obj.#x; }` +/// +/// To cover all these cases, the meaning of `temp` binding here changes while traversing the class body. +/// [`ClassProperties::transform_class`] sets `temp` binding to be a copy of the `name` binding before +/// that traversal begins. So the name `temp` is misleading at that point. +/// +/// Debug assertions are used to make sure this complex logic is correct. +/// +/// [`ClassProperties::transform_class`]: super::ClassProperties::transform_class +#[derive(Default, Clone)] +pub(super) struct ClassBindings<'a> { + /// Binding for class name, if class has name + pub name: Option>, + /// Temp var for class. + /// e.g. `_Class` in `_Class = class {}, _Class.x = 1, _Class` + pub temp: Option>, + /// `true` if currently transforming static property initializers. + /// Only used in debug builds to check logic is correct. + #[cfg(debug_assertions)] + pub currently_transforming_static_property_initializers: bool, +} + +impl<'a> ClassBindings<'a> { + /// Create `ClassBindings`. + pub fn new( + name_binding: Option>, + temp_binding: Option>, + ) -> Self { + Self { + name: name_binding, + temp: temp_binding, + #[cfg(debug_assertions)] + currently_transforming_static_property_initializers: false, + } + } + + /// Get `SymbolId` of name binding. + pub fn name_symbol_id(&self) -> Option { + self.name.as_ref().map(|binding| binding.symbol_id) + } + + /// Create a binding for temp var, if there isn't one already. + pub fn get_or_init_temp_binding(&mut self, ctx: &mut TraverseCtx<'a>) -> &BoundIdentifier<'a> { + if self.temp.is_none() { + // This should only be possible if we are currently transforming static prop initializers + #[cfg(debug_assertions)] + { + assert!( + self.currently_transforming_static_property_initializers, + "Should be unreachable" + ); + } + + self.temp = Some(Self::create_temp_binding(self.name.as_ref(), ctx)); + } + self.temp.as_ref().unwrap() + } + + /// Generate a binding for temp var. + pub fn create_temp_binding( + name_binding: Option<&BoundIdentifier<'a>>, + ctx: &mut TraverseCtx<'a>, + ) -> BoundIdentifier<'a> { + // Base temp binding name on class name, or "Class" if no name. + // TODO(improve-on-babel): If class name var isn't mutated, no need for temp var for + // class declaration. Can just use class binding. + let name = name_binding.map_or("Class", |binding| binding.name.as_str()); + ctx.generate_uid_in_current_scope(name, SymbolFlags::FunctionScopedVariable) + } +} diff --git a/crates/oxc_transformer/src/es2022/class_properties/mod.rs b/crates/oxc_transformer/src/es2022/class_properties/mod.rs index 64c8195ca351d1..0f30009ef6c85d 100644 --- a/crates/oxc_transformer/src/es2022/class_properties/mod.rs +++ b/crates/oxc_transformer/src/es2022/class_properties/mod.rs @@ -125,12 +125,13 @@ //! //! Implementation is split into several files: //! -//! * `mod.rs`: Setup, visitor, and ancillary types. +//! * `mod.rs`: Setup and visitor. //! * `class.rs`: Transform of class body. //! * `constructor.rs`: Insertion of property initializers into class constructor. //! * `private.rs`: Transform of private property usages (`this.#prop`). //! * `private_props.rs`: Structures storing details of private properties. //! * `static_prop.rs`: Transform of static property initializers. +//! * `class_bindings.rs`: Structure containing bindings for class name and temp var. //! * `utils.rs`: Utility functions. //! //! ## References @@ -148,16 +149,18 @@ use serde::Deserialize; use oxc_allocator::{Address, GetAddress}; use oxc_ast::ast::*; use oxc_data_structures::stack::NonEmptyStack; -use oxc_traverse::{BoundIdentifier, Traverse, TraverseCtx}; +use oxc_traverse::{Traverse, TraverseCtx}; use crate::TransformCtx; mod class; +mod class_bindings; mod constructor; mod private; mod private_props; mod static_prop; mod utils; +use class_bindings::ClassBindings; use private_props::PrivatePropsStack; type FxIndexMap = IndexMap; @@ -205,10 +208,10 @@ pub struct ClassProperties<'a, 'ctx> { // /// `true` for class declaration, `false` for class expression is_declaration: bool, - /// Var for class. - /// e.g. `X` in `class X {}`. - /// e.g. `_Class` in `_Class = class {}, _Class.x = 1, _Class` - class_name: ClassName<'a>, + /// Bindings for class name and temp var for class + class_bindings: ClassBindings<'a>, + /// `true` if temp var for class has been inserted + temp_var_is_created: bool, /// Expressions to insert before class insert_before: Vec>, /// Expressions to insert after class expression @@ -217,15 +220,6 @@ pub struct ClassProperties<'a, 'ctx> { insert_after_stmts: Vec>, } -/// Representation of binding for class name. -enum ClassName<'a> { - /// Class has a name. This is the binding. - Binding(BoundIdentifier<'a>), - /// Class is anonymous. - /// This is the name it would have if we need to set class name, in order to reference it. - Name(&'a str), -} - impl<'a, 'ctx> ClassProperties<'a, 'ctx> { pub fn new( options: ClassPropertiesOptions, @@ -244,7 +238,8 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { class_expression_addresses_stack: NonEmptyStack::new(Address::DUMMY), // Temporary values - overwritten when entering class is_declaration: false, - class_name: ClassName::Name(""), + class_bindings: ClassBindings::default(), + temp_var_is_created: false, // `Vec`s and `FxHashMap`s which are reused for every class being transformed insert_before: vec![], insert_after_exprs: vec![], diff --git a/crates/oxc_transformer/src/es2022/class_properties/private.rs b/crates/oxc_transformer/src/es2022/class_properties/private.rs index 1410323f46a4af..b1941f92b62a30 100644 --- a/crates/oxc_transformer/src/es2022/class_properties/private.rs +++ b/crates/oxc_transformer/src/es2022/class_properties/private.rs @@ -48,7 +48,7 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { let Some(prop_details) = prop_details else { return Expression::PrivateFieldExpression(field_expr); }; - let ResolvedPrivateProp { prop_binding, class_binding, is_static, is_declaration } = + let ResolvedPrivateProp { prop_binding, class_bindings, is_static, is_declaration } = prop_details; let prop_ident = prop_binding.create_read_expression(ctx); @@ -57,20 +57,25 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { if is_static { // TODO: Ensure there are tests for nested classes with references to private static props - // of outer class inside inner class, to make sure we're getting the right `class_binding`. - let class_binding = class_binding.unwrap(); + // of outer class inside inner class, to make sure we're getting the right `class_bindings`. // If `object` is reference to class name, there's no need for the class brand assertion - if let Some(reference_id) = - Self::shortcut_static_class(is_declaration, class_binding.symbol_id, &object, ctx) - { + if let Some((class_symbol_id, object_reference_id)) = Self::shortcut_static_class( + is_declaration, + class_bindings.name_symbol_id(), + &object, + ctx, + ) { // `_prop._` - ctx.symbols_mut().delete_resolved_reference(class_binding.symbol_id, reference_id); + ctx.symbols_mut().delete_resolved_reference(class_symbol_id, object_reference_id); Self::create_underscore_member_expression(prop_ident, span, ctx) } else { // `_assertClassBrand(Class, object, _prop)._` + let class_binding = class_bindings.get_or_init_temp_binding(ctx); + let class_ident = class_binding.create_read_expression(ctx); + self.create_assert_class_brand_underscore( - class_binding.create_read_expression(ctx), + class_ident, object, prop_ident, span, @@ -85,25 +90,29 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { /// Check if can use shorter version of static private prop transform. /// - /// Can if both: + /// Can if all of: /// 1. Class is a declaration, not an expression. - /// 2. `object` is an `IdentifierReference` referring to class name binding. + /// 2. Class has a name. + /// 3. `object` is an `IdentifierReference` referring to class name binding. /// - /// If can use shorter version, returns `ReferenceId` of the `IdentifierReference`. + /// If can use shorter version, returns `SymbolId` and `ReferenceId` of the `IdentifierReference`. // // TODO(improve-on-babel): No reason not to use the short version for class expressions too. + // TODO: Take `&ClassBindings` instead of `Option`. fn shortcut_static_class( is_declaration: bool, - class_symbol_id: SymbolId, + class_symbol_id: Option, object: &Expression<'a>, ctx: &mut TraverseCtx<'a>, - ) -> Option { + ) -> Option<(SymbolId, ReferenceId)> { if is_declaration { - if let Expression::Identifier(ident) = object { - let reference_id = ident.reference_id(); - if let Some(symbol_id) = ctx.symbols().get_reference(reference_id).symbol_id() { - if symbol_id == class_symbol_id { - return Some(reference_id); + if let Some(class_symbol_id) = class_symbol_id { + if let Expression::Identifier(ident) = object { + let reference_id = ident.reference_id(); + if let Some(symbol_id) = ctx.symbols().get_reference(reference_id).symbol_id() { + if symbol_id == class_symbol_id { + return Some((class_symbol_id, reference_id)); + } } } } @@ -185,7 +194,7 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { ctx: &mut TraverseCtx<'a>, ) -> Option<(Expression<'a>, Expression<'a>)> { // TODO: Should never be `None` - only because implementation is incomplete. - let ResolvedPrivateProp { prop_binding, class_binding, is_static, is_declaration } = + let ResolvedPrivateProp { prop_binding, class_bindings, is_static, is_declaration } = self.private_props_stack.find(&field_expr.field)?; let prop_ident = prop_binding.create_read_expression(ctx); @@ -195,26 +204,33 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { let replacement = if is_static { // `object.#prop(arg)` -> `_assertClassBrand(Class, object, _prop)._.call(object, arg)` // or shortcut `_prop._.call(object, arg)` - let class_binding = class_binding.unwrap(); - let class_ident = class_binding.create_read_expression(ctx); + + // TODO: Ensure there are tests for nested classes with references to private static props + // of outer class inside inner class, to make sure we're getting the right `class_bindings`. // If `object` is reference to class name, there's no need for the class brand assertion // TODO: Combine this check with `duplicate_object`. Both check if `object` is an identifier, // and look up the `SymbolId` - if Self::shortcut_static_class(is_declaration, class_binding.symbol_id, &object, ctx) - .is_some() + if Self::shortcut_static_class( + is_declaration, + class_bindings.name_symbol_id(), + &object, + ctx, + ) + .is_some() { // `_prop._` let callee = Self::create_underscore_member_expression(prop_ident, field_expr.span, ctx); (callee, object) } else { + let class_binding = class_bindings.get_or_init_temp_binding(ctx); + let class_ident = class_binding.create_read_expression(ctx); + // Make 2 copies of `object` let (object1, object2) = self.duplicate_object(object, ctx); // `_assertClassBrand(Class, object, _prop)._` - // TODO: Ensure there are tests for nested classes with references to private static props - // of outer class inside inner class, to make sure we're getting the right `class_binding`. let assert_obj = self.create_assert_class_brand_underscore( class_ident, object1, @@ -268,7 +284,7 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { let prop_details = self.private_props_stack.find(&field_expr.field); // TODO: Should never be `None` - only because implementation is incomplete. let Some(prop_details) = prop_details else { return }; - let ResolvedPrivateProp { prop_binding, class_binding, is_static, is_declaration } = + let ResolvedPrivateProp { prop_binding, class_bindings, is_static, is_declaration } = prop_details; // Note: `transform_static_assignment_expression` and `transform_instance_assignment_expression` @@ -279,11 +295,24 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { let prop_binding = prop_binding.clone(); if is_static { - let class_binding = class_binding.unwrap().clone(); + // TODO: No temp var is required if able to use shortcut version, so want to skip calling + // `class_bindings.get_or_init_temp_binding(ctx)` if shortcut can be used. + // But can't pass `class_bindings` as a `&mut ClassBinding` into + // `transform_static_assignment_expression` due to borrow-checker restrictions. + // If clone it, then any update to `temp` field is not stored globally, so that doesn't work. + // Solution will have to be to break up `transform_static_assignment_expression` into 2 methods + // for shortcut/no shortcut and do the "can we shortcut?" check here. + // Then only create temp var for the "no shortcut" branch, and clone the resulting binding + // before passing it to the "no shortcut" method. What a palaver! + let class_binding = class_bindings.get_or_init_temp_binding(ctx); + let class_binding = class_binding.clone(); + let class_symbol_id = class_bindings.name_symbol_id(); + self.transform_static_assignment_expression( expr, prop_binding, class_binding, + class_symbol_id, is_declaration, ctx, ); @@ -314,6 +343,7 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { expr: &mut Expression<'a>, prop_binding: BoundIdentifier<'a>, class_binding: BoundIdentifier<'a>, + class_symbol_id: Option, is_declaration: bool, ctx: &mut TraverseCtx<'a>, ) { @@ -326,12 +356,8 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { // Check if object (`object` in `object.#prop`) is a reference to class name // TODO: Combine this check with `duplicate_object`. Both check if `object` is an identifier, // and look up the `SymbolId`. - let object_reference_id = Self::shortcut_static_class( - is_declaration, - class_binding.symbol_id, - &field_expr.object, - ctx, - ); + let object_reference = + Self::shortcut_static_class(is_declaration, class_symbol_id, &field_expr.object, ctx); // If `object` is reference to class name, there's no need for the class brand assertion. // `Class.#prop = value` -> `_prop._ = value` @@ -339,7 +365,7 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { // `Class.#prop &&= value` -> `_prop._ && (_prop._ = 1)` // TODO(improve-on-babel): These shortcuts could be shorter - just swap `Class.#prop` for `_prop._`. // Or does that behave slightly differently if `Class.#prop` is an object with `valueOf` method? - if let Some(reference_id) = object_reference_id { + if let Some((class_symbol_id, object_reference_id)) = object_reference { // Replace left side of assignment with `_prop._` let field_expr_span = field_expr.span; assign_expr.left = Self::create_underscore_member_expr_target( @@ -349,7 +375,7 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { ); // Delete reference for `object` as `object.#prop` has been removed - ctx.symbols_mut().delete_resolved_reference(class_binding.symbol_id, reference_id); + ctx.symbols_mut().delete_resolved_reference(class_symbol_id, object_reference_id); if operator == AssignmentOperator::Assign { // `Class.#prop = value` -> `_prop._ = value` @@ -619,7 +645,7 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { let prop_details = self.private_props_stack.find(&field_expr.field); // TODO: Should never be `None` - only because implementation is incomplete. let Some(prop_details) = prop_details else { return }; - let ResolvedPrivateProp { prop_binding, class_binding, is_static, is_declaration } = + let ResolvedPrivateProp { prop_binding, class_bindings, is_static, is_declaration } = prop_details; let prop_ident = prop_binding.create_read_expression(ctx); @@ -649,36 +675,45 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { // (_object$prop = _assertClassBrand(Class, object, _prop)._, ++_object$prop) // ) // ``` - let class_binding = class_binding.unwrap().clone(); // Check if object (`object` in `object.#prop`) is a reference to class name // TODO: Combine this check with `duplicate_object`. Both check if `object` is an identifier, // and look up the `SymbolId`. - let object_reference_id = - Self::shortcut_static_class(is_declaration, class_binding.symbol_id, &object, ctx); + let object_reference = Self::shortcut_static_class( + is_declaration, + class_bindings.name_symbol_id(), + &object, + ctx, + ); // `_assertClassBrand(Class, object, _prop)._` or `_prop._` - let (get_expr, object) = if let Some(reference_id) = object_reference_id { + let (get_expr, object, class_ident) = if let Some(object_reference) = object_reference { // Delete reference for `object` as `object.#prop` is being removed - ctx.symbols_mut().delete_resolved_reference(class_binding.symbol_id, reference_id); + let (class_symbol_id, object_reference_id) = object_reference; + ctx.symbols_mut().delete_resolved_reference(class_symbol_id, object_reference_id); // `_prop._` let get_expr = Self::create_underscore_member_expression(prop_ident, SPAN, ctx); - (get_expr, object) + (get_expr, object, None) } else { + let class_binding = class_bindings.get_or_init_temp_binding(ctx); + let class_ident = class_binding.create_read_expression(ctx); + let class_ident2 = class_binding.create_read_expression(ctx); + // Make 2 copies of `object` let (object1, object2) = self.duplicate_object(object, ctx); // `_assertClassBrand(Class, object, _prop)._` let get_call = self.create_assert_class_brand_underscore( - class_binding.create_read_expression(ctx), + class_ident, object2, prop_ident, SPAN, ctx, ); - (get_call, object1) + (get_call, object1, Some(class_ident2)) }; + // `_object$prop = _assertClassBrand(Class, object, _prop)._` self.ctx.var_declarations.insert_var(&temp_binding, None, ctx); let assignment = create_assignment(&temp_binding, get_expr, ctx); @@ -697,9 +732,8 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { .ast .expression_sequence(SPAN, ctx.ast.vec_from_array([assignment, update_expr])); - // `_assertClassBrand(Class, object, )` - if object_reference_id.is_none() { - let class_ident = class_binding.create_read_expression(ctx); + // If no shortcut, wrap in `_assertClassBrand(Class, object, )` + if let Some(class_ident) = class_ident { value = self.create_assert_class_brand(class_ident, object, value, ctx); } @@ -731,9 +765,8 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { ]), ); - // `_assertClassBrand(Class, object, )` - if object_reference_id.is_none() { - let class_ident = class_binding.create_read_expression(ctx); + // If no shortcut, wrap in `_assertClassBrand(Class, object, )` + if let Some(class_ident) = class_ident { value = self.create_assert_class_brand(class_ident, object, value, ctx); } diff --git a/crates/oxc_transformer/src/es2022/class_properties/private_props.rs b/crates/oxc_transformer/src/es2022/class_properties/private_props.rs index bb263f7359de5f..27548bc7703e6f 100644 --- a/crates/oxc_transformer/src/es2022/class_properties/private_props.rs +++ b/crates/oxc_transformer/src/es2022/class_properties/private_props.rs @@ -3,7 +3,7 @@ use oxc_data_structures::stack::SparseStack; use oxc_span::Atom; use oxc_traverse::BoundIdentifier; -use super::FxIndexMap; +use super::{class_bindings::ClassBindings, FxIndexMap}; /// Stack of private props defined by classes. /// @@ -36,23 +36,22 @@ impl<'a> PrivatePropsStack<'a> { } #[inline] - #[expect(dead_code)] pub fn last_mut(&mut self) -> Option<&mut PrivateProps<'a>> { self.stack.last_mut() } /// Lookup details of private property referred to by `ident`. pub fn find<'b>( - &'b self, + &'b mut self, ident: &PrivateIdentifier<'a>, ) -> Option> { // Check for binding in closest class first, then enclosing classes // TODO: Check there are tests for bindings in enclosing classes. - for private_props in self.stack.as_slice().iter().rev() { + for private_props in self.stack.as_mut_slice().iter_mut().rev() { if let Some(prop) = private_props.props.get(&ident.name) { return Some(ResolvedPrivateProp { prop_binding: &prop.binding, - class_binding: private_props.class_binding.as_ref(), + class_bindings: &mut private_props.class_bindings, is_static: prop.is_static, is_declaration: private_props.is_declaration, }); @@ -68,8 +67,8 @@ pub(super) struct PrivateProps<'a> { /// Private properties for class. Indexed by property name. // TODO(improve-on-babel): Order that temp vars are created in is not important. Use `FxHashMap` instead. pub props: FxIndexMap, PrivateProp<'a>>, - /// Binding for class, if class has name - pub class_binding: Option>, + /// Bindings for class name and temp var for class + pub class_bindings: ClassBindings<'a>, /// `true` for class declaration, `false` for class expression pub is_declaration: bool, } @@ -86,8 +85,8 @@ pub(super) struct PrivateProp<'a> { pub(super) struct ResolvedPrivateProp<'a, 'b> { /// Binding for temp var representing the property pub prop_binding: &'b BoundIdentifier<'a>, - /// Binding for class (if it has one) - pub class_binding: Option<&'b BoundIdentifier<'a>>, + /// Bindings for class name and temp var for class + pub class_bindings: &'b mut ClassBindings<'a>, /// `true` if is a static property pub is_static: bool, /// `true` if class which defines this property is a class declaration diff --git a/crates/oxc_transformer/src/es2022/class_properties/static_prop.rs b/crates/oxc_transformer/src/es2022/class_properties/static_prop.rs index f53f1243bbbe60..61d0a06308e39a 100644 --- a/crates/oxc_transformer/src/es2022/class_properties/static_prop.rs +++ b/crates/oxc_transformer/src/es2022/class_properties/static_prop.rs @@ -6,9 +6,9 @@ use oxc_ast::{ visit::{walk_mut, VisitMut}, }; use oxc_syntax::scope::ScopeFlags; -use oxc_traverse::{BoundIdentifier, TraverseCtx}; +use oxc_traverse::TraverseCtx; -use super::{ClassName, ClassProperties}; +use super::ClassProperties; impl<'a, 'ctx> ClassProperties<'a, 'ctx> { /// Transform any `this` in static property initializer to reference to class name, @@ -18,32 +18,59 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { value: &mut Expression<'a>, ctx: &mut TraverseCtx<'a>, ) { - // TODO: Insert temp var if class binding is mutated. + // TODO: Replace references to class name with temp var - let ClassName::Binding(class_binding) = &self.class_name else { - // Binding is initialized in 1st pass in `transform_class` when a static prop is found - unreachable!(); - }; - // Unfortunately have to clone, because also pass `&mut self` to `StaticInitializerVisitor::new` - let class_binding = class_binding.clone(); + self.set_is_transforming_static_property_initializers(true); - let mut replacer = StaticInitializerVisitor::new(class_binding, self, ctx); + let mut replacer = StaticInitializerVisitor::new(self, ctx); replacer.visit_expression(value); + + self.set_is_transforming_static_property_initializers(false); + } + + /// Set flag on `ClassBindings` that we are/are not currently transforming static prop initializers. + /// + /// The logic around which bindings are used for transforming private fields is complex, + /// so we use this to make sure the logic is correct. + /// + /// In debug builds, `ClassBindings::get_or_init_temp_binding` will panic if we end up transforming + /// a static private field, and there's no `temp` binding - which should be impossible. + #[inline(always)] // `#[inline(always)]` because is no-op in release builds + #[expect(clippy::inline_always)] + #[cfg_attr(not(debug_assertions), expect(unused_variables))] + fn set_is_transforming_static_property_initializers(&mut self, is_it: bool) { + #[cfg(debug_assertions)] + { + self.class_bindings.currently_transforming_static_property_initializers = is_it; + if let Some(private_props) = self.private_props_stack.last_mut() { + private_props.class_bindings.currently_transforming_static_property_initializers = + is_it; + } + } } } /// Visitor to transform: /// -/// 1. `this` to class name. -/// `class C { static x = this.y; }` -> `class C {}; C.x = C.y;` +/// 1. `this` to class temp var. +/// * Class declaration: `class C { static x = this.y; }` +/// -> `var _C; class C {}; _C = C; C.x = _C.y;` +/// * Class expression: `x = class C { static x = this.y; }` +/// -> `var _C; x = (_C = class C {}, _C.x = _C.y)` /// 2. Private fields which refer to private props of this class. -/// `class C { static #x = 123; static.#y = this.#x; }` -/// -> `class C {}; var _x = { _: 123 }; _defineProperty(C, "y", _assertClassBrand(C, C, _x)._);` +/// * Class declaration: `class C { static #x = 123; static y = this.#x; }` +/// -> `var _C; class C {}; _C = C; var _x = { _: 123 }; C.y = _assertClassBrand(_C, _C, _x)._;` +/// * Class expression: `x = class C { static #x = 123; static y = this.#x; }` +/// -> `var _C, _x; x = (_C = class C {}, _x = { _: 123 }, _C.y = _assertClassBrand(_C, _C, _x)._), _C)` /// /// Reason we need to do this is because the initializer is being moved from inside the class to outside. /// `this` outside the class refers to a different `this`, and private fields are only valid within the /// class body. So we need to transform them. /// +/// Note that for class declarations, assignments are made to properties of original class name `C`, +/// but temp var `_C` is used in replacements for `this` and private fields. This is because class binding +/// `C` can be mutated, and the initializer may contain functions which are not executed immediately. +/// /// If this class defines no private properties, we only need to transform `this`, so can skip traversing /// into functions and other contexts which have their own `this`. /// @@ -52,8 +79,6 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { // // TODO: Also re-parent child scopes. struct StaticInitializerVisitor<'a, 'ctx, 'v> { - /// Binding for class (temp var). - class_binding: BoundIdentifier<'a>, /// `true` if class has private properties. class_has_private_props: bool, /// Incremented when entering a different `this` context, decremented when exiting it. @@ -67,12 +92,10 @@ struct StaticInitializerVisitor<'a, 'ctx, 'v> { impl<'a, 'ctx, 'v> StaticInitializerVisitor<'a, 'ctx, 'v> { fn new( - class_binding: BoundIdentifier<'a>, class_properties: &'v mut ClassProperties<'a, 'ctx>, ctx: &'v mut TraverseCtx<'a>, ) -> Self { Self { - class_binding, class_has_private_props: class_properties.private_props_stack.last().is_some(), this_depth: 0, class_properties, @@ -82,6 +105,30 @@ impl<'a, 'ctx, 'v> StaticInitializerVisitor<'a, 'ctx, 'v> { } impl<'a, 'ctx, 'v> VisitMut<'a> for StaticInitializerVisitor<'a, 'ctx, 'v> { + // TODO: Also need to call class visitors so private props stack is in correct state. + // Otherwise, in this example, `#x` in `getInnerX` is resolved incorrectly + // and `getInnerX()` will return 1 instead of 2. + // We have to visit the inner class now rather than later after exiting outer class so that + // `#y` in `getOuterY` resolves correctly too. + // ```js + // class Outer { + // #x = 1; + // #y = 1; + // static inner = class Inner { + // #x = 2; + // getInnerX() { + // return this.#x; // Should equal 2 + // } + // getOuterY() { + // return this.#y; // Should equal 1 + // } + // }; + // } + // ``` + // + // Need to save all per-class state (`insert_before` etc), and restore it again after. + // Using a stack would be overkill because nested classes in static blocks will be rare. + #[inline] fn visit_expression(&mut self, expr: &mut Expression<'a>) { match expr { @@ -219,7 +266,16 @@ impl<'a, 'ctx, 'v> StaticInitializerVisitor<'a, 'ctx, 'v> { /// Replace `this` with reference to class name binding. fn replace_this_with_class_name(&mut self, expr: &mut Expression<'a>, span: Span) { if self.this_depth == 0 { - *expr = self.class_binding.create_spanned_read_expression(span, self.ctx); + // `PrivateProps` is the source of truth for bindings if class has private props + // because other visitors which transform private fields may create a temp binding + // and store it on `PrivateProps` + let class_bindings = match self.class_properties.private_props_stack.last_mut() { + Some(private_props) => &mut private_props.class_bindings, + None => &mut self.class_properties.class_bindings, + }; + + let class_binding = class_bindings.get_or_init_temp_binding(self.ctx); + *expr = class_binding.create_spanned_read_expression(span, self.ctx); } } diff --git a/tasks/transform_conformance/snapshots/babel.snap.md b/tasks/transform_conformance/snapshots/babel.snap.md index 74acfeb5c1fb5d..42c73b5851e9ba 100644 --- a/tasks/transform_conformance/snapshots/babel.snap.md +++ b/tasks/transform_conformance/snapshots/babel.snap.md @@ -351,7 +351,18 @@ x Output mismatch x Output mismatch * assumption-setPublicClassFields/static-this/input.js -x Output mismatch +Scope children mismatch: +after transform: ScopeId(0): [ScopeId(1)] +rebuilt : ScopeId(0): [ScopeId(1), ScopeId(2)] +Scope children mismatch: +after transform: ScopeId(1): [ScopeId(2)] +rebuilt : ScopeId(1): [] +Scope flags mismatch: +after transform: ScopeId(2): ScopeFlags(StrictMode | Function | Arrow) +rebuilt : ScopeId(2): ScopeFlags(Function | Arrow) +Scope parent mismatch: +after transform: ScopeId(2): Some(ScopeId(1)) +rebuilt : ScopeId(2): Some(ScopeId(0)) * assumption-setPublicClassFields/super-expression/input.js x Output mismatch @@ -536,9 +547,6 @@ rebuilt : ScopeId(3): ScopeFlags(Function) Scope parent mismatch: after transform: ScopeId(2): Some(ScopeId(1)) rebuilt : ScopeId(3): Some(ScopeId(0)) -Symbol reference IDs mismatch for "Foo": -after transform: SymbolId(0): [ReferenceId(1), ReferenceId(4)] -rebuilt : SymbolId(0): [ReferenceId(1)] * private/static-class-binding/input.js x Output mismatch @@ -553,7 +561,18 @@ x Output mismatch x Output mismatch * private/static-this/input.js -x Output mismatch +Scope children mismatch: +after transform: ScopeId(0): [ScopeId(1)] +rebuilt : ScopeId(0): [ScopeId(1), ScopeId(2)] +Scope children mismatch: +after transform: ScopeId(1): [ScopeId(2)] +rebuilt : ScopeId(1): [] +Scope flags mismatch: +after transform: ScopeId(2): ScopeFlags(StrictMode | Function | Arrow) +rebuilt : ScopeId(2): ScopeFlags(Function | Arrow) +Scope parent mismatch: +after transform: ScopeId(2): Some(ScopeId(1)) +rebuilt : ScopeId(2): Some(ScopeId(0)) * private/super-expression/input.js x Output mismatch @@ -853,7 +872,18 @@ x Output mismatch x Output mismatch * public/static-this/input.js -x Output mismatch +Scope children mismatch: +after transform: ScopeId(0): [ScopeId(1)] +rebuilt : ScopeId(0): [ScopeId(1), ScopeId(2)] +Scope children mismatch: +after transform: ScopeId(1): [ScopeId(2)] +rebuilt : ScopeId(1): [] +Scope flags mismatch: +after transform: ScopeId(2): ScopeFlags(StrictMode | Function | Arrow) +rebuilt : ScopeId(2): ScopeFlags(Function | Arrow) +Scope parent mismatch: +after transform: ScopeId(2): Some(ScopeId(1)) +rebuilt : ScopeId(2): Some(ScopeId(0)) * public/super-expression/input.js x Output mismatch @@ -915,7 +945,18 @@ x Output mismatch x Output mismatch * public-loose/static-this/input.js -x Output mismatch +Scope children mismatch: +after transform: ScopeId(0): [ScopeId(1)] +rebuilt : ScopeId(0): [ScopeId(1), ScopeId(2)] +Scope children mismatch: +after transform: ScopeId(1): [ScopeId(2)] +rebuilt : ScopeId(1): [] +Scope flags mismatch: +after transform: ScopeId(2): ScopeFlags(StrictMode | Function | Arrow) +rebuilt : ScopeId(2): ScopeFlags(Function | Arrow) +Scope parent mismatch: +after transform: ScopeId(2): Some(ScopeId(1)) +rebuilt : ScopeId(2): Some(ScopeId(0)) * public-loose/super-expression/input.js x Output mismatch diff --git a/tasks/transform_conformance/snapshots/babel_exec.snap.md b/tasks/transform_conformance/snapshots/babel_exec.snap.md index 4f7ec59506d6be..6957c070f27cfd 100644 --- a/tasks/transform_conformance/snapshots/babel_exec.snap.md +++ b/tasks/transform_conformance/snapshots/babel_exec.snap.md @@ -11,11 +11,11 @@ Error: 'eval' and 'arguments' cannot be used as a binding identifier in strict m ❯ ssrTransformScript ../../node_modules/.pnpm/vite@5.4.11_@types+node@22.9.1/node_modules/vite/dist/node/chunks/dep-CB_7IfJ-.js:52381:11 ❯ loadAndTransform ../../node_modules/.pnpm/vite@5.4.11_@types+node@22.9.1/node_modules/vite/dist/node/chunks/dep-CB_7IfJ-.js:51979:72 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noUninitializedPrivateFieldAccess-static-private-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noUninitializedPrivateFieldAccess-static-private-exec.test.js ] SyntaxError: Private field '#x' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-super-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-super-exec.test.js ] FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-delete-super-property-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-delete-super-property-exec.test.js ] @@ -28,7 +28,7 @@ Error: Invalid access to super ❯ ssrTransformScript ../../node_modules/.pnpm/vite@5.4.11_@types+node@22.9.1/node_modules/vite/dist/node/chunks/dep-CB_7IfJ-.js:52381:11 ❯ loadAndTransform ../../node_modules/.pnpm/vite@5.4.11_@types+node@22.9.1/node_modules/vite/dist/node/chunks/dep-CB_7IfJ-.js:51979:72 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-nested-class-super-property-in-accessor-key-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-nested-class-super-property-in-accessor-key-exec.test.js ] Error: Unexpected token `[`. Expected * for generator, private key, identifier or async @@ -38,148 +38,148 @@ Error: Unexpected token `[`. Expected * for generator, private key, identifier o ❯ ssrTransformScript ../../node_modules/.pnpm/vite@5.4.11_@types+node@22.9.1/node_modules/vite/dist/node/chunks/dep-CB_7IfJ-.js:52381:11 ❯ loadAndTransform ../../node_modules/.pnpm/vite@5.4.11_@types+node@22.9.1/node_modules/vite/dist/node/chunks/dep-CB_7IfJ-.js:51979:72 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-access-before-declaration-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-access-before-declaration-exec.test.js ] SyntaxError: Private field '#p' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-1-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-1-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-2-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-2-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-3-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-3-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-static-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-array-pattern-static-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-1-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-1-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-2-exec-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-2-exec-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-3-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-3-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-static-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-destructuring-object-pattern-static-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-access-before-declaration-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-access-before-declaration-exec.test.js ] SyntaxError: Private field '#p' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-1-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-1-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-2-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-2-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-3-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-3-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-static-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-array-pattern-static-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-1-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-1-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-2-exec-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-2-exec-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-3-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-3-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-static-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-destructuring-object-pattern-static-exec.test.js ] SyntaxError: Private field '#client' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-nested-class-computed-redeclared-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-nested-class-computed-redeclared-exec.test.js ] SyntaxError: Private field '#foo' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-property-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-property-exec.test.js ] SyntaxError: Private field '#x' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-property-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-property-exec.test.js ] SyntaxError: Private field '#x' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-parenthesized-optional-member-call-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-parenthesized-optional-member-call-exec.test.js ] SyntaxError: Private field '#m' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-nested-class-computed-redeclared-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-nested-class-computed-redeclared-exec.test.js ] SyntaxError: Private field '#foo' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-property-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-property-exec.test.js ] SyntaxError: Private field '#x' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-property-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-property-exec.test.js ] SyntaxError: Private field '#x' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-parenthesized-optional-member-call-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-parenthesized-optional-member-call-exec.test.js ] SyntaxError: Private field '#m' must be declared in an enclosing class -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-regression-7371-exec.test.js [ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-regression-7371-exec.test.js ] SyntaxError: 'super' keyword unexpected here -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[35/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[35/90]⎯ -⎯⎯⎯⎯⎯⎯ Failed Tests 57 ⎯⎯⎯⎯⎯⎯⎯ +⎯⎯⎯⎯⎯⎯ Failed Tests 52 ⎯⎯⎯⎯⎯⎯⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-before-member-call-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-before-member-call-exec.test.js:110:10 - 108| var _x = { _: 1 }; - 109| var _m = { _: function() { - 110| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-before-member-call-exec.test.js:112:10 + 110| var _x = { _: 1 }; + 111| var _m = { _: function() { + 112| return _assertClassBrand(_Foo, this, _x)._; | ^ - 111| } }; - 112| var _self = { _: Foo }; - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-before-member-call-exec.test.js:20:46 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-before-member-call-exec.test.js:114:6 + 113| } }; + 114| var _self = { _: Foo }; + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-before-member-call-exec.test.js:21:46 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-before-member-call-exec.test.js:116:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[36/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[36/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-cast-to-boolean-exec.test.js > exec TypeError: Private element is not present on this object @@ -194,7 +194,7 @@ TypeError: Private element is not present on this object ❯ Function.testNullish fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-cast-to-boolean-exec.test.js:89:14 ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-noDocumentAll-optional-chain-cast-to-boolean-exec.test.js:105:4 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[37/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[37/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-class-binding-exec.test.js > exec AssertionError: expected null to be [Function A] // Object.is equality @@ -212,7 +212,7 @@ null | ^ 11| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[38/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[38/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-infer-name-exec.test.js > exec AssertionError: expected '_Class' to be 'Foo' // Object.is equality @@ -227,25 +227,7 @@ Received: "_Class" | ^ 9| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[39/95]⎯ - - FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-this-exec.test.js > exec -AssertionError: expected null to be [Function A] // Object.is equality - -- Expected: -[Function A] - -+ Received: -null - - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-this-exec.test.js:13:22 - 11| A = null; - 12| expect(oldA.self).toBe(oldA); - 13| expect(oldA.getA()).toBe(oldA); - | ^ - 14| }) - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[40/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[39/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-nested-class-super-call-in-decorator-exec.test.js > exec AssertionError: expected undefined to be 'hello' // Object.is equality @@ -263,7 +245,7 @@ undefined | ^ 22| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[41/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[40/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-nested-class-super-property-in-decorator-exec.test.js > exec AssertionError: expected undefined to be 'hello' // Object.is equality @@ -281,7 +263,7 @@ undefined | ^ 23| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[42/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[41/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-constructor-collision-exec.test.js > exec AssertionError: expected undefined to be 'bar' // Object.is equality @@ -300,7 +282,7 @@ undefined 19| expect("bar" in f).toBe(false); 20| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[43/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[42/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-constructor-collision-exec.test.js > exec AssertionError: expected undefined to be 'bar' // Object.is equality @@ -319,7 +301,7 @@ undefined 19| expect("bar" in f).toBe(false); 20| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[44/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[43/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-nested-class-extends-computed-exec.test.js > exec AssertionError: expected [Function] to not throw an error but 'TypeError: Private element is not pre…' was thrown @@ -337,31 +319,31 @@ undefined | ^ 31| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[45/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[44/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-exec.test.js:109:10 - 107| var _x = { _: 1 }; - 108| var _m = { _: function() { - 109| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-exec.test.js:111:10 + 109| var _x = { _: 1 }; + 110| var _m = { _: function() { + 111| return _assertClassBrand(_Foo, this, _x)._; | ^ - 110| } }; - 111| var _self = { _: Foo }; - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-exec.test.js:19:46 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-exec.test.js:113:6 + 112| } }; + 113| var _self = { _: Foo }; + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-exec.test.js:20:46 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-exec.test.js:115:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[46/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[45/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-with-transform-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-with-transform-exec.test.js:31:168 + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-with-transform-exec.test.js:32:168 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-with-transform-exec.test.js:113:6 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-member-call-with-transform-exec.test.js:115:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[47/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[46/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-property-with-transform-exec.test.js > exec TypeError: Private element is not present on this object @@ -370,7 +352,7 @@ TypeError: Private element is not present on this object ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-before-property-with-transform-exec.test.js:110:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[48/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[47/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-cast-to-boolean-exec.test.js > exec TypeError: Private element is not present on this object @@ -385,7 +367,7 @@ TypeError: Private element is not present on this object ❯ Function.testNullish fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-cast-to-boolean-exec.test.js:89:14 ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-cast-to-boolean-exec.test.js:105:4 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[49/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[48/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-delete-property-exec.test.js > exec TypeError: Private element is not present on this object @@ -399,7 +381,7 @@ TypeError: Private element is not present on this object 58| expect(delete _assertClassBrand(Foo, o?.Foo, _self)._.self.unicorn)… ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-delete-property-exec.test.js:92:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[50/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[49/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-delete-property-with-transform-exec.test.js > exec AssertionError: expected function to throw an error, but it didn't @@ -407,94 +389,94 @@ AssertionError: expected function to throw an error, but it didn't ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-delete-property-with-transform-exec.test.js:158:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[51/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[50/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-exec.test.js:42:10 - 40| var _x = { _: 1 }; - 41| var _m = { _: function() { - 42| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-exec.test.js:44:10 + 42| var _x = { _: 1 }; + 43| var _m = { _: function() { + 44| return _assertClassBrand(_Foo, this, _x)._; | ^ - 43| } }; - 44| var _self = { _: Foo }; - ❯ f fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-exec.test.js:18:57 - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-exec.test.js:33:11 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-exec.test.js:46:6 + 45| } }; + 46| var _self = { _: Foo }; + ❯ f fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-exec.test.js:19:57 + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-exec.test.js:34:11 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-exec.test.js:48:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[52/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[51/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ _ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:57:10 - 55| var _x = { _: 1 }; - 56| var _m = { _: function() { - 57| return _assertClassBrand(Foo, this, _x)._; + ❯ _ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:59:10 + 57| var _x = { _: 1 }; + 58| var _m = { _: function() { + 59| return _assertClassBrand(_Foo, this, _x)._; | ^ - 58| } }; - 59| var _self = { _: Foo }; - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:44:181 - ❯ j fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:45:6 - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:52:11 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:61:6 + 60| } }; + 61| var _self = { _: Foo }; + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:45:181 + ❯ j fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:46:6 + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:53:11 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-in-function-param-with-transform-exec.test.js:63:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[53/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[52/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-exec.test.js:112:10 - 110| var _x = { _: 1 }; - 111| var _m = { _: function() { - 112| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-exec.test.js:114:10 + 112| var _x = { _: 1 }; + 113| var _m = { _: function() { + 114| return _assertClassBrand(_Foo, this, _x)._; | ^ - 113| } }; - 114| var _self = { _: Foo }; - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-exec.test.js:19:17 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-exec.test.js:116:6 + 115| } }; + 116| var _self = { _: Foo }; + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-exec.test.js:20:17 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-exec.test.js:118:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[54/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[53/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-with-transform-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-with-transform-exec.test.js:112:10 - 110| var _x = { _: 1 }; - 111| var _m = { _: function() { - 112| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-with-transform-exec.test.js:114:10 + 112| var _x = { _: 1 }; + 113| var _m = { _: function() { + 114| return _assertClassBrand(_Foo, this, _x)._; | ^ - 113| } }; - 114| var _self = { _: Foo }; - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-with-transform-exec.test.js:22:142 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-with-transform-exec.test.js:116:6 + 115| } }; + 116| var _self = { _: Foo }; + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-with-transform-exec.test.js:23:142 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-member-optional-call-with-transform-exec.test.js:118:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[55/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[54/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-exec.test.js:112:10 - 110| var _x = { _: 1 }; - 111| var _m = { _: function() { - 112| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-exec.test.js:114:10 + 112| var _x = { _: 1 }; + 113| var _m = { _: function() { + 114| return _assertClassBrand(_Foo, this, _x)._; | ^ - 113| } }; - 114| var _self = { _: Foo }; - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-exec.test.js:19:14 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-exec.test.js:116:6 + 115| } }; + 116| var _self = { _: Foo }; + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-exec.test.js:20:14 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-exec.test.js:118:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[56/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[55/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-with-transform-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-with-transform-exec.test.js:34:269 + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-with-transform-exec.test.js:35:269 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-with-transform-exec.test.js:116:6 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-member-call-with-transform-exec.test.js:118:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[57/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[56/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-property-with-transform-exec.test.js > exec TypeError: Private element is not present on this object @@ -503,7 +485,7 @@ TypeError: Private element is not present on this object ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-optional-chain-optional-property-with-transform-exec.test.js:113:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[58/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[57/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-class-binding-exec.test.js > exec AssertionError: expected null to be [Function A] // Object.is equality @@ -521,7 +503,7 @@ null | ^ 18| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[59/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[58/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-shadow-exec.test.js > exec TypeError: e.has is not a function @@ -536,25 +518,7 @@ TypeError: e.has is not a function ❯ Function.method fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-shadow-exec.test.js:12:11 ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-shadow-exec.test.js:16:14 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[60/95]⎯ - - FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-this-exec.test.js > exec -AssertionError: expected null to be [Function A] // Object.is equality - -- Expected: -[Function A] - -+ Received: -null - - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-this-exec.test.js:20:32 - 18| A = null; - 19| expect(oldA.extract().self).toBe(oldA); - 20| expect(oldA.extract().getA()).toBe(oldA); - | ^ - 21| }) - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[61/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[59/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-nested-class-extends-computed-exec.test.js > exec AssertionError: expected [Function] to not throw an error but 'TypeError: Private element is not pre…' was thrown @@ -572,31 +536,31 @@ undefined | ^ 32| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[62/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[60/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-exec.test.js:110:10 - 108| var _x = { _: 1 }; - 109| var _m = { _: function() { - 110| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-exec.test.js:112:10 + 110| var _x = { _: 1 }; + 111| var _m = { _: function() { + 112| return _assertClassBrand(_Foo, this, _x)._; | ^ - 111| } }; - 112| var _self = { _: Foo }; - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-exec.test.js:20:46 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-exec.test.js:114:6 + 113| } }; + 114| var _self = { _: Foo }; + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-exec.test.js:21:46 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-exec.test.js:116:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[63/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[61/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-with-transform-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-with-transform-exec.test.js:32:168 + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-with-transform-exec.test.js:33:168 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-with-transform-exec.test.js:114:6 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-member-call-with-transform-exec.test.js:116:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[64/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[62/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-property-with-transform-exec.test.js > exec TypeError: Private element is not present on this object @@ -605,7 +569,7 @@ TypeError: Private element is not present on this object ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-before-property-with-transform-exec.test.js:111:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[65/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[63/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-cast-to-boolean-exec.test.js > exec TypeError: Private element is not present on this object @@ -620,7 +584,7 @@ TypeError: Private element is not present on this object ❯ Function.testNullish fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-cast-to-boolean-exec.test.js:89:14 ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-cast-to-boolean-exec.test.js:105:4 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[66/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[64/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-delete-property-exec.test.js > exec TypeError: Private element is not present on this object @@ -634,7 +598,7 @@ TypeError: Private element is not present on this object 59| expect(delete _assertClassBrand(Foo, o?.Foo, _self)._.self.unicorn)… ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-delete-property-exec.test.js:93:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[67/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[65/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-delete-property-with-transform-exec.test.js > exec AssertionError: expected function to throw an error, but it didn't @@ -642,94 +606,94 @@ AssertionError: expected function to throw an error, but it didn't ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-delete-property-with-transform-exec.test.js:158:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[68/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[66/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-exec.test.js:43:10 - 41| var _x = { _: 1 }; - 42| var _m = { _: function() { - 43| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-exec.test.js:45:10 + 43| var _x = { _: 1 }; + 44| var _m = { _: function() { + 45| return _assertClassBrand(_Foo, this, _x)._; | ^ - 44| } }; - 45| var _self = { _: Foo }; - ❯ f fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-exec.test.js:19:57 - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-exec.test.js:34:11 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-exec.test.js:47:6 + 46| } }; + 47| var _self = { _: Foo }; + ❯ f fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-exec.test.js:20:57 + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-exec.test.js:35:11 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-exec.test.js:49:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[69/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[67/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ _ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:58:10 - 56| var _x = { _: 1 }; - 57| var _m = { _: function() { - 58| return _assertClassBrand(Foo, this, _x)._; + ❯ _ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:60:10 + 58| var _x = { _: 1 }; + 59| var _m = { _: function() { + 60| return _assertClassBrand(_Foo, this, _x)._; | ^ - 59| } }; - 60| var _self = { _: Foo }; - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:45:181 - ❯ j fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:46:6 - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:53:11 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:62:6 + 61| } }; + 62| var _self = { _: Foo }; + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:46:181 + ❯ j fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:47:6 + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:54:11 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-in-function-param-with-transform-exec.test.js:64:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[70/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[68/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-exec.test.js:113:10 - 111| var _x = { _: 1 }; - 112| var _m = { _: function() { - 113| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-exec.test.js:115:10 + 113| var _x = { _: 1 }; + 114| var _m = { _: function() { + 115| return _assertClassBrand(_Foo, this, _x)._; | ^ - 114| } }; - 115| var _self = { _: Foo }; - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-exec.test.js:20:17 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-exec.test.js:117:6 + 116| } }; + 117| var _self = { _: Foo }; + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-exec.test.js:21:17 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-exec.test.js:119:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[71/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[69/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-with-transform-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-with-transform-exec.test.js:113:10 - 111| var _x = { _: 1 }; - 112| var _m = { _: function() { - 113| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-with-transform-exec.test.js:115:10 + 113| var _x = { _: 1 }; + 114| var _m = { _: function() { + 115| return _assertClassBrand(_Foo, this, _x)._; | ^ - 114| } }; - 115| var _self = { _: Foo }; - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-with-transform-exec.test.js:23:142 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-with-transform-exec.test.js:117:6 + 116| } }; + 117| var _self = { _: Foo }; + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-with-transform-exec.test.js:24:142 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-member-optional-call-with-transform-exec.test.js:119:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[72/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[70/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-exec.test.js:113:10 - 111| var _x = { _: 1 }; - 112| var _m = { _: function() { - 113| return _assertClassBrand(Foo, this, _x)._; + ❯ Object._ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-exec.test.js:115:10 + 113| var _x = { _: 1 }; + 114| var _m = { _: function() { + 115| return _assertClassBrand(_Foo, this, _x)._; | ^ - 114| } }; - 115| var _self = { _: Foo }; - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-exec.test.js:20:14 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-exec.test.js:117:6 + 116| } }; + 117| var _self = { _: Foo }; + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-exec.test.js:21:14 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-exec.test.js:119:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[73/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[71/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-with-transform-exec.test.js > exec TypeError: Private element is not present on this object ❯ _assertClassBrand ../../node_modules/.pnpm/@babel+runtime@7.26.0/node_modules/@babel/runtime/helpers/assertClassBrand.js:3:9 - ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-with-transform-exec.test.js:35:269 + ❯ Function.test fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-with-transform-exec.test.js:36:269 - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-with-transform-exec.test.js:117:6 + ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-member-call-with-transform-exec.test.js:119:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[74/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[72/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-property-with-transform-exec.test.js > exec TypeError: Private element is not present on this object @@ -738,7 +702,7 @@ TypeError: Private element is not present on this object ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-optional-chain-optional-property-with-transform-exec.test.js:114:6 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[75/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[73/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-static-class-binding-exec.test.js > exec AssertionError: expected null to be [Function A] // Object.is equality @@ -756,7 +720,7 @@ null | ^ 18| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[76/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[74/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-static-self-field-exec.test.js > exec ReferenceError: Foo is not defined @@ -768,7 +732,7 @@ ReferenceError: Foo is not defined 15| const { x, y } = f.extract(); 16| expect(x).toBe(f); -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[77/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[75/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-static-shadow-exec.test.js > exec TypeError: e.has is not a function @@ -783,25 +747,7 @@ TypeError: e.has is not a function ❯ Function.method fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-static-shadow-exec.test.js:12:11 ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-static-shadow-exec.test.js:16:14 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[78/95]⎯ - - FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-static-this-exec.test.js > exec -AssertionError: expected null to be [Function A] // Object.is equality - -- Expected: -[Function A] - -+ Received: -null - - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-private-static-this-exec.test.js:20:32 - 18| A = null; - 19| expect(oldA.extract().self).toBe(oldA); - 20| expect(oldA.extract().getA()).toBe(oldA); - | ^ - 21| }) - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[79/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[76/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-computed-toPrimitive-exec.test.js > exec AssertionError: expected [Function] to throw error including '@@toPrimitive must return a primitive…' but got 'Cannot convert object to primitive va…' @@ -817,7 +763,7 @@ Received: "Cannot convert object to primitive value" 38| expect(() => class { 39| static get [arrayLike]() { -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[80/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[77/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-loose-static-class-binding-exec.test.js > exec AssertionError: expected null to be [Function A] // Object.is equality @@ -835,7 +781,7 @@ null | ^ 11| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[81/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[78/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-loose-static-infer-name-exec.test.js > exec AssertionError: expected '_Class' to be 'Foo' // Object.is equality @@ -850,25 +796,7 @@ Received: "_Class" | ^ 9| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[82/95]⎯ - - FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-loose-static-this-exec.test.js > exec -AssertionError: expected null to be [Function A] // Object.is equality - -- Expected: -[Function A] - -+ Received: -null - - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-loose-static-this-exec.test.js:13:22 - 11| A = null; - 12| expect(oldA.self).toBe(oldA); - 13| expect(oldA.getA()).toBe(oldA); - | ^ - 14| }) - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[83/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[79/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-static-class-binding-exec.test.js > exec AssertionError: expected null to be [Function A] // Object.is equality @@ -886,7 +814,7 @@ null | ^ 12| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[84/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[80/90]⎯ FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-static-infer-name-exec.test.js > exec AssertionError: expected '_Class' to be 'Foo' // Object.is equality @@ -901,25 +829,7 @@ Received: "_Class" | ^ 10| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[85/95]⎯ - - FAIL fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-static-this-exec.test.js > exec -AssertionError: expected null to be [Function A] // Object.is equality - -- Expected: -[Function A] - -+ Received: -null - - ❯ fixtures/babel/babel-plugin-transform-class-properties-test-fixtures-public-static-this-exec.test.js:14:22 - 12| A = null; - 13| expect(oldA.self).toBe(oldA); - 14| expect(oldA.getA()).toBe(oldA); - | ^ - 15| }) - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[86/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[81/90]⎯ FAIL fixtures/babel/babel-plugin-transform-optional-chaining-test-fixtures-assumption-noDocumentAll-parenthesized-expression-member-call-exec.test.js > exec TypeError: Cannot read properties of undefined (reading 'x') @@ -933,7 +843,7 @@ TypeError: Cannot read properties of undefined (reading 'x') ❯ Foo.test fixtures/babel/babel-plugin-transform-optional-chaining-test-fixtures-assumption-noDocumentAll-parenthesized-expression-member-call-exec.test.js:25:63 ❯ fixtures/babel/babel-plugin-transform-optional-chaining-test-fixtures-assumption-noDocumentAll-parenthesized-expression-member-call-exec.test.js:68:12 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[87/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[82/90]⎯ FAIL fixtures/babel/babel-plugin-transform-optional-chaining-test-fixtures-general-parenthesized-expression-member-call-exec.test.js > exec TypeError: Cannot read properties of undefined (reading 'x') @@ -947,7 +857,7 @@ TypeError: Cannot read properties of undefined (reading 'x') ❯ Foo.test fixtures/babel/babel-plugin-transform-optional-chaining-test-fixtures-general-parenthesized-expression-member-call-exec.test.js:25:63 ❯ fixtures/babel/babel-plugin-transform-optional-chaining-test-fixtures-general-parenthesized-expression-member-call-exec.test.js:68:12 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[88/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[83/90]⎯ FAIL fixtures/babel/babel-plugin-transform-optional-chaining-test-fixtures-general-parenthesized-expression-member-call-loose-exec.test.js > exec TypeError: Cannot read properties of undefined (reading 'x') @@ -961,7 +871,7 @@ TypeError: Cannot read properties of undefined (reading 'x') ❯ Foo.test fixtures/babel/babel-plugin-transform-optional-chaining-test-fixtures-general-parenthesized-expression-member-call-loose-exec.test.js:25:63 ❯ fixtures/babel/babel-plugin-transform-optional-chaining-test-fixtures-general-parenthesized-expression-member-call-loose-exec.test.js:68:12 -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[89/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[84/90]⎯ FAIL fixtures/babel/babel-preset-env-test-fixtures-plugins-integration-issue-15170-exec.test.js > exec AssertionError: expected [Function] to not throw an error but 'ReferenceError: x is not defined' was thrown @@ -979,7 +889,7 @@ undefined | ^ 7| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[90/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[85/90]⎯ FAIL fixtures/babel/babel-preset-env-test-fixtures-sanity-check-es2015-constants-exec.test.js > exec TypeError: Assignment to constant variable. @@ -990,7 +900,7 @@ TypeError: Assignment to constant variable. | ^ 6| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[91/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[86/90]⎯ FAIL fixtures/babel/babel-preset-env-test-fixtures-sanity-regex-dot-all-exec.test.js > exec AssertionError: expected false to be true // Object.is equality @@ -1009,5 +919,5 @@ AssertionError: expected false to be true // Object.is equality 11| expect(/hello.world/su.test(input)).toBe(true); 12| }) -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[92/95]⎯ +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[87/90]⎯