child-growth-standards 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -51,6 +51,7 @@ Use **`YYYY-MM-DD`** strings or `Date` values for birth and measurement dates (c
51
51
  - Age for WFA and length/height-for-age: **completed calendar months** (same idea as Excel `DATEDIF(..., "m")`), with tables through **71 completed months**.
52
52
  - Weight-for-**length** applies below **24 months**; weight-for-**height** from **24 up to 59 months** (by month index at measurement).
53
53
  - Each indicator returns **`nutritionalStatus`**, **`nutritionalStatusCode`** (e.g. SUW, UW, N, OW, SSt, St, SW, MW, Ob), and **`sdBand`**. **`zScore` is always `null`**.
54
+ - WFL/WFH wasting (**`MW`** / **`SW`**) also includes **`acuteMalnutritionStatus`** and **`acuteMalnutritionStatusCode`** (`MAM` / `SAM`), with eOPT labels unchanged.
54
55
 
55
56
  ### WHO (`standard: "who"`)
56
57
 
@@ -63,7 +64,7 @@ Use **`YYYY-MM-DD`** strings or `Date` values for birth and measurement dates (c
63
64
 
64
65
  | Age | Source |
65
66
  |-----|--------|
66
- | Birth–5 years | [WHO IMCI Table 1 (NBK487900)](https://www.ncbi.nlm.nih.gov/books/NBK487900/table/fm.s1.t1/) — underweight, stunting, wasting, overweight/obesity on WFL/H and BMI-for-age; weight-for-age underweight only |
67
+ | Birth–5 years | [WHO IMCI Table 1 (NBK487900)](https://www.ncbi.nlm.nih.gov/books/NBK487900/table/fm.s1.t1/) — underweight, stunting, wasting (with **MAM/SAM** on WFL/WFH/BMI-for-age wasting bands), overweight/obesity; optional **MUAC** (6–59 completed months, <11.5 / 11.5–<12.5 cm) and **bilateral pitting oedema** (SAM) |
67
68
  | 5–19 years | [WHO BMI-for-age (5–19)](https://www.who.int/tools/growth-reference-data-for-5to19-years/indicators/bmi-for-age) — thinness, normal weight, overweight, obesity; height-for-age stunting |
68
69
 
69
70
  Head circumference-for-age uses WHO chart bands (below / normal / above expected), not Table 1.
@@ -80,7 +81,7 @@ await calculateAll({
80
81
  });
81
82
  ```
82
83
 
83
- Optional **head circumference** (WHO only, when provided):
84
+ Optional **head circumference**, **MUAC (cm)**, and **bilateral pitting oedema** (WHO only, when provided):
84
85
 
85
86
  ```ts
86
87
  await calculateAll({
@@ -91,9 +92,13 @@ await calculateAll({
91
92
  weightKg: 9.5,
92
93
  lengthHeightCm: 75,
93
94
  headCircumferenceCm: 46,
95
+ muacCm: 12.1,
96
+ bilateralPittingEdema: false,
94
97
  });
95
98
  ```
96
99
 
100
+ Wasting indicators also expose **`acuteMalnutritionStatus`** / **`acuteMalnutritionStatusCode`** (`MAM` / `SAM`) alongside the legacy “moderately/severely wasted” labels. MUAC and oedema appear as extra results: `mid-upper-arm-circumference`, `bilateral-pitting-oedema`.
101
+
97
102
  ## Single indicator (WHO only)
98
103
 
99
104
  ```ts
@@ -0,0 +1,15 @@
1
+ export declare const ACUTE_MAM: {
2
+ readonly status: "Moderate acute malnutrition";
3
+ readonly code: "MAM";
4
+ };
5
+ export declare const ACUTE_SAM: {
6
+ readonly status: "Severe acute malnutrition";
7
+ readonly code: "SAM";
8
+ };
9
+ export type AcuteMalnutritionFields = {
10
+ acuteMalnutritionStatus: string;
11
+ acuteMalnutritionStatusCode: string;
12
+ };
13
+ /** NNC eOPT wasting codes MW/SW → supplementary MAM/SAM (primary labels unchanged). */
14
+ export declare function acuteFieldsForNncWastingCode(code: string): Partial<AcuteMalnutritionFields>;
15
+ //# sourceMappingURL=acute-malnutrition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acute-malnutrition.d.ts","sourceRoot":"","sources":["../src/acute-malnutrition.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;CAGZ,CAAC;AAEX,eAAO,MAAM,SAAS;;;CAGZ,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAAG;IACpC,uBAAuB,EAAE,MAAM,CAAC;IAChC,2BAA2B,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,uFAAuF;AACvF,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,uBAAuB,CAAC,CAclC"}
@@ -0,0 +1,24 @@
1
+ export const ACUTE_MAM = {
2
+ status: "Moderate acute malnutrition",
3
+ code: "MAM",
4
+ };
5
+ export const ACUTE_SAM = {
6
+ status: "Severe acute malnutrition",
7
+ code: "SAM",
8
+ };
9
+ /** NNC eOPT wasting codes MW/SW → supplementary MAM/SAM (primary labels unchanged). */
10
+ export function acuteFieldsForNncWastingCode(code) {
11
+ if (code === "MW") {
12
+ return {
13
+ acuteMalnutritionStatus: ACUTE_MAM.status,
14
+ acuteMalnutritionStatusCode: ACUTE_MAM.code,
15
+ };
16
+ }
17
+ if (code === "SW") {
18
+ return {
19
+ acuteMalnutritionStatus: ACUTE_SAM.status,
20
+ acuteMalnutritionStatusCode: ACUTE_SAM.code,
21
+ };
22
+ }
23
+ return {};
24
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"calculate-doh.d.ts","sourceRoot":"","sources":["../../src/doh/calculate-doh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAmB,GAAG,EAAE,MAAM,aAAa,CAAC;AAU7F,mEAAmE;AACnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,4EAA4E;AAC5E,eAAO,MAAM,kCAAkC,KAAK,CAAC;AAErD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,CAmE1E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAOhD"}
1
+ {"version":3,"file":"calculate-doh.d.ts","sourceRoot":"","sources":["../../src/doh/calculate-doh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAmB,GAAG,EAAE,MAAM,aAAa,CAAC;AAU7F,mEAAmE;AACnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,4EAA4E;AAC5E,eAAO,MAAM,kCAAkC,KAAK,CAAC;AAErD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,CAoE1E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAOhD"}
@@ -1,3 +1,4 @@
1
+ import { acuteFieldsForNncWastingCode } from "../acute-malnutrition.js";
1
2
  import { ageInCompletedMonths, ageInDays, resolveDates } from "../age.js";
2
3
  import { classifyDohLhfa, classifyDohWfa, classifyDohWflh, } from "./classify-cutoffs.js";
3
4
  import { loadDohTable, lookupDohRow, mRoundHalf } from "./load-tables.js";
@@ -58,6 +59,7 @@ export function calculateDohAll(input) {
58
59
  nutritionalStatus: c.label,
59
60
  nutritionalStatusCode: c.code,
60
61
  sdBand: c.sdBand,
62
+ ...acuteFieldsForNncWastingCode(c.code),
61
63
  });
62
64
  }
63
65
  }
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { calculateAll, calculateZScore } from "./calculate.js";
2
2
  export { ageInCompletedMonths, ageInDays, daysToMonths, resolveDates, toDateOnly, FIVE_YEARS_DAYS, NINETEEN_YEARS_DAYS, WHO_DAYS_PER_MONTH, } from "./age.js";
3
- export { mapWhoNutritionalStatus } from "./who/nutritional-status.js";
3
+ export { MUAC_CLASSIFICATION_MAX_MONTHS, MUAC_CLASSIFICATION_MIN_MONTHS, indicatorResultFromWhoStatus, mapWhoEdemaNutritionalStatus, mapWhoMuacNutritionalStatus, mapWhoNutritionalStatus, } from "./who/nutritional-status.js";
4
4
  export { calculateDohAll, isDohPreschoolAge, isNncGrowthAge, mapSex, NNC_EXCLUSIVE_MAX_COMPLETED_MONTHS, NNC_MAX_COMPLETED_MONTH_INDEX, } from "./doh/calculate-doh.js";
5
5
  export { computeZScore, lookupLms, normalCdf, zScoreToPercentile } from "./lms.js";
6
6
  export type { AssessmentResult, CalculateAllInput, CalculateZScoreInput, GrowthStandard, IndicatorResult, Sex, WhoAgeIndex, WhoNutritionalStatusReference, WhoNutritionalStatusResult, LmsRow, DohBandRow, } from "./types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,kCAAkC,EAClC,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnF,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,GAAG,EACH,WAAW,EACX,6BAA6B,EAC7B,0BAA0B,EAC1B,MAAM,EACN,UAAU,GACX,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,EAC9B,4BAA4B,EAC5B,4BAA4B,EAC5B,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,kCAAkC,EAClC,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnF,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,GAAG,EACH,WAAW,EACX,6BAA6B,EAC7B,0BAA0B,EAC1B,MAAM,EACN,UAAU,GACX,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { calculateAll, calculateZScore } from "./calculate.js";
2
2
  export { ageInCompletedMonths, ageInDays, daysToMonths, resolveDates, toDateOnly, FIVE_YEARS_DAYS, NINETEEN_YEARS_DAYS, WHO_DAYS_PER_MONTH, } from "./age.js";
3
- export { mapWhoNutritionalStatus } from "./who/nutritional-status.js";
3
+ export { MUAC_CLASSIFICATION_MAX_MONTHS, MUAC_CLASSIFICATION_MIN_MONTHS, indicatorResultFromWhoStatus, mapWhoEdemaNutritionalStatus, mapWhoMuacNutritionalStatus, mapWhoNutritionalStatus, } from "./who/nutritional-status.js";
4
4
  export { calculateDohAll, isDohPreschoolAge, isNncGrowthAge, mapSex, NNC_EXCLUSIVE_MAX_COMPLETED_MONTHS, NNC_MAX_COMPLETED_MONTH_INDEX, } from "./doh/calculate-doh.js";
5
5
  export { computeZScore, lookupLms, normalCdf, zScoreToPercentile } from "./lms.js";
package/dist/types.d.ts CHANGED
@@ -9,6 +9,10 @@ export type CalculateAllInput = {
9
9
  weightKg: number;
10
10
  lengthHeightCm: number;
11
11
  headCircumferenceCm?: number;
12
+ /** WHO only: mid-upper arm circumference in cm (IMCI Table 1 SAM/MAM cutoffs use mm internally). */
13
+ muacCm?: number;
14
+ /** WHO only: bilateral pitting oedema → severe acute malnutrition (Table 1). */
15
+ bilateralPittingEdema?: boolean;
12
16
  /** WHO only: age index for 0–5 age-based indicators. Default `days`. */
13
17
  whoAgeIndex?: WhoAgeIndex;
14
18
  };
@@ -22,6 +26,9 @@ export type WhoNutritionalStatusResult = {
22
26
  nutritionalStatusCode: string;
23
27
  sdBand: string;
24
28
  reference: WhoNutritionalStatusReference;
29
+ /** Table 1 MAM/SAM when anthropometric wasting or MUAC/edema applies. */
30
+ acuteMalnutritionStatus?: string;
31
+ acuteMalnutritionStatusCode?: string;
25
32
  };
26
33
  export type IndicatorResult = {
27
34
  indicator: string;
@@ -29,6 +36,8 @@ export type IndicatorResult = {
29
36
  nutritionalStatus: string;
30
37
  nutritionalStatusCode?: string;
31
38
  sdBand?: string;
39
+ acuteMalnutritionStatus?: string;
40
+ acuteMalnutritionStatusCode?: string;
32
41
  percentile?: number | null;
33
42
  };
34
43
  export type AssessmentResult = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,CAAC;AAE3C,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEpC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,GAAG,CAAC;IACT,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC;IAC3B,iBAAiB,EAAE,IAAI,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG;IACrD,SAAS,EACL,gBAAgB,GAChB,uBAAuB,GACvB,aAAa,GACb,4BAA4B,GAC5B,mBAAmB,GACnB,mBAAmB,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,qBAAqB,GAAG,qBAAqB,CAAC;AAE1F,MAAM,MAAM,0BAA0B,GAAG;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,6BAA6B,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,CAAC;AAE3C,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEpC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,GAAG,CAAC;IACT,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC;IAC3B,iBAAiB,EAAE,IAAI,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oGAAoG;IACpG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,wEAAwE;IACxE,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG;IACrD,SAAS,EACL,gBAAgB,GAChB,uBAAuB,GACvB,aAAa,GACb,4BAA4B,GAC5B,mBAAmB,GACnB,mBAAmB,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,qBAAqB,GAAG,qBAAqB,CAAC;AAE1F,MAAM,MAAM,0BAA0B,GAAG;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,6BAA6B,CAAC;IACzC,yEAAyE;IACzE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculate-who.d.ts","sourceRoot":"","sources":["../../src/who/calculate-who.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EAChB,MAAM,aAAa,CAAC;AA2CrB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,GAAG,IAAI,CAwCtF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,CA6B1E"}
1
+ {"version":3,"file":"calculate-who.d.ts","sourceRoot":"","sources":["../../src/who/calculate-who.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EAChB,MAAM,aAAa,CAAC;AAgDrB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,GAAG,IAAI,CA8CtF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,CA+C1E"}
@@ -1,6 +1,6 @@
1
1
  import { ageInCompletedMonths, ageInDays, resolveDates } from "../age.js";
2
2
  import { computeZScore, lookupLms, zScoreToPercentile } from "../lms.js";
3
- import { mapWhoNutritionalStatus } from "./nutritional-status.js";
3
+ import { indicatorResultFromWhoStatus, mapWhoEdemaNutritionalStatus, mapWhoMuacNutritionalStatus, mapWhoNutritionalStatus, } from "./nutritional-status.js";
4
4
  import { resolveWhoLms } from "./resolve-table.js";
5
5
  const TWENTY_FOUR_MONTHS_DAYS = 731;
6
6
  function rawBmi(weightKg, heightCm) {
@@ -86,6 +86,12 @@ export function calculateWhoZScore(input) {
86
86
  nutritionalStatus: ns.nutritionalStatus,
87
87
  nutritionalStatusCode: ns.nutritionalStatusCode,
88
88
  sdBand: ns.sdBand,
89
+ ...(ns.acuteMalnutritionStatus
90
+ ? {
91
+ acuteMalnutritionStatus: ns.acuteMalnutritionStatus,
92
+ acuteMalnutritionStatusCode: ns.acuteMalnutritionStatusCode,
93
+ }
94
+ : {}),
89
95
  percentile: zScoreToPercentile(z),
90
96
  };
91
97
  }
@@ -116,5 +122,17 @@ export function calculateWhoAll(input) {
116
122
  if (row)
117
123
  results.push(row);
118
124
  }
125
+ if (input.muacCm != null) {
126
+ const muacNs = mapWhoMuacNutritionalStatus(input.muacCm, months);
127
+ if (muacNs) {
128
+ results.push(indicatorResultFromWhoStatus("mid-upper-arm-circumference", muacNs));
129
+ }
130
+ }
131
+ if (input.bilateralPittingEdema) {
132
+ const edemaNs = mapWhoEdemaNutritionalStatus(true);
133
+ if (edemaNs) {
134
+ results.push(indicatorResultFromWhoStatus("bilateral-pitting-oedema", edemaNs));
135
+ }
136
+ }
119
137
  return { standard: "who", ageDays: days, ageMonthsCompleted: months, results };
120
138
  }
@@ -1,4 +1,12 @@
1
- import type { WhoNutritionalStatusResult } from "../types.js";
1
+ import type { IndicatorResult, WhoNutritionalStatusResult } from "../types.js";
2
2
  export type WhoIndicatorKind = "wfa" | "hfa" | "lhfa" | "wfl" | "wfh" | "bfa" | "hcfa";
3
+ /** IMCI MUAC classification typically applies at 6–59 completed months. */
4
+ export declare const MUAC_CLASSIFICATION_MIN_MONTHS = 6;
5
+ export declare const MUAC_CLASSIFICATION_MAX_MONTHS = 59;
3
6
  export declare function mapWhoNutritionalStatus(indicatorKind: WhoIndicatorKind, zScore: number, ageInDays: number): WhoNutritionalStatusResult;
7
+ /** Table 1 MUAC cutoffs (115 mm / 125 mm), input in cm. */
8
+ export declare function mapWhoMuacNutritionalStatus(muacCm: number, ageMonthsCompleted: number): WhoNutritionalStatusResult | null;
9
+ /** Table 1: bilateral pitting oedema → severe acute malnutrition. */
10
+ export declare function mapWhoEdemaNutritionalStatus(bilateralPittingEdema: boolean): WhoNutritionalStatusResult | null;
11
+ export declare function indicatorResultFromWhoStatus(indicator: string, ns: WhoNutritionalStatusResult, zScore?: number | null, percentile?: number | null): IndicatorResult;
4
12
  //# sourceMappingURL=nutritional-status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nutritional-status.d.ts","sourceRoot":"","sources":["../../src/who/nutritional-status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiC,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAE7F,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAiLvF,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,gBAAgB,EAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,0BAA0B,CAkC5B"}
1
+ {"version":3,"file":"nutritional-status.d.ts","sourceRoot":"","sources":["../../src/who/nutritional-status.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EAEf,0BAA0B,EAC3B,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAUvF,2EAA2E;AAC3E,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAuLjD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,gBAAgB,EAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,0BAA0B,CAkC5B;AAED,2DAA2D;AAC3D,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,GACzB,0BAA0B,GAAG,IAAI,CA8BnC;AAED,qEAAqE;AACrE,wBAAgB,4BAA4B,CAC1C,qBAAqB,EAAE,OAAO,GAC7B,0BAA0B,GAAG,IAAI,CAUnC;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,0BAA0B,EAC9B,MAAM,GAAE,MAAM,GAAG,IAAW,EAC5B,UAAU,GAAE,MAAM,GAAG,IAAW,GAC/B,eAAe,CAejB"}
@@ -1,3 +1,4 @@
1
+ import { ACUTE_MAM, ACUTE_SAM } from "../acute-malnutrition.js";
1
2
  import { FIVE_YEARS_DAYS } from "../age.js";
2
3
  function normalizeKind(kind) {
3
4
  if (kind === "wfh")
@@ -6,8 +7,24 @@ function normalizeKind(kind) {
6
7
  return "hfa";
7
8
  return kind;
8
9
  }
9
- function result(nutritionalStatus, nutritionalStatusCode, sdBand, reference) {
10
- return { nutritionalStatus, nutritionalStatusCode, sdBand, reference };
10
+ const MUAC_SAM_MAX_CM = 11.5;
11
+ const MUAC_MAM_MAX_CM = 12.5;
12
+ /** IMCI MUAC classification typically applies at 6–59 completed months. */
13
+ export const MUAC_CLASSIFICATION_MIN_MONTHS = 6;
14
+ export const MUAC_CLASSIFICATION_MAX_MONTHS = 59;
15
+ function result(nutritionalStatus, nutritionalStatusCode, sdBand, reference, acute) {
16
+ return {
17
+ nutritionalStatus,
18
+ nutritionalStatusCode,
19
+ sdBand,
20
+ reference,
21
+ ...(acute
22
+ ? {
23
+ acuteMalnutritionStatus: acute.status,
24
+ acuteMalnutritionStatusCode: acute.code,
25
+ }
26
+ : {}),
27
+ };
11
28
  }
12
29
  function whoSdBand(z, kind, underFive) {
13
30
  if (kind === "hcfa") {
@@ -114,10 +131,10 @@ function mapHfaFiveToNineteen(z) {
114
131
  function mapWflUnderFive(z) {
115
132
  const ref = "who-imci-table1-0-5";
116
133
  if (z < -3) {
117
- return result("Severely wasted", "SEV_W", "< −3 SD", ref);
134
+ return result("Severely wasted", "SEV_W", "< −3 SD", ref, ACUTE_SAM);
118
135
  }
119
136
  if (z <= -2) {
120
- return result("Moderately wasted", "MOD_W", "−3 SD to −2 SD", ref);
137
+ return result("Moderately wasted", "MOD_W", "−3 SD to −2 SD", ref, ACUTE_MAM);
121
138
  }
122
139
  if (z <= 1) {
123
140
  return result("Normal", "N", "−2 SD to +1 SD", ref);
@@ -187,3 +204,44 @@ export function mapWhoNutritionalStatus(indicatorKind, zScore, ageInDays) {
187
204
  }
188
205
  return result("", "", "", underFive ? "who-imci-table1-0-5" : "who-growth-ref-5-19");
189
206
  }
207
+ /** Table 1 MUAC cutoffs (115 mm / 125 mm), input in cm. */
208
+ export function mapWhoMuacNutritionalStatus(muacCm, ageMonthsCompleted) {
209
+ const muac = Number(muacCm);
210
+ if (!Number.isFinite(muac) || muac <= 0)
211
+ return null;
212
+ if (ageMonthsCompleted < MUAC_CLASSIFICATION_MIN_MONTHS ||
213
+ ageMonthsCompleted > MUAC_CLASSIFICATION_MAX_MONTHS) {
214
+ return null;
215
+ }
216
+ const ref = "who-imci-table1-0-5";
217
+ if (muac < MUAC_SAM_MAX_CM) {
218
+ return result("Severe acute malnutrition (MUAC)", "SAM", "< 11.5 cm", ref, ACUTE_SAM);
219
+ }
220
+ if (muac < MUAC_MAM_MAX_CM) {
221
+ return result("Moderate acute malnutrition (MUAC)", "MAM", "11.5 cm to < 12.5 cm", ref, ACUTE_MAM);
222
+ }
223
+ return result("Normal (MUAC)", "N", "≥ 12.5 cm", ref);
224
+ }
225
+ /** Table 1: bilateral pitting oedema → severe acute malnutrition. */
226
+ export function mapWhoEdemaNutritionalStatus(bilateralPittingEdema) {
227
+ if (!bilateralPittingEdema)
228
+ return null;
229
+ const ref = "who-imci-table1-0-5";
230
+ return result("Severe acute malnutrition (bilateral pitting oedema)", "SAM", "Clinical", ref, ACUTE_SAM);
231
+ }
232
+ export function indicatorResultFromWhoStatus(indicator, ns, zScore = null, percentile = null) {
233
+ return {
234
+ indicator,
235
+ zScore,
236
+ nutritionalStatus: ns.nutritionalStatus,
237
+ nutritionalStatusCode: ns.nutritionalStatusCode,
238
+ sdBand: ns.sdBand,
239
+ ...(ns.acuteMalnutritionStatus
240
+ ? {
241
+ acuteMalnutritionStatus: ns.acuteMalnutritionStatus,
242
+ acuteMalnutritionStatusCode: ns.acuteMalnutritionStatusCode,
243
+ }
244
+ : {}),
245
+ ...(percentile != null ? { percentile } : {}),
246
+ };
247
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "child-growth-standards",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Pediatric growth — NNC (eOPT) cutoff classification and WHO LMS z-scores with nutritional status",
5
5
  "type": "module",
6
6
  "license": "MIT",