floatnote 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.beads/config.json +6 -0
- package/.beads/issues/floatnote-1.md +21 -0
- package/.beads/issues/floatnote-10.md +28 -0
- package/.beads/issues/floatnote-11.md +36 -0
- package/.beads/issues/floatnote-12.md +25 -0
- package/.beads/issues/floatnote-13.md +37 -0
- package/.beads/issues/floatnote-14.md +22 -0
- package/.beads/issues/floatnote-15.md +22 -0
- package/.beads/issues/floatnote-16.md +20 -0
- package/.beads/issues/floatnote-17.md +20 -0
- package/.beads/issues/floatnote-18.md +21 -0
- package/.beads/issues/floatnote-19.md +19 -0
- package/.beads/issues/floatnote-2.md +32 -0
- package/.beads/issues/floatnote-20.md +22 -0
- package/.beads/issues/floatnote-3.md +50 -0
- package/.beads/issues/floatnote-4.md +31 -0
- package/.beads/issues/floatnote-5.md +28 -0
- package/.beads/issues/floatnote-6.md +30 -0
- package/.beads/issues/floatnote-7.md +38 -0
- package/.beads/issues/floatnote-8.md +29 -0
- package/.beads/issues/floatnote-9.md +32 -0
- package/CLAUDE.md +61 -0
- package/README.md +95 -0
- package/bin/floatnote.js +218 -0
- package/coverage/base.css +224 -0
- package/coverage/bin/floatnote.js.html +739 -0
- package/coverage/bin/index.html +116 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +131 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/bin/floatnote.js.html +739 -0
- package/coverage/lcov-report/bin/index.html +116 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +131 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/index.html +146 -0
- package/coverage/lcov-report/src/main.js.html +1483 -0
- package/coverage/lcov-report/src/preload.js.html +361 -0
- package/coverage/lcov-report/src/renderer.js.html +8767 -0
- package/coverage/lcov.info +3273 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/index.html +146 -0
- package/coverage/src/main.js.html +1483 -0
- package/coverage/src/preload.js.html +361 -0
- package/coverage/src/renderer.js.html +8767 -0
- package/jest.config.js +48 -0
- package/package.json +59 -0
- package/src/icon-template.png +0 -0
- package/src/index.html +296 -0
- package/src/main.js +494 -0
- package/src/preload.js +96 -0
- package/src/renderer.js +3203 -0
- package/src/styles.css +1448 -0
- package/tests/cli/floatnote.test.js +167 -0
- package/tests/main/main.test.js +287 -0
- package/tests/mocks/electron.js +126 -0
- package/tests/mocks/fs.js +17 -0
- package/tests/preload/preload.test.js +218 -0
- package/tests/renderer/history.test.js +234 -0
- package/tests/renderer/notes.test.js +262 -0
- package/tests/renderer/settings.test.js +178 -0
|
@@ -0,0 +1,739 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for bin/floatnote.js</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">bin</a> floatnote.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">0% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>0/112</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/55</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/18</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">0% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>0/109</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
286
|
+
<span class="cline-any cline-no"> </span>
|
|
287
|
+
<span class="cline-any cline-no"> </span>
|
|
288
|
+
<span class="cline-any cline-no"> </span>
|
|
289
|
+
<span class="cline-any cline-no"> </span>
|
|
290
|
+
<span class="cline-any cline-no"> </span>
|
|
291
|
+
<span class="cline-any cline-no"> </span>
|
|
292
|
+
<span class="cline-any cline-neutral"> </span>
|
|
293
|
+
<span class="cline-any cline-no"> </span>
|
|
294
|
+
<span class="cline-any cline-no"> </span>
|
|
295
|
+
<span class="cline-any cline-no"> </span>
|
|
296
|
+
<span class="cline-any cline-no"> </span>
|
|
297
|
+
<span class="cline-any cline-no"> </span>
|
|
298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
300
|
+
<span class="cline-any cline-no"> </span>
|
|
301
|
+
<span class="cline-any cline-neutral"> </span>
|
|
302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
304
|
+
<span class="cline-any cline-no"> </span>
|
|
305
|
+
<span class="cline-any cline-no"> </span>
|
|
306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
308
|
+
<span class="cline-any cline-neutral"> </span>
|
|
309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
311
|
+
<span class="cline-any cline-no"> </span>
|
|
312
|
+
<span class="cline-any cline-no"> </span>
|
|
313
|
+
<span class="cline-any cline-no"> </span>
|
|
314
|
+
<span class="cline-any cline-no"> </span>
|
|
315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
316
|
+
<span class="cline-any cline-no"> </span>
|
|
317
|
+
<span class="cline-any cline-no"> </span>
|
|
318
|
+
<span class="cline-any cline-no"> </span>
|
|
319
|
+
<span class="cline-any cline-no"> </span>
|
|
320
|
+
<span class="cline-any cline-no"> </span>
|
|
321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
322
|
+
<span class="cline-any cline-no"> </span>
|
|
323
|
+
<span class="cline-any cline-neutral"> </span>
|
|
324
|
+
<span class="cline-any cline-neutral"> </span>
|
|
325
|
+
<span class="cline-any cline-no"> </span>
|
|
326
|
+
<span class="cline-any cline-neutral"> </span>
|
|
327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
328
|
+
<span class="cline-any cline-neutral"> </span>
|
|
329
|
+
<span class="cline-any cline-neutral"> </span>
|
|
330
|
+
<span class="cline-any cline-neutral"> </span>
|
|
331
|
+
<span class="cline-any cline-no"> </span>
|
|
332
|
+
<span class="cline-any cline-no"> </span>
|
|
333
|
+
<span class="cline-any cline-no"> </span>
|
|
334
|
+
<span class="cline-any cline-no"> </span>
|
|
335
|
+
<span class="cline-any cline-neutral"> </span>
|
|
336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
340
|
+
<span class="cline-any cline-no"> </span>
|
|
341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
342
|
+
<span class="cline-any cline-no"> </span>
|
|
343
|
+
<span class="cline-any cline-no"> </span>
|
|
344
|
+
<span class="cline-any cline-no"> </span>
|
|
345
|
+
<span class="cline-any cline-neutral"> </span>
|
|
346
|
+
<span class="cline-any cline-neutral"> </span>
|
|
347
|
+
<span class="cline-any cline-no"> </span>
|
|
348
|
+
<span class="cline-any cline-no"> </span>
|
|
349
|
+
<span class="cline-any cline-no"> </span>
|
|
350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
352
|
+
<span class="cline-any cline-no"> </span>
|
|
353
|
+
<span class="cline-any cline-no"> </span>
|
|
354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
355
|
+
<span class="cline-any cline-no"> </span>
|
|
356
|
+
<span class="cline-any cline-no"> </span>
|
|
357
|
+
<span class="cline-any cline-no"> </span>
|
|
358
|
+
<span class="cline-any cline-no"> </span>
|
|
359
|
+
<span class="cline-any cline-no"> </span>
|
|
360
|
+
<span class="cline-any cline-no"> </span>
|
|
361
|
+
<span class="cline-any cline-neutral"> </span>
|
|
362
|
+
<span class="cline-any cline-neutral"> </span>
|
|
363
|
+
<span class="cline-any cline-no"> </span>
|
|
364
|
+
<span class="cline-any cline-no"> </span>
|
|
365
|
+
<span class="cline-any cline-no"> </span>
|
|
366
|
+
<span class="cline-any cline-no"> </span>
|
|
367
|
+
<span class="cline-any cline-neutral"> </span>
|
|
368
|
+
<span class="cline-any cline-no"> </span>
|
|
369
|
+
<span class="cline-any cline-no"> </span>
|
|
370
|
+
<span class="cline-any cline-no"> </span>
|
|
371
|
+
<span class="cline-any cline-neutral"> </span>
|
|
372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
374
|
+
<span class="cline-any cline-neutral"> </span>
|
|
375
|
+
<span class="cline-any cline-no"> </span>
|
|
376
|
+
<span class="cline-any cline-neutral"> </span>
|
|
377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
380
|
+
<span class="cline-any cline-no"> </span>
|
|
381
|
+
<span class="cline-any cline-no"> </span>
|
|
382
|
+
<span class="cline-any cline-no"> </span>
|
|
383
|
+
<span class="cline-any cline-neutral"> </span>
|
|
384
|
+
<span class="cline-any cline-neutral"> </span>
|
|
385
|
+
<span class="cline-any cline-neutral"> </span>
|
|
386
|
+
<span class="cline-any cline-neutral"> </span>
|
|
387
|
+
<span class="cline-any cline-no"> </span>
|
|
388
|
+
<span class="cline-any cline-no"> </span>
|
|
389
|
+
<span class="cline-any cline-no"> </span>
|
|
390
|
+
<span class="cline-any cline-no"> </span>
|
|
391
|
+
<span class="cline-any cline-no"> </span>
|
|
392
|
+
<span class="cline-any cline-neutral"> </span>
|
|
393
|
+
<span class="cline-any cline-no"> </span>
|
|
394
|
+
<span class="cline-any cline-no"> </span>
|
|
395
|
+
<span class="cline-any cline-neutral"> </span>
|
|
396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
398
|
+
<span class="cline-any cline-neutral"> </span>
|
|
399
|
+
<span class="cline-any cline-neutral"> </span>
|
|
400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
401
|
+
<span class="cline-any cline-neutral"> </span>
|
|
402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
404
|
+
<span class="cline-any cline-neutral"> </span>
|
|
405
|
+
<span class="cline-any cline-neutral"> </span>
|
|
406
|
+
<span class="cline-any cline-neutral"> </span>
|
|
407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
410
|
+
<span class="cline-any cline-neutral"> </span>
|
|
411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
412
|
+
<span class="cline-any cline-no"> </span>
|
|
413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
414
|
+
<span class="cline-any cline-neutral"> </span>
|
|
415
|
+
<span class="cline-any cline-no"> </span>
|
|
416
|
+
<span class="cline-any cline-no"> </span>
|
|
417
|
+
<span class="cline-any cline-no"> </span>
|
|
418
|
+
<span class="cline-any cline-no"> </span>
|
|
419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
420
|
+
<span class="cline-any cline-no"> </span>
|
|
421
|
+
<span class="cline-any cline-neutral"> </span>
|
|
422
|
+
<span class="cline-any cline-no"> </span>
|
|
423
|
+
<span class="cline-any cline-neutral"> </span>
|
|
424
|
+
<span class="cline-any cline-neutral"> </span>
|
|
425
|
+
<span class="cline-any cline-neutral"> </span>
|
|
426
|
+
<span class="cline-any cline-no"> </span>
|
|
427
|
+
<span class="cline-any cline-no"> </span>
|
|
428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
429
|
+
<span class="cline-any cline-neutral"> </span>
|
|
430
|
+
<span class="cline-any cline-no"> </span>
|
|
431
|
+
<span class="cline-any cline-no"> </span>
|
|
432
|
+
<span class="cline-any cline-neutral"> </span>
|
|
433
|
+
<span class="cline-any cline-neutral"> </span>
|
|
434
|
+
<span class="cline-any cline-no"> </span>
|
|
435
|
+
<span class="cline-any cline-no"> </span>
|
|
436
|
+
<span class="cline-any cline-no"> </span>
|
|
437
|
+
<span class="cline-any cline-neutral"> </span>
|
|
438
|
+
<span class="cline-any cline-no"> </span>
|
|
439
|
+
<span class="cline-any cline-no"> </span>
|
|
440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
442
|
+
<span class="cline-any cline-no"> </span>
|
|
443
|
+
<span class="cline-any cline-no"> </span>
|
|
444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
447
|
+
<span class="cline-any cline-neutral"> </span>
|
|
448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
449
|
+
<span class="cline-any cline-no"> </span>
|
|
450
|
+
<span class="cline-any cline-no"> </span>
|
|
451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
453
|
+
<span class="cline-any cline-no"> </span>
|
|
454
|
+
<span class="cline-any cline-neutral"> </span>
|
|
455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
456
|
+
<span class="cline-any cline-no"> </span>
|
|
457
|
+
<span class="cline-any cline-no"> </span>
|
|
458
|
+
<span class="cline-any cline-no"> </span>
|
|
459
|
+
<span class="cline-any cline-no"> </span>
|
|
460
|
+
<span class="cline-any cline-no"> </span>
|
|
461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
462
|
+
<span class="cline-any cline-neutral"> </span>
|
|
463
|
+
<span class="cline-any cline-neutral"> </span>
|
|
464
|
+
<span class="cline-any cline-neutral"> </span>
|
|
465
|
+
<span class="cline-any cline-no"> </span>
|
|
466
|
+
<span class="cline-any cline-no"> </span>
|
|
467
|
+
<span class="cline-any cline-no"> </span>
|
|
468
|
+
<span class="cline-any cline-neutral"> </span>
|
|
469
|
+
<span class="cline-any cline-no"> </span>
|
|
470
|
+
<span class="cline-any cline-no"> </span>
|
|
471
|
+
<span class="cline-any cline-neutral"> </span>
|
|
472
|
+
<span class="cline-any cline-neutral"> </span>
|
|
473
|
+
<span class="cline-any cline-no"> </span>
|
|
474
|
+
<span class="cline-any cline-no"> </span>
|
|
475
|
+
<span class="cline-any cline-neutral"> </span>
|
|
476
|
+
<span class="cline-any cline-no"> </span>
|
|
477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
478
|
+
<span class="cline-any cline-neutral"> </span>
|
|
479
|
+
<span class="cline-any cline-no"> </span>
|
|
480
|
+
<span class="cline-any cline-no"> </span>
|
|
481
|
+
<span class="cline-any cline-no"> </span>
|
|
482
|
+
<span class="cline-any cline-no"> </span>
|
|
483
|
+
<span class="cline-any cline-neutral"> </span>
|
|
484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
485
|
+
<span class="cline-any cline-no"> </span>
|
|
486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
489
|
+
<span class="cline-any cline-no"> </span>
|
|
490
|
+
<span class="cline-any cline-no"> </span>
|
|
491
|
+
<span class="cline-any cline-no"> </span>
|
|
492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
493
|
+
<span class="cline-any cline-no"> </span>
|
|
494
|
+
<span class="cline-any cline-no"> </span>
|
|
495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
496
|
+
<span class="cline-any cline-neutral"> </span>
|
|
497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
498
|
+
<span class="cline-any cline-no"> </span>
|
|
499
|
+
<span class="cline-any cline-no"> </span>
|
|
500
|
+
<span class="cline-any cline-no"> </span>
|
|
501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
502
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">#!/usr/bin/env node
|
|
503
|
+
|
|
504
|
+
const { spawn } = <span class="cstat-no" title="statement not covered" >require('child_process');</span>
|
|
505
|
+
const fs = <span class="cstat-no" title="statement not covered" >require('fs');</span>
|
|
506
|
+
const path = <span class="cstat-no" title="statement not covered" >require('path');</span>
|
|
507
|
+
const https = <span class="cstat-no" title="statement not covered" >require('https');</span>
|
|
508
|
+
const { createWriteStream, mkdirSync, existsSync, rmSync, unlinkSync, readFileSync, writeFileSync } = <span class="cstat-no" title="statement not covered" >require('fs');</span>
|
|
509
|
+
const { execSync } = <span class="cstat-no" title="statement not covered" >require('child_process');</span>
|
|
510
|
+
|
|
511
|
+
const APP_NAME = <span class="cstat-no" title="statement not covered" >'Floatnote';</span>
|
|
512
|
+
const GITHUB_REPO = <span class="cstat-no" title="statement not covered" >'josmanvis/floatnote';</span>
|
|
513
|
+
const APP_DIR = <span class="cstat-no" title="statement not covered" >path.join(process.env.HOME, '.floatnote');</span>
|
|
514
|
+
const APP_PATH = <span class="cstat-no" title="statement not covered" >path.join(APP_DIR, `${APP_NAME}.app`);</span>
|
|
515
|
+
const VERSION_FILE = <span class="cstat-no" title="statement not covered" >path.join(APP_DIR, 'version');</span>
|
|
516
|
+
|
|
517
|
+
function <span class="fstat-no" title="function not covered" >log(</span>message) {
|
|
518
|
+
<span class="cstat-no" title="statement not covered" > console.log(`[floatnote] ${message}`);</span>
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
async function <span class="fstat-no" title="function not covered" >getLatestRelease(</span>) {
|
|
522
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) => {</span>
|
|
523
|
+
const options = <span class="cstat-no" title="statement not covered" >{</span>
|
|
524
|
+
hostname: 'api.github.com',
|
|
525
|
+
path: `/repos/${GITHUB_REPO}/releases/latest`,
|
|
526
|
+
headers: { 'User-Agent': 'floatnote-cli' }
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
<span class="cstat-no" title="statement not covered" > https.get(options, <span class="fstat-no" title="function not covered" >(r</span>es) => {</span>
|
|
530
|
+
<span class="cstat-no" title="statement not covered" > if (res.statusCode === 404) {</span>
|
|
531
|
+
<span class="cstat-no" title="statement not covered" > reject(new Error('No releases found. Please wait for the first release to be published.'));</span>
|
|
532
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
533
|
+
}
|
|
534
|
+
let data = <span class="cstat-no" title="statement not covered" >'';</span>
|
|
535
|
+
<span class="cstat-no" title="statement not covered" > res.on('data', <span class="fstat-no" title="function not covered" >ch</span>unk => <span class="cstat-no" title="statement not covered" >data += chunk)</span>;</span>
|
|
536
|
+
<span class="cstat-no" title="statement not covered" > res.on('end', <span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
537
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
538
|
+
<span class="cstat-no" title="statement not covered" > resolve(JSON.parse(data));</span>
|
|
539
|
+
} catch (e) {
|
|
540
|
+
<span class="cstat-no" title="statement not covered" > reject(new Error('Failed to parse release data'));</span>
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
<span class="cstat-no" title="statement not covered" > res.on('error', reject);</span>
|
|
544
|
+
}).on('error', reject);
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
async function <span class="fstat-no" title="function not covered" >downloadFile(</span>url, dest, onProgress) {
|
|
549
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) => {</span>
|
|
550
|
+
const makeRequest = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(r</span>equestUrl) => {</span>
|
|
551
|
+
const parsedUrl = <span class="cstat-no" title="statement not covered" >new URL(requestUrl);</span>
|
|
552
|
+
const options = <span class="cstat-no" title="statement not covered" >{</span>
|
|
553
|
+
hostname: parsedUrl.hostname,
|
|
554
|
+
path: parsedUrl.pathname + parsedUrl.search,
|
|
555
|
+
headers: { 'User-Agent': 'floatnote-cli' }
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
<span class="cstat-no" title="statement not covered" > https.get(options, <span class="fstat-no" title="function not covered" >(r</span>es) => {</span>
|
|
559
|
+
// Handle redirects
|
|
560
|
+
<span class="cstat-no" title="statement not covered" > if (res.statusCode === 302 || res.statusCode === 301) {</span>
|
|
561
|
+
<span class="cstat-no" title="statement not covered" > makeRequest(res.headers.location);</span>
|
|
562
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
<span class="cstat-no" title="statement not covered" > if (res.statusCode !== 200) {</span>
|
|
566
|
+
<span class="cstat-no" title="statement not covered" > reject(new Error(`Download failed with status ${res.statusCode}`));</span>
|
|
567
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
const totalSize = <span class="cstat-no" title="statement not covered" >parseInt(res.headers['content-length'], 10);</span>
|
|
571
|
+
let downloadedSize = <span class="cstat-no" title="statement not covered" >0;</span>
|
|
572
|
+
|
|
573
|
+
const file = <span class="cstat-no" title="statement not covered" >createWriteStream(dest);</span>
|
|
574
|
+
<span class="cstat-no" title="statement not covered" > res.on('data', <span class="fstat-no" title="function not covered" >(c</span>hunk) => {</span>
|
|
575
|
+
<span class="cstat-no" title="statement not covered" > downloadedSize += chunk.length;</span>
|
|
576
|
+
<span class="cstat-no" title="statement not covered" > if (onProgress && totalSize) {</span>
|
|
577
|
+
const percent = <span class="cstat-no" title="statement not covered" >Math.round((downloadedSize / totalSize) * 100);</span>
|
|
578
|
+
<span class="cstat-no" title="statement not covered" > onProgress(percent, downloadedSize, totalSize);</span>
|
|
579
|
+
}
|
|
580
|
+
});
|
|
581
|
+
<span class="cstat-no" title="statement not covered" > res.pipe(file);</span>
|
|
582
|
+
<span class="cstat-no" title="statement not covered" > file.on('finish', <span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
583
|
+
<span class="cstat-no" title="statement not covered" > file.close();</span>
|
|
584
|
+
<span class="cstat-no" title="statement not covered" > resolve();</span>
|
|
585
|
+
});
|
|
586
|
+
<span class="cstat-no" title="statement not covered" > file.on('error', <span class="fstat-no" title="function not covered" >(e</span>rr) => {</span>
|
|
587
|
+
<span class="cstat-no" title="statement not covered" > unlinkSync(dest);</span>
|
|
588
|
+
<span class="cstat-no" title="statement not covered" > reject(err);</span>
|
|
589
|
+
});
|
|
590
|
+
}).on('error', reject);
|
|
591
|
+
};
|
|
592
|
+
|
|
593
|
+
<span class="cstat-no" title="statement not covered" > makeRequest(url);</span>
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
function <span class="fstat-no" title="function not covered" >formatBytes(</span>bytes) {
|
|
598
|
+
<span class="cstat-no" title="statement not covered" > if (bytes < 1024) <span class="cstat-no" title="statement not covered" >return bytes + ' B';</span></span>
|
|
599
|
+
<span class="cstat-no" title="statement not covered" > if (bytes < 1024 * 1024) <span class="cstat-no" title="statement not covered" >return (bytes / 1024).toFixed(1) + ' KB';</span></span>
|
|
600
|
+
<span class="cstat-no" title="statement not covered" > return (bytes / (1024 * 1024)).toFixed(1) + ' MB';</span>
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
async function <span class="fstat-no" title="function not covered" >main(</span>) {
|
|
604
|
+
// Handle command line arguments
|
|
605
|
+
const args = <span class="cstat-no" title="statement not covered" >process.argv.slice(2);</span>
|
|
606
|
+
<span class="cstat-no" title="statement not covered" > if (args.includes('--version') || args.includes('-v')) {</span>
|
|
607
|
+
const pkg = <span class="cstat-no" title="statement not covered" >require('../package.json');</span>
|
|
608
|
+
<span class="cstat-no" title="statement not covered" > console.log(`floatnote v${pkg.version}`);</span>
|
|
609
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
610
|
+
}
|
|
611
|
+
<span class="cstat-no" title="statement not covered" > if (args.includes('--help') || args.includes('-h')) {</span>
|
|
612
|
+
<span class="cstat-no" title="statement not covered" > console.log(`</span>
|
|
613
|
+
Floatnote - Transparent drawing overlay for macOS
|
|
614
|
+
|
|
615
|
+
Usage: floatnote [options]
|
|
616
|
+
|
|
617
|
+
Options:
|
|
618
|
+
-v, --version Show version number
|
|
619
|
+
-h, --help Show this help message
|
|
620
|
+
--update Force update to latest version
|
|
621
|
+
--uninstall Remove Floatnote from your system
|
|
622
|
+
|
|
623
|
+
Keyboard shortcuts (when app is running):
|
|
624
|
+
Cmd+Shift+G Toggle Floatnote
|
|
625
|
+
Alt+Space Quick toggle
|
|
626
|
+
Ctrl+\` Quick toggle
|
|
627
|
+
Cmd+, Settings
|
|
628
|
+
[ / ] Navigate notes
|
|
629
|
+
`);
|
|
630
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
<span class="cstat-no" title="statement not covered" > if (args.includes('--uninstall')) {</span>
|
|
634
|
+
<span class="cstat-no" title="statement not covered" > if (existsSync(APP_DIR)) {</span>
|
|
635
|
+
<span class="cstat-no" title="statement not covered" > rmSync(APP_DIR, { recursive: true });</span>
|
|
636
|
+
<span class="cstat-no" title="statement not covered" > log('Floatnote has been uninstalled.');</span>
|
|
637
|
+
} else {
|
|
638
|
+
<span class="cstat-no" title="statement not covered" > log('Floatnote is not installed.');</span>
|
|
639
|
+
}
|
|
640
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// Create app directory
|
|
644
|
+
<span class="cstat-no" title="statement not covered" > if (!existsSync(APP_DIR)) {</span>
|
|
645
|
+
<span class="cstat-no" title="statement not covered" > mkdirSync(APP_DIR, { recursive: true });</span>
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
const forceUpdate = <span class="cstat-no" title="statement not covered" >args.includes('--update');</span>
|
|
649
|
+
let currentVersion = <span class="cstat-no" title="statement not covered" >existsSync(VERSION_FILE) ? readFileSync(VERSION_FILE, 'utf8').trim() : null;</span>
|
|
650
|
+
|
|
651
|
+
// Check for updates
|
|
652
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
653
|
+
<span class="cstat-no" title="statement not covered" > log('Checking for updates...');</span>
|
|
654
|
+
const release = <span class="cstat-no" title="statement not covered" >await getLatestRelease();</span>
|
|
655
|
+
|
|
656
|
+
<span class="cstat-no" title="statement not covered" > if (forceUpdate || !currentVersion || currentVersion !== release.tag_name || !existsSync(APP_PATH)) {</span>
|
|
657
|
+
<span class="cstat-no" title="statement not covered" > log(`Downloading Floatnote ${release.tag_name}...`);</span>
|
|
658
|
+
|
|
659
|
+
// Find the zip asset for macOS
|
|
660
|
+
const zipAsset = <span class="cstat-no" title="statement not covered" >release.assets.find(<span class="fstat-no" title="function not covered" >a </span>=></span>
|
|
661
|
+
<span class="cstat-no" title="statement not covered" > a.name.includes('mac') && a.name.endsWith('.zip') ||</span>
|
|
662
|
+
a.name === `${APP_NAME}-${release.tag_name.replace('v', '')}-mac.zip` ||
|
|
663
|
+
a.name === `${APP_NAME}.zip` ||
|
|
664
|
+
a.name.endsWith('.zip')
|
|
665
|
+
);
|
|
666
|
+
|
|
667
|
+
<span class="cstat-no" title="statement not covered" > if (!zipAsset) {</span>
|
|
668
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('No macOS build found in the latest release.');</span>
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
const zipPath = <span class="cstat-no" title="statement not covered" >path.join(APP_DIR, 'floatnote.zip');</span>
|
|
672
|
+
|
|
673
|
+
// Download with progress
|
|
674
|
+
let lastPercent = <span class="cstat-no" title="statement not covered" >0;</span>
|
|
675
|
+
<span class="cstat-no" title="statement not covered" > await downloadFile(zipAsset.browser_download_url, zipPath, <span class="fstat-no" title="function not covered" >(p</span>ercent, downloaded, total) => {</span>
|
|
676
|
+
<span class="cstat-no" title="statement not covered" > if (percent !== lastPercent && percent % 10 === 0) {</span>
|
|
677
|
+
<span class="cstat-no" title="statement not covered" > log(`Progress: ${percent}% (${formatBytes(downloaded)} / ${formatBytes(total)})`);</span>
|
|
678
|
+
<span class="cstat-no" title="statement not covered" > lastPercent = percent;</span>
|
|
679
|
+
}
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
// Extract
|
|
683
|
+
<span class="cstat-no" title="statement not covered" > log('Extracting...');</span>
|
|
684
|
+
<span class="cstat-no" title="statement not covered" > if (existsSync(APP_PATH)) {</span>
|
|
685
|
+
<span class="cstat-no" title="statement not covered" > rmSync(APP_PATH, { recursive: true });</span>
|
|
686
|
+
}
|
|
687
|
+
<span class="cstat-no" title="statement not covered" > execSync(`unzip -q -o "${zipPath}" -d "${APP_DIR}"`, { stdio: 'pipe' });</span>
|
|
688
|
+
<span class="cstat-no" title="statement not covered" > unlinkSync(zipPath);</span>
|
|
689
|
+
|
|
690
|
+
// Save version
|
|
691
|
+
<span class="cstat-no" title="statement not covered" > writeFileSync(VERSION_FILE, release.tag_name);</span>
|
|
692
|
+
<span class="cstat-no" title="statement not covered" > log(`Floatnote ${release.tag_name} installed successfully!`);</span>
|
|
693
|
+
} else {
|
|
694
|
+
<span class="cstat-no" title="statement not covered" > log(`Floatnote ${currentVersion} is up to date.`);</span>
|
|
695
|
+
}
|
|
696
|
+
} catch (err) {
|
|
697
|
+
<span class="cstat-no" title="statement not covered" > if (!existsSync(APP_PATH)) {</span>
|
|
698
|
+
<span class="cstat-no" title="statement not covered" > console.error(`Error: ${err.message}`);</span>
|
|
699
|
+
<span class="cstat-no" title="statement not covered" > console.error('Make sure the GitHub repository has published releases.');</span>
|
|
700
|
+
<span class="cstat-no" title="statement not covered" > process.exit(1);</span>
|
|
701
|
+
}
|
|
702
|
+
// If app exists, we can still launch it
|
|
703
|
+
<span class="cstat-no" title="statement not covered" > log(`Could not check for updates: ${err.message}`);</span>
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// Launch the app
|
|
707
|
+
<span class="cstat-no" title="statement not covered" > if (existsSync(APP_PATH)) {</span>
|
|
708
|
+
<span class="cstat-no" title="statement not covered" > log('Launching Floatnote...');</span>
|
|
709
|
+
<span class="cstat-no" title="statement not covered" > spawn('open', [APP_PATH], { detached: true, stdio: 'ignore' }).unref();</span>
|
|
710
|
+
} else {
|
|
711
|
+
<span class="cstat-no" title="statement not covered" > console.error('Error: Floatnote app not found. Please try running with --update flag.');</span>
|
|
712
|
+
<span class="cstat-no" title="statement not covered" > process.exit(1);</span>
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
<span class="cstat-no" title="statement not covered" >main().catch(<span class="fstat-no" title="function not covered" >er</span>r => {</span>
|
|
717
|
+
<span class="cstat-no" title="statement not covered" > console.error('Error:', err.message);</span>
|
|
718
|
+
<span class="cstat-no" title="statement not covered" > process.exit(1);</span>
|
|
719
|
+
});
|
|
720
|
+
</pre></td></tr></table></pre>
|
|
721
|
+
|
|
722
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
723
|
+
</div><!-- /wrapper -->
|
|
724
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
725
|
+
Code coverage generated by
|
|
726
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
727
|
+
at 2026-01-15T14:08:22.213Z
|
|
728
|
+
</div>
|
|
729
|
+
<script src="../prettify.js"></script>
|
|
730
|
+
<script>
|
|
731
|
+
window.onload = function () {
|
|
732
|
+
prettyPrint();
|
|
733
|
+
};
|
|
734
|
+
</script>
|
|
735
|
+
<script src="../sorter.js"></script>
|
|
736
|
+
<script src="../block-navigation.js"></script>
|
|
737
|
+
</body>
|
|
738
|
+
</html>
|
|
739
|
+
|