* 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>
* chore(eslint): migrate .eslintrc + .eslintignore to .eslintrc.cjs
Consolidates the per-package ESLint setup into a single typed
`.eslintrc.cjs` file across the monorepo (177 files touched).
Why
- `.eslintignore` is removed in ESLint v9/v10. Folding ignore patterns
into `ignorePatterns` inside the rc file is the supported migration
path and unblocks future ESLint upgrades (which will likely be needed
alongside the in-flight TypeScript 6 migration).
- `.cjs` extension is explicit about module format, so the configs keep
working if any package later adopts `"type": "module"` (no CJS/ESM
surprises).
- Wrapping each config in `// @ts-check` + a `Linter.Config`-typed
`const config` block gives editor autocomplete and catches typos.
Surfaced two real duplicates in
`eslint-config-custom/back/typescript.js`
(`node/no-unsupported-features/es-syntax`,
`node/no-missing-import`), now deduplicated.
- `extends` references switched from the `custom/*` shorthand to the
explicit `eslint-config-custom/*` package name. ESLint resolves both,
but the explicit form makes the source unambiguous.
- Added `coverage/` to `ignorePatterns` so coverage output produced
inside a workspace is not linted.
Misc
- `examples/kitchensink` had ESLint configured but no `lint` script;
added one so the config actually runs.
- `nx.json` hash inputs updated:
- removed `.eslintignore` (no longer exists)
- replaced `{projectRoot}/.eslintrc.js` with
`{projectRoot}/**/.eslintrc.cjs` so nested package configs are also
part of the cache key (the previous glob missed them).
- `packages/utils/upgrade/tsconfig.eslint.json` include path updated
from `.eslintrc.js` to `.eslintrc.cjs`.
Verification
- `eslint --print-config` resolves cleanly on sampled back/front
packages (admin, users-permissions, upload).
- Full `pnpm -r lint` is clean.
* chore(eslint): set tsconfigRootDir for vscode-eslint typed linting
CLI lint resolved tsconfig paths via cwd, but vscode-eslint runs from
the workspace root and could not locate per-package tsconfigs. Set
parserOptions.tsconfigRootDir to __dirname in each package's
.eslintrc.cjs so the editor resolves typed-lint configs correctly.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(eslint): self-ignore configs, scope coverage to jest packages
- Replace `env: { es6: true }` workaround with `.eslintrc.cjs` in
ignorePatterns so eslint never lints the config file itself
(root cause of the "const is not a keyword" parse error in es5)
- Add `.eslintrc.cjs` to ignorePatterns across all configs that
were missing it
- Restrict `coverage/` ignorePatterns to workspace roots that
actually run jest; drop from non-test packages and admin/server
subdir configs (tests run from the workspace root)
Jamie HowardGitHubCopilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
* fix: pass context to cookie options in authentication and session-auth utilities
* fix: update cookie options to use secure request context in authentication and session-auth utilities
* refactor: formatting
* feat: chat
feat: apply changes
feat: integrate with ctb
feat: marker
chore: remove comment
feat: new chat
feat: copy message
feat: upload modal
feat: upload file
feat: errors and stop chat
chore: refactor transforms
chore: format relations
chore: chat title
chore: remove architect dependency
feat: empt state
chore: improve text area focus
* feat: chat imports
feat: resizable text area
fix: re add chat
chore: translations
feat: env vars
fix: minor chat issues
feat: feedback
fix: rebase
feat: import folder
feat: limits
feat: attachments dropzone
chore: file attachments cleanup
chore: track chat id
feat: figma import
fix :token
feat: figma token
fix: attribute status when chat makes updates
feat: image upload
* feat: staging integration
* chore: remove logs
* feat: use tool call result instead of annotation
* fix: invalid component uid
* chore: chat input focus ring
* fix: ui issues
* fix: default draft and publish and do not modify singular name
* fix: minor transforms
* fix: linting
* test(front): update snapshots
* chore: fix misplaced getstarted project schema
* chore: remove unused import
* security: validate exact path of host
* fix: define process better for playwright to work
* fix: process env in vite config for playwright
* chore: use production url
* feat(ctb): Tracking events for AI Chat interaction (#23731)
* feat(content-type-builder): WIP tracking events for chat interactions
* fix: typescript build errors
* fix: event name and build errors
* chore: send ai key with analytics
* chore: actually send licenseKey
* chore: send ailicensekey with groupproperties
* fix: didStartNewChat
* chore: track new chats
* feat: enhance attachment type management in AI chat components
* fix: update chat status handling in ChatProvider component
* feat: add optional aiLicenseKey to Strapi interface
---------
Co-authored-by: Jamie Howard <jhoward1994@gmail.com>
* refactor: remove didusersendmessage tracking event (#23777)
* fix: merge conflict
* fix: send projectId to AI server
* feat: add a enabled config for AI features (#24060)
* feat: add getAiToken endpoint (#24172)
* feat: add getAiToken route
* fix: change route name, remove project id
* fix: type issue and fix schema
* feat: retrieve ai token from frontend (#24226)
---------
Co-authored-by: Jamie Howard <jhoward1994@gmail.com>
* fix: use primary500 for links in ai chat
* chore: migrate to AI SDK v5 (#24252)
* fix: migrate code for v5
* t:wq
* feat: push schemas to ctb
* chore: remove old code
* chore: remove ts-no-check
* chore: fix comment
* fix: ai server logs (#24318)
* test(back): fix error log tests
---------
Co-authored-by: Marc Roig <marc12info@gmail.com>
* fix: configure ai ctb csp middleware without overriding user or default config
* future(upload): generate image metadata on file upload (#24365)
* chore: create aiMetadata service with isEnabled
* chore: extract getAiToken to service
* fix: unit test
* future(upload): generate metadata with ai
* fix: ts build
* fix: only send images to ai server
* test: add unit tests
* fix: unit test
---------
Co-authored-by: markkaylor <mark.kaylor@strapi.io>
* AI media lib bulk update (#24414)
* feat(packages): adding endpoint for bulk update
* feat(packages): linting
* feat(packages): adding tests
* feat(packages): cleanup
* feat: guided tour for ai ctb (#24411)
* feat(upload): adding aiMetadata into settings (#24468)
feat(upload): adding aiMetadata into settings
* feat: add AI upload modal (#24407)
* chore: create aiMetadata service with isEnabled
* chore: extract getAiToken to service
* fix: unit test
* future(upload): generate metadata with ai
* feat: add AI upload modal
* feat: add edit and delete to upload modal
* fix: remove sparkle icon on edit
* fix: add error handling
* chore: refactor ai upload modal reducer
* fix: catch ai token generation error
* chore: add useBulkEdit hook
* feat: connect to bulk edit endpoint
* fix: e2e test
* fix: ci in both ce and ee
---------
Co-authored-by: Rémi de Juvigny <remi.dejuvigny@strapi.io>
Co-authored-by: Rémi de Juvigny <8087692+remidej@users.noreply.github.com>
* feat(upload): applying ai enabled logic for media library (#24486)
feat(upload): applying ai enabled logic for media library
* fix: sparkle icon
* fix: set ai server prod url
* fix: default config to enabled
* fix: cursor moving to the end when editing text
* fix: upload in the right folder
* fix: close modal when deleting last item
* chore: use STRAPI_AI_URL everywhere
* fix: bulk upload from frontend
* fix: restore sparkle icon on inputs
* fix: unit test ci
* feat(upload): generating metadata from thumbnail (#24515)
* feat(upload): generating metadata from thumbnail
* feat(upload): fixing linting issue
* feat(upload): fixing tests and addressiing feedback
* feat(upload): fixing lint
* fix: check for cms-ai entitlement
* fix: tests
* fix: race condition failing front unit tests
---------
Co-authored-by: Marc-Roig <marc12info@gmail.com>
Co-authored-by: Ben Irvin <ben@innerdvations.com>
Co-authored-by: Bassel Kanso <bassel.kanso@strapi.io>
Co-authored-by: Ben Irvin <ben.irvin@strapi.io>
Co-authored-by: Jamie Howard <jhoward1994@gmail.com>
Co-authored-by: Jamie Howard <48524071+jhoward1994@users.noreply.github.com>
Co-authored-by: Bassel Kanso <basselkanso82@gmail.com>
Co-authored-by: Ziyi <daydreamnation@live.com>
Co-authored-by: markkaylor <mark.kaylor@strapi.io>
Co-authored-by: Araksya Gevorgyan <31159659+araksyagevorgyan@users.noreply.github.com>
Co-authored-by: Adrien L <thewebsdoor@gmail.com>
* fix(content-type): improve field validation logic in permission settings
* fix(content-manager): enhance validation for required fields based on user permissions
* fix(content-manager): update error handling for unreadable required fields and improve validation messaging
* test(content-manager): add e2e test for publishing with insufficient permissions on required fields
* fix(admin): refine permission field validation logic and update tests for accuracy
* fix: add new email ratelimit middleware and apply to admin pass reset
* fix: resolve proper middleware name
* fix: prettier fix for middleware export
* fix: config loading and dependency lint
* fix: build error on type unknown
* fix: pr feedback on setting default config
Co-authored-by: Ben Irvin <ben.irvin@strapi.io>
* fix: remove unused has from lodash
---------
Co-authored-by: Ben Irvin <ben.irvin@strapi.io>
Co-authored-by: Jamie Howard <48524071+jhoward1994@users.noreply.github.com>