From 5f3d2477807823352f83cd477b5d7d27d4b33432 Mon Sep 17 00:00:00 2001
From: Nicolas KOKLA
Date: Wed, 25 Sep 2024 00:03:25 +0200
Subject: [PATCH 01/10] Fix : Layout integration
---
src/app/layout.tsx | 6 +++---
src/layouts/Breadcrumb.tsx | 8 ++++----
src/layouts/Header.tsx | 2 +-
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 729fa9fa8..78904e804 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -12,7 +12,7 @@ import Breadcrumb from '@/layouts/Breadcrumb'
import { defaultColorScheme } from '@/theme/defaultColorScheme'
import styled, { ThemeProvider } from 'styled-components'
import StyledComponentsRegistry from '@/providers/StyledComponentsRegistry'
-import theme from '@/theme/theme'
+import theme from '@/theme'
import GlobalStyle from './global.styles'
import { useEffect } from 'react'
import { init as matomoInit } from '@socialgouv/matomo-next'
@@ -21,7 +21,7 @@ import { BALWidgetProvider } from '@/contexts/BALWidget.context'
const StyledLayout = styled.div`
min-height: 100vh;
display: grid;
- grid-template-rows: auto 1fr auto;
+ grid-template-rows: auto auto 1fr auto;
.pageWrapper {
display: flex;
@@ -63,7 +63,7 @@ export default function RootLayout({ children }: { children: JSX.Element }) {
-
+ {/* */}
{children}
diff --git a/src/layouts/Breadcrumb.tsx b/src/layouts/Breadcrumb.tsx
index fd23e0f32..c6baa74e2 100644
--- a/src/layouts/Breadcrumb.tsx
+++ b/src/layouts/Breadcrumb.tsx
@@ -62,10 +62,10 @@ export default function Breadcrumb(
const segments = useMemo(
() => (
_segments
- ? [..._segments, { label: currentPageLabel, linkProps: { href: pathname } }]
- : pathname === '/'
- ? []
- : getSegments(navEntries, pathname)
+ ? [..._segments, { label: currentPageLabel, linkProps: { href: pathname || '' } }]
+ : !pathname || pathname === '/'
+ ? []
+ : getSegments(navEntries, pathname)
),
[_segments, currentPageLabel, pathname]
)
diff --git a/src/layouts/Header.tsx b/src/layouts/Header.tsx
index ce4c44374..58ff74c2b 100644
--- a/src/layouts/Header.tsx
+++ b/src/layouts/Header.tsx
@@ -133,7 +133,7 @@ export default function Header() {
const pathname = usePathname()
const selectedNavigationLinks = useMemo(
- () => markAsActive(navEntries as MainNavigationProps.Item[], pathname),
+ () => markAsActive(navEntries as MainNavigationProps.Item[], pathname || ''),
[pathname]
)
From df659903fcfdb3d9fb495d2bd1b46aba773adaf6 Mon Sep 17 00:00:00 2001
From: Nicolas KOKLA
Date: Tue, 24 Sep 2024 23:58:16 +0200
Subject: [PATCH 02/10] Add Error pages (404, 5xx, etc)
---
public/img/global-error.svg | 1 +
public/img/page_not_found.svg | 1 +
src/app/error-layout.styled.tsx | 26 ++++++++++++++++++++++
src/app/error-layout.tsx | 39 +++++++++++++++++++++++++++++++++
src/app/global-error.tsx | 34 ++++++++++++++++++++++++++++
src/app/not-found.tsx | 21 ++++++++++++++++++
6 files changed, 122 insertions(+)
create mode 100644 public/img/global-error.svg
create mode 100644 public/img/page_not_found.svg
create mode 100644 src/app/error-layout.styled.tsx
create mode 100644 src/app/error-layout.tsx
create mode 100644 src/app/global-error.tsx
create mode 100644 src/app/not-found.tsx
diff --git a/public/img/global-error.svg b/public/img/global-error.svg
new file mode 100644
index 000000000..c3ec82775
--- /dev/null
+++ b/public/img/global-error.svg
@@ -0,0 +1 @@
+bug fixing
\ No newline at end of file
diff --git a/public/img/page_not_found.svg b/public/img/page_not_found.svg
new file mode 100644
index 000000000..3d5fcf261
--- /dev/null
+++ b/public/img/page_not_found.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/app/error-layout.styled.tsx b/src/app/error-layout.styled.tsx
new file mode 100644
index 000000000..57808acfd
--- /dev/null
+++ b/src/app/error-layout.styled.tsx
@@ -0,0 +1,26 @@
+'use client'
+
+import styled from 'styled-components'
+
+export const ContentWrapper = styled.div`
+ display: flex;
+ flex-direction: column-reverse;
+ align-items: center;
+ justify-content: center;
+ padding: 2rem 0;
+ gap: 2rem;
+
+ @media screen and (min-width: ${props => props.theme.breakpoints.md}) {
+ flex-direction: row;
+ }
+
+ * {
+ flex: 1;
+ }
+
+ img {
+ max-width: 100%;
+ height: auto;
+ max-height: 100%;
+ }
+`
diff --git a/src/app/error-layout.tsx b/src/app/error-layout.tsx
new file mode 100644
index 000000000..5b6b4cd09
--- /dev/null
+++ b/src/app/error-layout.tsx
@@ -0,0 +1,39 @@
+import Link from 'next/link'
+
+import Section from '@/components/Section'
+import ResponsiveImage from '@/components/ResponsiveImage'
+
+import { ContentWrapper } from './error-layout.styled'
+
+interface ErrorLayoutProps {
+ title: string
+ subTitle: string
+ imgSrc: string
+ imgAlt: string
+ children: React.ReactNode
+}
+
+export default function ErrorLayout({ title, subTitle, imgSrc, imgAlt, children }: ErrorLayoutProps) {
+ return (
+
+ Page d’accueil
+
+ )}
+ >
+
+
+ {children}
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/global-error.tsx b/src/app/global-error.tsx
new file mode 100644
index 000000000..e341cf80f
--- /dev/null
+++ b/src/app/global-error.tsx
@@ -0,0 +1,34 @@
+'use client'
+
+import ErrorLayout from './error-layout'
+
+export default function GlobalError({
+ error,
+ reset,
+}: {
+ error: Error & { digest?: string }
+ reset: () => void
+}) {
+ return (
+
+
+ Une erreur inattendue est survenue.
+ Excusez-nous pour la gène occasionnée.
+
+
+ Vous pouvez consulter notre page d’accueil.
+ Si le problème persiste, vous pouvez contacter notre support technique.
+
+ {reset && (
+
+ Recharger la page
+
+ )}
+
+ )
+}
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
new file mode 100644
index 000000000..43b499cf3
--- /dev/null
+++ b/src/app/not-found.tsx
@@ -0,0 +1,21 @@
+import ErrorLayout from './error-layout'
+
+export default function NotFound() {
+ return (
+
+
+ La page que vous cherchez est introuvable.
+ Excusez-nous pour la gène occasionnée.
+
+
+ Si vous avez tapé l’adresse web dans le navigateur, vérifiez qu’elle est correcte.
+ Il est egalement possible que la page ne soit plus disponible. Dans ce cas, pour continuer votre visite, vous pouvez consulter notre page d’accueil.
+
+
+ )
+}
From 26bbcf5bebf4f1dff0be04e808d6ede28ca5354c Mon Sep 17 00:00:00 2001
From: Nicolas KOKLA
Date: Wed, 25 Sep 2024 00:19:36 +0200
Subject: [PATCH 03/10] Add new Page "/outils/telechargements"
---
.../markdown/les_donn\303\251es_de_la_BAN.md" | 18 ++
.../outils/telechargements/page.styled.tsx | 39 +++
src/app/outils/telechargements/page.tsx | 232 ++++++++++++++++++
src/layouts/Header.tsx | 3 +-
4 files changed, 291 insertions(+), 1 deletion(-)
create mode 100644 "public/markdown/les_donn\303\251es_de_la_BAN.md"
create mode 100644 src/app/outils/telechargements/page.styled.tsx
create mode 100644 src/app/outils/telechargements/page.tsx
diff --git "a/public/markdown/les_donn\303\251es_de_la_BAN.md" "b/public/markdown/les_donn\303\251es_de_la_BAN.md"
new file mode 100644
index 000000000..a2d52a69c
--- /dev/null
+++ "b/public/markdown/les_donn\303\251es_de_la_BAN.md"
@@ -0,0 +1,18 @@
+---
+title: Découvrir la Base Adresse Nationale
+aside: [{attach: "la-base-adresse-nationale", filename: "decouvrir_la_BAN--la_base_adresse_nationale"}]
+---
+
+## La Base Adresse Nationale
+
+__Base de données de référence pour les adresses en France__
+
+La Base Adresse Nationale est l’une des neuf bases de données du service public des données de référence. Elle est la seule base de données d’adresses officiellement reconnue par l’administration.
+
+Service numérique d’usage partagé et infrastructure socle sur laquelle sont adossées de nombreuses politiques publiques, elle fait partie du système d’information et de communication de l’État et est à ce titre placée sous la responsabilité du Premier ministre.
+
+Son pilotage est assuré par la Direction Interministérielle du Numérique (DINUM), qui est chargée d’en définir les modalités de gouvernance et de fonctionnement (à la suite d’une décision du Premier ministre).
+
+Sa construction est assurée grâce à de nombreux partenaires, et en premier lieu par les communes, seules autorités compétentes en terme d’adressage.
+
+La Base Adresse Nationale est accessible sous forme de fichiers et d’API.
diff --git a/src/app/outils/telechargements/page.styled.tsx b/src/app/outils/telechargements/page.styled.tsx
new file mode 100644
index 000000000..4a17e7a2a
--- /dev/null
+++ b/src/app/outils/telechargements/page.styled.tsx
@@ -0,0 +1,39 @@
+'use client'
+
+import styled, { css } from 'styled-components'
+
+export const TextWrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: flex-start;
+ gap: 1rem;
+
+ article {
+ flex: 65;
+
+ img {
+ max-width: 100%;
+ }
+ }
+
+ aside {
+ flex: 35;
+ min-width: 300px;
+ }
+`
+
+const gap = '1rem'
+export const CardContainer = styled.div<{ $cols?: number }>`
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: ${gap};
+
+ & > div {
+ flex-grow: 1;
+ flex-shrink: 1;
+ flex-basis: ${({ $cols = 3 }) => css`calc(${(100 / $cols).toFixed(2)}% - ${gap})`};
+ min-width: 250px;
+ }
+`
diff --git a/src/app/outils/telechargements/page.tsx b/src/app/outils/telechargements/page.tsx
new file mode 100644
index 000000000..1cae715ad
--- /dev/null
+++ b/src/app/outils/telechargements/page.tsx
@@ -0,0 +1,232 @@
+import { Suspense } from 'react'
+import Link from 'next/link'
+import { CallOut } from '@codegouvfr/react-dsfr/CallOut'
+import { Card } from '@codegouvfr/react-dsfr/Card'
+import { Button } from '@codegouvfr/react-dsfr/Button'
+
+import Section from '@/components/Section'
+import HtmlViewer from '@/components/HtmlViewer'
+import { getMarkdown } from '@/lib/markdown'
+
+import { TextWrapper, CardContainer } from './page.styled'
+
+import type { DataType } from '@/lib/markdown'
+
+export default async function PageDownloadBan() {
+ const { contentHtml, data }: { contentHtml?: string, data?: DataType } = await getMarkdown('les_données_de_la_BAN') || {}
+
+ return (
+ <>
+
}>
+
+ {contentHtml && }
+
+ {
+ data?.aside && (
+ {data?.aside?.map(
+ ({ data }) =>
+ data?.contentHtml && (
+
+
+
+ )
+ )}
+
+ )
+ }
+
+
+
+
+
+
+
+
+ Fichier d’usage général recommandé dans la majorité des cas
+ Couverture nationale
+ Une position par adresse
+
+ )}
+ enlargeLink
+ linkProps={{
+ href: '/data/ban/adresses/latest/csv/adresses-france.csv.gz',
+ target: '_blank',
+ download: true,
+ }}
+ className="fr-card--download"
+ />
+
+
+
+ Fichier CSV au format BAL 1.3 (AITF)
+ Couverture nationale
+ Plusieurs positions par adresse
+
+ )}
+ enlargeLink
+ linkProps={{
+ href: '/data/ban/adresses/latest/csv-bal/adresses-france.csv.gz',
+ target: '_blank',
+ download: true,
+ }}
+ className="fr-card--download"
+ />
+
+
+
+ Fichier spécifique pour le géocodeur Addok
+ Couverture nationale
+ Une position par adresse
+
+ )}
+ enlargeLink
+ linkProps={{
+ href: '/data/ban/adresses/latest/addok/adresses-addok-france.ndjson.gz',
+ target: '_blank',
+ download: true,
+ }}
+ className="fr-card--download"
+ />
+
+
+
+
+
+
+ Retrouvez les tutoriels d’utilisation des flux avec un outil SIG
+
+
+
+
+ Visualisation cartographique des adresses BAN en tuiles vectorielles
+
+ Mise à jour en temps réel
+ 1 position par adresse
+
+ >
+ )}
+ footer={(
+
+ Lire la documentation
+
+ )}
+ />
+
+
+
+ Visualisation cartographique des adresses BAN en WFS
+
+ Mise à jour mensuelle
+ Nom de la couche : BAN.DATA.GOUV:ban
+ 1 position par adresse
+
+ >
+ )}
+ footer={(
+
+ Lire la documentation
+
+ )}
+ />
+
+
+
+ Visualisation cartographique des adresses BAN en WMS
+
+ Mise à jour mensuelle
+ Nom de la couche : BAN.DATA.GOUV
+ 1 position par adresse
+
+ >
+ )}
+ footer={(
+
+ Lire la documentation
+
+ )}
+ />
+
+
+
+ Ce jeu de données contient toutes les adresses extraites des fichiers du cadastre (plan et fichier des parcelles bâties).
+ >
+ )}
+ footer={(
+
+ Voir sur data.gouv.fr
+
+ )}
+ />
+
+
+
+ >
+ )
+}
diff --git a/src/layouts/Header.tsx b/src/layouts/Header.tsx
index 58ff74c2b..42eee9fce 100644
--- a/src/layouts/Header.tsx
+++ b/src/layouts/Header.tsx
@@ -85,7 +85,8 @@ export const navEntries: MainNavigationProps.Item[] = [
// { text: 'Signalement', linkProps: { href: '#' } },
{
text: 'Télécharger les données',
- linkProps: { href: '/donnees-nationales' },
+ // linkProps: { href: '/donnees-nationales' }, // TODO: Use redirection
+ linkProps: { href: '/outils/telechargements' },
},
{ text: 'Validateur BAL', linkProps: { href: '/validateur' } },
// { text: 'Géocodeur', linkProps: { href: '#' } },
From 4ee9c5383994dd4b9b1bda2b7dc530d5e5231f5d Mon Sep 17 00:00:00 2001
From: Nicolas KOKLA
Date: Wed, 25 Sep 2024 00:23:32 +0200
Subject: [PATCH 04/10] Add new deps for AWS S3 client and files sending
---
package-lock.json | 1889 ++++++++++++++++++++++++++++++++++++++++-----
package.json | 2 +
2 files changed, 1699 insertions(+), 192 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d96a7875b..d3d15e889 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,7 @@
"name": "adresse.data.gouv.fr",
"version": "2.0.0-alpha",
"dependencies": {
+ "@aws-sdk/client-s3": "^3.645.0",
"@codegouvfr/react-dsfr": "^1.10.11",
"@etalab/decoupage-administratif": "^4.0.0",
"@socialgouv/matomo-next": "^1.9.0",
@@ -24,6 +25,7 @@
"remark": "^15.0.1",
"remark-heading-id": "^1.0.1",
"remark-html": "^16.0.1",
+ "send": "^0.18.0",
"styled-components": "^6.1.12",
"vt-pbf": "^3.1.3"
},
@@ -74,6 +76,858 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@aws-crypto/crc32": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz",
+ "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==",
+ "dependencies": {
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/crc32c": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz",
+ "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==",
+ "dependencies": {
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/sha1-browser": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz",
+ "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==",
+ "dependencies": {
+ "@aws-crypto/supports-web-crypto": "^5.2.0",
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz",
+ "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==",
+ "dependencies": {
+ "@aws-crypto/sha256-js": "^5.2.0",
+ "@aws-crypto/supports-web-crypto": "^5.2.0",
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
+ "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
+ "dependencies": {
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/supports-web-crypto": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz",
+ "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/util": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
+ "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
+ "dependencies": {
+ "@aws-sdk/types": "^3.222.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.658.0.tgz",
+ "integrity": "sha512-3lyew20RoLKg9S1RzVyYgLNxknoXkN/0o9PMiRq77yBIQHZj3x7/wmKseiGEFoF08YKFkh1MPq/p34qRlOmtBg==",
+ "dependencies": {
+ "@aws-crypto/sha1-browser": "5.2.0",
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/client-sso-oidc": "3.658.0",
+ "@aws-sdk/client-sts": "3.658.0",
+ "@aws-sdk/core": "3.658.0",
+ "@aws-sdk/credential-provider-node": "3.658.0",
+ "@aws-sdk/middleware-bucket-endpoint": "3.654.0",
+ "@aws-sdk/middleware-expect-continue": "3.654.0",
+ "@aws-sdk/middleware-flexible-checksums": "3.657.0",
+ "@aws-sdk/middleware-host-header": "3.654.0",
+ "@aws-sdk/middleware-location-constraint": "3.654.0",
+ "@aws-sdk/middleware-logger": "3.654.0",
+ "@aws-sdk/middleware-recursion-detection": "3.654.0",
+ "@aws-sdk/middleware-sdk-s3": "3.658.0",
+ "@aws-sdk/middleware-ssec": "3.654.0",
+ "@aws-sdk/middleware-user-agent": "3.654.0",
+ "@aws-sdk/region-config-resolver": "3.654.0",
+ "@aws-sdk/signature-v4-multi-region": "3.658.0",
+ "@aws-sdk/types": "3.654.0",
+ "@aws-sdk/util-endpoints": "3.654.0",
+ "@aws-sdk/util-user-agent-browser": "3.654.0",
+ "@aws-sdk/util-user-agent-node": "3.654.0",
+ "@aws-sdk/xml-builder": "3.654.0",
+ "@smithy/config-resolver": "^3.0.8",
+ "@smithy/core": "^2.4.3",
+ "@smithy/eventstream-serde-browser": "^3.0.9",
+ "@smithy/eventstream-serde-config-resolver": "^3.0.6",
+ "@smithy/eventstream-serde-node": "^3.0.8",
+ "@smithy/fetch-http-handler": "^3.2.7",
+ "@smithy/hash-blob-browser": "^3.1.5",
+ "@smithy/hash-node": "^3.0.6",
+ "@smithy/hash-stream-node": "^3.1.5",
+ "@smithy/invalid-dependency": "^3.0.6",
+ "@smithy/md5-js": "^3.0.6",
+ "@smithy/middleware-content-length": "^3.0.8",
+ "@smithy/middleware-endpoint": "^3.1.3",
+ "@smithy/middleware-retry": "^3.0.18",
+ "@smithy/middleware-serde": "^3.0.6",
+ "@smithy/middleware-stack": "^3.0.6",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/node-http-handler": "^3.2.2",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/smithy-client": "^3.3.2",
+ "@smithy/types": "^3.4.2",
+ "@smithy/url-parser": "^3.0.6",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-body-length-node": "^3.0.0",
+ "@smithy/util-defaults-mode-browser": "^3.0.18",
+ "@smithy/util-defaults-mode-node": "^3.0.18",
+ "@smithy/util-endpoints": "^2.1.2",
+ "@smithy/util-middleware": "^3.0.6",
+ "@smithy/util-retry": "^3.0.6",
+ "@smithy/util-stream": "^3.1.6",
+ "@smithy/util-utf8": "^3.0.0",
+ "@smithy/util-waiter": "^3.1.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.658.0.tgz",
+ "integrity": "sha512-OtT6bXthyP/z7x2QDTWYz0mteXhQvV+mH4JgT7dW1Y5Kc/Xr85kIQ0ouypSLH14DeiT1Gd21kXKy4YuLEoWaYQ==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "3.658.0",
+ "@aws-sdk/middleware-host-header": "3.654.0",
+ "@aws-sdk/middleware-logger": "3.654.0",
+ "@aws-sdk/middleware-recursion-detection": "3.654.0",
+ "@aws-sdk/middleware-user-agent": "3.654.0",
+ "@aws-sdk/region-config-resolver": "3.654.0",
+ "@aws-sdk/types": "3.654.0",
+ "@aws-sdk/util-endpoints": "3.654.0",
+ "@aws-sdk/util-user-agent-browser": "3.654.0",
+ "@aws-sdk/util-user-agent-node": "3.654.0",
+ "@smithy/config-resolver": "^3.0.8",
+ "@smithy/core": "^2.4.3",
+ "@smithy/fetch-http-handler": "^3.2.7",
+ "@smithy/hash-node": "^3.0.6",
+ "@smithy/invalid-dependency": "^3.0.6",
+ "@smithy/middleware-content-length": "^3.0.8",
+ "@smithy/middleware-endpoint": "^3.1.3",
+ "@smithy/middleware-retry": "^3.0.18",
+ "@smithy/middleware-serde": "^3.0.6",
+ "@smithy/middleware-stack": "^3.0.6",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/node-http-handler": "^3.2.2",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/smithy-client": "^3.3.2",
+ "@smithy/types": "^3.4.2",
+ "@smithy/url-parser": "^3.0.6",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-body-length-node": "^3.0.0",
+ "@smithy/util-defaults-mode-browser": "^3.0.18",
+ "@smithy/util-defaults-mode-node": "^3.0.18",
+ "@smithy/util-endpoints": "^2.1.2",
+ "@smithy/util-middleware": "^3.0.6",
+ "@smithy/util-retry": "^3.0.6",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.658.0.tgz",
+ "integrity": "sha512-+oZcf9Wm7BlAhakSnxftmpeMwJLXQPesOcIX+ViF6HWSfMid4LY8Cq0jJ9si3HSe216GVMiAlBbNksayzHNdlA==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "3.658.0",
+ "@aws-sdk/credential-provider-node": "3.658.0",
+ "@aws-sdk/middleware-host-header": "3.654.0",
+ "@aws-sdk/middleware-logger": "3.654.0",
+ "@aws-sdk/middleware-recursion-detection": "3.654.0",
+ "@aws-sdk/middleware-user-agent": "3.654.0",
+ "@aws-sdk/region-config-resolver": "3.654.0",
+ "@aws-sdk/types": "3.654.0",
+ "@aws-sdk/util-endpoints": "3.654.0",
+ "@aws-sdk/util-user-agent-browser": "3.654.0",
+ "@aws-sdk/util-user-agent-node": "3.654.0",
+ "@smithy/config-resolver": "^3.0.8",
+ "@smithy/core": "^2.4.3",
+ "@smithy/fetch-http-handler": "^3.2.7",
+ "@smithy/hash-node": "^3.0.6",
+ "@smithy/invalid-dependency": "^3.0.6",
+ "@smithy/middleware-content-length": "^3.0.8",
+ "@smithy/middleware-endpoint": "^3.1.3",
+ "@smithy/middleware-retry": "^3.0.18",
+ "@smithy/middleware-serde": "^3.0.6",
+ "@smithy/middleware-stack": "^3.0.6",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/node-http-handler": "^3.2.2",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/smithy-client": "^3.3.2",
+ "@smithy/types": "^3.4.2",
+ "@smithy/url-parser": "^3.0.6",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-body-length-node": "^3.0.0",
+ "@smithy/util-defaults-mode-browser": "^3.0.18",
+ "@smithy/util-defaults-mode-node": "^3.0.18",
+ "@smithy/util-endpoints": "^2.1.2",
+ "@smithy/util-middleware": "^3.0.6",
+ "@smithy/util-retry": "^3.0.6",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/client-sts": "^3.658.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sts": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.658.0.tgz",
+ "integrity": "sha512-SffIgt/Mzwq3ijkg3lZjndkrqS1d6OeDcUi7IAO2w4KC4nM6yH1zZNSjNWvdjEvUp0Gz2kk54HvyP/r9DqTg6Q==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/client-sso-oidc": "3.658.0",
+ "@aws-sdk/core": "3.658.0",
+ "@aws-sdk/credential-provider-node": "3.658.0",
+ "@aws-sdk/middleware-host-header": "3.654.0",
+ "@aws-sdk/middleware-logger": "3.654.0",
+ "@aws-sdk/middleware-recursion-detection": "3.654.0",
+ "@aws-sdk/middleware-user-agent": "3.654.0",
+ "@aws-sdk/region-config-resolver": "3.654.0",
+ "@aws-sdk/types": "3.654.0",
+ "@aws-sdk/util-endpoints": "3.654.0",
+ "@aws-sdk/util-user-agent-browser": "3.654.0",
+ "@aws-sdk/util-user-agent-node": "3.654.0",
+ "@smithy/config-resolver": "^3.0.8",
+ "@smithy/core": "^2.4.3",
+ "@smithy/fetch-http-handler": "^3.2.7",
+ "@smithy/hash-node": "^3.0.6",
+ "@smithy/invalid-dependency": "^3.0.6",
+ "@smithy/middleware-content-length": "^3.0.8",
+ "@smithy/middleware-endpoint": "^3.1.3",
+ "@smithy/middleware-retry": "^3.0.18",
+ "@smithy/middleware-serde": "^3.0.6",
+ "@smithy/middleware-stack": "^3.0.6",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/node-http-handler": "^3.2.2",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/smithy-client": "^3.3.2",
+ "@smithy/types": "^3.4.2",
+ "@smithy/url-parser": "^3.0.6",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-body-length-node": "^3.0.0",
+ "@smithy/util-defaults-mode-browser": "^3.0.18",
+ "@smithy/util-defaults-mode-node": "^3.0.18",
+ "@smithy/util-endpoints": "^2.1.2",
+ "@smithy/util-middleware": "^3.0.6",
+ "@smithy/util-retry": "^3.0.6",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/core": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.658.0.tgz",
+ "integrity": "sha512-vtOUqYD2/SfWGxmfYneiqv4R64qtSRPqznHUcMCusq71ZG9iz90ZxRYxS8ABrvhWD+oUqnxHesO08VYtaL4oAg==",
+ "dependencies": {
+ "@smithy/core": "^2.4.3",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/signature-v4": "^4.1.3",
+ "@smithy/smithy-client": "^3.3.2",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-middleware": "^3.0.6",
+ "fast-xml-parser": "4.4.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.654.0.tgz",
+ "integrity": "sha512-kogsx3Ql81JouHS7DkheCDU9MYAvK0AokxjcshDveGmf7BbgbWCA8Fnb9wjQyNDaOXNvkZu8Z8rgkX91z324/w==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.654.0.tgz",
+ "integrity": "sha512-tgmAH4MBi/aDR882lfw48+tDV95ZH3GWc1Eoe6DpNLiM3GN2VfU/cZwuHmi6aq+vAbdIlswBHJ/+va0fOvlyjw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/fetch-http-handler": "^3.2.7",
+ "@smithy/node-http-handler": "^3.2.2",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/smithy-client": "^3.3.2",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-stream": "^3.1.6",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.658.0.tgz",
+ "integrity": "sha512-fL4hAeF2jjSZ3Dm/kmU9AEDO8UARhUagUJ/UfXMxvkvmQ/jLydKA3ip5jMSf1fhu1TWoi/JBE/4cjKDbjwMzXA==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.654.0",
+ "@aws-sdk/credential-provider-http": "3.654.0",
+ "@aws-sdk/credential-provider-process": "3.654.0",
+ "@aws-sdk/credential-provider-sso": "3.658.0",
+ "@aws-sdk/credential-provider-web-identity": "3.654.0",
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/credential-provider-imds": "^3.2.3",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/shared-ini-file-loader": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/client-sts": "^3.658.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.658.0.tgz",
+ "integrity": "sha512-rdWBylUdT6/dK+zBj7jajJpUQ3rP/YvKo0peYhpTgpUSHjqkjrx/BRXE+iccbFimR8QSxwOJ4tsb15Gvuv0E4Q==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.654.0",
+ "@aws-sdk/credential-provider-http": "3.654.0",
+ "@aws-sdk/credential-provider-ini": "3.658.0",
+ "@aws-sdk/credential-provider-process": "3.654.0",
+ "@aws-sdk/credential-provider-sso": "3.658.0",
+ "@aws-sdk/credential-provider-web-identity": "3.654.0",
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/credential-provider-imds": "^3.2.3",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/shared-ini-file-loader": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.654.0.tgz",
+ "integrity": "sha512-PmQoo8sZ9Q2Ow8OMzK++Z9lI7MsRUG7sNq3E72DVA215dhtTICTDQwGlXH2AAmIp7n+G9LLRds+4wo2ehG4mkg==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/shared-ini-file-loader": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.658.0.tgz",
+ "integrity": "sha512-zK5FwCZJ9OovBPpoVfhlNyUhdFCgkkVbQolR47UKXCREH/P6sOsVay4/CnwtVQeMGlv9c8F41ELJXWaTRmdwHA==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.658.0",
+ "@aws-sdk/token-providers": "3.654.0",
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/shared-ini-file-loader": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.654.0.tgz",
+ "integrity": "sha512-6a2g9gMtZToqSu+CusjNK5zvbLJahQ9di7buO3iXgbizXpLXU1rnawCpWxwslMpT5fLgMSKDnKDrr6wdEk7jSw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/client-sts": "^3.654.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-bucket-endpoint": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.654.0.tgz",
+ "integrity": "sha512-/lWkyeLESiK+rAB4+NCw1cVPle9RN7RW/v7B4b8ORiCn1FwZLUPmEiZSYzyh4in5oa3Mri+W/g+KafZDH6LCbA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@aws-sdk/util-arn-parser": "3.568.0",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-config-provider": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-expect-continue": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.654.0.tgz",
+ "integrity": "sha512-S7fSlo8vdjkQTy9DmdF54ZsPwc+aA4z5Y9JVqAlGL9QiZe/fPtRE3GZ8BBbMICjBfMEa12tWjzhDz9su2c6PIA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-flexible-checksums": {
+ "version": "3.657.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.657.0.tgz",
+ "integrity": "sha512-aOfK0YmuL8baCqJ5nArHKyyFko/tSWMjGcegOA4Jo+XAu1PEk0wDi78vOHlv4dfSlF8sXJsAo4kaCEDF3UkGAQ==",
+ "dependencies": {
+ "@aws-crypto/crc32": "5.2.0",
+ "@aws-crypto/crc32c": "5.2.0",
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/is-array-buffer": "^3.0.0",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-middleware": "^3.0.6",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.654.0.tgz",
+ "integrity": "sha512-rxGgVHWKp8U2ubMv+t+vlIk7QYUaRCHaVpmUlJv0Wv6Q0KeO9a42T9FxHphjOTlCGQOLcjCreL9CF8Qhtb4mdQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-location-constraint": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.654.0.tgz",
+ "integrity": "sha512-Duvv5c4DEQ7P6c0YlcvEUW3xCJi6X2uktafNGjILhVDMQwShSF/aFqNv/ikWU/luQcmWHZ9DtDjTR9UKLh6eTA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.654.0.tgz",
+ "integrity": "sha512-OQYb+nWlmASyXfRb989pwkJ9EVUMP1CrKn2eyTk3usl20JZmKo2Vjis6I0tLUkMSxMhnBJJlQKyWkRpD/u1FVg==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.654.0.tgz",
+ "integrity": "sha512-gKSomgltKVmsT8sC6W7CrADZ4GHwX9epk3GcH6QhebVO3LA9LRbkL3TwOPUXakxxOLLUTYdOZLIOtFf7iH00lg==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-s3": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.658.0.tgz",
+ "integrity": "sha512-LLJjO+74tXiJvMEsZ7v4M+1aJKZsNWbf/TvZCuNpNkvUakVWCkmPQl2Qmaft/y0LABADSz5yCSFAe2CZz5nIHw==",
+ "dependencies": {
+ "@aws-sdk/core": "3.658.0",
+ "@aws-sdk/types": "3.654.0",
+ "@aws-sdk/util-arn-parser": "3.568.0",
+ "@smithy/core": "^2.4.3",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/signature-v4": "^4.1.3",
+ "@smithy/smithy-client": "^3.3.2",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-config-provider": "^3.0.0",
+ "@smithy/util-middleware": "^3.0.6",
+ "@smithy/util-stream": "^3.1.6",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-ssec": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.654.0.tgz",
+ "integrity": "sha512-k7hkQDJh4hcRJC7YojQ11kc37SY4foryen26Eafj5qYjeG2OGMW0oZTJDl1TVFJ7AcCjqIuMIo0Ho2US/2JspQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.654.0.tgz",
+ "integrity": "sha512-liCcqPAyRsr53cy2tYu4qeH4MMN0eh9g6k56XzI5xd4SghXH5YWh4qOYAlQ8T66ZV4nPMtD8GLtLXGzsH8moFg==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@aws-sdk/util-endpoints": "3.654.0",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/region-config-resolver": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.654.0.tgz",
+ "integrity": "sha512-ydGOrXJxj3x0sJhsXyTmvJVLAE0xxuTWFJihTl67RtaO7VRNtd82I3P3bwoMMaDn5WpmV5mPo8fEUDRlBm3fPg==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-config-provider": "^3.0.0",
+ "@smithy/util-middleware": "^3.0.6",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/signature-v4-multi-region": {
+ "version": "3.658.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.658.0.tgz",
+ "integrity": "sha512-eK00rYVQVG2fqqR8QxrjxZxgJKasyz3honFfKFNB5nKyOvKXkVI5QJ3HvbrWgRaMt21n2qcYQZxTO6dTkfeWVA==",
+ "dependencies": {
+ "@aws-sdk/middleware-sdk-s3": "3.658.0",
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/signature-v4": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/token-providers": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.654.0.tgz",
+ "integrity": "sha512-D8GeJYmvbfWkQDtTB4owmIobSMexZel0fOoetwvgCQ/7L8VPph3Q2bn1TRRIXvH7wdt6DcDxA3tKMHPBkT3GlA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/shared-ini-file-loader": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/client-sso-oidc": "^3.654.0"
+ }
+ },
+ "node_modules/@aws-sdk/types": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.654.0.tgz",
+ "integrity": "sha512-VWvbED3SV+10QJIcmU/PKjsKilsTV16d1I7/on4bvD/jo1qGeMXqLDBSen3ks/tuvXZF/mFc7ZW/W2DiLVtO7A==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-arn-parser": {
+ "version": "3.568.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz",
+ "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-endpoints": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.654.0.tgz",
+ "integrity": "sha512-i902fcBknHs0Irgdpi62+QMvzxE+bczvILXigYrlHL4+PiEnlMVpni5L5W1qCkNZXf8AaMrSBuR1NZAGp6UOUw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-endpoints": "^2.1.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-locate-window": {
+ "version": "3.568.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz",
+ "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.654.0.tgz",
+ "integrity": "sha512-ykYAJqvnxLt7wfrqya28wuH3/7NdrwzfiFd7NqEVQf7dXVxL5RPEpD7DxjcyQo3DsHvvdUvGZVaQhozycn1pzA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/types": "^3.4.2",
+ "bowser": "^2.11.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.654.0.tgz",
+ "integrity": "sha512-a0ojjdBN6pqv6gB4H/QPPSfhs7mFtlVwnmKCM/QrTaFzN0U810PJ1BST3lBx5sa23I5jWHGaoFY+5q65C3clLQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.654.0",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aws-sdk/xml-builder": {
+ "version": "3.654.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.654.0.tgz",
+ "integrity": "sha512-qA2diK3d/ztC8HUb7NwPKbJRV01NpzTzxFn+L5G3HzJBNeKbjLcprQ/9uG9gp2UEx2Go782FI1ddrMNa0qBICA==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
@@ -3585,222 +4439,862 @@
"node": ">= 10"
}
},
- "node_modules/@next/swc-linux-x64-gnu": {
- "version": "14.2.5",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz",
- "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "14.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz",
+ "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "14.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz",
+ "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "14.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz",
+ "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-ia32-msvc": {
+ "version": "14.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz",
+ "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "14.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz",
+ "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz",
+ "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-html": "^0.0.9",
+ "core-js-pure": "^3.23.3",
+ "error-stack-parser": "^2.0.6",
+ "html-entities": "^2.1.0",
+ "loader-utils": "^2.0.4",
+ "schema-utils": "^4.2.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "@types/webpack": "4.x || 5.x",
+ "react-refresh": ">=0.10.0 <1.0.0",
+ "sockjs-client": "^1.4.0",
+ "type-fest": ">=0.17.0 <5.0.0",
+ "webpack": ">=4.43.0 <6.0.0",
+ "webpack-dev-server": "3.x || 4.x || 5.x",
+ "webpack-hot-middleware": "2.x",
+ "webpack-plugin-serve": "0.x || 1.x"
+ },
+ "peerDependenciesMeta": {
+ "@types/webpack": {
+ "optional": true
+ },
+ "sockjs-client": {
+ "optional": true
+ },
+ "type-fest": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ },
+ "webpack-hot-middleware": {
+ "optional": true
+ },
+ "webpack-plugin-serve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz",
+ "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==",
+ "dev": true
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "dev": true
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
+ "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@smithy/abort-controller": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.4.tgz",
+ "integrity": "sha512-VupaALAQlXViW3/enTf/f5l5JZYSAxoJL7f0nanhNNKnww6DGCg1oYIuNP78KDugnkwthBO6iEcym16HhWV8RQ==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/chunked-blob-reader": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz",
+ "integrity": "sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/chunked-blob-reader-native": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz",
+ "integrity": "sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==",
+ "dependencies": {
+ "@smithy/util-base64": "^3.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/config-resolver": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.8.tgz",
+ "integrity": "sha512-Tv1obAC18XOd2OnDAjSWmmthzx6Pdeh63FbLin8MlPiuJ2ATpKkq0NcNOJFr0dO+JmZXnwu8FQxKJ3TKJ3Hulw==",
+ "dependencies": {
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-config-provider": "^3.0.0",
+ "@smithy/util-middleware": "^3.0.6",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/core": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.6.tgz",
+ "integrity": "sha512-6lQQp99hnyuNNIzeTYSzCUXJHwvvFLY7hfdFGSJM95tjRDJGfzWYFRBXPaM9766LiiTsQ561KErtbufzUFSYUg==",
+ "dependencies": {
+ "@smithy/middleware-endpoint": "^3.1.3",
+ "@smithy/middleware-retry": "^3.0.21",
+ "@smithy/middleware-serde": "^3.0.6",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/smithy-client": "^3.3.5",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-middleware": "^3.0.6",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/credential-provider-imds": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.3.tgz",
+ "integrity": "sha512-VoxMzSzdvkkjMJNE38yQgx4CfnmT+Z+5EUXkg4x7yag93eQkVQgZvN3XBSHC/ylfBbLbAtdu7flTCChX9I+mVg==",
+ "dependencies": {
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/types": "^3.4.2",
+ "@smithy/url-parser": "^3.0.6",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-codec": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.5.tgz",
+ "integrity": "sha512-6pu+PT2r+5ZnWEV3vLV1DzyrpJ0TmehQlniIDCSpZg6+Ji2SfOI38EqUyQ+O8lotVElCrfVc9chKtSMe9cmCZQ==",
+ "dependencies": {
+ "@aws-crypto/crc32": "5.2.0",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-hex-encoding": "^3.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-browser": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.9.tgz",
+ "integrity": "sha512-PiQLo6OQmZAotJweIcObL1H44gkvuJACKMNqpBBe5Rf2Ax1DOcGi/28+feZI7yTe1ERHlQQaGnm8sSkyDUgsMg==",
+ "dependencies": {
+ "@smithy/eventstream-serde-universal": "^3.0.8",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-config-resolver": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.6.tgz",
+ "integrity": "sha512-iew15It+c7WfnVowWkt2a7cdPp533LFJnpjDQgfZQcxv2QiOcyEcea31mnrk5PVbgo0nNH3VbYGq7myw2q/F6A==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-node": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.8.tgz",
+ "integrity": "sha512-6m+wI+fT0na+6oao6UqALVA38fsScCpoG5UO/A8ZSyGLnPM2i4MS1cFUhpuALgvLMxfYoTCh7qSeJa0aG4IWpQ==",
+ "dependencies": {
+ "@smithy/eventstream-serde-universal": "^3.0.8",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-universal": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.8.tgz",
+ "integrity": "sha512-09tqzIQ6e+7jLqGvRji1yJoDbL/zob0OFhq75edgStWErGLf16+yI5hRc/o9/YAybOhUZs/swpW2SPn892G5Gg==",
+ "dependencies": {
+ "@smithy/eventstream-codec": "^3.1.5",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/fetch-http-handler": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.8.tgz",
+ "integrity": "sha512-Lqe0B8F5RM7zkw//6avq1SJ8AfaRd3ubFUS1eVp5WszV7p6Ne5hQ4dSuMHDpNRPhgTvj4va9Kd/pcVigHEHRow==",
+ "dependencies": {
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/querystring-builder": "^3.0.6",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-base64": "^3.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/hash-blob-browser": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.5.tgz",
+ "integrity": "sha512-Vi3eoNCmao4iKglS80ktYnBOIqZhjbDDwa1IIbF/VaJ8PsHnZTQ5wSicicPrU7nTI4JPFn92/txzWkh4GlK18Q==",
+ "dependencies": {
+ "@smithy/chunked-blob-reader": "^3.0.0",
+ "@smithy/chunked-blob-reader-native": "^3.0.0",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/hash-node": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.6.tgz",
+ "integrity": "sha512-c/FHEdKK/7DU2z6ZE91L36ahyXWayR3B+FzELjnYq7wH5YqIseM24V+pWCS9kFn1Ln8OFGTf+pyYPiHZuX0s/Q==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-buffer-from": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/hash-stream-node": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.5.tgz",
+ "integrity": "sha512-61CyFCzqN3VBfcnGX7mof/rkzLb8oHjm4Lr6ZwBIRpBssBb8d09ChrZAqinP2rUrA915BRNkq9NpJz18N7+3hQ==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/invalid-dependency": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.6.tgz",
+ "integrity": "sha512-czM7Ioq3s8pIXht7oD+vmgy4Wfb4XavU/k/irO8NdXFFOx7YAlsCCcKOh/lJD1mJSYQqiR7NmpZ9JviryD/7AQ==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/is-array-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz",
+ "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/md5-js": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.6.tgz",
+ "integrity": "sha512-Ze690T8O3M5SVbb70WormwrKzVf9QQRtIuxtJDgpUQDkmt+PtdYDetBbyCbF9ryupxLw6tgzWKgwffAShhVIXQ==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/middleware-content-length": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.8.tgz",
+ "integrity": "sha512-VuyszlSO49WKh3H9/kIO2kf07VUwGV80QRiaDxUfP8P8UKlokz381ETJvwLhwuypBYhLymCYyNhB3fLAGBX2og==",
+ "dependencies": {
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-endpoint": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.3.tgz",
+ "integrity": "sha512-KeM/OrK8MVFUsoJsmCN0MZMVPjKKLudn13xpgwIMpGTYpA8QZB2Xq5tJ+RE6iu3A6NhOI4VajDTwBsm8pwwrhg==",
+ "dependencies": {
+ "@smithy/middleware-serde": "^3.0.6",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/shared-ini-file-loader": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "@smithy/url-parser": "^3.0.6",
+ "@smithy/util-middleware": "^3.0.6",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-retry": {
+ "version": "3.0.21",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.21.tgz",
+ "integrity": "sha512-/h0fElV95LekVVEJuSw+aI11S1Y3zIUwBc6h9ZbUv43Gl2weXsbQwjLoet6j/Qtb0phfrSxS6pNg6FqgJOWZkA==",
+ "dependencies": {
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/service-error-classification": "^3.0.6",
+ "@smithy/smithy-client": "^3.3.5",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-middleware": "^3.0.6",
+ "@smithy/util-retry": "^3.0.6",
+ "tslib": "^2.6.2",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-serde": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.6.tgz",
+ "integrity": "sha512-KKTUSl1MzOM0MAjGbudeaVNtIDo+PpekTBkCNwvfZlKndodrnvRo+00USatiyLOc0ujjO9UydMRu3O9dYML7ag==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-stack": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.6.tgz",
+ "integrity": "sha512-2c0eSYhTQ8xQqHMcRxLMpadFbTXg6Zla5l0mwNftFCZMQmuhI7EbAJMx6R5eqfuV3YbJ3QGyS3d5uSmrHV8Khg==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/node-config-provider": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.7.tgz",
+ "integrity": "sha512-g3mfnC3Oo8pOI0dYuPXLtdW1WGVb3bR2tkV21GNkm0ZvQjLTtamXAwCWt/FCb0HGvKt3gHHmF1XerG0ICfalOg==",
+ "dependencies": {
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/shared-ini-file-loader": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.3.tgz",
+ "integrity": "sha512-/gcm5DJ3k1b1zEInzBGAZC8ntJ+jwrz1NcSIu+9dSXd1FfG0G6QgkDI40tt8/WYUbHtLyo8fEqtm2v29koWo/w==",
+ "dependencies": {
+ "@smithy/abort-controller": "^3.1.4",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/querystring-builder": "^3.0.6",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/property-provider": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.6.tgz",
+ "integrity": "sha512-NK3y/T7Q/Bw+Z8vsVs9MYIQ5v7gOX7clyrXcwhhIBQhbPgRl6JDrZbusO9qWDhcEus75Tg+VCxtIRfo3H76fpw==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/protocol-http": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.3.tgz",
+ "integrity": "sha512-GcbMmOYpH9iRqtC05RbRnc/0FssxSTHlmaNhYBTgSgNCYpdR3Kt88u5GAZTBmouzv+Zlj/VRv92J9ruuDeJuEw==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-builder": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.6.tgz",
+ "integrity": "sha512-sQe08RunoObe+Usujn9+R2zrLuQERi3CWvRO3BvnoWSYUaIrLKuAIeY7cMeDax6xGyfIP3x/yFWbEKSXvOnvVg==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-uri-escape": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-parser": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.6.tgz",
+ "integrity": "sha512-UJKw4LlEkytzz2Wq+uIdHf6qOtFfee/o7ruH0jF5I6UAuU+19r9QV7nU3P/uI0l6+oElRHmG/5cBBcGJrD7Ozg==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/service-error-classification": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.6.tgz",
+ "integrity": "sha512-53SpchU3+DUZrN7J6sBx9tBiCVGzsib2e4sc512Q7K9fpC5zkJKs6Z9s+qbMxSYrkEkle6hnMtrts7XNkMJJMg==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/shared-ini-file-loader": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.7.tgz",
+ "integrity": "sha512-IA4K2qTJYXkF5OfVN4vsY1hfnUZjaslEE8Fsr/gGFza4TAC2A9NfnZuSY2srQIbt9bwtjHiAayrRVgKse4Q7fA==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/signature-v4": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.4.tgz",
+ "integrity": "sha512-72MiK7xYukNsnLJI9NqvUHqTu0ziEsfMsYNlWpiJfuGQnCTFKpckThlEatirvcA/LmT1h7rRO+pJD06PYsPu9Q==",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^3.0.0",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-hex-encoding": "^3.0.0",
+ "@smithy/util-middleware": "^3.0.6",
+ "@smithy/util-uri-escape": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">=16.0.0"
}
},
- "node_modules/@next/swc-linux-x64-musl": {
- "version": "14.2.5",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz",
- "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
+ "node_modules/@smithy/smithy-client": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.5.tgz",
+ "integrity": "sha512-7IZi8J3Dr9n3tX+lcpmJ/5tCYIqoXdblFBaPuv0SEKZFRpCxE+TqIWL6I3t7jLlk9TWu3JSvEZAhtjB9yvB+zA==",
+ "dependencies": {
+ "@smithy/middleware-endpoint": "^3.1.3",
+ "@smithy/middleware-stack": "^3.0.6",
+ "@smithy/protocol-http": "^4.1.3",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-stream": "^3.1.8",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">=16.0.0"
}
},
- "node_modules/@next/swc-win32-arm64-msvc": {
- "version": "14.2.5",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz",
- "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
+ "node_modules/@smithy/types": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz",
+ "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">=16.0.0"
}
},
- "node_modules/@next/swc-win32-ia32-msvc": {
- "version": "14.2.5",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz",
- "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
+ "node_modules/@smithy/url-parser": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.6.tgz",
+ "integrity": "sha512-47Op/NU8Opt49KyGpHtVdnmmJMsp2hEwBdyjuFB9M2V5QVOwA7pBhhxKN5z6ztKGrMw76gd8MlbPuzzvaAncuQ==",
+ "dependencies": {
+ "@smithy/querystring-parser": "^3.0.6",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
}
},
- "node_modules/@next/swc-win32-x64-msvc": {
- "version": "14.2.5",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz",
- "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
+ "node_modules/@smithy/util-base64": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz",
+ "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">=16.0.0"
}
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
+ "node_modules/@smithy/util-body-length-browser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz",
+ "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==",
"dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/util-body-length-node": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz",
+ "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==",
+ "dependencies": {
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">= 8"
+ "node": ">=16.0.0"
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
+ "node_modules/@smithy/util-buffer-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz",
+ "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">= 8"
+ "node": ">=16.0.0"
}
},
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
+ "node_modules/@smithy/util-config-provider": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz",
+ "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==",
"dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">= 8"
+ "node": ">=16.0.0"
}
},
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "dev": true,
- "optional": true,
+ "node_modules/@smithy/util-defaults-mode-browser": {
+ "version": "3.0.21",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.21.tgz",
+ "integrity": "sha512-M/FhTBk4c/SsB91dD/M4gMGfJO7z/qJaM9+XQQIqBOf4qzZYMExnP7R4VdGwxxH8IKMGW+8F0I4rNtVRrcfPoA==",
+ "dependencies": {
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/smithy-client": "^3.3.5",
+ "@smithy/types": "^3.4.2",
+ "bowser": "^2.11.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=14"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
- "version": "0.5.15",
- "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz",
- "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==",
- "dev": true,
+ "node_modules/@smithy/util-defaults-mode-node": {
+ "version": "3.0.21",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.21.tgz",
+ "integrity": "sha512-NiLinPvF86U3S2Pdx/ycqd4bnY5dmFSPNL5KYRwbNjqQFS09M5Wzqk8BNk61/47xCYz1X/6KeiSk9qgYPTtuDw==",
"dependencies": {
- "ansi-html": "^0.0.9",
- "core-js-pure": "^3.23.3",
- "error-stack-parser": "^2.0.6",
- "html-entities": "^2.1.0",
- "loader-utils": "^2.0.4",
- "schema-utils": "^4.2.0",
- "source-map": "^0.7.3"
+ "@smithy/config-resolver": "^3.0.8",
+ "@smithy/credential-provider-imds": "^3.2.3",
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/property-provider": "^3.1.6",
+ "@smithy/smithy-client": "^3.3.5",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">= 10.13"
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@smithy/util-endpoints": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.2.tgz",
+ "integrity": "sha512-FEISzffb4H8DLzGq1g4MuDpcv6CIG15fXoQzDH9SjpRJv6h7J++1STFWWinilG0tQh9H1v2UKWG19Jjr2B16zQ==",
+ "dependencies": {
+ "@smithy/node-config-provider": "^3.1.7",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@types/webpack": "4.x || 5.x",
- "react-refresh": ">=0.10.0 <1.0.0",
- "sockjs-client": "^1.4.0",
- "type-fest": ">=0.17.0 <5.0.0",
- "webpack": ">=4.43.0 <6.0.0",
- "webpack-dev-server": "3.x || 4.x || 5.x",
- "webpack-hot-middleware": "2.x",
- "webpack-plugin-serve": "0.x || 1.x"
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-hex-encoding": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz",
+ "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==",
+ "dependencies": {
+ "tslib": "^2.6.2"
},
- "peerDependenciesMeta": {
- "@types/webpack": {
- "optional": true
- },
- "sockjs-client": {
- "optional": true
- },
- "type-fest": {
- "optional": true
- },
- "webpack-dev-server": {
- "optional": true
- },
- "webpack-hot-middleware": {
- "optional": true
- },
- "webpack-plugin-serve": {
- "optional": true
- }
+ "engines": {
+ "node": ">=16.0.0"
}
},
- "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "bin": {
- "json5": "lib/cli.js"
+ "node_modules/@smithy/util-middleware": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.6.tgz",
+ "integrity": "sha512-BxbX4aBhI1O9p87/xM+zWy0GzT3CEVcXFPBRDoHAM+pV0eSW156pR+PSYEz0DQHDMYDsYAflC2bQNz2uaDBUZQ==",
+ "dependencies": {
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=16.0.0"
}
},
- "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dev": true,
+ "node_modules/@smithy/util-retry": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.6.tgz",
+ "integrity": "sha512-BRZiuF7IwDntAbevqMco67an0Sr9oLQJqqRCsSPZZHYRnehS0LHDAkJk/pSmI7Z8c/1Vet294H7fY2fWUgB+Rg==",
"dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
+ "@smithy/service-error-classification": "^3.0.6",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=8.9.0"
+ "node": ">=16.0.0"
}
},
- "node_modules/@rushstack/eslint-patch": {
- "version": "1.10.3",
- "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz",
- "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==",
- "dev": true
+ "node_modules/@smithy/util-stream": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.8.tgz",
+ "integrity": "sha512-hoKOqSmb8FD3WLObuB5hwbM7bNIWgcnvkThokTvVq7J5PKjlLUK5qQQcB9zWLHIoSaIlf3VIv2OxZY2wtQjcRQ==",
+ "dependencies": {
+ "@smithy/fetch-http-handler": "^3.2.8",
+ "@smithy/node-http-handler": "^3.2.3",
+ "@smithy/types": "^3.4.2",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-buffer-from": "^3.0.0",
+ "@smithy/util-hex-encoding": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
},
- "node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true
+ "node_modules/@smithy/util-uri-escape": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz",
+ "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
},
- "node_modules/@sindresorhus/merge-streams": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
- "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
- "dev": true,
+ "node_modules/@smithy/util-utf8": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz",
+ "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-waiter": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.5.tgz",
+ "integrity": "sha512-jYOSvM3H6sZe3CHjzD2VQNCjWBJs+4DbtwBMvUp9y5EnnwNa7NQxTeYeQw0CKCAdGGZ3QvVkyJmvbvs5M/B10A==",
+ "dependencies": {
+ "@smithy/abort-controller": "^3.1.4",
+ "@smithy/types": "^3.4.2",
+ "tslib": "^2.6.2"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=16.0.0"
}
},
"node_modules/@socialgouv/matomo-next": {
@@ -7032,6 +8526,11 @@
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"dev": true
},
+ "node_modules/bowser": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
+ },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -8308,7 +9807,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true,
"engines": {
"node": ">= 0.8"
}
@@ -8335,7 +9833,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "dev": true,
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
@@ -8528,8 +10025,7 @@
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "dev": true
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"node_modules/electron-to-chromium": {
"version": "1.4.829",
@@ -8577,7 +10073,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "dev": true,
"engines": {
"node": ">= 0.8"
}
@@ -8900,8 +10395,7 @@
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "dev": true
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"node_modules/escape-string-regexp": {
"version": "4.0.0",
@@ -9411,7 +10905,6 @@
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
@@ -9604,6 +11097,27 @@
"integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==",
"dev": true
},
+ "node_modules/fast-xml-parser": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz",
+ "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ }
+ ],
+ "dependencies": {
+ "strnum": "^1.0.5"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
"node_modules/fastq": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
@@ -9864,7 +11378,6 @@
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
@@ -10717,7 +12230,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
@@ -10865,8 +12377,7 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ini": {
"version": "4.1.3",
@@ -12596,7 +14107,6 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true,
"bin": {
"mime": "cli.js"
},
@@ -13239,7 +14749,6 @@
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dev": true,
"dependencies": {
"ee-first": "1.1.1"
},
@@ -14124,7 +15633,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
@@ -15188,7 +16696,6 @@
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "dev": true,
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
@@ -15212,7 +16719,6 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -15220,14 +16726,12 @@
"node_modules/send/node_modules/debug/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/serialize-javascript": {
"version": "6.0.2",
@@ -15329,8 +16833,7 @@
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"node_modules/sha.js": {
"version": "2.4.11",
@@ -15623,7 +17126,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
"engines": {
"node": ">= 0.8"
}
@@ -16072,6 +17574,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
+ },
"node_modules/style-loader": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz",
@@ -16486,7 +17993,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true,
"engines": {
"node": ">=0.6"
}
@@ -17106,7 +18612,6 @@
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
- "dev": true,
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
diff --git a/package.json b/package.json
index e53919567..cff5e1f53 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"build-storybook": "storybook build"
},
"dependencies": {
+ "@aws-sdk/client-s3": "^3.645.0",
"@codegouvfr/react-dsfr": "^1.10.11",
"@etalab/decoupage-administratif": "^4.0.0",
"@socialgouv/matomo-next": "^1.9.0",
@@ -35,6 +36,7 @@
"remark": "^15.0.1",
"remark-heading-id": "^1.0.1",
"remark-html": "^16.0.1",
+ "send": "^0.18.0",
"styled-components": "^6.1.12",
"vt-pbf": "^3.1.3"
},
From 32793a8a2154354d45d4c97f26639b7f3cde24a4 Mon Sep 17 00:00:00 2001
From: Nicolas KOKLA
Date: Wed, 25 Sep 2024 00:25:27 +0200
Subject: [PATCH 05/10] Add config and Layout for support nextJS 'page-router'
(For '/data' path)
---
next.config.mjs | 3 ++
src/app/blog/page.tsx | 6 ++--
.../DeploiementBALDashboard.tsx | 2 +-
src/pages/_app.tsx | 35 +++++++++++++++++++
src/pages/_document.tsx | 26 ++++++++++++++
tsconfig.json | 1 +
6 files changed, 69 insertions(+), 4 deletions(-)
create mode 100644 src/pages/_app.tsx
create mode 100644 src/pages/_document.tsx
diff --git a/next.config.mjs b/next.config.mjs
index 5951001a2..93eeb1f7a 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -33,6 +33,9 @@ const nextConfig = {
},
instrumentationHook: true,
},
+ transpilePackages: [
+ '@codegouvfr/react-dsfr', // Require for the "pages-router" of nextJS
+ ],
}
export default nextConfig
diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx
index 4a813508d..e441b913e 100644
--- a/src/app/blog/page.tsx
+++ b/src/app/blog/page.tsx
@@ -34,11 +34,11 @@ function BlogView() {
const nbHighlightedPosts = 3
const nbPost = 15
- const page: number = useMemo(() => Number(searchParams.get('page') || 1), [searchParams])
- const tags: Set = useMemo(() => new Set(decodeURI(searchParams.get('tags') || '')?.split(',').filter(t => t).sort() || []), [searchParams])
+ const page: number = useMemo(() => Number(searchParams?.get('page') || 1), [searchParams])
+ const tags: Set = useMemo(() => new Set(decodeURI(searchParams?.get('tags') || '')?.split(',').filter(t => t).sort() || []), [searchParams])
const getPageLink = useCallback(({ page, tags: _tags }: { page?: number, tags?: string[] }) => {
- const urlSearchParams = searchParams.entries() as unknown as string[][]
+ const urlSearchParams = searchParams?.entries() as unknown as string[][]
const linkSearchParams = new URLSearchParams(urlSearchParams)
if (_tags) {
if (_tags.length) {
diff --git a/src/components/DeploiementBAL/DeploiementBALDashboard.tsx b/src/components/DeploiementBAL/DeploiementBALDashboard.tsx
index cd6e73cfd..41b12c8dd 100644
--- a/src/components/DeploiementBAL/DeploiementBALDashboard.tsx
+++ b/src/components/DeploiementBAL/DeploiementBALDashboard.tsx
@@ -39,7 +39,7 @@ export default function DeploiementBALMap({ initialStats, initialFilter, departe
const handleFilter = useCallback((filter: DeploiementBALSearchResult | null) => {
// Update URL
- const current = new URLSearchParams(Array.from(searchParams.entries()))
+ const current = new URLSearchParams(Array.from(searchParams?.entries() || []))
current.delete('epci')
current.delete('departement')
if (filter) {
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
new file mode 100644
index 000000000..4f03f0531
--- /dev/null
+++ b/src/pages/_app.tsx
@@ -0,0 +1,35 @@
+import type { AppProps } from 'next/app'
+import { createNextDsfrIntegrationApi } from '@codegouvfr/react-dsfr/next-pagesdir'
+import { ThemeProvider } from 'styled-components'
+import Link from 'next/link'
+
+import StyledComponentsRegistry from '@/providers/StyledComponentsRegistry'
+import theme from '@/theme'
+
+declare module '@codegouvfr/react-dsfr/next-pagesdir' {
+ interface RegisterLink {
+ Link: typeof Link
+ }
+}
+
+const {
+ withDsfr,
+ dsfrDocumentApi,
+} = createNextDsfrIntegrationApi({
+ defaultColorScheme: 'system',
+ Link,
+})
+
+export { dsfrDocumentApi }
+
+function App({ Component, pageProps }: AppProps) {
+ return (
+
+
+
+
+
+ )
+}
+
+export default withDsfr(App)
diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx
new file mode 100644
index 000000000..0f2b634e7
--- /dev/null
+++ b/src/pages/_document.tsx
@@ -0,0 +1,26 @@
+import { Html, Head, Main, NextScript, DocumentProps } from 'next/document'
+import { dsfrDocumentApi } from './_app'
+import Layout from '@/app/layout'
+
+const {
+ getColorSchemeHtmlAttributes,
+ augmentDocumentForDsfr,
+} = dsfrDocumentApi
+
+export default function Document(props: DocumentProps) {
+ return (
+
+
+ <>
+
+
+
+
+
+ >
+
+
+ )
+}
+
+augmentDocumentForDsfr(Document)
diff --git a/tsconfig.json b/tsconfig.json
index 7c93a06cb..14152e39f 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,5 +1,6 @@
{
"compilerOptions": {
+ "target": "ES2018",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
From 15981c398a6f892e8e87355313f34c29b6850792 Mon Sep 17 00:00:00 2001
From: Nicolas KOKLA
Date: Wed, 25 Sep 2024 00:28:08 +0200
Subject: [PATCH 06/10] Add new pages in '/data' path, connected to S3 server
---
src/app/outils/telechargements/page.tsx | 10 +
src/pages/_document.tsx | 12 +-
src/pages/data/[[...path]].tsx | 220 ++++++++++++++++++
src/views/data/components/Data.styled.tsx | 16 ++
src/views/data/components/Data.tsx | 164 +++++++++++++
.../data/components/DataEntry.styled.tsx | 121 ++++++++++
src/views/data/components/DataEntry.tsx | 126 ++++++++++
src/views/data/components/index.ts | 10 +
src/views/data/config/data-config.json | 129 ++++++++++
src/views/data/config/date-format-options.ts | 31 +++
src/views/data/config/index.ts | 3 +
src/views/data/config/page-config.json | 6 +
src/views/data/utils/helper.ts | 195 ++++++++++++++++
src/views/data/utils/index.ts | 7 +
14 files changed, 1043 insertions(+), 7 deletions(-)
create mode 100644 src/pages/data/[[...path]].tsx
create mode 100644 src/views/data/components/Data.styled.tsx
create mode 100644 src/views/data/components/Data.tsx
create mode 100644 src/views/data/components/DataEntry.styled.tsx
create mode 100644 src/views/data/components/DataEntry.tsx
create mode 100644 src/views/data/components/index.ts
create mode 100644 src/views/data/config/data-config.json
create mode 100644 src/views/data/config/date-format-options.ts
create mode 100644 src/views/data/config/index.ts
create mode 100644 src/views/data/config/page-config.json
create mode 100644 src/views/data/utils/helper.ts
create mode 100644 src/views/data/utils/index.ts
diff --git a/src/app/outils/telechargements/page.tsx b/src/app/outils/telechargements/page.tsx
index 1cae715ad..7da78eb43 100644
--- a/src/app/outils/telechargements/page.tsx
+++ b/src/app/outils/telechargements/page.tsx
@@ -44,6 +44,16 @@ export default async function PageDownloadBan() {
title="Télécharger"
id="download"
theme="primary"
+ footer={(
+
+
+ Naviguez à travers toutes les données téléchargeables mises à disposition par la BAN
+
+
+ )}
>
diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx
index 0f2b634e7..24757b38a 100644
--- a/src/pages/_document.tsx
+++ b/src/pages/_document.tsx
@@ -10,14 +10,12 @@ const {
export default function Document(props: DocumentProps) {
return (
+
- <>
-
-
-
-
-
- >
+
+
+
+
)
diff --git a/src/pages/data/[[...path]].tsx b/src/pages/data/[[...path]].tsx
new file mode 100644
index 000000000..d5b3ae8dd
--- /dev/null
+++ b/src/pages/data/[[...path]].tsx
@@ -0,0 +1,220 @@
+import type { GetServerSidePropsContext } from 'next'
+
+import { S3 } from '@aws-sdk/client-s3'
+import PropTypes from 'prop-types'
+import Section from '@/components/Section'
+import Breadcrumb from '@/layouts/Breadcrumb'
+import NotFoundPage from '@/app/not-found'
+// import sendToTracker, { getDownloadToEventTracker } from '@/lib/util/analytics-tracker'
+import { dataConfig, pageConfig } from '@/views/data/config'
+import Data from '@/views/data/components/Data'
+import {
+ getAlias,
+ getFormatedDate,
+ asyncSendS3,
+ listObjectsRecursively,
+ autorizedPathS3,
+} from '@/views/data/utils'
+
+interface Context extends GetServerSidePropsContext {
+ params: {
+ path: string[]
+ }
+}
+
+interface DataPageProps {
+ title: string
+ path: string[]
+ data: object[]
+ config: object
+ errorCode: number
+ errorMessage: string
+}
+
+const {
+ S3_CONFIG_ACCESS_KEY_ID,
+ S3_CONFIG_SECRET_ACCESS_KEY,
+ S3_CONFIG_REGION,
+ S3_CONFIG_ENDPOINT,
+} = process.env
+
+const { rootLink } = pageConfig
+
+const bucketName = 'prd-ign-mut-ban'
+const rootDir = ['adresse-data']
+const clientS3 = new S3({
+ credentials: {
+ accessKeyId: S3_CONFIG_ACCESS_KEY_ID || '',
+ secretAccessKey: S3_CONFIG_SECRET_ACCESS_KEY || '',
+ },
+ region: S3_CONFIG_REGION || '',
+ endpoint: S3_CONFIG_ENDPOINT || '',
+})
+
+export async function getServerSideProps(context: Context) {
+ const { params, res, req } = context
+ const { path: paramPathRaw = [] } = params
+ const config = dataConfig?.directory.find(({ path }) => path === paramPathRaw.join('/')) || {}
+ const alias = await getAlias(clientS3, bucketName)(rootDir, dataConfig?.alias, paramPathRaw.join('/') || '')
+
+ const paramPath = alias && (new RegExp(`^${alias.parent}/${alias.name}`)).test(paramPathRaw.join('/'))
+ ? paramPathRaw.join('/').replace(new RegExp(`^${alias.parent}/${alias.name}`), `${alias.parent}/${alias.target}`).split('/')
+ : paramPathRaw
+ const dirPath = `${paramPath.join('/')}`
+ const formattedDate = getFormatedDate()
+ const s3ObjectPath = [...rootDir, ...paramPath].join('/')
+
+ try {
+ const s3Head = await clientS3.headObject({
+ Bucket: bucketName,
+ Key: s3ObjectPath,
+ })
+
+ // NO ERROR > PATH IS A FILE
+ try {
+ // sendToTracker(getDownloadToEventTracker({
+ // downloadDataType: `${paramPath[0]}${req?.headers?.range ? ' (Partial)' : ''}`,
+ // downloadFileName: dirPath,
+ // nbDownload: 1
+ // }))
+ await asyncSendS3(clientS3)((req as unknown as Request), res, {
+ params: {
+ ...(req?.headers?.range ? { Range: req.headers.range } : {}),
+ Bucket: bucketName,
+ Key: s3ObjectPath,
+ },
+ fileName: paramPath[paramPath.length - 1],
+ metadata: s3Head,
+ })
+ }
+ catch (err) {
+ console.warn(`[${formattedDate} - ERROR]`, 'File access error:', err)
+ return {
+ props: {
+ errorCode: 502,
+ errorMessage: 'Une erreur est survenue lors de la génération du téléchargement.',
+ },
+ }
+ }
+ }
+ catch {
+ // ERROR > PATH SHOULD BE DIRECTORY
+ const s3DirPath = `${s3ObjectPath}/`
+ const s3Objects = await listObjectsRecursively(clientS3, bucketName)(s3DirPath)
+ if (s3Objects) {
+ const s3data = [
+ ...(s3Objects || [])
+ .filter(({ name }) => autorizedPathS3(name).auth)
+ .map(({ name, path, isDirectory, fileInfo, ...rest }) => ({
+ name,
+ path: alias && alias.parent !== dirPath
+ ? path.replace(
+ (new RegExp(`^${rootDir.join('/')}/${alias.parent}/${alias.target}`)),
+ `${rootDir.join('/')}/${alias.parent}/${alias.name}`
+ )
+ : path,
+ isDirectory,
+ ...(fileInfo ? { fileInfo } : {}),
+ ...rest,
+ })),
+ ]
+ const s3contentDir = [
+ ...s3data,
+ ...(alias && alias.parent === dirPath
+ ? [{
+ ...alias,
+ ...(s3data.find(({ name }) => name === alias.target) || {}),
+ name: alias.name,
+ path: `${s3ObjectPath}/${alias.name}`,
+ }]
+ : []),
+ ].sort(
+ (a, b) => (
+ a.name.localeCompare(b.name)
+ || Number(a.isDirectory) - Number(b.isDirectory)
+ )
+ )
+
+ return {
+ props: {
+ title: ['data', ...paramPath].join('/') || '',
+ path: paramPathRaw || [],
+ data: s3contentDir || [],
+ config,
+ },
+ }
+ }
+
+ // OBJECT DO NOT EXIST > IS UNKNOWN PATH
+ console.warn(`[${formattedDate} - ERROR]`, 'S3 Object - Try access to unknown object:', s3DirPath)
+ res.statusCode = 404
+ return {
+ props: { errorCode: 404 },
+ }
+ }
+
+ return { props: {} }
+}
+
+export default function DataPage({ title, path, data, config, errorCode, errorMessage }: DataPageProps) {
+ const currentDir = ['data', ...(path || [])].slice(-1)
+
+ return errorCode && errorCode !== 200
+ ? (
+ <>
+ {path && (
+ ({
+ label: dir,
+ linkProps: { href: `/data/${path.slice(0, index).join('/')}` },
+ })),
+ ]}
+ />
+ )}
+
+ >
+ )
+ : (path
+ ? (
+ <>
+ ({
+ label: dir,
+ linkProps: { href: `/data/${path.slice(0, index).join('/')}` },
+ })),
+ ]}
+ />
+
+
+ >
+ )
+ : null)
+}
+
+DataPage.propTypes = {
+ title: PropTypes.string,
+ path: PropTypes.arrayOf(PropTypes.string),
+ data: PropTypes.arrayOf(PropTypes.object),
+ config: PropTypes.shape({
+ hero: PropTypes.shape({
+ type: PropTypes.string,
+ value: PropTypes.string,
+ }),
+ }),
+ errorCode: PropTypes.number,
+ errorMessage: PropTypes.string,
+}
diff --git a/src/views/data/components/Data.styled.tsx b/src/views/data/components/Data.styled.tsx
new file mode 100644
index 000000000..1fb0fe7ca
--- /dev/null
+++ b/src/views/data/components/Data.styled.tsx
@@ -0,0 +1,16 @@
+'use client'
+
+import styled from 'styled-components'
+
+export const ItemList = styled.ul`
+ padding-top: 0.5rem;
+`
+
+export const Item = styled.li`
+ display: block;
+`
+
+export const ParentDirName = styled.span.attrs({ className: 'fr-link--icon-left fr-icon-folder-2-line' })`
+ display: inline-block;
+ padding: 0 0.5em;
+`
diff --git a/src/views/data/components/Data.tsx b/src/views/data/components/Data.tsx
new file mode 100644
index 000000000..d901608cd
--- /dev/null
+++ b/src/views/data/components/Data.tsx
@@ -0,0 +1,164 @@
+import { useMemo } from 'react'
+import Link from 'next/link'
+import PropTypes from 'prop-types'
+
+import { dateFormatOptions } from '../config'
+import DataEntry from './DataEntry'
+import {
+ ItemList,
+ Item,
+ ParentDirName,
+} from './Data.styled'
+
+interface DataProps {
+ root: {
+ href: string
+ label: string
+ }
+ path: string[]
+ data: any[]
+ config: {
+ groups?: {
+ name: string
+ rule: string
+ description: string
+ }[]
+ }
+}
+
+interface DataEntry {
+ name: string
+ isDirectory: boolean
+ fileInfo: {
+ date: string
+ size: number
+ }
+}
+
+const sortDirectory = (a: DataEntry, b: DataEntry) => {
+ if (a.isDirectory === b.isDirectory) {
+ return a.name.localeCompare(b.name)
+ }
+ return a.isDirectory ? -1 : 1
+}
+
+function Data({ root, path = [], data: dataRaw = [], config = {} }: DataProps) {
+// function Data({ root, path: _path = [], data: dataRaw = [], config = {} }: DataProps) {
+ // const path = ['data', ..._path]
+ // const currentDir = [...path].slice(-1)
+ // const parentsDir = [...path].slice(0, -1)
+ // const currentDir = ['data', ...path].slice(-1)
+ const parentsDir = ['data', ...path].slice(0, -1)
+ const parentDir = parentsDir.slice(-1)[0]
+ const sectionsConfig = useMemo(() => Object.fromEntries((config.groups || []).map(group => [group.name, group])), [config.groups])
+ const { __: dataDefault, ...dateSections } = useMemo>(() => {
+ const sections = Object.fromEntries((config.groups || []).map(group => [group.name, []]))
+
+ const dataSections = dataRaw.reduce((acc, entry) => {
+ const fileDate = entry.fileInfo?.date && new Date(entry.fileInfo.date)
+ const { year, month, day } = /^(?\d{4})-(?\d{2})-(?\d{2})$/.exec(entry.name)?.groups || {}
+ const humanDateDirName = year && month && day && (
+ new Date(+year, (+month - 1), +day)
+ ).toLocaleString('fr-FR', dateFormatOptions.dateFormatOptionsLongDate)
+
+ const finalEntry = {
+ ...entry,
+ humanDirName: humanDateDirName,
+ fileDate,
+ }
+
+ const section = config.groups?.find(({ rule }: { rule: string }) => rule && (new RegExp(rule)).test(entry.name))
+ acc[section ? section.name : '__'].push(finalEntry)
+
+ return acc
+ }, (sections.__ ? sections : { __: [], ...sections }))
+ return dataSections
+ }, [dataRaw, config.groups])
+
+ // console.log('path >>>', path)
+ // console.log('parentDir >>>', parentDir)
+
+ return (
+
+ {/*
({
+ label: dir,
+ linkProps: { href: `/data/${path.slice(0, index).join('/')}` },
+ })),
+ ]}
+ /> */}
+
+ {/* Breadcrumb : */}
+ {/*
+ {root
+ ? {root.label}{' '}
+ : null}
+ {path.length > 0 && (
+ parentsDir.map((dir, index) => (
+ > {dir}{' '}
+ ))
+ )}
+ > {currentDir}{' '}
+
*/}
+
+ {parentDir && }
+
+ {(!dataDefault || dataDefault.length === 0) && (!dateSections || Object.keys(dateSections).length === 0) && (
+ Ce répertoire est vide
+ )}
+
+
+ {dataDefault?.length > 0 && (
+
+ {
+ dataDefault.sort(sortDirectory).map(entry => (
+
+ ))
+ }
+
+ )}
+
+ {dateSections && Object.entries(dateSections).map(([sectionName, sectionEntries]) => {
+ const { description } = sectionsConfig[sectionName] || {}
+ return (
+
+
+
{sectionName}
+ {description &&
{description}
}
+
+ {
+ sectionEntries.sort(sortDirectory).map(entry => (
+
+ ))
+ }
+
+
+ )
+ }
+ )}
+
+
+ )
+}
+
+Data.propTypes = {
+ root: PropTypes.shape({
+ href: PropTypes.string.isRequired,
+ label: PropTypes.string.isRequired,
+ }),
+ path: PropTypes.array.isRequired,
+ data: PropTypes.array.isRequired,
+ config: PropTypes.object,
+}
+
+export default Data
diff --git a/src/views/data/components/DataEntry.styled.tsx b/src/views/data/components/DataEntry.styled.tsx
new file mode 100644
index 000000000..2f474b766
--- /dev/null
+++ b/src/views/data/components/DataEntry.styled.tsx
@@ -0,0 +1,121 @@
+'use client'
+
+import styled from 'styled-components'
+import Link from 'next/link'
+
+const fileTypeIcons: { [key: string]: string } = {
+ dir: 'fr-icon-folder-2-fill',
+ pdf: 'fr-icon-file-pdf-line',
+ json: 'ri-file-code-line',
+ file: 'fr-icon-file-line',
+ download: 'fr-icon-file-download-line',
+ txt: 'fr-icon-file-text-line',
+ md: 'fr-icon-file-text-line',
+ gz: 'ri-file-zip-line',
+ zip: 'ri-file-zip-line',
+ tar: 'ri-file-zip-line',
+ rar: 'ri-file-zip-line',
+}
+
+const getIcon = (fileType?: string) => fileType && fileTypeIcons[fileType] ? fileTypeIcons[fileType] : fileTypeIcons.download
+
+export const ExplorerLink = styled(Link)`
+ display: flex;
+ text-decoration: none;
+ flex-direction: column;
+ gap: 0.25rem;
+ margin-top: 0.3rem;
+ border-radius: 0.25rem;
+ padding: 0.1rem 0.25rem;
+
+ &[href] {
+ background: none;
+ background-color: #cecece00;
+ transition: background-color 0.25s ease-in-out;
+ }
+ &[href]:hover,
+ &[href]:focus {
+ background-color: #cecece33;
+ }
+
+ @media screen and (min-width: ${({ theme }) => theme.breakpoints.md}) {
+ max-width: 35em;
+ flex-direction: row;
+ }
+`
+
+export const ExplorerLinkLabel = styled.span.attrs<{ $fileType?: string }>(({ $fileType }) => ({
+ className: `fr-link--icon-left ${getIcon($fileType)}`,
+}))`
+ display: inline;
+ font-size: 1rem;
+ line-height: 1.5rem;
+ padding: 0 0;
+ color: var(--text-action-high-blue-france);
+
+ display: flex;
+ flex-wrap: nowrap;
+ align-items: center;
+ flex: 1;
+
+ &.unknown-type {
+ padding-left: 1.5em;
+ }
+`
+export const ExplorerLinkLabelWrapper = styled.span`
+ display: flex;
+ flex-direction: column;
+
+ @media screen and (min-width: ${({ theme }) => theme.breakpoints.md}) {
+ flex-direction: row;
+ }
+`
+export const ExplorerLinkLabelHuman = styled.span`
+ padding-right: .5em;
+ color: #777;
+
+ &:first-letter {
+ text-transform: uppercase;
+ }
+
+ @media screen and (min-width: ${({ theme }) => theme.breakpoints.md}) {
+ padding-left: .5em;
+ }
+`
+export const ExplorerLinkLabelText = styled.span<{ $withHumanDateDirName: boolean }>`
+ padding-right: .5em;
+ text-decoration: underline;
+
+ ${({ $withHumanDateDirName }) => $withHumanDateDirName && `
+ display: inline-block;
+ width: 7em;
+ `}
+`
+export const ExplorerLinkLabelSize = styled.span`
+ display: flex;
+ align-self: flex-end;
+ flex-wrap: nowrap;
+ white-space: nowrap;
+ align-items: end;
+ line-height: 1em;
+ padding-bottom: 0.2em;
+ font-size: 0.8em;
+ font-style: italic;
+ color: #777;
+`
+export const ExplorerLinkDatetime = styled.span`
+ display: flex;
+ min-width: 5em;
+ align-items: end;
+ line-height: 1em;
+ padding-bottom: 0.2em;
+ font-size: 0.8em;
+ color: #777;
+ white-space: nowrap;
+ gap: 0.5em;
+`
+export const ExplorerLinkDate = styled.span`
+`
+export const ExplorerLinkTime = styled.span`
+ min-width: 4.2em;
+`
diff --git a/src/views/data/components/DataEntry.tsx b/src/views/data/components/DataEntry.tsx
new file mode 100644
index 000000000..ad8da4c3c
--- /dev/null
+++ b/src/views/data/components/DataEntry.tsx
@@ -0,0 +1,126 @@
+import { Fragment, ReactNode } from 'react'
+import Link from 'next/link'
+import PropTypes from 'prop-types'
+import { filesize } from 'filesize'
+
+// import theme from '@/styles/theme'
+
+import dateFormatOptions from '../config/date-format-options'
+
+import {
+ ExplorerLink,
+ ExplorerLinkLabel,
+ ExplorerLinkLabelWrapper,
+ ExplorerLinkLabelHuman,
+ ExplorerLinkLabelText,
+ ExplorerLinkLabelSize,
+ ExplorerLinkDatetime,
+ ExplorerLinkDate,
+ ExplorerLinkTime,
+} from './DataEntry.styled'
+
+const theme = {
+ breakPoints: {
+ desktop: '1024px',
+ },
+}
+
+const translatedName: { [key: string]: string } = {
+ 'latest': 'Dernière(s) version(s) en date',
+ 'weekly': 'Version(s) hebdomadaire(s)',
+ 'ban/adresses-odbl': 'Repertoire déprecié',
+ 'ban/adresses-odbl/latest': 'Dernière(s) version(s) en date',
+}
+
+const translatedQuarter: { [key: string]: string } = {
+ T1: '1er trimestre',
+ T2: '2ème trimestre',
+ T3: '3ème trimestre',
+ T4: '4ème trimestre',
+}
+
+interface DataEntryProps {
+ entry: {
+ name: keyof typeof translatedName
+ isDirectory: boolean
+ fileInfo: {
+ date: string
+ size: number
+ }
+ }
+ path: string[]
+}
+
+const getFileType = (isDir: boolean, name: string) => {
+ if (isDir) return 'dir'
+ return name.match(/\..*$/)?.[0]?.split('.')?.pop()
+}
+
+function DataEntry({ entry: { name, isDirectory, fileInfo }, path }: DataEntryProps) {
+ const fileDate = fileInfo?.date && new Date(fileInfo.date)
+ const dateSearchRegExp = /^(?\d{4})-(((?\d{2})-(?\d{2}))|(?T[1-4]))$/
+ const { year, quarter, month, day } = (dateSearchRegExp.exec(`${name}`)?.groups || {}) as {
+ year?: string
+ quarter?: keyof typeof translatedQuarter
+ month?: string
+ day?: string
+ }
+ const humanDateDirName = year && month && day
+ // ? (new Date(+year, (+month - 1), +day)).toLocaleString('fr-FR', {
+ // timeZone: 'Europe/Paris',
+ // weekday: 'long',
+ // year: 'numeric',
+ // month: 'long',
+ // day: 'numeric',
+ // })
+ ? (new Date(+year, (+month - 1), +day)).toLocaleString('fr-FR', dateFormatOptions.dateFormatOptionsLongDate)
+ : year && quarter && `${translatedQuarter[quarter]} ${year}`
+ const humanDirName = humanDateDirName ? `export du ${humanDateDirName}` : translatedName[([...path, name].join('/'))] || translatedName[name]
+
+ return (
+
+
+
+
+ {name}
+ {humanDirName && {humanDirName} }
+
+
+ {(fileInfo?.size && filesize(fileInfo.size, { base: 10 }) as ReactNode)}
+
+ {fileDate && (
+
+ {fileDate?.toLocaleString('fr-FR', dateFormatOptions.dateFormatOptionsDate)}
+ {fileDate?.toLocaleString('fr-FR', dateFormatOptions.dateFormatOptionsTime)}
+
+ )}
+
+
+ )
+}
+
+DataEntry.propTypes = {
+ entry: PropTypes.shape(
+ {
+ name: PropTypes.string.isRequired,
+ isDirectory: PropTypes.bool.isRequired,
+ fileInfo: PropTypes.shape(
+ {
+ translatedName: PropTypes.string,
+ date: PropTypes.string,
+ hash: PropTypes.string,
+ size: PropTypes.number,
+ }
+ ),
+ }
+ ).isRequired,
+ path: PropTypes.array.isRequired,
+}
+
+export default DataEntry
diff --git a/src/views/data/components/index.ts b/src/views/data/components/index.ts
new file mode 100644
index 000000000..fabeb12eb
--- /dev/null
+++ b/src/views/data/components/index.ts
@@ -0,0 +1,10 @@
+export { default } from './Data'
+// export {
+// getAlias,
+// getFormatedDate,
+// asyncSendS3,
+// listObjectsRecursively,
+// autorizedPathS3,
+// } from '../utils/helper'
+
+// export { default as config } from './data-config.json'
diff --git a/src/views/data/config/data-config.json b/src/views/data/config/data-config.json
new file mode 100644
index 000000000..e3bea4ecc
--- /dev/null
+++ b/src/views/data/config/data-config.json
@@ -0,0 +1,129 @@
+{
+ "directory": [
+ {
+ "path": "adresses-cadastre",
+ "hero": {
+ "value": "Ces fichiers sont produit depuis les données fournis par la DGFiP"
+ },
+ "groups": [
+ {
+ "name": "Données archivées",
+ "direction": "desc",
+ "rule": "^\\d{4}$"
+ },
+ {
+ "name": "__"
+ }
+ ]
+ },
+ {
+ "path": "ban/adresses",
+ "hero": {
+ "value": "Retrouvez ici toute les adresses de la Base Adresse Nationale (BAN)"
+ },
+ "groups": [
+ {
+ "name": "Données archivées",
+ "description": "Données archivées de la BAN",
+ "direction": "desc",
+ "rule": "^\\d{4}-\\d{2}-\\d{2}$"
+ },
+ {
+ "name": "__"
+ }
+ ]
+ },
+ {
+ "path": "ban/adresses-odbl",
+ "hero": {
+ "type": "warning",
+ "value": "Ce répertoire est obsolète et redirige vers le répertoire adresses"
+ },
+ "groups": [
+ {
+ "name": "Données archivées",
+ "description": "Données archivées de la BAN",
+ "direction": "desc",
+ "rule": "^\\d{4}-\\d{2}-\\d{2}$"
+ },
+ {
+ "name": "__"
+ }
+ ]
+ },
+ {
+ "path": "ban/export-api-gestion",
+ "hero": {
+ "type": "warning",
+ "value": "Ce répertoire est obsolète et redirige vers le répertoire adresses"
+ },
+ "groups": [
+ {
+ "name": "Données archivées",
+ "description": "Données archivées de la BAN",
+ "direction": "desc",
+ "rule": "^\\d{4}-\\d{2}-\\d{2}$"
+ },
+ {
+ "name": "__"
+ }
+ ]
+ }
+ ],
+ "alias": [
+ {
+ "parent": "adresses-cadastre",
+ "name": "latest",
+ "target": {
+ "action": "getLatestFromRegExp",
+ "params": ["^\\d{4}$"]
+ }
+ },
+ {
+ "parent": "adresses-ftth",
+ "name": "latest",
+ "target": {
+ "action": "getLatestFromRegExp",
+ "params": ["^\\d{4}-T\\d$"]
+ }
+ },
+ {
+ "parent": "ban",
+ "name": "adresses-odbl",
+ "target": "adresses",
+ "comment": "Ce repertoire est obsolète et redirige vers les données du répertoire `adresses`"
+ },
+ {
+ "parent": "ban/adresses",
+ "name": "weekly",
+ "target": {
+ "action": "getLatestFromRegExp",
+ "params": ["^\\d{4}-\\d{2}-\\d{2}$"]
+ }
+ },
+ {
+ "parent": "ban/export-api-gestion",
+ "name": "latest",
+ "target": {
+ "action": "getLatestFromRegExp",
+ "params": ["^\\d{4}-\\d{2}-\\d{2}$"]
+ }
+ },
+ {
+ "parent": "contours-administratifs",
+ "name": "latest",
+ "target": {
+ "action": "getLatestFromRegExp",
+ "params": ["^\\d{4}$"]
+ }
+ },
+ {
+ "parent": "fantoir",
+ "name": "latest",
+ "target": {
+ "action": "getLatestFromRegExp",
+ "params": ["^fantoir-\\d{4}-\\d{2}\\.gz$"]
+ }
+ }
+ ]
+}
diff --git a/src/views/data/config/date-format-options.ts b/src/views/data/config/date-format-options.ts
new file mode 100644
index 000000000..65a5b277f
--- /dev/null
+++ b/src/views/data/config/date-format-options.ts
@@ -0,0 +1,31 @@
+const TIME_ZONE = 'Europe/Paris'
+
+interface DateFormatOptions {
+ dateFormatOptionsLongDate: Intl.DateTimeFormatOptions
+ dateFormatOptionsDate: Intl.DateTimeFormatOptions
+ dateFormatOptionsTime: Intl.DateTimeFormatOptions
+}
+
+const dateFormatOptions: DateFormatOptions = {
+ dateFormatOptionsLongDate: {
+ timeZone: TIME_ZONE,
+ weekday: 'long',
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ },
+ dateFormatOptionsDate: {
+ timeZone: TIME_ZONE,
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ },
+ dateFormatOptionsTime: {
+ timeZone: TIME_ZONE,
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit',
+ },
+}
+
+export default dateFormatOptions
diff --git a/src/views/data/config/index.ts b/src/views/data/config/index.ts
new file mode 100644
index 000000000..63bc5f708
--- /dev/null
+++ b/src/views/data/config/index.ts
@@ -0,0 +1,3 @@
+export { default as dateFormatOptions } from './date-format-options'
+export { default as dataConfig } from './data-config.json'
+export { default as pageConfig } from './page-config.json'
diff --git a/src/views/data/config/page-config.json b/src/views/data/config/page-config.json
new file mode 100644
index 000000000..2806f6166
--- /dev/null
+++ b/src/views/data/config/page-config.json
@@ -0,0 +1,6 @@
+{
+ "rootLink": {
+ "href": "/outils/telechargements",
+ "label": "Télécharger les données de la BAN"
+ }
+}
diff --git a/src/views/data/utils/helper.ts b/src/views/data/utils/helper.ts
new file mode 100644
index 000000000..e53240bea
--- /dev/null
+++ b/src/views/data/utils/helper.ts
@@ -0,0 +1,195 @@
+import type AWS from '@aws-sdk/client-s3'
+
+interface S3ObjectItem {
+ Key: string
+ LastModified: Date
+ ETag: string
+ Size: number
+}
+
+interface S3ObjectResponse {
+ Contents: S3ObjectItem[]
+ CommonPrefixes: { Prefix: string }[]
+ IsTruncated: boolean
+ NextContinuationToken: string
+ KeyCount: number
+}
+
+interface DirItem {
+ name: string
+ path: string
+ isDirectory: boolean
+}
+interface ObjectItem extends DirItem {
+ fileInfo?: {
+ date: string
+ hash: string
+ size: number
+ }
+}
+
+interface AsyncSendS3Params {
+ Bucket: string
+ Key: string
+}
+
+interface AsyncSendS3Options {
+ params: AsyncSendS3Params
+ fileName: string
+ metadata?: AWS.HeadObjectCommandOutput
+}
+
+interface AliasAction {
+ [key: string]: (s3Objects: ObjectItem[], ...regExpStringAndRest: string[]) => ObjectItem | undefined
+}
+interface Aliase {
+ parent: string
+ name: string
+ target?: string | {
+ action: string
+ params: string[]
+ }
+}
+
+export const getFormatedDate = () => {
+ const date = new Date()
+ const dateFormatOptions = {
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit',
+ }
+ return new Intl
+ .DateTimeFormat('fr', (dateFormatOptions as Intl.DateTimeFormatOptions))
+ .format(date)
+ .replace(/,/g, '\'')
+ .replace(/ /g, ' ')
+}
+
+export const autorizedPathS3 = (path: string) => {
+ const isPathIsVisibleFile = !path.startsWith('.')
+
+ return {
+ path,
+ auth: isPathIsVisibleFile,
+ }
+}
+
+export const asyncSendS3 = (clientS3: AWS.S3) =>
+ (req: Request, res: any, options: AsyncSendS3Options) =>
+ new Promise(
+ (resolve, reject) => {
+ console.log('res >>>', res)
+ // res.attachment(params.key)
+ res.setHeader('Content-Length', options.metadata?.ContentLength)
+ res.setHeader('Content-Disposition', `attachment; filename="${options.fileName}"`)
+
+ clientS3.getObject(options.params)
+ .then(({ Body, AcceptRanges, ContentRange, ContentLength }) => {
+ if (AcceptRanges && ContentRange) {
+ res.setHeader('Accept-Ranges', AcceptRanges)
+ res.setHeader('Content-Range', ContentRange)
+ res.setHeader('Content-Length', ContentLength)
+ res.status(206)
+ }
+ (Body as NodeJS.ReadableStream)
+ ?.on('error', (err: Error) => {
+ const formattedDate = getFormatedDate()
+ console.warn(`[${formattedDate} - ERROR]`, 'File access error:', err)
+ reject(err)
+ })
+ ?.on('end', () => {
+ resolve()
+ })
+ .pipe(res)
+ })
+ .catch((err: Error) => console.error(err))
+ }
+ )
+
+// Reccursivly GET S3 Objects
+export const listObjectsRecursively = (
+ clientS3: AWS.S3,
+ bucketName: string
+) =>
+ async function listObjects(prefix: string, continuationToken?: string): Promise<(ObjectItem)[] | undefined> {
+ const params = {
+ Bucket: bucketName,
+ Prefix: prefix || undefined,
+ Delimiter: '/',
+ ContinuationToken: continuationToken,
+ }
+
+ try {
+ const data = (await clientS3.listObjectsV2(params)) as S3ObjectResponse
+
+ if (data.KeyCount <= 0) {
+ return undefined
+ }
+
+ const filesList: ObjectItem[] = (data.Contents || []).map(({ Key, LastModified, ETag, Size }) => ({
+ name: Key.replace(new RegExp(`^${prefix}`), ''),
+ path: Key,
+ fileInfo: {
+ date: LastModified.toString(),
+ hash: ETag,
+ size: Size,
+ },
+ isDirectory: false,
+ }))
+ const dirsList = (data.CommonPrefixes || []).map(({ Prefix }) => ({
+ name: Prefix.replace(new RegExp(`^${prefix}`), '').replace(/\/$/, ''),
+ path: Prefix,
+ isDirectory: true,
+ }))
+ const nextList: ObjectItem[] = ((data.IsTruncated) && await listObjects(prefix, data.NextContinuationToken)) || []
+ return [...filesList, ...dirsList, ...nextList]
+ }
+ catch (err) {
+ console.error('Erreur lors de la récupération de la liste des objets :', err)
+ }
+ }
+
+const aliasAction: AliasAction = {
+ getLatestFromRegExp: (s3Objects, regExpString) => s3Objects
+ .filter(({ name }) => ((new RegExp(regExpString)).test(name)))
+ .sort((a, b) => new Date(b.name).getTime() - new Date(a.name).getTime())[0],
+}
+
+export const getAlias = (clientS3: AWS.S3, bucketName: string) => async (rootDir: string[], aliasesRaw: Aliase[], currentPath: string) => {
+ const aliases = aliasesRaw && (
+ [...aliasesRaw]
+ .sort((a, b) => `${b.parent}${b.name}`.localeCompare(`${a.parent}${a.name}`))
+ .reverse()
+ )
+ const alias = aliases?.find(({ parent }) => (new RegExp(`^${parent}(/|$)`)).test(currentPath)) || null
+
+ if (!alias) {
+ return null
+ }
+
+ if (typeof alias.target === 'string') {
+ return alias
+ }
+
+ if (typeof alias.target === 'object' && alias.target.action) {
+ const s3ObjectPath = [...rootDir, ...alias.parent.replace(/\/$/, '').split('/')].join('/')
+ const s3DirPath = `${s3ObjectPath}/`
+ const s3Objects = await listObjectsRecursively(clientS3, bucketName)(s3DirPath)
+ const s3data = s3Objects
+ ? [...(s3Objects || []).filter(({ name }) => autorizedPathS3(name).auth)]
+ : []
+
+ const paraXXX = alias.target?.params
+ const targetAlias = aliasAction[alias.target.action](s3data, ...((alias.target?.params) || []))
+
+ return ({
+ ...alias,
+ target: targetAlias?.name,
+ } as Aliase)
+ }
+
+ throw new Error('Alias target should be a string, or an object with an action key')
+}
diff --git a/src/views/data/utils/index.ts b/src/views/data/utils/index.ts
new file mode 100644
index 000000000..bcfc81d77
--- /dev/null
+++ b/src/views/data/utils/index.ts
@@ -0,0 +1,7 @@
+export {
+ getAlias,
+ getFormatedDate,
+ asyncSendS3,
+ listObjectsRecursively,
+ autorizedPathS3,
+} from './helper'
From 12ce0ff9e9d1223fc9b7e7ba4873710b6ea0bbc0 Mon Sep 17 00:00:00 2001
From: Nicolas KOKLA
Date: Wed, 25 Sep 2024 16:39:39 +0200
Subject: [PATCH 07/10] Update Github CI
---
.github/workflows/ci.yml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e1df20cf4..81becb2ee 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -15,6 +15,10 @@ env:
NEXT_PUBLIC_API_DEPOT_URL: ${{ vars.NEXT_PUBLIC_API_DEPOT_URL }}
NEXT_PUBLIC_API_ETABLISSEMENTS_PUBLIC: ${{ vars.NEXT_PUBLIC_API_ETABLISSEMENTS_PUBLIC }}
NEXT_PUBLIC_BAL_API_URL: ${{ vars.NEXT_PUBLIC_BAL_API_URL }}
+ S3_CONFIG_ACCESS_KEY_ID: ${{ secrets.S3_CONFIG_ACCESS_KEY_ID }}
+ S3_CONFIG_SECRET_ACCESS_KEY: ${{ secrets.S3_CONFIG_SECRET_ACCESS_KEY }}
+ S3_CONFIG_REGION: ${{ secrets.S3_CONFIG_REGION }}
+ S3_CONFIG_ENDPOINT: ${{ secrets.S3_CONFIG_ENDPOINT }}
jobs:
build:
From a2b69790fda016e300a80b7909c59d1544739a58 Mon Sep 17 00:00:00 2001
From: Jugurtha Bouhadoun
Date: Tue, 1 Oct 2024 17:37:38 +0200
Subject: [PATCH 08/10] fix build error during Docker build
---
.env.default | 9 +++++----
docker-compose.yml | 2 ++
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/.env.default b/.env.default
index 5ad2fca9d..1bd03812e 100644
--- a/.env.default
+++ b/.env.default
@@ -34,6 +34,7 @@ NEXT_PUBLIC_BAL_WIDGET_URL=https://baseadressenationale.github.io/bal-widget
NEXT_PUBLIC_CLIENT_GUICHET_ADRESSE=
NEXT_PUBLIC_CLIENT_MES_ADRESSE=
NEXT_PUBLIC_CLIENT_FORMULAIRE_PUBLICATION=
+NEXT_PUBLIC_DATAGOUV_URL=https://www.data.gouv.fr/api/1
# -----------------------------------------
# --- Utilisation Matomo pour les stats ---
@@ -56,10 +57,10 @@ NEXT_PUBLIC_CERTIFICAT_NUMEROTATION_ENABLED=
# --- Connexion au S3 pour les datas ---
# --------------------------------------
-S3_CONFIG_ACCESS_KEY_ID=
-S3_CONFIG_SECRET_ACCESS_KEY=
-S3_CONFIG_REGION=
-S3_CONFIG_ENDPOINT=
+S3_CONFIG_ACCESS_KEY_ID=xxxx
+S3_CONFIG_SECRET_ACCESS_KEY=xxxx
+S3_CONFIG_REGION=xxxx
+S3_CONFIG_ENDPOINT=xxxx
# Connexion au Dossier Data local (en cas de rollback - TOGGLER_DATA_SOURCES=local sinon TOGGLER_DATA_SOURCES=S3)
NEXT_PUBLIC_TOGGLER_DATA_SOURCES=S3
diff --git a/docker-compose.yml b/docker-compose.yml
index e186dbc61..39fffcecc 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -47,3 +47,5 @@ services:
- S3_CONFIG_REGION=${S3_CONFIG_REGION}
- S3_CONFIG_ENDPOINT=${S3_CONFIG_ENDPOINT}
- NEXT_LAST_UPDATED_DATE_ADDOCK_URL=${NEXT_LAST_UPDATED_DATE_ADDOCK_URL}
+ - NEXT_PUBLIC_DATAGOUV_URL=${NEXT_PUBLIC_DATAGOUV_URL}
+
From 1da4f436f583d3f4db264c91c1ed882c369f3d7e Mon Sep 17 00:00:00 2001
From: Jugurtha Bouhadoun
Date: Tue, 1 Oct 2024 19:07:19 +0200
Subject: [PATCH 09/10] fix error prop-types not found
---
package-lock.json | 6 ++----
package.json | 1 +
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d3d15e889..774b4604b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,6 +18,7 @@
"gray-matter": "^4.0.3",
"maplibre-gl": "^4.7.0",
"next": "14.2.5",
+ "prop-types": "^15.7.2",
"react": "^18",
"react-chartjs-2": "^5.2.0",
"react-dom": "^18",
@@ -14610,7 +14611,6 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -15489,7 +15489,6 @@
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "dev": true,
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
@@ -15763,8 +15762,7 @@
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "dev": true
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/react-map-gl": {
"version": "7.1.7",
diff --git a/package.json b/package.json
index cff5e1f53..7ec39d93b 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
"gray-matter": "^4.0.3",
"maplibre-gl": "^4.7.0",
"next": "14.2.5",
+ "prop-types": "^15.7.2",
"react": "^18",
"react-chartjs-2": "^5.2.0",
"react-dom": "^18",
From e9bd812349fb31753a9da7c79c982f7daebbf56e Mon Sep 17 00:00:00 2001
From: Jugurtha Bouhadoun
Date: Tue, 1 Oct 2024 19:31:04 +0200
Subject: [PATCH 10/10] fix error dep file-size
---
package-lock.json | 10 +++++-----
package.json | 3 ++-
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 774b4604b..aa0d9127c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,11 +14,12 @@
"@socialgouv/matomo-next": "^1.9.0",
"@types/remark-heading-id": "^1.0.0",
"chart.js": "^4.4.4",
+ "filesize": "^10.1.6",
"geojson-vt": "^4.0.2",
"gray-matter": "^4.0.3",
"maplibre-gl": "^4.7.0",
"next": "14.2.5",
- "prop-types": "^15.7.2",
+ "prop-types": "^15.8.1",
"react": "^18",
"react-chartjs-2": "^5.2.0",
"react-dom": "^18",
@@ -11157,10 +11158,9 @@
}
},
"node_modules/filesize": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.4.tgz",
- "integrity": "sha512-ryBwPIIeErmxgPnm6cbESAzXjuEFubs+yKYLBZvg3CaiNcmkJChoOGcBSrZ6IwkMwPABwPpVXE6IlNdGJJrvEg==",
- "dev": true,
+ "version": "10.1.6",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz",
+ "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==",
"engines": {
"node": ">= 10.4.0"
}
diff --git a/package.json b/package.json
index 7ec39d93b..89fb3e3ac 100644
--- a/package.json
+++ b/package.json
@@ -25,11 +25,12 @@
"@socialgouv/matomo-next": "^1.9.0",
"@types/remark-heading-id": "^1.0.0",
"chart.js": "^4.4.4",
+ "filesize": "^10.1.6",
"geojson-vt": "^4.0.2",
"gray-matter": "^4.0.3",
"maplibre-gl": "^4.7.0",
"next": "14.2.5",
- "prop-types": "^15.7.2",
+ "prop-types": "^15.8.1",
"react": "^18",
"react-chartjs-2": "^5.2.0",
"react-dom": "^18",