From 68e251962795590141cc4bbfd48166ae77e997ea Mon Sep 17 00:00:00 2001
From: Emmanuel Raviart <emmanuel@raviart.com>
Date: Thu, 29 Jul 2021 18:01:48 +0200
Subject: [PATCH] Add negate to core children in core decompositions.

---
 example.env               |  2 +-
 package-lock.json         | 14 +++++++-------
 package.json              |  2 +-
 src/lib/decompositions.ts | 25 ++++++++++++++++---------
 4 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/example.env b/example.env
index 6a5c600a4..89f58881a 100644
--- a/example.env
+++ b/example.env
@@ -15,7 +15,7 @@ BASE_URL="http://localhost:3000"
 CHILDREN_KEY="enfants"
 
 # Path to file containing decompositions in JSON format
-DECOMPOSITION_PATH="../openfisca-france-json/custom/decompositions.json"
+DECOMPOSITION_PATH="../openfisca-france-json/decompositions_customized.json"
 
 # Name of variable used as root of decomposition
 DECOMPOSITION_ROOT="revenu_disponible"
diff --git a/package-lock.json b/package-lock.json
index 35d102f9e..25565be80 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,7 +14,7 @@
         "@auditors/core": "^0.1.7",
         "@fontsource/lato": "^4.3.0",
         "@fontsource/lora": "^4.3.0",
-        "@openfisca/ast": "^0.8.9",
+        "@openfisca/ast": "^0.9.1",
         "@sveltejs/adapter-node": "next",
         "@sveltejs/kit": "next",
         "@tailwindcss/forms": "^0.3.2",
@@ -1907,9 +1907,9 @@
       }
     },
     "node_modules/@openfisca/ast": {
-      "version": "0.8.9",
-      "resolved": "https://registry.npmjs.org/@openfisca/ast/-/ast-0.8.9.tgz",
-      "integrity": "sha512-8V+hFc1lJOx4VqG9V+MxP7miJ68IxlxEeOD1cHVKI5HZVXA1ZebBzHWNcPiWLlr61FvwPrfcgni+9cZQN9tCpg==",
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/@openfisca/ast/-/ast-0.9.1.tgz",
+      "integrity": "sha512-MPlbVhe6zk78RptA/Q6KI5i6t9k7jIR7aQ2oRFa8Q2ql0//9aet/8rXWO2798i40+/X48Ug3hAe1LNQWC6Lplw==",
       "dev": true,
       "dependencies": {
         "@auditors/core": "^0.1.11",
@@ -8235,9 +8235,9 @@
       }
     },
     "@openfisca/ast": {
-      "version": "0.8.9",
-      "resolved": "https://registry.npmjs.org/@openfisca/ast/-/ast-0.8.9.tgz",
-      "integrity": "sha512-8V+hFc1lJOx4VqG9V+MxP7miJ68IxlxEeOD1cHVKI5HZVXA1ZebBzHWNcPiWLlr61FvwPrfcgni+9cZQN9tCpg==",
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/@openfisca/ast/-/ast-0.9.1.tgz",
+      "integrity": "sha512-MPlbVhe6zk78RptA/Q6KI5i6t9k7jIR7aQ2oRFa8Q2ql0//9aet/8rXWO2798i40+/X48Ug3hAe1LNQWC6Lplw==",
       "dev": true,
       "requires": {
         "@auditors/core": "^0.1.11",
diff --git a/package.json b/package.json
index 126a05240..4c8d333b4 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
     "@auditors/core": "^0.1.7",
     "@fontsource/lato": "^4.3.0",
     "@fontsource/lora": "^4.3.0",
-    "@openfisca/ast": "^0.8.9",
+    "@openfisca/ast": "^0.9.1",
     "@sveltejs/adapter-node": "next",
     "@sveltejs/kit": "next",
     "@tailwindcss/forms": "^0.3.2",
diff --git a/src/lib/decompositions.ts b/src/lib/decompositions.ts
index fdd9e6a89..387d2e059 100644
--- a/src/lib/decompositions.ts
+++ b/src/lib/decompositions.ts
@@ -1,4 +1,7 @@
-import type { Decomposition as DecompositionJson } from "@openfisca/ast"
+import type {
+  Decomposition as DecompositionJson,
+  DecompositionReference,
+} from "@openfisca/ast"
 
 export interface DecompositionCore extends DecompositionJson {
   lastReview?: string
@@ -37,6 +40,7 @@ export function decompositionByNameFromCore(
   name: string,
   parentName: string | undefined = undefined,
   index = 0,
+  negate: boolean | undefined = undefined,
   decompositionByName: DecompositionByName = {},
   visitedNames = new Set<string>(),
 ): DecompositionByName | undefined {
@@ -58,14 +62,16 @@ export function decompositionByNameFromCore(
     label: decompositionCore.label,
     lastReview: decompositionCore.lastReview,
     name,
-    negate: decompositionCore.negate,
+    negate,
   }
   decompositionByName[name] = decomposition
   if (parentName !== undefined) {
     decomposition.parentName = parentName
   }
   if (decompositionCore.children !== undefined) {
-    decomposition.childrenName = decompositionCore.children
+    decomposition.childrenName = decompositionCore.children.map(
+      ({ name }) => name,
+    )
     let ancestor: Decomposition | undefined = undefined
     let depth = 0
     for (const ancestorName of iterDecompositionAncestorsName(
@@ -90,13 +96,14 @@ export function decompositionByNameFromCore(
     }
     for (const [
       childIndex,
-      childName,
+      childReference,
     ] of decompositionCore.children.entries()) {
       decompositionByNameFromCore(
         decompositionCoreByName,
-        childName,
+        childReference.name,
         name,
         childIndex,
+        childReference.negate,
         decompositionByName,
         visitedNames,
       )
@@ -282,10 +289,10 @@ export function* walkDecompositionsCore(
     yield [name, decompositionCore]
   }
   if (decompositionCore.children !== undefined) {
-    for (const childName of decompositionCore.children) {
+    for (const childReference of decompositionCore.children) {
       yield* walkDecompositionsCore(
         decompositionCoreByName,
-        childName,
+        childReference.name,
         depthFirst,
       )
     }
@@ -308,10 +315,10 @@ export function* walkDecompositionsCoreName(
     yield name
   }
   if (decompositionCore.children !== undefined) {
-    for (const childName of decompositionCore.children) {
+    for (const childReference of decompositionCore.children) {
       yield* walkDecompositionsCoreName(
         decompositionCoreByName,
-        childName,
+        childReference.name,
         depthFirst,
       )
     }
-- 
GitLab