es6-fuzz 7.0.1 → 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +3 -1
- package/lib/curve/constant.d.ts.map +1 -1
- package/lib/curve/constant.js +5 -1
- package/lib/curve/constant.js.map +1 -1
- package/lib/curve/fuzzy-function.d.ts.map +1 -1
- package/lib/curve/fuzzy-function.js +4 -1
- package/lib/curve/fuzzy-function.js.map +1 -1
- package/lib/curve/grade.d.ts.map +1 -1
- package/lib/curve/grade.js +27 -1
- package/lib/curve/grade.js.map +1 -1
- package/lib/curve/reverse-grade.d.ts.map +1 -1
- package/lib/curve/reverse-grade.js +24 -1
- package/lib/curve/reverse-grade.js.map +1 -1
- package/lib/curve/shape.d.ts.map +1 -1
- package/lib/curve/shape.js +27 -16
- package/lib/curve/shape.js.map +1 -1
- package/lib/curve/sigmoid.d.ts +9 -5
- package/lib/curve/sigmoid.d.ts.map +1 -1
- package/lib/curve/sigmoid.js +21 -5
- package/lib/curve/sigmoid.js.map +1 -1
- package/lib/curve/trapezoid.d.ts +8 -0
- package/lib/curve/trapezoid.d.ts.map +1 -1
- package/lib/curve/trapezoid.js +58 -18
- package/lib/curve/trapezoid.js.map +1 -1
- package/lib/curve/triangle.d.ts.map +1 -1
- package/lib/curve/triangle.js +18 -0
- package/lib/curve/triangle.js.map +1 -1
- package/lib/logic.d.ts +4 -2
- package/lib/logic.d.ts.map +1 -1
- package/lib/logic.js +42 -7
- package/lib/logic.js.map +1 -1
- package/lib/svg-renderer.d.ts +12 -0
- package/lib/svg-renderer.d.ts.map +1 -1
- package/lib/svg-renderer.js +57 -16
- package/lib/svg-renderer.js.map +1 -1
- package/package.json +1 -1
package/Readme.md
CHANGED
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
* **Reverse Grade** - Inverted linear membership
|
|
16
16
|
* **Sigmoid** - S-shaped membership curve
|
|
17
17
|
* **Trapezoid** - Trapezoidal membership function
|
|
18
|
-
* **Triangle** - Triangular membership
|
|
18
|
+
* **Triangle** - Triangular membership function
|
|
19
|
+
* **FuzzyFunction** - Custom membership from a user-supplied `(x) => 0..1` callback
|
|
20
|
+
|
|
19
21
|
## Documentation
|
|
20
22
|
|
|
21
23
|
* [API Documentation](http://sebs.github.io/es6-fuzz)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../src/curve/constant.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,qCAAqC;AACrC,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC;;;;;OAKG;gBACS,aAAa,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../src/curve/constant.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,qCAAqC;AACrC,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC;;;;;OAKG;gBACS,aAAa,EAAE,MAAM;IAUjC;;;OAGG;IACH,OAAO,IAAI,MAAM;CAGlB"}
|
package/lib/curve/constant.js
CHANGED
|
@@ -11,7 +11,11 @@ class Constant {
|
|
|
11
11
|
* new Constant(0.5)
|
|
12
12
|
*/
|
|
13
13
|
constructor(constantValue) {
|
|
14
|
-
|
|
14
|
+
// Require an actual number: the >=/<= comparisons coerce their operands, so
|
|
15
|
+
// without the typeof check `true`, "0.5", [1] etc. would pass validation and
|
|
16
|
+
// be returned verbatim by fuzzify, breaking the number contract and letting a
|
|
17
|
+
// non-number "membership" win a Logic classification (findings.md F4).
|
|
18
|
+
if (typeof constantValue !== 'number' || !(constantValue >= 0 && constantValue <= 1)) {
|
|
15
19
|
throw Error('Constant value must be between 0 and 1 but is ' + constantValue);
|
|
16
20
|
}
|
|
17
21
|
this.cValue = constantValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant.js","sourceRoot":"","sources":["../../src/curve/constant.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAEb,qCAAqC;AACrC,MAAa,QAAQ;IACF,MAAM,CAAS;IAEhC;;;;;OAKG;IACH,YAAY,aAAqB;QAC/B,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"constant.js","sourceRoot":"","sources":["../../src/curve/constant.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAEb,qCAAqC;AACrC,MAAa,QAAQ;IACF,MAAM,CAAS;IAEhC;;;;;OAKG;IACH,YAAY,aAAqB;QAC/B,4EAA4E;QAC5E,6EAA6E;QAC7E,8EAA8E;QAC9E,uEAAuE;QACvE,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC;YACrF,MAAM,KAAK,CAAC,gDAAgD,GAAG,aAAa,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;IAC9B,CAAC;IACD;;;OAGG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AA1BD,4BA0BC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzy-function.d.ts","sourceRoot":"","sources":["../../src/curve/fuzzy-function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,0CAA0C;AAC1C,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA0B;IAE7C;;;OAGG;gBACS,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM;IAGvC;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"fuzzy-function.d.ts","sourceRoot":"","sources":["../../src/curve/fuzzy-function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,0CAA0C;AAC1C,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA0B;IAE7C;;;OAGG;gBACS,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM;IAGvC;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAU7B"}
|
|
@@ -17,7 +17,10 @@ class FuzzyFunction {
|
|
|
17
17
|
*/
|
|
18
18
|
fuzzify(val) {
|
|
19
19
|
const res = this.cb(val);
|
|
20
|
-
|
|
20
|
+
// The relational checks coerce their operands, so a non-number (string,
|
|
21
|
+
// boolean, null, array) could pass `res >= 0 && res <= 1` and be returned
|
|
22
|
+
// verbatim, breaking the `number` contract. Require an actual number.
|
|
23
|
+
if (typeof res === 'number' && res >= 0 && res <= 1) {
|
|
21
24
|
return res;
|
|
22
25
|
}
|
|
23
26
|
throw Error('fuzzified result must be between 0 and 1 but is ' + res);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzy-function.js","sourceRoot":"","sources":["../../src/curve/fuzzy-function.ts"],"names":[],"mappings":";;;AACA,0CAA0C;AAC1C,MAAa,aAAa;IACP,EAAE,CAA0B;IAE7C;;;OAGG;IACH,YAAY,EAA2B;QACrC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IACD;;;OAGG;IACH,OAAO,CAAC,GAAW;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"fuzzy-function.js","sourceRoot":"","sources":["../../src/curve/fuzzy-function.ts"],"names":[],"mappings":";;;AACA,0CAA0C;AAC1C,MAAa,aAAa;IACP,EAAE,CAA0B;IAE7C;;;OAGG;IACH,YAAY,EAA2B;QACrC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IACD;;;OAGG;IACH,OAAO,CAAC,GAAW;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACzB,wEAAwE;QACxE,0EAA0E;QAC1E,sEAAsE;QACtE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACpD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,KAAK,CAAC,kDAAkD,GAAG,GAAG,CAAC,CAAC;IACxE,CAAC;CACF;AAxBD,sCAwBC"}
|
package/lib/curve/grade.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grade.d.ts","sourceRoot":"","sources":["../../src/curve/grade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC;;;;GAIG;AACH,qBAAa,KAAM,SAAQ,KAAK;IAC9B;;;;OAIG;gBACS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"grade.d.ts","sourceRoot":"","sources":["../../src/curve/grade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC;;;;GAIG;AACH,qBAAa,KAAM,SAAQ,KAAK;IAC9B;;;;OAIG;gBACS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAuBlC;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CA2B7B"}
|
package/lib/curve/grade.js
CHANGED
|
@@ -15,6 +15,26 @@ class Grade extends shape_1.Shape {
|
|
|
15
15
|
*/
|
|
16
16
|
constructor(x0, x1) {
|
|
17
17
|
super(x0, x1, x1, x1);
|
|
18
|
+
// Coordinates must be finite. A non-finite bound (Infinity/NaN) drives the
|
|
19
|
+
// interior ramp into Inf/Inf or NaN arithmetic and returns NaN, violating the
|
|
20
|
+
// documented 0..1 contract. (An earlier comment claimed non-finite bounds were
|
|
21
|
+
// "relied on for open-ended shapes"; they never produced a valid membership —
|
|
22
|
+
// see findings.md F1.)
|
|
23
|
+
if (!Number.isFinite(x0) || !Number.isFinite(x1)) {
|
|
24
|
+
throw Error('Grade requires finite coordinates but got x0=' + x0 + ', x1=' + x1);
|
|
25
|
+
}
|
|
26
|
+
// The coordinates are finite but their span can still overflow to Infinity
|
|
27
|
+
// (e.g. x0=-1e308, x1=1e308). The ramp then divides by Infinity and collapses
|
|
28
|
+
// to 0/NaN across the whole interior, so reject a non-finite span (findings.md F2).
|
|
29
|
+
if (!Number.isFinite(x1 - x0)) {
|
|
30
|
+
throw Error('Grade span x1 - x0 overflows to a non-finite value: x0=' + x0 + ', x1=' + x1);
|
|
31
|
+
}
|
|
32
|
+
// Reject reversed params: with x0 > x1 the `x <= x0` guard swallows the whole
|
|
33
|
+
// interior, so the ramp collapses into a hard step and the linear branch
|
|
34
|
+
// becomes dead code.
|
|
35
|
+
if (x0 > x1) {
|
|
36
|
+
throw Error('Grade requires x0 <= x1 but got x0=' + x0 + ', x1=' + x1);
|
|
37
|
+
}
|
|
18
38
|
}
|
|
19
39
|
/**
|
|
20
40
|
* Fuzzify
|
|
@@ -24,6 +44,9 @@ class Grade extends shape_1.Shape {
|
|
|
24
44
|
fuzzify(val) {
|
|
25
45
|
let result = 0;
|
|
26
46
|
const x = val;
|
|
47
|
+
// NaN has no meaningful membership; treat it as outside the ramp (0).
|
|
48
|
+
if (Number.isNaN(x))
|
|
49
|
+
return 0;
|
|
27
50
|
// Handle case where x0 = x1 (vertical grade/step function).
|
|
28
51
|
// Treat it as the limit of the ramp: the foot at x0 is 0, like the normal
|
|
29
52
|
// grade below, so behaviour stays continuous as x1 approaches x0.
|
|
@@ -39,7 +62,10 @@ class Grade extends shape_1.Shape {
|
|
|
39
62
|
result = 1;
|
|
40
63
|
}
|
|
41
64
|
else {
|
|
42
|
-
|
|
65
|
+
// Algebraically equal to x/(x1-x0) - x0/(x1-x0) but numerically stable:
|
|
66
|
+
// the split form subtracts two large nearly-equal quotients and loses
|
|
67
|
+
// significance for large coordinates (see Grade large-coordinate bug).
|
|
68
|
+
result = (x - this.x0) / (this.x1 - this.x0);
|
|
43
69
|
}
|
|
44
70
|
return result;
|
|
45
71
|
}
|
package/lib/curve/grade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grade.js","sourceRoot":"","sources":["../../src/curve/grade.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AACb,mCAAgC;AAChC;;;;GAIG;AACH,MAAa,KAAM,SAAQ,aAAK;IAC9B;;;;OAIG;IACH,YAAY,EAAU,EAAE,EAAU;QAChC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"grade.js","sourceRoot":"","sources":["../../src/curve/grade.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AACb,mCAAgC;AAChC;;;;GAIG;AACH,MAAa,KAAM,SAAQ,aAAK;IAC9B;;;;OAIG;IACH,YAAY,EAAU,EAAE,EAAU;QAChC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,2EAA2E;QAC3E,8EAA8E;QAC9E,+EAA+E;QAC/E,8EAA8E;QAC9E,uBAAuB;QACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACjD,MAAM,KAAK,CAAC,+CAA+C,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,2EAA2E;QAC3E,8EAA8E;QAC9E,oFAAoF;QACpF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC,yDAAyD,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,8EAA8E;QAC9E,yEAAyE;QACzE,qBAAqB;QACrB,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YACZ,MAAM,KAAK,CAAC,qCAAqC,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD;;;;OAIG;IACH,OAAO,CAAC,GAAW;QACjB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,CAAC,GAAG,GAAG,CAAC;QAEd,sEAAsE;QACtE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAE9B,4DAA4D;QAC5D,0EAA0E;QAC1E,kEAAkE;QAClE,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,CAAC,CAAC,SAAS;QACrB,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;aAAM,CAAC;YACN,wEAAwE;YACxE,sEAAsE;YACtE,uEAAuE;YACvE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA7DD,sBA6DC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reverse-grade.d.ts","sourceRoot":"","sources":["../../src/curve/reverse-grade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC;;;;OAIG;gBACS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"reverse-grade.d.ts","sourceRoot":"","sources":["../../src/curve/reverse-grade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC;;;;OAIG;gBACS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAoBlC;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAqB7B"}
|
|
@@ -15,6 +15,23 @@ class ReverseGrade extends shape_1.Shape {
|
|
|
15
15
|
*/
|
|
16
16
|
constructor(x0, x1) {
|
|
17
17
|
super(x0, x1, x1, x1);
|
|
18
|
+
// Coordinates must be finite: a non-finite bound (Infinity/NaN) drives the
|
|
19
|
+
// falling edge into Inf/Inf or NaN arithmetic and returns NaN, violating the
|
|
20
|
+
// documented 0..1 contract (see findings.md F1).
|
|
21
|
+
if (!Number.isFinite(x0) || !Number.isFinite(x1)) {
|
|
22
|
+
throw Error('ReverseGrade requires finite coordinates but got x0=' + x0 + ', x1=' + x1);
|
|
23
|
+
}
|
|
24
|
+
// Finite coordinates can still have a span that overflows to Infinity, which
|
|
25
|
+
// makes the falling edge collapse to 0/NaN across the interior; reject it
|
|
26
|
+
// (findings.md F2).
|
|
27
|
+
if (!Number.isFinite(x1 - x0)) {
|
|
28
|
+
throw Error('ReverseGrade span x1 - x0 overflows to a non-finite value: x0=' + x0 + ', x1=' + x1);
|
|
29
|
+
}
|
|
30
|
+
// Reject reversed params: with x0 > x1 the falling edge collapses into a hard
|
|
31
|
+
// step and the linear branch becomes dead code.
|
|
32
|
+
if (x0 > x1) {
|
|
33
|
+
throw Error('ReverseGrade requires x0 <= x1 but got x0=' + x0 + ', x1=' + x1);
|
|
34
|
+
}
|
|
18
35
|
}
|
|
19
36
|
/**
|
|
20
37
|
* Fuzzify
|
|
@@ -23,6 +40,9 @@ class ReverseGrade extends shape_1.Shape {
|
|
|
23
40
|
*/
|
|
24
41
|
fuzzify(val) {
|
|
25
42
|
const x = val;
|
|
43
|
+
// NaN has no meaningful membership; treat it as outside the ramp (0).
|
|
44
|
+
if (Number.isNaN(x))
|
|
45
|
+
return 0;
|
|
26
46
|
// Vertical reverse grade (x0 = x1): step down, the mirror of Grade.
|
|
27
47
|
// (The previous inline x0 === x1 handling sat in an unreachable branch:
|
|
28
48
|
// when x0 === x1 every value is caught by x <= x0 or x >= x1 first.)
|
|
@@ -35,7 +55,10 @@ class ReverseGrade extends shape_1.Shape {
|
|
|
35
55
|
return 1;
|
|
36
56
|
if (x >= this.x1)
|
|
37
57
|
return 0;
|
|
38
|
-
|
|
58
|
+
// Algebraically equal to -x/(x1-x0) + x1/(x1-x0) but numerically stable:
|
|
59
|
+
// the split form adds two large nearly-equal quotients and loses
|
|
60
|
+
// significance for large coordinates.
|
|
61
|
+
return (this.x1 - x) / (this.x1 - this.x0);
|
|
39
62
|
}
|
|
40
63
|
}
|
|
41
64
|
exports.ReverseGrade = ReverseGrade;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reverse-grade.js","sourceRoot":"","sources":["../../src/curve/reverse-grade.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AACb,mCAAgC;AAChC;;;;GAIG;AACH,MAAa,YAAa,SAAQ,aAAK;IACrC;;;;OAIG;IACH,YAAY,EAAU,EAAE,EAAU;QAChC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"reverse-grade.js","sourceRoot":"","sources":["../../src/curve/reverse-grade.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AACb,mCAAgC;AAChC;;;;GAIG;AACH,MAAa,YAAa,SAAQ,aAAK;IACrC;;;;OAIG;IACH,YAAY,EAAU,EAAE,EAAU;QAChC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,2EAA2E;QAC3E,6EAA6E;QAC7E,iDAAiD;QACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACjD,MAAM,KAAK,CAAC,sDAAsD,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,6EAA6E;QAC7E,0EAA0E;QAC1E,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC,gEAAgE,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,8EAA8E;QAC9E,gDAAgD;QAChD,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YACZ,MAAM,KAAK,CAAC,4CAA4C,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IACD;;;;OAIG;IACH,OAAO,CAAC,GAAW;QACjB,MAAM,CAAC,GAAG,GAAG,CAAC;QAEd,sEAAsE;QACtE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAE9B,oEAAoE;QACpE,wEAAwE;QACxE,qEAAqE;QACrE,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,CAAC,CAAC,SAAS;QACrB,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC;QAC3B,yEAAyE;QACzE,iEAAiE;QACjE,sCAAsC;QACtC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;CACF;AApDD,oCAoDC"}
|
package/lib/curve/shape.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../../src/curve/shape.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,uCAAuC;AACvC,8BAAsB,KAAM,YAAW,SAAS;IAC9C,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IAErB;;;;;;OAMG;gBACS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../../src/curve/shape.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,uCAAuC;AACvC,8BAAsB,KAAM,YAAW,SAAS;IAC9C,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IAErB;;;;;;OAMG;gBACS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IA8B1D;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CACtC"}
|
package/lib/curve/shape.js
CHANGED
|
@@ -15,22 +15,33 @@ class Shape {
|
|
|
15
15
|
* @param {number} x3 - x3
|
|
16
16
|
*/
|
|
17
17
|
constructor(x0, x1, x2, x3) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
18
|
+
// Define the coordinates as truly immutable: not writable AND not
|
|
19
|
+
// configurable, so they can't be reassigned, deleted or redefined. With
|
|
20
|
+
// useDefineForClassFields the field declarations above otherwise leave them
|
|
21
|
+
// configurable:true, letting `delete shape.x0` or a redefine defeat the
|
|
22
|
+
// read-only intent. They stay enumerable so they remain visible as the
|
|
23
|
+
// documented public properties (e.g. in JSON.stringify).
|
|
24
|
+
const coords = [
|
|
25
|
+
['x0', x0],
|
|
26
|
+
['x1', x1],
|
|
27
|
+
['x2', x2],
|
|
28
|
+
['x3', x3],
|
|
29
|
+
];
|
|
30
|
+
for (const [name, value] of coords) {
|
|
31
|
+
// Enforce the `readonly xN: number` field contract at runtime: a missing
|
|
32
|
+
// constructor argument (e.g. a 3-argument Trapezoid) would otherwise store
|
|
33
|
+
// `undefined` here and later produce NaN in fuzzify. Subclasses that accept
|
|
34
|
+
// fewer coordinates must resolve them to concrete numbers before super().
|
|
35
|
+
if (typeof value !== 'number') {
|
|
36
|
+
throw Error('Shape coordinate ' + name + ' must be a number but is ' + value);
|
|
37
|
+
}
|
|
38
|
+
Object.defineProperty(this, name, {
|
|
39
|
+
value,
|
|
40
|
+
writable: false,
|
|
41
|
+
enumerable: true,
|
|
42
|
+
configurable: false,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
34
45
|
}
|
|
35
46
|
}
|
|
36
47
|
exports.Shape = Shape;
|
package/lib/curve/shape.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/curve/shape.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAEb,uCAAuC;AACvC,MAAsB,KAAK;IAChB,EAAE,CAAU;IACZ,EAAE,CAAU;IACZ,EAAE,CAAU;IACZ,EAAE,CAAU;IAErB;;;;;;OAMG;IACH,YAAY,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;QACxD,MAAM,
|
|
1
|
+
{"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/curve/shape.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAEb,uCAAuC;AACvC,MAAsB,KAAK;IAChB,EAAE,CAAU;IACZ,EAAE,CAAU;IACZ,EAAE,CAAU;IACZ,EAAE,CAAU;IAErB;;;;;;OAMG;IACH,YAAY,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;QACxD,kEAAkE;QAClE,wEAAwE;QACxE,4EAA4E;QAC5E,wEAAwE;QACxE,uEAAuE;QACvE,yDAAyD;QACzD,MAAM,MAAM,GAA4B;YACtC,CAAC,IAAI,EAAE,EAAE,CAAC;YACV,CAAC,IAAI,EAAE,EAAE,CAAC;YACV,CAAC,IAAI,EAAE,EAAE,CAAC;YACV,CAAC,IAAI,EAAE,EAAE,CAAC;SACX,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACnC,yEAAyE;YACzE,2EAA2E;YAC3E,4EAA4E;YAC5E,0EAA0E;YAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC,mBAAmB,GAAG,IAAI,GAAG,2BAA2B,GAAG,KAAK,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE;gBAChC,KAAK;gBACL,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CAQF;AAjDD,sBAiDC"}
|
package/lib/curve/sigmoid.d.ts
CHANGED
|
@@ -3,18 +3,22 @@ import { Fuzzifier } from './fuzzifier';
|
|
|
3
3
|
* Class representing a Sigmoid.
|
|
4
4
|
* @example
|
|
5
5
|
* // long slope
|
|
6
|
-
* sigmoid = new Sigmoid(0, 100000);
|
|
7
|
-
*
|
|
6
|
+
* const sigmoid = new Sigmoid(0, 100000);
|
|
7
|
+
* sigmoid.fuzzify(10); // ~0.500025
|
|
8
8
|
*/
|
|
9
9
|
export declare class Sigmoid implements Fuzzifier {
|
|
10
10
|
private readonly center;
|
|
11
11
|
private readonly slope;
|
|
12
12
|
/**
|
|
13
13
|
* Create a Sigmoid Function.
|
|
14
|
-
* @param {number} center - The center point of the sigmoid curve (where it outputs 0.5)
|
|
14
|
+
* @param {number} center - The center point of the sigmoid curve (where it outputs 0.5).
|
|
15
|
+
* Must be finite.
|
|
15
16
|
* @param {number} slope - Width of the transition: it appears in the denominator
|
|
16
|
-
* as 1 / (1 + exp(-(x - center) / slope)), so a smaller
|
|
17
|
-
* transition and a larger
|
|
17
|
+
* as 1 / (1 + exp(-(x - center) / slope)), so a smaller magnitude means a steeper
|
|
18
|
+
* transition and a larger magnitude a gentler one. A **negative** slope inverts the
|
|
19
|
+
* curve into a decreasing S (high membership below the center, low above). A slope of
|
|
20
|
+
* `0` degenerates to an increasing step at the center (0.5 exactly at the center).
|
|
21
|
+
* Must be finite; non-finite center/slope throw.
|
|
18
22
|
*/
|
|
19
23
|
constructor(center?: number, slope?: number);
|
|
20
24
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sigmoid.d.ts","sourceRoot":"","sources":["../../src/curve/sigmoid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC;;;;;;GAMG;AACH,qBAAa,OAAQ,YAAW,SAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B
|
|
1
|
+
{"version":3,"file":"sigmoid.d.ts","sourceRoot":"","sources":["../../src/curve/sigmoid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC;;;;;;GAMG;AACH,qBAAa,OAAQ,YAAW,SAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B;;;;;;;;;;OAUG;gBACS,MAAM,GAAE,MAAU,EAAE,KAAK,GAAE,MAAU;IAajD;;;;OAIG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAW3B"}
|
package/lib/curve/sigmoid.js
CHANGED
|
@@ -5,20 +5,33 @@ exports.Sigmoid = void 0;
|
|
|
5
5
|
* Class representing a Sigmoid.
|
|
6
6
|
* @example
|
|
7
7
|
* // long slope
|
|
8
|
-
* sigmoid = new Sigmoid(0, 100000);
|
|
9
|
-
*
|
|
8
|
+
* const sigmoid = new Sigmoid(0, 100000);
|
|
9
|
+
* sigmoid.fuzzify(10); // ~0.500025
|
|
10
10
|
*/
|
|
11
11
|
class Sigmoid {
|
|
12
12
|
center;
|
|
13
13
|
slope;
|
|
14
14
|
/**
|
|
15
15
|
* Create a Sigmoid Function.
|
|
16
|
-
* @param {number} center - The center point of the sigmoid curve (where it outputs 0.5)
|
|
16
|
+
* @param {number} center - The center point of the sigmoid curve (where it outputs 0.5).
|
|
17
|
+
* Must be finite.
|
|
17
18
|
* @param {number} slope - Width of the transition: it appears in the denominator
|
|
18
|
-
* as 1 / (1 + exp(-(x - center) / slope)), so a smaller
|
|
19
|
-
* transition and a larger
|
|
19
|
+
* as 1 / (1 + exp(-(x - center) / slope)), so a smaller magnitude means a steeper
|
|
20
|
+
* transition and a larger magnitude a gentler one. A **negative** slope inverts the
|
|
21
|
+
* curve into a decreasing S (high membership below the center, low above). A slope of
|
|
22
|
+
* `0` degenerates to an increasing step at the center (0.5 exactly at the center).
|
|
23
|
+
* Must be finite; non-finite center/slope throw.
|
|
20
24
|
*/
|
|
21
25
|
constructor(center = 0, slope = 1) {
|
|
26
|
+
// Validate up front (like Constant/FuzzyFunction): a non-finite center or
|
|
27
|
+
// slope makes fuzzify return NaN, breaking the documented 0..1 contract and
|
|
28
|
+
// making defuzzify report no winner ('none') for an otherwise valid rule.
|
|
29
|
+
if (!Number.isFinite(center)) {
|
|
30
|
+
throw Error('Sigmoid center must be a finite number but is ' + center);
|
|
31
|
+
}
|
|
32
|
+
if (!Number.isFinite(slope)) {
|
|
33
|
+
throw Error('Sigmoid slope must be a finite number but is ' + slope);
|
|
34
|
+
}
|
|
22
35
|
this.center = center;
|
|
23
36
|
this.slope = slope;
|
|
24
37
|
}
|
|
@@ -28,6 +41,9 @@ class Sigmoid {
|
|
|
28
41
|
* @return {number} fuzzy output 0..1
|
|
29
42
|
*/
|
|
30
43
|
fuzzify(x) {
|
|
44
|
+
// NaN has no meaningful membership; treat it as 0 instead of returning NaN.
|
|
45
|
+
if (Number.isNaN(x))
|
|
46
|
+
return 0;
|
|
31
47
|
if (this.slope === 0) {
|
|
32
48
|
// When slope is 0, sigmoid becomes a step function
|
|
33
49
|
if (x < this.center)
|
package/lib/curve/sigmoid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sigmoid.js","sourceRoot":"","sources":["../../src/curve/sigmoid.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAEb;;;;;;GAMG;AACH,MAAa,OAAO;IACD,MAAM,CAAS;IACf,KAAK,CAAS;IAE/B
|
|
1
|
+
{"version":3,"file":"sigmoid.js","sourceRoot":"","sources":["../../src/curve/sigmoid.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAEb;;;;;;GAMG;AACH,MAAa,OAAO;IACD,MAAM,CAAS;IACf,KAAK,CAAS;IAE/B;;;;;;;;;;OAUG;IACH,YAAY,SAAiB,CAAC,EAAE,QAAgB,CAAC;QAC/C,0EAA0E;QAC1E,4EAA4E;QAC5E,0EAA0E;QAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,CAAC,gDAAgD,GAAG,MAAM,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,CAAC,+CAA+C,GAAG,KAAK,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IACD;;;;OAIG;IACH,OAAO,CAAC,CAAS;QACf,4EAA4E;QAC5E,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACrB,mDAAmD;YACnD,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,CAAC;YAC9B,OAAO,GAAG,CAAC,CAAC,kBAAkB;QAChC,CAAC;QACD,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC;CACF;AA5CD,0BA4CC"}
|
package/lib/curve/trapezoid.d.ts
CHANGED
|
@@ -5,6 +5,14 @@ import { Shape } from './shape';
|
|
|
5
5
|
* new Trapezoid(0, 10, 15, 20)
|
|
6
6
|
*/
|
|
7
7
|
export declare class Trapezoid extends Shape {
|
|
8
|
+
/**
|
|
9
|
+
* Create a Trapezoid.
|
|
10
|
+
* @param {number} x0 - left foot (membership 0)
|
|
11
|
+
* @param {number} x1 - start of the plateau (membership 1)
|
|
12
|
+
* @param {number} x2 - end of the plateau (membership 1)
|
|
13
|
+
* @param {number} x3 - right foot (membership 0)
|
|
14
|
+
*/
|
|
15
|
+
constructor(x0: number, x1: number, x2: number, x3?: number);
|
|
8
16
|
/**
|
|
9
17
|
* Fuzzify
|
|
10
18
|
* @param {number} val - Point on X axis
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trapezoid.d.ts","sourceRoot":"","sources":["../../src/curve/trapezoid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"trapezoid.d.ts","sourceRoot":"","sources":["../../src/curve/trapezoid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC;;;;;;OAMG;gBACS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM;IAuC3D;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CA4C7B"}
|
package/lib/curve/trapezoid.js
CHANGED
|
@@ -8,6 +8,44 @@ const shape_1 = require("./shape");
|
|
|
8
8
|
* new Trapezoid(0, 10, 15, 20)
|
|
9
9
|
*/
|
|
10
10
|
class Trapezoid extends shape_1.Shape {
|
|
11
|
+
/**
|
|
12
|
+
* Create a Trapezoid.
|
|
13
|
+
* @param {number} x0 - left foot (membership 0)
|
|
14
|
+
* @param {number} x1 - start of the plateau (membership 1)
|
|
15
|
+
* @param {number} x2 - end of the plateau (membership 1)
|
|
16
|
+
* @param {number} x3 - right foot (membership 0)
|
|
17
|
+
*/
|
|
18
|
+
constructor(x0, x1, x2, x3) {
|
|
19
|
+
// 3-argument form: collapse the right foot onto the plateau end (x3 = x2),
|
|
20
|
+
// the same way Triangle/Grade fill their trailing coordinates. This keeps the
|
|
21
|
+
// `readonly x3: number` contract honest (x3 is always a concrete number) so
|
|
22
|
+
// the falling edge can never divide by `undefined` and return NaN.
|
|
23
|
+
const x3r = x3 === undefined ? x2 : x3;
|
|
24
|
+
super(x0, x1, x2, x3r);
|
|
25
|
+
// Coordinates must be finite: a non-finite bound (e.g. x3=Infinity) makes the
|
|
26
|
+
// adjacent edge compute Inf/Inf = NaN for finite inputs, violating the
|
|
27
|
+
// documented 0..1 contract (see findings.md F1).
|
|
28
|
+
if (!Number.isFinite(x0) ||
|
|
29
|
+
!Number.isFinite(x1) ||
|
|
30
|
+
!Number.isFinite(x2) ||
|
|
31
|
+
!Number.isFinite(x3r)) {
|
|
32
|
+
throw Error('Trapezoid requires finite coordinates but got x0=' +
|
|
33
|
+
x0 + ', x1=' + x1 + ', x2=' + x2 + ', x3=' + x3r);
|
|
34
|
+
}
|
|
35
|
+
// Finite coordinates can still have edge spans that overflow to Infinity,
|
|
36
|
+
// making that edge collapse to 0/NaN; reject a non-finite span (findings.md F2).
|
|
37
|
+
if (!Number.isFinite(x1 - x0) || !Number.isFinite(x3r - x2)) {
|
|
38
|
+
throw Error('Trapezoid edge span overflows to a non-finite value: x0=' +
|
|
39
|
+
x0 + ', x1=' + x1 + ', x2=' + x2 + ', x3=' + x3r);
|
|
40
|
+
}
|
|
41
|
+
// Reject out-of-order params. In particular an inverted plateau (x1 > x2)
|
|
42
|
+
// makes the plateau branch unsatisfiable, so the curve never reaches
|
|
43
|
+
// membership 1 and develops a discontinuity.
|
|
44
|
+
if (!(x0 <= x1 && x1 <= x2 && x2 <= x3r)) {
|
|
45
|
+
throw Error('Trapezoid requires x0 <= x1 <= x2 <= x3 but got x0=' +
|
|
46
|
+
x0 + ', x1=' + x1 + ', x2=' + x2 + ', x3=' + x3r);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
11
49
|
/**
|
|
12
50
|
* Fuzzify
|
|
13
51
|
* @param {number} val - Point on X axis
|
|
@@ -16,6 +54,10 @@ class Trapezoid extends shape_1.Shape {
|
|
|
16
54
|
fuzzify(val) {
|
|
17
55
|
let result = 0;
|
|
18
56
|
const x = val;
|
|
57
|
+
// NaN has no meaningful membership; treat it as outside the support (0)
|
|
58
|
+
// instead of letting it propagate through the edge arithmetic.
|
|
59
|
+
if (Number.isNaN(x))
|
|
60
|
+
return 0;
|
|
19
61
|
// Special case: all points equal (spike at single point)
|
|
20
62
|
if (this.x0 === this.x1 && this.x1 === this.x2 && this.x2 === this.x3) {
|
|
21
63
|
return x === this.x0 ? 1 : 0;
|
|
@@ -30,32 +72,30 @@ class Trapezoid extends shape_1.Shape {
|
|
|
30
72
|
return 0;
|
|
31
73
|
return 0;
|
|
32
74
|
}
|
|
33
|
-
if (x <= this.
|
|
75
|
+
if (x >= this.x1 && x <= this.x2) {
|
|
76
|
+
// Plateau, corners included. When a single edge is vertical (x0===x1 or
|
|
77
|
+
// x2===x3) the corner must read 1 — consistent with the rectangle case
|
|
78
|
+
// above and with Triangle. Evaluating the plateau before the x<=x0 / x>=x3
|
|
79
|
+
// zero guards is what makes those corners correct instead of dropping to 0.
|
|
80
|
+
result = 1;
|
|
81
|
+
}
|
|
82
|
+
else if (x <= this.x0) {
|
|
34
83
|
result = 0;
|
|
35
84
|
}
|
|
36
85
|
else if (x >= this.x3) {
|
|
37
86
|
result = 0;
|
|
38
87
|
}
|
|
39
|
-
else if (x >= this.x1 && x <= this.x2) {
|
|
40
|
-
result = 1;
|
|
41
|
-
}
|
|
42
88
|
else if (x > this.x0 && x < this.x1) {
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
result = x / (this.x1 - this.x0) - this.x0 / (this.x1 - this.x0);
|
|
49
|
-
}
|
|
89
|
+
// Rising edge — only reached when x0 < x1, so the divisor is never 0.
|
|
90
|
+
// Stable form (x - x0)/(x1 - x0), matching Grade/Triangle. The split form
|
|
91
|
+
// x/(x1-x0) - x0/(x1-x0) subtracts two large nearly-equal quotients and
|
|
92
|
+
// loses significance for large coordinates (findings.md F3).
|
|
93
|
+
result = (x - this.x0) / (this.x1 - this.x0);
|
|
50
94
|
}
|
|
51
95
|
else {
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
result = -x / (this.x3 - this.x2) + this.x3 / (this.x3 - this.x2);
|
|
58
|
-
}
|
|
96
|
+
// Falling edge — only reached when x2 < x3, so the divisor is never 0.
|
|
97
|
+
// Stable form (x3 - x)/(x3 - x2), matching Grade/Triangle.
|
|
98
|
+
result = (this.x3 - x) / (this.x3 - this.x2);
|
|
59
99
|
}
|
|
60
100
|
return result;
|
|
61
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trapezoid.js","sourceRoot":"","sources":["../../src/curve/trapezoid.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AACb,mCAAgC;AAChC;;;;GAIG;AACH,MAAa,SAAU,SAAQ,aAAK;IAClC;;;;OAIG;IACH,OAAO,CAAC,GAAW;QACjB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,CAAC,GAAG,GAAG,CAAC;QAEd,yDAAyD;QACzD,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACtE,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"trapezoid.js","sourceRoot":"","sources":["../../src/curve/trapezoid.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triangle.d.ts","sourceRoot":"","sources":["../../src/curve/triangle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC;;;;;OAKG;gBACS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"triangle.d.ts","sourceRoot":"","sources":["../../src/curve/triangle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC;;;;;OAKG;gBACS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IA2B9C;;;;OAIG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAwC3B"}
|
package/lib/curve/triangle.js
CHANGED
|
@@ -16,6 +16,24 @@ class Triangle extends shape_1.Shape {
|
|
|
16
16
|
*/
|
|
17
17
|
constructor(x0, x1, x2) {
|
|
18
18
|
super(x0, x1, x2, x2);
|
|
19
|
+
// Coordinates must be finite: an infinite base (e.g. x2=Infinity) makes the
|
|
20
|
+
// adjacent edge compute Inf/Inf = NaN for finite inputs, violating the
|
|
21
|
+
// documented 0..1 contract. (An earlier comment claimed non-finite bounds were
|
|
22
|
+
// "relied on for open-ended shapes"; they never worked — see findings.md F1.)
|
|
23
|
+
if (!Number.isFinite(x0) || !Number.isFinite(x1) || !Number.isFinite(x2)) {
|
|
24
|
+
throw Error('Triangle requires finite coordinates but got x0=' + x0 + ', x1=' + x1 + ', x2=' + x2);
|
|
25
|
+
}
|
|
26
|
+
// Finite coordinates can still have edge spans that overflow to Infinity,
|
|
27
|
+
// making that edge collapse to 0/NaN; reject a non-finite span (findings.md F2).
|
|
28
|
+
if (!Number.isFinite(x1 - x0) || !Number.isFinite(x2 - x1)) {
|
|
29
|
+
throw Error('Triangle edge span overflows to a non-finite value: x0=' + x0 + ', x1=' + x1 + ', x2=' + x2);
|
|
30
|
+
}
|
|
31
|
+
// Reject out-of-order params. With x0 > x1 or x1 > x2 the branch guards make
|
|
32
|
+
// whole edges unreachable, so the peak (x1) never reaches 1 and the curve is
|
|
33
|
+
// discontinuous or collapses to the empty set.
|
|
34
|
+
if (!(x0 <= x1 && x1 <= x2)) {
|
|
35
|
+
throw Error('Triangle requires x0 <= x1 <= x2 but got x0=' + x0 + ', x1=' + x1 + ', x2=' + x2);
|
|
36
|
+
}
|
|
19
37
|
}
|
|
20
38
|
/**
|
|
21
39
|
* Fuzzify
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triangle.js","sourceRoot":"","sources":["../../src/curve/triangle.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AACb,mCAAgC;AAChC;;;;GAIG;AACH,MAAa,QAAS,SAAQ,aAAK;IACjC;;;;;OAKG;IACH,YAAY,EAAU,EAAE,EAAU,EAAE,EAAU;QAC5C,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"triangle.js","sourceRoot":"","sources":["../../src/curve/triangle.ts"],"names":[],"mappings":"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"}
|
package/lib/logic.d.ts
CHANGED
|
@@ -30,8 +30,10 @@ export declare class Logic {
|
|
|
30
30
|
private checkInitCalled;
|
|
31
31
|
private checkOutputName;
|
|
32
32
|
/**
|
|
33
|
-
* Registers
|
|
34
|
-
* {@link not} or {@link defuzzify}.
|
|
33
|
+
* Registers a rule and marks the logic chain as started; one `init` call must
|
|
34
|
+
* precede {@link and}, {@link or}, {@link not} or {@link defuzzify}. It may be
|
|
35
|
+
* called more than once — a later `init` just adds another rule that starts a
|
|
36
|
+
* fresh membership, which is the same effect as {@link or}.
|
|
35
37
|
*
|
|
36
38
|
* Rule composition is sequential and order-dependent: at {@link defuzzify}
|
|
37
39
|
* time each rule's membership is folded into a single value that is carried
|
package/lib/logic.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AA8B1C,qCAAqC;AACrC,qBAAa,KAAK;IAChB,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAc;IAE3B;;;;OAIG;IACI,CAAC,EAAE;QACR,KAAK,EAAE,OAAO,KAAK,CAAC;QACpB,KAAK,EAAE,OAAO,KAAK,CAAC;QACpB,YAAY,EAAE,OAAO,YAAY,CAAC;QAClC,SAAS,EAAE,OAAO,SAAS,CAAC;QAC5B,QAAQ,EAAE,OAAO,QAAQ,CAAC;QAC1B,QAAQ,EAAE,OAAO,QAAQ,CAAC;QAC1B,aAAa,EAAE,OAAO,aAAa,CAAC;QACpC,OAAO,EAAE,OAAO,OAAO,CAAC;KACzB,CAAC;;IAeF,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AA8B1C,qCAAqC;AACrC,qBAAa,KAAK;IAChB,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAc;IAE3B;;;;OAIG;IACI,CAAC,EAAE;QACR,KAAK,EAAE,OAAO,KAAK,CAAC;QACpB,KAAK,EAAE,OAAO,KAAK,CAAC;QACpB,YAAY,EAAE,OAAO,YAAY,CAAC;QAClC,SAAS,EAAE,OAAO,SAAS,CAAC;QAC5B,QAAQ,EAAE,OAAO,QAAQ,CAAC;QAC1B,QAAQ,EAAE,OAAO,QAAQ,CAAC;QAC1B,aAAa,EAAE,OAAO,aAAa,CAAC;QACpC,OAAO,EAAE,OAAO,OAAO,CAAC;KACzB,CAAC;;IAeF,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAsBvB;;;;;;;;;;;;;OAaG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAQ5C;;;;;;;;OAQG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAQ3C;;;;;;;OAOG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAQ1C;;;;;;OAMG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAQ3C;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,eAAe;CA2E7D;AAED,yBAAiB,KAAK,CAAC;IACrB,KAAY,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;IAErD,UAAiB,IAAI;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,SAAS,CAAC;QACjB,IAAI,EAAE,QAAQ,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAED,UAAiB,eAAe;QAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,IAAI,EAAE,CAAC;QACd,OAAO,IAAI,MAAM,CAAC;QAClB,QAAQ,IAAI,MAAM,CAAC;KACpB;CACF"}
|
package/lib/logic.js
CHANGED
|
@@ -60,17 +60,29 @@ class Logic {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
checkOutputName(name) {
|
|
63
|
+
// ASCII letters only — the keys end up as boon-js identifiers, which are
|
|
64
|
+
// not Unicode-aware, so non-ASCII letters (e.g. "ÜberHeiss") are rejected
|
|
65
|
+
// by design rather than silently producing an unusable boon-js input.
|
|
63
66
|
const reg = /^[a-z]+$/i;
|
|
64
67
|
if (!reg.test(name)) {
|
|
65
|
-
throw Error('Output names can only be strings without space, without numbers and without special chars');
|
|
68
|
+
throw Error('Output names can only be strings without space, without numbers and without special chars (ASCII letters a-z only)');
|
|
69
|
+
}
|
|
70
|
+
// 'none' is the sentinel defuzzify() returns when no rule fires. A real output
|
|
71
|
+
// with that name collides with the sentinel, so a non-firing rule named 'none'
|
|
72
|
+
// is falsely reported as the winner in boonJsInputs (findings.md F6). Reserve
|
|
73
|
+
// it, case-insensitively, so the no-winner signal stays unambiguous.
|
|
74
|
+
if (name.toLowerCase() === 'none') {
|
|
75
|
+
throw Error('Output name "none" is reserved (it is the no-winner sentinel)');
|
|
66
76
|
}
|
|
67
77
|
if (this.rules.some((rule) => rule.output === name)) {
|
|
68
78
|
throw Error('Output name "' + name + '" is already in use');
|
|
69
79
|
}
|
|
70
80
|
}
|
|
71
81
|
/**
|
|
72
|
-
* Registers
|
|
73
|
-
* {@link not} or {@link defuzzify}.
|
|
82
|
+
* Registers a rule and marks the logic chain as started; one `init` call must
|
|
83
|
+
* precede {@link and}, {@link or}, {@link not} or {@link defuzzify}. It may be
|
|
84
|
+
* called more than once — a later `init` just adds another rule that starts a
|
|
85
|
+
* fresh membership, which is the same effect as {@link or}.
|
|
74
86
|
*
|
|
75
87
|
* Rule composition is sequential and order-dependent: at {@link defuzzify}
|
|
76
88
|
* time each rule's membership is folded into a single value that is carried
|
|
@@ -151,13 +163,30 @@ class Logic {
|
|
|
151
163
|
this.checkInitCalled();
|
|
152
164
|
let defuzzified = 'none';
|
|
153
165
|
let fuzzified = 0;
|
|
154
|
-
|
|
166
|
+
// Seed at 0, not -Infinity: a rule only wins with membership strictly above
|
|
167
|
+
// 0. When no rule fires (every membership is 0) there is genuinely no winner,
|
|
168
|
+
// so 'none' is returned instead of the first rule being reported with a
|
|
169
|
+
// membership of 0 (which also kept its boonJsInputs entry wrongly true).
|
|
170
|
+
let best = 0;
|
|
155
171
|
// membership carried along the chain, used by AND to narrow the result
|
|
156
172
|
let running = 0;
|
|
173
|
+
// Defend against fuzzifiers that violate the 0..1 contract: clamp the raw
|
|
174
|
+
// value (and map NaN to 0) before composing. Otherwise a rogue shape — or
|
|
175
|
+
// `not` computing 1 - raw on it — could make the winner's fuzzified value
|
|
176
|
+
// fall outside 0..1.
|
|
177
|
+
const clamp = (v) => Number.isNaN(v) ? 0 : Math.min(1, Math.max(0, v));
|
|
178
|
+
// Return an isolated, frozen copy of a shape so the caller cannot reach back
|
|
179
|
+
// into the engine's internal fuzzifier and mutate it (which would silently
|
|
180
|
+
// change later evaluations — findings.md F7). Keeps the prototype so
|
|
181
|
+
// `shape.fuzzify` still works, and copies own coordinates for Shape curves.
|
|
182
|
+
const isolateShape = (shape) => {
|
|
183
|
+
const copy = Object.assign(Object.create(Object.getPrototypeOf(shape)), shape);
|
|
184
|
+
return Object.freeze(copy);
|
|
185
|
+
};
|
|
157
186
|
// Evaluate into fresh rule copies so the engine's internal state is never
|
|
158
187
|
// mutated or handed out to the caller.
|
|
159
188
|
const rules = this.rules.map((rule) => {
|
|
160
|
-
const raw = rule.shape.fuzzify(value);
|
|
189
|
+
const raw = clamp(rule.shape.fuzzify(value));
|
|
161
190
|
const membership = ruleEngine[rule.type](running, raw);
|
|
162
191
|
running = membership;
|
|
163
192
|
// max-membership defuzzification: highest membership wins, ties keep
|
|
@@ -167,10 +196,16 @@ class Logic {
|
|
|
167
196
|
defuzzified = rule.output;
|
|
168
197
|
fuzzified = membership;
|
|
169
198
|
}
|
|
170
|
-
return { ...rule, fuzzy: membership };
|
|
199
|
+
return { ...rule, shape: isolateShape(rule.shape), fuzzy: membership };
|
|
171
200
|
});
|
|
172
201
|
let namePrefix = '';
|
|
173
|
-
if (as
|
|
202
|
+
if (as) {
|
|
203
|
+
// Validate the namespace prefix with the same rule as output names, so it
|
|
204
|
+
// can't inject spaces, dots or other characters into the boonJsInputs keys
|
|
205
|
+
// (which are meant to be valid boon-js identifiers).
|
|
206
|
+
if (typeof as !== 'string' || !/^[a-z]+$/i.test(as)) {
|
|
207
|
+
throw Error('The "as" namespace prefix can only be letters without space, without numbers and without special chars');
|
|
208
|
+
}
|
|
174
209
|
namePrefix = as + '.';
|
|
175
210
|
}
|
|
176
211
|
const boonJsInputs = {};
|
package/lib/logic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AACb,yCAAsC;AAEtC,yCAAsC;AACtC,yDAAqD;AACrD,+CAA4C;AAC5C,iDAA8C;AAC9C,+CAA4C;AAC5C,2DAAuD;AACvD,6CAA0C;AAE1C,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,QAAQ,GAAG,KAAK,CAAC;AACvB,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,QAAQ,GAAG,KAAK,CAAC;AAKvB;;;;GAIG;AACH,MAAM,UAAU,GAAkE;IAChF,IAAI,CAAC,KAAa,EAAE,GAAW;QAC7B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,EAAE,CAAC,KAAa,EAAE,GAAW;QAC3B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,GAAG,CAAC,IAAY,EAAE,GAAW;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,GAAG,CAAC,KAAa,EAAE,GAAW;QAC5B,OAAO,CAAC,GAAG,GAAG,CAAC;IACjB,CAAC;CACF,CAAC;AAEF,qCAAqC;AACrC,MAAa,KAAK;IACR,UAAU,GAAY,KAAK,CAAC;IAC5B,KAAK,GAAW,EAAE,CAAC;IAE3B;;;;OAIG;IACI,CAAC,CASN;IAEF;QACE,IAAI,CAAC,CAAC,GAAG;YACP,KAAK,EAAL,aAAK;YACL,KAAK,EAAL,aAAK;YACL,YAAY,EAAZ,4BAAY;YACZ,SAAS,EAAT,qBAAS;YACT,QAAQ,EAAR,mBAAQ;YACR,QAAQ,EAAR,mBAAQ;YACR,aAAa,EAAb,8BAAa;YACb,OAAO,EAAP,iBAAO;SACR,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,IAAY;QAClC,MAAM,GAAG,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,KAAK,CACT,
|
|
1
|
+
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AACb,yCAAsC;AAEtC,yCAAsC;AACtC,yDAAqD;AACrD,+CAA4C;AAC5C,iDAA8C;AAC9C,+CAA4C;AAC5C,2DAAuD;AACvD,6CAA0C;AAE1C,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,QAAQ,GAAG,KAAK,CAAC;AACvB,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,QAAQ,GAAG,KAAK,CAAC;AAKvB;;;;GAIG;AACH,MAAM,UAAU,GAAkE;IAChF,IAAI,CAAC,KAAa,EAAE,GAAW;QAC7B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,EAAE,CAAC,KAAa,EAAE,GAAW;QAC3B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,GAAG,CAAC,IAAY,EAAE,GAAW;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,GAAG,CAAC,KAAa,EAAE,GAAW;QAC5B,OAAO,CAAC,GAAG,GAAG,CAAC;IACjB,CAAC;CACF,CAAC;AAEF,qCAAqC;AACrC,MAAa,KAAK;IACR,UAAU,GAAY,KAAK,CAAC;IAC5B,KAAK,GAAW,EAAE,CAAC;IAE3B;;;;OAIG;IACI,CAAC,CASN;IAEF;QACE,IAAI,CAAC,CAAC,GAAG;YACP,KAAK,EAAL,aAAK;YACL,KAAK,EAAL,aAAK;YACL,YAAY,EAAZ,4BAAY;YACZ,SAAS,EAAT,qBAAS;YACT,QAAQ,EAAR,mBAAQ;YACR,QAAQ,EAAR,mBAAQ;YACR,aAAa,EAAb,8BAAa;YACb,OAAO,EAAP,iBAAO;SACR,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,IAAY;QAClC,yEAAyE;QACzE,0EAA0E;QAC1E,sEAAsE;QACtE,MAAM,GAAG,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,KAAK,CACT,oHAAoH,CACrH,CAAC;QACJ,CAAC;QACD,+EAA+E;QAC/E,+EAA+E;QAC/E,8EAA8E;QAC9E,qEAAqE;QACrE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,CAAC,eAAe,GAAG,IAAI,GAAG,qBAAqB,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,IAAI,CAAC,MAAc,EAAE,KAAgB;QACnC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,MAAM,IAAI,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,GAAG,CAAC,MAAc,EAAE,KAAgB;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,EAAE,CAAC,MAAc,EAAE,KAAgB;QACjC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,MAAc,EAAE,KAAgB;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,KAAa,EAAE,EAAW;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,WAAW,GAAG,MAAM,CAAC;QACzB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,4EAA4E;QAC5E,8EAA8E;QAC9E,wEAAwE;QACxE,yEAAyE;QACzE,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,uEAAuE;QACvE,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,0EAA0E;QAC1E,0EAA0E;QAC1E,0EAA0E;QAC1E,qBAAqB;QACrB,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAClC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpD,6EAA6E;QAC7E,2EAA2E;QAC3E,qEAAqE;QACrE,4EAA4E;QAC5E,MAAM,YAAY,GAAG,CAAC,KAAgB,EAAa,EAAE;YACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC/E,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,0EAA0E;QAC1E,uCAAuC;QACvC,MAAM,KAAK,GAAW,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACvD,OAAO,GAAG,UAAU,CAAC;YACrB,qEAAqE;YACrE,0CAA0C;YAC1C,IAAI,UAAU,GAAG,IAAI,EAAE,CAAC;gBACtB,IAAI,GAAG,UAAU,CAAC;gBAClB,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC1B,SAAS,GAAG,UAAU,CAAC;YACzB,CAAC;YACD,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,EAAE,EAAE,CAAC;YACP,0EAA0E;YAC1E,2EAA2E;YAC3E,qDAAqD;YACrD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpD,MAAM,KAAK,CACT,wGAAwG,CACzG,CAAC;YACJ,CAAC;YACD,UAAU,GAAG,EAAE,GAAG,GAAG,CAAC;QACxB,CAAC;QAED,MAAM,YAAY,GAA4B,EAAE,CAAC;QACjD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,YAAY,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,YAAY;YACZ,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,WAAW;YACxB,KAAK;YACL,OAAO;gBACL,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,QAAQ;gBACN,OAAO,WAAW,CAAC;YACrB,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AA7ND,sBA6NC"}
|
package/lib/svg-renderer.d.ts
CHANGED
|
@@ -31,6 +31,18 @@ export declare class SVGRenderer {
|
|
|
31
31
|
private options;
|
|
32
32
|
private readonly defaultOptions;
|
|
33
33
|
constructor(options?: SVGOptions);
|
|
34
|
+
/**
|
|
35
|
+
* Escape a caller-supplied string for use as SVG/XML text content, so a label
|
|
36
|
+
* like `</text><script>…` cannot break out of its element and inject nodes
|
|
37
|
+
* (findings.md F8).
|
|
38
|
+
*/
|
|
39
|
+
private escapeText;
|
|
40
|
+
/**
|
|
41
|
+
* Escape a caller-supplied string for use inside a double-quoted SVG/XML
|
|
42
|
+
* attribute, so a color/style value containing `"` cannot terminate the
|
|
43
|
+
* attribute and inject markup (findings.md F9).
|
|
44
|
+
*/
|
|
45
|
+
private escapeAttr;
|
|
34
46
|
private scaleX;
|
|
35
47
|
private scaleY;
|
|
36
48
|
private generatePath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svg-renderer.d.ts","sourceRoot":"","sources":["../src/svg-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAKtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,aAAa,CAAC;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,WAAW;IA2BV,OAAO,CAAC,OAAO;IA1B3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAwB7B;gBAEkB,OAAO,GAAE,UAAe;
|
|
1
|
+
{"version":3,"file":"svg-renderer.d.ts","sourceRoot":"","sources":["../src/svg-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAKtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,aAAa,CAAC;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,WAAW;IA2BV,OAAO,CAAC,OAAO;IA1B3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAwB7B;gBAEkB,OAAO,GAAE,UAAe;IAe5C;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAOlB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,UAAU;IAuDlB,OAAO,CAAC,YAAY;IAyEpB,OAAO,CAAC,cAAc;IAoFtB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM;IA8BjE,cAAc,CACZ,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAC;QAClD,OAAO,CAAC,EAAE,OAAO,CAAC;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACrF,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,GACD,MAAM;CAgDV"}
|
package/lib/svg-renderer.js
CHANGED
|
@@ -38,6 +38,40 @@ class SVGRenderer {
|
|
|
38
38
|
constructor(options = {}) {
|
|
39
39
|
this.options = options;
|
|
40
40
|
this.options = { ...this.defaultOptions, ...options };
|
|
41
|
+
const { xMin, xMax, yMin, yMax } = this.options;
|
|
42
|
+
// A zero-width/height domain makes scaleX/scaleY divide by zero (NaN/Infinity
|
|
43
|
+
// path coordinates) and makes the grid loop step by zero — an infinite loop
|
|
44
|
+
// that grows the SVG string until Node throws RangeError. Reject it up front
|
|
45
|
+
// (findings.md F10). `!(a > b)` also catches NaN and reversed bounds.
|
|
46
|
+
if (!(xMax > xMin)) {
|
|
47
|
+
throw Error('SVGRenderer requires xMax > xMin but got xMin=' + xMin + ', xMax=' + xMax);
|
|
48
|
+
}
|
|
49
|
+
if (!(yMax > yMin)) {
|
|
50
|
+
throw Error('SVGRenderer requires yMax > yMin but got yMin=' + yMin + ', yMax=' + yMax);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Escape a caller-supplied string for use as SVG/XML text content, so a label
|
|
55
|
+
* like `</text><script>…` cannot break out of its element and inject nodes
|
|
56
|
+
* (findings.md F8).
|
|
57
|
+
*/
|
|
58
|
+
escapeText(value) {
|
|
59
|
+
return String(value)
|
|
60
|
+
.replace(/&/g, '&')
|
|
61
|
+
.replace(/</g, '<')
|
|
62
|
+
.replace(/>/g, '>');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Escape a caller-supplied string for use inside a double-quoted SVG/XML
|
|
66
|
+
* attribute, so a color/style value containing `"` cannot terminate the
|
|
67
|
+
* attribute and inject markup (findings.md F9).
|
|
68
|
+
*/
|
|
69
|
+
escapeAttr(value) {
|
|
70
|
+
return String(value)
|
|
71
|
+
.replace(/&/g, '&')
|
|
72
|
+
.replace(/</g, '<')
|
|
73
|
+
.replace(/>/g, '>')
|
|
74
|
+
.replace(/"/g, '"');
|
|
41
75
|
}
|
|
42
76
|
scaleX(x) {
|
|
43
77
|
const { xMin, xMax, width, padding } = this.options;
|
|
@@ -65,27 +99,27 @@ class SVGRenderer {
|
|
|
65
99
|
// Vertical grid lines
|
|
66
100
|
for (let x = xMin; x <= xMax; x += xStep) {
|
|
67
101
|
const xPos = this.scaleX(x);
|
|
68
|
-
svg += `<line x1="${xPos}" y1="${padding}" x2="${xPos}" y2="${height - padding}" stroke="${gridColor}" stroke-width="1" />`;
|
|
102
|
+
svg += `<line x1="${xPos}" y1="${padding}" x2="${xPos}" y2="${height - padding}" stroke="${this.escapeAttr(gridColor)}" stroke-width="1" />`;
|
|
69
103
|
}
|
|
70
104
|
// Horizontal grid lines
|
|
71
105
|
for (let y = yMin; y <= yMax; y += yStep) {
|
|
72
106
|
const yPos = this.scaleY(y);
|
|
73
|
-
svg += `<line x1="${padding}" y1="${yPos}" x2="${width - padding}" y2="${yPos}" stroke="${gridColor}" stroke-width="1" />`;
|
|
107
|
+
svg += `<line x1="${padding}" y1="${yPos}" x2="${width - padding}" y2="${yPos}" stroke="${this.escapeAttr(gridColor)}" stroke-width="1" />`;
|
|
74
108
|
}
|
|
75
109
|
// Axes
|
|
76
|
-
svg += `<line x1="${padding}" y1="${height - padding}" x2="${width - padding}" y2="${height - padding}" stroke="${axisColor}" stroke-width="2" />`;
|
|
77
|
-
svg += `<line x1="${padding}" y1="${padding}" x2="${padding}" y2="${height - padding}" stroke="${axisColor}" stroke-width="2" />`;
|
|
110
|
+
svg += `<line x1="${padding}" y1="${height - padding}" x2="${width - padding}" y2="${height - padding}" stroke="${this.escapeAttr(axisColor)}" stroke-width="2" />`;
|
|
111
|
+
svg += `<line x1="${padding}" y1="${padding}" x2="${padding}" y2="${height - padding}" stroke="${this.escapeAttr(axisColor)}" stroke-width="2" />`;
|
|
78
112
|
// Labels
|
|
79
113
|
if (showLabels) {
|
|
80
114
|
// X-axis labels
|
|
81
115
|
for (let x = xMin; x <= xMax; x += xStep * 2) {
|
|
82
116
|
const xPos = this.scaleX(x);
|
|
83
|
-
svg += `<text x="${xPos}" y="${height - padding + 20}" text-anchor="middle" font-size="${fontSize}" fill="${labelColor}">${x}</text>`;
|
|
117
|
+
svg += `<text x="${xPos}" y="${height - padding + 20}" text-anchor="middle" font-size="${fontSize}" fill="${this.escapeAttr(labelColor)}">${x}</text>`;
|
|
84
118
|
}
|
|
85
119
|
// Y-axis labels
|
|
86
120
|
for (let y = yMin; y <= yMax; y += yStep) {
|
|
87
121
|
const yPos = this.scaleY(y);
|
|
88
|
-
svg += `<text x="${padding - 10}" y="${yPos + 4}" text-anchor="end" font-size="${fontSize}" fill="${labelColor}">${y.toFixed(1)}</text>`;
|
|
122
|
+
svg += `<text x="${padding - 10}" y="${yPos + 4}" text-anchor="end" font-size="${fontSize}" fill="${this.escapeAttr(labelColor)}">${y.toFixed(1)}</text>`;
|
|
89
123
|
}
|
|
90
124
|
}
|
|
91
125
|
return svg;
|
|
@@ -120,17 +154,24 @@ class SVGRenderer {
|
|
|
120
154
|
legendX = width - padding - legendWidth - 10;
|
|
121
155
|
legendY = height - padding - legendHeight - 10;
|
|
122
156
|
break;
|
|
157
|
+
default:
|
|
158
|
+
// Without this, an unrecognized legendPosition left legendX/legendY
|
|
159
|
+
// undefined and the legend rendered at x="undefined" y="undefined"
|
|
160
|
+
// (findings.md F11).
|
|
161
|
+
throw Error('Unknown legendPosition "' +
|
|
162
|
+
legendPosition +
|
|
163
|
+
'" (expected top-left, top-right, bottom-left or bottom-right)');
|
|
123
164
|
}
|
|
124
165
|
let svg = '';
|
|
125
166
|
// Legend background
|
|
126
|
-
svg += `<rect x="${legendX}" y="${legendY}" width="${legendWidth}" height="${legendHeight}" fill="${legendBackgroundColor}" stroke="${legendBorderColor}" stroke-width="1" rx="4" />`;
|
|
167
|
+
svg += `<rect x="${legendX}" y="${legendY}" width="${legendWidth}" height="${legendHeight}" fill="${this.escapeAttr(legendBackgroundColor)}" stroke="${this.escapeAttr(legendBorderColor)}" stroke-width="1" rx="4" />`;
|
|
127
168
|
// Legend items
|
|
128
169
|
items.forEach((item, index) => {
|
|
129
170
|
const itemY = legendY + legendPadding + index * legendItemHeight;
|
|
130
171
|
// Color box
|
|
131
|
-
svg += `<rect x="${legendX + legendPadding}" y="${itemY}" width="${fontSize}" height="${fontSize}" fill="${item.color}" />`;
|
|
132
|
-
// Label
|
|
133
|
-
svg += `<text x="${legendX + legendPadding + fontSize + 5}" y="${itemY + fontSize - 2}" font-size="${fontSize}" fill="${legendTextColor}">${item.label}</text>`;
|
|
172
|
+
svg += `<rect x="${legendX + legendPadding}" y="${itemY}" width="${fontSize}" height="${fontSize}" fill="${this.escapeAttr(item.color)}" />`;
|
|
173
|
+
// Label (escaped: caller-supplied text must not break out of <text>)
|
|
174
|
+
svg += `<text x="${legendX + legendPadding + fontSize + 5}" y="${itemY + fontSize - 2}" font-size="${fontSize}" fill="${this.escapeAttr(legendTextColor)}">${this.escapeText(item.label)}</text>`;
|
|
134
175
|
});
|
|
135
176
|
return svg;
|
|
136
177
|
}
|
|
@@ -221,7 +262,7 @@ class SVGRenderer {
|
|
|
221
262
|
render(shape) {
|
|
222
263
|
const { width, height, backgroundColor, strokeColor, strokeWidth, fillOpacity, gridLines } = this.options;
|
|
223
264
|
let svg = `<svg width="${width}" height="${height}" xmlns="http://www.w3.org/2000/svg">`;
|
|
224
|
-
svg += `<rect width="${width}" height="${height}" fill="${backgroundColor}" />`;
|
|
265
|
+
svg += `<rect width="${width}" height="${height}" fill="${this.escapeAttr(backgroundColor)}" />`;
|
|
225
266
|
if (gridLines) {
|
|
226
267
|
svg += this.renderGrid();
|
|
227
268
|
}
|
|
@@ -231,10 +272,10 @@ class SVGRenderer {
|
|
|
231
272
|
if (fillOpacity > 0 && points.length > 0) {
|
|
232
273
|
const fillPath = path +
|
|
233
274
|
` L ${this.scaleX(points[points.length - 1][0])} ${this.scaleY(0)} L ${this.scaleX(points[0][0])} ${this.scaleY(0)} Z`;
|
|
234
|
-
svg += `<path d="${fillPath}" fill="${strokeColor}" fill-opacity="${fillOpacity}" />`;
|
|
275
|
+
svg += `<path d="${fillPath}" fill="${this.escapeAttr(strokeColor)}" fill-opacity="${fillOpacity}" />`;
|
|
235
276
|
}
|
|
236
277
|
// Add stroke
|
|
237
|
-
svg += `<path d="${path}" fill="none" stroke="${strokeColor}" stroke-width="${strokeWidth}" />`;
|
|
278
|
+
svg += `<path d="${path}" fill="none" stroke="${this.escapeAttr(strokeColor)}" stroke-width="${strokeWidth}" />`;
|
|
238
279
|
svg += '</svg>';
|
|
239
280
|
return svg;
|
|
240
281
|
}
|
|
@@ -242,7 +283,7 @@ class SVGRenderer {
|
|
|
242
283
|
const { width, height, backgroundColor, gridLines, showLegend } = this
|
|
243
284
|
.options;
|
|
244
285
|
let svg = `<svg width="${width}" height="${height}" xmlns="http://www.w3.org/2000/svg">`;
|
|
245
|
-
svg += `<rect width="${width}" height="${height}" fill="${backgroundColor}" />`;
|
|
286
|
+
svg += `<rect width="${width}" height="${height}" fill="${this.escapeAttr(backgroundColor)}" />`;
|
|
246
287
|
if (gridLines) {
|
|
247
288
|
svg += this.renderGrid();
|
|
248
289
|
}
|
|
@@ -261,10 +302,10 @@ class SVGRenderer {
|
|
|
261
302
|
if (fillOpacity > 0 && points.length > 0) {
|
|
262
303
|
const fillPath = path +
|
|
263
304
|
` L ${this.scaleX(points[points.length - 1][0])} ${this.scaleY(0)} L ${this.scaleX(points[0][0])} ${this.scaleY(0)} Z`;
|
|
264
|
-
svg += `<path d="${fillPath}" fill="${strokeColor}" fill-opacity="${fillOpacity}" />`;
|
|
305
|
+
svg += `<path d="${fillPath}" fill="${this.escapeAttr(strokeColor)}" fill-opacity="${fillOpacity}" />`;
|
|
265
306
|
}
|
|
266
307
|
// Add stroke
|
|
267
|
-
svg += `<path d="${path}" fill="none" stroke="${strokeColor}" stroke-width="${strokeWidth}" />`;
|
|
308
|
+
svg += `<path d="${path}" fill="none" stroke="${this.escapeAttr(strokeColor)}" stroke-width="${strokeWidth}" />`;
|
|
268
309
|
});
|
|
269
310
|
// Add legend if enabled
|
|
270
311
|
if (showLegend && legendItems.length > 0) {
|
package/lib/svg-renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svg-renderer.js","sourceRoot":"","sources":["../src/svg-renderer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"svg-renderer.js","sourceRoot":"","sources":["../src/svg-renderer.ts"],"names":[],"mappings":"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"}
|