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.
- package/CHANGELOG.md +109 -0
- package/README.md +7 -7
- package/dist/chemical/reliefValve.d.ts +8 -0
- package/dist/chemical/reliefValve.d.ts.map +1 -1
- package/dist/chemical/reliefValve.js +18 -1
- package/dist/chemical/reliefValve.js.map +1 -1
- package/dist/chemical/types.d.ts +2 -0
- package/dist/chemical/types.d.ts.map +1 -1
- package/dist/construction/brick.d.ts +1 -0
- package/dist/construction/brick.d.ts.map +1 -1
- package/dist/construction/brick.js +13 -0
- package/dist/construction/brick.js.map +1 -1
- package/dist/construction/concreteMix.d.ts +1 -0
- package/dist/construction/concreteMix.d.ts.map +1 -1
- package/dist/construction/concreteMix.js +7 -0
- package/dist/construction/concreteMix.js.map +1 -1
- package/dist/construction/rebar.d.ts +1 -0
- package/dist/construction/rebar.d.ts.map +1 -1
- package/dist/construction/rebar.js +4 -0
- package/dist/construction/rebar.js.map +1 -1
- package/dist/construction/stair.d.ts +2 -0
- package/dist/construction/stair.d.ts.map +1 -1
- package/dist/construction/stair.js +15 -2
- package/dist/construction/stair.js.map +1 -1
- package/dist/electronics/resistor.d.ts +2 -0
- package/dist/electronics/resistor.d.ts.map +1 -1
- package/dist/electronics/resistor.js +47 -14
- package/dist/electronics/resistor.js.map +1 -1
- package/dist/electronics/trace.d.ts +1 -0
- package/dist/electronics/trace.d.ts.map +1 -1
- package/dist/electronics/trace.js +10 -0
- package/dist/electronics/trace.js.map +1 -1
- package/dist/energy/solarOutput.d.ts +18 -8
- package/dist/energy/solarOutput.d.ts.map +1 -1
- package/dist/energy/solarOutput.js +92 -22
- package/dist/energy/solarOutput.js.map +1 -1
- package/dist/energy/types.d.ts.map +1 -1
- package/dist/environmental/energyIntensity.d.ts +1 -0
- package/dist/environmental/energyIntensity.d.ts.map +1 -1
- package/dist/environmental/energyIntensity.js +7 -0
- package/dist/environmental/energyIntensity.js.map +1 -1
- package/dist/environmental/productCarbonFootprint.d.ts +5 -1
- package/dist/environmental/productCarbonFootprint.d.ts.map +1 -1
- package/dist/environmental/productCarbonFootprint.js +14 -2
- package/dist/environmental/productCarbonFootprint.js.map +1 -1
- package/dist/environmental/vocEmissions.d.ts +3 -1
- package/dist/environmental/vocEmissions.d.ts.map +1 -1
- package/dist/environmental/vocEmissions.js +16 -2
- package/dist/environmental/vocEmissions.js.map +1 -1
- package/dist/environmental/waterFootprint.d.ts +3 -1
- package/dist/environmental/waterFootprint.d.ts.map +1 -1
- package/dist/environmental/waterFootprint.js +11 -4
- package/dist/environmental/waterFootprint.js.map +1 -1
- package/dist/math.d.ts +0 -4
- package/dist/math.d.ts.map +1 -1
- package/dist/math.js +0 -6
- package/dist/math.js.map +1 -1
- package/dist/metal/hardness.d.ts +5 -0
- package/dist/metal/hardness.d.ts.map +1 -1
- package/dist/metal/hardness.js +13 -3
- package/dist/metal/hardness.js.map +1 -1
- package/dist/metal/roughness.d.ts +7 -0
- package/dist/metal/roughness.d.ts.map +1 -1
- package/dist/metal/roughness.js +15 -1
- package/dist/metal/roughness.js.map +1 -1
- package/dist/metal/types.d.ts +5 -1
- package/dist/metal/types.d.ts.map +1 -1
- package/dist/metal/weldHeat.d.ts +5 -0
- package/dist/metal/weldHeat.d.ts.map +1 -1
- package/dist/metal/weldHeat.js +27 -7
- package/dist/metal/weldHeat.js.map +1 -1
- package/dist/quality/aql.d.ts +9 -0
- package/dist/quality/aql.d.ts.map +1 -1
- package/dist/quality/aql.js +40 -21
- package/dist/quality/aql.js.map +1 -1
- package/dist/quality/ppm.d.ts +4 -0
- package/dist/quality/ppm.d.ts.map +1 -1
- package/dist/quality/ppm.js +17 -4
- package/dist/quality/ppm.js.map +1 -1
- package/dist/quality/types.d.ts +15 -1
- package/dist/quality/types.d.ts.map +1 -1
- 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
|
-
- **
|
|
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,
|
|
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 |
|
|
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 |
|
|
31
|
-
| Electronics |
|
|
32
|
-
| Construction |
|
|
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 |
|
|
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
|
|
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":"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
|
|
1
|
+
{"version":3,"file":"reliefValve.js","sourceRoot":"","sources":["../../src/chemical/reliefValve.ts"],"names":[],"mappings":"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"}
|
package/dist/chemical/types.d.ts
CHANGED
|
@@ -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":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzD,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEjG,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,WAAW,CAAC;AAEvD,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;CAC5D;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,CACrC;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CACzB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAEzE,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAChH;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACjG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,iBAAiB,GAAG,QAAQ,CAAC;AAE5I,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,SAAS,GAAG,cAAc,GAAG,WAAW,CAAC;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC;AAE9F,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAG3B,kBAAkB,EAAE,MAAM,CAAC;CAI5B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,sBAAsB,GAAG,0BAA0B,GAAG,YAAY,CAAC;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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;
|
|
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 =
|
|
105
|
-
const digit2 =
|
|
106
|
-
const multiplier =
|
|
107
|
-
tolerance =
|
|
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 =
|
|
113
|
-
const digit2 =
|
|
114
|
-
const digit3 =
|
|
115
|
-
const multiplier =
|
|
116
|
-
tolerance =
|
|
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 =
|
|
122
|
-
const digit2 =
|
|
123
|
-
const digit3 =
|
|
124
|
-
const multiplier =
|
|
125
|
-
tolerance =
|
|
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);
|