diff --git a/.github/workflows/browser-tests.yml b/.github/workflows/browser-tests.yml
index 1fa5296704d..cdc5f0b45fc 100644
--- a/.github/workflows/browser-tests.yml
+++ b/.github/workflows/browser-tests.yml
@@ -20,11 +20,22 @@ on:
- '.github/workflows/app-tests.yaml'
- '.github/workflows/unit-tests.yaml'
+concurrency:
+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+
jobs:
- js:
+ test:
runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ symfony: ['6.4', '7.3']
+ env:
+ SYMFONY_REQUIRE: '${{ matrix.symfony }}.*'
steps:
- uses: actions/checkout@v4
+
- run: npm i -g corepack && corepack enable
- uses: actions/setup-node@v4
with:
@@ -33,21 +44,76 @@ jobs:
cache-dependency-path: |
pnpm-lock.yaml
package.json
- src/**/package.json
- - run: pnpm install --frozen-lockfile
- - name: Install custom browsers
- run: node ./bin/get_browsers.mjs
+ - name: Install root JS dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Install custom browsers
+ run: node ./bin/get_browsers.mjs
+
+ - name: Install browsers with Playwright
+ run: pnpm exec playwright install firefox ffmpeg
+
+ - uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.2
+ tools: symfony-cli, flex
+
+ - name: Install root PHP dependencies
+ uses: ramsey/composer-install@v3
+ with:
+ working-directory: ${{ github.workspace }}
+
+ - name: Build root packages
+ run: php .github/build-packages.php
- - name: Install browsers with Playwright
- run: pnpm exec playwright install firefox ffmpeg
+ - name: Start Docker containers
+ run: docker compose up -d --build
+ working-directory: test_apps/e2e-app
- # TODO: Install the E2E app + run webserver
- - run: pnpm run test:browser
+ - name: Configure E2E app
+ run: |
+ echo 'APP_ENV=prod' >> .env.local
+ echo 'APP_DEBUG=0' >> .env.local
+ echo 'APP_SECRET=df4c071596e64cc75a349456f2887ae2419ae650' >> .env.local
+ working-directory: test_apps/e2e-app
+
+ - name: Install E2E PHP dependencies
+ uses: ramsey/composer-install@v3
+ with:
+ working-directory: test_apps/e2e-app
+ dependency-versions: highest
+ composer-options: --no-dev
+ custom-cache-suffix: symfony-${{ matrix.symfony }}
+
+ - name: Prepare E2E app
+ run: |
+ symfony composer dump-autoload --classmap-authoritative --no-dev
+ symfony composer dump-env
+ symfony console asset-map:compile
+ symfony console ux:icons:warm-cache
+ working-directory: test_apps/e2e-app
+
+ - name: Start E2E app
+ run: symfony serve --daemon
+ working-directory: test_apps/e2e-app
+
+ - name: Run browser tests
+ run: pnpm run test:browser
+ id: browser-tests
+
+ - uses: actions/upload-artifact@v4
+ if: ${{ always() && steps.browser-tests.conclusion == 'failure' }}
+ with:
+ name: Playwright report and output (${{ matrix.symfony }})
+ path: |
+ src/**/assets/.playwright-report/
+ src/**/assets/.playwright-output/
+ retention-days: 7
- uses: actions/upload-artifact@v4
- if: ${{ !cancelled() }}
+ if: ${{ always() && steps.browser-tests.conclusion == 'failure' }}
with:
- name: playwright-report
- path: .playwright-report/
+ name: Symfony logs (${{ matrix.symfony }})
+ path: test_apps/e2e-app/var/log/
retention-days: 7
diff --git a/.github/workflows/code-quality.yaml b/.github/workflows/code-quality.yaml
index 87d87cbce0e..9f3e53c2b1d 100644
--- a/.github/workflows/code-quality.yaml
+++ b/.github/workflows/code-quality.yaml
@@ -24,12 +24,16 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
+
- run: npm i -g corepack && corepack enable
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
- - run: pnpm install --frozen-lockfile
+
+ - name: Install root JS dependencies
+ run: pnpm install --frozen-lockfile
+
- run: pnpm run ci
phpstan:
diff --git a/.github/workflows/dist-files-unbuilt.yaml b/.github/workflows/dist-files-unbuilt.yaml
index dd56ec5f6f5..d3a890b0857 100644
--- a/.github/workflows/dist-files-unbuilt.yaml
+++ b/.github/workflows/dist-files-unbuilt.yaml
@@ -21,6 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
+
- run: npm i -g corepack && corepack enable
- uses: actions/setup-node@v4
with:
@@ -29,7 +30,12 @@ jobs:
cache-dependency-path: |
pnpm-lock.yaml
**/package.json
- - run: pnpm install --frozen-lockfile && pnpm run build
+
+ - name: Install root JS dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Build
+ run: pnpm run build
- name: Check if JS dist files are current
run: |
diff --git a/.github/workflows/release-on-npm.yaml b/.github/workflows/release-on-npm.yaml
index c4f43f67870..ab91316fa91 100644
--- a/.github/workflows/release-on-npm.yaml
+++ b/.github/workflows/release-on-npm.yaml
@@ -30,7 +30,8 @@ jobs:
pnpm-lock.yaml
package.json
src/**/package.json
- - run: pnpm install --frozen-lockfile
+ - name: Install root JS dependencies
+ run: pnpm install --frozen-lockfile
- name: Update version of JS packages
run: pnpm version ${{ env.VERSION }} --no-git-tag-version --workspaces --no-workspaces-update
diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml
index 60d0126181e..37e52a5105a 100644
--- a/.github/workflows/unit-tests.yaml
+++ b/.github/workflows/unit-tests.yaml
@@ -145,6 +145,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
+
- run: npm i -g corepack && corepack enable
- uses: actions/setup-node@v4
with:
@@ -154,5 +155,8 @@ jobs:
pnpm-lock.yaml
package.json
src/**/package.json
- - run: pnpm install --frozen-lockfile
+
+ - name: Install root JS dependencies
+ run: pnpm install --frozen-lockfile
+
- run: pnpm run test:unit
diff --git a/.gitignore b/.gitignore
index cae3c3cf773..27cc4b67672 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,5 +8,5 @@ node_modules
/vendor
/browsers
-.last-run.json
.playwright-report/
+.playwright-output/
diff --git a/bin/test_package.sh b/bin/test_package.sh
index d1d3f6045f5..e013d8b0b80 100755
--- a/bin/test_package.sh
+++ b/bin/test_package.sh
@@ -40,10 +40,10 @@ fi
runTestSuite() {
if [ "$testType" == "unit" ]; then
echo -e "🧪 Running unit tests for $workspace...\n"
- pnpm exec vitest --run "${args[@]}" || { all_tests_passed=false; }
+ (cd "$location"; pnpm exec vitest --run "${args[@]}") || { all_tests_passed=false; }
elif [ "$testType" == "browser" ]; then
echo -e "🧪 Running browser tests for $workspace...\n"
- # TODO: to implement
+ (cd "$location"; pnpm exec playwright test "${args[@]}") || { all_tests_passed=false; }
fi
}
@@ -99,16 +99,18 @@ processWorkspace() {
trimmed_version=$(echo "$version" | tr -d '[:space:]')
if [ -n "$trimmed_version" ]; then
# Install each version of the library separately
- echo -e " - Install $library@$trimmed_version for $workspace\n"
- pnpm add "$library@$trimmed_version" --save-peer --filter "$workspace"
+ echo -e " - Installing $library@$trimmed_version for $workspace\n"
+ (cd "$location" || exit 1; pnpm add "$library@$trimmed_version" --save-peer --silent)
+ echo -e " - Building $workspace assets...\n"
+ (cd "$location" || exit 1; pnpm run build)
runTestSuite
fi
done
done
- echo " -> Reverting version changes from $package_json_path"
- git checkout -- "$package_json_path" "$PROJECT_DIR/pnpm-lock.yaml"
+ echo " -> Reverting changes"
+ git checkout -- "$package_json_path" "$location/dist" "$PROJECT_DIR/pnpm-lock.yaml"
else
echo -e " -> No peerDependencies found with multiple versions defined\n"
runTestSuite
diff --git a/package.json b/package.json
index 9b13f68bbec..8fb3303b5a0 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,7 @@
"build": "pnpm run --filter @symfony/ux-map build && pnpm run -r --aggregate-output build",
"test": "pnpm run -r --workspace-concurrency=1 test",
"test:unit": "pnpm run -r --aggregate-output test:unit",
- "test:browser": "pnpm exec playwright test",
+ "test:browser": "pnpm run -r --workspace-concurrency=1 test:browser",
"check": "biome check",
"ci": "biome ci"
},
@@ -25,8 +25,7 @@
"pkg-types": "^2.2.0",
"tinyglobby": "^0.2.14",
"tsup": "^8.5.0",
- "vitest": "^3.2.4",
- "webdriverio": "^9.19.1"
+ "vitest": "^3.2.4"
},
"version": "2.27.0"
}
diff --git a/playwright.config.ts b/playwright.config.base.ts
similarity index 75%
rename from playwright.config.ts
rename to playwright.config.base.ts
index 83b94788073..2c983f992d4 100644
--- a/playwright.config.ts
+++ b/playwright.config.base.ts
@@ -1,16 +1,24 @@
-import { defineConfig, devices } from '@playwright/test';
+/**
+ * Playwright base configuration for UX packages, for browser testing.
+ *
+ * This file is not intended to be used directly, but to be used by UX packages themselves.
+ * For example:
+ * ```typescript
+ * // src/Autocomplete/assets/playwright.config.ts
+ *
+ * import baseConfig from '../../../../../../playwright.config.base';
+ *
+ * export default baseConfig;
+ * ```
+ */
+import { defineConfig, devices } from '@playwright/test';
import { browsers } from './bin/get_browsers.mjs';
export default defineConfig({
- testMatch:[
- 'src/**/assets/test/browser/**/*.{test,spec}.ts',
- 'src/**/assets/test/**/*.browser.{test,spec}.ts',
- ],
- testIgnore: [
- // TODO: Temporary, as the Map tests require some TypeScript code to be compiled
- // and so fails (which is expected). To remove once the tests are real E2E.
- /Map/
+ testMatch: [
+ '**/test/browser/**/*.{test,spec}.ts',
+ '**/test/**/*.browser.{test,spec}.ts',
],
reporter: [
@@ -18,6 +26,8 @@ export default defineConfig({
['html', { open: process.env.CI ? 'never' : 'on-failure', outputFolder: '.playwright-report' }],
],
+ outputDir: '.playwright-output',
+
use: {
// Base URL to use in actions like `await page.goto('/')`.
baseURL: 'http://localhost:9876',
@@ -27,13 +37,6 @@ export default defineConfig({
trace: 'retain-on-failure'
},
- //webServer: {
- // command: 'cd test_apps/e2e-app && symfony serve',
- // url: 'http://localhost:9876',
- // reuseExistingServer: !process.env.CI,
- // stderr: 'pipe',
- //},
-
projects: [
{
name: 'chrome-lowest',
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2f667abb714..483bc2e9ce3 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -51,9 +51,6 @@ importers:
vitest:
specifier: ^3.2.4
version: 3.2.4(@types/node@22.16.5)(@vitest/browser@3.2.4)(jsdom@26.1.0)(lightningcss@1.30.1)(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(terser@5.43.1)
- webdriverio:
- specifier: ^9.19.1
- version: 9.19.1
src/Autocomplete/assets:
devDependencies:
@@ -3991,6 +3988,7 @@ snapshots:
'@promptbook/utils@0.69.5':
dependencies:
spacetrim: 0.11.59
+ optional: true
'@puppeteer/browsers@2.10.6':
dependencies:
@@ -4241,6 +4239,7 @@ snapshots:
'@types/node@20.19.11':
dependencies:
undici-types: 6.21.0
+ optional: true
'@types/node@22.16.5':
dependencies:
@@ -4257,7 +4256,8 @@ snapshots:
'@types/prop-types': 15.7.15
csstype: 3.1.3
- '@types/sinonjs__fake-timers@8.1.5': {}
+ '@types/sinonjs__fake-timers@8.1.5':
+ optional: true
'@types/statuses@2.0.6':
optional: true
@@ -4267,11 +4267,13 @@ snapshots:
'@types/webpack-env@1.18.8': {}
- '@types/which@2.0.2': {}
+ '@types/which@2.0.2':
+ optional: true
'@types/ws@8.18.1':
dependencies:
'@types/node': 22.16.5
+ optional: true
'@types/yauzl@2.10.3':
dependencies:
@@ -4424,6 +4426,7 @@ snapshots:
transitivePeerDependencies:
- bare-buffer
- supports-color
+ optional: true
'@wdio/logger@9.18.0':
dependencies:
@@ -4432,16 +4435,20 @@ snapshots:
loglevel-plugin-prefix: 0.8.4
safe-regex2: 5.0.0
strip-ansi: 7.1.0
+ optional: true
- '@wdio/protocols@9.16.2': {}
+ '@wdio/protocols@9.16.2':
+ optional: true
'@wdio/repl@9.16.2':
dependencies:
'@types/node': 20.19.11
+ optional: true
'@wdio/types@9.19.1':
dependencies:
'@types/node': 20.19.11
+ optional: true
'@wdio/utils@9.19.1':
dependencies:
@@ -4462,12 +4469,15 @@ snapshots:
transitivePeerDependencies:
- bare-buffer
- supports-color
+ optional: true
- '@zip.js/zip.js@2.7.72': {}
+ '@zip.js/zip.js@2.7.72':
+ optional: true
abort-controller@3.0.0:
dependencies:
event-target-shim: 5.0.1
+ optional: true
acorn@8.15.0: {}
@@ -4517,6 +4527,7 @@ snapshots:
lodash: 4.17.21
normalize-path: 3.0.0
readable-stream: 4.7.0
+ optional: true
archiver@7.0.1:
dependencies:
@@ -4527,6 +4538,7 @@ snapshots:
readdir-glob: 1.1.3
tar-stream: 3.1.7
zip-stream: 6.0.1
+ optional: true
aria-query@5.3.0:
dependencies:
@@ -4540,7 +4552,8 @@ snapshots:
dependencies:
tslib: 2.8.1
- async@3.2.6: {}
+ async@3.2.6:
+ optional: true
asynckit@0.4.0: {}
@@ -4575,11 +4588,13 @@ snapshots:
bare-events: 2.6.1
optional: true
- base64-js@1.5.1: {}
+ base64-js@1.5.1:
+ optional: true
basic-ftp@5.0.5: {}
- boolbase@1.0.0: {}
+ boolbase@1.0.0:
+ optional: true
brace-expansion@2.0.2:
dependencies:
@@ -4594,7 +4609,8 @@ snapshots:
buffer-crc32@0.2.13: {}
- buffer-crc32@1.0.0: {}
+ buffer-crc32@1.0.0:
+ optional: true
buffer-from@1.1.2:
optional: true
@@ -4603,6 +4619,7 @@ snapshots:
dependencies:
base64-js: 1.5.1
ieee754: 1.2.1
+ optional: true
bundle-require@5.1.0(esbuild@0.25.8):
dependencies:
@@ -4650,6 +4667,7 @@ snapshots:
domelementtype: 2.3.0
domhandler: 5.0.3
domutils: 3.2.2
+ optional: true
cheerio@1.1.2:
dependencies:
@@ -4664,6 +4682,7 @@ snapshots:
parse5-parser-stream: 7.1.2
undici: 7.13.0
whatwg-mimetype: 4.0.0
+ optional: true
chokidar@4.0.3:
dependencies:
@@ -4701,7 +4720,8 @@ snapshots:
commander@4.1.1: {}
- commander@9.5.0: {}
+ commander@9.5.0:
+ optional: true
compress-commons@6.0.2:
dependencies:
@@ -4710,6 +4730,7 @@ snapshots:
is-stream: 2.0.1
normalize-path: 3.0.0
readable-stream: 4.7.0
+ optional: true
confbox@0.1.8: {}
@@ -4722,14 +4743,17 @@ snapshots:
cookie@0.7.2:
optional: true
- core-util-is@1.0.3: {}
+ core-util-is@1.0.3:
+ optional: true
- crc-32@1.2.2: {}
+ crc-32@1.2.2:
+ optional: true
crc32-stream@6.0.0:
dependencies:
crc-32: 1.2.2
readable-stream: 4.7.0
+ optional: true
cropperjs@1.6.2: {}
@@ -4752,17 +4776,21 @@ snapshots:
domhandler: 5.0.3
domutils: 3.2.2
nth-check: 2.1.1
+ optional: true
- css-shorthand-properties@1.1.2: {}
+ css-shorthand-properties@1.1.2:
+ optional: true
css-tree@2.3.1:
dependencies:
mdn-data: 2.0.30
source-map-js: 1.2.1
- css-value@0.0.1: {}
+ css-value@0.0.1:
+ optional: true
- css-what@6.2.2: {}
+ css-what@6.2.2:
+ optional: true
css.escape@1.5.1: {}
@@ -4775,7 +4803,8 @@ snapshots:
csstype@3.1.3: {}
- data-uri-to-buffer@4.0.1: {}
+ data-uri-to-buffer@4.0.1:
+ optional: true
data-uri-to-buffer@6.0.2: {}
@@ -4788,13 +4817,15 @@ snapshots:
dependencies:
ms: 2.1.3
- decamelize@6.0.0: {}
+ decamelize@6.0.0:
+ optional: true
decimal.js@10.6.0: {}
deep-eql@5.0.2: {}
- deepmerge-ts@7.1.5: {}
+ deepmerge-ts@7.1.5:
+ optional: true
deepmerge@4.3.1: {}
@@ -4823,18 +4854,22 @@ snapshots:
domelementtype: 2.3.0
domhandler: 5.0.3
entities: 4.5.0
+ optional: true
- domelementtype@2.3.0: {}
+ domelementtype@2.3.0:
+ optional: true
domhandler@5.0.3:
dependencies:
domelementtype: 2.3.0
+ optional: true
domutils@3.2.2:
dependencies:
dom-serializer: 2.0.0
domelementtype: 2.3.0
domhandler: 5.0.3
+ optional: true
dunder-proto@1.0.1:
dependencies:
@@ -4848,6 +4883,7 @@ snapshots:
dependencies:
'@types/which': 2.0.2
which: 2.0.2
+ optional: true
edgedriver@6.1.2:
dependencies:
@@ -4862,6 +4898,7 @@ snapshots:
which: 5.0.0
transitivePeerDependencies:
- supports-color
+ optional: true
electron-to-chromium@1.5.187: {}
@@ -4873,6 +4910,7 @@ snapshots:
dependencies:
iconv-lite: 0.6.3
whatwg-encoding: 3.1.1
+ optional: true
end-of-stream@1.4.5:
dependencies:
@@ -4976,9 +5014,11 @@ snapshots:
esutils@2.0.3: {}
- event-target-shim@5.0.1: {}
+ event-target-shim@5.0.1:
+ optional: true
- events@3.3.0: {}
+ events@3.3.0:
+ optional: true
expect-type@1.2.2: {}
@@ -4994,7 +5034,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
- fast-deep-equal@2.0.1: {}
+ fast-deep-equal@2.0.1:
+ optional: true
fast-deep-equal@3.1.3: {}
@@ -5005,6 +5046,7 @@ snapshots:
fast-xml-parser@5.2.5:
dependencies:
strnum: 2.1.1
+ optional: true
fd-slicer@1.1.0:
dependencies:
@@ -5018,6 +5060,7 @@ snapshots:
dependencies:
node-domexception: 1.0.0
web-streams-polyfill: 3.3.3
+ optional: true
fix-dts-default-cjs-exports@1.0.1:
dependencies:
@@ -5041,6 +5084,7 @@ snapshots:
formdata-polyfill@4.0.10:
dependencies:
fetch-blob: 3.2.0
+ optional: true
fsevents@2.3.2:
optional: true
@@ -5063,6 +5107,7 @@ snapshots:
transitivePeerDependencies:
- bare-buffer
- supports-color
+ optional: true
gensync@1.0.0-beta.2: {}
@@ -5081,7 +5126,8 @@ snapshots:
hasown: 2.0.2
math-intrinsics: 1.1.0
- get-port@7.1.0: {}
+ get-port@7.1.0:
+ optional: true
get-proto@1.0.1:
dependencies:
@@ -5115,9 +5161,11 @@ snapshots:
gopd@1.2.0: {}
- graceful-fs@4.2.11: {}
+ graceful-fs@4.2.11:
+ optional: true
- grapheme-splitter@1.0.4: {}
+ grapheme-splitter@1.0.4:
+ optional: true
graphql@16.11.0:
optional: true
@@ -5141,7 +5189,8 @@ snapshots:
dependencies:
whatwg-encoding: 3.1.1
- htmlfy@0.8.1: {}
+ htmlfy@0.8.1:
+ optional: true
htmlparser2@10.0.0:
dependencies:
@@ -5149,6 +5198,7 @@ snapshots:
domhandler: 5.0.3
domutils: 3.2.2
entities: 6.0.1
+ optional: true
http-proxy-agent@7.0.2:
dependencies:
@@ -5170,15 +5220,19 @@ snapshots:
idiomorph@0.3.0: {}
- ieee754@1.2.1: {}
+ ieee754@1.2.1:
+ optional: true
- immediate@3.0.6: {}
+ immediate@3.0.6:
+ optional: true
- import-meta-resolve@4.1.0: {}
+ import-meta-resolve@4.1.0:
+ optional: true
indent-string@4.0.0: {}
- inherits@2.0.4: {}
+ inherits@2.0.4:
+ optional: true
intl-messageformat@10.7.16:
dependencies:
@@ -5194,7 +5248,8 @@ snapshots:
is-node-process@1.2.0:
optional: true
- is-plain-obj@4.1.0: {}
+ is-plain-obj@4.1.0:
+ optional: true
is-potential-custom-element-name@1.0.1: {}
@@ -5202,13 +5257,16 @@ snapshots:
dependencies:
'@types/estree': 1.0.8
- is-stream@2.0.1: {}
+ is-stream@2.0.1:
+ optional: true
- isarray@1.0.0: {}
+ isarray@1.0.0:
+ optional: true
isexe@2.0.0: {}
- isexe@3.1.1: {}
+ isexe@3.1.1:
+ optional: true
jackspeak@3.4.3:
dependencies:
@@ -5266,18 +5324,21 @@ snapshots:
pako: 1.0.11
readable-stream: 2.3.8
setimmediate: 1.0.5
+ optional: true
kleur@4.1.5: {}
lazystream@1.0.1:
dependencies:
readable-stream: 2.3.8
+ optional: true
leaflet@1.9.4: {}
lie@3.3.0:
dependencies:
immediate: 3.0.6
+ optional: true
lightningcss-darwin-arm64@1.30.1:
optional: true
@@ -5337,20 +5398,25 @@ snapshots:
'@promptbook/utils': 0.69.5
type-fest: 4.26.0
userhome: 1.0.1
+ optional: true
locate-character@3.0.0: {}
- lodash.clonedeep@4.5.0: {}
+ lodash.clonedeep@4.5.0:
+ optional: true
lodash.sortby@4.7.0: {}
- lodash.zip@4.2.0: {}
+ lodash.zip@4.2.0:
+ optional: true
lodash@4.17.21: {}
- loglevel-plugin-prefix@0.8.4: {}
+ loglevel-plugin-prefix@0.8.4:
+ optional: true
- loglevel@1.9.2: {}
+ loglevel@1.9.2:
+ optional: true
loose-envify@1.4.0:
dependencies:
@@ -5387,6 +5453,7 @@ snapshots:
minimatch@5.1.6:
dependencies:
brace-expansion: 2.0.2
+ optional: true
minimatch@9.0.5:
dependencies:
@@ -5394,7 +5461,8 @@ snapshots:
minipass@7.1.2: {}
- mitt@3.0.1: {}
+ mitt@3.0.1:
+ optional: true
mlly@1.7.4:
dependencies:
@@ -5450,7 +5518,8 @@ snapshots:
netmask@2.0.2: {}
- node-domexception@1.0.0: {}
+ node-domexception@1.0.0:
+ optional: true
node-fetch@2.7.0:
dependencies:
@@ -5461,14 +5530,17 @@ snapshots:
data-uri-to-buffer: 4.0.1
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
+ optional: true
node-releases@2.0.19: {}
- normalize-path@3.0.0: {}
+ normalize-path@3.0.0:
+ optional: true
nth-check@2.1.1:
dependencies:
boolbase: 1.0.0
+ optional: true
nwsapi@2.2.20: {}
@@ -5503,16 +5575,19 @@ snapshots:
package-json-from-dist@1.0.1: {}
- pako@1.0.11: {}
+ pako@1.0.11:
+ optional: true
parse5-htmlparser2-tree-adapter@7.1.0:
dependencies:
domhandler: 5.0.3
parse5: 7.3.0
+ optional: true
parse5-parser-stream@7.1.2:
dependencies:
parse5: 7.3.0
+ optional: true
parse5@7.3.0:
dependencies:
@@ -5585,9 +5660,11 @@ snapshots:
ansi-styles: 5.2.0
react-is: 17.0.2
- process-nextick-args@2.0.1: {}
+ process-nextick-args@2.0.1:
+ optional: true
- process@0.11.10: {}
+ process@0.11.10:
+ optional: true
progress@2.0.3: {}
@@ -5618,7 +5695,8 @@ snapshots:
punycode@2.3.1: {}
- query-selector-shadow-dom@1.0.1: {}
+ query-selector-shadow-dom@1.0.1:
+ optional: true
querystringify@2.2.0:
optional: true
@@ -5646,6 +5724,7 @@ snapshots:
safe-buffer: 5.1.2
string_decoder: 1.1.1
util-deprecate: 1.0.2
+ optional: true
readable-stream@4.7.0:
dependencies:
@@ -5654,10 +5733,12 @@ snapshots:
events: 3.3.0
process: 0.11.10
string_decoder: 1.3.0
+ optional: true
readdir-glob@1.1.3:
dependencies:
minimatch: 5.1.6
+ optional: true
readdirp@4.1.2: {}
@@ -5682,10 +5763,13 @@ snapshots:
resq@1.11.0:
dependencies:
fast-deep-equal: 2.0.1
+ optional: true
- ret@0.5.0: {}
+ ret@0.5.0:
+ optional: true
- rgb2hex@0.2.5: {}
+ rgb2hex@0.2.5:
+ optional: true
rollup@4.45.1:
dependencies:
@@ -5715,15 +5799,19 @@ snapshots:
rrweb-cssom@0.8.0: {}
- safaridriver@1.0.0: {}
+ safaridriver@1.0.0:
+ optional: true
- safe-buffer@5.1.2: {}
+ safe-buffer@5.1.2:
+ optional: true
- safe-buffer@5.2.1: {}
+ safe-buffer@5.2.1:
+ optional: true
safe-regex2@5.0.0:
dependencies:
ret: 0.5.0
+ optional: true
safer-buffer@2.1.2: {}
@@ -5749,8 +5837,10 @@ snapshots:
serialize-error@12.0.0:
dependencies:
type-fest: 4.41.0
+ optional: true
- setimmediate@1.0.5: {}
+ setimmediate@1.0.5:
+ optional: true
shebang-command@2.0.0:
dependencies:
@@ -5798,9 +5888,11 @@ snapshots:
dependencies:
whatwg-url: 7.1.0
- spacetrim@0.11.59: {}
+ spacetrim@0.11.59:
+ optional: true
- split2@4.2.0: {}
+ split2@4.2.0:
+ optional: true
stackback@0.0.2: {}
@@ -5834,10 +5926,12 @@ snapshots:
string_decoder@1.1.1:
dependencies:
safe-buffer: 5.1.2
+ optional: true
string_decoder@1.3.0:
dependencies:
safe-buffer: 5.2.1
+ optional: true
strip-ansi@6.0.1:
dependencies:
@@ -5855,7 +5949,8 @@ snapshots:
dependencies:
js-tokens: 9.0.1
- strnum@2.1.1: {}
+ strnum@2.1.1:
+ optional: true
sucrase@3.35.0:
dependencies:
@@ -6029,9 +6124,11 @@ snapshots:
type-fest@0.21.3:
optional: true
- type-fest@4.26.0: {}
+ type-fest@4.26.0:
+ optional: true
- type-fest@4.41.0: {}
+ type-fest@4.41.0:
+ optional: true
typed-query-selector@2.12.0: {}
@@ -6043,9 +6140,11 @@ snapshots:
undici-types@6.21.0: {}
- undici@6.21.3: {}
+ undici@6.21.3:
+ optional: true
- undici@7.13.0: {}
+ undici@7.13.0:
+ optional: true
universalify@0.2.0:
optional: true
@@ -6062,11 +6161,14 @@ snapshots:
requires-port: 1.0.0
optional: true
- urlpattern-polyfill@10.1.0: {}
+ urlpattern-polyfill@10.1.0:
+ optional: true
- userhome@1.0.1: {}
+ userhome@1.0.1:
+ optional: true
- util-deprecate@1.0.2: {}
+ util-deprecate@1.0.2:
+ optional: true
vite-node@3.2.4(@types/node@22.16.5)(lightningcss@1.30.1)(terser@5.43.1):
dependencies:
@@ -6174,8 +6276,10 @@ snapshots:
debug: 4.4.1
transitivePeerDependencies:
- supports-color
+ optional: true
- web-streams-polyfill@3.3.3: {}
+ web-streams-polyfill@3.3.3:
+ optional: true
webdriver@9.19.1:
dependencies:
@@ -6195,6 +6299,7 @@ snapshots:
- bufferutil
- supports-color
- utf-8-validate
+ optional: true
webdriverio@9.19.1:
dependencies:
@@ -6228,6 +6333,7 @@ snapshots:
- bufferutil
- supports-color
- utf-8-validate
+ optional: true
webidl-conversions@3.0.1: {}
@@ -6264,6 +6370,7 @@ snapshots:
which@5.0.0:
dependencies:
isexe: 3.1.1
+ optional: true
why-is-node-running@2.3.0:
dependencies:
@@ -6326,3 +6433,4 @@ snapshots:
archiver-utils: 5.0.2
compress-commons: 6.0.2
readable-stream: 4.7.0
+ optional: true
diff --git a/src/Autocomplete/assets/playwright.config.ts b/src/Autocomplete/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/Autocomplete/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Autocomplete/assets/test/browser/placeholder.test.ts b/src/Autocomplete/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/Autocomplete/assets/test/browser/placeholder.test.ts
+++ b/src/Autocomplete/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/Autocomplete/assets/vitest.config.browser.mjs b/src/Autocomplete/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/Autocomplete/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/Autocomplete/assets/vitest.config.mjs b/src/Autocomplete/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/Autocomplete/assets/vitest.config.mjs
+++ b/src/Autocomplete/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/Chartjs/assets/playwright.config.ts b/src/Chartjs/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/Chartjs/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Chartjs/assets/test/browser/placeholder.test.ts b/src/Chartjs/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/Chartjs/assets/test/browser/placeholder.test.ts
+++ b/src/Chartjs/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/Chartjs/assets/vitest.config.browser.mjs b/src/Chartjs/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/Chartjs/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/Chartjs/assets/vitest.config.mjs b/src/Chartjs/assets/vitest.config.mjs
index 30e3e3c413e..34ff9b39741 100644
--- a/src/Chartjs/assets/vitest.config.mjs
+++ b/src/Chartjs/assets/vitest.config.mjs
@@ -1,6 +1,6 @@
import path from 'node:path';
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {
test: {
diff --git a/src/Cropperjs/assets/playwright.config.ts b/src/Cropperjs/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/Cropperjs/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Cropperjs/assets/test/browser/placeholder.test.ts b/src/Cropperjs/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/Cropperjs/assets/test/browser/placeholder.test.ts
+++ b/src/Cropperjs/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/Cropperjs/assets/vitest.config.browser.mjs b/src/Cropperjs/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/Cropperjs/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/Cropperjs/assets/vitest.config.mjs b/src/Cropperjs/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/Cropperjs/assets/vitest.config.mjs
+++ b/src/Cropperjs/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/Dropzone/assets/playwright.config.ts b/src/Dropzone/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/Dropzone/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Dropzone/assets/test/browser/placeholder.test.ts b/src/Dropzone/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/Dropzone/assets/test/browser/placeholder.test.ts
+++ b/src/Dropzone/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/Dropzone/assets/vitest.config.browser.mjs b/src/Dropzone/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/Dropzone/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/Dropzone/assets/vitest.config.mjs b/src/Dropzone/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/Dropzone/assets/vitest.config.mjs
+++ b/src/Dropzone/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/LazyImage/assets/vitest.config.mjs b/src/LazyImage/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/LazyImage/assets/vitest.config.mjs
+++ b/src/LazyImage/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/LiveComponent/assets/playwright.config.ts b/src/LiveComponent/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/LiveComponent/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/LiveComponent/assets/test/browser/placeholder.test.ts b/src/LiveComponent/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/LiveComponent/assets/test/browser/placeholder.test.ts
+++ b/src/LiveComponent/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/LiveComponent/assets/vitest.config.browser.mjs b/src/LiveComponent/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/LiveComponent/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/LiveComponent/assets/vitest.config.mjs b/src/LiveComponent/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/LiveComponent/assets/vitest.config.mjs
+++ b/src/LiveComponent/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/Map/assets/vitest.config.mjs b/src/Map/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/Map/assets/vitest.config.mjs
+++ b/src/Map/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/Map/src/Bridge/Google/assets/playwright.config.ts b/src/Map/src/Bridge/Google/assets/playwright.config.ts
new file mode 100644
index 00000000000..6cf7795c13b
--- /dev/null
+++ b/src/Map/src/Bridge/Google/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Map/src/Bridge/Google/assets/vitest.config.browser.mjs b/src/Map/src/Bridge/Google/assets/vitest.config.browser.mjs
deleted file mode 100644
index 50065a16217..00000000000
--- a/src/Map/src/Bridge/Google/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,10 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {
- resolve: {
- alias: {
- '@symfony/ux-map': __dirname + '/../../../../assets/src/abstract_map_controller.ts',
- },
- },
-});
diff --git a/src/Map/src/Bridge/Leaflet/assets/playwright.config.ts b/src/Map/src/Bridge/Leaflet/assets/playwright.config.ts
new file mode 100644
index 00000000000..6cf7795c13b
--- /dev/null
+++ b/src/Map/src/Bridge/Leaflet/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Map/src/Bridge/Leaflet/assets/vitest.config.browser.mjs b/src/Map/src/Bridge/Leaflet/assets/vitest.config.browser.mjs
deleted file mode 100644
index 70b5eee1665..00000000000
--- a/src/Map/src/Bridge/Leaflet/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,11 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {
- resolve: {
- alias: {
- '@symfony/ux-map': __dirname + '/../../../../assets/src/abstract_map_controller.ts',
- 'leaflet/dist/leaflet.min.css': 'leaflet/dist/leaflet.css',
- },
- },
-});
diff --git a/src/Notify/assets/playwright.config.ts b/src/Notify/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/Notify/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Notify/assets/test/browser/placeholder.test.ts b/src/Notify/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/Notify/assets/test/browser/placeholder.test.ts
+++ b/src/Notify/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/Notify/assets/vitest.config.browser.mjs b/src/Notify/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/Notify/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/Notify/assets/vitest.config.mjs b/src/Notify/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/Notify/assets/vitest.config.mjs
+++ b/src/Notify/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/React/assets/playwright.config.ts b/src/React/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/React/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/React/assets/test/browser/placeholder.test.ts b/src/React/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/React/assets/test/browser/placeholder.test.ts
+++ b/src/React/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/React/assets/vitest.config.browser.mjs b/src/React/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/React/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/React/assets/vitest.config.mjs b/src/React/assets/vitest.config.mjs
index bc4ba85dc38..558285f21cb 100644
--- a/src/React/assets/vitest.config.mjs
+++ b/src/React/assets/vitest.config.mjs
@@ -1,6 +1,6 @@
import react from '@vitejs/plugin-react';
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {
plugins: [react()],
diff --git a/src/StimulusBundle/assets/vitest.config.mjs b/src/StimulusBundle/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/StimulusBundle/assets/vitest.config.mjs
+++ b/src/StimulusBundle/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/Svelte/assets/playwright.config.ts b/src/Svelte/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/Svelte/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Svelte/assets/test/browser/placeholder.test.ts b/src/Svelte/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/Svelte/assets/test/browser/placeholder.test.ts
+++ b/src/Svelte/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/Svelte/assets/vitest.config.browser.mjs b/src/Svelte/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/Svelte/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/Svelte/assets/vitest.config.mjs b/src/Svelte/assets/vitest.config.mjs
index a63d97b9966..cb409bbf481 100644
--- a/src/Svelte/assets/vitest.config.mjs
+++ b/src/Svelte/assets/vitest.config.mjs
@@ -1,6 +1,6 @@
import { svelte } from '@sveltejs/vite-plugin-svelte';
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {
plugins: [svelte()],
diff --git a/src/Swup/assets/vitest.config.mjs b/src/Swup/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/Swup/assets/vitest.config.mjs
+++ b/src/Swup/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/TogglePassword/assets/vitest.config.mjs b/src/TogglePassword/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/TogglePassword/assets/vitest.config.mjs
+++ b/src/TogglePassword/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/Translator/assets/playwright.config.ts b/src/Translator/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/Translator/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Translator/assets/test/browser/placeholder.test.ts b/src/Translator/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/Translator/assets/test/browser/placeholder.test.ts
+++ b/src/Translator/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/Translator/assets/vitest.config.browser.mjs b/src/Translator/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/Translator/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/Translator/assets/vitest.config.mjs b/src/Translator/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/Translator/assets/vitest.config.mjs
+++ b/src/Translator/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/Turbo/assets/playwright.config.ts b/src/Turbo/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/Turbo/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Turbo/assets/test/browser/placeholder.test.ts b/src/Turbo/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/Turbo/assets/test/browser/placeholder.test.ts
+++ b/src/Turbo/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/Turbo/assets/vitest.config.browser.mjs b/src/Turbo/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/Turbo/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/Turbo/assets/vitest.config.mjs b/src/Turbo/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/Turbo/assets/vitest.config.mjs
+++ b/src/Turbo/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/Typed/assets/vitest.config.mjs b/src/Typed/assets/vitest.config.mjs
index d63e78be977..3331ac1d8a2 100644
--- a/src/Typed/assets/vitest.config.mjs
+++ b/src/Typed/assets/vitest.config.mjs
@@ -1,4 +1,4 @@
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {});
diff --git a/src/Vue/assets/playwright.config.ts b/src/Vue/assets/playwright.config.ts
new file mode 100644
index 00000000000..5f22dd6a69c
--- /dev/null
+++ b/src/Vue/assets/playwright.config.ts
@@ -0,0 +1,3 @@
+import baseConfig from '../../../playwright.config.base';
+
+export default baseConfig;
diff --git a/src/Vue/assets/test/browser/placeholder.test.ts b/src/Vue/assets/test/browser/placeholder.test.ts
index 8dd2ca0d582..f5f1d10f22e 100644
--- a/src/Vue/assets/test/browser/placeholder.test.ts
+++ b/src/Vue/assets/test/browser/placeholder.test.ts
@@ -1,11 +1,7 @@
import { expect, test } from '@playwright/test';
-test('get started link', async ({ page }) => {
- await page.goto('https://playwright.dev/');
+test('Can see homepage', async ({ page }) => {
+ await page.goto('/');
- // Click the get started link.
- await page.getByRole('link', { name: 'Get started' }).click();
-
- // Expects page to have a heading with the name of Installation.
- await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
+ await expect(page.getByText("Symfony UX's E2E App")).toBeVisible();
});
diff --git a/src/Vue/assets/vitest.config.browser.mjs b/src/Vue/assets/vitest.config.browser.mjs
deleted file mode 100644
index cedcfabb90e..00000000000
--- a/src/Vue/assets/vitest.config.browser.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.browser.mjs';
-
-export default mergeConfig(configShared, {});
diff --git a/src/Vue/assets/vitest.config.mjs b/src/Vue/assets/vitest.config.mjs
index 1fc20581911..df5046f0bef 100644
--- a/src/Vue/assets/vitest.config.mjs
+++ b/src/Vue/assets/vitest.config.mjs
@@ -1,6 +1,6 @@
import vue from '@vitejs/plugin-vue';
import { mergeConfig } from 'vitest/config';
-import configShared from '../../../vitest.config.mjs';
+import configShared from '../../../vitest.config.base.mjs';
export default mergeConfig(configShared, {
plugins: [vue()],
diff --git a/test_apps/e2e-app/.editorconfig b/test_apps/e2e-app/.editorconfig
new file mode 100644
index 00000000000..66990769e8b
--- /dev/null
+++ b/test_apps/e2e-app/.editorconfig
@@ -0,0 +1,17 @@
+# editorconfig.org
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[{compose.yaml,compose.*.yaml}]
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/test_apps/e2e-app/.env b/test_apps/e2e-app/.env
new file mode 100644
index 00000000000..c5badfcd659
--- /dev/null
+++ b/test_apps/e2e-app/.env
@@ -0,0 +1,57 @@
+# In all environments, the following files are loaded if they exist,
+# the latter taking precedence over the former:
+#
+# * .env contains default values for the environment variables needed by the app
+# * .env.local uncommitted file with local overrides
+# * .env.$APP_ENV committed environment-specific defaults
+# * .env.$APP_ENV.local uncommitted environment-specific overrides
+#
+# Real environment variables win over .env files.
+#
+# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
+# https://symfony.com/doc/current/configuration/secrets.html
+#
+# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
+# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
+
+###> symfony/framework-bundle ###
+APP_ENV=dev
+APP_SECRET=
+###< symfony/framework-bundle ###
+
+###> doctrine/doctrine-bundle ###
+# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
+# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
+#
+DATABASE_URL="sqlite:///%kernel.project_dir%/var/data_%kernel.environment%.db"
+# DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=8.0.32&charset=utf8mb4"
+# DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=10.11.2-MariaDB&charset=utf8mb4"
+# DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8"
+###< doctrine/doctrine-bundle ###
+
+###> symfony/ux-google-map ###
+# Options available at https://github.com/symfony/ux/blob/2.x/src/Map/src/Bridge/Google/README.md
+#
+GOOGLE_MAPS_API_KEY="# Get your API key at https://developers.google.com/maps/documentation/javascript/get-api-key"
+#UX_MAP_DSN=google://%env(GOOGLE_MAPS_API_KEY)%@default
+###< symfony/ux-google-map ###
+
+###> symfony/ux-leaflet-map ###
+# Options available at https://github.com/symfony/ux/blob/2.x/src/Map/src/Bridge/Leaflet/README.md
+#
+UX_MAP_DSN=leaflet://default
+###< symfony/ux-leaflet-map ###
+
+###> symfony/mercure-notifier ###
+# MERCURE_DSN=mercure://default
+###< symfony/mercure-notifier ###
+
+###> symfony/mercure-bundle ###
+# See https://symfony.com/doc/current/mercure.html#configuration
+# The URL of the Mercure hub, used by the app to publish updates (can be a local URL)
+MERCURE_URL=https://example.com/.well-known/mercure
+# The public URL of the Mercure hub, used by the browser to connect
+MERCURE_PUBLIC_URL=https://example.com/.well-known/mercure
+# The secret used to sign the JWTs
+MERCURE_JWT_SECRET="!ChangeThisMercureHubJWTSecretKey!"
+###< symfony/mercure-bundle ###
diff --git a/test_apps/e2e-app/.env.dev b/test_apps/e2e-app/.env.dev
new file mode 100644
index 00000000000..d55af2ab4aa
--- /dev/null
+++ b/test_apps/e2e-app/.env.dev
@@ -0,0 +1,4 @@
+
+###> symfony/framework-bundle ###
+APP_SECRET=6714654acdda58a8d804a0d5e10f98a2
+###< symfony/framework-bundle ###
diff --git a/test_apps/e2e-app/.gitignore b/test_apps/e2e-app/.gitignore
new file mode 100644
index 00000000000..46c8c684aa3
--- /dev/null
+++ b/test_apps/e2e-app/.gitignore
@@ -0,0 +1,14 @@
+###> symfony/framework-bundle ###
+/.env.local
+/.env.local.php
+/.env.*.local
+/config/secrets/prod/prod.decrypt.private.php
+/public/bundles/
+/var/
+/vendor/
+###< symfony/framework-bundle ###
+
+###> symfony/asset-mapper ###
+/public/assets/
+/assets/vendor/
+###< symfony/asset-mapper ###
diff --git a/test_apps/e2e-app/.symfony.local.yaml b/test_apps/e2e-app/.symfony.local.yaml
new file mode 100644
index 00000000000..3d0a7009141
--- /dev/null
+++ b/test_apps/e2e-app/.symfony.local.yaml
@@ -0,0 +1,2 @@
+http:
+ port: 9876
diff --git a/test_apps/e2e-app/README.md b/test_apps/e2e-app/README.md
new file mode 100644
index 00000000000..4795b30333d
--- /dev/null
+++ b/test_apps/e2e-app/README.md
@@ -0,0 +1,32 @@
+# E2E App
+
+This is a Symfony application designed for end-to-end testing.
+
+It serves for testing UX packages in a real-world scenario,
+to ensure they work as expected for multiple Symfony versions and various browsers.
+
+## Requirements
+
+- Symfony CLI
+- PHP 8.2 or higher
+- Docker and Docker Compose
+- Composer
+
+## Installation
+
+```shell
+docker compose up -d
+symfony php ../.github/build-packages.php
+
+SYMFONY_REQUIRE=6.4.* symfony composer update
+# or...
+SYMFONY_REQUIRE=7.3.* symfony composer update
+```
+
+## Usage
+
+```shell
+symfony serve
+```
+
+The application will be available at `http://localhost:9876`.
diff --git a/test_apps/e2e-app/assets/app.js b/test_apps/e2e-app/assets/app.js
new file mode 100644
index 00000000000..5b1ceb0c4e7
--- /dev/null
+++ b/test_apps/e2e-app/assets/app.js
@@ -0,0 +1,18 @@
+import { registerVueControllerComponents } from '@symfony/ux-vue';
+import { registerSvelteControllerComponents } from '@symfony/ux-svelte';
+import { registerReactControllerComponents } from '@symfony/ux-react';
+import './bootstrap.js';
+/*
+ * Welcome to your app's main JavaScript file!
+ *
+ * This file will be included onto the page via the importmap() Twig function,
+ * which should already be in your base.html.twig.
+ */
+import 'bootstrap/dist/css/bootstrap.min.css';
+import './styles/app.css';
+
+console.log('This log comes from assets/app.js - welcome to AssetMapper! 🎉');
+
+registerReactControllerComponents();
+registerSvelteControllerComponents();
+registerVueControllerComponents();
diff --git a/test_apps/e2e-app/assets/bootstrap.js b/test_apps/e2e-app/assets/bootstrap.js
new file mode 100644
index 00000000000..d4e50c919df
--- /dev/null
+++ b/test_apps/e2e-app/assets/bootstrap.js
@@ -0,0 +1,5 @@
+import { startStimulusApp } from '@symfony/stimulus-bundle';
+
+const app = startStimulusApp();
+// register any custom, 3rd party controllers here
+// app.register('some_controller_name', SomeImportedController);
diff --git a/test_apps/e2e-app/assets/controllers.json b/test_apps/e2e-app/assets/controllers.json
new file mode 100644
index 00000000000..38a018532e0
--- /dev/null
+++ b/test_apps/e2e-app/assets/controllers.json
@@ -0,0 +1,123 @@
+{
+ "controllers": {
+ "@symfony/ux-autocomplete": {
+ "autocomplete": {
+ "enabled": true,
+ "fetch": "eager",
+ "autoimport": {
+ "tom-select/dist/css/tom-select.default.css": true,
+ "tom-select/dist/css/tom-select.bootstrap4.css": false,
+ "tom-select/dist/css/tom-select.bootstrap5.css": false
+ }
+ }
+ },
+ "@symfony/ux-chartjs": {
+ "chart": {
+ "enabled": true,
+ "fetch": "eager"
+ }
+ },
+ "@symfony/ux-cropperjs": {
+ "cropper": {
+ "enabled": true,
+ "fetch": "eager",
+ "autoimport": {
+ "cropperjs/dist/cropper.min.css": true,
+ "@symfony/ux-cropperjs/dist/style.min.css": true
+ }
+ }
+ },
+ "@symfony/ux-dropzone": {
+ "dropzone": {
+ "enabled": true,
+ "fetch": "eager",
+ "autoimport": {
+ "@symfony/ux-dropzone/dist/style.min.css": true
+ }
+ }
+ },
+ "@symfony/ux-google-map": {
+ "map": {
+ "enabled": true,
+ "fetch": "lazy"
+ }
+ },
+ "@symfony/ux-lazy-image": {
+ "lazy-image": {
+ "enabled": true,
+ "fetch": "eager"
+ }
+ },
+ "@symfony/ux-leaflet-map": {
+ "map": {
+ "enabled": true,
+ "fetch": "lazy"
+ }
+ },
+ "@symfony/ux-live-component": {
+ "live": {
+ "enabled": true,
+ "fetch": "eager",
+ "autoimport": {
+ "@symfony/ux-live-component/dist/live.min.css": true
+ }
+ }
+ },
+ "@symfony/ux-notify": {
+ "notify": {
+ "enabled": true,
+ "fetch": "eager"
+ }
+ },
+ "@symfony/ux-react": {
+ "react": {
+ "enabled": true,
+ "fetch": "eager"
+ }
+ },
+ "@symfony/ux-svelte": {
+ "svelte": {
+ "enabled": true,
+ "fetch": "eager"
+ }
+ },
+ "@symfony/ux-swup": {
+ "swup": {
+ "enabled": true,
+ "fetch": "eager"
+ }
+ },
+ "@symfony/ux-toggle-password": {
+ "toggle-password": {
+ "enabled": true,
+ "fetch": "eager",
+ "autoimport": {
+ "@symfony/ux-toggle-password/dist/style.min.css": true
+ }
+ }
+ },
+ "@symfony/ux-turbo": {
+ "turbo-core": {
+ "enabled": true,
+ "fetch": "eager"
+ },
+ "mercure-turbo-stream": {
+ "enabled": false,
+ "fetch": "eager"
+ }
+ },
+ "@symfony/ux-typed": {
+ "typed": {
+ "enabled": true,
+ "fetch": "eager"
+ }
+ },
+ "@symfony/ux-vue": {
+ "vue": {
+ "enabled": true,
+ "fetch": "eager"
+ }
+ }
+ },
+ "entrypoints": []
+}
diff --git a/test_apps/e2e-app/assets/controllers/csrf_protection_controller.js b/test_apps/e2e-app/assets/controllers/csrf_protection_controller.js
new file mode 100644
index 00000000000..c722f024a7f
--- /dev/null
+++ b/test_apps/e2e-app/assets/controllers/csrf_protection_controller.js
@@ -0,0 +1,79 @@
+const nameCheck = /^[-_a-zA-Z0-9]{4,22}$/;
+const tokenCheck = /^[-_/+a-zA-Z0-9]{24,}$/;
+
+// Generate and double-submit a CSRF token in a form field and a cookie, as defined by Symfony's SameOriginCsrfTokenManager
+document.addEventListener('submit', function (event) {
+ generateCsrfToken(event.target);
+}, true);
+
+// When @hotwired/turbo handles form submissions, send the CSRF token in a header in addition to a cookie
+// The `framework.csrf_protection.check_header` config option needs to be enabled for the header to be checked
+document.addEventListener('turbo:submit-start', function (event) {
+ const h = generateCsrfHeaders(event.detail.formSubmission.formElement);
+ Object.keys(h).map(function (k) {
+ event.detail.formSubmission.fetchRequest.headers[k] = h[k];
+ });
+});
+
+// When @hotwired/turbo handles form submissions, remove the CSRF cookie once a form has been submitted
+document.addEventListener('turbo:submit-end', function (event) {
+ removeCsrfToken(event.detail.formSubmission.formElement);
+});
+
+export function generateCsrfToken (formElement) {
+ const csrfField = formElement.querySelector('input[data-controller="csrf-protection"], input[name="_csrf_token"]');
+
+ if (!csrfField) {
+ return;
+ }
+
+ let csrfCookie = csrfField.getAttribute('data-csrf-protection-cookie-value');
+ let csrfToken = csrfField.value;
+
+ if (!csrfCookie && nameCheck.test(csrfToken)) {
+ csrfField.setAttribute('data-csrf-protection-cookie-value', csrfCookie = csrfToken);
+ csrfField.defaultValue = csrfToken = btoa(String.fromCharCode.apply(null, (window.crypto || window.msCrypto).getRandomValues(new Uint8Array(18))));
+ csrfField.dispatchEvent(new Event('change', { bubbles: true }));
+ }
+
+ if (csrfCookie && tokenCheck.test(csrfToken)) {
+ const cookie = csrfCookie + '_' + csrfToken + '=' + csrfCookie + '; path=/; samesite=strict';
+ document.cookie = window.location.protocol === 'https:' ? '__Host-' + cookie + '; secure' : cookie;
+ }
+}
+
+export function generateCsrfHeaders (formElement) {
+ const headers = {};
+ const csrfField = formElement.querySelector('input[data-controller="csrf-protection"], input[name="_csrf_token"]');
+
+ if (!csrfField) {
+ return headers;
+ }
+
+ const csrfCookie = csrfField.getAttribute('data-csrf-protection-cookie-value');
+
+ if (tokenCheck.test(csrfField.value) && nameCheck.test(csrfCookie)) {
+ headers[csrfCookie] = csrfField.value;
+ }
+
+ return headers;
+}
+
+export function removeCsrfToken (formElement) {
+ const csrfField = formElement.querySelector('input[data-controller="csrf-protection"], input[name="_csrf_token"]');
+
+ if (!csrfField) {
+ return;
+ }
+
+ const csrfCookie = csrfField.getAttribute('data-csrf-protection-cookie-value');
+
+ if (tokenCheck.test(csrfField.value) && nameCheck.test(csrfCookie)) {
+ const cookie = csrfCookie + '_' + csrfField.value + '=0; path=/; samesite=strict; max-age=0';
+
+ document.cookie = window.location.protocol === 'https:' ? '__Host-' + cookie + '; secure' : cookie;
+ }
+}
+
+/* stimulusFetch: 'lazy' */
+export default 'csrf-protection-controller';
diff --git a/test_apps/e2e-app/assets/controllers/hello_controller.js b/test_apps/e2e-app/assets/controllers/hello_controller.js
new file mode 100644
index 00000000000..e847027bdbe
--- /dev/null
+++ b/test_apps/e2e-app/assets/controllers/hello_controller.js
@@ -0,0 +1,16 @@
+import { Controller } from '@hotwired/stimulus';
+
+/*
+ * This is an example Stimulus controller!
+ *
+ * Any element with a data-controller="hello" attribute will cause
+ * this controller to be executed. The name "hello" comes from the filename:
+ * hello_controller.js -> "hello"
+ *
+ * Delete this file or adapt it for your use!
+ */
+export default class extends Controller {
+ connect() {
+ this.element.textContent = 'Hello Stimulus! Edit me in assets/controllers/hello_controller.js';
+ }
+}
diff --git a/test_apps/e2e-app/assets/icons/symfony.svg b/test_apps/e2e-app/assets/icons/symfony.svg
new file mode 100644
index 00000000000..93fb329ccd5
--- /dev/null
+++ b/test_apps/e2e-app/assets/icons/symfony.svg
@@ -0,0 +1 @@
+
diff --git a/test_apps/e2e-app/assets/react/controllers/Hello.jsx b/test_apps/e2e-app/assets/react/controllers/Hello.jsx
new file mode 100644
index 00000000000..54fe3686ce3
--- /dev/null
+++ b/test_apps/e2e-app/assets/react/controllers/Hello.jsx
@@ -0,0 +1,5 @@
+import React from 'react';
+
+export default function (props) {
+ return
Hello {props.fullName}
;
+}
diff --git a/test_apps/e2e-app/assets/styles/app.css b/test_apps/e2e-app/assets/styles/app.css
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/test_apps/e2e-app/assets/svelte/controllers/Hello.svelte b/test_apps/e2e-app/assets/svelte/controllers/Hello.svelte
new file mode 100644
index 00000000000..3499af48bac
--- /dev/null
+++ b/test_apps/e2e-app/assets/svelte/controllers/Hello.svelte
@@ -0,0 +1,5 @@
+
+
+Hello {name}
diff --git a/test_apps/e2e-app/assets/translator.js b/test_apps/e2e-app/assets/translator.js
new file mode 100644
index 00000000000..a0efa830ae4
--- /dev/null
+++ b/test_apps/e2e-app/assets/translator.js
@@ -0,0 +1,16 @@
+import { localeFallbacks } from '@app/translations/configuration';
+import { trans, getLocale, setLocale, setLocaleFallbacks } from '@symfony/ux-translator';
+/*
+ * This file is part of the Symfony UX Translator package.
+ *
+ * If folder "../var/translations" does not exist, or some translations are missing,
+ * you must warmup your Symfony cache to refresh JavaScript translations.
+ *
+ * If you use TypeScript, you can rename this file to "translator.ts" to take advantage of types checking.
+ */
+
+setLocaleFallbacks(localeFallbacks);
+
+export { trans };
+
+export * from '@app/translations';
diff --git a/test_apps/e2e-app/assets/vue/controllers/Hello.vue b/test_apps/e2e-app/assets/vue/controllers/Hello.vue
new file mode 100644
index 00000000000..2812aa432f6
--- /dev/null
+++ b/test_apps/e2e-app/assets/vue/controllers/Hello.vue
@@ -0,0 +1,9 @@
+
+ Hello {{ name }}!
+
+
+
diff --git a/test_apps/e2e-app/bin/console b/test_apps/e2e-app/bin/console
new file mode 100644
index 00000000000..d8d530e2c36
--- /dev/null
+++ b/test_apps/e2e-app/bin/console
@@ -0,0 +1,21 @@
+#!/usr/bin/env php
+ symfony/mercure-bundle ###
+ mercure:
+ ports:
+ - 9877
+###< symfony/mercure-bundle ###
diff --git a/test_apps/e2e-app/compose.yaml b/test_apps/e2e-app/compose.yaml
new file mode 100644
index 00000000000..c4fa3b13897
--- /dev/null
+++ b/test_apps/e2e-app/compose.yaml
@@ -0,0 +1,31 @@
+
+services:
+###> symfony/mercure-bundle ###
+ mercure:
+ image: dunglas/mercure
+ restart: unless-stopped
+ environment:
+ # Uncomment the following line to disable HTTPS,
+ #SERVER_NAME: ':80'
+ MERCURE_PUBLISHER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!'
+ MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!'
+ # Set the URL of your Symfony project (without trailing slash!) as value of the cors_origins directive
+ MERCURE_EXTRA_DIRECTIVES: |
+ cors_origins http://127.0.0.1:8000
+ # Comment the following line to disable the development mode
+ command: /usr/bin/caddy run --config /etc/caddy/dev.Caddyfile
+ healthcheck:
+ test: ["CMD", "curl", "-f", "https://localhost/healthz"]
+ timeout: 5s
+ retries: 5
+ start_period: 60s
+ volumes:
+ - mercure_data:/data
+ - mercure_config:/config
+###< symfony/mercure-bundle ###
+
+volumes:
+###> symfony/mercure-bundle ###
+ mercure_data:
+ mercure_config:
+###< symfony/mercure-bundle ###
diff --git a/test_apps/e2e-app/composer.json b/test_apps/e2e-app/composer.json
new file mode 100644
index 00000000000..8846875be7b
--- /dev/null
+++ b/test_apps/e2e-app/composer.json
@@ -0,0 +1,114 @@
+{
+ "type": "project",
+ "license": "proprietary",
+ "minimum-stability": "stable",
+ "prefer-stable": true,
+ "scripts": {
+ "auto-scripts": {
+ "cache:clear": "symfony-cmd",
+ "assets:install %PUBLIC_DIR%": "symfony-cmd",
+ "importmap:install": "symfony-cmd"
+ },
+ "post-install-cmd": [
+ "@auto-scripts"
+ ],
+ "post-update-cmd": [
+ "@auto-scripts"
+ ]
+ },
+ "require": {
+ "php": "~8.2.0",
+ "ext-ctype": "*",
+ "ext-iconv": "*",
+ "doctrine/dbal": "^3.10.1",
+ "doctrine/doctrine-bundle": "^2.15.1",
+ "doctrine/doctrine-migrations-bundle": "^3.4.2",
+ "doctrine/orm": "^3.5.2",
+ "phpdocumentor/reflection-docblock": "^5.6.2",
+ "phpstan/phpdoc-parser": "^2.2",
+ "symfony/asset": "6.4.*|7.3.*",
+ "symfony/asset-mapper": "6.4.*|7.3.*",
+ "symfony/console": "6.4.*|7.3.*",
+ "symfony/dotenv": "6.4.*|7.3.*",
+ "symfony/expression-language": "6.4.*|7.3.*",
+ "symfony/flex": "^2.8.1",
+ "symfony/form": "6.4.*|7.3.*",
+ "symfony/framework-bundle": "6.4.*|7.3.*",
+ "symfony/http-client": "6.4.*|7.3.*",
+ "symfony/intl": "6.4.*|7.3.*",
+ "symfony/monolog-bundle": "^3.10",
+ "symfony/runtime": "6.4.*|7.3.*",
+ "symfony/stimulus-bundle": "^2.29.1",
+ "symfony/twig-bundle": "6.4.*|7.3.*",
+ "symfony/ux-autocomplete": "^2.29.1",
+ "symfony/ux-chartjs": "^2.29.1",
+ "symfony/ux-cropperjs": "^2.29.1",
+ "symfony/ux-dropzone": "^2.29.1",
+ "symfony/ux-google-map": "^2.29.1",
+ "symfony/ux-icons": "^2.29",
+ "symfony/ux-lazy-image": "^2.29.1",
+ "symfony/ux-leaflet-map": "^2.29.1",
+ "symfony/ux-live-component": "^2.29.1",
+ "symfony/ux-map": "^2.29.1",
+ "symfony/ux-notify": "^2.29.1",
+ "symfony/ux-react": "^2.29.1",
+ "symfony/ux-svelte": "^2.29.1",
+ "symfony/ux-swup": "^2.29.1",
+ "symfony/ux-toggle-password": "^2.29.1",
+ "symfony/ux-translator": "^2.29.1",
+ "symfony/ux-turbo": "^2.29.1",
+ "symfony/ux-twig-component": "^2.29",
+ "symfony/ux-typed": "^2.29.1",
+ "symfony/ux-vue": "^2.29.1",
+ "symfony/yaml": "6.4.*|7.3.*",
+ "twig/extra-bundle": "^3.21",
+ "twig/twig": "^3.21.1"
+ },
+ "require-dev": {
+ "symfony/debug-bundle": "6.4.*|7.3.*",
+ "symfony/maker-bundle": "^1.64",
+ "symfony/stopwatch": "6.4.*|7.3.*",
+ "symfony/web-profiler-bundle": "6.4.*|7.3.*"
+ },
+ "config": {
+ "platform": {
+ "php": "8.2"
+ },
+ "allow-plugins": {
+ "php-http/discovery": true,
+ "symfony/flex": true,
+ "symfony/runtime": true
+ },
+ "bump-after-update": true,
+ "sort-packages": true
+ },
+ "autoload": {
+ "psr-4": {
+ "App\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "App\\Tests\\": "tests/"
+ }
+ },
+ "replace": {
+ "symfony/polyfill-ctype": "*",
+ "symfony/polyfill-iconv": "*",
+ "symfony/polyfill-php72": "*",
+ "symfony/polyfill-php73": "*",
+ "symfony/polyfill-php74": "*",
+ "symfony/polyfill-php80": "*",
+ "symfony/polyfill-php81": "*",
+ "symfony/polyfill-php82": "*"
+ },
+ "conflict": {
+ "symfony/symfony": "*"
+ },
+ "extra": {
+ "symfony": {
+ "allow-contrib": false,
+ "require": "6.4.*|7.3.*"
+ }
+ }
+}
diff --git a/test_apps/e2e-app/composer.lock b/test_apps/e2e-app/composer.lock
new file mode 100644
index 00000000000..e3db4cc6bf0
--- /dev/null
+++ b/test_apps/e2e-app/composer.lock
@@ -0,0 +1,9156 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "40db74981208ebc54492047275be06f0",
+ "packages": [
+ {
+ "name": "composer/semver",
+ "version": "3.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.11",
+ "symfony/phpunit-bridge": "^3 || ^7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-19T14:15:21+00:00"
+ },
+ {
+ "name": "doctrine/collections",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/collections.git",
+ "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/collections/zipball/2eb07e5953eed811ce1b309a7478a3b236f2273d",
+ "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1",
+ "php": "^8.1",
+ "symfony/polyfill-php84": "^1.30"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "ext-json": "*",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^10.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Collections\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.",
+ "homepage": "https://www.doctrine-project.org/projects/collections.html",
+ "keywords": [
+ "array",
+ "collections",
+ "iterators",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/collections/issues",
+ "source": "https://github.com/doctrine/collections/tree/2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-22T10:17:19+00:00"
+ },
+ {
+ "name": "doctrine/dbal",
+ "version": "3.10.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/dbal.git",
+ "reference": "3626601014388095d3af9de7e9e958623b7ef005"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/3626601014388095d3af9de7e9e958623b7ef005",
+ "reference": "3626601014388095d3af9de7e9e958623b7ef005",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2",
+ "doctrine/deprecations": "^0.5.3|^1",
+ "doctrine/event-manager": "^1|^2",
+ "php": "^7.4 || ^8.0",
+ "psr/cache": "^1|^2|^3",
+ "psr/log": "^1|^2|^3"
+ },
+ "conflict": {
+ "doctrine/cache": "< 1.11"
+ },
+ "require-dev": {
+ "doctrine/cache": "^1.11|^2.0",
+ "doctrine/coding-standard": "13.0.0",
+ "fig/log-test": "^1",
+ "jetbrains/phpstorm-stubs": "2023.1",
+ "phpstan/phpstan": "2.1.17",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "9.6.23",
+ "slevomat/coding-standard": "8.16.2",
+ "squizlabs/php_codesniffer": "3.13.1",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/console": "^4.4|^5.4|^6.0|^7.0"
+ },
+ "suggest": {
+ "symfony/console": "For helpful console commands such as SQL execution and import of files."
+ },
+ "bin": [
+ "bin/doctrine-dbal"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\DBAL\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ }
+ ],
+ "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.",
+ "homepage": "https://www.doctrine-project.org/projects/dbal.html",
+ "keywords": [
+ "abstraction",
+ "database",
+ "db2",
+ "dbal",
+ "mariadb",
+ "mssql",
+ "mysql",
+ "oci8",
+ "oracle",
+ "pdo",
+ "pgsql",
+ "postgresql",
+ "queryobject",
+ "sasql",
+ "sql",
+ "sqlite",
+ "sqlserver",
+ "sqlsrv"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/dbal/issues",
+ "source": "https://github.com/doctrine/dbal/tree/3.10.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-05T12:18:06+00:00"
+ },
+ {
+ "name": "doctrine/deprecations",
+ "version": "1.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/deprecations.git",
+ "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
+ "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<=7.5 || >=13"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^12 || ^13",
+ "phpstan/phpstan": "1.4.10 || 2.1.11",
+ "phpstan/phpstan-phpunit": "^1.0 || ^2",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "suggest": {
+ "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Deprecations\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+ "homepage": "https://www.doctrine-project.org/",
+ "support": {
+ "issues": "https://github.com/doctrine/deprecations/issues",
+ "source": "https://github.com/doctrine/deprecations/tree/1.1.5"
+ },
+ "time": "2025-04-07T20:06:18+00:00"
+ },
+ {
+ "name": "doctrine/doctrine-bundle",
+ "version": "2.15.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/DoctrineBundle.git",
+ "reference": "5a305c5e776f9d3eb87f5b94d40d50aff439211d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5a305c5e776f9d3eb87f5b94d40d50aff439211d",
+ "reference": "5a305c5e776f9d3eb87f5b94d40d50aff439211d",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/dbal": "^3.7.0 || ^4.0",
+ "doctrine/persistence": "^3.1 || ^4",
+ "doctrine/sql-formatter": "^1.0.1",
+ "php": "^8.1",
+ "symfony/cache": "^6.4 || ^7.0",
+ "symfony/config": "^6.4 || ^7.0",
+ "symfony/console": "^6.4 || ^7.0",
+ "symfony/dependency-injection": "^6.4 || ^7.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3",
+ "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3",
+ "symfony/framework-bundle": "^6.4 || ^7.0",
+ "symfony/service-contracts": "^2.5 || ^3"
+ },
+ "conflict": {
+ "doctrine/annotations": ">=3.0",
+ "doctrine/cache": "< 1.11",
+ "doctrine/orm": "<2.17 || >=4.0",
+ "symfony/var-exporter": "< 6.4.1 || 7.0.0",
+ "twig/twig": "<2.13 || >=3.0 <3.0.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1 || ^2",
+ "doctrine/cache": "^1.11 || ^2.0",
+ "doctrine/coding-standard": "^13",
+ "doctrine/deprecations": "^1.0",
+ "doctrine/orm": "^2.17 || ^3.1",
+ "friendsofphp/proxy-manager-lts": "^1.0",
+ "phpstan/phpstan": "2.1.1",
+ "phpstan/phpstan-phpunit": "2.0.3",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^9.6.22",
+ "psr/log": "^1.1.4 || ^2.0 || ^3.0",
+ "symfony/doctrine-messenger": "^6.4 || ^7.0",
+ "symfony/messenger": "^6.4 || ^7.0",
+ "symfony/phpunit-bridge": "^7.2",
+ "symfony/property-info": "^6.4 || ^7.0",
+ "symfony/security-bundle": "^6.4 || ^7.0",
+ "symfony/stopwatch": "^6.4 || ^7.0",
+ "symfony/string": "^6.4 || ^7.0",
+ "symfony/twig-bridge": "^6.4 || ^7.0",
+ "symfony/validator": "^6.4 || ^7.0",
+ "symfony/var-exporter": "^6.4.1 || ^7.0.1",
+ "symfony/web-profiler-bundle": "^6.4 || ^7.0",
+ "symfony/yaml": "^6.4 || ^7.0",
+ "twig/twig": "^2.13 || ^3.0.4"
+ },
+ "suggest": {
+ "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.",
+ "ext-pdo": "*",
+ "symfony/web-profiler-bundle": "To use the data collector."
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Bundle\\DoctrineBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ },
+ {
+ "name": "Doctrine Project",
+ "homepage": "https://www.doctrine-project.org/"
+ }
+ ],
+ "description": "Symfony DoctrineBundle",
+ "homepage": "https://www.doctrine-project.org",
+ "keywords": [
+ "database",
+ "dbal",
+ "orm",
+ "persistence"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/DoctrineBundle/issues",
+ "source": "https://github.com/doctrine/DoctrineBundle/tree/2.15.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T15:48:28+00:00"
+ },
+ {
+ "name": "doctrine/doctrine-migrations-bundle",
+ "version": "3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git",
+ "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5a6ac7120c2924c4c070a869d08b11ccf9e277b9",
+ "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/doctrine-bundle": "^2.4",
+ "doctrine/migrations": "^3.2",
+ "php": "^7.2 || ^8.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3",
+ "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "composer/semver": "^3.0",
+ "doctrine/coding-standard": "^12",
+ "doctrine/orm": "^2.6 || ^3",
+ "phpstan/phpstan": "^1.4 || ^2",
+ "phpstan/phpstan-deprecation-rules": "^1 || ^2",
+ "phpstan/phpstan-phpunit": "^1 || ^2",
+ "phpstan/phpstan-strict-rules": "^1.1 || ^2",
+ "phpstan/phpstan-symfony": "^1.3 || ^2",
+ "phpunit/phpunit": "^8.5 || ^9.5",
+ "symfony/phpunit-bridge": "^6.3 || ^7",
+ "symfony/var-exporter": "^5.4 || ^6 || ^7"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Bundle\\MigrationsBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Doctrine Project",
+ "homepage": "https://www.doctrine-project.org"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DoctrineMigrationsBundle",
+ "homepage": "https://www.doctrine-project.org",
+ "keywords": [
+ "dbal",
+ "migrations",
+ "schema"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues",
+ "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.2"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-11T17:36:26+00:00"
+ },
+ {
+ "name": "doctrine/event-manager",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/event-manager.git",
+ "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e",
+ "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "conflict": {
+ "doctrine/common": "<2.9"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.8.8",
+ "phpunit/phpunit": "^10.5",
+ "vimeo/psalm": "^5.24"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.",
+ "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
+ "keywords": [
+ "event",
+ "event dispatcher",
+ "event manager",
+ "event system",
+ "events"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/event-manager/issues",
+ "source": "https://github.com/doctrine/event-manager/tree/2.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-22T20:47:39+00:00"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b",
+ "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12.0 || ^13.0",
+ "phpstan/phpstan": "^1.12 || ^2.0",
+ "phpstan/phpstan-phpunit": "^1.4 || ^2.0",
+ "phpstan/phpstan-strict-rules": "^1.6 || ^2.0",
+ "phpunit/phpunit": "^8.5 || ^12.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Inflector\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+ "keywords": [
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/inflector/issues",
+ "source": "https://github.com/doctrine/inflector/tree/2.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-10T19:31:58+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:23:10+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.21"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-05T11:56:58+00:00"
+ },
+ {
+ "name": "doctrine/migrations",
+ "version": "3.9.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/migrations.git",
+ "reference": "cd12028853c418b454602e3fda89e519e9af947b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/migrations/zipball/cd12028853c418b454602e3fda89e519e9af947b",
+ "reference": "cd12028853c418b454602e3fda89e519e9af947b",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2",
+ "doctrine/dbal": "^3.6 || ^4",
+ "doctrine/deprecations": "^0.5.3 || ^1",
+ "doctrine/event-manager": "^1.2 || ^2.0",
+ "php": "^8.1",
+ "psr/log": "^1.1.3 || ^2 || ^3",
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0",
+ "symfony/var-exporter": "^6.2 || ^7.0"
+ },
+ "conflict": {
+ "doctrine/orm": "<2.12 || >=4"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^13",
+ "doctrine/orm": "^2.13 || ^3",
+ "doctrine/persistence": "^2 || ^3 || ^4",
+ "doctrine/sql-formatter": "^1.0",
+ "ext-pdo_sqlite": "*",
+ "fig/log-test": "^1",
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-phpunit": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpstan/phpstan-symfony": "^2",
+ "phpunit/phpunit": "^10.3 || ^11.0 || ^12.0",
+ "symfony/cache": "^5.4 || ^6.0 || ^7.0",
+ "symfony/process": "^5.4 || ^6.0 || ^7.0",
+ "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
+ },
+ "suggest": {
+ "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.",
+ "symfony/yaml": "Allows the use of yaml for migration configuration files."
+ },
+ "bin": [
+ "bin/doctrine-migrations"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Migrations\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Michael Simonson",
+ "email": "contact@mikesimonson.com"
+ }
+ ],
+ "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.",
+ "homepage": "https://www.doctrine-project.org/projects/migrations.html",
+ "keywords": [
+ "database",
+ "dbal",
+ "migrations"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/migrations/issues",
+ "source": "https://github.com/doctrine/migrations/tree/3.9.3"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-13T22:04:47+00:00"
+ },
+ {
+ "name": "doctrine/orm",
+ "version": "3.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/orm.git",
+ "reference": "5a541b8b3a327ab1ea5f93b1615b4ff67a34e109"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/orm/zipball/5a541b8b3a327ab1ea5f93b1615b4ff67a34e109",
+ "reference": "5a541b8b3a327ab1ea5f93b1615b4ff67a34e109",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2",
+ "doctrine/collections": "^2.2",
+ "doctrine/dbal": "^3.8.2 || ^4",
+ "doctrine/deprecations": "^0.5.3 || ^1",
+ "doctrine/event-manager": "^1.2 || ^2",
+ "doctrine/inflector": "^1.4 || ^2.0",
+ "doctrine/instantiator": "^1.3 || ^2",
+ "doctrine/lexer": "^3",
+ "doctrine/persistence": "^3.3.1 || ^4",
+ "ext-ctype": "*",
+ "php": "^8.1",
+ "psr/cache": "^1 || ^2 || ^3",
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/var-exporter": "^6.3.9 || ^7.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^13.0",
+ "phpbench/phpbench": "^1.0",
+ "phpdocumentor/guides-cli": "^1.4",
+ "phpstan/extension-installer": "^1.4",
+ "phpstan/phpstan": "2.0.3",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpunit/phpunit": "^10.4.0",
+ "psr/log": "^1 || ^2 || ^3",
+ "squizlabs/php_codesniffer": "3.12.0",
+ "symfony/cache": "^5.4 || ^6.2 || ^7.0"
+ },
+ "suggest": {
+ "ext-dom": "Provides support for XSD validation for XML mapping files",
+ "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\ORM\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "Object-Relational-Mapper for PHP",
+ "homepage": "https://www.doctrine-project.org/projects/orm.html",
+ "keywords": [
+ "database",
+ "orm"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/orm/issues",
+ "source": "https://github.com/doctrine/orm/tree/3.5.2"
+ },
+ "time": "2025-08-08T17:00:40+00:00"
+ },
+ {
+ "name": "doctrine/persistence",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/persistence.git",
+ "reference": "45004aca79189474f113cbe3a53847c2115a55fa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/persistence/zipball/45004aca79189474f113cbe3a53847c2115a55fa",
+ "reference": "45004aca79189474f113cbe3a53847c2115a55fa",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/event-manager": "^1 || ^2",
+ "php": "^8.1",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0"
+ },
+ "conflict": {
+ "doctrine/common": "<2.10"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "1.12.7",
+ "phpstan/phpstan-phpunit": "^1",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^9.6",
+ "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Persistence\\": "src/Persistence"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.",
+ "homepage": "https://www.doctrine-project.org/projects/persistence.html",
+ "keywords": [
+ "mapper",
+ "object",
+ "odm",
+ "orm",
+ "persistence"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/persistence/issues",
+ "source": "https://github.com/doctrine/persistence/tree/4.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-01T21:49:07+00:00"
+ },
+ {
+ "name": "doctrine/sql-formatter",
+ "version": "1.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/sql-formatter.git",
+ "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8",
+ "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "ergebnis/phpunit-slow-test-detector": "^2.14",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5"
+ },
+ "bin": [
+ "bin/sql-formatter"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\SqlFormatter\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jeremy Dorn",
+ "email": "jeremy@jeremydorn.com",
+ "homepage": "https://jeremydorn.com/"
+ }
+ ],
+ "description": "a PHP SQL highlighting library",
+ "homepage": "https://github.com/doctrine/sql-formatter/",
+ "keywords": [
+ "highlight",
+ "sql"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/sql-formatter/issues",
+ "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2"
+ },
+ "time": "2025-01-24T11:45:48+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16",
+ "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.7.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-27T12:30:47+00:00"
+ },
+ {
+ "name": "intervention/image",
+ "version": "2.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Intervention/image.git",
+ "reference": "04be355f8d6734c826045d02a1079ad658322dad"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Intervention/image/zipball/04be355f8d6734c826045d02a1079ad658322dad",
+ "reference": "04be355f8d6734c826045d02a1079ad658322dad",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "guzzlehttp/psr7": "~1.1 || ^2.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9.2",
+ "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15"
+ },
+ "suggest": {
+ "ext-gd": "to use GD library based image processing.",
+ "ext-imagick": "to use Imagick based image processing.",
+ "intervention/imagecache": "Caching extension for the Intervention Image library"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Image": "Intervention\\Image\\Facades\\Image"
+ },
+ "providers": [
+ "Intervention\\Image\\ImageServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "2.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Image\\": "src/Intervention/Image"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io/"
+ }
+ ],
+ "description": "Image handling and manipulation library with support for Laravel integration",
+ "homepage": "http://image.intervention.io/",
+ "keywords": [
+ "gd",
+ "image",
+ "imagick",
+ "laravel",
+ "thumbnail",
+ "watermark"
+ ],
+ "support": {
+ "issues": "https://github.com/Intervention/image/issues",
+ "source": "https://github.com/Intervention/image/tree/2.7.2"
+ },
+ "funding": [
+ {
+ "url": "https://paypal.me/interventionio",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/Intervention",
+ "type": "github"
+ }
+ ],
+ "time": "2022-05-21T17:30:32+00:00"
+ },
+ {
+ "name": "lcobucci/jwt",
+ "version": "5.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/lcobucci/jwt.git",
+ "reference": "a835af59b030d3f2967725697cf88300f579088e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/lcobucci/jwt/zipball/a835af59b030d3f2967725697cf88300f579088e",
+ "reference": "a835af59b030d3f2967725697cf88300f579088e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "ext-sodium": "*",
+ "php": "~8.2.0 || ~8.3.0 || ~8.4.0",
+ "psr/clock": "^1.0"
+ },
+ "require-dev": {
+ "infection/infection": "^0.29",
+ "lcobucci/clock": "^3.2",
+ "lcobucci/coding-standard": "^11.0",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/extension-installer": "^1.2",
+ "phpstan/phpstan": "^1.10.7",
+ "phpstan/phpstan-deprecation-rules": "^1.1.3",
+ "phpstan/phpstan-phpunit": "^1.3.10",
+ "phpstan/phpstan-strict-rules": "^1.5.0",
+ "phpunit/phpunit": "^11.1"
+ },
+ "suggest": {
+ "lcobucci/clock": ">= 3.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Lcobucci\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Luís Cobucci",
+ "email": "lcobucci@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+ "keywords": [
+ "JWS",
+ "jwt"
+ ],
+ "support": {
+ "issues": "https://github.com/lcobucci/jwt/issues",
+ "source": "https://github.com/lcobucci/jwt/tree/5.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/lcobucci",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/lcobucci",
+ "type": "patreon"
+ }
+ ],
+ "time": "2025-01-26T21:29:45+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "3.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6",
+ "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^2.0 || ^3.0"
+ },
+ "provide": {
+ "psr/log-implementation": "3.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "elasticsearch/elasticsearch": "^7 || ^8",
+ "ext-json": "*",
+ "graylog2/gelf-php": "^1.4.2 || ^2.0",
+ "guzzlehttp/guzzle": "^7.4.5",
+ "guzzlehttp/psr7": "^2.2",
+ "mongodb/mongodb": "^1.8",
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
+ "php-console/php-console": "^3.1.8",
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^10.5.17 || ^11.0.7",
+ "predis/predis": "^1.1 || ^2",
+ "rollbar/rollbar": "^4.0",
+ "ruflin/elastica": "^7 || ^8",
+ "symfony/mailer": "^5.4 || ^6",
+ "symfony/mime": "^5.4 || ^6"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+ "ext-mbstring": "Allow to work properly with unicode symbols",
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+ "ext-openssl": "Required to send log messages using SSL",
+ "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "https://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/monolog/issues",
+ "source": "https://github.com/Seldaek/monolog/tree/3.9.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-24T10:02:05+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.6.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62",
+ "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.1",
+ "ext-filter": "*",
+ "php": "^7.4 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.7",
+ "phpstan/phpdoc-parser": "^1.7|^2.0",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.5 || ~1.6.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-webmozart-assert": "^1.2",
+ "phpunit/phpunit": "^9.5",
+ "psalm/phar": "^5.26"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2"
+ },
+ "time": "2025-04-13T19:20:35+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.0",
+ "php": "^7.3 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpstan/phpdoc-parser": "^1.18|^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpunit/phpunit": "^9.5",
+ "rector/rector": "^0.13.9",
+ "vimeo/psalm": "^4.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0"
+ },
+ "time": "2024-11-09T15:12:26+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
+ "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^5.3.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.2.0"
+ },
+ "time": "2025-07-13T07:04:09+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for reading the clock.",
+ "homepage": "https://github.com/php-fig/clock",
+ "keywords": [
+ "clock",
+ "now",
+ "psr",
+ "psr-20",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/clock/issues",
+ "source": "https://github.com/php-fig/clock/tree/1.0.0"
+ },
+ "time": "2022-11-25T14:36:26+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory"
+ },
+ "time": "2024-04-15T12:06:14+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "psr/link",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/link.git",
+ "reference": "84b159194ecfd7eaa472280213976e96415433f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/link/zipball/84b159194ecfd7eaa472280213976e96415433f7",
+ "reference": "84b159194ecfd7eaa472280213976e96415433f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "suggest": {
+ "fig/link-util": "Provides some useful PSR-13 utilities"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Link\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for HTTP links",
+ "homepage": "https://github.com/php-fig/link",
+ "keywords": [
+ "http",
+ "http-link",
+ "link",
+ "psr",
+ "psr-13",
+ "rest"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/link/tree/2.0.1"
+ },
+ "time": "2021-03-11T23:00:27+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/3.0.2"
+ },
+ "time": "2024-09-11T13:17:53+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "symfony/asset",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/asset.git",
+ "reference": "cfee7c0d64be113383db74a2fdd65d426b7f3aab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/asset/zipball/cfee7c0d64be113383db74a2fdd65d426b7f3aab",
+ "reference": "cfee7c0d64be113383db74a2fdd65d426b7f3aab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "conflict": {
+ "symfony/http-foundation": "<5.4"
+ },
+ "require-dev": {
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Asset\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/asset/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/asset-mapper",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/asset-mapper.git",
+ "reference": "6802b5f5446cbf651cfab3108986a6d113d79619"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/6802b5f5446cbf651cfab3108986a6d113d79619",
+ "reference": "6802b5f5446cbf651cfab3108986a6d113d79619",
+ "shasum": ""
+ },
+ "require": {
+ "composer/semver": "^3.0",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/http-client": "^6.3|^7.0"
+ },
+ "conflict": {
+ "symfony/framework-bundle": "<6.4"
+ },
+ "require-dev": {
+ "symfony/asset": "^5.4|^6.0|^7.0",
+ "symfony/browser-kit": "^5.4|^6.0|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher-contracts": "^3.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/web-link": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\AssetMapper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Maps directories of assets & makes them available in a public directory with versioned filenames.",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/asset-mapper/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-14T16:38:25+00:00"
+ },
+ {
+ "name": "symfony/cache",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache.git",
+ "reference": "d038cd3054aeaf1c674022a77048b2ef6376a175"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/d038cd3054aeaf1c674022a77048b2ef6376a175",
+ "reference": "d038cd3054aeaf1c674022a77048b2ef6376a175",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/cache": "^2.0|^3.0",
+ "psr/log": "^1.1|^2|^3",
+ "symfony/cache-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/var-exporter": "^6.3.6|^7.0"
+ },
+ "conflict": {
+ "doctrine/dbal": "<2.13.1",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/http-kernel": "<5.4",
+ "symfony/var-dumper": "<5.4"
+ },
+ "provide": {
+ "psr/cache-implementation": "2.0|3.0",
+ "psr/simple-cache-implementation": "1.0|2.0|3.0",
+ "symfony/cache-implementation": "1.1|2.0|3.0"
+ },
+ "require-dev": {
+ "cache/integration-tests": "dev-master",
+ "doctrine/dbal": "^2.13.1|^3|^4",
+ "predis/predis": "^1.1|^2.0",
+ "psr/simple-cache": "^1.0|^2.0|^3.0",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Cache\\": ""
+ },
+ "classmap": [
+ "Traits/ValueWrapper.php"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "caching",
+ "psr6"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/cache/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T09:32:03+00:00"
+ },
+ {
+ "name": "symfony/cache-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache-contracts.git",
+ "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868",
+ "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/cache": "^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Cache\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to caching",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-13T15:25:07+00:00"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "80e2cf005cf17138c97193be0434cdcfd1b2212e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/80e2cf005cf17138c97193be0434cdcfd1b2212e",
+ "reference": "80e2cf005cf17138c97193be0434cdcfd1b2212e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/finder": "<5.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/config/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-26T13:50:30+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "59266a5bf6a596e3e0844fd95e6ad7ea3c1d3350"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/59266a5bf6a596e3e0844fd95e6ad7ea3c1d3350",
+ "reference": "59266a5bf6a596e3e0844fd95e6ad7ea3c1d3350",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T10:38:54+00:00"
+ },
+ {
+ "name": "symfony/dependency-injection",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "929ab73b93247a15166ee79e807ccee4f930322d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/929ab73b93247a15166ee79e807ccee4f930322d",
+ "reference": "929ab73b93247a15166ee79e807ccee4f930322d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4.20|^7.2.5"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2",
+ "symfony/config": "<6.1",
+ "symfony/finder": "<5.4",
+ "symfony/proxy-manager-bridge": "<6.3",
+ "symfony/yaml": "<5.4"
+ },
+ "provide": {
+ "psr/container-implementation": "1.1|2.0",
+ "symfony/service-implementation": "1.1|2.0|3.0"
+ },
+ "require-dev": {
+ "symfony/config": "^6.1|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DependencyInjection\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows you to standardize and centralize the way objects are constructed in your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/dependency-injection/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T17:30:48+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/doctrine-bridge",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/doctrine-bridge.git",
+ "reference": "eb0b8e3d326b6155a64599d44c879bef270ef58e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/eb0b8e3d326b6155a64599d44c879bef270ef58e",
+ "reference": "eb0b8e3d326b6155a64599d44c879bef270ef58e",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/event-manager": "^1.2|^2",
+ "doctrine/persistence": "^2.5|^3.1|^4",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "doctrine/dbal": "<2.13.1",
+ "doctrine/lexer": "<1.1",
+ "doctrine/orm": "<2.15",
+ "symfony/cache": "<5.4",
+ "symfony/dependency-injection": "<6.2",
+ "symfony/form": "<5.4.38|>=6,<6.4.6|>=7,<7.0.6",
+ "symfony/http-foundation": "<6.3",
+ "symfony/http-kernel": "<6.2",
+ "symfony/lock": "<6.3",
+ "symfony/messenger": "<5.4",
+ "symfony/property-info": "<5.4",
+ "symfony/security-bundle": "<5.4",
+ "symfony/security-core": "<6.4",
+ "symfony/validator": "<6.4"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0|^2.0",
+ "doctrine/data-fixtures": "^1.1|^2",
+ "doctrine/dbal": "^2.13.1|^3|^4",
+ "doctrine/orm": "^2.15|^3",
+ "psr/log": "^1|^2|^3",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^6.2|^7.0",
+ "symfony/doctrine-messenger": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/form": "^5.4.38|^6.4.6|^7.0.6",
+ "symfony/http-kernel": "^6.3|^7.0",
+ "symfony/lock": "^6.3|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/property-access": "^5.4|^6.0|^7.0",
+ "symfony/property-info": "^5.4|^6.0|^7.0",
+ "symfony/proxy-manager-bridge": "^6.4",
+ "symfony/security-core": "^6.4|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4|^6.0|^7.0",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "symfony-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\Doctrine\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides integration for Doctrine with various Symfony components",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/dotenv",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dotenv.git",
+ "reference": "234b6c602f12b00693f4b0d1054386fb30dfc8ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/234b6c602f12b00693f4b0d1054386fb30dfc8ff",
+ "reference": "234b6c602f12b00693f4b0d1054386fb30dfc8ff",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "conflict": {
+ "symfony/console": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Dotenv\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Registers environment variables from a .env file",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/dotenv/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/error-handler",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "30fd0b3cf0e972e82636038ce4db0e4fe777112c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/30fd0b3cf0e972e82636038ce4db0e4fe777112c",
+ "reference": "30fd0b3cf0e972e82636038ce4db0e4fe777112c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "symfony/deprecation-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4"
+ },
+ "require-dev": {
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/serializer": "^5.4|^6.0|^7.0"
+ },
+ "bin": [
+ "Resources/bin/patch-type-declarations"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ErrorHandler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to manage errors and ease debugging PHP code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/error-handler/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-24T08:25:04+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "307a09d8d7228d14a05e5e05b95fffdacab032b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/307a09d8d7228d14a05e5e05b95fffdacab032b2",
+ "reference": "307a09d8d7228d14a05e5e05b95fffdacab032b2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/event-dispatcher-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/error-handler": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/expression-language",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/expression-language.git",
+ "reference": "1ea0adaa53539ea7e70821ae9de49ebe03ae7091"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/expression-language/zipball/1ea0adaa53539ea7e70821ae9de49ebe03ae7091",
+ "reference": "1ea0adaa53539ea7e70821ae9de49ebe03ae7091",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ExpressionLanguage\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an engine that can compile and evaluate expressions",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/expression-language/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/75ae2edb7cdcc0c53766c30b0a2512b8df574bd8",
+ "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8"
+ },
+ "require-dev": {
+ "symfony/process": "^5.4|^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "73089124388c8510efb8d2d1689285d285937b08"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/73089124388c8510efb8d2d1689285d285937b08",
+ "reference": "73089124388c8510efb8d2d1689285d285937b08",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-15T12:02:45+00:00"
+ },
+ {
+ "name": "symfony/flex",
+ "version": "v2.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/flex.git",
+ "reference": "423c36e369361003dc31ef11c5f15fb589e52c01"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/flex/zipball/423c36e369361003dc31ef11c5f15fb589e52c01",
+ "reference": "423c36e369361003dc31ef11c5f15fb589e52c01",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^2.1",
+ "php": ">=8.0"
+ },
+ "conflict": {
+ "composer/semver": "<1.7.2"
+ },
+ "require-dev": {
+ "composer/composer": "^2.1",
+ "symfony/dotenv": "^5.4|^6.0",
+ "symfony/filesystem": "^5.4|^6.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0",
+ "symfony/process": "^5.4|^6.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Symfony\\Flex\\Flex"
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Flex\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien.potencier@gmail.com"
+ }
+ ],
+ "description": "Composer plugin for Symfony",
+ "support": {
+ "issues": "https://github.com/symfony/flex/issues",
+ "source": "https://github.com/symfony/flex/tree/v2.8.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-05T07:45:19+00:00"
+ },
+ {
+ "name": "symfony/form",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/form.git",
+ "reference": "7db222a6e0b05793971560a7d015b5162eeed3bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/form/zipball/7db222a6e0b05793971560a7d015b5162eeed3bc",
+ "reference": "7db222a6e0b05793971560a7d015b5162eeed3bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/options-resolver": "^5.4|^6.0|^7.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-icu": "^1.21",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/property-access": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/console": "<5.4",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7",
+ "symfony/error-handler": "<5.4",
+ "symfony/framework-bundle": "<5.4",
+ "symfony/http-kernel": "<5.4",
+ "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3",
+ "symfony/translation-contracts": "<2.5",
+ "symfony/twig-bridge": "<6.3"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0|^2.0",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/html-sanitizer": "^6.1|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/intl": "^5.4|^6.0|^7.0",
+ "symfony/security-core": "^6.2|^7.0",
+ "symfony/security-csrf": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "symfony/validator": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Form\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows to easily create, process and reuse HTML forms",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/form/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-24T08:25:04+00:00"
+ },
+ {
+ "name": "symfony/framework-bundle",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/framework-bundle.git",
+ "reference": "869b94902dd38f2f33718908f2b5d4868e3b9241"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/869b94902dd38f2f33718908f2b5d4868e3b9241",
+ "reference": "869b94902dd38f2f33718908f2b5d4868e3b9241",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": ">=2.1",
+ "ext-xml": "*",
+ "php": ">=8.1",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/config": "^6.1|^7.0",
+ "symfony/dependency-injection": "^6.4.12|^7.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/error-handler": "^6.1|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/routing": "^6.4|^7.0"
+ },
+ "conflict": {
+ "doctrine/annotations": "<1.13.1",
+ "doctrine/persistence": "<1.3",
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/asset": "<5.4",
+ "symfony/asset-mapper": "<6.4",
+ "symfony/clock": "<6.3",
+ "symfony/console": "<5.4|>=7.0",
+ "symfony/dom-crawler": "<6.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/form": "<5.4",
+ "symfony/http-client": "<6.3",
+ "symfony/lock": "<5.4",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<6.3",
+ "symfony/mime": "<6.4",
+ "symfony/property-access": "<5.4",
+ "symfony/property-info": "<5.4",
+ "symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6",
+ "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4",
+ "symfony/security-core": "<5.4",
+ "symfony/security-csrf": "<5.4",
+ "symfony/serializer": "<6.4",
+ "symfony/stopwatch": "<5.4",
+ "symfony/translation": "<6.4",
+ "symfony/twig-bridge": "<5.4",
+ "symfony/twig-bundle": "<5.4",
+ "symfony/validator": "<6.4",
+ "symfony/web-profiler-bundle": "<6.4",
+ "symfony/workflow": "<6.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.13.1|^2",
+ "doctrine/persistence": "^1.3|^2|^3",
+ "dragonmantank/cron-expression": "^3.1",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "seld/jsonlint": "^1.10",
+ "symfony/asset": "^5.4|^6.0|^7.0",
+ "symfony/asset-mapper": "^6.4|^7.0",
+ "symfony/browser-kit": "^5.4|^6.0|^7.0",
+ "symfony/clock": "^6.2|^7.0",
+ "symfony/console": "^5.4.9|^6.0.9|^7.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0",
+ "symfony/dom-crawler": "^6.4|^7.0",
+ "symfony/dotenv": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/form": "^5.4|^6.0|^7.0",
+ "symfony/html-sanitizer": "^6.1|^7.0",
+ "symfony/http-client": "^6.3|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/mailer": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^6.3|^7.0",
+ "symfony/mime": "^6.4|^7.0",
+ "symfony/notifier": "^5.4|^6.0|^7.0",
+ "symfony/polyfill-intl-icu": "~1.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/property-info": "^5.4|^6.0|^7.0",
+ "symfony/rate-limiter": "^5.4|^6.0|^7.0",
+ "symfony/scheduler": "^6.4.4|^7.0.4",
+ "symfony/security-bundle": "^5.4|^6.0|^7.0",
+ "symfony/semaphore": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^6.4|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/string": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^6.4|^7.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/web-link": "^5.4|^6.0|^7.0",
+ "symfony/workflow": "^6.4|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0",
+ "twig/twig": "^2.10|^3.0.4"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\FrameworkBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/framework-bundle/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T07:06:12+00:00"
+ },
+ {
+ "name": "symfony/http-client",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client.git",
+ "reference": "6d78fe8abecd547c159b8a49f7c88610630b7da2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/6d78fe8abecd547c159b8a49f7c88610630b7da2",
+ "reference": "6d78fe8abecd547c159b8a49f7c88610630b7da2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-client-contracts": "~3.4.4|^3.5.2",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "php-http/discovery": "<1.15",
+ "symfony/http-foundation": "<6.3"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "1.0",
+ "symfony/http-client-implementation": "3.0"
+ },
+ "require-dev": {
+ "amphp/amp": "^2.5",
+ "amphp/http-client": "^4.2.1",
+ "amphp/http-tunnel": "^1.0",
+ "amphp/socket": "^1.1",
+ "guzzlehttp/promises": "^1.4|^2.0",
+ "nyholm/psr7": "^1.0",
+ "php-http/httplug": "^1.0|^2.0",
+ "psr/http-client": "^1.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "http"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-14T16:38:25+00:00"
+ },
+ {
+ "name": "symfony/http-client-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client-contracts.git",
+ "reference": "75d7043853a42837e68111812f4d964b01e5101c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c",
+ "reference": "75d7043853a42837e68111812f4d964b01e5101c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to HTTP clients",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-29T11:18:49+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "0341e41d8d8830c31a1dff5cbc5bdb3ec872a073"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0341e41d8d8830c31a1dff5cbc5bdb3ec872a073",
+ "reference": "0341e41d8d8830c31a1dff5cbc5bdb3ec872a073",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.1",
+ "symfony/polyfill-php83": "^1.27"
+ },
+ "conflict": {
+ "symfony/cache": "<6.4.12|>=7.0,<7.1.5"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^2.13.1|^3|^4",
+ "predis/predis": "^1.1|^2.0",
+ "symfony/cache": "^6.4.12|^7.1.5",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0",
+ "symfony/mime": "^5.4|^6.0|^7.0",
+ "symfony/rate-limiter": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Defines an object-oriented layer for the HTTP specification",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-foundation/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "b81dcdbe34b8e8f7b3fc7b2a47fa065d5bf30726"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b81dcdbe34b8e8f7b3fc7b2a47fa065d5bf30726",
+ "reference": "b81dcdbe34b8e8f7b3fc7b2a47fa065d5bf30726",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/browser-kit": "<5.4",
+ "symfony/cache": "<5.4",
+ "symfony/config": "<6.1",
+ "symfony/console": "<5.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/doctrine-bridge": "<5.4",
+ "symfony/form": "<5.4",
+ "symfony/http-client": "<5.4",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<5.4",
+ "symfony/translation": "<5.4",
+ "symfony/translation-contracts": "<2.5",
+ "symfony/twig-bridge": "<5.4",
+ "symfony/validator": "<6.4",
+ "symfony/var-dumper": "<6.3",
+ "twig/twig": "<2.13"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "symfony/browser-kit": "^5.4|^6.0|^7.0",
+ "symfony/clock": "^6.2|^7.0",
+ "symfony/config": "^6.1|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/dom-crawler": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/http-client-contracts": "^2.5|^3",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/property-access": "^5.4.5|^6.0.5|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^6.4.4|^7.0.4",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4|^6.0|^7.0",
+ "symfony/translation-contracts": "^2.5|^3",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^5.4|^6.4|^7.0",
+ "symfony/var-exporter": "^6.2|^7.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a structured process for converting a Request into a Response",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-kernel/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-31T09:23:30+00:00"
+ },
+ {
+ "name": "symfony/intl",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/intl.git",
+ "reference": "c0938cd29804e65308051a42d1387f0dd57e1eaf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/intl/zipball/c0938cd29804e65308051a42d1387f0dd57e1eaf",
+ "reference": "c0938cd29804e65308051a42d1387f0dd57e1eaf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/var-exporter": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Intl\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/",
+ "/Resources/data/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ },
+ {
+ "name": "Eriksen Costa",
+ "email": "eriksen.costa@infranology.com.br"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides access to the localization data of the ICU library",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "i18n",
+ "icu",
+ "internationalization",
+ "intl",
+ "l10n",
+ "localization"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/intl/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/mercure",
+ "version": "v0.6.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mercure.git",
+ "reference": "304cf84609ef645d63adc65fc6250292909a461b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mercure/zipball/304cf84609ef645d63adc65fc6250292909a461b",
+ "reference": "304cf84609ef645d63adc65fc6250292909a461b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "symfony/deprecation-contracts": "^2.0|^3.0|^4.0",
+ "symfony/http-client": "^4.4|^5.0|^6.0|^7.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0|^7.0",
+ "symfony/polyfill-php80": "^1.22",
+ "symfony/web-link": "^4.4|^5.0|^6.0|^7.0"
+ },
+ "require-dev": {
+ "lcobucci/jwt": "^3.4|^4.0|^5.0",
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0|^7.0",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0|^7.0",
+ "symfony/phpunit-bridge": "^5.2|^6.0|^7.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0|^7.0",
+ "twig/twig": "^2.0|^3.0|^4.0"
+ },
+ "suggest": {
+ "symfony/stopwatch": "Integration with the profiler performances"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/dunglas/mercure",
+ "name": "dunglas/mercure"
+ },
+ "branch-alias": {
+ "dev-main": "0.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mercure\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kévin Dunglas",
+ "email": "dunglas@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Mercure Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "mercure",
+ "push",
+ "sse",
+ "updates"
+ ],
+ "support": {
+ "issues": "https://github.com/symfony/mercure/issues",
+ "source": "https://github.com/symfony/mercure/tree/v0.6.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/dunglas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/mercure",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-08T12:51:34+00:00"
+ },
+ {
+ "name": "symfony/mercure-bundle",
+ "version": "v0.3.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mercure-bundle.git",
+ "reference": "77435d740b228e9f5f3f065b6db564f85f2cdb64"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mercure-bundle/zipball/77435d740b228e9f5f3f065b6db564f85f2cdb64",
+ "reference": "77435d740b228e9f5f3f065b6db564f85f2cdb64",
+ "shasum": ""
+ },
+ "require": {
+ "lcobucci/jwt": "^3.4|^4.0|^5.0",
+ "php": ">=7.1.3",
+ "symfony/config": "^4.4|^5.0|^6.0|^7.0",
+ "symfony/dependency-injection": "^4.4|^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0|^7.0",
+ "symfony/mercure": "^0.6.1",
+ "symfony/web-link": "^4.4|^5.0|^6.0|^7.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^4.3.7|^5.0|^6.0|^7.0",
+ "symfony/stopwatch": "^4.3.7|^5.0|^6.0|^7.0",
+ "symfony/ux-turbo": "*",
+ "symfony/var-dumper": "^4.3.7|^5.0|^6.0|^7.0"
+ },
+ "suggest": {
+ "symfony/messenger": "To use the Messenger integration"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "0.3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\MercureBundle\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kévin Dunglas",
+ "email": "dunglas@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony MercureBundle",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "mercure",
+ "push",
+ "sse",
+ "updates"
+ ],
+ "support": {
+ "issues": "https://github.com/symfony/mercure-bundle/issues",
+ "source": "https://github.com/symfony/mercure-bundle/tree/v0.3.9"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/dunglas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/mercure-bundle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-31T09:07:18+00:00"
+ },
+ {
+ "name": "symfony/mercure-notifier",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mercure-notifier.git",
+ "reference": "6d337e62d3dea328c32e14e1a0bab516d0b52b82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mercure-notifier/zipball/6d337e62d3dea328c32e14e1a0bab516d0b52b82",
+ "reference": "6d337e62d3dea328c32e14e1a0bab516d0b52b82",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/mercure": "^0.5.2|^0.6",
+ "symfony/notifier": "^6.2.7|^7.0",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "type": "symfony-notifier-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Notifier\\Bridge\\Mercure\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mathias Arlaud",
+ "email": "mathias.arlaud@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Mercure Notifier Bridge",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "mercure",
+ "notifier"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/mercure-notifier/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/monolog-bridge",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/monolog-bridge.git",
+ "reference": "b0ff45e8d9289062a963deaf8b55e92488322e3f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/b0ff45e8d9289062a963deaf8b55e92488322e3f",
+ "reference": "b0ff45e8d9289062a963deaf8b55e92488322e3f",
+ "shasum": ""
+ },
+ "require": {
+ "monolog/monolog": "^1.25.1|^2|^3",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/console": "<5.4",
+ "symfony/http-foundation": "<5.4",
+ "symfony/security-core": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/mailer": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/mime": "^5.4|^6.0|^7.0",
+ "symfony/security-core": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "symfony-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\Monolog\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides integration for Monolog with various Symfony components",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/monolog-bundle",
+ "version": "v3.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/monolog-bundle.git",
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
+ "shasum": ""
+ },
+ "require": {
+ "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0",
+ "php": ">=7.2.5",
+ "symfony/config": "^5.4 || ^6.0 || ^7.0",
+ "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0",
+ "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0",
+ "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/phpunit-bridge": "^6.3 || ^7.0",
+ "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\MonologBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony MonologBundle",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "log",
+ "logging"
+ ],
+ "support": {
+ "issues": "https://github.com/symfony/monolog-bundle/issues",
+ "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-06T17:08:13+00:00"
+ },
+ {
+ "name": "symfony/notifier",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/notifier.git",
+ "reference": "46cceb8c674a6a0567e4f7f44212ef6387b03530"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/notifier/zipball/46cceb8c674a6a0567e4f7f44212ef6387b03530",
+ "reference": "46cceb8c674a6a0567e4f7f44212ef6387b03530",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^1|^2|^3"
+ },
+ "conflict": {
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/event-dispatcher-contracts": "<2.5",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/http-kernel": "<5.4"
+ },
+ "require-dev": {
+ "symfony/event-dispatcher-contracts": "^2.5|^3",
+ "symfony/http-client-contracts": "^2.5|^3",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Notifier\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Sends notifications via one or more channels (email, SMS, ...)",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "notification",
+ "notifier"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/notifier/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "baee5736ddf7a0486dd68ca05aa4fd7e64458d3d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/baee5736ddf7a0486dd68ca05aa4fd7e64458d3d",
+ "reference": "baee5736ddf7a0486dd68ca05aa4fd7e64458d3d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an improved replacement for the array_replace PHP function",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/options-resolver/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-14T16:38:25+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-icu",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-icu.git",
+ "reference": "763d2a91fea5681509ca01acbc1c5e450d127811"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811",
+ "reference": "763d2a91fea5681509ca01acbc1c5e450d127811",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance and support of other locales than \"en\""
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Icu\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's ICU-related data and classes",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "icu",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-21T18:38:29+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-23T08:48:59+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php83",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php83\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php84",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php84.git",
+ "reference": "000df7860439609837bbe28670b0be15783b7fbf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf",
+ "reference": "000df7860439609837bbe28670b0be15783b7fbf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php84\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-02-20T12:04:08+00:00"
+ },
+ {
+ "name": "symfony/property-access",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/property-access.git",
+ "reference": "a33acdae7c76f837c1db5465cc3445adf3ace94a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/a33acdae7c76f837c1db5465cc3445adf3ace94a",
+ "reference": "a33acdae7c76f837c1db5465cc3445adf3ace94a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/property-info": "^5.4|^6.0|^7.0"
+ },
+ "require-dev": {
+ "symfony/cache": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\PropertyAccess\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides functions to read and write from/to an object or array using a simple string notation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "access",
+ "array",
+ "extraction",
+ "index",
+ "injection",
+ "object",
+ "property",
+ "property-path",
+ "reflection"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/property-access/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-15T12:03:16+00:00"
+ },
+ {
+ "name": "symfony/property-info",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/property-info.git",
+ "reference": "1056ae3621eeddd78d7c5ec074f1c1784324eec6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/1056ae3621eeddd78d7c5ec074f1c1784324eec6",
+ "reference": "1056ae3621eeddd78d7c5ec074f1c1784324eec6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/string": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "doctrine/annotations": "<1.12",
+ "phpdocumentor/reflection-docblock": "<5.2",
+ "phpdocumentor/type-resolver": "<1.5.1",
+ "symfony/cache": "<5.4",
+ "symfony/dependency-injection": "<5.4|>=6.0,<6.4",
+ "symfony/serializer": "<5.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.12|^2",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "phpstan/phpdoc-parser": "^1.0|^2.0",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^5.4|^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\PropertyInfo\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kévin Dunglas",
+ "email": "dunglas@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Extracts information about PHP class' properties using metadata of popular sources",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "doctrine",
+ "phpdoc",
+ "property",
+ "symfony",
+ "type",
+ "validator"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/property-info/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-14T16:38:25+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/e4f94e625c8e6f910aa004a0042f7b2d398278f5",
+ "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "doctrine/annotations": "<1.12",
+ "symfony/config": "<6.2",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/yaml": "<5.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.12|^2",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.2|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Maps an HTTP request to a set of configuration variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/routing/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-15T08:46:37+00:00"
+ },
+ {
+ "name": "symfony/runtime",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/runtime.git",
+ "reference": "c1cc6721646f546627236c57f835272806087337"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/runtime/zipball/c1cc6721646f546627236c57f835272806087337",
+ "reference": "c1cc6721646f546627236c57f835272806087337",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": ">=8.1"
+ },
+ "conflict": {
+ "symfony/dotenv": "<5.4"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0.2|^2.0",
+ "symfony/console": "^5.4.9|^6.0.9|^7.0",
+ "symfony/dotenv": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Runtime\\": "",
+ "Symfony\\Runtime\\Symfony\\Component\\": "Internal/"
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Enables decoupling PHP applications from global state",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "runtime"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/runtime/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-25T09:37:31+00:00"
+ },
+ {
+ "name": "symfony/stimulus-bundle",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stimulus-bundle.git",
+ "reference": "fedf396824a29f9c3bcf475b148aaf2db79521c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/fedf396824a29f9c3bcf475b148aaf2db79521c9",
+ "reference": "fedf396824a29f9c3bcf475b148aaf2db79521c9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/deprecation-contracts": "^2.0|^3.0",
+ "symfony/finder": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0|^8.0",
+ "twig/twig": "^2.15.3|^3.8"
+ },
+ "require-dev": {
+ "symfony/asset-mapper": "^6.3|^7.0|^8.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "zenstruck/browser": "^1.4"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\StimulusBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Integration with your Symfony app & Stimulus!",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/stimulus-bundle/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898",
+ "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Stopwatch\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a way to profile code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/stopwatch/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "f0ce0bd36a3accb4a225435be077b4b4875587f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/f0ce0bd36a3accb4a225435be077b4b4875587f4",
+ "reference": "f0ce0bd36a3accb4a225435be077b4b4875587f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^5.4|^6.0|^7.0",
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/intl": "^6.2|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/300b72643e89de0734d99a9e3f8494a3ef6936e1",
+ "reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/translation-contracts": "^2.5|^3.0"
+ },
+ "conflict": {
+ "symfony/config": "<5.4",
+ "symfony/console": "<5.4",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/http-kernel": "<5.4",
+ "symfony/service-contracts": "<2.5",
+ "symfony/twig-bundle": "<5.4",
+ "symfony/yaml": "<5.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.3|3.0"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^4.18|^5.0",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/http-client-contracts": "^2.5|^3.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/intl": "^5.4|^6.0|^7.0",
+ "symfony/polyfill-intl-icu": "^1.21",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to internationalize your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/translation/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T17:30:48+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
+ "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-27T08:32:26+00:00"
+ },
+ {
+ "name": "symfony/twig-bridge",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/twig-bridge.git",
+ "reference": "af9ef04e348f93410c83d04d2806103689a3d924"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/af9ef04e348f93410c83d04d2806103689a3d924",
+ "reference": "af9ef04e348f93410c83d04d2806103689a3d924",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/translation-contracts": "^2.5|^3",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/console": "<5.4",
+ "symfony/form": "<6.3",
+ "symfony/http-foundation": "<5.4",
+ "symfony/http-kernel": "<6.4",
+ "symfony/mime": "<6.2",
+ "symfony/serializer": "<6.4",
+ "symfony/translation": "<5.4",
+ "symfony/workflow": "<5.4"
+ },
+ "require-dev": {
+ "egulias/email-validator": "^2.1.10|^3|^4",
+ "league/html-to-markdown": "^5.0",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/asset": "^5.4|^6.0|^7.0",
+ "symfony/asset-mapper": "^6.3|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/form": "^6.4.20|^7.2.5",
+ "symfony/html-sanitizer": "^6.1|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/intl": "^5.4|^6.0|^7.0",
+ "symfony/mime": "^6.2|^7.0",
+ "symfony/polyfill-intl-icu": "~1.0",
+ "symfony/property-info": "^5.4|^6.0|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/security-acl": "^2.8|^3.0",
+ "symfony/security-core": "^5.4|^6.0|^7.0",
+ "symfony/security-csrf": "^5.4|^6.0|^7.0",
+ "symfony/security-http": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^6.4.3|^7.0.3",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^6.1|^7.0",
+ "symfony/web-link": "^5.4|^6.0|^7.0",
+ "symfony/workflow": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0",
+ "twig/cssinliner-extra": "^2.12|^3",
+ "twig/inky-extra": "^2.12|^3",
+ "twig/markdown-extra": "^2.12|^3"
+ },
+ "type": "symfony-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\Twig\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides integration for Twig with various Symfony components",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/twig-bridge/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-26T12:47:35+00:00"
+ },
+ {
+ "name": "symfony/twig-bundle",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/twig-bundle.git",
+ "reference": "3b48b6e8225495c6d2438828982b4d219ca565ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/3b48b6e8225495c6d2438828982b4d219ca565ba",
+ "reference": "3b48b6e8225495c6d2438828982b4d219ca565ba",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": ">=2.1",
+ "php": ">=8.1",
+ "symfony/config": "^6.1|^7.0",
+ "symfony/dependency-injection": "^6.1|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^6.2",
+ "symfony/twig-bridge": "^6.4",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "conflict": {
+ "symfony/framework-bundle": "<5.4",
+ "symfony/translation": "<5.4"
+ },
+ "require-dev": {
+ "symfony/asset": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/form": "^5.4|^6.0|^7.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4|^6.0|^7.0",
+ "symfony/web-link": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\TwigBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a tight integration of Twig into the Symfony full-stack framework",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/twig-bundle/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/ux-autocomplete",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-autocomplete.git",
+ "reference": "852ca8b7434c8e4ba2ceeb90ef69ab49d51a84fd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-autocomplete/zipball/852ca8b7434c8e4ba2ceeb90ef69ab49d51a84fd",
+ "reference": "852ca8b7434c8e4ba2ceeb90ef69ab49d51a84fd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/dependency-injection": "^6.3|^7.0|^8.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-foundation": "^6.3|^7.0|^8.0",
+ "symfony/http-kernel": "^6.3|^7.0|^8.0",
+ "symfony/property-access": "^6.3|^7.0|^8.0"
+ },
+ "conflict": {
+ "doctrine/orm": "2.9.0 || 2.9.1"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8|^2.0",
+ "doctrine/doctrine-bundle": "^2.4.3",
+ "doctrine/orm": "^2.9.4|^3.0",
+ "fakerphp/faker": "^1.22",
+ "mtdowling/jmespath.php": "^2.6",
+ "symfony/form": "^6.3|^7.0|^8.0",
+ "symfony/framework-bundle": "^6.3|^7.0|^8.0",
+ "symfony/maker-bundle": "^1.40",
+ "symfony/options-resolver": "^6.3|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^6.3|^7.0|^8.0",
+ "symfony/process": "^6.3|^7.0|^8.0",
+ "symfony/security-bundle": "^6.3|^7.0|^8.0",
+ "symfony/twig-bundle": "^6.3|^7.0|^8.0",
+ "symfony/uid": "^6.3|^7.0|^8.0",
+ "twig/twig": "^2.14.7|^3.0.4",
+ "zenstruck/browser": "^1.1",
+ "zenstruck/foundry": "^2.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Autocomplete\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "JavaScript Autocomplete functionality for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-autocomplete/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-chartjs",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-chartjs.git",
+ "reference": "9d3bb03fbad4d6cd9894fbf52eaf38bd848c0563"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-chartjs/zipball/9d3bb03fbad4d6cd9894fbf52eaf38bd848c0563",
+ "reference": "9d3bb03fbad4d6cd9894fbf52eaf38bd848c0563",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/stimulus-bundle": "^2.9.1"
+ },
+ "conflict": {
+ "symfony/flex": "<1.13"
+ },
+ "require-dev": {
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Chartjs\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Titouan Galopin",
+ "email": "galopintitouan@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Chart.js integration for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-chartjs/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-cropperjs",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-cropperjs.git",
+ "reference": "2d5fa78ecb428558ada334b35449b1db1045b2c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-cropperjs/zipball/2d5fa78ecb428558ada334b35449b1db1045b2c4",
+ "reference": "2d5fa78ecb428558ada334b35449b1db1045b2c4",
+ "shasum": ""
+ },
+ "require": {
+ "intervention/image": "^2.5",
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/form": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/options-resolver": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/validator": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "conflict": {
+ "symfony/flex": "<1.13"
+ },
+ "require-dev": {
+ "symfony/expression-language": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0",
+ "twig/twig": "^2.14.7|^3.0.4"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Cropperjs\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Titouan Galopin",
+ "email": "galopintitouan@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Cropper.js integration for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-cropperjs/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-dropzone",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-dropzone.git",
+ "reference": "47262c40649acc6a85b91199369f8d710497ff8e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-dropzone/zipball/47262c40649acc6a85b91199369f8d710497ff8e",
+ "reference": "47262c40649acc6a85b91199369f8d710497ff8e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/form": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/options-resolver": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "require-dev": {
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0",
+ "twig/twig": "^2.14.7|^3.0.4"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Dropzone\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Titouan Galopin",
+ "email": "galopintitouan@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "File input dropzones for Symfony Forms",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-dropzone/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-google-map",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-google-map.git",
+ "reference": "c5104f0c24ecf003100702393b1cc6d2ec8e796f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-google-map/zipball/c5104f0c24ecf003100702393b1cc6d2ec8e796f",
+ "reference": "c5104f0c24ecf003100702393b1cc6d2ec8e796f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/stimulus-bundle": "^2.18.1",
+ "symfony/ux-map": "^2.19"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6.22",
+ "spatie/phpunit-snapshot-assertions": "^4.2.17",
+ "symfony/phpunit-bridge": "^7.2|^8.0",
+ "symfony/ux-icons": "^2.18"
+ },
+ "type": "symfony-ux-map-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Map\\Bridge\\Google\\": "src/"
+ },
+ "exclude-from-classmap": []
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Hugo Alliaume",
+ "email": "hugo@alliau.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony UX Map GoogleMaps Bridge",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "google-maps",
+ "map",
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-google-map/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T12:42:20+00:00"
+ },
+ {
+ "name": "symfony/ux-icons",
+ "version": "v2.29.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-icons.git",
+ "reference": "6ed8d1d5348fbc895cb6caffd59e027b2fa13243"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-icons/zipball/6ed8d1d5348fbc895cb6caffd59e027b2fa13243",
+ "reference": "6ed8d1d5348fbc895cb6caffd59e027b2fa13243",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/framework-bundle": "^6.4|^7.0|^8.0",
+ "symfony/twig-bundle": "^6.4|^7.0|^8.0"
+ },
+ "conflict": {
+ "symfony/flex": "<1.13",
+ "symfony/ux-twig-component": "<2.21"
+ },
+ "require-dev": {
+ "psr/log": "^2|^3",
+ "symfony/asset-mapper": "^6.4|^7.0|^8.0",
+ "symfony/console": "^6.4|^7.0|^8.0",
+ "symfony/http-client": "6.4|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^6.3|^7.0|^8.0",
+ "symfony/ux-twig-component": "^2.14",
+ "zenstruck/console-test": "^1.5"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Icons\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kevin Bond",
+ "email": "kevinbond@gmail.com"
+ },
+ {
+ "name": "Simon André",
+ "email": "smn.andre@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Renders local and remote SVG icons in your Twig templates.",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "icons",
+ "svg",
+ "symfony-ux",
+ "twig"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-icons/tree/v2.29.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-05T22:04:40+00:00"
+ },
+ {
+ "name": "symfony/ux-lazy-image",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-lazy-image.git",
+ "reference": "76c803b38cbf86b3edd040780ddc4e663315e7a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-lazy-image/zipball/76c803b38cbf86b3edd040780ddc4e663315e7a5",
+ "reference": "76c803b38cbf86b3edd040780ddc4e663315e7a5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "require-dev": {
+ "intervention/image": "^2.5|^3.0",
+ "kornrunner/blurhash": "^1.1",
+ "symfony/cache-contracts": "^2.2|^3.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.2|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\LazyImage\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Titouan Galopin",
+ "email": "galopintitouan@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Lazy image loader and utilities for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-lazy-image/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-leaflet-map",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-leaflet-map.git",
+ "reference": "764616b1011247fa5089130cf098651f8b7ecdbb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-leaflet-map/zipball/764616b1011247fa5089130cf098651f8b7ecdbb",
+ "reference": "764616b1011247fa5089130cf098651f8b7ecdbb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/stimulus-bundle": "^2.18.1",
+ "symfony/ux-map": "^2.19"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6.22",
+ "spatie/phpunit-snapshot-assertions": "^4.2.17",
+ "symfony/phpunit-bridge": "^7.2|^8.0",
+ "symfony/ux-icons": "^2.18"
+ },
+ "type": "symfony-ux-map-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Map\\Bridge\\Leaflet\\": "src/"
+ },
+ "exclude-from-classmap": []
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Hugo Alliaume",
+ "email": "hugo@alliau.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony UX Map Leaflet Bridge",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "leaflet",
+ "map",
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-leaflet-map/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T12:42:20+00:00"
+ },
+ {
+ "name": "symfony/ux-live-component",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-live-component.git",
+ "reference": "be9aed778681bd496a5ebbc039aef313a48ec7f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/be9aed778681bd496a5ebbc039aef313a48ec7f4",
+ "reference": "be9aed778681bd496a5ebbc039aef313a48ec7f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
+ "symfony/property-access": "^5.4.5|^6.0|^7.0|^8.0",
+ "symfony/property-info": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/stimulus-bundle": "^2.9",
+ "symfony/ux-twig-component": "^2.25.1",
+ "twig/twig": "^3.10.3"
+ },
+ "conflict": {
+ "symfony/config": "<5.4.0",
+ "symfony/property-info": "~7.0.0",
+ "symfony/type-info": "<7.2"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.0",
+ "doctrine/collections": "^1.6.8|^2.0",
+ "doctrine/doctrine-bundle": "^2.4.3",
+ "doctrine/orm": "^2.9.4",
+ "doctrine/persistence": "^2.5.2|^3.0",
+ "phpdocumentor/reflection-docblock": "5.x-dev",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/form": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/options-resolver": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^6.1|^7.0|^8.0",
+ "symfony/security-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/serializer": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/uid": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/validator": "^5.4|^6.0|^7.0|^8.0",
+ "zenstruck/browser": "^1.2.0",
+ "zenstruck/foundry": "^2.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\LiveComponent\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Live components for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "components",
+ "symfony-ux",
+ "twig"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-live-component/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-map",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-map.git",
+ "reference": "cf81723a2485235bef14e50ef6b078c5c19db271"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-map/zipball/cf81723a2485235bef14e50ef6b078c5c19db271",
+ "reference": "cf81723a2485235bef14e50ef6b078c5c19db271",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/stimulus-bundle": "^2.18.1"
+ },
+ "conflict": {
+ "symfony/ux-twig-component": "<2.21"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6.22",
+ "spatie/phpunit-snapshot-assertions": "^4.2.17",
+ "symfony/asset-mapper": "^6.4|^7.0|^8.0",
+ "symfony/framework-bundle": "^6.4|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^7.2|^8.0",
+ "symfony/twig-bundle": "^6.4|^7.0|^8.0",
+ "symfony/ux-icons": "^2.18",
+ "symfony/ux-twig-component": "^2.18|^8.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Map\\": "src/"
+ },
+ "exclude-from-classmap": []
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Hugo Alliaume",
+ "email": "hugo@alliau.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Easily embed interactive maps in your Symfony application",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "map",
+ "maps",
+ "markers",
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-map/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-notify",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-notify.git",
+ "reference": "3528e0b975bd270da49d579e1284068b7ce13fd8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-notify/zipball/3528e0b975bd270da49d579e1284068b7ce13fd8",
+ "reference": "3528e0b975bd270da49d579e1284068b7ce13fd8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/mercure-bundle": "^0.3.4",
+ "symfony/mercure-notifier": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/stimulus-bundle": "^2.9.1",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "conflict": {
+ "symfony/config": "<5.4.0"
+ },
+ "require-dev": {
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Notify\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mathias Arlaud",
+ "email": "mathias.arlaud@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Native notification integration for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-notify/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-react",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-react.git",
+ "reference": "a6108d84b7ebfa46c63383b0dde223ef58ea4d49"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-react/zipball/a6108d84b7ebfa46c63383b0dde223ef58ea4d49",
+ "reference": "a6108d84b7ebfa46c63383b0dde223ef58ea4d49",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/stimulus-bundle": "^2.9.1"
+ },
+ "require-dev": {
+ "symfony/asset-mapper": "^6.3|^7.0|^8.0",
+ "symfony/finder": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\React\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Titouan Galopin",
+ "email": "galopintitouan@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Integration of React in Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-react/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-svelte",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-svelte.git",
+ "reference": "bdebc554f935a5edc0b9a1db42da0f202c8a89a7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-svelte/zipball/bdebc554f935a5edc0b9a1db42da0f202c8a89a7",
+ "reference": "bdebc554f935a5edc0b9a1db42da0f202c8a89a7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/stimulus-bundle": "^2.9.1"
+ },
+ "require-dev": {
+ "symfony/asset-mapper": "^6.3|^7.0|^8.0",
+ "symfony/finder": "^5.4|^6.2|^7.0|^8.0",
+ "symfony/framework-bundle": "^5.4|^6.2|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.4|^6.2|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.2|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.2|^7.0|^8.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Svelte\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Titouan Galopin",
+ "email": "galopintitouan@gmail.com"
+ },
+ {
+ "name": "Thomas Choquet",
+ "email": "thomas.choquet.pro@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Integration of Svelte in Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-svelte/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-swup",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-swup.git",
+ "reference": "15a6b4589e26463fc0b3150db0c7fb9d8136f3bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-swup/zipball/15a6b4589e26463fc0b3150db0c7fb9d8136f3bc",
+ "reference": "15a6b4589e26463fc0b3150db0c7fb9d8136f3bc",
+ "shasum": ""
+ },
+ "conflict": {
+ "symfony/flex": "<1.13"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Swup\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Titouan Galopin",
+ "email": "galopintitouan@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Swup integration for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-swup/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-toggle-password",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-toggle-password.git",
+ "reference": "9fcf6e6775a62994f06c13219e217621ac952856"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-toggle-password/zipball/9fcf6e6775a62994f06c13219e217621ac952856",
+ "reference": "9fcf6e6775a62994f06c13219e217621ac952856",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/form": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/options-resolver": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/translation": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "require-dev": {
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0",
+ "twig/twig": "^2.14.7|^3.0.4"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\TogglePassword\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Félix Eymonot",
+ "email": "felix.eymonot@alximy.io"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Toggle visibility of password inputs for Symfony Forms",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-toggle-password/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-translator",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-translator.git",
+ "reference": "36d90e2035df3e98a6d1b006b3d106a0f9400be5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-translator/zipball/36d90e2035df3e98a6d1b006b3d106a0f9400be5",
+ "reference": "36d90e2035df3e98a6d1b006b3d106a0f9400be5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/console": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/filesystem": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/string": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/translation": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "require-dev": {
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.2|^6.0|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Translator\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Hugo Alliaume",
+ "email": "hugo@alliau.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Exposes Symfony Translations directly to JavaScript.",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-translator/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-turbo",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-turbo.git",
+ "reference": "b1a4aa38fbe08434944b8e4d7ea4eca52d5db361"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/b1a4aa38fbe08434944b8e4d7ea4eca52d5db361",
+ "reference": "b1a4aa38fbe08434944b8e4d7ea4eca52d5db361",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/stimulus-bundle": "^2.9.1"
+ },
+ "conflict": {
+ "symfony/flex": "<1.13"
+ },
+ "require-dev": {
+ "dbrekelmans/bdi": "dev-main",
+ "doctrine/doctrine-bundle": "^2.4.3",
+ "doctrine/orm": "^2.8 | 3.0",
+ "php-webdriver/webdriver": "^1.15",
+ "phpstan/phpstan": "^2.1.17",
+ "symfony/asset-mapper": "^6.4|^7.0|^8.0",
+ "symfony/debug-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/form": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/framework-bundle": "^6.4|^7.0|^8.0",
+ "symfony/mercure-bundle": "^0.3.7",
+ "symfony/messenger": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/panther": "^2.2",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/process": "^5.4|6.3.*|^7.0|^8.0",
+ "symfony/property-access": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/security-core": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^6.4|^7.0|^8.0",
+ "symfony/ux-twig-component": "^2.21",
+ "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Turbo\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kévin Dunglas",
+ "email": "kevin@dunglas.fr"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Hotwire Turbo integration for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "hotwire",
+ "javascript",
+ "mercure",
+ "symfony-ux",
+ "turbo",
+ "turbo-stream"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-turbo/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-twig-component",
+ "version": "v2.29.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-twig-component.git",
+ "reference": "d3d94191485891899ac623a9c852feb0a6392101"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/d3d94191485891899ac623a9c852feb0a6392101",
+ "reference": "d3d94191485891899ac623a9c852feb0a6392101",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/deprecation-contracts": "^2.2|^3.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/property-access": "^5.4|^6.0|^7.0|^8.0",
+ "twig/twig": "^3.10.3"
+ },
+ "conflict": {
+ "symfony/config": "<5.4.0"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/dom-crawler": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^6.0|^7.0|^8.0",
+ "symfony/stimulus-bundle": "^2.9.1",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/webpack-encore-bundle": "^1.15|^2.3.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\TwigComponent\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Twig components for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "components",
+ "symfony-ux",
+ "twig"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-twig-component/tree/v2.29.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-05T22:04:40+00:00"
+ },
+ {
+ "name": "symfony/ux-typed",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-typed.git",
+ "reference": "b0166c7c11d10aa76c8f47a303348375b856f8d1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-typed/zipball/b0166c7c11d10aa76c8f47a303348375b856f8d1",
+ "reference": "b0166c7c11d10aa76c8f47a303348375b856f8d1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/flex": "<1.13"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Typed\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "email": "contact@spomky-labs.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Typed integration for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-typed/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/ux-vue",
+ "version": "v2.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-vue.git",
+ "reference": "2f2ec7070597b1e83f22a9e6c4bd7fdb2f671e2e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-vue/zipball/2f2ec7070597b1e83f22a9e6c4bd7fdb2f671e2e",
+ "reference": "2f2ec7070597b1e83f22a9e6c4bd7fdb2f671e2e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/stimulus-bundle": "^2.9.1"
+ },
+ "require-dev": {
+ "symfony/asset-mapper": "^6.3|^7.0|^8.0",
+ "symfony/finder": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Vue\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Titouan Galopin",
+ "email": "galopintitouan@gmail.com"
+ },
+ {
+ "name": "Thibault Richard",
+ "email": "thibault.richard62@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Integration of Vue.js in Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-vue/tree/v2.29.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-08T11:38:41+00:00"
+ },
+ {
+ "name": "symfony/validator",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/validator.git",
+ "reference": "297a24dccf13cc09f1d03207b20807f528f088cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/297a24dccf13cc09f1d03207b20807f528f088cc",
+ "reference": "297a24dccf13cc09f1d03207b20807f528f088cc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php83": "^1.27",
+ "symfony/translation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "doctrine/annotations": "<1.13",
+ "doctrine/lexer": "<1.1",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/expression-language": "<5.4",
+ "symfony/http-kernel": "<5.4",
+ "symfony/intl": "<5.4",
+ "symfony/property-info": "<5.4",
+ "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3",
+ "symfony/yaml": "<5.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.13|^2",
+ "egulias/email-validator": "^2.1.10|^3|^4",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/intl": "^5.4|^6.0|^7.0",
+ "symfony/mime": "^5.4|^6.0|^7.0",
+ "symfony/property-access": "^5.4|^6.0|^7.0",
+ "symfony/property-info": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Validator\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/",
+ "/Resources/bin/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to validate values",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/validator/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-29T18:08:45+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "aa29484ce0544bd69fa9f0df902e5ed7b7fe5034"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/aa29484ce0544bd69fa9f0df902e5ed7b7fe5034",
+ "reference": "aa29484ce0544bd69fa9f0df902e5ed7b7fe5034",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/console": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/error-handler": "^6.3|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-29T18:40:01+00:00"
+ },
+ {
+ "name": "symfony/var-exporter",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-exporter.git",
+ "reference": "1e742d559fe5b19d0cdc281b1bf0b1fcc243bd35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1e742d559fe5b19d0cdc281b1bf0b1fcc243bd35",
+ "reference": "1e742d559fe5b19d0cdc281b1bf0b1fcc243bd35",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "require-dev": {
+ "symfony/property-access": "^6.4|^7.0",
+ "symfony/serializer": "^6.4|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\VarExporter\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clone",
+ "construct",
+ "export",
+ "hydrate",
+ "instantiate",
+ "lazy-loading",
+ "proxy",
+ "serialize"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-exporter/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/web-link",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/web-link.git",
+ "reference": "75ffbb304f26a716969863328c8c6a11eadcfa5a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/web-link/zipball/75ffbb304f26a716969863328c8c6a11eadcfa5a",
+ "reference": "75ffbb304f26a716969863328c8c6a11eadcfa5a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/link": "^1.1|^2.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": "<5.4"
+ },
+ "provide": {
+ "psr/link-implementation": "1.0|2.0"
+ },
+ "require-dev": {
+ "symfony/http-kernel": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\WebLink\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kévin Dunglas",
+ "email": "dunglas@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Manages links between resources",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "dns-prefetch",
+ "http",
+ "http2",
+ "link",
+ "performance",
+ "prefetch",
+ "preload",
+ "prerender",
+ "psr13",
+ "push"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/web-link/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "742a8efc94027624b36b10ba58e23d402f961f51"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/742a8efc94027624b36b10ba58e23d402f961f51",
+ "reference": "742a8efc94027624b36b10ba58e23d402f961f51",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "twig/extra-bundle",
+ "version": "v3.21.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/twig-extra-bundle.git",
+ "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/62d1cf47a1aa009cbd07b21045b97d3d5cb79896",
+ "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1.0",
+ "symfony/framework-bundle": "^5.4|^6.4|^7.0",
+ "symfony/twig-bundle": "^5.4|^6.4|^7.0",
+ "twig/twig": "^3.2|^4.0"
+ },
+ "require-dev": {
+ "league/commonmark": "^1.0|^2.0",
+ "symfony/phpunit-bridge": "^6.4|^7.0",
+ "twig/cache-extra": "^3.0",
+ "twig/cssinliner-extra": "^3.0",
+ "twig/html-extra": "^3.0",
+ "twig/inky-extra": "^3.0",
+ "twig/intl-extra": "^3.0",
+ "twig/markdown-extra": "^3.0",
+ "twig/string-extra": "^3.0"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Twig\\Extra\\TwigExtraBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "A Symfony bundle for extra Twig extensions",
+ "homepage": "https://twig.symfony.com",
+ "keywords": [
+ "bundle",
+ "extra",
+ "twig"
+ ],
+ "support": {
+ "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.21.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-02-19T14:29:33+00:00"
+ },
+ {
+ "name": "twig/twig",
+ "version": "v3.21.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/Twig.git",
+ "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d",
+ "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-mbstring": "^1.3"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^2.0",
+ "psr/container": "^1.0|^2.0",
+ "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/Resources/core.php",
+ "src/Resources/debug.php",
+ "src/Resources/escaper.php",
+ "src/Resources/string_loader.php"
+ ],
+ "psr-4": {
+ "Twig\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Twig Team",
+ "role": "Contributors"
+ },
+ {
+ "name": "Armin Ronacher",
+ "email": "armin.ronacher@active-4.com",
+ "role": "Project Founder"
+ }
+ ],
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "homepage": "https://twig.symfony.com",
+ "keywords": [
+ "templating"
+ ],
+ "support": {
+ "issues": "https://github.com/twigphp/Twig/issues",
+ "source": "https://github.com/twigphp/Twig/tree/v3.21.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-05-03T07:21:55+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+ },
+ "time": "2022-06-03T18:03:27+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2",
+ "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1"
+ },
+ "time": "2025-08-13T20:13:15+00:00"
+ },
+ {
+ "name": "symfony/debug-bundle",
+ "version": "v6.4.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug-bundle.git",
+ "reference": "7bcfaff39e094cc09455201916d016d9b2ae08ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/7bcfaff39e094cc09455201916d016d9b2ae08ff",
+ "reference": "7bcfaff39e094cc09455201916d016d9b2ae08ff",
+ "shasum": ""
+ },
+ "require": {
+ "ext-xml": "*",
+ "php": ">=8.1",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/twig-bridge": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "symfony/config": "<5.4",
+ "symfony/dependency-injection": "<5.4"
+ },
+ "require-dev": {
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\DebugBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/debug-bundle/tree/v6.4.13"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:18:03+00:00"
+ },
+ {
+ "name": "symfony/maker-bundle",
+ "version": "v1.64.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/maker-bundle.git",
+ "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c86da84640b0586e92aee2b276ee3638ef2f425a",
+ "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/inflector": "^2.0",
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.1",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/deprecation-contracts": "^2.2|^3",
+ "symfony/filesystem": "^6.4|^7.0",
+ "symfony/finder": "^6.4|^7.0",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0"
+ },
+ "conflict": {
+ "doctrine/doctrine-bundle": "<2.10",
+ "doctrine/orm": "<2.15"
+ },
+ "require-dev": {
+ "composer/semver": "^3.0",
+ "doctrine/doctrine-bundle": "^2.5.0",
+ "doctrine/orm": "^2.15|^3",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/phpunit-bridge": "^6.4.1|^7.0",
+ "symfony/security-core": "^6.4|^7.0",
+ "symfony/security-http": "^6.4|^7.0",
+ "symfony/yaml": "^6.4|^7.0",
+ "twig/twig": "^3.0|^4.x-dev"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\MakerBundle\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.",
+ "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html",
+ "keywords": [
+ "code generator",
+ "dev",
+ "generator",
+ "scaffold",
+ "scaffolding"
+ ],
+ "support": {
+ "issues": "https://github.com/symfony/maker-bundle/issues",
+ "source": "https://github.com/symfony/maker-bundle/tree/v1.64.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-23T16:12:08+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "8eb6dc555bfb49b2703438d5de65cc9f138ff50b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/8eb6dc555bfb49b2703438d5de65cc9f138ff50b",
+ "reference": "8eb6dc555bfb49b2703438d5de65cc9f138ff50b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/web-profiler-bundle",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/web-profiler-bundle.git",
+ "reference": "ae16f886ab3e3ed0a8db07d2a7c4d9d60b1eafcd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/ae16f886ab3e3ed0a8db07d2a7c4d9d60b1eafcd",
+ "reference": "ae16f886ab3e3ed0a8db07d2a7c4d9d60b1eafcd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/twig-bundle": "^5.4|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "conflict": {
+ "symfony/form": "<5.4",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<5.4",
+ "symfony/twig-bundle": ">=7.0"
+ },
+ "require-dev": {
+ "symfony/browser-kit": "^5.4|^6.0|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\WebProfilerBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a development tool that gives detailed information about the execution of any request",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "dev"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-20T15:15:57+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {},
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "~8.2.0",
+ "ext-ctype": "*",
+ "ext-iconv": "*"
+ },
+ "platform-dev": {},
+ "platform-overrides": {
+ "php": "8.2"
+ },
+ "plugin-api-version": "2.6.0"
+}
diff --git a/test_apps/e2e-app/config/bundles.php b/test_apps/e2e-app/config/bundles.php
new file mode 100644
index 00000000000..a90e1a7edd1
--- /dev/null
+++ b/test_apps/e2e-app/config/bundles.php
@@ -0,0 +1,33 @@
+ ['all' => true],
+ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
+ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
+ Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true],
+ Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
+ Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
+ Symfony\UX\StimulusBundle\StimulusBundle::class => ['all' => true],
+ Symfony\UX\Turbo\TurboBundle::class => ['all' => true],
+ Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
+ Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
+ Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
+ Symfony\UX\Autocomplete\AutocompleteBundle::class => ['all' => true],
+ Symfony\UX\Chartjs\ChartjsBundle::class => ['all' => true],
+ Symfony\UX\Cropperjs\CropperjsBundle::class => ['all' => true],
+ Symfony\UX\Dropzone\DropzoneBundle::class => ['all' => true],
+ Symfony\UX\Map\UXMapBundle::class => ['all' => true],
+ Symfony\UX\Icons\UXIconsBundle::class => ['all' => true],
+ Symfony\UX\LazyImage\LazyImageBundle::class => ['all' => true],
+ Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true],
+ Symfony\UX\LiveComponent\LiveComponentBundle::class => ['all' => true],
+ Symfony\Bundle\MercureBundle\MercureBundle::class => ['all' => true],
+ Symfony\UX\Notify\NotifyBundle::class => ['all' => true],
+ Symfony\UX\React\ReactBundle::class => ['all' => true],
+ Symfony\UX\Svelte\SvelteBundle::class => ['all' => true],
+ Symfony\UX\Swup\SwupBundle::class => ['all' => true],
+ Symfony\UX\TogglePassword\TogglePasswordBundle::class => ['all' => true],
+ Symfony\UX\Translator\UxTranslatorBundle::class => ['all' => true],
+ Symfony\UX\Typed\TypedBundle::class => ['all' => true],
+ Symfony\UX\Vue\VueBundle::class => ['all' => true],
+];
diff --git a/test_apps/e2e-app/config/packages/asset_mapper.yaml b/test_apps/e2e-app/config/packages/asset_mapper.yaml
new file mode 100644
index 00000000000..ad83a3dd074
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/asset_mapper.yaml
@@ -0,0 +1,12 @@
+framework:
+ asset_mapper:
+ # The paths to make available to the asset mapper.
+ paths:
+ - assets/
+ missing_import_mode: strict
+ importmap_polyfill: false
+
+when@prod:
+ framework:
+ asset_mapper:
+ missing_import_mode: warn
diff --git a/test_apps/e2e-app/config/packages/cache.yaml b/test_apps/e2e-app/config/packages/cache.yaml
new file mode 100644
index 00000000000..6899b72003f
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/cache.yaml
@@ -0,0 +1,19 @@
+framework:
+ cache:
+ # Unique name of your app: used to compute stable namespaces for cache keys.
+ #prefix_seed: your_vendor_name/app_name
+
+ # The "app" cache stores to the filesystem by default.
+ # The data in this cache should persist between deploys.
+ # Other options include:
+
+ # Redis
+ #app: cache.adapter.redis
+ #default_redis_provider: redis://localhost
+
+ # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues)
+ #app: cache.adapter.apcu
+
+ # Namespaced pools use the above "app" backend by default
+ #pools:
+ #my.dedicated.cache: null
diff --git a/test_apps/e2e-app/config/packages/csrf.php b/test_apps/e2e-app/config/packages/csrf.php
new file mode 100644
index 00000000000..c5850bc59d4
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/csrf.php
@@ -0,0 +1,16 @@
+= 70000) {
+ // Enable CSRF protection for forms
+ $config->form()->csrfProtection()->tokenId('submit');
+
+ // Enable stateless CSRF protection for specific actions
+ $config->csrfProtection()
+ ->statelessTokenIds(['submit', 'authenticate', 'logout']);
+ }
+};
diff --git a/test_apps/e2e-app/config/packages/debug.yaml b/test_apps/e2e-app/config/packages/debug.yaml
new file mode 100644
index 00000000000..ad874afdde1
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/debug.yaml
@@ -0,0 +1,5 @@
+when@dev:
+ debug:
+ # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser.
+ # See the "server:dump" command to start a new server.
+ dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%"
diff --git a/test_apps/e2e-app/config/packages/doctrine.yaml b/test_apps/e2e-app/config/packages/doctrine.yaml
new file mode 100644
index 00000000000..25138b979b6
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/doctrine.yaml
@@ -0,0 +1,54 @@
+doctrine:
+ dbal:
+ url: '%env(resolve:DATABASE_URL)%'
+
+ # IMPORTANT: You MUST configure your server version,
+ # either here or in the DATABASE_URL env var (see .env file)
+ #server_version: '16'
+
+ profiling_collect_backtrace: '%kernel.debug%'
+ use_savepoints: true
+ orm:
+ auto_generate_proxy_classes: true
+ enable_lazy_ghost_objects: true
+ report_fields_where_declared: true
+ validate_xml_mapping: true
+ naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
+ identity_generation_preferences:
+ Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity
+ auto_mapping: true
+ mappings:
+ App:
+ type: attribute
+ is_bundle: false
+ dir: '%kernel.project_dir%/src/Entity'
+ prefix: 'App\Entity'
+ alias: App
+ controller_resolver:
+ auto_mapping: false
+
+when@test:
+ doctrine:
+ dbal:
+ # "TEST_TOKEN" is typically set by ParaTest
+ dbname_suffix: '_test%env(default::TEST_TOKEN)%'
+
+when@prod:
+ doctrine:
+ orm:
+ auto_generate_proxy_classes: false
+ proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies'
+ query_cache_driver:
+ type: pool
+ pool: doctrine.system_cache_pool
+ result_cache_driver:
+ type: pool
+ pool: doctrine.result_cache_pool
+
+ framework:
+ cache:
+ pools:
+ doctrine.result_cache_pool:
+ adapter: cache.app
+ doctrine.system_cache_pool:
+ adapter: cache.system
diff --git a/test_apps/e2e-app/config/packages/doctrine_migrations.yaml b/test_apps/e2e-app/config/packages/doctrine_migrations.yaml
new file mode 100644
index 00000000000..29231d94bd1
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/doctrine_migrations.yaml
@@ -0,0 +1,6 @@
+doctrine_migrations:
+ migrations_paths:
+ # namespace is arbitrary but should be different from App\Migrations
+ # as migrations classes should NOT be autoloaded
+ 'DoctrineMigrations': '%kernel.project_dir%/migrations'
+ enable_profiler: false
diff --git a/test_apps/e2e-app/config/packages/framework.yaml b/test_apps/e2e-app/config/packages/framework.yaml
new file mode 100644
index 00000000000..28095da422d
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/framework.yaml
@@ -0,0 +1,24 @@
+# see https://symfony.com/doc/current/reference/configuration/framework.html
+framework:
+ secret: '%env(APP_SECRET)%'
+ annotations: false
+ http_method_override: false
+ handle_all_throwables: true
+
+ # Enables session support. Note that the session will ONLY be started if you read or write from it.
+ # Remove or comment this section to explicitly disable session support.
+ session:
+ handler_id: null
+ cookie_secure: auto
+ cookie_samesite: lax
+
+ #esi: true
+ #fragments: true
+ php_errors:
+ log: true
+
+when@test:
+ framework:
+ test: true
+ session:
+ storage_factory_id: session.storage.factory.mock_file
diff --git a/test_apps/e2e-app/config/packages/lazy_image.yaml b/test_apps/e2e-app/config/packages/lazy_image.yaml
new file mode 100644
index 00000000000..851c4dcb73c
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/lazy_image.yaml
@@ -0,0 +1,16 @@
+# lazy_image:
+ # By default, images are fetched through "file_get_contents" function, but you can use your own implementation
+ # with an invokable service or a callable.
+ # https://symfony.com/bundles/ux-lazy-image/current/index.html#customizing-images-fetching
+ # fetch_image_content: 'App\BlurHash\FetchImageContent'
+
+ # It is recommended to cache the generated BlurHash for performance reasons, to avoid generating it for each request.
+ # https://symfony.com/bundles/ux-lazy-image/current/index.html#performance-considerations
+ # cache: cache.lazy_image
+
+framework:
+ cache:
+ # pools:
+ # cache.lazy_image:
+ # If possible, prefer to use a cache adapter that is not cleared between deployments, like "cache.adapter.redis"
+ # adapter: cache.app
diff --git a/test_apps/e2e-app/config/packages/mercure.yaml b/test_apps/e2e-app/config/packages/mercure.yaml
new file mode 100644
index 00000000000..f2a73954030
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/mercure.yaml
@@ -0,0 +1,8 @@
+mercure:
+ hubs:
+ default:
+ url: '%env(MERCURE_URL)%'
+ public_url: '%env(MERCURE_PUBLIC_URL)%'
+ jwt:
+ secret: '%env(MERCURE_JWT_SECRET)%'
+ publish: '*'
diff --git a/test_apps/e2e-app/config/packages/monolog.yaml b/test_apps/e2e-app/config/packages/monolog.yaml
new file mode 100644
index 00000000000..f7bf7c7d95b
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/monolog.yaml
@@ -0,0 +1,61 @@
+monolog:
+ channels:
+ - deprecation # Deprecations are logged in the dedicated "deprecation" channel when it exists
+
+when@dev:
+ monolog:
+ handlers:
+ main:
+ type: stream
+ path: "%kernel.logs_dir%/%kernel.environment%.log"
+ level: debug
+ channels: ["!event"]
+ # uncomment to get logging in your browser
+ # you may have to allow bigger header sizes in your Web server configuration
+ #firephp:
+ # type: firephp
+ # level: info
+ #chromephp:
+ # type: chromephp
+ # level: info
+ console:
+ type: console
+ process_psr_3_messages: false
+ channels: ["!event", "!doctrine", "!console"]
+
+when@test:
+ monolog:
+ handlers:
+ main:
+ type: fingers_crossed
+ action_level: error
+ handler: nested
+ excluded_http_codes: [404, 405]
+ channels: ["!event"]
+ nested:
+ type: stream
+ path: "%kernel.logs_dir%/%kernel.environment%.log"
+ level: debug
+
+when@prod:
+ monolog:
+ handlers:
+ main:
+ type: fingers_crossed
+ action_level: error
+ handler: nested
+ excluded_http_codes: [404, 405]
+ buffer_size: 50 # How many messages should be saved? Prevent memory leaks
+ nested:
+ type: stream
+ path: "%kernel.logs_dir%/%kernel.environment%.log"
+ level: debug
+ console:
+ type: console
+ process_psr_3_messages: false
+ channels: ["!event", "!doctrine"]
+ deprecation:
+ type: stream
+ channels: [deprecation]
+ path: php://stderr
+ formatter: monolog.formatter.json
diff --git a/test_apps/e2e-app/config/packages/notifier.yaml b/test_apps/e2e-app/config/packages/notifier.yaml
new file mode 100644
index 00000000000..3f8e2fe8b58
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/notifier.yaml
@@ -0,0 +1,13 @@
+framework:
+ notifier:
+ chatter_transports:
+ mercure: '%env(MERCURE_DSN)%'
+ texter_transports:
+ channel_policy:
+ # use chat/slack, chat/telegram, sms/twilio or sms/nexmo
+ urgent: ['email']
+ high: ['email']
+ medium: ['email']
+ low: ['email']
+ admin_recipients:
+ - { email: admin@example.com }
diff --git a/test_apps/e2e-app/config/packages/property_info.php b/test_apps/e2e-app/config/packages/property_info.php
new file mode 100644
index 00000000000..9c3cc189939
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/property_info.php
@@ -0,0 +1,10 @@
+= 70000) {
+ $config->propertyInfo()->withConstructorExtractor(true);
+ }
+};
diff --git a/test_apps/e2e-app/config/packages/routing.yaml b/test_apps/e2e-app/config/packages/routing.yaml
new file mode 100644
index 00000000000..8166181c68a
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/routing.yaml
@@ -0,0 +1,10 @@
+framework:
+ router:
+ # Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
+ # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
+ #default_uri: http://localhost
+
+when@prod:
+ framework:
+ router:
+ strict_requirements: null
diff --git a/test_apps/e2e-app/config/packages/translation.yaml b/test_apps/e2e-app/config/packages/translation.yaml
new file mode 100644
index 00000000000..490bfc2c29e
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/translation.yaml
@@ -0,0 +1,5 @@
+framework:
+ default_locale: en
+ translator:
+ default_path: '%kernel.project_dir%/translations'
+ providers:
diff --git a/test_apps/e2e-app/config/packages/twig.yaml b/test_apps/e2e-app/config/packages/twig.yaml
new file mode 100644
index 00000000000..3f795d921ea
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/twig.yaml
@@ -0,0 +1,6 @@
+twig:
+ file_name_pattern: '*.twig'
+
+when@test:
+ twig:
+ strict_variables: true
diff --git a/test_apps/e2e-app/config/packages/twig_component.yaml b/test_apps/e2e-app/config/packages/twig_component.yaml
new file mode 100644
index 00000000000..fd17ac6938c
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/twig_component.yaml
@@ -0,0 +1,5 @@
+twig_component:
+ anonymous_template_directory: 'components/'
+ defaults:
+ # Namespace & directory for components
+ App\Twig\Components\: 'components/'
diff --git a/test_apps/e2e-app/config/packages/ux_icons.yaml b/test_apps/e2e-app/config/packages/ux_icons.yaml
new file mode 100644
index 00000000000..89d737318da
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/ux_icons.yaml
@@ -0,0 +1,4 @@
+ux_icons:
+ default_icon_attributes:
+ width: '1em'
+ height: '1em'
diff --git a/test_apps/e2e-app/config/packages/ux_map.yaml b/test_apps/e2e-app/config/packages/ux_map.yaml
new file mode 100644
index 00000000000..684ccd20305
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/ux_map.yaml
@@ -0,0 +1,6 @@
+ux_map:
+ # https://symfony.com/bundles/ux-map/current/index.html#available-renderers
+ renderer: '%env(resolve:default::UX_MAP_DSN)%'
+ google_maps:
+ # define the default map id for all maps (https://developers.google.com/maps/documentation/get-map-id)
+ default_map_id: null
diff --git a/test_apps/e2e-app/config/packages/ux_translator.yaml b/test_apps/e2e-app/config/packages/ux_translator.yaml
new file mode 100644
index 00000000000..1c1c70608ce
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/ux_translator.yaml
@@ -0,0 +1,3 @@
+ux_translator:
+ # The directory where the JavaScript translations are dumped
+ dump_directory: '%kernel.project_dir%/var/translations'
diff --git a/test_apps/e2e-app/config/packages/ux_turbo.php b/test_apps/e2e-app/config/packages/ux_turbo.php
new file mode 100644
index 00000000000..f79cb88af2f
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/ux_turbo.php
@@ -0,0 +1,12 @@
+= 70000) {
+ // Method "checkHeader" does not exist yet
+ // $config->form()->csrfProtection()->checkHeader(true);
+ }
+};
diff --git a/test_apps/e2e-app/config/packages/validator.yaml b/test_apps/e2e-app/config/packages/validator.yaml
new file mode 100644
index 00000000000..0201281d3cb
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/validator.yaml
@@ -0,0 +1,13 @@
+framework:
+ validation:
+ email_validation_mode: html5
+
+ # Enables validator auto-mapping support.
+ # For instance, basic validation constraints will be inferred from Doctrine's metadata.
+ #auto_mapping:
+ # App\Entity\: []
+
+when@test:
+ framework:
+ validation:
+ not_compromised_password: false
diff --git a/test_apps/e2e-app/config/packages/web_profiler.yaml b/test_apps/e2e-app/config/packages/web_profiler.yaml
new file mode 100644
index 00000000000..0eac3c989f7
--- /dev/null
+++ b/test_apps/e2e-app/config/packages/web_profiler.yaml
@@ -0,0 +1,13 @@
+when@dev:
+ web_profiler:
+ toolbar: true
+
+ framework:
+ profiler:
+ collect_serializer_data: true
+
+when@test:
+ framework:
+ profiler:
+ collect: false
+ collect_serializer_data: true
diff --git a/test_apps/e2e-app/config/preload.php b/test_apps/e2e-app/config/preload.php
new file mode 100644
index 00000000000..5ebcdb2153c
--- /dev/null
+++ b/test_apps/e2e-app/config/preload.php
@@ -0,0 +1,5 @@
+ [
+ 'path' => './assets/app.js',
+ 'entrypoint' => true,
+ ],
+ '@hotwired/stimulus' => [
+ 'version' => '3.2.2',
+ ],
+ '@symfony/stimulus-bundle' => [
+ 'path' => './vendor/symfony/stimulus-bundle/assets/dist/loader.js',
+ ],
+ '@hotwired/turbo' => [
+ 'version' => '7.3.0',
+ ],
+ 'tom-select' => [
+ 'version' => '2.4.3',
+ ],
+ '@orchidjs/sifter' => [
+ 'version' => '1.1.0',
+ ],
+ '@orchidjs/unicode-variants' => [
+ 'version' => '1.1.2',
+ ],
+ 'tom-select/dist/css/tom-select.default.min.css' => [
+ 'version' => '2.4.3',
+ 'type' => 'css',
+ ],
+ 'tom-select/dist/css/tom-select.default.css' => [
+ 'version' => '2.4.3',
+ 'type' => 'css',
+ ],
+ 'tom-select/dist/css/tom-select.bootstrap4.css' => [
+ 'version' => '2.4.3',
+ 'type' => 'css',
+ ],
+ 'tom-select/dist/css/tom-select.bootstrap5.css' => [
+ 'version' => '2.4.3',
+ 'type' => 'css',
+ ],
+ 'chart.js' => [
+ 'version' => '3.9.1',
+ ],
+ 'cropperjs' => [
+ 'version' => '1.6.2',
+ ],
+ 'cropperjs/dist/cropper.min.css' => [
+ 'version' => '1.6.2',
+ 'type' => 'css',
+ ],
+ '@googlemaps/js-api-loader' => [
+ 'version' => '1.16.10',
+ ],
+ '@symfony/ux-google-map' => [
+ 'path' => './vendor/symfony/ux-google-map/assets/dist/map_controller.js',
+ ],
+ 'leaflet' => [
+ 'version' => '1.9.4',
+ ],
+ 'leaflet/dist/leaflet.min.css' => [
+ 'version' => '1.9.4',
+ 'type' => 'css',
+ ],
+ '@symfony/ux-leaflet-map' => [
+ 'path' => './vendor/symfony/ux-leaflet-map/assets/dist/map_controller.js',
+ ],
+ '@symfony/ux-live-component' => [
+ 'path' => './vendor/symfony/ux-live-component/assets/dist/live_controller.js',
+ ],
+ 'react' => [
+ 'version' => '18.3.1',
+ ],
+ 'react-dom' => [
+ 'version' => '18.3.1',
+ ],
+ 'scheduler' => [
+ 'version' => '0.23.2',
+ ],
+ '@symfony/ux-react' => [
+ 'path' => './vendor/symfony/ux-react/assets/dist/loader.js',
+ ],
+ 'svelte/internal' => [
+ 'version' => '3.59.2',
+ ],
+ '@symfony/ux-svelte' => [
+ 'path' => './vendor/symfony/ux-svelte/assets/dist/loader.js',
+ ],
+ '@swup/fade-theme' => [
+ 'version' => '1.0.5',
+ ],
+ '@swup/slide-theme' => [
+ 'version' => '1.0.5',
+ ],
+ '@swup/forms-plugin' => [
+ 'version' => '2.0.1',
+ ],
+ '@swup/plugin' => [
+ 'version' => '2.0.2',
+ ],
+ 'swup' => [
+ 'version' => '3.1.1',
+ ],
+ 'delegate-it' => [
+ 'version' => '6.0.1',
+ ],
+ '@swup/debug-plugin' => [
+ 'version' => '3.0.0',
+ ],
+ 'intl-messageformat' => [
+ 'version' => '10.7.16',
+ ],
+ 'tslib' => [
+ 'version' => '2.8.1',
+ ],
+ '@formatjs/fast-memoize' => [
+ 'version' => '2.2.7',
+ ],
+ '@formatjs/icu-messageformat-parser' => [
+ 'version' => '2.11.2',
+ ],
+ '@formatjs/icu-skeleton-parser' => [
+ 'version' => '1.8.14',
+ ],
+ '@symfony/ux-translator' => [
+ 'path' => './vendor/symfony/ux-translator/assets/dist/translator_controller.js',
+ ],
+ '@app/translations' => [
+ 'path' => './var/translations/index.js',
+ ],
+ '@app/translations/configuration' => [
+ 'path' => './var/translations/configuration.js',
+ ],
+ 'typed.js' => [
+ 'version' => '2.1.0',
+ ],
+ 'vue' => [
+ 'version' => '3.5.18',
+ 'package_specifier' => 'vue/dist/vue.esm-bundler.js',
+ ],
+ '@vue/runtime-dom' => [
+ 'version' => '3.5.18',
+ ],
+ '@vue/compiler-dom' => [
+ 'version' => '3.5.18',
+ ],
+ '@vue/shared' => [
+ 'version' => '3.5.18',
+ ],
+ '@vue/runtime-core' => [
+ 'version' => '3.5.18',
+ ],
+ '@vue/compiler-core' => [
+ 'version' => '3.5.18',
+ ],
+ '@vue/reactivity' => [
+ 'version' => '3.5.18',
+ ],
+ '@symfony/ux-vue' => [
+ 'path' => './vendor/symfony/ux-vue/assets/dist/loader.js',
+ ],
+ 'bootstrap' => [
+ 'version' => '5.3.7',
+ ],
+ '@popperjs/core' => [
+ 'version' => '2.11.8',
+ ],
+ 'bootstrap/dist/css/bootstrap.min.css' => [
+ 'version' => '5.3.7',
+ 'type' => 'css',
+ ],
+];
diff --git a/test_apps/e2e-app/migrations/.gitignore b/test_apps/e2e-app/migrations/.gitignore
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/test_apps/e2e-app/public/index.php b/test_apps/e2e-app/public/index.php
new file mode 100644
index 00000000000..9982c218d69
--- /dev/null
+++ b/test_apps/e2e-app/public/index.php
@@ -0,0 +1,9 @@
+logger->critical('qsd');
+ $chart = $chartBuilder->createChart(Chart::TYPE_LINE);
+
+ $chart->setData([
+ 'labels' => ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
+ 'datasets' => [
+ [
+ 'label' => 'My First dataset',
+ 'backgroundColor' => 'rgb(255, 99, 132)',
+ 'borderColor' => 'rgb(255, 99, 132)',
+ 'data' => [0, 10, 5, 2, 20, 30, 45],
+ ],
+ ],
+ ]);
+
+ return $this->render('ux_autocomplete/index.html.twig', [
+ 'chart' => $chart,
+ ]);
+ }
+
+ #[Route('/with-options')]
+ public function withOptions(ChartBuilderInterface $chartBuilder): Response
+ {
+ $chart = $chartBuilder->createChart(Chart::TYPE_LINE);
+
+ $chart->setData([
+ 'labels' => ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
+ 'datasets' => [
+ [
+ 'label' => 'My First dataset',
+ 'backgroundColor' => 'rgb(255, 99, 132)',
+ 'borderColor' => 'rgb(255, 99, 132)',
+ 'data' => [0, 10, 5, 2, 20, 30, 45],
+ ],
+ ],
+ ]);
+
+ $chart->setOptions([
+ 'showLines' => false,
+ ]);
+
+ return $this->render('ux_autocomplete/index.html.twig', [
+ 'chart' => $chart,
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/ChartjsController.php b/test_apps/e2e-app/src/Controller/ChartjsController.php
new file mode 100644
index 00000000000..fb81cd5df8a
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/ChartjsController.php
@@ -0,0 +1,19 @@
+render('ux_chartjs/index.html.twig', [
+ 'controller_name' => 'ChartjsController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/CropperjsController.php b/test_apps/e2e-app/src/Controller/CropperjsController.php
new file mode 100644
index 00000000000..cf9363c4dbc
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/CropperjsController.php
@@ -0,0 +1,19 @@
+render('ux_cropperjs/index.html.twig', [
+ 'controller_name' => 'CropperjsController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/DropzoneController.php b/test_apps/e2e-app/src/Controller/DropzoneController.php
new file mode 100644
index 00000000000..1dfe103d6f5
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/DropzoneController.php
@@ -0,0 +1,19 @@
+render('ux_dropzone/index.html.twig', [
+ 'controller_name' => 'DropzoneController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/HomeController.php b/test_apps/e2e-app/src/Controller/HomeController.php
new file mode 100644
index 00000000000..76f7402fa88
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/HomeController.php
@@ -0,0 +1,16 @@
+render('home.html.twig');
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/IconsController.php b/test_apps/e2e-app/src/Controller/IconsController.php
new file mode 100644
index 00000000000..81b47258867
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/IconsController.php
@@ -0,0 +1,19 @@
+render('ux_icons/index.html.twig', [
+ 'controller_name' => 'IconsController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/LiveComponentController.php b/test_apps/e2e-app/src/Controller/LiveComponentController.php
new file mode 100644
index 00000000000..c348f73d733
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/LiveComponentController.php
@@ -0,0 +1,19 @@
+render('ux_live_component/index.html.twig', [
+ 'controller_name' => 'LiveComponentController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/MapController.php b/test_apps/e2e-app/src/Controller/MapController.php
new file mode 100644
index 00000000000..376f532afc2
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/MapController.php
@@ -0,0 +1,19 @@
+render('ux_map/index.html.twig', [
+ 'controller_name' => 'MapController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/NotifyController.php b/test_apps/e2e-app/src/Controller/NotifyController.php
new file mode 100644
index 00000000000..9f53da9ade6
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/NotifyController.php
@@ -0,0 +1,19 @@
+render('ux_notify/index.html.twig', [
+ 'controller_name' => 'NotifyController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/ReactController.php b/test_apps/e2e-app/src/Controller/ReactController.php
new file mode 100644
index 00000000000..30abe5cf22f
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/ReactController.php
@@ -0,0 +1,19 @@
+render('ux_react/index.html.twig', [
+ 'controller_name' => 'ReactController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/SvelteController.php b/test_apps/e2e-app/src/Controller/SvelteController.php
new file mode 100644
index 00000000000..a75d674a751
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/SvelteController.php
@@ -0,0 +1,19 @@
+render('ux_svelte/index.html.twig', [
+ 'controller_name' => 'SvelteController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/TranslatorController.php b/test_apps/e2e-app/src/Controller/TranslatorController.php
new file mode 100644
index 00000000000..c30ecc24254
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/TranslatorController.php
@@ -0,0 +1,19 @@
+render('ux_translator/index.html.twig', [
+ 'controller_name' => 'TranslatorController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/TurboController.php b/test_apps/e2e-app/src/Controller/TurboController.php
new file mode 100644
index 00000000000..52646713c9b
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/TurboController.php
@@ -0,0 +1,19 @@
+render('ux_turbo/index.html.twig', [
+ 'controller_name' => 'TurboController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/TwigComponentController.php b/test_apps/e2e-app/src/Controller/TwigComponentController.php
new file mode 100644
index 00000000000..ffd489a0ae7
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/TwigComponentController.php
@@ -0,0 +1,19 @@
+render('ux_twig_component/index.html.twig', [
+ 'controller_name' => 'TwigComponentController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/TypedController.php b/test_apps/e2e-app/src/Controller/TypedController.php
new file mode 100644
index 00000000000..1d9c76906ec
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/TypedController.php
@@ -0,0 +1,19 @@
+render('ux_typed/index.html.twig', [
+ 'controller_name' => 'TypedController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Controller/VueController.php b/test_apps/e2e-app/src/Controller/VueController.php
new file mode 100644
index 00000000000..9c9c1f2b2a7
--- /dev/null
+++ b/test_apps/e2e-app/src/Controller/VueController.php
@@ -0,0 +1,19 @@
+render('ux_vue/index.html.twig', [
+ 'controller_name' => 'VueController',
+ ]);
+ }
+}
diff --git a/test_apps/e2e-app/src/Entity/.gitignore b/test_apps/e2e-app/src/Entity/.gitignore
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/test_apps/e2e-app/src/Kernel.php b/test_apps/e2e-app/src/Kernel.php
new file mode 100644
index 00000000000..10870731492
--- /dev/null
+++ b/test_apps/e2e-app/src/Kernel.php
@@ -0,0 +1,13 @@
+
+
+
+
+ {% block title %}Symfony UX's E2E App{% endblock %}
+
+ {% block stylesheets %}
+ {% endblock %}
+
+ {% block javascripts %}
+ {% block importmap %}{{ importmap('app') }}{% endblock %}
+ {% endblock %}
+
+
+ {% block body %}
+
+
+
+
+ {% block main %}{% endblock %}
+ {% endblock %}
+
+
diff --git a/test_apps/e2e-app/templates/home.html.twig b/test_apps/e2e-app/templates/home.html.twig
new file mode 100644
index 00000000000..24c0404a933
--- /dev/null
+++ b/test_apps/e2e-app/templates/home.html.twig
@@ -0,0 +1,16 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}Hello HomeController!{% endblock %}
+
+{% block main %}
+
+
Symfony UX's E2E App
+
+
+ This is a Symfony application designed for end-to-end testing.
+ It serves for testing UX packages in a real-world scenario,
+ to ensure they work as expected for multiple Symfony versions and various browsers.
+
+
+
+{% endblock %}
diff --git a/test_apps/e2e-app/templates/ux_autocomplete/index.html.twig b/test_apps/e2e-app/templates/ux_autocomplete/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_autocomplete/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_chartjs/index.html.twig b/test_apps/e2e-app/templates/ux_chartjs/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_chartjs/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_cropperjs/index.html.twig b/test_apps/e2e-app/templates/ux_cropperjs/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_cropperjs/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_dropzone/index.html.twig b/test_apps/e2e-app/templates/ux_dropzone/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_dropzone/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_icons/index.html.twig b/test_apps/e2e-app/templates/ux_icons/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_icons/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_live_component/index.html.twig b/test_apps/e2e-app/templates/ux_live_component/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_live_component/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_map/index.html.twig b/test_apps/e2e-app/templates/ux_map/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_map/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_notify/index.html.twig b/test_apps/e2e-app/templates/ux_notify/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_notify/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_react/index.html.twig b/test_apps/e2e-app/templates/ux_react/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_react/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_svelte/index.html.twig b/test_apps/e2e-app/templates/ux_svelte/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_svelte/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_translator/index.html.twig b/test_apps/e2e-app/templates/ux_translator/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_translator/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_turbo/index.html.twig b/test_apps/e2e-app/templates/ux_turbo/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_turbo/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_twig_component/index.html.twig b/test_apps/e2e-app/templates/ux_twig_component/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_twig_component/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_typed/index.html.twig b/test_apps/e2e-app/templates/ux_typed/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_typed/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/templates/ux_vue/index.html.twig b/test_apps/e2e-app/templates/ux_vue/index.html.twig
new file mode 100644
index 00000000000..1503ec7374b
--- /dev/null
+++ b/test_apps/e2e-app/templates/ux_vue/index.html.twig
@@ -0,0 +1 @@
+{% extends 'base.html.twig' %}
diff --git a/test_apps/e2e-app/translations/.gitignore b/test_apps/e2e-app/translations/.gitignore
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/vitest.config.mjs b/vitest.config.base.mjs
similarity index 50%
rename from vitest.config.mjs
rename to vitest.config.base.mjs
index e5087cbe097..ea6bc9b1ef3 100644
--- a/vitest.config.mjs
+++ b/vitest.config.base.mjs
@@ -1,3 +1,17 @@
+/**
+ * Vitest base configuration for UX packages, for unit testing.
+ *
+ * This file is not intended to be used directly, but to be used by UX packages themselves.
+ * For example:
+ * ```typescript
+ * // src/Autocomplete/assets/vitest.config.mjs
+ *
+ * import baseConfig from '../../../../../../vitest.config.base';
+ *
+ * export default baseConfig;
+ * ```
+ */
+
import { defineConfig } from 'vitest/config';
import path from 'node:path';
diff --git a/vitest.config.browser.mjs b/vitest.config.browser.mjs
deleted file mode 100644
index 7d6cda0f8aa..00000000000
--- a/vitest.config.browser.mjs
+++ /dev/null
@@ -1,62 +0,0 @@
-///
-import { defineConfig } from 'vitest/config';
-import path from 'node:path';
-import { browsers } from './bin/get_browsers.mjs';
-
-export default defineConfig({
- test: {
- include: [
- './test/browser/**/*.{test,spec}.ts',
- './test/**/*.browser.{test,spec}.ts',
- ],
- setupFiles: [path.join(__dirname, 'test', 'setup.js')],
- browser: {
- enabled: true,
- provider: 'webdriverio',
- headless: true,
- instances: [
- {
- name: 'Chrome (lowest)',
- browser: 'chrome',
- capabilities: {
- 'goog:chromeOptions': {
- binary: browsers['chrome@lowest'].executablePath,
- args: ['--no-sandbox', '--disable-dev-shm-usage']
- },
- },
- },
-
- {
- name: 'Chrome (latest)',
- browser: 'chrome',
- capabilities: {
- 'goog:chromeOptions': {
- binary: browsers['chrome@latest'].executablePath,
- args: ['--no-sandbox', '--disable-dev-shm-usage']
- },
- },
- },
-
- {
- name: 'Firefox (lowest)',
- browser: 'firefox',
- capabilities: {
- 'moz:firefoxOptions': {
- binary: browsers['firefox@lowest'].executablePath,
- }
- },
- },
-
- {
- name: 'Firefox (latest)',
- browser: 'firefox',
- capabilities: {
- 'moz:firefoxOptions': {
- binary: browsers['firefox@latest'].executablePath,
- }
- },
- },
- ],
- },
- },
-});