@jjlmoya/utils-hardware 1.11.0 → 1.13.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.
Files changed (32) hide show
  1. package/package.json +7 -4
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/entries.ts +23 -0
  4. package/src/tool/batteryHealthEstimator/component.astro +2 -369
  5. package/src/tool/batteryHealthEstimator/entry.ts +30 -0
  6. package/src/tool/batteryHealthEstimator/index.ts +2 -32
  7. package/src/tool/batteryHealthEstimator/lithium-battery-health-calculator.css +275 -0
  8. package/src/tool/deadPixelTest/component.astro +2 -445
  9. package/src/tool/deadPixelTest/dead-pixel-tester.css +400 -0
  10. package/src/tool/deadPixelTest/entry.ts +30 -0
  11. package/src/tool/deadPixelTest/index.ts +2 -32
  12. package/src/tool/gamepadTest/component.astro +2 -973
  13. package/src/tool/gamepadTest/entry.ts +30 -0
  14. package/src/tool/gamepadTest/gamepad-test.css +882 -0
  15. package/src/tool/gamepadTest/index.ts +2 -32
  16. package/src/tool/gamepadVibrationTester/component.astro +2 -404
  17. package/src/tool/gamepadVibrationTester/entry.ts +30 -0
  18. package/src/tool/gamepadVibrationTester/gamepad-vibration-tester.css +280 -0
  19. package/src/tool/gamepadVibrationTester/index.ts +2 -32
  20. package/src/tool/keyboardTest/component.astro +2 -333
  21. package/src/tool/keyboardTest/entry.ts +30 -0
  22. package/src/tool/keyboardTest/index.ts +2 -32
  23. package/src/tool/keyboardTest/keyboard-test.css +283 -0
  24. package/src/tool/mousePollingTest/component.astro +2 -172
  25. package/src/tool/mousePollingTest/entry.ts +30 -0
  26. package/src/tool/mousePollingTest/index.ts +2 -32
  27. package/src/tool/mousePollingTest/mouse-polling-rate-test.css +143 -0
  28. package/src/tool/toneGenerator/component.astro +2 -330
  29. package/src/tool/toneGenerator/entry.ts +30 -0
  30. package/src/tool/toneGenerator/index.ts +2 -32
  31. package/src/tool/toneGenerator/tone-frequency-generator.css +265 -0
  32. package/src/tools.ts +1 -1
@@ -16,68 +16,7 @@ const S = JSON.stringify({ bp: t.btnPlay, bs: t.btnStop });
16
16
 
17
17
  <div id="tg-root" class="tg-wrapper" data-s={S}>
18
18
 
19
- <style is:global>
20
- .tg-wrapper {
21
- --tg-accent: #e11d48;
22
- --tg-accent-glow: rgba(225, 29, 72, 0.3);
23
- --tg-canvas-line: #f43f5e;
24
- --tg-btn-bg: #e11d48;
25
- --tg-btn-stop-bg: #1e293b;
26
- --tg-surface: #fff;
27
- --tg-surface-alt: #f8fafc;
28
- --tg-border: #e2e8f0;
29
- --tg-text: #0f172a;
30
- --tg-text-muted: #64748b;
31
- --tg-text-faint: #94a3b8;
32
- }
33
-
34
- .theme-dark .tg-wrapper {
35
- --tg-btn-stop-bg: #27272a;
36
- --tg-surface: #09090b;
37
- --tg-surface-alt: #18181b;
38
- --tg-border: #27272a;
39
- --tg-text: #fafafa;
40
- --tg-text-muted: #a1a1aa;
41
- --tg-text-faint: #52525b;
42
- }
43
-
44
- .tg-wave-btn[data-active='true'] {
45
- background: var(--tg-accent);
46
- color: #fff;
47
- box-shadow: 0 4px 14px var(--tg-accent-glow);
48
- }
49
-
50
- #tg-toggle[data-playing='true'] {
51
- background: var(--tg-btn-stop-bg);
52
- box-shadow: none;
53
- }
54
-
55
- #tg-play-icon {
56
- display: inline-flex;
57
- }
58
-
59
- #tg-stop-icon {
60
- display: none;
61
- }
62
-
63
- #tg-toggle[data-playing='true'] #tg-play-icon {
64
- display: none;
65
- }
66
-
67
- #tg-toggle[data-playing='true'] #tg-stop-icon {
68
- display: inline-flex;
69
- }
70
-
71
- @keyframes tg-pulse {
72
- 0%, 100% { opacity: 1; }
73
- 50% { opacity: 0.4; }
74
- }
75
-
76
- body.is-widget .tg-wrapper {
77
- padding: 0;
78
- }
79
- </style>
80
-
19
+
81
20
  <div class="tg-card">
