Skip to content

feat: handle astral letters in new-cap - #21357

Merged
fasttime merged 1 commit into
eslint:mainfrom
saryn17:feat/new-cap-astral
Sep 29, 2026
Merged

fasttime merged 1 commit into
eslint:mainfrom
saryn17:feat/new-cap-astral

Conversation

@saryn17

@saryn17 saryn17 commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

This pull request was created with AI (Claude Fable 5.1).

Prerequisites checklist

AI acknowledgment

  • I did not use AI to generate this PR.
  • (If the above is not checked) I have reviewed the AI-generated content before submitting.

What is the purpose of this pull request? (put an "X" next to an item)

[ ] Documentation update
[x] Bug fix (template)
[ ] New rule (template)
[ ] Changes an existing rule (template)
[ ] Add autofix to a rule
[ ] Add a CLI option
[ ] Add something to the core
[ ] Other, please explain:

What changes did you make? (Give an overview)

Changed getCap() to read the first Unicode code point instead of the first UTF-16 code unit, and added regression tests for astral uppercase and lowercase identifiers.

Fixes #21356

Is there anything you'd like reviewers to focus on?

Summary by CodeRabbit

  • Bug Fixes
    • Corrected capitalization checks for identifier characters outside the Basic Multilingual Plane. Astral uppercase characters are now recognized as uppercase constructor names, while lowercase characters are recognized as lowercase function names.
    • Invalid uses of these characters now receive the appropriate capitalization diagnostics, including accurate reported columns for direct and member names.

@saryn17
saryn17 requested a review from a team as a code owner September 26, 2026 13:04
@github-project-automation github-project-automation Bot moved this to Needs Triage in Triage Sep 26, 2026
@netlify

netlify Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for docs-eslint canceled.

Name Link
🔨 Latest commit ca93f1e
🔍 Latest deploy log https://app.netlify.com/projects/docs-eslint/deploys/6ab7c2ebe447e70008ddbe3e

@linux-foundation-easycla

linux-foundation-easycla Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

CLA Signed
The committers listed above are authorized under a signed CLA.

  • ✅ login: sary8 / name: Ryosei Sato (ca93f1e)

@eslint-github-bot eslint-github-bot Bot added the feature This change adds a new feature to ESLint label Sep 26, 2026
@github-actions github-actions Bot added the rule Relates to ESLint's core rules label Sep 26, 2026
@coderabbitai

coderabbitai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: dae0df6d-2996-404b-8a05-8a5b950814e7

📥 Commits

Reviewing files that changed from the base of the PR and between 39d79ba and ca93f1e.

📒 Files selected for processing (2)
  • lib/rules/new-cap.js
  • tests/lib/rules/new-cap.js

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

new-cap now reads the first Unicode code point when checking capitalization. Tests cover astral uppercase and lowercase letters in constructor and function-call names, including direct and member names.

Changes

Astral Unicode capitalization

Layer / File(s) Summary
Code point detection and rule tests
lib/rules/new-cap.js, tests/lib/rules/new-cap.js
getCap reads the first Unicode code point. Tests check valid and invalid constructor and function-call names that begin with astral letters, including diagnostic columns.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix · Severity of issue fixed: Low

Suggested reviewers: pixel998

Merge Risk: ⚪ Minimal · up to ca93f

The change addresses astral-letter capitalization detection and includes regression cases for constructor and function calls, including member names. No merge-blocking issue is identified.

Architecture Summary

Architecture risk: 🔵 Low · up to ca93f

The change affects 2 systems.

