@ethlete/query 4.4.2 → 4.6.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/esm2022/index.mjs +2 -1
- package/esm2022/lib/class-validator/class-validator.types.mjs +2 -0
- package/esm2022/lib/class-validator/class-validator.utils.mjs +4 -0
- package/esm2022/lib/class-validator/index.mjs +3 -0
- package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +3 -3
- package/esm2022/lib/directives/infinity-query.directive.mjs +3 -3
- package/esm2022/lib/directives/query.directive.mjs +10 -7
- package/esm2022/lib/query/query.types.mjs +1 -1
- package/esm2022/lib/query/query.utils.mjs +10 -1
- package/esm2022/lib/request/request.types.mjs +1 -1
- package/esm2022/lib/request/request.util.mjs +21 -4
- package/esm2022/lib/symfony/symfony.utils.mjs +4 -1
- package/fesm2022/ethlete-query.mjs +51 -15
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/lib/class-validator/class-validator.types.d.ts +6 -0
- package/lib/class-validator/class-validator.utils.d.ts +2 -0
- package/lib/class-validator/index.d.ts +2 -0
- package/lib/directives/query.directive.d.ts +9 -5
- package/lib/query/query.types.d.ts +1 -0
- package/lib/query/query.utils.d.ts +4 -0
- package/lib/request/request.types.d.ts +16 -0
- package/lib/request/request.util.d.ts +2 -0
- package/lib/symfony/symfony.utils.d.ts +2 -0
- package/package.json +1 -1
|
@@ -16,4 +16,7 @@ export const isSymfonyPagerfantaOutOfRangeError = (error) => {
|
|
|
16
16
|
}
|
|
17
17
|
return error.class.startsWith('Pagerfanta') && error.class.endsWith('OutOfRangeCurrentPageException');
|
|
18
18
|
};
|
|
19
|
-
|
|
19
|
+
export const isSymfonyFormViolationListError = (error) => {
|
|
20
|
+
return typeof error === 'object' && error !== null && 'violations' in error;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltZm9ueS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9zeW1mb255L3N5bWZvbnkudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYyxFQUF5QixFQUFFO0lBQ3RFLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLFlBQVksR0FBRyxLQUFxQixDQUFDO0lBRTNDLE9BQU8sQ0FDTCxZQUFZLENBQUMsS0FBSyxLQUFLLFNBQVM7UUFDaEMsWUFBWSxDQUFDLE1BQU0sS0FBSyxTQUFTO1FBQ2pDLFlBQVksQ0FBQyxNQUFNLEtBQUssU0FBUztRQUNqQyxZQUFZLENBQUMsS0FBSyxLQUFLLFNBQVM7UUFDaEMsWUFBWSxDQUFDLEtBQUssS0FBSyxTQUFTO1FBQ2hDLFlBQVksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUNoQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsQ0FBQyxLQUFjLEVBQXlCLEVBQUU7SUFDMUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUMxQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ3hHLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLENBQUMsS0FBYyxFQUFrQyxFQUFFO0lBQ2hHLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQztBQUM5RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtVmlvbGF0aW9uTGlzdFZpZXcgfSBmcm9tICdAZXRobGV0ZS90eXBlcyc7XG5pbXBvcnQgeyBTeW1mb255RXJyb3IgfSBmcm9tICcuL3N5bWZvbnkudHlwZXMnO1xuXG5leHBvcnQgY29uc3QgaXNTeW1mb255RXJyb3IgPSAoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBTeW1mb255RXJyb3IgPT4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzeW1mb255RXJyb3IgPSBlcnJvciBhcyBTeW1mb255RXJyb3I7XG5cbiAgcmV0dXJuIChcbiAgICBzeW1mb255RXJyb3IuY2xhc3MgIT09IHVuZGVmaW5lZCAmJlxuICAgIHN5bWZvbnlFcnJvci5kZXRhaWwgIT09IHVuZGVmaW5lZCAmJlxuICAgIHN5bWZvbnlFcnJvci5zdGF0dXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHN5bWZvbnlFcnJvci50aXRsZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgc3ltZm9ueUVycm9yLnRyYWNlICE9PSB1bmRlZmluZWQgJiZcbiAgICBzeW1mb255RXJyb3IudHlwZSAhPT0gdW5kZWZpbmVkXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNTeW1mb255UGFnZXJmYW50YU91dE9mUmFuZ2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIFN5bWZvbnlFcnJvciA9PiB7XG4gIGlmICghaXNTeW1mb255RXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGVycm9yLmNsYXNzLnN0YXJ0c1dpdGgoJ1BhZ2VyZmFudGEnKSAmJiBlcnJvci5jbGFzcy5lbmRzV2l0aCgnT3V0T2ZSYW5nZUN1cnJlbnRQYWdlRXhjZXB0aW9uJyk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNTeW1mb255Rm9ybVZpb2xhdGlvbkxpc3RFcnJvciA9IChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEZvcm1WaW9sYXRpb25MaXN0VmlldyA9PiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICd2aW9sYXRpb25zJyBpbiBlcnJvcjtcbn07XG4iXX0=
|
|
@@ -67,7 +67,12 @@ const isSymfonyPagerfantaOutOfRangeError = (error) => {
|
|
|
67
67
|
}
|
|
68
68
|
return error.class.startsWith('Pagerfanta') && error.class.endsWith('OutOfRangeCurrentPageException');
|
|
69
69
|
};
|
|
70
|
+
const isSymfonyFormViolationListError = (error) => {
|
|
71
|
+
return typeof error === 'object' && error !== null && 'violations' in error;
|
|
72
|
+
};
|
|
70
73
|
|
|
74
|
+
const isNaN$1 = (value) => typeof value === 'number' && Number.isNaN(value);
|
|
75
|
+
const isEmptyString = (value) => typeof value === 'string' && value.trim() === '';
|
|
71
76
|
const isRequestError = (error) => error instanceof Object && 'status' in error && 'statusText' in error && 'url' in error;
|
|
72
77
|
const buildRoute = (options) => {
|
|
73
78
|
if (options.base.endsWith('/')) {
|
|
@@ -97,24 +102,39 @@ const buildRoute = (options) => {
|
|
|
97
102
|
const buildQueryString = (params, config) => {
|
|
98
103
|
const objectNotation = config?.objectNotation ?? 'bracket';
|
|
99
104
|
const writeArrayIndexes = config?.writeArrayIndexes ?? false;
|
|
105
|
+
const ignoredValues = config?.ignoredValues ?? [undefined, null, Infinity, -Infinity];
|
|
106
|
+
const ignoredValuesFns = config?.ignoredValuesFns ?? [isNaN$1, isEmptyString];
|
|
100
107
|
const queryParams = [];
|
|
101
108
|
function processValue(key, value) {
|
|
102
109
|
if (Array.isArray(value)) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
110
|
+
let currentFilteredIndex = 0;
|
|
111
|
+
for (const arrayValue of value) {
|
|
112
|
+
const nestedKey = writeArrayIndexes ? `${key}[${currentFilteredIndex}]` : `${key}[]`;
|
|
113
|
+
const didAddValue = processValue(nestedKey, arrayValue);
|
|
114
|
+
if (didAddValue) {
|
|
115
|
+
currentFilteredIndex++;
|
|
116
|
+
}
|
|
106
117
|
}
|
|
118
|
+
return null;
|
|
107
119
|
}
|
|
108
120
|
else if (typeof value === 'object' && value !== null) {
|
|
109
121
|
for (const [objKey, val] of Object.entries(value)) {
|
|
110
122
|
const nestedKey = objectNotation === 'dot' ? `${key}.${objKey}` : `${key}[${objKey}]`;
|
|
111
123
|
processValue(nestedKey, val);
|
|
112
124
|
}
|
|
125
|
+
return null;
|
|
113
126
|
}
|
|
114
127
|
else {
|
|
128
|
+
if (ignoredValues.includes(value)) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
if (ignoredValuesFns.some((fn) => fn(value))) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
115
134
|
const encodedKey = encodeURIComponent(key);
|
|
116
135
|
const encodedValue = encodeURIComponent(value);
|
|
117
136
|
queryParams.push(`${encodedKey}=${encodedValue}`);
|
|
137
|
+
return true;
|
|
118
138
|
}
|
|
119
139
|
}
|
|
120
140
|
for (const [key, val] of Object.entries(params)) {
|
|
@@ -601,6 +621,15 @@ const isQuery = (query) => {
|
|
|
601
621
|
}
|
|
602
622
|
return true;
|
|
603
623
|
};
|
|
624
|
+
const isQueryCollection = (query) => {
|
|
625
|
+
if (!query || typeof query !== 'object' || Array.isArray(query)) {
|
|
626
|
+
return false;
|
|
627
|
+
}
|
|
628
|
+
if (!('query' in query)) {
|
|
629
|
+
return false;
|
|
630
|
+
}
|
|
631
|
+
return true;
|
|
632
|
+
};
|
|
604
633
|
const createQueryCollection = (
|
|
605
634
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
606
635
|
queryMap) => new BehaviorSubject(null);
|
|
@@ -1125,6 +1154,10 @@ class BearerAuthProvider {
|
|
|
1125
1154
|
}
|
|
1126
1155
|
}
|
|
1127
1156
|
|
|
1157
|
+
const isClassValidatorError = (error) => {
|
|
1158
|
+
return typeof error === 'object' && error !== null && 'statusCode' in error && 'message' in error && 'error' in error;
|
|
1159
|
+
};
|
|
1160
|
+
|
|
1128
1161
|
class QueryDirective {
|
|
1129
1162
|
constructor() {
|
|
1130
1163
|
this._mainTemplateRef = inject(TemplateRef);
|
|
@@ -1140,6 +1173,7 @@ class QueryDirective {
|
|
|
1140
1173
|
refreshing: false,
|
|
1141
1174
|
error: null,
|
|
1142
1175
|
progress: null,
|
|
1176
|
+
scope: null,
|
|
1143
1177
|
};
|
|
1144
1178
|
this._cache = false;
|
|
1145
1179
|
}
|
|
@@ -1168,17 +1202,19 @@ class QueryDirective {
|
|
|
1168
1202
|
_subscribeToQuery() {
|
|
1169
1203
|
this._subscription?.unsubscribe();
|
|
1170
1204
|
this._subscription = null;
|
|
1171
|
-
|
|
1205
|
+
const query = extractQuery(this.query);
|
|
1206
|
+
if (!query) {
|
|
1172
1207
|
this._viewContext.$implicit = null;
|
|
1173
1208
|
this._viewContext.etQuery = null;
|
|
1174
1209
|
this._viewContext.loading = false;
|
|
1175
1210
|
this._viewContext.refreshing = false;
|
|
1176
1211
|
this._viewContext.error = null;
|
|
1177
1212
|
this._viewContext.progress = null;
|
|
1213
|
+
this._viewContext.scope = null;
|
|
1178
1214
|
return;
|
|
1179
1215
|
}
|
|
1180
|
-
const query = isQuery(this.query) ? this.query : this.query.query;
|
|
1181
1216
|
const sub = query.state$.pipe(tap((state) => this._updateView(state))).subscribe();
|
|
1217
|
+
this._viewContext.scope = isQueryCollection(query) ? query.type : null;
|
|
1182
1218
|
this._subscription = sub;
|
|
1183
1219
|
}
|
|
1184
1220
|
_updateView(state) {
|
|
@@ -1217,10 +1253,10 @@ class QueryDirective {
|
|
|
1217
1253
|
this._viewContainerRef.createEmbeddedView(this._mainTemplateRef, this._viewContext);
|
|
1218
1254
|
}
|
|
1219
1255
|
}
|
|
1220
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.
|
|
1221
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.
|
|
1256
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: QueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1257
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.3", type: QueryDirective, isStandalone: true, selector: "[etQuery]", inputs: { query: ["etQuery", "query"], cache: ["etQueryCache", "cache"] }, ngImport: i0 }); }
|
|
1222
1258
|
}
|
|
1223
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.
|
|
1259
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: QueryDirective, decorators: [{
|
|
1224
1260
|
type: Directive,
|
|
1225
1261
|
args: [{
|
|
1226
1262
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -1548,10 +1584,10 @@ class InfinityQueryDirective {
|
|
|
1548
1584
|
this._viewContext.currentQuery = null;
|
|
1549
1585
|
this._data$.next([]);
|
|
1550
1586
|
}
|
|
1551
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.
|
|
1552
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.
|
|
1587
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: InfinityQueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1588
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.3", type: InfinityQueryDirective, isStandalone: true, selector: "[etInfinityQuery]", inputs: { infinityQuery: ["etInfinityQuery", "infinityQuery"] }, providers: [{ provide: INFINITY_QUERY_TOKEN, useExisting: InfinityQueryDirective }], exportAs: ["etInfinityQuery"], hostDirectives: [{ directive: i1.DelayableDirective }], ngImport: i0 }); }
|
|
1553
1589
|
}
|
|
1554
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.
|
|
1590
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: InfinityQueryDirective, decorators: [{
|
|
1555
1591
|
type: Directive,
|
|
1556
1592
|
args: [{
|
|
1557
1593
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -1602,10 +1638,10 @@ class InfinityQueryTriggerDirective {
|
|
|
1602
1638
|
});
|
|
1603
1639
|
this._observer.observe(this._elementRef.nativeElement);
|
|
1604
1640
|
}
|
|
1605
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.
|
|
1606
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.
|
|
1641
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: InfinityQueryTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1642
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.3", type: InfinityQueryTriggerDirective, isStandalone: true, selector: "[etInfinityQueryTrigger], et-infinity-query-trigger", inputs: { scrollContainerSelector: "scrollContainerSelector" }, ngImport: i0 }); }
|
|
1607
1643
|
}
|
|
1608
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.
|
|
1644
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: InfinityQueryTriggerDirective, decorators: [{
|
|
1609
1645
|
type: Directive,
|
|
1610
1646
|
args: [{
|
|
1611
1647
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -2324,5 +2360,5 @@ const def = () => null;
|
|
|
2324
2360
|
* Generated bundle index. Do not edit.
|
|
2325
2361
|
*/
|
|
2326
2362
|
|
|
2327
|
-
export { BasicAuthProvider, BearerAuthProvider, CustomHeaderAuthProvider, EntityStore, INFINITY_QUERY_TOKEN, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, Query, QueryClient, QueryCreator, QueryDirective, QueryError, QueryField, QueryForm, QueryFormGroup, QueryStore, buildErrorMessage, buildGqlCacheKey, buildQueryString, buildRoute, buildTimestampFromSeconds, castQueryCreatorTypes, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, createInfinityQueryConfig, createQueryCollection, decryptBearer, deepFreeze, def, detectContentTypeHeader, extractExpiresInSeconds, extractQuery, filterFailure, filterNull, filterQueryStates, filterSuccess, forEachHeader, getDefaultHeaders, getResponseUrl, gql, hasHeader, ignoreAutoRefresh, invalidBaseRouteError, invalidBodyError, invalidRouteError, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isCustomHeaderAuthProvider, isGqlQueryConfig, isQuery, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyPagerfantaOutOfRangeError, mapToPaginated, mergeHeaders, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, pathParamsMissingInRouteFunctionError, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, request, resetPageOnError, serializeBody, shouldCacheQuery, shouldRetryRequest, skipPaginationPageParamCalculator, switchQueryCollectionState, switchQueryState, takeUntilResponse, transformGql, transformMethod, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray };
|
|
2363
|
+
export { BasicAuthProvider, BearerAuthProvider, CustomHeaderAuthProvider, EntityStore, INFINITY_QUERY_TOKEN, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, Query, QueryClient, QueryCreator, QueryDirective, QueryError, QueryField, QueryForm, QueryFormGroup, QueryStore, buildErrorMessage, buildGqlCacheKey, buildQueryString, buildRoute, buildTimestampFromSeconds, castQueryCreatorTypes, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, createInfinityQueryConfig, createQueryCollection, decryptBearer, deepFreeze, def, detectContentTypeHeader, extractExpiresInSeconds, extractQuery, filterFailure, filterNull, filterQueryStates, filterSuccess, forEachHeader, getDefaultHeaders, getResponseUrl, gql, hasHeader, ignoreAutoRefresh, invalidBaseRouteError, invalidBodyError, invalidRouteError, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isClassValidatorError, isCustomHeaderAuthProvider, isEmptyString, isGqlQueryConfig, isNaN$1 as isNaN, isQuery, isQueryCollection, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyFormViolationListError, isSymfonyPagerfantaOutOfRangeError, mapToPaginated, mergeHeaders, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, pathParamsMissingInRouteFunctionError, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, request, resetPageOnError, serializeBody, shouldCacheQuery, shouldRetryRequest, skipPaginationPageParamCalculator, switchQueryCollectionState, switchQueryState, takeUntilResponse, transformGql, transformMethod, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray };
|
|
2328
2364
|
//# sourceMappingURL=ethlete-query.mjs.map
|