@ethlete/query 5.41.4 → 5.42.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/CHANGELOG.md +12 -1
- package/fesm2022/ethlete-query.mjs +366 -308
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/generators/generators.json +9 -0
- package/generators/migrate-to-query-v3/migration.js +1744 -0
- package/generators/migrate-to-query-v3/schema.json +14 -0
- package/index.d.ts +89 -75
- package/package.json +9 -6
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i1 from '@ethlete/core';
|
|
2
|
-
import { createDestroy, computedTillTruthy, syncSignal
|
|
2
|
+
import { createDestroy, computedTillTruthy, syncSignal, RuntimeError, isObject, injectRoute, getDomain, getCookie, setCookie, deleteCookie, clamp, previousSignalValue, DelayableDirective, nextFrame, injectQueryParamChanges, injectQueryParams, clone, equal, ET_PROPERTY_REMOVED } from '@ethlete/core';
|
|
3
3
|
import { Observable, takeUntil, startWith, pairwise, tap, switchMap, of, BehaviorSubject, Subject, fromEvent, timer, take, Subscription, retry, throwError, catchError, ReplaySubject, map, shareReplay, interval, skip, takeWhile, filter, combineLatest, withLatestFrom, debounceTime, merge } from 'rxjs';
|
|
4
4
|
import { HttpStatusCode, HttpErrorResponse, HttpEventType, HttpClient, HttpHeaders } from '@angular/common/http';
|
|
5
5
|
import * as i0 from '@angular/core';
|
|
@@ -7,7 +7,7 @@ import { assertInInjectionContext, inject, Injector, runInInjectionContext, sign
|
|
|
7
7
|
import { toSignal, toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
8
|
import { getActiveConsumer, setActiveConsumer } from '@angular/core/primitives/signals';
|
|
9
9
|
import { io } from 'socket.io-client';
|
|
10
|
-
import { AsyncPipe, JsonPipe
|
|
10
|
+
import { NgClass, AsyncPipe, JsonPipe } from '@angular/common';
|
|
11
11
|
import * as i1$1 from '@angular/forms';
|
|
12
12
|
import { FormControl, ReactiveFormsModule, FormGroup } from '@angular/forms';
|
|
13
13
|
import { Router, ActivatedRoute } from '@angular/router';
|
|
@@ -643,7 +643,7 @@ function effectComputed(computation, injector) {
|
|
|
643
643
|
// Ignore errors in the initial computation
|
|
644
644
|
// Angular might throw an error if required inputs are read but not available yet
|
|
645
645
|
}
|
|
646
|
-
const lastResult = signal(initialData);
|
|
646
|
+
const lastResult = signal(initialData, ...(ngDevMode ? [{ debugName: "lastResult" }] : []));
|
|
647
647
|
effect(() => {
|
|
648
648
|
const data = runInInjectionContext(injector, () => computation());
|
|
649
649
|
untracked(() => {
|
|
@@ -694,8 +694,8 @@ function queryStateSignal(source, options) {
|
|
|
694
694
|
})), {
|
|
695
695
|
initialValue: null,
|
|
696
696
|
});
|
|
697
|
-
const rwSignal = signal(roSignal());
|
|
698
|
-
syncSignal
|
|
697
|
+
const rwSignal = signal(roSignal(), ...(ngDevMode ? [{ debugName: "rwSignal" }] : []));
|
|
698
|
+
syncSignal(roSignal, rwSignal);
|
|
699
699
|
return rwSignal;
|
|
700
700
|
}
|
|
701
701
|
function queryStateResponseSignal(source, options) {
|
|
@@ -703,7 +703,7 @@ function queryStateResponseSignal(source, options) {
|
|
|
703
703
|
const dataSignal = computed(() => {
|
|
704
704
|
const state = s();
|
|
705
705
|
return isQueryStateSuccess(state) ? state.response : null;
|
|
706
|
-
});
|
|
706
|
+
}, ...(ngDevMode ? [{ debugName: "dataSignal" }] : []));
|
|
707
707
|
dataSignal['reset'] = () => {
|
|
708
708
|
s.set(null);
|
|
709
709
|
};
|
|
@@ -786,7 +786,7 @@ class QueryCreator {
|
|
|
786
786
|
};
|
|
787
787
|
this.createSignal = (initialValue, config) => {
|
|
788
788
|
assertInInjectionContext(this.createSignal);
|
|
789
|
-
const _signal = signal(initialValue ?? null);
|
|
789
|
+
const _signal = signal(initialValue ?? null, ...(ngDevMode ? [{ debugName: "_signal" }] : []));
|
|
790
790
|
addQueryContainerHandling(toObservable(_signal), () => _signal(), config);
|
|
791
791
|
return _signal;
|
|
792
792
|
};
|
|
@@ -1037,84 +1037,119 @@ const buildQueryCacheKey$1 = (route, args) => {
|
|
|
1037
1037
|
return hash.toString();
|
|
1038
1038
|
};
|
|
1039
1039
|
|
|
1040
|
+
// codes 0-999
|
|
1041
|
+
const QueryRuntimeErrorCode = {
|
|
1042
|
+
// Query
|
|
1043
|
+
QUERY_FEATURE_USED_MULTIPLE_TIMES: 0,
|
|
1044
|
+
// Query features
|
|
1045
|
+
WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION: 100,
|
|
1046
|
+
WITH_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD: 101,
|
|
1047
|
+
WITH_AUTO_REFRESH_USED_ON_UNSUPPORTED_HTTP_METHOD: 102,
|
|
1048
|
+
WITH_AUTO_REFRESH_USED_IN_MANUAL_QUERY: 103,
|
|
1049
|
+
SILENCE_MISSING_WITH_ARGS_FEATURE_ERROR_USED_BUT_WITH_ARGS_PRESENT: 104,
|
|
1050
|
+
// Auth provider
|
|
1051
|
+
COOKIE_LOGIN_TRIED_BUT_COOKIE_DISABLED: 200,
|
|
1052
|
+
ENABLE_COOKIE_CALLED_WITHOUT_COOKIE_CONFIG: 201,
|
|
1053
|
+
DISABLE_COOKIE_CALLED_WITHOUT_COOKIE_CONFIG: 202,
|
|
1054
|
+
LOGIN_CALLED_WITHOUT_CONFIG: 203,
|
|
1055
|
+
LOGIN_WITH_TOKEN_CALLED_WITHOUT_CONFIG: 204,
|
|
1056
|
+
REFRESH_TOKEN_CALLED_WITHOUT_CONFIG: 205,
|
|
1057
|
+
SELECT_ROLE_CALLED_WITHOUT_CONFIG: 206,
|
|
1058
|
+
DEFAULT_RESPONSE_TRANSFORMER_RESPONSE_NOT_OBJECT: 207,
|
|
1059
|
+
DEFAULT_RESPONSE_TRANSFORMER_RESPONSE_NOT_CONTAINING_ACCESS_TOKEN: 208,
|
|
1060
|
+
DEFAULT_RESPONSE_TRANSFORMER_RESPONSE_NOT_CONTAINING_REFRESH_TOKEN: 209,
|
|
1061
|
+
UNABLE_TO_DECRYPT_BEARER_TOKEN: 210,
|
|
1062
|
+
BEARER_EXPIRES_IN_PROPERTY_NOT_NUMBER: 211,
|
|
1063
|
+
// Query Repository
|
|
1064
|
+
UNCACHEABLE_REQUEST_HAS_CACHE_KEY_PARAM: 300,
|
|
1065
|
+
UNCACHEABLE_REQUEST_HAS_ALLOW_CACHE_PARAM: 301,
|
|
1066
|
+
// Paged Query Stack
|
|
1067
|
+
PAGED_QUERY_STACK_PAGE_BIGGER_THAN_TOTAL_PAGES: 400,
|
|
1068
|
+
PAGED_QUERY_STACK_NEXT_PAGE_CALLED_WITHOUT_PREVIOUS_PAGE: 401,
|
|
1069
|
+
PAGED_QUERY_STACK_PREVIOUS_PAGE_CALLED_BUT_ALREADY_AT_FIRST_PAGE: 402,
|
|
1070
|
+
// Query Stack
|
|
1071
|
+
QUERY_STACK_WITH_ARGS_USED: 500,
|
|
1072
|
+
QUERY_STACK_WITH_RESPONSE_UPDATE_USED: 501,
|
|
1073
|
+
QUERY_STACK_TOTAL_QUERIES_AND_EXPECTED_QUERIES_MISMATCH: 502,
|
|
1074
|
+
};
|
|
1040
1075
|
const queryFeatureUsedMultipleTimes = (type) => {
|
|
1041
|
-
return new RuntimeError(
|
|
1076
|
+
return new RuntimeError(QueryRuntimeErrorCode.QUERY_FEATURE_USED_MULTIPLE_TIMES, `The query feature "${type}()" was used multiple times.`);
|
|
1042
1077
|
};
|
|
1043
1078
|
const withArgsQueryFeatureMissingButRouteIsFunction = () => {
|
|
1044
|
-
return new RuntimeError(
|
|
1079
|
+
return new RuntimeError(QueryRuntimeErrorCode.WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION, `This queries route is a function, but a "withArgs()" feature is missing.`);
|
|
1045
1080
|
};
|
|
1046
1081
|
const withPollingUsedOnUnsupportedHttpMethod = (method) => {
|
|
1047
|
-
return new RuntimeError(
|
|
1082
|
+
return new RuntimeError(QueryRuntimeErrorCode.WITH_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD, `This is a "${method}" request, "withPolling()" is only supported for GET, HEAD, OPTIONS requests and GQL queries.`);
|
|
1048
1083
|
};
|
|
1049
1084
|
const withAutoRefreshUsedOnUnsupportedHttpMethod = (method) => {
|
|
1050
|
-
return new RuntimeError(
|
|
1085
|
+
return new RuntimeError(QueryRuntimeErrorCode.WITH_AUTO_REFRESH_USED_ON_UNSUPPORTED_HTTP_METHOD, `This is a "${method}" request, "withAutoRefresh()" is only supported for GET, HEAD, OPTIONS requests and GQL queries.`);
|
|
1051
1086
|
};
|
|
1052
1087
|
const withAutoRefreshUsedInManualQuery = () => {
|
|
1053
|
-
return new RuntimeError(
|
|
1088
|
+
return new RuntimeError(QueryRuntimeErrorCode.WITH_AUTO_REFRESH_USED_IN_MANUAL_QUERY, `"withAutoRefresh()" has been used inside a query that has "onlyManualExecution" set to true.` +
|
|
1054
1089
|
` If this is intentional, set "ignoreOnlyManualExecution" to true inside the auto refresh config.`);
|
|
1055
1090
|
};
|
|
1056
1091
|
const silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent = () => {
|
|
1057
|
-
return new RuntimeError(
|
|
1092
|
+
return new RuntimeError(QueryRuntimeErrorCode.SILENCE_MISSING_WITH_ARGS_FEATURE_ERROR_USED_BUT_WITH_ARGS_PRESENT, `The "silenceMissingWithArgsFeatureError" config is set to true, but a "withArgs()" feature is present.`);
|
|
1058
1093
|
};
|
|
1059
1094
|
const cookieLoginTriedButCookieDisabled = () => {
|
|
1060
|
-
return new RuntimeError(
|
|
1095
|
+
return new RuntimeError(QueryRuntimeErrorCode.COOKIE_LOGIN_TRIED_BUT_COOKIE_DISABLED, `Cookie login has been tried, but the cookie is disabled.`);
|
|
1061
1096
|
};
|
|
1062
1097
|
const enableCookieCalledWithoutCookieConfig = () => {
|
|
1063
|
-
return new RuntimeError(
|
|
1098
|
+
return new RuntimeError(QueryRuntimeErrorCode.ENABLE_COOKIE_CALLED_WITHOUT_COOKIE_CONFIG, `enableCookie() has been called but there is no cookie config. Please set it during the auth provider creation.`);
|
|
1064
1099
|
};
|
|
1065
1100
|
const disableCookieCalledWithoutCookieConfig = () => {
|
|
1066
|
-
return new RuntimeError(
|
|
1101
|
+
return new RuntimeError(QueryRuntimeErrorCode.DISABLE_COOKIE_CALLED_WITHOUT_COOKIE_CONFIG, `disableCookie() has been called but there is no cookie config. Please set it during the auth provider creation.`);
|
|
1067
1102
|
};
|
|
1068
1103
|
const loginCalledWithoutConfig = () => {
|
|
1069
|
-
return new RuntimeError(
|
|
1104
|
+
return new RuntimeError(QueryRuntimeErrorCode.LOGIN_CALLED_WITHOUT_CONFIG, `login() has been called without a config. Please set it during the auth provider creation.`);
|
|
1070
1105
|
};
|
|
1071
1106
|
const loginWithTokenCalledWithoutConfig = () => {
|
|
1072
|
-
return new RuntimeError(
|
|
1107
|
+
return new RuntimeError(QueryRuntimeErrorCode.LOGIN_WITH_TOKEN_CALLED_WITHOUT_CONFIG, `loginWithToken() has been called without a config. Please set it during the auth provider creation.`);
|
|
1073
1108
|
};
|
|
1074
1109
|
const refreshTokenCalledWithoutConfig = () => {
|
|
1075
|
-
return new RuntimeError(
|
|
1110
|
+
return new RuntimeError(QueryRuntimeErrorCode.REFRESH_TOKEN_CALLED_WITHOUT_CONFIG, `refreshToken() has been called without a config. Please set it during the auth provider creation.`);
|
|
1076
1111
|
};
|
|
1077
1112
|
const selectRoleCalledWithoutConfig = () => {
|
|
1078
|
-
return new RuntimeError(
|
|
1113
|
+
return new RuntimeError(QueryRuntimeErrorCode.SELECT_ROLE_CALLED_WITHOUT_CONFIG, `selectRole() has been called without a config. Please set it during the auth provider creation.`);
|
|
1079
1114
|
};
|
|
1080
1115
|
const defaultResponseTransformerResponseNotObject = (currentType) => {
|
|
1081
|
-
return new RuntimeError(
|
|
1116
|
+
return new RuntimeError(QueryRuntimeErrorCode.DEFAULT_RESPONSE_TRANSFORMER_RESPONSE_NOT_OBJECT, `The default response transformer expects the response to be an object, but it is a "${currentType}".`);
|
|
1082
1117
|
};
|
|
1083
1118
|
const defaultResponseTransformerResponseNotContainingAccessToken = () => {
|
|
1084
|
-
return new RuntimeError(
|
|
1119
|
+
return new RuntimeError(QueryRuntimeErrorCode.DEFAULT_RESPONSE_TRANSFORMER_RESPONSE_NOT_CONTAINING_ACCESS_TOKEN, `The default response transformer expects the response to contain an "accessToken" property.`);
|
|
1085
1120
|
};
|
|
1086
1121
|
const defaultResponseTransformerResponseNotContainingRefreshToken = () => {
|
|
1087
|
-
return new RuntimeError(
|
|
1122
|
+
return new RuntimeError(QueryRuntimeErrorCode.DEFAULT_RESPONSE_TRANSFORMER_RESPONSE_NOT_CONTAINING_REFRESH_TOKEN, `The default response transformer expects the response to contain a "refreshToken" property.`);
|
|
1088
1123
|
};
|
|
1089
1124
|
const unableToDecryptBearerToken = (token) => {
|
|
1090
|
-
return new RuntimeError(
|
|
1125
|
+
return new RuntimeError(QueryRuntimeErrorCode.UNABLE_TO_DECRYPT_BEARER_TOKEN, `The bearer token could not be decrypted: ${token}`);
|
|
1091
1126
|
};
|
|
1092
1127
|
const bearerExpiresInPropertyNotNumber = (expiresIn) => {
|
|
1093
|
-
return new RuntimeError(
|
|
1128
|
+
return new RuntimeError(QueryRuntimeErrorCode.BEARER_EXPIRES_IN_PROPERTY_NOT_NUMBER, `The expires in property is not a number: ${expiresIn}`);
|
|
1094
1129
|
};
|
|
1095
1130
|
const uncacheableRequestHasCacheKeyParam = (key) => {
|
|
1096
|
-
return new RuntimeError(
|
|
1131
|
+
return new RuntimeError(QueryRuntimeErrorCode.UNCACHEABLE_REQUEST_HAS_CACHE_KEY_PARAM, `This request is uncacheable, but a cache key was provided: ${key}. Please remove it.`);
|
|
1097
1132
|
};
|
|
1098
1133
|
const uncacheableRequestHasAllowCacheParam = () => {
|
|
1099
|
-
return new RuntimeError(
|
|
1134
|
+
return new RuntimeError(QueryRuntimeErrorCode.UNCACHEABLE_REQUEST_HAS_ALLOW_CACHE_PARAM, `This request is uncacheable, but allowCache is set to true. Please remove it.`);
|
|
1100
1135
|
};
|
|
1101
1136
|
const pagedQueryStackPageBiggerThanTotalPages = (page, totalPages) => {
|
|
1102
|
-
return new RuntimeError(
|
|
1137
|
+
return new RuntimeError(QueryRuntimeErrorCode.PAGED_QUERY_STACK_PAGE_BIGGER_THAN_TOTAL_PAGES, `The page "${page}" is bigger than the total pages "${totalPages}".`);
|
|
1103
1138
|
};
|
|
1104
1139
|
const pagedQueryStackNextPageCalledWithoutPreviousPage = () => {
|
|
1105
|
-
return new RuntimeError(
|
|
1140
|
+
return new RuntimeError(QueryRuntimeErrorCode.PAGED_QUERY_STACK_NEXT_PAGE_CALLED_WITHOUT_PREVIOUS_PAGE, `fetchNextPage() has been called but the current page is not yet loaded. Please call it after the previous page has been loaded.`);
|
|
1106
1141
|
};
|
|
1107
1142
|
const pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage = () => {
|
|
1108
|
-
return new RuntimeError(
|
|
1143
|
+
return new RuntimeError(QueryRuntimeErrorCode.PAGED_QUERY_STACK_PREVIOUS_PAGE_CALLED_BUT_ALREADY_AT_FIRST_PAGE, `fetchPreviousPage() has been called but the current page is already the first page.`);
|
|
1109
1144
|
};
|
|
1110
1145
|
const queryStackWithArgsUsed = () => {
|
|
1111
|
-
return new RuntimeError(
|
|
1146
|
+
return new RuntimeError(QueryRuntimeErrorCode.QUERY_STACK_WITH_ARGS_USED, `withArgs() has been used in a query stack or a paged query stack. This is not supported.`);
|
|
1112
1147
|
};
|
|
1113
1148
|
const queryStackWithResponseUpdateUsed = () => {
|
|
1114
|
-
return new RuntimeError(
|
|
1149
|
+
return new RuntimeError(QueryRuntimeErrorCode.QUERY_STACK_WITH_RESPONSE_UPDATE_USED, `withResponseUpdate() has been used in a query stack or a paged query stack. This is not supported.`);
|
|
1115
1150
|
};
|
|
1116
1151
|
const queryStackTotalQueriesAndExpectedQueriesMismatch = (totalQueries, expectedQueries) => {
|
|
1117
|
-
return new RuntimeError(
|
|
1152
|
+
return new RuntimeError(QueryRuntimeErrorCode.QUERY_STACK_TOTAL_QUERIES_AND_EXPECTED_QUERIES_MISMATCH, `The total queries "${totalQueries}" and the expected queries "${expectedQueries}" do not match. This usually happens if a query depends on the response of the previous query to calculate its pagination values. Set blockExecutionDuringLoading to true to prevent this.`);
|
|
1118
1153
|
};
|
|
1119
1154
|
|
|
1120
1155
|
const defaultResponseTransformer = (response) => {
|
|
@@ -1132,7 +1167,7 @@ const defaultResponseTransformer = (response) => {
|
|
|
1132
1167
|
const FIVE_MINUTES = 5 * 60 * 1000;
|
|
1133
1168
|
const createAuthProviderQuery = (config, authProviderConfig) => {
|
|
1134
1169
|
const query = config.queryCreator({ onlyManualExecution: true });
|
|
1135
|
-
const triggeredInternally = signal(false);
|
|
1170
|
+
const triggeredInternally = signal(false, ...(ngDevMode ? [{ debugName: "triggeredInternally" }] : []));
|
|
1136
1171
|
const tokens = computed(() => {
|
|
1137
1172
|
const res = query.response();
|
|
1138
1173
|
if (!res)
|
|
@@ -1145,7 +1180,7 @@ const createAuthProviderQuery = (config, authProviderConfig) => {
|
|
|
1145
1180
|
bearer: bearerValue,
|
|
1146
1181
|
tokens: transformed,
|
|
1147
1182
|
};
|
|
1148
|
-
});
|
|
1183
|
+
}, ...(ngDevMode ? [{ debugName: "tokens" }] : []));
|
|
1149
1184
|
const expiresIn = computed(() => {
|
|
1150
1185
|
const res = tokens();
|
|
1151
1186
|
if (!res)
|
|
@@ -1158,7 +1193,7 @@ const createAuthProviderQuery = (config, authProviderConfig) => {
|
|
|
1158
1193
|
// const dummyRemainingTime = (query.lastTimeExecutedAt() ?? 0) + 5000 - new Date().getTime();
|
|
1159
1194
|
const remainingTime = new Date(expiresIn * 1000).getTime() - refreshBuffer - new Date().getTime();
|
|
1160
1195
|
return remainingTime;
|
|
1161
|
-
});
|
|
1196
|
+
}, ...(ngDevMode ? [{ debugName: "expiresIn" }] : []));
|
|
1162
1197
|
const execute = (newArgs, options) => {
|
|
1163
1198
|
query.execute({ args: newArgs });
|
|
1164
1199
|
triggeredInternally.set(options?.triggeredInternally ?? false);
|
|
@@ -1174,7 +1209,7 @@ const createAuthProviderQuery = (config, authProviderConfig) => {
|
|
|
1174
1209
|
const createBearerAuthProvider = (options) => {
|
|
1175
1210
|
const route = injectRoute();
|
|
1176
1211
|
const client = inject(options.queryClientRef);
|
|
1177
|
-
const cookieEnabled = signal(options.cookie === undefined ? false : (options.cookie.enabled ?? true));
|
|
1212
|
+
const cookieEnabled = signal(options.cookie === undefined ? false : (options.cookie.enabled ?? true), ...(ngDevMode ? [{ debugName: "cookieEnabled" }] : []));
|
|
1178
1213
|
const cookieOptions = {
|
|
1179
1214
|
expiresInDays: 30,
|
|
1180
1215
|
name: 'etAuth',
|
|
@@ -1198,17 +1233,17 @@ const createBearerAuthProvider = (options) => {
|
|
|
1198
1233
|
const latestExecutedQuery = computed(() => {
|
|
1199
1234
|
const relevantQueries = queries.filter((q) => q.query && q.query.query.lastTimeExecutedAt() !== null);
|
|
1200
1235
|
return findMostRecentQuery(relevantQueries);
|
|
1201
|
-
});
|
|
1236
|
+
}, ...(ngDevMode ? [{ debugName: "latestExecutedQuery" }] : []));
|
|
1202
1237
|
const tokens = computed(() => {
|
|
1203
1238
|
const query = latestExecutedQuery();
|
|
1204
1239
|
return query?.query?.tokens()?.tokens ?? null;
|
|
1205
|
-
});
|
|
1240
|
+
}, ...(ngDevMode ? [{ debugName: "tokens" }] : []));
|
|
1206
1241
|
const bearerData = computed(() => {
|
|
1207
1242
|
const accessToken = tokens()?.accessToken;
|
|
1208
1243
|
if (!accessToken)
|
|
1209
1244
|
return null;
|
|
1210
1245
|
return (options.bearerDecryptFn?.(accessToken) ?? decryptBearer(accessToken));
|
|
1211
|
-
});
|
|
1246
|
+
}, ...(ngDevMode ? [{ debugName: "bearerData" }] : []));
|
|
1212
1247
|
toObservable(computed(() => {
|
|
1213
1248
|
const query = latestExecutedQuery();
|
|
1214
1249
|
const expiresIn = query?.query?.expiresIn() ?? null;
|
|
@@ -1227,7 +1262,7 @@ const createBearerAuthProvider = (options) => {
|
|
|
1227
1262
|
}, { triggeredInternally: true })));
|
|
1228
1263
|
}), takeUntilDestroyed())
|
|
1229
1264
|
.subscribe();
|
|
1230
|
-
const latestNonInternalQuery = signal(null);
|
|
1265
|
+
const latestNonInternalQuery = signal(null, ...(ngDevMode ? [{ debugName: "latestNonInternalQuery" }] : []));
|
|
1231
1266
|
effect(() => {
|
|
1232
1267
|
const relevantQueries = queries.filter((q) => q.query && !q.query.triggeredInternally() && q.query.query.lastTimeExecutedAt() !== null);
|
|
1233
1268
|
const lastQuery = findMostRecentQuery(relevantQueries);
|
|
@@ -1395,14 +1430,189 @@ const isClassValidatorError = (error) => {
|
|
|
1395
1430
|
return typeof error === 'object' && error !== null && 'statusCode' in error && 'message' in error && 'error' in error;
|
|
1396
1431
|
};
|
|
1397
1432
|
|
|
1433
|
+
const QueryFeatureType = {
|
|
1434
|
+
WITH_ARGS: 'WITH_ARGS',
|
|
1435
|
+
WITH_LOGGING: 'WITH_LOGGING',
|
|
1436
|
+
WITH_ERROR_HANDLING: 'WITH_ERROR_HANDLING',
|
|
1437
|
+
WITH_SUCCESS_HANDLING: 'WITH_SUCCESS_HANDLING',
|
|
1438
|
+
WITH_POLLING: 'WITH_POLLING',
|
|
1439
|
+
WITH_AUTO_REFRESH: 'WITH_AUTO_REFRESH',
|
|
1440
|
+
WITH_RESPONSE_UPDATE: 'WITH_RESPONSE_UPDATE',
|
|
1441
|
+
};
|
|
1442
|
+
const createQueryFeature = (config) => {
|
|
1443
|
+
return config;
|
|
1444
|
+
};
|
|
1445
|
+
/**
|
|
1446
|
+
* A query feature that allows you to set the arguments of the query.
|
|
1447
|
+
* The arguments are read within a computed function, so you can use reactive values.
|
|
1448
|
+
*
|
|
1449
|
+
* To set the arguments to `null`, return the symbol `CLEAR_QUERY_ARGS`.
|
|
1450
|
+
* If you instead return `null`, the arguments won't change.
|
|
1451
|
+
*
|
|
1452
|
+
* Changing arguments will automatically trigger a new execution of the query if it is eligible for auto execution (e.g. a GET request).
|
|
1453
|
+
*/
|
|
1454
|
+
const withArgs = (args) => {
|
|
1455
|
+
return createQueryFeature({
|
|
1456
|
+
type: QueryFeatureType.WITH_ARGS,
|
|
1457
|
+
fn: (context) => {
|
|
1458
|
+
const currArgs = computed(() => args(), ...(ngDevMode ? [{ debugName: "currArgs" }] : []));
|
|
1459
|
+
nestedEffect(() => {
|
|
1460
|
+
const currArgsNow = currArgs();
|
|
1461
|
+
if (currArgsNow === null)
|
|
1462
|
+
return;
|
|
1463
|
+
untracked(() => {
|
|
1464
|
+
if (currArgsNow === CLEAR_QUERY_ARGS) {
|
|
1465
|
+
context.state.args.set(null);
|
|
1466
|
+
return;
|
|
1467
|
+
}
|
|
1468
|
+
context.state.args.set(currArgsNow);
|
|
1469
|
+
if (context.flags.shouldAutoExecute)
|
|
1470
|
+
context.execute({ args: currArgsNow });
|
|
1471
|
+
});
|
|
1472
|
+
}, { injector: context.deps.injector });
|
|
1473
|
+
},
|
|
1474
|
+
});
|
|
1475
|
+
};
|
|
1476
|
+
/**
|
|
1477
|
+
* A query feature that will automatically execute the query at a given interval.
|
|
1478
|
+
* The interval will be cleared when the query is destroyed.
|
|
1479
|
+
* The interval will be reset when the arguments of the query change.
|
|
1480
|
+
*
|
|
1481
|
+
* @throws If the query is not eligible for auto execution (e.g. a POST request)
|
|
1482
|
+
*/
|
|
1483
|
+
const withPolling = (options) => {
|
|
1484
|
+
return createQueryFeature({
|
|
1485
|
+
type: QueryFeatureType.WITH_POLLING,
|
|
1486
|
+
fn: (context) => {
|
|
1487
|
+
if (!context.flags.shouldAutoExecuteMethod) {
|
|
1488
|
+
throw withPollingUsedOnUnsupportedHttpMethod(context.flags.method);
|
|
1489
|
+
}
|
|
1490
|
+
let intervalId = null;
|
|
1491
|
+
nestedEffect(() => {
|
|
1492
|
+
const args = context.state.args();
|
|
1493
|
+
untracked(() => {
|
|
1494
|
+
if (intervalId !== null)
|
|
1495
|
+
clearInterval(intervalId);
|
|
1496
|
+
// Don't start polling if the query doesn't have args.
|
|
1497
|
+
// It should have args because a withArgs feature is present.
|
|
1498
|
+
if (args === null && context.flags.hasWithArgsFeature)
|
|
1499
|
+
return;
|
|
1500
|
+
if (options.executeInitially) {
|
|
1501
|
+
context.execute({ args });
|
|
1502
|
+
}
|
|
1503
|
+
intervalId = window.setInterval(() => {
|
|
1504
|
+
context.execute({ args });
|
|
1505
|
+
}, options.interval);
|
|
1506
|
+
});
|
|
1507
|
+
}, { injector: context.deps.injector });
|
|
1508
|
+
context.deps.destroyRef.onDestroy(() => intervalId !== null && clearInterval(intervalId));
|
|
1509
|
+
},
|
|
1510
|
+
});
|
|
1511
|
+
};
|
|
1512
|
+
/** A query feature that can be used to log the latest http event */
|
|
1513
|
+
const withLogging = (options) => {
|
|
1514
|
+
return createQueryFeature({
|
|
1515
|
+
type: QueryFeatureType.WITH_LOGGING,
|
|
1516
|
+
fn: (context) => {
|
|
1517
|
+
nestedEffect(() => {
|
|
1518
|
+
const event = context.state.latestHttpEvent();
|
|
1519
|
+
if (event === null)
|
|
1520
|
+
return;
|
|
1521
|
+
untracked(() => {
|
|
1522
|
+
options.logFn(event);
|
|
1523
|
+
});
|
|
1524
|
+
}, { injector: context.deps.injector });
|
|
1525
|
+
},
|
|
1526
|
+
});
|
|
1527
|
+
};
|
|
1528
|
+
/** A query feature that can be used to handle errors */
|
|
1529
|
+
const withErrorHandling = (options) => {
|
|
1530
|
+
return createQueryFeature({
|
|
1531
|
+
type: QueryFeatureType.WITH_ERROR_HANDLING,
|
|
1532
|
+
fn: (context) => {
|
|
1533
|
+
nestedEffect(() => {
|
|
1534
|
+
const error = context.state.error();
|
|
1535
|
+
if (error === null)
|
|
1536
|
+
return;
|
|
1537
|
+
untracked(() => {
|
|
1538
|
+
options.handler(error);
|
|
1539
|
+
});
|
|
1540
|
+
}, { injector: context.deps.injector });
|
|
1541
|
+
},
|
|
1542
|
+
});
|
|
1543
|
+
};
|
|
1544
|
+
/** A query feature that can be used to handle successful responses */
|
|
1545
|
+
const withSuccessHandling = (options) => {
|
|
1546
|
+
return createQueryFeature({
|
|
1547
|
+
type: QueryFeatureType.WITH_SUCCESS_HANDLING,
|
|
1548
|
+
fn: (context) => {
|
|
1549
|
+
nestedEffect(() => {
|
|
1550
|
+
const response = context.state.response();
|
|
1551
|
+
if (response === null)
|
|
1552
|
+
return;
|
|
1553
|
+
untracked(() => {
|
|
1554
|
+
options.handler(response);
|
|
1555
|
+
});
|
|
1556
|
+
}, { injector: context.deps.injector });
|
|
1557
|
+
},
|
|
1558
|
+
});
|
|
1559
|
+
};
|
|
1560
|
+
/**
|
|
1561
|
+
* A query feature that will automatically execute the query when any of the provided signals change
|
|
1562
|
+
* @throws If the query is not eligible for auto execution (e.g. a POST request)
|
|
1563
|
+
* @throws If the query has the `onlyManualExecution` query config flag set and `ignoreOnlyManualExecution` is not set
|
|
1564
|
+
*/
|
|
1565
|
+
const withAutoRefresh = (options) => {
|
|
1566
|
+
return createQueryFeature({
|
|
1567
|
+
type: QueryFeatureType.WITH_AUTO_REFRESH,
|
|
1568
|
+
fn: (context) => {
|
|
1569
|
+
if (!context.flags.shouldAutoExecuteMethod) {
|
|
1570
|
+
throw withAutoRefreshUsedOnUnsupportedHttpMethod(context.flags.method);
|
|
1571
|
+
}
|
|
1572
|
+
if (context.flags.onlyManualExecution && !options.ignoreOnlyManualExecution) {
|
|
1573
|
+
throw withAutoRefreshUsedInManualQuery();
|
|
1574
|
+
}
|
|
1575
|
+
nestedEffect(() => {
|
|
1576
|
+
for (const signal of options.onSignalChanges) {
|
|
1577
|
+
signal();
|
|
1578
|
+
}
|
|
1579
|
+
untracked(() => {
|
|
1580
|
+
const args = context.state.args();
|
|
1581
|
+
// Don't start polling if the query doesn't have args.
|
|
1582
|
+
// It should have args because a withArgs feature is present.
|
|
1583
|
+
if (args === null && context.flags.hasWithArgsFeature)
|
|
1584
|
+
return;
|
|
1585
|
+
context.execute({ args });
|
|
1586
|
+
});
|
|
1587
|
+
}, { injector: context.deps.injector });
|
|
1588
|
+
},
|
|
1589
|
+
});
|
|
1590
|
+
};
|
|
1591
|
+
const withResponseUpdate = (options) => {
|
|
1592
|
+
return createQueryFeature({
|
|
1593
|
+
type: QueryFeatureType.WITH_RESPONSE_UPDATE,
|
|
1594
|
+
fn: (context) => {
|
|
1595
|
+
nestedEffect(() => {
|
|
1596
|
+
const currentResponse = untracked(() => context.state.response());
|
|
1597
|
+
const response = options.updater({ currentResponse });
|
|
1598
|
+
if (response === null)
|
|
1599
|
+
return;
|
|
1600
|
+
untracked(() => {
|
|
1601
|
+
context.state.response.set(response);
|
|
1602
|
+
});
|
|
1603
|
+
}, { injector: context.deps.injector });
|
|
1604
|
+
},
|
|
1605
|
+
});
|
|
1606
|
+
};
|
|
1607
|
+
|
|
1398
1608
|
const setupQueryState = (options) => {
|
|
1399
|
-
const response = signal(null);
|
|
1400
|
-
const args = signal(null);
|
|
1401
|
-
const latestHttpEvent = signal(null);
|
|
1402
|
-
const error = signal(null);
|
|
1403
|
-
const loading = signal(null);
|
|
1404
|
-
const lastTimeExecutedAt = signal(null);
|
|
1405
|
-
const request = signal(null);
|
|
1609
|
+
const response = signal(null, ...(ngDevMode ? [{ debugName: "response" }] : []));
|
|
1610
|
+
const args = signal(null, ...(ngDevMode ? [{ debugName: "args" }] : []));
|
|
1611
|
+
const latestHttpEvent = signal(null, ...(ngDevMode ? [{ debugName: "latestHttpEvent" }] : []));
|
|
1612
|
+
const error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
1613
|
+
const loading = signal(null, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
1614
|
+
const lastTimeExecutedAt = signal(null, ...(ngDevMode ? [{ debugName: "lastTimeExecutedAt" }] : []));
|
|
1615
|
+
const request = signal(null, ...(ngDevMode ? [{ debugName: "request" }] : []));
|
|
1406
1616
|
const executionState = computed(() => {
|
|
1407
1617
|
const currentResponse = response();
|
|
1408
1618
|
const currentError = error();
|
|
@@ -1437,7 +1647,7 @@ const setupQueryState = (options) => {
|
|
|
1437
1647
|
else {
|
|
1438
1648
|
return null;
|
|
1439
1649
|
}
|
|
1440
|
-
});
|
|
1650
|
+
}, ...(ngDevMode ? [{ debugName: "executionState" }] : []));
|
|
1441
1651
|
const state = {
|
|
1442
1652
|
response,
|
|
1443
1653
|
args,
|
|
@@ -1457,7 +1667,7 @@ const createQuerySnapshotFn = (options) => {
|
|
|
1457
1667
|
const { state, deps } = options;
|
|
1458
1668
|
const snapshotFn = () => {
|
|
1459
1669
|
const snapshotState = setupQueryState({});
|
|
1460
|
-
const isAlive = signal(true);
|
|
1670
|
+
const isAlive = signal(true, ...(ngDevMode ? [{ debugName: "isAlive" }] : []));
|
|
1461
1671
|
const killEffectRef = effect(() => {
|
|
1462
1672
|
const currentLoading = state.loading();
|
|
1463
1673
|
const currentError = state.error();
|
|
@@ -1480,7 +1690,7 @@ const createQuerySnapshotFn = (options) => {
|
|
|
1480
1690
|
killEffectRef.destroy();
|
|
1481
1691
|
isAlive.set(false);
|
|
1482
1692
|
});
|
|
1483
|
-
}, { injector: deps.injector });
|
|
1693
|
+
}, ...(ngDevMode ? [{ debugName: "killEffectRef", injector: deps.injector }] : [{ injector: deps.injector }]));
|
|
1484
1694
|
const snapshot = {
|
|
1485
1695
|
args: snapshotState.args.asReadonly(),
|
|
1486
1696
|
response: snapshotState.response.asReadonly(),
|
|
@@ -1633,7 +1843,7 @@ const shouldRetryRequest = (options) => {
|
|
|
1633
1843
|
};
|
|
1634
1844
|
const getQueryFeatureUsage = (options) => {
|
|
1635
1845
|
const { creator, features, queryConfig, creatorInternals } = options;
|
|
1636
|
-
const hasWithArgsFeature = features.some((f) => f.type ==
|
|
1846
|
+
const hasWithArgsFeature = features.some((f) => f.type == QueryFeatureType.WITH_ARGS);
|
|
1637
1847
|
const shouldAutoExecuteMethod = isCreateGqlQueryOptions(options)
|
|
1638
1848
|
? shouldAutoExecuteGqlQuery(options.creatorInternals.method)
|
|
1639
1849
|
: shouldAutoExecuteQuery(options.creatorInternals.method);
|
|
@@ -1813,18 +2023,18 @@ const SPEED_BUFFER_TIME_IN_MS = 2000;
|
|
|
1813
2023
|
const createHttpRequest = (options) => {
|
|
1814
2024
|
let currentStreamSubscription = Subscription.EMPTY;
|
|
1815
2025
|
const { args, clientOptions, dependencies } = options;
|
|
1816
|
-
const currentEvent = signal(null);
|
|
1817
|
-
const loading = signal(null);
|
|
1818
|
-
const error = signal(null);
|
|
1819
|
-
const response = signal(null);
|
|
1820
|
-
const lastLoadEventTime = signal(0);
|
|
1821
|
-
const lastLoadEventAmount = signal(0);
|
|
1822
|
-
const lastExecuteTime = signal(0);
|
|
1823
|
-
const expiresIn = signal(null);
|
|
2026
|
+
const currentEvent = signal(null, ...(ngDevMode ? [{ debugName: "currentEvent" }] : []));
|
|
2027
|
+
const loading = signal(null, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
2028
|
+
const error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
2029
|
+
const response = signal(null, ...(ngDevMode ? [{ debugName: "response" }] : []));
|
|
2030
|
+
const lastLoadEventTime = signal(0, ...(ngDevMode ? [{ debugName: "lastLoadEventTime" }] : []));
|
|
2031
|
+
const lastLoadEventAmount = signal(0, ...(ngDevMode ? [{ debugName: "lastLoadEventAmount" }] : []));
|
|
2032
|
+
const lastExecuteTime = signal(0, ...(ngDevMode ? [{ debugName: "lastExecuteTime" }] : []));
|
|
2033
|
+
const expiresIn = signal(null, ...(ngDevMode ? [{ debugName: "expiresIn" }] : []));
|
|
1824
2034
|
const isStale = computed(() => {
|
|
1825
2035
|
const expiresInTs = expiresIn();
|
|
1826
2036
|
return expiresInTs === null || expiresInTs < Date.now();
|
|
1827
|
-
});
|
|
2037
|
+
}, ...(ngDevMode ? [{ debugName: "isStale" }] : []));
|
|
1828
2038
|
const stream = dependencies.httpClient
|
|
1829
2039
|
.request(options.method, options.fullPath, {
|
|
1830
2040
|
observe: 'events',
|
|
@@ -1951,172 +2161,6 @@ const createHttpRequest = (options) => {
|
|
|
1951
2161
|
return httpRequest;
|
|
1952
2162
|
};
|
|
1953
2163
|
|
|
1954
|
-
const createQueryFeature = (config) => {
|
|
1955
|
-
return config;
|
|
1956
|
-
};
|
|
1957
|
-
/**
|
|
1958
|
-
* A query feature that allows you to set the arguments of the query.
|
|
1959
|
-
* The arguments are read within a computed function, so you can use reactive values.
|
|
1960
|
-
*
|
|
1961
|
-
* To set the arguments to `null`, return the symbol `CLEAR_QUERY_ARGS`.
|
|
1962
|
-
* If you instead return `null`, the arguments won't change.
|
|
1963
|
-
*
|
|
1964
|
-
* Changing arguments will automatically trigger a new execution of the query if it is eligible for auto execution (e.g. a GET request).
|
|
1965
|
-
*/
|
|
1966
|
-
const withArgs = (args) => {
|
|
1967
|
-
return createQueryFeature({
|
|
1968
|
-
type: "withArgs" /* QueryFeatureType.WithArgs */,
|
|
1969
|
-
fn: (context) => {
|
|
1970
|
-
const currArgs = computed(() => args());
|
|
1971
|
-
nestedEffect(() => {
|
|
1972
|
-
const currArgsNow = currArgs();
|
|
1973
|
-
if (currArgsNow === null)
|
|
1974
|
-
return;
|
|
1975
|
-
untracked(() => {
|
|
1976
|
-
if (currArgsNow === CLEAR_QUERY_ARGS) {
|
|
1977
|
-
context.state.args.set(null);
|
|
1978
|
-
return;
|
|
1979
|
-
}
|
|
1980
|
-
context.state.args.set(currArgsNow);
|
|
1981
|
-
if (context.flags.shouldAutoExecute)
|
|
1982
|
-
context.execute({ args: currArgsNow });
|
|
1983
|
-
});
|
|
1984
|
-
}, { injector: context.deps.injector });
|
|
1985
|
-
},
|
|
1986
|
-
});
|
|
1987
|
-
};
|
|
1988
|
-
/**
|
|
1989
|
-
* A query feature that will automatically execute the query at a given interval.
|
|
1990
|
-
* The interval will be cleared when the query is destroyed.
|
|
1991
|
-
* The interval will be reset when the arguments of the query change.
|
|
1992
|
-
*
|
|
1993
|
-
* @throws If the query is not eligible for auto execution (e.g. a POST request)
|
|
1994
|
-
*/
|
|
1995
|
-
const withPolling = (options) => {
|
|
1996
|
-
return createQueryFeature({
|
|
1997
|
-
type: "withPolling" /* QueryFeatureType.WithPolling */,
|
|
1998
|
-
fn: (context) => {
|
|
1999
|
-
if (!context.flags.shouldAutoExecuteMethod) {
|
|
2000
|
-
throw withPollingUsedOnUnsupportedHttpMethod(context.flags.method);
|
|
2001
|
-
}
|
|
2002
|
-
let intervalId = null;
|
|
2003
|
-
nestedEffect(() => {
|
|
2004
|
-
const args = context.state.args();
|
|
2005
|
-
untracked(() => {
|
|
2006
|
-
if (intervalId !== null)
|
|
2007
|
-
clearInterval(intervalId);
|
|
2008
|
-
// Don't start polling if the query doesn't have args.
|
|
2009
|
-
// It should have args because a withArgs feature is present.
|
|
2010
|
-
if (args === null && context.flags.hasWithArgsFeature)
|
|
2011
|
-
return;
|
|
2012
|
-
if (options.executeInitially) {
|
|
2013
|
-
context.execute({ args });
|
|
2014
|
-
}
|
|
2015
|
-
intervalId = window.setInterval(() => {
|
|
2016
|
-
context.execute({ args });
|
|
2017
|
-
}, options.interval);
|
|
2018
|
-
});
|
|
2019
|
-
}, { injector: context.deps.injector });
|
|
2020
|
-
context.deps.destroyRef.onDestroy(() => intervalId !== null && clearInterval(intervalId));
|
|
2021
|
-
},
|
|
2022
|
-
});
|
|
2023
|
-
};
|
|
2024
|
-
/** A query feature that can be used to log the latest http event */
|
|
2025
|
-
const withLogging = (options) => {
|
|
2026
|
-
return createQueryFeature({
|
|
2027
|
-
type: "withLogging" /* QueryFeatureType.WithLogging */,
|
|
2028
|
-
fn: (context) => {
|
|
2029
|
-
nestedEffect(() => {
|
|
2030
|
-
const event = context.state.latestHttpEvent();
|
|
2031
|
-
if (event === null)
|
|
2032
|
-
return;
|
|
2033
|
-
untracked(() => {
|
|
2034
|
-
options.logFn(event);
|
|
2035
|
-
});
|
|
2036
|
-
}, { injector: context.deps.injector });
|
|
2037
|
-
},
|
|
2038
|
-
});
|
|
2039
|
-
};
|
|
2040
|
-
/** A query feature that can be used to handle errors */
|
|
2041
|
-
const withErrorHandling = (options) => {
|
|
2042
|
-
return createQueryFeature({
|
|
2043
|
-
type: "withErrorHandling" /* QueryFeatureType.WithErrorHandling */,
|
|
2044
|
-
fn: (context) => {
|
|
2045
|
-
nestedEffect(() => {
|
|
2046
|
-
const error = context.state.error();
|
|
2047
|
-
if (error === null)
|
|
2048
|
-
return;
|
|
2049
|
-
untracked(() => {
|
|
2050
|
-
options.handler(error);
|
|
2051
|
-
});
|
|
2052
|
-
}, { injector: context.deps.injector });
|
|
2053
|
-
},
|
|
2054
|
-
});
|
|
2055
|
-
};
|
|
2056
|
-
/** A query feature that can be used to handle successful responses */
|
|
2057
|
-
const withSuccessHandling = (options) => {
|
|
2058
|
-
return createQueryFeature({
|
|
2059
|
-
type: "withSuccessHandling" /* QueryFeatureType.WithSuccessHandling */,
|
|
2060
|
-
fn: (context) => {
|
|
2061
|
-
nestedEffect(() => {
|
|
2062
|
-
const response = context.state.response();
|
|
2063
|
-
if (response === null)
|
|
2064
|
-
return;
|
|
2065
|
-
untracked(() => {
|
|
2066
|
-
options.handler(response);
|
|
2067
|
-
});
|
|
2068
|
-
}, { injector: context.deps.injector });
|
|
2069
|
-
},
|
|
2070
|
-
});
|
|
2071
|
-
};
|
|
2072
|
-
/**
|
|
2073
|
-
* A query feature that will automatically execute the query when any of the provided signals change
|
|
2074
|
-
* @throws If the query is not eligible for auto execution (e.g. a POST request)
|
|
2075
|
-
* @throws If the query has the `onlyManualExecution` query config flag set and `ignoreOnlyManualExecution` is not set
|
|
2076
|
-
*/
|
|
2077
|
-
const withAutoRefresh = (options) => {
|
|
2078
|
-
return createQueryFeature({
|
|
2079
|
-
type: "withAutoRefresh" /* QueryFeatureType.WithAutoRefresh */,
|
|
2080
|
-
fn: (context) => {
|
|
2081
|
-
if (!context.flags.shouldAutoExecuteMethod) {
|
|
2082
|
-
throw withAutoRefreshUsedOnUnsupportedHttpMethod(context.flags.method);
|
|
2083
|
-
}
|
|
2084
|
-
if (context.flags.onlyManualExecution && !options.ignoreOnlyManualExecution) {
|
|
2085
|
-
throw withAutoRefreshUsedInManualQuery();
|
|
2086
|
-
}
|
|
2087
|
-
nestedEffect(() => {
|
|
2088
|
-
for (const signal of options.onSignalChanges) {
|
|
2089
|
-
signal();
|
|
2090
|
-
}
|
|
2091
|
-
untracked(() => {
|
|
2092
|
-
const args = context.state.args();
|
|
2093
|
-
// Don't start polling if the query doesn't have args.
|
|
2094
|
-
// It should have args because a withArgs feature is present.
|
|
2095
|
-
if (args === null && context.flags.hasWithArgsFeature)
|
|
2096
|
-
return;
|
|
2097
|
-
context.execute({ args });
|
|
2098
|
-
});
|
|
2099
|
-
}, { injector: context.deps.injector });
|
|
2100
|
-
},
|
|
2101
|
-
});
|
|
2102
|
-
};
|
|
2103
|
-
const withResponseUpdate = (options) => {
|
|
2104
|
-
return createQueryFeature({
|
|
2105
|
-
type: "withResponseUpdate" /* QueryFeatureType.WithResponseUpdate */,
|
|
2106
|
-
fn: (context) => {
|
|
2107
|
-
nestedEffect(() => {
|
|
2108
|
-
const currentResponse = untracked(() => context.state.response());
|
|
2109
|
-
const response = options.updater({ currentResponse });
|
|
2110
|
-
if (response === null)
|
|
2111
|
-
return;
|
|
2112
|
-
untracked(() => {
|
|
2113
|
-
context.state.response.set(response);
|
|
2114
|
-
});
|
|
2115
|
-
}, { injector: context.deps.injector });
|
|
2116
|
-
},
|
|
2117
|
-
});
|
|
2118
|
-
};
|
|
2119
|
-
|
|
2120
2164
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2121
2165
|
/** Transforms an array of arrays into a single array and filters out `null` values. */
|
|
2122
2166
|
const transformArrayResponse = (responses) => responses.filter((r) => !!r).flatMap((r) => r);
|
|
@@ -2129,11 +2173,11 @@ const createQueryStack = (options) => {
|
|
|
2129
2173
|
return { queries, lastQuery };
|
|
2130
2174
|
}, transform, } = options ?? {};
|
|
2131
2175
|
const injector = inject(Injector);
|
|
2132
|
-
const queries = signal([]);
|
|
2133
|
-
const lastQuery = signal(null);
|
|
2134
|
-
const firstQuery = computed(() => queries()[0] ?? null);
|
|
2135
|
-
const hasWithArgsFeature = features.some((f) => f.type ==
|
|
2136
|
-
const hasWithOptimisticUpdateFeature = features.some((f) => f.type ==
|
|
2176
|
+
const queries = signal([], ...(ngDevMode ? [{ debugName: "queries" }] : []));
|
|
2177
|
+
const lastQuery = signal(null, ...(ngDevMode ? [{ debugName: "lastQuery" }] : []));
|
|
2178
|
+
const firstQuery = computed(() => queries()[0] ?? null, ...(ngDevMode ? [{ debugName: "firstQuery" }] : []));
|
|
2179
|
+
const hasWithArgsFeature = features.some((f) => f.type == QueryFeatureType.WITH_ARGS);
|
|
2180
|
+
const hasWithOptimisticUpdateFeature = features.some((f) => f.type == QueryFeatureType.WITH_RESPONSE_UPDATE);
|
|
2137
2181
|
if (hasWithArgsFeature) {
|
|
2138
2182
|
throw queryStackWithArgsUsed();
|
|
2139
2183
|
}
|
|
@@ -2173,10 +2217,10 @@ const createQueryStack = (options) => {
|
|
|
2173
2217
|
});
|
|
2174
2218
|
return result;
|
|
2175
2219
|
};
|
|
2176
|
-
const loading = computed(() => queries().some((q) => q.loading()));
|
|
2220
|
+
const loading = computed(() => queries().some((q) => q.loading()), ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
2177
2221
|
const error = computed(() => queries()
|
|
2178
2222
|
.map((q) => q.error())
|
|
2179
|
-
.find((e) => e !== null) ?? null);
|
|
2223
|
+
.find((e) => e !== null) ?? null, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
2180
2224
|
const response = computed(() => {
|
|
2181
2225
|
const responses = queries().map((q) => q.response());
|
|
2182
2226
|
return transform?.(responses) ?? responses;
|
|
@@ -2266,12 +2310,12 @@ const fakePaginationAdapter = (totalHits = 10) => {
|
|
|
2266
2310
|
};
|
|
2267
2311
|
const createPagedQueryStack = (options) => {
|
|
2268
2312
|
const { responseNormalizer, queryCreator, features } = options;
|
|
2269
|
-
const currentPageArgs = signal(null);
|
|
2270
|
-
const initialPage = signal(options.initialPage ?? 1);
|
|
2271
|
-
const loadedMinPage = signal(initialPage());
|
|
2272
|
-
const loadedMaxPage = signal(initialPage());
|
|
2273
|
-
const lastResetTimestamp = signal(Date.now());
|
|
2274
|
-
const pageDirection = signal('next');
|
|
2313
|
+
const currentPageArgs = signal(null, ...(ngDevMode ? [{ debugName: "currentPageArgs" }] : []));
|
|
2314
|
+
const initialPage = signal(options.initialPage ?? 1, ...(ngDevMode ? [{ debugName: "initialPage" }] : []));
|
|
2315
|
+
const loadedMinPage = signal(initialPage(), ...(ngDevMode ? [{ debugName: "loadedMinPage" }] : []));
|
|
2316
|
+
const loadedMaxPage = signal(initialPage(), ...(ngDevMode ? [{ debugName: "loadedMaxPage" }] : []));
|
|
2317
|
+
const lastResetTimestamp = signal(Date.now(), ...(ngDevMode ? [{ debugName: "lastResetTimestamp" }] : []));
|
|
2318
|
+
const pageDirection = signal('next', ...(ngDevMode ? [{ debugName: "pageDirection" }] : []));
|
|
2275
2319
|
const stack = createQueryStack({
|
|
2276
2320
|
args: () => null,
|
|
2277
2321
|
queryCreator,
|
|
@@ -2310,22 +2354,22 @@ const createPagedQueryStack = (options) => {
|
|
|
2310
2354
|
if (!res)
|
|
2311
2355
|
return null;
|
|
2312
2356
|
return responseNormalizer(res, all);
|
|
2313
|
-
});
|
|
2357
|
+
}, ...(ngDevMode ? [{ debugName: "maxPagination" }] : []));
|
|
2314
2358
|
const minPagination = computed(() => {
|
|
2315
2359
|
const res = stack.firstQuery()?.response();
|
|
2316
2360
|
const all = stack.response();
|
|
2317
2361
|
if (!res)
|
|
2318
2362
|
return null;
|
|
2319
2363
|
return responseNormalizer(res, all);
|
|
2320
|
-
});
|
|
2364
|
+
}, ...(ngDevMode ? [{ debugName: "minPagination" }] : []));
|
|
2321
2365
|
const isFirstPageLoaded = computed(() => {
|
|
2322
2366
|
const min = minPagination();
|
|
2323
2367
|
return min ? loadedMinPage() === min.currentPage : false;
|
|
2324
|
-
});
|
|
2368
|
+
}, ...(ngDevMode ? [{ debugName: "isFirstPageLoaded" }] : []));
|
|
2325
2369
|
const isLastPageLoaded = computed(() => {
|
|
2326
2370
|
const max = maxPagination();
|
|
2327
2371
|
return max ? loadedMaxPage() === max.totalPages : false;
|
|
2328
|
-
});
|
|
2372
|
+
}, ...(ngDevMode ? [{ debugName: "isLastPageLoaded" }] : []));
|
|
2329
2373
|
const fetchPreviousPage = () => {
|
|
2330
2374
|
const page = loadedMinPage() - 1;
|
|
2331
2375
|
const allResponses = stack.response();
|
|
@@ -2401,18 +2445,18 @@ const createPagedQueryStack = (options) => {
|
|
|
2401
2445
|
if (!currentMinPagination)
|
|
2402
2446
|
return false;
|
|
2403
2447
|
return loadedMinPage() > 1;
|
|
2404
|
-
});
|
|
2448
|
+
}, ...(ngDevMode ? [{ debugName: "canFetchPreviousPage" }] : []));
|
|
2405
2449
|
const canFetchNextPage = computed(() => {
|
|
2406
2450
|
const currentMaxPagination = maxPagination();
|
|
2407
2451
|
return currentMaxPagination ? loadedMaxPage() < currentMaxPagination.totalPages : false;
|
|
2408
|
-
});
|
|
2452
|
+
}, ...(ngDevMode ? [{ debugName: "canFetchNextPage" }] : []));
|
|
2409
2453
|
const items = computed(() => {
|
|
2410
2454
|
const res = stack.response();
|
|
2411
2455
|
return res.map((r) => responseNormalizer(r, res).items).flat();
|
|
2412
|
-
});
|
|
2456
|
+
}, ...(ngDevMode ? [{ debugName: "items" }] : []));
|
|
2413
2457
|
const isFirstLoad = computed(() => {
|
|
2414
2458
|
return stack.queries().length === 1 && !!stack.lastQuery()?.loading();
|
|
2415
|
-
});
|
|
2459
|
+
}, ...(ngDevMode ? [{ debugName: "isFirstLoad" }] : []));
|
|
2416
2460
|
const execute = (options) => {
|
|
2417
2461
|
const whereFn = options?.where;
|
|
2418
2462
|
if (whereFn) {
|
|
@@ -2532,7 +2576,7 @@ const setupQueryExecuteState = () => {
|
|
|
2532
2576
|
previousKey: signal(false),
|
|
2533
2577
|
};
|
|
2534
2578
|
};
|
|
2535
|
-
const
|
|
2579
|
+
const bindSignalToTarget = (signal, target) => {
|
|
2536
2580
|
target.set(signal());
|
|
2537
2581
|
return nestedEffect(() => {
|
|
2538
2582
|
const val = signal();
|
|
@@ -2561,10 +2605,10 @@ const queryExecute = (options) => {
|
|
|
2561
2605
|
executeState.previousKey.set(key);
|
|
2562
2606
|
const responseSignal = transformResponse ? computed(() => transformResponse(request.response())) : request.response;
|
|
2563
2607
|
runInInjectionContext(deps.injector, () => {
|
|
2564
|
-
const responseRef =
|
|
2565
|
-
const loadingRef =
|
|
2566
|
-
const errorRef =
|
|
2567
|
-
const latestHttpEventRef =
|
|
2608
|
+
const responseRef = bindSignalToTarget(responseSignal, state.response);
|
|
2609
|
+
const loadingRef = bindSignalToTarget(request.loading, state.loading);
|
|
2610
|
+
const errorRef = bindSignalToTarget(request.error, state.error);
|
|
2611
|
+
const latestHttpEventRef = bindSignalToTarget(request.currentEvent, state.latestHttpEvent);
|
|
2568
2612
|
executeState.effectRefs.push(responseRef, loadingRef, errorRef, latestHttpEventRef);
|
|
2569
2613
|
});
|
|
2570
2614
|
state.lastTimeExecutedAt.set(Date.now());
|
|
@@ -3217,7 +3261,7 @@ class LegacyQuery {
|
|
|
3217
3261
|
});
|
|
3218
3262
|
}
|
|
3219
3263
|
});
|
|
3220
|
-
});
|
|
3264
|
+
}, ...(ngDevMode ? [{ debugName: "storeSyncEffect" }] : []));
|
|
3221
3265
|
/**
|
|
3222
3266
|
* @internal
|
|
3223
3267
|
*/
|
|
@@ -3384,7 +3428,7 @@ class LegacyQueryCreator {
|
|
|
3384
3428
|
legacyQuery.destroy();
|
|
3385
3429
|
destroyEffect.destroy();
|
|
3386
3430
|
}
|
|
3387
|
-
});
|
|
3431
|
+
}, ...(ngDevMode ? [{ debugName: "destroyEffect" }] : []));
|
|
3388
3432
|
}
|
|
3389
3433
|
return legacyQuery;
|
|
3390
3434
|
});
|
|
@@ -3396,7 +3440,7 @@ class LegacyQueryCreator {
|
|
|
3396
3440
|
return subject;
|
|
3397
3441
|
};
|
|
3398
3442
|
this.createSignal = (initialValue, config) => {
|
|
3399
|
-
const _signal = signal(initialValue ?? null);
|
|
3443
|
+
const _signal = signal(initialValue ?? null, ...(ngDevMode ? [{ debugName: "_signal" }] : []));
|
|
3400
3444
|
addQueryContainerHandling(toObservable(_signal), () => _signal(), config);
|
|
3401
3445
|
return _signal;
|
|
3402
3446
|
};
|
|
@@ -3584,10 +3628,10 @@ class ParseHttpErrorCodeToTitleDePipe {
|
|
|
3584
3628
|
constructor() {
|
|
3585
3629
|
this.transform = parseHttpErrorCodeToTitleDe;
|
|
3586
3630
|
}
|
|
3587
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
3588
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.
|
|
3631
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToTitleDePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
3632
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToTitleDePipe, isStandalone: true, name: "parseHttpErrorCodeToTitleDe" }); }
|
|
3589
3633
|
}
|
|
3590
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
3634
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToTitleDePipe, decorators: [{
|
|
3591
3635
|
type: Pipe,
|
|
3592
3636
|
args: [{
|
|
3593
3637
|
name: 'parseHttpErrorCodeToTitleDe',
|
|
@@ -3598,10 +3642,10 @@ class ParseHttpErrorCodeToMessageDePipe {
|
|
|
3598
3642
|
constructor() {
|
|
3599
3643
|
this.transform = parseHttpErrorCodeToMessageDe;
|
|
3600
3644
|
}
|
|
3601
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
3602
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.
|
|
3645
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToMessageDePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
3646
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToMessageDePipe, isStandalone: true, name: "parseHttpErrorCodeToMessageDe" }); }
|
|
3603
3647
|
}
|
|
3604
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
3648
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToMessageDePipe, decorators: [{
|
|
3605
3649
|
type: Pipe,
|
|
3606
3650
|
args: [{
|
|
3607
3651
|
name: 'parseHttpErrorCodeToMessageDe',
|
|
@@ -3786,10 +3830,10 @@ class ParseHttpErrorCodeToTitleEnPipe {
|
|
|
3786
3830
|
constructor() {
|
|
3787
3831
|
this.transform = parseHttpErrorCodeToTitleEn;
|
|
3788
3832
|
}
|
|
3789
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
3790
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.
|
|
3833
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToTitleEnPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
3834
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToTitleEnPipe, isStandalone: true, name: "parseHttpErrorCodeToTitleEn" }); }
|
|
3791
3835
|
}
|
|
3792
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
3836
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToTitleEnPipe, decorators: [{
|
|
3793
3837
|
type: Pipe,
|
|
3794
3838
|
args: [{
|
|
3795
3839
|
name: 'parseHttpErrorCodeToTitleEn',
|
|
@@ -3800,10 +3844,10 @@ class ParseHttpErrorCodeToMessageEnPipe {
|
|
|
3800
3844
|
constructor() {
|
|
3801
3845
|
this.transform = parseHttpErrorCodeToMessageEn;
|
|
3802
3846
|
}
|
|
3803
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
3804
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.
|
|
3847
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToMessageEnPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
3848
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToMessageEnPipe, isStandalone: true, name: "parseHttpErrorCodeToMessageEn" }); }
|
|
3805
3849
|
}
|
|
3806
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
3850
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ParseHttpErrorCodeToMessageEnPipe, decorators: [{
|
|
3807
3851
|
type: Pipe,
|
|
3808
3852
|
args: [{
|
|
3809
3853
|
name: 'parseHttpErrorCodeToMessageEn',
|
|
@@ -3811,11 +3855,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImpor
|
|
|
3811
3855
|
}]
|
|
3812
3856
|
}] });
|
|
3813
3857
|
|
|
3858
|
+
// codes 1000-1999
|
|
3859
|
+
const WebSocketRuntimeErrorCode = {
|
|
3860
|
+
// Web Socket Client
|
|
3861
|
+
ROOM_NOT_JOINED: 1000,
|
|
3862
|
+
MESSAGE_MALFORMED: 1001,
|
|
3863
|
+
};
|
|
3814
3864
|
const roomNotJoined = (room) => {
|
|
3815
|
-
return new RuntimeError(
|
|
3865
|
+
return new RuntimeError(WebSocketRuntimeErrorCode.ROOM_NOT_JOINED, `Tried leaving the room "${room}" but it has not been joined.`);
|
|
3816
3866
|
};
|
|
3817
3867
|
const messageMalformed = () => {
|
|
3818
|
-
return new RuntimeError(
|
|
3868
|
+
return new RuntimeError(WebSocketRuntimeErrorCode.MESSAGE_MALFORMED, 'A message has been received but it is malformed (cannot be parsed as JSON).');
|
|
3819
3869
|
};
|
|
3820
3870
|
|
|
3821
3871
|
const createWebSocketClient = (config) => {
|
|
@@ -3825,17 +3875,17 @@ const createWebSocketClient = (config) => {
|
|
|
3825
3875
|
transports: config.transports,
|
|
3826
3876
|
});
|
|
3827
3877
|
const rooms = new Map();
|
|
3828
|
-
const isConnected = signal(false);
|
|
3878
|
+
const isConnected = signal(false, ...(ngDevMode ? [{ debugName: "isConnected" }] : []));
|
|
3829
3879
|
const joinRoom = (room) => {
|
|
3830
3880
|
const roomFn = typeof room === 'function' ? room : () => room;
|
|
3831
3881
|
const pre = previousSignalValue(computed(() => roomFn()));
|
|
3832
|
-
const roomData = signal(null);
|
|
3882
|
+
const roomData = signal(null, ...(ngDevMode ? [{ debugName: "roomData" }] : []));
|
|
3833
3883
|
const join = (name) => {
|
|
3834
3884
|
socket.emit('join-room', name);
|
|
3835
3885
|
const existingRoom = rooms.get(name);
|
|
3836
3886
|
if (existingRoom)
|
|
3837
3887
|
return existingRoom;
|
|
3838
|
-
const message = signal(null);
|
|
3888
|
+
const message = signal(null, ...(ngDevMode ? [{ debugName: "message" }] : []));
|
|
3839
3889
|
const newRoom = {
|
|
3840
3890
|
latestMessage: message,
|
|
3841
3891
|
};
|
|
@@ -3941,9 +3991,12 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
3941
3991
|
ParseHttpErrorCodeToMessageEnPipe: ParseHttpErrorCodeToMessageEnPipe,
|
|
3942
3992
|
ParseHttpErrorCodeToTitleDePipe: ParseHttpErrorCodeToTitleDePipe,
|
|
3943
3993
|
ParseHttpErrorCodeToTitleEnPipe: ParseHttpErrorCodeToTitleEnPipe,
|
|
3994
|
+
QueryFeatureType: QueryFeatureType,
|
|
3995
|
+
QueryRuntimeErrorCode: QueryRuntimeErrorCode,
|
|
3944
3996
|
SPEED_BUFFER_TIME_IN_MS: SPEED_BUFFER_TIME_IN_MS,
|
|
3945
3997
|
applyQueryFeatures: applyQueryFeatures,
|
|
3946
3998
|
bearerExpiresInPropertyNotNumber: bearerExpiresInPropertyNotNumber,
|
|
3999
|
+
bindSignalToTarget: bindSignalToTarget,
|
|
3947
4000
|
buildQueryCacheKey: buildQueryCacheKey,
|
|
3948
4001
|
circularQueryDependencyChecker: circularQueryDependencyChecker,
|
|
3949
4002
|
cleanupPreviousExecute: cleanupPreviousExecute,
|
|
@@ -3972,6 +4025,7 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
3972
4025
|
createQueryClientConfig: createQueryClientConfig,
|
|
3973
4026
|
createQueryCreator: createQueryCreator,
|
|
3974
4027
|
createQueryErrorResponse: createQueryErrorResponse,
|
|
4028
|
+
createQueryFeature: createQueryFeature,
|
|
3975
4029
|
createQueryObject: createQueryObject,
|
|
3976
4030
|
createQueryRepository: createQueryRepository,
|
|
3977
4031
|
createQuerySnapshotFn: createQuerySnapshotFn,
|
|
@@ -4032,6 +4086,7 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
4032
4086
|
silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent: silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent,
|
|
4033
4087
|
splitQueryConfig: splitQueryConfig,
|
|
4034
4088
|
transformArrayResponse: transformArrayResponse,
|
|
4089
|
+
transformExecStateToQueryState: transformExecStateToQueryState,
|
|
4035
4090
|
transformPaginatedResponse: transformPaginatedResponse,
|
|
4036
4091
|
unableToDecryptBearerToken: unableToDecryptBearerToken,
|
|
4037
4092
|
uncacheableRequestHasAllowCacheParam: uncacheableRequestHasAllowCacheParam,
|
|
@@ -4181,7 +4236,7 @@ const createQueryCollectionSubject = (queryMap, config) => {
|
|
|
4181
4236
|
};
|
|
4182
4237
|
const createQueryCollectionSignal = (queryMap, config) => {
|
|
4183
4238
|
assertInInjectionContext(createQueryCollectionSignal);
|
|
4184
|
-
const _signal = signal(null);
|
|
4239
|
+
const _signal = signal(null, ...(ngDevMode ? [{ debugName: "_signal" }] : []));
|
|
4185
4240
|
addQueryContainerHandling(toObservable(_signal).pipe(map((s) => s?.query ?? null)), () => _signal()?.query ?? null, config);
|
|
4186
4241
|
return _signal;
|
|
4187
4242
|
};
|
|
@@ -4814,6 +4869,9 @@ class BearerAuthProvider {
|
|
|
4814
4869
|
this._config.refreshConfig.cookieEnabled = false;
|
|
4815
4870
|
this._deleteCookie();
|
|
4816
4871
|
}
|
|
4872
|
+
forceRefresh() {
|
|
4873
|
+
return this._refreshQuery();
|
|
4874
|
+
}
|
|
4817
4875
|
_setCookie() {
|
|
4818
4876
|
if (!this._config.refreshConfig?.cookieName || !this.tokens.refreshToken)
|
|
4819
4877
|
return;
|
|
@@ -4919,8 +4977,8 @@ class QueryDirective {
|
|
|
4919
4977
|
scope: null,
|
|
4920
4978
|
query: null,
|
|
4921
4979
|
};
|
|
4922
|
-
this.query = input.required({ alias: 'etQuery' });
|
|
4923
|
-
this.cache = input(false, { alias: 'etQueryCache' });
|
|
4980
|
+
this.query = input.required(...(ngDevMode ? [{ debugName: "query", alias: 'etQuery' }] : [{ alias: 'etQuery' }]));
|
|
4981
|
+
this.cache = input(false, ...(ngDevMode ? [{ debugName: "cache", alias: 'etQueryCache' }] : [{ alias: 'etQueryCache' }]));
|
|
4924
4982
|
this.queryState = queryStateSignal(this.query);
|
|
4925
4983
|
inject(ViewContainerRef).createEmbeddedView(inject(TemplateRef), this._viewContext);
|
|
4926
4984
|
effect(() => {
|
|
@@ -4981,10 +5039,10 @@ class QueryDirective {
|
|
|
4981
5039
|
});
|
|
4982
5040
|
});
|
|
4983
5041
|
}
|
|
4984
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
4985
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.
|
|
5042
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: QueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
5043
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.4", type: QueryDirective, isStandalone: true, selector: "[etQuery]", inputs: { query: { classPropertyName: "query", publicName: "etQuery", isSignal: true, isRequired: true, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "etQueryCache", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
4986
5044
|
}
|
|
4987
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
5045
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: QueryDirective, decorators: [{
|
|
4988
5046
|
type: Directive,
|
|
4989
5047
|
args: [{
|
|
4990
5048
|
selector: '[etQuery]',
|
|
@@ -5288,10 +5346,10 @@ class InfinityQueryDirective {
|
|
|
5288
5346
|
this._viewContext.currentQuery = null;
|
|
5289
5347
|
this._data$.next([]);
|
|
5290
5348
|
}
|
|
5291
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
5292
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.
|
|
5349
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: InfinityQueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
5350
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.4", 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 }); }
|
|
5293
5351
|
}
|
|
5294
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
5352
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: InfinityQueryDirective, decorators: [{
|
|
5295
5353
|
type: Directive,
|
|
5296
5354
|
args: [{
|
|
5297
5355
|
selector: '[etInfinityQuery]',
|
|
@@ -5343,10 +5401,10 @@ class InfinityQueryTriggerDirective {
|
|
|
5343
5401
|
});
|
|
5344
5402
|
this._observer.observe(this._elementRef.nativeElement);
|
|
5345
5403
|
}
|
|
5346
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
5347
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.
|
|
5404
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: InfinityQueryTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
5405
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.4", type: InfinityQueryTriggerDirective, isStandalone: true, selector: "[etInfinityQueryTrigger], et-infinity-query-trigger", inputs: { scrollContainerSelector: "scrollContainerSelector" }, ngImport: i0 }); }
|
|
5348
5406
|
}
|
|
5349
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
5407
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: InfinityQueryTriggerDirective, decorators: [{
|
|
5350
5408
|
type: Directive,
|
|
5351
5409
|
args: [{
|
|
5352
5410
|
selector: '[etInfinityQueryTrigger], et-infinity-query-trigger',
|
|
@@ -5370,10 +5428,10 @@ class QueryShortNamePipe {
|
|
|
5370
5428
|
}
|
|
5371
5429
|
return route;
|
|
5372
5430
|
}
|
|
5373
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
5374
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.
|
|
5431
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: QueryShortNamePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
5432
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: QueryShortNamePipe, isStandalone: true, name: "queryShortName" }); }
|
|
5375
5433
|
}
|
|
5376
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
5434
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: QueryShortNamePipe, decorators: [{
|
|
5377
5435
|
type: Pipe,
|
|
5378
5436
|
args: [{ name: 'queryShortName', standalone: true }]
|
|
5379
5437
|
}] });
|
|
@@ -5395,19 +5453,19 @@ class QueryDevtoolsComponent {
|
|
|
5395
5453
|
this._cdr = inject(ChangeDetectorRef);
|
|
5396
5454
|
this._destroy$ = createDestroy();
|
|
5397
5455
|
this.queryClientConfigs = inject(QUERY_CLIENT_DEVTOOLS_TOKEN);
|
|
5398
|
-
this.isOpen = signal(false);
|
|
5399
|
-
this.isTranslucent = signal(false);
|
|
5400
|
-
this.snapLayout = signal('full');
|
|
5401
|
-
this.queryListMode = signal('live');
|
|
5402
|
-
this.viewMode = signal('query');
|
|
5403
|
-
this.showResponse = signal(false);
|
|
5404
|
-
this.showRawResponse = signal(false);
|
|
5405
|
-
this.showQueryConfig = signal(false);
|
|
5406
|
-
this.showEntityStoreValue = signal(false);
|
|
5407
|
-
this.showArguments = signal(false);
|
|
5456
|
+
this.isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
|
|
5457
|
+
this.isTranslucent = signal(false, ...(ngDevMode ? [{ debugName: "isTranslucent" }] : []));
|
|
5458
|
+
this.snapLayout = signal('full', ...(ngDevMode ? [{ debugName: "snapLayout" }] : []));
|
|
5459
|
+
this.queryListMode = signal('live', ...(ngDevMode ? [{ debugName: "queryListMode" }] : []));
|
|
5460
|
+
this.viewMode = signal('query', ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
|
|
5461
|
+
this.showResponse = signal(false, ...(ngDevMode ? [{ debugName: "showResponse" }] : []));
|
|
5462
|
+
this.showRawResponse = signal(false, ...(ngDevMode ? [{ debugName: "showRawResponse" }] : []));
|
|
5463
|
+
this.showQueryConfig = signal(false, ...(ngDevMode ? [{ debugName: "showQueryConfig" }] : []));
|
|
5464
|
+
this.showEntityStoreValue = signal(false, ...(ngDevMode ? [{ debugName: "showEntityStoreValue" }] : []));
|
|
5465
|
+
this.showArguments = signal(false, ...(ngDevMode ? [{ debugName: "showArguments" }] : []));
|
|
5408
5466
|
this.selectedClientIdCtrl = new FormControl(0);
|
|
5409
5467
|
this.selectedClientId = toSignal(this.selectedClientIdCtrl.valueChanges.pipe(startWith(this.selectedClientIdCtrl.value)));
|
|
5410
|
-
this.selectedQueryId = signal(null);
|
|
5468
|
+
this.selectedQueryId = signal(null, ...(ngDevMode ? [{ debugName: "selectedQueryId" }] : []));
|
|
5411
5469
|
this.selectedClientConfig = computed(() => {
|
|
5412
5470
|
if (this.queryClientConfigs.length === 1) {
|
|
5413
5471
|
return this.queryClientConfigs[0];
|
|
@@ -5418,11 +5476,11 @@ class QueryDevtoolsComponent {
|
|
|
5418
5476
|
return this.queryClientConfigs[0];
|
|
5419
5477
|
}
|
|
5420
5478
|
return cfg;
|
|
5421
|
-
});
|
|
5479
|
+
}, ...(ngDevMode ? [{ debugName: "selectedClientConfig" }] : []));
|
|
5422
5480
|
this.queryStore = computed(() => {
|
|
5423
5481
|
const config = this.selectedClientConfig();
|
|
5424
5482
|
return config.client._store;
|
|
5425
|
-
});
|
|
5483
|
+
}, ...(ngDevMode ? [{ debugName: "queryStore" }] : []));
|
|
5426
5484
|
this.queryStore$ = toObservable(this.queryStore);
|
|
5427
5485
|
this._queries$ = new BehaviorSubject([]);
|
|
5428
5486
|
this.queries = toSignal(this._queries$);
|
|
@@ -5436,14 +5494,14 @@ class QueryDevtoolsComponent {
|
|
|
5436
5494
|
return this.queries()?.find((q) => q._id === id) ?? null;
|
|
5437
5495
|
}
|
|
5438
5496
|
return this.queryHistory$.getValue()?.find((q) => q._id === id) ?? null;
|
|
5439
|
-
});
|
|
5497
|
+
}, ...(ngDevMode ? [{ debugName: "selectedQuery" }] : []));
|
|
5440
5498
|
this.selectedQuery$ = toObservable(this.selectedQuery);
|
|
5441
5499
|
this.selectedQueryEntityStore = computed(() => {
|
|
5442
5500
|
const query = this.selectedQuery();
|
|
5443
5501
|
if (!query)
|
|
5444
5502
|
return null;
|
|
5445
5503
|
return query.store;
|
|
5446
|
-
});
|
|
5504
|
+
}, ...(ngDevMode ? [{ debugName: "selectedQueryEntityStore" }] : []));
|
|
5447
5505
|
this.selectedQueryEntityStore$ = toObservable(this.selectedQueryEntityStore);
|
|
5448
5506
|
this.selectedQueryEntityStoreValue$ = this.selectedQueryEntityStore$.pipe(switchMap((s) => s?._change$.pipe(startWith(''), map(() => {
|
|
5449
5507
|
if (!s._dictionary)
|
|
@@ -5481,7 +5539,7 @@ class QueryDevtoolsComponent {
|
|
|
5481
5539
|
return {
|
|
5482
5540
|
...sharedCfg,
|
|
5483
5541
|
};
|
|
5484
|
-
});
|
|
5542
|
+
}, ...(ngDevMode ? [{ debugName: "stringifiedQueryConfig" }] : []));
|
|
5485
5543
|
this.authProvider = toSignal(toObservable(this.selectedClientConfig).pipe(switchMap((c) => c.client.authProvider$)));
|
|
5486
5544
|
this.authProviderDetails = computed(() => {
|
|
5487
5545
|
const provider = this.authProvider();
|
|
@@ -5543,7 +5601,7 @@ class QueryDevtoolsComponent {
|
|
|
5543
5601
|
config: {},
|
|
5544
5602
|
};
|
|
5545
5603
|
}
|
|
5546
|
-
});
|
|
5604
|
+
}, ...(ngDevMode ? [{ debugName: "authProviderDetails" }] : []));
|
|
5547
5605
|
this.trackByClient = (_, { client }) => client.config.baseRoute;
|
|
5548
5606
|
this.trackByQuery = (_, { _id }) => _id;
|
|
5549
5607
|
this.selectedClientIdCtrl.valueChanges
|
|
@@ -5664,10 +5722,10 @@ class QueryDevtoolsComponent {
|
|
|
5664
5722
|
clearQueryHistory() {
|
|
5665
5723
|
this.queryHistory$.next([]);
|
|
5666
5724
|
}
|
|
5667
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
5668
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.3", type: QueryDevtoolsComponent, isStandalone: true, selector: "et-query-devtools", host: { classAttribute: "et-query-devtools" }, ngImport: i0, template: "@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Query Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Inspector</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('live'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live Queries ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('history'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Query History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history' && viewMode() === 'query') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': viewMode() !== 'authProvider' }\"\n (click)=\"selectViewMode('authProvider')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Auth Provider\n </button>\n </div>\n\n @if (viewMode() === 'query') {\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else if (viewMode() === 'authProvider') {\n <div class=\"et-qd-auth-provider__viewer\">\n @if (authProviderDetails(); as details) {\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>Type</p>\n <pre>{{ details.type }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Header value</p>\n <pre>{{ details.header() | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Config</p>\n <pre>{{ details.config | json }}</pre>\n </div>\n\n @if (details.type === 'BearerAuthProvider') {\n <div class=\"et-qd-list-item\">\n <p>Tokens</p>\n <pre>{{ details.provider.tokens$ | async | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Should refresh on unauthorized response</p>\n <pre>{{ details.provider.shouldRefreshOnUnauthorizedResponse }}</pre>\n </div>\n\n <ng-container\n *etQuery=\"\n details.provider.currentRefreshQuery$ | async as response;\n loading as loading;\n error as error;\n query as query\n \"\n >\n <div class=\"et-qd-list-item\">\n <p>Refresh query response</p>\n\n <div>\n <button (click)=\"details.provider._refreshQuery()\" class=\"et-qd-chip et-qd-chip-bordered\">\n Refresh\n </button>\n </div>\n <pre>{{ response | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query loading</p>\n <pre>{{ loading }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query error</p>\n <pre>{{ error ?? 'null' }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <pre>{{ query?.state$ | async | json }}</pre>\n </div>\n </ng-container>\n }\n </div>\n } @else {\n <p>No auth provider set</p>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n", styles: [":host{position:fixed;top:0;z-index:1000000;font-size:14px;color:#fff}.et-query-devtools-container{position:fixed;inset:0;background-color:#25292e;z-index:10000;overflow:auto;font-family:monospace;display:grid;grid-template-rows:auto auto auto minmax(0,1fr)}.et-query-devtools-container.et-query-devtools-container--transparent{opacity:.25;pointer-events:none}.et-query-devtools-container.et-query-devtools-container--transparent .et-query-devtools-translucent-btn{pointer-events:all}.et-query-devtools-container.et-query-devtools-container--snap-left{inset-inline-start:0;inset-block-start:0;inset-block-end:0;width:50%;border-right:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-right{inset-inline-start:unset;inset-inline-end:0;inset-block-start:0;inset-block-end:0;width:50%;border-left:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-top{inset-inline-start:0;inset-block-start:0;inset-inline-end:0;height:50%;border-bottom:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-bottom{inset-inline-start:0;inset-block-start:unset;inset-block-end:0;inset-inline-end:0;height:50%;border-top:1px solid rgb(37,41,46)}button.et-query-devtools-open-btn{position:fixed;inset-inline-end:20px;inset-block-end:0;z-index:9999;font-family:monospace;border-radius:3px 3px 0 0;line-height:14px;font-size:12px}.et-qd-header{background-color:#00ffa1;padding:12px;display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center}.et-qd-header__title{color:#25292e;margin:0;font-size:22px}.et-qd-header__select{display:grid;background-color:#25292e;border-radius:10px;overflow:hidden}.et-qd-header__select select{width:250px;color:#fff;padding:3px 10px 2px;border:none;background-color:#25292e;font-family:monospace}.et-qd-header__select label{padding:3px 10px;color:#25292e;font-size:12px;font-weight:700;color:#fff;border-bottom:1px solid gray}.et-qd-sub-header{background-color:#00b371;padding:12px;display:flex;gap:12px;flex-wrap:wrap}.et-qd-sub-header__divider{width:1px;background-color:#25292e}.et-qd-btn{background-color:#00ffa1;color:#25292e;border:none;padding:12px;cursor:pointer;font-size:14px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;width:100%;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-btn:hover{background-color:#00cc81}.et-qd-btn.et-qd-btn-secondary{background-color:#25292e;color:#00ffa1}.et-qd-btn.et-qd-btn-secondary:hover{background-color:#3c424a}.et-qd-chip{background-color:#00ffa1;color:#25292e;border:none;padding:4px 9px;cursor:pointer;font-size:12px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-chip:hover{background-color:#00cc81}.et-qd-chip.et-qd-chip-secondary{background-color:#25292e;color:#00ffa1}.et-qd-chip.et-qd-chip-secondary:hover{background-color:#3c424a}.et-qd-chip.et-qd-chip-bordered{border:1px solid rgb(0,255,161)}.et-qd-translucent-clickable{pointer-events:all}.et-qd-client{border-bottom:1px solid rgb(59.734939759,66.1927710843,74.265060241);padding:12px}.et-qd-client__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-client__actions{display:flex;gap:12px;margin-top:12px}.et-qd-queries{padding:12px;display:grid;grid-template-rows:auto auto minmax(0,1fr)}.et-qd-queries__actions{display:flex;gap:12px;margin-top:12px;margin-bottom:16px}.et-qd-queries__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-queries__divider{width:1px;background-color:#3c424a}.et-qd-queries__browser{display:grid;grid-template-columns:1fr minmax(0,3fr);margin-left:-12px;margin-right:-12px;border-top:1px solid rgb(59.734939759,66.1927710843,74.265060241);margin-bottom:-12px}.et-qd-queries__browser-list{border-right:1px solid rgb(59.734939759,66.1927710843,74.265060241);list-style:none;padding:0;margin:0;display:grid;grid-auto-flow:row;grid-auto-rows:55px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-list li{margin:0}.et-qd-queries__browser-list li button{all:unset;font-family:monospace;box-sizing:border-box;width:100%;border:none;border-bottom:1px solid rgb(59.734939759,66.1927710843,74.265060241);background-color:#25292e;color:#fff;text-align:left;padding:12px;height:100%;transition:all .3s ease-in-out;cursor:pointer;display:grid;grid-template-columns:auto minmax(0,1fr);gap:2px;display:block}.et-qd-queries__browser-list li button span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-qd-queries__browser-list li button span:first-of-type{font-weight:700}.et-qd-queries__browser-list li button:hover,.et-qd-queries__browser-list li button.et-qd-query--active{background-color:#30363c}.et-qd-queries__browser-detail{padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-detail__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-auth-provider__viewer{border-top:1px solid rgb(59.734939759,66.1927710843,74.265060241);margin-left:-12px;margin-right:-12px;margin-bottom:-12px;padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-list{display:grid;gap:12px}.et-qd-list-item{display:grid}.et-qd-list-item p{font-weight:700;margin:0;padding-bottom:8px}.et-qd-list-item p+p{margin-top:-8px}.et-qd-list-item div+pre{margin-top:8px}.et-qd-list-item pre{margin:0;padding:4px;background-color:#0e1012;border-radius:4px;max-height:450px;overflow:auto}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: QueryShortNamePipe, name: "queryShortName" }, { kind: "directive", type: QueryDirective, selector: "[etQuery]", inputs: ["etQuery", "etQueryCache"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
5725
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: QueryDevtoolsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5726
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: QueryDevtoolsComponent, isStandalone: true, selector: "et-query-devtools", host: { classAttribute: "et-query-devtools" }, ngImport: i0, template: "@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Query Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Inspector</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('live'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live Queries ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('history'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Query History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history' && viewMode() === 'query') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': viewMode() !== 'authProvider' }\"\n (click)=\"selectViewMode('authProvider')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Auth Provider\n </button>\n </div>\n\n @if (viewMode() === 'query') {\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else if (viewMode() === 'authProvider') {\n <div class=\"et-qd-auth-provider__viewer\">\n @if (authProviderDetails(); as details) {\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>Type</p>\n <pre>{{ details.type }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Header value</p>\n <pre>{{ details.header() | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Config</p>\n <pre>{{ details.config | json }}</pre>\n </div>\n\n @if (details.type === 'BearerAuthProvider') {\n <div class=\"et-qd-list-item\">\n <p>Tokens</p>\n <pre>{{ details.provider.tokens$ | async | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Should refresh on unauthorized response</p>\n <pre>{{ details.provider.shouldRefreshOnUnauthorizedResponse }}</pre>\n </div>\n\n <ng-container\n *etQuery=\"\n details.provider.currentRefreshQuery$ | async as response;\n loading as loading;\n error as error;\n query as query\n \"\n >\n <div class=\"et-qd-list-item\">\n <p>Refresh query response</p>\n\n <div>\n <button (click)=\"details.provider._refreshQuery()\" class=\"et-qd-chip et-qd-chip-bordered\">\n Refresh\n </button>\n </div>\n <pre>{{ response | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query loading</p>\n <pre>{{ loading }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query error</p>\n <pre>{{ error ?? 'null' }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <pre>{{ query?.state$ | async | json }}</pre>\n </div>\n </ng-container>\n }\n </div>\n } @else {\n <p>No auth provider set</p>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n", styles: [":host{position:fixed;top:0;z-index:1000000;font-size:14px;color:#fff}.et-query-devtools-container{position:fixed;inset:0;background-color:#25292e;z-index:10000;overflow:auto;font-family:monospace;display:grid;grid-template-rows:auto auto auto minmax(0,1fr)}.et-query-devtools-container.et-query-devtools-container--transparent{opacity:.25;pointer-events:none}.et-query-devtools-container.et-query-devtools-container--transparent .et-query-devtools-translucent-btn{pointer-events:all}.et-query-devtools-container.et-query-devtools-container--snap-left{inset-inline-start:0;inset-block-start:0;inset-block-end:0;width:50%;border-right:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-right{inset-inline-start:unset;inset-inline-end:0;inset-block-start:0;inset-block-end:0;width:50%;border-left:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-top{inset-inline-start:0;inset-block-start:0;inset-inline-end:0;height:50%;border-bottom:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-bottom{inset-inline-start:0;inset-block-start:unset;inset-block-end:0;inset-inline-end:0;height:50%;border-top:1px solid rgb(37,41,46)}button.et-query-devtools-open-btn{position:fixed;inset-inline-end:20px;inset-block-end:0;z-index:9999;font-family:monospace;border-radius:3px 3px 0 0;line-height:14px;font-size:12px}.et-qd-header{background-color:#00ffa1;padding:12px;display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center}.et-qd-header__title{color:#25292e;margin:0;font-size:22px}.et-qd-header__select{display:grid;background-color:#25292e;border-radius:10px;overflow:hidden}.et-qd-header__select select{width:250px;color:#fff;padding:3px 10px 2px;border:none;background-color:#25292e;font-family:monospace}.et-qd-header__select label{padding:3px 10px;color:#25292e;font-size:12px;font-weight:700;color:#fff;border-bottom:1px solid gray}.et-qd-sub-header{background-color:#00b371;padding:12px;display:flex;gap:12px;flex-wrap:wrap}.et-qd-sub-header__divider{width:1px;background-color:#25292e}.et-qd-btn{background-color:#00ffa1;color:#25292e;border:none;padding:12px;cursor:pointer;font-size:14px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;width:100%;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-btn:hover{background-color:#00cc81}.et-qd-btn.et-qd-btn-secondary{background-color:#25292e;color:#00ffa1}.et-qd-btn.et-qd-btn-secondary:hover{background-color:#3c424a}.et-qd-chip{background-color:#00ffa1;color:#25292e;border:none;padding:4px 9px;cursor:pointer;font-size:12px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-chip:hover{background-color:#00cc81}.et-qd-chip.et-qd-chip-secondary{background-color:#25292e;color:#00ffa1}.et-qd-chip.et-qd-chip-secondary:hover{background-color:#3c424a}.et-qd-chip.et-qd-chip-bordered{border:1px solid rgb(0,255,161)}.et-qd-translucent-clickable{pointer-events:all}.et-qd-client{border-bottom:1px solid rgb(59.734939759,66.1927710843,74.265060241);padding:12px}.et-qd-client__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-client__actions{display:flex;gap:12px;margin-top:12px}.et-qd-queries{padding:12px;display:grid;grid-template-rows:auto auto minmax(0,1fr)}.et-qd-queries__actions{display:flex;gap:12px;margin-top:12px;margin-bottom:16px}.et-qd-queries__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-queries__divider{width:1px;background-color:#3c424a}.et-qd-queries__browser{display:grid;grid-template-columns:1fr minmax(0,3fr);margin-left:-12px;margin-right:-12px;border-top:1px solid rgb(59.734939759,66.1927710843,74.265060241);margin-bottom:-12px}.et-qd-queries__browser-list{border-right:1px solid rgb(59.734939759,66.1927710843,74.265060241);list-style:none;padding:0;margin:0;display:grid;grid-auto-flow:row;grid-auto-rows:55px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-list li{margin:0}.et-qd-queries__browser-list li button{all:unset;font-family:monospace;box-sizing:border-box;width:100%;border:none;border-bottom:1px solid rgb(59.734939759,66.1927710843,74.265060241);background-color:#25292e;color:#fff;text-align:left;padding:12px;height:100%;transition:all .3s ease-in-out;cursor:pointer;display:grid;grid-template-columns:auto minmax(0,1fr);gap:2px;display:block}.et-qd-queries__browser-list li button span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-qd-queries__browser-list li button span:first-of-type{font-weight:700}.et-qd-queries__browser-list li button:hover,.et-qd-queries__browser-list li button.et-qd-query--active{background-color:#30363c}.et-qd-queries__browser-detail{padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-detail__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-auth-provider__viewer{border-top:1px solid rgb(59.734939759,66.1927710843,74.265060241);margin-left:-12px;margin-right:-12px;margin-bottom:-12px;padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-list{display:grid;gap:12px}.et-qd-list-item{display:grid}.et-qd-list-item p{font-weight:700;margin:0;padding-bottom:8px}.et-qd-list-item p+p{margin-top:-8px}.et-qd-list-item div+pre{margin-top:8px}.et-qd-list-item pre{margin:0;padding:4px;background-color:#0e1012;border-radius:4px;max-height:450px;overflow:auto}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: QueryDirective, selector: "[etQuery]", inputs: ["etQuery", "etQueryCache"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "pipe", type: QueryShortNamePipe, name: "queryShortName" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
5669
5727
|
}
|
|
5670
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
5728
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: QueryDevtoolsComponent, decorators: [{
|
|
5671
5729
|
type: Component,
|
|
5672
5730
|
args: [{ selector: 'et-query-devtools', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, host: {
|
|
5673
5731
|
class: 'et-query-devtools',
|