@ethlete/query 6.0.0-next.6 → 6.0.0-next.61
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 +945 -0
- package/fesm2022/ethlete-query-devtools-contract.mjs +1 -0
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs +411 -0
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs.map +1 -0
- package/fesm2022/ethlete-query-testing.mjs +548 -169
- package/fesm2022/ethlete-query-testing.mjs.map +1 -1
- package/fesm2022/ethlete-query.mjs +14680 -7172
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/generators/deprecate-legacy-queries/migration.js +85 -0
- package/generators/deprecate-legacy-queries/schema.json +26 -0
- package/generators/generators.json +30 -0
- package/generators/migrate-from-ngrx-toolkit/args-assignability.js +140 -0
- package/generators/migrate-from-ngrx-toolkit/consumers.js +521 -0
- package/generators/migrate-from-ngrx-toolkit/creators.js +301 -0
- package/generators/migrate-from-ngrx-toolkit/facade.js +295 -0
- package/generators/migrate-from-ngrx-toolkit/feature.js +513 -0
- package/generators/migrate-from-ngrx-toolkit/migration.js +140 -0
- package/generators/migrate-from-ngrx-toolkit/report.js +154 -0
- package/generators/migrate-from-ngrx-toolkit/schema.json +42 -0
- package/generators/migrate-from-ngrx-toolkit/store-removal.js +633 -0
- package/generators/migrate-from-ngrx-toolkit/ts-edits.js +128 -0
- package/generators/migrate-query-client-features/migration.js +144 -0
- package/generators/migrate-query-client-features/report.js +136 -0
- package/generators/migrate-query-client-features/schema.json +26 -0
- package/generators/migrate-query-opt-in-features/migration.js +195 -0
- package/generators/migrate-query-opt-in-features/report.js +143 -0
- package/generators/migrate-query-opt-in-features/schema.json +31 -0
- package/generators/migrate-to-query-v3/auth-provider-scaffold.js +160 -0
- package/generators/migrate-to-query-v3/cleanup-migration.js +247 -125
- package/generators/migrate-to-query-v3/http-client-check.js +93 -0
- package/generators/migrate-to-query-v3/legacy-prepare-migration.js +129 -40
- package/generators/migrate-to-query-v3/legacy-query-creator-migration.js +274 -152
- package/generators/migrate-to-query-v3/migration-scope.js +40 -0
- package/generators/migrate-to-query-v3/migration.js +19 -10
- package/generators/migrate-to-query-v3/module-graph.js +165 -0
- package/generators/migrate-to-query-v3/query-client-migration.js +342 -160
- package/generators/migrate-to-query-v3/rename-symbols.js +233 -0
- package/generators/migrate-to-query-v3/report.js +40 -7
- package/generators/migrate-to-query-v3/schema.json +12 -0
- package/generators/migrate-to-query-v3/shared.js +97 -3
- package/generators/move-devtools-contract-imports/migration.js +155 -0
- package/generators/move-devtools-contract-imports/moved-names.js +153 -0
- package/generators/move-devtools-contract-imports/schema.json +26 -0
- package/generators/prep-for-query-v3/migration.js +465 -65
- package/generators/report-legacy-query-apis/migration.js +256 -0
- package/generators/report-legacy-query-apis/schema.json +25 -0
- package/migrations/query-field-default-types.md +43 -0
- package/migrations/search-query-field-string.md +43 -0
- package/migrations.json +87 -0
- package/package.json +34 -14
- package/types/ethlete-query-devtools-contract.d.ts +2 -0
- package/types/ethlete-query-ngrx-toolkit.d.ts +131 -0
- package/types/ethlete-query-testing.d.ts +295 -160
- package/types/ethlete-query.d.ts +9755 -3682
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ɵEMPTY_QUERY_DEVTOOLS_FAULT as EMPTY_QUERY_DEVTOOLS_FAULT, ɵMAX_QUERY_BATCH_TOMBSTONES as MAX_QUERY_BATCH_TOMBSTONES, ɵMAX_QUERY_BATCH_TOMBSTONE_BUCKETS as MAX_QUERY_BATCH_TOMBSTONE_BUCKETS, ɵMAX_QUERY_DEVTOOLS_TOMBSTONES as MAX_QUERY_DEVTOOLS_TOMBSTONES, ɵQUERY_DEVTOOLS_FAULT_STATUSES as QUERY_DEVTOOLS_FAULT_STATUSES, ɵQUERY_DEVTOOLS_TOKEN_TTL_LIMIT as QUERY_DEVTOOLS_TOKEN_TTL_LIMIT, ɵaddQueryDevtoolsAuthAccount as addQueryDevtoolsAuthAccount, ɵapplyQueryDevtoolsOverrides as applyQueryDevtoolsOverrides, ɵapplyQueryDevtoolsTokenTtl as applyQueryDevtoolsTokenTtl, ɵarmAllQueryDevtoolsMocks as armAllQueryDevtoolsMocks, ɵarmQueryDevtoolsMock as armQueryDevtoolsMock, ɵarmQueryDevtoolsOverrideTransfer as armQueryDevtoolsOverrideTransfer, ɵcanOverrideQueryDevtoolsTokenTtl as canOverrideQueryDevtoolsTokenTtl, ɵclearQueryDevtoolsArmedMocks as clearQueryDevtoolsArmedMocks, ɵclearQueryDevtoolsAuthCredentials as clearQueryDevtoolsAuthCredentials, ɵclearQueryDevtoolsAuthSessions as clearQueryDevtoolsAuthSessions, ɵclearQueryDevtoolsFaults as clearQueryDevtoolsFaults, ɵclearQueryDevtoolsMockStore as clearQueryDevtoolsMockStore, ɵclearQueryDevtoolsOverrideStore as clearQueryDevtoolsOverrideStore, ɵclearQueryDevtoolsStore as clearQueryDevtoolsStore, ɵclearQueryDevtoolsTombstones as clearQueryDevtoolsTombstones, ɵclearRestoredQueryDevtoolsOverrides as clearRestoredQueryDevtoolsOverrides, ɵcollectLeafPaths as collectLeafPaths, ɵcollectQueryDevtoolsSchemaComponents as collectQueryDevtoolsSchemaComponents, ɵcountUnresolvedQueryDevtoolsOverrides as countUnresolvedQueryDevtoolsOverrides, ɵcreateQueryDevtoolsOverrides as createQueryDevtoolsOverrides, ɵdeleteQueryDevtoolsMock as deleteQueryDevtoolsMock, ɵdetectPaginationShape as detectPaginationShape, ɵforgetQueryDevtoolsAuthSession as forgetQueryDevtoolsAuthSession, ɵforgetQueryDevtoolsAuthSessionsFor as forgetQueryDevtoolsAuthSessionsFor, ɵgenerateQueryDevtoolsNumberPreset as generateQueryDevtoolsNumberPreset, ɵgenerateQueryDevtoolsSampleNumber as generateQueryDevtoolsSampleNumber, ɵgenerateQueryDevtoolsStringPreset as generateQueryDevtoolsStringPreset, ɵhasQueryDevtoolsOverridesAtPath as hasQueryDevtoolsOverridesAtPath, ɵisDateShapedLeaf as isDateShapedLeaf, ɵisQueryDevtoolsEnabled as isQueryDevtoolsEnabled, ɵisQueryDevtoolsFaultArmed as isQueryDevtoolsFaultArmed, ɵisQueryDevtoolsRepositoryLive as isQueryDevtoolsRepositoryLive, ɵloadQueryDevtoolsSchema as loadQueryDevtoolsSchema, ɵloginQueryDevtoolsAuthAccount as loginQueryDevtoolsAuthAccount, ɵlogoutQueryDevtoolsAuthSession as logoutQueryDevtoolsAuthSession, ɵmatchesQueryDevtoolsMockPattern as matchesQueryDevtoolsMockPattern, ɵmatchesQueryDevtoolsMockQuery as matchesQueryDevtoolsMockQuery, ɵmeasureQueryDevtoolsPayload as measureQueryDevtoolsPayload, ɵparseQueryDevtoolsOverrideTransfer as parseQueryDevtoolsOverrideTransfer, ɵqueryDevtoolsAbout as queryDevtoolsAbout, ɵqueryDevtoolsAllowsLocalAuthSessions as queryDevtoolsAllowsLocalAuthSessions, ɵqueryDevtoolsApiEnvIds as queryDevtoolsApiEnvIds, ɵqueryDevtoolsApiEnvIsProduction as queryDevtoolsApiEnvIsProduction, ɵqueryDevtoolsApiEnvScope as queryDevtoolsApiEnvScope, ɵqueryDevtoolsApiEnvValues as queryDevtoolsApiEnvValues, ɵqueryDevtoolsApiEnvs as queryDevtoolsApiEnvs, ɵqueryDevtoolsArmedMocks as queryDevtoolsArmedMocks, ɵqueryDevtoolsArmedMocksRestored as queryDevtoolsArmedMocksRestored, ɵqueryDevtoolsAuthAccountsFor as queryDevtoolsAuthAccountsFor, ɵqueryDevtoolsAuthActive as queryDevtoolsAuthActive, ɵqueryDevtoolsAuthFieldsFor as queryDevtoolsAuthFieldsFor, ɵqueryDevtoolsAuthOtherScopeCount as queryDevtoolsAuthOtherScopeCount, ɵqueryDevtoolsAuthSessions as queryDevtoolsAuthSessions, ɵqueryDevtoolsAuthSessionsFor as queryDevtoolsAuthSessionsFor, ɵqueryDevtoolsAuthTabLocal as queryDevtoolsAuthTabLocal, ɵqueryDevtoolsEntries as queryDevtoolsEntries, ɵqueryDevtoolsFaults as queryDevtoolsFaults, ɵqueryDevtoolsFaultsRestored as queryDevtoolsFaultsRestored, ɵqueryDevtoolsMockId as queryDevtoolsMockId, ɵqueryDevtoolsMocks as queryDevtoolsMocks, ɵqueryDevtoolsOverridePersistence as queryDevtoolsOverridePersistence, ɵqueryDevtoolsRequestPath as queryDevtoolsRequestPath, ɵqueryDevtoolsResponseHistory as queryDevtoolsResponseHistory, ɵqueryDevtoolsRestoredOverridesScope as queryDevtoolsRestoredOverridesScope, ɵqueryDevtoolsSchemaNames as queryDevtoolsSchemaNames, ɵqueryDevtoolsSchemaRoutes as queryDevtoolsSchemaRoutes, ɵqueryDevtoolsSchemaState as queryDevtoolsSchemaState, ɵqueryDevtoolsSettings as queryDevtoolsSettings, ɵqueryDevtoolsStorage as queryDevtoolsStorage, ɵqueryDevtoolsTokenTtls as queryDevtoolsTokenTtls, ɵreadQueryDevtoolsStore as readQueryDevtoolsStore, ɵregisterEthleteVersion as registerEthleteVersion, ɵremoveQueryDevtoolsAuthAccount as removeQueryDevtoolsAuthAccount, ɵrenameQueryDevtoolsAuthSession as renameQueryDevtoolsAuthSession, ɵrestoredQueryDevtoolsOverrides as restoredQueryDevtoolsOverrides, ɵsaveQueryDevtoolsMock as saveQueryDevtoolsMock, ɵseedQueryDevtoolsSchemaBody as seedQueryDevtoolsSchemaBody, ɵseedQueryDevtoolsSchemaRoute as seedQueryDevtoolsSchemaRoute, ɵserializeQueryDevtoolsOverrideTransfer as serializeQueryDevtoolsOverrideTransfer, ɵsetQueryDevtoolsApiEnv as setQueryDevtoolsApiEnv, ɵsetQueryDevtoolsAppInfo as setQueryDevtoolsAppInfo, ɵsetQueryDevtoolsArmedMocksScope as setQueryDevtoolsArmedMocksScope, ɵsetQueryDevtoolsAuthCredentials as setQueryDevtoolsAuthCredentials, ɵsetQueryDevtoolsAuthTabLocal as setQueryDevtoolsAuthTabLocal, ɵsetQueryDevtoolsFault as setQueryDevtoolsFault, ɵsetQueryDevtoolsFaultsScope as setQueryDevtoolsFaultsScope, ɵsetQueryDevtoolsOverridePersistence as setQueryDevtoolsOverridePersistence, ɵsetQueryDevtoolsOverridesScope as setQueryDevtoolsOverridesScope, ɵsetQueryDevtoolsSettings as setQueryDevtoolsSettings, ɵsmartDuplicateArrayItem as smartDuplicateArrayItem, ɵsnapshotQueryDevtoolsHandle as snapshotQueryDevtoolsHandle, ɵstringifyQueryRouteParts as stringifyQueryRouteParts, ɵsumQueryDevtoolsStats as sumQueryDevtoolsStats, ɵswitchQueryDevtoolsAuthSession as switchQueryDevtoolsAuthSession, ɵtombstoneOf as tombstoneOf, ɵwriteQueryDevtoolsStore as writeQueryDevtoolsStore } from "@ethlete/query";
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { ChangeDetectorRef, DestroyRef, EnvironmentInjector, NgModule, Pipe, assertInInjectionContext, computed, effect, inject, isDevMode, signal, untracked } from "@angular/core";
|
|
3
|
+
import { Subject, Subscription, combineLatest, defer, distinctUntilChanged, filter, finalize, interval, map, of, startWith, takeUntil } from "rxjs";
|
|
4
|
+
import { resolveQueryHeaders } from "@ethlete/query";
|
|
5
|
+
const createToolkitPipeTransform = (options) => {
|
|
6
|
+
const cdr = inject(ChangeDetectorRef);
|
|
7
|
+
let subscription = Subscription.EMPTY;
|
|
8
|
+
let current = null;
|
|
9
|
+
let state = options.initialState;
|
|
10
|
+
const dispose = () => {
|
|
11
|
+
subscription.unsubscribe();
|
|
12
|
+
current = null;
|
|
13
|
+
state = options.disposedState;
|
|
14
|
+
};
|
|
15
|
+
const subscribe = (value) => {
|
|
16
|
+
current = value;
|
|
17
|
+
subscription = options.state$(value).subscribe((next) => {
|
|
18
|
+
state = next;
|
|
19
|
+
cdr.markForCheck();
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
inject(DestroyRef).onDestroy(dispose);
|
|
23
|
+
return (value) => {
|
|
24
|
+
if (!current && value) subscribe(value);
|
|
25
|
+
if (current !== value) {
|
|
26
|
+
dispose();
|
|
27
|
+
if (value) subscribe(value);
|
|
28
|
+
}
|
|
29
|
+
return state;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const noop = () => void 0;
|
|
33
|
+
const DEFAULT_STATE = {
|
|
34
|
+
args: null,
|
|
35
|
+
cachedResponse: null,
|
|
36
|
+
callState: null,
|
|
37
|
+
error: null,
|
|
38
|
+
isError: false,
|
|
39
|
+
isInit: false,
|
|
40
|
+
isLoading: false,
|
|
41
|
+
isSuccess: false,
|
|
42
|
+
response: null,
|
|
43
|
+
timestamp: null,
|
|
44
|
+
refresh: noop,
|
|
45
|
+
remove: noop,
|
|
46
|
+
startPolling: noop,
|
|
47
|
+
stopPolling: noop
|
|
48
|
+
};
|
|
49
|
+
const suspenseState$ = (handle) => combineLatest({
|
|
50
|
+
args: handle.args$,
|
|
51
|
+
cachedResponse: handle.cachedResponse$.pipe(startWith(null)),
|
|
52
|
+
callState: handle.callState$,
|
|
53
|
+
error: handle.error$,
|
|
54
|
+
isError: handle.isError$,
|
|
55
|
+
isInit: handle.isInit$,
|
|
56
|
+
isLoading: handle.isLoading$,
|
|
57
|
+
isSuccess: handle.isSuccess$,
|
|
58
|
+
response: handle.response$,
|
|
59
|
+
timestamp: handle.timestamp$
|
|
60
|
+
}).pipe(map((values) => ({
|
|
61
|
+
...values,
|
|
62
|
+
refresh: handle.refresh,
|
|
63
|
+
remove: handle.remove,
|
|
64
|
+
startPolling: handle.startPolling,
|
|
65
|
+
stopPolling: handle.stopPolling
|
|
66
|
+
})));
|
|
67
|
+
var SuspensePipe = class SuspensePipe {
|
|
68
|
+
constructor() {
|
|
69
|
+
this.transform = createToolkitPipeTransform({
|
|
70
|
+
initialState: DEFAULT_STATE,
|
|
71
|
+
disposedState: null,
|
|
72
|
+
state$: suspenseState$
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
static {
|
|
76
|
+
this.ɵfac = i0.ɵɵngDeclareFactory({
|
|
77
|
+
minVersion: "12.0.0",
|
|
78
|
+
version: "22.2.3",
|
|
79
|
+
ngImport: i0,
|
|
80
|
+
type: SuspensePipe,
|
|
81
|
+
deps: [],
|
|
82
|
+
target: i0.ɵɵFactoryTarget.Pipe
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
static {
|
|
86
|
+
this.ɵpipe = i0.ɵɵngDeclarePipe({
|
|
87
|
+
minVersion: "14.0.0",
|
|
88
|
+
version: "22.2.3",
|
|
89
|
+
ngImport: i0,
|
|
90
|
+
type: SuspensePipe,
|
|
91
|
+
isStandalone: true,
|
|
92
|
+
name: "suspense",
|
|
93
|
+
pure: false
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
98
|
+
minVersion: "12.0.0",
|
|
99
|
+
version: "22.2.3",
|
|
100
|
+
ngImport: i0,
|
|
101
|
+
type: SuspensePipe,
|
|
102
|
+
decorators: [{
|
|
103
|
+
type: Pipe,
|
|
104
|
+
args: [{
|
|
105
|
+
name: "suspense",
|
|
106
|
+
pure: false
|
|
107
|
+
}]
|
|
108
|
+
}]
|
|
109
|
+
});
|
|
110
|
+
const suspenseMultiState$ = (handles) => combineLatest(Object.entries(handles).flatMap(([key, handle]) => handle ? [suspenseState$(handle).pipe(map((state) => [key, state]))] : [])).pipe(map((states) => Object.fromEntries(states)));
|
|
111
|
+
var SuspenseMultiPipe = class SuspenseMultiPipe {
|
|
112
|
+
constructor() {
|
|
113
|
+
this.transform = createToolkitPipeTransform({
|
|
114
|
+
initialState: {},
|
|
115
|
+
disposedState: {},
|
|
116
|
+
state$: suspenseMultiState$
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
static {
|
|
120
|
+
this.ɵfac = i0.ɵɵngDeclareFactory({
|
|
121
|
+
minVersion: "12.0.0",
|
|
122
|
+
version: "22.2.3",
|
|
123
|
+
ngImport: i0,
|
|
124
|
+
type: SuspenseMultiPipe,
|
|
125
|
+
deps: [],
|
|
126
|
+
target: i0.ɵɵFactoryTarget.Pipe
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
static {
|
|
130
|
+
this.ɵpipe = i0.ɵɵngDeclarePipe({
|
|
131
|
+
minVersion: "14.0.0",
|
|
132
|
+
version: "22.2.3",
|
|
133
|
+
ngImport: i0,
|
|
134
|
+
type: SuspenseMultiPipe,
|
|
135
|
+
isStandalone: true,
|
|
136
|
+
name: "suspenseMulti",
|
|
137
|
+
pure: false
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
142
|
+
minVersion: "12.0.0",
|
|
143
|
+
version: "22.2.3",
|
|
144
|
+
ngImport: i0,
|
|
145
|
+
type: SuspenseMultiPipe,
|
|
146
|
+
decorators: [{
|
|
147
|
+
type: Pipe,
|
|
148
|
+
args: [{
|
|
149
|
+
name: "suspenseMulti",
|
|
150
|
+
pure: false
|
|
151
|
+
}]
|
|
152
|
+
}]
|
|
153
|
+
});
|
|
154
|
+
var NgRxToolkitModule = class NgRxToolkitModule {
|
|
155
|
+
static {
|
|
156
|
+
this.ɵfac = i0.ɵɵngDeclareFactory({
|
|
157
|
+
minVersion: "12.0.0",
|
|
158
|
+
version: "22.2.3",
|
|
159
|
+
ngImport: i0,
|
|
160
|
+
type: NgRxToolkitModule,
|
|
161
|
+
deps: [],
|
|
162
|
+
target: i0.ɵɵFactoryTarget.NgModule
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
static {
|
|
166
|
+
this.ɵmod = i0.ɵɵngDeclareNgModule({
|
|
167
|
+
minVersion: "14.0.0",
|
|
168
|
+
version: "22.2.3",
|
|
169
|
+
ngImport: i0,
|
|
170
|
+
type: NgRxToolkitModule,
|
|
171
|
+
imports: [SuspensePipe, SuspenseMultiPipe],
|
|
172
|
+
exports: [SuspensePipe, SuspenseMultiPipe]
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
static {
|
|
176
|
+
this.ɵinj = i0.ɵɵngDeclareInjector({
|
|
177
|
+
minVersion: "12.0.0",
|
|
178
|
+
version: "22.2.3",
|
|
179
|
+
ngImport: i0,
|
|
180
|
+
type: NgRxToolkitModule
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
185
|
+
minVersion: "12.0.0",
|
|
186
|
+
version: "22.2.3",
|
|
187
|
+
ngImport: i0,
|
|
188
|
+
type: NgRxToolkitModule,
|
|
189
|
+
decorators: [{
|
|
190
|
+
type: NgModule,
|
|
191
|
+
args: [{
|
|
192
|
+
imports: [SuspensePipe, SuspenseMultiPipe],
|
|
193
|
+
exports: [SuspensePipe, SuspenseMultiPipe]
|
|
194
|
+
}]
|
|
195
|
+
}]
|
|
196
|
+
});
|
|
197
|
+
const CallState = {
|
|
198
|
+
INIT: "INIT",
|
|
199
|
+
LOADING: "LOADING",
|
|
200
|
+
SUCCESS: "SUCCESS",
|
|
201
|
+
ERROR: "ERROR"
|
|
202
|
+
};
|
|
203
|
+
const EMPTY_SNAPSHOT = {
|
|
204
|
+
args: null,
|
|
205
|
+
callState: null,
|
|
206
|
+
response: null,
|
|
207
|
+
error: null,
|
|
208
|
+
timestamp: null
|
|
209
|
+
};
|
|
210
|
+
const toCallState = (state) => {
|
|
211
|
+
switch (state?.type) {
|
|
212
|
+
case "success": return CallState.SUCCESS;
|
|
213
|
+
case "failure": return CallState.ERROR;
|
|
214
|
+
default: return CallState.LOADING;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
const toToolkitError = (error) => ({
|
|
218
|
+
status: error.raw.status,
|
|
219
|
+
message: error.raw.message,
|
|
220
|
+
data: error.raw.error ?? null
|
|
221
|
+
});
|
|
222
|
+
const handleReleasedMessage = (method) => `${method}() was called on a toolkit handle that a newer toolkitCall() released. Args that cannot be hashed (FormData, Blob, Map, ...) never share a handle, so the next call for the same creator releases the previous handle once its request settles. The call was ignored - call toolkitCall() again with the args instead of reusing the old handle. This warning is shown once per handle.`;
|
|
223
|
+
const toQueryArgs = (args) => {
|
|
224
|
+
const actionOptions = args["actionOptions"];
|
|
225
|
+
const queryArgs = {};
|
|
226
|
+
if (args["queryParams"] !== void 0) queryArgs["pathParams"] = args["queryParams"];
|
|
227
|
+
if (args["params"] !== void 0) queryArgs["queryParams"] = args["params"];
|
|
228
|
+
if (args["body"] !== void 0) queryArgs["body"] = args["body"];
|
|
229
|
+
if (actionOptions?.headers !== void 0) queryArgs["headers"] = actionOptions.headers;
|
|
230
|
+
return queryArgs;
|
|
231
|
+
};
|
|
232
|
+
const createToolkitHandle = (creator, injector) => {
|
|
233
|
+
const query = creator({
|
|
234
|
+
injector,
|
|
235
|
+
onlyManualExecution: true,
|
|
236
|
+
silenceMissingWithArgsFeatureError: true
|
|
237
|
+
});
|
|
238
|
+
const calledArgs = signal(null, ...ngDevMode ? [{ debugName: "calledArgs" }] : /* istanbul ignore next */ []);
|
|
239
|
+
const toolkitError = computed(() => {
|
|
240
|
+
const error = query.error();
|
|
241
|
+
return error ? toToolkitError(error) : null;
|
|
242
|
+
}, ...ngDevMode ? [{ debugName: "toolkitError" }] : /* istanbul ignore next */ []);
|
|
243
|
+
const snapshot = computed(() => {
|
|
244
|
+
const currentArgs = calledArgs();
|
|
245
|
+
if (!currentArgs) return EMPTY_SNAPSHOT;
|
|
246
|
+
const state = query.executionState();
|
|
247
|
+
const callState = toCallState(state);
|
|
248
|
+
return {
|
|
249
|
+
args: currentArgs,
|
|
250
|
+
callState,
|
|
251
|
+
response: state?.type === "success" ? state.response : null,
|
|
252
|
+
error: callState === CallState.ERROR ? toolkitError() : null,
|
|
253
|
+
timestamp: Date.now()
|
|
254
|
+
};
|
|
255
|
+
}, ...ngDevMode ? [{ debugName: "snapshot" }] : /* istanbul ignore next */ []);
|
|
256
|
+
const changes = new Subject();
|
|
257
|
+
const changesEffect = effect(() => {
|
|
258
|
+
const current = snapshot();
|
|
259
|
+
untracked(() => changes.next(current));
|
|
260
|
+
}, {
|
|
261
|
+
...ngDevMode ? { debugName: "changesEffect" } : /* istanbul ignore next */ {},
|
|
262
|
+
injector
|
|
263
|
+
});
|
|
264
|
+
let releasedSnapshot = null;
|
|
265
|
+
let warnedAboutRelease = false;
|
|
266
|
+
const ignoredAfterRelease = (method) => {
|
|
267
|
+
if (!releasedSnapshot) return false;
|
|
268
|
+
if (isDevMode() && !warnedAboutRelease) {
|
|
269
|
+
warnedAboutRelease = true;
|
|
270
|
+
console.warn(handleReleasedMessage(method));
|
|
271
|
+
}
|
|
272
|
+
return true;
|
|
273
|
+
};
|
|
274
|
+
const select = (pick) => defer(() => releasedSnapshot ? of(releasedSnapshot) : changes.pipe(startWith(untracked(snapshot)))).pipe(map(pick), distinctUntilChanged());
|
|
275
|
+
const call = (args) => {
|
|
276
|
+
calledArgs.set(args);
|
|
277
|
+
query.execute({ args: toQueryArgs(args) });
|
|
278
|
+
};
|
|
279
|
+
const refresh = () => {
|
|
280
|
+
if (ignoredAfterRelease("refresh")) return;
|
|
281
|
+
const lastArgs = untracked(calledArgs);
|
|
282
|
+
if (lastArgs) call(lastArgs);
|
|
283
|
+
};
|
|
284
|
+
let pollingSubscription = Subscription.EMPTY;
|
|
285
|
+
const stopPolling = () => pollingSubscription.unsubscribe();
|
|
286
|
+
const startPolling = ({ intervalDuration, killSwitch }) => {
|
|
287
|
+
if (ignoredAfterRelease("startPolling") || !pollingSubscription.closed) return;
|
|
288
|
+
pollingSubscription = interval(intervalDuration).pipe(takeUntil(killSwitch), finalize(() => pollingSubscription = Subscription.EMPTY)).subscribe(() => refresh());
|
|
289
|
+
};
|
|
290
|
+
const remove = () => {
|
|
291
|
+
stopPolling();
|
|
292
|
+
calledArgs.set(null);
|
|
293
|
+
query.reset();
|
|
294
|
+
};
|
|
295
|
+
const removeDestroyListener = injector.get(DestroyRef).onDestroy(() => {
|
|
296
|
+
stopPolling();
|
|
297
|
+
changes.complete();
|
|
298
|
+
});
|
|
299
|
+
const release = () => {
|
|
300
|
+
releasedSnapshot = untracked(snapshot);
|
|
301
|
+
stopPolling();
|
|
302
|
+
changesEffect.destroy();
|
|
303
|
+
removeDestroyListener();
|
|
304
|
+
changes.complete();
|
|
305
|
+
query.subtle.destroy();
|
|
306
|
+
};
|
|
307
|
+
const releaseWhenSettled = () => {
|
|
308
|
+
const releaseEffect = effect(() => {
|
|
309
|
+
if (snapshot().callState === CallState.LOADING) return;
|
|
310
|
+
releaseEffect.destroy();
|
|
311
|
+
untracked(release);
|
|
312
|
+
}, {
|
|
313
|
+
...ngDevMode ? { debugName: "releaseEffect" } : /* istanbul ignore next */ {},
|
|
314
|
+
injector
|
|
315
|
+
});
|
|
316
|
+
};
|
|
317
|
+
const response$ = select((current) => current.response);
|
|
318
|
+
return {
|
|
319
|
+
handle: {
|
|
320
|
+
response$,
|
|
321
|
+
cachedResponse$: response$.pipe(filter((response) => !!response)),
|
|
322
|
+
error$: select((current) => current.error),
|
|
323
|
+
args$: select((current) => current.args),
|
|
324
|
+
isInit$: select((current) => current.callState === CallState.INIT),
|
|
325
|
+
isLoading$: select((current) => current.callState === CallState.LOADING),
|
|
326
|
+
isSuccess$: select((current) => current.callState === CallState.SUCCESS),
|
|
327
|
+
isError$: select((current) => current.callState === CallState.ERROR),
|
|
328
|
+
timestamp$: select((current) => current.timestamp),
|
|
329
|
+
callState$: select((current) => current.callState),
|
|
330
|
+
refresh,
|
|
331
|
+
remove,
|
|
332
|
+
startPolling,
|
|
333
|
+
stopPolling
|
|
334
|
+
},
|
|
335
|
+
call,
|
|
336
|
+
releaseWhenSettled
|
|
337
|
+
};
|
|
338
|
+
};
|
|
339
|
+
const registries = /* @__PURE__ */ new WeakMap();
|
|
340
|
+
var UnhashableValueError = class extends Error {};
|
|
341
|
+
const isPlainObject = (value) => {
|
|
342
|
+
const prototype = Object.getPrototypeOf(value);
|
|
343
|
+
return prototype === Object.prototype || prototype === null;
|
|
344
|
+
};
|
|
345
|
+
const hashableValue = (value) => {
|
|
346
|
+
if (Array.isArray(value)) return value.map(hashableValue);
|
|
347
|
+
if (typeof value !== "object" || value === null) return value;
|
|
348
|
+
if (value instanceof Date) return { "\0date": value.getTime() };
|
|
349
|
+
if (!isPlainObject(value)) throw new UnhashableValueError();
|
|
350
|
+
return Object.fromEntries(Object.keys(value).sort().map((key) => [key, hashableValue(value[key])]));
|
|
351
|
+
};
|
|
352
|
+
const hashableHeaders = (headers) => {
|
|
353
|
+
const resolved = resolveQueryHeaders(headers);
|
|
354
|
+
return resolved?.keys().map((name) => name.toLowerCase()).sort().map((name) => [name, resolved.getAll(name)]);
|
|
355
|
+
};
|
|
356
|
+
const hashArgs = (args) => {
|
|
357
|
+
const { headers, ...rest } = args;
|
|
358
|
+
try {
|
|
359
|
+
return JSON.stringify([hashableValue(rest), hashableHeaders(headers) ?? null]);
|
|
360
|
+
} catch (error) {
|
|
361
|
+
if (error instanceof UnhashableValueError) return null;
|
|
362
|
+
throw error;
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
const resolveEnvironmentInjector = (fn, options) => {
|
|
366
|
+
if (options?.injector) return options.injector.get(EnvironmentInjector);
|
|
367
|
+
assertInInjectionContext(fn);
|
|
368
|
+
return inject(EnvironmentInjector);
|
|
369
|
+
};
|
|
370
|
+
const resolveEntry = (creator, args, injector) => {
|
|
371
|
+
let registry = registries.get(injector);
|
|
372
|
+
if (!registry) {
|
|
373
|
+
registry = {
|
|
374
|
+
shared: /* @__PURE__ */ new WeakMap(),
|
|
375
|
+
latestUnshared: /* @__PURE__ */ new WeakMap()
|
|
376
|
+
};
|
|
377
|
+
registries.set(injector, registry);
|
|
378
|
+
}
|
|
379
|
+
const key = hashArgs(toQueryArgs(args));
|
|
380
|
+
if (key === null) {
|
|
381
|
+
const entry = createToolkitHandle(creator, injector);
|
|
382
|
+
registry.latestUnshared.get(creator)?.releaseWhenSettled();
|
|
383
|
+
registry.latestUnshared.set(creator, entry);
|
|
384
|
+
return entry;
|
|
385
|
+
}
|
|
386
|
+
let entries = registry.shared.get(creator);
|
|
387
|
+
if (!entries) {
|
|
388
|
+
entries = /* @__PURE__ */ new Map();
|
|
389
|
+
registry.shared.set(creator, entries);
|
|
390
|
+
}
|
|
391
|
+
let entry = entries.get(key);
|
|
392
|
+
if (!entry) {
|
|
393
|
+
entry = createToolkitHandle(creator, injector);
|
|
394
|
+
entries.set(key, entry);
|
|
395
|
+
}
|
|
396
|
+
return entry;
|
|
397
|
+
};
|
|
398
|
+
const toolkitSelect = (creator, args, options) => resolveEntry(creator, args, resolveEnvironmentInjector(toolkitSelect, options)).handle;
|
|
399
|
+
const toolkitCall = (creator, args, options) => {
|
|
400
|
+
const entry = resolveEntry(creator, args, resolveEnvironmentInjector(toolkitCall, options));
|
|
401
|
+
entry.call(args);
|
|
402
|
+
return entry.handle;
|
|
403
|
+
};
|
|
404
|
+
const joinLoading = (observables) => combineLatest(observables.filter((o) => !!o)).pipe(map((values) => values.some((value) => !!value)));
|
|
405
|
+
const joinErrors = (observables) => combineLatest(observables.filter((o) => !!o)).pipe(map((values) => {
|
|
406
|
+
const errors = values.filter((value) => !!value);
|
|
407
|
+
return errors.length ? errors : null;
|
|
408
|
+
}));
|
|
409
|
+
export { CallState, NgRxToolkitModule, SuspenseMultiPipe, SuspensePipe, joinErrors, joinLoading, toolkitCall, toolkitSelect };
|
|
410
|
+
|
|
411
|
+
//# sourceMappingURL=ethlete-query-ngrx-toolkit.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ethlete-query-ngrx-toolkit.mjs","names":[],"sources":["../../../../libs/query/ngrx-toolkit/toolkit-pipe-transform.ts","../../../../libs/query/ngrx-toolkit/suspense.pipe.ts","../../../../libs/query/ngrx-toolkit/suspense-multi.pipe.ts","../../../../libs/query/ngrx-toolkit/ngrx-toolkit.module.ts","../../../../libs/query/ngrx-toolkit/toolkit-types.ts","../../../../libs/query/ngrx-toolkit/toolkit-handle.ts","../../../../libs/query/ngrx-toolkit/toolkit-call.ts","../../../../libs/query/ngrx-toolkit/toolkit-join.ts"],"sourcesContent":["import { ChangeDetectorRef, DestroyRef, inject } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\n\nexport type CreateToolkitPipeTransformOptions<TValue, TState> = {\n initialState: TState;\n disposedState: TState;\n state$: (value: TValue) => Observable<TState>;\n};\n\nexport const createToolkitPipeTransform = <TValue extends object, TState>(\n options: CreateToolkitPipeTransformOptions<TValue, TState>,\n) => {\n const cdr = inject(ChangeDetectorRef);\n let subscription = Subscription.EMPTY;\n let current: TValue | null = null;\n let state = options.initialState;\n\n const dispose = () => {\n subscription.unsubscribe();\n current = null;\n state = options.disposedState;\n };\n\n const subscribe = (value: TValue) => {\n current = value;\n subscription = options.state$(value).subscribe((next) => {\n state = next;\n cdr.markForCheck();\n });\n };\n\n inject(DestroyRef).onDestroy(dispose);\n\n return (value: TValue | null | undefined) => {\n if (!current && value) subscribe(value);\n\n if (current !== value) {\n dispose();\n if (value) subscribe(value);\n }\n\n return state;\n };\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { combineLatest, map, Observable, startWith } from 'rxjs';\nimport { createToolkitPipeTransform } from './toolkit-pipe-transform';\nimport { AnyMappedEntityState, ToolkitPollingOptions } from './toolkit-types';\n\ntype ExtractFrom<T> = T extends Observable<infer U> ? U : never;\n\n/** What `suspense` and `suspenseMulti` render for a handle: every stream's current value, plus the handle's methods. */\nexport type ToolkitSuspenseState<T extends AnyMappedEntityState | null | undefined> = T extends AnyMappedEntityState\n ? {\n args: ExtractFrom<T['args$']>;\n cachedResponse: ExtractFrom<T['cachedResponse$']> | null;\n callState: ExtractFrom<T['callState$']>;\n error: ExtractFrom<T['error$']>;\n isError: ExtractFrom<T['isError$']>;\n isInit: ExtractFrom<T['isInit$']>;\n isLoading: ExtractFrom<T['isLoading$']>;\n isSuccess: ExtractFrom<T['isSuccess$']>;\n response: ExtractFrom<T['response$']>;\n timestamp: ExtractFrom<T['timestamp$']>;\n refresh: () => void;\n remove: () => void;\n startPolling: (options: ToolkitPollingOptions) => void;\n stopPolling: () => void;\n }\n : T;\n\ntype AnySuspenseState = ToolkitSuspenseState<AnyMappedEntityState>;\n\nconst noop = () => undefined;\n\nconst DEFAULT_STATE: AnySuspenseState = {\n args: null,\n cachedResponse: null,\n callState: null,\n error: null,\n isError: false,\n isInit: false,\n isLoading: false,\n isSuccess: false,\n response: null,\n timestamp: null,\n refresh: noop,\n remove: noop,\n startPolling: noop,\n stopPolling: noop,\n};\n\nexport const suspenseState$ = (handle: AnyMappedEntityState): Observable<AnySuspenseState> =>\n combineLatest({\n args: handle.args$,\n cachedResponse: handle.cachedResponse$.pipe(startWith(null)),\n callState: handle.callState$,\n error: handle.error$,\n isError: handle.isError$,\n isInit: handle.isInit$,\n isLoading: handle.isLoading$,\n isSuccess: handle.isSuccess$,\n response: handle.response$,\n timestamp: handle.timestamp$,\n }).pipe(\n map((values) => ({\n ...values,\n refresh: handle.refresh,\n remove: handle.remove,\n startPolling: handle.startPolling,\n stopPolling: handle.stopPolling,\n })),\n );\n\n/** Subscribes to a toolkit handle and renders its current state, like the `suspense` pipe of `@tomtomb/ngrx-toolkit`. */\n@Pipe({ name: 'suspense', pure: false })\nexport class SuspensePipe implements PipeTransform {\n transform = createToolkitPipeTransform<AnyMappedEntityState, AnySuspenseState | null>({\n initialState: DEFAULT_STATE,\n disposedState: null,\n state$: suspenseState$,\n }) as <T extends AnyMappedEntityState>(value: T | null | undefined) => ToolkitSuspenseState<T>;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { combineLatest, map } from 'rxjs';\nimport { suspenseState$, ToolkitSuspenseState } from './suspense.pipe';\nimport { createToolkitPipeTransform } from './toolkit-pipe-transform';\nimport { AnyMappedEntityState } from './toolkit-types';\n\ntype AnyHandleRecord = Record<string, AnyMappedEntityState | null | undefined>;\n\nexport type ToolkitSuspenseMultiState<T extends AnyHandleRecord> = {\n [K in keyof T]: ToolkitSuspenseState<T[K]>;\n};\n\nconst suspenseMultiState$ = (handles: AnyHandleRecord) =>\n combineLatest(\n Object.entries(handles).flatMap(([key, handle]) =>\n handle ? [suspenseState$(handle).pipe(map((state) => [key, state] as const))] : [],\n ),\n ).pipe(map((states) => Object.fromEntries(states)));\n\n/**\n * Subscribes to a record of toolkit handles and renders each one's current state, like the `suspenseMulti` pipe of\n * `@tomtomb/ngrx-toolkit`. Nothing renders until every non-null handle has emitted.\n */\n@Pipe({ name: 'suspenseMulti', pure: false })\nexport class SuspenseMultiPipe implements PipeTransform {\n transform = createToolkitPipeTransform<AnyHandleRecord, Record<string, unknown>>({\n initialState: {},\n disposedState: {},\n state$: suspenseMultiState$,\n }) as <T extends AnyHandleRecord>(value: T | null | undefined) => ToolkitSuspenseMultiState<T>;\n}\n","import { NgModule } from '@angular/core';\nimport { SuspenseMultiPipe } from './suspense-multi.pipe';\nimport { SuspensePipe } from './suspense.pipe';\n\n/** Exports the `suspense` and `suspenseMulti` pipes, like the `NgRxToolkitModule` of `@tomtomb/ngrx-toolkit`. */\n@NgModule({\n imports: [SuspensePipe, SuspenseMultiPipe],\n exports: [SuspensePipe, SuspenseMultiPipe],\n})\nexport class NgRxToolkitModule {}\n","import { AnyQueryCreator, QueryArgsOf, QueryHeaders, ResponseType } from '@ethlete/query';\nimport { Observable, Subject } from 'rxjs';\n\n/** The call state of a toolkit handle, as `@tomtomb/ngrx-toolkit` names it. */\nexport const CallState = {\n INIT: 'INIT',\n LOADING: 'LOADING',\n SUCCESS: 'SUCCESS',\n ERROR: 'ERROR',\n} as const;\n\nexport type CallState = (typeof CallState)[keyof typeof CallState];\n\n/** The error shape of `@tomtomb/ngrx-toolkit`: the HTTP status, the error message and the response body. */\nexport type ToolkitError<T = unknown> = {\n status: number | string;\n message: string;\n data: T | null;\n};\n\nexport type ToolkitActionOptions = {\n headers?: QueryHeaders;\n extras?: { skipCache?: boolean };\n};\n\n/**\n * The toolkit-shaped args of a query creator: `queryParams` holds the path params, `params` the query string and\n * `body` the body, the way `@tomtomb/ngrx-toolkit` action groups named them.\n */\nexport type ActionCallArgs<TCreator extends AnyQueryCreator> = {\n [\n K in keyof QueryArgsOf<TCreator> as K extends 'pathParams'\n ? 'queryParams'\n : K extends 'queryParams'\n ? 'params'\n : K extends 'body'\n ? 'body'\n : never\n ]: QueryArgsOf<TCreator>[K];\n} & { actionOptions?: ToolkitActionOptions };\n\nexport type ToolkitPollingOptions = {\n intervalDuration: number;\n killSwitch: Subject<boolean>;\n};\n\n/** The handle `toolkitCall` returns, shaped like the `MappedEntityState` of `@tomtomb/ngrx-toolkit`. */\nexport type MappedEntityState<TCreator extends AnyQueryCreator> = {\n response$: Observable<ResponseType<QueryArgsOf<TCreator>> | null>;\n cachedResponse$: Observable<ResponseType<QueryArgsOf<TCreator>>>;\n error$: Observable<ToolkitError | null>;\n args$: Observable<ActionCallArgs<TCreator> | null>;\n isInit$: Observable<boolean | null>;\n isLoading$: Observable<boolean | null>;\n isSuccess$: Observable<boolean | null>;\n isError$: Observable<boolean | null>;\n timestamp$: Observable<number | null>;\n callState$: Observable<CallState | null>;\n refresh: () => void;\n remove: () => void;\n startPolling: (options: ToolkitPollingOptions) => void;\n stopPolling: () => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyMappedEntityState = MappedEntityState<any>;\n","import { computed, DestroyRef, effect, EnvironmentInjector, isDevMode, signal, untracked } from '@angular/core';\nimport {\n AnyQueryCreator,\n QueryArgsOf,\n QueryErrorResponse,\n QueryExecutionState,\n RequestArgs,\n ResponseType,\n} from '@ethlete/query';\nimport {\n defer,\n distinctUntilChanged,\n filter,\n finalize,\n interval,\n map,\n Observable,\n of,\n startWith,\n Subject,\n Subscription,\n takeUntil,\n} from 'rxjs';\nimport {\n ActionCallArgs,\n AnyMappedEntityState,\n CallState,\n MappedEntityState,\n ToolkitError,\n ToolkitPollingOptions,\n} from './toolkit-types';\n\ntype ToolkitHandleSnapshot = {\n args: unknown;\n callState: CallState | null;\n response: unknown;\n error: ToolkitError | null;\n timestamp: number | null;\n};\n\nexport type ToolkitHandleEntry = {\n handle: AnyMappedEntityState;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n call: (args: ActionCallArgs<any>) => void;\n releaseWhenSettled: () => void;\n};\n\nconst EMPTY_SNAPSHOT: ToolkitHandleSnapshot = {\n args: null,\n callState: null,\n response: null,\n error: null,\n timestamp: null,\n};\n\nconst toCallState = (state: QueryExecutionState<never> | null): CallState => {\n switch (state?.type) {\n case 'success':\n return CallState.SUCCESS;\n case 'failure':\n return CallState.ERROR;\n default:\n return CallState.LOADING;\n }\n};\n\nconst toToolkitError = (error: QueryErrorResponse): ToolkitError => ({\n status: error.raw.status,\n message: error.raw.message,\n data: error.raw.error ?? null,\n});\n\nconst handleReleasedMessage = (method: 'refresh' | 'startPolling') =>\n `${method}() was called on a toolkit handle that a newer toolkitCall() released. Args that cannot be hashed ` +\n `(FormData, Blob, Map, ...) never share a handle, so the next call for the same creator releases the previous ` +\n `handle once its request settles. The call was ignored - call toolkitCall() again with the args instead of ` +\n `reusing the old handle. This warning is shown once per handle.`;\n\nexport const toQueryArgs = (args: Record<string, unknown>) => {\n const actionOptions = args['actionOptions'] as { headers?: unknown } | undefined;\n const queryArgs: Record<string, unknown> = {};\n\n if (args['queryParams'] !== undefined) queryArgs['pathParams'] = args['queryParams'];\n if (args['params'] !== undefined) queryArgs['queryParams'] = args['params'];\n if (args['body'] !== undefined) queryArgs['body'] = args['body'];\n if (actionOptions?.headers !== undefined) queryArgs['headers'] = actionOptions.headers;\n\n return queryArgs as RequestArgs<never>;\n};\n\nexport const createToolkitHandle = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n injector: EnvironmentInjector,\n): ToolkitHandleEntry => {\n const query = creator({ injector, onlyManualExecution: true, silenceMissingWithArgsFeatureError: true });\n\n const calledArgs = signal<ActionCallArgs<TCreator> | null>(null);\n const toolkitError = computed(() => {\n const error = query.error();\n\n return error ? toToolkitError(error) : null;\n });\n const snapshot = computed<ToolkitHandleSnapshot>(() => {\n const currentArgs = calledArgs();\n\n if (!currentArgs) return EMPTY_SNAPSHOT;\n\n const state = query.executionState();\n const callState = toCallState(state);\n\n return {\n args: currentArgs,\n callState,\n response: state?.type === 'success' ? state.response : null,\n error: callState === CallState.ERROR ? toolkitError() : null,\n timestamp: Date.now(),\n };\n });\n\n const changes = new Subject<ToolkitHandleSnapshot>();\n\n const changesEffect = effect(\n () => {\n const current = snapshot();\n untracked(() => changes.next(current));\n },\n { injector },\n );\n\n let releasedSnapshot: ToolkitHandleSnapshot | null = null;\n let warnedAboutRelease = false;\n\n const ignoredAfterRelease = (method: 'refresh' | 'startPolling') => {\n if (!releasedSnapshot) return false;\n\n if (isDevMode() && !warnedAboutRelease) {\n warnedAboutRelease = true;\n console.warn(handleReleasedMessage(method));\n }\n\n return true;\n };\n\n const select = <T>(pick: (current: ToolkitHandleSnapshot) => T): Observable<T> =>\n defer(() => (releasedSnapshot ? of(releasedSnapshot) : changes.pipe(startWith(untracked(snapshot))))).pipe(\n map(pick),\n distinctUntilChanged(),\n );\n\n const call = (args: ActionCallArgs<TCreator>) => {\n calledArgs.set(args);\n query.execute({ args: toQueryArgs(args as Record<string, unknown>) });\n };\n\n const refresh = () => {\n if (ignoredAfterRelease('refresh')) return;\n\n const lastArgs = untracked(calledArgs);\n\n if (lastArgs) call(lastArgs);\n };\n\n let pollingSubscription = Subscription.EMPTY;\n\n const stopPolling = () => pollingSubscription.unsubscribe();\n\n const startPolling = ({ intervalDuration, killSwitch }: ToolkitPollingOptions) => {\n if (ignoredAfterRelease('startPolling') || !pollingSubscription.closed) return;\n\n pollingSubscription = interval(intervalDuration)\n .pipe(\n takeUntil(killSwitch),\n finalize(() => (pollingSubscription = Subscription.EMPTY)),\n )\n .subscribe(() => refresh());\n };\n\n const remove = () => {\n stopPolling();\n calledArgs.set(null);\n query.reset();\n };\n\n const removeDestroyListener = injector.get(DestroyRef).onDestroy(() => {\n stopPolling();\n changes.complete();\n });\n\n const release = () => {\n releasedSnapshot = untracked(snapshot);\n stopPolling();\n changesEffect.destroy();\n removeDestroyListener();\n changes.complete();\n query.subtle.destroy();\n };\n\n const releaseWhenSettled = () => {\n const releaseEffect = effect(\n () => {\n if (snapshot().callState === CallState.LOADING) return;\n\n releaseEffect.destroy();\n untracked(release);\n },\n { injector },\n );\n };\n\n type TResponse = ResponseType<QueryArgsOf<TCreator>>;\n\n const response$ = select((current) => current.response as TResponse | null);\n\n const handle: MappedEntityState<TCreator> = {\n response$,\n cachedResponse$: response$.pipe(filter((response): response is TResponse => !!response)),\n error$: select((current) => current.error),\n args$: select((current) => current.args as ActionCallArgs<TCreator> | null),\n isInit$: select((current) => current.callState === CallState.INIT),\n isLoading$: select((current) => current.callState === CallState.LOADING),\n isSuccess$: select((current) => current.callState === CallState.SUCCESS),\n isError$: select((current) => current.callState === CallState.ERROR),\n timestamp$: select((current) => current.timestamp),\n callState$: select((current) => current.callState),\n refresh,\n remove,\n startPolling,\n stopPolling,\n };\n\n return { handle, call, releaseWhenSettled };\n};\n","import { assertInInjectionContext, EnvironmentInjector, inject, Injector } from '@angular/core';\nimport { AnyQueryCreator, QueryHeaders, RequestArgs, resolveQueryHeaders } from '@ethlete/query';\nimport { createToolkitHandle, ToolkitHandleEntry, toQueryArgs } from './toolkit-handle';\nimport { ActionCallArgs, MappedEntityState } from './toolkit-types';\n\nexport type ToolkitCallOptions = {\n /**\n * The injector the handle's query lives in. Required outside an injection context, which is where a\n * `providedIn: 'root'` facade calls from; pass the facade's `inject(Injector)`.\n */\n injector?: Injector;\n};\n\ntype ToolkitRegistry = {\n shared: WeakMap<AnyQueryCreator, Map<string, ToolkitHandleEntry>>;\n latestUnshared: WeakMap<AnyQueryCreator, ToolkitHandleEntry>;\n};\n\nconst registries = /* @__PURE__ */ new WeakMap<EnvironmentInjector, ToolkitRegistry>();\n\nclass UnhashableValueError extends Error {}\n\nconst isPlainObject = (value: object) => {\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n};\n\nconst hashableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(hashableValue);\n if (typeof value !== 'object' || value === null) return value;\n if (value instanceof Date) return { '\\u0000date': value.getTime() };\n if (!isPlainObject(value)) throw new UnhashableValueError();\n\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, hashableValue((value as Record<string, unknown>)[key])]),\n );\n};\n\nconst hashableHeaders = (headers: QueryHeaders | undefined) => {\n const resolved = resolveQueryHeaders(headers);\n\n return resolved\n ?.keys()\n .map((name) => name.toLowerCase())\n .sort()\n .map((name) => [name, resolved.getAll(name)]);\n};\n\n/**\n * Returns `null` for args holding a value JSON cannot represent (FormData, Blob, Map, ...). Those never share a handle,\n * and each one is released once the next one for the same creator starts and its own call has settled.\n */\nconst hashArgs = (args: RequestArgs<never>) => {\n const { headers, ...rest } = args as { headers?: QueryHeaders };\n\n try {\n return JSON.stringify([hashableValue(rest), hashableHeaders(headers) ?? null]);\n } catch (error) {\n if (error instanceof UnhashableValueError) return null;\n\n throw error;\n }\n};\n\nconst resolveEnvironmentInjector = (fn: (...args: never[]) => unknown, options?: ToolkitCallOptions) => {\n if (options?.injector) return options.injector.get(EnvironmentInjector);\n\n assertInInjectionContext(fn);\n\n return inject(EnvironmentInjector);\n};\n\nconst resolveEntry = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n args: ActionCallArgs<TCreator>,\n injector: EnvironmentInjector,\n) => {\n let registry = registries.get(injector);\n\n if (!registry) {\n registry = { shared: new WeakMap(), latestUnshared: new WeakMap() };\n registries.set(injector, registry);\n }\n\n const key = hashArgs(toQueryArgs(args as Record<string, unknown>));\n\n if (key === null) {\n const entry = createToolkitHandle(creator, injector);\n\n registry.latestUnshared.get(creator)?.releaseWhenSettled();\n registry.latestUnshared.set(creator, entry);\n\n return entry;\n }\n\n let entries = registry.shared.get(creator);\n\n if (!entries) {\n entries = new Map();\n registry.shared.set(creator, entries);\n }\n\n let entry = entries.get(key);\n\n if (!entry) {\n entry = createToolkitHandle(creator, injector);\n entries.set(key, entry);\n }\n\n return entry;\n};\n\n/**\n * Returns the handle for a creator and args without executing it - the `FacadeBase.select(group, actionId)` of\n * `@tomtomb/ngrx-toolkit`. Args that build the same request (in any key order, other keys ignored) give the same\n * handle `toolkitCall` returns, so `toolkitSelect(getTeam, args, { injector }).refresh()` re-runs a request another\n * component started.\n */\nexport const toolkitSelect = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n args: ActionCallArgs<TCreator>,\n options?: ToolkitCallOptions,\n): MappedEntityState<TCreator> =>\n resolveEntry(creator, args, resolveEnvironmentInjector(toolkitSelect, options)).handle;\n\n/**\n * Executes a query creator with toolkit-shaped args and returns its handle - the `FacadeBase.call(group, args)` of\n * `@tomtomb/ngrx-toolkit`. Every call sends the request again, unless one with equal args is still in flight, which it\n * joins; equal args return the same handle, which lives as long as the injector.\n *\n * @example\n * ```ts\n * @Injectable({ providedIn: 'root' })\n * export class TeamFacade {\n * private injector = inject(Injector);\n *\n * getTeam(args: ActionCallArgs<typeof getTeam>) {\n * return toolkitCall(getTeam, args, { injector: this.injector });\n * }\n * }\n * ```\n */\nexport const toolkitCall = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n args: ActionCallArgs<TCreator>,\n options?: ToolkitCallOptions,\n): MappedEntityState<TCreator> => {\n const entry = resolveEntry(creator, args, resolveEnvironmentInjector(toolkitCall, options));\n\n entry.call(args);\n\n return entry.handle;\n};\n","import { combineLatest, map, Observable } from 'rxjs';\nimport { ToolkitError } from './toolkit-types';\n\n/** Emits `true` while any of the given loading streams is `true`. Nullish entries are skipped. */\nexport const joinLoading = (observables: (Observable<boolean | null> | null | undefined)[]): Observable<boolean> =>\n combineLatest(observables.filter((o): o is Observable<boolean | null> => !!o)).pipe(\n map((values) => values.some((value) => !!value)),\n );\n\n/** Emits every non-null error of the given error streams, or `null` when there is none. Nullish entries are skipped. */\nexport const joinErrors = (\n observables: (Observable<ToolkitError | null> | null | undefined)[],\n): Observable<ToolkitError[] | null> =>\n combineLatest(observables.filter((o): o is Observable<ToolkitError | null> => !!o)).pipe(\n map((values) => {\n const errors = values.filter((value): value is ToolkitError => !!value);\n\n return errors.length ? errors : null;\n }),\n );\n"],"mappings":"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"}
|