formulab 0.13.3 → 0.13.5
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 +26 -0
- package/dist/automotive/batteryRuntime.d.ts +1 -0
- package/dist/automotive/batteryRuntime.d.ts.map +1 -1
- package/dist/automotive/batteryRuntime.js +6 -9
- package/dist/automotive/batteryRuntime.js.map +1 -1
- package/dist/automotive/evCharging.d.ts +2 -0
- package/dist/automotive/evCharging.d.ts.map +1 -1
- package/dist/automotive/evCharging.js +4 -17
- package/dist/automotive/evCharging.js.map +1 -1
- package/dist/automotive/fuelEconomy.d.ts +1 -0
- package/dist/automotive/fuelEconomy.d.ts.map +1 -1
- package/dist/automotive/fuelEconomy.js +3 -8
- package/dist/automotive/fuelEconomy.js.map +1 -1
- package/dist/automotive/gearRatio.d.ts +1 -0
- package/dist/automotive/gearRatio.d.ts.map +1 -1
- package/dist/automotive/gearRatio.js +3 -9
- package/dist/automotive/gearRatio.js.map +1 -1
- package/dist/construction/earthwork.d.ts +2 -0
- package/dist/construction/earthwork.d.ts.map +1 -1
- package/dist/construction/earthwork.js +17 -0
- package/dist/construction/earthwork.js.map +1 -1
- package/dist/construction/formwork.d.ts +3 -0
- package/dist/construction/formwork.d.ts.map +1 -1
- package/dist/construction/formwork.js +35 -0
- package/dist/construction/formwork.js.map +1 -1
- package/dist/construction/pert.d.ts +3 -2
- package/dist/construction/pert.d.ts.map +1 -1
- package/dist/construction/pert.js +11 -7
- package/dist/construction/pert.js.map +1 -1
- package/dist/electronics/via.d.ts +4 -2
- package/dist/electronics/via.d.ts.map +1 -1
- package/dist/electronics/via.js +14 -3
- package/dist/electronics/via.js.map +1 -1
- package/dist/energy/degreeDay.d.ts +1 -0
- package/dist/energy/degreeDay.d.ts.map +1 -1
- package/dist/energy/degreeDay.js +2 -1
- package/dist/energy/degreeDay.js.map +1 -1
- package/dist/energy/insulationRoi.d.ts +2 -0
- package/dist/energy/insulationRoi.d.ts.map +1 -1
- package/dist/energy/insulationRoi.js +13 -10
- package/dist/energy/insulationRoi.js.map +1 -1
- package/dist/food/calorie.d.ts +1 -0
- package/dist/food/calorie.d.ts.map +1 -1
- package/dist/food/calorie.js +9 -2
- package/dist/food/calorie.js.map +1 -1
- package/dist/logistics/shipping.d.ts +4 -2
- package/dist/logistics/shipping.d.ts.map +1 -1
- package/dist/logistics/shipping.js +13 -6
- package/dist/logistics/shipping.js.map +1 -1
- package/dist/logistics/tsp.d.ts +2 -1
- package/dist/logistics/tsp.d.ts.map +1 -1
- package/dist/logistics/tsp.js +2 -1
- package/dist/logistics/tsp.js.map +1 -1
- package/dist/metal/bearing.d.ts +2 -0
- package/dist/metal/bearing.d.ts.map +1 -1
- package/dist/metal/bearing.js +10 -2
- package/dist/metal/bearing.js.map +1 -1
- package/dist/metal/cutting.d.ts +2 -0
- package/dist/metal/cutting.d.ts.map +1 -1
- package/dist/metal/cutting.js +3 -1
- package/dist/metal/cutting.js.map +1 -1
- package/dist/metal/cuttingStock.d.ts +4 -1
- package/dist/metal/cuttingStock.d.ts.map +1 -1
- package/dist/metal/cuttingStock.js +15 -6
- package/dist/metal/cuttingStock.js.map +1 -1
- package/dist/metal/material.d.ts +6 -1
- package/dist/metal/material.d.ts.map +1 -1
- package/dist/metal/material.js +11 -4
- package/dist/metal/material.js.map +1 -1
- package/dist/metal/pressTonnage.d.ts +1 -0
- package/dist/metal/pressTonnage.d.ts.map +1 -1
- package/dist/metal/pressTonnage.js +3 -13
- package/dist/metal/pressTonnage.js.map +1 -1
- package/dist/metal/roughness.d.ts +2 -0
- package/dist/metal/roughness.d.ts.map +1 -1
- package/dist/metal/roughness.js +4 -2
- package/dist/metal/roughness.js.map +1 -1
- package/dist/metal/screw.d.ts +3 -1
- package/dist/metal/screw.d.ts.map +1 -1
- package/dist/metal/screw.js +5 -2
- package/dist/metal/screw.js.map +1 -1
- package/dist/metal/thread.d.ts +3 -1
- package/dist/metal/thread.d.ts.map +1 -1
- package/dist/metal/thread.js +8 -4
- package/dist/metal/thread.js.map +1 -1
- package/dist/metal/tolerance.d.ts +4 -1
- package/dist/metal/tolerance.d.ts.map +1 -1
- package/dist/metal/tolerance.js +12 -6
- package/dist/metal/tolerance.js.map +1 -1
- package/dist/metal/vibration.d.ts +3 -0
- package/dist/metal/vibration.d.ts.map +1 -1
- package/dist/metal/vibration.js +28 -10
- package/dist/metal/vibration.js.map +1 -1
- package/dist/metal/weldHeat.d.ts +2 -0
- package/dist/metal/weldHeat.d.ts.map +1 -1
- package/dist/metal/weldHeat.js +13 -15
- package/dist/metal/weldHeat.js.map +1 -1
- package/dist/quality/dpmo.d.ts +1 -0
- package/dist/quality/dpmo.d.ts.map +1 -1
- package/dist/quality/dpmo.js +7 -3
- package/dist/quality/dpmo.js.map +1 -1
- package/dist/quality/lineBalancing.d.ts +4 -2
- package/dist/quality/lineBalancing.d.ts.map +1 -1
- package/dist/quality/lineBalancing.js +18 -9
- package/dist/quality/lineBalancing.js.map +1 -1
- package/dist/quality/mtbf.d.ts +2 -0
- package/dist/quality/mtbf.d.ts.map +1 -1
- package/dist/quality/mtbf.js +8 -9
- package/dist/quality/mtbf.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,32 @@ 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.13.5] - 2026-06-18
|
|
9
|
+
|
|
10
|
+
### Changed (breaking within 0.x)
|
|
11
|
+
|
|
12
|
+
- **Invalid-input `return null` / zero-fill results migrated to the standard error policy across 8 domains** — a systematic sweep (reported by online-tools: ISSUE-20260612-formulab-null-returns-full-audit) found ~25 public functions that returned `null` or an all-zero/sentinel result object on invalid input instead of throwing, contradicting `ERRORS.md`. `ERRORS.md` itself was found to be aspirational for several of these (it claimed `throw` where the code 0-filled) and has been corrected to match the code. All of the following now **throw `RangeError`** with a per-constraint message:
|
|
13
|
+
- **automotive**: `fuelEconomy()` (value ≤ 0), `evCharging()` (socEndPercent ≤ socStartPercent, chargerPowerKw ≤ 0), `batteryRuntime()` (voltageV ≤ 0, loadW ≤ 0), `gearRatio()` (drivingTeeth ≤ 0).
|
|
14
|
+
- **energy**: `insulationRoi()` (surfaceArea/tempDifference/insulationK/insulationThickness ≤ 0), `degreeDay()` (empty `dailyTemps`).
|
|
15
|
+
- **food**: `calorie()` (weightKg/heightCm/age ≤ 0).
|
|
16
|
+
- **metal**: `cutting()` (toolDiameter ≤ 0), `bearing()` (dynamicLoadRating/equivalentLoad/rpm ≤ 0), `roughness()` (value ≤ 0), `weldHeat()` (voltage/current/travelSpeed/thickness ≤ 0), `vibration()` (non-positive system/geometry field; innerDiameter ≥ outerDiameter), `pressTonnage()` (combined operation without `operations`). **Return type changes** (`... | null` → non-nullable): `cuttingStock()` (empty pieces, zero total quantity, stockLength ≤ 0, piece > stockLength), `material()` (unknown category/grade), `screw()` (unknown designation), `thread()` (unknown size), `tolerance()` (nominal size out of range, unknown IT grade / deviation letter).
|
|
17
|
+
- **quality**: `mtbf()` (totalOperatingTime ≤ 0, numberOfFailures ≤ 0 — with zero failures MTBF is undefined; the previous `0` wrongly read as "fails constantly"), `dpmo()` (units ≤ 0, opportunities ≤ 0), `lineBalancing()` (empty tasks, cycleTime ≤ 0, a task time > cycleTime, circular dependency; `... | null` → non-nullable).
|
|
18
|
+
- **electronics**: `viaCurrent()` (holeDiameter/platingThickness/viaLength/tempRise ≤ 0; `... | null` → non-nullable).
|
|
19
|
+
- **logistics**: `shipping()` (weight/volume ≤ 0, truck distance ≤ 0, unknown mode; `... | null` → non-nullable), `tsp()` (empty nodes; `... | null` → non-nullable).
|
|
20
|
+
- **construction**: `pert()` (empty tasks, circular dependency; `... | null` → non-nullable).
|
|
21
|
+
- **Lookup-miss policy unified to throw** — unknown designation/grade/size/category (`material`/`screw`/`thread`/`tolerance`) now throw, consistent with the rest of metal (`hardness`/`pipeSpec`/`flangeSpec`). Consumers branch on the boundary, not on `null`.
|
|
22
|
+
- **Intentionally kept** (not invalid input): `npv().irr` non-convergence null; `nelsonRules()` internal rule-helper nulls (never surfaced); `pallet3d()` internal placement-helper null; `cpk()`/`ppk()`/`cmk()` degenerate-spread zero result; `energyDensity()` missing-mass null.
|
|
23
|
+
|
|
24
|
+
## [0.13.4] - 2026-06-18
|
|
25
|
+
|
|
26
|
+
### Changed (breaking within 0.x)
|
|
27
|
+
|
|
28
|
+
- **`earthwork()` / `formwork()` (construction): zero-filled result on invalid input migrated to the standard error policy** — both functions previously returned an all-zero result for non-positive dimensions instead of throwing, and their existing tests encoded that as an "edge case". They now **throw `RangeError`** with a per-constraint message, matching `ERRORS.md` (which already documented them as `throw`) and the beamLoad/compressedAirCost migrations:
|
|
29
|
+
- `earthwork()`: non-positive `length`/`width`/`depth`, or non-positive `swellFactor`/`shrinkFactor` (a zero factor silently produced a zero loose/compacted volume).
|
|
30
|
+
- `formwork()`: non-positive dimension **consumed by the element type's area formula** (column/beam/footing → length, width, height; slab → length, width; wall → length, height) or non-positive `quantity`. Dimensions a given element type ignores (slab height, wall width) are left unvalidated, so a formula-irrelevant zero is still accepted. `reuses ≤ 0 → 1` remains intentional lenient behavior.
|
|
31
|
+
|
|
32
|
+
Reported by online-tools: ISSUE-20260618-formulab-earthwork-formwork-zerofill (NT-9). `ERRORS.md` condition text updated from "Negative dimensions" to the precise non-positive constraints.
|
|
33
|
+
|
|
8
34
|
## [0.13.3] - 2026-06-12
|
|
9
35
|
|
|
10
36
|
### Changed (breaking within 0.x)
|
|
@@ -9,6 +9,7 @@ import type { BatteryInput, BatteryResult } from './types.js';
|
|
|
9
9
|
*
|
|
10
10
|
* @param input - Battery parameters
|
|
11
11
|
* @returns Battery result with energy and runtime
|
|
12
|
+
* @throws RangeError if voltageV is not greater than 0, or if loadW is not greater than 0
|
|
12
13
|
*/
|
|
13
14
|
export declare function batteryRuntime(input: BatteryInput): BatteryResult;
|
|
14
15
|
//# sourceMappingURL=batteryRuntime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batteryRuntime.d.ts","sourceRoot":"","sources":["../../src/automotive/batteryRuntime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D
|
|
1
|
+
{"version":3,"file":"batteryRuntime.d.ts","sourceRoot":"","sources":["../../src/automotive/batteryRuntime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAuBjE"}
|
|
@@ -9,18 +9,15 @@ import { roundTo } from '../utils.js';
|
|
|
9
9
|
*
|
|
10
10
|
* @param input - Battery parameters
|
|
11
11
|
* @returns Battery result with energy and runtime
|
|
12
|
+
* @throws RangeError if voltageV is not greater than 0, or if loadW is not greater than 0
|
|
12
13
|
*/
|
|
13
14
|
export function batteryRuntime(input) {
|
|
14
15
|
const { capacityAh, voltageV, loadW, efficiency } = input;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
runtimeHours: 0,
|
|
21
|
-
runtimeMinutes: 0,
|
|
22
|
-
currentDraw: 0,
|
|
23
|
-
};
|
|
16
|
+
if (voltageV <= 0) {
|
|
17
|
+
throw new RangeError('voltageV must be greater than 0');
|
|
18
|
+
}
|
|
19
|
+
if (loadW <= 0) {
|
|
20
|
+
throw new RangeError('loadW must be greater than 0');
|
|
24
21
|
}
|
|
25
22
|
const energyWh = capacityAh * voltageV;
|
|
26
23
|
const energyKwh = energyWh / 1000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batteryRuntime.js","sourceRoot":"","sources":["../../src/automotive/batteryRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC
|
|
1
|
+
{"version":3,"file":"batteryRuntime.js","sourceRoot":"","sources":["../../src/automotive/batteryRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,KAAmB;IAChD,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAE1D,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvC,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC;IAClC,MAAM,YAAY,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC;IACrD,MAAM,cAAc,GAAG,YAAY,GAAG,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;IAErC,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1C,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;KACrC,CAAC;AACJ,CAAC"}
|
|
@@ -9,6 +9,8 @@ import type { ChargingInput, ChargingResult } from './types.js';
|
|
|
9
9
|
*
|
|
10
10
|
* @param input - Charging parameters
|
|
11
11
|
* @returns Charging result with energy and time
|
|
12
|
+
* @throws RangeError if socEndPercent is not greater than socStartPercent,
|
|
13
|
+
* or if chargerPowerKw is not greater than 0
|
|
12
14
|
*/
|
|
13
15
|
export declare function evCharging(input: ChargingInput): ChargingResult;
|
|
14
16
|
//# sourceMappingURL=evCharging.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evCharging.d.ts","sourceRoot":"","sources":["../../src/automotive/evCharging.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE
|
|
1
|
+
{"version":3,"file":"evCharging.d.ts","sourceRoot":"","sources":["../../src/automotive/evCharging.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAsB/D"}
|
|
@@ -9,29 +9,16 @@ import { roundTo } from '../utils.js';
|
|
|
9
9
|
*
|
|
10
10
|
* @param input - Charging parameters
|
|
11
11
|
* @returns Charging result with energy and time
|
|
12
|
+
* @throws RangeError if socEndPercent is not greater than socStartPercent,
|
|
13
|
+
* or if chargerPowerKw is not greater than 0
|
|
12
14
|
*/
|
|
13
15
|
export function evCharging(input) {
|
|
14
16
|
const { batteryCapacityKwh, chargerPowerKw, socStartPercent, socEndPercent, efficiency } = input;
|
|
15
|
-
// Handle edge cases - no charging needed or invalid
|
|
16
17
|
if (socEndPercent <= socStartPercent) {
|
|
17
|
-
|
|
18
|
-
energyNeeded: 0,
|
|
19
|
-
energyFromGrid: 0,
|
|
20
|
-
chargingTimeHours: 0,
|
|
21
|
-
chargingTimeMinutes: 0,
|
|
22
|
-
};
|
|
18
|
+
throw new RangeError('socEndPercent must be greater than socStartPercent');
|
|
23
19
|
}
|
|
24
|
-
// Handle zero charger power
|
|
25
20
|
if (chargerPowerKw <= 0) {
|
|
26
|
-
|
|
27
|
-
const energyNeeded = batteryCapacityKwh * socDiff;
|
|
28
|
-
const energyFromGrid = energyNeeded / efficiency;
|
|
29
|
-
return {
|
|
30
|
-
energyNeeded: roundTo(energyNeeded, 2),
|
|
31
|
-
energyFromGrid: roundTo(energyFromGrid, 2),
|
|
32
|
-
chargingTimeHours: 0,
|
|
33
|
-
chargingTimeMinutes: 0,
|
|
34
|
-
};
|
|
21
|
+
throw new RangeError('chargerPowerKw must be greater than 0');
|
|
35
22
|
}
|
|
36
23
|
const socDiff = (socEndPercent - socStartPercent) / 100;
|
|
37
24
|
const energyNeeded = batteryCapacityKwh * socDiff;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evCharging.js","sourceRoot":"","sources":["../../src/automotive/evCharging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC
|
|
1
|
+
{"version":3,"file":"evCharging.js","sourceRoot":"","sources":["../../src/automotive/evCharging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,KAAoB;IAC7C,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAEjG,IAAI,aAAa,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,uCAAuC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,aAAa,GAAG,eAAe,CAAC,GAAG,GAAG,CAAC;IACxD,MAAM,YAAY,GAAG,kBAAkB,GAAG,OAAO,CAAC;IAClD,MAAM,cAAc,GAAG,YAAY,GAAG,UAAU,CAAC;IACjD,MAAM,iBAAiB,GAAG,cAAc,GAAG,cAAc,CAAC;IAC1D,MAAM,mBAAmB,GAAG,iBAAiB,GAAG,EAAE,CAAC;IAEnD,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChD,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -10,6 +10,7 @@ import type { FuelInput, FuelResult } from './types.js';
|
|
|
10
10
|
*
|
|
11
11
|
* @param input - Fuel economy input with value and source unit
|
|
12
12
|
* @returns All fuel economy units
|
|
13
|
+
* @throws RangeError if value is not greater than 0
|
|
13
14
|
*/
|
|
14
15
|
export declare function fuelEconomy(input: FuelInput): FuelResult;
|
|
15
16
|
//# sourceMappingURL=fuelEconomy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuelEconomy.d.ts","sourceRoot":"","sources":["../../src/automotive/fuelEconomy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAOxD
|
|
1
|
+
{"version":3,"file":"fuelEconomy.d.ts","sourceRoot":"","sources":["../../src/automotive/fuelEconomy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAOxD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAyCxD"}
|
|
@@ -14,17 +14,12 @@ const LITERS_PER_UK_GALLON = 4.54609;
|
|
|
14
14
|
*
|
|
15
15
|
* @param input - Fuel economy input with value and source unit
|
|
16
16
|
* @returns All fuel economy units
|
|
17
|
+
* @throws RangeError if value is not greater than 0
|
|
17
18
|
*/
|
|
18
19
|
export function fuelEconomy(input) {
|
|
19
20
|
const { fromUnit, value } = input;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return {
|
|
23
|
-
kmPerL: 0,
|
|
24
|
-
lPer100km: 0,
|
|
25
|
-
mpgUS: 0,
|
|
26
|
-
mpgUK: 0,
|
|
27
|
-
};
|
|
21
|
+
if (value <= 0) {
|
|
22
|
+
throw new RangeError('value must be greater than 0');
|
|
28
23
|
}
|
|
29
24
|
let kmPerL;
|
|
30
25
|
// Convert input to km/L as intermediate value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuelEconomy.js","sourceRoot":"","sources":["../../src/automotive/fuelEconomy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,uBAAuB;AACvB,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,oBAAoB,GAAG,OAAO,CAAC;AACrC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAErC
|
|
1
|
+
{"version":3,"file":"fuelEconomy.js","sourceRoot":"","sources":["../../src/automotive/fuelEconomy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,uBAAuB;AACvB,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,oBAAoB,GAAG,OAAO,CAAC;AACrC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAErC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,KAAgB;IAC1C,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAElC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,MAAc,CAAC;IAEnB,8CAA8C;IAC9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,MAAM,GAAG,KAAK,CAAC;YACf,MAAM;QACR,KAAK,WAAW;YACd,wDAAwD;YACxD,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC;YACrB,MAAM;QACR,KAAK,OAAO;YACV,qDAAqD;YACrD,MAAM,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,oBAAoB,CAAC;YACtD,MAAM;QACR,KAAK,OAAO;YACV,qDAAqD;YACrD,MAAM,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,oBAAoB,CAAC;YACtD,MAAM;QACR;YACE,MAAM,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,kCAAkC;IAClC,MAAM,SAAS,GAAG,GAAG,GAAG,MAAM,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,oBAAoB,CAAC,GAAG,WAAW,CAAC;IAC5D,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,oBAAoB,CAAC,GAAG,WAAW,CAAC;IAE5D,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -10,6 +10,7 @@ import type { GearRatioInput, GearRatioResult } from './types.js';
|
|
|
10
10
|
*
|
|
11
11
|
* @param input - Gear parameters
|
|
12
12
|
* @returns Gear result with ratio, speed, and torque
|
|
13
|
+
* @throws RangeError if drivingTeeth is not greater than 0
|
|
13
14
|
*/
|
|
14
15
|
export declare function gearRatio(input: GearRatioInput): GearRatioResult;
|
|
15
16
|
//# sourceMappingURL=gearRatio.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gearRatio.d.ts","sourceRoot":"","sources":["../../src/automotive/gearRatio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"gearRatio.d.ts","sourceRoot":"","sources":["../../src/automotive/gearRatio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAoBhE"}
|
|
@@ -10,18 +10,12 @@ import { roundTo } from '../utils.js';
|
|
|
10
10
|
*
|
|
11
11
|
* @param input - Gear parameters
|
|
12
12
|
* @returns Gear result with ratio, speed, and torque
|
|
13
|
+
* @throws RangeError if drivingTeeth is not greater than 0
|
|
13
14
|
*/
|
|
14
15
|
export function gearRatio(input) {
|
|
15
16
|
const { drivingTeeth, drivenTeeth, inputSpeed, inputTorque, efficiency } = input;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return {
|
|
19
|
-
gearRatio: 0,
|
|
20
|
-
outputSpeed: 0,
|
|
21
|
-
outputTorque: 0,
|
|
22
|
-
speedReduction: false,
|
|
23
|
-
mechanicalAdvantage: 0,
|
|
24
|
-
};
|
|
17
|
+
if (drivingTeeth <= 0) {
|
|
18
|
+
throw new RangeError('drivingTeeth must be greater than 0');
|
|
25
19
|
}
|
|
26
20
|
const ratio = drivenTeeth / drivingTeeth;
|
|
27
21
|
const outputSpeed = inputSpeed / ratio;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gearRatio.js","sourceRoot":"","sources":["../../src/automotive/gearRatio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC
|
|
1
|
+
{"version":3,"file":"gearRatio.js","sourceRoot":"","sources":["../../src/automotive/gearRatio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAEjF,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,GAAG,YAAY,CAAC;IACzC,MAAM,WAAW,GAAG,UAAU,GAAG,KAAK,CAAC;IACvC,MAAM,YAAY,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC;IACtD,MAAM,cAAc,GAAG,KAAK,GAAG,CAAC,CAAC;IACjC,MAAM,mBAAmB,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC;IAE/E,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,cAAc;QACd,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -8,6 +8,8 @@ import type { EarthworkInput, EarthworkResult } from './types.js';
|
|
|
8
8
|
*
|
|
9
9
|
* @param input - Earthwork dimensions and factors
|
|
10
10
|
* @returns Volume calculations in m³
|
|
11
|
+
* @throws RangeError if any dimension (length, width, depth) is not positive,
|
|
12
|
+
* or if swellFactor/shrinkFactor is not positive
|
|
11
13
|
*/
|
|
12
14
|
export declare function earthwork(input: EarthworkInput): EarthworkResult;
|
|
13
15
|
//# sourceMappingURL=earthwork.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"earthwork.d.ts","sourceRoot":"","sources":["../../src/construction/earthwork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"earthwork.d.ts","sourceRoot":"","sources":["../../src/construction/earthwork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAiChE"}
|
|
@@ -7,9 +7,26 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @param input - Earthwork dimensions and factors
|
|
9
9
|
* @returns Volume calculations in m³
|
|
10
|
+
* @throws RangeError if any dimension (length, width, depth) is not positive,
|
|
11
|
+
* or if swellFactor/shrinkFactor is not positive
|
|
10
12
|
*/
|
|
11
13
|
export function earthwork(input) {
|
|
12
14
|
const { length, width, depth, swellFactor, shrinkFactor } = input;
|
|
15
|
+
if (length <= 0) {
|
|
16
|
+
throw new RangeError('length must be greater than 0');
|
|
17
|
+
}
|
|
18
|
+
if (width <= 0) {
|
|
19
|
+
throw new RangeError('width must be greater than 0');
|
|
20
|
+
}
|
|
21
|
+
if (depth <= 0) {
|
|
22
|
+
throw new RangeError('depth must be greater than 0');
|
|
23
|
+
}
|
|
24
|
+
if (swellFactor <= 0) {
|
|
25
|
+
throw new RangeError('swellFactor must be greater than 0');
|
|
26
|
+
}
|
|
27
|
+
if (shrinkFactor <= 0) {
|
|
28
|
+
throw new RangeError('shrinkFactor must be greater than 0');
|
|
29
|
+
}
|
|
13
30
|
// Bank volume = undisturbed volume
|
|
14
31
|
const bankVolume = length * width * depth;
|
|
15
32
|
// Loose volume = bank volume × swell factor
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"earthwork.js","sourceRoot":"","sources":["../../src/construction/earthwork.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"earthwork.js","sourceRoot":"","sources":["../../src/construction/earthwork.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAElE,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,UAAU,CAAC,oCAAoC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;IAC9D,CAAC;IAED,mCAAmC;IACnC,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAE1C,4CAA4C;IAC5C,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;IAE7C,iDAAiD;IACjD,MAAM,eAAe,GAAG,UAAU,GAAG,YAAY,CAAC;IAElD,OAAO;QACL,UAAU;QACV,WAAW;QACX,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -4,6 +4,9 @@ import type { FormworkInput, FormworkResult } from './types.js';
|
|
|
4
4
|
*
|
|
5
5
|
* @param input - Formwork calculation parameters
|
|
6
6
|
* @returns Formwork area results
|
|
7
|
+
* @throws RangeError if a dimension consumed by the element type's area formula
|
|
8
|
+
* is not positive (column/beam/footing: length, width, height; slab: length,
|
|
9
|
+
* width; wall: length, height), or if quantity is not positive
|
|
7
10
|
*/
|
|
8
11
|
export declare function formwork(input: FormworkInput): FormworkResult;
|
|
9
12
|
//# sourceMappingURL=formwork.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formwork.d.ts","sourceRoot":"","sources":["../../src/construction/formwork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"formwork.d.ts","sourceRoot":"","sources":["../../src/construction/formwork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA8E7E;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CA8B7D"}
|
|
@@ -32,14 +32,49 @@ function calculateSingleArea(elementType, length, width, height) {
|
|
|
32
32
|
return 0;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate that the dimensions actually consumed by an element type's area
|
|
37
|
+
* formula are positive. Dimensions not used by a given element type are left
|
|
38
|
+
* unvalidated (e.g. a slab ignores height, a wall ignores width).
|
|
39
|
+
*/
|
|
40
|
+
function validateDimensions(elementType, length, width, height) {
|
|
41
|
+
if (length <= 0) {
|
|
42
|
+
throw new RangeError('length must be greater than 0');
|
|
43
|
+
}
|
|
44
|
+
switch (elementType) {
|
|
45
|
+
case 'column':
|
|
46
|
+
case 'beam':
|
|
47
|
+
case 'footing':
|
|
48
|
+
if (width <= 0)
|
|
49
|
+
throw new RangeError('width must be greater than 0');
|
|
50
|
+
if (height <= 0)
|
|
51
|
+
throw new RangeError('height must be greater than 0');
|
|
52
|
+
break;
|
|
53
|
+
case 'slab':
|
|
54
|
+
if (width <= 0)
|
|
55
|
+
throw new RangeError('width must be greater than 0');
|
|
56
|
+
break;
|
|
57
|
+
case 'wall':
|
|
58
|
+
if (height <= 0)
|
|
59
|
+
throw new RangeError('height must be greater than 0');
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
35
63
|
/**
|
|
36
64
|
* Calculate formwork area requirements
|
|
37
65
|
*
|
|
38
66
|
* @param input - Formwork calculation parameters
|
|
39
67
|
* @returns Formwork area results
|
|
68
|
+
* @throws RangeError if a dimension consumed by the element type's area formula
|
|
69
|
+
* is not positive (column/beam/footing: length, width, height; slab: length,
|
|
70
|
+
* width; wall: length, height), or if quantity is not positive
|
|
40
71
|
*/
|
|
41
72
|
export function formwork(input) {
|
|
42
73
|
const { elementType, length, width, height, quantity, reuses } = input;
|
|
74
|
+
validateDimensions(elementType, length, width, height);
|
|
75
|
+
if (quantity <= 0) {
|
|
76
|
+
throw new RangeError('quantity must be greater than 0');
|
|
77
|
+
}
|
|
43
78
|
// Calculate area for single element
|
|
44
79
|
const singleAreaSqm = calculateSingleArea(elementType, length, width, height);
|
|
45
80
|
// Total area = single area × quantity
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formwork.js","sourceRoot":"","sources":["../../src/construction/formwork.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AACH,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAC1B,WAAwB,EACxB,MAAc,EACd,KAAa,EACb,MAAc;IAEd,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,gCAAgC;YAChC,OAAO,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QAEnD,KAAK,MAAM;YACT,uCAAuC;YACvC,OAAO,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,KAAK,MAAM;YACT,4BAA4B;YAC5B,OAAO,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpC,KAAK,MAAM;YACT,4BAA4B;YAC5B,OAAO,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QAEzC,KAAK,SAAS;YACZ,iCAAiC;YACjC,OAAO,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QAEnD;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"formwork.js","sourceRoot":"","sources":["../../src/construction/formwork.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,8 @@ import type { PertInput, PertResult } from './types.js';
|
|
|
9
9
|
* - Z-score = (deadline - project duration) / √(project variance)
|
|
10
10
|
*
|
|
11
11
|
* @param input - PERT input with tasks and optional deadline
|
|
12
|
-
* @returns PERT analysis result
|
|
12
|
+
* @returns PERT analysis result
|
|
13
|
+
* @throws RangeError if tasks is empty or contains a circular dependency
|
|
13
14
|
*/
|
|
14
|
-
export declare function pert(input: PertInput): PertResult
|
|
15
|
+
export declare function pert(input: PertInput): PertResult;
|
|
15
16
|
//# sourceMappingURL=pert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pert.d.ts","sourceRoot":"","sources":["../../src/construction/pert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAA4B,MAAM,YAAY,CAAC;AAwElF
|
|
1
|
+
{"version":3,"file":"pert.d.ts","sourceRoot":"","sources":["../../src/construction/pert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAA4B,MAAM,YAAY,CAAC;AAwElF;;;;;;;;;;;;GAYG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CA6HjD"}
|
|
@@ -77,19 +77,23 @@ function topologicalSort(tasks) {
|
|
|
77
77
|
* - Z-score = (deadline - project duration) / √(project variance)
|
|
78
78
|
*
|
|
79
79
|
* @param input - PERT input with tasks and optional deadline
|
|
80
|
-
* @returns PERT analysis result
|
|
80
|
+
* @returns PERT analysis result
|
|
81
|
+
* @throws RangeError if tasks is empty or contains a circular dependency
|
|
81
82
|
*/
|
|
82
83
|
export function pert(input) {
|
|
83
84
|
const { tasks, deadline } = input;
|
|
84
|
-
if (tasks.length === 0)
|
|
85
|
-
|
|
85
|
+
if (tasks.length === 0) {
|
|
86
|
+
throw new RangeError('tasks must not be empty');
|
|
87
|
+
}
|
|
86
88
|
// Cycle detection
|
|
87
|
-
if (detectCycle(tasks))
|
|
88
|
-
|
|
89
|
+
if (detectCycle(tasks)) {
|
|
90
|
+
throw new RangeError('tasks contain a circular dependency');
|
|
91
|
+
}
|
|
89
92
|
// Topological sort
|
|
90
93
|
const sorted = topologicalSort(tasks);
|
|
91
|
-
if (!sorted)
|
|
92
|
-
|
|
94
|
+
if (!sorted) {
|
|
95
|
+
throw new RangeError('tasks contain a circular dependency');
|
|
96
|
+
}
|
|
93
97
|
// Calculate expected duration and variance
|
|
94
98
|
const te = new Map();
|
|
95
99
|
const variance = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pert.js","sourceRoot":"","sources":["../../src/construction/pert.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pert.js","sourceRoot":"","sources":["../../src/construction/pert.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,9 @@ import type { ViaInput, ViaResult } from './types.js';
|
|
|
6
6
|
* Where r_outer = holeDiameter/2 + platingThickness and r_inner = holeDiameter/2
|
|
7
7
|
*
|
|
8
8
|
* @param input - Via hole diameter, plating thickness, via length, and temp rise
|
|
9
|
-
* @returns Via current capacity and related properties
|
|
9
|
+
* @returns Via current capacity and related properties
|
|
10
|
+
* @throws RangeError if holeDiameter, platingThickness, viaLength, or tempRise
|
|
11
|
+
* is not positive
|
|
10
12
|
*/
|
|
11
|
-
export declare function viaCurrent(input: ViaInput): ViaResult
|
|
13
|
+
export declare function viaCurrent(input: ViaInput): ViaResult;
|
|
12
14
|
//# sourceMappingURL=via.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"via.d.ts","sourceRoot":"","sources":["../../src/electronics/via.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiBtD
|
|
1
|
+
{"version":3,"file":"via.d.ts","sourceRoot":"","sources":["../../src/electronics/via.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiBtD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAwDrD"}
|
package/dist/electronics/via.js
CHANGED
|
@@ -17,13 +17,24 @@ const IPC_C = 0.725;
|
|
|
17
17
|
* Where r_outer = holeDiameter/2 + platingThickness and r_inner = holeDiameter/2
|
|
18
18
|
*
|
|
19
19
|
* @param input - Via hole diameter, plating thickness, via length, and temp rise
|
|
20
|
-
* @returns Via current capacity and related properties
|
|
20
|
+
* @returns Via current capacity and related properties
|
|
21
|
+
* @throws RangeError if holeDiameter, platingThickness, viaLength, or tempRise
|
|
22
|
+
* is not positive
|
|
21
23
|
*/
|
|
22
24
|
export function viaCurrent(input) {
|
|
23
25
|
const { holeDiameter, platingThickness, viaLength, tempRise } = input;
|
|
24
26
|
// Validate inputs
|
|
25
|
-
if (holeDiameter <= 0
|
|
26
|
-
|
|
27
|
+
if (holeDiameter <= 0) {
|
|
28
|
+
throw new RangeError('holeDiameter must be greater than 0');
|
|
29
|
+
}
|
|
30
|
+
if (platingThickness <= 0) {
|
|
31
|
+
throw new RangeError('platingThickness must be greater than 0');
|
|
32
|
+
}
|
|
33
|
+
if (viaLength <= 0) {
|
|
34
|
+
throw new RangeError('viaLength must be greater than 0');
|
|
35
|
+
}
|
|
36
|
+
if (tempRise <= 0) {
|
|
37
|
+
throw new RangeError('tempRise must be greater than 0');
|
|
27
38
|
}
|
|
28
39
|
// Convert plating thickness from μm to mm
|
|
29
40
|
const platingMm = platingThickness / 1000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"via.js","sourceRoot":"","sources":["../../src/electronics/via.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH,wCAAwC;AACxC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,0CAA0C;AAC1C,qBAAqB;AACrB,2EAA2E;AAC3E,MAAM,KAAK,GAAG,KAAK,CAAC;AACpB,MAAM,KAAK,GAAG,IAAI,CAAC;AACnB,MAAM,KAAK,GAAG,KAAK,CAAC;AAEpB
|
|
1
|
+
{"version":3,"file":"via.js","sourceRoot":"","sources":["../../src/electronics/via.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH,wCAAwC;AACxC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,0CAA0C;AAC1C,qBAAqB;AACrB,2EAA2E;AAC3E,MAAM,KAAK,GAAG,KAAK,CAAC;AACpB,MAAM,KAAK,GAAG,IAAI,CAAC;AACnB,MAAM,KAAK,GAAG,KAAK,CAAC;AAEpB;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,KAAe;IACxC,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEtE,kBAAkB;IAClB,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,yCAAyC,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IAC1D,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAE1C,kCAAkC;IAClC,MAAM,WAAW,GAAG,YAAY,GAAG,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;IAE5C,gDAAgD;IAChD,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;IAE1F,0DAA0D;IAC1D,MAAM,iBAAiB,GAAG,eAAe,GAAG,KAAK,GAAG,KAAK,CAAC;IAE1D,sEAAsE;IACtE,qBAAqB;IACrB,MAAM,eAAe,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAE/F,qBAAqB;IACrB,0DAA0D;IAC1D,MAAM,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC;IACpC,MAAM,UAAU,GAAG,CAAC,kBAAkB,GAAG,UAAU,CAAC,GAAG,eAAe,CAAC;IACvE,MAAM,cAAc,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAE1D,gDAAgD;IAChD,2EAA2E;IAC3E,4CAA4C;IAC5C,MAAM,2BAA2B,GAAG,GAAG,CAAC;IACxC,MAAM,iBAAiB,GAAG,UAAU,GAAG,CAAC,2BAA2B,GAAG,eAAe,GAAG,OAAO,CAAC,CAAC;IAEjG,4CAA4C;IAC5C,MAAM,gBAAgB,GAAG,eAAe,GAAG,eAAe,GAAG,UAAU,GAAG,IAAI,CAAC;IAE/E,OAAO;QACL,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5C,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChD,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -8,6 +8,7 @@ import type { DegreeDayInput, DegreeDayResult } from './types.js';
|
|
|
8
8
|
*
|
|
9
9
|
* @reference ASHRAE Fundamentals Handbook — Degree Day Method
|
|
10
10
|
* @reference ISO 50001:2018 — Energy management systems
|
|
11
|
+
* @throws RangeError if dailyTemps is empty
|
|
11
12
|
*/
|
|
12
13
|
export declare function degreeDay(input: DegreeDayInput): DegreeDayResult;
|
|
13
14
|
//# sourceMappingURL=degreeDay.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"degreeDay.d.ts","sourceRoot":"","sources":["../../src/energy/degreeDay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"degreeDay.d.ts","sourceRoot":"","sources":["../../src/energy/degreeDay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAoChE"}
|
package/dist/energy/degreeDay.js
CHANGED
|
@@ -8,12 +8,13 @@ import { roundTo } from '../utils.js';
|
|
|
8
8
|
*
|
|
9
9
|
* @reference ASHRAE Fundamentals Handbook — Degree Day Method
|
|
10
10
|
* @reference ISO 50001:2018 — Energy management systems
|
|
11
|
+
* @throws RangeError if dailyTemps is empty
|
|
11
12
|
*/
|
|
12
13
|
export function degreeDay(input) {
|
|
13
14
|
const { dailyTemps, baseHeating = 18, baseCooling = 24 } = input;
|
|
14
15
|
const totalDays = dailyTemps.length;
|
|
15
16
|
if (totalDays === 0) {
|
|
16
|
-
|
|
17
|
+
throw new RangeError('dailyTemps must not be empty');
|
|
17
18
|
}
|
|
18
19
|
let hdd = 0;
|
|
19
20
|
let cdd = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"degreeDay.js","sourceRoot":"","sources":["../../src/energy/degreeDay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC
|
|
1
|
+
{"version":3,"file":"degreeDay.js","sourceRoot":"","sources":["../../src/energy/degreeDay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,UAAU,EAAE,WAAW,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;IACjE,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;IAEpC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,GAAG,IAAI,IAAI,CAAC;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC;QACnD,GAAG,IAAI,UAAU,CAAC;QAClB,GAAG,IAAI,UAAU,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC;YAAE,WAAW,EAAE,CAAC;QAClC,IAAI,UAAU,GAAG,CAAC;YAAE,WAAW,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IAC1D,MAAM,OAAO,GAAG,GAAG,GAAG,SAAS,CAAC;IAEhC,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,SAAS;QACT,WAAW;QACX,WAAW;QACX,WAAW;QACX,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;KAC7B,CAAC;AACJ,CAAC"}
|
|
@@ -9,6 +9,8 @@ import type { InsulationRoiInput, InsulationRoiResult } from './types.js';
|
|
|
9
9
|
*
|
|
10
10
|
* @param input - Insulation parameters
|
|
11
11
|
* @returns Insulation ROI result with heat savings and payback
|
|
12
|
+
* @throws RangeError if surfaceArea, tempDifference, insulationK, or
|
|
13
|
+
* insulationThickness is not greater than 0
|
|
12
14
|
*/
|
|
13
15
|
export declare function insulationRoi(input: InsulationRoiInput): InsulationRoiResult;
|
|
14
16
|
//# sourceMappingURL=insulationRoi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insulationRoi.d.ts","sourceRoot":"","sources":["../../src/energy/insulationRoi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE1E
|
|
1
|
+
{"version":3,"file":"insulationRoi.d.ts","sourceRoot":"","sources":["../../src/energy/insulationRoi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE1E;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CAwD5E"}
|
|
@@ -9,19 +9,22 @@ import { roundTo } from '../utils.js';
|
|
|
9
9
|
*
|
|
10
10
|
* @param input - Insulation parameters
|
|
11
11
|
* @returns Insulation ROI result with heat savings and payback
|
|
12
|
+
* @throws RangeError if surfaceArea, tempDifference, insulationK, or
|
|
13
|
+
* insulationThickness is not greater than 0
|
|
12
14
|
*/
|
|
13
15
|
export function insulationRoi(input) {
|
|
14
16
|
const { surfaceArea, tempDifference, insulationK, insulationThickness, surfaceCoefficient = 10, operatingHours, energyCost, boilerEfficiency = 0.8, installationCost, } = input;
|
|
15
|
-
if (surfaceArea <= 0
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
if (surfaceArea <= 0) {
|
|
18
|
+
throw new RangeError('surfaceArea must be greater than 0');
|
|
19
|
+
}
|
|
20
|
+
if (tempDifference <= 0) {
|
|
21
|
+
throw new RangeError('tempDifference must be greater than 0');
|
|
22
|
+
}
|
|
23
|
+
if (insulationK <= 0) {
|
|
24
|
+
throw new RangeError('insulationK must be greater than 0');
|
|
25
|
+
}
|
|
26
|
+
if (insulationThickness <= 0) {
|
|
27
|
+
throw new RangeError('insulationThickness must be greater than 0');
|
|
25
28
|
}
|
|
26
29
|
// Bare surface heat loss: Q = h × A × ΔT (W)
|
|
27
30
|
const bareHeatLoss = surfaceCoefficient * surfaceArea * tempDifference;
|