From 87d173684c646b1c9b367edd95b89e16a2d996c3 Mon Sep 17 00:00:00 2001 From: Florian Date: Mon, 25 May 2026 20:59:11 +0200 Subject: [PATCH] feat: OG png + sentry + dept api + drom notice + registre canicule MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quick wins : - public/og-image.png (1200x630, via sharp depuis le SVG, build via pnpm build) SVG ne fonctionne pas pour Open Graph (Slack/Discord/X/FB). - @sentry/astro intégré conditionnellement (skip si SENTRY_DSN absent → no-op). GIT_COMMIT_SHA en var pour le release tag dans GlitchTip si voulu. - /api/vigilance/dept/[code] : JSON enrichi (phenomenon label + color name) pour J et J1, CORS *, Cache-Control 5min. 404 si code unknown. - JSON-LD enrichi : @graph WebSite + Service avec isBasedOn Dataset + license LOv2. - Lien retour vigilance.meteofrance.fr visible sous la carte. DROM (97x / 976) : - 5 entrées ajoutées dans departements.ts (région "DROM"). - /departement/[code] DROM : bannière "Vigilance Outre-mer non couverte par cette source open data" + bouton vers vigilance.meteofrance.fr. - Home : ligne sous la carte listant les 5 DROM + lien retour. - L'API /api/vigilance/dept/ retourne quand même un JSON 200 (arrays vides). Registre canicule : - Page /conseils/registre-canicule : qui, quoi, comment s'inscrire au CCAS. - Numéro vert 0 800 06 66 66. - Bannière mise en avant en haut de /conseils. Co-Authored-By: Claude Opus 4.7 (1M context) --- astro.config.mjs | 17 + package.json | 5 +- pnpm-lock.yaml | 1272 +++++++++++++++++++- public/og-image.png | Bin 0 -> 44078 bytes scripts/build-og-image.mjs | 20 + src/layouts/Base.astro | 53 +- src/lib/advice.ts | 2 +- src/lib/departements.ts | 12 + src/pages/api/vigilance/dept/[code].ts | 62 + src/pages/conseils/index.astro | 11 + src/pages/conseils/registre-canicule.astro | 108 ++ src/pages/departement/[code].astro | 52 +- src/pages/index.astro | 16 + 13 files changed, 1595 insertions(+), 35 deletions(-) create mode 100644 public/og-image.png create mode 100644 scripts/build-og-image.mjs create mode 100644 src/pages/api/vigilance/dept/[code].ts create mode 100644 src/pages/conseils/registre-canicule.astro diff --git a/astro.config.mjs b/astro.config.mjs index b178ada..344e143 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -2,6 +2,10 @@ import { defineConfig } from 'astro/config'; import node from '@astrojs/node'; import tailwind from '@astrojs/tailwind'; import sitemap from '@astrojs/sitemap'; +import sentry from '@sentry/astro'; + +const sentryDsn = process.env.SENTRY_DSN; +const release = process.env.GIT_COMMIT_SHA || 'dev'; export default defineConfig({ output: 'server', @@ -14,6 +18,19 @@ export default defineConfig({ !page.includes('/departement/'), // /departement/* est dynamique pour les 96 dépts — généré dans /sitemap-departements.xml.ts à part. }), + // Sentry / GlitchTip — opt-in via env. Si SENTRY_DSN absent, intégration omise (no-op). + ...(sentryDsn + ? [ + sentry({ + dsn: sentryDsn, + environment: process.env.NODE_ENV ?? 'production', + release, + tracesSampleRate: 0.1, + // GlitchTip est OK avec source maps mais on les omet pour éviter le upload. + sourceMapsUploadOptions: { enabled: false }, + }), + ] + : []), ], server: { host: '0.0.0.0', port: 4321 }, site: 'https://info-canicule.nocleus.com', diff --git a/package.json b/package.json index 2606ec4..adf688a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "type": "module", "scripts": { "dev": "astro dev", - "build": "astro build", + "build": "node scripts/build-og-image.mjs && astro build", + "build:og": "node scripts/build-og-image.mjs", "preview": "astro preview", "start": "node ./dist/server/entry.mjs", "astro": "astro", @@ -16,6 +17,7 @@ "@astrojs/node": "^9.2.2", "@astrojs/sitemap": "^3.6.0", "@astrojs/tailwind": "^6.0.2", + "@sentry/astro": "^10.53.1", "@tailwindcss/typography": "^0.5.16", "astro": "^5.7.0", "ioredis": "^5.6.0", @@ -24,6 +26,7 @@ "devDependencies": { "@astrojs/check": "^0.9.4", "@types/node": "^22.10.5", + "sharp": "^0.34.5", "typescript": "^5.7.2" }, "packageManager": "pnpm@10.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c35a180..0a1eabc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: '@astrojs/tailwind': specifier: ^6.0.2 version: 6.0.2(astro@5.18.1(@types/node@22.19.19)(ioredis@5.10.1)(jiti@1.21.7)(rollup@4.60.4)(typescript@5.9.3)(yaml@2.9.0))(tailwindcss@3.4.19(yaml@2.9.0)) + '@sentry/astro': + specifier: ^10.53.1 + version: 10.53.1(astro@5.18.1(@types/node@22.19.19)(ioredis@5.10.1)(jiti@1.21.7)(rollup@4.60.4)(typescript@5.9.3)(yaml@2.9.0))(rollup@4.60.4) '@tailwindcss/typography': specifier: ^0.5.16 version: 0.5.19(tailwindcss@3.4.19(yaml@2.9.0)) @@ -36,6 +39,9 @@ importers: '@types/node': specifier: ^22.10.5 version: 22.19.19 + sharp: + specifier: ^0.34.5 + version: 0.34.5 typescript: specifier: ^5.7.2 version: 5.9.3 @@ -98,6 +104,40 @@ packages: '@astrojs/yaml2ts@0.2.4': resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} @@ -106,11 +146,27 @@ packages: resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.29.7': resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} @@ -455,6 +511,11 @@ packages: cpu: [x64] os: [win32] + '@fastify/otel@0.18.0': + resolution: {integrity: sha512-3TASCATfw+ctICSb4ymrv7iCm0qJ0N9CarB+CZ7zIJ7KqNbwI5JjyDL1/sxoC0ccTO1Zyd1iQ+oqncPg5FJXaA==} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -598,6 +659,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -620,9 +684,190 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@opentelemetry/api-logs@0.207.0': + resolution: {integrity: sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api-logs@0.212.0': + resolution: {integrity: sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api-logs@0.214.0': + resolution: {integrity: sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/core@2.6.1': + resolution: {integrity: sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.7.1': + resolution: {integrity: sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/instrumentation-amqplib@0.61.0': + resolution: {integrity: sha512-mCKoyTGfRNisge4br0NpOFSy2Z1NnEW8hbCJdUDdJFHrPqVzc4IIBPA/vX0U+LUcQqrQvJX+HMIU0dbDRe0i0Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-connect@0.57.0': + resolution: {integrity: sha512-FMEBChnI4FLN5TE9DHwfH7QpNir1JzXno1uz/TAucVdLCyrG0jTrKIcNHt/i30A0M2AunNBCkcd8Ei26dIPKdg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dataloader@0.31.0': + resolution: {integrity: sha512-f654tZFQXS5YeLDNb9KySrwtg7SnqZN119FauD7acBoTzuLduaiGTNz88ixcVSOOMGZ+EjJu/RFtx5klObC95g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.33.0': + resolution: {integrity: sha512-sCZWXGalQ01wr3tAhSR9ucqFJ0phidpAle6/17HVjD6gN8FLmZMK/8sKxdXYHy3PbnlV1P4zeiSVFNKpbFMNLA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.57.0': + resolution: {integrity: sha512-orhmlaK+ZIW9hKU+nHTbXrCSXZcH83AescTqmpamHRobRmYSQwRbD0a1odc0yAzuzOtxYiHiXAnpnIpaSSY7Ow==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.62.0': + resolution: {integrity: sha512-3YNuLVPUxafXkH1jBAbGsKNsP3XVzcFDhCDCE3OqBwCwShlqQbLMRMFh1T/d5jaVZiGVmSsfof+ICKD2iOV8xg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.60.0': + resolution: {integrity: sha512-aNljZKYrEa7obLAxd1bCEDxF7kzCLGXTuTJZ8lMR9rIVEjmuKBXN1gfqpm/OB//Zc2zP4iIve1jBp7sr3mQV6w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.214.0': + resolution: {integrity: sha512-FlkDhZDRjDJDcO2LcSCtjRpkal1NJ8y0fBqBhTvfAR3JSYY2jAIj1kSS5IjmEBt4c3aWv+u/lqLuoCDrrKCSKg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.23.0': + resolution: {integrity: sha512-4K+nVo+zI+aDz0Z85SObwbdixIbzS9moIuKJaYsdlzcHYnKOPtB7ya8r8Ezivy/GVIBHiKJVq4tv+BEkgOMLaQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.58.0': + resolution: {integrity: sha512-Hc/o8fSsaWxZ8r1Yw4rNDLwTpUopTf4X32y4W6UhlHmW8Wizz8wfhgOKIelSeqFVTKBBPIDUOsQWuIMxBmu8Bw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.62.0': + resolution: {integrity: sha512-uVip0VuGUQXZ+vFxkKxAUNq8qNl+VFlyHDh/U6IQ8COOEDfbEchdaHnpFrMYF3psZRUuoSIgb7xOeXj00RdwDA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.58.0': + resolution: {integrity: sha512-6grM3TdMyHzlGY1cUA+mwoPueB1F3dYKgKtZIH6jOFXqfHAByyLTc+6PFjGM9tKh52CFBJaDwodNlL/Td39z7Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.67.0': + resolution: {integrity: sha512-1WJp5N1lYfHq2IhECOTewFs5Tf2NfUOwQRqs/rZdXKTezArMlucxgzAaqcgp3A3YREXopXTpXHsxZTGHjNhMdQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.60.0': + resolution: {integrity: sha512-8BahAZpKsOoc+lrZGb7Ofn4g3z8qtp5IxDfvAVpKXsEheQN7ONMH5djT5ihy6yf8yyeQJGS0gXFfpEAEeEHqQg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.60.0': + resolution: {integrity: sha512-m/5d3bxQALllCzezYDk/6vajh0tj5OijMMvOZGr+qN1NMXm1dzMNwyJ0gNZW7Fo3YFRyj/jJMxIw+W7d525dlw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.60.0': + resolution: {integrity: sha512-08pO8GFPEIz2zquKDGteBZDNmwketdgH8hTe9rVYgW9kCJXq1Psj3wPQGx+VaX4ZJKCfPeoLMYup9+cxHvZyVQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.66.0': + resolution: {integrity: sha512-KxfLGXBb7k2ueaPJfq2GXBDXBly8P+SpR/4Mj410hhNgmQF3sCqwXvUBQxZQkDAmsdBAoenM+yV1LhtsMRamcA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.33.0': + resolution: {integrity: sha512-Q6WQwAD01MMTub31GlejoiFACYNw26J426wyjvU7by7fDIr2nZXNW4vhTGs7i7F0TnXBO3xN688g1tdUgYwJ5w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.207.0': + resolution: {integrity: sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.212.0': + resolution: {integrity: sha512-IyXmpNnifNouMOe0I/gX7ENfv2ZCNdYTF0FpCsoBcpbIHzk81Ww9rQTYTnvghszCg7qGrIhNvWC8dhEifgX9Jg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.214.0': + resolution: {integrity: sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.7.1': + resolution: {integrity: sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.7.1': + resolution: {integrity: sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.41.1': + resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.41.2': + resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@prisma/instrumentation@7.6.0': + resolution: {integrity: sha512-ZPW2gRiwpPzEfgeZgaekhqXrbW+Y2RJKHVqUmlhZhKzRNCcvR6DykzylDrynpArKKRQtLxoZy36fK7U0p3pdgQ==} + peerDependencies: + '@opentelemetry/api': ^1.8 + '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -757,6 +1002,146 @@ packages: cpu: [x64] os: [win32] + '@sentry-internal/browser-utils@10.53.1': + resolution: {integrity: sha512-X4d6y8sBMjmNhcDW4eMBU3ASsNIMz8dqaFkhyIMN/dkYr/yZKnbRZPaVuVUGvHKjnlficPpIH0/HK9KBjrYxPw==} + engines: {node: '>=18'} + + '@sentry-internal/feedback@10.53.1': + resolution: {integrity: sha512-vVpTI/aEYN5d9IgZeYJWMqVaN0+iFgidSrYNAsZTh1US5sJUzF/wrl+68KdpmCtFROrN3jiAn1oPSwL5CKvEJA==} + engines: {node: '>=18'} + + '@sentry-internal/replay-canvas@10.53.1': + resolution: {integrity: sha512-aueLaf/2prExwA76BGU5/bOXCKWqtt6jQXWA6WJQNrmKpPEtZJB4ypnpsou0McXQCF8tur2Y8U0TEkwQP13yJQ==} + engines: {node: '>=18'} + + '@sentry-internal/replay@10.53.1': + resolution: {integrity: sha512-wZNzTBYkgGUPWMuUQv7L64+OJmoCnz7GQNiTrTFK6EVAjJXFBCSsPp/nhif0bLhbk8+0g4xz633uOhpXuQbFdw==} + engines: {node: '>=18'} + + '@sentry/astro@10.53.1': + resolution: {integrity: sha512-4e3+riZuF+tbo/nV8tq7DnEwxeP+x5sQ/zO1r0IOdpWpx90NW5fvRlMiUfrITE2dErt+thDITMlpvBKE4dSnGw==} + engines: {node: '>=18.19.1'} + peerDependencies: + astro: '>=3.x || >=4.0.0-beta' + + '@sentry/babel-plugin-component-annotate@5.3.0': + resolution: {integrity: sha512-p4q8gn8wcFqZGP/s2MnJCAAd8fTikaU6A0mM97RDHQgStcrYiaS0Sc5zUNfb1V+UOLPuvdEdL6MwyxfzjYJQTA==} + engines: {node: '>= 18'} + + '@sentry/browser@10.53.1': + resolution: {integrity: sha512-zXF373hzUOGzUOrqd8xb1U3LQi5uYC3mwv+z5OMKUUinQlu30tTWBs7ypy6YTchtix9QlYaHWlayUF8vBZ5UjA==} + engines: {node: '>=18'} + + '@sentry/bundler-plugin-core@5.3.0': + resolution: {integrity: sha512-L5T60sWdAI3qWwdg3Ptwek/0TY59PERrxyqp4XMUkroayQvGd9r5dIW9Q1kSeXX9iJ442nXbFZKAOyCKV4Z13Q==} + engines: {node: '>= 18'} + + '@sentry/cli-darwin@2.58.6': + resolution: {integrity: sha512-udAVvcyfNa0R+95GvPz/+43/N3TC0TYKdkQ7D7jhPSzbcMc7l2fxRNN5yB3UpCA5fWFnW4toeaqwDBhb/Wh3LA==} + engines: {node: '>=10'} + os: [darwin] + + '@sentry/cli-linux-arm64@2.58.6': + resolution: {integrity: sha512-q8mEcNNmeXMy5i+jWT30TVpH7LcP4HD21CD5XRSPAd/a912HF6EpK0ybf/1USO14WOhoXbAGi9txwaWabSe33g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd, android] + + '@sentry/cli-linux-arm@2.58.6': + resolution: {integrity: sha512-pD0LAt5PcUzAinBwvDqc66x9+2CabHEv486yP0gRjWO7SakbaxmfVq/EXd8VLq/Tzi39LAu422UYK1lpW3MILw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd, android] + + '@sentry/cli-linux-i686@2.58.6': + resolution: {integrity: sha512-q8vNJi1eOV/4vxAFWBsEwLHoSYapaZHIf4j76KJGJXFKTkEbsjCOOsKbwUIBTQQhRgV4DFWh3ryfsPS/que4Kg==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd, android] + + '@sentry/cli-linux-x64@2.58.6': + resolution: {integrity: sha512-DZu956Mhi3ZRjTBe1WdbGV46ldVbA8d2rgp/fh51GsI25zjBHah4wZnPTSzpc+YqxU6pJpg579B/r3jrIK530Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd, android] + + '@sentry/cli-win32-arm64@2.58.6': + resolution: {integrity: sha512-nj0Ff/kmAB73EPDhR8B4O9r+NUHK5GkPCkGWC+kXVemqAJWL5jcJ5KdxG0l/S0z6RoEoltID8/43/B+TaMlT7A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@sentry/cli-win32-i686@2.58.6': + resolution: {integrity: sha512-WNZiDzPbgsEMQWq4avsQ391v/xWKJDIWWWo9GYl+N/w5qcYKkoDW7wQG7T9FasI6ENn68phChTOAPXXxbfAdOg==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + + '@sentry/cli-win32-x64@2.58.6': + resolution: {integrity: sha512-R35WJ17oF4D2eqI1DR2sQQqr0fjRTt5xoP16WrTu91XM2lndRMFsnjh+/GttbxapLCBNlrjzia99MJ0PZHZpgA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@sentry/cli@2.58.6': + resolution: {integrity: sha512-baBcNPLLfUi9WuL+Tpri9BFaAdvugZIKelC5X0tt0Zdy+K0K+PCVSrnNmwMWU/HyaF/SEv6b6UHnXIdqanBlcg==} + engines: {node: '>= 10'} + hasBin: true + + '@sentry/core@10.53.1': + resolution: {integrity: sha512-XG4ezlkyuAPjBC5+9kXC94rXXuqYTw9NRhfaDHssbTFaGnqBR8vQX2UUgZfY7ucbeelRDGfBu1sywoU+mB04uA==} + engines: {node: '>=18'} + + '@sentry/node-core@10.53.1': + resolution: {integrity: sha512-iH7SMcM/7jPbN+t7+7ussQOiIqI4BMOGt4VYWlV71/z7k0pY+YPaSvlfVkNXfISiDzFAKv0ecCY3BmsLMu1xDQ==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 + '@opentelemetry/exporter-trace-otlp-http': '>=0.57.0 <1' + '@opentelemetry/instrumentation': '>=0.57.1 <1' + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 + '@opentelemetry/semantic-conventions': ^1.39.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/core': + optional: true + '@opentelemetry/exporter-trace-otlp-http': + optional: true + '@opentelemetry/instrumentation': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true + '@opentelemetry/semantic-conventions': + optional: true + + '@sentry/node@10.53.1': + resolution: {integrity: sha512-rxHVil0tJAmz+keFcZCj1LaUdgdkK66E/l0gqh2p1209PNCGoD3lnClFr6vusy1aF3zF8O9JPtuMEJzXOKhs+w==} + engines: {node: '>=18'} + + '@sentry/opentelemetry@10.53.1': + resolution: {integrity: sha512-Zok6UXla0mFOjd1YnVb1TZtQNOry9v93fXUqx8jmDaygwWM2BwvP8rBQabLz0/OZXo8+35oge+Vmw+QY5aesnA==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 + '@opentelemetry/semantic-conventions': ^1.39.0 + + '@sentry/rollup-plugin@5.3.0': + resolution: {integrity: sha512-hgPGPYdQJ/G1cGYOxAb7d4z3V+/k/E5/P/5TFPEEBLuIbFFk+JG0CISUDJdzXJjO382Lb99PBJuXGbueBmO79w==} + engines: {node: '>= 18'} + peerDependencies: + rollup: '>=3.2.0' + peerDependenciesMeta: + rollup: + optional: true + + '@sentry/vite-plugin@5.3.0': + resolution: {integrity: sha512-qcoSzo4n2MulVQ70UUPLq6dTleb2a2HwL2wuwvAgWhPChrYTuk6A6mDg6aQb9fairPAwFPiU9PzOANpoDJcz1A==} + engines: {node: '>= 18'} + '@shikijs/core@3.23.0': resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} @@ -783,6 +1168,9 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} @@ -801,6 +1189,9 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/mysql@2.15.27': + resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} + '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} @@ -810,9 +1201,18 @@ packages: '@types/node@24.12.4': resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==} + '@types/pg-pool@2.0.7': + resolution: {integrity: sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==} + + '@types/pg@8.15.6': + resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} + '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -845,11 +1245,20 @@ packages: '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -919,6 +1328,10 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} @@ -938,6 +1351,10 @@ packages: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -990,6 +1407,9 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} @@ -1027,6 +1447,9 @@ packages: common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.3: resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} @@ -1128,6 +1551,10 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} @@ -1229,6 +1656,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} @@ -1240,6 +1671,9 @@ packages: resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} engines: {node: '>=20'} + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} @@ -1255,6 +1689,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1274,6 +1712,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} @@ -1324,6 +1766,17 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + import-in-the-middle@2.0.6: + resolution: {integrity: sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==} + + import-in-the-middle@3.0.1: + resolution: {integrity: sha512-pYkiyXVL2Mf3pozdlDGV6NAObxQx13Ae8knZk1UJRJ6uRW/ZRmTGHlQYtrsSl7ubuE5F8CD1z+s1n4RHNuTtuA==} + engines: {node: '>=18'} + import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} @@ -1379,17 +1832,33 @@ packages: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} @@ -1411,6 +1880,10 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -1424,6 +1897,9 @@ packages: resolution: {integrity: sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==} engines: {node: 20 || >=22} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -1578,6 +2054,17 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -1606,6 +2093,15 @@ packages: node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} @@ -1644,10 +2140,18 @@ packages: oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + p-limit@6.2.0: resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-queue@8.1.1: resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} engines: {node: '>=18'} @@ -1668,9 +2172,28 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.14.0: + resolution: {integrity: sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + piccolore@0.1.3: resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} @@ -1756,6 +2279,22 @@ packages: resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.1: + resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + prettier@3.8.3: resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} @@ -1765,6 +2304,10 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -1772,6 +2315,9 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1856,6 +2402,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + resolve@1.22.12: resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} @@ -1889,6 +2439,10 @@ packages: resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.8.1: resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} engines: {node: '>=10'} @@ -2004,6 +2558,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -2312,10 +2869,21 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + widest-line@5.0.0: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} @@ -2328,6 +2896,10 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} @@ -2335,6 +2907,9 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml-language-server@1.20.0: resolution: {integrity: sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA==} hasBin: true @@ -2357,6 +2932,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} @@ -2504,14 +3083,101 @@ snapshots: dependencies: yaml: 2.9.0 + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.29.7': {} '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + '@babel/parser@7.29.7': dependencies: '@babel/types': 7.29.7 + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.29.7': dependencies: '@babel/helper-string-parser': 7.29.7 @@ -2705,8 +3371,17 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true - '@img/colour@1.1.0': - optional: true + '@fastify/otel@0.18.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: @@ -2809,6 +3484,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -2830,8 +3510,241 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@opentelemetry/api-logs@0.207.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api-logs@0.212.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api-logs@0.214.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api@1.9.1': {} + + '@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/instrumentation-amqplib@0.61.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-connect@0.57.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + '@types/connect': 3.4.38 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dataloader@0.31.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.33.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-generic-pool@0.57.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.62.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.60.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.214.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + forwarded-parse: 2.1.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.23.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-knex@0.58.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.62.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-lru-memoizer@0.58.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.67.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.60.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.60.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.60.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + '@types/mysql': 2.15.27 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.66.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) + '@types/pg': 8.15.6 + '@types/pg-pool': 2.0.7 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-tedious@0.33.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.207.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.207.0 + import-in-the-middle: 2.0.6 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.212.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.212.0 + import-in-the-middle: 2.0.6 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.214.0 + import-in-the-middle: 3.0.1 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/resources@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@opentelemetry/semantic-conventions@1.41.1': {} + + '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@oslojs/encoding@1.1.0': {} + '@prisma/instrumentation@7.6.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.207.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - supports-color + '@rollup/pluginutils@5.3.0(rollup@4.60.4)': dependencies: '@types/estree': 1.0.9 @@ -2915,6 +3828,180 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.4': optional: true + '@sentry-internal/browser-utils@10.53.1': + dependencies: + '@sentry/core': 10.53.1 + + '@sentry-internal/feedback@10.53.1': + dependencies: + '@sentry/core': 10.53.1 + + '@sentry-internal/replay-canvas@10.53.1': + dependencies: + '@sentry-internal/replay': 10.53.1 + '@sentry/core': 10.53.1 + + '@sentry-internal/replay@10.53.1': + dependencies: + '@sentry-internal/browser-utils': 10.53.1 + '@sentry/core': 10.53.1 + + '@sentry/astro@10.53.1(astro@5.18.1(@types/node@22.19.19)(ioredis@5.10.1)(jiti@1.21.7)(rollup@4.60.4)(typescript@5.9.3)(yaml@2.9.0))(rollup@4.60.4)': + dependencies: + '@sentry/browser': 10.53.1 + '@sentry/core': 10.53.1 + '@sentry/node': 10.53.1 + '@sentry/vite-plugin': 5.3.0(rollup@4.60.4) + astro: 5.18.1(@types/node@22.19.19)(ioredis@5.10.1)(jiti@1.21.7)(rollup@4.60.4)(typescript@5.9.3)(yaml@2.9.0) + transitivePeerDependencies: + - '@opentelemetry/exporter-trace-otlp-http' + - encoding + - rollup + - supports-color + + '@sentry/babel-plugin-component-annotate@5.3.0': {} + + '@sentry/browser@10.53.1': + dependencies: + '@sentry-internal/browser-utils': 10.53.1 + '@sentry-internal/feedback': 10.53.1 + '@sentry-internal/replay': 10.53.1 + '@sentry-internal/replay-canvas': 10.53.1 + '@sentry/core': 10.53.1 + + '@sentry/bundler-plugin-core@5.3.0': + dependencies: + '@babel/core': 7.29.7 + '@sentry/babel-plugin-component-annotate': 5.3.0 + '@sentry/cli': 2.58.6 + dotenv: 16.6.1 + find-up: 5.0.0 + glob: 13.0.6 + magic-string: 0.30.21 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/cli-darwin@2.58.6': + optional: true + + '@sentry/cli-linux-arm64@2.58.6': + optional: true + + '@sentry/cli-linux-arm@2.58.6': + optional: true + + '@sentry/cli-linux-i686@2.58.6': + optional: true + + '@sentry/cli-linux-x64@2.58.6': + optional: true + + '@sentry/cli-win32-arm64@2.58.6': + optional: true + + '@sentry/cli-win32-i686@2.58.6': + optional: true + + '@sentry/cli-win32-x64@2.58.6': + optional: true + + '@sentry/cli@2.58.6': + dependencies: + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.58.6 + '@sentry/cli-linux-arm': 2.58.6 + '@sentry/cli-linux-arm64': 2.58.6 + '@sentry/cli-linux-i686': 2.58.6 + '@sentry/cli-linux-x64': 2.58.6 + '@sentry/cli-win32-arm64': 2.58.6 + '@sentry/cli-win32-i686': 2.58.6 + '@sentry/cli-win32-x64': 2.58.6 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/core@10.53.1': {} + + '@sentry/node-core@10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1)': + dependencies: + '@sentry/core': 10.53.1 + '@sentry/opentelemetry': 10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) + import-in-the-middle: 3.0.1 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + + '@sentry/node@10.53.1': + dependencies: + '@fastify/otel': 0.18.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-amqplib': 0.61.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-connect': 0.57.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-dataloader': 0.31.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-fs': 0.33.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-generic-pool': 0.57.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-graphql': 0.62.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-hapi': 0.60.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-http': 0.214.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-kafkajs': 0.23.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-knex': 0.58.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-koa': 0.62.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-lru-memoizer': 0.58.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mongodb': 0.67.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mongoose': 0.60.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mysql': 0.60.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mysql2': 0.60.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-pg': 0.66.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-tedious': 0.33.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + '@prisma/instrumentation': 7.6.0(@opentelemetry/api@1.9.1) + '@sentry/core': 10.53.1 + '@sentry/node-core': 10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) + '@sentry/opentelemetry': 10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) + import-in-the-middle: 3.0.1 + transitivePeerDependencies: + - '@opentelemetry/exporter-trace-otlp-http' + - supports-color + + '@sentry/opentelemetry@10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 + '@sentry/core': 10.53.1 + + '@sentry/rollup-plugin@5.3.0(rollup@4.60.4)': + dependencies: + '@sentry/bundler-plugin-core': 5.3.0 + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.60.4 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/vite-plugin@5.3.0(rollup@4.60.4)': + dependencies: + '@sentry/bundler-plugin-core': 5.3.0 + '@sentry/rollup-plugin': 5.3.0(rollup@4.60.4) + transitivePeerDependencies: + - encoding + - rollup + - supports-color + '@shikijs/core@3.23.0': dependencies: '@shikijs/types': 3.23.0 @@ -2953,6 +4040,10 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.19(yaml@2.9.0) + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.19.19 + '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 @@ -2971,6 +4062,10 @@ snapshots: '@types/ms@2.1.0': {} + '@types/mysql@2.15.27': + dependencies: + '@types/node': 22.19.19 + '@types/nlcst@2.0.3': dependencies: '@types/unist': 3.0.3 @@ -2983,10 +4078,24 @@ snapshots: dependencies: undici-types: 7.16.0 + '@types/pg-pool@2.0.7': + dependencies: + '@types/pg': 8.15.6 + + '@types/pg@8.15.6': + dependencies: + '@types/node': 22.19.19 + pg-protocol: 1.14.0 + pg-types: 2.2.0 + '@types/sax@1.2.7': dependencies: '@types/node': 22.19.19 + '@types/tedious@4.0.14': + dependencies: + '@types/node': 22.19.19 + '@types/unist@3.0.3': {} '@ungap/structured-clone@1.3.1': {} @@ -3041,8 +4150,18 @@ snapshots: '@vscode/l10n@0.0.18': {} + acorn-import-attributes@1.9.5(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn@8.16.0: {} + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + ajv-draft-04@1.0.0(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -3198,6 +4317,8 @@ snapshots: bail@2.0.2: {} + balanced-match@4.0.4: {} + base-64@1.0.0: {} baseline-browser-mapping@2.10.32: {} @@ -3217,6 +4338,10 @@ snapshots: widest-line: 5.0.0 wrap-ansi: 9.0.2 + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -3267,6 +4392,8 @@ snapshots: ci-info@4.4.0: {} + cjs-module-lexer@2.2.0: {} + cli-boxes@3.0.0: {} cliui@8.0.1: @@ -3293,6 +4420,8 @@ snapshots: common-ancestor-path@1.0.1: {} + convert-source-map@2.0.0: {} + cookie-es@1.2.3: {} cookie@1.1.1: {} @@ -3345,8 +4474,7 @@ snapshots: destr@2.0.5: {} - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} deterministic-object-hash@2.0.2: dependencies: @@ -3382,6 +4510,8 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dotenv@16.6.1: {} + dset@3.1.4: {} ee-first@1.1.1: {} @@ -3507,6 +4637,11 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + flattie@1.1.1: {} fontace@0.4.1: @@ -3517,6 +4652,8 @@ snapshots: dependencies: tiny-inflate: 1.0.3 + forwarded-parse@2.1.2: {} + fraction.js@5.3.4: {} fresh@2.0.0: {} @@ -3526,6 +4663,8 @@ snapshots: function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} get-east-asian-width@1.6.0: {} @@ -3540,6 +4679,12 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + h3@1.15.11: dependencies: cookie-es: 1.2.3 @@ -3657,6 +4802,27 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + import-in-the-middle@2.0.6: + dependencies: + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) + cjs-module-lexer: 2.2.0 + module-details-from-path: 1.0.4 + + import-in-the-middle@3.0.1: + dependencies: + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) + cjs-module-lexer: 2.2.0 + module-details-from-path: 1.0.4 + import-meta-resolve@4.2.0: {} inherits@2.0.4: {} @@ -3707,14 +4873,22 @@ snapshots: dependencies: is-inside-container: 1.0.0 + isexe@2.0.0: {} + jiti@1.21.7: {} + js-tokens@4.0.0: {} + js-yaml@4.1.1: dependencies: argparse: 2.0.1 + jsesc@3.1.0: {} + json-schema-traverse@1.0.0: {} + json5@2.2.3: {} + jsonc-parser@2.3.1: {} jsonc-parser@3.3.1: {} @@ -3727,6 +4901,10 @@ snapshots: lines-and-columns@1.2.4: {} + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash.defaults@4.2.0: {} lodash.isarguments@3.1.0: {} @@ -3735,6 +4913,10 @@ snapshots: lru-cache@11.5.0: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4075,6 +5257,14 @@ snapshots: dependencies: mime-db: 1.54.0 + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minipass@7.1.3: {} + + module-details-from-path@1.0.4: {} + mrmime@2.0.1: {} ms@2.1.3: {} @@ -4097,6 +5287,10 @@ snapshots: node-fetch-native@1.6.7: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-mock-http@1.0.4: {} node-releases@2.0.46: {} @@ -4131,10 +5325,18 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + p-limit@6.2.0: dependencies: yocto-queue: 1.2.2 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-queue@8.1.1: dependencies: eventemitter3: 5.0.4 @@ -4159,8 +5361,27 @@ snapshots: path-browserify@1.0.1: {} + path-exists@4.0.0: {} + path-parse@1.0.7: {} + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.0 + minipass: 7.1.3 + + pg-int8@1.0.1: {} + + pg-protocol@1.14.0: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.1 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + piccolore@0.1.3: {} picocolors@1.1.1: {} @@ -4223,10 +5444,22 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postgres-array@2.0.0: {} + + postgres-bytea@1.0.1: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + prettier@3.8.3: {} prismjs@1.30.0: {} + progress@2.0.3: {} + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -4234,6 +5467,8 @@ snapshots: property-information@7.1.0: {} + proxy-from-env@1.1.0: {} + queue-microtask@1.2.3: {} radix3@1.1.2: {} @@ -4342,6 +5577,13 @@ snapshots: require-from-string@2.0.2: {} + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + resolve@1.22.12: dependencies: es-errors: 1.3.0 @@ -4413,6 +5655,8 @@ snapshots: sax@1.6.0: {} + semver@6.3.1: {} + semver@7.8.1: {} send@1.2.1: @@ -4465,7 +5709,6 @@ snapshots: '@img/sharp-win32-arm64': 0.34.5 '@img/sharp-win32-ia32': 0.34.5 '@img/sharp-win32-x64': 0.34.5 - optional: true shiki@3.23.0: dependencies: @@ -4597,6 +5840,8 @@ snapshots: toidentifier@1.0.1: {} + tr46@0.0.3: {} + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -4841,8 +6086,19 @@ snapshots: web-namespaces@2.0.1: {} + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-pm-runs@1.1.0: {} + which@2.0.2: + dependencies: + isexe: 2.0.0 + widest-line@5.0.0: dependencies: string-width: 7.2.0 @@ -4859,10 +6115,14 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 + xtend@4.0.2: {} + xxhash-wasm@1.1.0: {} y18n@5.0.8: {} + yallist@3.1.1: {} + yaml-language-server@1.20.0: dependencies: '@vscode/l10n': 0.0.18 @@ -4893,6 +6153,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yocto-queue@0.1.0: {} + yocto-queue@1.2.2: {} yocto-spinner@0.2.3: diff --git a/public/og-image.png b/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..c4228337922d624ac594b7a3bb03d4c85e87f20c GIT binary patch literal 44078 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 K3gvPZLH`93(o@j@ literal 0 HcmV?d00001 diff --git a/scripts/build-og-image.mjs b/scripts/build-og-image.mjs new file mode 100644 index 0000000..c6378b8 --- /dev/null +++ b/scripts/build-og-image.mjs @@ -0,0 +1,20 @@ +#!/usr/bin/env node +// Convertit public/og-image.svg en public/og-image.png (1200×630). +// Lancé manuellement ou via `pnpm prebuild` quand le SVG bouge. + +import sharp from 'sharp'; +import { readFileSync } from 'node:fs'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const SVG = resolve(__dirname, '../public/og-image.svg'); +const PNG = resolve(__dirname, '../public/og-image.png'); + +const buf = readFileSync(SVG); +await sharp(buf, { density: 144 }) + .resize(1200, 630, { fit: 'fill' }) + .png({ compressionLevel: 9 }) + .toFile(PNG); + +console.log(`Wrote ${PNG}`); diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro index a76cb65..938160b 100644 --- a/src/layouts/Base.astro +++ b/src/layouts/Base.astro @@ -14,7 +14,7 @@ const { title = 'Info Canicule — Vigilance météo France en temps réel', description = 'Suivi gratuit et sans publicité des alertes Vigilance Météo France (canicule, orages, tempêtes), avec carte interactive par département et conseils officiels.', canonical, - ogImage = '/og-image.svg', + ogImage = '/og-image.png', noindex = false, } = Astro.props; @@ -25,20 +25,43 @@ const umamiSrc = process.env.UMAMI_SRC ?? 'https://analytics.nocleus.com/script. const jsonLd = { '@context': 'https://schema.org', - '@type': 'WebSite', - name: 'Info Canicule', - url: SITE, - description, - inLanguage: 'fr-FR', - publisher: { - '@type': 'Person', - name: 'Florian Bouchet', - }, - potentialAction: { - '@type': 'SearchAction', - target: `${SITE}/departement/{code}`, - 'query-input': 'required name=code', - }, + '@graph': [ + { + '@type': 'WebSite', + '@id': `${SITE}/#website`, + name: 'Info Canicule', + url: SITE, + description, + inLanguage: 'fr-FR', + publisher: { '@type': 'Person', name: 'Florian Bouchet' }, + potentialAction: { + '@type': 'SearchAction', + target: `${SITE}/departement/{code}`, + 'query-input': 'required name=code', + }, + }, + { + '@type': 'Service', + '@id': `${SITE}/#service`, + name: 'Info Canicule', + serviceType: 'Service d\'information météorologique grand public', + areaServed: { '@type': 'Country', name: 'France' }, + audience: { '@type': 'PeopleAudience', audienceType: 'Grand public, personnes fragiles' }, + provider: { + '@type': 'Person', + name: 'Florian Bouchet', + url: `${SITE}/a-propos`, + }, + isBasedOn: { + '@type': 'Dataset', + name: 'Vigilance Météo France', + url: 'https://vigilance.meteofrance.fr/', + creator: { '@type': 'Organization', name: 'Météo-France' }, + license: 'https://www.etalab.gouv.fr/licence-ouverte-open-licence/', + }, + isAccessibleForFree: true, + }, + ], }; --- diff --git a/src/lib/advice.ts b/src/lib/advice.ts index 3c51b52..cd3724e 100644 --- a/src/lib/advice.ts +++ b/src/lib/advice.ts @@ -48,7 +48,7 @@ export const ADVICE: Record = { title: 'Veiller sur les proches', items: [ "Prendre des nouvelles des personnes isolées (voisins âgés, malades, sans-abri)", - "S'inscrire ou inscrire un proche fragile sur le registre canicule de sa mairie", + "Inscrire un proche fragile sur le registre canicule de sa mairie — voir page dédiée", 'En cas de symptôme inquiétant (maux de tête, vertiges, nausées, fièvre) : alerter rapidement', ], }, diff --git a/src/lib/departements.ts b/src/lib/departements.ts index 688a8fe..5518a4f 100644 --- a/src/lib/departements.ts +++ b/src/lib/departements.ts @@ -106,8 +106,20 @@ export const DEPARTEMENTS: Departement[] = [ { code: '94', name: 'Val-de-Marne', region: 'Île-de-France' }, { code: '95', name: "Val-d'Oise", region: 'Île-de-France' }, { code: '99', name: 'Andorre (zone Vigilance)', region: 'Hors France' }, + // DROM — non couverts par le dataset Opendatasoft actuel. + // Vigilance DROM dispo via l'API Météo France officielle uniquement (TODO). + { code: '971', name: 'Guadeloupe', region: 'DROM' }, + { code: '972', name: 'Martinique', region: 'DROM' }, + { code: '973', name: 'Guyane', region: 'DROM' }, + { code: '974', name: 'La Réunion', region: 'DROM' }, + { code: '976', name: 'Mayotte', region: 'DROM' }, ]; +export const DROM_CODES = new Set(['971', '972', '973', '974', '976']); +export function isDrom(code: string): boolean { + return DROM_CODES.has(code); +} + const BY_CODE = new Map(DEPARTEMENTS.map((d) => [d.code, d])); export function getDepartement(code: string): Departement | undefined { diff --git a/src/pages/api/vigilance/dept/[code].ts b/src/pages/api/vigilance/dept/[code].ts new file mode 100644 index 0000000..304b2fb --- /dev/null +++ b/src/pages/api/vigilance/dept/[code].ts @@ -0,0 +1,62 @@ +import type { APIRoute } from 'astro'; +import { getVigilanceSnapshot, alertsForDepartement } from '../../../../lib/vigilance'; +import { getDepartement } from '../../../../lib/departements'; +import { PHENOMENA, COLORS } from '../../../../lib/phenomena'; + +export const prerender = false; + +// JSON par département (J + J1) — CORS *, réutilisable sous Licence Ouverte 2.0. +// Ex : GET /api/vigilance/dept/75 → alertes Paris +export const GET: APIRoute = async ({ params }) => { + const codeRaw = params.code; + if (!codeRaw) { + return new Response(JSON.stringify({ error: 'missing_code' }), { + status: 400, + headers: { 'Content-Type': 'application/json' }, + }); + } + const code = codeRaw.toUpperCase(); + const dept = getDepartement(code); + if (!dept) { + return new Response(JSON.stringify({ error: 'unknown_departement', code }), { + status: 404, + headers: { 'Content-Type': 'application/json' }, + }); + } + + try { + const snap = await getVigilanceSnapshot(); + const today = alertsForDepartement(snap, code, 'J'); + const tomorrow = alertsForDepartement(snap, code, 'J1'); + const enrich = (a: ReturnType[0]) => ({ + phenomenonId: a.phenomenonId, + phenomenon: PHENOMENA[a.phenomenonId].label, + colorId: a.colorId, + color: COLORS[a.colorId].name, + beginTime: a.beginTime, + endTime: a.endTime, + }); + + const body = { + departement: { code, name: dept.name, region: dept.region }, + productDatetime: snap.productDatetime, + fetchedAt: snap.fetchedAt, + today: today.map(enrich), + tomorrow: tomorrow.map(enrich), + }; + + return new Response(JSON.stringify(body), { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'Cache-Control': 'public, max-age=300', + 'Access-Control-Allow-Origin': '*', + }, + }); + } catch (e) { + return new Response( + JSON.stringify({ error: 'fetch_failed', detail: (e as Error).message }), + { status: 502, headers: { 'Content-Type': 'application/json' } }, + ); + } +}; diff --git a/src/pages/conseils/index.astro b/src/pages/conseils/index.astro index b096145..2fc3a72 100644 --- a/src/pages/conseils/index.astro +++ b/src/pages/conseils/index.astro @@ -21,6 +21,17 @@ const phenomenaList = Object.values(PHENOMENA).sort((a, b) => Recommandations à appliquer en cas d'alerte Vigilance, par type de phénomène. Sources : Météo France, santé.gouv.fr, gouvernement.fr.

+
+

+ 🛡️ Aider une personne fragile : + registre canicule de la mairie + +

+

+ Dispositif communal gratuit qui permet à un proche âgé, malade ou isolé d'être contacté en + cas d'alerte. Inscription en quelques minutes via le CCAS. +

+
diff --git a/src/pages/conseils/registre-canicule.astro b/src/pages/conseils/registre-canicule.astro new file mode 100644 index 0000000..d30f08d --- /dev/null +++ b/src/pages/conseils/registre-canicule.astro @@ -0,0 +1,108 @@ +--- +import Base from '../../layouts/Base.astro'; + +export const prerender = false; +--- + + +
+
+ ← Tous les conseils +

Registre canicule

+

+ Un dispositif communal, gratuit et confidentiel, qui permet d'être contacté par sa mairie en + cas d'alerte canicule. Conçu en priorité pour les personnes fragiles et isolées. +

+
+
+ +
+

À qui ça s'adresse

+

Le registre nominatif communal est ouvert à toute personne qui le souhaite, mais il est + particulièrement utile pour :

+
    +
  • Les personnes âgées de 65 ans et plus vivant à domicile
  • +
  • Les personnes en situation de handicap
  • +
  • Les personnes adultes isolées (sans aidant proche)
  • +
  • Les personnes fragilisées par une maladie chronique
  • +
+

+ Vous pouvez inscrire un proche (parent, voisin) avec son accord, ou demander une inscription + d'office pour une personne dont vous estimez qu'elle est en danger. +

+ +

Comment ça se passe en cas d'alerte

+
    +
  • Quand un département passe en vigilance orange ou rouge canicule, le plan « Plan National + Canicule » (PNC) s'enclenche en mairie.
  • +
  • Les personnes inscrites sur le registre sont appelées ou + visitées par des agents communaux ou bénévoles (Croix-Rouge, ADMR…).
  • +
  • L'objectif : vérifier qu'elles vont bien, qu'elles ont de quoi s'hydrater et rester au + frais, et alerter si besoin (médecin traitant, 15, famille).
  • +
+ +

Comment s'inscrire

+
    +
  1. + Contacter le CCAS (Centre Communal d'Action Sociale) de votre commune, ou + directement la mairie. Numéros disponibles via l'annuaire officiel des mairies : + + lannuaire.service-public.fr/navigation/mairie + +
  2. +
  3. + Demander le formulaire d'inscription au registre canicule (parfois appelé + « registre des personnes vulnérables » ou « plan canicule »). +
  4. +
  5. + Remplir le formulaire avec : nom, âge, adresse, téléphone, personne à prévenir, médecin + traitant, éventuelles particularités (isolement, mobilité, etc.). +
  6. +
  7. + Retourner le formulaire à la mairie. Gratuit et confidentiel — les données + ne servent qu'au plan canicule, ne sont pas partagées commercialement. +
  8. +
+ +

Bon à savoir

+
    +
  • L'inscription est valable pour toute la saison estivale (juin à + septembre), à renouveler chaque année si besoin.
  • +
  • Vous pouvez vous désinscrire à tout moment par simple courrier ou appel.
  • +
  • + Cadre légal : article L121-6-1 du Code de l'action sociale et des familles + circulaire + annuelle relative au Plan National Canicule. +
  • +
+ +
+

📞 Plateforme téléphonique canicule

+

+ Numéro vert 0 800 06 66 66 (gratuit + depuis un poste fixe). Activé pendant les épisodes de canicule pour informer et conseiller. +

+
+ +

Pour aller plus loin

+ +
+ diff --git a/src/pages/departement/[code].astro b/src/pages/departement/[code].astro index 1dab03f..e61a41d 100644 --- a/src/pages/departement/[code].astro +++ b/src/pages/departement/[code].astro @@ -3,7 +3,7 @@ import Base from '../../layouts/Base.astro'; import VigilanceChip from '../../components/VigilanceChip.astro'; import VigilanceLegend from '../../components/VigilanceLegend.astro'; import { getVigilanceSnapshot, alertsForDepartement } from '../../lib/vigilance'; -import { getDepartement } from '../../lib/departements'; +import { getDepartement, isDrom } from '../../lib/departements'; import { PHENOMENA, COLOR_LABEL } from '../../lib/phenomena'; import { ADVICE, EMERGENCY_NUMBERS } from '../../lib/advice'; import { getClimatoForDepartement } from '../../lib/climato'; @@ -18,19 +18,25 @@ if (!dept) { return new Response('Département introuvable', { status: 404 }); } +const drom = isDrom(dept.code); + let snapshot; let error: string | null = null; -try { - snapshot = await getVigilanceSnapshot(); -} catch (e) { - error = (e as Error).message; +if (!drom) { + try { + snapshot = await getVigilanceSnapshot(); + } catch (e) { + error = (e as Error).message; + } } let climato = null; -try { - climato = await getClimatoForDepartement(dept.code); -} catch (e) { - console.warn('climato fetch failed for', dept.code, (e as Error).message); +if (!drom) { + try { + climato = await getClimatoForDepartement(dept.code); + } catch (e) { + console.warn('climato fetch failed for', dept.code, (e as Error).message); + } } const today = snapshot ? alertsForDepartement(snapshot, dept.code, 'J') : []; @@ -52,10 +58,30 @@ const adviceFor = highest && ADVICE[highest.phenomenonId];
- {error &&

Données indisponibles : {error}

} + {drom && ( +
+

Vigilance Outre-mer non couverte par cette source

+

+ Les départements et régions d'Outre-mer disposent de leur propre dispositif Vigilance, géré + par les centres météorologiques locaux de Météo France. Ces données ne sont pas (encore) + rediffusées en open data au même format que la métropole. +

+

+ + Voir la Vigilance officielle Outre-mer → + +

+
+ )} + + {!drom && error &&

Données indisponibles : {error}

} { - !error && today.length === 0 && ( + !drom && !error && today.length === 0 && (

Aucune vigilance particulière aujourd'hui.

Le département est en niveau vert pour tous les phénomènes.

@@ -64,7 +90,7 @@ const adviceFor = highest && ADVICE[highest.phenomenonId]; } { - !error && today.length > 0 && ( + !drom && !error && today.length > 0 && ( <>

Alertes en cours

    @@ -100,7 +126,7 @@ const adviceFor = highest && ADVICE[highest.phenomenonId]; } { - !error && tomorrow.length > 0 && ( + !drom && !error && tomorrow.length > 0 && (

    Prévision pour demain

      diff --git a/src/pages/index.astro b/src/pages/index.astro index aa9dfd7..c1a0767 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -119,6 +119,22 @@ const productDate = snapshot?.productDatetime
    +

    + Source officielle : + + vigilance.meteofrance.fr + + — toujours s'y référer en cas d'urgence. +

    +

    + Outre-mer non couvert par cette source open data : + Guadeloupe · + Martinique · + Guyane · + La Réunion · + Mayotte → + vigilance.meteofrance.fr +

) }