formulab 0.16.0 → 0.18.0

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.
Files changed (82) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/README.md +7 -7
  3. package/dist/chemical/reliefValve.d.ts +8 -0
  4. package/dist/chemical/reliefValve.d.ts.map +1 -1
  5. package/dist/chemical/reliefValve.js +18 -1
  6. package/dist/chemical/reliefValve.js.map +1 -1
  7. package/dist/chemical/types.d.ts +2 -0
  8. package/dist/chemical/types.d.ts.map +1 -1
  9. package/dist/construction/brick.d.ts +1 -0
  10. package/dist/construction/brick.d.ts.map +1 -1
  11. package/dist/construction/brick.js +13 -0
  12. package/dist/construction/brick.js.map +1 -1
  13. package/dist/construction/concreteMix.d.ts +1 -0
  14. package/dist/construction/concreteMix.d.ts.map +1 -1
  15. package/dist/construction/concreteMix.js +7 -0
  16. package/dist/construction/concreteMix.js.map +1 -1
  17. package/dist/construction/rebar.d.ts +1 -0
  18. package/dist/construction/rebar.d.ts.map +1 -1
  19. package/dist/construction/rebar.js +4 -0
  20. package/dist/construction/rebar.js.map +1 -1
  21. package/dist/construction/stair.d.ts +2 -0
  22. package/dist/construction/stair.d.ts.map +1 -1
  23. package/dist/construction/stair.js +15 -2
  24. package/dist/construction/stair.js.map +1 -1
  25. package/dist/electronics/resistor.d.ts +2 -0
  26. package/dist/electronics/resistor.d.ts.map +1 -1
  27. package/dist/electronics/resistor.js +47 -14
  28. package/dist/electronics/resistor.js.map +1 -1
  29. package/dist/electronics/trace.d.ts +1 -0
  30. package/dist/electronics/trace.d.ts.map +1 -1
  31. package/dist/electronics/trace.js +10 -0
  32. package/dist/electronics/trace.js.map +1 -1
  33. package/dist/energy/solarOutput.d.ts +18 -8
  34. package/dist/energy/solarOutput.d.ts.map +1 -1
  35. package/dist/energy/solarOutput.js +92 -22
  36. package/dist/energy/solarOutput.js.map +1 -1
  37. package/dist/energy/types.d.ts.map +1 -1
  38. package/dist/environmental/energyIntensity.d.ts +1 -0
  39. package/dist/environmental/energyIntensity.d.ts.map +1 -1
  40. package/dist/environmental/energyIntensity.js +7 -0
  41. package/dist/environmental/energyIntensity.js.map +1 -1
  42. package/dist/environmental/productCarbonFootprint.d.ts +5 -1
  43. package/dist/environmental/productCarbonFootprint.d.ts.map +1 -1
  44. package/dist/environmental/productCarbonFootprint.js +14 -2
  45. package/dist/environmental/productCarbonFootprint.js.map +1 -1
  46. package/dist/environmental/vocEmissions.d.ts +3 -1
  47. package/dist/environmental/vocEmissions.d.ts.map +1 -1
  48. package/dist/environmental/vocEmissions.js +16 -2
  49. package/dist/environmental/vocEmissions.js.map +1 -1
  50. package/dist/environmental/waterFootprint.d.ts +3 -1
  51. package/dist/environmental/waterFootprint.d.ts.map +1 -1
  52. package/dist/environmental/waterFootprint.js +11 -4
  53. package/dist/environmental/waterFootprint.js.map +1 -1
  54. package/dist/math.d.ts +0 -4
  55. package/dist/math.d.ts.map +1 -1
  56. package/dist/math.js +0 -6
  57. package/dist/math.js.map +1 -1
  58. package/dist/metal/hardness.d.ts +5 -0
  59. package/dist/metal/hardness.d.ts.map +1 -1
  60. package/dist/metal/hardness.js +13 -3
  61. package/dist/metal/hardness.js.map +1 -1
  62. package/dist/metal/roughness.d.ts +7 -0
  63. package/dist/metal/roughness.d.ts.map +1 -1
  64. package/dist/metal/roughness.js +15 -1
  65. package/dist/metal/roughness.js.map +1 -1
  66. package/dist/metal/types.d.ts +5 -1
  67. package/dist/metal/types.d.ts.map +1 -1
  68. package/dist/metal/weldHeat.d.ts +5 -0
  69. package/dist/metal/weldHeat.d.ts.map +1 -1
  70. package/dist/metal/weldHeat.js +27 -7
  71. package/dist/metal/weldHeat.js.map +1 -1
  72. package/dist/quality/aql.d.ts +9 -0
  73. package/dist/quality/aql.d.ts.map +1 -1
  74. package/dist/quality/aql.js +40 -21
  75. package/dist/quality/aql.js.map +1 -1
  76. package/dist/quality/ppm.d.ts +4 -0
  77. package/dist/quality/ppm.d.ts.map +1 -1
  78. package/dist/quality/ppm.js +17 -4
  79. package/dist/quality/ppm.js.map +1 -1
  80. package/dist/quality/types.d.ts +15 -1
  81. package/dist/quality/types.d.ts.map +1 -1
  82. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -5,6 +5,115 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.18.0] - 2026-07-13
