diff --git a/.github/workflows/check-links-validity.yaml b/.github/workflows/check-links-validity.yaml index 51ef3cb88c..c18b5482bd 100644 --- a/.github/workflows/check-links-validity.yaml +++ b/.github/workflows/check-links-validity.yaml @@ -6,6 +6,7 @@ on: - cron: "30 8 * * *" jobs: run: + if: github.repository == 'betagouv/aides-jeunes' runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ba0b0d45aa..972fc73210 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ concurrency: jobs: health-check: runs-on: ubuntu-latest - if: github.event.pull_request.head.repo.full_name == github.repository + if: github.event.pull_request.head.repo.full_name == github.repository && github.repository == 'betagouv/aides-jeunes' steps: - name: Check Sentry Status id: sentry-check @@ -35,7 +35,11 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 - name: Cache NPM install files uses: actions/cache@v4 id: restore-npm-install-packages @@ -58,7 +62,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Cache Virtual Environment uses: actions/cache@v4 id: python-dependencies @@ -85,7 +89,11 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 - name: Restore node modules uses: actions/cache@v4 id: restore-dependencies @@ -102,7 +110,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Restore node modules uses: actions/cache@v4 id: restore-dependencies @@ -117,7 +125,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Restore node modules uses: actions/cache@v4 id: restore-dependencies @@ -161,7 +169,11 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 - name: Restore node modules uses: actions/cache@v4 id: restore-dependencies @@ -188,7 +200,11 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 - name: Restore contribuer/node_modules uses: actions/cache@v4 id: restore-contribuer-dependencies @@ -215,7 +231,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} @@ -242,7 +258,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Restore node modules uses: actions/cache@v4 id: restore-dependencies @@ -271,7 +287,11 @@ jobs: test: [base, family, handicap, patrimoine, student] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 - uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} @@ -287,6 +307,12 @@ jobs: with: path: ~/.cache/Cypress key: ${{ runner.os }}-cache-cypress-${{ hashFiles('**/package-lock.json') }} + - name: Cypress install + if: steps.restore-cypress.outputs.cache-hit != 'true' + run: | + node_modules/.bin/cypress install + node_modules/.bin/cypress cache list + node_modules/.bin/cypress verify - name: Cache Virtual Environment uses: actions/cache@v4 id: python-dependencies @@ -311,13 +337,6 @@ jobs: source .venv/bin/activate nohup gunicorn api --chdir openfisca/ --config openfisca/config.py --preload --log-level debug --log-file=- & deactivate - - name: Cypress install - uses: cypress-io/github-action@v6 - if: steps.restore-cypress.outputs.cache-hit != 'true' - with: - browser: chrome - config-file: cypress.config.ts - runTests: false - name: Copy cypress env file run: cp .env.e2e .env - name: Cypress run @@ -351,7 +370,7 @@ jobs: status: ${{ steps.stop-early.outputs.status }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 - id: stop-early @@ -370,11 +389,11 @@ jobs: timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 24 - uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} @@ -416,7 +435,7 @@ jobs: status: ${{ steps.has-changes.outputs.status }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Restore node modules @@ -433,16 +452,16 @@ jobs: check_benefit_link_improvements: name: Check benefit link improvements and update link table if necessary needs: [test_benefit_file_changes] - if: needs.test_benefit_file_changes.outputs.status == 'success' && github.event.pull_request.head.repo.full_name == github.repository + if: needs.test_benefit_file_changes.outputs.status == 'success' && github.event.pull_request.head.repo.full_name == github.repository && github.repository == 'betagouv/aides-jeunes' runs-on: ubuntu-24.04 timeout-minutes: 60 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 24 - name: Restore node modules uses: actions/cache@v4 id: restore-dependencies diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..32e6012709 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +engine-strict=true +ignore-scripts=true diff --git a/backend/lib/mes-aides/emails/email-render.ts b/backend/lib/mes-aides/emails/email-render.ts index 1d4a1adce3..2bf4dd3287 100644 --- a/backend/lib/mes-aides/emails/email-render.ts +++ b/backend/lib/mes-aides/emails/email-render.ts @@ -1,5 +1,5 @@ import fs from "fs" -import yaml from "js-yaml" +import { load } from "js-yaml" import path from "path" import consolidate from "consolidate" import { fileURLToPath } from "url" @@ -22,7 +22,7 @@ function readFile(filePath) { const emailTemplate = readFile("templates/email.mjml") const footerTemplate = readFile("templates/footer.mjml") const headerTemplate = readFile(`templates/${config.contextName}/header.mjml`) -const style = yaml.load(readFile(`templates/${config.contextName}/style.yaml`)) +const style = load(readFile(`templates/${config.contextName}/style.yaml`)) const simulationResultsTemplate = readFile("templates/simulation-results.mjml") const simulationUsefulnessTemplate = readFile( "templates/simulation-usefulness.mjml", diff --git a/backend/lib/mes-aides/emails/templates/1jeune1solution/style.yaml b/backend/lib/mes-aides/emails/templates/1jeune1solution/style.yaml index 55be8132c6..6b110944e8 100644 --- a/backend/lib/mes-aides/emails/templates/1jeune1solution/style.yaml +++ b/backend/lib/mes-aides/emails/templates/1jeune1solution/style.yaml @@ -1 +1 @@ -ctaBackgroundColor: "#2aa28bff" +ctaBackgroundColor: "#5770be" diff --git a/backend/lib/mes-aides/emails/templates/mes-aides.org/style.yaml b/backend/lib/mes-aides/emails/templates/mes-aides.org/style.yaml index 55be8132c6..ea5d1a16f2 100644 --- a/backend/lib/mes-aides/emails/templates/mes-aides.org/style.yaml +++ b/backend/lib/mes-aides/emails/templates/mes-aides.org/style.yaml @@ -1 +1 @@ -ctaBackgroundColor: "#2aa28bff" +ctaBackgroundColor: "#228572ff" diff --git a/contribuer/.npmrc b/contribuer/.npmrc new file mode 100644 index 0000000000..b6f27f1359 --- /dev/null +++ b/contribuer/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/contribuer/next.config.js b/contribuer/next.config.js index 2060dae613..69a5e38038 100644 --- a/contribuer/next.config.js +++ b/contribuer/next.config.js @@ -2,6 +2,9 @@ const nextConfig = { output: "export", reactStrictMode: true, + images: { + unoptimized: true, + }, } module.exports = nextConfig diff --git a/contribuer/package-lock.json b/contribuer/package-lock.json index 1676d95fe7..4761aaa2b9 100644 --- a/contribuer/package-lock.json +++ b/contribuer/package-lock.json @@ -9,10 +9,10 @@ "version": "1.0.0", "license": "AGPL-3.0", "dependencies": { - "eslint": "9.23.0", + "eslint": "9.39.1", "eslint-config-next": "15.2.3", "netlify-identity-widget": "^1.9.2", - "next": "15.4.7", + "next": "16.0.10", "prettier": "^3.5.3", "react": "18.3.1", "react-dom": "18.3.1" @@ -29,9 +29,10 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -47,9 +48,10 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -83,11 +85,12 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -96,17 +99,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", - "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -137,27 +145,33 @@ } }, "node_modules/@eslint/js": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", - "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.12.0", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -220,13 +234,24 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", - "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -238,16 +263,17 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.0" + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", - "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -259,16 +285,17 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.0" + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", - "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" @@ -278,12 +305,13 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", - "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" @@ -293,12 +321,13 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", - "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "cpu": [ "arm" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -308,12 +337,13 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", - "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -323,12 +353,29 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", - "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", "cpu": [ "ppc64" ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -338,12 +385,13 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", - "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "cpu": [ "s390x" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -353,12 +401,13 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", - "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -368,12 +417,13 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", - "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -383,12 +433,13 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", - "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -398,12 +449,13 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", - "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "cpu": [ "arm" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -415,16 +467,17 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.0" + "@img/sharp-libvips-linux-arm": "1.2.4" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", - "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -436,16 +489,39 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.0" + "@img/sharp-libvips-linux-arm64": "1.2.4" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", - "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", "cpu": [ "ppc64" ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -457,16 +533,17 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.0" + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", - "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "cpu": [ "s390x" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -478,16 +555,17 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.0" + "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", - "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -499,16 +577,17 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.0" + "@img/sharp-libvips-linux-x64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", - "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -520,16 +599,17 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", - "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -541,19 +621,20 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.0" + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", - "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", "cpu": [ "wasm32" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.4.4" + "@emnapi/runtime": "^1.7.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -563,12 +644,13 @@ } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", - "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", "cpu": [ "arm64" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" @@ -581,12 +663,13 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", - "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "cpu": [ "ia32" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" @@ -599,12 +682,13 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", - "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "cpu": [ "x64" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" @@ -628,9 +712,10 @@ } }, "node_modules/@next/env": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.7.tgz", - "integrity": "sha512-PrBIpO8oljZGTOe9HH0miix1w5MUiGJ/q83Jge03mHEE0E3pyqzAy2+l5G6aJDbXoobmxPJTVhbCuwlLtjSHwg==" + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.10.tgz", + "integrity": "sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==", + "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { "version": "15.2.3", @@ -641,12 +726,13 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.7.tgz", - "integrity": "sha512-2Dkb+VUTp9kHHkSqtws4fDl2Oxms29HcZBwFIda1X7Ztudzy7M6XF9HDS2dq85TmdN47VpuhjE+i6wgnIboVzQ==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.10.tgz", + "integrity": "sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -656,12 +742,13 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.7.tgz", - "integrity": "sha512-qaMnEozKdWezlmh1OGDVFueFv2z9lWTcLvt7e39QA3YOvZHNpN2rLs/IQLwZaUiw2jSvxW07LxMCWtOqsWFNQg==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.10.tgz", + "integrity": "sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -671,12 +758,13 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.7.tgz", - "integrity": "sha512-ny7lODPE7a15Qms8LZiN9wjNWIeI+iAZOFDOnv2pcHStncUr7cr9lD5XF81mdhrBXLUP9yT9RzlmSWKIazWoDw==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.10.tgz", + "integrity": "sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -686,12 +774,13 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.7.tgz", - "integrity": "sha512-4SaCjlFR/2hGJqZLLWycccy1t+wBrE/vyJWnYaZJhUVHccpGLG5q0C+Xkw4iRzUIkE+/dr90MJRUym3s1+vO8A==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.10.tgz", + "integrity": "sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -701,12 +790,13 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.7.tgz", - "integrity": "sha512-2uNXjxvONyRidg00VwvlTYDwC9EgCGNzPAPYbttIATZRxmOZ3hllk/YYESzHZb65eyZfBR5g9xgCZjRAl9YYGg==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.10.tgz", + "integrity": "sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -716,12 +806,13 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.7.tgz", - "integrity": "sha512-ceNbPjsFgLscYNGKSu4I6LYaadq2B8tcK116nVuInpHHdAWLWSwVK6CHNvCi0wVS9+TTArIFKJGsEyVD1H+4Kg==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.10.tgz", + "integrity": "sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -731,12 +822,13 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.7.tgz", - "integrity": "sha512-pZyxmY1iHlZJ04LUL7Css8bNvsYAMYOY9JRwFA3HZgpaNKsJSowD09Vg2R9734GxAcLJc2KDQHSCR91uD6/AAw==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.10.tgz", + "integrity": "sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -746,12 +838,13 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.7.tgz", - "integrity": "sha512-HjuwPJ7BeRzgl3KrjKqD2iDng0eQIpIReyhpF5r4yeAHFwWRuAhfW92rWv/r3qeQHEwHsLRzFDvMqRjyM5DI6A==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.10.tgz", + "integrity": "sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -835,7 +928,8 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -969,9 +1063,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dependencies": { "balanced-match": "^1.0.0" } @@ -1190,9 +1284,10 @@ ] }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1441,9 +1536,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1551,19 +1646,6 @@ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1580,16 +1662,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "optional": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1715,9 +1787,10 @@ } }, "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" @@ -1922,31 +1995,31 @@ } }, "node_modules/eslint": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", - "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.2", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.23.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2245,9 +2318,10 @@ } }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -2260,9 +2334,10 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2271,13 +2346,14 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2301,6 +2377,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2731,12 +2808,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "optional": true - }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -3091,9 +3162,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dependencies": { "argparse": "^2.0.1" }, @@ -3287,11 +3358,12 @@ "integrity": "sha512-IbS1JHhs7BflCCvp3C9f6tmNSZqbyBhZ4Gs5+Qxt4IlPybTOVv0PqJ4TAsA7uxh1R+oXOAmk0OOMAkEaPYeCtA==" }, "node_modules/next": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-15.4.7.tgz", - "integrity": "sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.10.tgz", + "integrity": "sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==", + "license": "MIT", "dependencies": { - "@next/env": "15.4.7", + "@next/env": "16.0.10", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -3301,18 +3373,18 @@ "next": "dist/bin/next" }, "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.4.7", - "@next/swc-darwin-x64": "15.4.7", - "@next/swc-linux-arm64-gnu": "15.4.7", - "@next/swc-linux-arm64-musl": "15.4.7", - "@next/swc-linux-x64-gnu": "15.4.7", - "@next/swc-linux-x64-musl": "15.4.7", - "@next/swc-win32-arm64-msvc": "15.4.7", - "@next/swc-win32-x64-msvc": "15.4.7", - "sharp": "^0.34.3" + "@next/swc-darwin-arm64": "16.0.10", + "@next/swc-darwin-x64": "16.0.10", + "@next/swc-linux-arm64-gnu": "16.0.10", + "@next/swc-linux-arm64-musl": "16.0.10", + "@next/swc-linux-x64-gnu": "16.0.10", + "@next/swc-linux-x64-musl": "16.0.10", + "@next/swc-win32-arm64-msvc": "16.0.10", + "@next/swc-win32-x64-msvc": "16.0.10", + "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -3859,9 +3931,10 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3913,15 +3986,16 @@ } }, "node_modules/sharp": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", - "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "hasInstallScript": true, + "license": "Apache-2.0", "optional": true, "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.4", - "semver": "^7.7.2" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -3930,28 +4004,30 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.3", - "@img/sharp-darwin-x64": "0.34.3", - "@img/sharp-libvips-darwin-arm64": "1.2.0", - "@img/sharp-libvips-darwin-x64": "1.2.0", - "@img/sharp-libvips-linux-arm": "1.2.0", - "@img/sharp-libvips-linux-arm64": "1.2.0", - "@img/sharp-libvips-linux-ppc64": "1.2.0", - "@img/sharp-libvips-linux-s390x": "1.2.0", - "@img/sharp-libvips-linux-x64": "1.2.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", - "@img/sharp-libvips-linuxmusl-x64": "1.2.0", - "@img/sharp-linux-arm": "0.34.3", - "@img/sharp-linux-arm64": "0.34.3", - "@img/sharp-linux-ppc64": "0.34.3", - "@img/sharp-linux-s390x": "0.34.3", - "@img/sharp-linux-x64": "0.34.3", - "@img/sharp-linuxmusl-arm64": "0.34.3", - "@img/sharp-linuxmusl-x64": "0.34.3", - "@img/sharp-wasm32": "0.34.3", - "@img/sharp-win32-arm64": "0.34.3", - "@img/sharp-win32-ia32": "0.34.3", - "@img/sharp-win32-x64": "0.34.3" + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/shebang-command": { @@ -4041,15 +4117,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "optional": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -4550,9 +4617,9 @@ } }, "@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", "optional": true, "requires": { "tslib": "^2.4.0" @@ -4568,9 +4635,9 @@ } }, "@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "requires": { "eslint-visitor-keys": "^3.4.3" }, @@ -4588,24 +4655,27 @@ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==" }, "@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "requires": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "@eslint/config-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", - "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "requires": { + "@eslint/core": "^0.17.0" + } }, "@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "requires": { "@types/json-schema": "^7.0.15" } @@ -4627,21 +4697,21 @@ } }, "@eslint/js": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", - "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==" + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==" }, "@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==" + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==" }, "@eslint/plugin-kit": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "requires": { - "@eslint/core": "^0.12.0", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, @@ -4676,166 +4746,187 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==" }, + "@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "optional": true + }, "@img/sharp-darwin-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", - "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "optional": true, "requires": { - "@img/sharp-libvips-darwin-arm64": "1.2.0" + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, "@img/sharp-darwin-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", - "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "optional": true, "requires": { - "@img/sharp-libvips-darwin-x64": "1.2.0" + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "@img/sharp-libvips-darwin-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", - "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "optional": true }, "@img/sharp-libvips-darwin-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", - "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "optional": true }, "@img/sharp-libvips-linux-arm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", - "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "optional": true }, "@img/sharp-libvips-linux-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", - "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "optional": true }, "@img/sharp-libvips-linux-ppc64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", - "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "optional": true + }, + "@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", "optional": true }, "@img/sharp-libvips-linux-s390x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", - "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "optional": true }, "@img/sharp-libvips-linux-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", - "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "optional": true }, "@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", - "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "optional": true }, "@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", - "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "optional": true }, "@img/sharp-linux-arm": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", - "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "optional": true, "requires": { - "@img/sharp-libvips-linux-arm": "1.2.0" + "@img/sharp-libvips-linux-arm": "1.2.4" } }, "@img/sharp-linux-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", - "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "optional": true, "requires": { - "@img/sharp-libvips-linux-arm64": "1.2.0" + "@img/sharp-libvips-linux-arm64": "1.2.4" } }, "@img/sharp-linux-ppc64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", - "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "optional": true, + "requires": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", "optional": true, "requires": { - "@img/sharp-libvips-linux-ppc64": "1.2.0" + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, "@img/sharp-linux-s390x": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", - "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "optional": true, "requires": { - "@img/sharp-libvips-linux-s390x": "1.2.0" + "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "@img/sharp-linux-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", - "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "optional": true, "requires": { - "@img/sharp-libvips-linux-x64": "1.2.0" + "@img/sharp-libvips-linux-x64": "1.2.4" } }, "@img/sharp-linuxmusl-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", - "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "optional": true, "requires": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "@img/sharp-linuxmusl-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", - "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "optional": true, "requires": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.0" + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "@img/sharp-wasm32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", - "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", "optional": true, "requires": { - "@emnapi/runtime": "^1.4.4" + "@emnapi/runtime": "^1.7.0" } }, "@img/sharp-win32-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", - "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", "optional": true }, "@img/sharp-win32-ia32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", - "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "optional": true }, "@img/sharp-win32-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", - "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "optional": true }, "@napi-rs/wasm-runtime": { @@ -4850,9 +4941,9 @@ } }, "@next/env": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.7.tgz", - "integrity": "sha512-PrBIpO8oljZGTOe9HH0miix1w5MUiGJ/q83Jge03mHEE0E3pyqzAy2+l5G6aJDbXoobmxPJTVhbCuwlLtjSHwg==" + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.10.tgz", + "integrity": "sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==" }, "@next/eslint-plugin-next": { "version": "15.2.3", @@ -4863,51 +4954,51 @@ } }, "@next/swc-darwin-arm64": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.7.tgz", - "integrity": "sha512-2Dkb+VUTp9kHHkSqtws4fDl2Oxms29HcZBwFIda1X7Ztudzy7M6XF9HDS2dq85TmdN47VpuhjE+i6wgnIboVzQ==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.10.tgz", + "integrity": "sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==", "optional": true }, "@next/swc-darwin-x64": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.7.tgz", - "integrity": "sha512-qaMnEozKdWezlmh1OGDVFueFv2z9lWTcLvt7e39QA3YOvZHNpN2rLs/IQLwZaUiw2jSvxW07LxMCWtOqsWFNQg==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.10.tgz", + "integrity": "sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==", "optional": true }, "@next/swc-linux-arm64-gnu": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.7.tgz", - "integrity": "sha512-ny7lODPE7a15Qms8LZiN9wjNWIeI+iAZOFDOnv2pcHStncUr7cr9lD5XF81mdhrBXLUP9yT9RzlmSWKIazWoDw==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.10.tgz", + "integrity": "sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==", "optional": true }, "@next/swc-linux-arm64-musl": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.7.tgz", - "integrity": "sha512-4SaCjlFR/2hGJqZLLWycccy1t+wBrE/vyJWnYaZJhUVHccpGLG5q0C+Xkw4iRzUIkE+/dr90MJRUym3s1+vO8A==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.10.tgz", + "integrity": "sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==", "optional": true }, "@next/swc-linux-x64-gnu": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.7.tgz", - "integrity": "sha512-2uNXjxvONyRidg00VwvlTYDwC9EgCGNzPAPYbttIATZRxmOZ3hllk/YYESzHZb65eyZfBR5g9xgCZjRAl9YYGg==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.10.tgz", + "integrity": "sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==", "optional": true }, "@next/swc-linux-x64-musl": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.7.tgz", - "integrity": "sha512-ceNbPjsFgLscYNGKSu4I6LYaadq2B8tcK116nVuInpHHdAWLWSwVK6CHNvCi0wVS9+TTArIFKJGsEyVD1H+4Kg==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.10.tgz", + "integrity": "sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==", "optional": true }, "@next/swc-win32-arm64-msvc": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.7.tgz", - "integrity": "sha512-pZyxmY1iHlZJ04LUL7Css8bNvsYAMYOY9JRwFA3HZgpaNKsJSowD09Vg2R9734GxAcLJc2KDQHSCR91uD6/AAw==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.10.tgz", + "integrity": "sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==", "optional": true }, "@next/swc-win32-x64-msvc": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.7.tgz", - "integrity": "sha512-HjuwPJ7BeRzgl3KrjKqD2iDng0eQIpIReyhpF5r4yeAHFwWRuAhfW92rWv/r3qeQHEwHsLRzFDvMqRjyM5DI6A==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.10.tgz", + "integrity": "sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==", "optional": true }, "@nodelib/fs.scandir": { @@ -5049,9 +5140,9 @@ }, "dependencies": { "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "requires": { "balanced-match": "^1.0.0" } @@ -5176,9 +5267,9 @@ "optional": true }, "acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==" + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" }, "acorn-jsx": { "version": "5.3.2", @@ -5346,9 +5437,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5415,16 +5506,6 @@ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, - "color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "optional": true, - "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5438,16 +5519,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "optional": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5532,9 +5603,9 @@ } }, "detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "optional": true }, "doctrine": { @@ -5694,31 +5765,30 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", - "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "requires": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.2", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.23.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5931,27 +6001,27 @@ "requires": {} }, "eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==" }, "espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "requires": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" } }, "esquery": { @@ -6257,12 +6327,6 @@ "get-intrinsic": "^1.2.6" } }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "optional": true - }, "is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -6485,9 +6549,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "requires": { "argparse": "^2.0.1" } @@ -6630,23 +6694,23 @@ "integrity": "sha512-IbS1JHhs7BflCCvp3C9f6tmNSZqbyBhZ4Gs5+Qxt4IlPybTOVv0PqJ4TAsA7uxh1R+oXOAmk0OOMAkEaPYeCtA==" }, "next": { - "version": "15.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-15.4.7.tgz", - "integrity": "sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==", - "requires": { - "@next/env": "15.4.7", - "@next/swc-darwin-arm64": "15.4.7", - "@next/swc-darwin-x64": "15.4.7", - "@next/swc-linux-arm64-gnu": "15.4.7", - "@next/swc-linux-arm64-musl": "15.4.7", - "@next/swc-linux-x64-gnu": "15.4.7", - "@next/swc-linux-x64-musl": "15.4.7", - "@next/swc-win32-arm64-msvc": "15.4.7", - "@next/swc-win32-x64-msvc": "15.4.7", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.10.tgz", + "integrity": "sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==", + "requires": { + "@next/env": "16.0.10", + "@next/swc-darwin-arm64": "16.0.10", + "@next/swc-darwin-x64": "16.0.10", + "@next/swc-linux-arm64-gnu": "16.0.10", + "@next/swc-linux-arm64-musl": "16.0.10", + "@next/swc-linux-x64-gnu": "16.0.10", + "@next/swc-linux-x64-musl": "16.0.10", + "@next/swc-win32-arm64-msvc": "16.0.10", + "@next/swc-win32-x64-msvc": "16.0.10", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", - "sharp": "^0.34.3", + "sharp": "^0.34.4", "styled-jsx": "5.1.6" } }, @@ -6979,9 +7043,9 @@ } }, "semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==" + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" }, "set-function-length": { "version": "1.2.2", @@ -7018,36 +7082,38 @@ } }, "sharp": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", - "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "optional": true, "requires": { - "@img/sharp-darwin-arm64": "0.34.3", - "@img/sharp-darwin-x64": "0.34.3", - "@img/sharp-libvips-darwin-arm64": "1.2.0", - "@img/sharp-libvips-darwin-x64": "1.2.0", - "@img/sharp-libvips-linux-arm": "1.2.0", - "@img/sharp-libvips-linux-arm64": "1.2.0", - "@img/sharp-libvips-linux-ppc64": "1.2.0", - "@img/sharp-libvips-linux-s390x": "1.2.0", - "@img/sharp-libvips-linux-x64": "1.2.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", - "@img/sharp-libvips-linuxmusl-x64": "1.2.0", - "@img/sharp-linux-arm": "0.34.3", - "@img/sharp-linux-arm64": "0.34.3", - "@img/sharp-linux-ppc64": "0.34.3", - "@img/sharp-linux-s390x": "0.34.3", - "@img/sharp-linux-x64": "0.34.3", - "@img/sharp-linuxmusl-arm64": "0.34.3", - "@img/sharp-linuxmusl-x64": "0.34.3", - "@img/sharp-wasm32": "0.34.3", - "@img/sharp-win32-arm64": "0.34.3", - "@img/sharp-win32-ia32": "0.34.3", - "@img/sharp-win32-x64": "0.34.3", - "color": "^4.2.3", - "detect-libc": "^2.0.4", - "semver": "^7.7.2" + "@img/colour": "^1.0.0", + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" } }, "shebang-command": { @@ -7107,15 +7173,6 @@ "side-channel-map": "^1.0.1" } }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "optional": true, - "requires": { - "is-arrayish": "^0.3.1" - } - }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", diff --git a/contribuer/package.json b/contribuer/package.json index 8cb35fdbb5..09813ed714 100644 --- a/contribuer/package.json +++ b/contribuer/package.json @@ -13,10 +13,10 @@ "author": "Thomas Guillet", "license": "AGPL-3.0", "dependencies": { - "eslint": "9.23.0", + "eslint": "9.39.1", "eslint-config-next": "15.2.3", "netlify-identity-widget": "^1.9.2", - "next": "15.4.7", + "next": "16.0.10", "prettier": "^3.5.3", "react": "18.3.1", "react-dom": "18.3.1" diff --git a/contribuer/pages/_document.js b/contribuer/pages/_document.js index e52ab35745..4d8aa5508c 100644 --- a/contribuer/pages/_document.js +++ b/contribuer/pages/_document.js @@ -35,12 +35,12 @@ class MyDocument extends Document { diff --git a/contribuer/pages/index.js b/contribuer/pages/index.js index 5bdfb4df7e..0a0c403a26 100644 --- a/contribuer/pages/index.js +++ b/contribuer/pages/index.js @@ -1,55 +1,644 @@ import Head from "next/head" import { useEffect } from "react" import netlifyIdentity from "netlify-identity-widget" +import Image from "next/image" +import Link from "next/link" +import ConnexionDecap from "../public/img/connexion-decap.webp" +import DetailAide from "../public/img/detail-aide.webp" +import ListeAide from "../public/img/liste-aide-critere.webp" +import Signup from "../public/img/signup-connexion.webp" function Home() { useEffect(() => { netlifyIdentity.init() - }) + }, []) return ( <> - Comment contribuer à Mes Aides ? - + Comment contribuer au simulateur d’Aides Jeunes ? + -
-

