Skip to content

Conversation

@tidefield
Copy link
Contributor

@tidefield tidefield commented Oct 18, 2025

For

`$fn($args)` where {
    $fn <: `buildConfig`
}

$fn($args) is compiled into a GritNodePattern with kind JS_CALL_EXPRESSION. $fn binds to a JS_IDENTIFIER_EXPRESSION node.

`buildConfig` creates GritCodeSnippet with these patterns

  - JsSyntaxKind(JS_REFERENCE_IDENTIFIER)
  - JsSyntaxKind(JS_IDENTIFIER_BINDING)
  - JsSyntaxKind(JS_NAME)
  - JsSyntaxKind(JS_REFERENCE_IDENTIFIER)
  - JsSyntaxKind(JS_LITERAL_MEMBER_NAME)
  - JsSyntaxKind(JS_REFERENCE_IDENTIFIER)
  - JsSyntaxKind(JS_REFERENCE_IDENTIFIER)
  - JsSyntaxKind(JS_LITERAL_MEMBER_NAME)
  - JsSyntaxKind(JS_REFERENCE_IDENTIFIER)
  - JsSyntaxKind(JSX_TEXT)
  - JsSyntaxKind(JSX_NAME)
  - JsSyntaxKind(JS_IDENTIFIER_BINDING)
  - JsSyntaxKind(JS_REFERENCE_IDENTIFIER)
  - JsSyntaxKind(JS_IDENTIFIER_BINDING)
  - JsSyntaxKind(JS_REFERENCE_IDENTIFIER)
  - JsSyntaxKind(JS_REFERENCE_IDENTIFIER)
  - JsSyntaxKind(JS_IDENTIFIER_BINDING)
  - JsSyntaxKind(JS_LITERAL_MEMBER_NAME)

Given CST for buildConfig() is

The node kind of buildConfig is JS_IDENTIFIER_EXPRESSION which is not part of the available patterns.

My fix is just making GritCodeSnippet's matcher more flexible by detecting when JS_IDENTIFIER_EXPRESSION has a single child and unwraps to JS_REFERENCE_IDENTIFIER.

I'm not pleased with the fix. Without the fix, there are other workarounds

`$fn($args)` where {
    $fn <: "buildConfig" // using string quotation
}
`$fn` where {
    $fn <: `buildConfig`
}

There could be more principled approach. With on-going effort in js plugin, I'm not sure if it's worth diving into that now.

Fixes: #7601

@changeset-bot
Copy link

changeset-bot bot commented Oct 18, 2025

🦋 Changeset detected

Latest commit: 7a37469

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 13 packages
Name Type
@biomejs/biome Patch
@biomejs/cli-win32-x64 Patch
@biomejs/cli-win32-arm64 Patch
@biomejs/cli-darwin-x64 Patch
@biomejs/cli-darwin-arm64 Patch
@biomejs/cli-linux-x64 Patch
@biomejs/cli-linux-arm64 Patch
@biomejs/cli-linux-x64-musl Patch
@biomejs/cli-linux-arm64-musl Patch
@biomejs/wasm-web Patch
@biomejs/wasm-bundler Patch
@biomejs/wasm-nodejs Patch
@biomejs/backend-jsonrpc Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@tidefield tidefield marked this pull request as draft October 18, 2025 16:07
@github-actions github-actions bot added A-Parser Area: parser L-Grit Language: GritQL labels Oct 18, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 18, 2025

Walkthrough

Adds Grit test snippets and matching TypeScript test lines that exercise function-call patterns targeting buildConfig(...) (backtick-delimited and string-literal forms). Updates grit_code_snippet.rs to add an exact-kind fast‑path and to attempt matching against the child of single‑child JS_IDENTIFIER_EXPRESSION wrapper nodes. Adds a unit test test_snippet_node_from_tree in snippet_compiler.rs and a changeset documenting the Grit plugin fix. No public API or exported-entity changes.

Suggested reviewers

  • arendjr
  • ematipico

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title Check ✅ Passed The title "fix(lint): extend matcher for GritCodeSnippet to cover edge case" directly and specifically describes the main change in the pull request. It accurately summarises the primary objective: extending the GritCodeSnippet matcher to handle a previously unmatched edge case (JS_IDENTIFIER_EXPRESSION nodes). The title is clear, concise, and sufficiently specific for scanning the repository history.
Linked Issues Check ✅ Passed The code changes directly address the primary objective from issue #7601: enabling the Grit plugin to detect calls to buildConfig(). The fix in grit_code_snippet.rs adds wrapper-node handling to detect and unwrap JS_IDENTIFIER_EXPRESSION nodes with single children, which removes the blocker preventing buildConfig() calls from being matched. New test cases are added to validate the matcher behaviour. The changeset documents the bug fix appropriately, fulfilling the requirement to demonstrate the rule now prevents the function call.
Out of Scope Changes Check ✅ Passed All changes are tightly scoped to fixing issue #7601. The core logic change is isolated to grit_code_snippet.rs, test specifications validate the fix, and a changeset entry documents the modification. There are no unrelated refactorings, unrelated test additions, or scope creep detected. Each file change contributes directly to resolving the matcher limitation.
Description Check ✅ Passed The description provides comprehensive context by explaining the Grit pattern, how it compiles, the CST structure, and why the matcher currently fails. It clearly articulates the fix (unwrapping single-child JS_IDENTIFIER_EXPRESSION nodes), acknowledges the pragmatic trade-off involved, and links to the referenced issue #7601. The explanation is directly related to the changeset throughout.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3f20c4e and 7a37469.

