Commit graph

7167 commits

Author SHA1 Message Date
Guillaume Piedigrossi
3d5f0a1a0c
feat(linter/no_restricted_imports): add the no_restricted_imports rules (#7629)
add first test cases related to the 'paths' config

Note that the test cases and configuration format is not the same as the
original ESLint rule.
What is the oxc team strategy to develop such a rule? Is it ok to adapt
the config format ?

---

I started a discussion here :
https://github.com/oxc-project/oxc/discussions/7534#discussion-7574282
I copy/paste the content here. Maybe it is more relevant?

I am working to implement [this no-restricted-imports
rule](https://eslint.org/docs/latest/rules/no-restricted-imports).
I have several problems:

How to handle multiple format configuration in rust?
The eslint config can be: "fs", ["fs"], or {paths: [{name: "fs"}]}. But
Rust needs only one type. I don't know how to do this in rust.

Is it ok to cover only the {paths: [{name: "fs"}]} case ?

How to parse this config with the from_configuration method?
Here is what I have done:

```
   fn from_configuration(value: serde_json::Value) -> Self {
        let mut paths = Vec::new();
        let mut patterns = Vec::new();

        if let Some(obj) = value.as_object() {
            // Handle paths array
            if let Some(paths_value) = obj.get("paths") {
                if let Some(paths_array) = paths_value.as_array() {
                    for path_value in paths_array {
                        if let Ok(path) = serde_json::from_value(path_value.clone()) {
                            paths.push(path);
                        }
                    }
                }
            }

            // Handle patterns array
            if let Some(patterns_value) = obj.get("patterns") {
                if let Some(patterns_array) = patterns_value.as_array() {
                    for pattern_value in patterns_array {
                        if let Ok(pattern) = serde_json::from_value(pattern_value.clone()) {
                            patterns.push(pattern);
                        }
                    }
                }
            }
        }

        Self { paths, patterns }
    }
````
But here is my result:
```
[RestrictedPath { name: "foo", import_names: None, message: None }]

-------- rule config --------
{
  "paths": [
    {
      "name": "foo",
      "importNames": [
        "AllowedObject"
      ]
    }
  ]
}
```
Note the "None" values
2024-12-10 17:00:15 +08:00
Boshen
a222f2b055 fix(codegen): print delete 2e308 as delete (0, Infinity) (#7761)
closes #7736
2024-12-10 08:37:50 +00:00
Boshen
4bd3d103d3 feat(napi/parser): introduce experimental MagicString (#7529)
Hold magic string instance on the Rust side for utf8 string manipulation.
2024-12-10 08:33:47 +00:00
overlookmotel
2e69720ba0 feat(transformer/class-properties): support private_fields_as_properties assumption (#7717)
Support `private_fields_as_properties` assumption in class properties transform. This assumption is also enabled by the transform's `loose` option.

Optional chain (e.g. `this?.#prop`) is not yet implemented, but all other usages of private fields are supported. We'll handle optional chain in a follow-on PR.
2024-12-10 02:28:31 +00:00
overlookmotel
5d6fa259f4 refactor(traverse)!: remove TraverseCtx::is_static (#7760)
`TraverseCtx::is_static` was only used in logical assignment operators transform, and #7745 removed that usage. So remove this method. `TransformCtx::duplicate_expression` fulfills the same role.
2024-12-10 02:28:30 +00:00
overlookmotel
e010b6a7a0 feat(transformer/logical-assignment-operators): no temp vars for literals (#7759)
`TransformCtx::duplicate_expression` (introduced in #7754) don't create temp vars for literals. This produces more compact output for the logical assignment operators transform.

This diverges from Babel (it's better!) so add an override for one of Babel's fixtures. Also add further tests for all literal types.
2024-12-10 02:28:28 +00:00
overlookmotel
8f8b4c31ad test(transformer): enable fixture overrides for logical-assignment-operators transform (#7758)
Enable overriding Babel's fixtures for logical assignment operators transform.
2024-12-10 02:28:27 +00:00
overlookmotel
e48769a45d fix(transformer/logic-assignment-operator): always create IdentifierReferences with ReferenceId (#7745)
Use `TransformCtx::duplicate_expression` (introduced in #7754) to decide when to create temp vars for member expression object and computed property.

This fixes a bug where `IdentifierReference`s created when transforming `key` in `object[key] &&= value` were created without a `ReferenceId` (due to `clone_in`).

We didn't catch this before because Babel's test fixtures only cover `object[key++] &&= value` not the simpler `object[key] &&= value`. Add tests for this.
2024-12-10 02:28:26 +00:00
overlookmotel
9c2a1b61b9 refactor(transformer): duplicate_expression do not produce temp var for super (#7757)
`TransformCtx::duplicate_expression` method introduced in #7754 don't create a temp var for `super`. This prepares it for use in logical assignment operator transform (#7745).
2024-12-10 02:28:25 +00:00
overlookmotel
a750ebc324 refactor(transformer): duplicate_expression take mutated_symbol_needs_temp_var param (#7756)
`TransformCtx::duplicate_expression` method introduced in #7754 take a param `mutated_symbol_needs_temp_var`.

If `true`, `duplicate_expression` will create a temp var for an `IdentifierReference` whose's symbol is assigned to elsewhere in the AST. If `false`, it won't.

This is required because different transforms which use `duplicate_expression` have different requirements.
2024-12-10 02:28:24 +00:00
overlookmotel
78dff7d232 feat(semantic): add SymbolTable::symbol_is_mutated method (#7755)
Add `SymbolTable::symbol_is_mutated` method. Returns `true` if the symbol is not a `const` and has any references with `ReferenceFlags::Write`.
2024-12-10 02:28:23 +00:00
overlookmotel
b500f5527a refactor(transformer): introduce TransformCtx::duplicate_expression (#7754)
Move implementation of `duplicate_object` from the class properties transform into `TransformCtx::duplicate_expression`, so it can also be used in other transforms.
2024-12-10 02:28:21 +00:00
overlookmotel
3c1b2bf439 refactor(isolated_declarations): use NONE in AST builder calls (#7752)
Pure refactor. `NONE` is shorter than `None::<TSTypeAnnotation<'a>>`.
2024-12-09 16:36:27 +00:00
overlookmotel
75ba4a9e7a refactor(transformer): use NONE in AST builder calls (#7751)
Pure refactor. `NONE` is shorter than `None::<TSThisParameter<'a>>`.
2024-12-09 16:30:26 +00:00
overlookmotel
7e0f7eb67b refactor(transformer/class-properties): prefer contains to intersects for bitflags (#7747)
Tiny refactor. `contains` is clearer than `intersects`, and they produce equivalent assembly when argument is a single flag value, and statically knowable.

https://godbolt.org/z/bTdfbv3f8
2024-12-09 16:09:24 +00:00
overlookmotel
463fc5f2de perf(transformer/logic-assignment-operator): inline enter_expression visitor (#7744)
Optimization. Inline `enter_expression` visitor, and reduce the size of the function, to keep the path for "nothing to do here, bail out" as fast and compact as possible.

From CodSpeed results, it looks like `enter_expression` was already being inlined as perf gain is not the usual +5% we see for inlining `enter_expression` when it wasn't already. But reducing the size of the visitor function still nets a +1% perf gain.
2024-12-09 15:33:23 +00:00
overlookmotel
97acd88793 test(transformer/class-properties): add more tests (#7743)
Babel's tests only cover transforming `this.#prop &&= value` with logical assignment operators transform also enabled. Add tests for just class properties transform alone.
2024-12-09 14:17:12 +00:00
Boshen
2803aec521 feat(napi/transform): return helpers information (#7737)
closes #7599
2024-12-09 14:07:40 +00:00
Yuichiro Yamashita
065f7dcb9d
feat(linter): support expectTypeOf, assert and assertType in vitest/expect-expect (#7742)
[Vitest](https://vitest.dev/api/expect.html) has 4 assertions.
[expect](https://vitest.dev/api/expect),
[expectTypeOf](https://vitest.dev/api/expect-typeof),
[assert](https://vitest.dev/api/assert) and
[assertType](https://vitest.dev/api/assert-type).

But now only `expect`. Therefore this PR supports there rest of
assertions.
And jest doesn't have such assertions, so I added branching based on the
test framework.
2024-12-09 22:07:25 +08:00
overlookmotel
5806942dda docs(transformer/class-properties): correct doc comment (#7741)
Fix incorrect doc comment.
2024-12-09 12:50:05 +00:00
Boshen
1a67cde0de
build(linter): fix feature unification (#7740) 2024-12-09 19:21:22 +08:00
Boshen
c254a5b12c test(napi/transform): use the expect API instead of assert (#7739) 2024-12-09 09:28:01 +00:00
Boshen
c6a19aa478 refactor(linter): remove unused serde features (#7738) 2024-12-09 09:16:32 +00:00
Boshen
b701232098 fix(codegen): print quote correctly for directive (#7735)
closes #7734
2024-12-09 07:17:02 +00:00
Boshen
6f38790442
ci: split out cargo minsize from cargo coverage for faster CI (#7733) 2024-12-09 11:47:28 +08:00
Boshen
2aa57c19c8
chore(deps): update pnpm to v9.15.0 (#7732)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-09 10:01:52 +08:00
Tyler Earls
62f0a22b89
test(linter): port react-jsx-uses-vars rules to no_unused_vars (#7731)
I added the test cases from
[eslint-plugin-react/jsx-uses-vars](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/tests/lib/rules/jsx-uses-vars.js)
to a `react.rs` file in the `no_unused_vars` tests module.

After adding the new tests, they immediately passed without any source
code changes required. It would seem that the linter already supported
this rule, but now there will be tests to support it.

---------

Co-authored-by: Cameron <cameron.clark@hey.com>
2024-12-08 22:18:23 +00:00
overlookmotel
88a0b9c4af test(transformer/class-properties): override test output for _super in class constructor (#7729)
Our output for this test differs from Babel, because we handle `super()` in class constructors differently, but our output is valid.
2024-12-08 17:57:57 +00:00
overlookmotel
3bae741bb4 test(transformer/class-properties): override test output for _super in class constructor (#7726)
Our output for this test differs from Babel, because we handle `super()` in class constructors differently, but our output is valid.
2024-12-08 15:52:27 +00:00
Boshen
48b1e4ad32 refactor(napi/parser): enable serialize feature for oxc_ast only (#7728) 2024-12-08 15:38:57 +00:00
Boshen
c98457db5c feat(napi/transformer): add runtime helper mode (#7727)
part of #7599
2024-12-08 15:29:55 +00:00
Boshen
85eec3c82e feat(napi/transform,napi/parser): return structured error object (#7724)
closes #7261
2024-12-08 14:11:56 +00:00
dalaoshu
02f9903211
test(linter): add regression tests for import/namespace (#7723)
Related to #7696
2024-12-08 15:35:14 +08:00
overlookmotel
37709cec18 test(transformer): transform conformance print code with double-space indent (#7707)
Transform conformance tester (`just test-transform`) print code with double-space indent, instead of tabs. This matches our formatting convention for JS files.
2024-12-08 02:58:18 +00:00
overlookmotel
59132006c9 refactor(transformer/class-properties)!: rename ClassPropertiesOptions::loose (#7716)
`loose` option also covers the `private_fields_as_properties` assumption, not only `set_public_class_fields`.
2024-12-08 01:41:41 +00:00
overlookmotel
a6fd2def34 test(transformer): add just script to update transformer test fixtures (#7713)
Add `just update-transformer-fixtures` to update transformer conformance tests with overrides (see #7688).
2024-12-08 01:41:40 +00:00
overlookmotel
34a8d91454 test(transformer): fix merging options in fixtures update script (#7712)
Fix how options are merged with options from parent folder(s). It's much simpler than I had thought. If folder's options contains `plugins`, that overwrites `plugins` from parent options. They don't get merged.
2024-12-08 01:41:39 +00:00
overlookmotel
7344d21c81 refactor(transformer/class-properties): TODO comments for future optimizations (#7711) 2024-12-08 01:41:38 +00:00
overlookmotel
dd55b84399 refactor(transformer/class-properties): shorten output when _super function (#7710)
Produce more compact output when insert a `_super` function into class constructor.
2024-12-08 01:41:36 +00:00
overlookmotel
97e4185c19 fix(transformer/class-properties): fix SymbolFlags for _super function (#7709)
Fix `SymbolFlags` for generated `_super` function outside class.
2024-12-08 01:41:35 +00:00
overlookmotel
de5b0b63a9 fix(transformer/class-properties): make _super function outside class strict mode (#7708)
When create a `_super` function outside class, ensure it's always strict mode. The code it contains was previously inside the class, so was strict mode.
2024-12-08 01:41:34 +00:00
overlookmotel
5fd136139f test(transformer/class-properties): override fixtures (#7689)
Override some transform conformance test fixtures for class properties transform, where:

* Our output differs from Babel in cosmetic manner only.
* Our transform intentionally works differently from Babel.
* Babel's fixtures enable arrow functions transform, which malfunctions in our implementation. But we're not trying to test arrow functions transform here, so disable it.
2024-12-08 01:41:33 +00:00
overlookmotel
efaaa97986 test(transformer): update fixtures script support overrides (#7688)
Support overriding test fixtures in `update_fixtures.js` script.

Any files in `tasks/transform_conformance/overrides` are copied into Babel test fixtures. If `options.json` is overridden, then script runs Babel with updated options, to generate a new `output` file for the fixture.
2024-12-08 01:41:32 +00:00
overlookmotel
da63e873d9 test(transformer/class-properties): exec test for this in computed key (#7687)
Add an exec test for #7686.
2024-12-08 01:41:31 +00:00
overlookmotel
65a1c311ab test(transformer): fix exec test reporter (#7722)
`JsonReporter` which the custom test reporter introduced in #7715 uses does not provide error message in `message` prop, where cause of failure is failing assertions. So tests failing due to failing assertions were omitted from snapshot. Include them.

Also add count of passing tests at top of the snapshot.
2024-12-08 01:41:30 +00:00
Boshen
ad27b20dc3 fix(linter): only resolve esm files for import plugin (#7720)
closes #7696

cjs files do not work at all.
2024-12-07 17:30:45 +00:00
dalaoshu
5e6053f35a
fix(linter): false positive in eslint/yoda (#7719) 2024-12-07 15:12:30 +00:00
Boshen
b9a2b35e5a refactor(linter): remove aho-corasick (#7718) 2024-12-07 12:34:41 +00:00
Boshen
5891166c80 feat(transform_conformance): custom reporter for exec test (#7715)
closes #7704
2024-12-07 11:25:00 +00:00
Boshen
9257d9d8ea
chore(CODEOWNERS): assign crates/oxc_transformer/src/plugins to me 2024-12-07 19:22:07 +08:00