9
+
10
+ Owner-approved follow-ups to the 0.17.0 silent-clamp audit.
11
+
12
+ ### Changed
13
+
14
+ - **`energy/solarOutput()` tilt/orientation model rebuilt** (⚠️ output values change). The
15
+ former cos-approximation floored both correction factors at 0.5, pinning every away-facing
16
+ array at exactly 50% of south-facing regardless of tilt. The factor is now computed
17
+ physically: isotropic-sky transposition (Liu & Jordan) with standard solar geometry
18
+ (Duffie & Beckman eq. 1.6.2) integrated over the year, normalized to the best
19
+ equator-facing tilt (scanned 0–90°, so the ratio is ≤ 1 by construction — no clamp
20
+ exists). Model assumptions documented in-source: diffuse fraction 0.3, albedo 0.2.
21
+ Anchors at latitude 37: south/latitude-tilt ≈ 1.0, SE ≈ 0.96, E/W ≈ 0.85, flat ≈ 0.88,
22
+ north 30° ≈ 0.61, north 60° ≈ 0.38 — consistent with fixed-orientation literature
23
+ (Lave & Kleissl 2011: north ≈ 0.6–0.7) and PVWatts-derived tables. Note: the original
24
+ audit guessed north should be 30–40%; the literature does not support that — the real
25
+ defect was the hard 50% pin and tilt-insensitivity, both gone now.
26
+ `tiltEfficiencyFloored` (introduced in 0.17.0, never published) is removed; new
27
+ validation throws for tiltAngle outside [0, 90] and latitude outside [-90, 90].
28
+ `azimuthOffset` is documented hemisphere-neutrally (degrees from the equator-facing
29
+ direction).
30
+
31
+ ### Added
32
+
33
+ - **`quality/aql()` — AQL 10/15/25 columns.** The embedded ISO 2859-1 Table 2-A now covers
34
+ 0.065–25 (was 0.065–6.5), so AQL 10 — a real, commonly used level — no longer reports
35
+ `aqlAdjusted: true` with a substituted 6.5 plan. Transcribed cell-by-cell from the
36
+ ISO 2859-1:1999(E) Table 2-A scan and cross-verified against MIL-STD-105E Table II-A
37
+ (identical master table); arrow cells resolve per the documented simplification.
38
+ Cell-level golden tests pin direct, down-arrow, and up-arrow cells. Per ISO 2859-1,
39
+ AQLs above 10 apply to nonconformities-per-100-items inspection only (documented).
40
+ - **`chemical/reliefValve()` → `suggestedMinValves`** (additive). First-order minimum count
41
+ of parallel 'T' valves (`ceil(requiredArea / 16,774)`); 1 when a single valve suffices.
42
+ Documented as a first-order figure — an actual multi-valve installation must be re-sized
43
+ per API 520.
44
+
45
+ ## [0.17.0] - 2026-07-13
46
+
47
+ ### Added — clamp/snap disclosure (ISSUE-20260713 audit)
48
+
49
+ An execution-based audit confirmed five silent-clamp defects across four functions: realistic
50
+ inputs land outside a model/table boundary, the output is clamped to the boundary, and nothing
51
+ in the result says so. Following the `illuminance()` `roomIndexClamped` precedent (0.16.0),
52
+ every clamping function now reports the clamp. All new fields are **additive booleans** —
53
+ no existing field changed.
54
+
55
+ - **`chemical/reliefValve()` → `orificeExceedsMax`.** When the required area exceeds the largest
56
+ API 526 orifice ('T', 16,774 mm²) the loop silently reported 'T' as the selection — e.g. a gas
57
+ relief of 50,000 kg/h @ 1,000 kPa(g) needs ~43,000 mm² (2.56 × T) yet came back as
58
+ `selectedOrifice: 'T'` with no warning, a valve that delivers only ~39% of the required
59
+ capacity. The flag marks that a single valve cannot do it (parallel valves needed);
60
+ `percentUtilized > 100` accompanies it.
61
+ - **`metal/weldHeat()` → `hazHardnessClamped`, `coolingTimeClamped`.** HAZ hardness is clamped
62
+ to the Yurioka model's 150–700 HV range and t8/5 to 0.5–300 s. Stainless/cast-iron
63
+ compositions blow past 700 HV (cast iron ≈ 4200 raw) and thin-sheet GTAW lands under 0.5 s,
64
+ producing flat, input-insensitive outputs with no explanation. When the 700 HV ceiling is
65
+ hit the recommendation now says so via the new code **`hazHardnessCapped`** (`{ cap: 700 }`)
66
+ instead of presenting "700 HV" as the expected value (`WeldRecommendationCode` union gains
67
+ one member).
68
+ - **`metal/roughness()` → `outOfTableRange`.** Ra/Rz/N inputs outside the ISO 1302 table
69
+ (Ra 0.025–50 µm) were silently snapped up to 4× off (lapped Ra 0.006 → N1 = 0.025;
70
+ sand-cast Ra 100 → N12 = 50). Nearest-grade snapping *within* the table is by design and
71
+ is not flagged.
72
+ - **`metal/hardness()` → `outOfTableRange`.** Same class, found while codifying the convention:
73
+ inputs outside the ASTM E140 table (HRC 20–68) clamp to the boundary row, now disclosed.
74
+ - **`energy/solarOutput()` → `tiltEfficiencyFloored`.** The tilt/azimuth factors floor at 0.5,
75
+ so a north-facing array reports exactly 50% of south-facing forever (real yield can be
76
+ 30–40%). The flag marks the output as an optimistic bound, not an estimate.
77
+ - **`quality/aql()` → `aqlUsed`, `aqlAdjusted`.** The embedded ISO 2859-1 table covers AQL
78
+ 0.065–6.5 while the standard defines 0.010–1000; requests outside or between columns were
79
+ silently substituted (10 → 6.5, 0.01 → 0.065 — a *looser* plan than asked). `aqlUsed` reports
80
+ the column actually applied.
81
+
82
+ The rule is now codified in CLAUDE.md: **a function that clamps or snaps to a boundary must
83
+ disclose it via a boolean flag.**
84
+
85
+ ### Fixed — error-contract restoration (full ERRORS.md audit)
86
+
87
+ A source-level audit of all 15 domains found ten functions whose documented `RangeError`
88
+ contract was not implemented — degenerate inputs produced `NaN`/`Infinity` or an uncontrolled
89
+ `TypeError`. They now validate as documented (⚠️ behavior change for previously-garbage paths):
90
+
91
+ - `construction/rebarWeight` (unknown size → was NaN), `concreteMix` (unknown grade → was
92
+ TypeError; volume ≤ 0), `brick` (wallArea ≤ 0; unknown size → was TypeError; custom
93
+ dimensions ≤ 0; negative mortar), `stair` (totalRise ≤ 0 → was NaN with a specified riser;
94
+ negative totalRun/riserHeight; riserHeight 0 still means auto-calculate)
95
+ - `electronics/resistorDecode` (unknown colors → was NaN; gold/silver as digit → was negative
96
+ resistance; the silent `?? 20%` tolerance fallback for invalid colors now throws),
97
+ `traceWidth` (current/tempRise/copperWeight ≤ 0 → was NaN/Infinity)
98
+ - `environmental/energyIntensity` (productionUnits ≤ 0 → was Infinity), `productCarbonFootprint`
99
+ (empty stages → was TypeError; quantity ≤ 0; negative stages remain valid as recycling
100
+ credits, total ≤ 0 → stage percents 0), `vocEmissions` (negative total, efficiency outside
101
+ [0, 1]; zero total → reductionPercent 0), `waterFootprint` (negative volumes; all-zero
102
+ footprint → percents 0)
103
+ - `quality/ppm` — out-of-range inputs were clamped silently (defectRate 150 → 100%,
104
+ **sigma 7 → 6**, which substitutes a defect rate orders of magnitude off). Now throws
105
+ `RangeError` for defectRate outside [0, 100], ppm outside [0, 1,000,000], sigma outside
106
+ [0, 6]
107
+
108
+ ### Documentation
109
+
110
+ - **ERRORS.md is now a complete, source-verified contract**: full per-function tables added for
111
+ Logistics (17), Energy (15), Food (7), Utility (18), Environmental (10), and IE (5) — these
112
+ domains previously had a one-line stub — and 12 stale rows in Metal/Construction/Electronics
113
+ corrected against source. Every domain's row count now matches its function count (210 total).
114
+ - README/package.json function census corrected by script count: **210 calculations + 8 type
115
+ guards** (package.json still said 182).
116
+
8
117
  ## [0.16.0] - 2026-07-13