📒 Files selected for processing (1)
  • .changeset/ripe-rabbits-build.md (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
.changeset/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

.changeset/*.md: In changeset files, only use #### or ##### headers
Changesets should describe user-facing changes; internal-only changes do not need changesets
Use past tense for what you did in the changeset description and present tense for current behavior
For bug fixes, start the changeset description with a link to the issue (e.g., Fixed #1234: ...)
When referencing a rule or assist in a changeset, include a link to the rule/assist page on the website
Include a code block in the changeset when applicable to illustrate the change
End every sentence in a changeset with a full stop (.)

Files:

  • .changeset/ripe-rabbits-build.md
🧠 Learnings (1)
📚 Learning: 2025-10-26T15:28:00.941Z
Learnt from: CR
PR: biomejs/biome#0
File: CONTRIBUTING.md:0-0
Timestamp: 2025-10-26T15:28:00.941Z
Learning: Applies to .changeset/*.md : Changesets should describe user-facing changes; internal-only changes do not need changesets

Applied to files:

  • .changeset/ripe-rabbits-build.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: Test Node.js API
  • GitHub Check: Documentation
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: End-to-end tests
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: Check Dependencies
  • GitHub Check: autofix
🔇 Additional comments (1)
.changeset/ripe-rabbits-build.md (1)

1-5: Looks good!

The changeset now properly follows the guidelines: it uses past tense consistently, includes the issue link, ends with a full stop, and describes the user-facing improvement in accessible terms without diving into internal matcher details. The reword addressing the previous feedback is spot on.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions bot removed the A-Parser Area: parser label Oct 20, 2025
@tidefield tidefield changed the title Tests to reproduce #7601 fix(plugin): Extend matcher for GritCodeSnippet to cover edge case Oct 20, 2025
@tidefield tidefield marked this pull request as ready for review October 20, 2025 11:24
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
crates/biome_grit_patterns/src/pattern_compiler/snippet_compiler.rs (1)

497-515: Good snapshot test; consider adding the call-form too.

This nicely pins the CST for the identifier case. For extra confidence around the reported edge, add a sibling test for buildConfig() to cover the call-expression path here as well (you already have TS specs, but a unit keeps it close to the compiler).

crates/biome_grit_patterns/src/grit_code_snippet.rs (1)

45-75: Apply the suggested optimisations to avoid double-executing patterns and trim the O(n) traversal.

The review is spot-on. The code does execute the exact-kind pattern twice (once in fast-path, again in the second loop if unsuccessful), and node.children().count() == 1 is unnecessarily expensive. The narrowing of the single-child unwrap to only kinds that appear in self.patterns is also a worthwhile safety improvement—currently it could attempt matching against any wrapper, but the suggested approach keeps it focused.

Tests exist (matchBacktickSnippet and matchStringLiteral) to help validate your changes. Apply the suggested diff and run cargo test -p biome_grit_patterns locally to confirm nothing regresses.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c7cf8e7 and bbbf993.

⛔ Files ignored due to path filters (1)
  • crates/biome_grit_patterns/tests/specs/ts/matchBacktickSnippet.snap is excluded by !**/*.snap and included by **
📒 Files selected for processing (2)
  • crates/biome_grit_patterns/src/grit_code_snippet.rs (2 hunks)
  • crates/biome_grit_patterns/src/pattern_compiler/snippet_compiler.rs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_grit_patterns/src/pattern_compiler/snippet_compiler.rs
  • crates/biome_grit_patterns/src/grit_code_snippet.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.rs: Format Rust files before committing (e.g., via just f which formats Rust)
Document rules, assists, and options with inline rustdoc in source

Files:

  • crates/biome_grit_patterns/src/pattern_compiler/snippet_compiler.rs
  • crates/biome_grit_patterns/src/grit_code_snippet.rs
🧬 Code graph analysis (2)
crates/biome_grit_patterns/src/pattern_compiler/snippet_compiler.rs (2)
crates/biome_grit_patterns/src/grit_node.rs (1)
  • node (207-209)
crates/biome_grit_patterns/src/grit_target_node.rs (1)
  • node (639-641)
crates/biome_grit_patterns/src/grit_code_snippet.rs (1)
crates/biome_grit_patterns/src/pattern_compiler/snippet_compiler.rs (1)
  • node (258-261)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Check Dependencies
  • GitHub Check: autofix
  • GitHub Check: Test Node.js API
🔇 Additional comments (1)
crates/biome_grit_patterns/src/grit_code_snippet.rs (1)

10-10: Remove unused AstNode import on line 10.

The code doesn't use AstNode—methods like first_child() and children() are concrete implementations on GritTargetNode, not trait methods. Drop the import to keep things tidy.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
crates/biome_grit_patterns/src/grit_code_snippet.rs (2)

52-59: Consider avoiding redundant pattern execution.

When the exact-kind pattern exists but fails to execute on line 47, this loop will re-try the same pattern. Whilst not incorrect, it's wasteful.

Consider either:

  • Tracking which pattern was already attempted and skipping it here, or
  • Restructuring to avoid the redundancy

64-71: Optimise the single-child check.

The condition node.children().count() == 1 iterates through all children, which is inefficient. Since you already have first_child(), check whether a second child exists instead.

Apply this diff to improve performance:

-        if let Some(child) = node.first_child()  && node.children().count() == 1 {
+        if let Some(child) = node.first_child() && node.children().nth(1).is_none() {
             let child_binding = GritResolvedPattern::from_node_binding(child);
             for (_, pattern) in &self.patterns {
                 if pattern.execute(&child_binding, state, context, logs)? {
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bbbf993 and 7847ab2.

📒 Files selected for processing (1)
  • crates/biome_grit_patterns/src/grit_code_snippet.rs (2 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_grit_patterns/src/grit_code_snippet.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.rs: Format Rust files before committing (e.g., via just f which formats Rust)
Document rules, assists, and options with inline rustdoc in source

Files:

  • crates/biome_grit_patterns/src/grit_code_snippet.rs
🧬 Code graph analysis (1)
crates/biome_grit_patterns/src/grit_code_snippet.rs (1)
crates/biome_grit_patterns/src/pattern_compiler/snippet_compiler.rs (1)
  • node (258-261)
🪛 GitHub Actions: autofix.ci
crates/biome_grit_patterns/src/grit_code_snippet.rs

[error] 75-75: Build failed due to syntax error: unexpected closing delimiter '}' (this delimiter might not be properly closed...).

🪛 GitHub Actions: Pull request Node.js
crates/biome_grit_patterns/src/grit_code_snippet.rs

[error] 75-75: unexpected closing delimiter: }


[error] 75-75: This error prevents building the crate. Could be caused by a mismatched or missing opening/closing delimiter in the surrounding code.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Lint project (depot-windows-2022)
🔇 Additional comments (1)
crates/biome_grit_patterns/src/grit_code_snippet.rs (1)

10-10: Import addition looks good.

The AstNode import is necessary for the new child-node unwrapping logic below.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
crates/biome_grit_patterns/src/grit_code_snippet.rs (1)

53-65: Wrapper-node handling correctly addresses the reported issue.

The logic properly unwraps single-child JS_IDENTIFIER_EXPRESSION nodes to match against the inner JS_REFERENCE_IDENTIFIER, which aligns with the fix objective.

Optional micro-optimisation: Line 57's node.children().count() == 1 iterates all children. Since you've already got first_child() in hand, you could check child.next_sibling().is_none() instead—but the current approach is perfectly clear and unlikely to be a bottleneck.

-        if node.kind() == GritTargetSyntaxKind::JsSyntaxKind(JsSyntaxKind::JS_IDENTIFIER_EXPRESSION)
-            && let Some(child) = node.first_child()
-            && node.children().count() == 1
+        if node.kind() == GritTargetSyntaxKind::JsSyntaxKind(JsSyntaxKind::JS_IDENTIFIER_EXPRESSION)
+            && let Some(child) = node.first_child()
+            && child.next_sibling().is_none()
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7847ab2 and a8914c7.

📒 Files selected for processing (2)
  • .changeset/ripe-rabbits-build.md (1 hunks)
  • crates/biome_grit_patterns/src/grit_code_snippet.rs (2 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_grit_patterns/src/grit_code_snippet.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.rs: Format Rust files before committing (e.g., via just f which formats Rust)
Document rules, assists, and options with inline rustdoc in source

Files:

  • crates/biome_grit_patterns/src/grit_code_snippet.rs
.changeset/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

.changeset/*.md: In changesets, only use #### or ##### headers; other header levels are not allowed
Changesets should cover user-facing changes only; internal changes do not need changesets
Use past tense for what you did and present tense for current Biome behavior in changesets
When fixing a bug in a changeset, start with an issue link (e.g., “Fixed #1234: …”)
When referencing a rule or assist in a changeset, include a link to its page on the website
Include code blocks in changesets when applicable to illustrate changes
End every sentence in a changeset with a period

Files:

  • .changeset/ripe-rabbits-build.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: Documentation
  • GitHub Check: Test Node.js API
  • GitHub Check: Check Dependencies
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: End-to-end tests
  • GitHub Check: autofix
  • GitHub Check: lint
🔇 Additional comments (3)
crates/biome_grit_patterns/src/grit_code_snippet.rs (3)

4-4: LGTM – imports support the new functionality.

The additions of JsSyntaxKind and AstNode are necessary for the kind check and node traversal in the wrapper-handling logic.

Also applies to: 11-11


46-51: Fast-path optimisation looks good.

The exact-kind matching with early return is a sensible optimisation. The if let pattern with && chaining is clean and idiomatic.


67-67: Correct fallback behaviour.

Returning Ok(false) when neither the fast-path nor wrapper handling succeeds is the expected fallback.

@tidefield tidefield changed the title fix(plugin): Extend matcher for GritCodeSnippet to cover edge case fix(lint): Extend matcher for GritCodeSnippet to cover edge case Oct 20, 2025
@tidefield tidefield changed the title fix(lint): Extend matcher for GritCodeSnippet to cover edge case fix(lint): extend matcher for GritCodeSnippet to cover edge case Oct 20, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a8914c7 and 82162ac.

📒 Files selected for processing (2)
  • .changeset/ripe-rabbits-build.md (1 hunks)
  • crates/biome_grit_patterns/src/grit_code_snippet.rs (2 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
.changeset/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

.changeset/*.md: In changesets, only use #### or ##### headers; other header levels are not allowed
Changesets should cover user-facing changes only; internal changes do not need changesets
Use past tense for what you did and present tense for current Biome behavior in changesets
When fixing a bug in a changeset, start with an issue link (e.g., “Fixed #1234: …”)
When referencing a rule or assist in a changeset, include a link to its page on the website
Include code blocks in changesets when applicable to illustrate changes
End every sentence in a changeset with a period

Files:

  • .changeset/ripe-rabbits-build.md
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_grit_patterns/src/grit_code_snippet.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.rs: Format Rust files before committing (e.g., via just f which formats Rust)
Document rules, assists, and options with inline rustdoc in source

Files:

  • crates/biome_grit_patterns/src/grit_code_snippet.rs
🧬 Code graph analysis (1)
crates/biome_grit_patterns/src/grit_code_snippet.rs (1)
crates/biome_grit_patterns/src/pattern_compiler/snippet_compiler.rs (1)
  • node (258-261)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: Test Node.js API
  • GitHub Check: Documentation
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Check Dependencies
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: autofix
🔇 Additional comments (4)
crates/biome_grit_patterns/src/grit_code_snippet.rs (4)

4-4: Imports look correct.

Both JsSyntaxKind (used at line 55) and AstNode (provides first_child/next_sibling methods used at lines 56-57) are necessary for the new logic.

Also applies to: 11-11


46-51: Fast path optimisation is sound.

Checking exact kind match first and returning early on success is a sensible performance improvement.


53-65: Wrapper-node handling correctly addresses the issue.

The logic properly checks for a single-child JS_IDENTIFIER_EXPRESSION, unwraps to the child, and attempts matching across all patterns. This directly fixes the buildConfig() detection issue described in #7601.


67-67: Fallback behaviour is correct.

Returning false when neither fast path nor wrapper match succeeds maintains the expected default behaviour.

@tidefield
Copy link
Contributor Author

I'm not sure why the window tests are failing. Can someone help rerun the job?

@dyc3 dyc3 requested review from a team October 26, 2025 19:48
Copy link
Member

@ematipico ematipico left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix looks good, but the changeset needs some chabges

"@biomejs/biome": patch
---

Fixed [#7601](https://github.com/biomejs/biome/issues/7601): Extended matcher for GritCodeSnippet to handle JS_IDENTIFIER_EXPRESSION with single child.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changesets are for end-users, so they should be less technical as possible. This changeset seems to explain some internal things, unrelated to what users do. Can you please reword it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense. I reworded it. PTAL.

@ematipico ematipico merged commit 33ffcd5 into biomejs:main Oct 27, 2025
13 checks passed
@github-actions github-actions bot mentioned this pull request Oct 27, 2025
Conaclos pushed a commit that referenced this pull request Nov 1, 2025
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

L-Grit Language: GritQL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

💅 Grit Plugin not detecting disallowed usage

2 participants