Changed systems: lib, tests

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — lib (service) was modified; 1 changed file maps to changed impact.
  • observed — tests (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in lib/rules/new-cap.js: getCap now reads the first Unicode code point rather than the first UTF-16 code unit, affecting capitalization detection for characters represented by surrogate pairs.
  • observed — Modified behavior in tests/lib/rules/new-cap.js: Adds valid cases for an astral uppercase identifier used with new and an astral lowercase identifier used as a function call.
  • observed — Modified behavior in tests/lib/rules/new-cap.js: Adds invalid cases for astral lowercase constructor names and uppercase function-call names, both directly and as member names. The expectations specify lower or upper diagnostics and columns spanning the two-column identifier.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely identifies the main change: adding support for astral letters in the new-cap rule.
Linked Issues check ✅ Passed The PR addresses #21356. getCap() now uses const [firstChar] = str, which reads the first Unicode code point instead of the first UTF-16 code unit. The added tests cover astral uppercase and lower…
Out of Scope Changes check ✅ Passed The diff changes only lib/rules/new-cap.js and its rule tests. The implementation change directly fixes the astral-letter detection reported in #21356. The added tests provide regression coverage fo…
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 2 files.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Create a new PR

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.

@mdjermanovic mdjermanovic added accepted There is consensus among the team that this change meets the criteria for inclusion bug ESLint is working incorrectly labels Sep 26, 2026

@mdjermanovic mdjermanovic left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks! Leaving it open for three more days to give others a chance to review before merging.

@lumirlumir lumirlumir left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@fasttime fasttime left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@fasttime
fasttime merged commit 4618052 into eslint:main Sep 29, 2026
46 checks passed
elrincondehiro pushed a commit to elrincondehiro/web-ecommerce that referenced this pull request Oct 5, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | Type | Update |
|---|---|---|---|---|---|
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`24.9.2` → `24.19.1`](https://renovatebot.com/diffs/npm/@types%2fnode/24.9.2/24.19.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/24.19.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/24.9.2/24.19.1?slim=true) | devDependencies | minor |
| [axllent/mailpit](https://mailpit.axllent.org) ([source](https://github.com/axllent/mailpit)) | `v1.31.3` → `v1.31.4` | ![age](https://developer.mend.io/api/mc/badges/age/docker/axllent%2fmailpit/v1.31.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/docker/axllent%2fmailpit/v1.31.3/v1.31.4?slim=true) |  | patch |
| [bits-ui](https://github.com/huntabyte/bits-ui) | [`2.19.3` → `2.19.5`](https://renovatebot.com/diffs/npm/bits-ui/2.19.3/2.19.5) | ![age](https://developer.mend.io/api/mc/badges/age/npm/bits-ui/2.19.5?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/bits-ui/2.19.3/2.19.5?slim=true) | dependencies | patch |
| [eslint](https://eslint.org) ([source](https://github.com/eslint/eslint)) | [`10.11.0` → `10.12.0`](https://renovatebot.com/diffs/npm/eslint/10.11.0/10.12.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/eslint/10.12.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint/10.11.0/10.12.0?slim=true) | dependencies | minor |
| [eslint](https://eslint.org) ([source](https://github.com/eslint/eslint)) | [`10.11.0` → `10.12.0`](https://renovatebot.com/diffs/npm/eslint/10.11.0/10.12.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/eslint/10.12.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint/10.11.0/10.12.0?slim=true) | devDependencies | minor |
| [pnpm](https://github.com/pnpm/pnpm/tree/main/pnpm) ([source](https://github.com/pnpm/pnpm/tree/HEAD/pnpm/npm/pnpm)) | [`12.8.2` → `12.9.1`](https://renovatebot.com/diffs/npm/pnpm/12.8.2/12.9.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/12.9.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/12.8.2/12.9.1?slim=true) | packageManager | minor |
| [pnpm](https://github.com/pnpm/pnpm/tree/main/pnpm) ([source](https://github.com/pnpm/pnpm/tree/HEAD/pnpm/npm/pnpm)) | [`12.8.2` → `12.9.1`](https://renovatebot.com/diffs/npm/pnpm/12.8.2/12.9.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/12.9.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/12.8.2/12.9.1?slim=true) | engines | minor |
| [renovate/renovate](https://renovatebot.com) ([source](https://github.com/renovatebot/renovate)) | [`44.132.2` → `44.133.0`](https://octochangelog.com/compare?repo=renovatebot%2Frenovate&from=44.132.2&to=44.133.0) | ![age](https://developer.mend.io/api/mc/badges/age/docker/renovate%2frenovate/44.133.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/docker/renovate%2frenovate/44.132.2/44.133.0?slim=true) | container | minor |

---

### Release Notes

<details>
<summary>axllent/mailpit (axllent/mailpit)</summary>

### [`v1.31.4`](https://github.com/axllent/mailpit/blob/HEAD/CHANGELOG.md#v1314)

[Compare Source](axllent/mailpit@v1.31.3...v1.31.4)

##### Fix

- Prevent duplicate messages from being added in websocket handlers ([#&#8203;737](axllent/mailpit#737))
- Set hostname for HELO/EHLO in SMTP client creation ([#&#8203;738](axllent/mailpit#738))

</details>

<details>
<summary>huntabyte/bits-ui (bits-ui)</summary>

### [`v2.19.5`](https://github.com/huntabyte/bits-ui/releases/tag/bits-ui%402.19.5)

[Compare Source](https://github.com/huntabyte/bits-ui/compare/bits-ui@2.19.4...bits-ui@2.19.5)

##### Patch Changes

- fix(Select): ensure `Select.Value` labels persist after the select is closed ([#&#8203;2066](huntabyte/bits-ui#2066))

- fix(DismissibleLayer): dismiss on a touch tap whose `click` follows its `pointerdown` within a few milliseconds. The click listener was armed only after a 10ms debounce, so on WebKit (mobile Safari) a quick tap on a sibling trigger landed before it and left the open layer open beside the new one. ([#&#8203;2182](huntabyte/bits-ui#2182))

- fix(body-scroll-lock): restore only modified body styles to preserve concurrent changes ([#&#8203;2175](huntabyte/bits-ui#2175))

- Fix `DateRangePicker` and `DateRangeField` not reformatting their segments when the `locale` prop changes after mount. ([#&#8203;2150](huntabyte/bits-ui#2150))

- fix(FocusScope): trap and restore focus inside a Shadow Root. Focus reads now follow `shadowRoot.activeElement` and the `focusin` target comes from `composedPath()`, so Tab wraps within the scope and focus returns to a trigger inside the root on close. ([#&#8203;2180](huntabyte/bits-ui#2180))

### [`v2.19.4`](https://github.com/huntabyte/bits-ui/releases/tag/bits-ui%402.19.4)

[Compare Source](https://github.com/huntabyte/bits-ui/compare/bits-ui@2.19.3...bits-ui@2.19.4)

##### Patch Changes

- fix(PopperLayer): destructure the internal `forceMount` prop out of `restProps` so it stops leaking onto the rendered content element as an invalid `forcemount` attribute (Popover, Select, Combobox, DropdownMenu, ContextMenu, Menubar, Tooltip, LinkPreview) ([#&#8203;2176](huntabyte/bits-ui#2176))

- fix(DismissibleLayer): dismiss on a touch tap even when the tapped element stops click propagation. Touch outside-dismissal waits for the tap's `click` on the document, and a bubbling listener never hears a click whose target handler calls `stopPropagation()`, so the layer stayed open behind elements that own their clicks. ([#&#8203;2155](huntabyte/bits-ui#2155))

</details>

<details>
<summary>eslint/eslint (eslint)</summary>

### [`v10.12.0`](https://github.com/eslint/eslint/releases/tag/v10.12.0)

[Compare Source](eslint/eslint@v10.11.0...v10.12.0)

##### Features

- [`4618052`](eslint/eslint@4618052) feat: handle astral letters in `new-cap` ([#&#8203;21357](eslint/eslint#21357)) (sary)
- [`4ec5168`](eslint/eslint@4ec5168) feat: allow `SourceCode#getText()` to accept tokens and comments ([#&#8203;21340](eslint/eslint#21340)) (electrohyun)

##### Bug Fixes

- [`bc51eee`](eslint/eslint@bc51eee) fix: `prefer-arrow-callback` false positive in conditional test ([#&#8203;21373](eslint/eslint#21373)) (Daniel Pinto)
- [`bbff86c`](eslint/eslint@bbff86c) fix: skip lines with multiple comments in `max-lines-per-function` ([#&#8203;21332](eslint/eslint#21332)) (xbinaryx)
- [`efc4d6b`](eslint/eslint@efc4d6b) fix: astral letters in `consistent-return`, `no-eval`, `no-invalid-this` ([#&#8203;21360](eslint/eslint#21360)) (lumir)
- [`93de066`](eslint/eslint@93de066) fix: prefer-exponentiation-operator autofix for async function base ([#&#8203;21322](eslint/eslint#21322)) (Vladimir Babin)
- [`02e34ff`](eslint/eslint@02e34ff) fix: add missing space after `else` in `curly` autofix ([#&#8203;21355](eslint/eslint#21355)) (Pixel)
- [`b14b8bc`](eslint/eslint@b14b8bc) fix: correct `id-length` message for long private names ([#&#8203;21348](eslint/eslint#21348)) (Pixel)
- [`69aac01`](eslint/eslint@69aac01) fix: support `TSFunctionType` in `getFunctionHeadLoc` ([#&#8203;21335](eslint/eslint#21335)) (xbinaryx)
- [`686630e`](eslint/eslint@686630e) fix: `no-loss-of-precision` false positive with `0.e5` ([#&#8203;21337](eslint/eslint#21337)) (sethamus)

##### Documentation

- [`67eb586`](eslint/eslint@67eb586) docs: Update README (GitHub Actions Bot)
- [`5370d7e`](eslint/eslint@5370d7e) docs: clarify `one-var` `separateRequires` matches any `require()` call ([#&#8203;21192](eslint/eslint#21192)) (sethamus)
- [`8816c1d`](eslint/eslint@8816c1d) docs: Update README (GitHub Actions Bot)
- [`3d2e7ce`](eslint/eslint@3d2e7ce) docs: fix typo in no-unused-expressions documentation ([#&#8203;21346](eslint/eslint#21346)) (bytedoe)

##### Chores

- [`152067f`](eslint/eslint@152067f) chore: update ecosystem plugins ([#&#8203;21362](eslint/eslint#21362)) (ESLint Bot)
- [`b56d58e`](eslint/eslint@b56d58e) chore: update github/codeql-action action to v4.38.2 ([#&#8203;21376](eslint/eslint#21376)) (renovate\[bot])
- [`bfaea12`](eslint/eslint@bfaea12) perf: cache normalized config globals per languageOptions ([#&#8203;21364](eslint/eslint#21364)) (James Ross)
- [`322209e`](eslint/eslint@322209e) ci: avoid Nx cache in ecosystem tests and disable failing test ([#&#8203;21369](eslint/eslint#21369)) (Francesco Trotta)
- [`d166567`](eslint/eslint@d166567) chore: update dependency prettier to v3.9.9 ([#&#8203;21371](eslint/eslint#21371)) (renovate\[bot])
- [`29585ce`](eslint/eslint@29585ce) chore: update dependency eslint-plugin-expect-type to ^0.7.0 ([#&#8203;21359](eslint/eslint#21359)) (renovate\[bot])
- [`39d79ba`](eslint/eslint@39d79ba) chore: update github/codeql-action action to v4.38.1 ([#&#8203;21354](eslint/eslint#21354)) (renovate\[bot])
- [`182a6e9`](eslint/eslint@182a6e9) chore: update dependency prettier to v3.9.8 ([#&#8203;21352](eslint/eslint#21352)) (renovate\[bot])
- [`f995127`](eslint/eslint@f995127) chore: remove CLAUDE.md in favor of AGENTS.md ([#&#8203;21339](eslint/eslint#21339)) (Jarren)
- [`b95fb6c`](eslint/eslint@b95fb6c) chore: update dependency prettier to v3.9.7 ([#&#8203;21347](eslint/eslint#21347)) (renovate\[bot])
- [`3782dd4`](eslint/eslint@3782dd4) chore: update ecosystem plugins ([#&#8203;21342](eslint/eslint#21342)) (ESLint Bot)

</details>

<details>
<summary>pnpm/pnpm (pnpm)</summary>

### [`v12.9.1`](https://github.com/pnpm/pnpm/releases/tag/v12.9.1): pnpm 12.9.1

[Compare Source](pnpm/pnpm@v12.9.0...v12.9.1)

This release moves the WebContainer build into a separate `@pnpm/wasm` package, shrinks the `pnpm` package back to about 4 MB, and fixes `pnpm publish` with provenance from GitLab CI.

##### Patch Changes

- The WebAssembly build for StackBlitz WebContainers now ships as a separate `@pnpm/wasm` package. The `pnpm` and `@pnpm/exe` packages no longer include it, which brings their unpacked size back from about 55 MB to about 4 MB. In a WebContainer, install `@pnpm/wasm` with npm to get the `pnpm` command.

- `pnpm publish` with provenance from GitLab CI is no longer rejected by the npm registry with a 422 error. The provenance statement now includes the GitLab CI variables in `invocation.parameters`, as npm does [#&#8203;16551](pnpm/pnpm#16551).

- `pnpm audit signatures` now uses the TLS settings of the redirect target when a registry redirects its signing-keys request, for example to registry.npmjs.org. A `cafile` scoped to a private registry no longer makes the redirected request fail [#&#8203;16541](pnpm/pnpm#16541).

- Fixed `pnpm install --frozen-lockfile` rejecting an up-to-date lockfile when an injected workspace package uses a catalog entry in `peerDependencies` [#&#8203;16557](pnpm/pnpm#16557).

- The `[<since>]` filter selector works again with Git 2.24 through 2.27 [#&#8203;16561](pnpm/pnpm#16561). With Git older than 2.24, the selector now fails with an error that names the required Git version.

  It also detects changes in projects whose directory names contain non-ASCII characters. Such a change used to be credited to the parent project. `changedFilesIgnorePattern` and `testPattern` now match changed files whose names contain non-ASCII characters.

- The `pnpm` executable is about 10% smaller. On macOS arm64 it went from 45.1 MB to 40.3 MB.

- Sped up trust downgrade checks for packages with long release histories.

- With `optimisticRepeatInstall: false`, `pnpm install` now runs the projects' own lifecycle scripts, such as `prepare`, even when `node_modules` is already up to date [#&#8203;16545](pnpm/pnpm#16545).

- `pnpm self-update` now fails for Homebrew-installed pnpm and prints the `brew upgrade` command for the installed formula, such as `brew upgrade pnpm` or `brew upgrade pnpm@11`. It used to install a second copy of pnpm that the Homebrew one kept shadowing [#&#8203;16547](pnpm/pnpm#16547).

<!-- sponsors -->

##### Platinum Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
        <a href="https://bit.cloud/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer"><img src="https://pnpm.io/img/users/bit.svg" width="80" alt="Bit"></a>
      </td>
      <td align="center" valign="middle">
        <a href="https://openai.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/openai_dark.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/openai_light.svg" />
            <img src="https://pnpm.io/img/users/openai_dark.svg" width="160" alt="OpenAI" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://notion.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer"><img src="https://pnpm.io/img/users/notion.svg" width="80" alt="Notion"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
        <a href="https://coderabbit.ai/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/coderabbit.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/coderabbit_light.svg" />
            <img src="https://pnpm.io/img/users/coderabbit.svg" width="220" alt="CodeRabbit" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

##### Gold Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
        <a href="https://sanity.io/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/sanity.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/sanity_light.svg" />
            <img src="https://pnpm.io/img/users/sanity.svg" width="120" alt="Sanity" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://discord.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/discord.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/discord_light.svg" />
            <img src="https://pnpm.io/img/users/discord.svg" width="220" alt="Discord" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://vite.dev/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer"><img src="https://pnpm.io/img/users/vitejs.svg" width="42" alt="Vite"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
        <a href="https://serpapi.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/serpapi_dark.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/serpapi_light.svg" />
            <img src="https://pnpm.io/img/users/serpapi_dark.svg" width="160" alt="SerpApi" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://stackblitz.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/stackblitz.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/stackblitz_light.svg" />
            <img src="https://pnpm.io/img/users/stackblitz.svg" width="190" alt="Stackblitz" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://workleap.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/workleap.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/workleap_light.svg" />
            <img src="https://pnpm.io/img/users/workleap.svg" width="190" alt="Workleap" />
          </picture>
        </a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
        <a href="https://nx.dev/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/nx.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/nx_light.svg" />
            <img src="https://pnpm.io/img/users/nx.svg" width="50" alt="Nx" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://latitude.so/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer"><img src="https://pnpm.io/img/users/latitude.svg" width="160" alt="Latitude"></a>
      </td>
    </tr>
  </tbody>
</table>

<!-- sponsors end -->

### [`v12.9.0`](https://github.com/pnpm/pnpm/releases/tag/v12.9.0): pnpm 12.9

[Compare Source](pnpm/pnpm@v12.8.2...v12.9.0)

This release runs pnpm in StackBlitz WebContainers, adds a per-registry `networkConcurrency` setting, and records every installed project in the store. It also carries a security fix for `pnpm login`.

##### Minor Changes

- pnpm now automatically uses WebAssembly in StackBlitz WebContainers, including when installation scripts are disabled. Native installations continue to use the native executable when installation scripts are enabled.

- A `registries` entry can now set `networkConcurrency`, the most requests pnpm keeps in flight to that registry's origin. Requests to other registries keep the overall limit. The setting may live in `pnpm-workspace.yaml` or the global `config.yaml`.

  ```yaml
  registries:
    https://npm.corp.example.com/:
      scopes: ["@acme"]
      networkConcurrency: 4
  ```

- `pnpm install` now records every project it installs in the store's `projects` directory, as a symlink to the project directory. A `--frozen-store` install without the global virtual store still records nothing. Only projects that used the global virtual store were recorded before [#&#8203;6929](pnpm/pnpm#6929).

##### Patch Changes

- `pnpm login` no longer forwards credentials in its request body to another origin during redirects.

##### Installing packages

- Fixed `pnpm install` failing on Android with `ERR_PNPM_STORE_DIR_ACQUIRE_OPERATION_LOCK` [#&#8203;16508](pnpm/pnpm#16508).

- `pnpm install --frozen-lockfile` again succeeds when a workspace project recorded in `pnpm-lock.yaml` has no directory, such as a project left out of a Docker build context. It still fails if the project's directory exists without a `package.json` [#&#8203;16453](pnpm/pnpm#16453).

- `pnpm install --frozen-lockfile` no longer requires a `pnpm-lock.yaml` in a project that has no dependencies. It also succeeds when `pnpm-lock.yaml` records only the pinned pnpm version, as other commands write it when they run before the first install [#&#8203;16477](pnpm/pnpm#16477).

- Fixed `pnpm install --frozen-lockfile` rejecting a fresh lockfile when an injected workspace dependency has an optional peer supplied by another workspace project [#&#8203;16428](pnpm/pnpm#16428).

- With `nodeLinker: hoisted`, a filtered install now keeps the packages of the workspace projects an earlier install put in `node_modules`. This also covers the install that `pnpm --filter <selector> run` and `pnpm --filter <selector> exec` start before the command. Before, these installs removed every package that only the unselected projects needed [#&#8203;16483](pnpm/pnpm#16483).

- `pnpm install` with `nodeLinker: hoisted` now refreshes directories supplied by custom fetchers when reinstalling. pnpm also keeps the symlinks inside those directories.

- With `enableGlobalVirtualStore` on, scripts can run entry points that a CommonJS require hook loads again, such as `ts-node index.ts`. They failed with `ERR_UNKNOWN_FILE_EXTENSION` on Node.js versions without built-in TypeScript support [#&#8203;16436](pnpm/pnpm#16436).

- pnpm now keeps each project's current lockfile and hidden hoisted dependencies in its own `node_modules/.pnpm` when `virtualStoreDir` points at a shared global virtual store. `--virtual-store-dir` now sets the global virtual store's location too [pnpm/tasks#47](pnpm/tasks#47).

- `pnpm clean` no longer deletes the project when `virtualStoreDir` or `globalVirtualStoreDir` is set to the project directory. It also leaves a directory outside the project alone when the setting reaches it through a symlink. It now removes a global virtual store that `globalVirtualStoreDir` places inside the project, as it does for `virtualStoreDir`.

##### Optional dependencies

- `pnpm install` no longer fails when a dependency of an optional dependency is missing from the registry. Like npm, pnpm now leaves out the nearest optional dependency above it, together with its subtree [#&#8203;16511](pnpm/pnpm#16511).

- When an optional dependency fails to build, pnpm now removes its link from `node_modules`. A repeat `pnpm install` then reports "Already up to date" and no longer reruns the failing build [#&#8203;16468](pnpm/pnpm#16468).

- `pnpm install` now prints a warning with the error when an optional dependency cannot be fetched and is skipped. The skipped package is no longer counted in the `Packages: +N` summary. The `pnpm:skipped-optional-dependency` log reports the skip with the `fetch_failure` reason [#&#8203;16514](pnpm/pnpm#16514).

##### Resolving dependencies

- Fixed `pnpm install` changing an unchanged project's direct dependency to a sibling workspace's pinned version when its dependency tree contains a cycle [#&#8203;16417](pnpm/pnpm#16417).

- With `autoDedupe` enabled, downgrading a dependency in one workspace project now moves the other projects to that version when it satisfies their ranges. This also applies to a filtered `pnpm --filter <project> add` [#&#8203;16432](pnpm/pnpm#16432).

- `pnpm install` and `pnpm dedupe` now move an optional peer to the version already in the dependency graph when no other package provides its locked version anymore. After a bump such as `vue` 3.5.40 to 3.5.43, the lockfile kept a second copy of `@vue/server-renderer` for `@vue/test-utils` [#&#8203;16443](pnpm/pnpm#16443).

- `pnpm dedupe --check` no longer fails right after `pnpm install` when a project's optional peer is satisfied by a package another workspace project installs. `pnpm dedupe` now picks the same versions for that package's dependencies as `pnpm install` [#&#8203;16447](pnpm/pnpm#16447).

- `pnpm install` no longer re-resolves an up-to-date lockfile on every run when a patched package is a peer in a peer cycle [#&#8203;16418](pnpm/pnpm#16418).

- With `autoDedupe` enabled, `pnpm install --lockfile-only` no longer resolves the dependency graph again when nothing changed since an earlier `--lockfile-only` install deduplicated the lockfile. Such an install keeps the lockfile even if versions were published since it was written, or if only a setting such as `resolutionMode` changed. Run `pnpm dedupe` to apply such a change [#&#8203;16458](pnpm/pnpm#16458).

##### Speed and network

- A repeat `pnpm install` in a large workspace reports "Already up to date" faster [#&#8203;16487](pnpm/pnpm#16487).

- Sped up dependency resolution of workspaces with many peer dependencies.

- `pnpm install` sends fewer registry metadata requests when the lockfile already decides which version a range resolves to. This now also covers ranges that several locked versions satisfy when one of them outranks the others, and direct dependencies kept at their locked version. Packages that `minimumReleaseAgeExclude` lists without a version now reuse cached registry metadata the same way they do when `minimumReleaseAge` is not set [#&#8203;16458](pnpm/pnpm#16458).

- pnpm no longer downloads every packument again on each install from a registry whose metadata responses forbid caching, such as `Cache-Control: no-store`. pnpm revalidates the cached metadata with a conditional request, so a registry that supports conditional requests answers with a 304 when the package has not changed [#&#8203;16528](pnpm/pnpm#16528).

- Cached metadata for a package published within `minimumReleaseAge` is now revalidated with its ETag, so the npm registry can answer `304 Not Modified`. Before, the next install that checked the cache downloaded the whole document again [#&#8203;16506](pnpm/pnpm#16506).

- A fetch timeout while other downloads from the same host are still running now lowers concurrency for that host to one connection. Retries of that request, and later downloads from that host, use the lower concurrency. Other hosts keep the configured concurrency [#&#8203;12791](pnpm/pnpm#12791).

- Sped up `pnpm install --offline` when the version a range picks is not in the store. While it looks for a version the store holds, pnpm now reads only the versions the range admits [#&#8203;16495](pnpm/pnpm#16495).

- `pnpm install --offline` now reuses config dependency tarballs that are already present in the store [pnpm/tasks#46](pnpm/tasks#46).

##### Running scripts

- `pnpm -s <script>` runs the script again, with `-s` meaning `--sequential` as it does for `pnpm run -s <script>`. pnpm rejected it with "unexpected argument '-s' found" [#&#8203;16446](pnpm/pnpm#16446).

- `pnpm run` and `pnpm exec` now warn and run the command when the install that `verifyDepsBeforeRun` starts fails. This lets scripts run in sandboxes where pnpm cannot install, such as containers with a read-only store or no network [#&#8203;15173](pnpm/pnpm#15173).

- A filtered `pnpm run` or `pnpm exec` now finds dependencies out of date when a workspace dependency of a selected project has no `node_modules` directory, as after a filtered install. With `verifyDepsBeforeRun: install`, pnpm installs that dependency before running the command [pnpm/tasks#45](pnpm/tasks#45).

- Scripts run without a terminal no longer start a second `sh` each. One watchdog per pnpm command now ends every script's process group if pnpm is killed, so `pnpm -r run` across many projects starts half as many processes [#&#8203;16489](pnpm/pnpm#16489).

- `Terminate batch job (Y/N)?` no longer appears after pressing Ctrl+C in a script started with `pnpm` from PowerShell or cmd on Windows [#&#8203;16502](pnpm/pnpm#16502).

- `pnpm rebuild` and `pnpm approve-builds` refresh command launchers when a build changes a command's interpreter or replaces it with a native executable. Dependent packages' build scripts use the refreshed launchers.

- When `pnpm run <script>` or `pnpm <script>` finds nothing to run and `--filter` follows the script name, the error now suggests putting the filter option before the script name [#&#8203;4655](pnpm/pnpm#4655).

- Package-name filters now support `?` to match one character [#&#8203;2817](pnpm/pnpm#2817).

##### The pinned pnpm and `pnpm self-update`

- pnpm no longer downloads the project's pinned pnpm version again on every command when `nodeVersion` in `pnpm-workspace.yaml` names a different Node.js major than the `node` on `PATH`. Before, each of those commands took about a second longer and failed without network access [#&#8203;16497](pnpm/pnpm#16497).

- Several `pnpm` commands started at once in a project that pins `packageManager` no longer fail with `The process cannot access the file because it is being used by another process` on Windows while the pinned pnpm is being installed.

- pnpm can now switch to a `packageManager` version below 11 on x64 musl Linux, such as Alpine [#&#8203;16467](pnpm/pnpm#16467).

- A `devEngines.packageManager` range no longer makes pnpm replace the version recorded in `pnpm-lock.yaml` with the running pnpm while the recorded version still satisfies the range. When pnpm does record a version, it records the running pnpm only if it meets `minimumReleaseAge`. Otherwise it records the newest version in the range that meets it, or the running pnpm if none does [#&#8203;16431](pnpm/pnpm#16431).

- On Windows, `pnpm self-update` now replaces a `pnpm.exe` left in `PNPM_HOME` or in `PNPM_HOME\bin`. Windows ran that executable in place of the updated `pnpm.cmd` shim, so `pnpm --version` kept printing the old version after a successful update. If the executable was in `PNPM_HOME`, `self-update` now asks you to run `pnpm setup` [#&#8203;9094](pnpm/pnpm#9094).

- `pnpm self-update` now checks that a version installed as the JavaScript `pnpm` can start before making it the global `pnpm`. If Node.js is missing, the update fails and the current `pnpm` stays in place.

##### Other commands

- `pnpm deploy` now finds patches and local dependencies when the target directory sits under a symlink, such as `/tmp` on macOS. It failed with `ERR_PNPM_PATCH_NOT_FOUND` [#&#8203;16470](pnpm/pnpm#16470).

- `pnpm deploy --legacy` now resolves the deployed project's relative `file:`, `link:`, and path dependencies from the project's own directory [#&#8203;16475](pnpm/pnpm#16475).

- `pnpm update --global` now removes hard-linked executables from `PNPM_HOME` when migrating packages from the old global layout [#&#8203;16420](pnpm/pnpm#16420).

- `pnpm store prune` no longer fails on store index entries that pnpm 11 wrote for git-hosted packages without a `package.json`. Entries that still cannot be read are kept and counted in the prune summary.

- `pnpm store prune` now aborts when an error other than a missing directory occurs while scanning project directories in the mark phase.

- `pnpm config get` and `pnpm config list` now report a setting given on the command line with `--config.<name>=<value>`. Before, a value such as `--config.node-linker=hoisted` reached the install but was absent from the reported configuration [#&#8203;16276](pnpm/pnpm#16276).

- `pnpm -r pkg get` now reports every selected project when several share a package name. Projects with the same name are keyed by their directory relative to the workspace root. Before, only one of them appeared in the output.

- The install summary shows a `link:` dependency as `+ name <- path`, and the Node.js API's `hideLinkedPkgsDiff` reporter option leaves matching linked dependencies out of the summary.

- The `--force` help text of `pnpm install` and `pnpm add` now says that `--force` keeps skipping optional dependencies built for other platforms. It points to `forceIgnoresPlatform` and the `--os`, `--cpu`, and `--libc` options for installing them [#&#8203;16435](pnpm/pnpm#16435).

- The `homepage` field of the published `pnpm` package points to <https://pnpm.io> again.

<!-- sponsors -->

##### Platinum Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
        <a href="https://bit.cloud/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer"><img src="https://pnpm.io/img/users/bit.svg" width="80" alt="Bit"></a>
      </td>
      <td align="center" valign="middle">
        <a href="https://openai.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/openai_dark.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/openai_light.svg" />
            <img src="https://pnpm.io/img/users/openai_dark.svg" width="160" alt="OpenAI" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://notion.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer"><img src="https://pnpm.io/img/users/notion.svg" width="80" alt="Notion"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
        <a href="https://coderabbit.ai/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/coderabbit.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/coderabbit_light.svg" />
            <img src="https://pnpm.io/img/users/coderabbit.svg" width="220" alt="CodeRabbit" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

##### Gold Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
        <a href="https://sanity.io/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/sanity.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/sanity_light.svg" />
            <img src="https://pnpm.io/img/users/sanity.svg" width="120" alt="Sanity" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://discord.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/discord.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/discord_light.svg" />
            <img src="https://pnpm.io/img/users/discord.svg" width="220" alt="Discord" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://vite.dev/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer"><img src="https://pnpm.io/img/users/vitejs.svg" width="42" alt="Vite"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
        <a href="https://serpapi.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/serpapi_dark.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/serpapi_light.svg" />
            <img src="https://pnpm.io/img/users/serpapi_dark.svg" width="160" alt="SerpApi" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://stackblitz.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/stackblitz.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/stackblitz_light.svg" />
            <img src="https://pnpm.io/img/users/stackblitz.svg" width="190" alt="Stackblitz" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://workleap.com/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/workleap.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/workleap_light.svg" />
            <img src="https://pnpm.io/img/users/workleap.svg" width="190" alt="Workleap" />
          </picture>
        </a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
        <a href="https://nx.dev/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer">
          <picture>
            <source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/nx.svg" />
            <source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/nx_light.svg" />
            <img src="https://pnpm.io/img/users/nx.svg" width="50" alt="Nx" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
        <a href="https://latitude.so/?utm_source=pnpm&utm_medium=release_notes" rel="noopener noreferrer"><img src="https://pnpm.io/img/users/latitude.svg" width="160" alt="Latitude"></a>
      </td>
    </tr>
  </tbody>
</table>

<!-- sponsors end -->

</details>

<details>
<summary>renovatebot/renovate (renovate/renovate)</summary>

### [`v44.133.0`](https://github.com/renovatebot/renovate/releases/tag/44.133.0)

[Compare Source](renovatebot/renovate@44.132.6...44.133.0)

##### Features

- **data:** automatic update of static data ([#&#8203;46734](renovatebot/renovate#46734)) ([474cddd](renovatebot/renovate@474cddd))

### [`v44.132.6`](https://github.com/renovatebot/renovate/releases/tag/44.132.6)

[Compare Source](renovatebot/renovate@44.132.5...44.132.6)

##### Bug Fixes

- **deps:** update ghcr.io/renovatebot/base-image docker tag to v13.109.4 (main) ([#&#8203;46738](renovatebot/renovate#46738)) ([eee241a](renovatebot/renovate@eee241a))

##### Miscellaneous Chores

- **deps:** update dependency [@&#8203;containerbase/istanbul-reports-html](https://github.com/containerbase/istanbul-reports-html) to v2.0.20 (main) ([#&#8203;46736](renovatebot/renovate#46736)) ([06a4f33](renovatebot/renovate@06a4f33))

### [`v44.132.5`](https://github.com/renovatebot/renovate/releases/tag/44.132.5)

[Compare Source](renovatebot/renovate@44.132.4...44.132.5)

##### Bug Fixes

- **deps:** update ghcr.io/renovatebot/base-image docker tag to v13.109.3 (main) ([#&#8203;46730](renovatebot/renovate#46730)) ([d2d046b](renovatebot/renovate@d2d046b))

##### Miscellaneous Chores

- **deps:** update dependency astral-sh/uv to v0.12.23 (main) ([#&#8203;46728](renovatebot/renovate#46728)) ([dcfd322](renovatebot/renovate@dcfd322))
- **deps:** update dependency uv to v0.12.23 (main) ([#&#8203;46729](renovatebot/renovate#46729)) ([33ea57d](renovatebot/renovate@33ea57d))

##### Build System

- **deps:** update dependency re2 to v1.27.0 (main) ([#&#8203;46731](renovatebot/renovate#46731)) ([e0e072e](renovatebot/renovate@e0e072e))

### [`v44.132.4`](https://github.com/renovatebot/renovate/releases/tag/44.132.4)

[Compare Source](renovatebot/renovate@44.132.3...44.132.4)

##### Bug Fixes

- **deps:** update ghcr.io/renovatebot/base-image docker tag to v13.109.2 (main) ([#&#8203;46727](renovatebot/renovate#46727)) ([fa3b4c1](renovatebot/renovate@fa3b4c1))

### [`v44.132.3`](https://github.com/renovatebot/renovate/releases/tag/44.132.3)

[Compare Source](renovatebot/renovate@44.132.2...44.132.3)

##### Bug Fixes

- **workers/lookup:** only flag downgrades when the versioning orders the values ([#&#8203;46725](renovatebot/renovate#46725)) ([ebdf90a](renovatebot/renovate@ebdf90a)), closes [#&#8203;46146](renovatebot/renovate#46146)

##### Miscellaneous Chores

- **deps:** update dependency [@&#8203;types/node](https://github.com/types/node) to v24.19.0 (main) ([#&#8203;46721](renovatebot/renovate#46721)) ([4b92bb8](renovatebot/renovate@4b92bb8))
- **deps:** update dependency lint-staged to v17.6.0 (main) ([#&#8203;46722](renovatebot/renovate#46722)) ([bd2458a](renovatebot/renovate@bd2458a))
- **deps:** update dependency pnpm to v11.28.0 (main) ([#&#8203;46688](renovatebot/renovate#46688)) ([ae4be16](renovatebot/renovate@ae4be16))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Madrid)

- Branch creation
  - "before 7am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzIuMiIsInVwZGF0ZWRJblZlciI6IjQ0LjEzMi4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.hirokobu.duckdns.org/jacknoddy/web-ecommerce/pulls/23
Co-authored-by: renovate-bot <renovate@bot.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

accepted There is consensus among the team that this change meets the criteria for inclusion bug ESLint is working incorrectly feature This change adds a new feature to ESLint rule Relates to ESLint's core rules

Projects

Status: Complete

Development

Successfully merging this pull request may close these issues.

Bug: new-cap doesn't report names starting with an astral letter

4 participants