diff --git a/.github/workflows/nightly-publish.yml b/.github/workflows/nightly-publish.yml index cd807731..c1c32e60 100644 --- a/.github/workflows/nightly-publish.yml +++ b/.github/workflows/nightly-publish.yml @@ -43,7 +43,6 @@ jobs: vendee, paca, rhin-occ, - sarthe, siilab ] runs-on: ubuntu-latest diff --git a/.github/workflows/process-data.reusable.yml b/.github/workflows/process-data.reusable.yml new file mode 100644 index 00000000..cb51e6f6 --- /dev/null +++ b/.github/workflows/process-data.reusable.yml @@ -0,0 +1,174 @@ +--- +name: Reusable Data transform, merge, deduplicate and publish + +on: + workflow_call: + inputs: + sources: + description: List of sources to process + required: true + type: string + environment: + description: Environment to deploy to + required: true + type: string + max_transform: + description: Maximum number of lines to transform + required: false + type: number + secrets: + DATA_INCLUSION_API_KEY: + required: true + DATA_GOUV_API_URL: + required: true + DATA_GOUV_API_KEY: + required: true + DATA_GOUV_REFERENCE_ID: + required: true + DATA_GOUV_REFERENCE_TYPE: + required: true + +jobs: + transform: + name: Transform + strategy: + matrix: + source: ${{ fromJSON(inputs.sources) }} + runs-on: ubuntu-latest + environment: ${{ inputs.environment }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + run_install: false + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: 'Create env file' + run: | + touch .env + echo DATA_INCLUSION_API_KEY="${{ secrets.DATA_INCLUSION_API_KEY }}" >> .env + - name: Transform + run: pnpm transformer.${{ matrix.source }} -f + - name: Deduplicate + run: pnpm dedupliquer.${{ matrix.source }} + - name: Upload transformed data + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.source }} + path: assets/output/${{ matrix.source }} + + publish: + name: Publish to data.gouv + strategy: + matrix: + source: ${{ fromJSON(inputs.sources) }} + runs-on: ubuntu-latest + environment: ${{ inputs.environment }} + needs: transform + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + run_install: false + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: 'Create env file' + run: | + touch .env + echo DATA_GOUV_API_URL="${{ secrets.DATA_GOUV_API_URL }}" >> .env + echo DATA_GOUV_API_KEY="${{ secrets.DATA_GOUV_API_KEY }}" >> .env + echo DATA_GOUV_REFERENCE_ID="${{ secrets.DATA_GOUV_REFERENCE_ID }}" >> .env + echo DATA_GOUV_REFERENCE_TYPE="${{ secrets.DATA_GOUV_REFERENCE_TYPE }}" >> .env + - name: Download transformed data + uses: actions/download-artifact@v4 + with: + name: ${{ matrix.source }} + path: assets/output/${{ matrix.source }} + - name: Rename files to publish + run: sed -i 's/-sans-doublons//g' ./assets/output/${{ matrix.source }}/publier.json + - name: Publish + run: pnpm publier.${{ matrix.source }} + + merge: + name: Merge + runs-on: ubuntu-latest + needs: transform + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + run_install: false + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Download all transformed data + uses: actions/download-artifact@v4 + with: + path: to-merge + merge-multiple: true + - name: Remove useless files + run: | + rm to-merge/services-* + rm to-merge/structures-* + - name: Merge transformed data + run: pnpm fusionner + - name: Upload merged data + uses: actions/upload-artifact@v4 + with: + name: merged + path: merged + + deduplicate: + name: Deduplicate + runs-on: ubuntu-latest + needs: merge + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + run_install: false + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Download merged data + uses: actions/download-artifact@v4 + with: + name: merged + path: assets/to-deduplicate + - name: Deduplicate merged data + run: pnpm dedupliquer.merged-json + - name: Upload deduplicated data + uses: actions/upload-artifact@v4 + with: + name: deduplicated + path: assets/deduplicated diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7695cf16..978101b9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -48,7 +48,6 @@ jobs: vendee, paca, rhin-occ, - sarthe, siilab ] runs-on: ubuntu-latest diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index cc320ae3..d34a74c3 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -22,11 +22,53 @@ concurrency: cancel-in-progress: true jobs: + prettier: + name: Prettier + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + run_install: false + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Run Prettier check + run: pnpm prettier.ci + + eslint: + name: ESLint + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + run_install: false + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Run ESLint + run: pnpm lint.es + commitlint: name: CommitLint runs-on: ubuntu-latest steps: - - name: Checkout mednum-cli repository + - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 @@ -34,125 +76,137 @@ jobs: uses: pnpm/action-setup@v4 with: version: 9 - - name: Set up Node.js + run_install: false + - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: latest + node-version: 22 cache: 'pnpm' - name: Install dependencies run: pnpm install - - name: commitlint + - name: Run Commitlint run: pnpm lint.commit - validation-matrix: - uses: romain-cambonie/serenity-workflows/.github/workflows/_validation-matrix.reusable.yml@master - with: - commands-as-comma-separated-string: 'lint.all,prettier.check,test,build' - transform-and-publish: - name: Transform and publish to data.gouv - strategy: - matrix: - source: - [ - aidants-connect, - aix-en-provence, - angers, - bus-france-services-charente, - charente-maritime, - conseiller-numerique, - coop-numerique, - corse, - dora, - epernay, - etapes-numerique, - fibre-64, - france-services, - francil-in, - gironde, - grand-paris-sud, - haute-vienne, - hinaura, - hub-bretagne, - hub-lo, - la-creuse, - le-havre, - les-landes, - loire-atlantique, - maine-et-loire, - mednum-bfc, - mulhouse, - nouvelle-caledonie, - vendee, - paca, - rhin-occ, - sarthe, - siilab - ] + tests: + name: Tests runs-on: ubuntu-latest - environment: demo steps: - - name: Checkout mednum-cli repository + - name: Checkout repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - name: Install pnpm uses: pnpm/action-setup@v4 with: version: 9 - - name: Set up Node.js + run_install: false + - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: latest + node-version: 22 cache: 'pnpm' - name: Install dependencies run: pnpm install - - name: 'Create env file' - run: | - touch .env - echo DATA_GOUV_API_URL="${{ secrets.DATA_GOUV_API_URL }}" >> .env - echo DATA_GOUV_API_KEY="${{ secrets.DATA_GOUV_API_KEY }}" >> .env - echo DATA_GOUV_REFERENCE_ID="${{ secrets.DATA_GOUV_REFERENCE_ID }}" >> .env - echo DATA_GOUV_REFERENCE_TYPE="${{ secrets.DATA_GOUV_REFERENCE_TYPE }}" >> .env - echo DATA_INCLUSION_API_KEY="${{ secrets.DATA_INCLUSION_API_KEY }}" >> .env - echo MAX_TRANSFORM=1000 >> .env - - name: Transform - run: pnpm transformer.${{ matrix.source }} - - name: Publish - run: pnpm publier.${{ matrix.source }} + - name: Run Tests + run: pnpm test - extract-and-publish: - name: Extract and publish to data.gouv - strategy: - matrix: - source: [extract-eure-et-loir, extract-mednum-hub-antilles, extract-numi, extract-paca, extract-savoie, extract-vendee] + build: + name: Build runs-on: ubuntu-latest - environment: demo - needs: - - transform-and-publish steps: - - name: Checkout mednum-cli repository + - name: Checkout repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - name: Install pnpm uses: pnpm/action-setup@v4 with: version: 9 - - name: Set up Node.js + run_install: false + - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: latest + node-version: 22 cache: 'pnpm' - name: Install dependencies run: pnpm install - - name: 'Create env file' - run: | - touch .env - echo DATA_GOUV_API_URL="${{ secrets.DATA_GOUV_API_URL }}" >> .env - echo DATA_GOUV_API_KEY="${{ secrets.DATA_GOUV_API_KEY }}" >> .env - echo DATA_GOUV_REFERENCE_ID="${{ secrets.DATA_GOUV_REFERENCE_ID }}" >> .env - echo DATA_GOUV_REFERENCE_TYPE="${{ secrets.DATA_GOUV_REFERENCE_TYPE }}" >> .env - - name: Extract - run: pnpm extract.${{ matrix.source }} - - name: Publish - run: pnpm publier.${{ matrix.source }} + - name: Build + run: pnpm build + + process_data: + name: Process data + uses: ./.github/workflows/process-data.reusable.yml + with: + sources: '[ + "aidants-connect", + "aix-en-provence", + "angers", + "bus-france-services-charente", + "charente-maritime", + "conseiller-numerique", + "coop-numerique", + "corse", + "dora", + "epernay", + "etapes-numerique", + "fibre-64", + "france-services", + "francil-in", + "gironde", + "grand-paris-sud", + "haute-vienne", + "hinaura", + "hub-bretagne", + "hub-lo", + "la-creuse", + "le-havre", + "les-landes", + "loire-atlantique", + "maine-et-loire", + "mednum-bfc", + "mulhouse", + "nouvelle-caledonie", + "vendee", + "paca", + "rhin-occ", + "siilab" + ]' + environment: demo + secrets: + DATA_INCLUSION_API_KEY: ${{ secrets.DATA_INCLUSION_API_KEY }} + DATA_GOUV_API_URL: ${{ secrets.DATA_GOUV_API_URL }} + DATA_GOUV_API_KEY: ${{ secrets.DATA_GOUV_API_KEY }} + DATA_GOUV_REFERENCE_ID: ${{ secrets.DATA_GOUV_REFERENCE_ID }} + DATA_GOUV_REFERENCE_TYPE: ${{ secrets.DATA_GOUV_REFERENCE_TYPE }} +# extract-and-publish: +# name: Extract and publish to data.gouv +# strategy: +# matrix: +# source: [extract-eure-et-loir, extract-mednum-hub-antilles, extract-numi, extract-paca, extract-savoie, extract-vendee] +# runs-on: ubuntu-latest +# environment: demo +# needs: +# - transform-and-publish +# steps: +# - name: Checkout mednum-cli repository +# uses: actions/checkout@v4 +# with: +# fetch-depth: 0 +# - name: Install pnpm +# uses: pnpm/action-setup@v4 +# with: +# version: 9 +# - name: Set up Node.js +# uses: actions/setup-node@v4 +# with: +# node-version: latest +# cache: 'pnpm' +# - name: Install dependencies +# run: pnpm install +# - name: 'Create env file' +# run: | +# touch .env +# echo DATA_GOUV_API_URL="${{ secrets.DATA_GOUV_API_URL }}" >> .env +# echo DATA_GOUV_API_KEY="${{ secrets.DATA_GOUV_API_KEY }}" >> .env +# echo DATA_GOUV_REFERENCE_ID="${{ secrets.DATA_GOUV_REFERENCE_ID }}" >> .env +# echo DATA_GOUV_REFERENCE_TYPE="${{ secrets.DATA_GOUV_REFERENCE_TYPE }}" >> .env +# - name: Extract +# run: pnpm extract.${{ matrix.source }} +# - name: Publish +# run: pnpm publier.${{ matrix.source }} diff --git a/.gitignore b/.gitignore index e19d538b..35a57533 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ /assets/deduplicated/ /assets/merged/ /assets/to-merge/ -/assets/input/france-tiers-lieux/france-tiers-lieux.json # Logs logs diff --git a/.husky/commit-msg b/.husky/commit-msg index e258944d..7b554ec4 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no -- commitlint --edit "${1}" --config ./.tooling/.commitlint/commitlint.config.cjs +npx --no -- commitlint --edit "${1}" diff --git a/.husky/pre-commit b/.husky/pre-commit index 03aca754..cb2c84d5 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -lint-staged --config=./.tooling/.lintstaged/.lintstagedrc +pnpm lint-staged diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 00000000..47e9add0 --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,4 @@ +{ + "*.(js|ts|tsx)": "eslint", + "*.(md|json|yml|xml|html|css|scss|js|ts|tsx|sh)": "prettier --write" +} diff --git a/.tooling/.jest/jest.config.ts b/.tooling/.jest/jest.config.ts deleted file mode 100644 index 7935c3af..00000000 --- a/.tooling/.jest/jest.config.ts +++ /dev/null @@ -1,22 +0,0 @@ -// From https://kulshekhar.github.io/ts-jest/docs/getting-started/presets -import type { JestConfigWithTsJest } from 'ts-jest'; - -process.env.TZ = 'UTC'; - -const jestConfig: JestConfigWithTsJest = { - rootDir: './../../src', - preset: 'ts-jest', - testEnvironment: 'node', - // - transform: { - // This is the default transform regex - '^.+\\.tsx?$': [ - 'ts-jest', - { - tsconfig: './.tsconfig/tsconfig.test.json' - } - ] - } -}; - -export default jestConfig; diff --git a/.tooling/.lintstaged/.lintstagedrc b/.tooling/.lintstaged/.lintstagedrc deleted file mode 100644 index ab624c6c..00000000 --- a/.tooling/.lintstaged/.lintstagedrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "*.(js|ts|tsx)": "eslint --config=./.tooling/.eslint/.eslintrc.cjs", - "*.(md|json|yml|xml|html|css|scss|js|ts|tsx|sh)": "prettier --config=./.tooling/.prettier/.prettierrc.cjs --write" -} diff --git a/.tsconfig/tsconfig.test.json b/.tsconfig/tsconfig.test.json index 04d001e7..166cfb24 100644 --- a/.tsconfig/tsconfig.test.json +++ b/.tsconfig/tsconfig.test.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "display": "Test configuration for Jest testing framework", + "display": "Test configuration for Vitest testing framework", "extends": "./tsconfig.base.json", "include": ["../src/**/*.test.ts", "../src/**/*.spec.ts"] } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 02f3947e..6a352029 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -189,7 +189,7 @@ La branche `main`, ainsi que l'ensemble des branches de travail avec un préfixe #### CLI -- [Jest](https://jestjs.io/) est une boîte à outils pour écrire des tests automatisés en JavaScript +- [Vitest](https://vitest.dev/) est une boîte à outils pour écrire des tests automatisés en JavaScript - [Eslint](https://eslint.org/) est un analyseur statique de JavaScript - [Prettier](https://prettier.io/) est un magnificateur de code source en JavaScript - [Husky](https://typicode.github.io/husky/#/) est un outil qui permet d'effectuer des vérifications automatiques avant de publier des contributions. diff --git a/assets/input/france-tiers-lieux/france-tiers-lieux.config.json b/assets/input/france-tiers-lieux/france-tiers-lieux.config.json deleted file mode 100644 index 5563ca34..00000000 --- a/assets/input/france-tiers-lieux/france-tiers-lieux.config.json +++ /dev/null @@ -1,241 +0,0 @@ -{ - "id": { - "colonne": "_id.$id" - }, - "nom": { - "colonne": "name" - }, - "commune": { - "colonne": "address.addressLocality" - }, - "code_postal": { - "colonne": "address.postalCode" - }, - "adresse": { - "colonne": "address.streetAddress" - }, - "latitude": { - "colonne": "geo.latitude" - }, - "longitude": { - "colonne": "geo.longitude" - }, - "date_maj": { - "colonne": "updated" - }, - "presentation_resume": { - "colonne": "shortDescription" - }, - "presentation_detail": { - "colonne": "description" - }, - "typologie": [ - { - "cible": "TIERS_LIEUX" - } - ], - "services": [ - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": [ - "PC en libres accès", - "disposer d’équipements", - "bureaux privatifs", - "postes de travail", - "Atelier de Fabrication Numérique", - "Fablab", - "ordinateur", - "Espace Public Numérique", - "EPN" - ], - "cible": "Accéder à du matériel" - }, - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": [ - "PC en libres accès", - "disposer d’équipements", - "bureaux privatifs", - "postes de travail", - "Atelier de Fabrication Numérique", - "Fablab", - "Coworking", - "Espace Public Numérique", - "EPN" - ], - "cible": "Accéder à une connexion internet" - }, - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": ["PC en libres accès", "disposer d’équipements", "Espace Public Numérique", "EPN"], - "cible": "Prendre en main un ordinateur" - }, - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": ["smartphone", "Espace Public Numérique", "EPN"], - "cible": "Prendre en main un smartphone ou une tablette" - }, - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": [ - "apprentis", - "demandeurs d’emploi", - "personnes en reconversion", - "Atelier de Fabrication Numérique", - "Fablab", - "Lieu d'éducation populaire et nouvelles formes d'apprentissage", - "Formation", - "Transfert de savoir-faire", - "Éducation", - "étudiants", - "accompagnement à la scolarité", - "Espace Public Numérique", - "EPN" - ], - "cible": "Favoriser mon insertion professionnelle" - }, - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": ["création d’entreprise", "Coworking", "Incubateur", "Espace Public Numérique", "EPN"], - "cible": "Créer et développer mon entreprise" - }, - { - "colonnes": ["description", "tags", "shortDescription"], - "termes": [ - "création d’entreprise", - "Coworking", - "Incubateur", - "Espace Public Numérique", - "EPN", - "Atelier de Fabrication Numérique", - "Fablab" - ], - "cible": "Créer avec le numérique" - }, - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": ["échange des savoirs", "Médiation numérique", "Espace Public Numérique", "EPN"], - "cible": "Approfondir ma culture numérique" - }, - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": ["échange des savoirs", "Médiation numérique", "Espace Public Numérique", "EPN"], - "cible": "Promouvoir la citoyenneté numérique" - }, - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": ["échange des savoirs", "Médiation numérique", "Espace Public Numérique", "EPN"], - "cible": "Utiliser le numérique au quotidien" - }, - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": [ - "Accompagnement à la parentalité", - "parentalité", - "accompagnement à la scolarité", - "Espace Public Numérique", - "EPN" - ], - "cible": "Soutenir la parentalité et l'éducation avec le numérique" - }, - { - "colonnes": ["description", "tags"], - "termes": ["Espace Public Numérique", "EPN"], - "cible": "Devenir autonome dans les démarches administratives" - }, - { - "colonnes": ["description", "tags"], - "termes": ["Espace Public Numérique", "EPN"], - "cible": "Réaliser des démarches administratives avec un accompagnement" - }, - { - "colonnes": ["description", "tags"], - "termes": ["Espace Public Numérique", "EPN"], - "cible": "Accompagner les démarches de santé" - } - ], - "modalites_accompagnement": [ - { - "colonnes": ["description"], - "termes": ["ateliers collectifs", "Espace Public Numérique", "EPN"], - "cible": "Dans un atelier : j'apprends collectivement à utiliser le numérique" - }, - { - "colonnes": ["description"], - "termes": ["ateliers individuels", "Espace Public Numérique", "EPN"], - "cible": "Avec de l'aide : je suis accompagné seul dans l'usage du numérique" - } - ], - "publics_accueillis": [ - { - "colonnes": ["description", "shortDescription", "tags"], - "termes": [ - "jeunesse", - "accueillir des jeunes", - "toutes personnes", - "ouvert au grand public", - "Formation", - "Éducation", - "étudiants" - ], - "cible": "Jeunes (16-26 ans)" - }, - { - "colonnes": ["description", "tags", "shortDescription"], - "termes": ["toutes personnes", "Coworking", "Espace détente", "ouvert au grand public", "entreprises", "particuliers"], - "cible": "Adultes" - }, - { - "colonnes": ["description", "tags", "shortDescription"], - "termes": ["toutes personnes", "Espace enfants", "ouvert au grand public"], - "cible": "Familles/enfants" - }, - { - "colonnes": ["description", "shortDescription"], - "termes": ["toutes personnes", "ouvert au grand public"], - "cible": "Seniors (+ 65 ans)" - }, - { - "colonnes": ["description", "shortDescription"], - "termes": ["toutes personnes", "ouvert au grand public"], - "cible": "Déficience visuelle" - }, - { - "colonnes": ["description", "shortDescription"], - "termes": ["toutes personnes", "ouvert au grand public"], - "cible": "Handicaps psychiques : troubles psychiatriques donnant lieu à des atteintes comportementales" - }, - { - "colonnes": ["description", "shortDescription"], - "termes": ["toutes personnes", "ouvert au grand public"], - "cible": "Public langues étrangères" - }, - { - "colonnes": ["description", "shortDescription"], - "termes": ["toutes personnes", "ouvert au grand public"], - "cible": "Surdité" - }, - { - "colonnes": ["description", "shortDescription"], - "termes": ["toutes personnes", "accompagnons les femmes", "ouvert au grand public"], - "cible": "Uniquement femmes" - }, - { - "colonnes": ["description", "shortDescription"], - "termes": ["toutes personnes", "ouvert au grand public"], - "cible": "Handicaps mentaux : déficiences limitant les activités d'une personne" - }, - { - "colonnes": ["description", "shortDescription"], - "termes": ["toutes personnes", "ouvert au grand public"], - "cible": "Personnes en situation d'illettrisme" - } - ], - "conditions_acces": [ - { - "colonnes": ["description"], - "termes": ["disposition des adhérents"], - "cible": "Adhésion : L'accès au lieu et/ou à ses services nécessite d'y adhérer" - } - ] -} diff --git a/assets/input/francil-in/francil-in.config.json b/assets/input/francil-in/francil-in.config.json index 5421c9a8..ad7a0903 100644 --- a/assets/input/francil-in/francil-in.config.json +++ b/assets/input/francil-in/francil-in.config.json @@ -58,42 +58,42 @@ ], "services": [ { - "colonnes": ["properties.services.0", "properties.services.1", "properties.services.2", "properties.services.3", "properties.services.4", "properties.services.5", "properties.services.6", "properties.services.7", "properties.services.8", "properties.services.9", "properties.services.10", "properties.services.11", "properties.services.12", "properties.services.13", "properties.services.14", "properties.services.15", "properties.services.16", "properties.services.17", "properties.services.18", "properties.services.19", "properties.services.20", "properties.services.21", "properties.services.22", "properties.services.23", "properties.services.24", "properties.services.25", "properties.services.26", "properties.services.27", "properties.services.28", "properties.services.29", "properties.services.30", "properties.services.31", "properties.services.32", "properties.services.33", "properties.services.34", "properties.services.35", "properties.services.36", "properties.services.37", "properties.services.38", "properties.services.39", "properties.services.40", "properties.services.41", "properties.services.42", "properties.services.43", "properties.services.44", "properties.services.45", "properties.services.46", "properties.services.47", "properties.services.48", "properties.services.49", "properties.services.50", "properties.services.51", "properties.services.52", "properties.services.53", "properties.services.54", "properties.services.55", "properties.services.56", "properties.services.57", "properties.services.58", "properties.services.59", "properties.services.60", "properties.services.61", "properties.services.62", "properties.services.63", "properties.services.64", "properties.services.65", "properties.services.66", "properties.services.67", "properties.services.68", "properties.services.69", "properties.services.70", "properties.services.71", "properties.services.72", "properties.services.73", "properties.services.74", "properties.services.75", "properties.services.76", "properties.services.77", "properties.services.78", "properties.services.79", "properties.services.80", "properties.services.81", "properties.services.82", "properties.services.83", "properties.services.84", "properties.services.85", "properties.services.86", "properties.services.87", "properties.services.88", "properties.services.89", "properties.services.90", "properties.services.91", "properties.services.92", "properties.services.93", "properties.services.94", "properties.services.95", "properties.services.96", "properties.services.97", "properties.services.98", "properties.services.99", "properties.services.100", "properties.services.101", "properties.services.102", "properties.services.103", "properties.services.104", "properties.services.105", "properties.services.106", "properties.services.107", "properties.services.108", "properties.services.109", "properties.services.110", "properties.services.111", "properties.services.112", "properties.services.113", "properties.services.114", "properties.services.115", "properties.services.116", "properties.services.117", "properties.services.118", "properties.services.119", "properties.services.120", "properties.services.121", "properties.services.122", "properties.services.123", "properties.services.124", "properties.services.125", "properties.services.126", "properties.services.127", "properties.services.128", "properties.services.129", "properties.services.130", "properties.services.131", "properties.services.132", "properties.services.133", "properties.services.134", "properties.services.135", "properties.services.136"], + "colonnes": ["properties.services"], "termes": ["202", "203", "204", "205", "206", "207", "208", "209", "210", "211", "212", "213", "214"], "cible": "Aide aux démarches administratives" }, { - "colonnes": ["properties.services.0", "properties.services.1", "properties.services.2", "properties.services.3", "properties.services.4", "properties.services.5", "properties.services.6", "properties.services.7", "properties.services.8", "properties.services.9", "properties.services.10", "properties.services.11", "properties.services.12", "properties.services.13", "properties.services.14", "properties.services.15", "properties.services.16", "properties.services.17", "properties.services.18", "properties.services.19", "properties.services.20", "properties.services.21", "properties.services.22", "properties.services.23", "properties.services.24", "properties.services.25", "properties.services.26", "properties.services.27", "properties.services.28", "properties.services.29", "properties.services.30", "properties.services.31", "properties.services.32", "properties.services.33", "properties.services.34", "properties.services.35", "properties.services.36", "properties.services.37", "properties.services.38", "properties.services.39", "properties.services.40", "properties.services.41", "properties.services.42", "properties.services.43", "properties.services.44", "properties.services.45", "properties.services.46", "properties.services.47", "properties.services.48", "properties.services.49", "properties.services.50", "properties.services.51", "properties.services.52", "properties.services.53", "properties.services.54", "properties.services.55", "properties.services.56", "properties.services.57", "properties.services.58", "properties.services.59", "properties.services.60", "properties.services.61", "properties.services.62", "properties.services.63", "properties.services.64", "properties.services.65", "properties.services.66", "properties.services.67", "properties.services.68", "properties.services.69", "properties.services.70", "properties.services.71", "properties.services.72", "properties.services.73", "properties.services.74", "properties.services.75", "properties.services.76", "properties.services.77", "properties.services.78", "properties.services.79", "properties.services.80", "properties.services.81", "properties.services.82", "properties.services.83", "properties.services.84", "properties.services.85", "properties.services.86", "properties.services.87", "properties.services.88", "properties.services.89", "properties.services.90", "properties.services.91", "properties.services.92", "properties.services.93", "properties.services.94", "properties.services.95", "properties.services.96", "properties.services.97", "properties.services.98", "properties.services.99", "properties.services.100", "properties.services.101", "properties.services.102", "properties.services.103", "properties.services.104", "properties.services.105", "properties.services.106", "properties.services.107", "properties.services.108", "properties.services.109", "properties.services.110", "properties.services.111", "properties.services.112", "properties.services.113", "properties.services.114", "properties.services.115", "properties.services.116", "properties.services.117", "properties.services.118", "properties.services.119", "properties.services.120", "properties.services.121", "properties.services.122", "properties.services.123", "properties.services.124", "properties.services.125", "properties.services.126", "properties.services.127", "properties.services.128", "properties.services.129", "properties.services.130", "properties.services.131", "properties.services.132", "properties.services.133", "properties.services.134", "properties.services.135", "properties.services.136"], + "colonnes": ["properties.services"], "termes": ["201", "301", "302", "306", "307", "308", "309", "310", "311", "312", "313", "314", "315", "316", "317", "318", "319", "320", "321", "322", "323", "324", "325", "326", "327", "328", "329", "330", "331", "332", "333", "334", "335", "336", "337", "401", "402", "403", "404", "405", "406", "407", "408", "801", "802", "806", "807", "809", "810", "812", "815", "816"], "cible": "Maîtrise des outils numériques du quotidien" }, { - "colonnes": ["properties.services.0", "properties.services.1", "properties.services.2", "properties.services.3", "properties.services.4", "properties.services.5", "properties.services.6", "properties.services.7", "properties.services.8", "properties.services.9", "properties.services.10", "properties.services.11", "properties.services.12", "properties.services.13", "properties.services.14", "properties.services.15", "properties.services.16", "properties.services.17", "properties.services.18", "properties.services.19", "properties.services.20", "properties.services.21", "properties.services.22", "properties.services.23", "properties.services.24", "properties.services.25", "properties.services.26", "properties.services.27", "properties.services.28", "properties.services.29", "properties.services.30", "properties.services.31", "properties.services.32", "properties.services.33", "properties.services.34", "properties.services.35", "properties.services.36", "properties.services.37", "properties.services.38", "properties.services.39", "properties.services.40", "properties.services.41", "properties.services.42", "properties.services.43", "properties.services.44", "properties.services.45", "properties.services.46", "properties.services.47", "properties.services.48", "properties.services.49", "properties.services.50", "properties.services.51", "properties.services.52", "properties.services.53", "properties.services.54", "properties.services.55", "properties.services.56", "properties.services.57", "properties.services.58", "properties.services.59", "properties.services.60", "properties.services.61", "properties.services.62", "properties.services.63", "properties.services.64", "properties.services.65", "properties.services.66", "properties.services.67", "properties.services.68", "properties.services.69", "properties.services.70", "properties.services.71", "properties.services.72", "properties.services.73", "properties.services.74", "properties.services.75", "properties.services.76", "properties.services.77", "properties.services.78", "properties.services.79", "properties.services.80", "properties.services.81", "properties.services.82", "properties.services.83", "properties.services.84", "properties.services.85", "properties.services.86", "properties.services.87", "properties.services.88", "properties.services.89", "properties.services.90", "properties.services.91", "properties.services.92", "properties.services.93", "properties.services.94", "properties.services.95", "properties.services.96", "properties.services.97", "properties.services.98", "properties.services.99", "properties.services.100", "properties.services.101", "properties.services.102", "properties.services.103", "properties.services.104", "properties.services.105", "properties.services.106", "properties.services.107", "properties.services.108", "properties.services.109", "properties.services.110", "properties.services.111", "properties.services.112", "properties.services.113", "properties.services.114", "properties.services.115", "properties.services.116", "properties.services.117", "properties.services.118", "properties.services.119", "properties.services.120", "properties.services.121", "properties.services.122", "properties.services.123", "properties.services.124", "properties.services.125", "properties.services.126", "properties.services.127", "properties.services.128", "properties.services.129", "properties.services.130", "properties.services.131", "properties.services.132", "properties.services.133", "properties.services.134", "properties.services.135", "properties.services.136"], + "colonnes": ["properties.services"], "termes": ["110", "111", "112", "113", "114", "115", "116", "203", "814"], "cible": "Insertion professionnelle via le numérique" }, { - "colonnes": ["properties.services.0", "properties.services.1", "properties.services.2", "properties.services.3", "properties.services.4", "properties.services.5", "properties.services.6", "properties.services.7", "properties.services.8", "properties.services.9", "properties.services.10", "properties.services.11", "properties.services.12", "properties.services.13", "properties.services.14", "properties.services.15", "properties.services.16", "properties.services.17", "properties.services.18", "properties.services.19", "properties.services.20", "properties.services.21", "properties.services.22", "properties.services.23", "properties.services.24", "properties.services.25", "properties.services.26", "properties.services.27", "properties.services.28", "properties.services.29", "properties.services.30", "properties.services.31", "properties.services.32", "properties.services.33", "properties.services.34", "properties.services.35", "properties.services.36", "properties.services.37", "properties.services.38", "properties.services.39", "properties.services.40", "properties.services.41", "properties.services.42", "properties.services.43", "properties.services.44", "properties.services.45", "properties.services.46", "properties.services.47", "properties.services.48", "properties.services.49", "properties.services.50", "properties.services.51", "properties.services.52", "properties.services.53", "properties.services.54", "properties.services.55", "properties.services.56", "properties.services.57", "properties.services.58", "properties.services.59", "properties.services.60", "properties.services.61", "properties.services.62", "properties.services.63", "properties.services.64", "properties.services.65", "properties.services.66", "properties.services.67", "properties.services.68", "properties.services.69", "properties.services.70", "properties.services.71", "properties.services.72", "properties.services.73", "properties.services.74", "properties.services.75", "properties.services.76", "properties.services.77", "properties.services.78", "properties.services.79", "properties.services.80", "properties.services.81", "properties.services.82", "properties.services.83", "properties.services.84", "properties.services.85", "properties.services.86", "properties.services.87", "properties.services.88", "properties.services.89", "properties.services.90", "properties.services.91", "properties.services.92", "properties.services.93", "properties.services.94", "properties.services.95", "properties.services.96", "properties.services.97", "properties.services.98", "properties.services.99", "properties.services.100", "properties.services.101", "properties.services.102", "properties.services.103", "properties.services.104", "properties.services.105", "properties.services.106", "properties.services.107", "properties.services.108", "properties.services.109", "properties.services.110", "properties.services.111", "properties.services.112", "properties.services.113", "properties.services.114", "properties.services.115", "properties.services.116", "properties.services.117", "properties.services.118", "properties.services.119", "properties.services.120", "properties.services.121", "properties.services.122", "properties.services.123", "properties.services.124", "properties.services.125", "properties.services.126", "properties.services.127", "properties.services.128", "properties.services.129", "properties.services.130", "properties.services.131", "properties.services.132", "properties.services.133", "properties.services.134", "properties.services.135", "properties.services.136"], + "colonnes": ["properties.services"], "termes": ["211", "201", "501", "502", "503", "504", "510", "808"], "cible": "Utilisation sécurisée du numérique" }, { - "colonnes": ["properties.services.0", "properties.services.1", "properties.services.2", "properties.services.3", "properties.services.4", "properties.services.5", "properties.services.6", "properties.services.7", "properties.services.8", "properties.services.9", "properties.services.10", "properties.services.11", "properties.services.12", "properties.services.13", "properties.services.14", "properties.services.15", "properties.services.16", "properties.services.17", "properties.services.18", "properties.services.19", "properties.services.20", "properties.services.21", "properties.services.22", "properties.services.23", "properties.services.24", "properties.services.25", "properties.services.26", "properties.services.27", "properties.services.28", "properties.services.29", "properties.services.30", "properties.services.31", "properties.services.32", "properties.services.33", "properties.services.34", "properties.services.35", "properties.services.36", "properties.services.37", "properties.services.38", "properties.services.39", "properties.services.40", "properties.services.41", "properties.services.42", "properties.services.43", "properties.services.44", "properties.services.45", "properties.services.46", "properties.services.47", "properties.services.48", "properties.services.49", "properties.services.50", "properties.services.51", "properties.services.52", "properties.services.53", "properties.services.54", "properties.services.55", "properties.services.56", "properties.services.57", "properties.services.58", "properties.services.59", "properties.services.60", "properties.services.61", "properties.services.62", "properties.services.63", "properties.services.64", "properties.services.65", "properties.services.66", "properties.services.67", "properties.services.68", "properties.services.69", "properties.services.70", "properties.services.71", "properties.services.72", "properties.services.73", "properties.services.74", "properties.services.75", "properties.services.76", "properties.services.77", "properties.services.78", "properties.services.79", "properties.services.80", "properties.services.81", "properties.services.82", "properties.services.83", "properties.services.84", "properties.services.85", "properties.services.86", "properties.services.87", "properties.services.88", "properties.services.89", "properties.services.90", "properties.services.91", "properties.services.92", "properties.services.93", "properties.services.94", "properties.services.95", "properties.services.96", "properties.services.97", "properties.services.98", "properties.services.99", "properties.services.100", "properties.services.101", "properties.services.102", "properties.services.103", "properties.services.104", "properties.services.105", "properties.services.106", "properties.services.107", "properties.services.108", "properties.services.109", "properties.services.110", "properties.services.111", "properties.services.112", "properties.services.113", "properties.services.114", "properties.services.115", "properties.services.116", "properties.services.117", "properties.services.118", "properties.services.119", "properties.services.120", "properties.services.121", "properties.services.122", "properties.services.123", "properties.services.124", "properties.services.125", "properties.services.126", "properties.services.127", "properties.services.128", "properties.services.129", "properties.services.130", "properties.services.131", "properties.services.132", "properties.services.133", "properties.services.134", "properties.services.135", "properties.services.136"], + "colonnes": ["properties.services"], "termes": ["213", "601", "602", "603", "604", "605", "606", "607", "608"], "cible": "Parentalité et éducation avec le numérique" }, { - "colonnes": ["properties.services.0", "properties.services.1", "properties.services.2", "properties.services.3", "properties.services.4", "properties.services.5", "properties.services.6", "properties.services.7", "properties.services.8", "properties.services.9", "properties.services.10", "properties.services.11", "properties.services.12", "properties.services.13", "properties.services.14", "properties.services.15", "properties.services.16", "properties.services.17", "properties.services.18", "properties.services.19", "properties.services.20", "properties.services.21", "properties.services.22", "properties.services.23", "properties.services.24", "properties.services.25", "properties.services.26", "properties.services.27", "properties.services.28", "properties.services.29", "properties.services.30", "properties.services.31", "properties.services.32", "properties.services.33", "properties.services.34", "properties.services.35", "properties.services.36", "properties.services.37", "properties.services.38", "properties.services.39", "properties.services.40", "properties.services.41", "properties.services.42", "properties.services.43", "properties.services.44", "properties.services.45", "properties.services.46", "properties.services.47", "properties.services.48", "properties.services.49", "properties.services.50", "properties.services.51", "properties.services.52", "properties.services.53", "properties.services.54", "properties.services.55", "properties.services.56", "properties.services.57", "properties.services.58", "properties.services.59", "properties.services.60", "properties.services.61", "properties.services.62", "properties.services.63", "properties.services.64", "properties.services.65", "properties.services.66", "properties.services.67", "properties.services.68", "properties.services.69", "properties.services.70", "properties.services.71", "properties.services.72", "properties.services.73", "properties.services.74", "properties.services.75", "properties.services.76", "properties.services.77", "properties.services.78", "properties.services.79", "properties.services.80", "properties.services.81", "properties.services.82", "properties.services.83", "properties.services.84", "properties.services.85", "properties.services.86", "properties.services.87", "properties.services.88", "properties.services.89", "properties.services.90", "properties.services.91", "properties.services.92", "properties.services.93", "properties.services.94", "properties.services.95", "properties.services.96", "properties.services.97", "properties.services.98", "properties.services.99", "properties.services.100", "properties.services.101", "properties.services.102", "properties.services.103", "properties.services.104", "properties.services.105", "properties.services.106", "properties.services.107", "properties.services.108", "properties.services.109", "properties.services.110", "properties.services.111", "properties.services.112", "properties.services.113", "properties.services.114", "properties.services.115", "properties.services.116", "properties.services.117", "properties.services.118", "properties.services.119", "properties.services.120", "properties.services.121", "properties.services.122", "properties.services.123", "properties.services.124", "properties.services.125", "properties.services.126", "properties.services.127", "properties.services.128", "properties.services.129", "properties.services.130", "properties.services.131", "properties.services.132", "properties.services.133", "properties.services.134", "properties.services.135", "properties.services.136"], + "colonnes": ["properties.services"], "termes": ["408", "701", "702", "703", "704", "705", "706", "707", "708", "709", "710", "711", "712", "713", "714", "715", "716", "717", "718", "719", "721", "722", "723", "724", "811"], "cible": "Loisirs et créations numériques" }, { - "colonnes": ["properties.services.0", "properties.services.1", "properties.services.2", "properties.services.3", "properties.services.4", "properties.services.5", "properties.services.6", "properties.services.7", "properties.services.8", "properties.services.9", "properties.services.10", "properties.services.11", "properties.services.12", "properties.services.13", "properties.services.14", "properties.services.15", "properties.services.16", "properties.services.17", "properties.services.18", "properties.services.19", "properties.services.20", "properties.services.21", "properties.services.22", "properties.services.23", "properties.services.24", "properties.services.25", "properties.services.26", "properties.services.27", "properties.services.28", "properties.services.29", "properties.services.30", "properties.services.31", "properties.services.32", "properties.services.33", "properties.services.34", "properties.services.35", "properties.services.36", "properties.services.37", "properties.services.38", "properties.services.39", "properties.services.40", "properties.services.41", "properties.services.42", "properties.services.43", "properties.services.44", "properties.services.45", "properties.services.46", "properties.services.47", "properties.services.48", "properties.services.49", "properties.services.50", "properties.services.51", "properties.services.52", "properties.services.53", "properties.services.54", "properties.services.55", "properties.services.56", "properties.services.57", "properties.services.58", "properties.services.59", "properties.services.60", "properties.services.61", "properties.services.62", "properties.services.63", "properties.services.64", "properties.services.65", "properties.services.66", "properties.services.67", "properties.services.68", "properties.services.69", "properties.services.70", "properties.services.71", "properties.services.72", "properties.services.73", "properties.services.74", "properties.services.75", "properties.services.76", "properties.services.77", "properties.services.78", "properties.services.79", "properties.services.80", "properties.services.81", "properties.services.82", "properties.services.83", "properties.services.84", "properties.services.85", "properties.services.86", "properties.services.87", "properties.services.88", "properties.services.89", "properties.services.90", "properties.services.91", "properties.services.92", "properties.services.93", "properties.services.94", "properties.services.95", "properties.services.96", "properties.services.97", "properties.services.98", "properties.services.99", "properties.services.100", "properties.services.101", "properties.services.102", "properties.services.103", "properties.services.104", "properties.services.105", "properties.services.106", "properties.services.107", "properties.services.108", "properties.services.109", "properties.services.110", "properties.services.111", "properties.services.112", "properties.services.113", "properties.services.114", "properties.services.115", "properties.services.116", "properties.services.117", "properties.services.118", "properties.services.119", "properties.services.120", "properties.services.121", "properties.services.122", "properties.services.123", "properties.services.124", "properties.services.125", "properties.services.126", "properties.services.127", "properties.services.128", "properties.services.129", "properties.services.130", "properties.services.131", "properties.services.132", "properties.services.133", "properties.services.134", "properties.services.135", "properties.services.136"], + "colonnes": ["properties.services"], "termes": ["501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "511", "512", "513", "514", "515", "516", "517", "518", "519", "520", "521", "522", "523", "524", "525", "716", "720", "813", "803", "804", "805"], "cible": "Compréhension du monde numérique" }, { - "colonnes": ["properties.services.0", "properties.services.1", "properties.services.2", "properties.services.3", "properties.services.4", "properties.services.5", "properties.services.6", "properties.services.7", "properties.services.8", "properties.services.9", "properties.services.10", "properties.services.11", "properties.services.12", "properties.services.13", "properties.services.14", "properties.services.15", "properties.services.16", "properties.services.17", "properties.services.18", "properties.services.19", "properties.services.20", "properties.services.21", "properties.services.22", "properties.services.23", "properties.services.24", "properties.services.25", "properties.services.26", "properties.services.27", "properties.services.28", "properties.services.29", "properties.services.30", "properties.services.31", "properties.services.32", "properties.services.33", "properties.services.34", "properties.services.35", "properties.services.36", "properties.services.37", "properties.services.38", "properties.services.39", "properties.services.40", "properties.services.41", "properties.services.42", "properties.services.43", "properties.services.44", "properties.services.45", "properties.services.46", "properties.services.47", "properties.services.48", "properties.services.49", "properties.services.50", "properties.services.51", "properties.services.52", "properties.services.53", "properties.services.54", "properties.services.55", "properties.services.56", "properties.services.57", "properties.services.58", "properties.services.59", "properties.services.60", "properties.services.61", "properties.services.62", "properties.services.63", "properties.services.64", "properties.services.65", "properties.services.66", "properties.services.67", "properties.services.68", "properties.services.69", "properties.services.70", "properties.services.71", "properties.services.72", "properties.services.73", "properties.services.74", "properties.services.75", "properties.services.76", "properties.services.77", "properties.services.78", "properties.services.79", "properties.services.80", "properties.services.81", "properties.services.82", "properties.services.83", "properties.services.84", "properties.services.85", "properties.services.86", "properties.services.87", "properties.services.88", "properties.services.89", "properties.services.90", "properties.services.91", "properties.services.92", "properties.services.93", "properties.services.94", "properties.services.95", "properties.services.96", "properties.services.97", "properties.services.98", "properties.services.99", "properties.services.100", "properties.services.101", "properties.services.102", "properties.services.103", "properties.services.104", "properties.services.105", "properties.services.106", "properties.services.107", "properties.services.108", "properties.services.109", "properties.services.110", "properties.services.111", "properties.services.112", "properties.services.113", "properties.services.114", "properties.services.115", "properties.services.116", "properties.services.117", "properties.services.118", "properties.services.119", "properties.services.120", "properties.services.121", "properties.services.122", "properties.services.123", "properties.services.124", "properties.services.125", "properties.services.126", "properties.services.127", "properties.services.128", "properties.services.129", "properties.services.130", "properties.services.131", "properties.services.132", "properties.services.133", "properties.services.134", "properties.services.135", "properties.services.136"], + "colonnes": ["properties.services"], "termes": ["303", "304", "305"], "cible": "Accès internet et matériel informatique" } diff --git a/assets/input/les-landes/les-landes.config.json b/assets/input/les-landes/les-landes.config.json index e64f893b..8f533f82 100644 --- a/assets/input/les-landes/les-landes.config.json +++ b/assets/input/les-landes/les-landes.config.json @@ -27,21 +27,13 @@ } }, "latitude": { - "dissocier": { - "colonne": ["geometry"], - "séparateur": " ", - "partie": 1 - } + "colonne": "lat" }, "longitude": { - "dissocier": { - "colonne": ["geometry"], - "séparateur": " ", - "partie": 0 - } + "colonne": "lon" }, "date_maj": { - "colonne": [""] + "colonne": [] }, "telephone": { "colonne": "contact_telephone" diff --git a/assets/input/rhin-occ/rhin-occ.config.json b/assets/input/rhin-occ/rhin-occ.config.json index 406cd7cc..2100746a 100644 --- a/assets/input/rhin-occ/rhin-occ.config.json +++ b/assets/input/rhin-occ/rhin-occ.config.json @@ -49,282 +49,37 @@ }, "typologie": [ { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Association", "associatif"], "cible": "ASSO" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Centre social"], "cible": "CS" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["France Services"], "cible": "RFS" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["CAF"], "cible": "CAF" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Espace Public Numérique"], "cible": "EPN" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Tiers lieu"], "cible": "TIERS_LIEUX" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["FabLab"], "cible": "FABLAB" } @@ -349,42 +104,7 @@ ], "modalites_accompagnement": [ { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["avec un accompagnement"], "cible": "Accompagnement individuel" }, @@ -419,768 +139,103 @@ ], "publics_specifiquement_adresses": [ { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Jeunes (16-26 ans)"], "cible": "Jeunes" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Enfants (-16 ans)", "Famille"], "cible": "Familles et/ou enfants" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Séniors (+65 ans)"], "cible": "Seniors" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Uniquement femmes"], "cible": "Femmes" } ], "prise_en_charge_specifique": [ { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Surdité"], "cible": "Surdité" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Handicaps moteurs"], "cible": "Handicaps moteurs" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Handicaps psychiques"], "cible": "Handicaps mentaux" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Personnes en situation d'illettrisme"], "cible": "Illettrisme" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Public langues étrangères"], "cible": "Langues étrangères (autres)" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Déficience visuelle"], "cible": "Déficience visuelle" } ], "services": [ { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["démarches administratives", "Utiliser le numérique au quotidien", "Accompagner les démarches de santé"], "cible": "Aide aux démarches administratives" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Prendre en main un ordinateur", "Prendre en main un smartphone ou une tablette", "Initiation à la bureautique"], "cible": "Maîtrise des outils numériques du quotidien" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Créer et développer une entreprise", "Favoriser l'insertion professionnelle", "Formations numériques professionnalisantes", "Formation des professionnels"], "cible": "Insertion professionnelle via le numérique" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Soutenir la parentalité et l'éducation avec le numérique "], "cible": "Parentalité et éducation avec le numérique" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Créer avec le numérique", "fabrication numérique"], "cible": "Loisirs et créations numériques" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Approfondir la culture numérique", "Promouvoir la citoyenneté numérique "], "cible": "Compréhension du monde numérique" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["postes informatiques", "connexion internet"], "cible": "Accès internet et matériel informatique" }, { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["S'équiper en matériel informatique reconditionné"], "cible": "Acquisition de matériel informatique à prix solidaire" } ], "dispositif_programmes_nationaux": [ { - "colonnes": [ - "categories.0", - "categories.1", - "categories.2", - "categories.3", - "categories.4", - "categories.5", - "categories.6", - "categories.7", - "categories.8", - "categories.9", - "categories.10", - "categories.11", - "categories.12", - "categories.13", - "categories.14", - "categories.15", - "categories.16", - "categories.17", - "categories.18", - "categories.19", - "categories.20", - "categories.21", - "categories.22", - "categories.23", - "categories.24", - "categories.25", - "categories.26", - "categories.27", - "categories.28", - "categories.29", - "categories.31", - "categories.32", - "categories.33", - "categories.34" - ], + "colonnes": ["categories"], "termes": ["Point Relais CAF", "Point Numérique CAF"], "cible": "Point d'accès numérique CAF" } diff --git a/assets/input/sarthe/sarthe.config.json b/assets/input/sarthe/sarthe.config.json deleted file mode 100644 index eb43b9af..00000000 --- a/assets/input/sarthe/sarthe.config.json +++ /dev/null @@ -1,690 +0,0 @@ -{ - "id": { - "colonne": "id" - }, - "pivot": { - "colonne": "pivot" - }, - "nom": { - "colonne": "nom" - }, - "commune": { - "colonne": "commune" - }, - "code_postal": { - "colonne": "code_postal" - }, - "code_insee": { - "colonne": "code_insee" - }, - "adresse": { - "colonne": "adresse" - }, - "latitude": { - "colonne": "latitude" - }, - "longitude": { - "colonne": "longitude" - }, - "telephone": { - "colonne": "telephone" - }, - "courriels": { - "colonne": "courriel" - }, - "site_web": { - "colonne": "site_web" - }, - "date_maj": { - "colonne": "date_maj" - }, - "source": { - "colonne": "source" - }, - "prise_rdv": { - "colonne": "prise_rdv" - }, - "accessibilite": { - "colonne": "accessibilite" - }, - "presentation_resume": { - "colonne": "presentation_resume" - }, - "presentation_detail": { - "colonne": "presentation_detail" - }, - "dispositif_programmes_nationaux": [ - { - "colonnes": ["labels_nationaux"], - "termes": ["bibliotheques-numerique-de-reference"], - "cible": "Bibliothèques numérique de référence" - }, - { - "colonnes": ["labels_nationaux"], - "termes": ["certification-pix"], - "cible": "Certification PIX" - }, - { - "colonnes": ["labels_nationaux"], - "termes": ["emmaus-connect"], - "cible": "Emmaüs Connect" - }, - { - "colonnes": ["labels_nationaux"], - "termes": ["grandes-ecoles-du-numerique"], - "cible": "Grande école du numérique" - }, - { - "colonnes": ["labels_nationaux"], - "termes": ["la-croix-rouge"], - "cible": "La Croix Rouge" - } - ], - "autres_formations_labels": [ - { - "colonnes": ["labels_autres"] - } - ], - "frais_a_charge": [ - { - "colonnes": ["frais"], - "termes": ["gratuit"], - "cible": "Gratuit" - }, - { - "colonnes": ["frais"], - "termes": ["gratuit-sous-conditions"], - "cible": "Gratuit sous condition" - }, - { - "colonnes": ["frais"], - "termes": ["payant", "adhesion"], - "cible": "Payant" - } - ], - "modalites_accompagnement": [ - { - "colonnes": ["types"], - "termes": ["atelier"], - "cible": "Dans un atelier collectif" - }, - { - "colonnes": ["types"], - "termes": ["delegation", "accompagnement"], - "cible": "Accompagnement individuel" - }, - { - "colonnes": ["types"], - "termes": ["autonomie"], - "cible": "En autonomie" - } - ], - "publics_specifiquement_adresses": [ - { - "colonnes": ["profils"], - "termes": ["familles-enfants"], - "cible": "Familles et/ou enfants" - }, - { - "colonnes": ["profils"], - "termes": ["jeunes-16-26"], - "cible": "Jeunes" - }, - { - "colonnes": ["profils"], - "termes": ["seniors-65"], - "cible": "Seniors" - }, - { - "colonnes": ["profils"], - "termes": ["femmes"], - "cible": "Femmes" - } - ], - "prise_en_charge_specifique": [ - { - "colonnes": ["profils"], - "termes": ["surdite"], - "cible": "Surdité" - }, - { - "colonnes": ["profils"], - "termes": ["handicaps-mentaux", "handicaps-psychiques"], - "cible": "Handicaps mentaux" - }, - { - "colonnes": ["profils"], - "termes": ["personnes-en-situation-illettrisme"], - "cible": "Illettrisme" - }, - { - "colonnes": ["profils"], - "termes": ["public-langues-etrangeres"], - "cible": "Langues étrangères (anglais)" - }, - { - "colonnes": ["profils"], - "termes": ["public-langues-etrangeres"], - "cible": "Langues étrangères (autres)" - }, - { - "colonnes": ["profils"], - "termes": ["deficience-visuelle"], - "cible": "Déficience visuelle" - } - ], - "services": [ - { - "colonnes": ["thematiques"], - "termes": [ - "numerique--devenir-autonome-dans-les-demarches-administratives", - "numerique--realiser-des-demarches-administratives-avec-un-accompagnement", - "numerique--accompagner-les-demarches-de-sante" - ], - "cible": "Aide aux démarches administratives" - }, - { - "colonnes": ["thematiques"], - "termes": [ - "numerique--prendre-en-main-un-smartphone-ou-une-tablette", - "numerique--prendre-en-main-un-ordinateur", - "numerique--utiliser-le-numerique-au-quotidien" - ], - "cible": "Maîtrise des outils numériques du quotidien" - }, - { - "colonnes": ["thematiques"], - "termes": [ - "numerique--approfondir-ma-culture-numerique", - "numerique--promouvoir-la-citoyennete-numerique" - ], - "cible": "Compréhension du monde numérique" - }, - { - "colonnes": ["thematiques"], - "termes": ["numerique--approfondir-ma-culture-numerique"], - "cible": "Utilisation sécurisée du numérique" - }, - { - "colonnes": ["thematiques"], - "termes": [ - "numerique--favoriser-mon-insertion-professionnelle", - "numerique--creer-et-developper-mon-entreprise" - ], - "cible": "Insertion professionnelle via le numérique" - }, - { - "colonnes": ["thematiques"], - "termes": [ - "numerique--acceder-a-une-connexion-internet", - "numerique--acceder-a-du-materiel" - ], - "cible": "Accès internet et matériel informatique" - }, - { - "colonnes": ["thematiques"], - "termes": ["numerique--s-equiper-en-materiel-informatique"], - "cible": "Acquisition de matériel informatique à prix solidaire" - }, - { - "colonnes": ["thematiques"], - "termes": ["numerique--creer-avec-le-numerique"], - "cible": "Loisirs et créations numériques" - }, - { - "colonnes": ["thematiques"], - "termes": ["numerique--soutenir-la-parentalite-et-l-education-avec-le-numerique"], - "cible": "Parentalité et éducation avec le numérique" - } - ], - "horaires": { - "osm": "horaires" - }, - "typologie": [ - { - "colonnes": ["typologie"], - "termes": ["ACI"], - "cible": "ACI" - }, - { - "colonnes": ["typologie"], - "termes": ["ACIPHC"], - "cible": "ACIPHC" - }, - { - "colonnes": ["typologie"], - "termes": ["AFPA"], - "cible": "AFPA" - }, - { - "colonnes": ["typologie"], - "termes": ["AI"], - "cible": "AI" - }, - { - "colonnes": ["typologie"], - "termes": ["ASE"], - "cible": "ASE" - }, - { - "colonnes": ["typologie"], - "termes": ["ASSO"], - "cible": "ASSO" - }, - { - "colonnes": ["typologie"], - "termes": ["ASSO_CHOMEUR"], - "cible": "ASSO_CHOMEUR" - }, - { - "colonnes": ["typologie"], - "termes": ["Autre"], - "cible": "Autre" - }, - { - "colonnes": ["typologie"], - "termes": ["AVIP"], - "cible": "AVIP" - }, - { - "colonnes": ["typologie"], - "termes": ["BIB"], - "cible": "BIB" - }, - { - "colonnes": ["typologie"], - "termes": ["CAARUD"], - "cible": "CAARUD" - }, - { - "colonnes": ["typologie"], - "termes": ["CADA"], - "cible": "CADA" - }, - { - "colonnes": ["typologie"], - "termes": ["CAF"], - "cible": "CAF" - }, - { - "colonnes": ["typologie"], - "termes": ["CAP_EMPLOI"], - "cible": "CAP_EMPLOI" - }, - { - "colonnes": ["typologie"], - "termes": ["CAVA"], - "cible": "CAVA" - }, - { - "colonnes": ["typologie"], - "termes": ["CC"], - "cible": "CC" - }, - { - "colonnes": ["typologie"], - "termes": ["CCAS"], - "cible": "CCAS" - }, - { - "colonnes": ["typologie"], - "termes": ["CCONS"], - "cible": "CCONS" - }, - { - "colonnes": ["typologie"], - "termes": ["CD"], - "cible": "CD" - }, - { - "colonnes": ["typologie"], - "termes": ["CDAS"], - "cible": "CDAS" - }, - { - "colonnes": ["typologie"], - "termes": ["CFP"], - "cible": "CFP" - }, - { - "colonnes": ["typologie"], - "termes": ["CHRS"], - "cible": "CHRS" - }, - { - "colonnes": ["typologie"], - "termes": ["CHU"], - "cible": "CHU" - }, - { - "colonnes": ["typologie"], - "termes": ["CIAS"], - "cible": "CIAS" - }, - { - "colonnes": ["typologie"], - "termes": ["CIDFF"], - "cible": "CIDFF" - }, - { - "colonnes": ["typologie"], - "termes": ["CITMET"], - "cible": "CITMET" - }, - { - "colonnes": ["typologie"], - "termes": ["CMP"], - "cible": "CMP" - }, - { - "colonnes": ["typologie"], - "termes": ["CMS"], - "cible": "CMS" - }, - { - "colonnes": ["typologie"], - "termes": ["CPAM"], - "cible": "CPAM" - }, - { - "colonnes": ["typologie"], - "termes": ["CPH"], - "cible": "CPH" - }, - { - "colonnes": ["typologie"], - "termes": ["CS"], - "cible": "CS" - }, - { - "colonnes": ["typologie"], - "termes": ["CSAPA"], - "cible": "CSAPA" - }, - { - "colonnes": ["typologie"], - "termes": ["CSC"], - "cible": "CSC" - }, - { - "colonnes": ["typologie"], - "termes": ["DEETS"], - "cible": "DEETS" - }, - { - "colonnes": ["typologie"], - "termes": ["DEPT"], - "cible": "DEPT" - }, - { - "colonnes": ["typologie"], - "termes": ["DIPLP"], - "cible": "DIPLP" - }, - { - "colonnes": ["typologie"], - "termes": ["E2C"], - "cible": "E2C" - }, - { - "colonnes": ["typologie"], - "termes": ["EA"], - "cible": "EA" - }, - { - "colonnes": ["typologie"], - "termes": ["EATT"], - "cible": "EATT" - }, - { - "colonnes": ["typologie"], - "termes": ["EI"], - "cible": "EI" - }, - { - "colonnes": ["typologie"], - "termes": ["EITI"], - "cible": "EITI" - }, - { - "colonnes": ["typologie"], - "termes": ["ENM"], - "cible": "ENM" - }, - { - "colonnes": ["typologie"], - "termes": ["EPCI"], - "cible": "EPCI" - }, - { - "colonnes": ["typologie"], - "termes": ["EPI"], - "cible": "EPI" - }, - { - "colonnes": ["typologie"], - "termes": ["EPIDE"], - "cible": "EPIDE" - }, - { - "colonnes": ["typologie"], - "termes": ["EPN"], - "cible": "EPN" - }, - { - "colonnes": ["typologie"], - "termes": ["ES"], - "cible": "ES" - }, - { - "colonnes": ["typologie"], - "termes": ["ESS"], - "cible": "ESS" - }, - { - "colonnes": ["typologie"], - "termes": ["ETTI"], - "cible": "ETTI" - }, - { - "colonnes": ["typologie"], - "termes": ["EVS"], - "cible": "EVS" - }, - { - "colonnes": ["typologie"], - "termes": ["FABLAB"], - "cible": "FABLAB" - }, - { - "colonnes": ["typologie"], - "termes": ["FAIS"], - "cible": "FAIS" - }, - { - "colonnes": ["typologie"], - "termes": ["FT"], - "cible": "FT" - }, - { - "colonnes": ["typologie"], - "termes": ["GEIQ"], - "cible": "GEIQ" - }, - { - "colonnes": ["typologie"], - "termes": ["HUDA"], - "cible": "HUDA" - }, - { - "colonnes": ["typologie"], - "termes": ["LA_POSTE"], - "cible": "LA_POSTE" - }, - { - "colonnes": ["typologie"], - "termes": ["MDE"], - "cible": "MDE" - }, - { - "colonnes": ["typologie"], - "termes": ["MDEF"], - "cible": "MDEF" - }, - { - "colonnes": ["typologie"], - "termes": ["MDPH"], - "cible": "MDPH" - }, - { - "colonnes": ["typologie"], - "termes": ["MDS"], - "cible": "MDS" - }, - { - "colonnes": ["typologie"], - "termes": ["MJC"], - "cible": "MJC" - }, - { - "colonnes": ["typologie"], - "termes": ["ML"], - "cible": "ML" - }, - { - "colonnes": ["typologie"], - "termes": ["MQ"], - "cible": "MQ" - }, - { - "colonnes": ["typologie"], - "termes": ["MSA"], - "cible": "MSA" - }, - { - "colonnes": ["typologie"], - "termes": ["MSAP"], - "cible": "MSAP" - }, - { - "colonnes": ["typologie"], - "termes": ["MUNI"], - "cible": "MUNI" - }, - { - "colonnes": ["typologie"], - "termes": ["OACAS"], - "cible": "OACAS" - }, - { - "colonnes": ["typologie"], - "termes": ["ODC"], - "cible": "ODC" - }, - { - "colonnes": ["typologie"], - "termes": ["OF"], - "cible": "OF" - }, - { - "colonnes": ["typologie"], - "termes": ["OIL"], - "cible": "OIL" - }, - { - "colonnes": ["typologie"], - "termes": ["OPCS"], - "cible": "OPCS" - }, - { - "colonnes": ["typologie"], - "termes": ["PAD"], - "cible": "PAD" - }, - { - "colonnes": ["typologie"], - "termes": ["PE"], - "cible": "FT" - }, - { - "colonnes": ["typologie"], - "termes": ["PENSION"], - "cible": "PENSION" - }, - { - "colonnes": ["typologie"], - "termes": ["PI"], - "cible": "PI" - }, - { - "colonnes": ["typologie"], - "termes": ["PIJ_BIJ"], - "cible": "PIJ_BIJ" - }, - { - "colonnes": ["typologie"], - "termes": ["PIMMS"], - "cible": "PIMMS" - }, - { - "colonnes": ["typologie"], - "termes": ["PJJ"], - "cible": "PJJ" - }, - { - "colonnes": ["typologie"], - "termes": ["PLIE"], - "cible": "PLIE" - }, - { - "colonnes": ["typologie"], - "termes": ["PREF"], - "cible": "PREF" - }, - { - "colonnes": ["typologie"], - "termes": ["PREVENTION"], - "cible": "PREVENTION" - }, - { - "colonnes": ["typologie"], - "termes": ["REG"], - "cible": "REG" - }, - { - "colonnes": ["typologie"], - "termes": ["RESSOURCERIE"], - "cible": "RESSOURCERIE" - }, - { - "colonnes": ["typologie"], - "termes": ["RFS"], - "cible": "RFS" - }, - { - "colonnes": ["typologie"], - "termes": ["RS_FJT"], - "cible": "RS_FJT" - }, - { - "colonnes": ["typologie"], - "termes": ["SCP"], - "cible": "SCP" - }, - { - "colonnes": ["typologie"], - "termes": ["SPIP"], - "cible": "SPIP" - }, - { - "colonnes": ["typologie"], - "termes": ["TIERS_LIEUX"], - "cible": "TIERS_LIEUX" - }, - { - "colonnes": ["typologie"], - "termes": ["UDAF"], - "cible": "UDAF" - } - ] -} diff --git a/.tooling/.commitlint/commitlint.config.cjs b/commitlint.config.js similarity index 99% rename from .tooling/.commitlint/commitlint.config.cjs rename to commitlint.config.js index 0a3084c2..b4645002 100644 --- a/.tooling/.commitlint/commitlint.config.cjs +++ b/commitlint.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { parserPreset: 'conventional-changelog-conventionalcommits', rules: { 'body-leading-blank': [1, 'always'], diff --git a/package.json b/package.json index f02127eb..bca65c24 100644 --- a/package.json +++ b/package.json @@ -34,17 +34,17 @@ }, "main": "dist/index.js", "bin": "./bin/mednum", + "type": "module", "scripts": { - "lint.all": "eslint ./src/", - "lint.commit": "npx commitlint --from origin/main --config ./.tooling/.commitlint/commitlint.config.cjs", - "lint.staged": "lint-staged --config=./.tooling/.lintstaged/.lintstagedrc", + "lint.es": "eslint ./src/", + "lint.commit": "npx commitlint --from origin/main", + "lint.staged": "lint-staged", "prettier": "prettier --write .", - "prettier.check": "prettier --check .", - "test": "jest --config=./.tooling/.jest/jest.config.ts", + "prettier.ci": "prettier --check .", + "test": "vitest", "build": "tsc --project .tsconfig/tsconfig.json && cp -r ./src/data ./dist/", "start.data-inclusion": "tsx src/index.ts data-inclusion", "mednum": "tsx src/index.ts", - "fetch.france-tiers-lieux": "curl --request POST --url https://cartographie.francetierslieux.fr/co2/search/globalautocomplete --header 'Content-Type: application/x-www-form-urlencoded' --data 'searchType[]=organizations' --data indexStep= --data costumSlug=franceTierslieux > assets/input/france-tiers-lieux/france-tiers-lieux.json", "transformer.aidants-connect": "tsx src/index.ts transformer -n \"Aidants Connect\" -t \"National\" -s \"https://aidantsconnect.beta.gouv.fr/api/organisations/?format=json@results\" -c \"./assets/input/aidants-connect/aidants-connect.config.json\" -o \"./assets/output/aidants-connect\"", "transformer.aix-en-provence": "tsx src/index.ts transformer -n \"Mairie Aix en Provence\" -t \"Bouches-du-Rhône\" -s \"./assets/input/aix-en-provence/aix-en-provence.json\" -c \"./assets/input/aix-en-provence/aix-en-provence.config.json\" -o \"./assets/output/aix-en-provence\"", "transformer.angers": "tsx src/index.ts transformer -n \"Angers\" -t \"Maine-et-Loire\" -s \"./assets/input/angers/angers.json\" -c \"./assets/input/angers/angers.config.json\" -o \"./assets/output/angers\"", @@ -53,13 +53,12 @@ "transformer.conseiller-numerique": "tsx src/index.ts transformer -n \"Conseiller Numerique\" -t \"National\" -s \"https://api.conseiller-numerique.gouv.fr/permanences\" -c \"./assets/input/conseiller-numerique/conseiller-numerique.config.json\" -o \"./assets/output/conseiller-numerique\"", "transformer.coop-numerique": "tsx src/index.ts transformer -n \"Coop numérique\" -t \"National\" -s \"https://coop-numerique.anct.gouv.fr/api/lieux-mediation-numerique\" -c \"./assets/input/coop-numerique/coop-numerique.config.json\" -o \"./assets/output/coop-numerique\"", "transformer.corse": "tsx src/index.ts transformer -n \"Corse\" -t \"Corse\" -s \"./assets/input/corse/corse.json\" -c \"./assets/input/corse/corse.config.json\" -o \"./assets/output/corse\"", - "transformer.dora": "yarn start.data-inclusion -o \"./assets/input/dora/dora.json\" -f \"dora\" && tsx src/index.ts transformer -n \"dora\" -t \"France\" -s \"./assets/input/dora/dora.json\" -c \"./assets/input/dora/dora.config.json\" -o \"./assets/output/dora\"", + "transformer.dora": "yarn start.data-inclusion -o \"./assets/input/dora/dora.json\" -f \"dora\" && tsx src/index.ts transformer -n \"dora\" -t \"National\" -s \"./assets/input/dora/dora.json\" -c \"./assets/input/dora/dora.config.json\" -o \"./assets/output/dora\"", "transformer.epernay": "tsx src/index.ts transformer -n \"Epernay\" -t \"Marne\" -s \"./assets/input/epernay/epernay.json\" -c \"./assets/input/epernay/epernay.config.json\" -o \"./assets/output/epernay\"", "transformer.etapes-numerique": "tsx src/index.ts transformer -n \"Etapes Numerique\" -t \"National\" -s \"./assets/input/etapes-numerique/etapes-numerique.json\" -c \"./assets/input/etapes-numerique/etapes-numerique.config.json\" -o \"./assets/output/etapes-numerique\"", "transformer.fibre-64": "tsx src/index.ts transformer -n \"Fibre 64\" -t \"Pyrenees-Atlantique\" -s \"./assets/input/fibre-64/fibre-64.json\" -c \"./assets/input/fibre-64/fibre-64.config.json\" -o \"./assets/output/fibre-64\"", "transformer.france-services": "tsx src/index.ts transformer -n \"France Services\" -t \"National\" -s \"https://www.data.gouv.fr/fr/datasets/r/afc3f97f-0ef5-429b-bf16-7b7876d27cd4\" -c \"./assets/input/france-services/france-services.config.json\" -o \"./assets/output/france-services\"", "transformer.francil-in": "tsx src/index.ts transformer -n \"Francil-in\" -t \"Île-de-France\" -s \"https://data-francilin.netlify.app/structures.geojson@features\" -c \"./assets/input/francil-in/francil-in.config.json\" -o \"./assets/output/francil-in\"", - "transformer.france-tiers-lieux": "yarn fetch.france-tiers-lieux && tsx src/index.ts transformer -n \"France tiers-lieux\" -t \"National\" -s \"./assets/input/france-tiers-lieux/france-tiers-lieux.json@results\" -c \"./assets/input/france-tiers-lieux/france-tiers-lieux.config.json\" -o \"./assets/output/france-tiers-lieux\"", "transformer.gironde": "tsx src/index.ts transformer -n \"Gironde\" -t\"Nouvelle-Aquitaine\" -s \"./assets/input/gironde/gironde.json\" -c \"./assets/input/gironde/gironde.config.json\" -o \"./assets/output/gironde\"", "transformer.grand-paris-sud": "tsx src/index.ts transformer -n \"Grand Paris Sud\" -t\"Île-de-France\" -s \"https://data.grandparissud.fr/api/explore/v2.1/catalog/datasets/datainclusion-description-des-structures-gps/records?limit=100@results\" -c \"./assets/input/grand-paris-sud/grand-paris-sud.config.json\" -o \"./assets/output/grand-paris-sud\"", "transformer.haute-vienne": "tsx src/index.ts transformer -n \"Haute-Vienne\" -t \"Nouvelle-Aquitaine\" -s \"https://sig.limoges-metropole.fr/servernf1/rest/services/_SOCIAL/actnum_consult/FeatureServer/0/query?f=geojson&where=(service%20IS%20NOT%20NULL)&outFields=*&@features\" -c \"./assets/input/haute-vienne/haute-vienne.config.json\" -o \"./assets/output/haute-vienne\"", @@ -73,12 +72,11 @@ "transformer.vendee": "tsx src/index.ts transformer -n \"Vendée\" -t \"Vendée\" -s \"https://www.data.gouv.fr/fr/datasets/r/d2877549-0ac9-4c1d-96bf-ede948e980fb\" -c \"./assets/input/vendee/vendee.config.json\" -o \"./assets/output/vendee\" -d \"\t\"", "transformer.la-creuse": "tsx src/index.ts transformer -n \"La Creuse\" -t \"Nouvelle-Aquitaine\" -s \"./assets/input/la-creuse/la-creuse.json\" -c \"./assets/input/la-creuse/la-creuse.config.json\" -o \"./assets/output/la-creuse\"", "transformer.le-havre": "tsx src/index.ts transformer -n \"Le Havre\" -t \"Le Havre\" -s \"https://www.data.gouv.fr/fr/datasets/r/ca69354c-f4f0-48f4-864e-d5a1c7e835ad\" -c \"./assets/input/le-havre/le-havre.config.json\" -o \"./assets/output/le-havre\" -d \";\"", - "transformer.les-landes": "tsx src/index.ts transformer -n \"Les Landes\" -t \"Nouvelle-Aquitaine\" -s \"https://www.pigma.org/geoserver/alpi/ows?SERVICE=WFS&VERSION=2.0.0&request=GetFeature&typename=alpi:lieux_mediation_num-1&outputFormat=csv&SRSNAME=EPSG:4326&sortBy=gid\" -c \"./assets/input/les-landes/les-landes.config.json\" -o \"./assets/output/les-landes\"", + "transformer.les-landes": "tsx src/index.ts transformer -n \"Les Landes\" -t \"Nouvelle-Aquitaine\" -s \"https://www.pigma.org/fr/datapusher/ws/default/usergroup6.a9d11fa0-12e5-4161-9a0d-3a1c21da3bf0/all.json@values\" -c \"./assets/input/les-landes/les-landes.config.json\" -o \"./assets/output/les-landes\"", "transformer.paca": "tsx src/index.ts transformer -n \"Paca\" -t \"Provence-Alpes-Côte d'Azur\" -s \"https://www.data.gouv.fr/fr/datasets/r/5250e9c9-8abe-4a4e-8ebc-cb4e8fe72b71\" -c \"./assets/input/paca/paca.config.json\" -o \"./assets/output/paca\" -d \";\"", "transformer.loire-atlantique": "tsx src/index.ts transformer -n \"Loire Atlantique\" -t \"Loire-Atlantique\" -s \"https://www.data.gouv.fr/fr/datasets/r/95824460-e707-4db1-a67b-46b4e540d8ac\" -c \"./assets/input/loire-atlantique/loire-atlantique.config.json\" -o \"./assets/output/loire-atlantique\"", "transformer.rhin-occ": "tsx src/index.ts transformer -n \"RhinOcc\" -t \"Occitanie\" -s \"https://rhinoccc.gogocarto.fr/api/elements.json?categories=&excludeExternal=true?@data\" -c \"./assets/input/rhin-occ/rhin-occ.config.json\" -o \"./assets/output/rhin-occ\"", "transformer.res-in": "tsx src/index.ts transformer -n \"Res-in\" -t \"Lyon\" -s \"https://resin.grandlyon.com/api/structures\" -c \"./assets/input/res-in/res-in.config.json\" -o \"./assets/output/res-in\"", - "transformer.sarthe": "yarn start.data-inclusion -o \"./assets/input/sarthe/sarthe.json\" -f \"cd72\" && tsx src/index.ts transformer -n \"La Sarthe\" -t \"Pays de la Loire\" -s \"./assets/input/sarthe/sarthe.json\" -c \"./assets/input/sarthe/sarthe.config.json\" -o \"./assets/output/sarthe\"", "transformer.siilab": "tsx src/index.ts transformer -n \"Siilab\" -t \"Hauts-de-France\" -s \"https://cdonline.articque.com/download/434922/SIILAB_HDF_standard_med_num.csv\" -c \"./assets/input/siilab/siilab.config.json\" -o \"./assets/output/siilab\" -d \";\"", "transformer.ultra-num": "tsx src/index.ts transformer -n \"Ultra-numerique\" -t \"La Reunion\" -s \"./assets/input/ultra-num/ultra-num.json\" -c \"./assets/input/ultra-num/ultra-num.config.json\" -o \"./assets/output/ultra-num\"", "extract.all": "tsx src/index.ts extract -n \"Data Inclusion\" -o ./assets/output-extraction/data-inclusion -t National -c false", @@ -109,7 +107,6 @@ "publier.fibre-64": "tsx src/index.ts publier -z \"fr:departement:64\" -m \"./assets/output/fibre-64/publier.json\"", "publier.france-services": "tsx src/index.ts publier -z \"country:fr\" -m \"./assets/output/france-services/publier.json\"", "publier.francil-in": "tsx src/index.ts publier -z \"fr:region:11\" -m \"./assets/output/francil-in/publier.json\"", - "publier.france-tiers-lieux": "tsx src/index.ts publier -z \"country:fr\" -m \"./assets/output/france-tiers-lieux/publier.json\"", "publier.gironde": "tsx src/index.ts publier -z \"fr:departement:33\" -m \"./assets/output/gironde/publier.json\"", "publier.grand-paris-sud": "tsx src/index.ts publier -z \"fr:region:11\" -m \"./assets/output/grand-paris-sud/publier.json\"", "publier.haute-vienne": "tsx src/index.ts publier -z \"fr:departement:87\" -m \"./assets/output/haute-vienne/publier.json\"", @@ -128,75 +125,73 @@ "publier.loire-atlantique": "tsx src/index.ts publier -z \"fr:departement:44\" -m \"./assets/output/loire-atlantique/publier.json\"", "publier.rhin-occ": "tsx src/index.ts publier -z \"fr:region:76\" -m \"./assets/output/rhin-occ/publier.json\"", "publier.res-in": "tsx src/index.ts publier -z \"fr:commune:69123\" -m \"./assets/output/res-in/publier.json\"", - "publier.sarthe": "tsx src/index.ts publier -z \"fr:departement:72\" -m \"./assets/output/sarthe/publier.json\"", "publier.siilab": "tsx src/index.ts publier -z \"fr:region:32\" -m \"./assets/output/siilab/publier.json\"", "publier.ultra-num": "tsx src/index.ts publier -z \"fr:region:04\" -m \"./assets/output/ultra-num/publier.json\"", - "dedupliquer.all": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false\" -n \"Cartographie nationale des lieux d'inclusion numérique\" -t National -o ./assets/output/cartographie-nationale", - "dedupliquer.aidants-connect": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Aidants Connect\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Aidants Connect\" -n \"Aidants Connect\" -t \"National\" -o \"./assets/output/aidants-connect\" -i true", - "dedupliquer.aix-en-provence": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Mairie-Aix-en-Provence\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Mairie-Aix-en-Provence\" -n \"Mairie Aix en Provence\" -t \"Bouches-du-Rhône\" -o \"./assets/output/aix-en-provence\" -i true", - "dedupliquer.angers": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Angers\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Angers\" -n \"Angers\" -t \"Maine-et-Loire\" -o \"./assets/output/angers\" -i true", - "dedupliquer.bus-france-services-charente": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Bus France Services en Charente\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Bus France Services en Charente\" -n \"Bus France Services en Charente\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/bus-france-services-charente\" -i true", - "dedupliquer.charente-maritime": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Département de la Charente-Maritime\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Département de la Charente-Maritime\" -n \"Département de la Charente-Maritime\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/charente-maritime\" -i true", - "dedupliquer.conseiller-numerique": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Conseiller Numerique\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Conseiller Numerique\" -n \"Conseiller Numerique\" -t \"National\" -o \"./assets/output/conseiller-numerique\" -i true", - "dedupliquer.coop-numerique": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Coop numérique\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Coop numérique\" -n \"Coop numérique\" -t \"National\" -o \"./assets/output/coop-numerique\" -i true", - "dedupliquer.corse": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Corse\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Corse\" -n \"Corse\" -t \"Corse\" -o \"./assets/output/corse\" -i true", - "dedupliquer.dora": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=dora\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=dora\" -n \"dora\" -t \"National\" -o \"./assets/output/dora\" -i true", - "dedupliquer.epernay": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Epernay\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Epernay\" -n \"Epernay\" -t \"Marne\" -o \"./assets/output/epernay\" -i true", - "dedupliquer.etapes-numerique": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Etapes Numerique\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Etapes Numerique\" -n \"Etapes Numerique\" -t \"National\" -o \"./assets/output/etapes-numerique\" -i true", - "dedupliquer.fibre-64": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Fibre 64\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Fibre 64\" -n \"Fibre 64\" -t \"Pyrenees-Atlantique\" -o \"./assets/output/fibre-64\" -i true", - "dedupliquer.france-services": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=France Services\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=France Services\" -n \"France Services\" -t \"National\" -o \"./assets/output/france-services\" -i true", - "dedupliquer.francil-in": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Francil-in\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Francil-in\" -n \"Francil-in\" -t \"Île-de-France\" -o \"./assets/output/francil-in\" -i true", - "dedupliquer.france-tiers-lieux": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=France tiers-lieux\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=France tiers-lieux\" -n \"France tiers-lieux\" -t \"National\" -o \"./assets/output/france-tiers-lieux\" -i true", - "dedupliquer.gironde": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Gironde\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Gironde\" -n \"Gironde\" -t\"Nouvelle-Aquitaine\" -o \"./assets/output/gironde\" -i true", - "dedupliquer.grand-paris-sud": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Grand Paris Sud\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Grand Paris Sud\" -n \"Grand Paris Sud\" -t\"Île-de-France\" -o \"./assets/output/grand-paris-sud\" -i true", - "dedupliquer.haute-vienne": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Haute-Vienne\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Haute-Vienne\" -n \"Haute-Vienne\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/haute-vienne\" -i true", - "dedupliquer.hinaura": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Hinaura\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Hinaura\" -n \"Hinaura\" -t \"Auvergne-Rhône-Alpes\" -o \"./assets/output/hinaura\" -i true", - "dedupliquer.hub-bretagne": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Hub Bretagne\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Hub Bretagne\" -n \"Hub Bretagne\" -t \"Bretagne\" -o \"./assets/output/hub-bretagne\" -i true", - "dedupliquer.hub-lo": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Hub-lo\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Hub-lo\" -n \"Hub-lo\" -t \"Centre-Val-de-Loire\" -o \"./assets/output/hub-lo\" -i true", - "dedupliquer.maine-et-loire": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Département du Maine-et-Loire\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Département du Maine-et-Loire\" -n \"Département du Maine-et-Loire\" -t \"Maine-et-Loire\" -o \"./assets/output/maine-et-loire\" -i true", - "dedupliquer.mednum-bfc": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Mednum BFC\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Mednum BFC\" -n \"Mednum BFC\" -t \"Bourgogne-Franche-Comté\" -o \"./assets/output/mednum-bfc\" -i true", - "dedupliquer.mulhouse": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Mulhouse\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Mulhouse\" -n \"Mulhouse\" -t \"Haut-Rhin\" -o \"./assets/output/mulhouse\" -i true", - "dedupliquer.nouvelle-caledonie": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Nouvelle-Calédonie\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Nouvelle-Calédonie\" -n \"Nouvelle-Calédonie\" -t \"Nouvelle-Calédonie\" -o \"./assets/output/nouvelle-caledonie\" -i true", - "dedupliquer.vendee": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Vendée\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Vendée\" -n \"Vendée\" -t \"Vendée\" -o \"./assets/output/vendee\" -i true", - "dedupliquer.la-creuse": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=La Creuse\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=La Creuse\" -n \"La Creuse\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/la-creuse\" -i true", - "dedupliquer.le-havre": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Le Havre\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Le Havre\" -n \"Le Havre\" -t \"Le Havre\" -o \"./assets/output/le-havre\" -i true", - "dedupliquer.les-landes": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Les Landes\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Les Landes\" -n \"Les Landes\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/les-landes\" -i true", - "dedupliquer.paca": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Paca\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Paca\" -n \"Paca\" -t \"Provence-Alpes-Côte d'Azur\" -o \"./assets/output/paca\" -i true", - "dedupliquer.loire-atlantique": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Loire Atlantique\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Loire Atlantique\" -n \"Loire Atlantique\" -t \"Loire-Atlantique\" -o \"./assets/output/loire-atlantique\" -i true", - "dedupliquer.rhin-occ": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=RhinOcc\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=RhinOcc\" -n \"RhinOcc\" -t \"Occitanie\" -o \"./assets/output/rhin-occ\" -i true", - "dedupliquer.res-in": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Res-in\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Res-in\" -n \"Res-in\" -t \"Lyon\" -o \"./assets/output/res-in\" -i true", - "dedupliquer.sarthe": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=La Sarthe\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=La Sarthe\" -n \"La Sarthe\" -t \"Pays de la Loire\" -o \"./assets/output/sarthe\" -i true", - "dedupliquer.siilab": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Siilab\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Siilab\" -n \"Siilab\" -t \"Hauts-de-France\" -o \"./assets/output/siilab\" -i true", - "dedupliquer.ultra-num": "tsx src/index.ts dedupliquer -s \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?deduplicated[exists]=false&source[eq]=Ultra-numerique\" -b \"https://cartographie.societenumerique.gouv.fr/api/v0/lieux-inclusion-numerique/with-duplicates?mergedIds[exists]=false&source[eq]=Ultra-numerique\" -n \"Ultra-numerique\" -t \"La Reunion\" -o \"./assets/output/ultra-num\" -i true", + "dedupliquer.aidants-connect": "tsx src/index.ts dedupliquer -s \"./assets/output/aidants-connect/*-aidants-connect-lieux-de-mediation-numeriques-national.json\" -b \"./assets/output/aidants-connect/*-aidants-connect-lieux-de-mediation-numeriques-national.json\" -n \"Aidants Connect\" -t \"National\" -o \"./assets/output/aidants-connect\" -i true", + "dedupliquer.aix-en-provence": "tsx src/index.ts dedupliquer -s \"./assets/output/aix-en-provence/*-mairie-aix-en-provence-lieux-de-mediation-numeriques-bouches-du-rhone.json\" -b \"./assets/output/aix-en-provence/*-mairie-aix-en-provence-lieux-de-mediation-numeriques-bouches-du-rhone.json\" -n \"Mairie Aix en Provence\" -t \"Bouches-du-Rhône\" -o \"./assets/output/aix-en-provence\" -i true", + "dedupliquer.angers": "tsx src/index.ts dedupliquer -s \"./assets/output/angers/*-angers-lieux-de-mediation-numeriques-maine-et-loire.csv\" -b \"./assets/output/angers/*-angers-lieux-de-mediation-numeriques-maine-et-loire.csv\" -n \"Angers\" -t \"Maine-et-Loire\" -o \"./assets/output/angers\" -i true", + "dedupliquer.bus-france-services-charente": "tsx src/index.ts dedupliquer -s \"./assets/output/bus-france-services-charente/*-bus-france-services-en-charente-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -b \"./assets/output/bus-france-services-charente/*-bus-france-services-en-charente-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -n \"Bus France Services en Charente\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/bus-france-services-charente\" -i true", + "dedupliquer.charente-maritime": "tsx src/index.ts dedupliquer -s \"./assets/output/charente-maritime/*-departement-de-la-charente-maritime-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -b \"./assets/output/charente-maritime/*-departement-de-la-charente-maritime-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -n \"Département de la Charente-Maritime\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/charente-maritime\" -i true", + "dedupliquer.conseiller-numerique": "tsx src/index.ts dedupliquer -s \"./assets/output/conseiller-numerique/*-conseiller-numerique-lieux-de-mediation-numeriques-national.json\" -b \"./assets/output/conseiller-numerique/*-conseiller-numerique-lieux-de-mediation-numeriques-national.json\" -n \"Conseiller Numerique\" -t \"National\" -o \"./assets/output/conseiller-numerique\" -i true", + "dedupliquer.coop-numerique": "tsx src/index.ts dedupliquer -s \"./assets/output/coop-numerique/*-coop-numerique-lieux-de-mediation-numeriques-national.json\" -b \"./assets/output/coop-numerique/*-coop-numerique-lieux-de-mediation-numeriques-national.json\" -n \"Coop numérique\" -t \"National\" -o \"./assets/output/coop-numerique\" -i true", + "dedupliquer.corse": "tsx src/index.ts dedupliquer -s \"./assets/output/corse/*-corse-lieux-de-mediation-numeriques-corse.json\" -b \"./assets/output/corse/*-corse-lieux-de-mediation-numeriques-corse.json\" -n \"Corse\" -t \"Corse\" -o \"./assets/output/corse\" -i true", + "dedupliquer.dora": "tsx src/index.ts dedupliquer -s \"./assets/output/dora/*-dora-lieux-de-mediation-numeriques-national.json\" -b \"./assets/output/dora/*-dora-lieux-de-mediation-numeriques-national.json\" -n \"dora\" -t \"National\" -o \"./assets/output/dora\" -i true", + "dedupliquer.epernay": "tsx src/index.ts dedupliquer -s \"./assets/output/epernay/*-epernay-lieux-de-mediation-numeriques-marne.json\" -b \"./assets/output/epernay/*-epernay-lieux-de-mediation-numeriques-marne.json\" -n \"Epernay\" -t \"Marne\" -o \"./assets/output/epernay\" -i true", + "dedupliquer.etapes-numerique": "tsx src/index.ts dedupliquer -s \"./assets/output/etapes-numerique/*-etapes-numerique-lieux-de-mediation-numeriques-national.json\" -b \"./assets/output/etapes-numerique/*-etapes-numerique-lieux-de-mediation-numeriques-national.json\" -n \"Etapes Numerique\" -t \"National\" -o \"./assets/output/etapes-numerique\" -i true", + "dedupliquer.fibre-64": "tsx src/index.ts dedupliquer -s \"./assets/output/fibre-64/*-fibre-64-lieux-de-mediation-numeriques-pyrenees-atlantique.json\" -b \"./assets/output/fibre-64/*-fibre-64-lieux-de-mediation-numeriques-pyrenees-atlantique.json\" -n \"Fibre 64\" -t \"Pyrenees-Atlantique\" -o \"./assets/output/fibre-64\" -i true", + "dedupliquer.france-services": "tsx src/index.ts dedupliquer -s \"./assets/output/france-services/*-france-services-lieux-de-mediation-numeriques-national.json\" -b \"./assets/output/france-services/*-france-services-lieux-de-mediation-numeriques-national.json\" -n \"France Services\" -t \"National\" -o \"./assets/output/france-services\" -i true", + "dedupliquer.francil-in": "tsx src/index.ts dedupliquer -s \"./assets/output/francil-in/*-francil-in-lieux-de-mediation-numeriques-ile-de-france.json\" -b \"./assets/output/francil-in/*-francil-in-lieux-de-mediation-numeriques-ile-de-france.json\" -n \"Francil-in\" -t \"Île-de-France\" -o \"./assets/output/francil-in\" -i true", + "dedupliquer.gironde": "tsx src/index.ts dedupliquer -s \"./assets/output/gironde/*-gironde-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -b \"./assets/output/gironde/*-gironde-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -n \"Gironde\" -t\"Nouvelle-Aquitaine\" -o \"./assets/output/gironde\" -i true", + "dedupliquer.grand-paris-sud": "tsx src/index.ts dedupliquer -s \"./assets/output/grand-paris-sud/*-grand-paris-sud-lieux-de-mediation-numeriques-ile-de-france.json\" -b \"./assets/output/grand-paris-sud/*-grand-paris-sud-lieux-de-mediation-numeriques-ile-de-france.json\" -n \"Grand Paris Sud\" -t\"Île-de-France\" -o \"./assets/output/grand-paris-sud\" -i true", + "dedupliquer.haute-vienne": "tsx src/index.ts dedupliquer -s \"./assets/output/haute-vienne/*-haute-vienne-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -b \"./assets/output/haute-vienne/*-haute-vienne-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -n \"Haute-Vienne\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/haute-vienne\" -i true", + "dedupliquer.hinaura": "tsx src/index.ts dedupliquer -s \"./assets/output/hinaura/*-hinaura-lieux-de-mediation-numeriques-auvergne-rhone-alpes.json\" -b \"./assets/output/hinaura/*-hinaura-lieux-de-mediation-numeriques-auvergne-rhone-alpes.json\" -n \"Hinaura\" -t \"Auvergne-Rhône-Alpes\" -o \"./assets/output/hinaura\" -i true", + "dedupliquer.hub-bretagne": "tsx src/index.ts dedupliquer -s \"./assets/output/hub-bretagne/*-hub-bretagne-lieux-de-mediation-numeriques-bretagne.json\" -b \"./assets/output/hub-bretagne/*-hub-bretagne-lieux-de-mediation-numeriques-bretagne.json\" -n \"Hub Bretagne\" -t \"Bretagne\" -o \"./assets/output/hub-bretagne\" -i true", + "dedupliquer.hub-lo": "tsx src/index.ts dedupliquer -s \"./assets/output/hub-lo/*-hub-lo-lieux-de-mediation-numeriques-centre-val-de-loire.json\" -b \"./assets/output/hub-lo/*-hub-lo-lieux-de-mediation-numeriques-centre-val-de-loire.json\" -n \"Hub-lo\" -t \"Centre-Val-de-Loire\" -o \"./assets/output/hub-lo\" -i true", + "dedupliquer.la-creuse": "tsx src/index.ts dedupliquer -s \"./assets/output/la-creuse/*-la-creuse-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -b \"./assets/output/la-creuse/*-la-creuse-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -n \"La Creuse\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/la-creuse\" -i true", + "dedupliquer.le-havre": "tsx src/index.ts dedupliquer -s \"./assets/output/le-havre/*-le-havre-lieux-de-mediation-numeriques-le-havre.json\" -b \"./assets/output/le-havre/*-le-havre-lieux-de-mediation-numeriques-le-havre.json\" -n \"Le Havre\" -t \"Le Havre\" -o \"./assets/output/le-havre\" -i true", + "dedupliquer.les-landes": "tsx src/index.ts dedupliquer -s \"./assets/output/les-landes/*-les-landes-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -b \"./assets/output/les-landes/*-les-landes-lieux-de-mediation-numeriques-nouvelle-aquitaine.json\" -n \"Les Landes\" -t \"Nouvelle-Aquitaine\" -o \"./assets/output/les-landes\" -i true", + "dedupliquer.loire-atlantique": "tsx src/index.ts dedupliquer -s \"./assets/output/loire-atlantique/*-loire-atlantique-lieux-de-mediation-numeriques-loire-atlantique.json\" -b \"./assets/output/loire-atlantique/*-loire-atlantique-lieux-de-mediation-numeriques-loire-atlantique.json\" -n \"Loire Atlantique\" -t \"Loire-Atlantique\" -o \"./assets/output/loire-atlantique\" -i true", + "dedupliquer.maine-et-loire": "tsx src/index.ts dedupliquer -s \"./assets/output/maine-et-loire/*-departement-du-maine-et-loire-lieux-de-mediation-numeriques-maine-et-loire.json\" -b \"./assets/output/maine-et-loire/*-departement-du-maine-et-loire-lieux-de-mediation-numeriques-maine-et-loire.json\" -n \"Département du Maine-et-Loire\" -t \"Maine-et-Loire\" -o \"./assets/output/maine-et-loire\" -i true", + "dedupliquer.mednum-bfc": "tsx src/index.ts dedupliquer -s \"./assets/output/mednum-bfc/*-mednum-bfc-lieux-de-mediation-numeriques-bourgogne-franche-comte.json\" -b \"./assets/output/mednum-bfc/*-mednum-bfc-lieux-de-mediation-numeriques-bourgogne-franche-comte.json\" -n \"Mednum BFC\" -t \"Bourgogne-Franche-Comté\" -o \"./assets/output/mednum-bfc\" -i true", + "dedupliquer.mulhouse": "tsx src/index.ts dedupliquer -s \"./assets/output/mulhouse/*-mulhouse-lieux-de-mediation-numeriques-haut-rhin.json\" -b \"./assets/output/mulhouse/*-mulhouse-lieux-de-mediation-numeriques-haut-rhin.json\" -n \"Mulhouse\" -t \"Haut-Rhin\" -o \"./assets/output/mulhouse\" -i true", + "dedupliquer.nouvelle-caledonie": "tsx src/index.ts dedupliquer -s \"./assets/output/nouvelle-caledonie/*-nouvelle-caledonie-lieux-de-mediation-numeriques-nouvelle-caledonie.json\" -b \"./assets/output/nouvelle-caledonie/*-nouvelle-caledonie-lieux-de-mediation-numeriques-nouvelle-caledonie.json\" -n \"Nouvelle-Calédonie\" -t \"Nouvelle-Calédonie\" -o \"./assets/output/nouvelle-caledonie\" -i true", + "dedupliquer.paca": "tsx src/index.ts dedupliquer -s \"./assets/output/paca/*-paca-lieux-de-mediation-numeriques-provence-alpes-cote-d-azur.json\" -b \"./assets/output/paca/*-paca-lieux-de-mediation-numeriques-provence-alpes-cote-d-azur.json\" -n \"Paca\" -t \"Provence-Alpes-Côte d'Azur\" -o \"./assets/output/paca\" -i true", + "dedupliquer.rhin-occ": "tsx src/index.ts dedupliquer -s \"./assets/output/rhin-occ/*-rhinocc-lieux-de-mediation-numeriques-occitanie.json\" -b \"./assets/output/rhin-occ/*-rhinocc-lieux-de-mediation-numeriques-occitanie.json\" -n \"RhinOcc\" -t \"Occitanie\" -o \"./assets/output/rhin-occ\" -i true", + "dedupliquer.res-in": "tsx src/index.ts dedupliquer -s \"./assets/output/____/*-____.json\" -b \"./assets/output/____/*-____.json\" -n \"Res-in\" -t \"Lyon\" -o \"./assets/output/res-in\" -i true", + "dedupliquer.siilab": "tsx src/index.ts dedupliquer -s \"./assets/output/siilab/*-siilab-lieux-de-mediation-numeriques-hauts-de-france.json\" -b \"./assets/output/siilab/*-siilab-lieux-de-mediation-numeriques-hauts-de-france.json\" -n \"Siilab\" -t \"Hauts-de-France\" -o \"./assets/output/siilab\" -i true", + "dedupliquer.ultra-num": "tsx src/index.ts dedupliquer -s \"./assets/output/____/*-____.json\" -b \"./assets/output/____/*-____.json\" -n \"Ultra-numerique\" -t \"La Reunion\" -o \"./assets/output/ultra-num\" -i true", + "dedupliquer.vendee": "tsx src/index.ts dedupliquer -s \"./assets/output/vendee/*-vendee-lieux-de-mediation-numeriques-vendee.json\" -b \"./assets/output/vendee/*-vendee-lieux-de-mediation-numeriques-vendee.json\" -n \"Vendée\" -t \"Vendée\" -o \"./assets/output/vendee\" -i true", + "dedupliquer.merged-json": "tsx src/index.ts dedupliquer -s ./assets/to-deduplicate/merged_output.json -b ./assets/to-deduplicate/merged_output.json -n \"Données dédupliquées\" -t National -o ./assets/deduplicated", "dedupliquer.merged-csv": "tsx src/index.ts dedupliquer -s ./merged_output.csv -b ./merged_output.csv -n \"Données dédupliquées\" -t National -o ./assets/deduplicated", - "fusionner": "tsx src/index.ts fusionner -i \"./assets/output/**/*.csv\" -o \"./assets/merged\"" + "fusionner": "tsx src/index.ts fusionner -i \"./to-merge/*-sans-doublons.json\" -o \"./merged\"", + "prepare": "husky" }, "devDependencies": { - "@commitlint/cli": "^19.3.0", - "@commitlint/config-conventional": "^19.2.2", + "@commitlint/cli": "^19.6.1", + "@commitlint/config-conventional": "^19.6.0", "@eslint/js": "^9.17.0", "@turf/helpers": "^7.1.0", + "@types/form-data": "^2.5.2", + "@types/flat": "^5.0.5", + "@types/geojson": "^1.0.6", "@types/glob": "^8.1.0", "@types/inquirer": "^9.0.7", - "@types/jest": "^29.1.1", "@types/node": "^22.10.2", "@types/proj4": "^2.5.5", "@typescript-eslint/eslint-plugin": "^8.18.1", "@typescript-eslint/parser": "^8.18.1", "eslint": "^9.17.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-jest": "^28.10.0", "globals": "^15.14.0", - "husky": "^9.0.11", + "husky": "^9.1.7", "iconv-lite": "^0.6.3", - "jest": "^29.1.2", - "lint-staged": "^15.2.7", + "lint-staged": "^15.2.11", "prettier": "^3.3.2", "standard-version": "^9.5.0", - "ts-jest": "^29.0.3", "ts-node": "^10.9.2", "tsx": "^4.19.1", - "typescript-eslint": "^8.18.1" + "typescript-eslint": "^8.18.1", + "vitest": "^2.1.8" }, "dependencies": { "@gouvfr-anct/lieux-de-mediation-numerique": "^2.1.0", @@ -211,9 +206,10 @@ "dotenv": "^16.0.3", "flat": "^6.0.1", "fuzzball": "^2.1.2", - "glob": "^8.1.0", + "glob": "^11.0.0", "inquirer": "^9.3.7", "proj4": "^2.9.0", + "form-data": "^4.0.1", "typescript": "^5.4.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 42e220f6..04d99f48 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,12 +40,15 @@ importers: flat: specifier: ^6.0.1 version: 6.0.1 + form-data: + specifier: ^4.0.1 + version: 4.0.1 fuzzball: specifier: ^2.1.2 version: 2.1.3 glob: - specifier: ^8.1.0 - version: 8.1.0 + specifier: ^11.0.0 + version: 11.0.0 inquirer: specifier: ^9.3.7 version: 9.3.7 @@ -57,10 +60,10 @@ importers: version: 5.7.2 devDependencies: '@commitlint/cli': - specifier: ^19.3.0 + specifier: ^19.6.1 version: 19.6.1(@types/node@22.10.2)(typescript@5.7.2) '@commitlint/config-conventional': - specifier: ^19.2.2 + specifier: ^19.6.0 version: 19.6.0 '@eslint/js': specifier: ^9.17.0 @@ -68,15 +71,21 @@ importers: '@turf/helpers': specifier: ^7.1.0 version: 7.1.0 + '@types/flat': + specifier: ^5.0.5 + version: 5.0.5 + '@types/form-data': + specifier: ^2.5.2 + version: 2.5.2 + '@types/geojson': + specifier: ^1.0.6 + version: 1.0.6 '@types/glob': specifier: ^8.1.0 version: 8.1.0 '@types/inquirer': specifier: ^9.0.7 version: 9.0.7 - '@types/jest': - specifier: ^29.1.1 - version: 29.5.14 '@types/node': specifier: ^22.10.2 version: 22.10.2 @@ -95,23 +104,17 @@ importers: eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-jest: - specifier: ^28.10.0 - version: 28.10.0(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(jest@29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)))(typescript@5.7.2) globals: specifier: ^15.14.0 version: 15.14.0 husky: - specifier: ^9.0.11 + specifier: ^9.1.7 version: 9.1.7 iconv-lite: specifier: ^0.6.3 version: 0.6.3 - jest: - specifier: ^29.1.2 - version: 29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) lint-staged: - specifier: ^15.2.7 + specifier: ^15.2.11 version: 15.2.11 prettier: specifier: ^3.3.2 @@ -119,9 +122,6 @@ importers: standard-version: specifier: ^9.5.0 version: 9.5.0 - ts-jest: - specifier: ^29.0.3 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)))(typescript@5.7.2) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@22.10.2)(typescript@5.7.2) @@ -131,185 +131,23 @@ importers: typescript-eslint: specifier: ^8.18.1 version: 8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + vitest: + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2) packages: - '@ampproject/remapping@2.3.0': - resolution: { integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== } - engines: { node: '>=6.0.0' } - - '@babel/code-frame@7.24.7': - resolution: { integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== } - engines: { node: '>=6.9.0' } - - '@babel/compat-data@7.25.4': - resolution: { integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== } - engines: { node: '>=6.9.0' } - - '@babel/core@7.25.2': - resolution: { integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== } - engines: { node: '>=6.9.0' } - - '@babel/generator@7.25.6': - resolution: { integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== } - engines: { node: '>=6.9.0' } - - '@babel/helper-compilation-targets@7.25.2': - resolution: { integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== } - engines: { node: '>=6.9.0' } - - '@babel/helper-module-imports@7.24.7': - resolution: { integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== } - engines: { node: '>=6.9.0' } - - '@babel/helper-module-transforms@7.25.2': - resolution: { integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.24.8': - resolution: { integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== } - engines: { node: '>=6.9.0' } - - '@babel/helper-simple-access@7.24.7': - resolution: { integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== } - engines: { node: '>=6.9.0' } - - '@babel/helper-string-parser@7.24.8': - resolution: { integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== } - engines: { node: '>=6.9.0' } - - '@babel/helper-validator-identifier@7.24.7': - resolution: { integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== } - engines: { node: '>=6.9.0' } - - '@babel/helper-validator-option@7.24.8': - resolution: { integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== } - engines: { node: '>=6.9.0' } - - '@babel/helpers@7.25.6': - resolution: { integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== } - engines: { node: '>=6.9.0' } - - '@babel/highlight@7.24.7': - resolution: { integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== } - engines: { node: '>=6.9.0' } - - '@babel/parser@7.25.6': - resolution: { integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== } - engines: { node: '>=6.0.0' } - hasBin: true - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: { integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: { integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: { integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: { integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.25.6': - resolution: { integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: { integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: { integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.24.7': - resolution: { integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: { integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: { integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: { integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: { integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: { integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: { integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: { integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: { integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== } + '@babel/code-frame@7.26.2': + resolution: { integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== } engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.4': - resolution: { integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== } + '@babel/helper-validator-identifier@7.25.9': + resolution: { integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== } engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 '@babel/runtime@7.26.0': resolution: { integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== } engines: { node: '>=6.9.0' } - '@babel/template@7.25.0': - resolution: { integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== } - engines: { node: '>=6.9.0' } - - '@babel/traverse@7.25.6': - resolution: { integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== } - engines: { node: '>=6.9.0' } - - '@babel/types@7.25.6': - resolution: { integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== } - engines: { node: '>=6.9.0' } - - '@bcoe/v8-coverage@0.2.3': - resolution: { integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== } - '@commitlint/cli@19.6.1': resolution: { integrity: sha512-8hcyA6ZoHwWXC76BoC8qVOSr8xHy00LZhZpauiD0iO0VYbVhMnED0da85lTfIULxl7Lj4c6vZgF0Wu/ed1+jlQ== } engines: { node: '>=v18' } @@ -383,108 +221,216 @@ packages: resolution: { integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== } engines: { node: '>=12' } + '@esbuild/aix-ppc64@0.21.5': + resolution: { integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== } + engines: { node: '>=12' } + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.23.1': resolution: { integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== } engines: { node: '>=18' } cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.21.5': + resolution: { integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== } + engines: { node: '>=12' } + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.23.1': resolution: { integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== } engines: { node: '>=18' } cpu: [arm64] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: { integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== } + engines: { node: '>=12' } + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.23.1': resolution: { integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== } engines: { node: '>=18' } cpu: [arm] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: { integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== } + engines: { node: '>=12' } + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.23.1': resolution: { integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== } engines: { node: '>=18' } cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.21.5': + resolution: { integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== } + engines: { node: '>=12' } + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.23.1': resolution: { integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== } engines: { node: '>=18' } cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: { integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== } + engines: { node: '>=12' } + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.23.1': resolution: { integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== } engines: { node: '>=18' } cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': + resolution: { integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== } + engines: { node: '>=12' } + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.23.1': resolution: { integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== } engines: { node: '>=18' } cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: { integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== } + engines: { node: '>=12' } + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': resolution: { integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== } engines: { node: '>=18' } cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.21.5': + resolution: { integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== } + engines: { node: '>=12' } + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.23.1': resolution: { integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== } engines: { node: '>=18' } cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: { integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== } + engines: { node: '>=12' } + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.23.1': resolution: { integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== } engines: { node: '>=18' } cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: { integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== } + engines: { node: '>=12' } + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.23.1': resolution: { integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== } engines: { node: '>=18' } cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: { integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== } + engines: { node: '>=12' } + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.23.1': resolution: { integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== } engines: { node: '>=18' } cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: { integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== } + engines: { node: '>=12' } + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.23.1': resolution: { integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== } engines: { node: '>=18' } cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: { integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== } + engines: { node: '>=12' } + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.23.1': resolution: { integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== } engines: { node: '>=18' } cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: { integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== } + engines: { node: '>=12' } + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.23.1': resolution: { integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== } engines: { node: '>=18' } cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: { integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== } + engines: { node: '>=12' } + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.23.1': resolution: { integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== } engines: { node: '>=18' } cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: { integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== } + engines: { node: '>=12' } + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.23.1': resolution: { integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== } engines: { node: '>=18' } cpu: [x64] os: [linux] + '@esbuild/netbsd-x64@0.21.5': + resolution: { integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== } + engines: { node: '>=12' } + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': resolution: { integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== } engines: { node: '>=18' } @@ -497,30 +443,60 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: { integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== } + engines: { node: '>=12' } + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': resolution: { integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== } engines: { node: '>=18' } cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.21.5': + resolution: { integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== } + engines: { node: '>=12' } + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.23.1': resolution: { integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== } engines: { node: '>=18' } cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.21.5': + resolution: { integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== } + engines: { node: '>=12' } + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.23.1': resolution: { integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== } engines: { node: '>=18' } cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: { integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== } + engines: { node: '>=12' } + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.23.1': resolution: { integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== } engines: { node: '>=18' } cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: { integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== } + engines: { node: '>=12' } + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.23.1': resolution: { integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== } engines: { node: '>=18' } @@ -591,102 +567,21 @@ packages: resolution: { integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== } engines: { node: '>=6.9.0' } - '@inquirer/figures@1.0.8': - resolution: { integrity: sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg== } + '@inquirer/figures@1.0.9': + resolution: { integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ== } engines: { node: '>=18' } - '@istanbuljs/load-nyc-config@1.1.0': - resolution: { integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== } - engines: { node: '>=8' } - - '@istanbuljs/schema@0.1.3': - resolution: { integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== } - engines: { node: '>=8' } - - '@jest/console@29.7.0': - resolution: { integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/core@29.7.0': - resolution: { integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/environment@29.7.0': - resolution: { integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/expect-utils@29.7.0': - resolution: { integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/expect@29.7.0': - resolution: { integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/fake-timers@29.7.0': - resolution: { integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/globals@29.7.0': - resolution: { integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/reporters@29.7.0': - resolution: { integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/schemas@29.6.3': - resolution: { integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/source-map@29.6.3': - resolution: { integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/test-result@29.7.0': - resolution: { integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/test-sequencer@29.7.0': - resolution: { integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/transform@29.7.0': - resolution: { integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jest/types@29.6.3': - resolution: { integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - '@jridgewell/gen-mapping@0.3.5': - resolution: { integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== } - engines: { node: '>=6.0.0' } + '@isaacs/cliui@8.0.2': + resolution: { integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== } + engines: { node: '>=12' } '@jridgewell/resolve-uri@3.1.2': resolution: { integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== } engines: { node: '>=6.0.0' } - '@jridgewell/set-array@1.2.1': - resolution: { integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== } - engines: { node: '>=6.0.0' } - '@jridgewell/sourcemap-codec@1.5.0': resolution: { integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== } - '@jridgewell/trace-mapping@0.3.25': - resolution: { integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== } - '@jridgewell/trace-mapping@0.3.9': resolution: { integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== } @@ -702,14 +597,100 @@ packages: resolution: { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } engines: { node: '>= 8' } - '@sinclair/typebox@0.27.8': - resolution: { integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== } + '@rollup/rollup-android-arm-eabi@4.29.0': + resolution: { integrity: sha512-TnF0md3qWSRDlU96y9+0dd5RNrlXiQUp1K2pK1UpNmjeND+o9ts9Jxv3G6ntagkt8jVh0KAT1VYgU0nCz5gt2w== } + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.29.0': + resolution: { integrity: sha512-L/7oX07eY6ACt2NXDrku1JIPdf9VGV/DI92EjAd8FRDzMMub5hXFpT1OegBqimJh9xy9Vv+nToaVtZp4Ku9SEA== } + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.29.0': + resolution: { integrity: sha512-I1ZucWPVS96hjAsMSJiGosHTqMulMynrmTN+Xde5OsLcU5SjE0xylBmQ/DbB2psJ+HasINrJYz8HQpojtAw2eA== } + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.29.0': + resolution: { integrity: sha512-CTZ+lHMsTbH1q/XLKzmnJWxl2r/1xdv7cnjwbi5v+95nVA1syikxWLvqur4nDoGDHjC8oNMBGurnQptpuFJHXA== } + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.29.0': + resolution: { integrity: sha512-BB8+4OMzk2JiKL5+aK8A0pi9DPB5pkIBZWXr19+grdez9b0VKihvV432uSwuZLO0sI6zCyxak8NO3mZ1yjM1jA== } + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.29.0': + resolution: { integrity: sha512-Udz9Uh26uEE6phGMG2++TfpsLK/z4cYJqrIOyVhig/PMoWiZLghpjZUQvsAylsoztbpg0/QmplkDAyyVq0x6Jg== } + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.29.0': + resolution: { integrity: sha512-IPSCTzP8GRYzY+siSnggIKrckC2U+kVXoen6eSHRDgU9a4EZCHHWWOiKio1EkieOOk2j6EvZaaHfQUCmt8UJBg== } + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.29.0': + resolution: { integrity: sha512-GvHPu0UIDx+ohyS8vTYnwoSVMM5BH3NO+JwQs6GWNCuQVlC5rKxnH2WClTGu3NxiIfhKLai08IKUwn3QbzX1UQ== } + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.29.0': + resolution: { integrity: sha512-Pnnn/2CAZWcH9GQoj1nnr85Ejh7aNDe5MsEV0xhuFNUPF0SdnutJ7b2muOI5Kx12T0/i2ol5B/tlhMviZQDL3g== } + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.29.0': + resolution: { integrity: sha512-AP+DLj4q9FT22ZL43ssA3gizEn7/MfJcZ1BOuyEPqoriuH3a8VRuDddN0MtpUwEtiZL6jc1GY5/eL99hkloQ1Q== } + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.29.0': + resolution: { integrity: sha512-1+jPFClHmDATqbk0Cwi74KEOymVcs09Vbqe/CTKqLwCP0TeP2CACfnMnjYBs5CJgO20e/4bxFtmbR/9fKE1gug== } + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.29.0': + resolution: { integrity: sha512-Nmt5Us5w2dL8eh7QVyAIDVVwBv4wk8ljrBQe7lWkLaOcwABDaFQ3K4sAAC6IsOdJwaXXW+d85zVaMN+Xl8Co2w== } + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.29.0': + resolution: { integrity: sha512-KGuQ8WGhnq09LR7eOru7P9jfBSYXTMhq6TyavWfmEo+TxvkvuRwOCee5lPIa6HYjblOuFr4GeOxSE0c8iyw2Fg== } + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.29.0': + resolution: { integrity: sha512-lSQtvrYIONme7a4gbf4O9d3zbZat3/5covIeoqk27ZIkTgBeL/67x+wq2bZfpLjkqQQp5SjBPQ/n0sg8iArzTg== } + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.29.0': + resolution: { integrity: sha512-qh0ussrXBwnF4L07M9t1+jpHRhiGSae+wpNQDbmlXHXciT7pqpZ5zpk4dyGZPtDGB2l2clDiufE16BufXPGRWQ== } + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.29.0': + resolution: { integrity: sha512-YEABzSaRS7+v14yw6MVBZoMqLoUyTX1/sJoGeC0euvgMrzvw0i+jHo4keDZgYeOblfwdseVAf6ylxWSvcBAKTA== } + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.29.0': + resolution: { integrity: sha512-jA4+oxG7QTTtSQxwSHzFVwShcppHO2DpkbAM59pfD5WMG/da79yQaeBtXAfGTI+ciUx8hqK3RF3H2KWByITXtQ== } + cpu: [arm64] + os: [win32] - '@sinonjs/commons@3.0.1': - resolution: { integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== } + '@rollup/rollup-win32-ia32-msvc@4.29.0': + resolution: { integrity: sha512-4TQbLoAQVu9uE+cvh47JnjRZylXVdRCoOkRSVF2Rr2T0U1YwphGRjR0sHyRPEt95y3ETT4YFTTzQPq1O4bcjmw== } + cpu: [ia32] + os: [win32] - '@sinonjs/fake-timers@10.3.0': - resolution: { integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== } + '@rollup/rollup-win32-x64-msvc@4.29.0': + resolution: { integrity: sha512-GsFvcTZ7Yj9k94Qm0qgav7pxmQ7lQDR9NjoelRaxeV1UF6JSDfanR/2tHZ8hS7Ps4KPIVf5AElYPRPmN/Q0ZkQ== } + cpu: [x64] + os: [win32] '@tsconfig/node10@1.0.11': resolution: { integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== } @@ -1065,29 +1046,24 @@ packages: '@turf/voronoi@7.1.0': resolution: { integrity: sha512-xUvzPDG6GaqEekgxd+pjeMKJXOYJ3eFIqUHbTe/ISKzzv3f2cFGiR2VH7ZGXri8d4ozzCQbUQ27ilHPPLf5+xw== } - '@types/babel__core@7.20.5': - resolution: { integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== } + '@types/conventional-commits-parser@5.0.1': + resolution: { integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ== } - '@types/babel__generator@7.6.8': - resolution: { integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== } - - '@types/babel__template@7.4.4': - resolution: { integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== } - - '@types/babel__traverse@7.20.6': - resolution: { integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== } - - '@types/conventional-commits-parser@5.0.0': - resolution: { integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ== } - - '@types/d3-voronoi@1.1.12': - resolution: { integrity: sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw== } + '@types/d3-voronoi@1.1.12': + resolution: { integrity: sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw== } '@types/estree@1.0.6': resolution: { integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== } - '@types/geojson@7946.0.14': - resolution: { integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== } + '@types/flat@5.0.5': + resolution: { integrity: sha512-nPLljZQKSnac53KDUDzuzdRfGI0TDb5qPrb+SrQyN3MtdQrOnGsKniHN1iYZsJEBIVQve94Y6gNz22sgISZq+Q== } + + '@types/form-data@2.5.2': + resolution: { integrity: sha512-tfmcyHn1Pp9YHAO5r40+UuZUPAZbUEgqTel3EuEKpmF9hPkXgR4l41853raliXnb4gwyPNoQOfvgGGlHN5WSog== } + deprecated: This is a stub types definition. form-data provides its own type definitions, so you do not need this installed. + + '@types/geojson@1.0.6': + resolution: { integrity: sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w== } '@types/geojson@7946.0.15': resolution: { integrity: sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA== } @@ -1095,24 +1071,9 @@ packages: '@types/glob@8.1.0': resolution: { integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== } - '@types/graceful-fs@4.1.9': - resolution: { integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== } - '@types/inquirer@9.0.7': resolution: { integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g== } - '@types/istanbul-lib-coverage@2.0.6': - resolution: { integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== } - - '@types/istanbul-lib-report@3.0.3': - resolution: { integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== } - - '@types/istanbul-reports@3.0.4': - resolution: { integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== } - - '@types/jest@29.5.14': - resolution: { integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== } - '@types/json-schema@7.0.15': resolution: { integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== } @@ -1131,18 +1092,9 @@ packages: '@types/proj4@2.5.5': resolution: { integrity: sha512-y4tHUVVoMEOm2nxRLQ2/ET8upj/pBmoutGxFw2LZJTQWPgWXI+cbxVEUFFmIzr/bpFR83hGDOTSXX6HBeObvZA== } - '@types/stack-utils@2.0.3': - resolution: { integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== } - '@types/through@0.0.33': resolution: { integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ== } - '@types/yargs-parser@21.0.3': - resolution: { integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== } - - '@types/yargs@17.0.33': - resolution: { integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== } - '@typescript-eslint/eslint-plugin@8.18.1': resolution: { integrity: sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ== } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -1190,6 +1142,35 @@ packages: resolution: { integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ== } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@vitest/expect@2.1.8': + resolution: { integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== } + + '@vitest/mocker@2.1.8': + resolution: { integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== } + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.8': + resolution: { integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== } + + '@vitest/runner@2.1.8': + resolution: { integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== } + + '@vitest/snapshot@2.1.8': + resolution: { integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== } + + '@vitest/spy@2.1.8': + resolution: { integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== } + + '@vitest/utils@2.1.8': + resolution: { integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== } + JSONStream@1.3.5: resolution: { integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== } hasBin: true @@ -1203,11 +1184,6 @@ packages: resolution: { integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== } engines: { node: '>=0.4.0' } - acorn@8.12.1: - resolution: { integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== } - engines: { node: '>=0.4.0' } - hasBin: true - acorn@8.14.0: resolution: { integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== } engines: { node: '>=0.4.0' } @@ -1246,24 +1222,13 @@ packages: resolution: { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } engines: { node: '>=8' } - ansi-styles@5.2.0: - resolution: { integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== } - engines: { node: '>=10' } - ansi-styles@6.2.1: resolution: { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } engines: { node: '>=12' } - anymatch@3.1.3: - resolution: { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } - engines: { node: '>= 8' } - arg@4.1.3: resolution: { integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== } - argparse@1.0.10: - resolution: { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } - argparse@2.0.1: resolution: { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } @@ -1274,8 +1239,9 @@ packages: resolution: { integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== } engines: { node: '>=0.10.0' } - async@3.2.6: - resolution: { integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== } + assertion-error@2.0.1: + resolution: { integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== } + engines: { node: '>=12' } asynckit@0.4.0: resolution: { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } @@ -1288,31 +1254,6 @@ packages: axios@1.7.9: resolution: { integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== } - babel-jest@29.7.0: - resolution: { integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-istanbul@6.1.1: - resolution: { integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== } - engines: { node: '>=8' } - - babel-plugin-jest-hoist@29.6.3: - resolution: { integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - babel-preset-current-node-syntax@1.1.0: - resolution: { integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== } - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-jest@29.6.3: - resolution: { integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@babel/core': ^7.0.0 - balanced-match@1.0.2: resolution: { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } @@ -1335,24 +1276,16 @@ packages: resolution: { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } engines: { node: '>=8' } - browserslist@4.23.3: - resolution: { integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - - bs-logger@0.2.6: - resolution: { integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== } - engines: { node: '>= 6' } - - bser@2.1.1: - resolution: { integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== } - buffer-from@1.1.2: resolution: { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== } buffer@5.7.1: resolution: { integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== } + cac@6.7.14: + resolution: { integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== } + engines: { node: '>=8' } + callsites@3.1.0: resolution: { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } engines: { node: '>=6' } @@ -1365,12 +1298,9 @@ packages: resolution: { integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== } engines: { node: '>=6' } - camelcase@6.3.0: - resolution: { integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== } - engines: { node: '>=10' } - - caniuse-lite@1.0.30001663: - resolution: { integrity: sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA== } + chai@5.1.2: + resolution: { integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== } + engines: { node: '>=12' } chalk@2.4.2: resolution: { integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== } @@ -1384,19 +1314,16 @@ packages: resolution: { integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== } engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - char-regex@1.0.2: - resolution: { integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== } - engines: { node: '>=10' } + chalk@5.4.0: + resolution: { integrity: sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q== } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } chardet@0.7.0: resolution: { integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== } - ci-info@3.9.0: - resolution: { integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== } - engines: { node: '>=8' } - - cjs-module-lexer@1.4.1: - resolution: { integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== } + check-error@2.1.1: + resolution: { integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== } + engines: { node: '>= 16' } cli-cursor@3.1.0: resolution: { integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== } @@ -1429,13 +1356,6 @@ packages: resolution: { integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== } engines: { node: '>=0.8' } - co@4.6.0: - resolution: { integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== } - engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } - - collect-v8-coverage@1.0.2: - resolution: { integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== } - color-convert@1.9.3: resolution: { integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== } @@ -1559,9 +1479,6 @@ packages: engines: { node: '>=10' } hasBin: true - convert-source-map@2.0.0: - resolution: { integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== } - core-util-is@1.0.3: resolution: { integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== } @@ -1582,11 +1499,6 @@ packages: typescript: optional: true - create-jest@29.7.0: - resolution: { integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - create-require@1.1.1: resolution: { integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== } @@ -1642,21 +1554,13 @@ packages: resolution: { integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== } engines: { node: '>=0.10.0' } - dedent@1.5.3: - resolution: { integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== } - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true + deep-eql@5.0.2: + resolution: { integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== } + engines: { node: '>=6' } deep-is@0.1.4: resolution: { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } - deepmerge@4.3.1: - resolution: { integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== } - engines: { node: '>=0.10.0' } - defaults@1.0.4: resolution: { integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== } @@ -1672,10 +1576,6 @@ packages: resolution: { integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== } engines: { node: '>=8' } - diff-sequences@29.6.3: - resolution: { integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - diff@4.0.2: resolution: { integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== } engines: { node: '>=0.3.1' } @@ -1695,17 +1595,8 @@ packages: earcut@2.2.4: resolution: { integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== } - ejs@3.1.10: - resolution: { integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== } - engines: { node: '>=0.10.0' } - hasBin: true - - electron-to-chromium@1.5.27: - resolution: { integrity: sha512-o37j1vZqCoEgBuWWXLHQgTN/KDKe7zwpiY5CPeq2RvUqOyJw9xnrULzZAEVQ5p4h+zjMk7hgtOoPdnLxr7m/jw== } - - emittery@0.13.1: - resolution: { integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== } - engines: { node: '>=12' } + eastasianwidth@0.2.0: + resolution: { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } emoji-regex@10.4.0: resolution: { integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== } @@ -1713,6 +1604,9 @@ packages: emoji-regex@8.0.0: resolution: { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } + emoji-regex@9.2.2: + resolution: { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } + env-paths@2.2.1: resolution: { integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== } engines: { node: '>=6' } @@ -1724,6 +1618,14 @@ packages: error-ex@1.3.2: resolution: { integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== } + es-module-lexer@1.5.4: + resolution: { integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== } + + esbuild@0.21.5: + resolution: { integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== } + engines: { node: '>=12' } + hasBin: true + esbuild@0.23.1: resolution: { integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg== } engines: { node: '>=18' } @@ -1737,10 +1639,6 @@ packages: resolution: { integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== } engines: { node: '>=0.8.0' } - escape-string-regexp@2.0.0: - resolution: { integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== } - engines: { node: '>=8' } - escape-string-regexp@4.0.0: resolution: { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } engines: { node: '>=10' } @@ -1751,19 +1649,6 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-jest@28.10.0: - resolution: { integrity: sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA== } - engines: { node: ^16.10.0 || ^18.12.0 || >=20.0.0 } - peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0 - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - eslint-scope@8.2.0: resolution: { integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -1790,11 +1675,6 @@ packages: resolution: { integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - esprima@4.0.1: - resolution: { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } - engines: { node: '>=4' } - hasBin: true - esquery@1.6.0: resolution: { integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== } engines: { node: '>=0.10' } @@ -1807,6 +1687,9 @@ packages: resolution: { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } engines: { node: '>=4.0' } + estree-walker@3.0.3: + resolution: { integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== } + esutils@2.0.3: resolution: { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } engines: { node: '>=0.10.0' } @@ -1814,21 +1697,13 @@ packages: eventemitter3@5.0.1: resolution: { integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== } - execa@5.1.1: - resolution: { integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== } - engines: { node: '>=10' } - execa@8.0.1: resolution: { integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== } engines: { node: '>=16.17' } - exit@0.1.2: - resolution: { integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== } - engines: { node: '>= 0.8.0' } - - expect@29.7.0: - resolution: { integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + expect-type@1.1.0: + resolution: { integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== } + engines: { node: '>=12.0.0' } external-editor@3.1.0: resolution: { integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== } @@ -1847,15 +1722,12 @@ packages: fast-levenshtein@2.0.6: resolution: { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } - fast-uri@3.0.1: - resolution: { integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== } + fast-uri@3.0.3: + resolution: { integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== } fastq@1.17.1: resolution: { integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== } - fb-watchman@2.0.2: - resolution: { integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== } - figures@3.2.0: resolution: { integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== } engines: { node: '>=8' } @@ -1864,9 +1736,6 @@ packages: resolution: { integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== } engines: { node: '>=16.0.0' } - filelist@1.0.4: - resolution: { integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== } - fill-range@7.1.1: resolution: { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } engines: { node: '>=8' } @@ -1912,12 +1781,13 @@ packages: debug: optional: true - form-data@4.0.0: - resolution: { integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== } - engines: { node: '>= 6' } + foreground-child@3.3.0: + resolution: { integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== } + engines: { node: '>=14' } - fs.realpath@1.0.0: - resolution: { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } + form-data@4.0.1: + resolution: { integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== } + engines: { node: '>= 6' } fsevents@2.3.3: resolution: { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } @@ -1930,10 +1800,6 @@ packages: fuzzball@2.1.3: resolution: { integrity: sha512-HfhHw16GRPq342cye8gtPoL7PIN5a8MEewVK/pybr2tAe7nlptP91aw7PFElVValARSKVJYPY5z5sW72JH20Hw== } - gensync@1.0.0-beta.2: - resolution: { integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== } - engines: { node: '>=6.9.0' } - geojson-equality-ts@1.0.2: resolution: { integrity: sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ== } @@ -1944,23 +1810,15 @@ packages: resolution: { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== } engines: { node: 6.* || 8.* || >= 10.* } - get-east-asian-width@1.2.0: - resolution: { integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== } + get-east-asian-width@1.3.0: + resolution: { integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== } engines: { node: '>=18' } - get-package-type@0.1.0: - resolution: { integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== } - engines: { node: '>=8.0.0' } - get-pkg-repo@4.2.1: resolution: { integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== } engines: { node: '>=6.9.0' } hasBin: true - get-stream@6.0.1: - resolution: { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== } - engines: { node: '>=10' } - get-stream@8.0.1: resolution: { integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== } engines: { node: '>=16' } @@ -1998,23 +1856,15 @@ packages: resolution: { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } engines: { node: '>=10.13.0' } - glob@7.2.3: - resolution: { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== } - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: { integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== } - engines: { node: '>=12' } - deprecated: Glob versions prior to v9 are no longer supported + glob@11.0.0: + resolution: { integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g== } + engines: { node: 20 || >=22 } + hasBin: true global-directory@4.0.1: resolution: { integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== } engines: { node: '>=18' } - globals@11.12.0: - resolution: { integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== } - engines: { node: '>=4' } - globals@14.0.0: resolution: { integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== } engines: { node: '>=18' } @@ -2060,13 +1910,6 @@ packages: resolution: { integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== } engines: { node: '>=10' } - html-escaper@2.0.2: - resolution: { integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== } - - human-signals@2.1.0: - resolution: { integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== } - engines: { node: '>=10.17.0' } - human-signals@5.0.0: resolution: { integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== } engines: { node: '>=16.17.0' } @@ -2101,11 +1944,6 @@ packages: resolution: { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } engines: { node: '>=6' } - import-local@3.2.0: - resolution: { integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== } - engines: { node: '>=8' } - hasBin: true - import-meta-resolve@4.1.0: resolution: { integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== } @@ -2117,10 +1955,6 @@ packages: resolution: { integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== } engines: { node: '>=8' } - inflight@1.0.6: - resolution: { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } @@ -2138,8 +1972,8 @@ packages: is-arrayish@0.2.1: resolution: { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } - is-core-module@2.15.1: - resolution: { integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== } + is-core-module@2.16.0: + resolution: { integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g== } engines: { node: '>= 0.4' } is-extglob@2.1.1: @@ -2158,10 +1992,6 @@ packages: resolution: { integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== } engines: { node: '>=18' } - is-generator-fn@2.1.0: - resolution: { integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== } - engines: { node: '>=6' } - is-glob@4.0.3: resolution: { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } engines: { node: '>=0.10.0' } @@ -2186,10 +2016,6 @@ packages: resolution: { integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== } engines: { node: '>=10' } - is-stream@2.0.1: - resolution: { integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== } - engines: { node: '>=8' } - is-stream@3.0.0: resolution: { integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } @@ -2215,163 +2041,9 @@ packages: isexe@2.0.0: resolution: { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } - istanbul-lib-coverage@3.2.2: - resolution: { integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== } - engines: { node: '>=8' } - - istanbul-lib-instrument@5.2.1: - resolution: { integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== } - engines: { node: '>=8' } - - istanbul-lib-instrument@6.0.3: - resolution: { integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== } - engines: { node: '>=10' } - - istanbul-lib-report@3.0.1: - resolution: { integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== } - engines: { node: '>=10' } - - istanbul-lib-source-maps@4.0.1: - resolution: { integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== } - engines: { node: '>=10' } - - istanbul-reports@3.1.7: - resolution: { integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== } - engines: { node: '>=8' } - - jake@10.9.2: - resolution: { integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== } - engines: { node: '>=10' } - hasBin: true - - jest-changed-files@29.7.0: - resolution: { integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-circus@29.7.0: - resolution: { integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-cli@29.7.0: - resolution: { integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@29.7.0: - resolution: { integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - - jest-diff@29.7.0: - resolution: { integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-docblock@29.7.0: - resolution: { integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-each@29.7.0: - resolution: { integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-environment-node@29.7.0: - resolution: { integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-get-type@29.6.3: - resolution: { integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-haste-map@29.7.0: - resolution: { integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-leak-detector@29.7.0: - resolution: { integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-matcher-utils@29.7.0: - resolution: { integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-message-util@29.7.0: - resolution: { integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-mock@29.7.0: - resolution: { integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-pnp-resolver@1.2.3: - resolution: { integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== } - engines: { node: '>=6' } - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@29.6.3: - resolution: { integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-resolve-dependencies@29.7.0: - resolution: { integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-resolve@29.7.0: - resolution: { integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-runner@29.7.0: - resolution: { integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-runtime@29.7.0: - resolution: { integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-snapshot@29.7.0: - resolution: { integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-util@29.7.0: - resolution: { integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-validate@29.7.0: - resolution: { integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-watcher@29.7.0: - resolution: { integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest-worker@29.7.0: - resolution: { integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - jest@29.7.0: - resolution: { integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jackspeak@4.0.2: + resolution: { integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw== } + engines: { node: 20 || >=22 } jiti@2.4.2: resolution: { integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== } @@ -2380,19 +2052,10 @@ packages: js-tokens@4.0.0: resolution: { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } - js-yaml@3.14.1: - resolution: { integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== } - hasBin: true - js-yaml@4.1.0: resolution: { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } hasBin: true - jsesc@2.5.2: - resolution: { integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== } - engines: { node: '>=4' } - hasBin: true - json-buffer@3.0.1: resolution: { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } @@ -2414,11 +2077,6 @@ packages: json-stringify-safe@5.0.1: resolution: { integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== } - json5@2.2.3: - resolution: { integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== } - engines: { node: '>=6' } - hasBin: true - jsonparse@1.3.1: resolution: { integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== } engines: { '0': node >= 0.2.0 } @@ -2434,14 +2092,6 @@ packages: resolution: { integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== } engines: { node: '>=0.10.0' } - kleur@3.0.3: - resolution: { integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== } - engines: { node: '>=6' } - - leven@3.1.0: - resolution: { integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== } - engines: { node: '>=6' } - levn@0.4.1: resolution: { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } engines: { node: '>= 0.8.0' } @@ -2498,9 +2148,6 @@ packages: lodash.kebabcase@4.1.1: resolution: { integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== } - lodash.memoize@4.1.2: - resolution: { integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== } - lodash.merge@4.6.2: resolution: { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } @@ -2530,23 +2177,23 @@ packages: resolution: { integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== } engines: { node: '>=18' } - lru-cache@5.1.1: - resolution: { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== } + loupe@3.1.2: + resolution: { integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== } + + lru-cache@11.0.2: + resolution: { integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== } + engines: { node: 20 || >=22 } lru-cache@6.0.0: resolution: { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } engines: { node: '>=10' } - make-dir@4.0.0: - resolution: { integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== } - engines: { node: '>=10' } + magic-string@0.30.17: + resolution: { integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== } make-error@1.3.6: resolution: { integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== } - makeerror@1.0.12: - resolution: { integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== } - map-obj@1.0.1: resolution: { integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== } engines: { node: '>=0.10.0' } @@ -2604,13 +2251,13 @@ packages: resolution: { integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== } engines: { node: '>=4' } + minimatch@10.0.1: + resolution: { integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== } + engines: { node: 20 || >=22 } + minimatch@3.1.2: resolution: { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } - minimatch@5.1.6: - resolution: { integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== } - engines: { node: '>=10' } - minimatch@9.0.5: resolution: { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } engines: { node: '>=16 || 14 >=14.17' } @@ -2622,6 +2269,10 @@ packages: minimist@1.2.8: resolution: { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } + minipass@7.1.2: + resolution: { integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== } + engines: { node: '>=16 || 14 >=14.17' } + modify-values@1.0.1: resolution: { integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== } engines: { node: '>=0.10.0' } @@ -2633,18 +2284,17 @@ packages: resolution: { integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== } engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + nanoid@3.3.8: + resolution: { integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + natural-compare@1.4.0: resolution: { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } neo-async@2.6.2: resolution: { integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== } - node-int64@0.4.0: - resolution: { integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== } - - node-releases@2.0.18: - resolution: { integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== } - normalize-package-data@2.5.0: resolution: { integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== } @@ -2652,21 +2302,10 @@ packages: resolution: { integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== } engines: { node: '>=10' } - normalize-path@3.0.0: - resolution: { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } - engines: { node: '>=0.10.0' } - - npm-run-path@4.0.1: - resolution: { integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== } - engines: { node: '>=8' } - npm-run-path@5.3.0: resolution: { integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - once@1.4.0: - resolution: { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } - onetime@5.1.2: resolution: { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } engines: { node: '>=6' } @@ -2739,6 +2378,9 @@ packages: resolution: { integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== } engines: { node: '>=6' } + package-json-from-dist@1.0.1: + resolution: { integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== } + parent-module@1.0.1: resolution: { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } engines: { node: '>=6' } @@ -2763,10 +2405,6 @@ packages: resolution: { integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - path-is-absolute@1.0.1: - resolution: { integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== } - engines: { node: '>=0.10.0' } - path-key@3.1.1: resolution: { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } engines: { node: '>=8' } @@ -2778,12 +2416,23 @@ packages: path-parse@1.0.7: resolution: { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== } + path-scurry@2.0.0: + resolution: { integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== } + engines: { node: 20 || >=22 } + path-type@3.0.0: resolution: { integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== } engines: { node: '>=4' } - picocolors@1.1.0: - resolution: { integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== } + pathe@1.1.2: + resolution: { integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== } + + pathval@2.0.0: + resolution: { integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== } + engines: { node: '>= 14.16' } + + picocolors@1.1.1: + resolution: { integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== } picomatch@2.3.1: resolution: { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } @@ -2802,14 +2451,6 @@ packages: resolution: { integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== } engines: { node: '>=4' } - pirates@4.0.6: - resolution: { integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== } - engines: { node: '>= 6' } - - pkg-dir@4.2.0: - resolution: { integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== } - engines: { node: '>=8' } - point-in-polygon-hao@1.2.3: resolution: { integrity: sha512-uZsWylGd8nthIYS8F7aSyM7Pot+4L/bgXheJcCNdRr4eLpsM/rMb3hIi5SqNxAVjUoDDao3QzCtdaVDzmeF9Cw== } @@ -2819,6 +2460,10 @@ packages: polygon-clipping@0.15.7: resolution: { integrity: sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA== } + postcss@8.4.49: + resolution: { integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== } + engines: { node: ^10 || ^12 || >=14 } + prelude-ls@1.2.1: resolution: { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } engines: { node: '>= 0.8.0' } @@ -2828,20 +2473,12 @@ packages: engines: { node: '>=14' } hasBin: true - pretty-format@29.7.0: - resolution: { integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - process-nextick-args@2.0.1: resolution: { integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== } proj4@2.15.0: resolution: { integrity: sha512-LqCNEcPdI03BrCHxPLj29vsd5afsm+0sV1H/O3nTDKrv8/LA01ea1z4QADDMjUqxSXWnrmmQDjqFm1J/uZ5RLw== } - prompts@2.4.2: - resolution: { integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== } - engines: { node: '>= 6' } - proxy-from-env@1.1.0: resolution: { integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== } @@ -2849,9 +2486,6 @@ packages: resolution: { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } engines: { node: '>=6' } - pure-rand@6.1.0: - resolution: { integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== } - q@1.5.1: resolution: { integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== } engines: { node: '>=0.6.0', teleport: '>=0.2.0' } @@ -2879,9 +2513,6 @@ packages: rbush@3.0.1: resolution: { integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w== } - react-is@18.3.1: - resolution: { integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== } - read-pkg-up@3.0.0: resolution: { integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== } engines: { node: '>=4' } @@ -2920,10 +2551,6 @@ packages: resolution: { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== } engines: { node: '>=0.10.0' } - resolve-cwd@3.0.0: - resolution: { integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== } - engines: { node: '>=8' } - resolve-from@4.0.0: resolution: { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } engines: { node: '>=4' } @@ -2935,12 +2562,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: { integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== } - resolve.exports@2.0.2: - resolution: { integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== } - engines: { node: '>=10' } - - resolve@1.22.8: - resolution: { integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== } + resolve@1.22.10: + resolution: { integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== } + engines: { node: '>= 0.4' } hasBin: true restore-cursor@3.1.0: @@ -2964,6 +2588,11 @@ packages: robust-predicates@3.0.2: resolution: { integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== } + rollup@4.29.0: + resolution: { integrity: sha512-pdftUn12oB9Qlka+Vpyc39R28D4NsP9Sz6neepSrekofJmWzPD1sxcSO9hEOxFF8+7Kz3sHvwSkkRREI28M1/w== } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } + hasBin: true + run-async@3.0.0: resolution: { integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== } engines: { node: '>=0.12.0' } @@ -3007,6 +2636,9 @@ packages: resolution: { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } engines: { node: '>=8' } + siginfo@2.0.0: + resolution: { integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== } + signal-exit@3.0.7: resolution: { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== } @@ -3014,16 +2646,9 @@ packages: resolution: { integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== } engines: { node: '>=14' } - sisteransi@1.0.5: - resolution: { integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== } - skmeans@0.9.7: resolution: { integrity: sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg== } - slash@3.0.0: - resolution: { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } - engines: { node: '>=8' } - slice-ansi@5.0.0: resolution: { integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== } engines: { node: '>=12' } @@ -3032,8 +2657,9 @@ packages: resolution: { integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== } engines: { node: '>=18' } - source-map-support@0.5.13: - resolution: { integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== } + source-map-js@1.2.1: + resolution: { integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== } + engines: { node: '>=0.10.0' } source-map@0.6.1: resolution: { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== } @@ -3064,30 +2690,29 @@ packages: split@1.0.1: resolution: { integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== } - sprintf-js@1.0.3: - resolution: { integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== } - - stack-utils@2.0.6: - resolution: { integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== } - engines: { node: '>=10' } + stackback@0.0.2: + resolution: { integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== } standard-version@9.5.0: resolution: { integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q== } engines: { node: '>=10' } hasBin: true + std-env@3.8.0: + resolution: { integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== } + string-argv@0.3.2: resolution: { integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== } engines: { node: '>=0.6.19' } - string-length@4.0.2: - resolution: { integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== } - engines: { node: '>=10' } - string-width@4.2.3: resolution: { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } engines: { node: '>=8' } + string-width@5.1.2: + resolution: { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } + engines: { node: '>=12' } + string-width@7.2.0: resolution: { integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== } engines: { node: '>=18' } @@ -3124,14 +2749,6 @@ packages: resolution: { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } engines: { node: '>=4' } - strip-bom@4.0.0: - resolution: { integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== } - engines: { node: '>=8' } - - strip-final-newline@2.0.0: - resolution: { integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== } - engines: { node: '>=6' } - strip-final-newline@3.0.0: resolution: { integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== } engines: { node: '>=12' } @@ -3155,10 +2772,6 @@ packages: resolution: { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } engines: { node: '>=8' } - supports-color@8.1.1: - resolution: { integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== } - engines: { node: '>=10' } - supports-preserve-symlinks-flag@1.0.0: resolution: { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } engines: { node: '>= 0.4' } @@ -3166,10 +2779,6 @@ packages: sweepline-intersections@1.5.0: resolution: { integrity: sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ== } - test-exclude@6.0.0: - resolution: { integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== } - engines: { node: '>=8' } - text-extensions@1.9.0: resolution: { integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== } engines: { node: '>=0.10' } @@ -3187,23 +2796,31 @@ packages: through@2.3.8: resolution: { integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== } - tinyexec@0.3.0: - resolution: { integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg== } + tinybench@2.9.0: + resolution: { integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== } + + tinyexec@0.3.1: + resolution: { integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== } + + tinypool@1.0.2: + resolution: { integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== } + engines: { node: ^18.0.0 || >=20.0.0 } tinyqueue@2.0.3: resolution: { integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== } + tinyrainbow@1.2.0: + resolution: { integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== } + engines: { node: '>=14.0.0' } + + tinyspy@3.0.2: + resolution: { integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== } + engines: { node: '>=14.0.0' } + tmp@0.0.33: resolution: { integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== } engines: { node: '>=0.6.0' } - tmpl@1.0.5: - resolution: { integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== } - - to-fast-properties@2.0.0: - resolution: { integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== } - engines: { node: '>=4' } - to-regex-range@5.0.1: resolution: { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } engines: { node: '>=8.0' } @@ -3226,30 +2843,6 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-jest@29.2.5: - resolution: { integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== } - engines: { node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0 } - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - ts-node@10.9.2: resolution: { integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== } hasBin: true @@ -3264,9 +2857,6 @@ packages: '@swc/wasm': optional: true - tslib@2.7.0: - resolution: { integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== } - tslib@2.8.1: resolution: { integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== } @@ -3279,10 +2869,6 @@ packages: resolution: { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } engines: { node: '>= 0.8.0' } - type-detect@4.0.8: - resolution: { integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== } - engines: { node: '>=4' } - type-fest@0.18.1: resolution: { integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== } engines: { node: '>=10' } @@ -3326,12 +2912,6 @@ packages: resolution: { integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== } engines: { node: '>=18' } - update-browserslist-db@1.1.0: - resolution: { integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== } - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - uri-js@4.4.1: resolution: { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } @@ -3341,15 +2921,69 @@ packages: v8-compile-cache-lib@3.0.1: resolution: { integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== } - v8-to-istanbul@9.3.0: - resolution: { integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== } - engines: { node: '>=10.12.0' } - validate-npm-package-license@3.0.4: resolution: { integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== } - walker@1.0.8: - resolution: { integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== } + vite-node@2.1.8: + resolution: { integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + + vite@5.4.11: + resolution: { integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.1.8: + resolution: { integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true wcwidth@1.0.1: resolution: { integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== } @@ -3359,6 +2993,11 @@ packages: engines: { node: '>= 8' } hasBin: true + why-is-node-running@2.3.0: + resolution: { integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== } + engines: { node: '>=8' } + hasBin: true + wkt-parser@1.4.0: resolution: { integrity: sha512-qpwO7Ihds/YYDTi1aADFTI1Sm9YC/tTe3SHD24EeIlZxy7Ik6a1b4HOz7jAi0xdUAw487duqpo8OGu+Tf4nwlQ== } @@ -3377,17 +3016,14 @@ packages: resolution: { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } engines: { node: '>=10' } + wrap-ansi@8.1.0: + resolution: { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } + engines: { node: '>=12' } + wrap-ansi@9.0.0: resolution: { integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== } engines: { node: '>=18' } - wrappy@1.0.2: - resolution: { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } - - write-file-atomic@4.0.2: - resolution: { integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - xtend@4.0.2: resolution: { integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== } engines: { node: '>=0.4' } @@ -3396,9 +3032,6 @@ packages: resolution: { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } engines: { node: '>=10' } - yallist@3.1.1: - resolution: { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== } - yallist@4.0.0: resolution: { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } @@ -3440,216 +3073,18 @@ packages: engines: { node: '>=18' } snapshots: - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.1.0 - - '@babel/compat-data@7.25.4': {} - - '@babel/core@7.25.2': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.25.6': - dependencies: - '@babel/types': 7.25.6 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/helper-compilation-targets@7.25.2': - dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-module-imports@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.24.8': {} - - '@babel/helper-simple-access@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.24.8': {} - - '@babel/helper-validator-identifier@7.24.7': {} - - '@babel/helper-validator-option@7.24.8': {} - - '@babel/helpers@7.25.6': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - - '@babel/highlight@7.24.7': + '@babel/code-frame@7.26.2': dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 + '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 - picocolors: 1.1.0 - - '@babel/parser@7.25.6': - dependencies: - '@babel/types': 7.25.6 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + picocolors: 1.1.1 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier@7.25.9': {} '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.0': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - - '@babel/traverse@7.25.6': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.25.6': - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@bcoe/v8-coverage@0.2.3': {} - '@commitlint/cli@19.6.1(@types/node@22.10.2)(typescript@5.7.2)': dependencies: '@commitlint/format': 19.5.0 @@ -3657,7 +3092,7 @@ snapshots: '@commitlint/load': 19.6.1(@types/node@22.10.2)(typescript@5.7.2) '@commitlint/read': 19.5.0 '@commitlint/types': 19.5.0 - tinyexec: 0.3.0 + tinyexec: 0.3.1 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -3687,7 +3122,7 @@ snapshots: '@commitlint/format@19.5.0': dependencies: '@commitlint/types': 19.5.0 - chalk: 5.3.0 + chalk: 5.4.0 '@commitlint/is-ignored@19.6.0': dependencies: @@ -3707,7 +3142,7 @@ snapshots: '@commitlint/execute-rule': 19.5.0 '@commitlint/resolve-extends': 19.5.0 '@commitlint/types': 19.5.0 - chalk: 5.3.0 + chalk: 5.4.0 cosmiconfig: 9.0.0(typescript@5.7.2) cosmiconfig-typescript-loader: 6.1.0(@types/node@22.10.2)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2) lodash.isplainobject: 4.0.6 @@ -3731,7 +3166,7 @@ snapshots: '@commitlint/types': 19.5.0 git-raw-commits: 4.0.0 minimist: 1.2.8 - tinyexec: 0.3.0 + tinyexec: 0.3.1 '@commitlint/resolve-extends@19.5.0': dependencies: @@ -3757,82 +3192,151 @@ snapshots: '@commitlint/types@19.5.0': dependencies: - '@types/conventional-commits-parser': 5.0.0 - chalk: 5.3.0 + '@types/conventional-commits-parser': 5.0.1 + chalk: 5.4.0 '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.23.1': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.23.1': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.23.1': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.23.1': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.23.1': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.23.1': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.23.1': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.23.1': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.23.1': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.23.1': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.23.1': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.23.1': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.23.1': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.23.1': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.23.1': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.23.1': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.23.1': optional: true '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.23.1': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.23.1': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.23.1': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.23.1': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.23.1': optional: true @@ -3898,223 +3402,94 @@ snapshots: '@hutson/parse-repository-url@3.0.2': {} - '@inquirer/figures@1.0.8': {} - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} + '@inquirer/figures@1.0.9': {} - '@jest/console@29.7.0': + '@isaacs/cliui@8.0.2': dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node + '@jridgewell/resolve-uri@3.1.2': {} - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - jest-mock: 29.7.0 + '@jridgewell/sourcemap-codec@1.5.0': {} - '@jest/expect-utils@29.7.0': + '@jridgewell/trace-mapping@0.3.9': dependencies: - jest-get-type: 29.6.3 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@jest/expect@29.7.0': + '@nodelib/fs.scandir@2.1.5': dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.10.2 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@nodelib/fs.stat@2.0.5': {} - '@jest/globals@29.7.0': + '@nodelib/fs.walk@1.2.8': dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 - '@jest/reporters@29.7.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.10.2 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color + '@rollup/rollup-android-arm-eabi@4.29.0': + optional: true - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 + '@rollup/rollup-android-arm64@4.29.0': + optional: true - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 + '@rollup/rollup-darwin-arm64@4.29.0': + optional: true - '@jest/test-result@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + '@rollup/rollup-darwin-x64@4.29.0': + optional: true - '@jest/test-sequencer@29.7.0': - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 + '@rollup/rollup-freebsd-arm64@4.29.0': + optional: true - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.25.2 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color + '@rollup/rollup-freebsd-x64@4.29.0': + optional: true - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.10.2 - '@types/yargs': 17.0.33 - chalk: 4.1.2 + '@rollup/rollup-linux-arm-gnueabihf@4.29.0': + optional: true - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@rollup/rollup-linux-arm-musleabihf@4.29.0': + optional: true - '@jridgewell/resolve-uri@3.1.2': {} + '@rollup/rollup-linux-arm64-gnu@4.29.0': + optional: true - '@jridgewell/set-array@1.2.1': {} + '@rollup/rollup-linux-arm64-musl@4.29.0': + optional: true - '@jridgewell/sourcemap-codec@1.5.0': {} + '@rollup/rollup-linux-loongarch64-gnu@4.29.0': + optional: true - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@rollup/rollup-linux-powerpc64le-gnu@4.29.0': + optional: true - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@rollup/rollup-linux-riscv64-gnu@4.29.0': + optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@rollup/rollup-linux-s390x-gnu@4.29.0': + optional: true - '@nodelib/fs.stat@2.0.5': {} + '@rollup/rollup-linux-x64-gnu@4.29.0': + optional: true - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + '@rollup/rollup-linux-x64-musl@4.29.0': + optional: true - '@sinclair/typebox@0.27.8': {} + '@rollup/rollup-win32-arm64-msvc@4.29.0': + optional: true - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 + '@rollup/rollup-win32-ia32-msvc@4.29.0': + optional: true - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 + '@rollup/rollup-win32-x64-msvc@4.29.0': + optional: true '@tsconfig/node10@1.0.11': {} @@ -4547,8 +3922,8 @@ snapshots: '@turf/helpers@7.1.0': dependencies: - '@types/geojson': 7946.0.14 - tslib: 2.7.0 + '@types/geojson': 7946.0.15 + tslib: 2.8.1 '@turf/hex-grid@7.1.0': dependencies: @@ -5224,28 +4599,7 @@ snapshots: d3-voronoi: 1.1.2 tslib: 2.8.1 - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 - - '@types/babel__generator@7.6.8': - dependencies: - '@babel/types': 7.25.6 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - - '@types/babel__traverse@7.20.6': - dependencies: - '@babel/types': 7.25.6 - - '@types/conventional-commits-parser@5.0.0': + '@types/conventional-commits-parser@5.0.1': dependencies: '@types/node': 22.10.2 @@ -5253,7 +4607,13 @@ snapshots: '@types/estree@1.0.6': {} - '@types/geojson@7946.0.14': {} + '@types/flat@5.0.5': {} + + '@types/form-data@2.5.2': + dependencies: + form-data: 4.0.1 + + '@types/geojson@1.0.6': {} '@types/geojson@7946.0.15': {} @@ -5262,30 +4622,11 @@ snapshots: '@types/minimatch': 5.1.2 '@types/node': 22.10.2 - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 22.10.2 - '@types/inquirer@9.0.7': dependencies: '@types/through': 0.0.33 rxjs: 7.8.1 - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - - '@types/jest@29.5.14': - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - '@types/json-schema@7.0.15': {} '@types/minimatch@5.1.2': {} @@ -5300,18 +4641,10 @@ snapshots: '@types/proj4@2.5.5': {} - '@types/stack-utils@2.0.3': {} - '@types/through@0.0.33': dependencies: '@types/node': 22.10.2 - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.33': - dependencies: - '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -5389,6 +4722,46 @@ snapshots: '@typescript-eslint/types': 8.18.1 eslint-visitor-keys: 4.2.0 + '@vitest/expect@2.1.8': + dependencies: + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.2))': + dependencies: + '@vitest/spy': 2.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.11(@types/node@22.10.2) + + '@vitest/pretty-format@2.1.8': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.8': + dependencies: + '@vitest/utils': 2.1.8 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.17 + pathe: 1.1.2 + + '@vitest/spy@2.1.8': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -5400,9 +4773,7 @@ snapshots: acorn-walk@8.3.4: dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} + acorn: 8.14.0 acorn@8.14.0: {} @@ -5418,7 +4789,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.1 + fast-uri: 3.0.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -5442,28 +4813,17 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - - ansi-styles@6.2.1: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 + ansi-styles@6.2.1: {} arg@4.1.3: {} - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - argparse@2.0.1: {} array-ify@1.0.0: {} arrify@1.0.1: {} - async@3.2.6: {} + assertion-error@2.0.1: {} asynckit@0.4.0: {} @@ -5475,66 +4835,11 @@ snapshots: axios@1.7.9: dependencies: follow-redirects: 1.15.9 - form-data: 4.0.0 + form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - babel-jest@29.7.0(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.25.2) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@6.1.1: - dependencies: - '@babel/helper-plugin-utils': 7.24.8 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@29.6.3: - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.6 - - babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) - - babel-preset-jest@29.6.3(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) - balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -5560,21 +4865,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.3: - dependencies: - caniuse-lite: 1.0.30001663 - electron-to-chromium: 1.5.27 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) - - bs-logger@0.2.6: - dependencies: - fast-json-stable-stringify: 2.1.0 - - bser@2.1.1: - dependencies: - node-int64: 0.4.0 - buffer-from@1.1.2: {} buffer@5.7.1: @@ -5582,6 +4872,8 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + cac@6.7.14: {} + callsites@3.1.0: {} camelcase-keys@6.2.2: @@ -5592,9 +4884,13 @@ snapshots: camelcase@5.3.1: {} - camelcase@6.3.0: {} - - caniuse-lite@1.0.30001663: {} + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 chalk@2.4.2: dependencies: @@ -5609,13 +4905,11 @@ snapshots: chalk@5.3.0: {} - char-regex@1.0.2: {} + chalk@5.4.0: {} chardet@0.7.0: {} - ci-info@3.9.0: {} - - cjs-module-lexer@1.4.1: {} + check-error@2.1.1: {} cli-cursor@3.1.0: dependencies: @@ -5648,10 +4942,6 @@ snapshots: clone@1.0.4: {} - co@4.6.0: {} - - collect-v8-coverage@1.0.2: {} - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -5822,8 +5112,6 @@ snapshots: meow: 8.1.2 q: 1.5.1 - convert-source-map@2.0.0: {} - core-util-is@1.0.3: {} cosmiconfig-typescript-loader@6.1.0(@types/node@22.10.2)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2): @@ -5842,21 +5130,6 @@ snapshots: optionalDependencies: typescript: 5.7.2 - create-jest@29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-require@1.1.1: {} cross-spawn@7.0.6: @@ -5900,12 +5173,10 @@ snapshots: decamelize@1.2.0: {} - dedent@1.5.3: {} + deep-eql@5.0.2: {} deep-is@0.1.4: {} - deepmerge@4.3.1: {} - defaults@1.0.4: dependencies: clone: 1.0.4 @@ -5916,8 +5187,6 @@ snapshots: detect-newline@3.1.0: {} - diff-sequences@29.6.3: {} - diff@4.0.2: {} dot-prop@5.3.0: @@ -5933,18 +5202,14 @@ snapshots: earcut@2.2.4: {} - ejs@3.1.10: - dependencies: - jake: 10.9.2 - - electron-to-chromium@1.5.27: {} - - emittery@0.13.1: {} + eastasianwidth@0.2.0: {} emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + env-paths@2.2.1: {} environment@1.1.0: {} @@ -5953,6 +5218,34 @@ snapshots: dependencies: is-arrayish: 0.2.1 + es-module-lexer@1.5.4: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.23.1: optionalDependencies: '@esbuild/aix-ppc64': 0.23.1 @@ -5984,25 +5277,12 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)): dependencies: eslint: 9.17.0(jiti@2.4.2) - eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(jest@29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)))(typescript@5.7.2): - dependencies: - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) - eslint: 9.17.0(jiti@2.4.2) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) - jest: 29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - transitivePeerDependencies: - - supports-color - - typescript - eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 @@ -6059,8 +5339,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 - esprima@4.0.1: {} - esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -6071,22 +5349,14 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + esutils@2.0.3: {} eventemitter3@5.0.1: {} - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -6099,15 +5369,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - exit@0.1.2: {} - - expect@29.7.0: - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + expect-type@1.1.0: {} external-editor@3.1.0: dependencies: @@ -6129,16 +5391,12 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.0.1: {} + fast-uri@3.0.3: {} fastq@1.17.1: dependencies: reusify: 1.0.4 - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -6147,10 +5405,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -6190,14 +5444,17 @@ snapshots: follow-redirects@1.15.9: {} - form-data@4.0.0: + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -6210,8 +5467,6 @@ snapshots: string.fromcodepoint: 0.2.1 string.prototype.codepointat: 0.2.1 - gensync@1.0.0-beta.2: {} - geojson-equality-ts@1.0.2: dependencies: '@types/geojson': 7946.0.15 @@ -6222,9 +5477,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.2.0: {} - - get-package-type@0.1.0: {} + get-east-asian-width@1.3.0: {} get-pkg-repo@4.2.1: dependencies: @@ -6233,8 +5486,6 @@ snapshots: through2: 2.0.5 yargs: 16.2.0 - get-stream@6.0.1: {} - get-stream@8.0.1: {} get-tsconfig@4.8.1: @@ -6277,29 +5528,19 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@8.1.0: + glob@11.0.0: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 global-directory@4.0.1: dependencies: ini: 4.1.1 - globals@11.12.0: {} - globals@14.0.0: {} globals@15.14.0: {} @@ -6329,506 +5570,128 @@ snapshots: heap@0.2.7: {} - hosted-git-info@2.8.9: {} - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - - html-escaper@2.0.2: {} - - human-signals@2.1.0: {} - - human-signals@5.0.0: {} - - husky@9.1.7: {} - - i18next-browser-languagedetector@6.1.8: - dependencies: - '@babel/runtime': 7.26.0 - - i18next@21.10.0: - dependencies: - '@babel/runtime': 7.26.0 - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - ieee754@1.2.1: {} - - ignore@5.3.2: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-local@3.2.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - - import-meta-resolve@4.1.0: {} - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ini@1.3.8: {} - - ini@4.1.1: {} - - inquirer@9.3.7: - dependencies: - '@inquirer/figures': 1.0.8 - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - external-editor: 3.1.0 - mute-stream: 1.0.0 - ora: 5.4.1 - run-async: 3.0.0 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 - - is-arrayish@0.2.1: {} - - is-core-module@2.15.1: - dependencies: - hasown: 2.0.2 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-fullwidth-code-point@4.0.0: {} - - is-fullwidth-code-point@5.0.0: - dependencies: - get-east-asian-width: 1.2.0 - - is-generator-fn@2.1.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-interactive@1.0.0: {} - - is-number@7.0.0: {} - - is-obj@2.0.0: {} - - is-plain-obj@1.1.0: {} - - is-retry-allowed@2.2.0: {} - - is-stream@2.0.1: {} - - is-stream@3.0.0: {} - - is-text-path@1.0.1: - dependencies: - text-extensions: 1.9.0 - - is-text-path@2.0.0: - dependencies: - text-extensions: 2.4.0 - - is-unicode-supported@0.1.0: {} - - is-utf8@0.2.1: {} - - isarray@1.0.0: {} - - isexe@2.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.25.2 - '@babel/parser': 7.25.6 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.25.2 - '@babel/parser': 7.25.6 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@4.0.1: - dependencies: - debug: 4.4.0 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - jake@10.9.2: - dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - - jest-changed-files@29.7.0: - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - - jest-circus@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.3 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.1.0 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-cli@29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-config@29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)): - dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.10.2 - ts-node: 10.9.2(@types/node@22.10.2)(typescript@5.7.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-docblock@29.7.0: - dependencies: - detect-newline: 3.1.0 + hosted-git-info@2.8.9: {} - jest-each@29.7.0: + hosted-git-info@4.1.0: dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 + lru-cache: 6.0.0 - jest-environment-node@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - jest-mock: 29.7.0 - jest-util: 29.7.0 + human-signals@5.0.0: {} - jest-get-type@29.6.3: {} + husky@9.1.7: {} - jest-haste-map@29.7.0: + i18next-browser-languagedetector@6.1.8: dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 22.10.2 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 + '@babel/runtime': 7.26.0 - jest-leak-detector@29.7.0: + i18next@21.10.0: dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + '@babel/runtime': 7.26.0 - jest-matcher-utils@29.7.0: + iconv-lite@0.4.24: dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + safer-buffer: 2.1.2 - jest-message-util@29.7.0: + iconv-lite@0.6.3: dependencies: - '@babel/code-frame': 7.24.7 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} - jest-mock@29.7.0: + import-fresh@3.3.0: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - jest-util: 29.7.0 + parent-module: 1.0.1 + resolve-from: 4.0.0 - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: - jest-resolve: 29.7.0 + import-meta-resolve@4.1.0: {} - jest-regex-util@29.6.3: {} + imurmurhash@0.1.4: {} - jest-resolve-dependencies@29.7.0: - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color + indent-string@4.0.0: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.1: {} - jest-resolve@29.7.0: + inquirer@9.3.7: dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 - slash: 3.0.0 - - jest-runner@29.7.0: - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color + '@inquirer/figures': 1.0.9 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + external-editor: 3.1.0 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 - jest-runtime@29.7.0: + is-arrayish@0.2.1: {} + + is-core-module@2.16.0: dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - chalk: 4.1.2 - cjs-module-lexer: 1.4.1 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color + hasown: 2.0.2 - jest-snapshot@29.7.0: - dependencies: - '@babel/core': 7.25.2 - '@babel/generator': 7.25.6 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) - '@babel/types': 7.25.6 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} - jest-util@29.7.0: + is-fullwidth-code-point@5.0.0: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 + get-east-asian-width: 1.3.0 - jest-validate@29.7.0: + is-glob@4.0.3: dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 + is-extglob: 2.1.1 + + is-interactive@1.0.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-plain-obj@1.1.0: {} + + is-retry-allowed@2.2.0: {} + + is-stream@3.0.0: {} - jest-watcher@29.7.0: + is-text-path@1.0.1: dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.10.2 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 + text-extensions: 1.9.0 - jest-worker@29.7.0: + is-text-path@2.0.0: dependencies: - '@types/node': 22.10.2 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 + text-extensions: 2.4.0 + + is-unicode-supported@0.1.0: {} + + is-utf8@0.2.1: {} - jest@29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)): + isarray@1.0.0: {} + + isexe@2.0.0: {} + + jackspeak@4.0.2: dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node + '@isaacs/cliui': 8.0.2 jiti@2.4.2: {} js-tokens@4.0.0: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsesc@2.5.2: {} - json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} @@ -6843,8 +5706,6 @@ snapshots: json-stringify-safe@5.0.1: {} - json5@2.2.3: {} - jsonparse@1.3.1: {} jsts@2.7.1: {} @@ -6855,10 +5716,6 @@ snapshots: kind-of@6.0.3: {} - kleur@3.0.3: {} - - leven@3.1.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -6929,8 +5786,6 @@ snapshots: lodash.kebabcase@4.1.1: {} - lodash.memoize@4.1.2: {} - lodash.merge@4.6.2: {} lodash.mergewith@4.6.2: {} @@ -6958,24 +5813,20 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 + loupe@3.1.2: {} + + lru-cache@11.0.2: {} lru-cache@6.0.0: dependencies: yallist: 4.0.0 - make-dir@4.0.0: + magic-string@0.30.17: dependencies: - semver: 7.6.3 + '@jridgewell/sourcemap-codec': 1.5.0 make-error@1.3.6: {} - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - map-obj@1.0.1: {} map-obj@4.3.0: {} @@ -7023,13 +5874,13 @@ snapshots: min-indent@1.0.1: {} - minimatch@3.1.2: + minimatch@10.0.1: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 2.0.1 - minimatch@5.1.6: + minimatch@3.1.2: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.11 minimatch@9.0.5: dependencies: @@ -7043,48 +5894,38 @@ snapshots: minimist@1.2.8: {} + minipass@7.1.2: {} + modify-values@1.0.1: {} ms@2.1.3: {} mute-stream@1.0.0: {} + nanoid@3.3.8: {} + natural-compare@1.4.0: {} neo-async@2.6.2: {} - node-int64@0.4.0: {} - - node-releases@2.0.18: {} - normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.10 semver: 5.7.2 validate-npm-package-license: 3.0.4 normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.15.1 + is-core-module: 2.16.0 semver: 7.6.3 validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - once@1.4.0: - dependencies: - wrappy: 1.0.2 - onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -7166,6 +6007,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -7177,7 +6020,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -7188,19 +6031,26 @@ snapshots: path-exists@5.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-key@4.0.0: {} path-parse@1.0.7: {} + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + path-type@3.0.0: dependencies: pify: 3.0.0 - picocolors@1.1.0: {} + pathe@1.1.2: {} + + pathval@2.0.0: {} + + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -7210,12 +6060,6 @@ snapshots: pify@3.0.0: {} - pirates@4.0.6: {} - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - point-in-polygon-hao@1.2.3: dependencies: robust-predicates: 3.0.2 @@ -7227,16 +6071,16 @@ snapshots: robust-predicates: 3.0.2 splaytree: 3.1.2 + postcss@8.4.49: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier@3.4.2: {} - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - process-nextick-args@2.0.1: {} proj4@2.15.0: @@ -7244,17 +6088,10 @@ snapshots: mgrs: 1.0.0 wkt-parser: 1.4.0 - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - proxy-from-env@1.1.0: {} punycode@2.3.1: {} - pure-rand@6.1.0: {} - q@1.5.1: {} queue-microtask@1.2.3: {} @@ -7273,8 +6110,6 @@ snapshots: dependencies: quickselect: 2.0.0 - react-is@18.3.1: {} - read-pkg-up@3.0.0: dependencies: find-up: 2.1.0 @@ -7326,21 +6161,15 @@ snapshots: require-from-string@2.0.2: {} - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 - resolve-from@4.0.0: {} resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} - resolve.exports@2.0.2: {} - - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -7362,6 +6191,31 @@ snapshots: robust-predicates@3.0.2: {} + rollup@4.29.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.29.0 + '@rollup/rollup-android-arm64': 4.29.0 + '@rollup/rollup-darwin-arm64': 4.29.0 + '@rollup/rollup-darwin-x64': 4.29.0 + '@rollup/rollup-freebsd-arm64': 4.29.0 + '@rollup/rollup-freebsd-x64': 4.29.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.29.0 + '@rollup/rollup-linux-arm-musleabihf': 4.29.0 + '@rollup/rollup-linux-arm64-gnu': 4.29.0 + '@rollup/rollup-linux-arm64-musl': 4.29.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.29.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.29.0 + '@rollup/rollup-linux-riscv64-gnu': 4.29.0 + '@rollup/rollup-linux-s390x-gnu': 4.29.0 + '@rollup/rollup-linux-x64-gnu': 4.29.0 + '@rollup/rollup-linux-x64-musl': 4.29.0 + '@rollup/rollup-win32-arm64-msvc': 4.29.0 + '@rollup/rollup-win32-ia32-msvc': 4.29.0 + '@rollup/rollup-win32-x64-msvc': 4.29.0 + fsevents: 2.3.3 + run-async@3.0.0: {} run-parallel@1.2.0: @@ -7392,16 +6246,14 @@ snapshots: shebang-regex@3.0.0: {} + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} - sisteransi@1.0.5: {} - skmeans@0.9.7: {} - slash@3.0.0: {} - slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -7412,10 +6264,7 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 + source-map-js@1.2.1: {} source-map@0.6.1: {} @@ -7445,11 +6294,7 @@ snapshots: dependencies: through: 2.3.8 - sprintf-js@1.0.3: {} - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 + stackback@0.0.2: {} standard-version@9.5.0: dependencies: @@ -7468,12 +6313,9 @@ snapshots: stringify-package: 1.0.1 yargs: 16.2.0 - string-argv@0.3.2: {} + std-env@3.8.0: {} - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 + string-argv@0.3.2: {} string-width@4.2.3: dependencies: @@ -7481,10 +6323,16 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + string-width@7.2.0: dependencies: emoji-regex: 10.4.0 - get-east-asian-width: 1.2.0 + get-east-asian-width: 1.3.0 strip-ansi: 7.1.0 string.fromcodepoint@0.2.1: {} @@ -7515,10 +6363,6 @@ snapshots: strip-bom@3.0.0: {} - strip-bom@4.0.0: {} - - strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} strip-indent@3.0.0: @@ -7537,22 +6381,12 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} sweepline-intersections@1.5.0: dependencies: tinyqueue: 2.0.3 - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - text-extensions@1.9.0: {} text-extensions@2.4.0: {} @@ -7568,18 +6402,22 @@ snapshots: through@2.3.8: {} - tinyexec@0.3.0: {} + tinybench@2.9.0: {} + + tinyexec@0.3.1: {} + + tinypool@1.0.2: {} tinyqueue@2.0.3: {} + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - tmpl@1.0.5: {} - - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -7598,25 +6436,6 @@ snapshots: dependencies: typescript: 5.7.2 - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)))(typescript@5.7.2): - dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.10.2)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.25.2 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -7625,7 +6444,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 22.10.2 - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -7635,8 +6454,6 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tslib@2.7.0: {} - tslib@2.8.1: {} tsx@4.19.2: @@ -7650,8 +6467,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.18.1: {} type-fest@0.21.3: {} @@ -7681,12 +6496,6 @@ snapshots: unicorn-magic@0.1.0: {} - update-browserslist-db@1.1.0(browserslist@4.23.3): - dependencies: - browserslist: 4.23.3 - escalade: 3.2.0 - picocolors: 1.1.0 - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -7695,20 +6504,72 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - walker@1.0.8: + vite-node@2.1.8(@types/node@22.10.2): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.5.4 + pathe: 1.1.2 + vite: 5.4.11(@types/node@22.10.2) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.11(@types/node@22.10.2): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.29.0 + optionalDependencies: + '@types/node': 22.10.2 + fsevents: 2.3.3 + + vitest@2.1.8(@types/node@22.10.2): dependencies: - makeerror: 1.0.12 + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.2)) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.11(@types/node@22.10.2) + vite-node: 2.1.8(@types/node@22.10.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.10.2 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser wcwidth@1.0.1: dependencies: @@ -7718,6 +6579,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wkt-parser@1.4.0: {} word-wrap@1.2.5: {} @@ -7736,25 +6602,22 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@9.0.0: + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 - string-width: 7.2.0 + string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} - - write-file-atomic@4.0.2: + wrap-ansi@9.0.0: dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 xtend@4.0.2: {} y18n@5.0.8: {} - yallist@3.1.1: {} - yallist@4.0.0: {} yaml@2.6.1: {} diff --git a/src/common/data-inclusion/file-name/data-inclusion.file-name.spec.ts b/src/common/data-inclusion/file-name/data-inclusion.file-name.spec.ts index e9772036..e15d22b6 100644 --- a/src/common/data-inclusion/file-name/data-inclusion.file-name.spec.ts +++ b/src/common/data-inclusion/file-name/data-inclusion.file-name.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { dataInclusionFileName } from './data-inclusion.file-name'; describe('data inclusion file name', (): void => { diff --git a/src/common/mediation-numerique/file-name/mediation-numerique.file-name.spec.ts b/src/common/mediation-numerique/file-name/mediation-numerique.file-name.spec.ts index 4710bc36..0152f4e6 100644 --- a/src/common/mediation-numerique/file-name/mediation-numerique.file-name.spec.ts +++ b/src/common/mediation-numerique/file-name/mediation-numerique.file-name.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { mediationNumeriqueFileName } from './mediation-numerique.file-name'; describe('mediation numérique file name', (): void => { diff --git a/src/common/mediation-numerique/to-csv/mediation-numerique.to-csv.spec.ts b/src/common/mediation-numerique/to-csv/mediation-numerique.to-csv.spec.ts index cafb442e..27f759b6 100644 --- a/src/common/mediation-numerique/to-csv/mediation-numerique.to-csv.spec.ts +++ b/src/common/mediation-numerique/to-csv/mediation-numerique.to-csv.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { DispositifProgrammeNational, FormationLabel, diff --git a/src/common/mediation-numerique/to-csv/mediation-numerique.to-csv.ts b/src/common/mediation-numerique/to-csv/mediation-numerique.to-csv.ts index 1dc78a7e..e15f4b4f 100644 --- a/src/common/mediation-numerique/to-csv/mediation-numerique.to-csv.ts +++ b/src/common/mediation-numerique/to-csv/mediation-numerique.to-csv.ts @@ -40,32 +40,32 @@ const toDoubleQuoted = (header?: string): string => (header == null ? '' : `"${h const fieldsArrayFrom = (lieuMediationNumerique: SchemaLieuMediationNumerique): (string | undefined)[] => [ lieuMediationNumerique.id, lieuMediationNumerique.pivot, - lieuMediationNumerique.nom.replace(/"/gu, '').replace(/\n/gu, ''), + lieuMediationNumerique.nom.replace(/"/g, '').replace(/\n/g, ''), lieuMediationNumerique.commune, lieuMediationNumerique.code_postal, lieuMediationNumerique.code_insee, - lieuMediationNumerique.adresse.replace(/"/gu, '').replace(/\n/gu, '').replace(/\s$/gu, '').replace(/\s+/gu, ' '), - lieuMediationNumerique.complement_adresse?.replace(/"/gu, '').replace(/\n/gu, '').replace(/\s$/gu, '').replace(/\s+/gu, ' '), + lieuMediationNumerique.adresse.replace(/"/g, '').replace(/\n/g, '').replace(/\s$/g, '').replace(/\s+/g, ' '), + lieuMediationNumerique.complement_adresse?.replace(/"/g, '').replace(/\n/g, '').replace(/\s$/g, '').replace(/\s+/g, ' '), lieuMediationNumerique.latitude?.toString(), lieuMediationNumerique.longitude?.toString(), lieuMediationNumerique.typologie, lieuMediationNumerique.telephone, lieuMediationNumerique.courriels, lieuMediationNumerique.site_web, - lieuMediationNumerique.horaires?.replace(/"/gu, '').replace(/\n/gu, ''), - lieuMediationNumerique.presentation_resume?.replace(/"/gu, '"').replace(/\n/gu, ''), - lieuMediationNumerique.presentation_detail?.replace(/"/gu, '"').replace(/\n/gu, ''), + lieuMediationNumerique.horaires?.replace(/"/g, '').replace(/\n/g, ''), + lieuMediationNumerique.presentation_resume?.replace(/"/g, '"').replace(/\n/g, ''), + lieuMediationNumerique.presentation_detail?.replace(/"/g, '"').replace(/\n/g, ''), lieuMediationNumerique.source, lieuMediationNumerique.itinerance, lieuMediationNumerique.structure_parente, lieuMediationNumerique.date_maj, - lieuMediationNumerique.services?.replace(/"/gu, '"').replace(/\n/gu, ''), + lieuMediationNumerique.services?.replace(/"/g, '"').replace(/\n/g, ''), lieuMediationNumerique.publics_specifiquement_adresses, lieuMediationNumerique.prise_en_charge_specifique, lieuMediationNumerique.frais_a_charge, lieuMediationNumerique.dispositif_programmes_nationaux, lieuMediationNumerique.formations_labels, - lieuMediationNumerique.autres_formations_labels?.replace(/"/gu, '"').replace(/\n/gu, ''), + lieuMediationNumerique.autres_formations_labels?.replace(/"/g, '"').replace(/\n/g, ''), lieuMediationNumerique.modalites_acces, lieuMediationNumerique.modalites_accompagnement, lieuMediationNumerique.fiche_acces_libre, diff --git a/src/common/publish-metadata/generate-publish-metadata/generate-publish-metadata.spec.ts b/src/common/publish-metadata/generate-publish-metadata/generate-publish-metadata.spec.ts index 2c21cd40..f8fe3377 100644 --- a/src/common/publish-metadata/generate-publish-metadata/generate-publish-metadata.spec.ts +++ b/src/common/publish-metadata/generate-publish-metadata/generate-publish-metadata.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { LieuMediationNumerique } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { Output } from '../../output-file'; import { generatePublishMetadata, PublishMetadata } from './generate-publish-metadata'; diff --git a/src/common/publish-metadata/generate-publish-metadata/generate-publish-metadata.ts b/src/common/publish-metadata/generate-publish-metadata/generate-publish-metadata.ts index 1d014e96..ba116114 100644 --- a/src/common/publish-metadata/generate-publish-metadata/generate-publish-metadata.ts +++ b/src/common/publish-metadata/generate-publish-metadata/generate-publish-metadata.ts @@ -28,8 +28,8 @@ const DATASET_TAGS: string[] = [ const mendumJsonRessource = (output: Output, date: Date, suffix?: string): PublishRessource => ({ source: `${output.path}/${mediationNumeriqueFileName( date, - output.name.toLowerCase().replace(/\s/gu, '-'), - output.territoire.toLowerCase().replace(/\s/gu, '-'), + output.name.toLowerCase().replace(/\s/g, '-'), + output.territoire.toLowerCase().replace(/\s/g, '-'), 'csv', suffix )}`, @@ -40,8 +40,8 @@ const mendumJsonRessource = (output: Output, date: Date, suffix?: string): Publi const mendumCsvRessource = (output: Output, date: Date, suffix?: string): PublishRessource => ({ source: `${output.path}/${mediationNumeriqueFileName( date, - output.name.toLowerCase().replace(/\s/gu, '-'), - output.territoire.toLowerCase().replace(/\s/gu, '-'), + output.name.toLowerCase().replace(/\s/g, '-'), + output.territoire.toLowerCase().replace(/\s/g, '-'), 'json', suffix )}`, @@ -52,7 +52,7 @@ const mendumCsvRessource = (output: Output, date: Date, suffix?: string): Publis const dataInclusionServicesRessource = (output: Output, date: Date, suffix?: string): PublishRessource => ({ source: `${output.path}/${dataInclusionFileName( date, - output.name.toLowerCase().replace(/\s/gu, '-'), + output.name.toLowerCase().replace(/\s/g, '-'), 'services', 'json', suffix @@ -64,7 +64,7 @@ const dataInclusionServicesRessource = (output: Output, date: Date, suffix?: str const dataInclusionStructuresRessource = (output: Output, date: Date, suffix?: string): PublishRessource => ({ source: `${output.path}/${dataInclusionFileName( date, - output.name.toLowerCase().replace(/\s/gu, '-'), + output.name.toLowerCase().replace(/\s/g, '-'), 'structures', 'json', suffix diff --git a/src/data-inclusion/cli/action/data-inclusion.action.ts b/src/data-inclusion/cli/action/data-inclusion.action.ts index afaa43b8..bf4eae13 100644 --- a/src/data-inclusion/cli/action/data-inclusion.action.ts +++ b/src/data-inclusion/cli/action/data-inclusion.action.ts @@ -39,12 +39,12 @@ const fetchFromDataInclusionApi = async ({ key, url }: Api): Promise => export const dataInclusionAction = async (dataInclusionOptions: DataInclusionOptions): Promise => { const responseStructures: SchemaStructureDataInclusion[] = await fetchFromDataInclusionApi({ key: dataInclusionOptions.dataInclusionApiKey, - url: 'https://api.data.inclusion.beta.gouv.fr/api/v0/structures?sources=dora' + url: `https://api.data.inclusion.beta.gouv.fr/api/v0/structures?sources=${dataInclusionOptions.filter}` }); const responseServices: SchemaServiceDataInclusion[] = await fetchFromDataInclusionApi({ key: dataInclusionOptions.dataInclusionApiKey, - url: 'https://api.data.inclusion.beta.gouv.fr/api/v0/services?sources=dora' + url: `https://api.data.inclusion.beta.gouv.fr/api/v0/services?sources=${dataInclusionOptions.filter}` }); fs.writeFileSync( diff --git a/src/data-inclusion/fields/adresse/adresse.field.spec.ts b/src/data-inclusion/fields/adresse/adresse.field.spec.ts index d00f30cc..f8724f6c 100644 --- a/src/data-inclusion/fields/adresse/adresse.field.spec.ts +++ b/src/data-inclusion/fields/adresse/adresse.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { processCommune, processVoie } from './adresse.field'; describe('adresse field', (): void => { diff --git a/src/data-inclusion/merge-services-in-structure.spec.ts b/src/data-inclusion/merge-services-in-structure.spec.ts index 734fe3cd..946ac21b 100644 --- a/src/data-inclusion/merge-services-in-structure.spec.ts +++ b/src/data-inclusion/merge-services-in-structure.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { SchemaServiceDataInclusion, SchemaStructureDataInclusion, diff --git a/src/dedupliquer/cli/action/deduplication-comparisons-to-csv/deduplication-comparisons-to-csv.spec.ts b/src/dedupliquer/cli/action/deduplication-comparisons-to-csv/deduplication-comparisons-to-csv.spec.ts index f09ad804..09792439 100644 --- a/src/dedupliquer/cli/action/deduplication-comparisons-to-csv/deduplication-comparisons-to-csv.spec.ts +++ b/src/dedupliquer/cli/action/deduplication-comparisons-to-csv/deduplication-comparisons-to-csv.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { SchemaLieuMediationNumerique, Typologie } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { duplicationComparisons } from '../../../steps'; import { formatToCSV } from './deduplication-comparisons-to-csv'; @@ -10,17 +11,19 @@ describe('deduplication comparison to csv', (): void => { nom: 'Numerinaute', adresse: '12 Rue Joseph Rey ; chez Aconit', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.186115, longitude: 5.716962, source: 'res-in', - typologie: Typologie.TIERS_LIEUX + typologie: Typologie.ESS } as SchemaLieuMediationNumerique, { id: '537-mediation-numerique-hinaura', nom: 'La Turbine.Coop', adresse: '5 esplanade Andry Farcy', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.187654, longitude: 5.704953, @@ -32,7 +35,7 @@ describe('deduplication comparison to csv', (): void => { const duplicationComparisonCSV: string = formatToCSV(duplicationComparisons(lieux, false)); expect(duplicationComparisonCSV).toBe( - 'Score;Typologie 1;Typologie 2;Score Nom;Nom 1;Nom 2;Score Adresse;Adresse 1;Adresse 2;Score Distance;Localisation 1;Localisation 2;Source 1;Source 2\n27;TIERS_LIEUX;ESS;38;Numerinaute;La Turbine.Coop;38;12 Rue Joseph Rey chez Aconit 38000 Grenoble;5 esplanade Andry Farcy 38000 Grenoble;7;45.186115 : 5.716962;45.187654 : 5.704953;res-in;hinaura' + 'Score;Typologie 1;Typologie 2;Score Nom;Nom 1;Nom 2;Score Adresse;Adresse 1;Adresse 2;Score Distance;Localisation 1;Localisation 2;Source 1;Source 2\n27;ESS;ESS;38;Numerinaute;La Turbine.Coop;38;12 Rue Joseph Rey chez Aconit 38000 Grenoble;5 esplanade Andry Farcy 38000 Grenoble;7;45.186115 : 5.716962;45.187654 : 5.704953;res-in;hinaura' ); }); @@ -43,29 +46,31 @@ describe('deduplication comparison to csv', (): void => { nom: 'Numerinaute', adresse: '12 Rue Joseph Rey ; chez Aconit', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.186115, longitude: 5.716962, source: 'res-in', - typologie: Typologie.TIERS_LIEUX + typologie: Typologie.ESS } as SchemaLieuMediationNumerique, { id: '537-mediation-numerique-hinaura', nom: 'La Turbine.Coop', adresse: '5 esplanade Andry Farcy', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.187654, longitude: 5.704953, source: 'hinaura', - typologie: `${Typologie.ESS};${Typologie.CAF}` + typologie: [Typologie.ESS, Typologie.CAF, Typologie.TIERS_LIEUX].join('|') } as SchemaLieuMediationNumerique ]; const duplicationComparisonCSV: string = formatToCSV(duplicationComparisons(lieux, false)); expect(duplicationComparisonCSV).toBe( - 'Score;Typologie 1;Typologie 2;Score Nom;Nom 1;Nom 2;Score Adresse;Adresse 1;Adresse 2;Score Distance;Localisation 1;Localisation 2;Source 1;Source 2\n27;TIERS_LIEUX;ESS,CAF;38;Numerinaute;La Turbine.Coop;38;12 Rue Joseph Rey chez Aconit 38000 Grenoble;5 esplanade Andry Farcy 38000 Grenoble;7;45.186115 : 5.716962;45.187654 : 5.704953;res-in;hinaura' + 'Score;Typologie 1;Typologie 2;Score Nom;Nom 1;Nom 2;Score Adresse;Adresse 1;Adresse 2;Score Distance;Localisation 1;Localisation 2;Source 1;Source 2\n27;ESS;ESS,CAF,TIERS_LIEUX;38;Numerinaute;La Turbine.Coop;38;12 Rue Joseph Rey chez Aconit 38000 Grenoble;5 esplanade Andry Farcy 38000 Grenoble;7;45.186115 : 5.716962;45.187654 : 5.704953;res-in;hinaura' ); }); }); diff --git a/src/dedupliquer/cli/action/deduplication-comparisons-to-csv/deduplication-comparisons-to-csv.ts b/src/dedupliquer/cli/action/deduplication-comparisons-to-csv/deduplication-comparisons-to-csv.ts index 8a7e74fe..cd6fc484 100644 --- a/src/dedupliquer/cli/action/deduplication-comparisons-to-csv/deduplication-comparisons-to-csv.ts +++ b/src/dedupliquer/cli/action/deduplication-comparisons-to-csv/deduplication-comparisons-to-csv.ts @@ -20,14 +20,14 @@ const DUPLICATION_COMPARISON_HEADINGS: string = [ const duplicationComparisonLineFor = (duplicationComparison: DuplicationComparison): string => [ duplicationComparison.score, - duplicationComparison.typologie1?.replace(';', ','), - duplicationComparison.typologie2?.replace(';', ','), + duplicationComparison.typologie1?.replace(/\|/g, ','), + duplicationComparison.typologie2?.replace(/\|/g, ','), duplicationComparison.nomScore, - duplicationComparison.nom1.replace(';', ''), - duplicationComparison.nom2.replace(';', ''), + duplicationComparison.nom1.replace(/;/g, ''), + duplicationComparison.nom2.replace(/;/g, ''), duplicationComparison.adresseScore, - duplicationComparison.adresse1.replace(';', ''), - duplicationComparison.adresse2.replace(';', ''), + duplicationComparison.adresse1.replace(/;/g, ''), + duplicationComparison.adresse2.replace(/;/g, ''), duplicationComparison.distanceScore, duplicationComparison.localisation1, duplicationComparison.localisation2, diff --git a/src/dedupliquer/cli/action/deduplication.repository.ts b/src/dedupliquer/cli/action/deduplication.repository.ts index 10ae87d4..545b743d 100644 --- a/src/dedupliquer/cli/action/deduplication.repository.ts +++ b/src/dedupliquer/cli/action/deduplication.repository.ts @@ -1,6 +1,6 @@ import { SchemaLieuMediationNumerique } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { saveInFiles, saveWithApi } from '../data'; -import { Groups, MergedLieuxByGroupMap } from '../../steps'; +import { DuplicationComparison, Groups, MergedLieuxByGroupMap } from '../../steps'; import { DeduplicationRepository } from '../../repositories'; import { DedupliquerOptions } from '../dedupliquer-options'; @@ -8,10 +8,11 @@ export const deduplicationRepository = (dedupliquerOptions: DedupliquerOptions): save: async ( groups: Groups, merged: MergedLieuxByGroupMap, - lieuxToDeduplicate: SchemaLieuMediationNumerique[] = [] + lieuxToDeduplicate: SchemaLieuMediationNumerique[] = [], + duplications: DuplicationComparison[] = [] ): Promise => { if (dedupliquerOptions.cartographieNationaleApiKey == null) { - saveInFiles(dedupliquerOptions)(lieuxToDeduplicate, groups, merged); + saveInFiles(dedupliquerOptions)(lieuxToDeduplicate, groups, merged, duplications); } else { await saveWithApi(dedupliquerOptions)(groups, merged); } diff --git a/src/dedupliquer/cli/action/dedupliquer.action.ts b/src/dedupliquer/cli/action/dedupliquer.action.ts index 8b9c2dbb..e38f426a 100644 --- a/src/dedupliquer/cli/action/dedupliquer.action.ts +++ b/src/dedupliquer/cli/action/dedupliquer.action.ts @@ -1,5 +1,6 @@ import * as fs from 'node:fs'; import { parse } from 'csv-parse/sync'; +import { glob } from 'glob'; import { SchemaLieuMediationNumerique } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { paginate } from '../../../common'; import { DeduplicationRepository } from '../../repositories'; @@ -45,11 +46,11 @@ const DATA_TYPES: DataType[] = [ }, { selector: (source: string): boolean => source.endsWith('.json'), - loader: (source: string): SchemaLieuMediationNumerique[] => readJsonFile(source) + loader: (source: string): SchemaLieuMediationNumerique[] => readJsonFile(glob.sync(source).at(0) ?? source) }, { selector: (source: string): boolean => source.endsWith('.csv'), - loader: (source: string): SchemaLieuMediationNumerique[] => readCsvFile(source) + loader: (source: string): SchemaLieuMediationNumerique[] => readCsvFile(glob.sync(source).at(0) ?? source) } ]; @@ -71,15 +72,17 @@ export const dedupliquerAction = async (dedupliquerOptions: DedupliquerOptions): const allLieuxWithDuplicates: SchemaLieuMediationNumerique[] = await loadData(dedupliquerOptions.baseSource); const lieuxToDeduplicate: SchemaLieuMediationNumerique[] = await loadData(dedupliquerOptions.source); - console.log('2. recherche des doublons'); - const duplicationComparisonsToGroup: DuplicationComparison[] = duplicationComparisons( + console.log(`2. recherche des doublons parmi les ${allLieuxWithDuplicates.length} lieux`); + const duplications: DuplicationComparison[] = duplicationComparisons( allLieuxWithDuplicates, dedupliquerOptions.allowInternal, lieuxToDeduplicate - ).filter(onlyMoreThanDuplicationScoreThreshold(dedupliquerOptions.allowInternal)); + ); - console.log('3. groupement des doublons'); - const groups: Groups = groupDuplicates(duplicationComparisonsToGroup); + const filteredDuplications = duplications.filter(onlyMoreThanDuplicationScoreThreshold(dedupliquerOptions.allowInternal)); + + console.log(`3. groupement des doublons selon les ${filteredDuplications.length} groupes identifiés`); + const groups: Groups = groupDuplicates(filteredDuplications); console.log('4. fusion des doublons'); const merged: MergedLieuxByGroupMap = mergeDuplicates(new Date())(allLieuxWithDuplicates, groups); @@ -87,7 +90,7 @@ export const dedupliquerAction = async (dedupliquerOptions: DedupliquerOptions): console.log('- lieux fusionnés à enregistrer :', merged.size); console.log('5. sauvegarde des données dédupliquées'); - await repository.save(groups, merged, allLieuxWithDuplicates); + await repository.save(groups, merged, allLieuxWithDuplicates, duplications); } catch (error) { console.log(error); } diff --git a/src/dedupliquer/cli/data/save/save-in-files.ts b/src/dedupliquer/cli/data/save/save-in-files.ts index 6827bf32..b30edb13 100644 --- a/src/dedupliquer/cli/data/save/save-in-files.ts +++ b/src/dedupliquer/cli/data/save/save-in-files.ts @@ -13,7 +13,7 @@ import { writeServicesDataInclusionJsonOutput, writeStructuresDataInclusionJsonOutput } from '../../../../common'; -import { duplicationComparisons, Groups, MergedLieuxByGroupMap, removeMerged } from '../../../steps'; +import { DuplicationComparison, Groups, MergedLieuxByGroupMap, removeMerged } from '../../../steps'; import { formatToCSV } from '../../action/deduplication-comparisons-to-csv'; import { DedupliquerOptions } from '../../dedupliquer-options'; @@ -32,7 +32,12 @@ const writeOutputFiles = ( export const saveInFiles = (dedupliquerOptions: DedupliquerOptions) => - (lieuxToDeduplicate: SchemaLieuMediationNumerique[], groups: Groups, merged: MergedLieuxByGroupMap): void => { + ( + lieuxToDeduplicate: SchemaLieuMediationNumerique[], + groups: Groups, + merged: MergedLieuxByGroupMap, + duplications: DuplicationComparison[] + ): void => { const lieuxWithLessDuplicates: SchemaLieuMediationNumerique[] = [ ...removeMerged(lieuxToDeduplicate, groups), ...Array.from(merged.values()) @@ -48,9 +53,5 @@ export const saveInFiles = fromSchemaLieuxDeMediationNumerique(lieuxWithLessDuplicates) ); - fs.writeFileSync( - `${dedupliquerOptions.outputDirectory}/duplications.csv`, - formatToCSV(duplicationComparisons(lieuxToDeduplicate, false)), - 'utf8' - ); + fs.writeFileSync(`${dedupliquerOptions.outputDirectory}/duplications.csv`, formatToCSV(duplications), 'utf8'); }; diff --git a/src/dedupliquer/cli/data/save/save-with-api.spec.ts b/src/dedupliquer/cli/data/save/save-with-api.spec.ts index b662b10b..aff35d6c 100644 --- a/src/dedupliquer/cli/data/save/save-with-api.spec.ts +++ b/src/dedupliquer/cli/data/save/save-with-api.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { shouldMarkAsDeduplicated } from './save-with-api'; describe('save merged lieux with API', (): void => { diff --git a/src/dedupliquer/repositories/deduplication.repository.ts b/src/dedupliquer/repositories/deduplication.repository.ts index 03215303..5cf24292 100644 --- a/src/dedupliquer/repositories/deduplication.repository.ts +++ b/src/dedupliquer/repositories/deduplication.repository.ts @@ -1,6 +1,11 @@ import { SchemaLieuMediationNumerique } from '@gouvfr-anct/lieux-de-mediation-numerique'; -import { Groups, MergedLieuxByGroupMap } from '../steps'; +import { DuplicationComparison, Groups, MergedLieuxByGroupMap } from '../steps'; export type DeduplicationRepository = { - save: (groups: Groups, merged: MergedLieuxByGroupMap, lieuxToDeduplicate?: SchemaLieuMediationNumerique[]) => Promise; + save: ( + groups: Groups, + merged: MergedLieuxByGroupMap, + lieuxToDeduplicate?: SchemaLieuMediationNumerique[], + duplications?: DuplicationComparison[] + ) => Promise; }; diff --git a/src/dedupliquer/steps/duplication-comparisons/duplication-comparisons.spec.ts b/src/dedupliquer/steps/duplication-comparisons/duplication-comparisons.spec.ts index 1d796070..9aa1673d 100644 --- a/src/dedupliquer/steps/duplication-comparisons/duplication-comparisons.spec.ts +++ b/src/dedupliquer/steps/duplication-comparisons/duplication-comparisons.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { SchemaLieuMediationNumerique, Typologie } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { DuplicationComparison, duplicationComparisons } from './duplication-comparisons'; @@ -9,11 +10,12 @@ describe('deduplication comparison', (): void => { nom: 'Numerinaute', adresse: '12 Rue Joseph Rey (chez Aconit)', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.186115, longitude: 5.716962, source: 'hinaura', - typologie: Typologie.TIERS_LIEUX, + typologie: Typologie.ESS, date_maj: '2020-09-08' } as SchemaLieuMediationNumerique, { @@ -21,6 +23,7 @@ describe('deduplication comparison', (): void => { nom: 'La Turbine.Coop', adresse: '5 esplanade Andry Farcy', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.187654, longitude: 5.704953, @@ -48,7 +51,7 @@ describe('deduplication comparison', (): void => { localisation2: '45.187654 : 5.704953', source1: 'hinaura', source2: 'res-in', - typologie1: 'TIERS_LIEUX', + typologie1: 'ESS', typologie2: 'ESS' } ]); @@ -61,6 +64,7 @@ describe('deduplication comparison', (): void => { nom: 'Numerinaute', adresse: '12 Rue Joseph Rey (chez Aconit)', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble' } as SchemaLieuMediationNumerique, { @@ -68,6 +72,7 @@ describe('deduplication comparison', (): void => { nom: 'La Turbine.Coop', adresse: '5 esplanade Andry Farcy', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble' } as SchemaLieuMediationNumerique ]; @@ -84,6 +89,7 @@ describe('deduplication comparison', (): void => { nom: 'Maison Des Habitants Centre-Ville', commune: 'GRENOBLE', code_postal: '38100', + code_insee: '38185', adresse: '2 Rue du vieux temple', latitude: 45.193684, longitude: 5.733633, @@ -96,6 +102,7 @@ describe('deduplication comparison', (): void => { nom: 'Espace Personnes Agées Bouchayer', commune: 'GRENOBLE', code_postal: '38100', + code_insee: '38185', adresse: '70 BIS rue Joseph Bouchayer', latitude: 45.177784, longitude: 5.707327, @@ -108,6 +115,7 @@ describe('deduplication comparison', (): void => { nom: 'Maison des Habitant.es Anatole France', commune: 'GRENOBLE', code_postal: '38100', + code_insee: '38185', adresse: '68bis rue Anatole France', latitude: 45.172522, longitude: 5.704961, @@ -120,6 +128,7 @@ describe('deduplication comparison', (): void => { nom: 'Maison Des Habitant.es Les Baladins', commune: 'GRENOBLE', code_postal: '38100', + code_insee: '38185', adresse: '31 Place des Géants', latitude: 45.162266, longitude: 5.738204, @@ -132,6 +141,7 @@ describe('deduplication comparison', (): void => { nom: 'Maison Des Habitant.es Prémol', commune: 'GRENOBLE', code_postal: '38100', + code_insee: '38185', adresse: '7 Rue Henri Duhamel', latitude: 45.163403, longitude: 5.727504, diff --git a/src/dedupliquer/steps/find-duplicates/find-duplicates.spec.ts b/src/dedupliquer/steps/find-duplicates/find-duplicates.spec.ts index b03bd015..a6213c1e 100644 --- a/src/dedupliquer/steps/find-duplicates/find-duplicates.spec.ts +++ b/src/dedupliquer/steps/find-duplicates/find-duplicates.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { DispositifProgrammeNational, PublicSpecifiquementAdresse, @@ -90,6 +91,7 @@ describe('find duplicates', (): void => { nom: 'Numerinaute', adresse: '12 Rue Joseph Rey (chez Aconit)', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.186115, longitude: 5.716962, @@ -103,6 +105,7 @@ describe('find duplicates', (): void => { nom: 'numerinaute', adresse: '12 Rue Joseph Rey', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.186117, longitude: 5.716961, @@ -116,7 +119,7 @@ describe('find duplicates', (): void => { expect(duplicates).toStrictEqual([ { - codePostal: '38000', + code_insee: '38185', lieux: [ { id: '574-mediation-numerique-conseiller-numerique', @@ -175,64 +178,6 @@ describe('find duplicates', (): void => { expect(duplicates).toStrictEqual([]); }); - it('should allow deduplicate when both lieux contain "France Service" in the name', (): void => { - const lieux: SchemaLieuMediationNumerique[] = [ - { - id: '574-mediation-numerique-hinaura', - nom: "France services d'Etrechy", - adresse: '26 rue Jean Moulin', - code_postal: '38000', - commune: 'Grenoble', - latitude: 45.186115, - longitude: 5.716962, - source: 'conseiller-numerique' - } as SchemaLieuMediationNumerique, - { - id: '2848-mediation-numerique-france-services', - nom: "France services d'Etrechy", - adresse: '26 rue Jean Moulin', - code_postal: '38000', - commune: 'Grenoble', - latitude: 45.186115, - longitude: 5.716962, - typologie: Typologie.RFS, - source: 'france-services' - } as SchemaLieuMediationNumerique - ]; - - const duplicates: CommuneDuplications[] = findDuplicates(lieux, false); - - expect(duplicates).toStrictEqual([ - { - codePostal: '38000', - lieux: [ - { - id: '574-mediation-numerique-hinaura', - duplicates: [ - { - id: '2848-mediation-numerique-france-services', - distanceScore: 100, - nomFuzzyScore: 100, - voieFuzzyScore: 100 - } - ] - }, - { - id: '2848-mediation-numerique-france-services', - duplicates: [ - { - id: '574-mediation-numerique-hinaura', - distanceScore: 100, - nomFuzzyScore: 100, - voieFuzzyScore: 100 - } - ] - } - ] - } - ]); - }); - it('should not need to deduplicate when only lieu 1 has RFS typologie in lieux to deduplicate', (): void => { const lieuxToDeduplicate: SchemaLieuMediationNumerique[] = [ { @@ -267,7 +212,7 @@ describe('find duplicates', (): void => { nom: 'Maison des Services saint Laurent de chamousset', services: [Service.AccesInternetEtMaterielInformatique].join('|'), pivot: '00000000000000', - typologie: 'RFS', + typologie: Typologie.RFS, commune: 'Saint-Laurent-de-Chamousset', code_postal: '69930', adresse: '122 avenue des 4 cantons', @@ -300,6 +245,7 @@ describe('find duplicates', (): void => { nom: 'Numerinaute', adresse: '12 Rue Joseph Rey (chez Aconit)', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.186115, longitude: 5.716962, @@ -311,6 +257,7 @@ describe('find duplicates', (): void => { nom: 'La Turbine.Coop', adresse: '5 esplanade Andry Farcy 38000 Grenoble', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.187654, longitude: 5.704953, @@ -323,7 +270,7 @@ describe('find duplicates', (): void => { expect(duplicates).toStrictEqual([ { - codePostal: '38000', + code_insee: '38185', lieux: [ { id: '574-mediation-numerique-hinaura', @@ -358,7 +305,7 @@ describe('find duplicates', (): void => { id: '574-mediation-numerique-hinaura', nom: 'Numerinaute', adresse: '12 Rue Joseph Rey (chez Aconit)', - code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.186115, longitude: 5.716962, @@ -369,7 +316,7 @@ describe('find duplicates', (): void => { id: '537-mediation-numerique-hinaura', nom: 'La Turbine.Coop', adresse: '5 esplanade Andry Farcy 38000 Grenoble', - code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.187654, longitude: 5.704953, @@ -382,7 +329,7 @@ describe('find duplicates', (): void => { expect(duplicates).toStrictEqual([ { - codePostal: '38000', + code_insee: '38185', lieux: [ { id: '574-mediation-numerique-hinaura', @@ -411,6 +358,37 @@ describe('find duplicates', (): void => { ]); }); + it('should not allow dedulpication for lieux without common typologie', () => { + const lieux: SchemaLieuMediationNumerique[] = [ + { + id: '574-mediation-numerique-hinaura', + nom: 'Numerinaute', + adresse: '12 Rue Joseph Rey (chez Aconit)', + code_postal: '38000', + commune: 'Grenoble', + latitude: 45.186115, + longitude: 5.716962, + source: 'conseiller-numerique', + typologie: [Typologie.TIERS_LIEUX, Typologie.ASSO].join('|') + } as SchemaLieuMediationNumerique, + { + id: '2848-mediation-numerique-france-services', + nom: "France services d'Etrechy", + adresse: '26 rue Jean Moulin', + code_postal: '38000', + commune: 'Grenoble', + latitude: 48.487691, + longitude: 2.186761, + source: 'hinaura', + typologie: Typologie.CCAS + } as SchemaLieuMediationNumerique + ]; + + const duplicates: CommuneDuplications[] = findDuplicates(lieux, false); + + expect(duplicates).toStrictEqual([]); + }); + it('should get deduplication data for two lieux in same commune', (): void => { const lieux: SchemaLieuMediationNumerique[] = [ { @@ -418,6 +396,7 @@ describe('find duplicates', (): void => { nom: 'Numerinaute', adresse: '12 Rue Joseph Rey (chez Aconit)', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.186115, longitude: 5.716962, @@ -428,6 +407,7 @@ describe('find duplicates', (): void => { nom: 'La Turbine.Coop', adresse: '5 esplanade Andry Farcy 38000 Grenoble', code_postal: '38000', + code_insee: '38185', commune: 'Grenoble', latitude: 45.187654, longitude: 5.704953, @@ -439,7 +419,7 @@ describe('find duplicates', (): void => { expect(duplicates).toStrictEqual([ { - codePostal: '38000', + code_insee: '38185', lieux: [ { id: '574-mediation-numerique-hinaura', @@ -475,6 +455,7 @@ describe('find duplicates', (): void => { nom: 'LA POSTE', adresse: '8 Av du Mal de Lattre de Tassigny', code_postal: '88000', + code_insee: '88160', commune: 'EPINAL', latitude: 48.176748, longitude: 6.444835, @@ -485,6 +466,7 @@ describe('find duplicates', (): void => { nom: 'LA POSTE', adresse: '20 PL D AVRINSART', code_postal: '88000', + code_insee: '88160', commune: 'EPINAL', latitude: 48.183401, longitude: 6.45588, @@ -496,7 +478,7 @@ describe('find duplicates', (): void => { expect(duplicates).toStrictEqual([ { - codePostal: '88000', + code_insee: '88160', lieux: [ { id: '1', @@ -532,6 +514,7 @@ describe('find duplicates', (): void => { nom: 'Mediatheque Municipale de Bailleul', adresse: "41 Rue D 'Ypres", code_postal: '59270', + code_insee: '59043', commune: 'Bailleul', latitude: 50.740045, longitude: 2.737217, @@ -542,6 +525,7 @@ describe('find duplicates', (): void => { nom: 'CCAS de Bailleul', adresse: "22 Bis Rue d'Ypres", code_postal: '59270', + code_insee: '59043', commune: 'Bailleul', latitude: 50.740407, longitude: 2.737429, @@ -553,7 +537,7 @@ describe('find duplicates', (): void => { expect(duplicates).toStrictEqual([ { - codePostal: '59270', + code_insee: '59043', lieux: [ { id: '1', @@ -589,6 +573,7 @@ describe('find duplicates', (): void => { nom: 'Maison des Solidarités de Cournon', commune: "Cournon d'Auvergne", code_postal: '63800', + code_insee: '63124', adresse: '34 place Jean Jaurès', latitude: 45.729599225, longitude: 3.1899082661, @@ -603,6 +588,7 @@ describe('find duplicates', (): void => { nom: 'MDS Cournon', commune: "Cournon-d'Auvergne", code_postal: '63800', + code_insee: '63124', adresse: '34 place Jean Jaurès', latitude: 45.729544, longitude: 3.190005, @@ -614,6 +600,7 @@ describe('find duplicates', (): void => { nom: 'DEPARTEMENT DU PUY DE DOME', commune: "Cournon-d'Auvergne", code_postal: '63800', + code_insee: '63124', adresse: '34 Place Jean Jaurès', latitude: 45.728941, longitude: 3.188564, @@ -628,6 +615,7 @@ describe('find duplicates', (): void => { nom: 'Maison des Solidarités', commune: "COURNON D'AUVERGNE", code_postal: '63800', + code_insee: '63124', adresse: '34 Place Jean Jaurès', latitude: 45.728941, longitude: 3.188564, @@ -643,8 +631,8 @@ describe('find duplicates', (): void => { typologie: 'RFS', commune: "Cournon-d'Auvergne", code_postal: '63800', - adresse: '15 Impasse des Dômes', code_insee: '63124', + adresse: '15 Impasse des Dômes', latitude: 45.73156, longitude: 3.192711, dispositif_programmes_nationaux: `${DispositifProgrammeNational.FranceServices}`, @@ -656,7 +644,7 @@ describe('find duplicates', (): void => { expect(duplicates).toStrictEqual([ { - codePostal: '63800', + code_insee: '63124', lieux: [ { duplicates: [ diff --git a/src/dedupliquer/steps/find-duplicates/find-duplicates.ts b/src/dedupliquer/steps/find-duplicates/find-duplicates.ts index 937e9ec4..25c4b37e 100644 --- a/src/dedupliquer/steps/find-duplicates/find-duplicates.ts +++ b/src/dedupliquer/steps/find-duplicates/find-duplicates.ts @@ -1,11 +1,11 @@ -import { SchemaLieuMediationNumerique, Typologie } from '@gouvfr-anct/lieux-de-mediation-numerique'; +import { SchemaLieuMediationNumerique, Typologie, Typologies } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { ratio } from 'fuzzball'; export type Duplicate = { id: string; distanceScore: number; nomFuzzyScore: number; voieFuzzyScore: number }; export type LieuDuplications = { id: string; duplicates: Duplicate[] }; -export type CommuneDuplications = { codePostal: string; lieux: LieuDuplications[] }; +export type CommuneDuplications = { code_insee: string; lieux: LieuDuplications[] }; const sameSource = (lieu: SchemaLieuMediationNumerique, lieuToDeduplicate: SchemaLieuMediationNumerique): boolean => lieu.source === lieuToDeduplicate.source; @@ -13,34 +13,38 @@ const sameSource = (lieu: SchemaLieuMediationNumerique, lieuToDeduplicate: Schem const sameId = (lieu: SchemaLieuMediationNumerique, lieuToDeduplicate: SchemaLieuMediationNumerique): boolean => lieu.id === lieuToDeduplicate.id; -const sameCodePostal = (lieu: SchemaLieuMediationNumerique, lieuToDeduplicate: SchemaLieuMediationNumerique): boolean => - lieu.code_postal === lieuToDeduplicate.code_postal; +const sameCodeInsee = (lieu: SchemaLieuMediationNumerique, lieuToDeduplicate: SchemaLieuMediationNumerique): boolean => + lieu.code_insee === lieuToDeduplicate.code_insee; -const hasRFSCompatibleTypology = (lieu: SchemaLieuMediationNumerique): boolean => - [`${Typologie.RFS}`, `${Typologie.PIMMS}`].includes(lieu.typologie ?? 'NO_TYPOLOGY'); +const compatibleTypologies: [Typologie, Typologie][] = [[Typologie.RFS, Typologie.PIMMS]]; -const isCompatibleForFranceServices = ( - lieu: SchemaLieuMediationNumerique, - lieuToDeduplicate: SchemaLieuMediationNumerique -): boolean => - (hasRFSCompatibleTypology(lieu) && hasRFSCompatibleTypology(lieuToDeduplicate)) || - (/france services?/giu.test(lieu.nom.toLowerCase()) && /france services?/giu.test(lieuToDeduplicate.nom.toLowerCase())); +const toTypologies = ({ typologie }: { typologie?: string }): Typologies => + Typologies((typologie?.split('|') as Typologies) ?? []); -const compatibilitySpecialCases = ( - lieu: SchemaLieuMediationNumerique, - lieuToDeduplicate: SchemaLieuMediationNumerique -): boolean => - isCompatibleForFranceServices(lieu, lieuToDeduplicate) - ? true - : lieuToDeduplicate.typologie !== Typologie.RFS && lieu.typologie !== Typologie.RFS; +const allEmpty = (lieuTypologies: Typologies, lieuToDeduplicateTypologies: Typologies) => + lieuTypologies.length === 0 && lieuToDeduplicateTypologies.length === 0; + +const hasSameTypologieIn = (lieuToDeduplicateTypologies: Typologies) => (typologie: Typologie) => + lieuToDeduplicateTypologies.includes(typologie); + +const hasCompatibleTypologiesFor = + (lieuTypologies: Typologies, lieuToDeduplicateTypologies: Typologies) => + ([typologyA, typologyB]: [Typologie, Typologie]) => + (lieuTypologies.includes(typologyA) && lieuToDeduplicateTypologies.includes(typologyB)) || + (lieuTypologies.includes(typologyB) && lieuToDeduplicateTypologies.includes(typologyA)); + +const sameTypologie = (lieuTypologies: Typologies, lieuToDeduplicateTypologies: Typologies): boolean => + allEmpty(lieuTypologies, lieuToDeduplicateTypologies) || + lieuTypologies.some(hasSameTypologieIn(lieuToDeduplicateTypologies)) || + compatibleTypologies.some(hasCompatibleTypologiesFor(lieuTypologies, lieuToDeduplicateTypologies)); const onlyPotentialDuplicates = (lieuToDeduplicate: SchemaLieuMediationNumerique, allowInternalMerge: boolean) => (lieu: SchemaLieuMediationNumerique): boolean => - sameCodePostal(lieu, lieuToDeduplicate) && + sameCodeInsee(lieu, lieuToDeduplicate) && !sameId(lieu, lieuToDeduplicate) && (allowInternalMerge || !sameSource(lieu, lieuToDeduplicate)) && - compatibilitySpecialCases(lieu, lieuToDeduplicate); + sameTypologie(toTypologies(lieu), toTypologies(lieuToDeduplicate)); const MINIMAL_CARTESIAN_DISTANCE: 0.0004 = 0.0004 as const; @@ -85,36 +89,42 @@ const appendCommuneDuplications = lieuToDeduplicate: SchemaLieuMediationNumerique, duplications: CommuneDuplications[], allowInternalMerge: boolean - ): CommuneDuplications[] => [ - ...duplications, - { codePostal: lieuToDeduplicate.code_postal, lieux: [toLieuDuplications(lieuToDeduplicate, lieux, allowInternalMerge)] } - ]; + ): CommuneDuplications[] => + lieuToDeduplicate.code_insee != null + ? [ + ...duplications, + { + code_insee: lieuToDeduplicate.code_insee, + lieux: [toLieuDuplications(lieuToDeduplicate, lieux, allowInternalMerge)] + } + ] + : duplications; const toUpdatedCommuneDuplications = (lieux: SchemaLieuMediationNumerique[]) => - (lieu: SchemaLieuMediationNumerique, duplicationsWithSameCodePostal: CommuneDuplications, allowInternalMerge: boolean) => + (lieu: SchemaLieuMediationNumerique, duplicationsWithSameCodeInsee: CommuneDuplications, allowInternalMerge: boolean) => (communeDuplications: CommuneDuplications): CommuneDuplications => - communeDuplications.codePostal === lieu.code_postal + communeDuplications.code_insee === lieu.code_insee ? { - codePostal: lieu.code_postal, - lieux: [...duplicationsWithSameCodePostal.lieux, toLieuDuplications(lieu, lieux, allowInternalMerge)] + code_insee: lieu.code_insee, + lieux: [...duplicationsWithSameCodeInsee.lieux, toLieuDuplications(lieu, lieux, allowInternalMerge)] } : communeDuplications; -const withSameCodePostal = +const withSameCodeInsee = (lieu: SchemaLieuMediationNumerique) => - ({ codePostal }: CommuneDuplications): boolean => - codePostal === lieu.code_postal; + ({ code_insee }: CommuneDuplications): boolean => + code_insee === lieu.code_insee; const toCommunesDuplications = (lieux: SchemaLieuMediationNumerique[], allowInternalMerge: boolean) => (duplications: CommuneDuplications[], lieuToDeduplicate: SchemaLieuMediationNumerique): CommuneDuplications[] => - ((duplicationsWithSameCodePostal?: CommuneDuplications): CommuneDuplications[] => - duplicationsWithSameCodePostal == null + ((duplicationsWithSameCodeInsee?: CommuneDuplications): CommuneDuplications[] => + duplicationsWithSameCodeInsee == null ? appendCommuneDuplications(lieux)(lieuToDeduplicate, duplications, allowInternalMerge) : duplications.map( - toUpdatedCommuneDuplications(lieux)(lieuToDeduplicate, duplicationsWithSameCodePostal, allowInternalMerge) - ))(duplications.find(withSameCodePostal(lieuToDeduplicate))); + toUpdatedCommuneDuplications(lieux)(lieuToDeduplicate, duplicationsWithSameCodeInsee, allowInternalMerge) + ))(duplications.find(withSameCodeInsee(lieuToDeduplicate))); const onlyWithDuplicates = ({ duplicates }: LieuDuplications): boolean => duplicates.length > 0; @@ -130,8 +140,8 @@ const toDuplicatesWithout = const invalidDuplicatesIds = ({ lieux }: CommuneDuplications): string[] => lieux.filter(onlyWithoutDuplicates).map((lieu: LieuDuplications): string => lieu.id); -const removeLieuxFrom = ({ codePostal, lieux }: CommuneDuplications, ids: string[]): CommuneDuplications => ({ - codePostal, +const removeLieuxFrom = ({ code_insee, lieux }: CommuneDuplications, ids: string[]): CommuneDuplications => ({ + code_insee, lieux: lieux.map(toDuplicatesWithout(ids)).filter(onlyWithDuplicates) }); diff --git a/src/dedupliquer/steps/group-duplicates/group-duplicates.spec.ts b/src/dedupliquer/steps/group-duplicates/group-duplicates.spec.ts index 2edae477..72f00212 100644 --- a/src/dedupliquer/steps/group-duplicates/group-duplicates.spec.ts +++ b/src/dedupliquer/steps/group-duplicates/group-duplicates.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { DuplicationComparison } from '../duplication-comparisons'; import { groupDuplicates, Groups } from './group-duplicates'; diff --git a/src/dedupliquer/steps/merge-duplicates/merge-duplicates.spec.ts b/src/dedupliquer/steps/merge-duplicates/merge-duplicates.spec.ts index 3b369f56..94272e7a 100644 --- a/src/dedupliquer/steps/merge-duplicates/merge-duplicates.spec.ts +++ b/src/dedupliquer/steps/merge-duplicates/merge-duplicates.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { SchemaLieuMediationNumerique, Service, @@ -56,6 +57,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -69,6 +71,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -93,6 +96,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -113,6 +117,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -126,6 +131,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -151,6 +157,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -172,6 +179,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -186,6 +194,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -210,6 +219,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -231,6 +241,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -245,6 +256,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -269,6 +281,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -290,6 +303,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -305,6 +319,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -330,6 +345,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -352,6 +368,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -367,6 +384,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -392,6 +410,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -414,6 +433,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -430,6 +450,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -456,6 +477,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -479,6 +501,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -494,6 +517,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -519,6 +543,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -541,6 +566,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -556,6 +582,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -582,6 +609,7 @@ describe('remove duplicates', (): void => { adresse: '11 rue Joseph Cugnot', code_postal: '49430', commune: 'Durtal', + code_insee: '49127', latitude: 47.6699154795, longitude: -0.2551539846, date_maj: '2023-05-03', @@ -603,6 +631,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -618,6 +647,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -643,6 +673,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -669,6 +700,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -684,6 +716,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -709,6 +742,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -731,6 +765,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -745,6 +780,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -769,6 +805,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -790,6 +827,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -803,6 +841,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -827,6 +866,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -848,6 +888,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -861,6 +902,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -886,6 +928,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -906,6 +949,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -920,6 +964,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -944,6 +989,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -964,6 +1010,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -977,6 +1024,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -1001,6 +1049,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -1021,6 +1070,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -1034,6 +1084,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -1058,6 +1109,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -1078,6 +1130,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, @@ -1092,6 +1145,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'DURTAL', latitude: 47.671271, longitude: -0.256457, @@ -1117,6 +1171,7 @@ describe('remove duplicates', (): void => { nom: 'France Services Durtal', adresse: '11 rue Joseph Cugnot', code_postal: '49430', + code_insee: '49127', commune: 'Durtal', latitude: 47.6699154795, longitude: -0.2551539846, diff --git a/src/dedupliquer/steps/merge-duplicates/merge-lieux.ts b/src/dedupliquer/steps/merge-duplicates/merge-lieux.ts index a16d8957..5834f480 100644 --- a/src/dedupliquer/steps/merge-duplicates/merge-lieux.ts +++ b/src/dedupliquer/steps/merge-duplicates/merge-lieux.ts @@ -72,7 +72,7 @@ const mergeId = (lieu1: SchemaLieuMediationNumerique, lieu2: SchemaLieuMediation [lieu1.id, lieu2.id] .sort() .join('__') - .replace(/-?mediation-numerique-?/gu, ''); + .replace(/-?mediation-numerique-?/g, ''); const ignoreDefaultPivot = (lieu1: SchemaLieuMediationNumerique, lieu2: SchemaLieuMediationNumerique): { pivot: string } => ({ pivot: lieu1.pivot === '00000000000000' ? lieu2.pivot : lieu1.pivot diff --git a/src/dedupliquer/steps/merge-group/merge-group.spec.ts b/src/dedupliquer/steps/merge-group/merge-group.spec.ts index 609ff126..41e88a1c 100644 --- a/src/dedupliquer/steps/merge-group/merge-group.spec.ts +++ b/src/dedupliquer/steps/merge-group/merge-group.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { SchemaLieuMediationNumerique, Typologie } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { Groups } from '../group-duplicates/group-duplicates'; import { MergedLieuxByGroupMap } from '../merge-duplicates'; diff --git a/src/dedupliquer/steps/remove-merged/remove-merged.spec.ts b/src/dedupliquer/steps/remove-merged/remove-merged.spec.ts index 4f290730..12efedae 100644 --- a/src/dedupliquer/steps/remove-merged/remove-merged.spec.ts +++ b/src/dedupliquer/steps/remove-merged/remove-merged.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { SchemaLieuMediationNumerique, Service } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { Groups } from '../group-duplicates/group-duplicates'; import { removeMerged } from './remove-merged'; diff --git a/src/extract/cli/action/build-api-url/extract-query-string.spec.ts b/src/extract/cli/action/build-api-url/extract-query-string.spec.ts index 3ed3b642..0e11bf57 100644 --- a/src/extract/cli/action/build-api-url/extract-query-string.spec.ts +++ b/src/extract/cli/action/build-api-url/extract-query-string.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { extractQueryString } from './extract-query-string'; describe('build api url', (): void => { diff --git a/src/fusionner/cli/action/fusionner.action.ts b/src/fusionner/cli/action/fusionner.action.ts index 473b0694..e21e26e3 100644 --- a/src/fusionner/cli/action/fusionner.action.ts +++ b/src/fusionner/cli/action/fusionner.action.ts @@ -29,7 +29,8 @@ const toJsonToMerge = (file: string): unknown[] => JSON.parse(fs.readFileSync(fi const mergeJsonFiles = (files: string[], outputDirectory: string): void => { const outputFilePath: string = path.join(outputDirectory, 'merged_output.json'); - fs.writeFileSync(outputFilePath, JSON.stringify(files.map(toJsonToMerge), null, 2), 'utf-8'); + if (!fs.existsSync(outputDirectory)) fs.mkdirSync(outputDirectory, { recursive: true }); + fs.writeFileSync(outputFilePath, JSON.stringify(files.flatMap(toJsonToMerge), null, 2), 'utf-8'); console.log(`Les fichiers JSON fusionnés ont été sauvegardés dans ${outputFilePath}`); }; diff --git a/src/fusionner/cli/questions/input-files-pattern.question.ts b/src/fusionner/cli/questions/input-files-pattern.question.ts index 5f4d9f3c..9a1e17f3 100644 --- a/src/fusionner/cli/questions/input-files-pattern.question.ts +++ b/src/fusionner/cli/questions/input-files-pattern.question.ts @@ -11,7 +11,7 @@ const validateInputFilesPattern = (input?: string): InputFilesPatternValidationM export const inputFilesPatternDirectoryQuestion = ( mednumImportProperties: FusionnerOptions ): InputQuestion & { name: keyof FusionnerOptions } => ({ - message: 'Maque des chemins à fusionner', + message: 'Masque des chemins à fusionner', name: 'inputFilesPattern', validate: validateInputFilesPattern, when: (): boolean => validateInputFilesPattern(mednumImportProperties.inputFilesPattern) !== true, diff --git a/src/publier/cli/questions/id-type.question.spec.ts b/src/publier/cli/questions/id-type.question.spec.ts index fc41d76b..761079a8 100644 --- a/src/publier/cli/questions/id-type.question.spec.ts +++ b/src/publier/cli/questions/id-type.question.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { idTypeQuestion } from './id-type.question'; describe('id type option for cli import', (): void => { diff --git a/src/publier/publish-dataset.spec.ts b/src/publier/publish-dataset.spec.ts index 53c485a2..7521718a 100644 --- a/src/publier/publish-dataset.spec.ts +++ b/src/publier/publish-dataset.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { publishDataset } from './publish-dataset'; import { PublishDatasetRepository } from './repositories'; import { Dataset, PublishDataset, PublishRessource } from './models'; diff --git a/src/publier/publish-dataset.ts b/src/publier/publish-dataset.ts index 0bdb76b1..f59c80b7 100644 --- a/src/publier/publish-dataset.ts +++ b/src/publier/publish-dataset.ts @@ -6,7 +6,7 @@ type DatasetToPublishActions = { exist?: (datasetToUpdate: PublishDataset, datasetFound: Dataset) => Promise; }; -const DATE_FORMAT_CHECK: RegExp = /\d{8}|(\d{4})-(\d{2})-(\d{2})/gu; +const DATE_FORMAT_CHECK: RegExp = /\d{8}|(\d{4})-(\d{2})-(\d{2})/g; const datasetFound = (dataset: Dataset | undefined): dataset is Dataset => dataset != null; diff --git a/src/publier/repositories/publish-dataset.repository.ts b/src/publier/repositories/publish-dataset.repository.ts index e9b224b0..fffbf7bd 100644 --- a/src/publier/repositories/publish-dataset.repository.ts +++ b/src/publier/repositories/publish-dataset.repository.ts @@ -3,9 +3,7 @@ import * as fs from 'fs'; import { Api, authHeader, headers } from '../../common'; import { Dataset, PublishDataset, PublishRessource, Reference, Ressource } from '../models'; import { getDataset, postDataset, updateDataset } from './publish-dataset'; - -// eslint-disable-next-line @typescript-eslint/no-require-imports -const FormData = require('form-data'); +import FormData from 'form-data'; export type PublishDatasetRepository = { get: (reference: Reference) => Promise; @@ -21,7 +19,7 @@ const addRessourceTo = (api: Api) => (dataset: Dataset) => async (ressource: PublishRessource): Promise => { - const formData: typeof FormData = new FormData(); + const formData = new FormData(); formData.append('file', fs.readFileSync(`${ressource.source}`), extractNameFromPath(ressource.source.split('/'))); const ressourceId: string = ( @@ -46,7 +44,7 @@ const updateRessourceFor = (api: Api) => (dataset: Dataset) => async (ressource: PublishRessource, ressourceId?: string): Promise => { - const formData: typeof FormData = new FormData(); + const formData = new FormData(); formData.append('file', fs.readFileSync(`${ressource.source}`), extractNameFromPath(ressource.source.split('/'))); await axios.post( diff --git a/src/transformer/cli/action/transformer.action.ts b/src/transformer/cli/action/transformer.action.ts index 62a37c83..c0810e44 100644 --- a/src/transformer/cli/action/transformer.action.ts +++ b/src/transformer/cli/action/transformer.action.ts @@ -1,3 +1,4 @@ +import { flatten } from 'flat'; import { fromSchemaLieuDeMediationNumerique, LieuMediationNumerique, @@ -18,9 +19,6 @@ import { canTransform, DiffSinceLastTransform } from '../diff-since-last-transfo import { TransformerOptions } from '../transformer-options'; import { transformationRespository } from './transformation.respository'; -// eslint-disable-next-line @typescript-eslint/no-require-imports -const flatten = require('flat'); - const REPORT: Report = Report(); const replaceNullWithEmptyString = (jsonString: string): string => { @@ -76,7 +74,11 @@ export const transformerAction = async (transformerOptions: TransformerOptions): console.log('4. Transformation des données vers le schéma des lieux de mediation numérique'); const lieuxDeMediationNumerique: LieuMediationNumerique[] = ( - await Promise.all(lieux.map(flatten).map(toLieuxMediationNumerique(repository, transformerOptions.sourceName, REPORT))) + await Promise.all( + lieux + .map((dataSource: DataSource) => flatten(dataSource, { safe: true })) + .map(toLieuxMediationNumerique(repository, transformerOptions.sourceName, REPORT)) + ) ).filter(validValuesOnly); if (diffSinceLastTransform != null) { diff --git a/src/transformer/cli/diff-since-last-transform.spec.ts b/src/transformer/cli/diff-since-last-transform.spec.ts index e37d15f8..1912fad2 100644 --- a/src/transformer/cli/diff-since-last-transform.spec.ts +++ b/src/transformer/cli/diff-since-last-transform.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { DataSource } from '../input'; import { canTransform, diff --git a/src/transformer/data/qpv/is-in-qpv.spec.ts b/src/transformer/data/qpv/is-in-qpv.spec.ts index 4bd5fc70..5a64cf33 100644 --- a/src/transformer/data/qpv/is-in-qpv.spec.ts +++ b/src/transformer/data/qpv/is-in-qpv.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Localisation } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { type Polygon } from 'geojson'; import { QpvShapesMap } from '../../fields'; diff --git a/src/transformer/data/qpv/transfer/qpv.transfer.spec.ts b/src/transformer/data/qpv/transfer/qpv.transfer.spec.ts index e556ef2b..4f1caa39 100644 --- a/src/transformer/data/qpv/transfer/qpv.transfer.spec.ts +++ b/src/transformer/data/qpv/transfer/qpv.transfer.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { type MultiPolygon, type Polygon } from 'geojson'; import { QpvShapesMap } from '../../../fields'; import { qpvShapesMapFromTransfer, QpvTransfer } from './qpv.transfer'; diff --git a/src/transformer/data/source/transfer/source.transfer.spec.ts b/src/transformer/data/source/transfer/source.transfer.spec.ts index ec12e6d5..61b7766c 100644 --- a/src/transformer/data/source/transfer/source.transfer.spec.ts +++ b/src/transformer/data/source/transfer/source.transfer.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { SourceMap, sourceMapFromTransfer, SourceTransfer } from './source.transfer'; describe('source transfer', (): void => { diff --git a/src/transformer/data/zrr/is-in-zrr.spec.ts b/src/transformer/data/zrr/is-in-zrr.spec.ts index 5b50cd80..039dd586 100644 --- a/src/transformer/data/zrr/is-in-zrr.spec.ts +++ b/src/transformer/data/zrr/is-in-zrr.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { ZrrMap } from '../../fields'; import { isInZrr } from './is-in-zrr'; diff --git a/src/transformer/data/zrr/transfer/zrr.transfer.spec.ts b/src/transformer/data/zrr/transfer/zrr.transfer.spec.ts index 7f48340c..96a4097c 100644 --- a/src/transformer/data/zrr/transfer/zrr.transfer.spec.ts +++ b/src/transformer/data/zrr/transfer/zrr.transfer.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { zrrMapFromTransfer, ZrrTransfer } from './zrr.transfer'; describe('zrr transfer', (): void => { diff --git a/src/transformer/fields/adresse/adresse.field.spec.ts b/src/transformer/fields/adresse/adresse.field.spec.ts index 8cebb9ea..46c48489 100644 --- a/src/transformer/fields/adresse/adresse.field.spec.ts +++ b/src/transformer/fields/adresse/adresse.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Adresse, VoieError } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { processAdresse } from './adresse.field'; diff --git a/src/transformer/fields/adresse/adresse.field.ts b/src/transformer/fields/adresse/adresse.field.ts index cae1c572..eb79fd59 100644 --- a/src/transformer/fields/adresse/adresse.field.ts +++ b/src/transformer/fields/adresse/adresse.field.ts @@ -22,7 +22,7 @@ type SourceAddress = { const nouvelleCaledonieException = (codePostal: string): boolean => codePostal.startsWith('98'); export const complementAdresseIfAny = (complementAdresse?: string): { complement_adresse?: string } => - complementAdresse == null ? {} : { complement_adresse: complementAdresse.replace(/\s+/gu, ' ').trim() }; + complementAdresse == null ? {} : { complement_adresse: complementAdresse.replace(/\s+/g, ' ').trim() }; const codeInseeIfAny = (code_insee?: string): { code_insee?: string } => (code_insee == null ? {} : { code_insee }); diff --git a/src/transformer/fields/adresse/anciennes-communes.spec.ts b/src/transformer/fields/adresse/anciennes-communes.spec.ts index 0f38a113..950df454 100644 --- a/src/transformer/fields/adresse/anciennes-communes.spec.ts +++ b/src/transformer/fields/adresse/anciennes-communes.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { getNewCommune } from './anciennes-communes'; import { Commune } from './find-commune'; diff --git a/src/transformer/fields/adresse/clean-commune.spec.ts b/src/transformer/fields/adresse/clean-commune.spec.ts index 035634cd..2ba7e879 100644 --- a/src/transformer/fields/adresse/clean-commune.spec.ts +++ b/src/transformer/fields/adresse/clean-commune.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { CLEAN_COMMUNE, communeField } from './clean-commune'; import { toCleanField } from './clean-operations'; diff --git a/src/transformer/fields/adresse/clean-commune.ts b/src/transformer/fields/adresse/clean-commune.ts index 5a171093..1b00f453 100644 --- a/src/transformer/fields/adresse/clean-commune.ts +++ b/src/transformer/fields/adresse/clean-commune.ts @@ -2,157 +2,157 @@ import { CleanOperation } from './clean-operations'; const FIX_WRONG_ACCENT_CHARS: CleanOperation = { name: 'replace ╢ with Â', - selector: /╢/u, + selector: /╢/, fix: (toFix: string): string => toFix.replace('╢', 'Â') }; const FIX_WRONG_APOSTROPHE: CleanOperation = { name: 'replace curved apostrophe with quote', - selector: /’/u, + selector: /’/, fix: (toFix: string): string => toFix.replace('’', "'") }; const REPLACE_HEADING_ST_WITH_SAINT: CleanOperation = { name: 'replace st with saint', - selector: /^[Ss][Tt][-\s]/u, - fix: (toFix: string): string => toFix.replace(/^[Ss][Tt][-\s]/gu, 'Saint-') + selector: /^[Ss][Tt][-\s]/, + fix: (toFix: string): string => toFix.replace(/^[Ss][Tt][-\s]/g, 'Saint-') }; const REPLACE_HEADING_STE_WITH_SAINTE: CleanOperation = { name: 'replace st with saint', - selector: /^[Ss][Tt][Ee][-\s]/u, - fix: (toFix: string): string => toFix.replace(/^[Ss][Tt][Ee][-\s]/gu, 'Sainte-') + selector: /^[Ss][Tt][Ee][-\s]/, + fix: (toFix: string): string => toFix.replace(/^[Ss][Tt][Ee][-\s]/g, 'Sainte-') }; const REPLACE_ST_WITH_SAINT: CleanOperation = { name: 'replace st with saint', - selector: /[-\s][Ss][Tt][-\s]/u, - fix: (toFix: string): string => toFix.replace(/[-\s][Ss][Tt][-\s]/gu, '-Saint-') + selector: /[-\s][Ss][Tt][-\s]/, + fix: (toFix: string): string => toFix.replace(/[-\s][Ss][Tt][-\s]/g, '-Saint-') }; const REPLACE_STE_WITH_SAINTE: CleanOperation = { name: 'replace st with saint', - selector: /[-\s][Ss][Tt][Ee][-\s]/u, - fix: (toFix: string): string => toFix.replace(/[-\s][Ss][Tt][Ee][-\s]/gu, '-Sainte-') + selector: /[-\s][Ss][Tt][Ee][-\s]/, + fix: (toFix: string): string => toFix.replace(/[-\s][Ss][Tt][Ee][-\s]/g, '-Sainte-') }; const REMOVE_TEXT_BETWEEN_PARENTHESIS: CleanOperation = { name: 'remove text between parenthesis', - selector: /\([^)]+\)/u, + selector: /\([^)]+\)/, fix: (toFix: string): string => toFix.trim() }; const REMOVE_DISTRICT: CleanOperation = { name: 'remove district', - selector: /\d+er?/u, - fix: (toFix: string): string => toFix.replace(/\d+er?/u, '') + selector: /\d+er?/, + fix: (toFix: string): string => toFix.replace(/\d+er?/, '') }; const REMOVE_CEDEX: CleanOperation = { name: 'remove cedex', - selector: /-?[Cc](?:[ÉE]DEX|[ée]dex)\s?\d*/u, - fix: (toFix: string): string => toFix.replace(/-?[Cc](?:[ÉE]DEX|[ée]dex)\s?\d*/u, '') + selector: /-?[Cc](?:[ÉE]DEX|[ée]dex)\s?\d*/, + fix: (toFix: string): string => toFix.replace(/-?[Cc](?:[ÉE]DEX|[ée]dex)\s?\d*/, '') }; const REMOVE_NUMERIC_CHARS: CleanOperation = { name: 'remove numeric characters', - selector: /\d+/gu, - fix: (toFix: string): string => toFix.replace(/\d+/gu, '') + selector: /\d+/g, + fix: (toFix: string): string => toFix.replace(/\d+/g, '') }; const REMOVE_SPACE_AFTER_QUOTE: CleanOperation = { name: 'remove space after quote', - selector: /'\s+/u, - fix: (toFix: string): string => toFix.replace(/'\s+/u, "'") + selector: /'\s+/, + fix: (toFix: string): string => toFix.replace(/'\s+/, "'") }; const REMOVE_HEADING_AND_TRAILING_SPACES: CleanOperation = { name: 'remove heading and trailing spaces', - selector: /^\s+|\s+$/u, + selector: /^\s+|\s+$/, fix: (toFix: string): string => toFix.trim() }; const REPLACE_SPACES_WITH_DASHES: CleanOperation = { name: 'replace spaces with dashed', - selector: /\s/u, - fix: (toFix: string): string => toFix.replace(/\s/gu, '-') + selector: /\s/, + fix: (toFix: string): string => toFix.replace(/\s/g, '-') }; const FIX_UNEXPECTED_DETAILS: CleanOperation = { name: 'unexpected details in commune', - selector: /\s*\(.*\)\s*/u, - fix: (toFix: number | string): string => toFix.toString().replace(/\s*\(.*\)\s*/u, '') + selector: /\s*\(.*\)\s*/, + fix: (toFix: number | string): string => toFix.toString().replace(/\s*\(.*\)\s*/, '') }; const FIX_FORGOTTEN_ARTICLE_FROM_PONTDECLAIX: CleanOperation = { name: 'put forgotten le for Pont-de-Claix', - selector: /^Pont-de-Claix$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Pont-de-Claix$/u, 'Le Pont-de-Claix') + selector: /^Pont-de-Claix$/, + fix: (toFix: string): string => toFix.toString().replace(/^Pont-de-Claix$/, 'Le Pont-de-Claix') }; const FIX_FORGOTTEN_ARTICLE_FROM_NOUVION_EN_THIERACHE: CleanOperation = { name: 'le for NOUVION-EN-THIÉRACHE', - selector: /^Nouvion-en-Thiérache$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Nouvion-en-Thiérache$/u, 'Le Nouvion-en-Thiérache') + selector: /^Nouvion-en-Thiérache$/, + fix: (toFix: string): string => toFix.toString().replace(/^Nouvion-en-Thiérache$/, 'Le Nouvion-en-Thiérache') }; const FIX_FORGOTTEN_ARTICLE_FROM_FAY_SAINT_QUENTIN: CleanOperation = { name: 'put forgotten le for FAY-SAINT-QUENTIN', - selector: /^Fay-Saint-Quentin$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Fay-Saint-Quentin$/u, 'Le Fay-Saint-Quentin') + selector: /^Fay-Saint-Quentin$/, + fix: (toFix: string): string => toFix.toString().replace(/^Fay-Saint-Quentin$/, 'Le Fay-Saint-Quentin') }; const FIX_ADDED_LETTER_FROM_GRANDCHAMPS_DES_FONTAINES: CleanOperation = { name: 'delete the letter s for Grandchamps-des-Fontaines', - selector: /^Grandchamps-des-Fontaines$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Grandchamps-des-Fontaines$/u, 'Grandchamp-des-Fontaines') + selector: /^Grandchamps-des-Fontaines$/, + fix: (toFix: string): string => toFix.toString().replace(/^Grandchamps-des-Fontaines$/, 'Grandchamp-des-Fontaines') }; const FIX_FORGOTTEN_ARTICLE_FROM_PRECHEUR: CleanOperation = { name: 'put forgotten le for Prêcheur', - selector: /^Prêcheur$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Prêcheur$/u, 'Le Prêcheur') + selector: /^Prêcheur$/, + fix: (toFix: string): string => toFix.toString().replace(/^Prêcheur$/, 'Le Prêcheur') }; const FIX_SPELLING_NAME_OF_BORDERES_ET_LAMESENS: CleanOperation = { name: 'fix typo in Bordères-et-Lamensen ', - selector: /^Bordères-et-Lamensens$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Bordères-et-Lamensens$/u, 'Bordères-et-Lamensans') + selector: /^Bordères-et-Lamensens$/, + fix: (toFix: string): string => toFix.toString().replace(/^Bordères-et-Lamensens$/, 'Bordères-et-Lamensans') }; const FIX_SPELLING_NAME_OF_PIERREFFITTES_NESTALAS: CleanOperation = { name: 'fix typo in Pierreffitte-Nestalas ', - selector: /^Pierreffitte-Nestalas$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Pierreffitte-Nestalas$/u, 'Pierrefitte-Nestalas') + selector: /^Pierreffitte-Nestalas$/, + fix: (toFix: string): string => toFix.toString().replace(/^Pierreffitte-Nestalas$/, 'Pierrefitte-Nestalas') }; const FIX_SPELLING_NAME_OF_AYRE_SUR_LA_LYS: CleanOperation = { name: 'fix typo in Ayre-sur-la-Lys', - selector: /^Ayre-sur-la-Lys$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Ayre-sur-la-Lys$/u, 'Aire-sur-la-Lys') + selector: /^Ayre-sur-la-Lys$/, + fix: (toFix: string): string => toFix.toString().replace(/^Ayre-sur-la-Lys$/, 'Aire-sur-la-Lys') }; const FIX_SPELLING_NAME_OF_SAUGNACQ_ET_MURET: CleanOperation = { name: 'fix typo in Saugnacq-et-muret', - selector: /^Saugnacq-et-muret$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Saugnacq-et-muret$/u, 'Saugnac-et-muret') + selector: /^Saugnacq-et-muret$/, + fix: (toFix: string): string => toFix.toString().replace(/^Saugnacq-et-muret$/, 'Saugnac-et-muret') }; const FIX_FORGOTTEN_DASH_OF_SAINT_PHILIBERT_DE_GRANDLIEU: CleanOperation = { name: 'fix typo in Saint-Philbert-de-Grandlieu', - selector: /^Saint-Philbert-de-Grandlieu$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Saint-Philbert-de-Grandlieu$/u, 'Saint-Philbert-de-Grand-Lieu') + selector: /^Saint-Philbert-de-Grandlieu$/, + fix: (toFix: string): string => toFix.toString().replace(/^Saint-Philbert-de-Grandlieu$/, 'Saint-Philbert-de-Grand-Lieu') }; const FIX_FORGOTTEN_APOSTROPHE_OF_SAINT_DONAT_SUR_LHERBASSE: CleanOperation = { name: 'fix typo in Saint-Donat-sur-lHerbasse', - selector: /^Saint-Donat-sur-lHerbasse$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Saint-Donat-sur-lHerbasse$/u, "Saint-Donat-sur-l'Herbasse") + selector: /^Saint-Donat-sur-lHerbasse$/, + fix: (toFix: string): string => toFix.toString().replace(/^Saint-Donat-sur-lHerbasse$/, "Saint-Donat-sur-l'Herbasse") }; const FIX_FORGOTTEN_LETTER_L_OF_LES_MOLETTES: CleanOperation = { name: 'fix typo in Les-Molettes', - selector: /^Les-Molettes$/u, - fix: (toFix: string): string => toFix.toString().replace(/^Les-Molettes/u, 'Les-Mollettes') + selector: /^Les-Molettes$/, + fix: (toFix: string): string => toFix.toString().replace(/^Les-Molettes/, 'Les-Mollettes') }; export const CLEAN_COMMUNE: CleanOperation[] = [ FIX_UNEXPECTED_DETAILS, diff --git a/src/transformer/fields/adresse/find-commune.spec.ts b/src/transformer/fields/adresse/find-commune.spec.ts index f40f750e..07ff76f7 100644 --- a/src/transformer/fields/adresse/find-commune.spec.ts +++ b/src/transformer/fields/adresse/find-commune.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Commune, findCommune } from './find-commune'; const BEGLES: Commune = { diff --git a/src/transformer/fields/autres-formations-labels/autres-formations-labels.field.spec.ts b/src/transformer/fields/autres-formations-labels/autres-formations-labels.field.spec.ts index 5bbd3f82..feb2d0b9 100644 --- a/src/transformer/fields/autres-formations-labels/autres-formations-labels.field.spec.ts +++ b/src/transformer/fields/autres-formations-labels/autres-formations-labels.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Adresse, Localisation } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { type Polygon } from 'geojson'; import { isInQpv, isInZrr } from '../../data'; diff --git a/src/transformer/fields/contact/clean-operations.ts b/src/transformer/fields/contact/clean-operations.ts index 14e49a3f..8f4ec1cc 100644 --- a/src/transformer/fields/contact/clean-operations.ts +++ b/src/transformer/fields/contact/clean-operations.ts @@ -26,353 +26,353 @@ const setPhoneCodeWhenDomTom = (codePostal?: string): string => { const replaceNewlineInWebsites = (field: string): CleanOperation => ({ name: 'replace newline in websites', - selector: /\n/u, + selector: /\n/, field, - fix: (toFix: string): string => toFix.replace(/\n/u, '') + fix: (toFix: string): string => toFix.replace(/\n/, '') }); const replaceDoubleDotBySingleDotInWebsites = (field: string): CleanOperation => ({ name: ': instead of . after www', - selector: /www:/gu, + selector: /www:/g, field, - fix: (toFix: string): string => toFix.replace(/www:/gu, 'www.') + fix: (toFix: string): string => toFix.replace(/www:/g, 'www.') }); const removeWebsitesStartingWithAt = (field: string): CleanOperation => ({ name: 'remove url starting by at', - selector: /^@/u, + selector: /^@/, field }); const removeWebsitesWithAccentedCharacters = (field: string): CleanOperation => ({ name: 'websites with accented characters', // eslint-disable-next-line no-control-regex - selector: /[^\x00-\x7F]+/gu, + selector: /[^\x00-\x7F]+/g, field }); const removeMissingExtensionWebsites = (field: string): CleanOperation => ({ name: 'missing extension websites', - selector: /^.*(? ({ name: 'missing http websites with multiple url', - selector: /\|((?!http[s]?:\/\/)[^|]+)/gu, + selector: /\|((?!http[s]?:\/\/)[^|]+)/g, field, - fix: (toFix: string): string => toFix.replace(/\|((?!http[s]?:\/\/)[^|]+)/gu, '|http://$1') + fix: (toFix: string): string => toFix.replace(/\|((?!http[s]?:\/\/)[^|]+)/g, '|http://$1') }); const fixMissingHttpWebsites = (field: string): CleanOperation => ({ name: 'missing http websites', - selector: /^(?!http).*/u, + selector: /^(?!http).*/, field, fix: (toFix: string): string => `http://${toFix}` }); const fixUppercaseWebsites = (field: string): CleanOperation => ({ name: 'uppercase in websites', - selector: /[A-Z]/u, + selector: /[A-Z]/, field, fix: (toFix: string): string => toFix.toLowerCase() }); const fixMisplacedColonInWebsite = (field: string): CleanOperation => ({ name: 'missing colon websites', - selector: /https\/\/:/u, + selector: /https\/\/:/, field, - fix: (toFix: string): string => toFix.replace(/https\/\/:/u, 'https://') + fix: (toFix: string): string => toFix.replace(/https\/\/:/, 'https://') }); const fixMissingColonWebsites = (field: string): CleanOperation => ({ name: 'missing colon websites', - selector: /(https?)(\/\/)/u, + selector: /(https?)(\/\/)/, field, - fix: (toFix: string): string => toFix.replace(/(https?)(\/\/)/u, '$1:$2') + fix: (toFix: string): string => toFix.replace(/(https?)(\/\/)/, '$1:$2') }); const fixMultipleUrlNotSeparatedWebsites = (field: string): CleanOperation => ({ name: 'missing separator between url', - selector: /(https?:\/\/[^|]+(?!\|))(https?:\/\/)/gu, + selector: /(https?:\/\/[^|]+(?!\|))(https?:\/\/)/g, field, - fix: (toFix: string): string => toFix.replace(/(https?:\/\/[^|]+(?!\|))(https?:\/\/)/gu, '$1|$2') + fix: (toFix: string): string => toFix.replace(/(https?:\/\/[^|]+(?!\|))(https?:\/\/)/g, '$1|$2') }); const fixDuplicateHttpWebsites = (field: string): CleanOperation => ({ name: 'duplicate http websites', - selector: /^https?:\/\/https?:\/\/.*/u, + selector: /^https?:\/\/https?:\/\/.*/, field, - fix: (toFix: string): string => toFix.replace(/^https?:\/\/https?:\/\//u, 'https://') + fix: (toFix: string): string => toFix.replace(/^https?:\/\/https?:\/\//, 'https://') }); const fixWebsitesSeparator = (field: string): CleanOperation => ({ name: 'websites separator', - selector: /;|\s(?:ou|\/|;)\s/u, + selector: /;|\s(?:ou|\/|;)\s/, field, - fix: (toFix: string): string => toFix.replace(/;|\s(?:ou|\/|;)\s/u, '|') + fix: (toFix: string): string => toFix.replace(/;|\s(?:ou|\/|;)\s/, '|') }); const fixWebsitesWithSingleSlash = (field: string): CleanOperation => ({ name: 'website without colon and slash', - selector: /^https?:\/www/u, + selector: /^https?:\/www/, field, - fix: (toFix: string): string => toFix.replace(/:\/www/u, '://www') + fix: (toFix: string): string => toFix.replace(/:\/www/, '://www') }); const fixWebsitesWithoutColonAndSlash = (field: string): CleanOperation => ({ name: 'website without colon and slash', - selector: /^https?\/www/u, + selector: /^https?\/www/, field, - fix: (toFix: string): string => toFix.replace(/^https?\/www/u, 'https://www') + fix: (toFix: string): string => toFix.replace(/^https?\/www/, 'https://www') }); const fixWebsitesWithComaInsteadOfDot = (field: string): CleanOperation => ({ name: 'website with coma instead of dot', - selector: /^http:\/\/www,/u, + selector: /^http:\/\/www,/, field, - fix: (toFix: string): string => toFix.replace(/^http:\/\/www,/u, 'http://www.') + fix: (toFix: string): string => toFix.replace(/^http:\/\/www,/, 'http://www.') }); const fixWebsitesWithMissingSlashAfterHttp = (field: string): CleanOperation => ({ name: 'website with coma instead of dot', - selector: /^http:\/[^/]/u, + selector: /^http:\/[^/]/, field, - fix: (toFix: string): string => toFix.replace(/^http:\//u, 'http://') + fix: (toFix: string): string => toFix.replace(/^http:\//, 'http://') }); const removeWebsitesWithSpaces = (field: string): CleanOperation => ({ name: 'websites with spaces', - selector: /\s/u, + selector: /\s/, field }); const fixWebsitesWithCodedSpacesAndParenthese = (field: string): CleanOperation => ({ name: 'websites with coded spaces', - selector: /[()]/gu, + selector: /[()]/g, field, - fix: (toFix: string): string => toFix.replace(/[()]/gu, (match: string): string => (match === '(' ? '%28' : '%29')) + fix: (toFix: string): string => toFix.replace(/[()]/g, (match: string): string => (match === '(' ? '%28' : '%29')) }); const fixDetailsInParenthesisInPhone = (field: string): CleanOperation => ({ name: 'trailing details in phone', - selector: /\s\(.*\)$/gu, + selector: /\s\(.*\)$/g, field, - fix: (toFix: string): string => toFix.replace(/\s\(.*\)$/gu, '') + fix: (toFix: string): string => toFix.replace(/\s\(.*\)$/g, '') }); const fixHeadingDetailsInPhone = (field: string): CleanOperation => ({ name: 'heading details in phone', - selector: /^\D{3,}/gu, + selector: /^\D{3,}/g, field, - fix: (toFix: string): string => toFix.replace(/^\D{3,}/gu, '') + fix: (toFix: string): string => toFix.replace(/^\D{3,}/g, '') }); const fixTrailingDetailsInPhone = (field: string): CleanOperation => ({ name: 'trailing details in phone', - selector: /\s[A-Za-z].*$/gu, + selector: /\s[A-Za-z].*$/g, field, - fix: (toFix: string): string => toFix.replace(/\s[A-Za-z].*$/gu, '') + fix: (toFix: string): string => toFix.replace(/\s[A-Za-z].*$/g, '') }); const fixWrongCharsInPhone = (field: string): CleanOperation => ({ name: 'wrong chars in phone', - selector: /(?!\w|\+)./gu, + selector: /(?!\w|\+)./g, field, - fix: (toFix: string): string => toFix.replace(/(?!\w|\+)./gu, '') + fix: (toFix: string): string => toFix.replace(/(?!\w|\+)./g, '') }); const fixUnexpectedPhoneList = (field: string): CleanOperation => ({ name: 'unexpected phone list', - selector: /\d{10}\/\/?\d{10}/u, + selector: /\d{10}\/\/?\d{10}/, field, fix: (toFix: string): string => toFix.split('/')[0] ?? '' }); const fixPhoneWithoutStarting0 = (field: string, codePostal?: string): CleanOperation => ({ name: 'phone without starting 0', - selector: /^[1-9]\d{8}$/u, + selector: /^[1-9]\d{8}$/, field, fix: (toFix: string): string => setPhoneCodeWhenDomTom(codePostal) + toFix }); const fixShortCafPhone = (field: string): CleanOperation => ({ name: 'short CAF phone', - selector: /3230/u, + selector: /3230/, field, fix: (): string => '+33969322121' }); const fixShortAssuranceRetraitePhone = (field: string): CleanOperation => ({ name: 'short assurance retraite phone', - selector: /3960/u, + selector: /3960/, field, fix: (): string => '+33971103960' }); const fixMissingPlusCharAtStartingPhone = (field: string): CleanOperation => ({ name: 'fix missing + at starting phone number', - selector: /^33(\d+)/u, + selector: /^33(\d+)/, field, - fix: (toFix: string): string => toFix.replace(/^33(\d+)/u, '+33$1') + fix: (toFix: string): string => toFix.replace(/^33(\d+)/, '+33$1') }); const removeTooFewDigitsInPhone = (field: string): CleanOperation => ({ name: 'too few digits in phone', - selector: /^.{0,9}$/u, + selector: /^.{0,9}$/, field }); const removeTooManyDigitsInPhone = (field: string): CleanOperation => ({ name: 'too many digits in phone', - selector: /^0.{10,}/u, + selector: /^0.{10,}/, field }); const removeOnly0ValueInPhone = (field: string): CleanOperation => ({ name: 'fake number in phone', - selector: /^0{10}$/u, + selector: /^0{10}$/, field }); const removeNoValidNumbersInPhone = (field: string): CleanOperation => ({ name: 'fake number in phone', - selector: /^[1-9]\d{9}$/u, + selector: /^[1-9]\d{9}$/, field }); const removeStartingByTwoZeroInPhone = (field: string): CleanOperation => ({ name: 'fake number in phone', - selector: /^00.+/u, + selector: /^00.+/, field }); const keepFirstNumberIfMultiple = (field: string): CleanOperation => ({ name: 'keep only the first phone number', - selector: /\n/u, + selector: /\n/, field, fix: (toFix: string): string => /^(?[^\n]+)/u.exec(toFix)?.groups?.['phone'] ?? '' }); const fixSpaceBeforeDotInEmail = (field: string): CleanOperation => ({ name: 'remove space before dot.', - selector: /\w\s\./u, + selector: /\w\s\./, field, - fix: (toFix: string): string => toFix.replace(/(\w)\s\./u, '$1.') + fix: (toFix: string): string => toFix.replace(/(\w)\s\./, '$1.') }); const fixSpaceInEmail = (field: string): CleanOperation => ({ name: 'remove space in email.', - selector: /^\w+@\w+\s\w+\.\w+$/u, + selector: /^\w+@\w+\s\w+\.\w+$/, field, - fix: (toFix: string): string => toFix.replace(/\s/u, '') + fix: (toFix: string): string => toFix.replace(/\s/, '') }); const removeTextPrecededByWrongCharacterInEmail = (field: string): CleanOperation => ({ name: 'text preceded by wrong wharacter', - selector: /^\w+[;\s]/u, + selector: /^\w+[;\s]/, field, - fix: (toFix: string): string => toFix.replace(/^\w+[;\s]/u, '') + fix: (toFix: string): string => toFix.replace(/^\w+[;\s]/, '') }); const removeEmailStartingWithWww = (field: string): CleanOperation => ({ name: 'email starts with www.', - selector: /^www\./u, + selector: /^www\./, field }); const removeEmailStartingWithAt = (field: string): CleanOperation => ({ name: 'email starts with @', - selector: /^@/u, + selector: /^@/, field }); const fixEmailWithTwoArobase = (field: string): CleanOperation => ({ name: 'email with two @', - selector: /@@/u, + selector: /@@/, field, - fix: (toFix: string): string => toFix.replace(/@@/u, '@') + fix: (toFix: string): string => toFix.replace(/@@/, '@') }); const trimEmail = (field: string): CleanOperation => ({ name: 'email starts with mailto:', - selector: /^\s+|\s+$/u, + selector: /^\s+|\s+$/, field, fix: (toFix: string): string => toFix.trim() }); const fixEmailStartingWithMailToOrColon = (field: string): CleanOperation => ({ name: 'email starts with mailto: or colon', - selector: /^mailto:|:/u, + selector: /^mailto:|:/, field, - fix: (toFix: string): string => toFix.replace(/^mailto:|:/u, '') + fix: (toFix: string): string => toFix.replace(/^mailto:|:/, '') }); const fixUnexpectedEmailLabel = (field: string): CleanOperation => ({ name: 'unexpected email label', - selector: /\S\s:\s\S/u, + selector: /\S\s:\s\S/, field, - fix: (toFix: string): string => toFix.split(/\s:\s/u)[1] ?? '' + fix: (toFix: string): string => toFix.split(/\s:\s/)[1] ?? '' }); const fixStartingWithDotEmail = (field: string): CleanOperation => ({ name: 'email starting with dot', - selector: /^\.([^@]+)@/u, + selector: /^\.([^@]+)@/, field, - fix: (toFix: string): string => toFix.replace(/^\.([^@]+)@/u, '$1@') + fix: (toFix: string): string => toFix.replace(/^\.([^@]+)@/, '$1@') }); const fixUnexpectedEmailSeparator = (field: string): CleanOperation => ({ name: 'unexpected email separator', - selector: /\S\s?(?:et|ou|;|\s|\/)\s?\S/u, + selector: /\S\s?(?:et|ou|;|\s|\/)\s?\S/, field, - fix: (toFix: string): string => toFix.replace(/\s?(?:et|ou|;|\s|\/)\s?/gu, '|') + fix: (toFix: string): string => toFix.replace(/\s?(?:et|ou|;|\s|\/)\s?/g, '|') }); const fixObfuscatedAtInEmail = (field: string): CleanOperation => ({ name: 'obfuscated @ in email', - selector: /\[a\]/gu, + selector: /\[a\]/g, field, fix: (toFix: string): string => toFix.replace('[a]', '@') }); const removeMissingAtInEmail = (field: string): CleanOperation => ({ name: 'missing @ in email', - selector: /^[^@]+$/gu, + selector: /^[^@]+$/g, field }); const fixMissingEmailExtension = (field: string): CleanOperation => ({ name: 'missing dot suffix in email', - selector: /\.[a-z]{2,3}$/u, + selector: /\.[a-z]{2,3}$/, field, negate: true }); const removeDashEmail = (field: string): CleanOperation => ({ name: 'dash email', - selector: /^-+$/u, + selector: /^-+$/, field }); const removeMultipleAtEmail = (field: string): CleanOperation => ({ name: 'multiple at', - selector: /@.+@/u, + selector: /@.+@/, field }); const fixMissingAccentuatedEInEmail = (field: string): CleanOperation => ({ name: 'fix accentuated chars', - selector: /[éè]/u, + selector: /[éè]/, field, - fix: (toFix: string): string => toFix.replace(/[éè]/gu, 'e') + fix: (toFix: string): string => toFix.replace(/[éè]/g, 'e') }); const fixMissingAccentuatedCInEmail = (field: string): CleanOperation => ({ name: 'fix accentuated chars', - selector: /ç/u, + selector: /ç/, field, - fix: (toFix: string): string => toFix.replace(/ç/gu, 'c') + fix: (toFix: string): string => toFix.replace(/ç/g, 'c') }); const cleanOperationIfAny = ( diff --git a/src/transformer/fields/contact/contact.field.spec.ts b/src/transformer/fields/contact/contact.field.spec.ts index 7054bf40..48ea5dc5 100644 --- a/src/transformer/fields/contact/contact.field.spec.ts +++ b/src/transformer/fields/contact/contact.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Contact, Courriel, Url } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { Report } from '../../report'; diff --git a/src/transformer/fields/contact/contact.field.ts b/src/transformer/fields/contact/contact.field.ts index fb70c95c..ea84f615 100644 --- a/src/transformer/fields/contact/contact.field.ts +++ b/src/transformer/fields/contact/contact.field.ts @@ -5,7 +5,7 @@ import { cleanOperations, CleanOperation } from './clean-operations'; type FixedContact = DataSource | undefined; -const toInternationalFormat = (phone: string): string => (/^0\d{9}$/u.test(phone) ? `+33${phone.slice(1)}` : phone); +const toInternationalFormat = (phone: string): string => (/^0\d{9}$/.test(phone) ? `+33${phone.slice(1)}` : phone); const telephoneField = (telephone?: number | string): Pick => telephone == null @@ -14,7 +14,7 @@ const telephoneField = (telephone?: number | string): Pick telephone: toInternationalFormat( telephone .toString() - .replace(/[\s,.-]/gu, '') + .replace(/[\s,.-]/g, '') .replace('(0)', '') .trim() ) diff --git a/src/transformer/fields/date/date.field.spec.ts b/src/transformer/fields/date/date.field.spec.ts index 281212e2..60f8b021 100644 --- a/src/transformer/fields/date/date.field.spec.ts +++ b/src/transformer/fields/date/date.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { processDate } from './date.field'; import { LieuxMediationNumeriqueMatching } from '../../input'; diff --git a/src/transformer/fields/dispositifs-programmes-nationaux/dispositifs-programmes-nationaux.field.spec.ts b/src/transformer/fields/dispositifs-programmes-nationaux/dispositifs-programmes-nationaux.field.spec.ts index 3748f482..157fc999 100644 --- a/src/transformer/fields/dispositifs-programmes-nationaux/dispositifs-programmes-nationaux.field.spec.ts +++ b/src/transformer/fields/dispositifs-programmes-nationaux/dispositifs-programmes-nationaux.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { DispositifProgrammeNational, DispositifProgrammesNationaux } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { processDispositifProgrammeNationaux } from './dispositifs-programmes-nationaux.field'; diff --git a/src/transformer/fields/fiche-acces-libre/fiche-acces-libre.field.spec.ts b/src/transformer/fields/fiche-acces-libre/fiche-acces-libre.field.spec.ts index f4cd3e87..2c0f6865 100644 --- a/src/transformer/fields/fiche-acces-libre/fiche-acces-libre.field.spec.ts +++ b/src/transformer/fields/fiche-acces-libre/fiche-acces-libre.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Adresse } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { Erp, processFicheAccesLibre } from './fiche-acces-libre.field'; diff --git a/src/transformer/fields/fiche-acces-libre/fiche-acces-libre.field.ts b/src/transformer/fields/fiche-acces-libre/fiche-acces-libre.field.ts index 4d2db364..558f6f8b 100644 --- a/src/transformer/fields/fiche-acces-libre/fiche-acces-libre.field.ts +++ b/src/transformer/fields/fiche-acces-libre/fiche-acces-libre.field.ts @@ -44,7 +44,7 @@ const getAccessibiliteFromAccesLibre = ( const canProcessAccessibilite = (source: DataSource, accessibilite?: Colonne): accessibilite is Colonne => accessibilite?.colonne != null && source[accessibilite.colonne] != null && source[accessibilite.colonne] !== ''; -const fixUrl = (url: string): string => url.replace(/\(/gu, '%28').replace(/\)/gu, '%29'); +const fixUrl = (url: string): string => url.replace(/\(/g, '%28').replace(/\)/g, '%29'); export const processFicheAccesLibre = ( source: DataSource, diff --git a/src/transformer/fields/formations-labels/formations-labels.field.spec.ts b/src/transformer/fields/formations-labels/formations-labels.field.spec.ts index 2e36ba77..fe3896e0 100644 --- a/src/transformer/fields/formations-labels/formations-labels.field.spec.ts +++ b/src/transformer/fields/formations-labels/formations-labels.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { FormationLabel, FormationsLabels } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { processFormationsLabels } from './formations-labels.field'; diff --git a/src/transformer/fields/frais-a-charge/frais-a-charge.field.spec.ts b/src/transformer/fields/frais-a-charge/frais-a-charge.field.spec.ts index b8ca4b8b..d93a9b09 100644 --- a/src/transformer/fields/frais-a-charge/frais-a-charge.field.spec.ts +++ b/src/transformer/fields/frais-a-charge/frais-a-charge.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Frais, FraisACharge } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { processFraisACharge } from './frais-a-charge.field'; diff --git a/src/transformer/fields/horaires/horaires.field.spec.ts b/src/transformer/fields/horaires/horaires.field.spec.ts index 4e12b3fc..6524eda4 100644 --- a/src/transformer/fields/horaires/horaires.field.spec.ts +++ b/src/transformer/fields/horaires/horaires.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { OsmOpeningHoursString } from './process-horaires.field'; import { processHoraires } from './horaires.field'; diff --git a/src/transformer/fields/horaires/horaires.field.ts b/src/transformer/fields/horaires/horaires.field.ts index d7c08d81..de4846f7 100644 --- a/src/transformer/fields/horaires/horaires.field.ts +++ b/src/transformer/fields/horaires/horaires.field.ts @@ -8,10 +8,10 @@ import { openingHoursFromWeek } from './opening-hours-from-week'; const SEMAINE_IMPAIRE: string = 'week 1-53/2 '; const SEMAINE_PAIRE: string = 'week 2-52/2 '; -const OPENING_HOURS_REGEXP: RegExp = /^\d{2}:\d{2}-\d{2}:\d{2}(?:,\d{2}:\d{2}-\d{2}:\d{2})?$/u; +const OPENING_HOURS_REGEXP: RegExp = /^\d{2}:\d{2}-\d{2}:\d{2}(?:,\d{2}:\d{2}-\d{2}:\d{2})?$/; const OSM_OPENING_HOURS_TRIVIAL_REGEXP: RegExp = - /^(?:(?:Mo|Tu|We|Th|Fr|Sa|Su)(?:[-,](?:Mo|Tu|We|Th|Fr|Sa|Su))?\s)?(?:[0-1]\d|2[0-3]):[0-5]\d-(?:[0-1]\d|2[0-3]):[0-5]\d.*/u; + /^(?:(?:Mo|Tu|We|Th|Fr|Sa|Su)(?:[-,](?:Mo|Tu|We|Th|Fr|Sa|Su))?\s)?(?:[0-1]\d|2[0-3]):[0-5]\d-(?:[0-1]\d|2[0-3]):[0-5]\d.*/; const throwInvalidHours = (osmHours: string, day: OsmDaysOfWeek, hours: string): OsmOpeningHours => { throw new InvalidHoursError(osmHours, hours, day); diff --git a/src/transformer/fields/horaires/opening-hours-from-week.ts b/src/transformer/fields/horaires/opening-hours-from-week.ts index 7450f372..20bb4949 100644 --- a/src/transformer/fields/horaires/opening-hours-from-week.ts +++ b/src/transformer/fields/horaires/opening-hours-from-week.ts @@ -82,7 +82,7 @@ const processOpeningHours = (singleStringOpeningHours?: string): OsmOpeningHours .sort(byDayOfWeek); const isValidOdmHours = (osmOpeningHours: OsmOpeningHoursString): boolean => - /(?:Mo|Tu|We|Th|Fr|Sa|Su)\s?;|(?:Mo|Tu|We|Th|Fr|Sa|Su)\s?$/gu.test(osmOpeningHours ?? ''); + /(?:Mo|Tu|We|Th|Fr|Sa|Su)\s?;|(?:Mo|Tu|We|Th|Fr|Sa|Su)\s?$/g.test(osmOpeningHours ?? ''); export const openingHoursFromWeek = (horairesSingleField?: string): OsmOpeningHoursString => ((singleStringOpeningHours: OsmOpeningHoursString): OsmOpeningHoursString => diff --git a/src/transformer/fields/id/id.field.spec.ts b/src/transformer/fields/id/id.field.spec.ts index 6107e926..b2177131 100644 --- a/src/transformer/fields/id/id.field.spec.ts +++ b/src/transformer/fields/id/id.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { processId } from './id.field'; @@ -6,16 +7,20 @@ describe('id field', (): void => { const matching: LieuxMediationNumeriqueMatching = { id: { colonne: 'ID' + }, + source: { + colonne: 'source' } } as LieuxMediationNumeriqueMatching; const source: DataSource = { - ID: 'a91cae7af848a1c65' + ID: 'a91cae7af848a1c65', + source: 'Hinaura' }; - const id: string = processId(source, matching, 0); + const id: string = processId(source, matching, 0, 'Default'); - expect(id).toBe('a91cae7af848a1c65'); + expect(id).toBe('Hinaura_a91cae7af848a1c65'); }); it('should get index as id when no id in matching information', (): void => { @@ -23,8 +28,8 @@ describe('id field', (): void => { const source: DataSource = {}; - const id: string = processId(source, matching, 0); + const id: string = processId(source, matching, 0, 'Default'); - expect(id).toBe('0'); + expect(id).toBe('Default_0'); }); }); diff --git a/src/transformer/fields/id/id.field.ts b/src/transformer/fields/id/id.field.ts index e2f8c942..8d1b95e8 100644 --- a/src/transformer/fields/id/id.field.ts +++ b/src/transformer/fields/id/id.field.ts @@ -1,5 +1,16 @@ import { Id } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; -export const processId = (source: DataSource, matching: LieuxMediationNumeriqueMatching, index: number): Id => - Id((matching.id == null ? index.toString() : source[matching.id.colonne]?.toString()) ?? index.toString()); +const getId = (matching: LieuxMediationNumeriqueMatching, index: number, source: DataSource) => + Id(matching.id == null ? index.toString() : source[matching.id.colonne]?.toString()); + +const sourceIfAny = (source: DataSource, sourceName: string, colonne?: string): string => + colonne == null || source[colonne] == null || (source[colonne] as string) === '' ? sourceName : (source[colonne] as string); + +export const processId = ( + source: DataSource, + matching: LieuxMediationNumeriqueMatching, + index: number, + sourceName: string +): Id => + Id(`${sourceIfAny(source, sourceName, matching.source?.colonne)}_${getId(matching, index, source)}`.replace(/\s+/g, '-')); diff --git a/src/transformer/fields/itinerance/itinerance.field.spec.ts b/src/transformer/fields/itinerance/itinerance.field.spec.ts index 39fa2507..ebe0855d 100644 --- a/src/transformer/fields/itinerance/itinerance.field.spec.ts +++ b/src/transformer/fields/itinerance/itinerance.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Itinerance, Itinerances } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { processItinerances } from './itinerance.field'; diff --git a/src/transformer/fields/localisation/localisation.field.spec.ts b/src/transformer/fields/localisation/localisation.field.spec.ts index 3dd7a527..bc3979af 100644 --- a/src/transformer/fields/localisation/localisation.field.spec.ts +++ b/src/transformer/fields/localisation/localisation.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Localisation } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { NO_LOCALISATION, processLocalisation } from './localisation.field'; diff --git a/src/transformer/fields/modalites-acces/modalites-acces.field.spec.ts b/src/transformer/fields/modalites-acces/modalites-acces.field.spec.ts index a1ca5da1..bf74b81d 100644 --- a/src/transformer/fields/modalites-acces/modalites-acces.field.spec.ts +++ b/src/transformer/fields/modalites-acces/modalites-acces.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { ModaliteAcces, ModalitesAcces } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { processModalitesAcces } from './modalites-acces.field'; diff --git a/src/transformer/fields/modalites-accompagnement/modalites-accompagnement.field.spec.ts b/src/transformer/fields/modalites-accompagnement/modalites-accompagnement.field.spec.ts index 16567115..8e68a62d 100644 --- a/src/transformer/fields/modalites-accompagnement/modalites-accompagnement.field.spec.ts +++ b/src/transformer/fields/modalites-accompagnement/modalites-accompagnement.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { ModaliteAccompagnement, ModalitesAccompagnement } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { processModalitesAccompagnement } from './modalites-accompagnement.field'; diff --git a/src/transformer/fields/nom/nom.field.spec.ts b/src/transformer/fields/nom/nom.field.spec.ts index 5e92229c..5d955e65 100644 --- a/src/transformer/fields/nom/nom.field.spec.ts +++ b/src/transformer/fields/nom/nom.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { processNom } from './nom.field'; diff --git a/src/transformer/fields/pivot/pivot.field.spec.ts b/src/transformer/fields/pivot/pivot.field.spec.ts index 6e81fc21..d39aac1b 100644 --- a/src/transformer/fields/pivot/pivot.field.spec.ts +++ b/src/transformer/fields/pivot/pivot.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { processPivot } from './pivot.field'; import { Pivot } from '@gouvfr-anct/lieux-de-mediation-numerique'; diff --git a/src/transformer/fields/presentation/presentation.field.spec.ts b/src/transformer/fields/presentation/presentation.field.spec.ts index 75e9c07a..7e56c570 100644 --- a/src/transformer/fields/presentation/presentation.field.spec.ts +++ b/src/transformer/fields/presentation/presentation.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Presentation } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { processPresentation } from './presentation.field'; diff --git a/src/transformer/fields/prise-rdv/prise-rdv.field.spec.ts b/src/transformer/fields/prise-rdv/prise-rdv.field.spec.ts index 27555787..fafb487a 100644 --- a/src/transformer/fields/prise-rdv/prise-rdv.field.spec.ts +++ b/src/transformer/fields/prise-rdv/prise-rdv.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { processPriseRdv } from './prise-rdv.field'; diff --git a/src/transformer/fields/prises-en-charge-specifiques/prises-en-charge-specifiques.field.spec.ts b/src/transformer/fields/prises-en-charge-specifiques/prises-en-charge-specifiques.field.spec.ts index 3549f8c2..c6c43061 100644 --- a/src/transformer/fields/prises-en-charge-specifiques/prises-en-charge-specifiques.field.spec.ts +++ b/src/transformer/fields/prises-en-charge-specifiques/prises-en-charge-specifiques.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { PriseEnChargeSpecifique, PrisesEnChargeSpecifiques } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { processPrisesEnChargeSpecifiques } from './prises-en-charge-specifiques.field'; diff --git a/src/transformer/fields/prive/prive.field.spec.ts b/src/transformer/fields/prive/prive.field.spec.ts index d7ef95fd..c7b36fc3 100644 --- a/src/transformer/fields/prive/prive.field.spec.ts +++ b/src/transformer/fields/prive/prive.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { ModaliteAcces } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { isPrive } from './prive.field'; diff --git a/src/transformer/fields/publics-specifiquement-adresses/publics-specifiquement-adresses.field.spec.ts b/src/transformer/fields/publics-specifiquement-adresses/publics-specifiquement-adresses.field.spec.ts index cb52bbed..4de3d468 100644 --- a/src/transformer/fields/publics-specifiquement-adresses/publics-specifiquement-adresses.field.spec.ts +++ b/src/transformer/fields/publics-specifiquement-adresses/publics-specifiquement-adresses.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { PublicSpecifiquementAdresse } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { processPublicsSpecifiquementAdresses } from './publics-specifiquement-adresses.field'; diff --git a/src/transformer/fields/services/services.field.spec.ts b/src/transformer/fields/services/services.field.spec.ts index 9f90b4a8..17688215 100644 --- a/src/transformer/fields/services/services.field.spec.ts +++ b/src/transformer/fields/services/services.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { processServices } from './services.field'; import { Service } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { DataSource, LieuxMediationNumeriqueMatching } from '../../input'; diff --git a/src/transformer/fields/source/source.field.spec.ts b/src/transformer/fields/source/source.field.spec.ts index 4db1b7bb..9c3f49de 100644 --- a/src/transformer/fields/source/source.field.spec.ts +++ b/src/transformer/fields/source/source.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { LieuxMediationNumeriqueMatching, DataSource } from '../../input'; import { processSource } from './source.field'; diff --git a/src/transformer/fields/typologies/name-to-typologie.ts b/src/transformer/fields/typologies/name-to-typologie.ts index c4b38f32..b26c3f4d 100644 --- a/src/transformer/fields/typologies/name-to-typologie.ts +++ b/src/transformer/fields/typologies/name-to-typologie.ts @@ -4,346 +4,387 @@ import { TypologieMatcher } from './typologies.field'; export const TYPOLOGIE_MATCHERS: TypologieMatcher[] = [ { typologie: Typologie.BIB, - matchers: [ - /m[ée]diath[èeé]que/iu, - /bibl?ioth[èeé]que/iu, - /Mediathquete/iu, - /Mediathque/iu, - /Médiathqèue/iu, - /Médiatthèque/iu - ] + matchers: [/m[ée]diath[èeé]que/i, /bibl?ioth[èeé]que/i, /Mediathquete/i, /Mediathque/i, /Médiathqèue/i, /Médiatthèque/i] }, { typologie: Typologie.TIERS_LIEUX, - matchers: [/tiers[\s-]lieu/iu, /cowork/iu] + matchers: [/tiers[\s-]lieu/i, /cowork/i] }, { typologie: Typologie.ML, - matchers: [/mission locale/iu, /mis local/iu] + matchers: [/mission locale/i, /mis local/i] }, { typologie: Typologie.MDS, matchers: [ - /(?:^|\W)MDSI?(?:\W|$)/iu, - /(?:^|\W)MSD(?:\W|$)/iu, - /maison du d[ée]partement/iu, - /(?:maison|espace|centre) d[eé]partementale?s? des? (?:la )?solidarit[eé]s?/iu, - /(?:maison|espace|centre) d[eé]partementale?s? de proximit[eé]/iu, - /(?:maison|espace|centre) des? (?:la )?solidarit[eé]s? d[eé]partementale?s?/iu + /(?:^|\W)MDSI?(?:\W|$)/i, + /(?:^|\W)MSD(?:\W|$)/i, + /(?:^|\W)EDS(?:\W|$)/i, + /maison du d[ée]partement/i, + /(?:maison|espace|centre) d[eé]partementale?s? des? (?:la )?solidarit[eé]s?/i, + /(?:maison|espace|centre) d[eé]partementale?s? de proximit[eé]/i, + /(?:maison|espace|centre) des? (?:la )?solidarit[eé]s? d[eé]partementale?s?/i ] }, { typologie: Typologie.CHRS, - matchers: [/centre d'h[eé]bergement et de r[eé]insertion sociale/iu] + matchers: [/centre d'h[eé]bergement et de r[eé]insertion sociale/i] }, { typologie: Typologie.CHU, - matchers: [/(?:^|\W)CHU(?:\W|$)/iu] + matchers: [/Centre (?:d')?h[ée]bergement (?:d')?urgence/i] }, { typologie: Typologie.CAF, - matchers: [/caisse d[’'\s]allocations familiales/iu, /(?:^|\s)CAF(?:\s|@|$)/iu] + matchers: [/caisse d[’'\s]allocations familiales/i, /(?:^|\s)CAF(?:\s|@|$)/i] }, { typologie: Typologie.CADA, - matchers: [/CADA\s/iu] + matchers: [/CADA\s/i, /centre d'accueil (?:pour )?demandeurs? d'Asile/i] + }, + { + typologie: Typologie.CAARUD, + matchers: [/CAARUD/i] }, { typologie: Typologie.CD, - matchers: [/^CON?SEIL DEP/iu, /CDAD/iu] + matchers: [/^CON?SEIL DEP/i, /CDAD/i] }, { typologie: Typologie.CDAS, - matchers: [/^CDAS(?:\s|$)/iu] + matchers: [/^CDAS(?:\s|$)/i, /Maison Départementale d'Action Sociale/i] }, { typologie: Typologie.CFP, - matchers: [/Finances Publiques/iu, /Finances Public/iu] + matchers: [/Finances Publiques/i, /Finances Public/i] }, { typologie: Typologie.RS_FJT, - matchers: [/(?:^|\W)FJT(?:\W|$)/iu] + matchers: [/(?:^|\W)FJT(?:\W|$)/i] }, { typologie: Typologie.ACI, - matchers: [/^ACI\s/iu, /Chantier d'Insertion/iu] + matchers: [/^ACI\s/i, /Chantier d'Insertion/i] }, { typologie: Typologie.ASSO, matchers: [ - /(?:^|\W)ASS(?:\W|$)/iu, - /(?:^|\W)ASSOC(?:\W|$)/iu, - /association/iu, - /emma[üu]s/iu, - /secours populaire/iu, - /croix[\s-]Rouge/iu, - /secours catholique/iu, - /restos du c(?:oe|œ)ur/iu, - /familles? rurales?/iu, - /LIGUE (?:DE L[\s']|D')?ENSEIGNEMENT/iu, - /Konexio/iu, - /Groupe SOS/iu, - /APF\s/iu, - /ASSO\s/iu, - /associatif/iu, - /Coallia/iu, - /(?:^|\W)AFR(?:\W|$)/iu + /(?:^|\W)ASS(?:\W|$)/i, + /(?:^|\W)ASSOC(?:\W|$)/i, + /association/i, + /emma[üu]s/i, + /secours populaire/i, + /croix[\s-]Rouge/i, + /secours catholique/i, + /restos du c(?:oe|œ)ur/i, + /familles? rurales?/i, + /LIGUE (?:DE L[\s']|D')?ENSEIGNEMENT/i, + /Konexio/i, + /Groupe SOS/i, + /APF\s/i, + /ASSO\s/i, + /associatif/i, + /Coallia/i, + /Restaurants du Coeur/i, + /(?:^|\W)AFR(?:\W|$)/i ] }, { typologie: Typologie.CD, - matchers: [/conseil d[eé]partemental/iu] + matchers: [/conseil d[eé]partemental/i] }, { typologie: Typologie.CC, - matchers: [/^communaut[ée] des? com(?:munes?)?/iu, /^cdc(?:\W|$)/iu, /^cc(?:\W|$)/iu] + matchers: [/^communaut[ée] (?:des? )?(?:inter)?com(?:munes?)?/i, /^cdc(?:\W|$)/i, /^cc(?:\W|$)/i] }, { typologie: Typologie.CCAS, matchers: [ - /(?:^|\W)ccas(?:\W|$)/iu, - /(?:^|\W)c\.c\.a\.s(?:\W|$)/iu, - /c(?:en)?tr?e com(?:munal)? action social/iu, - /centre communal.? d[’'\s]action social/iu + /(?:^|\W)ccas(?:\W|$)/i, + /(?:^|\W)c\.c\.a\.s(?:\W|$)/i, + /c(?:en)?tr?e com(?:munal)? action social/i, + /centre communal.? d[’'\s]action social/i ] }, { typologie: Typologie.CCONS, - matchers: [/CONSULAT/iu] + matchers: [/CONSULAT/i] }, { typologie: Typologie.CIAS, - matchers: [/(?:^|\W)CIAS(?:\W|$)/iu, /centre intercommunal d[’'\s]action sociale/iu] + matchers: [/(?:^|\W)CIAS(?:\W|$)/i, /centre intercommunal d[’'\s]actions? sociale/i] }, { typologie: Typologie.CIDFF, - matchers: [/(?:^|\W)CIDFF(?:\W|\d|$)/iu] + matchers: [/(?:^|\W)CIDFF(?:\W|\d|$)/i] }, { typologie: Typologie.CITMET, - matchers: [/Cit[ée] de l'Emploi/iu, /CJM/iu, /Cit[ée] des M[ée]tiers/iu] + matchers: [/Cit[ée] de l'Emploi/i, /CJM/i, /Cit[ée] des M[ée]tiers/i] }, { typologie: Typologie.CMP, - matchers: [/(?:^|\W)CMP(?:\W|\d|$)/iu, /Centre Médico Psychologique/iu] + matchers: [/(?:^|\W)CMP(?:\W|\d|$)/i, /Centre Médico Psychologique/i] }, { typologie: Typologie.CMS, - matchers: [/^CMS(?:\s|$)/iu, /^PMS(?:\s|$)/iu, /(?:Centre|P[oô]le|Relais) m[ée]dic(?:o|aux)\WSocia(?:l|ux)/iu] + matchers: [/^CMS(?:\s|$)/i, /^PMS(?:\s|$)/i, /(?:Centre|P[oô]le|Relais|Permanence)\Wm[ée]dic(?:o|aux)\WSocia(?:l|ux)/i] }, { typologie: Typologie.CPAM, - matchers: [/(?:^|\W)CPAM(?:\W|$)/iu, /CAISSE PRIMAIRE D?[' ]?ASSURANCE MALADIE/iu] + matchers: [/(?:^|\W)CPAM(?:\W|$)/i, /CAISSE PRIMAIRE D?[’' ]?ASSURANCE MALADIE/i] }, { typologie: Typologie.CPH, - matchers: [/(?:^|\W)CPH(?:\W|$)/iu] + matchers: [/(?:^|\W)CPH(?:\W|$)/i, /Centre provisoire d'Hébergement/i] }, { typologie: Typologie.CS, - matchers: [/(?:^|\W)CS(?:\W|$)/iu, /(?:espace|c(?:en)?tre) (?:socia(?:l|ux)|soc\W)/iu] + matchers: [/(?:^|\W)CS(?:\W|$)/i, /(?:espace|c(?:en)?tre)s? (?:socia(?:l|ux)|soc\W)/i] }, { typologie: Typologie.CSAPA, - matchers: [/(?:^|\W)CSAPA(?:\W|$)/iu] + matchers: [/(?:^|\W)CSAPA(?:\W|$)/i] }, { typologie: Typologie.CSC, matchers: [ - /(?:^|\W)CSC(?:\W|$)/iu, - /soci(?:o|al)\W?cul?turel/iu, - /Sociale? et Culturel(?:le)?/iu, - /Culturel(?:le)? et Sociale?/iu, - /Centres? Culturels?/iu + /(?:^|\W)CSC(?:\W|$)/i, + /soci(?:o|al)\W?cul?turel/i, + /Sociale? et Culturel(?:le)?/i, + /Culturel(?:le)? et Sociale?/i, + /Centres? Culturels?/i ] }, { typologie: Typologie.DEPT, - matchers: [/(?:^|\W)DPT(?:\W|$)/iu, /^D[ée]partement(?:\W|$)/iu] + matchers: [/(?:^|\W)DPT(?:\W|$)/i, /^D[ée]partement(?:\W|$)/i] }, { typologie: Typologie.E2C, - matchers: [/(?:^|\W)[ée]cole deuxième chance(?:\W|$)/iu] + matchers: [/(?:^|\W)[ée]cole deuxième chance(?:\W|$)/i] }, { typologie: Typologie.EI, - matchers: [/(?:^|\W)EI(?:\W|$)/iu] + matchers: [/(?:^|\W)EI(?:\W|$)/i] }, { typologie: Typologie.ENM, - matchers: [/(?:^|\W)Bus(?:\W|$)/iu] + matchers: [/(?:^|\W)Bus(?:\W|$)/i, /Van numérique/i] + }, + { + typologie: Typologie.EPCI, + matchers: [/(?:^|\W)EPCI(?:\W|$)/i, /Intercommunalité/i] }, { typologie: Typologie.EPI, - matchers: [/(?:^|\W)EPI(?:\W|$)/iu, /Espace Public (?:Internet|Informatique)/iu] + matchers: [/(?:^|\W)EPI(?:\W|$)/i, /Esp[a@]ce (?:Public )?(?:Internet|Informatique|Connecté)/i] }, { typologie: Typologie.EPIDE, - matchers: [/(?:^|\W)EPIDE(?:\W|$)/iu] + matchers: [/(?:^|\W)EPIDE(?:\W|$)/i] }, { typologie: Typologie.EPN, matchers: [ - /(?:^|\W)EPN(?:\W|$)/iu, - /(?:Espace|[ée]tablissement)s?(?: Publi(?:c|que))? (?:Multim[ée]dia|Num[ée]riques?)/iu, - /Cyber\W?(?:base|centre)/iu + /(?:^|\W)EPN(?:\W|$)/i, + /(?:Espace|[ée]tablissement)s?(?: Publi(?:c|que))? (?:Multim[ée]dia|Num[ée]riques?)/i, + /Cyber\W?(?:base|centre)/i ] }, { typologie: Typologie.ES, - matchers: [/[ée]picerie (?:bar|sociale|solidaire)/iu] + matchers: [/[ée]picerie (?:bar|sociale|solidaire)/i] }, { typologie: Typologie.ESAT, - matchers: [/(?:^|\W)ESAT(?:\W|$)/iu] + matchers: [/(?:^|\W)ESAT(?:\W|$)/i] }, { typologie: Typologie.ESS, - matchers: [/[ée]conomique Social et Solidaire/iu] + matchers: [/[ée]conomique Social et Solidaire/i] + }, + { + typologie: Typologie.ETTI, + matchers: [/travail temporaire/i] }, { typologie: Typologie.EVS, - matchers: [/(?:^|\W)EVS(?:\W|$)/iu, /Espace de Vie Sociale/iu] + matchers: [/(?:^|\W)EVS(?:\W|$)/i, /(?:Espace|Centre) de Vie Sociale/i] }, { typologie: Typologie.FABLAB, - matchers: [/(?:^|\W)FAB\W?(?:LAB|AT)(?:\W|$)/iu] + matchers: [/(?:^|\W)FAB\W?(?:LAB|AT)(?:\W|$)/i, /Atelier de fabrication numérique/i] }, { typologie: Typologie.FT, - matchers: [/france travail/iu, /p[ôo]le emploi/iu] + matchers: [/france travail/i, /p[ôo]le emploi/i] }, { typologie: Typologie.GEIQ, - matchers: [/Groupement (?:local )?(?:d')?Employeurs/iu, /Groupement pour l'Insertion/iu] + matchers: [/Groupement (?:local )?(?:d')?Employeurs/i, /Groupement pour l'Insertion/i] + }, + { + typologie: Typologie.HUDA, + matchers: [/(?:^|\W)HUDA(?:\W|$)/i] }, { typologie: Typologie.LA_POSTE, - matchers: [/la\s?poste/iu, /poste\s/iu, /Agence (?:communale )?postale/iu, /Bureau de poste/iu] + matchers: [/la\s?poste/i, /poste\s/i, /Agence (?:communale )?postale/i, /Bureau de poste/i] }, { typologie: Typologie.MDE, - matchers: [/Maison de l'emploi/iu, /Maison de l'économie/iu] + matchers: [/Maison de l'emploi/i, /Maison de l'économie/i] }, { typologie: Typologie.MDH, - matchers: [/Maison des Habitant/iu] + matchers: [/Maison des Habitant/i, /(?:^|\W)MJH(?:\W|$)/i, /(?:^|\W)MDH(?:\W|$)/i] }, { typologie: Typologie.MDPH, - matchers: [/(?:^|\W)MDPH(?:\W|$)/iu, /Maison D[ée]p(?:artementale des)? Personnes Handicap[ée]es/iu] + matchers: [/(?:^|\W)MDPH(?:\W|$)/i, /Maison D[ée]p(?:artementale des)? Personnes Handicap[ée]es/i] }, { typologie: Typologie.MJC, matchers: [ - /(?:^|\W)MJC(?:\W|$)/iu, - /(?:^|\W)M\.J\.C(?:\W|$)/iu, - /maison (?:des? )?jeunes,? (?:et |& )?(?:de )?(?:la )?culture/iu + /(?:^|\W)MJC(?:\W|$)/i, + /(?:^|\W)M\.J\.C(?:\W|$)/i, + /maison (?:des? )?jeunes,? (?:et |& )?(?:de )?(?:la )?culture/i ] }, { typologie: Typologie.MQ, - matchers: [/maison de quartier/iu] + matchers: [/maison de quartier/i] }, { typologie: Typologie.MSAP, - matchers: [/(?:^|\W)MSAP(?:\W|$)/iu, /(?:Maison|Relais) des? Services?/iu] + matchers: [/(?:^|\W)MSAP(?:\W|$)/i, /(?:Maison|Relais) des? Services?/i] + }, + { + typologie: Typologie.MSA, + matchers: [/(?:^|\W)MSA(?:\W|$)/i, /Mutualité Sociale Agricole/i] }, { typologie: Typologie.MUNI, matchers: [ - /(?:^|\W)Municipalité(?:\W|$)/iu, - /(?:^|\W)mairie(?:\W|$)/iu, - /(?:^|\W)maire(?:\W|$)/iu, - /^commune(?:\W|$)/iu, - /^CA\s/iu, - /\sAgglo(?:m[ée]ration)?$/iu, - /Agglom[ée]ration d/iu, - /Communaut[ée] (?:d\W)?Agglom[ée]ration/iu, - /^ville d[eu]/iu, - /h[oô]tel de ville/iu + /(?:^|\W)Municipalité(?:\W|$)/i, + /(?:^|\W)mairie(?:\W|$)/i, + /(?:^|\W)maire(?:\W|$)/i, + /^commune(?:\W|$)/i, + /^CA\s/i, + /\sAgglo(?:m[ée]ration)?$/i, + /Agglom[ée]ration d/i, + /Communaut[ée] (?:d\W)?Agglom[ée]ration/i, + /^ville d[eu']/i, + /h[oô]tel de ville/i, + /marie de\s/i ] }, + { + typologie: Typologie.OIL, + matchers: [/intermédiation locative/i] + }, { typologie: Typologie.PAD, - matchers: [/Accès au Droit/iu] + matchers: [/Acc[èe]s aux? Droit/i, /Justice et du Droit/i, /Maison du droit/i] + }, + { + typologie: Typologie.PENSION, + matchers: [/Pension de famille/i] }, { typologie: Typologie.PI, - matchers: [/Point d'information/iu, /Point Info/iu] + matchers: [/Point d'information/i, /Point Info/i] }, { typologie: Typologie.PIJ_BIJ, matchers: [ - /(?:^|\W)BIJ(?:\W|$)/iu, - /info(?:rmation)?s? jeune/iu, - /(?:^|\W)PIJ(?:\W|$)/iu, - /(?:^|\W)CRIJ(?:\W|$)/iu, - /point accueil jeunesse/iu, - /Espace jeune/iu + /(?:^|\W)BIJ(?:\W|$)/i, + /info(?:rmation)?s? jeune/i, + /(?:^|\W)PIJ(?:\W|$)/i, + /(?:^|\W)CRIJ(?:\W|$)/i, + /point accueil jeunesse/i, + /Espace jeune/i ] }, { typologie: Typologie.PIMMS, - matchers: [/(?:^|\W)PIMMS(?:\W|$)/iu, /point information mediation multi services/iu] + matchers: [/(?:^|\W)PIMMS(?:\W|$)/i, /point information mediation multi services/i] + }, + { + typologie: Typologie.PJJ, + matchers: [/JUDICIAIRE JEUNESSE/i] }, { typologie: Typologie.PLIE, - matchers: [/^PLIE(?:\W|$)/iu] + matchers: [/^PLIE(?:\W|$)/i] }, { typologie: Typologie.PREF, - matchers: [/^Pr[ée]fecture/iu, /^sous[-\s]pr[ée]fecture/iu] + matchers: [/Pr[ée]fecture/i] }, { typologie: Typologie.REG, - matchers: [/^R[ée]gion/iu] + matchers: [/^R[ée]gion/i] }, { typologie: Typologie.RESSOURCERIE, - matchers: [/Ressourcerie/iu] + matchers: [/Ressourcerie/i] + }, + { + typologie: Typologie.RS_FJT, + matchers: [/Résidence Sociale/i, /Foyer des? Jeunes Travailleurs/i] + }, + { + typologie: Typologie.SCP, + matchers: [/Club prévention/i] + }, + { + typologie: Typologie.SPIP, + matchers: [/(?:^|\W)SPIP(?:\W|$)/i, /Service Pénitentiaire D'Insertion et de Probation/i] }, { typologie: Typologie.UDAF, - matchers: [/(?:^|\W)UDAF(?:\W|\d|$)/iu] + matchers: [/(?:^|\W)UDAF(?:\W|\d|$)/i] }, { typologie: Typologie.AFPA, - matchers: [/(?:^|\W)AFPA(?:\W|$)/iu] + matchers: [/(?:^|\W)AFPA(?:\W|$)/i] }, { typologie: Typologie.CHRS, - matchers: [/(?:^|\W)CHRS(?:\W|$)/iu] + matchers: [/(?:^|\W)CHRS(?:\W|$)/i] }, { typologie: Typologie.MDE, - matchers: [/(?:^|\W)MDE(?:\W|$)/iu, /maison[\w\s',]+de l[’'\s]emploi/iu] + matchers: [/(?:^|\W)MDE(?:\W|$)/i, /maison[\w\s',]+de l[’'\s]emploi/i] }, { typologie: Typologie.CCONS, matchers: [ - /chambre[\w\s']+agriculture/iu, - /chambre[\w\s']+m[ée]tiers[\w\s']+artisanat/iu, - /chambre[\w\s']+commerce[\w\s']+industrie/iu, - /(?:^|\W)CCI(?:\W|$)/iu + /chambre[\w\s']+agriculture/i, + /chambre[\w\s']+m[ée]tiers[\w\s']+artisanat/i, + /chambre[\w\s']+commerce[\w\s']+industrie/i, + /(?:^|\W)CCI(?:\W|$)/i ] }, { typologie: Typologie.CAP_EMPLOI, - matchers: [/cap emploi/iu] + matchers: [/cap emploi/i] }, { typologie: Typologie.UDAF, - matchers: [/(?:^|\W)UDAF(?:\W|$)/iu, /union des associations familiales/iu] + matchers: [/(?:^|\W)UDAF(?:\W|$)/i, /union des associations familiales/i] }, { typologie: Typologie.RFS, matchers: [ - /(?:^|\W)EFS(?:\W|$)/iu, - /frances?[\s-]services?/iu, - /Fixe Bruay-sur-l'Escaut\s{2}\( D[ée]partement du Nord\)/iu, - /Folschviller - Antenne de L'H[ôo]pital/iu, - /Communaut[eé] de communes Vaison Ventoux/iu + /(?:^|\W)EFS(?:\W|$)/i, + /(?:^|\W)MFS(?:\W|$)/i, + /frances?[\s-]services?/i, + /Fixe Bruay-sur-l'Escaut\s{2}\( D[ée]partement du Nord\)/i, + /Folschviller - Antenne de L'H[ôo]pital/i, + /Communaut[eé] de communes Vaison Ventoux/i ] } ]; diff --git a/src/transformer/fields/typologies/typologies.field.spec.ts b/src/transformer/fields/typologies/typologies.field.spec.ts index 9d0a7571..e95da956 100644 --- a/src/transformer/fields/typologies/typologies.field.spec.ts +++ b/src/transformer/fields/typologies/typologies.field.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Typologie, Typologies } from '@gouvfr-anct/lieux-de-mediation-numerique'; import { LieuxMediationNumeriqueMatching } from '../../input'; import { processTypologies } from './typologies.field'; @@ -59,16 +60,31 @@ describe('typologies field', (): void => { } ); - it('should get CADA when name starts with CADA', (): void => { + it.each([ + ['CADA / HUDT'], + ["Centre d'Accueil Demandeur d'Asile"], + ["centre d'accueil pour demandeur d'Asile des Rives de l'Yonne"], + ["Centre d'Accueil pour Demandeurs d'Asile / Oise actions jeunes / Oise actions jeunes réfugiés"] + ])('should get CADA when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } } as LieuxMediationNumeriqueMatching; - const typologies: Typologies = processTypologies({ name: 'CADA / HUDA' }, matching); + const typologies: Typologies = processTypologies({ name: nom }, matching); expect(typologies).toStrictEqual([Typologie.CADA]); }); + it('should get CAARUD when name contains CAARUD', (): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: 'CAARUD' }, matching); + + expect(typologies).toStrictEqual([Typologie.CAARUD]); + }); + it.each([ ['CCAS - Rochefort-sur-Loire'], ['C.C.A.S. ORCHIES'], @@ -87,7 +103,7 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.CCAS]); }); - it.each([["CONSEIL DEP DE L'ACCES AU DROIT"], ['COSEIL DEPATEMENTAL DES YVELINES SERVICE MNA'], ['CDAD Ardennes']])( + it.each([["CONSEIL DEP DE L'ACCES AU SERVICE SOCIAUX"], ['COSEIL DEPATEMENTAL DES YVELINES SERVICE MNA'], ['CDAD Ardennes']])( 'should get CD when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { @@ -100,7 +116,7 @@ describe('typologies field', (): void => { } ); - it.each([['CIAS le phare', "Centre intercommunal d'actions sociales du Pays de Craon"]])( + it.each([['CIAS le phare'], ["Centre intercommunal d'actions sociales du Pays de Craon"]])( 'should get CIAS when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { @@ -158,10 +174,12 @@ describe('typologies field', (): void => { ['CENTRE MEDICO SOCIAL BRIONNE'], ['Centre médico-social'], ['CMS- Centre Medicaux Sociaux'], + ['Centre-médico social Conseil des XV'], ['PMS Cran-Gevrier'], ['POLE MEDICO-SOCIAL DE CHAMONIX'], ['Pôle Médico-Social Balmettes'], - ["Relais médico-social d'Alby-sur-Chéran"] + ["Relais médico-social d'Alby-sur-Chéran"], + ['Permanence Médico-Social de Lussac les Châteaux'] ])('should get CMP when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -174,6 +192,7 @@ describe('typologies field', (): void => { it.each([ ["Accueil CAISSE PRIMAIRE D'ASSURANCE MALADIE DE LA LOIRE"], + ['Caisse Primaire d’Assurance Maladie'], ['CAISSE PRIMAIRE ASSURANCE MALADIE'], ['CAISSE PRIMAIRE D ASSURANCE MALADIE - CPAM - DES LANDES'], ['CPAM'], @@ -189,20 +208,24 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.CPAM]); }); - it.each([['CPH - lab Fraternel']])('should get CPH when name contains %s', (nom: string): void => { - const matching: LieuxMediationNumeriqueMatching = { - nom: { colonne: 'name' } - } as LieuxMediationNumeriqueMatching; + it.each([['CPH - lab Fraternel'], ["Centre provisoire d'Hébergement"]])( + 'should get CPH when name contains %s', + (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; - const typologies: Typologies = processTypologies({ name: nom }, matching); + const typologies: Typologies = processTypologies({ name: nom }, matching); - expect(typologies).toStrictEqual([Typologie.CPH]); - }); + expect(typologies).toStrictEqual([Typologie.CPH]); + } + ); it.each([ ['CENTRE SOC FAMILIAL ST GABRIEL'], ['CENTRE SOCIAL DE BAGATELLE'], ['CTRE SOCIAL ESPACE ST GILLES'], + ['Centres Sociaux Fidesiens'], ['CS Capelette'], ['Espace Social Commun Blosne'] ])('should get CS when name contains %s', (nom: string): void => { @@ -283,18 +306,18 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.EI]); }); - it('should get ENM when name contains Bus', (): void => { + it.each([["Bus It'In"], ['Antilly/ CCPV Van numérique']])('should get ENM when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } } as LieuxMediationNumeriqueMatching; - const typologies: Typologies = processTypologies({ name: "Bus It'In" }, matching); + const typologies: Typologies = processTypologies({ name: nom }, matching); expect(typologies).toStrictEqual([Typologie.ENM]); }); - it.each([['EPI'], ['Espace Public Internet Gagarine'], ['Espace Public Informatique Monmousseau']])( - 'should get EPI when name contains %s', + it.each([['EPCI'], ['Intercommunalité La Vicomté-sur-Rance, Pleudihen-sur-Rance, Saint-Helen']])( + 'should get EPCI when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -302,10 +325,27 @@ describe('typologies field', (): void => { const typologies: Typologies = processTypologies({ name: nom }, matching); - expect(typologies).toStrictEqual([Typologie.EPI]); + expect(typologies).toStrictEqual([Typologie.EPCI]); } ); + it.each([ + ['EPI'], + ['Espace Public Internet Gagarine'], + ['Espace Public Informatique Monmousseau'], + ['Borne Esp@ce Internet - Métro'], + ['Esp@ce informatique'], + ['Espace connecté de Bourail'] + ])('should get EPI when name contains %s', (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.EPI]); + }); + it('should get EPIDE when name contains EPIDE', (): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -375,34 +415,60 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.ESS]); }); - it.each([['EVS'], ['Espace de Vie Sociale']])('should get EVS when name contains %s', (nom: string): void => { + it('should get ETTI when name contains travail temporaire', (): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } } as LieuxMediationNumeriqueMatching; - const typologies: Typologies = processTypologies({ name: nom }, matching); + const typologies: Typologies = processTypologies({ name: 'OCITO Travail Temporaire' }, matching); - expect(typologies).toStrictEqual([Typologie.EVS]); + expect(typologies).toStrictEqual([Typologie.ETTI]); }); - it.each([['Fablab'], ['Fab Lab'], ["FAB'AT"]])('should get FABLAB when name contains %s', (nom: string): void => { + it.each([['EVS'], ['Espace de Vie Sociale'], ['Centre de Vie Sociale Gassicourt']])( + 'should get EVS when name contains %s', + (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.EVS]); + } + ); + + it.each([['Fablab'], ['Fab Lab'], ["FAB'AT"], ['Atelier de fabrication numérique']])( + 'should get FABLAB when name contains %s', + (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.FABLAB]); + } + ); + + it.each([['Pôle emploi'], ['Pole Emploi Blaye']])('should get FT when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } } as LieuxMediationNumeriqueMatching; const typologies: Typologies = processTypologies({ name: nom }, matching); - expect(typologies).toStrictEqual([Typologie.FABLAB]); + expect(typologies).toStrictEqual([Typologie.FT]); }); - it.each([['Pôle emploi'], ['Pole Emploi Blaye']])('should get FT when name contains %s', (nom: string): void => { + it.each([['HUDA PETIT CERF']])('should get HUDA when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } } as LieuxMediationNumeriqueMatching; const typologies: Typologies = processTypologies({ name: nom }, matching); - expect(typologies).toStrictEqual([Typologie.FT]); + expect(typologies).toStrictEqual([Typologie.HUDA]); }); it.each([ @@ -442,18 +508,20 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.MDE]); }); - it.each([['Maison des Habitants Abbaye'], ['Maison des Habitant.es Anatole France']])( - 'should get MDH when name contains %s', - (nom: string): void => { - const matching: LieuxMediationNumeriqueMatching = { - nom: { colonne: 'name' } - } as LieuxMediationNumeriqueMatching; + it.each([ + ['Maison des Habitants Abbaye'], + ['Maison des Habitant.es Anatole France'], + ['MJH Andard - Maison des Jeunes et Habitants'], + ['MDH Village-Sud'] + ])('should get MDH when name contains %s', (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; - const typologies: Typologies = processTypologies({ name: nom }, matching); + const typologies: Typologies = processTypologies({ name: nom }, matching); - expect(typologies).toStrictEqual([Typologie.MDH]); - } - ); + expect(typologies).toStrictEqual([Typologie.MDH]); + }); it.each([['MDPH 32'], ['GIP MAISON DEP PERSONNES HANDICAPEES'], ['Maison Départementale des Personnes Handicapées']])( 'should get MDPH when name contains %s', @@ -478,7 +546,8 @@ describe('typologies field', (): void => { ['Maison départementale de proximité de Cadours'], ['Maison Départementale de Solidarité de Blaye'], ['Maison Départementales des Solidarités de DECAZEVILLE'], - ['Maison Des Solidarités Départementales'] + ['Maison Des Solidarités Départementales'], + ['EDS Alfortville'] ])('should get MSD when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -533,6 +602,16 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.MSAP]); }); + it.each([['MSA'], ['Mutualité Sociale Agricole']])('should get MSA when name contains %s', (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.MSA]); + }); + it.each([ ['Mairie de Saint Alban'], ['Maire'], @@ -543,7 +622,9 @@ describe('typologies field', (): void => { ['Communauté Agglomération La Rochelle'], ["Communauté d'Agglomération Bergeracoise"], ['CONCARNEAU CORNOUAILLE AGGLOMERATION'], - ["Municipalité d'Annay"] + ["Municipalité d'Annay"], + ["Ville d'Alès"], + ['Marie de Lugrin'] ])('should get MUNI when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -554,8 +635,8 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.MUNI]); }); - it.each([["Point d'Accès au Droit"], ['Accès au Droit Nord Morbihan']])( - 'should get PAD when name contains %s', + it.each([["Service d'intermédiation locative de la croix marine Auvergne Rhône Alpes"]])( + 'should get OIL when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -563,10 +644,37 @@ describe('typologies field', (): void => { const typologies: Typologies = processTypologies({ name: nom }, matching); - expect(typologies).toStrictEqual([Typologie.PAD]); + expect(typologies).toStrictEqual([Typologie.OIL]); } ); + it.each([ + ["Point d'Accès au Droit"], + ['Accès au Droit Nord Morbihan'], + ['Accès Aux Droits'], + ['POINT D ACCES AU DROIT DU TRIBUNAL JUDICIAIRE DE PONTOISE'], + ['Maison de la Justice et du Droit'], + ['Maison du droit et de la Famille'] + ])('should get PAD when name contains %s', (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.PAD]); + }); + + it.each([['Pension de famille -YUTZ']])('should get PENSION when name contains %s', (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.PENSION]); + }); + it.each([["Point d'information ISOLA", 'Point Info 14']])('should get PI when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -600,6 +708,29 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.PIMMS]); }); + it('should get PJJ when name contains JUDICIAIRE JEUNESSE', (): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies( + { name: 'DIRECTION TERRITORIALE PROTECTION JUDICIAIRE JEUNESSE TARN AVEYRON' }, + matching + ); + + expect(typologies).toStrictEqual([Typologie.PJJ]); + }); + + it.each([['EFS'], ['Maison france services'], ['MFS']])('should get RFS when name contains %s', (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.RFS]); + }); + it('should get PLIE when name contains PLIE', (): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -610,18 +741,20 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.PLIE]); }); - it.each([['Préfecture'], ['Prefecture de la Vienne'], ["Sous-préfecture - Point d'accueil numérique"]])( - 'should get PREF when name contains %s', - (nom: string): void => { - const matching: LieuxMediationNumeriqueMatching = { - nom: { colonne: 'name' } - } as LieuxMediationNumeriqueMatching; + it.each([ + ['Préfecture'], + ['Prefecture de la Vienne'], + ["Sous-préfecture - Point d'accueil numérique"], + ["Point d'Accueil Numérique Sous-Préfecture d'Albertville"] + ])('should get PREF when name contains %s', (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; - const typologies: Typologies = processTypologies({ name: nom }, matching); + const typologies: Typologies = processTypologies({ name: nom }, matching); - expect(typologies).toStrictEqual([Typologie.PREF]); - } - ); + expect(typologies).toStrictEqual([Typologie.PREF]); + }); it('should get REG when name contains Région', (): void => { const matching: LieuxMediationNumeriqueMatching = { @@ -643,30 +776,71 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.RESSOURCERIE]); }); - it('should get UDAF when name contains UDAF', (): void => { + it.each([['Résidence Sociale Toits de Vie'], ['FOYER DES JEUNES TRAVAILLEURS']])( + 'should get RS_FJT when name contains %s', + (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.RS_FJT]); + } + ); + + it.each([['Club prévention']])('should get SCP when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } } as LieuxMediationNumeriqueMatching; - const typologies: Typologies = processTypologies({ name: 'UDAF93' }, matching); + const typologies: Typologies = processTypologies({ name: nom }, matching); - expect(typologies).toStrictEqual([Typologie.UDAF]); + expect(typologies).toStrictEqual([Typologie.SCP]); }); - it.each([['CDAS de Combourg']])('should get CDAS when name contains %s', (nom: string): void => { + it.each([['SPIP'], ["Service Pénitentiaire D'Insertion et de Probation d'Indre-et-Loire"]])( + 'should get SPIP when name contains %s', + (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.SPIP]); + } + ); + + it('should get UDAF when name contains UDAF', (): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } } as LieuxMediationNumeriqueMatching; - const typologies: Typologies = processTypologies({ name: nom }, matching); + const typologies: Typologies = processTypologies({ name: 'UDAF93' }, matching); - expect(typologies).toStrictEqual([Typologie.CDAS]); + expect(typologies).toStrictEqual([Typologie.UDAF]); }); + it.each([['CDAS de Combourg'], ["Maison Départementale d'Action Sociale"]])( + 'should get CDAS when name contains %s', + (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.CDAS]); + } + ); + it.each([ ['Communauté de Commune de la Dombes'], ['Communauté de Communes Anjou Loir et Sarthe'], - ["Communauté des Communes Rurales de l'Entre-2-Mers"] + ["Communauté des Communes Rurales de l'Entre-2-Mers"], + ["COMMUNAUTE COM DU VAL D'AMOUR"], + ['COMMUNAUTE INTERCOMMUNALE DES VILLES SOLIDAIRES CIVIS'] ])('should get CC when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -687,6 +861,20 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.CCONS]); }); + it.each([ + ["Centre d'hébergement d'urgence le Cairn"], + ["centre d'hebergement d'urgence"], + ["Centre hébergement urgence l'Elan"] + ])('should get CHU when name contains %s', (nom: string): void => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' } + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: nom }, matching); + + expect(typologies).toStrictEqual([Typologie.CHU]); + }); + it.each([['Finances Publiques'], ['Centre des Finances Public de Cholet']])( 'should get CFP when name contains %s', (nom: string): void => { @@ -753,7 +941,8 @@ describe('typologies field', (): void => { ['Blue Fox Coffee - café associatif'], ['Coallia'], ['FAMILLE RURALE'], - ['LIGUE ENSEIGNEMENT TARN GARONNE'] + ['LIGUE ENSEIGNEMENT TARN GARONNE'], + ['Les Restaurants du Coeur'] ])('should get ASSO when name contains %s', (nom: string): void => { const matching: LieuxMediationNumeriqueMatching = { nom: { colonne: 'name' } @@ -773,4 +962,15 @@ describe('typologies field', (): void => { expect(typologies).toStrictEqual([Typologie.CAF, Typologie.CPAM]); }); + + it('should infer typologies from name, even if typologie mapping is present in configuration file', () => { + const matching: LieuxMediationNumeriqueMatching = { + nom: { colonne: 'name' }, + typologie: [{ colonnes: ['checkboxListeTypelieu'], termes: ['1'], cible: Typologie.CAF }] + } as LieuxMediationNumeriqueMatching; + + const typologies: Typologies = processTypologies({ name: 'CPAM / CAF du Gers', checkboxListeTypelieu: '1' }, matching); + + expect(typologies).toStrictEqual([Typologie.CAF, Typologie.CPAM]); + }); }); diff --git a/src/transformer/fields/typologies/typologies.field.ts b/src/transformer/fields/typologies/typologies.field.ts index aef3020f..9beb9d8c 100644 --- a/src/transformer/fields/typologies/typologies.field.ts +++ b/src/transformer/fields/typologies/typologies.field.ts @@ -81,4 +81,4 @@ export const processTypologies = (source: DataSource, matching: LieuxMediationNu !typologiesArePreset(matching)) || matching.typologie?.at(0)?.cible == null ? inferTypologies(source, matching) - : Typologies(Array.from(new Set(matching.typologie.reduce(appendTypologies(source), [])))); + : Typologies(Array.from(new Set(matching.typologie.reduce(appendTypologies(source), inferTypologies(source, matching))))); diff --git a/src/transformer/input/to-lieux-mediation-numerique.ts b/src/transformer/input/to-lieux-mediation-numerique.ts index 126584e9..50b9f46e 100644 --- a/src/transformer/input/to-lieux-mediation-numerique.ts +++ b/src/transformer/input/to-lieux-mediation-numerique.ts @@ -116,7 +116,7 @@ const lieuDeMediationNumerique = async ( if (isPrive(dataSource, matching)) return undefined; const lieuMediationNumerique: LieuMediationNumerique = { - id: processId(dataSource, matching, index), + id: processId(dataSource, matching, index, sourceName), pivot: processPivot(dataSource, matching), nom: processNom(dataSource, matching), adresse, diff --git a/src/transformer/merge-hours-ranges/merge-hours-ranges.spec.ts b/src/transformer/merge-hours-ranges/merge-hours-ranges.spec.ts index 10f436ab..3e725c18 100644 --- a/src/transformer/merge-hours-ranges/merge-hours-ranges.spec.ts +++ b/src/transformer/merge-hours-ranges/merge-hours-ranges.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { mergeHoursRanges, mergeMultipleHoursRanges } from './merge-hours-ranges'; describe('merge hours ranges', (): void => { diff --git a/src/transformer/output/error-report/to-csv/error-report.to-csv.spec.ts b/src/transformer/output/error-report/to-csv/error-report.to-csv.spec.ts index 359ee7de..18baf2fe 100644 --- a/src/transformer/output/error-report/to-csv/error-report.to-csv.spec.ts +++ b/src/transformer/output/error-report/to-csv/error-report.to-csv.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { errorReportToCsv } from './error-report.to-csv'; describe('output', (): void => { diff --git a/src/transformer/report/report.spec.ts b/src/transformer/report/report.spec.ts index 3bc60ecd..e846e709 100644 --- a/src/transformer/report/report.spec.ts +++ b/src/transformer/report/report.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { Recorder, Report } from './report'; describe('report', (): void => { diff --git a/src/transformer/to-osm-hours/clean-operations.ts b/src/transformer/to-osm-hours/clean-operations.ts index 48a96d5e..3fcc145c 100644 --- a/src/transformer/to-osm-hours/clean-operations.ts +++ b/src/transformer/to-osm-hours/clean-operations.ts @@ -12,17 +12,17 @@ const addMissing0 = (hours: string): string => (hours.length === 1 ? `0${hours}` const formatTime = (hours: string, minutes?: string): string => `${addMissing0(hours)}${setMinutesIfDefined(minutes)}`; const UNIFORMIZE_HYPHEN_SEPARATOR: CleanOperation = { - selector: /–/gu, + selector: /–/g, fix: (): string => '-' }; const REMOVE_MULTIPLE_SPACES: CleanOperation = { - selector: /\s\s+/gu, + selector: /\s\s+/g, fix: (): string => ' ' }; const ADD_MISSING_TIME_RANGE_SEPARATOR: CleanOperation = { - selector: /(?[0-2]?\d)[hH](?[0-2]?\d)[hH]/gu, + selector: /(?[0-2]?\d)[hH](?[0-2]?\d)[hH]/g, fix: (_: string, startHour: string, endHour: string): string => `${startHour}h-${endHour}h` }; @@ -44,38 +44,38 @@ const REMOVE_FORMAT_SPACE_TIME_SEPARATOR: CleanOperation = { }; const REMOVE_H_FOR_HOURS_ONLY_RANGE: CleanOperation = { - selector: /(?[0-2]?\d)[hH]\s?(?[0-2]?\d)[hH](?\D)/gu, + selector: /(?[0-2]?\d)[hH]\s?(?[0-2]?\d)[hH](?\D)/g, fix: (_: string, startHour: string, endHour: string, nextCharacter: string): string => `${startHour}:00 ${endHour}:00${nextCharacter}` }; const REMOVE_H_FOR_HOURS_ONLY_RANGE_SINGLE_H: CleanOperation = { - selector: /(?[0-2]\d)\s(?[0-2]?\d)\s*[hH](?\D|$)/gu, + selector: /(?[0-2]\d)\s(?[0-2]?\d)\s*[hH](?\D|$)/g, fix: (_: string, startHour: string, endHour: string, after: string): string => `${startHour}:00 ${endHour}:00${after}` }; const REMOVE_H_FOLLOWED_BY_HOURS: CleanOperation = { - selector: /[hH]\s?(?[0-2]?\d)[hH]\s?(?[0-5]\d)?/gu, + selector: /[hH]\s?(?[0-2]?\d)[hH]\s?(?[0-5]\d)?/g, fix: (_: string, hour: string, minute?: string): string => `-${formatTime(hour, minute)}` }; const REMOVE_H_FOLLOWED_BY_MINUTES: CleanOperation = { - selector: /[hH]\s?(?\d)/gu, + selector: /[hH]\s?(?\d)/g, fix: (_: string, hourLastNumber: string): string => `:${hourLastNumber}` }; const REMOVE_H_FOLLOWED_BY_A_SPACE: CleanOperation = { - selector: /[hH]\s/gu, + selector: /[hH]\s/g, fix: (): string => ' ' }; const REMOVE_H_FOLLOWED_BY_A_SEPARATOR: CleanOperation = { - selector: /[hH](?[-/à])/gu, + selector: /[hH](?[-/à])/g, fix: (_: string, separator: string): string => separator }; const REMOVE_WHITE_SPACES: CleanOperation = { - selector: /\s/gu, + selector: /\s/g, fix: (): string => '' }; @@ -114,12 +114,12 @@ const FORMAT_LITERARY_TIME_SEPARATORS_NO_RANGE_SEPARATOR: CleanOperation = { }; const REPLACE_LITERARY_TIME_SEPARATORS: CleanOperation = { - selector: /(?\d.*?\d?)\s*[àèa]\s*(?\d.*\d)/gu, + selector: /(?\d.*?\d?)\s*[àèa]\s*(?\d.*\d)/g, fix: (_: string, previous: string, next: string): string => `${previous}-${next}` }; const REMOVE_SEPARATOR_IN_TEXT: CleanOperation = { - selector: /[a-zA-ZÀ-ú*.'_]+-[a-zA-ZÀ-ú*.'_]+/gu, + selector: /[a-zA-ZÀ-ú*.'_]+-[a-zA-ZÀ-ú*.'_]+/g, fix: (): string => '' }; @@ -129,12 +129,12 @@ const REMOVE_ADDITIONAL_INFORMATION_TEXT_IN_PARENTHESIS: CleanOperation = { }; const REMOVE_NUMBERS_IN_ADDITIONAL_INFORMATION_TEXT: CleanOperation = { - selector: /1er|\d?\d\sjours|[0-3]\d\/[01][1-9]\/\d\d\d\d|\d\s*[a-z]+\s*(?:\/|sur)\s*\d/gu, + selector: /1er|\d?\d\sjours|[0-3]\d\/[01][1-9]\/\d\d\d\d|\d\s*[a-z]+\s*(?:\/|sur)\s*\d/g, fix: (): string => '' }; const REMOVE_ADDITIONAL_INFORMATION_TEXT: CleanOperation = { - selector: /[a-zA-ZÀ-úû*.'_(|>]+/gu, + selector: /[a-zA-ZÀ-úû*.'_(|>]+/g, fix: (): string => '' }; @@ -155,7 +155,7 @@ const TRIM: CleanOperation = { }; const FORMAT_MISSING_MINUTE_SEPARATOR: CleanOperation = { - selector: /(?[0-2]\d)(?[0-5]\d)/gu, + selector: /(?[0-2]\d)(?[0-5]\d)/g, fix: (_: string, hour: string, minute: string): string => `${hour}:${minute}` }; @@ -166,7 +166,7 @@ const FORMAT_MISSING_TIME_SEPARATOR: CleanOperation = { const FORMAT_SPACE_RANGES_SEPARATORS: CleanOperation = { selector: - /^(?\d?.*\d)\s?[-/\s]\s?(?.+\d)\s+(?\d.+\d)\s?[-/\s]\s?(?.+\d)$/u, + /^(?\d?.*\d)\s?[-/\s]\s?(?.+\d)\s+(?\d.+\d)\s?[-/\s]\s?(?.+\d)$/, fix: ( _: string, startTimeStartRange: string, @@ -178,7 +178,7 @@ const FORMAT_SPACE_RANGES_SEPARATORS: CleanOperation = { const FORMAT_SPACE_TIMES_SEPARATORS: CleanOperation = { selector: - /^(?\d\d:\d\d)\s(?\d\d:\d\d)\s-\s(?\d\d:\d\d)\s(?\d\d:\d\d)$/u, + /^(?\d\d:\d\d)\s(?\d\d:\d\d)\s-\s(?\d\d:\d\d)\s(?\d\d:\d\d)$/, fix: ( _: string, startTimeStartRange: string, @@ -205,7 +205,7 @@ const FORMAT_HYPHEN_RANGES_SEPARATORS: CleanOperation = { }; const REMOVE_MULTIPLE_SAME_SEPARATOR: CleanOperation = { - selector: /(?[-/,:])+/gu, + selector: /(?[-/,:])+/g, fix: (_: string, separator: string): string => `${separator}` }; @@ -220,12 +220,12 @@ const REMOVE_TRAILING_SEPARATOR: CleanOperation = { }; const REMOVE_TIME_SEPARATOR_AFTER_RANGE_SEPARATOR: CleanOperation = { - selector: /,:/gu, + selector: /,:/g, fix: (): string => ',' }; const REMOVE_USELESS_TIME_SEPARATOR: CleanOperation = { - selector: /:(?\D)/gu, + selector: /:(?\D)/g, fix: (_: string, nonDigitChar: string): string => `${nonDigitChar}` }; @@ -261,12 +261,12 @@ const FORMAT_TWO_TIMES_RANGES: CleanOperation = { }; const REMOVE_NO_TIME_RANGE: CleanOperation = { - selector: /^[0-2]?\d(?::[0-5]\d)?$/u, + selector: /^[0-2]?\d(?::[0-5]\d)?$/, fix: (): string => '' }; const REMOVE_TIME_EXTRA_DIGITS: CleanOperation = { - selector: /(?\d\d)\d/gu, + selector: /(?\d\d)\d/g, fix: (_: string, digitsToKeep: string): string => digitsToKeep }; diff --git a/src/transformer/to-osm-hours/to-osm-hours.spec.ts b/src/transformer/to-osm-hours/to-osm-hours.spec.ts index 69e1b505..1a78ba2e 100644 --- a/src/transformer/to-osm-hours/to-osm-hours.spec.ts +++ b/src/transformer/to-osm-hours/to-osm-hours.spec.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { toOsmHours } from './to-osm-hours'; describe('to osm hours', (): void => { diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..358ba576 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globalSetup: './vitest.global-setup.ts' + } +}); diff --git a/vitest.global-setup.ts b/vitest.global-setup.ts new file mode 100644 index 00000000..1bf0e43a --- /dev/null +++ b/vitest.global-setup.ts @@ -0,0 +1,3 @@ +export const setup = () => { + process.env.TZ = 'UTC'; +};