Commit Graph

37202 Commits

Author SHA1 Message Date
Ben Irvin bf58c4d3ae Merge branch 'develop' into fix/data-transfer-cloud-push-buffer-chunks 2026-05-28 16:56:37 +02:00
Andrei L d353b279e4 chore(docs): migrate docusaurus config to typescript (#26471)
Convert the docs Docusaurus config files to TypeScript to match the
modern Docusaurus scaffold and give editors correct per-file types:

- docusaurus.config.js -> .ts (typed Config / Preset options, ESM)
- sidebars.js -> .ts (typed SidebarsConfig)
- remark-design-system-links.js -> .ts (typed Transformer<Root>)
- babel.config.js: ESM export, @docusaurus/babel preset (3.x split)
- add docs/tsconfig.json extending @docusaurus/tsconfig (editor-only,
  not used by docusaurus build)
- add @docusaurus/babel, @docusaurus/tsconfig, @types/mdast deps

Also adds "docs" to the root jsconfig.json excludes, since docs is a
standalone Docusaurus project that now owns its own config.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Ben Irvin <ben.irvin@strapi.io>
2026-05-28 14:16:43 +00:00
Jamie Howard 682bb90390 fix(i18n): preserve non-localized field inheritance (#26367)
* fix(i18n): preserve non-localized field inheritance across unsaved locale revisits

* fix(content-manager): sort availableLocales with the default locale first

* fix(content-manager): align non-localized prefill filter with server semantics

* fix(i18n): e2e tests
2026-05-28 15:40:44 +02:00
José Luis d60bb2dfc0 fix: improve i18n plugin translations (#22714)
* fix: add missing translation, remove non existing ones and translate existing ones

* chore: reverse changes in admin/es

* fix: fix tab issue in i18n/admin/src/translations/en.json

* fix(i18n): restore author es.json after merge conflict resolution

Remove AI translation keys that were incorrectly merged into i18n es.json;
keep the author's intended i18n plugin Spanish changes from the original PR.

* fix(i18n): align locale hint key and trim translation scope

Use the canonical name.description hint id in CreateLocale, restore
develop ES strings instead of rewritten copy, migrate hint text to the
new key for locales that only had the legacy id, and drop the EN
locales.label entry that changed the picker label and broke E2E tests.

---------

Co-authored-by: Ben Irvin <ben@innerdvations.com>
2026-05-28 09:18:26 +00:00
Ben Irvin 4d5d99c237 test(data-transfer): add PassThrough regression tests for push asset buffering
Cover the WebSocket batch order and sync-read upload provider pattern that
caused Buffer.from(null) crashes before uploadStream was deferred.
2026-05-28 11:01:54 +02:00
Ben Irvin 3757c203e5 Merge branch 'develop' into fix/data-transfer-cloud-push-buffer-chunks 2026-05-28 10:52:47 +02:00
mehmet turac abc3166d26 fix(core): skip session secret check for API-only apps (#26390) 2026-05-28 09:22:51 +02:00
Ben Irvin 45a635ffe7 test(content-manager): stabilize dynamic zone insert e2e on Firefox (#26450) 2026-05-27 17:38:43 +02:00
Nico André d6f693da85 feat(*): introduce MCP server (#26371) 2026-05-27 16:27:48 +02:00
Adrien L e2e46f74b9 future(upload): edit asset info (#26366)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Mark Kaylor <mark.kaylor@strapi.io>
2026-05-27 12:53:20 +00:00
Weijie Sun 40413d376a fix: deleteMany respects filters combined with relation (#25420)
* Use query builder init in deleteMany

* test(api): deleteMany respects filters combined with relation

* fix(database): pick filter params in deleteMany init

Apply _q, where, and filters through init like count instead of where-only
or full findMany params, avoiding populate/pagination surprises. Expand API
and unit tests for relation filters, count parity, and ignored param keys.

* chore(database): clarify deleteMany relation cleanup TODO

Replace the vague bulk-query TODO with a concrete note that deleteMany
still skips per-row deleteRelations unlike single delete().

---------

Co-authored-by: Ben Irvin <ben.irvin@strapi.io>
Co-authored-by: Ben Irvin <ben@innerdvations.com>
2026-05-27 09:42:06 +00:00
markkaylor d14e758ed5 fix(homepage): homepage count-documents slow on large D&P tables (#26370)
* fix(homepage): homepage count-documents slow on large D&P tables

* chore: add api test

* test(homepage): add i18n count-documents document_id semantics tests

Assert per-document_id buckets for never-published multi-locale drafts,
partial locale publish states, and mutually exclusive published vs modified.

---------

Co-authored-by: Ben Irvin <ben@innerdvations.com>
2026-05-27 10:25:34 +02:00
markkaylor d31768cb7e chore(upload): remove aiMetadataJobsCleanup cron job (#26442)
chore(upload): remove aiMetadataJobsCleanup cron job
2026-05-27 09:52:02 +02:00
Paul Bratslavsky 411bb86bed fix(upgrade): simplify registry URL resolution (#25027)
* fix(upgrade): simplify registry URL resolution

* fix(upgrade): handle Yarn Classic registry config

   - Add yarn version detection to use correct config key
   - Yarn v1 uses 'registry', Yarn v2+ uses 'npmRegistryServer'
   - Guard against literal 'undefined' string from Yarn v1
   - Add tests for Yarn v1 and v2+ registry detection

* fix(upgrade): extract normalizeRegistryOutput helper

Move registry stdout validation into a shared helper and tighten registry
URL determination tests.

---------

Co-authored-by: Ben Irvin <ben@innerdvations.com>
2026-05-26 14:01:52 +00:00
Ben Irvin a3d610d589 chore: fix dependabot cooldown config for github-actions (#26438)
* chore: fix dependabot cooldown config for github-actions

Remove unsupported semver cooldown fields from the github-actions
ecosystem entry; only default-days is valid for that ecosystem.

* chore: comments
2026-05-26 14:34:44 +02:00
Filip Ónodi e7772d621e feat(i18n): update and create Slovak translations (#25831)
Co-authored-by: Bassel Kanso <basselkanso82@gmail.com>
2026-05-26 15:10:41 +03:00
Bassel Kanso 1606e26317 fix(admin): avoid serving extensionless admin paths as static files (#26368) 2026-05-26 11:49:34 +03:00
Andrei L 1dd851498a feat(admin): add documentation helper link in HeaderLayout (revival of #23328) (#26422)
* feat(admin): add documentation helper link in HeaderLayout

Revival of #23328 (by @Mcastres), rebased on develop with review feedback
addressed and additional improvements:

- Replace hand-rolled find with react-router matchRoutes for proper path
  matching and specificity ranking
- Update doc URLs to canonical docs.strapi.io paths (drop redirected
  /user-docs/* and /dev-docs/* entries)
- Restore section anchors that were lost during doc-site reorganization
  (#providers, #email-templates, #advanced-settings, profile, rbac)
- Align array path entries with actual registered admin routes (rename
  /plugins/content-type-builder, /plugins/content-releases, settings
  prefix for purchase-content-releases and list-plugins, drop dead
  /marketplace external link)
- Add opt-out flag admin.flags.docLinks for white-label deployments
  (requested by @derrickmehaffy)
- Memoize getMatchingDocLink result per pathname
- Place doc link button next to primary action via gap on parent Flex
  (per @remidej review)
- Drop async from getMatchingDocLink, derive docLink synchronously from
  pathname (per @remidej review)

Closes #23328

Co-authored-by: Maxime Castres <17828745+Mcastres@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(admin): move DocLink type to getMatchingDocLink module

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(admin): add docLinks flag to EE Window strapi type

The EE admin custom.d.ts redeclares window.strapi.flags and was missing
the docLinks property, causing test:ts:front to fail with TS2339 in
HeaderLayout.tsx.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test: add getMachingDocLink tests

---------

Co-authored-by: Maxime Castres <17828745+Mcastres@users.noreply.github.com>
Co-authored-by: Ben Irvin <ben@innerdvations.com>
2026-05-26 09:59:00 +02:00
Ben Irvin 2ca41e7329 chore(ci): improve dependabot security grouping and version update policy (#26408)
Replace GitHub's npm_and_yarn mega-PR with per-family security groups,
re-enable throttled version updates with cooldowns, and expand dependency
families for webpack, vite, rollup, and related tooling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-26 09:57:11 +02:00
Adrien L 6330b97bdb fix(content-manager): content history crash on deleted relations (#26245)
Co-authored-by: Ben Irvin <ben@innerdvations.com>
2026-05-26 09:55:36 +02:00
Dhruv Chheda e15d4569e6 fix: unable to access content manager page with required and private … (#24101)
* fix: unable to access content manager page with required and private field

* fix: unable to access content manager page with required and private field

* test(content-manager): cover private field exclusion in validation populate

Extend getPopulateForValidation tests for top-level scalars, media, and
dynamic zones so private required attributes stay out of query fields.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Ben Irvin <ben@innerdvations.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 14:40:23 +00:00
Arav Menon 1e60e17213 fix: Relation Search in Nested Components (#26023)
* fix(content-manager): fix relation search in nested components

* fix(content-manager): remove unnecessary useMemo for simple lookup

* fix(content-manager): use component id when searching nested relations

* ci: change QA action to pull_request_target

* test: update tests

---------

Co-authored-by: Bassel Kanso <basselkanso82@gmail.com>
2026-05-22 16:38:31 +03:00
Nico André 0d0cdab996 chore(commitlint): disable body-max-line-length rule (#26406) 2026-05-22 09:39:48 +02:00
Sjouke de Vries 3b88050cbb enhancement(provider-amazon-ses): replace node-ses with AWS SDK SESClient (#26054)
* feat(provider-amazon-ses): replace node-ses with AWS SDK SESClient

Signed-off-by: Sjouke de Vries <info@sdvservices.nl>

* feat(provider-amazon-ses): harden AWS SDK v3 provider implementation

Extract config and send mapping to utils, create SESClient once in init,
and preserve legacy providerOptions (key, secret, amazon → endpoint/region).
Add Vitest config for unit tests.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(provider-amazon-ses): expand configuration examples for IAM and legacy

Adapted from https://github.com/strapi/strapi/pull/25354 (addresses #22600).

Co-authored-by: Frank Navarrete <hippiewho@yahoo.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* test(provider-amazon-ses): add legacy and send coverage from community PR

Port init and send scenarios from https://github.com/strapi/strapi/pull/25354
to Vitest (*.vitest.test.ts).

Co-authored-by: Frank Navarrete <hippiewho@yahoo.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* chore: yarn.lock

* test: add backwards compatibility coverage

* chore: remove author info from package.json and update test script names for consistency

---------

Signed-off-by: Sjouke de Vries <info@sdvservices.nl>
Co-authored-by: Ben Irvin <ben@innerdvations.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Frank Navarrete <hippiewho@yahoo.com>
Co-authored-by: Jamie Howard <jhoward1994@gmail.com>
Co-authored-by: Jamie Howard <48524071+jhoward1994@users.noreply.github.com>
2026-05-22 07:35:26 +00:00
Nico André ebba42a369 feat(admin-tokens): remove adminTokens future flag (#26391) 2026-05-21 15:31:38 +02:00
bartsmartshore 1b37af9a70 enhancement(db): migration performance improvements (#25988)
* Run batches of document_id creation

* fix(core): use better caching in discard-draft

* fix(core): improve batch sizing & document_id loop efficiency // more caching improvements

* fix(core): componentHierarchyCaches moved back outside the loop

* test(migrations): add new tests and update existing

---------

Co-authored-by: Ben Irvin <ben.irvin@strapi.io>
Co-authored-by: Ben Irvin <ben@innerdvations.com>
2026-05-21 12:53:22 +00:00
Ben Irvin 45d77987ea chore(strapi): upgrade webpack ecosystem dependencies (#26385)
Pin webpack 5.106.2 and bump related loaders/plugins used by the admin build.
2026-05-21 12:37:13 +00:00
Ben Irvin 90c277501d fix(graphql): inherit publicationFilter into populated relations (#26400)
Use rootQueryArgsByPath (rootQueryArgs) instead of the removed
context.rootQueryArgs when cascading publicationFilter to nested D&P relations.
2026-05-21 13:00:07 +02:00
Ben Irvin 05ff01de4f feat: publicationFilter param in REST and document service (#25793) 2026-05-21 11:31:18 +02:00
Nico André 2caeaf54fe fix(core/core): codeBlockValidator uses language instead of syntax (#26392) 2026-05-20 14:52:13 +02:00
Bassel Kanso c579537cbf Merge branch 'main' into develop 2026-05-20 12:23:13 +03:00
Bassel17 04ac8c3e90 release: 5.46.1 v5.46.1 2026-05-20 09:09:00 +00:00
Ben Irvin ad4a0f0557 chore: dedupe yarn.lock file (#26376)
* chore: upgrade pinned handlebars

* chore: docs
2026-05-19 12:47:15 +00:00
DMehaffy 56d7a64c49 fix(admin): redirect active tab to login on session expiry (#26165)
* fix(admin): redirect active tab to login on session expiry

Two complementary changes that close the gap between server-side session
invalidation and client-side UX, fixes #26163:

1. **Active-tab redirect on 401.** baseQuery's 401 handler now invokes a
   session-expired callback in addition to dispatching `logoutAction`.
   AuthProvider registers `clearStateAndLogout` as that callback so the
   tab that originated the failing request is navigated to /auth/login —
   not just other tabs (which already react via the `storage` event).

2. **JWT-exp idle timer.** AuthProvider schedules a one-shot timer at the
   access token's `exp` claim. While the user is active, every API call
   that hits a 401 transparently refreshes the token (existing behavior in
   getFetchClient.withTokenRefresh), which updates Redux and reschedules
   the timer to the new exp. If no API activity occurs during the access
   token lifespan, the timer fires and the user is logged out — matching
   the configured server-side idle behavior without a separate activity
   tracker.

The mechanism is wired through a new `setOnSessionExpired` /
`triggerSessionExpired` pair in getFetchClient.ts (mirroring the existing
`setOnTokenUpdate` registry), keeping the React layer as the only place
that owns navigation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(admin): extract idle-session logout into testable hook

Per review feedback, move the JWT exp decoding into utils/jwt.ts and
the one-shot logout effect into a useIdleSessionLogout hook so both
have unit coverage. Hardens the decoder with type checks, base64url
padding, and a Number.isFinite guard on exp.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 12:46:22 +00:00
Ben Irvin 3c3a9236d1 chore(deps): bump ws from 8.17.1 to 8.20.1 in @strapi/data-transfer (#26379) 2026-05-19 10:34:14 +00:00
dependabot[bot] c97abbdf2e chore(deps): bump sanitize-html from 2.13.0 to 2.17.4 (#26342)
Bumps [sanitize-html](https://github.com/apostrophecms/apostrophe/tree/HEAD/packages/sanitize-html) from 2.13.0 to 2.17.4.
- [Changelog](https://github.com/apostrophecms/apostrophe/blob/main/packages/sanitize-html/CHANGELOG.md)
- [Commits](https://github.com/apostrophecms/apostrophe/commits/HEAD/packages/sanitize-html)

---
updated-dependencies:
- dependency-name: sanitize-html
  dependency-version: 2.17.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-19 11:51:07 +02:00
dependabot[bot] 39b071389c chore(deps): bump simple-git from 3.32.3 to 3.36.0 (#26220)
Bumps [simple-git](https://github.com/steveukx/git-js/tree/HEAD/simple-git) from 3.32.3 to 3.36.0.
- [Release notes](https://github.com/steveukx/git-js/releases)
- [Changelog](https://github.com/steveukx/git-js/blob/main/simple-git/CHANGELOG.md)
- [Commits](https://github.com/steveukx/git-js/commits/simple-git@3.36.0/simple-git)

---
updated-dependencies:
- dependency-name: simple-git
  dependency-version: 3.36.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ben Irvin <ben.irvin@strapi.io>
2026-05-19 11:40:56 +02:00
Ben Irvin 59f37e17a4 chore(examples): remove sdk-plugin from todo-example plugin (#26341)
* chore(examples): remove sdk-plugin from todo-example plugin

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore: add readme for plugin

* chore(examples): use npx to build plugin
2026-05-18 17:46:24 +02:00
Vishal Kumar Singh df91d08122 fix(admin): gate expiresIn deprecation on user auth options (#26298)
* fix(admin): gate expiresIn deprecation on user auth options

getTokenOptions merges defaultJwtOptions, so options.expiresIn is always
set even when the project never configured admin.auth.options.expiresIn.
That made the bootstrap deprecation warn on every startup.

Read raw admin.auth.options via a small helper next to the token service
and cover it with unit tests.

Refs https://github.com/strapi/strapi/issues/25989

* chore: prettier

---------

Co-authored-by: Ben Irvin <ben@innerdvations.com>
2026-05-18 15:12:14 +00:00
Bassel Kanso 334ab1f7fd ci: add needs-qa checklist automation (#26321) 2026-05-18 17:42:11 +03:00
Ben Irvin f9c6a232e3 fix(database): respect nested sort in populate for join-table relations (#26361)
* fix(database): respect nested sort in populate for join-table relations

* test(api): cover nested populate sort edge cases

Refs: #26359
2026-05-18 11:15:35 +00:00
Simon Norris 4d412c300a chore: sonarcloud security review (#25949) 2026-05-18 10:01:01 +00:00
Simen 2982f64df0 fix: move session-manager jwt check from register to bootstrap (#25412)
* fix: move session-manager jwt check from register to bootstrap

* fix: drop serveAdminPanel guard from session-manager bootstrap

detached-admin deployments still need jwt validation at startup.
the move from register to bootstrap alone is sufficient to fix
cli commands like ts:generate-types since they never call bootstrap.

---------

Co-authored-by: Jamie Howard <48524071+jhoward1994@users.noreply.github.com>
2026-05-15 08:56:31 +01:00
Ben Irvin 6ed22b5cfa security(deps): upgrade multiple dependencies (#26326)
* chore: upgrade simple-git

* chore: upgrade axios

* chore: upgrade docusaurus

* chore: upgrade docusaurus family

* chore: yarn.lock

* chore: upgrade styled-components

* chore: upgrade yaml

* chore: bump fast-uri in pinned deps

* chore: bump axios in cloud plugin

* chore: remove unnecessary ts error suppression

* chore: align docusaurus packages

* chore: yarn.lock

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Jamie Howard <jhoward1994@gmail.com>
2026-05-15 08:52:31 +01:00
Jamie Howard 1a0cb07509 Merge pull request #26242 from strapi/fix/cms-941-rw-select
feat(review-workflows): save prompt for unsaved locales
2026-05-14 14:46:38 +01:00
Westley Marchment d9d5ff82dd fix(graphql): inherit publication state for i18n localizations (#22163)
* Filter for published results when requesting localizations

* fix(graphql): inherit publication state for i18n localizations

---------

Co-authored-by: Bassel Kanso <basselkanso82@gmail.com>
2026-05-14 16:42:24 +03:00
jmichalec-vl ea813b4582 fix(migrations): guard inverseJoinColumn access in discard-drafts migration (#26331)
The discard-drafts migration crashes when processing morphToMany
relations because it accesses `joinTable.inverseJoinColumn.name`
in 7 locations without checking if `inverseJoinColumn` exists.

Morph join tables (polymorphic relations) use `morphColumn` instead
of `inverseJoinColumn`. Accessing `.name` on `undefined` throws:
`TypeError: Cannot read properties of undefined (reading 'name')`

This affects any v4→v5 migration on projects with morphToMany
relations (e.g., polymorphic content types, dynamic zones with
relations).

The fix adds a null guard before each access, skipping morph tables
which don't need the draft/published copy logic handled by these
functions.

Fixes #25542
2026-05-14 10:23:23 +00:00
dependabot[bot] 6af0c9c4d9 chore(deps): bump fast-uri from 3.0.1 to 3.1.2 (#26254)
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.0.1 to 3.1.2.
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.0.1...v3.1.2)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-14 11:52:53 +02:00
dependabot[bot] 2176b681a8 chore(deps): bump fast-xml-builder from 1.1.4 to 1.2.0 (#26253)
Bumps [fast-xml-builder](https://github.com/NaturalIntelligence/fast-xml-builder) from 1.1.4 to 1.2.0.
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-builder/blob/main/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-builder/compare/v1.1.4...v1.2.0)

---
updated-dependencies:
- dependency-name: fast-xml-builder
  dependency-version: 1.2.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-14 11:52:30 +02:00
dependabot[bot] 49b96fcfdc chore(deps): bump axios from 1.15.1 to 1.15.2 (#26177)
Bumps [axios](https://github.com/axios/axios) from 1.15.1 to 1.15.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.15.1...v1.15.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.15.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-14 11:52:04 +02:00