Comment contribuer à Mes Aides ?

-

Bienvenue

-

- Nous avons mis en place ce site pour faciliter la contribution du plus - grand nombre 🌍. -

-

- Outil de contribution -

-

Guides de contribution

- + + + + + +
+

+ 😬 Vous avez une question ou une suggestion ? +

+

+ N’hésitez pas à nous écrire pour nous les partager, cet outil + s’améliore au fur et à mesure que vous nous faites des + retours ! +

+
+ +
+

01. À propos du simulateur

+ +

Pourquoi ce simulateur a‑t‑il été créé ?

+

+ Les moins de 30 ans, qu’ils soient étudiant(e)s, demandeurs d’emploi + ou en décrochage scolaire, sont parmi les premières victimes de la + crise économique. Si des aides existent au niveau national ou local, + elles peuvent s’apparenter à un maquis difficile à naviguer pour le + public. Conséquence : le non‑recours aux aides de la part des + jeunes, par méconnaissance des dispositifs ou découragement. Ce + non‑recours, en cascade, a un impact sur la capacité des jeunes à + s’insérer dans la vie professionnelle ou à échapper à une situation + de pauvreté. +

+

+ Bien que la cible prioritaire de ce simulateur soit les personnes de + moins de 30 ans, il peut aussi être utilisé pour aider des personnes + plus âgées à connaître leurs droits. En effet, tous les dispositifs + nationaux et locaux sont intégrés au simulateur ou peuvent l’être, à + condition qu’ils n’excluent pas les jeunes. +

