Two costs on the .attrs path are gone. Object-form .attrs() left the rendered target unchanged but still re-resolved that target's whole prop bag on every call, making .attrs on an HTML or SVG tag far costlier than on a wrapped component; it now reuses the props already resolved for the tag. Separately, making attrs-provided keys optional ran an avoidably expensive pass over the target's full prop set on every attrs component. Together these cut consumer type-check work measurably across every .attrs form, with no change to the resulting component's accepted props. Redirecting the target with .attrs({ as }), including the function form, is unaffected.
Assigning a styled component to an explicit type, as isolatedDeclarations and any package that emits .d.ts files must (const Button: IStyledComponentBase<'web', ...> = styled.button``), used to be several times more expensive to check than an inferred one, because the annotation's styleand the component's widenedstyle` were two different csstype representations that the checker compared property by property.
The inline style widening now builds on React's own CSSProperties, the same type a hand-written annotation carries, so that comparison short-circuits. On a 40-component fixture this cut the types created for the annotated pattern by about 21%, with no change to what style accepts: CSS custom properties, a component's own narrow style, and style={undefined} all behave exactly as before.
00b9ee2: styled() wrapping a generic polymorphic component keeps its declared props narrow.
Wrapping a component whose props are generic over an element type, such as the common <C extends React.ElementType>(props: PolymorphicProps<C, OwnProps>) pattern, used to let the styled result accept prop values the component itself rejects: styled(Button) would take variant="anything" even though <Button variant="anything"> is a type error. The wrapper now narrows those props exactly as the direct component does, so a bad value is caught in both places. Valid props, children, and plain (non-generic) targets are unaffected.
Configuration
📅Schedule: (UTC)
Branch creation
At any time (no schedule defined)
Automerge
At any time (no schedule defined)
🚦Automerge: Enabled.
♻ 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 if that's undesired.
If you want to rebase/retry this PR, check this box
This PR contains the following updates:
| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@strapi/plugin-cloud](https://strapi.io) ([source](https://github.com/strapi/strapi/tree/HEAD/packages/plugins/cloud)) | [`5.51.2` → `5.52.0`](https://renovatebot.com/diffs/npm/@strapi%2fplugin-cloud/5.51.2/5.52.0) |  |  |
| [@strapi/plugin-users-permissions](https://strapi.io) ([source](https://github.com/strapi/strapi/tree/HEAD/packages/plugins/users-permissions)) | [`5.51.2` → `5.52.0`](https://renovatebot.com/diffs/npm/@strapi%2fplugin-users-permissions/5.51.2/5.52.0) |  |  |
| [@strapi/strapi](https://strapi.io) ([source](https://github.com/strapi/strapi/tree/HEAD/packages/core/strapi)) | [`5.51.2` → `5.52.0`](https://renovatebot.com/diffs/npm/@strapi%2fstrapi/5.51.2/5.52.0) |  |  |
| [@strapi/typescript-utils](https://strapi.io) ([source](https://github.com/strapi/strapi/tree/HEAD/packages/utils/typescript)) | [`5.51.2` → `5.52.0`](https://renovatebot.com/diffs/npm/@strapi%2ftypescript-utils/5.51.2/5.52.0) |  |  |
| [styled-components](https://styled-components.com) ([source](https://github.com/styled-components/styled-components)) | [`6.5.1` → `6.5.2`](https://renovatebot.com/diffs/npm/styled-components/6.5.1/6.5.2) |  |  |
---
### Release Notes
<details>
<summary>strapi/strapi (@​strapi/plugin-cloud)</summary>
### [`v5.52.0`](https://github.com/strapi/strapi/releases/tag/v5.52.0)
[Compare Source](https://github.com/strapi/strapi/compare/v5.51.2...v5.52.0)
##### 5.52.0 (2026-08-12)
##### 🚀 New feature
- record MCP actions in audit logs ([#​27151](https://github.com/strapi/strapi/pull/27151))
- **i18n:** add locale codes for Corsican ([#​27099](https://github.com/strapi/strapi/pull/27099))
- **server:** enhance Koa app configuration with proxy settings ([#​26409](https://github.com/strapi/strapi/pull/26409))
##### 🔥 Bug fix
- typescript pipeline issue ([99a723d024](https://github.com/strapi/strapi/commit/99a723d024))
- **admin:** dedupe react-dnd in the admin bundle ([#​27217](https://github.com/strapi/strapi/pull/27217))
- **admin:** address filter entries by position so duplicate filter chips behave ([#​27188](https://github.com/strapi/strapi/pull/27188))
- **content-manager:** merge query populate paths to preserve nested populate ([#​27236](https://github.com/strapi/strapi/pull/27236))
- **content-type-builder:** editing relations removes inverse field conditions ([#​27226](https://github.com/strapi/strapi/pull/27226))
- **content-type-builder:** clear stale validation errors when the form data is replaced ([#​27222](https://github.com/strapi/strapi/pull/27222))
- **data-transfer:** skip orphaned links and isolate FK failures on restore ([#​26852](https://github.com/strapi/strapi/pull/26852))
- **permissions:** skip unregistered RBAC conditions during ability generation ([#​27282](https://github.com/strapi/strapi/pull/27282))
- **strapi:** allowlist Vite optimizeDeps.exclude for plugin UI kits ([#​27264](https://github.com/strapi/strapi/pull/27264))
- **upload:** refresh folder header count on upload & delete (CMS-1563) ([#​27231](https://github.com/strapi/strapi/pull/27231))
- **upload:** guard cache-buster on signed URLs in new-ML AssetCropEditor ([#​27228](https://github.com/strapi/strapi/pull/27228))
- **upload:** target current asset in drawer actions ([#​27259](https://github.com/strapi/strapi/pull/27259))
- **upload:** keep infinite scroll loading when the sentinel stays visible (CMS-1562) ([#​27230](https://github.com/strapi/strapi/pull/27230))
##### ⚙️ Chore
- release v5.51.2 update develop ([101643bcfb](https://github.com/strapi/strapi/commit/101643bcfb))
- bump design system version ([#​27292](https://github.com/strapi/strapi/pull/27292))
- **cloud-cli:** migrate unit tests from jest to vitest ([#​27218](https://github.com/strapi/strapi/pull/27218))
- **database:** replace umzug with internal migration runner ([#​26824](https://github.com/strapi/strapi/pull/26824))
- **deps:** bump ip-address from 10.2.0 to 10.4.0 ([#​27238](https://github.com/strapi/strapi/pull/27238))
- **deps:** bump ws from 8.21.1 to 8.21.2 ([#​27239](https://github.com/strapi/strapi/pull/27239))
- **deps:** bump hono from 4.12.27 to 4.13.0 ([#​27243](https://github.com/strapi/strapi/pull/27243))
- **deps:** bump prettier from 3.3.3 to 3.6.2 ([#​27244](https://github.com/strapi/strapi/pull/27244))
- **deps:** bump direct deps and yarn dedupe ([#​27291](https://github.com/strapi/strapi/pull/27291))
- **deps:** bump nanoid from 3.3.16 to 3.3.18 ([#​27329](https://github.com/strapi/strapi/pull/27329))
- **permissions:** migrate unit tests from jest to vitest ([#​27219](https://github.com/strapi/strapi/pull/27219))
- **sentry:** migrate unit tests from jest to vitest ([#​27252](https://github.com/strapi/strapi/pull/27252))
- **tooling:** add admin translation verification ([#​26960](https://github.com/strapi/strapi/pull/26960))
- **upload-aws-s3:** migrate unit tests from jest to vitest ([#​27216](https://github.com/strapi/strapi/pull/27216))
##### 💅 Enhancement
- **utils:** memoize private attributes in sanitizeOutput ([#​27140](https://github.com/strapi/strapi/pull/27140))
- **utils:** stop using a thrown Error to test for boolean-like populate keys ([#​27234](https://github.com/strapi/strapi/pull/27234))
- **utils:** memoize scope decisions and keep the relation visitor sync ([#​27145](https://github.com/strapi/strapi/pull/27145))
##### 🚨 Security
- **deps:** bump [@​modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/sdk) to 1.30.0 ([#​27301](https://github.com/strapi/strapi/pull/27301))
- **upload:** bump sharp to 0.35.3 for libvips CVEs ([#​27255](https://github.com/strapi/strapi/pull/27255))
##### ❤️ Thank You
- Adrien L [@​Adzouz](https://github.com/Adzouz)
- Adrien Lepoutre [@​Adzouz](https://github.com/Adzouz)
- Ayoub Hidri [@​ayhid](https://github.com/ayhid)
- Bassel Kanso
- Ben Irvin
- DMehaffy
- Giulio Montagner [@​giu1io](https://github.com/giu1io)
- Gonzalo Andres Garcia [@​gonbaum](https://github.com/gonbaum)
- Lazizbek Ergashev [@​lazerg](https://github.com/lazerg)
- Markus [@​MarkusAbtion](https://github.com/MarkusAbtion)
- PetruMagdeleine
- Sjouke de Vries [@​sjoukedv](https://github.com/sjoukedv)
- Ziyi [@​butcherZ](https://github.com/butcherZ)
</details>
<details>
<summary>styled-components/styled-components (styled-components)</summary>
### [`v6.5.2`](https://github.com/styled-components/styled-components/releases/tag/styled-components%406.5.2)
[Compare Source](https://github.com/styled-components/styled-components/compare/styled-components@6.5.1...styled-components@6.5.2)
##### Patch Changes
- [`00b9ee2`](https://github.com/styled-components/styled-components/commit/00b9ee2): `.attrs()` is cheaper to type-check.
Two costs on the `.attrs` path are gone. Object-form `.attrs()` left the rendered target unchanged but still re-resolved that target's whole prop bag on every call, making `.attrs` on an HTML or SVG tag far costlier than on a wrapped component; it now reuses the props already resolved for the tag. Separately, making attrs-provided keys optional ran an avoidably expensive pass over the target's full prop set on every attrs component. Together these cut consumer type-check work measurably across every `.attrs` form, with no change to the resulting component's accepted props. Redirecting the target with `.attrs({ as })`, including the function form, is unaffected.
- [`00b9ee2`](https://github.com/styled-components/styled-components/commit/00b9ee2): Explicitly annotated styled components type-check faster.
Assigning a styled component to an explicit type, as `isolatedDeclarations` and any package that emits `.d.ts` files must (`const Button: IStyledComponentBase<'web', ...> = styled.button``), used to be several times more expensive to check than an inferred one, because the annotation's `style`and the component's widened`style\` were two different csstype representations that the checker compared property by property.
The inline `style` widening now builds on React's own `CSSProperties`, the same type a hand-written annotation carries, so that comparison short-circuits. On a 40-component fixture this cut the types created for the annotated pattern by about 21%, with no change to what `style` accepts: CSS custom properties, a component's own narrow `style`, and `style={undefined}` all behave exactly as before.
- [`00b9ee2`](https://github.com/styled-components/styled-components/commit/00b9ee2): `styled()` wrapping a generic polymorphic component keeps its declared props narrow.
Wrapping a component whose props are generic over an element type, such as the common `<C extends React.ElementType>(props: PolymorphicProps<C, OwnProps>)` pattern, used to let the styled result accept prop values the component itself rejects: `styled(Button)` would take `variant="anything"` even though `<Button variant="anything">` is a type error. The wrapper now narrows those props exactly as the direct component does, so a bad value is caught in both places. Valid props, children, and plain (non-generic) targets are unaffected.
</details>
---
### Configuration
📅 **Schedule**: (UTC)
- Branch creation
- At any time (no schedule defined)
- Automerge
- At any time (no schedule defined)
🚦 **Automerge**: Enabled.
♻ **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:eyJjcmVhdGVkSW5WZXIiOiI0NC45LjIiLCJ1cGRhdGVkSW5WZXIiOiI0NC45LjIiLCJ0YXJnZXRCcmFuY2giOiJtYXN0ZXIiLCJsYWJlbHMiOlsiYXV0b21hdGVkIiwiZGVwZW5kZW5jaWVzIl19-->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
This PR contains the following updates:
5.51.2→5.52.05.51.2→5.52.05.51.2→5.52.05.51.2→5.52.06.5.1→6.5.2Release Notes
strapi/strapi (@strapi/plugin-cloud)
v5.52.0Compare Source
5.52.0 (2026-08-12)
🚀 New feature
🔥 Bug fix
⚙️ Chore
💅 Enhancement
🚨 Security
❤️ Thank You
styled-components/styled-components (styled-components)
v6.5.2Compare Source
Patch Changes
00b9ee2:.attrs()is cheaper to type-check.Two costs on the
.attrspath are gone. Object-form.attrs()left the rendered target unchanged but still re-resolved that target's whole prop bag on every call, making.attrson an HTML or SVG tag far costlier than on a wrapped component; it now reuses the props already resolved for the tag. Separately, making attrs-provided keys optional ran an avoidably expensive pass over the target's full prop set on every attrs component. Together these cut consumer type-check work measurably across every.attrsform, with no change to the resulting component's accepted props. Redirecting the target with.attrs({ as }), including the function form, is unaffected.00b9ee2: Explicitly annotated styled components type-check faster.Assigning a styled component to an explicit type, as
isolatedDeclarationsand any package that emits.d.tsfiles must (const Button: IStyledComponentBase<'web', ...> = styled.button``), used to be several times more expensive to check than an inferred one, because the annotation'sstyleand the component's widenedstyle` were two different csstype representations that the checker compared property by property.The inline
stylewidening now builds on React's ownCSSProperties, the same type a hand-written annotation carries, so that comparison short-circuits. On a 40-component fixture this cut the types created for the annotated pattern by about 21%, with no change to whatstyleaccepts: CSS custom properties, a component's own narrowstyle, andstyle={undefined}all behave exactly as before.00b9ee2:styled()wrapping a generic polymorphic component keeps its declared props narrow.Wrapping a component whose props are generic over an element type, such as the common
<C extends React.ElementType>(props: PolymorphicProps<C, OwnProps>)pattern, used to let the styled result accept prop values the component itself rejects:styled(Button)would takevariant="anything"even though<Button variant="anything">is a type error. The wrapper now narrows those props exactly as the direct component does, so a bad value is caught in both places. Valid props, children, and plain (non-generic) targets are unaffected.Configuration
📅 Schedule: (UTC)
🚦 Automerge: Enabled.
♻ 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 if that's undesired.
This PR has been generated by Mend Renovate CLI.