82
21
 
83
22
  <div class="tg-header">
@@ -155,274 +94,7 @@ const S = JSON.stringify({ bp: t.btnPlay, bs: t.btnStop });
155
94
  </div>
156
95
  </div>
157
96
 
158
- <style>
159
- .tg-wrapper {
160
- width: 100%;
161
- color: var(--tg-text);
162
- }
163
-
164
- .tg-card {
165
- background: var(--tg-surface);
166
- border: 1px solid var(--tg-border);
167
- border-radius: 1.5rem;
168
- padding: 2rem;
169
- display: flex;
170
- flex-direction: column;
171
- gap: 2rem;
172
- }
173
-
174
- .tg-header {
175
- display: flex;
176
- align-items: center;
177
- gap: 1rem;
178
- }
179
-
180
- .tg-icon-wrap {
181
- flex-shrink: 0;
182
- padding: 0.75rem;
183
- background: rgba(225, 29, 72, 0.1);
184
- color: var(--tg-accent);
185
- border-radius: 1rem;
186
- }
187
-
188
- .tg-icon {
189
- width: 2rem;
190
- height: 2rem;
191
- }
192
-
193
- .tg-header-text {
194
- display: flex;
195
- flex-direction: column;
196
- gap: 0.125rem;
197
- }
198
-
199
- .tg-badge {
200
- display: inline-block;
201
- font-size: 0.625rem;
202
- font-weight: 900;
203
- text-transform: uppercase;
204
- letter-spacing: 0.12em;
205
- color: var(--tg-accent);
206
- background: rgba(225, 29, 72, 0.08);
207
- border: 1px solid rgba(225, 29, 72, 0.2);
208
- padding: 0.2rem 0.6rem;
209
- border-radius: 9999px;
210
- width: fit-content;
211
- }
212
-
213
- .tg-title {
214
- font-size: 1.75rem;
215
- font-weight: 900;
216
- letter-spacing: -0.02em;
217
- margin: 0;
218
- color: var(--tg-text);
219
- }
220
-
221
- .tg-desc {
222
- font-size: 0.875rem;
223
- color: var(--tg-text-muted);
224
- margin: 0;
225
- }
226
-
227
- .tg-canvas-wrap {
228
- position: relative;
229
- width: 100%;
230
- height: 12rem;
231
- background: #000;
232
- border-radius: 1rem;
233
- overflow: hidden;
234
- border: 1px solid #111;
235
- }
236
-
237
- .tg-canvas {
238
- width: 100%;
239
- height: 100%;
240
- }
241
-
242
- .tg-hz-display {
243
- position: absolute;
244
- top: 1rem;
245
- right: 1rem;
246
- font-size: 0.75rem;
247
- color: #f43f5e;
248
- letter-spacing: 0.05em;
249
- animation: tg-pulse 2s ease-in-out infinite;
250
- }
251
-
252
- .tg-controls {
253
- display: flex;
254
- flex-direction: column;
255
- gap: 2rem;
256
- }
257
-
258
- .tg-section {
259
- display: flex;
260
- flex-direction: column;
261
- gap: 0.5rem;
262
- }
263
-
264
- .tg-section-header {
265
- display: flex;
266
- justify-content: space-between;
267
- align-items: center;
268
- }
269
-
270
- .tg-label {
271
- font-size: 0.7rem;
272
- font-weight: 800;
273
- text-transform: uppercase;
274
- letter-spacing: 0.1em;
275
- color: var(--tg-text-muted);
276
- }
277
-
278
- .tg-presets {
279
- display: flex;
280
- gap: 0.375rem;
281
- }
282
-
283
- .tg-preset {
284
- padding: 0.25rem 0.5rem;
285
- background: var(--tg-surface-alt);
286
- border: 1px solid var(--tg-border);
287
- border-radius: 0.375rem;
288
- font-size: 0.75rem;
289
- color: var(--tg-text-muted);
290
- cursor: pointer;
291
- transition: background 150ms, color 150ms;
292
- }
293
-
294
- .tg-preset:hover {
295
- background: var(--tg-border);
296
- color: var(--tg-text);
297
- }
298
-
299
- .tg-slider {
300
- -webkit-appearance: none;
301
- appearance: none;
302
- width: 100%;
303
- height: 6px;
304
- background: var(--tg-border);
305
- border-radius: 3px;
306
- outline: none;
307
- accent-color: var(--tg-accent);
308
- }
309
-
310
- .tg-slider::-webkit-slider-thumb {
311
- -webkit-appearance: none;
312
- appearance: none;
313
- width: 18px;
314
- height: 18px;
315
- background: var(--tg-accent);
316
- border-radius: 50%;
317
- cursor: pointer;
318
- border: 4px solid var(--tg-surface);
319
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
320
- }
321
-
322
- .tg-range-hints {
323
- display: flex;
324
- justify-content: space-between;
325
- font-size: 0.625rem;
326
- color: var(--tg-text-faint);
327
- letter-spacing: 0.02em;
328
- }
329
-
330
- .tg-two-col {
331
- display: grid;
332
- grid-template-columns: 1fr 1fr;
333
- gap: 2rem;
334
- }
335
-
336
- @media (max-width: 640px) {
337
- .tg-two-col {
338
- grid-template-columns: 1fr;
339
- }
340
- }
341
-
342
- .tg-wave-grid {
343
- display: grid;
344
- grid-template-columns: repeat(4, 1fr);
345
- gap: 0.5rem;
346
- }
347
-
348
- .tg-wave-btn {
349
- padding: 0.75rem;
350
- border-radius: 0.75rem;
351
- background: var(--tg-surface-alt);
352
- border: 1px solid var(--tg-border);
353
- color: var(--tg-text-muted);
354
- cursor: pointer;
355
- transition: background 150ms, color 150ms, box-shadow 150ms;
356
- display: flex;
357
- align-items: center;
358
- justify-content: center;
359
- }
360
-
361
- .tg-wave-btn:hover {
362
- background: var(--tg-border);
363
- color: var(--tg-text);
364
- }
365
-
366
- .tg-wave-icon {
367
- width: 1.5rem;
368
- height: 1.5rem;
369
- }
370
-
371
- .tg-vol-row {
372
- display: flex;
373
- align-items: center;
374
- gap: 0.75rem;
375
- background: var(--tg-surface-alt);
376
- border: 1px solid var(--tg-border);
377
- border-radius: 0.75rem;
378
- padding: 0.75rem;
379
- }
380
-
381
- .tg-vol-icon {
382
- width: 1.25rem;
383
- height: 1.25rem;
384
- color: var(--tg-text-faint);
385
- flex-shrink: 0;
386
- }
387
-
388
- .tg-vol-slider {
389
- height: 4px;
390
- }
391
-
392
- .tg-toggle-btn {
393
- width: 100%;
394
- padding: 1.5rem;
395
- border-radius: 1rem;
396
- background: var(--tg-btn-bg);
397
- border: none;
398
- color: #fff;
399
- font-size: 1.125rem;
400
- font-weight: 900;
401
- letter-spacing: 0.05em;
402
- cursor: pointer;
403
- display: flex;
404
- align-items: center;
405
- justify-content: center;
406
- gap: 0.75rem;
407
- box-shadow: 0 8px 24px var(--tg-accent-glow);
408
- transition: background 200ms, box-shadow 200ms, transform 100ms;
409
- }
410
-
411
- .tg-toggle-btn:active {
412
- transform: scale(0.98);
413
- }
414
-
415
- .tg-btn-icon {
416
- display: inherit;
417
- align-items: center;
418
- }
419
-
420
- .tg-toggle-icon {
421
- width: 1.75rem;
422
- height: 1.75rem;
423
- }
424
- </style>
425
-
97
+
426
98
  <script>