+ +

À quoi sert ce simulateur ?

+

+ Ce simulateur permet aux personnes de voir en quelques minutes à + quelles aides elles ont droit. Aujourd'hui, le simulateur + contient près de 900 aides et nous avons pour objectif d'en + ajouter davantage à l'échelle locale, avec votre aide. +

+ +

Où le trouver ?

+

+ Le simulateur d'aides de{" "} + + 1Jeune1solution.gouv.fr en ligne. + {" "} +

+ +

Pour aller plus loin

+ +
+ +
+

02. Vous souhaitez ajouter une aide ?

+

+ C’est une excellente nouvelle ! Dans cette rubrique, nous vous + guidons pour que cette démarche soit la plus simple possible pour + vous. +

+ +

Pourquoi ajouter de nouvelles aides ?

+

+ Quelle que soit l’administration dont vous provenez, vous pouvez + ajouter de nouvelles aides afin de leur donner davantage de + visibilité auprès des utilisateurs et utilisatrices du simulateur. +

+

+ Voici un tutoriel pour vous guider pas à pas afin que vous puissiez + ajouter des aides en complète autonomie. +

+ +
+

1 - Je me crée un compte

+
    +
  1. + + Accédez à l’outil de contribution. + +
  2. +
  3. + Cliquez sur “Se connecter avec Netlify Identity”.{" "} + DecapCMS +
  4. +
  5. + Sous “Sign up”, entrez votre nom, votre mail et créez un mot de + passe. Votre mail et votre mot de passe deviendront vos + identifiants de connexion. + Capture d'écran du formulaire d'inscription avec les champs nom, email et mot de passe +
  6. +
+

+ Félicitations, votre compte a été créé et vous êtes arrivé sur + l’outil de contribution. Vous pouvez désormais ajouter de + nouvelles aides. + Capture d'écran de l'interface principale de l’outil de contribution{" "} +

+
+ +
+

+ 2 - Intégrer une nouvelle aide au simulateur +

+

+ Pour intégrer une nouvelle aide, vous aurez besoin d’ouvrir : +

+
    +
  • + L’outil de contribution (la page à laquelle vous venez de vous + connecter). +
  • +
  • + Une page ou un document détaillant les conditions d’attribution + de l’aide à ajouter. +
  • +
+

+ Voici un{" "} + + tutoriel de 5 minutes{" "} + {" "} + pour comprendre comment ajouter facilement une nouvelle aide au + simulateur. +

+

+ Exemple utilisé : le prêt d’un vélo Freevélo’v de la + métropole de Lyon. La page détaillant les conditions d’attribution + de l’aide utilisée est{" "} + + celle‑ci. + +

+
+ +
+

+ 3 - Valider l’intégration de l’aide dans le simulateur +

+

+ Une fois les critères d'éligibilité indiqués grâce à l’outil de + contribution, un membre de l’équipe relit et valide. L’aide est + alors ajoutée et visible par les utilisateurs. +

+

+ Toujours avec l’exemple du prêt d’un vélo Freevélo’v, voici ce que + voient les jeunes à la fin d’une simulation si leur situation + correspond aux critères d'éligibilité de l'aide. +

+ Capture d'écran des détails d'une aide affichés dans les résultats de simulation{" "} +
+ +
+

+ 4 - Que se passe‑t‑il si l’aide évolue dans le temps ? +

+

+ Si les critères évoluent ou si l’aide doit être supprimée, vous + pouvez modifier l’aide dans l’outil (section “Aides avec critères + d’éligibilité” ou via la recherche par mot‑clé). +

+

+ En cas de souci, écrivez à l’équipe du simulateur :{" "} + + aides-jeunes@beta.gouv.fr + + . +

+
+
+ +
+

Foire aux questions

+ +
+ Comment choisir une aide à intégrer ? +
+

+ Référez‑vous à{" "} + + cette page qui répertorie les critères à prendre en compte + lorsque vous évaluez la pertinence + {" "} + d’ajouter une aide. +

+
+
+ +
+ Dois‑je obligatoirement ajouter un logo ? +
+

+ Non. Le logo de votre institution s’affiche déjà par défaut + (pré‑enregistré). Renseignez votre institution dans la liste. Le + champ LOGO n’est à remplir que si vous souhaitez une image + spécifique au dispositif. +

+
+
+ +
+ + Si mon institution n’est pas dans la liste, que faire ? + +
+

+ Tapez les premières lettres de votre institution. Si rien + n’apparaît, vous pouvez ajouter votre institution via + l’interface dédiée. +

+
+
+ +
+ Que dois‑je inclure ? +
+

+ Quelques lignes pour décrire la nature du dispositif. + Exemple : “Cette aide vise à favoriser l’accès à la + formation et l’insertion professionnelle des jeunes résidant en + Bretagne en prenant en charge le financement de leur permis de + conduire.” +

+

+ Écrivez de façon inclusive (ex : “les étudiantes et + étudiants”). Les points médians ne sont pas autorisés sur les + sites gouvernementaux. +

+
+
+ +
+ + Où mettre les critères spécifiques (âge, géographie, etc.) ? + +
+

+ Ne les placez pas dans la description : l’outil propose des + champs dédiés pour ces critères. +

+
+
+ +
+ + Quelles conditions et comment elles se cumulent ? + +
+

+ Conditions disponibles : âge, géographie (communes, + départements, régions, EPCI, exclusion d’EPCI), régime de + sécurité sociale, quotient familial, en formation sanitaire et + sociale, bénéficiaire RSA, intérimaire, statut d’occupation du + logement, etc. +

+

+ Elles se cumulent entre elles. Ex : “région 84” ET + “quotient familial < 16 000 € annuel” => visible + uniquement pour les personnes en Auvergne‑Rhône‑Alpes ET avec un + quotient < 16 000 €. +

+
+
+ +
+ Quels profils et comment cela fonctionne ? +
+

+ Profils : lycéen·ne, dans l’enseignement supérieur, + scolarisé·e, stagiaire, apprenti·e, en contrat pro, en recherche + d’emploi, salarié·e, indépendant·e, en service civique, + bénéficiaire RSA, en situation de handicap, inactif·ve. +

+

