vsegments 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/QUICKSTART.md CHANGED
@@ -99,6 +99,9 @@ vsegments -f image.jpg --json results.json
99
99
 
100
100
  # Customize visualization
101
101
  vsegments -f image.jpg -o output.jpg --line-width 6 --font-size 18
102
+
103
+ # Works with SVG files too
104
+ vsegments -f diagram.svg -o output.jpg
102
105
  ```
103
106
 
104
107
  ## Next Steps
@@ -125,7 +128,7 @@ export GOOGLE_API_KEY="your-key-here"
125
128
  ### Module Not Found
126
129
 
127
130
  ```
128
- Error: Cannot find module 'canvas'
131
+ Error: Cannot find module 'canvas' or 'sharp'
129
132
  ```
130
133
 
131
134
  **Solution:** Reinstall dependencies:
@@ -134,16 +137,18 @@ Error: Cannot find module 'canvas'
134
137
  npm install
135
138
  ```
136
139
 
137
- On macOS, you may need:
140
+ **Note:** This package uses `sharp` for better cross-platform compatibility. If you encounter build issues:
138
141
 
142
+ On macOS:
139
143
  ```bash
140
144
  brew install pkg-config cairo pango libpng jpeg giflib librsvg
145
+ npm install
141
146
  ```
142
147
 
143
148
  On Ubuntu/Debian:
144
-
145
149
  ```bash
146
150
  sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev
151
+ npm install
147
152
  ```
148
153
 
149
154
  ---
package/README.md CHANGED
@@ -12,6 +12,7 @@
12
12
  - 🎯 **Bounding Box Detection**: Automatically detect and label objects in images
13
13
  - 🎨 **Segmentation Masks**: Generate precise segmentation masks for identified objects
14
14
  - 🖼️ **Visualization**: Beautiful visualization with customizable colors, fonts, and transparency
15
+ - 📐 **SVG Support**: Automatic conversion of SVG files to raster format
15
16
  - 🛠️ **CLI Tool**: Powerful command-line interface for batch processing
16
17
  - 📦 **Library**: Clean JavaScript API for integration into your projects
17
18
  - 🚀 **Multiple Models**: Support for various Gemini models (Flash, Pro, etc.)
@@ -319,6 +320,7 @@ node segmentation.js path/to/image.jpg
319
320
  - `@google/generative-ai` ^0.21.0
320
321
  - `canvas` ^2.11.2
321
322
  - `commander` ^12.0.0
323
+ - `sharp` ^0.33.0 (for SVG support and better compatibility)
322
324
 
323
325
  ## Publishing to npm
324
326
 
@@ -1,72 +1,76 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <coverage generated="1764938703619" clover="3.2.0">
3
- <project timestamp="1764938703620" name="All files">
4
- <metrics statements="211" coveredstatements="82" conditionals="73" coveredconditionals="24" methods="24" coveredmethods="12" elements="308" coveredelements="118" complexity="0" loc="211" ncloc="211" packages="1" files="5" classes="5"/>
2
+ <coverage generated="1764946707411" clover="3.2.0">
3
+ <project timestamp="1764946707411" name="All files">
4
+ <metrics statements="215" coveredstatements="82" conditionals="75" coveredconditionals="24" methods="24" coveredmethods="12" elements="314" coveredelements="118" complexity="0" loc="215" ncloc="215" packages="1" files="5" classes="5"/>
5
5
  <file name="core.js" path="/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/core.js">
6
- <metrics statements="63" coveredstatements="23" conditionals="35" coveredconditionals="15" methods="7" coveredmethods="3"/>
6
+ <metrics statements="67" coveredstatements="23" conditionals="37" coveredconditionals="15" methods="7" coveredmethods="3"/>
7
7
  <line num="5" count="2" type="stmt"/>
8
8
  <line num="6" count="2" type="stmt"/>
9
9
  <line num="7" count="2" type="stmt"/>
10
10
  <line num="8" count="2" type="stmt"/>
11
11
  <line num="9" count="2" type="stmt"/>
12
12
  <line num="15" count="2" type="stmt"/>
13
- <line num="27" count="23" type="cond" truecount="2" falsecount="0"/>
14
- <line num="29" count="23" type="cond" truecount="2" falsecount="0"/>
13
+ <line num="27" count="24" type="cond" truecount="2" falsecount="0"/>
14
+ <line num="29" count="24" type="cond" truecount="2" falsecount="0"/>
15
15
  <line num="30" count="1" type="stmt"/>
16
- <line num="35" count="22" type="cond" truecount="2" falsecount="0"/>
17
- <line num="36" count="22" type="cond" truecount="2" falsecount="0"/>
18
- <line num="37" count="22" type="cond" truecount="2" falsecount="0"/>
19
- <line num="40" count="22" type="stmt"/>
20
- <line num="43" count="22" type="stmt"/>
21
- <line num="49" count="22" type="stmt"/>
16
+ <line num="35" count="23" type="cond" truecount="2" falsecount="0"/>
17
+ <line num="36" count="23" type="cond" truecount="2" falsecount="0"/>
18
+ <line num="37" count="23" type="cond" truecount="2" falsecount="0"/>
19
+ <line num="40" count="23" type="stmt"/>
20
+ <line num="43" count="23" type="stmt"/>
21
+ <line num="49" count="23" type="stmt"/>
22
22
  <line num="63" count="0" type="stmt"/>
23
23
  <line num="64" count="0" type="stmt"/>
24
- <line num="65" count="0" type="stmt"/>
25
- <line num="67" count="0" type="stmt"/>
26
- <line num="81" count="9" type="stmt"/>
27
- <line num="82" count="9" type="stmt"/>
28
- <line num="89" count="9" type="cond" truecount="2" falsecount="0"/>
29
- <line num="98" count="3" type="stmt"/>
30
- <line num="100" count="3" type="cond" truecount="2" falsecount="0"/>
31
- <line num="101" count="1" type="stmt"/>
32
- <line num="104" count="3" type="stmt"/>
33
- <line num="121" count="0" type="stmt"/>
34
- <line num="124" count="0" type="stmt"/>
35
- <line num="127" count="0" type="stmt"/>
24
+ <line num="67" count="0" type="cond" truecount="0" falsecount="2"/>
25
+ <line num="68" count="0" type="stmt"/>
26
+ <line num="69" count="0" type="stmt"/>
27
+ <line num="72" count="0" type="stmt"/>
28
+ <line num="75" count="0" type="stmt"/>
29
+ <line num="77" count="0" type="stmt"/>
30
+ <line num="91" count="10" type="stmt"/>
31
+ <line num="92" count="10" type="stmt"/>
32
+ <line num="100" count="10" type="cond" truecount="2" falsecount="0"/>
33
+ <line num="109" count="3" type="stmt"/>
34
+ <line num="111" count="3" type="cond" truecount="2" falsecount="0"/>
35
+ <line num="112" count="1" type="stmt"/>
36
+ <line num="115" count="3" type="stmt"/>
37
+ <line num="132" count="0" type="stmt"/>
36
38
  <line num="135" count="0" type="stmt"/>
37
- <line num="136" count="0" type="stmt"/>
38
- <line num="143" count="0" type="stmt"/>
39
- <line num="144" count="0" type="stmt"/>
40
- <line num="146" count="0" type="cond" truecount="0" falsecount="2"/>
39
+ <line num="138" count="0" type="stmt"/>
40
+ <line num="146" count="0" type="stmt"/>
41
41
  <line num="147" count="0" type="stmt"/>
42
- <line num="151" count="0" type="stmt"/>
42
+ <line num="154" count="0" type="stmt"/>
43
43
  <line num="155" count="0" type="stmt"/>
44
- <line num="157" count="0" type="stmt"/>
45
- <line num="172" count="0" type="stmt"/>
46
- <line num="175" count="0" type="stmt"/>
47
- <line num="178" count="0" type="stmt"/>
48
- <line num="179" count="0" type="stmt"/>
49
- <line num="180" count="0" type="stmt"/>
44
+ <line num="157" count="0" type="cond" truecount="0" falsecount="2"/>
45
+ <line num="158" count="0" type="stmt"/>
46
+ <line num="162" count="0" type="stmt"/>
47
+ <line num="166" count="0" type="stmt"/>
48
+ <line num="168" count="0" type="stmt"/>
50
49
  <line num="183" count="0" type="stmt"/>
50
+ <line num="186" count="0" type="stmt"/>
51
+ <line num="189" count="0" type="stmt"/>
51
52
  <line num="190" count="0" type="stmt"/>
52
53
  <line num="191" count="0" type="stmt"/>
53
- <line num="198" count="0" type="stmt"/>
54
- <line num="199" count="0" type="stmt"/>
55
- <line num="201" count="0" type="cond" truecount="0" falsecount="2"/>
54
+ <line num="194" count="0" type="stmt"/>
55
+ <line num="201" count="0" type="stmt"/>
56
56
  <line num="202" count="0" type="stmt"/>
57
- <line num="206" count="0" type="stmt"/>
57
+ <line num="209" count="0" type="stmt"/>
58
58
  <line num="210" count="0" type="stmt"/>
59
- <line num="211" count="0" type="stmt"/>
59
+ <line num="212" count="0" type="cond" truecount="0" falsecount="2"/>
60
60
  <line num="213" count="0" type="stmt"/>
