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 @@ + + + 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, - } - }, - }, - ], - }, - }, -});