+ Ces conditions ne se cumulent pas entre elles : choisir + “dans l’enseignement supérieur” et “salarié·e” montre l’aide aux + étudiant·e·s et aux salarié·e·s (pas uniquement à celles/ceux + qui sont les deux). +

+

+ Vous pouvez ajouter des précisions à satisfaire simultanément + dans un même profil (ex. : stagiaires boursiers de moins de + 20 ans). “Inactif ou inactive” cible les personnes “hors + radars”. +

+
+
+ +
+ À quoi sert ce champ ? +
+

+ Certains critères trop précis/complexes ne sont pas pris en + compte par le simulateur. Utilisez ce champ pour informer les + usagers. Écrivez des critères complétant “Pour en bénéficier, + vous devez également…”, en commençant par un verbe à + l’infinitif. +

+

+ Exemples : Signer un CER ou un PPAE. Résider depuis au + moins 6 mois. Ne pas bénéficier du soutien financier des + parents. +

+
+
+ +
+ Conditions bénévoles à satisfaire +
+

+ Si l’aide est attribuée en échange d’un engagement bénévole, + cochez “ajouter conditions bénévoles à satisfaire” afin qu’un + lien dynamique vers jeveuxaider.gouv.fr s’affiche et oriente + vers des organismes à proximité. +

+
+
+ +
+ + Lien vers la page d'informations de référence — Est‑ce + obligatoire ? + +
+

+ Ce lien suit la description de l’aide. Souvent, il renvoie vers + une page détaillant les informations de base, l’éligibilité et + un contact ou formulaire. +

+
+
+ +
+ + Liens vers un site, téléservice ou formulaire — Est‑ce + obligatoire ? + +
+

+ Oui, il est important de rediriger vers au moins une + ressource : 1) téléservice, 2) formulaire à imprimer, 3) + page d’instructions. +

+
+
+ +
+ + Article défini (optionnel) — À quoi sert ce champ ? + +
+

+ Spécifie l’article placé avant l’aide (ex. : “le RSA”). Il + est réutilisé dans certaines phrases (ex. : “Le montant + indiqué pour le RSA vous semble inexact ?”). +

+
+
+ +
+ + Type du résultat — Comment choisir et quoi renseigner ? + +
+

+ Deux types : valeur numérique (ex. : 500 € + mensuels, 5 séances) ou éligibilité (oui/non, ex. : accès + gratuit aux musées). +

+

+ Si “valeur numérique” : précisez l’unité (€, %, nombre), la + périodicité (ponctuelle, mensuelle, annuelle, autre), la légende + (ex. : “500 € maximum”) et le montant maximal. +

+
+
+ +
+ + Limiter l’affichage selon un intérêt particulier ? + +
+

+ Oui, si nécessaire. Vous pouvez cibler un public intéressé par + le BAFA, le permis de conduire, les études à l’étranger, ou les + formations du sanitaire et social. +

+
+
+ +

+ ↑ Retour en haut +

