formulab 0.9.0 → 0.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/LICENSE +21 -21
- package/README.md +659 -633
- package/dist/automotive/brakingDistance.d.ts +4 -0
- package/dist/automotive/brakingDistance.d.ts.map +1 -1
- package/dist/automotive/brakingDistance.js +8 -4
- package/dist/automotive/brakingDistance.js.map +1 -1
- package/dist/battery/cRate.d.ts.map +1 -1
- package/dist/battery/cRate.js +6 -0
- package/dist/battery/cRate.js.map +1 -1
- package/dist/chemical/dilution.js +4 -4
- package/dist/chemical/dilution.js.map +1 -1
- package/dist/chemical/heatTransfer.d.ts +6 -0
- package/dist/chemical/heatTransfer.d.ts.map +1 -1
- package/dist/chemical/heatTransfer.js +15 -9
- package/dist/chemical/heatTransfer.js.map +1 -1
- package/dist/chemical/pipeFlow.d.ts +6 -0
- package/dist/chemical/pipeFlow.d.ts.map +1 -1
- package/dist/chemical/pipeFlow.js +12 -6
- package/dist/chemical/pipeFlow.js.map +1 -1
- package/dist/construction/aggregate.d.ts +4 -0
- package/dist/construction/aggregate.d.ts.map +1 -1
- package/dist/construction/aggregate.js +8 -4
- package/dist/construction/aggregate.js.map +1 -1
- package/dist/construction/momentOfInertia.d.ts +7 -0
- package/dist/construction/momentOfInertia.d.ts.map +1 -1
- package/dist/construction/momentOfInertia.js +19 -12
- package/dist/construction/momentOfInertia.js.map +1 -1
- package/dist/construction/roof.js +2 -2
- package/dist/construction/roof.js.map +1 -1
- package/dist/electronics/awg.d.ts +3 -2
- package/dist/electronics/awg.d.ts.map +1 -1
- package/dist/electronics/awg.js +3 -3
- package/dist/electronics/awg.js.map +1 -1
- package/dist/electronics/capacitor.js +1 -1
- package/dist/electronics/capacitor.js.map +1 -1
- package/dist/electronics/led.js +2 -2
- package/dist/electronics/led.js.map +1 -1
- package/dist/electronics/ohmsLaw.d.ts +3 -0
- package/dist/electronics/ohmsLaw.d.ts.map +1 -1
- package/dist/electronics/ohmsLaw.js +11 -8
- package/dist/electronics/ohmsLaw.js.map +1 -1
- package/dist/electronics/stencil.d.ts +2 -1
- package/dist/electronics/stencil.d.ts.map +1 -1
- package/dist/electronics/stencil.js +4 -3
- package/dist/electronics/stencil.js.map +1 -1
- package/dist/electronics/trace.d.ts.map +1 -1
- package/dist/electronics/trace.js +4 -7
- package/dist/electronics/trace.js.map +1 -1
- package/dist/energy/solarOutput.d.ts +4 -0
- package/dist/energy/solarOutput.d.ts.map +1 -1
- package/dist/energy/solarOutput.js +8 -4
- package/dist/energy/solarOutput.js.map +1 -1
- package/dist/environmental/scope2Emissions.d.ts +1 -0
- package/dist/environmental/scope2Emissions.d.ts.map +1 -1
- package/dist/environmental/scope2Emissions.js +2 -1
- package/dist/environmental/scope2Emissions.js.map +1 -1
- package/dist/machining/boringBarDeflection.d.ts.map +1 -1
- package/dist/machining/boringBarDeflection.js +7 -1
- package/dist/machining/boringBarDeflection.js.map +1 -1
- package/dist/machining/gaugeBlockStack.d.ts.map +1 -1
- package/dist/machining/gaugeBlockStack.js +18 -15
- package/dist/machining/gaugeBlockStack.js.map +1 -1
- package/dist/machining/toolDeflection.d.ts.map +1 -1
- package/dist/machining/toolDeflection.js +7 -1
- package/dist/machining/toolDeflection.js.map +1 -1
- package/dist/machining/triangleSolver.d.ts +2 -1
- package/dist/machining/triangleSolver.d.ts.map +1 -1
- package/dist/machining/triangleSolver.js +6 -5
- package/dist/machining/triangleSolver.js.map +1 -1
- package/dist/metal/flangeSpec.d.ts +3 -0
- package/dist/metal/flangeSpec.d.ts.map +1 -1
- package/dist/metal/flangeSpec.js +6 -3
- package/dist/metal/flangeSpec.js.map +1 -1
- package/dist/metal/metalWeight.d.ts.map +1 -1
- package/dist/metal/metalWeight.js +20 -0
- package/dist/metal/metalWeight.js.map +1 -1
- package/dist/metal/pipeSpec.d.ts +3 -0
- package/dist/metal/pipeSpec.d.ts.map +1 -1
- package/dist/metal/pipeSpec.js +6 -3
- package/dist/metal/pipeSpec.js.map +1 -1
- package/dist/quality/controlChart.d.ts +3 -0
- package/dist/quality/controlChart.d.ts.map +1 -1
- package/dist/quality/controlChart.js +6 -3
- package/dist/quality/controlChart.js.map +1 -1
- package/dist/quality/oee.js +2 -2
- package/dist/quality/oee.js.map +1 -1
- package/dist/safety/ventilationRate.d.ts +3 -0
- package/dist/safety/ventilationRate.d.ts.map +1 -1
- package/dist/safety/ventilationRate.js +6 -3
- package/dist/safety/ventilationRate.js.map +1 -1
- package/package.json +15 -17
package/dist/electronics/awg.js
CHANGED
|
@@ -22,13 +22,13 @@ const CURRENT_DENSITY = {
|
|
|
22
22
|
* Calculate AWG wire properties
|
|
23
23
|
* AWG diameter formula: d(mm) = 0.127 × 92^((36-AWG)/39)
|
|
24
24
|
* @param input - AWG gauge number, material, and temperature
|
|
25
|
-
* @returns Wire properties
|
|
25
|
+
* @returns Wire properties
|
|
26
|
+
* @throws {RangeError} If AWG is not between 0 and 40
|
|
26
27
|
*/
|
|
27
28
|
export function awgProperties(input) {
|
|
28
29
|
const { awg, material, tempC } = input;
|
|
29
|
-
// Validate input range
|
|
30
30
|
if (awg < 0 || awg > 40) {
|
|
31
|
-
|
|
31
|
+
throw new RangeError('AWG must be between 0 and 40');
|
|
32
32
|
}
|
|
33
33
|
// Calculate diameter using AWG formula
|
|
34
34
|
// d(inch) = 0.005 × 92^((36-AWG)/39) → d(mm) = 0.127 × 92^((36-AWG)/39)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awg.js","sourceRoot":"","sources":["../../src/electronics/awg.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH,iCAAiC;AACjC,MAAM,eAAe,GAAgC;IACnD,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,OAAO;CAClB,CAAC;AAEF,kCAAkC;AAClC,MAAM,gBAAgB,GAAgC;IACpD,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,OAAO;CAClB,CAAC;AAEF,8EAA8E;AAC9E,mEAAmE;AACnE,MAAM,eAAe,GAAgC;IACnD,MAAM,EAAE,GAAG,EAAM,QAAQ;IACzB,QAAQ,EAAE,GAAG,EAAI,sCAAsC;CACxD,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"awg.js","sourceRoot":"","sources":["../../src/electronics/awg.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH,iCAAiC;AACjC,MAAM,eAAe,GAAgC;IACnD,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,OAAO;CAClB,CAAC;AAEF,kCAAkC;AAClC,MAAM,gBAAgB,GAAgC;IACpD,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,OAAO;CAClB,CAAC;AAEF,8EAA8E;AAC9E,mEAAmE;AACnE,MAAM,eAAe,GAAgC;IACnD,MAAM,EAAE,GAAG,EAAM,QAAQ;IACzB,QAAQ,EAAE,GAAG,EAAI,sCAAsC;CACxD,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAe;IAC3C,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAEvC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACvD,CAAC;IAED,uCAAuC;IACvC,wEAAwE;IACxE,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;IAEzC,uBAAuB;IACvB,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE9C,qCAAqC;IACrC,MAAM,gBAAgB,GAAG,YAAY,GAAG,YAAY,CAAC;IAErD,gDAAgD;IAChD,8BAA8B;IAC9B,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,UAAU,CAAC;IAE5D,wCAAwC;IACxC,MAAM,eAAe,GAAG,cAAc,GAAG,MAAM,CAAC;IAEhD,sCAAsC;IACtC,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,cAAc,GAAG,OAAO,CAAC;IAEjD,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC9C,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1C,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5C,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -12,7 +12,7 @@ export function capacitorDecode(input) {
|
|
|
12
12
|
const { code } = input;
|
|
13
13
|
// Validate: must be exactly 3 digits
|
|
14
14
|
if (!/^\d{3}$/.test(code)) {
|
|
15
|
-
throw new
|
|
15
|
+
throw new RangeError('Invalid capacitor code: must be exactly 3 digits');
|
|
16
16
|
}
|
|
17
17
|
const digit1 = parseInt(code[0], 10);
|
|
18
18
|
const digit2 = parseInt(code[1], 10);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capacitor.js","sourceRoot":"","sources":["../../src/electronics/capacitor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEvB,qCAAqC;IACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"capacitor.js","sourceRoot":"","sources":["../../src/electronics/capacitor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEvB,qCAAqC;IACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,kDAAkD,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE9C,4CAA4C;IAC5C,MAAM,kBAAkB,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC;IAEhD,gCAAgC;IAChC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;IAEjD,sBAAsB;IACtB,MAAM,UAAU,GAAG,kBAAkB,GAAG,UAAU,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;IAErD,uBAAuB;IACvB,IAAI,SAAiB,CAAC;IACtB,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,SAAS,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;SAAM,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QAC3B,SAAS,GAAG,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,GAAG,UAAU,IAAI,CAAC;IAChC,CAAC;IAED,OAAO;QACL,UAAU;QACV,UAAU;QACV,WAAW;QACX,SAAS;QACT,kBAAkB;QAClB,UAAU;KACX,CAAC;AACJ,CAAC"}
|
package/dist/electronics/led.js
CHANGED
|
@@ -43,10 +43,10 @@ export function ledResistor(input) {
|
|
|
43
43
|
const { supplyVoltage, forwardVoltage, forwardCurrent } = input;
|
|
44
44
|
// Validate inputs
|
|
45
45
|
if (supplyVoltage <= forwardVoltage) {
|
|
46
|
-
throw new
|
|
46
|
+
throw new RangeError('Supply voltage must be greater than forward voltage');
|
|
47
47
|
}
|
|
48
48
|
if (forwardCurrent <= 0) {
|
|
49
|
-
throw new
|
|
49
|
+
throw new RangeError('Forward current must be positive');
|
|
50
50
|
}
|
|
51
51
|
// R = (Vs - Vf) / If
|
|
52
52
|
// Note: forwardCurrent is in mA, so convert to A for calculation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"led.js","sourceRoot":"","sources":["../../src/electronics/led.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH,8CAA8C;AAC9C,MAAM,UAAU,GAAG;IACjB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;CAC3D,CAAC;AAEF;;GAEG;AACH,SAAS,2BAA2B,CAAC,UAAkB;IACrD,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC,CAAC,0BAA0B;IAE1D,gCAAgC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAErD,yBAAyB;IACzB,IAAI,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;QAC1C,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;YACnB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACxG,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,OAAO,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAEhE,kBAAkB;IAClB,IAAI,aAAa,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"led.js","sourceRoot":"","sources":["../../src/electronics/led.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,9 @@ import type { OhmsLawInput, OhmsLawResult } from './types.js';
|
|
|
5
5
|
* Solves for any one of voltage, current, resistance, or power
|
|
6
6
|
* given the other two known quantities.
|
|
7
7
|
*
|
|
8
|
+
* @throws {RangeError} Current must be positive
|
|
9
|
+
* @throws {RangeError} Resistance must be positive
|
|
10
|
+
* @throws {RangeError} Voltage must be non-negative
|
|
8
11
|
* @param input - discriminated union by `solveFor`
|
|
9
12
|
* @returns all four electrical quantities
|
|
10
13
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ohmsLaw.d.ts","sourceRoot":"","sources":["../../src/electronics/ohmsLaw.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D
|
|
1
|
+
{"version":3,"file":"ohmsLaw.d.ts","sourceRoot":"","sources":["../../src/electronics/ohmsLaw.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAmD1D"}
|
|
@@ -5,6 +5,9 @@ import { roundTo } from '../utils.js';
|
|
|
5
5
|
* Solves for any one of voltage, current, resistance, or power
|
|
6
6
|
* given the other two known quantities.
|
|
7
7
|
*
|
|
8
|
+
* @throws {RangeError} Current must be positive
|
|
9
|
+
* @throws {RangeError} Resistance must be positive
|
|
10
|
+
* @throws {RangeError} Voltage must be non-negative
|
|
8
11
|
* @param input - discriminated union by `solveFor`
|
|
9
12
|
* @returns all four electrical quantities
|
|
10
13
|
*/
|
|
@@ -18,9 +21,9 @@ export function ohmsLaw(input) {
|
|
|
18
21
|
current = input.current;
|
|
19
22
|
resistance = input.resistance;
|
|
20
23
|
if (current <= 0)
|
|
21
|
-
throw new
|
|
24
|
+
throw new RangeError('Current must be positive');
|
|
22
25
|
if (resistance <= 0)
|
|
23
|
-
throw new
|
|
26
|
+
throw new RangeError('Resistance must be positive');
|
|
24
27
|
voltage = current * resistance;
|
|
25
28
|
power = voltage * current;
|
|
26
29
|
break;
|
|
@@ -29,9 +32,9 @@ export function ohmsLaw(input) {
|
|
|
29
32
|
voltage = input.voltage;
|
|
30
33
|
resistance = input.resistance;
|
|
31
34
|
if (voltage < 0)
|
|
32
|
-
throw new
|
|
35
|
+
throw new RangeError('Voltage must be non-negative');
|
|
33
36
|
if (resistance <= 0)
|
|
34
|
-
throw new
|
|
37
|
+
throw new RangeError('Resistance must be positive');
|
|
35
38
|
current = voltage / resistance;
|
|
36
39
|
power = voltage * current;
|
|
37
40
|
break;
|
|
@@ -40,9 +43,9 @@ export function ohmsLaw(input) {
|
|
|
40
43
|
voltage = input.voltage;
|
|
41
44
|
current = input.current;
|
|
42
45
|
if (voltage < 0)
|
|
43
|
-
throw new
|
|
46
|
+
throw new RangeError('Voltage must be non-negative');
|
|
44
47
|
if (current <= 0)
|
|
45
|
-
throw new
|
|
48
|
+
throw new RangeError('Current must be positive');
|
|
46
49
|
resistance = voltage / current;
|
|
47
50
|
power = voltage * current;
|
|
48
51
|
break;
|
|
@@ -51,9 +54,9 @@ export function ohmsLaw(input) {
|
|
|
51
54
|
voltage = input.voltage;
|
|
52
55
|
current = input.current;
|
|
53
56
|
if (voltage < 0)
|
|
54
|
-
throw new
|
|
57
|
+
throw new RangeError('Voltage must be non-negative');
|
|
55
58
|
if (current <= 0)
|
|
56
|
-
throw new
|
|
59
|
+
throw new RangeError('Current must be positive');
|
|
57
60
|
resistance = voltage / current;
|
|
58
61
|
power = voltage * current;
|
|
59
62
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ohmsLaw.js","sourceRoot":"","sources":["../../src/electronics/ohmsLaw.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC
|
|
1
|
+
{"version":3,"file":"ohmsLaw.js","sourceRoot":"","sources":["../../src/electronics/ohmsLaw.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO,CAAC,KAAmB;IACzC,IAAI,OAAe,CAAC;IACpB,IAAI,OAAe,CAAC;IACpB,IAAI,UAAkB,CAAC;IACvB,IAAI,KAAa,CAAC;IAElB,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YAC9B,IAAI,OAAO,IAAI,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,0BAA0B,CAAC,CAAC;YACnE,IAAI,UAAU,IAAI,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,6BAA6B,CAAC,CAAC;YACzE,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;YAC/B,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;YAC1B,MAAM;QACR,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YAC9B,IAAI,OAAO,GAAG,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;YACtE,IAAI,UAAU,IAAI,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,6BAA6B,CAAC,CAAC;YACzE,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;YAC/B,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;YAC1B,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,IAAI,OAAO,GAAG,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;YACtE,IAAI,OAAO,IAAI,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,0BAA0B,CAAC,CAAC;YACnE,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;YAC/B,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;YAC1B,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,IAAI,OAAO,GAAG,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;YACtE,IAAI,OAAO,IAAI,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,0BAA0B,CAAC,CAAC;YACnE,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;YAC/B,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;YAC1B,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { StencilInput, StencilResult } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Calculate stencil aperture area ratio and aspect ratio
|
|
4
|
+
* @throws {RangeError} Aperture width and stencil thickness must be positive
|
|
5
|
+
* @throws {RangeError} Aperture length must be positive for rectangular apertures
|
|
4
6
|
* @param input - Aperture dimensions, stencil thickness, and component type
|
|
5
7
|
* @returns Area ratio, aspect ratio, and pass/fail status
|
|
6
|
-
* @throws Error if dimensions are invalid
|
|
7
8
|
*/
|
|
8
9
|
export declare function stencilAperture(input: StencilInput): StencilResult;
|
|
9
10
|
//# sourceMappingURL=stencil.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stencil.d.ts","sourceRoot":"","sources":["../../src/electronics/stencil.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAgB7E
|
|
1
|
+
{"version":3,"file":"stencil.d.ts","sourceRoot":"","sources":["../../src/electronics/stencil.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAgB7E;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CA8DlE"}
|
|
@@ -12,18 +12,19 @@ const RECOMMENDATIONS = {
|
|
|
12
12
|
};
|
|
13
13
|
/**
|
|
14
14
|
* Calculate stencil aperture area ratio and aspect ratio
|
|
15
|
+
* @throws {RangeError} Aperture width and stencil thickness must be positive
|
|
16
|
+
* @throws {RangeError} Aperture length must be positive for rectangular apertures
|
|
15
17
|
* @param input - Aperture dimensions, stencil thickness, and component type
|
|
16
18
|
* @returns Area ratio, aspect ratio, and pass/fail status
|
|
17
|
-
* @throws Error if dimensions are invalid
|
|
18
19
|
*/
|
|
19
20
|
export function stencilAperture(input) {
|
|
20
21
|
const { shape, apertureWidth, apertureLength, stencilThickness, componentType } = input;
|
|
21
22
|
// Validate inputs
|
|
22
23
|
if (apertureWidth <= 0 || stencilThickness <= 0) {
|
|
23
|
-
throw new
|
|
24
|
+
throw new RangeError('Aperture width and stencil thickness must be positive');
|
|
24
25
|
}
|
|
25
26
|
if (shape === 'rectangle' && apertureLength <= 0) {
|
|
26
|
-
throw new
|
|
27
|
+
throw new RangeError('Aperture length must be positive for rectangular apertures');
|
|
27
28
|
}
|
|
28
29
|
let apertureArea;
|
|
29
30
|
let perimeter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stencil.js","sourceRoot":"","sources":["../../src/electronics/stencil.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH,gEAAgE;AAChE,MAAM,eAAe,GAAsE;IACzF,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,EAAO,iBAAiB;IAClE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,EAAO,UAAU;IAC3D,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,EAAM,4BAA4B;IAC7E,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,EAAO,WAAW;IAC5D,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,kBAAkB;CACnE,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"stencil.js","sourceRoot":"","sources":["../../src/electronics/stencil.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/electronics/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAmC1D;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/electronics/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAmC1D;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CA6CzD"}
|
|
@@ -24,9 +24,9 @@ const IPC2221_CONSTANTS = {
|
|
|
24
24
|
*/
|
|
25
25
|
const COPPER_THICKNESS_PER_OZ = 1.378;
|
|
26
26
|
/**
|
|
27
|
-
* Copper resistivity at 25C in ohm-
|
|
27
|
+
* Copper resistivity at 25C in ohm·mil²/inch (IPC-2221)
|
|
28
28
|
*/
|
|
29
|
-
const COPPER_RESISTIVITY = 0.6787;
|
|
29
|
+
const COPPER_RESISTIVITY = 0.6787;
|
|
30
30
|
/**
|
|
31
31
|
* Calculate PCB trace width using IPC-2221 formula
|
|
32
32
|
* @param input - Trace parameters (current, temp rise, copper weight, layer)
|
|
@@ -51,11 +51,8 @@ export function traceWidth(input) {
|
|
|
51
51
|
const widthMils = roundTo(crossSection / copperThickness, 4);
|
|
52
52
|
// Convert to mm (1 mil = 0.0254 mm)
|
|
53
53
|
const widthMm = roundTo(widthMils * 0.0254, 4);
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
// Area is in mil^2
|
|
57
|
-
// R = 0.6787 / Area (micro-ohm/inch) = 0.6787e-6 / Area (ohm/inch)
|
|
58
|
-
const resistance = roundTo(COPPER_RESISTIVITY / crossSection * 1e-6, 8);
|
|
54
|
+
// Resistance per inch at 25C: R = ρ / A (ohm·mil²/inch ÷ mil² = ohm/inch)
|
|
55
|
+
const resistance = roundTo(COPPER_RESISTIVITY / crossSection, 8);
|
|
59
56
|
// Voltage drop per inch = I * R
|
|
60
57
|
const voltageDrop = roundTo(current * resistance, 8);
|
|
61
58
|
// Power loss per inch = I^2 * R
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/electronics/trace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH;;;GAGG;AACH,MAAM,iBAAiB,GAAG;IACxB,QAAQ,EAAE;QACR,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,KAAK;KACT;IACD,QAAQ,EAAE;QACR,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,KAAK;KACT;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAEtC;;GAEG;AACH,MAAM,kBAAkB,GAAG,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/electronics/trace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;GAEG;AAEH;;;GAGG;AACH,MAAM,iBAAiB,GAAG;IACxB,QAAQ,EAAE;QACR,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,KAAK;KACT;IACD,QAAQ,EAAE;QACR,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,KAAK;KACT;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAEtC;;GAEG;AACH,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAEzD,mCAAmC;IACnC,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE3C,oBAAoB;IACpB,wCAAwC;IACxC,SAAS;IACT,wBAAwB;IACxB,kDAAkD;IAClD,+BAA+B;IAC/B,aAAa;IACb,cAAc;IACd,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EACzD,CAAC,GAAG,SAAS,CAAC,CAAC,CAChB,CAAC;IAEF,2BAA2B;IAC3B,MAAM,eAAe,GAAG,YAAY,GAAG,uBAAuB,CAAC;IAE/D,2BAA2B;IAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,eAAe,EAAE,CAAC,CAAC,CAAC;IAE7D,oCAAoC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAE/C,0EAA0E;IAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,kBAAkB,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC;IAEjE,gCAAgC;IAChC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;IAErD,gCAAgC;IAChC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;IAE7D,OAAO;QACL,SAAS;QACT,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,UAAU;QACV,WAAW;QACX,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -7,6 +7,10 @@ import type { SolarOutputInput, SolarOutputResult } from './types.js';
|
|
|
7
7
|
*
|
|
8
8
|
* Reference: NREL PVWatts Calculator methodology
|
|
9
9
|
*
|
|
10
|
+
* @throws {RangeError} Panel wattage must be positive
|
|
11
|
+
* @throws {RangeError} Panel count must be positive
|
|
12
|
+
* @throws {RangeError} Peak sun hours must be positive
|
|
13
|
+
* @throws {RangeError} System efficiency must be between 0 and 1
|
|
10
14
|
* @param input - panel specs, sun hours, orientation
|
|
11
15
|
* @returns energy production estimates
|
|
12
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solarOutput.d.ts","sourceRoot":"","sources":["../../src/energy/solarOutput.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE
|
|
1
|
+
{"version":3,"file":"solarOutput.d.ts","sourceRoot":"","sources":["../../src/energy/solarOutput.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CA+CtE"}
|
|
@@ -7,19 +7,23 @@ import { roundTo } from '../utils.js';
|
|
|
7
7
|
*
|
|
8
8
|
* Reference: NREL PVWatts Calculator methodology
|
|
9
9
|
*
|
|
10
|
+
* @throws {RangeError} Panel wattage must be positive
|
|
11
|
+
* @throws {RangeError} Panel count must be positive
|
|
12
|
+
* @throws {RangeError} Peak sun hours must be positive
|
|
13
|
+
* @throws {RangeError} System efficiency must be between 0 and 1
|
|
10
14
|
* @param input - panel specs, sun hours, orientation
|
|
11
15
|
* @returns energy production estimates
|
|
12
16
|
*/
|
|
13
17
|
export function solarOutput(input) {
|
|
14
18
|
const { panelWattage, panelCount, peakSunHours, systemEfficiency, tiltAngle, latitude, azimuthOffset, } = input;
|
|
15
19
|
if (panelWattage <= 0)
|
|
16
|
-
throw new
|
|
20
|
+
throw new RangeError('Panel wattage must be positive');
|
|
17
21
|
if (panelCount <= 0)
|
|
18
|
-
throw new
|
|
22
|
+
throw new RangeError('Panel count must be positive');
|
|
19
23
|
if (peakSunHours <= 0)
|
|
20
|
-
throw new
|
|
24
|
+
throw new RangeError('Peak sun hours must be positive');
|
|
21
25
|
if (systemEfficiency <= 0 || systemEfficiency > 1)
|
|
22
|
-
throw new
|
|
26
|
+
throw new RangeError('System efficiency must be between 0 and 1');
|
|
23
27
|
// System size in kW
|
|
24
28
|
const systemSizeKw = (panelWattage * panelCount) / 1000;
|
|
25
29
|
// Tilt efficiency factor
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solarOutput.js","sourceRoot":"","sources":["../../src/energy/solarOutput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC
|
|
1
|
+
{"version":3,"file":"solarOutput.js","sourceRoot":"","sources":["../../src/energy/solarOutput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,EACJ,YAAY,EAAE,UAAU,EAAE,YAAY,EACtC,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GACrD,GAAG,KAAK,CAAC;IAEV,IAAI,YAAY,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,gCAAgC,CAAC,CAAC;IAC9E,IAAI,UAAU,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IAC1E,IAAI,YAAY,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IAC/E,IAAI,gBAAgB,IAAI,CAAC,IAAI,gBAAgB,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;IAErH,oBAAoB;IACpB,MAAM,YAAY,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC;IAExD,yBAAyB;IACzB,qDAAqD;IACrD,2DAA2D;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;IACxD,+DAA+D;IAC/D,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC;IAEnE,6DAA6D;IAC7D,oEAAoE;IACpE,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC;IAEhE,MAAM,cAAc,GAAG,UAAU,GAAG,aAAa,CAAC;IAElD,8EAA8E;IAC9E,MAAM,cAAc,GAAG,YAAY,GAAG,YAAY,GAAG,gBAAgB,GAAG,cAAc,CAAC;IACvF,MAAM,gBAAgB,GAAG,cAAc,GAAG,EAAE,CAAC;IAC7C,MAAM,eAAe,GAAG,cAAc,GAAG,GAAG,CAAC;IAE7C,yEAAyE;IACzE,MAAM,cAAc,GAAG,cAAc,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAE5D,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC9C,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5C,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1C,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -4,6 +4,7 @@ import type { Scope2EmissionsInput, Scope2EmissionsResult } from './types.js';
|
|
|
4
4
|
*
|
|
5
5
|
* @formula CO2(kg) = kWh × gridFactor / 1000
|
|
6
6
|
* @reference GHG Protocol Scope 2, IEA Emission Factors 2023
|
|
7
|
+
* @throws {RangeError} customFactor is required when region is "custom"
|
|
7
8
|
* @param input - Electricity consumption and grid region
|
|
8
9
|
* @returns CO2 emissions in kg and tonnes
|
|
9
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope2Emissions.d.ts","sourceRoot":"","sources":["../../src/environmental/scope2Emissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAqB1F
|
|
1
|
+
{"version":3,"file":"scope2Emissions.d.ts","sourceRoot":"","sources":["../../src/environmental/scope2Emissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAqB1F;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAsBlF"}
|
|
@@ -22,6 +22,7 @@ const GRID_EMISSION_FACTORS = {
|
|
|
22
22
|
*
|
|
23
23
|
* @formula CO2(kg) = kWh × gridFactor / 1000
|
|
24
24
|
* @reference GHG Protocol Scope 2, IEA Emission Factors 2023
|
|
25
|
+
* @throws {RangeError} customFactor is required when region is "custom"
|
|
25
26
|
* @param input - Electricity consumption and grid region
|
|
26
27
|
* @returns CO2 emissions in kg and tonnes
|
|
27
28
|
*/
|
|
@@ -30,7 +31,7 @@ export function scope2Emissions(input) {
|
|
|
30
31
|
let gridFactor;
|
|
31
32
|
if (region === 'custom') {
|
|
32
33
|
if (customFactor == null) {
|
|
33
|
-
throw new
|
|
34
|
+
throw new RangeError('customFactor is required when region is "custom"');
|
|
34
35
|
}
|
|
35
36
|
gridFactor = customFactor;
|
|
36
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope2Emissions.js","sourceRoot":"","sources":["../../src/environmental/scope2Emissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;GAGG;AACH,MAAM,qBAAqB,GAAkD;IAC3E,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,GAAG;IACf,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,EAAE,EAAE,GAAG;IACP,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,SAAS,EAAE,GAAG;IACd,MAAM,EAAE,GAAG;CACZ,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"scope2Emissions.js","sourceRoot":"","sources":["../../src/environmental/scope2Emissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;GAGG;AACH,MAAM,qBAAqB,GAAkD;IAC3E,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,GAAG;IACf,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,EAAE,EAAE,GAAG;IACP,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,SAAS,EAAE,GAAG;IACd,MAAM,EAAE,GAAG;CACZ,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAEvD,IAAI,UAAkB,CAAC;IACvB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,UAAU,CAAC,kDAAkD,CAAC,CAAC;QAC3E,CAAC;QACD,UAAU,GAAG,YAAY,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IAE3C,OAAO;QACL,KAAK;QACL,SAAS;QACT,UAAU;QACV,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boringBarDeflection.d.ts","sourceRoot":"","sources":["../../src/machining/boringBarDeflection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAqB,MAAM,YAAY,CAAC;AAWzG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,yBAAyB,
|
|
1
|
+
{"version":3,"file":"boringBarDeflection.d.ts","sourceRoot":"","sources":["../../src/machining/boringBarDeflection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAqB,MAAM,YAAY,CAAC;AAWzG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,yBAAyB,CAkC9F"}
|
|
@@ -23,11 +23,17 @@ const BAR_MODULUS = {
|
|
|
23
23
|
*/
|
|
24
24
|
export function boringBarDeflection(input) {
|
|
25
25
|
const { barDiameter, overhang, cuttingForce, material = 'steel' } = input;
|
|
26
|
+
if (barDiameter <= 0)
|
|
27
|
+
throw new RangeError('barDiameter must be positive');
|
|
28
|
+
if (overhang <= 0)
|
|
29
|
+
throw new RangeError('overhang must be positive');
|
|
30
|
+
if (cuttingForce < 0)
|
|
31
|
+
throw new RangeError('cuttingForce must be non-negative');
|
|
26
32
|
const E = input.youngsModulus ?? BAR_MODULUS[material];
|
|
27
33
|
const E_MPa = E * 1000; // GPa → MPa
|
|
28
34
|
const I = (Math.PI * Math.pow(barDiameter, 4)) / 64;
|
|
29
35
|
const delta = (cuttingForce * Math.pow(overhang, 3)) / (3 * E_MPa * I);
|
|
30
|
-
const stiffness =
|
|
36
|
+
const stiffness = (3 * E_MPa * I) / Math.pow(overhang, 3);
|
|
31
37
|
const ldRatio = overhang / barDiameter;
|
|
32
38
|
let recommendation;
|
|
33
39
|
if (ldRatio <= 4) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boringBarDeflection.js","sourceRoot":"","sources":["../../src/machining/boringBarDeflection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;GAEG;AACH,MAAM,WAAW,GAAsC;IACrD,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;IACV,UAAU,EAAE,GAAG;CAChB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1E,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,YAAY;IAEpC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"boringBarDeflection.js","sourceRoot":"","sources":["../../src/machining/boringBarDeflection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;GAEG;AACH,MAAM,WAAW,GAAsC;IACrD,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;IACV,UAAU,EAAE,GAAG;CAChB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1E,IAAI,WAAW,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IAC3E,IAAI,QAAQ,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,2BAA2B,CAAC,CAAC;IACrE,IAAI,YAAY,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAEhF,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,YAAY;IAEpC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;IAEvC,IAAI,cAAsB,CAAC;IAC3B,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,cAAc,GAAG,oBAAoB,CAAC;IACxC,CAAC;SAAM,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACxB,cAAc,GAAG,yBAAyB,CAAC;IAC7C,CAAC;SAAM,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QACzB,cAAc,GAAG,uCAAuC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,cAAc,GAAG,+CAA+C,CAAC;IACnE,CAAC;IAED,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7B,eAAe,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5B,aAAa,EAAE,CAAC;QAChB,cAAc;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaugeBlockStack.d.ts","sourceRoot":"","sources":["../../src/machining/gaugeBlockStack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"gaugeBlockStack.d.ts","sourceRoot":"","sources":["../../src/machining/gaugeBlockStack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAkE9E;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAqDlF"}
|
|
@@ -4,37 +4,36 @@ import { roundTo } from '../utils.js';
|
|
|
4
4
|
* Standard: Grade 1 metric set per ISO 3650
|
|
5
5
|
*/
|
|
6
6
|
const METRIC_47_SET = [
|
|
7
|
-
// Series 1:
|
|
7
|
+
// Series 1: 0.001 step (9 blocks)
|
|
8
8
|
1.001, 1.002, 1.003, 1.004, 1.005, 1.006, 1.007, 1.008, 1.009,
|
|
9
|
-
// Series 2:
|
|
10
|
-
// Actually standard 47-set has:
|
|
11
|
-
// 9 × 0.001: 1.001-1.009
|
|
12
|
-
// 9 × 0.01: 1.01-1.09
|
|
13
|
-
// 9 × 0.10: 1.10-1.90 (but typically only up to 1.49 in some sets)
|
|
14
|
-
// Let's use the standard 47-piece metric set:
|
|
9
|
+
// Series 2: 0.01 step (9 blocks)
|
|
15
10
|
1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09,
|
|
16
|
-
// Series 3: 0.
|
|
11
|
+
// Series 3: 0.10 step (9 blocks)
|
|
17
12
|
1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90,
|
|
18
|
-
// Series 4:
|
|
13
|
+
// Series 4: 0.5 step — ISO 3650 half-mm blocks for sub-1mm remainders
|
|
14
|
+
0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
|
|
15
|
+
// Series 5: whole mm (9 blocks)
|
|
19
16
|
1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
20
|
-
// Series
|
|
17
|
+
// Series 6: tens (10 blocks)
|
|
21
18
|
10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
|
|
22
19
|
];
|
|
23
20
|
/**
|
|
24
21
|
* Metric 88-piece gauge block set (mm) — extended precision
|
|
25
22
|
*/
|
|
26
23
|
const METRIC_88_SET = [
|
|
27
|
-
// 0.001 step: 1.001-1.009
|
|
24
|
+
// 0.001 step: 1.001-1.009 (9 blocks)
|
|
28
25
|
1.001, 1.002, 1.003, 1.004, 1.005, 1.006, 1.007, 1.008, 1.009,
|
|
29
|
-
// 0.01 step: 1.01-1.49
|
|
26
|
+
// 0.01 step: 1.01-1.49 (49 blocks)
|
|
30
27
|
1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09,
|
|
31
28
|
1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19,
|
|
32
29
|
1.20, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29,
|
|
33
30
|
1.30, 1.31, 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39,
|
|
34
31
|
1.40, 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49,
|
|
35
|
-
//
|
|
32
|
+
// 0.5 step — ISO 3650 half-mm blocks for sub-1mm remainders
|
|
33
|
+
0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
|
|
34
|
+
// whole mm: 1-9 (9 blocks)
|
|
36
35
|
1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
37
|
-
// tens: 10-100
|
|
36
|
+
// tens: 10-100 (10 blocks)
|
|
38
37
|
10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
|
|
39
38
|
];
|
|
40
39
|
/**
|
|
@@ -78,7 +77,11 @@ export function gaugeBlockStack(input) {
|
|
|
78
77
|
const setBlocks = SETS[availableSet];
|
|
79
78
|
const used = new Set();
|
|
80
79
|
const blocks = [];
|
|
81
|
-
|
|
80
|
+
// Round target to block-set precision: metric blocks resolve to 0.001mm (3dp),
|
|
81
|
+
// inch blocks to 0.0001" (4dp). This ensures the trailing-zero scoring system
|
|
82
|
+
// can differentiate fine-digit-eliminating blocks from coarse ones.
|
|
83
|
+
const precision = availableSet.startsWith('inch') ? 4 : 3;
|
|
84
|
+
let remaining = roundTo(targetDimension, precision);
|
|
82
85
|
// Successive subtraction algorithm (Machinery's Handbook method):
|
|
83
86
|
// 1. Find a block that, when subtracted, eliminates the least significant non-zero digit
|
|
84
87
|
// 2. Prefer blocks that reduce the number of significant decimal places
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaugeBlockStack.js","sourceRoot":"","sources":["../../src/machining/gaugeBlockStack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;GAGG;AACH,MAAM,aAAa,GAAa;IAC9B,
|
|
1
|
+
{"version":3,"file":"gaugeBlockStack.js","sourceRoot":"","sources":["../../src/machining/gaugeBlockStack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolDeflection.d.ts","sourceRoot":"","sources":["../../src/machining/toolDeflection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAgB,MAAM,YAAY,CAAC;AAU1F;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,
|
|
1
|
+
{"version":3,"file":"toolDeflection.d.ts","sourceRoot":"","sources":["../../src/machining/toolDeflection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAgB,MAAM,YAAY,CAAC;AAU1F;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAoB/E"}
|
|
@@ -21,11 +21,17 @@ const TOOL_MODULUS = {
|
|
|
21
21
|
*/
|
|
22
22
|
export function toolDeflection(input) {
|
|
23
23
|
const { toolDiameter, stickout, cuttingForce, material = 'carbide' } = input;
|
|
24
|
+
if (toolDiameter <= 0)
|
|
25
|
+
throw new RangeError('toolDiameter must be positive');
|
|
26
|
+
if (stickout <= 0)
|
|
27
|
+
throw new RangeError('stickout must be positive');
|
|
28
|
+
if (cuttingForce < 0)
|
|
29
|
+
throw new RangeError('cuttingForce must be non-negative');
|
|
24
30
|
const E = input.youngsModulus ?? TOOL_MODULUS[material];
|
|
25
31
|
const E_MPa = E * 1000; // GPa → MPa (N/mm²)
|
|
26
32
|
const I = (Math.PI * Math.pow(toolDiameter, 4)) / 64;
|
|
27
33
|
const delta = (cuttingForce * Math.pow(stickout, 3)) / (3 * E_MPa * I);
|
|
28
|
-
const stiffness =
|
|
34
|
+
const stiffness = (3 * E_MPa * I) / Math.pow(stickout, 3);
|
|
29
35
|
return {
|
|
30
36
|
deflection: roundTo(delta, 6),
|
|
31
37
|
momentOfInertia: roundTo(I, 4),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolDeflection.js","sourceRoot":"","sources":["../../src/machining/toolDeflection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;GAEG;AACH,MAAM,YAAY,GAAiC;IACjD,OAAO,EAAE,GAAG;IACZ,GAAG,EAAE,GAAG;CACT,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC;IAE7E,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,oBAAoB;IAE5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"toolDeflection.js","sourceRoot":"","sources":["../../src/machining/toolDeflection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;GAEG;AACH,MAAM,YAAY,GAAiC;IACjD,OAAO,EAAE,GAAG;IACZ,GAAG,EAAE,GAAG;CACT,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC;IAE7E,IAAI,YAAY,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,CAAC;IAC7E,IAAI,QAAQ,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,2BAA2B,CAAC,CAAC;IACrE,IAAI,YAAY,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAEhF,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,oBAAoB;IAE5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE1D,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7B,eAAe,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,aAAa,EAAE,CAAC;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -13,9 +13,10 @@ import type { TriangleSolverInput, TriangleSolverResult } from './types.js';
|
|
|
13
13
|
* Law of sines: a/sin(A) = b/sin(B) = c/sin(C)
|
|
14
14
|
* Area (Heron): √(s(s−a)(s−b)(s−c)), s = (a+b+c)/2
|
|
15
15
|
*
|
|
16
|
+
* @throws {RangeError} No valid triangle exists
|
|
17
|
+
* @throws {RangeError} Insufficient data to solve triangle
|
|
16
18
|
* @param input - Triangle sides and/or angles (degrees)
|
|
17
19
|
* @returns TriangleSolverResult with all sides, angles, area, and perimeter
|
|
18
|
-
* @throws Error if insufficient or invalid input
|
|
19
20
|
*/
|
|
20
21
|
export declare function triangleSolver(input: TriangleSolverInput): TriangleSolverResult;
|
|
21
22
|
//# sourceMappingURL=triangleSolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triangleSolver.d.ts","sourceRoot":"","sources":["../../src/machining/triangleSolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAK5E
|
|
1
|
+
{"version":3,"file":"triangleSolver.d.ts","sourceRoot":"","sources":["../../src/machining/triangleSolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAK5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CA2F/E"}
|
|
@@ -15,9 +15,10 @@ const RAD = 180 / Math.PI;
|
|
|
15
15
|
* Law of sines: a/sin(A) = b/sin(B) = c/sin(C)
|
|
16
16
|
* Area (Heron): √(s(s−a)(s−b)(s−c)), s = (a+b+c)/2
|
|
17
17
|
*
|
|
18
|
+
* @throws {RangeError} No valid triangle exists
|
|
19
|
+
* @throws {RangeError} Insufficient data to solve triangle
|
|
18
20
|
* @param input - Triangle sides and/or angles (degrees)
|
|
19
21
|
* @returns TriangleSolverResult with all sides, angles, area, and perimeter
|
|
20
|
-
* @throws Error if insufficient or invalid input
|
|
21
22
|
*/
|
|
22
23
|
export function triangleSolver(input) {
|
|
23
24
|
let { a, b, c, A, B, C } = input;
|
|
@@ -60,7 +61,7 @@ export function triangleSolver(input) {
|
|
|
60
61
|
else if (a !== undefined && b !== undefined && A !== undefined) {
|
|
61
62
|
const sinB = (b * Math.sin(A * DEG)) / a;
|
|
62
63
|
if (sinB > 1)
|
|
63
|
-
throw new
|
|
64
|
+
throw new RangeError('No valid triangle exists');
|
|
64
65
|
B = Math.asin(sinB) * RAD;
|
|
65
66
|
C = 180 - A - B;
|
|
66
67
|
c = (a * Math.sin(C * DEG)) / Math.sin(A * DEG);
|
|
@@ -68,7 +69,7 @@ export function triangleSolver(input) {
|
|
|
68
69
|
else if (a !== undefined && c !== undefined && A !== undefined) {
|
|
69
70
|
const sinC = (c * Math.sin(A * DEG)) / a;
|
|
70
71
|
if (sinC > 1)
|
|
71
|
-
throw new
|
|
72
|
+
throw new RangeError('No valid triangle exists');
|
|
72
73
|
C = Math.asin(sinC) * RAD;
|
|
73
74
|
B = 180 - A - C;
|
|
74
75
|
b = (a * Math.sin(B * DEG)) / Math.sin(A * DEG);
|
|
@@ -76,7 +77,7 @@ export function triangleSolver(input) {
|
|
|
76
77
|
else if (b !== undefined && c !== undefined && B !== undefined) {
|
|
77
78
|
const sinC = (c * Math.sin(B * DEG)) / b;
|
|
78
79
|
if (sinC > 1)
|
|
79
|
-
throw new
|
|
80
|
+
throw new RangeError('No valid triangle exists');
|
|
80
81
|
C = Math.asin(sinC) * RAD;
|
|
81
82
|
A = 180 - B - C;
|
|
82
83
|
a = (b * Math.sin(A * DEG)) / Math.sin(B * DEG);
|
|
@@ -101,7 +102,7 @@ export function triangleSolver(input) {
|
|
|
101
102
|
}
|
|
102
103
|
if (a === undefined || b === undefined || c === undefined ||
|
|
103
104
|
A === undefined || B === undefined || C === undefined) {
|
|
104
|
-
throw new
|
|
105
|
+
throw new RangeError('Insufficient data to solve triangle');
|
|
105
106
|
}
|
|
106
107
|
// Heron's formula for area
|
|
107
108
|
const s = (a + b + c) / 2;
|