427
99
  const root = document.getElementById('tg-root');
428
100
  const S: Record<string, string> = JSON.parse(root?.dataset?.s ?? '{}');
@@ -0,0 +1,30 @@
1
+ import type { HardwareToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+
4
+ import type { ToneGeneratorUI } from './ui';
5
+ export type ToneGeneratorLocaleContent = ToolLocaleContent<ToneGeneratorUI>;
6
+
7
+ export const toneGenerator: HardwareToolEntry<ToneGeneratorUI> = {
8
+ id: 'generador-tonos',
9
+ icons: {
10
+ bg: 'mdi:sine-wave',
11
+ fg: 'mdi:waveform',
12
+ },
13
+ i18n: {
14
+ de: () => import('./i18n/de').then((m) => m.content),
15
+ en: () => import('./i18n/en').then((m) => m.content),
16
+ es: () => import('./i18n/es').then((m) => m.content),
17
+ fr: () => import('./i18n/fr').then((m) => m.content),
18
+ id: () => import('./i18n/id').then((m) => m.content),
19
+ it: () => import('./i18n/it').then((m) => m.content),
20
+ ja: () => import('./i18n/ja').then((m) => m.content),
21
+ ko: () => import('./i18n/ko').then((m) => m.content),
22
+ nl: () => import('./i18n/nl').then((m) => m.content),
23
+ pl: () => import('./i18n/pl').then((m) => m.content),
24
+ pt: () => import('./i18n/pt').then((m) => m.content),
25
+ ru: () => import('./i18n/ru').then((m) => m.content),
26
+ sv: () => import('./i18n/sv').then((m) => m.content),
27
+ tr: () => import('./i18n/tr').then((m) => m.content),
28
+ zh: () => import('./i18n/zh').then((m) => m.content),
29
+ },
30
+ };
@@ -1,35 +1,5 @@
1
- import type { HardwareToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
-
3
-
4
- import type { ToneGeneratorUI } from './ui';
5
- export type ToneGeneratorLocaleContent = ToolLocaleContent<ToneGeneratorUI>;
6
-
7
- export const toneGenerator: HardwareToolEntry<ToneGeneratorUI> = {
8
- id: 'generador-tonos',
9
- icons: {
10
- bg: 'mdi:sine-wave',
11
- fg: 'mdi:waveform',
12
- },
13
- i18n: {
14
- de: () => import('./i18n/de').then((m) => m.content),
15
- en: () => import('./i18n/en').then((m) => m.content),
16
- es: () => import('./i18n/es').then((m) => m.content),
17
- fr: () => import('./i18n/fr').then((m) => m.content),
18
- id: () => import('./i18n/id').then((m) => m.content),
19
- it: () => import('./i18n/it').then((m) => m.content),
20
- ja: () => import('./i18n/ja').then((m) => m.content),
21
- ko: () => import('./i18n/ko').then((m) => m.content),
22
- nl: () => import('./i18n/nl').then((m) => m.content),
23
- pl: () => import('./i18n/pl').then((m) => m.content),
24
- pt: () => import('./i18n/pt').then((m) => m.content),
25
- ru: () => import('./i18n/ru').then((m) => m.content),
26
- sv: () => import('./i18n/sv').then((m) => m.content),
27
- tr: () => import('./i18n/tr').then((m) => m.content),
28
- zh: () => import('./i18n/zh').then((m) => m.content),
29
- },
30
- };
31
-
32
-
1
+ import { toneGenerator } from './entry';
2
+ export * from './entry';
33
3
  export const TONE_GENERATOR_TOOL: ToolDefinition = {
34
4
  entry: toneGenerator,
35
5
  Component: () => import('./component.astro'),
@@ -0,0 +1,265 @@
1
+ .tg-wrapper {
2
+ width: 100%;
3
+ color: var(--tg-text);
4
+ }
5
+
6
+ .tg-card {
7
+ background: var(--tg-surface);
8
+ border: 1px solid var(--tg-border);
9
+ border-radius: 1.5rem;
10
+ padding: 2rem;
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: 2rem;
14
+ }
15
+
16
+ .tg-header {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: 1rem;
20
+ }
21
+
22
+ .tg-icon-wrap {
23
+ flex-shrink: 0;
24
+ padding: 0.75rem;
25
+ background: rgba(225, 29, 72, 0.1);
26
+ color: var(--tg-accent);
27
+ border-radius: 1rem;
28
+ }
29
+
30
+ .tg-icon {
31
+ width: 2rem;
32
+ height: 2rem;
33
+ }
34
+
35
+ .tg-header-text {
36
+ display: flex;
37
+ flex-direction: column;
38
+ gap: 0.125rem;
39
+ }
40
+
41
+ .tg-badge {
42
+ display: inline-block;
43
+ font-size: 0.625rem;
44
+ font-weight: 900;
45
+ text-transform: uppercase;
46
+ letter-spacing: 0.12em;
47
+ color: var(--tg-accent);
48
+ background: rgba(225, 29, 72, 0.08);
49
+ border: 1px solid rgba(225, 29, 72, 0.2);
50
+ padding: 0.2rem 0.6rem;
51
+ border-radius: 9999px;
52
+ width: fit-content;
53
+ }
54
+
55
+ .tg-title {
56
+ font-size: 1.75rem;
57
+ font-weight: 900;
58
+ letter-spacing: -0.02em;
59
+ margin: 0;
60
+ color: var(--tg-text);
61
+ }
62
+
63
+ .tg-desc {
64
+ font-size: 0.875rem;
65
+ color: var(--tg-text-muted);
66
+ margin: 0;
67
+ }
68
+
69
+ .tg-canvas-wrap {
70
+ position: relative;
71
+ width: 100%;
72
+ height: 12rem;
73
+ background: #000;
74
+ border-radius: 1rem;
75
+ overflow: hidden;
76
+ border: 1px solid #111;
77
+ }
78
+
79
+ .tg-canvas {
80
+ width: 100%;
81
+ height: 100%;
82
+ }
83
+
84
+ .tg-hz-display {
85
+ position: absolute;
86
+ top: 1rem;
87
+ right: 1rem;
88
+ font-size: 0.75rem;
89
+ color: #f43f5e;
90
+ letter-spacing: 0.05em;
91
+ animation: tg-pulse 2s ease-in-out infinite;
92
+ }
93
+
94
+ .tg-controls {
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 2rem;
98
+ }
99
+
100
+ .tg-section {
101
+ display: flex;
102
+ flex-direction: column;
103
+ gap: 0.5rem;
104
+ }
105
+
106
+ .tg-section-header {
107
+ display: flex;
108
+ justify-content: space-between;
109
+ align-items: center;
110
+ }
111
+
112
+ .tg-label {
113
+ font-size: 0.7rem;
114
+ font-weight: 800;
115
+ text-transform: uppercase;
116
+ letter-spacing: 0.1em;
117
+ color: var(--tg-text-muted);
118
+ }
119
+
120
+ .tg-presets {
121
+ display: flex;
122
+ gap: 0.375rem;
123
+ }
124
+
125
+ .tg-preset {
126
+ padding: 0.25rem 0.5rem;
127
+ background: var(--tg-surface-alt);
128
+ border: 1px solid var(--tg-border);
129
+ border-radius: 0.375rem;
130
+ font-size: 0.75rem;
131
+ color: var(--tg-text-muted);
132
+ cursor: pointer;
133
+ transition: background 150ms, color 150ms;
134
+ }
135
+
136
+ .tg-preset:hover {
137
+ background: var(--tg-border);
138
+ color: var(--tg-text);
139
+ }
140
+
141
+ .tg-slider {
142
+ -webkit-appearance: none;
143
+ appearance: none;
144
+ width: 100%;
145
+ height: 6px;
146
+ background: var(--tg-border);
147
+ border-radius: 3px;
148
+ outline: none;
149
+ accent-color: var(--tg-accent);
150
+ }
151
+
152
+ .tg-slider::-webkit-slider-thumb {
153
+ -webkit-appearance: none;
154
+ appearance: none;
155
+ width: 18px;
156
+ height: 18px;
157
+ background: var(--tg-accent);
158
+ border-radius: 50%;
159
+ cursor: pointer;
160
+ border: 4px solid var(--tg-surface);
161
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
162
+ }
163
+
164
+ .tg-range-hints {
165
+ display: flex;
166
+ justify-content: space-between;
167
+ font-size: 0.625rem;
168
+ color: var(--tg-text-faint);
169
+ letter-spacing: 0.02em;
170
+ }
171
+
172
+ .tg-two-col {
173
+ display: grid;
174
+ grid-template-columns: 1fr 1fr;
175
+ gap: 2rem;
176
+ }
177
+
178
+ @media (max-width: 640px) {
179
+ .tg-two-col {
180
+ grid-template-columns: 1fr;
181
+ }
182
+ }
183
+
184
+ .tg-wave-grid {
185
+ display: grid;
186
+ grid-template-columns: repeat(4, 1fr);
187
+ gap: 0.5rem;
188
+ }
189
+
190
+ .tg-wave-btn {
191
+ padding: 0.75rem;
192
+ border-radius: 0.75rem;
193
+ background: var(--tg-surface-alt);
194
+ border: 1px solid var(--tg-border);
195
+ color: var(--tg-text-muted);
196
+ cursor: pointer;
197
+ transition: background 150ms, color 150ms, box-shadow 150ms;
198
+ display: flex;
199
+ align-items: center;
200
+ justify-content: center;
201
+ }
202
+
203
+ .tg-wave-btn:hover {
204
+ background: var(--tg-border);
205
+ color: var(--tg-text);
206
+ }
207
+
208
+ .tg-wave-icon {
209
+ width: 1.5rem;
210
+ height: 1.5rem;
211
+ }
212
+
213
+ .tg-vol-row {
214
+ display: flex;
215
+ align-items: center;
216
+ gap: 0.75rem;
217
+ background: var(--tg-surface-alt);
218
+ border: 1px solid var(--tg-border);
219
+ border-radius: 0.75rem;
220
+ padding: 0.75rem;
221
+ }
222
+
223
+ .tg-vol-icon {
224
+ width: 1.25rem;
225
+ height: 1.25rem;
226
+ color: var(--tg-text-faint);
227
+ flex-shrink: 0;
228
+ }
229
+
230
+ .tg-vol-slider {
231
+ height: 4px;
232
+ }
233
+
234
+ .tg-toggle-btn {
235
+ width: 100%;
236
+ padding: 1.5rem;
237
+ border-radius: 1rem;
238
+ background: var(--tg-btn-bg);
239
+ border: none;
240
+ color: #fff;
241
+ font-size: 1.125rem;
242
+ font-weight: 900;
243
+ letter-spacing: 0.05em;
244
+ cursor: pointer;
245
+ display: flex;
246
+ align-items: center;
247
+ justify-content: center;
248
+ gap: 0.75rem;
249
+ box-shadow: 0 8px 24px var(--tg-accent-glow);
250
+ transition: background 200ms, box-shadow 200ms, transform 100ms;
251
+ }
252
+
253
+ .tg-toggle-btn:active {
254
+ transform: scale(0.98);
255
+ }
256
+
257
+ .tg-btn-icon {
258
+ display: inherit;
259
+ align-items: center;
260
+ }
261
+
262
+ .tg-toggle-icon {
263
+ width: 1.75rem;
264
+ height: 1.75rem;
265
+ }
package/src/tools.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { ALL_ENTRIES } from './entries';
1
2
  import type { ToolDefinition } from './types';
2
3
  import { PIXELES_PANTALLA_TOOL } from './tool/deadPixelTest/index';
3
4
  import { TEST_TECLADO_TOOL } from './tool/keyboardTest/index';
@@ -9,4 +10,3 @@ import { TONE_GENERATOR_TOOL } from './tool/toneGenerator/index';
9
10
 
10
11
  export const ALL_TOOLS: ToolDefinition[] = [PIXELES_PANTALLA_TOOL, TEST_TECLADO_TOOL, TEST_MANDO_TOOL, PROBADOR_VIBRACION_MANDO_TOOL, TEST_RATON_TOOL, ESTIMADOR_SALUD_BATERIA_TOOL, TONE_GENERATOR_TOOL];
11
12
 
12
- export const ALL_ENTRIES = ALL_TOOLS.map(t => t.entry);