+
+ + ) } diff --git a/contribuer/public/img/connexion-decap.webp b/contribuer/public/img/connexion-decap.webp new file mode 100644 index 0000000000..2519d28329 Binary files /dev/null and b/contribuer/public/img/connexion-decap.webp differ diff --git a/contribuer/public/img/detail-aide.webp b/contribuer/public/img/detail-aide.webp new file mode 100644 index 0000000000..504f8d28aa Binary files /dev/null and b/contribuer/public/img/detail-aide.webp differ diff --git a/contribuer/public/img/liste-aide-critere.webp b/contribuer/public/img/liste-aide-critere.webp new file mode 100644 index 0000000000..5f03d8d28b Binary files /dev/null and b/contribuer/public/img/liste-aide-critere.webp differ diff --git a/contribuer/public/img/signup-connexion.webp b/contribuer/public/img/signup-connexion.webp new file mode 100644 index 0000000000..a0d0326fd8 Binary files /dev/null and b/contribuer/public/img/signup-connexion.webp differ diff --git a/cypress.config.ts b/cypress.config.ts index 4d7f1c88e5..2f28b1d54e 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -7,6 +7,18 @@ export default defineConfig({ supportFile: false, setupNodeEvents(on) { setupSMTPProxy(on) + on("task", { + log(message) { + console.log(message) + + return null + }, + table(message) { + console.table(message) + + return null + }, + }) }, }, }) diff --git a/cypress/.npmrc b/cypress/.npmrc new file mode 100644 index 0000000000..b6f27f1359 --- /dev/null +++ b/cypress/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/cypress/e2e/base.cy.js b/cypress/e2e/base.cy.js index 528b272b23..df0b3cd485 100644 --- a/cypress/e2e/base.cy.js +++ b/cypress/e2e/base.cy.js @@ -7,6 +7,7 @@ import revenu from "../utils/revenu.js" import projet from "../utils/projet.js" import results from "../utils/results.js" import "cypress-axe" +import "../utils/accessibility.js" import comeBackLater from "../utils/come-back-later.js" context("Full simulation", () => { diff --git a/cypress/utils/accessibility.js b/cypress/utils/accessibility.js new file mode 100644 index 0000000000..9642885a10 --- /dev/null +++ b/cypress/utils/accessibility.js @@ -0,0 +1,23 @@ +import { checkA11y } from "cypress-axe" + +function terminalLog(violations) { + cy.task( + "log", + `${violations.length} accessibility violation${ + violations.length === 1 ? "" : "s" + } ${violations.length === 1 ? "was" : "were"} detected`, + ) + // pluck specific keys to keep the table readable + const violationData = violations.map( + ({ id, impact, description, nodes }) => ({ + id, + impact, + description, + nodes: nodes.length, + }), + ) + + cy.task("table", violationData) +} +const prevFnt = cy.checkA11y +Cypress.Commands.add("checkA11y", () => prevFnt(null, null, terminalLog)) diff --git a/data/benefits/additional-attributes/index.ts b/data/benefits/additional-attributes/index.ts index 1d80451246..7a0e82f1b3 100644 --- a/data/benefits/additional-attributes/index.ts +++ b/data/benefits/additional-attributes/index.ts @@ -98,10 +98,11 @@ export const additionalBenefitAttributes = { labelFunction: function (b) { return `${b.label} avec un taux de ${b.montant}% / an ${b.legend}` }, - legend: (parameters: OpenfiscaParameters) => - `au lieu de ${ - parameters["taxation_capital.epargne.livret_a.taux"] * 100 - }%`, + legend: (parameters: OpenfiscaParameters) => { + const tauxLivretA = parameters["taxation_capital.epargne.livret_a.taux"] + const tauxLivretAPourcent = Number((tauxLivretA * 100).toFixed(2)) + return `au lieu de ${tauxLivretAPourcent} %` + }, }, occitanie_carte_transport_scolaire_lio, } diff --git a/data/benefits/dynamic/fsl.ts b/data/benefits/dynamic/fsl.ts index 2ba2868d15..62e31afccd 100644 --- a/data/benefits/dynamic/fsl.ts +++ b/data/benefits/dynamic/fsl.ts @@ -64,9 +64,9 @@ export const FSL_BY_INSTITUTION_SLUG = { }, departement_calvados: { label: "du département du Calvados", - link: "https://www.calvados.fr/accueil/le-departement/solidarite---familles/aide-au-logement/fsl.html", + link: "https://www.calvados.fr/accueil/le-departement/solidarite-familles/aide-au-logement/fsl.html", instructions: - "https://www.calvados.fr/contents/fiche/fiches-aide--services/maintien-dans-votre-logement--la.html", + "https://www.calvados.fr/accueil/le-departement/solidarite-familles/aide-au-logement/fsl.html", }, departement_cantal: { label: "du département du Cantal", diff --git a/data/benefits/javascript/aide-colocations-solidaire-pour-les-etudiants.yml b/data/benefits/javascript/aide-colocations-solidaire-pour-les-etudiants.yml index 089031bb89..91302e0713 100644 --- a/data/benefits/javascript/aide-colocations-solidaire-pour-les-etudiants.yml +++ b/data/benefits/javascript/aide-colocations-solidaire-pour-les-etudiants.yml @@ -1,12 +1,12 @@ label: Colocations solidaires pour les étudiants institution: etat description: > - Les colocations solidaires offrent un logement à loyer modéré et un engagement au service de la collectivité, que ce soit dans une résidence, un quartier ou auprès de personnes âgées. + Les colocations solidaires offrent un logement à loyer modéré en échange d'un engagement au service de la collectivité, que ce soit dans une résidence, un quartier ou auprès de personnes âgées.

Au service d'une cause :  AFEVCoopColoc  - MaisonArticle1. + MaisonArticle1.

Cohabitation intergénérationnelle :  Cohabilis.

@@ -20,7 +20,7 @@ conditions_generales: - type: difficultes_acces_ou_frais_logement value: true conditions: - - Être mal logé, défavorisé ou rencontrer des difficultés financières et des difficultés d’insertion sociale. + - Vouloir s'engager au service des autres pendant quelques heures chaque semaine. - Se renseigner sur les critères d’admission des résidences, dont certaines sont réservées aux étudiants boursiers. prefix: l’ profils: @@ -29,3 +29,4 @@ profils: link: https://www.etudiant.gouv.fr/fr/les-colocations-solidaires-358 periodicite: ponctuelle type: bool +private: true diff --git a/data/benefits/javascript/caf-nord-aide-achat-equipement.yml b/data/benefits/javascript/caf-nord-aide-achat-equipement.yml index 0d589b8b2b..0298f8bffe 100644 --- a/data/benefits/javascript/caf-nord-aide-achat-equipement.yml +++ b/data/benefits/javascript/caf-nord-aide-achat-equipement.yml @@ -25,4 +25,4 @@ periodicite: autre legend: maximum montant: 1500 link: https://www.caf.fr/allocataires/caf-du-nord/offre-de-service/logement/le-pret-caf-equipement-mobiliermenager -form: https://www.caf.fr/sites/default/files/medias/598/Documents/Pr%C3%AAt%20%C3%A9quipement/DEQUIP_2023.pdf +form: https://www.caf.fr/sites/default/files/medias/598/Documents/Pr%C3%AAt%20%C3%A9quipement/DEQUIP_2025_d%C3%A9finitif.pdf diff --git a/data/benefits/javascript/caf-var-aide-bafa-approfondissement.yml b/data/benefits/javascript/caf-var-aide-bafa-approfondissement.yml index b64ab10e6f..70cd1dc2c0 100644 --- a/data/benefits/javascript/caf-var-aide-bafa-approfondissement.yml +++ b/data/benefits/javascript/caf-var-aide-bafa-approfondissement.yml @@ -28,5 +28,5 @@ unit: € periodicite: ponctuelle montant: 400 link: https://www.caf.fr/allocataires/caf-du-var/offre-de-service/vie-personnelle/je-suis-parent/aide-la-formation-bafa -form: https://www.caf.fr/sites/default/files/medias/831/Bafa/IMPRIME_aide_formation_moniteur.pdf +form: https://www.caf.fr/sites/default/files/medias/831/Bafa/IMPRIME%20_aide_bafa_hors_tpm.pdf instructions: https://www.caf.fr/allocataires/caf-du-var/offre-de-service/vie-personnelle/je-suis-parent/aide-la-formation-bafa diff --git a/data/benefits/javascript/cohesion-territoires-logement-social.yml b/data/benefits/javascript/cohesion-territoires-logement-social.yml index f12be2f645..29e92c2bd0 100644 --- a/data/benefits/javascript/cohesion-territoires-logement-social.yml +++ b/data/benefits/javascript/cohesion-territoires-logement-social.yml @@ -1,4 +1,4 @@ -label: logement social +label: demande de logement social institution: etat description: Le logement social est destiné aux personnes et aux familles dont les ressources ne dépassent pas un revenu maximum. @@ -6,18 +6,16 @@ description: Le logement social est destiné aux personnes du logement (Île-de-France, province, outre-mer). Aucun frais de dossier n’est réclamé lors de la demande ni lors de la signature du bail. Il n’est pas obligatoire de résider dans une commune pour y déposer un dossier. -prefix: le +prefix: la conditions_generales: - type: difficultes_acces_ou_frais_logement value: true profils: [] conditions: - - Effectuer votre demande de logement social via le téléservice ou avec le - formulaire papier à déposer au guichet. - - Consulter la liste des guichets existants en vous rendant sur le site internet de l’Union Sociale pour l’Habitat.. - - Renouveler chaque année votre demande jusqu’à obtention d’un logement. + - Effectuer votre demande de logement social en ligne ou en remplissant le formulaire papier à déposer au guichet. + - Consulter la liste des guichets dans lesquels vous pourrez être aidé pour effectuer votre demande de logement social. type: bool periodicite: autre -link: https://www.service-public.fr/particuliers/vosdroits/F869 +link: https://www.service-public.gouv.fr/particuliers/vosdroits/F10007 form: https://www.service-public.fr/particuliers/vosdroits/R149 teleservice: https://www.demande-logement-social.gouv.fr/ diff --git a/data/benefits/javascript/cohesion_territoires-aide-covoiturage-du-quotidien.yml b/data/benefits/javascript/cohesion_territoires-aide-covoiturage-du-quotidien.yml index 728c95cc08..fee0a70a58 100644 --- a/data/benefits/javascript/cohesion_territoires-aide-covoiturage-du-quotidien.yml +++ b/data/benefits/javascript/cohesion_territoires-aide-covoiturage-du-quotidien.yml @@ -18,3 +18,4 @@ periodicite: autre montant: 100 link: https://www.ecologie.gouv.fr/covoiturage instructions: https://www.ecologie.gouv.fr/covoiturage-en-france-avantages-et-reglementation-en-vigueur#scroll-nav__3 +private: true diff --git a/data/benefits/javascript/communaute-de-communes-rhone-lez-provence-aide-au-financement-du-permis.yml b/data/benefits/javascript/communaute-de-communes-rhone-lez-provence-aide-au-financement-du-permis.yml index f2ae72e7c0..696815dd0e 100644 --- a/data/benefits/javascript/communaute-de-communes-rhone-lez-provence-aide-au-financement-du-permis.yml +++ b/data/benefits/javascript/communaute-de-communes-rhone-lez-provence-aide-au-financement-du-permis.yml @@ -3,14 +3,14 @@ institution: cc-rhone-lez-provence description: La Communauté de Communes Rhône Lez Provence met en place une aide financière pour favoriser l’insertion professionnelle des jeunes par l'accès au permis - de conduire. Cette aide est attribuée en contrepartie d'un stage d’une durée - de 10 à 15 jours réalisé au sein de la collectivité. + de conduire. Cette aide est attribuée en contrepartie d'un stage citoyen d’une durée + de 5 jours réalisé dans une collectivité du territoire. prefix: l’ conditions_generales: - type: attached_to_institution - type: age operator: ">=" - value: 18 + value: 17 - type: age operator: "<=" value: 25 @@ -18,12 +18,13 @@ profils: [] conditions: - Résider sur une des 5 communes de Rhône Lez Provence depuis plus de 2 ans. - Vous engager dans un parcours d’insertion professionnelle. - - Vous inscrire dans une auto-école basée dans l'une des 5 communes du territoire. - - Signer un engagement de stage dans la collectivité. + - Avoir un projet professionnel nécessitant le permis de conduire. + - Vous inscrire dans une auto-école conventionnée dans l'une des 5 communes du territoire. + - Effectuer un stage citoyen de 5 jours dans une collectivité du territoire. interestFlag: _interetPermisDeConduire type: float unit: € periodicite: autre montant: 500 -link: https://ccrlp.fr/aide-permis/ -instructions: https://ccrlp.fr/aide-permis/ +link: https://ccrlp.fr/aide-au-permis-de-conduire-un-coup-de-pouce-pour-les-jeunes-du-territoire/ +instructions: https://ccrlp.fr/aide-au-permis-de-conduire-un-coup-de-pouce-pour-les-jeunes-du-territoire/ diff --git a/data/benefits/javascript/departement_landes-aide-au-financement-du-permis-de-conduire-permis-citoyen.yml b/data/benefits/javascript/departement_landes-aide-au-financement-du-permis-de-conduire-permis-citoyen.yml index de85a5af77..82bfd746a4 100644 --- a/data/benefits/javascript/departement_landes-aide-au-financement-du-permis-de-conduire-permis-citoyen.yml +++ b/data/benefits/javascript/departement_landes-aide-au-financement-du-permis-de-conduire-permis-citoyen.yml @@ -28,5 +28,5 @@ unit: € periodicite: ponctuelle legend: maximum montant: 450 -link: https://m.landes.fr/detail-une-aide?id_aide=161 -instructions: https://m.landes.fr/detail-une-aide?id_aide=161 +link: https://www.landes.fr/pack-jeunes-mobilite +instructions: https://www.landes.fr/pack-jeunes-mobilite diff --git "a/data/benefits/javascript/hauts-de-france-aide-\303\240-la-restauration-des-\303\251tudiants-boursiers-en-fili\303\250re-sanitaire-et-sociale.yml" "b/data/benefits/javascript/hauts-de-france-aide-\303\240-la-restauration-des-\303\251tudiants-boursiers-en-fili\303\250re-sanitaire-et-sociale.yml" index b57a82f4eb..4434244c05 100644 --- "a/data/benefits/javascript/hauts-de-france-aide-\303\240-la-restauration-des-\303\251tudiants-boursiers-en-fili\303\250re-sanitaire-et-sociale.yml" +++ "b/data/benefits/javascript/hauts-de-france-aide-\303\240-la-restauration-des-\303\251tudiants-boursiers-en-fili\303\250re-sanitaire-et-sociale.yml" @@ -31,3 +31,4 @@ type: bool unit: € periodicite: autre interestFlag: _interetAidesSanitaireSocial +private: true diff --git a/data/benefits/javascript/msa_maine_et_loire_aide_permis.yml b/data/benefits/javascript/msa_maine_et_loire_aide_permis.yml index 8dc37a4ff1..480d88f7d9 100644 --- a/data/benefits/javascript/msa_maine_et_loire_aide_permis.yml +++ b/data/benefits/javascript/msa_maine_et_loire_aide_permis.yml @@ -37,3 +37,4 @@ legend: maximum montant: 900 link: https://maineetloire.msa.fr/lfp/web/msa-de-maine-et-loire/aide-a-la-recherche-d-un-emploi-salarie instructions: https://maineetloire.msa.fr/lfp/web/msa-de-maine-et-loire/aide-a-la-recherche-d-un-emploi-salarie +private: true diff --git a/data/benefits/javascript/provence-alpes-cote-azur-e-pass-jeunes.yml b/data/benefits/javascript/provence-alpes-cote-azur-e-pass-jeunes.yml index 047e542ac9..b94920c60b 100644 --- a/data/benefits/javascript/provence-alpes-cote-azur-e-pass-jeunes.yml +++ b/data/benefits/javascript/provence-alpes-cote-azur-e-pass-jeunes.yml @@ -23,3 +23,4 @@ type: bool periodicite: ponctuelle link: https://www.maregionsud.fr/vos-aides/detail/e-pass-jeunes instructions: https://e-passjeunes.maregionsud.fr/index +private: true diff --git a/data/benefits/javascript/region-nouvelle-aquitaine-sejour-etudes-etranger.yml b/data/benefits/javascript/region-nouvelle-aquitaine-sejour-etudes-etranger.yml index 59e22b6e6a..cbfb0e9eab 100644 --- a/data/benefits/javascript/region-nouvelle-aquitaine-sejour-etudes-etranger.yml +++ b/data/benefits/javascript/region-nouvelle-aquitaine-sejour-etudes-etranger.yml @@ -1,7 +1,8 @@ label: Séjour d'étude à l'étranger institution: region_nouvelle_aquitaine -description: La Région finance en partie la réalisation d'un séjour d'études à - l'étranger d'une durée minimale de 8 semaines. +description: + La Région Nouvelle-Aquitaine finance en partie la réalisation d'un séjour d'études à + l'étranger d'une durée minimale de 8 semaines et d'une durée maximale de 26 semaines. prefix: les conditions_generales: - type: regions @@ -15,14 +16,14 @@ profils: - type: stagiaire conditions: [] conditions: - - Être inscrit ou inscrite dans un établissement de la Région et réaliser un séjour - d'études à l’étranger dans le cadre de votre cursus en formation initiale ou - continue. + - Être inscrit dans un établissement d’enseignement ou de formation de la Région Nouvelle-Aquitaine et réaliser un séjour + d'études à l’étranger dans le cadre de votre cursus en formation initiale ou continue. interestFlag: _interetEtudesEtranger type: float unit: € -periodicite: ponctuelle +periodicite: mensuelle legend: maximum -montant: 4500 -link: https://les-aides.nouvelle-aquitaine.fr/jeunesse/sejours-detudes-letranger-public-post-bac-annee-academique-20222023 -teleservice: https://mes-demarches.nouvelle-aquitaine.fr/craPortailFO/externe/creationDossier.do?codeDispositif=MI_VOLET3 +montant: 440 +link: https://les-aides.nouvelle-aquitaine.fr/jeunesse/sejours-detudes-letranger-post-bac-annee-academique-2025-2026 +is_teleservice_need_register: true +teleservice: https://rnaconnect.nouvelle-aquitaine.pro/realms/external/protocol/openid-connect/auth?response_type=code&client_id=mes-demarches.nouvelle-aquitaine.fr&redirect_uri=https%3A%2F%2Fmes-demarches.nouvelle-aquitaine.fr%2FcraPortailFO%2Fsso%2Flogin?codeDispositif%3DMI_VOLET3_25&state=67ca7cb5-42d6-4172-9c3f-a56ae5995925&login=true&scope=openid diff --git a/data/benefits/javascript/region-nouvelle-aquitaine-stage-etranger.yml b/data/benefits/javascript/region-nouvelle-aquitaine-stage-etranger.yml index 7e2bf9fd80..b8c696c4e9 100644 --- a/data/benefits/javascript/region-nouvelle-aquitaine-stage-etranger.yml +++ b/data/benefits/javascript/region-nouvelle-aquitaine-stage-etranger.yml @@ -1,11 +1,14 @@ label: stages à l'étranger (post-bac) institution: region_nouvelle_aquitaine -description: La Région finance une partie de votre stage à l'étranger de 2 semaines minimum. +description: La Région Nouvelle-Aquitaine finance une partie de votre stage à l'étranger d'une durée minimale de 2 semaines et d'une durée maximale de 26 semaines. prefix: les conditions_generales: - type: regions values: - "75" + - type: age + operator: "<" + value: 31 profils: - type: enseignement_superieur conditions: [] @@ -15,13 +18,15 @@ profils: conditions: [] conditions: - Ne pas bénéficier, pour le même stage, d’une autre aide à la mobilité de la - Région ou d’une indemnisation mensuelle de stage supérieure à 700 €. + Région Nouvelle-Aquitaine, ou d'une aide à la mobilité internationale (AMI), ou d'une aide Erasmus+. + - Ne pas bénéficier d’une indemnisation mensuelle de stage supérieure à 700 €. - Ne pas dépasser le plafond de revenus fixé à 50 000 €. interestFlag: _interetEtudesEtranger type: float unit: € periodicite: mensuelle legend: maximum -montant: 400 -link: https://les-aides.nouvelle-aquitaine.fr/jeunesse/stages-letranger-public-post-bac-annee-academique-2022-2023#:~:text=Crit%C3%A8res%20de%20s%C3%A9lection&text=Dur%C3%A9e%20de%202%20semaines%20cons%C3%A9cutives,sera%20faite%20pour%20les%20BTS). -teleservice: https://rnaconnect.nouvelle-aquitaine.pro/realms/external/protocol/openid-connect/auth?response_type=code&client_id=mes-demarches.nouvelle-aquitaine.fr&redirect_uri=https%3A%2F%2Fmes-demarches.nouvelle-aquitaine.fr%2FcraPortailFO%2Fsso%2Flogin?codeDispositif%3DMI_VOLET2_22&state=61cd21dd-94b3-4a63-8bfd-da973b579f9b&login=true&scope=openid +montant: 440 +link: https://les-aides.nouvelle-aquitaine.fr/jeunesse/stages-letranger-post-bac-annee-academique-2025-2026 +is_teleservice_need_register: true +teleservice: https://rnaconnect.nouvelle-aquitaine.pro/realms/external/protocol/openid-connect/auth?response_type=code&client_id=mes-demarches.nouvelle-aquitaine.fr&redirect_uri=https%3A%2F%2Fmes-demarches.nouvelle-aquitaine.fr%2FcraPortailFO%2Fsso%2Flogin?codeDispositif%3DMI_VOLET2_25&state=1ae97feb-4ce2-489f-9724-57bf1b4e3102&login=true&scope=openid diff --git "a/data/benefits/javascript/region_nouvelle_aquitaine-stages-\303\240-l\303\251tranger-\342\200\223-infra-bac.yml" "b/data/benefits/javascript/region_nouvelle_aquitaine-stages-\303\240-l\303\251tranger-\342\200\223-infra-bac.yml" index 85e3e758ae..efe01e8d67 100644 --- "a/data/benefits/javascript/region_nouvelle_aquitaine-stages-\303\240-l\303\251tranger-\342\200\223-infra-bac.yml" +++ "b/data/benefits/javascript/region_nouvelle_aquitaine-stages-\303\240-l\303\251tranger-\342\200\223-infra-bac.yml" @@ -1,12 +1,15 @@ label: stages à lʼétranger pour les lycéens, stagiaires et apprentis (public infra-bac) institution: region_nouvelle_aquitaine description: La Région finance une partie de votre stage à lʼétranger d'une - durée de 2 à 4 semaines. + durée de 2 à 4 semaines. Cette aide est cumulable avec le dispositif Erasmus +. prefix: les conditions_generales: - type: regions values: - "75" + - type: age + operator: "<" + value: 31 profils: - type: lyceen conditions: [] @@ -21,5 +24,6 @@ unit: € periodicite: mensuelle legend: maximum montant: 400 -link: https://les-aides.nouvelle-aquitaine.fr/amenagement-du-territoire/stages-letranger-public-infra-bac +link: https://les-aides.nouvelle-aquitaine.fr/amenagement-du-territoire/stages-letranger-infra-bac-annee-academique-2025-2026 +is_teleservice_need_register: true teleservice: https://rnaconnect.nouvelle-aquitaine.pro/realms/external/protocol/openid-connect/auth?response_type=code&client_id=mes-demarches.nouvelle-aquitaine.fr&redirect_uri=https%3A%2F%2Fmes-demarches.nouvelle-aquitaine.fr%2FcraPortailFO%2Fsso%2Flogin?codeDispositif%3DMI_VOLET1&state=84e5e705-4c28-40a0-bbad-34bbd3d37848&login=true&scope=openid diff --git a/data/benefits/javascript/residences-etudiantes-loyer-modere.yml b/data/benefits/javascript/residences-etudiantes-loyer-modere.yml new file mode 100644 index 0000000000..13b356fbc8 --- /dev/null +++ b/data/benefits/javascript/residences-etudiantes-loyer-modere.yml @@ -0,0 +1,37 @@ +label: Résidences à loyer modéré pour les étudiants, stagiaires et apprentis +institution: etat +description: > + Certains bailleurs sociaux et associations proposent des logements étudiants à loyer modéré : studios, T2 ou colocations meublées, souvent situés près des campus. + Ces résidences sont destinées aux étudiants, apprentis et stagiaires aux revenus modestes et peuvent donner droit aux aides au logement. + La demande se fait directement auprès des gestionnaires de ces résidences. +conditions_generales: + - type: age + operator: ">=" + value: 16 + - type: age + operator: <= + value: 30 + - type: difficultes_acces_ou_frais_logement + value: true +conditions: + - Effectuer une recherche sur la plateforme nationale dédiée au logement social pour étudiants. Découvrir Mon Logement Etudiant. + - Vous renseigner sur les critères d’admission et prendre contact directement avec les gestionnaires de ces résidences via leurs sites internet pour plus d'informations. + - Noter que certaines résidences demandent aux étudiants d'avoir effectué une demande de logement social + et d'avoir obtenu leur numéro unique d'enregistrement avant de déposer un dossier de demande dans la résidence. +prefix: les +profils: + - type: enseignement_superieur + conditions: [] + - type: apprenti + conditions: [] + - type: stagiaire + conditions: [] + - type: lyceen + conditions: + - type: annee_etude + values: + - terminale +link: https://monlogementetudiant.beta.gouv.fr/?utm_source=mes-aides&utm_medium=referral&utm_campaign=residences-etudiantes&utm_content=plus-d-informations +periodicite: ponctuelle +type: bool +top: 2 diff --git a/data/benefits/javascript/ville-lille-aide-au-financement-du-permis-de-conduire.yml b/data/benefits/javascript/ville-lille-aide-au-financement-du-permis-de-conduire.yml index 5a16ce24a7..3f52cbe2cb 100644 --- a/data/benefits/javascript/ville-lille-aide-au-financement-du-permis-de-conduire.yml +++ b/data/benefits/javascript/ville-lille-aide-au-financement-du-permis-de-conduire.yml @@ -1,11 +1,10 @@ -label: Aide au financement du permis de conduire +label: dispositif d’aide financière Parcours permis institution: ville_lille -description: Cette aide s’adresse aux Lillois et Lilloises en recherche active - d’emploi, âgés de 18 à 25 ans (ou 30 ans s’il s’agit d’une création - d’entreprise ou de son propre emploi) et non imposables sur le revenu. Si vous - remplissez les conditions, votre demande est à effectuer au 06 25 20 74 02 ou - en écrivant à jeunesse@mairie-lille.fr. -prefix: l’ +description: Le dispositif d’aide financière Parcours permis s’adresse aux + Lillois et Lilloises en recherche active d’emploi, âgés de 18 à 25 ans, sous + conditions. Cette aide n’est pas destinée aux étudiants en formation + initiale. +prefix: le conditions_generales: - type: communes values: @@ -23,24 +22,26 @@ profils: conditions: [] - type: chomeur conditions: [] - - type: independant - conditions: [] - type: beneficiaire_rsa conditions: [] + - type: inactif + conditions: [] conditions: - - Justifier de l’une des situations suivantes :  Etre inscrit dans une - formation professionnelle (alternance, apprentissage, attestation de - formation). Etre en situation professionnelle précaire (bulletins de salaire - / contrat de travail). Etre suivi par la Mission Locale dans le cadre d’un - parcours d’insertion professionnelle (contrat d’insertion). -voluntary_conditions: - - Effectuer 25 heures de travail bénévole auprès d’associations ou - d’institutions Lilloises. + - "Résider à Lille et être âgé de 18 à 25 ans au jour du dépôt de la + demande (ou moins de 30 ans dans les cas suivants : création d’entreprise, + création de son propre emploi, personne en situation de handicap)." + - "Être dans l'une des situations suivantes : être inscrit dans un parcours de formation relevant de l’alternance ou de + l’apprentissage, ou être en situation professionnelle précaire (CDD de moins de 6 mois, intérimaire), ou être inscrit à Lille + Avenirs (Mission Locale) dans le cadre d’un parcours d’insertion professionnelle, ou être inscrit à France Travail." + - "Être non imposable sur les revenus ou rattaché à un foyer fiscal non imposable." + - S’engager à effectuer 25 heures de bénévolat auprès d’une association lilloise. + Pour trouver une association, rendez-vous sur Place des Assos. interestFlag: _interetPermisDeConduire type: float unit: € -periodicite: autre -legend: "" +periodicite: ponctuelle +legend: maximum montant: 1000 -link: https://www.lille.fr/Jeune2/Le-dispositif-d-aide-financiere-parcours-permis -instructions: https://www.lille.fr/Jeune2/Le-dispositif-d-aide-financiere-parcours-permis +link: https://www.lille.fr/Jeune2/Le-dispositif-d-aide-financiere-Parcours-permis +teleservice: https://formulaires.mesdemarches.lille.fr/jeunesse/demander-une-aide-financiere-parcours-permis/?cancelurl=https%3A//mesdemarches.lille.fr/ +instructions: https://www.lille.fr/Jeune2/Le-dispositif-d-aide-financiere-Parcours-permis diff --git a/data/benefits/javascript/ville_colomiers_bourse_permis_conduire.yml b/data/benefits/javascript/ville_colomiers_bourse_permis_conduire.yml index 2601400b3e..0d45149665 100644 --- a/data/benefits/javascript/ville_colomiers_bourse_permis_conduire.yml +++ b/data/benefits/javascript/ville_colomiers_bourse_permis_conduire.yml @@ -29,3 +29,4 @@ unit: € periodicite: ponctuelle montant: 500 link: https://www.ville-colomiers.fr/mon-quotidien/solidarites/permis-jeunes-citoyens +private: true diff --git a/data/benefits/javascript/ville_lille_aide_bafa.yml b/data/benefits/javascript/ville_lille_aide_bafa.yml new file mode 100644 index 0000000000..c44327ba3a --- /dev/null +++ b/data/benefits/javascript/ville_lille_aide_bafa.yml @@ -0,0 +1,32 @@ +label: dispositif d’aide financière au BAFA +institution: ville_lille +description: + Une bourse de 300 € pour soutenir les jeunes Lillois et Lilloises de moins de + 25 ans dans leur formation au BAFA. +prefix: le +conditions_generales: + - type: communes + values: + - "59350" + - type: age + operator: ">=" + value: 15 + - type: age + operator: <= + value: 25 +profils: [] +conditions: + - Être non imposable sur les revenus ou rattaché à un foyer fiscal non + imposable. + - Ne pas avoir engagé son parcours de formation au BAFA. + - S’engager à effectuer 25 heures de bénévolat auprès d’une association lilloise + (Anticiper cet engagement ne garantit pas la validation du dossier). + Pour trouver une association, rendez-vous sur Place des Assos. +interestFlag: _interetBafa +type: float +unit: € +periodicite: ponctuelle +montant: 300 +link: https://www.lille.fr/Jeune2/Dispositif-d-aide-financiere-au-BAFA +teleservice: https://formulaires.mesdemarches.lille.fr/jeunesse/demander-une-aide-financiere-pour-le-bafa/?cancelurl=https%3A//mesdemarches.lille.fr/ +instructions: https://www.lille.fr/Jeune2/Dispositif-d-aide-financiere-au-BAFA diff --git a/data/benefits/javascript/ville_paris_aide_logement_etudiant_aile.yml b/data/benefits/javascript/ville_paris_aide_logement_etudiant_aile.yml index 16bbe1fc62..6ac8444929 100644 --- a/data/benefits/javascript/ville_paris_aide_logement_etudiant_aile.yml +++ b/data/benefits/javascript/ville_paris_aide_logement_etudiant_aile.yml @@ -3,7 +3,7 @@ institution: paris description: La Ville de Paris a mis en place l’AILE afin de soutenir les étudiants en situation de précarité qui doivent trouver un appartement dans le parc privé. Cette aide - comprise entre 500 et 1000 euros est gérée par le Crous de Paris. Elle est ouverte + comprise entre 500 et 1000 euros est gérée par le CROUS de Paris. Elle est ouverte aux étudiants boursiers et aux étudiants bénéficiaires du repas à 1 € inscrits dans les académies de Paris, Créteil et Versailles et vivant à Paris. prefix: l’ @@ -15,11 +15,13 @@ profils: conditions: - Être inscrit dans un établissement d’enseignement supérieur relevant des académies de Paris, Créteil ou Versailles. - - Être boursier sur critères sociaux ou bénéficiaire de l’aide spécifique allocation annuelle - (ASAA) des CROUS de Paris, Créteil, Versailles pour l’année universitaire en cours - ou être bénéficiaire du repas à 1 Euro. - - Être titulaire d’un bail pour un logement dans Paris, signé entre le 1er avril 2023 et le 31 mars 2024, - hors résidences universitaires conventionnées. + - Être boursier sur critères sociaux ou bénéficiaire de l’aide spécifique allocation annuelle (ASAA), + ou de l’aide spécifique allocation ponctuelle (ASAP) ou être bénéficiaire du repas à 1 Euro + des CROUS de Paris, Créteil ou Versailles pour l’année universitaire en cours. + - Être titulaire d’un contrat de location pour un logement situé à Paris, + signé entre le mois de mars précédant l’année universitaire et le mois d’avril + de l’année universitaire en cours, d’une durée minimale de neuf mois. + Les logements situés en résidences universitaires conventionnées ne sont pas éligibles. type: float unit: € periodicite: ponctuelle @@ -27,4 +29,4 @@ legend: "maximum" montant: 1000 link: https://www.paris.fr/pages/l-aide-a-l-installation-dans-un-logement-pour-les-etudiants-a-i-l-e-2257 instructions: https://mie.paris.fr/aile/ -form: https://mie.paris.fr//app/uploads/2023/08/dossier-inscription-aile-2023-2024-1.pdf +form: https://betagouv.github.io/aides-jeunes-files/public/dossier-inscription-aile-2025-2026.pdf diff --git a/data/institutions/ca_des_deux_baies_en_montreuillois.yml b/data/institutions/ca_des_deux_baies_en_montreuillois.yml new file mode 100644 index 0000000000..a91f5554c2 --- /dev/null +++ b/data/institutions/ca_des_deux_baies_en_montreuillois.yml @@ -0,0 +1,5 @@ +name: Communauté d'agglomération des Deux Baies en Montreuillois +imgSrc: img/institutions/logo_ca_des_deux_baies_en_montreuillois.png +prefix: de la +type: epci +code_siren: "200069029" diff --git a/data/institutions/ca_lagglo_foix_varilhes.yml b/data/institutions/ca_lagglo_foix_varilhes.yml new file mode 100644 index 0000000000..f949482c07 --- /dev/null +++ b/data/institutions/ca_lagglo_foix_varilhes.yml @@ -0,0 +1,5 @@ +name: Communauté d'agglomération L'Agglo Foix-Varilhes +imgSrc: img/institutions/logo_ca_lagglo_foix_varilhes.png +prefix: de la +type: epci +code_siren: "200067791" diff --git a/data/institutions/cc_du_sud_artois.yml b/data/institutions/cc_du_sud_artois.yml new file mode 100644 index 0000000000..eabfc683ae --- /dev/null +++ b/data/institutions/cc_du_sud_artois.yml @@ -0,0 +1,5 @@ +name: Communauté de communes du Sud-Artois +imgSrc: img/institutions/logo_cc_du_sud_artois.png +prefix: de la +type: epci +code_siren: "200035442" diff --git a/data/institutions/cc_falaises_du_talou.yml b/data/institutions/cc_falaises_du_talou.yml new file mode 100644 index 0000000000..8ce8036fbf --- /dev/null +++ b/data/institutions/cc_falaises_du_talou.yml @@ -0,0 +1,5 @@ +name: Communauté de communes Falaises du Talou +imgSrc: img/institutions/logo_cc_falaises_du_talou.png +prefix: de la +type: epci +code_siren: "247600729" diff --git a/data/institutions/cc_flandre_lys.yml b/data/institutions/cc_flandre_lys.yml new file mode 100644 index 0000000000..a379a01dd6 --- /dev/null +++ b/data/institutions/cc_flandre_lys.yml @@ -0,0 +1,5 @@ +name: Communauté de communes Flandre Lys +imgSrc: img/institutions/logo_cc_flandre_lys.png +prefix: de la +type: epci +code_siren: "245900758" diff --git a/data/institutions/ccas-de-redon.yml b/data/institutions/ccas-de-redon.yml new file mode 100644 index 0000000000..f75948df21 --- /dev/null +++ b/data/institutions/ccas-de-redon.yml @@ -0,0 +1,5 @@ +name: CCAS de Redon +imgSrc: img/institutions/logo-ccas-redon.png +type: autre +code_insee: "" +code_siren: "263502221" diff --git a/data/institutions/ville_demouville.yml b/data/institutions/ville_demouville.yml new file mode 100644 index 0000000000..fb6e3ff79b --- /dev/null +++ b/data/institutions/ville_demouville.yml @@ -0,0 +1,6 @@ +name: Ville de Démouville +imgSrc: img/institutions/logo_ville_demouville.png +prefix: de la +type: commune +code_insee: "14221" +code_siren: "211402219" diff --git a/netlify.toml b/netlify.toml index c7d3022883..485d410049 100644 --- a/netlify.toml +++ b/netlify.toml @@ -9,4 +9,4 @@ status = 200 [build.environment] - NODE_VERSION = "20.14.0" + NODE_VERSION = "24" diff --git a/openfisca/requirements.txt b/openfisca/requirements.txt index 6281d0bd0f..01cd758856 100644 --- a/openfisca/requirements.txt +++ b/openfisca/requirements.txt @@ -1,7 +1,7 @@ gunicorn>=21.2.0 pytest==8.3.3 -Openfisca-France==172.0.6 -Openfisca-Core[web-api]==43.3.10 -OpenFisca-France-Local[excel-reader]==6.17.7 -Openfisca-Paris==5.5.12 -typing_extensions==4.12.2 +Openfisca-France==174.2.40 +Openfisca-Core[web-api]==43.5.0 +OpenFisca-France-Local[excel-reader]==6.17.8 +Openfisca-Paris==5.5.13 +typing_extensions==4.14.1 diff --git a/package-lock.json b/package-lock.json index 2136982d12..a316f5e978 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "12.1.3", "license": "AGPL-3.0", "dependencies": { - "@betagouv/aides-velo": "^3.2.0", + "@betagouv/aides-velo": "^3.4.0", "@betagouv/jamstack-loader": "^1.0.0", "@etalab/decoupage-administratif": "^4.0.0", "@gouvfr/dsfr": "^1.14.0", @@ -1546,9 +1546,10 @@ "license": "MIT" }, "node_modules/@betagouv/aides-velo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@betagouv/aides-velo/-/aides-velo-3.2.0.tgz", - "integrity": "sha512-DBXiTnzD3tgmyVHOjjdvyvd6rntm/1MpOi9Y+vXPfOWeKtslf4FUgn9DfYfNru6SyddcmZQna58NF+dkuIDqUQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@betagouv/aides-velo/-/aides-velo-3.4.0.tgz", + "integrity": "sha512-Ylu6wnmpRerswaW7biOyw61oKIYkq36tlfRnm+ju9Oc1+H6R19daeIempVYG6BrihX4csxw1+2GaBw71ubI4vA==", + "license": "Apache-2.0", "dependencies": { "@etalab/decoupage-administratif": "^5.2.0", "publicodes": "^1.8.5" @@ -18542,9 +18543,9 @@ "dev": true }, "@betagouv/aides-velo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@betagouv/aides-velo/-/aides-velo-3.2.0.tgz", - "integrity": "sha512-DBXiTnzD3tgmyVHOjjdvyvd6rntm/1MpOi9Y+vXPfOWeKtslf4FUgn9DfYfNru6SyddcmZQna58NF+dkuIDqUQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@betagouv/aides-velo/-/aides-velo-3.4.0.tgz", + "integrity": "sha512-Ylu6wnmpRerswaW7biOyw61oKIYkq36tlfRnm+ju9Oc1+H6R19daeIempVYG6BrihX4csxw1+2GaBw71ubI4vA==", "requires": { "@etalab/decoupage-administratif": "^5.2.0", "publicodes": "^1.8.5" diff --git a/package.json b/package.json index 4b45c7d408..81dc2dad4b 100644 --- a/package.json +++ b/package.json @@ -51,10 +51,11 @@ "tools:test-benefits-geographical-constraint-consistency": "node --loader ts-node/esm ./tools/test-benefits-geographical-constraint-consistency", "tools:test-definition-periods": "node --loader ts-node/esm ./tools/test-definition-periods", "tools:test-iframe-generation": "./tools/iframe-build-control.sh", - "migrate": "node --loader ts-node/esm ./backend/lib/migrations/apply.ts --all" + "migrate": "node --loader ts-node/esm ./backend/lib/migrations/apply.ts --all", + "tools:add-milestone": "node --loader ts-node/esm ./tools/add-milestone-to-merged-prs.ts" }, "dependencies": { - "@betagouv/aides-velo": "^3.2.0", + "@betagouv/aides-velo": "^3.4.0", "@betagouv/jamstack-loader": "^1.0.0", "@etalab/decoupage-administratif": "^4.0.0", "@gouvfr/dsfr": "^1.14.0", diff --git a/public/img/institutions/logo-ccas-redon.png b/public/img/institutions/logo-ccas-redon.png new file mode 100644 index 0000000000..5be8db3aa5 Binary files /dev/null and b/public/img/institutions/logo-ccas-redon.png differ diff --git a/public/img/institutions/logo_ca_des_deux_baies_en_montreuillois.png b/public/img/institutions/logo_ca_des_deux_baies_en_montreuillois.png new file mode 100644 index 0000000000..6350c826ad Binary files /dev/null and b/public/img/institutions/logo_ca_des_deux_baies_en_montreuillois.png differ diff --git a/public/img/institutions/logo_ca_lagglo_foix_varilhes.png b/public/img/institutions/logo_ca_lagglo_foix_varilhes.png new file mode 100644 index 0000000000..4e52dbb4ac Binary files /dev/null and b/public/img/institutions/logo_ca_lagglo_foix_varilhes.png differ diff --git a/public/img/institutions/logo_cc_du_sud_artois.png b/public/img/institutions/logo_cc_du_sud_artois.png new file mode 100644 index 0000000000..db0ad2295b Binary files /dev/null and b/public/img/institutions/logo_cc_du_sud_artois.png differ diff --git a/public/img/institutions/logo_cc_falaises_du_talou.png b/public/img/institutions/logo_cc_falaises_du_talou.png new file mode 100644 index 0000000000..4f708572a4 Binary files /dev/null and b/public/img/institutions/logo_cc_falaises_du_talou.png differ diff --git a/public/img/institutions/logo_cc_flandre_lys.png b/public/img/institutions/logo_cc_flandre_lys.png new file mode 100644 index 0000000000..f95d74cbc2 Binary files /dev/null and b/public/img/institutions/logo_cc_flandre_lys.png differ diff --git a/public/img/institutions/logo_ville_de_lille.png b/public/img/institutions/logo_ville_de_lille.png index 17553469bc..d2d08641ae 100644 Binary files a/public/img/institutions/logo_ville_de_lille.png and b/public/img/institutions/logo_ville_de_lille.png differ diff --git a/public/img/institutions/logo_ville_demouville.png b/public/img/institutions/logo_ville_demouville.png new file mode 100644 index 0000000000..7a754f7a0c Binary files /dev/null and b/public/img/institutions/logo_ville_demouville.png differ diff --git a/src/components/benefit-cta.vue b/src/components/benefit-cta.vue index c417cbefa7..5329369453 100644 --- a/src/components/benefit-cta.vue +++ b/src/components/benefit-cta.vue @@ -85,30 +85,35 @@ const ctas = computed(() => { >
  • Créer un compte ou se connecter sur la plateforme ci-dessous
  • - - - +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    +
    +
    +

    + Aides pour les résidants de {{ name }} +
    + {{ formatTotalCount(totalBenefitsCount, "aide") }} +
    +

    + +
    +

    + Toutes les aides financières proposées aux résidants de + {{ name }} en matière de + logement, transport, santé, formation, emploi, culture, sport et + alimentation. +

    +
    +
    + + + +
    + + + diff --git a/src/components/mes-aides.org/layout.vue b/src/components/mes-aides.org/layout.vue index 6881e18944..c552ec3ce9 100644 --- a/src/components/mes-aides.org/layout.vue +++ b/src/components/mes-aides.org/layout.vue @@ -40,9 +40,6 @@
    -
    - -
    diff --git a/src/views/preparer-rentree-etudiante-logement-budget-aides.vue b/src/views/preparer-rentree-etudiante-logement-budget-aides.vue index dde02a13cc..78303c0f7e 100644 --- a/src/views/preparer-rentree-etudiante-logement-budget-aides.vue +++ b/src/views/preparer-rentree-etudiante-logement-budget-aides.vue @@ -1,6 +1,7 @@ + + diff --git a/src/views/villes/lille.vue b/src/views/villes/lille.vue new file mode 100644 index 0000000000..a50115499a --- /dev/null +++ b/src/views/villes/lille.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/villes/lyon.vue b/src/views/villes/lyon.vue new file mode 100644 index 0000000000..2f86a9beb5 --- /dev/null +++ b/src/views/villes/lyon.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/villes/marseille.vue b/src/views/villes/marseille.vue new file mode 100644 index 0000000000..2f0656bbbd --- /dev/null +++ b/src/views/villes/marseille.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/villes/montpellier.vue b/src/views/villes/montpellier.vue new file mode 100644 index 0000000000..8e4866c052 --- /dev/null +++ b/src/views/villes/montpellier.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/villes/nantes.vue b/src/views/villes/nantes.vue new file mode 100644 index 0000000000..243fd87239 --- /dev/null +++ b/src/views/villes/nantes.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/villes/nice.vue b/src/views/villes/nice.vue new file mode 100644 index 0000000000..a20a573075 --- /dev/null +++ b/src/views/villes/nice.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/villes/paris.vue b/src/views/villes/paris.vue new file mode 100644 index 0000000000..eac67a97c7 --- /dev/null +++ b/src/views/villes/paris.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/villes/rouen.vue b/src/views/villes/rouen.vue new file mode 100644 index 0000000000..b5dc26840a --- /dev/null +++ b/src/views/villes/rouen.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/villes/strasbourg.vue b/src/views/villes/strasbourg.vue new file mode 100644 index 0000000000..8667ec2805 --- /dev/null +++ b/src/views/villes/strasbourg.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/villes/toulouse.vue b/src/views/villes/toulouse.vue new file mode 100644 index 0000000000..0ee7425228 --- /dev/null +++ b/src/views/villes/toulouse.vue @@ -0,0 +1,7 @@ + + + diff --git a/tools/add-milestone-to-merged-prs.ts b/tools/add-milestone-to-merged-prs.ts new file mode 100644 index 0000000000..ebff59818e --- /dev/null +++ b/tools/add-milestone-to-merged-prs.ts @@ -0,0 +1,228 @@ +/* + Script: add-milestone-to-merged-prs.ts + Objectif: appliquer un milestone à toutes les PRs TERMINÉES (mergées ou fermées) dont la date de fin (closed_at ou merged) tombe dans une fenêtre temporelle. Les PR ouvertes sont ignorées. + + Options: + --milestone "Titre" (obligatoire) + --from YYYY-MM-DD (début inclus) | exclusif avec --month + --to YYYY-MM-DD (fin inclus) | exclusif avec --month + --month YYYY-MM (calcule from/to automatiquement) + --dry-run (simulation sans écriture) + --verbose (logs supplémentaires) + + Exemples: + npm run tools:add-milestone -- --milestone 'BC juin 2025' --month 2025-06 --verbose --dry-run + npm run tools:add-milestone -- --milestone 'BC avril-mai 2025' --from 2025-04-01 --to 2025-05-31 --verbose + + Bonnes pratiques: + - Toujours lancer un dry-run avant application réelle. +*/ + +import process from "node:process" +import { execSync } from "node:child_process" +import { setTimeout as delay } from "node:timers/promises" + +interface Args { + milestone: string + from: string + to: string + month?: string + dryRun: boolean + verbose: boolean +} + +const OWNER = "betagouv" +const REPO = "aides-jeunes" + +function parseArgs(): Args { + const argv = process.argv.slice(2) + const args: Partial = {} + for (let i = 0; i < argv.length; i++) { + switch (argv[i]) { + case "--milestone": + args.milestone = argv[++i] + break + case "--from": + args.from = argv[++i] + break + case "--to": + args.to = argv[++i] + break + case "--dry-run": + args.dryRun = true + break + case "--verbose": + args.verbose = true + break + case "--month": + args.month = argv[++i] + break + } + } + if (!args.milestone) throw new Error("Argument --milestone obligatoire.") + if (args.month) { + if (args.from || args.to) + throw new Error("Ne pas combiner --month avec --from/--to.") + if (!/^\d{4}-\d{2}$/.test(args.month)) + throw new Error("Format attendu pour --month: YYYY-MM") + const [year, month] = args.month.split("-").map(Number) + const start = new Date(Date.UTC(year, month - 1, 1)) + const end = new Date(Date.UTC(year, month, 0)) + args.from = start.toISOString().slice(0, 10) + args.to = end.toISOString().slice(0, 10) + } + if (!args.from) + throw new Error("Argument --from manquant (ou fournir --month).") + if (!args.to) throw new Error("Argument --to manquant (ou fournir --month).") + return { + milestone: args.milestone!, + from: args.from!, + to: args.to!, + dryRun: !!args.dryRun, + verbose: !!args.verbose, + month: args.month, + } +} + +function resolveToken(): string { + if (process.env.GITHUB_TOKEN) return process.env.GITHUB_TOKEN.trim() + try { + return execSync("gh auth token", { encoding: "utf8" }).trim() + } catch { + throw new Error( + "Token introuvable. Définir GITHUB_TOKEN ou exécuter 'gh auth login'.", + ) + } +} + +async function githubRequest( + url: string, + init: RequestInit = {}, +): Promise { + const token = resolveToken() + const res = await fetch(url, { + ...init, + headers: { + Accept: "application/vnd.github+json", + Authorization: `Bearer ${token}`, + ...init.headers, + }, + }) + if (!res.ok) { + const text = await res.text() + throw new Error(`GitHub API ${res.status} ${res.statusText} -> ${text}`) + } + return res.json() as Promise +} + +async function findMilestoneId(title: string): Promise { + let page = 1 + while (true) { + const milestones: any[] = await githubRequest( + `https://api.github.com/repos/${OWNER}/${REPO}/milestones?state=all&per_page=100&page=${page}`, + ) + if (!milestones.length) break + const found = milestones.find((m) => m.title === title) + if (found) return found.number + page++ + await delay(200) + } + throw new Error(`Milestone '${title}' introuvable. Le créer puis relancer.`) +} + +interface SearchItem { + number: number + title: string + created_at: string + closed_at?: string +} + +// Recherche des PR terminées dans la fenêtre par date de fin (merge ou fermeture) +async function searchFinishedPRs( + from: string, + to: string, +): Promise { + const range = `${from}..${to}` + const queries = [ + `repo:${OWNER}/${REPO} is:pr merged:${range}`, + `repo:${OWNER}/${REPO} is:pr is:closed -is:merged closed:${range}`, + ] + const all: Map = new Map() + for (const raw of queries) { + // On URL-encode la requête GitHub Search pour l'injecter comme paramètre 'q'. + const encodedQuery = encodeURIComponent(raw) + let page = 1 + while (true) { + const data = await githubRequest<{ items: SearchItem[] }>( + `https://api.github.com/search/issues?q=${encodedQuery}&per_page=100&page=${page}`, + ) + if (!data.items.length) break + for (const it of data.items) all.set(it.number, it) + if (data.items.length < 100) break + page++ + } + } + return [...all.values()] +} + +async function assignMilestone( + prNumber: number, + milestoneNumber: number, + dryRun: boolean, + verbose: boolean, +): Promise { + if (dryRun) { + if (verbose) + console.log( + `[DRY-RUN] PATCH issue ${prNumber} milestone=${milestoneNumber}`, + ) + return + } + await githubRequest( + `https://api.github.com/repos/${OWNER}/${REPO}/issues/${prNumber}`, + { + method: "PATCH", + body: JSON.stringify({ milestone: milestoneNumber }), + headers: { "Content-Type": "application/json" }, + }, + ) + if (verbose) console.log(`Milestone appliqué à PR #${prNumber}`) +} + +async function main() { + const args = parseArgs() + const milestoneId = await findMilestoneId(args.milestone) + if (args.verbose) + console.log( + `Milestone: '${args.milestone}' -> ${milestoneId} | Fenêtre ${args.from}..${args.to}`, + ) + const prs = await searchFinishedPRs(args.from, args.to) + console.log( + `PR terminées dans fenêtre ${args.from}..${args.to}: ${prs.length}`, + ) + if (!prs.length) { + console.log("Aucune PR à traiter.") + return + } + let assigned = 0 + for (const pr of prs) { + if (args.dryRun) { + const creation = pr.created_at.slice(0, 10) + const fin = pr.closed_at ? pr.closed_at.slice(0, 10) : "(ouverte)" + console.log( + `[DRY-RUN] #${pr.number} fin=${fin} créée=${creation} -> '${args.milestone}' | ${pr.title}`, + ) + } + await assignMilestone(pr.number, milestoneId, args.dryRun, args.verbose) + assigned++ + await delay(100) + } + console.log( + `Terminé. Milestone ${args.dryRun ? "simulé pour" : "appliqué à"} ${assigned} PR(s).`, + ) +} + +main().catch((err) => { + console.error("Erreur:", err.message) + process.exit(1) +}) diff --git a/tools/mjml.ts b/tools/mjml.ts index 68295b27b0..f3d9e8b5d8 100644 --- a/tools/mjml.ts +++ b/tools/mjml.ts @@ -5,6 +5,7 @@ import configMongoose from "../backend/config/mongoose.js" import config from "../backend/config/index.js" import { EmailType } from "../lib/enums/messaging.js" import express from "express" +import { rateLimit } from "express-rate-limit" import Followups from "../backend/models/followup.js" // To load the simulation model in mongoose import "../backend/models/simulation.js" @@ -31,8 +32,17 @@ app.engine(".html", __express) app.set("views", new URL(".", import.meta.url).pathname + "/views") app.set("view engine", "html") -app.route("/").get(function (req, res) { - const followups = Followups.find().sort({ createdAt: -1 }).limit(10).exec() +// Rate limiting for database-heavy requests +const limiter = rateLimit({ + windowMs: 15 * 60 * 1000, // 15 minutes + max: 100, // limit each IP to 100 requests per windowMs +}) + +app.route("/").get(limiter, async function (req, res) { + const followups = await Followups.find() + .sort({ createdAt: -1 }) + .limit(10) + .exec() res.render("index", { followups, typeKeys, diff --git a/vite.config.ts b/vite.config.ts index 709fb05b5e..106768bbdb 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -30,7 +30,7 @@ const { smsService, } = config -function createSentryPlugin({authToken, url, org}, project) { +function createSentryPlugin({ authToken, url, org }, project) { if (!authToken || !project) { return null } @@ -131,10 +131,7 @@ export default defineConfig(async ({ mode }) => { targets: ["defaults"], }), visualizer(), - createSentryPlugin( - sentry, - viteEnvironment.VITE_SENTRY_FRONTEND_PROJECT, - ), + createSentryPlugin(sentry, viteEnvironment.VITE_SENTRY_FRONTEND_PROJECT), sitemapGenerator(), ], resolve: {