From 240c787ce0c3c1013740591b64290522713f25b2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?BITARD=20Micha=C3=ABl?= <michael.bitard@beta.gouv.fr>
Date: Wed, 4 Dec 2024 14:11:04 +0000
Subject: [PATCH] chore(typescript): utilise des options plus strictes
 (pub/pnm-public/camino!1586)

---
 packages/api/tsconfig.json                    |  4 ++
 packages/common/src/etape.ts                  |  2 +-
 .../common/src/permissions/etape-form.test.ts | 46 +++++++++++++++++++
 packages/common/src/permissions/etape-form.ts |  2 +-
 packages/common/tsconfig.json                 |  5 +-
 packages/ui/tsconfig.json                     |  4 ++
 6 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json
index 2d007a8e0..c6696bd97 100644
--- a/packages/api/tsconfig.json
+++ b/packages/api/tsconfig.json
@@ -26,6 +26,10 @@
     "resolveJsonModule": true,
     "noUnusedLocals": true,
     "noUnusedParameters": true,
+    // TODO 2024-12-04 mettre les deux options suivantes à true génère beaucoup d'erreurs
+    "noPropertyAccessFromIndexSignature": false,
+    "noUncheckedIndexedAccess": false,
+    "noUncheckedSideEffectImports": true,
     "noEmit": true,
     "paths": {
       "graphql-fields": ["./src/@types/graphql-fields"],
diff --git a/packages/common/src/etape.ts b/packages/common/src/etape.ts
index 4459ed007..245c939f4 100644
--- a/packages/common/src/etape.ts
+++ b/packages/common/src/etape.ts
@@ -134,7 +134,7 @@ export const getStatutId = (etape: Pick<FlattenEtape, 'date' | 'contenu' | 'type
     return etape.statutId
   }
 
-  const duree = etape.contenu[sectionDureeIds[etape.typeId]]?.duree?.value ?? 0
+  const duree = etape.contenu[sectionDureeIds[etape.typeId]]?.['duree']?.value ?? 0
 
   if (isBefore(currentDate, etape.date)) {
     return ETAPES_STATUTS.PROGRAMME
diff --git a/packages/common/src/permissions/etape-form.test.ts b/packages/common/src/permissions/etape-form.test.ts
index 4e107edad..250ffff63 100644
--- a/packages/common/src/permissions/etape-form.test.ts
+++ b/packages/common/src/permissions/etape-form.test.ts
@@ -552,6 +552,52 @@ const axmDocumentsComplete: Pick<EtapeDocument | TempEtapeDocument, 'etape_docum
 ]
 
 const entreprise1Id = entrepriseIdValidator.parse('id1')
+test('etapeDocumentsStepIsComplete avec mecanisation', () => {
+  expect(
+    etapeDocumentsStepIsComplete(
+      { typeId: ETAPES_TYPES.demande, contenu: { arm: { mecanise: { value: true, etapeHeritee: null, heritee: false } } }, isBrouillon: ETAPE_IS_NOT_BROUILLON },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      [{ etape_document_type_id: 'dec' }],
+      [],
+      firstEtapeDateValidator.parse('2022-01-01')
+    )
+  ).toMatchInlineSnapshot(`
+    {
+      "errors": [
+        "le document "Documents cartographiques" (car) est obligatoire",
+        "le document "Décision cas par cas" (dep) est obligatoire",
+        "le document "Dossier "Loi sur l'eau"" (doe) est obligatoire",
+        "le document "Dossier de demande" (dom) est obligatoire",
+        "le document "Formulaire de demande" (for) est obligatoire",
+      ],
+      "valid": false,
+    }
+  `)
+
+  expect(
+    etapeDocumentsStepIsComplete(
+      { typeId: ETAPES_TYPES.demande, contenu: { arm: { mecanise: { value: false, etapeHeritee: null, heritee: false } } }, isBrouillon: ETAPE_IS_NOT_BROUILLON },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      [{ etape_document_type_id: 'dec' }],
+      [],
+      firstEtapeDateValidator.parse('2022-01-01')
+    )
+  ).toMatchInlineSnapshot(`
+    {
+      "errors": [
+        "le document "Documents cartographiques" (car) est obligatoire",
+        "le document "Dossier de demande" (dom) est obligatoire",
+        "le document "Formulaire de demande" (for) est obligatoire",
+      ],
+      "valid": false,
+    }
+  `)
+})
+
 test('etapeDocumentsStepIsComplete', () => {
   expect(
     etapeDocumentsStepIsComplete(
diff --git a/packages/common/src/permissions/etape-form.ts b/packages/common/src/permissions/etape-form.ts
index 1842ded65..8909255e0 100644
--- a/packages/common/src/permissions/etape-form.ts
+++ b/packages/common/src/permissions/etape-form.ts
@@ -254,7 +254,7 @@ export const etapeDocumentsStepIsComplete = (
   firstEtapeDate: FirstEtapeDate
 ): ValidReturn => {
   const errors: string[] = []
-  const documentTypes = getDocumentsTypes({ typeId: etape.typeId }, demarcheTypeId, titreTypeId, demarcheId, sdomZoneIds, etape.contenu.arm?.mecanise?.value === true, firstEtapeDate)
+  const documentTypes = getDocumentsTypes({ typeId: etape.typeId }, demarcheTypeId, titreTypeId, demarcheId, sdomZoneIds, etape.contenu['arm']?.['mecanise']?.value === true, firstEtapeDate)
 
   errors.push(
     ...documentTypes
diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json
index 33ad6d6e5..9a700bc80 100644
--- a/packages/common/tsconfig.json
+++ b/packages/common/tsconfig.json
@@ -22,7 +22,10 @@
     "resolveJsonModule": true,
     "noUnusedLocals": true,
     "noUnusedParameters": true,
-    "noEmit": true
+    "noEmit": true,
+    "noPropertyAccessFromIndexSignature": true,
+    "noUncheckedIndexedAccess": true,
+    "noUncheckedSideEffectImports": true,
   },
   "exclude": ["vitest.config.ts"]
 }
diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json
index 09ff23dcf..3f4bd78f4 100644
--- a/packages/ui/tsconfig.json
+++ b/packages/ui/tsconfig.json
@@ -14,6 +14,10 @@
     "noUnusedLocals": true,
     "noUnusedParameters": true,
     "noErrorTruncation": false,
+    // TODO 2024-12-04 mettre les deux options suivantes à true génère beaucoup d'erreurs
+    "noPropertyAccessFromIndexSignature": false,
+    "noUncheckedIndexedAccess": false,
+    "noUncheckedSideEffectImports": true,
     "lib": [
       "esnext",
       "dom",
-- 
GitLab