Commit graph

5489 commits

Author SHA1 Message Date
Boshen
39b9c5d01b feat(linter)!: remove unmaintained security plugin (#7773) 2024-12-10 14:29:22 +00:00
overlookmotel
7dcf6b4d7c feat(ast, transformer): add AstBuilder::use_strict_directive method (#7770)
Add `AstBuilder::use_strict_directive` method, and use it in transformer.
2024-12-10 13:17:27 +00:00
overlookmotel
98afe6543f refactor(ast): AstBuilder extra methods use SPAN (#7769)
Pure refactor. `SPAN` is shorter than `Span::default()` and is what we use elsewhere.
2024-12-10 13:11:19 +00:00
overlookmotel
016ae92453 refactor(transformer/class-properties): rename file (#7767)
Cosmetic change. Rename file that deals with static property initializers to have a more descriptive name.
2024-12-10 11:16:09 +00:00
overlookmotel
e97a9549be style(data_structures): line breaks (#7766)
Style nit. Add line breaks.
2024-12-10 11:00:12 +00:00
Dunqing
9cacf64f1d refactor(transformer/class-properties): transform the remaining PrivateFieldExpression in ChainExpression first (#7763)
We need to transform the inner PrivateFieldExpression so that the variable name matches Babel's output as closely as possible.
2024-12-10 10:35:06 +00:00
Dunqing
f42dbdf56b fix(transformer/class-properties): output is not the same with Babel when PrivateFieldExpression is optional (#7762)
Part of https://github.com/oxc-project/oxc/pull/7749
2024-12-10 10:35:05 +00:00
Dunqing
f52b1db821 fix(transformer/class-properties): output is not the same with Babel when callee has optional (#7748)
Part of https://github.com/oxc-project/oxc/pull/7749. It is just an output mismatch problem, not affecting runtime behavior.
2024-12-10 10:35:04 +00:00
Boshen
cf2ee06825 feat(data_structures): add rope (#7764) 2024-12-10 10:30:04 +00:00
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
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
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
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
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
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
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
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
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
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
72eab6cd96 feat(parser)!: stage 3 import source and import defer (#7706)
* https://github.com/tc39/proposal-defer-import-eval
* https://github.com/tc39/proposal-source-phase-imports
* https://tc39.es/proposal-source-phase-imports/#sec-ecmascript-language-expressions
* https://tc39.es/proposal-defer-import-eval/#prod-NameSpaceImport
2024-12-06 16:15:52 +00:00
Dunqing
8c3a954336 fix(codegen): missing parens for in in for in loop init (#7705)
Well, this looks like an accidental change before, `Context::empty().and_forbid_in(false)` does nothing at all.
2024-12-06 15:52:05 +00:00
Dunqing
4afbe5599e fix(codegen): missing parens for in in for loop init when it includes two binary expression (#7703)
close: #7690

I don't know the logic much, it works without `left_ctx` and no tests failed
2024-12-06 15:52:04 +00:00
IWANABETHATGUY
f7d41dd6fb fix(oxc_transform): overlap replacement (#7621)
closed  https://github.com/oxc-project/oxc/issues/7594

### Reference
https://github.com/oxc-project/oxc/pull/7343/files
2024-12-06 15:26:54 +00:00
overlookmotel
ac910eea5e refactor(transformer/class-properties): move code out of transform_assignment_target (#7701)
Follow-on after #7697.

`transform_assignment_target` is inlined into `enter_assignment_target` visitor, so we want it to be as small as possible. Move assigning to `target` into `transform_assignment_target_impl`, which is the cold path.

The principle is that in the transformer the most important thing for performance is to optimize for the path which is "nothing to do here, exit".

Here we are only transforming `object.#prop`, but very few `AssignmentTarget`s are `object.#prop`, so 99% of the time there is nothing to do. So we want to keep that "do nothing and exit" path as fast and small as possible.

In practice, the `*target =` assignment is only a single assembly operation, so this PR is a micro-optimization. But why not? Every little helps.
2024-12-06 15:15:28 +00:00
overlookmotel
e67e981743 refactor(transformer/class-properties): shorten code (#7700)
Follow-on after #7697. No need to cast twice. You can go from `MemberExpression` direct to `AssignmentTarget`.
2024-12-06 15:15:27 +00:00
overlookmotel
ab3e1c3df4 refactor(transformer/class-properties): add TODO comments (#7702)
Add "TODO" comments for future optimizations we could make.
2024-12-06 15:05:00 +00:00
Dunqing
86d4c90e4d feat(transformer/class-properties): support for transforming AssignmentTarget (#7697)
Instance prop:
 * `[object.#prop] = arr` -> `[_toSetter(_classPrivateFieldSet, [_prop, object])._] = arr`
 * `({x: object.#prop} = obj)` -> `({ x: _toSetter(_classPrivateFieldSet, [_prop, object])._ } = obj)`

 Static prop:
 * `[object.#prop] = arr` -> `[_assertClassBrand(Class, object, _prop)._] = arr`
 * `({x: object.#prop} = obj)` -> `({ x: _assertClassBrand(Class, object, _prop)._ } = obj)`
2024-12-06 12:18:54 +00:00
oxc-bot
5f4f6d140b
release(oxlint): v0.14.1 (#7692) 2024-12-06 13:06:54 +08:00