61
- <line num="233" count="0" type="stmt"/>
62
- <line num="236" count="0" type="stmt"/>
63
- <line num="239" count="0" type="cond" truecount="0" falsecount="2"/>
64
- <line num="240" count="0" type="stmt"/>
65
- <line num="246" count="0" type="stmt"/>
66
- <line num="253" count="0" type="cond" truecount="0" falsecount="2"/>
67
- <line num="254" count="0" type="stmt"/>
61
+ <line num="217" count="0" type="stmt"/>
62
+ <line num="221" count="0" type="stmt"/>
63
+ <line num="222" count="0" type="stmt"/>
64
+ <line num="224" count="0" type="stmt"/>
65
+ <line num="244" count="0" type="stmt"/>
66
+ <line num="247" count="0" type="stmt"/>
67
+ <line num="250" count="0" type="cond" truecount="0" falsecount="2"/>
68
+ <line num="251" count="0" type="stmt"/>
68
69
  <line num="257" count="0" type="stmt"/>
69
- <line num="261" count="2" type="stmt"/>
70
+ <line num="264" count="0" type="cond" truecount="0" falsecount="2"/>
71
+ <line num="265" count="0" type="stmt"/>
72
+ <line num="268" count="0" type="stmt"/>
73
+ <line num="272" count="2" type="stmt"/>
70
74
  </file>
71
75
  <file name="index.js" path="/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/index.js">
72
76
  <metrics statements="8" coveredstatements="8" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