9
118
 
10
119
  ### Added
package/README.md CHANGED
@@ -11,12 +11,12 @@ A comprehensive collection of engineering formulas and calculations for manufact
11
11
 
12
12
  ## Features
13
13
 
14
- - **209 industrial calculations + 8 type guards** — OEE, Cpk, SPC control charts, Gage R&R, Weibull, metal weight, CNC machining, GD&T, pipe flow, CBM, NIOSH lifting, PMV/PPD, arc flash, battery SOH, GHG emissions, PID tuning, and more
14
+ - **210 industrial calculations + 8 type guards** — OEE, Cpk, SPC control charts, Gage R&R, Weibull, metal weight, CNC machining, GD&T, pipe flow, CBM, NIOSH lifting, PMV/PPD, arc flash, battery SOH, GHG emissions, PID tuning, and more
15
15
  - **15 specialized domains** — Quality, Metal, Chemical, Electronics, Construction, Automotive, Logistics, Energy, Safety, Food, Utility, Battery, Environmental, Machining, Industrial Engineering
16
16
  - **Zero dependencies** — Lightweight and fast
17
17
  - **TypeScript first** — Full type definitions included
18
18
  - **Tree-shakeable** — Import only what you need
19
- - **2,779 tests** — Coverage thresholds: 90% lines, 95% functions, 85% branches ([CI pipeline](https://github.com/iyulab/formulab/actions/workflows/ci.yml))
19
+ - **2,875 tests** — Coverage thresholds: 90% lines, 95% functions, 85% branches ([CI pipeline](https://github.com/iyulab/formulab/actions/workflows/ci.yml))
20
20
  - **Research-based** — Golden reference tests verified against NIOSH 94-110, AIAG/ASTM E2587, JIPM, ASME B16.5, ISO 22514-2, and more
21
21
 
22
22
  ## Verification Status
@@ -24,17 +24,17 @@ A comprehensive collection of engineering formulas and calculations for manufact
24
24
  | Domain | Functions | Golden Tests | Key References |
25
25
  |--------|-----------|-------------|----------------|
26
26
  | Quality | 21 | oee, cpk, controlChart, gageRR | ISO 22400-2, AIAG/ASTM E2587, JIPM, AIAG MSA |
27
- | Metal | 34 | metalWeight | Machinery's Handbook, ASME B36.10/B16.5 |
27
+ | Metal | 33 | metalWeight | Machinery's Handbook, ASME B36.10/B16.5 |
28
28
  | Logistics | 17 | cbm | Physical formula |
29
29
  | Safety | 14 | nioshLifting | NIOSH 94-110, ISO 7730, IEEE 1584, OSHA |
30
- | Chemical | 15 | — | Darcy-Weisbach, Fourier, API 520, ISA |
31
- | Electronics | 13 | — | IPC-2221 |
32
- | Construction | 16 | — | AISC, Timoshenko |
30
+ | Chemical | 12 | — | Darcy-Weisbach, Fourier, API 520, ISA |
31
+ | Electronics | 12 | — | IPC-2221 |
32
+ | Construction | 15 | — | AISC, Timoshenko |
33
33
  | Automotive | 9 | — | AASHTO, SAE J1772 |
34
34
  | Energy | 15 | — | NREL PVWatts, ISO 50001 |
35
35
  | Food | 7 | — | HACCP, ICH Q1A |
36
36
  | Utility | 18 | — | — |
37
- | Battery | 11 | — | IEEE 1188, IEC 62620, Battery University |
37
+ | Battery | 10 | — | IEEE 1188, IEC 62620, Battery University |
38
38
  | Environmental | 10 | — | GHG Protocol, IPCC AR6, IEA 2023 |
39
39
  | Machining | 12 | — | Machinery's Handbook, ASME Y14.5, Sandvik Coromant |
40
40
  | IE | 5 | — | MTM/MOST, Wright's learning curve |
@@ -9,6 +9,14 @@ import type { ReliefValveInput, ReliefValveResult } from './types.js';
9
9
  *
10
10
  * @reference API 520 Part I (2020) — Sizing and Selection of Pressure-Relieving Devices
11
11
  * @reference API 526 (2017) — Flanged Steel Pressure-Relief Valves
12
+ *
13
+ * When the required area exceeds the largest API 526 orifice ('T', 16,774 mm²), the result
14
+ * still reports 'T' as the closest standard size but sets `orificeExceedsMax: true` — a single
15
+ * valve cannot provide the required capacity (multiple valves in parallel are needed). Callers
16
+ * should surface this to the user; `percentUtilized` will be > 100 in that case.
17
+ * `suggestedMinValves` gives the first-order parallel count (`ceil(requiredArea / T)`); an
18
+ * actual multi-valve installation must be re-sized per API 520, since inlet and back-pressure
19
+ * corrections change each valve's capacity.
12
20
  */
13
21
  export declare function reliefValve(input: ReliefValveInput): ReliefValveResult;
14
22
  //# sourceMappingURL=reliefValve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reliefValve.d.ts","sourceRoot":"","sources":["../../src/chemical/reliefValve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoBtE;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAmFtE"}
1
+ {"version":3,"file":"reliefValve.d.ts","sourceRoot":"","sources":["../../src/chemical/reliefValve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoBtE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CA4FtE"}
@@ -26,6 +26,14 @@ const API_ORIFICES = [
26
26
  *
27
27
  * @reference API 520 Part I (2020) — Sizing and Selection of Pressure-Relieving Devices
28
28
  * @reference API 526 (2017) — Flanged Steel Pressure-Relief Valves
29
+ *
30
+ * When the required area exceeds the largest API 526 orifice ('T', 16,774 mm²), the result
31
+ * still reports 'T' as the closest standard size but sets `orificeExceedsMax: true` — a single
32
+ * valve cannot provide the required capacity (multiple valves in parallel are needed). Callers
33
+ * should surface this to the user; `percentUtilized` will be > 100 in that case.
34
+ * `suggestedMinValves` gives the first-order parallel count (`ceil(requiredArea / T)`); an
35
+ * actual multi-valve installation must be re-sized per API 520, since inlet and back-pressure
36
+ * corrections change each valve's capacity.
29
37
  */
30
38
  export function reliefValve(input) {
31
39
  const { requiredCapacity, setPressure, backPressure, temperature, fluidType, molecularWeight = 29, specificGravity = 1.0, overpressure = 10, dischargeCoefficient, } = input;
@@ -71,7 +79,10 @@ export function reliefValve(input) {
71
79
  requiredArea = (Qm3h / (Kd * Kw * Kc * Kv)) * Math.sqrt(SG / dpBar) * 1e4 / 3.6;
72
80
  }
73
81
  }
74
- // Select standard orifice
82
+ // Select the smallest standard orifice that covers the required area. API 526 tops out at
83
+ // 'T' (16,774 mm²) — realistic large reliefs do exceed it (e.g. gas 50,000 kg/h @ 1,000 kPa(g)
84
+ // needs ~43,000 mm²). When that happens 'T' is reported as the closest standard size, but it is
85
+ // NOT adequate on its own, so flag it instead of presenting 'T' as a valid single-valve selection.
75
86
  let selectedOrifice = API_ORIFICES[API_ORIFICES.length - 1];
76
87
  for (const orifice of API_ORIFICES) {
77
88
  if (orifice.area >= requiredArea) {
@@ -79,6 +90,10 @@ export function reliefValve(input) {
79
90
  break;
80
91
  }
81
92
  }
93
+ const orificeExceedsMax = requiredArea > selectedOrifice.area;
94
+ // First-order minimum parallel-'T' count; 1 covers requiredArea = 0 (liquid dp <= 0 edge)
95
+ const maxOrificeArea = API_ORIFICES[API_ORIFICES.length - 1].area;
96
+ const suggestedMinValves = Math.max(1, Math.ceil(requiredArea / maxOrificeArea));
82
97
  // Capacity at selected orifice
83
98
  const capacityAtOrifice = requiredArea > 0
84
99
  ? requiredCapacity * (selectedOrifice.area / requiredArea)
@@ -93,6 +108,8 @@ export function reliefValve(input) {
93
108
  relievingPressure: roundTo(relievingPressure, 2),
94
109
  capacityAtOrifice: roundTo(capacityAtOrifice, 2),
95
110
  percentUtilized: roundTo(percentUtilized, 2),
111
+ orificeExceedsMax,
112
+ suggestedMinValves,
96
113
  };
97
114
  }
98
115
  //# sourceMappingURL=reliefValve.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reliefValve.js","sourceRoot":"","sources":["../../src/chemical/reliefValve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reliefValve.js","sourceRoot":"","sources":["../../src/chemical/reliefValve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,8CAA8C;AAC9C,MAAM,YAAY,GAAuC;IACvD,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;IACzB,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;IAC1B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;IAC1B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;IAC1B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;IAC1B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;IAC1B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;IAC5B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,EACJ,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EACnE,eAAe,GAAG,EAAE,EAAE,eAAe,GAAG,GAAG,EAC3C,YAAY,GAAG,EAAE,EAAE,oBAAoB,GACxC,GAAG,KAAK,CAAC;IAEV,uBAAuB;IACvB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,MAAM;IAC5B,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,GAAG,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,2BAA2B;IAC/F,MAAM,iBAAiB,GAAG,EAAE,CAAC;IAE7B,IAAI,YAAoB,CAAC,CAAC,MAAM;IAEhC,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,oBAAoB,IAAI,KAAK,CAAC;QACzC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,4DAA4D;QAC5E,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,yBAAyB;QACzC,MAAM,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC;QAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,yBAAyB;QACxC,MAAM,CAAC,GAAG,eAAe,CAAC;QAE1B,2DAA2D;QAC3D,qBAAqB;QACrB,MAAM,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5C,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAExE,2CAA2C;QAC3C,2EAA2E;QAC3E,MAAM,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,wBAAwB;QAE3E,YAAY,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,iBAAiB;IAEnE,CAAC;SAAM,CAAC;QACN,SAAS;QACT,MAAM,EAAE,GAAG,oBAAoB,IAAI,IAAI,CAAC;QACxC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,2BAA2B;QAC3C,MAAM,EAAE,GAAG,GAAG,CAAC;QACf,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,uBAAuB;QAEvC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM,EAAE,GAAG,eAAe,CAAC;QAE3B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACZ,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,oEAAoE;YACpE,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,QAAQ;YAC9B,MAAM,IAAI,GAAG,gBAAgB,GAAG,GAAG,CAAC;YACpC,MAAM,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC;YAEvB,YAAY,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;QAClF,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,+FAA+F;IAC/F,gGAAgG;IAChG,mGAAmG;IACnG,IAAI,eAAe,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,IAAI,IAAI,YAAY,EAAE,CAAC;YACjC,eAAe,GAAG,OAAO,CAAC;YAC1B,MAAM;QACR,CAAC;IACH,CAAC;IACD,MAAM,iBAAiB,GAAG,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC;IAC9D,0FAA0F;IAC1F,MAAM,cAAc,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC;IAEjF,+BAA+B;IAC/B,MAAM,iBAAiB,GAAG,YAAY,GAAG,CAAC;QACxC,CAAC,CAAC,gBAAgB,GAAG,CAAC,eAAe,CAAC,IAAI,GAAG,YAAY,CAAC;QAC1D,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,eAAe,GAAG,eAAe,CAAC,IAAI,GAAG,CAAC;QAC9C,CAAC,CAAC,CAAC,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,GAAG;QAC7C,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,eAAe,EAAE,eAAe,CAAC,MAAM;QACvC,WAAW,EAAE,eAAe,CAAC,IAAI;QACjC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChD,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5C,iBAAiB;QACjB,kBAAkB;KACnB,CAAC;AACJ,CAAC"}
@@ -254,6 +254,8 @@ export interface ReliefValveResult {
254
254
  relievingPressure: number;
255
255
  capacityAtOrifice: number;
256
256
  percentUtilized: number;
257
+ orificeExceedsMax: boolean;
258
+ suggestedMinValves: number;
257
259
  }
258
260
  /**
259
261
  * PID Tuning Types — Ziegler-Nichols / Cohen-Coon
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chemical/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chemical/types.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ export declare const BRICK_SIZES: Record<Exclude<BrickSize, 'custom'>, BrickDime
12
12
  *
13
13
  * @param input - Brick input parameters
14
14
  * @returns Brick calculation results
15
+ * @throws {RangeError} wallArea ≤ 0, unknown brickSize, custom dimensions ≤ 0, or mortarThickness < 0
15
16
  */
16
17
  export declare function brick(input: BrickInput): BrickResult;
17
18
  //# sourceMappingURL=brick.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brick.d.ts","sourceRoot":"","sources":["../../src/construction/brick.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGtF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,eAAe,CAK7E,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAqCpD"}
1
+ {"version":3,"file":"brick.d.ts","sourceRoot":"","sources":["../../src/construction/brick.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGtF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,eAAe,CAK7E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAkDpD"}
@@ -17,18 +17,31 @@ export const BRICK_SIZES = {
17
17
  *
18
18
  * @param input - Brick input parameters
19
19
  * @returns Brick calculation results
20
+ * @throws {RangeError} wallArea ≤ 0, unknown brickSize, custom dimensions ≤ 0, or mortarThickness < 0
20
21
  */
21
22
  export function brick(input) {
22
23
  const { wallArea, brickSize, customLength, customHeight, mortarThickness, wasteFactor } = input;
24
+ if (wallArea <= 0) {
25
+ throw new RangeError('wallArea must be greater than 0');
26
+ }
27
+ if (mortarThickness < 0) {
28
+ throw new RangeError('mortarThickness must not be negative');
29
+ }
23
30
  // Get brick dimensions
24
31
  let length;
25
32
  let height;
26
33
  if (brickSize === 'custom') {
27
34
  length = customLength ?? 200;
28
35
  height = customHeight ?? 60;
36
+ if (length <= 0 || height <= 0) {
37
+ throw new RangeError('custom brick dimensions must be greater than 0');
38
+ }
29
39
  }
30
40
  else {
31
41
  const dims = BRICK_SIZES[brickSize];
42
+ if (dims === undefined) {
43
+ throw new RangeError(`unknown brick size: ${String(brickSize)}`);
44
+ }
32
45
  length = dims.length;
33
46
  height = dims.height;
34
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"brick.js","sourceRoot":"","sources":["../../src/construction/brick.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAA0D;IAChF,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAK,iBAAiB;IAC1D,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAI,aAAa;IACtD,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAO,aAAa;IACtD,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAQ,iBAAiB;CAC3D,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,KAAK,CAAC,KAAiB;IACrC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAEhG,uBAAuB;IACvB,IAAI,MAAc,CAAC;IACnB,IAAI,MAAc,CAAC;IAEnB,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,YAAY,IAAI,GAAG,CAAC;QAC7B,MAAM,GAAG,YAAY,IAAI,EAAE,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,WAAW,CAAC,SAAyC,CAAC,CAAC;QACpE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,kFAAkF;IAClF,MAAM,qBAAqB,GAAG,MAAM,GAAG,eAAe,CAAC;IACvD,MAAM,qBAAqB,GAAG,MAAM,GAAG,eAAe,CAAC;IACvD,MAAM,gBAAgB,GAAG,OAAO,GAAG,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,CAAC;IAEnF,6BAA6B;IAC7B,MAAM,kBAAkB,GAAG,QAAQ,GAAG,gBAAgB,CAAC;IAEvD,iCAAiC;IACjC,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,kBAAkB,GAAG,eAAe,CAAC;IAEzD,gBAAgB;IAChB,MAAM,YAAY,GAAG,WAAW,GAAG,kBAAkB,CAAC;IAEtD,OAAO;QACL,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC9C,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACnC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACjD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;KACtC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"brick.js","sourceRoot":"","sources":["../../src/construction/brick.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAA0D;IAChF,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAK,iBAAiB;IAC1D,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAI,aAAa;IACtD,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAO,aAAa;IACtD,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAQ,iBAAiB;CAC3D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,KAAK,CAAC,KAAiB;IACrC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAEhG,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,sCAAsC,CAAC,CAAC;IAC/D,CAAC;IAED,uBAAuB;IACvB,IAAI,MAAc,CAAC;IACnB,IAAI,MAAc,CAAC;IAEnB,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,YAAY,IAAI,GAAG,CAAC;QAC7B,MAAM,GAAG,YAAY,IAAI,EAAE,CAAC;QAC5B,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,UAAU,CAAC,gDAAgD,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,WAAW,CAAC,SAAyC,CAAC,CAAC;QACpE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAAC,uBAAuB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,kFAAkF;IAClF,MAAM,qBAAqB,GAAG,MAAM,GAAG,eAAe,CAAC;IACvD,MAAM,qBAAqB,GAAG,MAAM,GAAG,eAAe,CAAC;IACvD,MAAM,gBAAgB,GAAG,OAAO,GAAG,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,CAAC;IAEnF,6BAA6B;IAC7B,MAAM,kBAAkB,GAAG,QAAQ,GAAG,gBAAgB,CAAC;IAEvD,iCAAiC;IACjC,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,kBAAkB,GAAG,eAAe,CAAC;IAEzD,gBAAgB;IAChB,MAAM,YAAY,GAAG,WAAW,GAAG,kBAAkB,CAAC;IAEtD,OAAO;QACL,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC9C,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACnC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACjD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;KACtC,CAAC;AACJ,CAAC"}
@@ -4,6 +4,7 @@ import type { ConcreteInput, ConcreteResult } from './types.js';
4
4
  *
5
5
  * @param input - Concrete grade and volume
6
6
  * @returns Material quantities in kg (cement, sand, gravel) and liters (water)
7
+ * @throws {RangeError} unknown grade, or volume ≤ 0
7
8
  */
8
9
  export declare function concreteMix(input: ConcreteInput): ConcreteResult;
9
10
  //# sourceMappingURL=concreteMix.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"concreteMix.d.ts","sourceRoot":"","sources":["../../src/construction/concreteMix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwB/E;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAgBhE"}
1
+ {"version":3,"file":"concreteMix.d.ts","sourceRoot":"","sources":["../../src/construction/concreteMix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwB/E;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAsBhE"}
@@ -12,10 +12,17 @@ const MIX_DESIGNS = {
12
12
  *
13
13
  * @param input - Concrete grade and volume
14
14
  * @returns Material quantities in kg (cement, sand, gravel) and liters (water)
15
+ * @throws {RangeError} unknown grade, or volume ≤ 0
15
16
  */
16
17
  export function concreteMix(input) {
17
18
  const { grade, volume } = input;
18
19
  const design = MIX_DESIGNS[grade];
20
+ if (design === undefined) {
21
+ throw new RangeError(`unknown concrete grade: ${String(grade)}`);
22
+ }
23
+ if (volume <= 0) {
24
+ throw new RangeError('volume must be greater than 0');
25
+ }
19
26
  const cement = roundTo(design.cementPerM3 * volume, 2);
20
27
  const sand = roundTo(cement * design.sandRatio, 2);
21
28
  const gravel = roundTo(cement * design.gravelRatio, 2);
@@ -1 +1 @@
1
- {"version":3,"file":"concreteMix.js","sourceRoot":"","sources":["../../src/construction/concreteMix.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AActC,MAAM,WAAW,GAAqC;IACpD,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IACjG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE;IACrG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IACjG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IACjG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE;IACrG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE;CACtG,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAoB;IAC9C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAElC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAElD,OAAO;QACL,MAAM;QACN,IAAI;QACJ,MAAM;QACN,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,WAAW;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"concreteMix.js","sourceRoot":"","sources":["../../src/construction/concreteMix.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AActC,MAAM,WAAW,GAAqC;IACpD,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IACjG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE;IACrG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IACjG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IACjG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE;IACrG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE;CACtG,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAoB;IAC9C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,UAAU,CAAC,2BAA2B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAElD,OAAO;QACL,MAAM;QACN,IAAI;QACJ,MAAM;QACN,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,WAAW;KAC1B,CAAC;AACJ,CAAC"}
@@ -11,6 +11,7 @@ export declare function getRebarUnitWeight(size: RebarSize): number;
11
11
  *
12
12
  * @param input - Rebar size, length, and quantity
13
13
  * @returns Rebar weight calculation results
14
+ * @throws {RangeError} size is not a known rebar designation (D10–D32)
14
15
  */
15
16
  export declare function rebarWeight(input: RebarInput): RebarResult;
16
17
  //# sourceMappingURL=rebar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rebar.d.ts","sourceRoot":"","sources":["../../src/construction/rebar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAmBrE;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAY1D"}
1
+ {"version":3,"file":"rebar.d.ts","sourceRoot":"","sources":["../../src/construction/rebar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAmBrE;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAe1D"}
@@ -28,10 +28,14 @@ export function getRebarUnitWeight(size) {
28
28
  *
29
29
  * @param input - Rebar size, length, and quantity
30
30
  * @returns Rebar weight calculation results
31
+ * @throws {RangeError} size is not a known rebar designation (D10–D32)
31
32
  */
32
33
  export function rebarWeight(input) {
33
34
  const { size, length, quantity } = input;
34
35
  const unitWeight = REBAR_UNIT_WEIGHTS[size];
36
+ if (unitWeight === undefined) {
37
+ throw new RangeError(`unknown rebar size: ${String(size)}`);
38
+ }
35
39
  const totalLength = roundTo(length * quantity, 2);
36
40
  const totalWeight = roundTo(unitWeight * totalLength, 2);
37
41
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"rebar.js","sourceRoot":"","sources":["../../src/construction/rebar.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;;;GAIG;AACH,MAAM,kBAAkB,GAA8B;IACpD,GAAG,EAAE,KAAK,EAAG,wBAAwB;IACrC,GAAG,EAAE,IAAI,EAAI,uBAAuB;IACpC,GAAG,EAAE,IAAI,EAAI,uCAAuC;IACpD,GAAG,EAAE,IAAI,EAAI,uBAAuB;IACpC,GAAG,EAAE,IAAI,EAAI,uBAAuB;IACpC,GAAG,EAAE,IAAI,EAAI,uCAAuC;IACpD,GAAG,EAAE,IAAI,EAAI,uBAAuB;IACpC,GAAG,EAAE,IAAI,EAAI,uBAAuB;CACrC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAe;IAChD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEzC,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC;IAEzD,OAAO;QACL,UAAU;QACV,WAAW;QACX,WAAW;KACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"rebar.js","sourceRoot":"","sources":["../../src/construction/rebar.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;;;GAIG;AACH,MAAM,kBAAkB,GAA8B;IACpD,GAAG,EAAE,KAAK,EAAG,wBAAwB;IACrC,GAAG,EAAE,IAAI,EAAI,uBAAuB;IACpC,GAAG,EAAE,IAAI,EAAI,uCAAuC;IACpD,GAAG,EAAE,IAAI,EAAI,uBAAuB;IACpC,GAAG,EAAE,IAAI,EAAI,uBAAuB;IACpC,GAAG,EAAE,IAAI,EAAI,uCAAuC;IACpD,GAAG,EAAE,IAAI,EAAI,uBAAuB;IACpC,GAAG,EAAE,IAAI,EAAI,uBAAuB;CACrC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAe;IAChD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEzC,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC;IAEzD,OAAO;QACL,UAAU;QACV,WAAW;QACX,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -12,6 +12,8 @@ import type { StairInput, StairResult } from './types.js';
12
12
  *
13
13
  * @param input - Stair input parameters
14
14
  * @returns Stair calculation results
15
+ * @throws {RangeError} totalRise ≤ 0, totalRun < 0, or riserHeight < 0 (riserHeight 0
16
+ * means "auto-calculate", the established contract)
15
17
  */
16
18
  export declare function stair(input: StairInput): StairResult;
17
19
  //# sourceMappingURL=stair.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stair.d.ts","sourceRoot":"","sources":["../../src/construction/stair.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ1D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAqDpD"}
1
+ {"version":3,"file":"stair.d.ts","sourceRoot":"","sources":["../../src/construction/stair.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ1D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAiEpD"}
@@ -16,14 +16,27 @@ const DEFAULT_RISER = 170; // Target riser height for auto-calculation
16
16
  *
17
17
  * @param input - Stair input parameters
18
18
  * @returns Stair calculation results
19
+ * @throws {RangeError} totalRise ≤ 0, totalRun < 0, or riserHeight < 0 (riserHeight 0
20
+ * means "auto-calculate", the established contract)
19
21
  */
20
22
  export function stair(input) {
21
23
  const { totalRise, totalRun, riserHeight } = input;
24
+ if (totalRise <= 0) {
25
+ throw new RangeError('totalRise must be greater than 0');
26
+ }
27
+ if (totalRun < 0) {
28
+ throw new RangeError('totalRun must not be negative');
29
+ }
30
+ if (riserHeight !== undefined && riserHeight < 0) {
31
+ // riserHeight 0 is the established "auto-calculate" sentinel; negative is invalid
32
+ throw new RangeError('riserHeight must not be negative');
33
+ }
22
34
  let numberOfRisers;
23
35
  let actualRiserHeight;
24
36
  if (riserHeight && riserHeight > 0) {
25
- // Use specified riser height
26
- numberOfRisers = Math.round(totalRise / riserHeight);
37
+ // Use specified riser height; at least one riser even when riserHeight > 2×totalRise
38
+ // (rounding to 0 would divide by zero)
39
+ numberOfRisers = Math.max(1, Math.round(totalRise / riserHeight));
27
40
  actualRiserHeight = totalRise / numberOfRisers;
28
41
  }
29
42
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"stair.js","sourceRoot":"","sources":["../../src/construction/stair.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,oDAAoD;AACpD,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,2CAA2C;AAEtE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,KAAK,CAAC,KAAiB;IACrC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAEnD,IAAI,cAAsB,CAAC;IAC3B,IAAI,iBAAyB,CAAC;IAE9B,IAAI,WAAW,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACnC,6BAA6B;QAC7B,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;QACrD,iBAAiB,GAAG,SAAS,GAAG,cAAc,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,kEAAkE;QAClE,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAC;QACvD,IAAI,cAAc,GAAG,CAAC;YAAE,cAAc,GAAG,CAAC,CAAC;QAC3C,iBAAiB,GAAG,SAAS,GAAG,cAAc,CAAC;QAE/C,sCAAsC;QACtC,IAAI,iBAAiB,GAAG,SAAS,EAAE,CAAC;YAClC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;YAClD,iBAAiB,GAAG,SAAS,GAAG,cAAc,CAAC;QACjD,CAAC;aAAM,IAAI,iBAAiB,GAAG,SAAS,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YAC/D,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;YACnD,IAAI,cAAc,GAAG,CAAC;gBAAE,cAAc,GAAG,CAAC,CAAC;YAC3C,iBAAiB,GAAG,SAAS,GAAG,cAAc,CAAC;QACjD,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,MAAM,cAAc,GAAG,cAAc,GAAG,CAAC,CAAC;IAE1C,6CAA6C;IAC7C,MAAM,UAAU,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtE,iDAAiD;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;IAE9E,sEAAsE;IACtE,MAAM,SAAS,GAAG,CAAC,GAAG,iBAAiB,GAAG,UAAU,CAAC;IACrD,MAAM,aAAa,GAAG,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;IAE3D,wBAAwB;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAErE,OAAO;QACL,cAAc;QACd,cAAc;QACd,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChD,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1C,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,aAAa;QACb,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;KACnC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"stair.js","sourceRoot":"","sources":["../../src/construction/stair.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ import type { ResistorBands, ResistorResult } from './types.js';
3
3
  * Decode resistor color bands to get resistance value
4
4
  * @param input - Resistor band information (count and colors)
5
5
  * @returns Decoded resistance, tolerance, and formatted string
6
+ * @throws {RangeError} bandCount not 4/5/6, missing bands, gold/silver used as a digit,
7
+ * or an unknown color in a digit/multiplier/tolerance/tempCoeff position
6
8
  */
7
9
  export declare function resistorDecode(input: ResistorBands): ResistorResult;
8
10
  //# sourceMappingURL=resistor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resistor.d.ts","sourceRoot":"","sources":["../../src/electronics/resistor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAa,MAAM,YAAY,CAAC;AAoG3E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CA4CnE"}
1
+ {"version":3,"file":"resistor.d.ts","sourceRoot":"","sources":["../../src/electronics/resistor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAa,MAAM,YAAY,CAAC;AA6H3E;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAsDnE"}
@@ -89,41 +89,74 @@ function formatResistance(resistance, tolerance, tempCoeff) {
89
89
  }
90
90
  return formatted;
91
91
  }
92
+ /** Digit bands must be black–white (0–9); gold/silver are multiplier/tolerance-only. */
93
+ function digitValue(color, position) {
94
+ const value = COLOR_VALUES[color];
95
+ if (value === undefined || value < 0) {
96
+ throw new RangeError(`invalid digit band color at position ${position}: ${String(color)}`);
97
+ }
98
+ return value;
99
+ }
100
+ function multiplierValue(color) {
101
+ const value = MULTIPLIERS[color];
102
+ if (value === undefined) {
103
+ throw new RangeError(`invalid multiplier band color: ${String(color)}`);
104
+ }
105
+ return value;
106
+ }
107
+ function toleranceValue(color) {
108
+ const value = TOLERANCES[color];
109
+ if (value === undefined) {
110
+ throw new RangeError(`invalid tolerance band color: ${String(color)}`);
111
+ }
112
+ return value;
113
+ }
92
114
  /**
93
115
  * Decode resistor color bands to get resistance value
94
116
  * @param input - Resistor band information (count and colors)
95
117
  * @returns Decoded resistance, tolerance, and formatted string
118
+ * @throws {RangeError} bandCount not 4/5/6, missing bands, gold/silver used as a digit,
119
+ * or an unknown color in a digit/multiplier/tolerance/tempCoeff position
96
120
  */
97
121
  export function resistorDecode(input) {
98
122
  const { bandCount, bands } = input;
123
+ if (bandCount !== 4 && bandCount !== 5 && bandCount !== 6) {
124
+ throw new RangeError(`bandCount must be 4, 5, or 6 (got ${String(bandCount)})`);
125
+ }
126
+ if (!bands || bands.length < bandCount) {
127
+ throw new RangeError(`expected ${bandCount} band colors, got ${bands ? bands.length : 0}`);
128
+ }
99
129
  let resistance;
100
130
  let tolerance;
101
131
  let tempCoeff;
102
132
  if (bandCount === 4) {
103
133
  // 4-band: digit1, digit2, multiplier, tolerance
104
- const digit1 = COLOR_VALUES[bands[0]];
105
- const digit2 = COLOR_VALUES[bands[1]];
106
- const multiplier = MULTIPLIERS[bands[2]];
107
- tolerance = TOLERANCES[bands[3]] ?? 20;
134
+ const digit1 = digitValue(bands[0], 1);
135
+ const digit2 = digitValue(bands[1], 2);
136
+ const multiplier = multiplierValue(bands[2]);
137
+ tolerance = toleranceValue(bands[3]);
108
138
  resistance = (digit1 * 10 + digit2) * multiplier;
109
139
  }
110
140
  else if (bandCount === 5) {
111
141
  // 5-band: digit1, digit2, digit3, multiplier, tolerance
112
- const digit1 = COLOR_VALUES[bands[0]];
113
- const digit2 = COLOR_VALUES[bands[1]];
114
- const digit3 = COLOR_VALUES[bands[2]];
115
- const multiplier = MULTIPLIERS[bands[3]];
116
- tolerance = TOLERANCES[bands[4]] ?? 20;
142
+ const digit1 = digitValue(bands[0], 1);
143
+ const digit2 = digitValue(bands[1], 2);
144
+ const digit3 = digitValue(bands[2], 3);
145
+ const multiplier = multiplierValue(bands[3]);
146
+ tolerance = toleranceValue(bands[4]);
117
147
  resistance = (digit1 * 100 + digit2 * 10 + digit3) * multiplier;
118
148
  }
119
149
  else {
120
150
  // 6-band: digit1, digit2, digit3, multiplier, tolerance, tempCoeff
121
- const digit1 = COLOR_VALUES[bands[0]];
122
- const digit2 = COLOR_VALUES[bands[1]];
123
- const digit3 = COLOR_VALUES[bands[2]];
124
- const multiplier = MULTIPLIERS[bands[3]];
125
- tolerance = TOLERANCES[bands[4]] ?? 20;
151
+ const digit1 = digitValue(bands[0], 1);
152
+ const digit2 = digitValue(bands[1], 2);
153
+ const digit3 = digitValue(bands[2], 3);
154
+ const multiplier = multiplierValue(bands[3]);
155
+ tolerance = toleranceValue(bands[4]);
126
156
  tempCoeff = TEMP_COEFFICIENTS[bands[5]];
157
+ if (tempCoeff === undefined) {
158
+ throw new RangeError(`invalid tempCoeff band color: ${String(bands[5])}`);
159
+ }
127
160
  resistance = (digit1 * 100 + digit2 * 10 + digit3) * multiplier;
128
161
  }
129
162
  const formatted = formatResistance(resistance, tolerance, tempCoeff);