@swimedge/metrics 1.1.2 → 1.1.4

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/dist/index.d.ts CHANGED
@@ -54,6 +54,7 @@ export interface SwimSession {
54
54
  routeCoordinates?: number[][];
55
55
  routeMapImage?: string;
56
56
  routeMapThumbnail?: string;
57
+ locationName?: string;
57
58
  deviceType?: string;
58
59
  osVersion?: string;
59
60
  healthKitWorkoutId?: string;
package/dist/index.js CHANGED
@@ -19,7 +19,7 @@ var MetricCategory;
19
19
  })(MetricCategory || (exports.MetricCategory = MetricCategory = {}));
20
20
  // Formatting helpers
21
21
  const formatNumber = (value, decimals = 2) => {
22
- return Number(value).toFixed(decimals);
22
+ return decimals > 0 ? Number(value).toFixed(decimals) : Math.round(value).toString();
23
23
  };
24
24
  exports.formatNumber = formatNumber;
25
25
  const formatPace = (pace) => {
@@ -92,7 +92,7 @@ exports.LAP_METRICS_REGISTRY = {
92
92
  label: 'Pace',
93
93
  unit: '/100m',
94
94
  category: MetricCategory.PERFORMANCE,
95
- description: 'Time per 100m for this lap',
95
+ description: 'Time per 100m per lap',
96
96
  decimals: 1,
97
97
  availableFrom: { watch: true, manual: false },
98
98
  swimTypes: [SwimType.INDOOR],
@@ -103,7 +103,7 @@ exports.LAP_METRICS_REGISTRY = {
103
103
  label: 'SR',
104
104
  unit: 'SPM',
105
105
  category: MetricCategory.TECHNIQUE,
106
- description: 'Strokes per minute for this lap',
106
+ description: 'Strokes per minute per lap',
107
107
  icon: 'repeat-outline',
108
108
  decimals: 1,
109
109
  formula: 'Lap Strokes ÷ (Lap Time in Minutes)',
@@ -115,7 +115,7 @@ exports.LAP_METRICS_REGISTRY = {
115
115
  label: 'DPS',
116
116
  unit: 'm',
117
117
  category: MetricCategory.TECHNIQUE,
118
- description: 'Distance per stroke for this lap',
118
+ description: 'Distance per stroke per lap',
119
119
  icon: 'arrow-forward-outline',
120
120
  decimals: 2,
121
121
  formula: 'Lap Distance ÷ Lap Strokes',
@@ -126,7 +126,7 @@ exports.LAP_METRICS_REGISTRY = {
126
126
  key: 'strokeStyle',
127
127
  label: 'Stroke',
128
128
  category: MetricCategory.TECHNIQUE,
129
- description: 'Swimming stroke used in this lap',
129
+ description: 'Swimming stroke used per lap',
130
130
  icon: 'list-outline',
131
131
  availableFrom: { watch: true, manual: false },
132
132
  swimTypes: [SwimType.INDOOR],
@@ -136,7 +136,7 @@ exports.LAP_METRICS_REGISTRY = {
136
136
  label: 'Time',
137
137
  unit: 's',
138
138
  category: MetricCategory.PERFORMANCE,
139
- description: 'Time taken for this lap',
139
+ description: 'Time taken per lap',
140
140
  icon: 'stopwatch-outline',
141
141
  source: 'Tracked per lap completion',
142
142
  availableFrom: { watch: true, manual: false },
@@ -147,7 +147,7 @@ exports.LAP_METRICS_REGISTRY = {
147
147
  key: 'swolfScore',
148
148
  label: 'SWOLF',
149
149
  category: MetricCategory.TECHNIQUE,
150
- description: 'SWOLF score for this lap',
150
+ description: 'SWOLF score per lap',
151
151
  decimals: 0,
152
152
  availableFrom: { watch: true, manual: false },
153
153
  swimTypes: [SwimType.INDOOR],
@@ -202,7 +202,7 @@ exports.METRICS_REGISTRY = {
202
202
  unit: 's',
203
203
  category: MetricCategory.PERFORMANCE,
204
204
  description: 'Time actively swimming',
205
- icon: 'play-outline',
205
+ icon: 'fitness-outline',
206
206
  isPerSession: true,
207
207
  source: 'HealthKit: HKWorkoutBuilder elapsedTime (excludes rest periods)',
208
208
  healthKitSource: 'HKWorkoutBuilder.elapsedTime',
@@ -232,7 +232,7 @@ exports.METRICS_REGISTRY = {
232
232
  unit: '',
233
233
  category: MetricCategory.PERFORMANCE,
234
234
  description: 'Number of pool lengths completed during the swimming session.',
235
- icon: 'layers-outline',
235
+ icon: 'swap-horizontal-outline',
236
236
  isPerSession: true,
237
237
  formula: 'Distance ÷ Pool Length',
238
238
  availableFrom: { watch: true, manual: true },
@@ -262,7 +262,7 @@ exports.METRICS_REGISTRY = {
262
262
  unit: 'm',
263
263
  category: MetricCategory.PERFORMANCE,
264
264
  description: 'Length of the swimming pool used for this session.',
265
- icon: 'resize-outline',
265
+ icon: 'ruler-outline',
266
266
  isPerSession: true,
267
267
  source: 'User configuration setting',
268
268
  availableFrom: { watch: true, manual: true },
@@ -357,7 +357,7 @@ exports.METRICS_REGISTRY = {
357
357
  unit: 'kcal',
358
358
  category: MetricCategory.HEALTH,
359
359
  description: 'Total calories burned during the swimming session.',
360
- icon: 'flame-outline',
360
+ icon: 'flash-outline',
361
361
  isPerSession: true,
362
362
  source: 'HealthKit: HKQuantityTypeIdentifierActiveEnergyBurned',
363
363
  healthKitSource: 'HKQuantityTypeIdentifierActiveEnergyBurned',
@@ -374,7 +374,7 @@ exports.METRICS_REGISTRY = {
374
374
  unit: '',
375
375
  category: MetricCategory.TECHNIQUE,
376
376
  description: 'Total number of arm strokes taken during the session.',
377
- icon: 'hand-left-outline',
377
+ icon: 'hand-right-outline',
378
378
  isPerSession: true,
379
379
  source: 'HealthKit: HKQuantityTypeIdentifierSwimmingStrokeCount',
380
380
  healthKitSource: 'HKQuantityTypeIdentifierSwimmingStrokeCount',
@@ -421,7 +421,7 @@ exports.METRICS_REGISTRY = {
421
421
  unit: '',
422
422
  category: MetricCategory.TECHNIQUE,
423
423
  description: 'Swimming efficiency score combining time and stroke count per length.',
424
- icon: 'trophy-outline',
424
+ icon: 'star-outline',
425
425
  isPerSession: true,
426
426
  formula: 'Average of (Lap Time in Seconds + Lap Stroke Count) for each lap',
427
427
  availableFrom: { watch: true, manual: true },
@@ -436,7 +436,7 @@ exports.METRICS_REGISTRY = {
436
436
  unit: '',
437
437
  category: MetricCategory.TECHNIQUE,
438
438
  description: 'Main swimming stroke used during this session.',
439
- icon: 'hand-right-outline',
439
+ icon: 'hand-left-outline',
440
440
  isPerSession: true,
441
441
  source: 'HealthKit: HKWorkoutEvent with HKMetadataKeySwimmingStrokeStyle',
442
442
  healthKitSource: 'HKWorkoutEvent.metadata[HKMetadataKeySwimmingStrokeStyle]',
@@ -11,9 +11,26 @@ describe('Metrics Formatting Functions', () => {
11
11
  expect((0, index_1.formatNumber)(123.456, 0)).toBe('123');
12
12
  expect((0, index_1.formatNumber)(123.456, 3)).toBe('123.456');
13
13
  });
14
+ it('should round up for 0 decimals', () => {
15
+ expect((0, index_1.formatNumber)(19.88, 0)).toBe('20');
16
+ expect((0, index_1.formatNumber)(19.5, 0)).toBe('20');
17
+ expect((0, index_1.formatNumber)(19.4, 0)).toBe('19');
18
+ });
14
19
  it('should handle integers', () => {
15
20
  expect((0, index_1.formatNumber)(100, 2)).toBe('100.00');
16
21
  });
22
+ it('should handle negative numbers', () => {
23
+ expect((0, index_1.formatNumber)(-123.456, 2)).toBe('-123.46');
24
+ });
25
+ it('should handle zero', () => {
26
+ expect((0, index_1.formatNumber)(0, 2)).toBe('0.00');
27
+ });
28
+ it('should handle very small numbers', () => {
29
+ expect((0, index_1.formatNumber)(0.001, 3)).toBe('0.001');
30
+ });
31
+ it('should handle very large numbers', () => {
32
+ expect((0, index_1.formatNumber)(999999.99, 2)).toBe('999999.99');
33
+ });
17
34
  });
18
35
  describe('formatPace', () => {
19
36
  it('should return string pace as-is', () => {
@@ -30,12 +47,21 @@ describe('Metrics Formatting Functions', () => {
30
47
  it('should pad seconds with leading zero', () => {
31
48
  expect((0, index_1.formatPace)(125)).toBe('2:05');
32
49
  });
50
+ it('should handle large values', () => {
51
+ expect((0, index_1.formatPace)(3665)).toBe('61:05');
52
+ });
53
+ it('should handle single digit seconds', () => {
54
+ expect((0, index_1.formatPace)(61)).toBe('1:01');
55
+ });
33
56
  });
34
57
  describe('formatTime', () => {
35
58
  it('should format time in seconds to mm:ss', () => {
36
59
  expect((0, index_1.formatTime)(125)).toBe('2:05');
37
60
  expect((0, index_1.formatTime)(90)).toBe('1:30');
61
+ });
62
+ it('should format time with hours', () => {
38
63
  expect((0, index_1.formatTime)(3665)).toBe('1:01:05');
64
+ expect((0, index_1.formatTime)(7200)).toBe('2:00:00');
39
65
  });
40
66
  it('should handle zero', () => {
41
67
  expect((0, index_1.formatTime)(0)).toBe('0:00');
@@ -44,9 +70,18 @@ describe('Metrics Formatting Functions', () => {
44
70
  expect((0, index_1.formatTime)(65)).toBe('1:05');
45
71
  expect((0, index_1.formatTime)(5)).toBe('0:05');
46
72
  });
73
+ it('should pad minutes with leading zero in hour format', () => {
74
+ expect((0, index_1.formatTime)(3605)).toBe('1:00:05');
75
+ });
47
76
  it('should handle fractional seconds by flooring', () => {
48
77
  expect((0, index_1.formatTime)(65.7)).toBe('1:05');
49
78
  });
79
+ it('should handle exactly 60 seconds', () => {
80
+ expect((0, index_1.formatTime)(60)).toBe('1:00');
81
+ });
82
+ it('should handle exactly 1 hour', () => {
83
+ expect((0, index_1.formatTime)(3600)).toBe('1:00:00');
84
+ });
50
85
  });
51
86
  describe('formatHeartRate', () => {
52
87
  it('should format heart rate with bpm unit', () => {
@@ -57,6 +92,12 @@ describe('Metrics Formatting Functions', () => {
57
92
  expect((0, index_1.formatHeartRate)(145.4)).toBe('145 bpm');
58
93
  expect((0, index_1.formatHeartRate)(145.6)).toBe('146 bpm');
59
94
  });
95
+ it('should handle zero', () => {
96
+ expect((0, index_1.formatHeartRate)(0)).toBe('0 bpm');
97
+ });
98
+ it('should handle high heart rates', () => {
99
+ expect((0, index_1.formatHeartRate)(200)).toBe('200 bpm');
100
+ });
60
101
  });
61
102
  describe('formatDistance', () => {
62
103
  it('should format meters for distances under 1000m', () => {
@@ -71,5 +112,208 @@ describe('Metrics Formatting Functions', () => {
71
112
  it('should round meters to nearest integer', () => {
72
113
  expect((0, index_1.formatDistance)(500.7)).toBe('501m');
73
114
  });
115
+ it('should handle zero', () => {
116
+ expect((0, index_1.formatDistance)(0)).toBe('0m');
117
+ });
118
+ it('should handle very large distances', () => {
119
+ expect((0, index_1.formatDistance)(10000)).toBe('10.0km');
120
+ });
121
+ });
122
+ describe('formatSwimType', () => {
123
+ it('should format indoor pool type', () => {
124
+ expect((0, index_1.formatSwimType)(index_1.SwimType.INDOOR)).toBe('Indoor Pool');
125
+ expect((0, index_1.formatSwimType)('indoorPool')).toBe('Indoor Pool');
126
+ });
127
+ it('should format open water type', () => {
128
+ expect((0, index_1.formatSwimType)(index_1.SwimType.OPEN_WATER)).toBe('Open Water');
129
+ expect((0, index_1.formatSwimType)('openWater')).toBe('Open Water');
130
+ });
131
+ it('should handle undefined', () => {
132
+ expect((0, index_1.formatSwimType)(undefined)).toBe('Unknown');
133
+ });
134
+ it('should return unknown type as-is', () => {
135
+ expect((0, index_1.formatSwimType)('unknown')).toBe('unknown');
136
+ });
137
+ });
138
+ });
139
+ describe('MetricsHelper', () => {
140
+ describe('getMetric', () => {
141
+ it('should return metric definition by key', () => {
142
+ const metric = index_1.MetricsHelper.getMetric('distance');
143
+ expect(metric).toBeDefined();
144
+ expect(metric?.key).toBe('distance');
145
+ expect(metric?.label).toBe('Distance');
146
+ });
147
+ it('should return undefined for non-existent key', () => {
148
+ const metric = index_1.MetricsHelper.getMetric('nonexistent');
149
+ expect(metric).toBeUndefined();
150
+ });
151
+ });
152
+ describe('getSessionMetrics', () => {
153
+ it('should return all session metrics', () => {
154
+ const metrics = index_1.MetricsHelper.getSessionMetrics();
155
+ expect(metrics.length).toBeGreaterThan(0);
156
+ expect(metrics.every(m => m.isPerSession)).toBe(true);
157
+ });
158
+ });
159
+ describe('getChartMetrics', () => {
160
+ it('should return only chartable metrics', () => {
161
+ const metrics = index_1.MetricsHelper.getChartMetrics();
162
+ expect(metrics.length).toBeGreaterThan(0);
163
+ expect(metrics.every(m => m.hasChart && m.isPerSession)).toBe(true);
164
+ });
165
+ });
166
+ describe('getLapMetrics', () => {
167
+ it('should return all lap metrics', () => {
168
+ const metrics = index_1.MetricsHelper.getLapMetrics();
169
+ expect(metrics.length).toBeGreaterThan(0);
170
+ expect(metrics).toContainEqual(expect.objectContaining({ key: 'pace' }));
171
+ });
172
+ });
173
+ describe('getLapMetric', () => {
174
+ it('should return lap metric by key', () => {
175
+ const metric = index_1.MetricsHelper.getLapMetric('pace');
176
+ expect(metric).toBeDefined();
177
+ expect(metric.key).toBe('pace');
178
+ expect(metric.label).toBe('Pace');
179
+ });
180
+ });
181
+ describe('getMetricsByCategory', () => {
182
+ it('should return metrics by performance category', () => {
183
+ const metrics = index_1.MetricsHelper.getMetricsByCategory(index_1.MetricCategory.PERFORMANCE);
184
+ expect(metrics.length).toBeGreaterThan(0);
185
+ expect(metrics.every(m => m.category === index_1.MetricCategory.PERFORMANCE)).toBe(true);
186
+ });
187
+ it('should return metrics by health category', () => {
188
+ const metrics = index_1.MetricsHelper.getMetricsByCategory(index_1.MetricCategory.HEALTH);
189
+ expect(metrics.length).toBeGreaterThan(0);
190
+ expect(metrics.every(m => m.category === index_1.MetricCategory.HEALTH)).toBe(true);
191
+ });
192
+ it('should return metrics by technique category', () => {
193
+ const metrics = index_1.MetricsHelper.getMetricsByCategory(index_1.MetricCategory.TECHNIQUE);
194
+ expect(metrics.length).toBeGreaterThan(0);
195
+ expect(metrics.every(m => m.category === index_1.MetricCategory.TECHNIQUE)).toBe(true);
196
+ });
197
+ });
198
+ describe('getMetricsBySwimType', () => {
199
+ it('should return indoor pool metrics', () => {
200
+ const metrics = index_1.MetricsHelper.getMetricsBySwimType(index_1.SwimType.INDOOR);
201
+ expect(metrics.length).toBeGreaterThan(0);
202
+ expect(metrics.every(m => m.swimTypes.includes(index_1.SwimType.INDOOR))).toBe(true);
203
+ });
204
+ it('should return open water metrics', () => {
205
+ const metrics = index_1.MetricsHelper.getMetricsBySwimType(index_1.SwimType.OPEN_WATER);
206
+ expect(metrics.length).toBeGreaterThan(0);
207
+ expect(metrics.every(m => m.swimTypes.includes(index_1.SwimType.OPEN_WATER))).toBe(true);
208
+ });
209
+ });
210
+ describe('getIndoorMetrics', () => {
211
+ it('should return only indoor metrics', () => {
212
+ const metrics = index_1.MetricsHelper.getIndoorMetrics();
213
+ expect(metrics.length).toBeGreaterThan(0);
214
+ expect(metrics.every(m => m?.swimTypes?.includes(index_1.SwimType.INDOOR))).toBe(true);
215
+ });
216
+ });
217
+ describe('getOpenWaterMetrics', () => {
218
+ it('should return only open water metrics', () => {
219
+ const metrics = index_1.MetricsHelper.getOpenWaterMetrics();
220
+ expect(metrics.length).toBeGreaterThan(0);
221
+ expect(metrics.every(m => m?.swimTypes?.includes(index_1.SwimType.OPEN_WATER))).toBe(true);
222
+ });
223
+ });
224
+ describe('getAllMetricKeys', () => {
225
+ it('should return all metric keys', () => {
226
+ const keys = index_1.MetricsHelper.getAllMetricKeys();
227
+ expect(keys.length).toBeGreaterThan(0);
228
+ expect(keys).toContain('distance');
229
+ expect(keys).toContain('time');
230
+ });
231
+ });
232
+ describe('getAllLapMetricKeys', () => {
233
+ it('should return all lap metric keys', () => {
234
+ const keys = index_1.MetricsHelper.getAllLapMetricKeys();
235
+ expect(keys.length).toBeGreaterThan(0);
236
+ expect(keys).toContain('pace');
237
+ expect(keys).toContain('strokeCount');
238
+ });
239
+ });
240
+ });
241
+ describe('LAP_METRICS_REGISTRY', () => {
242
+ it('should have all required lap metrics', () => {
243
+ expect(index_1.LAP_METRICS_REGISTRY.lapNumber).toBeDefined();
244
+ expect(index_1.LAP_METRICS_REGISTRY.strokeCount).toBeDefined();
245
+ expect(index_1.LAP_METRICS_REGISTRY.pace).toBeDefined();
246
+ expect(index_1.LAP_METRICS_REGISTRY.strokeRate).toBeDefined();
247
+ expect(index_1.LAP_METRICS_REGISTRY.distancePerStroke).toBeDefined();
248
+ expect(index_1.LAP_METRICS_REGISTRY.strokeStyle).toBeDefined();
249
+ expect(index_1.LAP_METRICS_REGISTRY.splitTime).toBeDefined();
250
+ expect(index_1.LAP_METRICS_REGISTRY.swolfScore).toBeDefined();
251
+ });
252
+ it('should have correct descriptions using "per lap"', () => {
253
+ expect(index_1.LAP_METRICS_REGISTRY.pace.description).toBe('Time per 100m per lap');
254
+ expect(index_1.LAP_METRICS_REGISTRY.strokeRate.description).toBe('Strokes per minute per lap');
255
+ expect(index_1.LAP_METRICS_REGISTRY.distancePerStroke.description).toBe('Distance per stroke per lap');
256
+ expect(index_1.LAP_METRICS_REGISTRY.splitTime.description).toBe('Time taken per lap');
257
+ expect(index_1.LAP_METRICS_REGISTRY.swolfScore.description).toBe('SWOLF score per lap');
258
+ });
259
+ it('should have correct categories', () => {
260
+ expect(index_1.LAP_METRICS_REGISTRY.pace.category).toBe(index_1.MetricCategory.PERFORMANCE);
261
+ expect(index_1.LAP_METRICS_REGISTRY.strokeCount.category).toBe(index_1.MetricCategory.TECHNIQUE);
262
+ expect(index_1.LAP_METRICS_REGISTRY.strokeRate.category).toBe(index_1.MetricCategory.TECHNIQUE);
263
+ });
264
+ it('should have correct swim types', () => {
265
+ expect(index_1.LAP_METRICS_REGISTRY.pace.swimTypes).toEqual([index_1.SwimType.INDOOR]);
266
+ expect(index_1.LAP_METRICS_REGISTRY.strokeCount.swimTypes).toEqual([index_1.SwimType.INDOOR]);
267
+ });
268
+ it('should have lap formatters where needed', () => {
269
+ expect(index_1.LAP_METRICS_REGISTRY.pace.lapFormatter).toBeDefined();
270
+ expect(index_1.LAP_METRICS_REGISTRY.splitTime.lapFormatter).toBeDefined();
271
+ });
272
+ });
273
+ describe('METRICS_REGISTRY', () => {
274
+ it('should have all core session metrics', () => {
275
+ expect(index_1.METRICS_REGISTRY.distance).toBeDefined();
276
+ expect(index_1.METRICS_REGISTRY.time).toBeDefined();
277
+ expect(index_1.METRICS_REGISTRY.activeTime).toBeDefined();
278
+ expect(index_1.METRICS_REGISTRY.restTime).toBeDefined();
279
+ expect(index_1.METRICS_REGISTRY.laps).toBeDefined();
280
+ expect(index_1.METRICS_REGISTRY.avgPace).toBeDefined();
281
+ expect(index_1.METRICS_REGISTRY.calories).toBeDefined();
282
+ });
283
+ it('should have all heart rate metrics', () => {
284
+ expect(index_1.METRICS_REGISTRY.avgHeartRate).toBeDefined();
285
+ expect(index_1.METRICS_REGISTRY.maxHeartRate).toBeDefined();
286
+ expect(index_1.METRICS_REGISTRY.minHeartRate).toBeDefined();
287
+ });
288
+ it('should have all stroke metrics', () => {
289
+ expect(index_1.METRICS_REGISTRY.totalStrokeCount).toBeDefined();
290
+ expect(index_1.METRICS_REGISTRY.avgStrokeRate).toBeDefined();
291
+ expect(index_1.METRICS_REGISTRY.avgDistancePerStroke).toBeDefined();
292
+ expect(index_1.METRICS_REGISTRY.avgSwolfScore).toBeDefined();
293
+ });
294
+ it('should have correct HealthKit sources', () => {
295
+ expect(index_1.METRICS_REGISTRY.distance?.isHealthKit).toBe(true);
296
+ expect(index_1.METRICS_REGISTRY.avgHeartRate?.isHealthKit).toBe(true);
297
+ expect(index_1.METRICS_REGISTRY.totalStrokeCount?.isHealthKit).toBe(true);
298
+ });
299
+ it('should have correct swim type availability', () => {
300
+ expect(index_1.METRICS_REGISTRY.laps?.swimTypes).toEqual([index_1.SwimType.INDOOR]);
301
+ expect(index_1.METRICS_REGISTRY.avgSwolfScore?.swimTypes).toEqual([index_1.SwimType.INDOOR]);
302
+ expect(index_1.METRICS_REGISTRY.distance?.swimTypes).toEqual([index_1.SwimType.INDOOR, index_1.SwimType.OPEN_WATER]);
303
+ });
304
+ it('should have formatters for display metrics', () => {
305
+ expect(index_1.METRICS_REGISTRY.distance?.formatter).toBeDefined();
306
+ expect(index_1.METRICS_REGISTRY.time?.formatter).toBeDefined();
307
+ expect(index_1.METRICS_REGISTRY.avgHeartRate?.formatter).toBeDefined();
308
+ });
309
+ it('should have conditions for optional metrics', () => {
310
+ expect(index_1.METRICS_REGISTRY.restTime?.condition).toBeDefined();
311
+ expect(index_1.METRICS_REGISTRY.avgSwolfScore?.condition).toBeDefined();
312
+ expect(index_1.METRICS_REGISTRY.waterTemp?.condition).toBeDefined();
313
+ });
314
+ it('should mark chartable metrics correctly', () => {
315
+ expect(index_1.METRICS_REGISTRY.distance?.hasChart).toBe(true);
316
+ expect(index_1.METRICS_REGISTRY.time?.hasChart).toBe(true);
317
+ expect(index_1.METRICS_REGISTRY.avgPace?.hasChart).toBe(true);
74
318
  });
75
319
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swimedge/metrics",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "Shared metrics registry for SwimEdge (frontend, backend, watch)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -52,4 +52,4 @@
52
52
  "ts-jest": "^29.1.0",
53
53
  "typescript": "^5.0.0"
54
54
  }
55
- }
55
+ }