@@ -1,4 +1,4 @@
1
- {"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/core.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/core.js","statementMap":{"0":{"start":{"line":5,"column":31},"end":{"line":5,"column":63}},"1":{"start":{"line":6,"column":22},"end":{"line":6,"column":39}},"2":{"start":{"line":7,"column":11},"end":{"line":7,"column":33}},"3":{"start":{"line":8,"column":31},"end":{"line":8,"column":50}},"4":{"start":{"line":9,"column":55},"end":{"line":9,"column":73}},"5":{"start":{"line":15,"column":4},"end":{"line":15,"column":26}},"6":{"start":{"line":27,"column":4},"end":{"line":27,"column":63}},"7":{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},"8":{"start":{"line":30,"column":6},"end":{"line":32,"column":8}},"9":{"start":{"line":35,"column":4},"end":{"line":35,"column":57}},"10":{"start":{"line":36,"column":4},"end":{"line":36,"column":85}},"11":{"start":{"line":37,"column":4},"end":{"line":37,"column":47}},"12":{"start":{"line":40,"column":4},"end":{"line":40,"column":53}},"13":{"start":{"line":43,"column":4},"end":{"line":46,"column":13}},"14":{"start":{"line":49,"column":4},"end":{"line":54,"column":6}},"15":{"start":{"line":63,"column":24},"end":{"line":63,"column":52}},"16":{"start":{"line":64,"column":23},"end":{"line":64,"column":53}},"17":{"start":{"line":65,"column":21},"end":{"line":65,"column":49}},"18":{"start":{"line":67,"column":4},"end":{"line":72,"column":6}},"19":{"start":{"line":81,"column":16},"end":{"line":81,"column":55}},"20":{"start":{"line":82,"column":22},"end":{"line":88,"column":5}},"21":{"start":{"line":89,"column":4},"end":{"line":89,"column":42}},"22":{"start":{"line":98,"column":23},"end":{"line":98,"column":53}},"23":{"start":{"line":100,"column":4},"end":{"line":102,"column":5}},"24":{"start":{"line":101,"column":6},"end":{"line":101,"column":48}},"25":{"start":{"line":104,"column":4},"end":{"line":104,"column":24}},"26":{"start":{"line":121,"column":8},"end":{"line":121,"column":15}},"27":{"start":{"line":124,"column":18},"end":{"line":124,"column":50}},"28":{"start":{"line":127,"column":18},"end":{"line":131,"column":6}},"29":{"start":{"line":135,"column":4},"end":{"line":152,"column":5}},"30":{"start":{"line":136,"column":6},"end":{"line":141,"column":9}},"31":{"start":{"line":143,"column":6},"end":{"line":143,"column":33}},"32":{"start":{"line":144,"column":6},"end":{"line":144,"column":29}},"33":{"start":{"line":146,"column":6},"end":{"line":150,"column":7}},"34":{"start":{"line":147,"column":8},"end":{"line":149,"column":10}},"35":{"start":{"line":151,"column":6},"end":{"line":151,"column":18}},"36":{"start":{"line":155,"column":18},"end":{"line":155,"column":42}},"37":{"start":{"line":157,"column":4},"end":{"line":157,"column":53}},"38":{"start":{"line":172,"column":8},"end":{"line":172,"column":15}},"39":{"start":{"line":175,"column":18},"end":{"line":175,"column":50}},"40":{"start":{"line":178,"column":16},"end":{"line":178,"column":42}},"41":{"start":{"line":179,"column":21},"end":{"line":179,"column":30}},"42":{"start":{"line":180,"column":22},"end":{"line":180,"column":32}},"43":{"start":{"line":183,"column":18},"end":{"line":186,"column":6}},"44":{"start":{"line":190,"column":4},"end":{"line":207,"column":5}},"45":{"start":{"line":191,"column":6},"end":{"line":196,"column":9}},"46":{"start":{"line":198,"column":6},"end":{"line":198,"column":33}},"47":{"start":{"line":199,"column":6},"end":{"line":199,"column":29}},"48":{"start":{"line":201,"column":6},"end":{"line":205,"column":7}},"49":{"start":{"line":202,"column":8},"end":{"line":204,"column":10}},"50":{"start":{"line":206,"column":6},"end":{"line":206,"column":18}},"51":{"start":{"line":210,"column":18},"end":{"line":210,"column":42}},"52":{"start":{"line":211,"column":18},"end":{"line":211,"column":73}},"53":{"start":{"line":213,"column":4},"end":{"line":213,"column":54}},"54":{"start":{"line":233,"column":8},"end":{"line":233,"column":15}},"55":{"start":{"line":236,"column":19},"end":{"line":236,"column":59}},"56":{"start":{"line":239,"column":4},"end":{"line":250,"column":5}},"57":{"start":{"line":240,"column":6},"end":{"line":244,"column":9}},"58":{"start":{"line":246,"column":6},"end":{"line":249,"column":9}},"59":{"start":{"line":253,"column":4},"end":{"line":255,"column":5}},"60":{"start":{"line":254,"column":6},"end":{"line":254,"column":43}},"61":{"start":{"line":257,"column":4},"end":{"line":257,"column":18}},"62":{"start":{"line":261,"column":0},"end":{"line":261,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":26,"column":2},"end":{"line":26,"column":3}},"loc":{"start":{"line":26,"column":28},"end":{"line":55,"column":3}},"line":26},"1":{"name":"(anonymous_1)","decl":{"start":{"line":62,"column":2},"end":{"line":62,"column":3}},"loc":{"start":{"line":62,"column":30},"end":{"line":73,"column":3}},"line":62},"2":{"name":"(anonymous_2)","decl":{"start":{"line":80,"column":2},"end":{"line":80,"column":3}},"loc":{"start":{"line":80,"column":25},"end":{"line":90,"column":3}},"line":80},"3":{"name":"(anonymous_3)","decl":{"start":{"line":97,"column":2},"end":{"line":97,"column":3}},"loc":{"start":{"line":97,"column":45},"end":{"line":105,"column":3}},"line":97},"4":{"name":"(anonymous_4)","decl":{"start":{"line":116,"column":2},"end":{"line":116,"column":3}},"loc":{"start":{"line":116,"column":45},"end":{"line":158,"column":3}},"line":116},"5":{"name":"(anonymous_5)","decl":{"start":{"line":168,"column":2},"end":{"line":168,"column":3}},"loc":{"start":{"line":168,"column":41},"end":{"line":214,"column":3}},"line":168},"6":{"name":"(anonymous_6)","decl":{"start":{"line":227,"column":2},"end":{"line":227,"column":3}},"loc":{"start":{"line":227,"column":51},"end":{"line":258,"column":3}},"line":227}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":14},"end":{"line":26,"column":26}},"type":"default-arg","locations":[{"start":{"line":26,"column":24},"end":{"line":26,"column":26}}],"line":26},"1":{"loc":{"start":{"line":27,"column":18},"end":{"line":27,"column":62}},"type":"binary-expr","locations":[{"start":{"line":27,"column":18},"end":{"line":27,"column":32}},{"start":{"line":27,"column":36},"end":{"line":27,"column":62}}],"line":27},"2":{"loc":{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},{"start":{},"end":{}}],"line":29},"3":{"loc":{"start":{"line":35,"column":17},"end":{"line":35,"column":56}},"type":"binary-expr","locations":[{"start":{"line":35,"column":17},"end":{"line":35,"column":30}},{"start":{"line":35,"column":34},"end":{"line":35,"column":56}}],"line":35},"4":{"loc":{"start":{"line":36,"column":23},"end":{"line":36,"column":84}},"type":"cond-expr","locations":[{"start":{"line":36,"column":59},"end":{"line":36,"column":78}},{"start":{"line":36,"column":81},"end":{"line":36,"column":84}}],"line":36},"5":{"loc":{"start":{"line":37,"column":22},"end":{"line":37,"column":46}},"type":"binary-expr","locations":[{"start":{"line":37,"column":22},"end":{"line":37,"column":40}},{"start":{"line":37,"column":44},"end":{"line":37,"column":46}}],"line":37},"6":{"loc":{"start":{"line":89,"column":11},"end":{"line":89,"column":41}},"type":"binary-expr","locations":[{"start":{"line":89,"column":11},"end":{"line":89,"column":25}},{"start":{"line":89,"column":29},"end":{"line":89,"column":41}}],"line":89},"7":{"loc":{"start":{"line":100,"column":4},"end":{"line":102,"column":5}},"type":"if","locations":[{"start":{"line":100,"column":4},"end":{"line":102,"column":5}},{"start":{},"end":{}}],"line":100},"8":{"loc":{"start":{"line":116,"column":31},"end":{"line":116,"column":43}},"type":"default-arg","locations":[{"start":{"line":116,"column":41},"end":{"line":116,"column":43}}],"line":116},"9":{"loc":{"start":{"line":118,"column":6},"end":{"line":118,"column":45}},"type":"default-arg","locations":[{"start":{"line":118,"column":15},"end":{"line":118,"column":45}}],"line":118},"10":{"loc":{"start":{"line":119,"column":6},"end":{"line":119,"column":31}},"type":"default-arg","locations":[{"start":{"line":119,"column":27},"end":{"line":119,"column":31}}],"line":119},"11":{"loc":{"start":{"line":120,"column":6},"end":{"line":120,"column":20}},"type":"default-arg","locations":[{"start":{"line":120,"column":16},"end":{"line":120,"column":20}}],"line":120},"12":{"loc":{"start":{"line":146,"column":6},"end":{"line":150,"column":7}},"type":"if","locations":[{"start":{"line":146,"column":6},"end":{"line":150,"column":7}},{"start":{},"end":{}}],"line":146},"13":{"loc":{"start":{"line":168,"column":27},"end":{"line":168,"column":39}},"type":"default-arg","locations":[{"start":{"line":168,"column":37},"end":{"line":168,"column":39}}],"line":168},"14":{"loc":{"start":{"line":170,"column":6},"end":{"line":170,"column":269}},"type":"default-arg","locations":[{"start":{"line":170,"column":15},"end":{"line":170,"column":269}}],"line":170},"15":{"loc":{"start":{"line":171,"column":6},"end":{"line":171,"column":20}},"type":"default-arg","locations":[{"start":{"line":171,"column":16},"end":{"line":171,"column":20}}],"line":171},"16":{"loc":{"start":{"line":201,"column":6},"end":{"line":205,"column":7}},"type":"if","locations":[{"start":{"line":201,"column":6},"end":{"line":205,"column":7}},{"start":{},"end":{}}],"line":201},"17":{"loc":{"start":{"line":227,"column":37},"end":{"line":227,"column":49}},"type":"default-arg","locations":[{"start":{"line":227,"column":47},"end":{"line":227,"column":49}}],"line":227},"18":{"loc":{"start":{"line":229,"column":6},"end":{"line":229,"column":23}},"type":"default-arg","locations":[{"start":{"line":229,"column":19},"end":{"line":229,"column":23}}],"line":229},"19":{"loc":{"start":{"line":230,"column":6},"end":{"line":230,"column":19}},"type":"default-arg","locations":[{"start":{"line":230,"column":18},"end":{"line":230,"column":19}}],"line":230},"20":{"loc":{"start":{"line":231,"column":6},"end":{"line":231,"column":19}},"type":"default-arg","locations":[{"start":{"line":231,"column":17},"end":{"line":231,"column":19}}],"line":231},"21":{"loc":{"start":{"line":232,"column":6},"end":{"line":232,"column":17}},"type":"default-arg","locations":[{"start":{"line":232,"column":14},"end":{"line":232,"column":17}}],"line":232},"22":{"loc":{"start":{"line":239,"column":4},"end":{"line":250,"column":5}},"type":"if","locations":[{"start":{"line":239,"column":4},"end":{"line":250,"column":5}},{"start":{"line":245,"column":11},"end":{"line":250,"column":5}}],"line":239},"23":{"loc":{"start":{"line":253,"column":4},"end":{"line":255,"column":5}},"type":"if","locations":[{"start":{"line":253,"column":4},"end":{"line":255,"column":5}},{"start":{},"end":{}}],"line":253}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":23,"7":23,"8":1,"9":22,"10":22,"11":22,"12":22,"13":22,"14":22,"15":0,"16":0,"17":0,"18":0,"19":9,"20":9,"21":9,"22":3,"23":3,"24":1,"25":3,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":2},"f":{"0":23,"1":0,"2":9,"3":3,"4":0,"5":0,"6":0},"b":{"0":[2],"1":[23,2],"2":[1,22],"3":[22,21],"4":[2,20],"5":[22,17],"6":[9,2],"7":[1,2],"8":[0],"9":[0],"10":[0],"11":[0],"12":[0,0],"13":[0],"14":[0],"15":[0],"16":[0,0],"17":[0],"18":[0],"19":[0],"20":[0],"21":[0],"22":[0,0],"23":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3b2c399c630d53b96e78d95a49182292a67e620d"}
1
+ {"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/core.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/core.js","statementMap":{"0":{"start":{"line":5,"column":31},"end":{"line":5,"column":63}},"1":{"start":{"line":6,"column":22},"end":{"line":6,"column":39}},"2":{"start":{"line":7,"column":11},"end":{"line":7,"column":33}},"3":{"start":{"line":8,"column":31},"end":{"line":8,"column":50}},"4":{"start":{"line":9,"column":55},"end":{"line":9,"column":73}},"5":{"start":{"line":15,"column":4},"end":{"line":15,"column":26}},"6":{"start":{"line":27,"column":4},"end":{"line":27,"column":63}},"7":{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},"8":{"start":{"line":30,"column":6},"end":{"line":32,"column":8}},"9":{"start":{"line":35,"column":4},"end":{"line":35,"column":57}},"10":{"start":{"line":36,"column":4},"end":{"line":36,"column":85}},"11":{"start":{"line":37,"column":4},"end":{"line":37,"column":47}},"12":{"start":{"line":40,"column":4},"end":{"line":40,"column":53}},"13":{"start":{"line":43,"column":4},"end":{"line":46,"column":13}},"14":{"start":{"line":49,"column":4},"end":{"line":54,"column":6}},"15":{"start":{"line":63,"column":22},"end":{"line":63,"column":50}},"16":{"start":{"line":64,"column":19},"end":{"line":64,"column":47}},"17":{"start":{"line":67,"column":4},"end":{"line":73,"column":5}},"18":{"start":{"line":68,"column":20},"end":{"line":68,"column":36}},"19":{"start":{"line":69,"column":6},"end":{"line":71,"column":20}},"20":{"start":{"line":72,"column":6},"end":{"line":72,"column":29}},"21":{"start":{"line":75,"column":23},"end":{"line":75,"column":53}},"22":{"start":{"line":77,"column":4},"end":{"line":82,"column":6}},"23":{"start":{"line":91,"column":16},"end":{"line":91,"column":55}},"24":{"start":{"line":92,"column":22},"end":{"line":99,"column":5}},"25":{"start":{"line":100,"column":4},"end":{"line":100,"column":42}},"26":{"start":{"line":109,"column":23},"end":{"line":109,"column":53}},"27":{"start":{"line":111,"column":4},"end":{"line":113,"column":5}},"28":{"start":{"line":112,"column":6},"end":{"line":112,"column":48}},"29":{"start":{"line":115,"column":4},"end":{"line":115,"column":24}},"30":{"start":{"line":132,"column":8},"end":{"line":132,"column":15}},"31":{"start":{"line":135,"column":18},"end":{"line":135,"column":50}},"32":{"start":{"line":138,"column":18},"end":{"line":142,"column":6}},"33":{"start":{"line":146,"column":4},"end":{"line":163,"column":5}},"34":{"start":{"line":147,"column":6},"end":{"line":152,"column":9}},"35":{"start":{"line":154,"column":6},"end":{"line":154,"column":33}},"36":{"start":{"line":155,"column":6},"end":{"line":155,"column":29}},"37":{"start":{"line":157,"column":6},"end":{"line":161,"column":7}},"38":{"start":{"line":158,"column":8},"end":{"line":160,"column":10}},"39":{"start":{"line":162,"column":6},"end":{"line":162,"column":18}},"40":{"start":{"line":166,"column":18},"end":{"line":166,"column":42}},"41":{"start":{"line":168,"column":4},"end":{"line":168,"column":53}},"42":{"start":{"line":183,"column":8},"end":{"line":183,"column":15}},"43":{"start":{"line":186,"column":18},"end":{"line":186,"column":50}},"44":{"start":{"line":189,"column":16},"end":{"line":189,"column":42}},"45":{"start":{"line":190,"column":21},"end":{"line":190,"column":30}},"46":{"start":{"line":191,"column":22},"end":{"line":191,"column":32}},"47":{"start":{"line":194,"column":18},"end":{"line":197,"column":6}},"48":{"start":{"line":201,"column":4},"end":{"line":218,"column":5}},"49":{"start":{"line":202,"column":6},"end":{"line":207,"column":9}},"50":{"start":{"line":209,"column":6},"end":{"line":209,"column":33}},"51":{"start":{"line":210,"column":6},"end":{"line":210,"column":29}},"52":{"start":{"line":212,"column":6},"end":{"line":216,"column":7}},"53":{"start":{"line":213,"column":8},"end":{"line":215,"column":10}},"54":{"start":{"line":217,"column":6},"end":{"line":217,"column":18}},"55":{"start":{"line":221,"column":18},"end":{"line":221,"column":42}},"56":{"start":{"line":222,"column":18},"end":{"line":222,"column":73}},"57":{"start":{"line":224,"column":4},"end":{"line":224,"column":54}},"58":{"start":{"line":244,"column":8},"end":{"line":244,"column":15}},"59":{"start":{"line":247,"column":19},"end":{"line":247,"column":59}},"60":{"start":{"line":250,"column":4},"end":{"line":261,"column":5}},"61":{"start":{"line":251,"column":6},"end":{"line":255,"column":9}},"62":{"start":{"line":257,"column":6},"end":{"line":260,"column":9}},"63":{"start":{"line":264,"column":4},"end":{"line":266,"column":5}},"64":{"start":{"line":265,"column":6},"end":{"line":265,"column":43}},"65":{"start":{"line":268,"column":4},"end":{"line":268,"column":18}},"66":{"start":{"line":272,"column":0},"end":{"line":272,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":26,"column":2},"end":{"line":26,"column":3}},"loc":{"start":{"line":26,"column":28},"end":{"line":55,"column":3}},"line":26},"1":{"name":"(anonymous_1)","decl":{"start":{"line":62,"column":2},"end":{"line":62,"column":3}},"loc":{"start":{"line":62,"column":30},"end":{"line":83,"column":3}},"line":62},"2":{"name":"(anonymous_2)","decl":{"start":{"line":90,"column":2},"end":{"line":90,"column":3}},"loc":{"start":{"line":90,"column":25},"end":{"line":101,"column":3}},"line":90},"3":{"name":"(anonymous_3)","decl":{"start":{"line":108,"column":2},"end":{"line":108,"column":3}},"loc":{"start":{"line":108,"column":45},"end":{"line":116,"column":3}},"line":108},"4":{"name":"(anonymous_4)","decl":{"start":{"line":127,"column":2},"end":{"line":127,"column":3}},"loc":{"start":{"line":127,"column":45},"end":{"line":169,"column":3}},"line":127},"5":{"name":"(anonymous_5)","decl":{"start":{"line":179,"column":2},"end":{"line":179,"column":3}},"loc":{"start":{"line":179,"column":41},"end":{"line":225,"column":3}},"line":179},"6":{"name":"(anonymous_6)","decl":{"start":{"line":238,"column":2},"end":{"line":238,"column":3}},"loc":{"start":{"line":238,"column":51},"end":{"line":269,"column":3}},"line":238}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":14},"end":{"line":26,"column":26}},"type":"default-arg","locations":[{"start":{"line":26,"column":24},"end":{"line":26,"column":26}}],"line":26},"1":{"loc":{"start":{"line":27,"column":18},"end":{"line":27,"column":62}},"type":"binary-expr","locations":[{"start":{"line":27,"column":18},"end":{"line":27,"column":32}},{"start":{"line":27,"column":36},"end":{"line":27,"column":62}}],"line":27},"2":{"loc":{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},{"start":{},"end":{}}],"line":29},"3":{"loc":{"start":{"line":35,"column":17},"end":{"line":35,"column":56}},"type":"binary-expr","locations":[{"start":{"line":35,"column":17},"end":{"line":35,"column":30}},{"start":{"line":35,"column":34},"end":{"line":35,"column":56}}],"line":35},"4":{"loc":{"start":{"line":36,"column":23},"end":{"line":36,"column":84}},"type":"cond-expr","locations":[{"start":{"line":36,"column":59},"end":{"line":36,"column":78}},{"start":{"line":36,"column":81},"end":{"line":36,"column":84}}],"line":36},"5":{"loc":{"start":{"line":37,"column":22},"end":{"line":37,"column":46}},"type":"binary-expr","locations":[{"start":{"line":37,"column":22},"end":{"line":37,"column":40}},{"start":{"line":37,"column":44},"end":{"line":37,"column":46}}],"line":37},"6":{"loc":{"start":{"line":67,"column":4},"end":{"line":73,"column":5}},"type":"if","locations":[{"start":{"line":67,"column":4},"end":{"line":73,"column":5}},{"start":{},"end":{}}],"line":67},"7":{"loc":{"start":{"line":100,"column":11},"end":{"line":100,"column":41}},"type":"binary-expr","locations":[{"start":{"line":100,"column":11},"end":{"line":100,"column":25}},{"start":{"line":100,"column":29},"end":{"line":100,"column":41}}],"line":100},"8":{"loc":{"start":{"line":111,"column":4},"end":{"line":113,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":113,"column":5}},{"start":{},"end":{}}],"line":111},"9":{"loc":{"start":{"line":127,"column":31},"end":{"line":127,"column":43}},"type":"default-arg","locations":[{"start":{"line":127,"column":41},"end":{"line":127,"column":43}}],"line":127},"10":{"loc":{"start":{"line":129,"column":6},"end":{"line":129,"column":45}},"type":"default-arg","locations":[{"start":{"line":129,"column":15},"end":{"line":129,"column":45}}],"line":129},"11":{"loc":{"start":{"line":130,"column":6},"end":{"line":130,"column":31}},"type":"default-arg","locations":[{"start":{"line":130,"column":27},"end":{"line":130,"column":31}}],"line":130},"12":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":20}},"type":"default-arg","locations":[{"start":{"line":131,"column":16},"end":{"line":131,"column":20}}],"line":131},"13":{"loc":{"start":{"line":157,"column":6},"end":{"line":161,"column":7}},"type":"if","locations":[{"start":{"line":157,"column":6},"end":{"line":161,"column":7}},{"start":{},"end":{}}],"line":157},"14":{"loc":{"start":{"line":179,"column":27},"end":{"line":179,"column":39}},"type":"default-arg","locations":[{"start":{"line":179,"column":37},"end":{"line":179,"column":39}}],"line":179},"15":{"loc":{"start":{"line":181,"column":6},"end":{"line":181,"column":269}},"type":"default-arg","locations":[{"start":{"line":181,"column":15},"end":{"line":181,"column":269}}],"line":181},"16":{"loc":{"start":{"line":182,"column":6},"end":{"line":182,"column":20}},"type":"default-arg","locations":[{"start":{"line":182,"column":16},"end":{"line":182,"column":20}}],"line":182},"17":{"loc":{"start":{"line":212,"column":6},"end":{"line":216,"column":7}},"type":"if","locations":[{"start":{"line":212,"column":6},"end":{"line":216,"column":7}},{"start":{},"end":{}}],"line":212},"18":{"loc":{"start":{"line":238,"column":37},"end":{"line":238,"column":49}},"type":"default-arg","locations":[{"start":{"line":238,"column":47},"end":{"line":238,"column":49}}],"line":238},"19":{"loc":{"start":{"line":240,"column":6},"end":{"line":240,"column":23}},"type":"default-arg","locations":[{"start":{"line":240,"column":19},"end":{"line":240,"column":23}}],"line":240},"20":{"loc":{"start":{"line":241,"column":6},"end":{"line":241,"column":19}},"type":"default-arg","locations":[{"start":{"line":241,"column":18},"end":{"line":241,"column":19}}],"line":241},"21":{"loc":{"start":{"line":242,"column":6},"end":{"line":242,"column":19}},"type":"default-arg","locations":[{"start":{"line":242,"column":17},"end":{"line":242,"column":19}}],"line":242},"22":{"loc":{"start":{"line":243,"column":6},"end":{"line":243,"column":17}},"type":"default-arg","locations":[{"start":{"line":243,"column":14},"end":{"line":243,"column":17}}],"line":243},"23":{"loc":{"start":{"line":250,"column":4},"end":{"line":261,"column":5}},"type":"if","locations":[{"start":{"line":250,"column":4},"end":{"line":261,"column":5}},{"start":{"line":256,"column":11},"end":{"line":261,"column":5}}],"line":250},"24":{"loc":{"start":{"line":264,"column":4},"end":{"line":266,"column":5}},"type":"if","locations":[{"start":{"line":264,"column":4},"end":{"line":266,"column":5}},{"start":{},"end":{}}],"line":264}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":24,"7":24,"8":1,"9":23,"10":23,"11":23,"12":23,"13":23,"14":23,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":10,"24":10,"25":10,"26":3,"27":3,"28":1,"29":3,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":2},"f":{"0":24,"1":0,"2":10,"3":3,"4":0,"5":0,"6":0},"b":{"0":[2],"1":[24,2],"2":[1,23],"3":[23,22],"4":[2,21],"5":[23,18],"6":[0,0],"7":[10,2],"8":[1,2],"9":[0],"10":[0],"11":[0],"12":[0],"13":[0,0],"14":[0],"15":[0],"16":[0],"17":[0,0],"18":[0],"19":[0],"20":[0],"21":[0],"22":[0],"23":[0,0],"24":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"628ce280422359d44c6e862a6c0c4237ab4ce67d"}
2
2
  ,"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/index.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/index.js","statementMap":{"0":{"start":{"line":12,"column":18},"end":{"line":12,"column":35}},"1":{"start":{"line":13,"column":62},"end":{"line":13,"column":81}},"2":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}},"3":{"start":{"line":16,"column":0},"end":{"line":16,"column":37}},"4":{"start":{"line":17,"column":0},"end":{"line":17,"column":41}},"5":{"start":{"line":18,"column":0},"end":{"line":18,"column":51}},"6":{"start":{"line":19,"column":0},"end":{"line":19,"column":55}},"7":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"919dc8d2b2062d2a9f4217ee076649d050f5f3a9"}
