hevy-shared 1.0.696 → 1.0.698
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/built/filterExercises.d.ts +0 -6
- package/built/filterExercises.js +1 -126
- package/built/index.d.ts +1 -0
- package/package.json +1 -2
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Fuse from 'fuse.js';
|
|
2
1
|
import { EquipmentFilter, Language, LibraryExercise, MuscleGroupFilter, CustomExercise } from './index';
|
|
3
2
|
export interface SearchableLibraryExercise extends LibraryExercise {
|
|
4
3
|
localized_muscle_group_name: string;
|
|
@@ -21,11 +20,6 @@ interface FilterExercisesProps {
|
|
|
21
20
|
searchText: string;
|
|
22
21
|
language: Language;
|
|
23
22
|
}
|
|
24
|
-
export declare const createFuseInstance: () => Fuse<string>;
|
|
25
|
-
export declare const newFilterExercises: ({ fuseInstance, exercises, muscleGroupFilter, equipmentType, searchText, language, muscleGroupMatchPenalty, }: FilterExercisesProps & {
|
|
26
|
-
muscleGroupMatchPenalty: number;
|
|
27
|
-
fuseInstance: Fuse<string>;
|
|
28
|
-
}) => SearchableExerciseTemplateWithStringScore[];
|
|
29
23
|
export declare const filterExercises: ({ exercises, muscleGroupFilter, equipmentType, searchText, language, }: FilterExercisesProps) => (CustomExercise | LibraryExercise)[];
|
|
30
24
|
/**
|
|
31
25
|
* Exercise templates that are shown at the top of the Exercise Library to
|
package/built/filterExercises.js
CHANGED
|
@@ -1,31 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.popularExerciseTemplateIds = exports.filterExercises =
|
|
7
|
-
const fuse_js_1 = __importDefault(require("fuse.js"));
|
|
3
|
+
exports.popularExerciseTemplateIds = exports.filterExercises = void 0;
|
|
8
4
|
const utils_1 = require("./utils");
|
|
9
5
|
const lodash_1 = require("lodash");
|
|
10
|
-
const createFuseInstance = () => {
|
|
11
|
-
const stringSimilarityFuseInstance = new fuse_js_1.default([''], {
|
|
12
|
-
includeScore: true,
|
|
13
|
-
threshold: 0.4,
|
|
14
|
-
location: 0, // Prefer matches at the beginning of the string
|
|
15
|
-
});
|
|
16
|
-
return stringSimilarityFuseInstance;
|
|
17
|
-
};
|
|
18
|
-
exports.createFuseInstance = createFuseInstance;
|
|
19
|
-
const newFilterExercises = ({ fuseInstance, exercises, muscleGroupFilter, equipmentType, searchText, language, muscleGroupMatchPenalty, }) => {
|
|
20
|
-
let result = exercises;
|
|
21
|
-
result = filterExercisesWithMuscleGroup(muscleGroupFilter, result);
|
|
22
|
-
result = filterExercisesWithEquipment(equipmentType, result);
|
|
23
|
-
const normalizedSearchText = normalizeSearchText(searchText, language);
|
|
24
|
-
result = newFilterExercisesWithSearchText(fuseInstance, normalizedSearchText, result, language, muscleGroupMatchPenalty);
|
|
25
|
-
result = orderExercisesWithSearchText(normalizedSearchText, result);
|
|
26
|
-
return result;
|
|
27
|
-
};
|
|
28
|
-
exports.newFilterExercises = newFilterExercises;
|
|
29
6
|
const filterExercises = ({ exercises, muscleGroupFilter, equipmentType, searchText, language, }) => {
|
|
30
7
|
let result = exercises;
|
|
31
8
|
result = filterExercisesWithMuscleGroup(muscleGroupFilter, result);
|
|
@@ -48,25 +25,6 @@ const filterExercisesWithEquipment = (equipmentType, exercises) => {
|
|
|
48
25
|
}
|
|
49
26
|
return exercises.filter((rd) => rd.equipment_category === equipmentType);
|
|
50
27
|
};
|
|
51
|
-
const fuseScoreToSimilarity = (score) => {
|
|
52
|
-
if (score === 0)
|
|
53
|
-
return 'exact';
|
|
54
|
-
if (score < 0.05)
|
|
55
|
-
return 'extremely-similar';
|
|
56
|
-
if (score < 0.3)
|
|
57
|
-
return 'very-similar';
|
|
58
|
-
if (score < 0.6)
|
|
59
|
-
return 'somewhat-similar';
|
|
60
|
-
return 'not-similar';
|
|
61
|
-
};
|
|
62
|
-
const getStringSimilarityScore = (searchString, targetString, fuseInstance) => {
|
|
63
|
-
var _a, _b;
|
|
64
|
-
fuseInstance.setCollection([targetString]);
|
|
65
|
-
const result = fuseInstance.search(searchString);
|
|
66
|
-
const score = (_b = (_a = result[0]) === null || _a === void 0 ? void 0 : _a.score) !== null && _b !== void 0 ? _b : 1.0;
|
|
67
|
-
return score;
|
|
68
|
-
};
|
|
69
|
-
// Old filter exercise functionality, will be removed when new feature goes live
|
|
70
28
|
const filterExercisesWithSearchText = (searchText, exercises, language) => {
|
|
71
29
|
if (searchText.length === 0) {
|
|
72
30
|
return exercises;
|
|
@@ -126,89 +84,6 @@ const filterExercisesWithSearchText = (searchText, exercises, language) => {
|
|
|
126
84
|
return false;
|
|
127
85
|
});
|
|
128
86
|
};
|
|
129
|
-
const newFilterExercisesWithSearchText = (fuseInstance, searchText, exercises, language,
|
|
130
|
-
// 0 means no penalty, 1 means don't match muscle groups (because a score > 1 means no match)
|
|
131
|
-
muscleGroupMatchPenalty) => {
|
|
132
|
-
if (searchText.length === 0) {
|
|
133
|
-
return exercises;
|
|
134
|
-
}
|
|
135
|
-
return exercises.reduce((accu, e) => {
|
|
136
|
-
const searchableSearchText = searchable(searchText);
|
|
137
|
-
const searchableEnglishTitle = searchable(e.title);
|
|
138
|
-
const searchableLocalizedTitleMap = !e.is_custom
|
|
139
|
-
? {
|
|
140
|
-
en: searchable(e.title),
|
|
141
|
-
es: e.es_title ? searchable(e.es_title) : undefined,
|
|
142
|
-
de: e.de_title ? searchable(e.de_title) : undefined,
|
|
143
|
-
fr: e.fr_title ? searchable(e.fr_title) : undefined,
|
|
144
|
-
it: e.it_title ? searchable(e.it_title) : undefined,
|
|
145
|
-
pt: e.pt_title ? searchable(e.pt_title) : undefined,
|
|
146
|
-
tr: e.tr_title ? searchable(e.tr_title) : undefined,
|
|
147
|
-
zh_CN: e.zh_cn_title ? searchable(e.zh_cn_title) : undefined,
|
|
148
|
-
zh_TW: e.zh_tw_title ? searchable(e.zh_tw_title) : undefined,
|
|
149
|
-
ru: e.ru_title ? searchable(e.ru_title) : undefined,
|
|
150
|
-
ja: e.ja_title ? searchable(e.ja_title) : undefined,
|
|
151
|
-
ko: e.ko_title ? searchable(e.ko_title) : undefined,
|
|
152
|
-
}
|
|
153
|
-
: {
|
|
154
|
-
en: searchable(e.title),
|
|
155
|
-
};
|
|
156
|
-
const searchableLocalizedTitle = searchableLocalizedTitleMap[language] || searchableLocalizedTitleMap.en;
|
|
157
|
-
const searchableLocalizedMuscleGroupName = searchable(e.localized_muscle_group_name);
|
|
158
|
-
const searchableMuscleGroup = searchable(e.muscle_group);
|
|
159
|
-
const searchableMisspelledDumbbellEquipment = e.equipment_category === 'dumbbell' ? 'dumbell' : '';
|
|
160
|
-
const searchableTags = !e.is_custom && e.manual_tag ? searchable(e.manual_tag) : '';
|
|
161
|
-
const searchableAka = !e.is_custom && e.aka ? searchable(e.aka) : '';
|
|
162
|
-
const englishSimilarityScore = getStringSimilarityScore(searchableSearchText, searchableEnglishTitle, fuseInstance);
|
|
163
|
-
const localizedSimilarityScore = getStringSimilarityScore(searchableSearchText, searchableLocalizedTitle, fuseInstance);
|
|
164
|
-
let englishMuscleGroupSimilarityScore = 1;
|
|
165
|
-
let muscleGroupSimilarityScore = 1;
|
|
166
|
-
if (muscleGroupMatchPenalty < 1) {
|
|
167
|
-
englishMuscleGroupSimilarityScore = getStringSimilarityScore(searchableSearchText, searchableMuscleGroup, fuseInstance);
|
|
168
|
-
muscleGroupSimilarityScore = getStringSimilarityScore(searchableSearchText, searchableLocalizedMuscleGroupName, fuseInstance);
|
|
169
|
-
}
|
|
170
|
-
// We always return the best score, regardless of where the match happens
|
|
171
|
-
const bestScore = Math.min(englishSimilarityScore, localizedSimilarityScore, englishMuscleGroupSimilarityScore + muscleGroupMatchPenalty, muscleGroupSimilarityScore + muscleGroupMatchPenalty);
|
|
172
|
-
if (fuseScoreToSimilarity(englishSimilarityScore) !== 'not-similar') {
|
|
173
|
-
accu.push(Object.assign(Object.assign({}, e), { searchStringScore: bestScore }));
|
|
174
|
-
return accu;
|
|
175
|
-
}
|
|
176
|
-
if (fuseScoreToSimilarity(localizedSimilarityScore) !== 'not-similar') {
|
|
177
|
-
accu.push(Object.assign(Object.assign({}, e), { searchStringScore: bestScore }));
|
|
178
|
-
return accu;
|
|
179
|
-
}
|
|
180
|
-
if (['exact', 'extremely-similar'].includes(fuseScoreToSimilarity(englishMuscleGroupSimilarityScore))) {
|
|
181
|
-
accu.push(Object.assign(Object.assign({}, e), { searchStringScore: bestScore }));
|
|
182
|
-
return accu;
|
|
183
|
-
}
|
|
184
|
-
if (['exact', 'extremely-similar'].includes(fuseScoreToSimilarity(muscleGroupSimilarityScore))) {
|
|
185
|
-
accu.push(Object.assign(Object.assign({}, e), { searchStringScore: bestScore }));
|
|
186
|
-
return accu;
|
|
187
|
-
}
|
|
188
|
-
if (e.is_custom && 'custom'.includes(searchableSearchText)) {
|
|
189
|
-
accu.push(e);
|
|
190
|
-
return accu;
|
|
191
|
-
}
|
|
192
|
-
const splitSearch = searchableSearchText.split(' ');
|
|
193
|
-
const splitTitle = [
|
|
194
|
-
searchableLocalizedTitle,
|
|
195
|
-
searchableEnglishTitle,
|
|
196
|
-
searchableTags,
|
|
197
|
-
searchableAka,
|
|
198
|
-
searchableMisspelledDumbbellEquipment,
|
|
199
|
-
]
|
|
200
|
-
.join(' ')
|
|
201
|
-
.split(' ');
|
|
202
|
-
// Find:
|
|
203
|
-
// title ['arnold', 'press', '(barbell)']
|
|
204
|
-
// search ['press', 'bar']
|
|
205
|
-
if ((0, lodash_1.intersectionWith)(splitSearch, splitTitle, (search, title) => title.includes(search)).length === splitSearch.length) {
|
|
206
|
-
accu.push(e);
|
|
207
|
-
return accu;
|
|
208
|
-
}
|
|
209
|
-
return accu;
|
|
210
|
-
}, []);
|
|
211
|
-
};
|
|
212
87
|
const orderExercisesWithSearchText = (searchText, exercises) => {
|
|
213
88
|
if (searchText.length === 0) {
|
|
214
89
|
return exercises;
|
package/built/index.d.ts
CHANGED
|
@@ -912,6 +912,7 @@ export declare const isWorkoutBiometrics: (x: any) => x is WorkoutBiometrics;
|
|
|
912
912
|
export interface WorkoutBiometrics {
|
|
913
913
|
total_calories?: number;
|
|
914
914
|
heart_rate_samples?: HeartRateSample[];
|
|
915
|
+
average_heart_rate?: number;
|
|
915
916
|
}
|
|
916
917
|
export interface HeartRateSample {
|
|
917
918
|
timestamp_ms: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hevy-shared",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.698",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "built/index.js",
|
|
6
6
|
"types": "built/index.d.ts",
|
|
@@ -35,7 +35,6 @@
|
|
|
35
35
|
"typescript": "5.8.2"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"fuse.js": "^7.0.0",
|
|
39
38
|
"lodash": "^4.17.21"
|
|
40
39
|
}
|
|
41
40
|
}
|