3
3
  ,"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/models.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/models.js","statementMap":{"0":{"start":{"line":15,"column":4},"end":{"line":15,"column":23}},"1":{"start":{"line":16,"column":4},"end":{"line":16,"column":17}},"2":{"start":{"line":17,"column":4},"end":{"line":17,"column":17}},"3":{"start":{"line":18,"column":4},"end":{"line":18,"column":17}},"4":{"start":{"line":19,"column":4},"end":{"line":19,"column":17}},"5":{"start":{"line":29,"column":18},"end":{"line":29,"column":57}},"6":{"start":{"line":30,"column":18},"end":{"line":30,"column":58}},"7":{"start":{"line":31,"column":18},"end":{"line":31,"column":57}},"8":{"start":{"line":32,"column":18},"end":{"line":32,"column":58}},"9":{"start":{"line":33,"column":4},"end":{"line":33,"column":40}},"10":{"start":{"line":42,"column":16},"end":{"line":42,"column":27}},"11":{"start":{"line":43,"column":4},"end":{"line":49,"column":6}},"12":{"start":{"line":64,"column":4},"end":{"line":64,"column":17}},"13":{"start":{"line":65,"column":4},"end":{"line":65,"column":17}},"14":{"start":{"line":66,"column":4},"end":{"line":66,"column":17}},"15":{"start":{"line":67,"column":4},"end":{"line":67,"column":17}},"16":{"start":{"line":68,"column":4},"end":{"line":68,"column":21}},"17":{"start":{"line":69,"column":4},"end":{"line":69,"column":23}},"18":{"start":{"line":81,"column":4},"end":{"line":81,"column":23}},"19":{"start":{"line":82,"column":4},"end":{"line":82,"column":23}},"20":{"start":{"line":83,"column":4},"end":{"line":83,"column":35}},"21":{"start":{"line":91,"column":4},"end":{"line":91,"column":29}},"22":{"start":{"line":95,"column":0},"end":{"line":99,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":2},"end":{"line":14,"column":3}},"loc":{"start":{"line":14,"column":37},"end":{"line":20,"column":3}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":2},"end":{"line":28,"column":3}},"loc":{"start":{"line":28,"column":34},"end":{"line":34,"column":3}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":41,"column":2},"end":{"line":41,"column":3}},"loc":{"start":{"line":41,"column":24},"end":{"line":50,"column":3}},"line":41},"3":{"name":"(anonymous_3)","decl":{"start":{"line":63,"column":2},"end":{"line":63,"column":3}},"loc":{"start":{"line":63,"column":43},"end":{"line":70,"column":3}},"line":63},"4":{"name":"(anonymous_4)","decl":{"start":{"line":80,"column":2},"end":{"line":80,"column":3}},"loc":{"start":{"line":80,"column":55},"end":{"line":84,"column":3}},"line":80},"5":{"name":"(anonymous_5)","decl":{"start":{"line":90,"column":2},"end":{"line":90,"column":3}},"loc":{"start":{"line":90,"column":15},"end":{"line":92,"column":3}},"line":90}},"branchMap":{"0":{"loc":{"start":{"line":80,"column":21},"end":{"line":80,"column":33}},"type":"default-arg","locations":[{"start":{"line":80,"column":29},"end":{"line":80,"column":33}}],"line":80},"1":{"loc":{"start":{"line":80,"column":35},"end":{"line":80,"column":53}},"type":"default-arg","locations":[{"start":{"line":80,"column":49},"end":{"line":80,"column":53}}],"line":80}},"s":{"0":20,"1":20,"2":20,"3":20,"4":20,"5":3,"6":3,"7":3,"8":3,"9":3,"10":8,"11":8,"12":4,"13":4,"14":4,"15":4,"16":4,"17":4,"18":6,"19":6,"20":6,"21":3,"22":4},"f":{"0":20,"1":3,"2":8,"3":4,"4":6,"5":3},"b":{"0":[4],"1":[5]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3d02bea040e833fecbb6ae9f688106aa3a88eb96"}
4
4
  ,"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/utils.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/utils.js","statementMap":{"0":{"start":{"line":5,"column":42},"end":{"line":5,"column":61}},"1":{"start":{"line":6,"column":36},"end":{"line":6,"column":53}},"2":{"start":{"line":14,"column":16},"end":{"line":14,"column":38}},"3":{"start":{"line":15,"column":2},"end":{"line":21,"column":3}},"4":{"start":{"line":15,"column":15},"end":{"line":15,"column":16}},"5":{"start":{"line":16,"column":4},"end":{"line":20,"column":5}},"6":{"start":{"line":17,"column":6},"end":{"line":17,"column":49}},"7":{"start":{"line":18,"column":6},"end":{"line":18,"column":46}},"8":{"start":{"line":19,"column":6},"end":{"line":19,"column":12}},"9":{"start":{"line":22,"column":2},"end":{"line":22,"column":27}},"10":{"start":{"line":31,"column":22},"end":{"line":31,"column":45}},"11":{"start":{"line":32,"column":15},"end":{"line":32,"column":38}},"12":{"start":{"line":34,"column":16},"end":{"line":34,"column":18}},"13":{"start":{"line":35,"column":2},"end":{"line":39,"column":3}},"14":{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},"15":{"start":{"line":37,"column":6},"end":{"line":37,"column":45}},"16":{"start":{"line":41,"column":2},"end":{"line":41,"column":15}},"17":{"start":{"line":52,"column":22},"end":{"line":52,"column":45}},"18":{"start":{"line":53,"column":15},"end":{"line":53,"column":38}},"19":{"start":{"line":55,"column":16},"end":{"line":55,"column":18}},"20":{"start":{"line":57,"column":2},"end":{"line":109,"column":3}},"21":{"start":{"line":58,"column":4},"end":{"line":58,"column":45}},"22":{"start":{"line":58,"column":36},"end":{"line":58,"column":45}},"23":{"start":{"line":60,"column":16},"end":{"line":60,"column":27}},"24":{"start":{"line":61,"column":18},"end":{"line":61,"column":28}},"25":{"start":{"line":64,"column":18},"end":{"line":64,"column":57}},"26":{"start":{"line":65,"column":18},"end":{"line":65,"column":56}},"27":{"start":{"line":66,"column":18},"end":{"line":66,"column":57}},"28":{"start":{"line":67,"column":18},"end":{"line":67,"column":56}},"29":{"start":{"line":69,"column":22},"end":{"line":69,"column":35}},"30":{"start":{"line":70,"column":23},"end":{"line":70,"column":36}},"31":{"start":{"line":73,"column":23},"end":{"line":73,"column":72}},"32":{"start":{"line":74,"column":23},"end":{"line":74,"column":56}},"33":{"start":{"line":77,"column":20},"end":{"line":77,"column":47}},"34":{"start":{"line":78,"column":19},"end":{"line":78,"column":54}},"35":{"start":{"line":79,"column":16},"end":{"line":79,"column":39}},"36":{"start":{"line":80,"column":4},"end":{"line":80,"column":56}},"37":{"start":{"line":83,"column":22},"end":{"line":83,"column":67}},"38":{"start":{"line":84,"column":21},"end":{"line":84,"column":59}},"39":{"start":{"line":86,"column":4},"end":{"line":88,"column":5}},"40":{"start":{"line":86,"column":17},"end":{"line":86,"column":18}},"41":{"start":{"line":87,"column":6},"end":{"line":87,"column":46}},"42":{"start":{"line":91,"column":21},"end":{"line":91,"column":55}},"43":{"start":{"line":93,"column":4},"end":{"line":104,"column":5}},"44":{"start":{"line":93,"column":17},"end":{"line":93,"column":18}},"45":{"start":{"line":94,"column":6},"end":{"line":103,"column":7}},"46":{"start":{"line":94,"column":19},"end":{"line":94,"column":20}},"47":{"start":{"line":95,"column":23},"end":{"line":95,"column":40}},"48":{"start":{"line":96,"column":21},"end":{"line":96,"column":30}},"49":{"start":{"line":97,"column":21},"end":{"line":97,"column":30}},"50":{"start":{"line":99,"column":8},"end":{"line":102,"column":9}},"51":{"start":{"line":100,"column":25},"end":{"line":100,"column":47}},"52":{"start":{"line":101,"column":10},"end":{"line":101,"column":46}},"53":{"start":{"line":106,"column":4},"end":{"line":108,"column":7}},"54":{"start":{"line":111,"column":2},"end":{"line":111,"column":15}},"55":{"start":{"line":114,"column":0},"end":{"line":118,"column":2}}},"fnMap":{"0":{"name":"parseJson","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":18}},"loc":{"start":{"line":13,"column":31},"end":{"line":23,"column":1}},"line":13},"1":{"name":"parseBoundingBoxes","decl":{"start":{"line":30,"column":9},"end":{"line":30,"column":27}},"loc":{"start":{"line":30,"column":42},"end":{"line":42,"column":1}},"line":30},"2":{"name":"parseSegmentationMasks","decl":{"start":{"line":51,"column":15},"end":{"line":51,"column":37}},"loc":{"start":{"line":51,"column":73},"end":{"line":112,"column":1}},"line":51}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":4},"end":{"line":20,"column":5}},"type":"if","locations":[{"start":{"line":16,"column":4},"end":{"line":20,"column":5}},{"start":{},"end":{}}],"line":16},"1":{"loc":{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},{"start":{},"end":{}}],"line":36},"2":{"loc":{"start":{"line":58,"column":4},"end":{"line":58,"column":45}},"type":"if","locations":[{"start":{"line":58,"column":4},"end":{"line":58,"column":45}},{"start":{},"end":{}}],"line":58},"3":{"loc":{"start":{"line":58,"column":8},"end":{"line":58,"column":34}},"type":"binary-expr","locations":[{"start":{"line":58,"column":8},"end":{"line":58,"column":20}},{"start":{"line":58,"column":24},"end":{"line":58,"column":34}}],"line":58},"4":{"loc":{"start":{"line":99,"column":8},"end":{"line":102,"column":9}},"type":"if","locations":[{"start":{"line":99,"column":8},"end":{"line":102,"column":9}},{"start":{},"end":{}}],"line":99},"5":{"loc":{"start":{"line":99,"column":12},"end":{"line":99,"column":47}},"type":"binary-expr","locations":[{"start":{"line":99,"column":12},"end":{"line":99,"column":28}},{"start":{"line":99,"column":32},"end":{"line":99,"column":47}}],"line":99}},"s":{"0":3,"1":3,"2":12,"3":12,"4":12,"5":13,"6":4,"7":4,"8":4,"9":12,"10":5,"11":5,"12":5,"13":5,"14":8,"15":7,"16":5,"17":2,"18":2,"19":2,"20":2,"21":3,"22":3,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":2,"55":3},"f":{"0":12,"1":5,"2":2},"b":{"0":[4,9],"1":[7,1],"2":[3,0],"3":[3,2],"4":[0,0],"5":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c6222b511313a24a286eb18bc56c8b87e16a5c13"}
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">36.5% </span>
26
+ <span class="strong">34.32% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>23/63</span>
28
+ <span class='fraction'>23/67</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">42.85% </span>
33
+ <span class="strong">40.54% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>15/35</span>
35
+ <span class='fraction'>15/37</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">36.5% </span>
47
+ <span class="strong">34.32% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>23/63</span>
49
+ <span class='fraction'>23/67</span>
50
50
  </div>
51
51
 
52
52
 
@@ -324,7 +324,18 @@
324
324
  <a name='L259'></a><a href='#L259'>259</a>
325
325
  <a name='L260'></a><a href='#L260'>260</a>
326
326
  <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
328
339
  <span class="cline-any cline-neutral">&nbsp;</span>
329
340
  <span class="cline-any cline-neutral">&nbsp;</span>
330
341
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -350,29 +361,29 @@
350
361
  <span class="cline-any cline-neutral">&nbsp;</span>
351
362
  <span class="cline-any cline-neutral">&nbsp;</span>
352
363
  <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-yes">23x</span>
364
+ <span class="cline-any cline-yes">24x</span>
354
365
  <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-yes">23x</span>
366
+ <span class="cline-any cline-yes">24x</span>
356
367
  <span class="cline-any cline-yes">1x</span>
357
368
  <span class="cline-any cline-neutral">&nbsp;</span>
358
369
  <span class="cline-any cline-neutral">&nbsp;</span>
359
370
  <span class="cline-any cline-neutral">&nbsp;</span>
360
371
  <span class="cline-any cline-neutral">&nbsp;</span>
361
- <span class="cline-any cline-yes">22x</span>
362
- <span class="cline-any cline-yes">22x</span>
363
- <span class="cline-any cline-yes">22x</span>
372
+ <span class="cline-any cline-yes">23x</span>
373
+ <span class="cline-any cline-yes">23x</span>
374
+ <span class="cline-any cline-yes">23x</span>
364
375
  <span class="cline-any cline-neutral">&nbsp;</span>
365
376
  <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-yes">22x</span>
377
+ <span class="cline-any cline-yes">23x</span>
367
378
  <span class="cline-any cline-neutral">&nbsp;</span>
368
379
  <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-yes">22x</span>
380
+ <span class="cline-any cline-yes">23x</span>
370
381
  <span class="cline-any cline-neutral">&nbsp;</span>
371
382
  <span class="cline-any cline-neutral">&nbsp;</span>
372
383
  <span class="cline-any cline-neutral">&nbsp;</span>
373
384
  <span class="cline-any cline-neutral">&nbsp;</span>
374
385
  <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-yes">22x</span>
386
+ <span class="cline-any cline-yes">23x</span>
376
387
  <span class="cline-any cline-neutral">&nbsp;</span>
377
388
  <span class="cline-any cline-neutral">&nbsp;</span>
378
389
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -388,10 +399,19 @@
388
399
  <span class="cline-any cline-neutral">&nbsp;</span>
389
400
  <span class="cline-any cline-no">&nbsp;</span>
390
401
  <span class="cline-any cline-no">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-no">&nbsp;</span>
391
405
  <span class="cline-any cline-no">&nbsp;</span>
406
+ <span class="cline-any cline-no">&nbsp;</span>
407
+ <span class="cline-any cline-neutral">&nbsp;</span>
408
+ <span class="cline-any cline-neutral">&nbsp;</span>
409
+ <span class="cline-any cline-no">&nbsp;</span>
410
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
411
  <span class="cline-any cline-neutral">&nbsp;</span>
393
412
  <span class="cline-any cline-no">&nbsp;</span>
394
413
  <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-no">&nbsp;</span>
395
415
  <span class="cline-any cline-neutral">&nbsp;</span>
396
416
  <span class="cline-any cline-neutral">&nbsp;</span>
397
417
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -404,15 +424,17 @@
404
424
  <span class="cline-any cline-neutral">&nbsp;</span>
405
425
  <span class="cline-any cline-neutral">&nbsp;</span>
406
426
  <span class="cline-any cline-neutral">&nbsp;</span>
407
- <span class="cline-any cline-yes">9x</span>
408
- <span class="cline-any cline-yes">9x</span>
409
427
  <span class="cline-any cline-neutral">&nbsp;</span>
428
+ <span class="cline-any cline-yes">10x</span>
429
+ <span class="cline-any cline-yes">10x</span>
410
430
  <span class="cline-any cline-neutral">&nbsp;</span>
411
431
  <span class="cline-any cline-neutral">&nbsp;</span>
412
432
  <span class="cline-any cline-neutral">&nbsp;</span>
413
433
  <span class="cline-any cline-neutral">&nbsp;</span>
414
434
  <span class="cline-any cline-neutral">&nbsp;</span>
415
- <span class="cline-any cline-yes">9x</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-yes">10x</span>
416
438
  <span class="cline-any cline-neutral">&nbsp;</span>
417
439
  <span class="cline-any cline-neutral">&nbsp;</span>
418
440
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -647,9 +669,19 @@ If an object is present multiple times, name them according to their unique char
647
669
  * @returns {Promise&lt;Object&gt;} - Image data for API
648
670
  */
649
671
  <span class="fstat-no" title="function not covered" > as</span>ync _loadImage(imagePath) {
650
- const imageBuffer = <span class="cstat-no" title="statement not covered" >await fs.readFile(imagePath);</span>
672
+ let imageBuffer = <span class="cstat-no" title="statement not covered" >await fs.readFile(imagePath);</span>
673
+ let mimeType = <span class="cstat-no" title="statement not covered" >this._getMimeType(imagePath);</span>
674
+
675
+ // Convert SVG to PNG for API compatibility
676
+ <span class="cstat-no" title="statement not covered" > if (mimeType === 'image/svg+xml') {</span>
677
+ const sharp = <span class="cstat-no" title="statement not covered" >require('sharp');</span>
678
+ <span class="cstat-no" title="statement not covered" > imageBuffer = await sharp(imageBuffer)</span>
679
+ .png()
680
+ .toBuffer();
681
+ <span class="cstat-no" title="statement not covered" > mimeType = 'image/png';</span>
682
+ }
683
+
651
684
  const base64Data = <span class="cstat-no" title="statement not covered" >imageBuffer.toString('base64');</span>
652
- const mimeType = <span class="cstat-no" title="statement not covered" >this._getMimeType(imagePath);</span>
653
685
 
654
686
  <span class="cstat-no" title="statement not covered" > return {</span>
655
687
  inlineData: {
@@ -671,7 +703,8 @@ If an object is present multiple times, name them according to their unique char
671
703
  'jpeg': 'image/jpeg',
672
704
  'png': 'image/png',
673
705
  'gif': 'image/gif',
674
- 'webp': 'image/webp'
706
+ 'webp': 'image/webp',
707
+ 'svg': 'image/svg+xml'
675
708
  };
676
709
  return mimeTypes[ext] || 'image/jpeg';
677
710
  }
@@ -853,7 +886,7 @@ module.exports = VSegments;
853
886
  <div class='footer quiet pad2 space-top1 center small'>
854
887
  Code coverage generated by
855
888
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
856
- at 2025-12-05T12:45:03.605Z
889
+ at 2025-12-05T14:58:27.396Z
857
890
  </div>
858
891
  <script src="prettify.js"></script>
859
892
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">38.7% </span>
26
+ <span class="strong">38% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>84/217</span>
28
+ <span class='fraction'>84/221</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">32.87% </span>
33
+ <span class="strong">32% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>24/73</span>
35
+ <span class='fraction'>24/75</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">38.86% </span>
47
+ <span class="strong">38.13% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>82/211</span>
49
+ <span class='fraction'>82/215</span>
50
50
  </div>
51
51
 
52
52
 
@@ -80,17 +80,17 @@
80
80
  </thead>
81
81
  <tbody><tr>
82
82
  <td class="file low" data-value="core.js"><a href="core.js.html">core.js</a></td>
83
- <td data-value="36.5" class="pic low">
84
- <div class="chart"><div class="cover-fill" style="width: 36%"></div><div class="cover-empty" style="width: 64%"></div></div>
83
+ <td data-value="34.32" class="pic low">
84
+ <div class="chart"><div class="cover-fill" style="width: 34%"></div><div class="cover-empty" style="width: 66%"></div></div>
85
85
  </td>
86
- <td data-value="36.5" class="pct low">36.5%</td>
87
- <td data-value="63" class="abs low">23/63</td>
88
- <td data-value="42.85" class="pct low">42.85%</td>
89
- <td data-value="35" class="abs low">15/35</td>
86
+ <td data-value="34.32" class="pct low">34.32%</td>
87
+ <td data-value="67" class="abs low">23/67</td>
88
+ <td data-value="40.54" class="pct low">40.54%</td>
89
+ <td data-value="37" class="abs low">15/37</td>
90
90
  <td data-value="42.85" class="pct low">42.85%</td>
91
91
  <td data-value="7" class="abs low">3/7</td>
92
- <td data-value="36.5" class="pct low">36.5%</td>
93
- <td data-value="63" class="abs low">23/63</td>
92
+ <td data-value="34.32" class="pct low">34.32%</td>
93
+ <td data-value="67" class="abs low">23/67</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -161,7 +161,7 @@
161
161
  <div class='footer quiet pad2 space-top1 center small'>
162
162
  Code coverage generated by
163
163
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
164
- at 2025-12-05T12:45:03.605Z
164
+ at 2025-12-05T14:58:27.396Z
165
165
  </div>
166
166
  <script src="prettify.js"></script>
167
167
  <script>
@@ -130,7 +130,7 @@ module.exports.version = '0.1.0';
130
130
  <div class='footer quiet pad2 space-top1 center small'>
131
131
  Code coverage generated by
132
132
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
133
- at 2025-12-05T12:45:03.605Z
133
+ at 2025-12-05T14:58:27.396Z
134
134
  </div>
135
135
  <script src="prettify.js"></script>
136
136
  <script>
@@ -367,7 +367,7 @@ module.exports = {
367
367
  <div class='footer quiet pad2 space-top1 center small'>
368
368
  Code coverage generated by
369
369
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
370
- at 2025-12-05T12:45:03.605Z
370
+ at 2025-12-05T14:58:27.396Z
371
371
  </div>
372
372
  <script src="prettify.js"></script>
373
373
  <script>
@@ -424,7 +424,7 @@ module.exports = {
424
424
  <div class='footer quiet pad2 space-top1 center small'>
425
425
  Code coverage generated by
426
426
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
427
- at 2025-12-05T12:45:03.605Z
427
+ at 2025-12-05T14:58:27.396Z
428
428
  </div>
429
429
  <script src="prettify.js"></script>
430
430
  <script>
@@ -616,7 +616,7 @@ module.exports = {
616
616
  <div class='footer quiet pad2 space-top1 center small'>
617
617
  Code coverage generated by
618
618
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
619
- at 2025-12-05T12:45:03.605Z
619
+ at 2025-12-05T14:58:27.396Z
620
620
  </div>
621
621
  <script src="prettify.js"></script>
622
622
  <script>
@@ -2,16 +2,16 @@ TN:
2
2
  SF:src/core.js
3
3
  FN:26,(anonymous_0)
4
4
  FN:62,(anonymous_1)
5
- FN:80,(anonymous_2)
6
- FN:97,(anonymous_3)
7
- FN:116,(anonymous_4)
8
- FN:168,(anonymous_5)
9
- FN:227,(anonymous_6)
5
+ FN:90,(anonymous_2)
6
+ FN:108,(anonymous_3)
7
+ FN:127,(anonymous_4)
8
+ FN:179,(anonymous_5)
9
+ FN:238,(anonymous_6)
10
10
  FNF:7
11
11
  FNH:3
12
- FNDA:23,(anonymous_0)
12
+ FNDA:24,(anonymous_0)
13
13
  FNDA:0,(anonymous_1)
14
- FNDA:9,(anonymous_2)
14
+ FNDA:10,(anonymous_2)
15
15
  FNDA:3,(anonymous_3)
16
16
  FNDA:0,(anonymous_4)
17
17
  FNDA:0,(anonymous_5)
@@ -22,101 +22,107 @@ DA:7,2
22
22
  DA:8,2
23
23
  DA:9,2
24
24
  DA:15,2
25
- DA:27,23
26
- DA:29,23
25
+ DA:27,24
26
+ DA:29,24
27
27
  DA:30,1
28
- DA:35,22
29
- DA:36,22
30
- DA:37,22
31
- DA:40,22
32
- DA:43,22
33
- DA:49,22
28
+ DA:35,23
29
+ DA:36,23
30
+ DA:37,23
31
+ DA:40,23
32
+ DA:43,23
33
+ DA:49,23
34
34
  DA:63,0
35
35
  DA:64,0
36
- DA:65,0
37
36
  DA:67,0
38
- DA:81,9
39
- DA:82,9
40
- DA:89,9
41
- DA:98,3
42
- DA:100,3
43
- DA:101,1
44
- DA:104,3
45
- DA:121,0
46
- DA:124,0
47
- DA:127,0
37
+ DA:68,0
38
+ DA:69,0
39
+ DA:72,0
40
+ DA:75,0
41
+ DA:77,0
42
+ DA:91,10
43
+ DA:92,10
44
+ DA:100,10
45
+ DA:109,3
46
+ DA:111,3
47
+ DA:112,1
48
+ DA:115,3
49
+ DA:132,0
48
50
  DA:135,0
49
- DA:136,0
50
- DA:143,0
51
- DA:144,0
51
+ DA:138,0
52
52
  DA:146,0
53
53
  DA:147,0
54
- DA:151,0
54
+ DA:154,0
55
55
  DA:155,0
56
56
  DA:157,0
57
- DA:172,0
58
- DA:175,0
59
- DA:178,0
60
- DA:179,0
61
- DA:180,0
57
+ DA:158,0
58
+ DA:162,0
59
+ DA:166,0
60
+ DA:168,0
62
61
  DA:183,0
62
+ DA:186,0
63
+ DA:189,0
63
64
  DA:190,0
64
65
  DA:191,0
65
- DA:198,0
66
- DA:199,0
66
+ DA:194,0
67
67
  DA:201,0
68
68
  DA:202,0
69
- DA:206,0
69
+ DA:209,0
70
70
  DA:210,0
71
- DA:211,0
71
+ DA:212,0
72
72
  DA:213,0
73
- DA:233,0
74
- DA:236,0
75
- DA:239,0
76
- DA:240,0
77
- DA:246,0
78
- DA:253,0
79
- DA:254,0
73
+ DA:217,0
74
+ DA:221,0
75
+ DA:222,0
76
+ DA:224,0
77
+ DA:244,0
78
+ DA:247,0
79
+ DA:250,0
80
+ DA:251,0
80
81
  DA:257,0
81
- DA:261,2
82
- LF:63
82
+ DA:264,0
83
+ DA:265,0
84
+ DA:268,0
85
+ DA:272,2
86
+ LF:67
83
87
  LH:23
84
88
  BRDA:26,0,0,2
85
- BRDA:27,1,0,23
89
+ BRDA:27,1,0,24
86
90
  BRDA:27,1,1,2
87
91
  BRDA:29,2,0,1
88
- BRDA:29,2,1,22
89
- BRDA:35,3,0,22
90
- BRDA:35,3,1,21
92
+ BRDA:29,2,1,23
93
+ BRDA:35,3,0,23
94
+ BRDA:35,3,1,22
91
95
  BRDA:36,4,0,2
92
- BRDA:36,4,1,20
93
- BRDA:37,5,0,22
94
- BRDA:37,5,1,17
95
- BRDA:89,6,0,9
96
- BRDA:89,6,1,2
97
- BRDA:100,7,0,1
96
+ BRDA:36,4,1,21
97
+ BRDA:37,5,0,23
98
+ BRDA:37,5,1,18
99
+ BRDA:67,6,0,0
100
+ BRDA:67,6,1,0
101
+ BRDA:100,7,0,10
98
102
  BRDA:100,7,1,2
99
- BRDA:116,8,0,0
100
- BRDA:118,9,0,0
101
- BRDA:119,10,0,0
102
- BRDA:120,11,0,0
103
- BRDA:146,12,0,0
104
- BRDA:146,12,1,0
105
- BRDA:168,13,0,0
106
- BRDA:170,14,0,0
107
- BRDA:171,15,0,0
108
- BRDA:201,16,0,0
109
- BRDA:201,16,1,0
110
- BRDA:227,17,0,0
111
- BRDA:229,18,0,0
112
- BRDA:230,19,0,0
113
- BRDA:231,20,0,0
114
- BRDA:232,21,0,0
115
- BRDA:239,22,0,0
116
- BRDA:239,22,1,0
117
- BRDA:253,23,0,0
118
- BRDA:253,23,1,0
119
- BRF:35
103
+ BRDA:111,8,0,1
104
+ BRDA:111,8,1,2
105
+ BRDA:127,9,0,0
106
+ BRDA:129,10,0,0
107
+ BRDA:130,11,0,0
108
+ BRDA:131,12,0,0
109
+ BRDA:157,13,0,0
110
+ BRDA:157,13,1,0
111
+ BRDA:179,14,0,0
112
+ BRDA:181,15,0,0
113
+ BRDA:182,16,0,0
114
+ BRDA:212,17,0,0
115
+ BRDA:212,17,1,0
116
+ BRDA:238,18,0,0
117
+ BRDA:240,19,0,0
118
+ BRDA:241,20,0,0
119
+ BRDA:242,21,0,0
120
+ BRDA:243,22,0,0
121
+ BRDA:250,23,0,0
122
+ BRDA:250,23,1,0
123
+ BRDA:264,24,0,0
124
+ BRDA:264,24,1,0
125
+ BRF:37
120
126
  BRH:15
121
127
  end_of_record
122
128
  TN:
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "vsegments",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Visual segmentation and bounding box detection using Google Gemini AI",
5
5
  "main": "src/index.js",
6
6
  "types": "src/index.d.ts",
7
7
  "bin": {
8
- "vsegments": "./bin/cli.js"
8
+ "vsegments": "bin/cli.js"
9
9
  },
10
10
  "scripts": {
11
11
  "test": "jest",
@@ -30,7 +30,7 @@
30
30
  "license": "MIT",
31
31
  "repository": {
32
32
  "type": "git",
33
- "url": "git@github.com:nxtphaseai/node_vsegments.git"
33
+ "url": "git+ssh://git@github.com/nxtphaseai/node_vsegments.git"
34
34
  },
35
35
  "homepage": "https://github.com/nxtphaseai/node_vsegments#readme",
36
36
  "bugs": {
@@ -42,7 +42,9 @@
42
42
  "dependencies": {
43
43
  "@google/generative-ai": "^0.21.0",
44
44
  "canvas": "^2.11.2",
45
- "commander": "^12.0.0"
45
+ "commander": "^12.0.0",
46
+ "sharp": "^0.33.0",
47
+ "vsegments": "^0.1.4"
46
48
  },
47
49
  "devDependencies": {
48
50
  "@types/jest": "^30.0.0",
package/src/core.js CHANGED
@@ -7,11 +7,11 @@ const { loadImage } = require('canvas');
7
7
  const fs = require('fs').promises;
8
8
  const { SegmentationResult } = require('./models');
9
9
  const { parseBoundingBoxes, parseSegmentationMasks } = require('./utils');
10
- const {
11
- loadImageToCanvas,
12
- plotBoundingBoxes,
10
+ const {
11
+ loadImageToCanvas,
12
+ plotBoundingBoxes,
13
13
  plotSegmentationMasks,
14
- saveCanvas
14
+ saveCanvas
15
15
  } = require('./visualize');
16
16
 
17
17
  class VSegments {
@@ -25,26 +25,37 @@ class VSegments {
25
25
  */
26
26
  constructor(options = {}) {
27
27
  this.apiKey = options.apiKey || process.env.GOOGLE_API_KEY;
28
-
28
+
29
29
  if (!this.apiKey) {
30
30
  throw new Error(
31
31
  'API key must be provided or set in GOOGLE_API_KEY environment variable'
32
32
  );
33
33
  }
34
-
34
+
35
35
  this.model = options.model || 'gemini-3-pro-preview';
36
36
  this.temperature = options.temperature !== undefined ? options.temperature : 0.5;
37
37
  this.maxObjects = options.maxObjects || 25;
38
-
38
+
39
39
  // Initialize Google AI client
40
40
  this.genAI = new GoogleGenerativeAI(this.apiKey);
41
-
41
+
42
42
  // Default system instructions
43
43
  this.defaultSystemInstructions = `
44
- Return bounding boxes as a JSON array with labels. Never return masks or code fencing. Limit to ${this.maxObjects} objects.
45
- If an object is present multiple times, name them according to their unique characteristic (colors, size, position, unique characteristics, etc..).
44
+ Return bounding boxes as a JSON array with labels.
45
+ Never return masks or code fencing. Limit to ${this.maxObjects} objects.
46
+
47
+ Follow this intuition:
48
+ If an object is present multiple times, name them according to their unique characteristic
49
+ (colors, size, position, unique characteristics, etc..).
50
+ If the object is a face number them according to how someone would draw the features of the face. First the left eye, then the right eye
51
+ then the nose, then the left ear, then the right ear, then the mouth, then the chin.
52
+ Same with Animal faces.
53
+
54
+ General guideline:
55
+ Follow a drawing order intuitively. People usually do not draw first an eye, and then the background and then the shirt but they
56
+ follow a more natural order with symmetry in mind.
46
57
  `.trim();
47
-
58
+
48
59
  // Safety settings
49
60
  this.safetySettings = [
50
61
  {
@@ -53,17 +64,27 @@ If an object is present multiple times, name them according to their unique char
53
64
  },
54
65
  ];
55
66
  }
56
-
67
+
57
68
  /**
58
69
  * Load image from file and convert to format for API
59
70
  * @param {string} imagePath - Path to image file
60
71
  * @returns {Promise<Object>} - Image data for API
61
72
  */
62
73
  async _loadImage(imagePath) {
63
- const imageBuffer = await fs.readFile(imagePath);
74
+ let imageBuffer = await fs.readFile(imagePath);
75
+ let mimeType = this._getMimeType(imagePath);
76
+
77
+ // Convert SVG to PNG for API compatibility
78
+ if (mimeType === 'image/svg+xml') {
79
+ const sharp = require('sharp');
80
+ imageBuffer = await sharp(imageBuffer)
81
+ .png()
82
+ .toBuffer();
83
+ mimeType = 'image/png';
84
+ }
85
+
64
86
  const base64Data = imageBuffer.toString('base64');
65
- const mimeType = this._getMimeType(imagePath);
66
-
87
+
67
88
  return {
68
89
  inlineData: {
69
90
  data: base64Data,
@@ -71,7 +92,7 @@ If an object is present multiple times, name them according to their unique char
71
92
  }
72
93
  };
73
94
  }
74
-
95
+
75
96
  /**
76
97
  * Get MIME type from file extension
77
98
  * @param {string} filePath - File path
@@ -84,11 +105,12 @@ If an object is present multiple times, name them according to their unique char
84
105
  'jpeg': 'image/jpeg',
85
106
  'png': 'image/png',
86
107
  'gif': 'image/gif',
87
- 'webp': 'image/webp'
108
+ 'webp': 'image/webp',
109
+ 'svg': 'image/svg+xml'
88
110
  };
89
111
  return mimeTypes[ext] || 'image/jpeg';
90
112
  }
91
-
113
+
92
114
  /**
93
115
  * Get system instructions with custom additions
94
116
  * @param {string} customInstructions - Additional instructions
@@ -96,14 +118,14 @@ If an object is present multiple times, name them according to their unique char
96
118
  */
97
119
  _getSystemInstructions(customInstructions) {
98
120
  let instructions = this.defaultSystemInstructions;
99
-
121
+
100
122
  if (customInstructions) {
101
123
  instructions += '\n' + customInstructions;
102
124
  }
103
-
125
+
104
126
  return instructions;
105
127
  }
106
-
128
+
107
129
  /**
108
130
  * Detect bounding boxes in an image
109
131
  * @param {string} imagePath - Path to image file
@@ -119,17 +141,17 @@ If an object is present multiple times, name them according to their unique char
119
141
  customInstructions = null,
120
142
  maxSize = 1024
121
143
  } = options;
122
-
144
+
123
145
  // Load image
124
146
  const image = await this._loadImage(imagePath);
125
-
147
+
126
148
  // Get model
127
149
  const model = this.genAI.getGenerativeModel({
128
150
  model: this.model,
129
151
  safetySettings: this.safetySettings,
130
152
  systemInstruction: this._getSystemInstructions(customInstructions)
131
153
  });
132
-
154
+
133
155
  // Generate content
134
156
  let result, response, text;
135
157
  try {
@@ -139,7 +161,7 @@ If an object is present multiple times, name them according to their unique char
139
161
  temperature: this.temperature,
140
162
  }
141
163
  });
142
-
164
+
143
165
  response = result.response;
144
166
  text = response.text();
145
167
  } catch (error) {
@@ -150,13 +172,13 @@ If an object is present multiple times, name them according to their unique char
150
172
  }
151
173
  throw error;
152
174
  }
153
-
175
+
154
176
  // Parse response
155
177
  const boxes = parseBoundingBoxes(text);
156
-
178
+
157
179
  return new SegmentationResult(boxes, null, text);
158
180
  }
159
-
181
+
160
182
  /**
161
183
  * Perform segmentation on an image
162
184
  * @param {string} imagePath - Path to image file
@@ -170,21 +192,21 @@ If an object is present multiple times, name them according to their unique char
170
192
  prompt = 'Give the segmentation masks for the objects. Output a JSON list of segmentation masks where each entry contains the 2D bounding box in the key "box_2d", the segmentation mask in key "mask", and the text label in the key "label". Use descriptive labels.',
171
193
  maxSize = 1024
172
194
  } = options;
173
-
195
+
174
196
  // Load image
175
197
  const image = await this._loadImage(imagePath);
176
-
198
+
177
199
  // Get image dimensions
178
200
  const img = await loadImage(imagePath);
179
201
  const imgWidth = img.width;
180
202
  const imgHeight = img.height;
181
-
203
+
182
204
  // Get model (no system instructions for segmentation)
183
205
  const model = this.genAI.getGenerativeModel({
184
206
  model: this.model,
185
207
  safetySettings: this.safetySettings
186
208
  });
187
-
209
+
188
210
  // Generate content
189
211
  let result, response, text;
190
212
  try {
@@ -194,7 +216,7 @@ If an object is present multiple times, name them according to their unique char
194
216
  temperature: this.temperature,
195
217
  }
196
218
  });
197
-
219
+
198
220
  response = result.response;
199
221
  text = response.text();
200
222
  } catch (error) {
@@ -205,14 +227,14 @@ If an object is present multiple times, name them according to their unique char
205
227
  }
206
228
  throw error;
207
229
  }
208
-
230
+
209
231
  // Parse response
210
232
  const boxes = parseBoundingBoxes(text);
211
233
  const masks = await parseSegmentationMasks(text, imgHeight, imgWidth);
212
-
234
+
213
235
  return new SegmentationResult(boxes, masks, text);
214
236
  }
215
-
237
+
216
238
  /**
217
239
  * Visualize detection/segmentation results
218
240
  * @param {string} imagePath - Path to original image
@@ -231,10 +253,10 @@ If an object is present multiple times, name them according to their unique char
231
253
  fontSize = 14,
232
254
  alpha = 0.7
233
255
  } = options;
234
-
256
+
235
257
  // Load image to canvas
236
258
  const canvas = await loadImageToCanvas(imagePath, 2048);
237
-
259
+
238
260
  // Draw visualizations
239
261
  if (result.masks) {
240
262
  plotSegmentationMasks(canvas, result.masks, {
@@ -248,12 +270,12 @@ If an object is present multiple times, name them according to their unique char
248
270
  fontSize
249
271
  });
250
272
  }
251
-
273
+
252
274
  // Save if requested
253
275
  if (outputPath) {
254
276
  await saveCanvas(canvas, outputPath);
255
277
  }
256
-
278
+
257
279
  return canvas;
258
280
  }
259
281
  }