@ethlete/query 6.0.0-next.54 → 6.0.0-next.56
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 +61 -0
- package/fesm2022/ethlete-query-devtools-contract.mjs +6 -0
- package/fesm2022/ethlete-query-devtools-contract.mjs.map +1 -0
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs +2 -2
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs.map +1 -1
- package/fesm2022/ethlete-query-testing.mjs +42 -21
- package/fesm2022/ethlete-query-testing.mjs.map +1 -1
- package/fesm2022/ethlete-query.mjs +2059 -1289
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/generators/generators.json +10 -0
- package/generators/migrate-query-client-features/migration.js +10 -8
- package/generators/migrate-to-query-v3/legacy-query-creator-migration.js +1 -1
- package/generators/migrate-to-query-v3/report.js +1 -1
- 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/report-legacy-query-apis/migration.js +256 -0
- package/generators/report-legacy-query-apis/schema.json +25 -0
- package/migrations.json +26 -0
- package/package.json +12 -16
- package/types/ethlete-query-devtools-contract.d.ts +1 -0
- package/types/ethlete-query-ngrx-toolkit.d.ts +2 -2
- package/types/ethlete-query-testing.d.ts +42 -82
- package/types/ethlete-query.d.ts +1092 -815
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/schema",
|
|
3
|
+
"$id": "report-legacy-query-apis",
|
|
4
|
+
"title": "Report legacy query collections, infinity queries, *etQuery templates and entity stores",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"projects": {
|
|
8
|
+
"type": "array",
|
|
9
|
+
"items": {
|
|
10
|
+
"type": "string"
|
|
11
|
+
},
|
|
12
|
+
"description": "Nx projects to scan. Defaults to every project in the workspace.",
|
|
13
|
+
"alias": "project"
|
|
14
|
+
},
|
|
15
|
+
"include": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"description": "Path prefixes to scan, relative to the workspace root (e.g. 'libs/queries'). Unioned with `projects`. Defaults to the whole workspace.",
|
|
21
|
+
"alias": "includePath"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"required": []
|
|
25
|
+
}
|
package/migrations.json
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"name": "to-query-v3",
|
|
5
5
|
"version": "5.42.0",
|
|
6
6
|
"kind": "auto",
|
|
7
|
+
"level": "optional",
|
|
7
8
|
"description": "Move the legacy query system onto the new one through the interop layer.",
|
|
8
9
|
"generator": "@ethlete/query:migrate-to-query-v3",
|
|
9
10
|
"docs": "/query/migrating-from-v2"
|
|
@@ -12,6 +13,7 @@
|
|
|
12
13
|
"name": "prep-for-query-v3",
|
|
13
14
|
"version": "6.0.0-beta.8",
|
|
14
15
|
"kind": "auto",
|
|
16
|
+
"level": "required",
|
|
15
17
|
"description": "Prepare the call sites the v3 query system changes, before the move itself.",
|
|
16
18
|
"generator": "@ethlete/query:prep-for-query-v3",
|
|
17
19
|
"docs": "/query/migrating-from-v2"
|
|
@@ -20,6 +22,7 @@
|
|
|
20
22
|
"name": "query-client-features",
|
|
21
23
|
"version": "6.0.0-next.23",
|
|
22
24
|
"kind": "auto",
|
|
25
|
+
"level": "required",
|
|
23
26
|
"description": "Move the createQueryClient multiTabSync and persistence options onto opt-in features.",
|
|
24
27
|
"generator": "@ethlete/query:migrate-query-client-features",
|
|
25
28
|
"docs": "/query/features"
|
|
@@ -28,6 +31,7 @@
|
|
|
28
31
|
"name": "query-opt-in-features",
|
|
29
32
|
"version": "6.0.0-next.23",
|
|
30
33
|
"kind": "auto",
|
|
34
|
+
"level": "required",
|
|
31
35
|
"description": "Move query clients onto the opt-in error pipeline, and bearer auth onto the opt-in multi-tab sync feature.",
|
|
32
36
|
"generator": "@ethlete/query:migrate-query-opt-in-features",
|
|
33
37
|
"docs": "/query/features"
|
|
@@ -36,6 +40,7 @@
|
|
|
36
40
|
"name": "deprecate-legacy-queries",
|
|
37
41
|
"version": "6.0.0-next.24",
|
|
38
42
|
"kind": "auto",
|
|
43
|
+
"level": "recommended",
|
|
39
44
|
"description": "Mark the remaining createLegacyQueryCreator wrappers as deprecated, so their call sites surface as still on v2.",
|
|
40
45
|
"generator": "@ethlete/query:deprecate-legacy-queries",
|
|
41
46
|
"docs": "/query/legacy"
|
|
@@ -44,6 +49,7 @@
|
|
|
44
49
|
"name": "search-query-field-string",
|
|
45
50
|
"version": "6.0.0-next.52",
|
|
46
51
|
"kind": "assisted",
|
|
52
|
+
"level": "required",
|
|
47
53
|
"description": "searchQueryField() is typed string and starts at '' instead of null; writes and checks of null move to ''.",
|
|
48
54
|
"instructions": "./migrations/search-query-field-string.md",
|
|
49
55
|
"docs": "/query/query-forms"
|
|
@@ -52,9 +58,29 @@
|
|
|
52
58
|
"name": "query-field-default-types",
|
|
53
59
|
"version": "6.0.0-next.52",
|
|
54
60
|
"kind": "assisted",
|
|
61
|
+
"level": "required",
|
|
55
62
|
"description": "queryField() is typed by its default and reads the URL into that type; fields without a default or with a non-primitive one need a queryParamToValue.",
|
|
56
63
|
"instructions": "./migrations/query-field-default-types.md",
|
|
57
64
|
"docs": "/query/query-forms"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"name": "report-legacy-query-apis",
|
|
68
|
+
"version": "6.0.0-next.55",
|
|
69
|
+
"kind": "auto",
|
|
70
|
+
"level": "optional",
|
|
71
|
+
"description": "List every query collection, infinity query, *etQuery template and entity store that still needs a hand edit in query-v3-migration-tasks.md.",
|
|
72
|
+
"generator": "@ethlete/query:report-legacy-query-apis",
|
|
73
|
+
"scan": "@ethlete/query:report-legacy-query-apis",
|
|
74
|
+
"docs": "/query/migrating-from-v2"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "devtools-contract-entry-point",
|
|
78
|
+
"version": "6.0.0-next.55",
|
|
79
|
+
"kind": "auto",
|
|
80
|
+
"level": "required",
|
|
81
|
+
"description": "Import the devtools contract (the names @ethlete/query-devtools reads) from @ethlete/query/devtools-contract instead of @ethlete/query.",
|
|
82
|
+
"generator": "@ethlete/query:move-devtools-contract-imports",
|
|
83
|
+
"docs": "/query-devtools/#the-devtools-contract"
|
|
58
84
|
}
|
|
59
85
|
]
|
|
60
86
|
}
|
package/package.json
CHANGED
|
@@ -1,33 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ethlete/query",
|
|
3
|
-
"version": "6.0.0-next.
|
|
3
|
+
"version": "6.0.0-next.56",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"peerDependencies": {
|
|
7
|
-
"@
|
|
8
|
-
"@angular/
|
|
9
|
-
"@angular/
|
|
10
|
-
"@angular/
|
|
11
|
-
"@angular/router": "22.1.6",
|
|
7
|
+
"@angular/common": "^22.1.0",
|
|
8
|
+
"@angular/core": "^22.1.0",
|
|
9
|
+
"@angular/forms": "^22.1.0",
|
|
10
|
+
"@angular/router": "^22.1.0",
|
|
12
11
|
"@ethlete/core": "^5.0.0-beta.11",
|
|
13
12
|
"@ethlete/types": "^2.0.0-beta.4",
|
|
14
|
-
"@nx/devkit": "23.
|
|
15
|
-
"rxjs": "7.8.
|
|
16
|
-
"typescript": "6.0.
|
|
17
|
-
"vite": "8.1.5"
|
|
13
|
+
"@nx/devkit": "^23.0.0",
|
|
14
|
+
"rxjs": "^7.8.0",
|
|
15
|
+
"typescript": "^6.0.0"
|
|
18
16
|
},
|
|
19
17
|
"peerDependenciesMeta": {
|
|
20
|
-
"@analogjs/vite-plugin-angular": {
|
|
21
|
-
"optional": true
|
|
22
|
-
},
|
|
23
18
|
"@nx/devkit": {
|
|
24
19
|
"optional": true
|
|
25
20
|
},
|
|
26
21
|
"typescript": {
|
|
27
22
|
"optional": true
|
|
28
|
-
},
|
|
29
|
-
"vite": {
|
|
30
|
-
"optional": true
|
|
31
23
|
}
|
|
32
24
|
},
|
|
33
25
|
"ethlete": {
|
|
@@ -44,6 +36,10 @@
|
|
|
44
36
|
"types": "./types/ethlete-query.d.ts",
|
|
45
37
|
"default": "./fesm2022/ethlete-query.mjs"
|
|
46
38
|
},
|
|
39
|
+
"./devtools-contract": {
|
|
40
|
+
"types": "./types/ethlete-query-devtools-contract.d.ts",
|
|
41
|
+
"default": "./fesm2022/ethlete-query-devtools-contract.mjs"
|
|
42
|
+
},
|
|
47
43
|
"./ngrx-toolkit": {
|
|
48
44
|
"types": "./types/ethlete-query-ngrx-toolkit.d.ts",
|
|
49
45
|
"default": "./fesm2022/ethlete-query-ngrx-toolkit.mjs"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ɵDescribableFeature as DescribableFeature, ɵEMPTY_QUERY_DEVTOOLS_FAULT as EMPTY_QUERY_DEVTOOLS_FAULT, ɵJsonPath as JsonPath, ɵ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, ɵOverrideOp as OverrideOp, ɵQUERY_DEVTOOLS_FAULT_STATUSES as QUERY_DEVTOOLS_FAULT_STATUSES, ɵQUERY_DEVTOOLS_TOKEN_TTL_LIMIT as QUERY_DEVTOOLS_TOKEN_TTL_LIMIT, ɵQueryDevtoolsAbout as QueryDevtoolsAbout, ɵQueryDevtoolsAuthAccountView as QueryDevtoolsAuthAccountView, ɵQueryDevtoolsAuthLocalAccount as QueryDevtoolsAuthLocalAccount, ɵQueryDevtoolsAuthProviderHandle as QueryDevtoolsAuthProviderHandle, ɵQueryDevtoolsAuthProviderRegistration as QueryDevtoolsAuthProviderRegistration, ɵQueryDevtoolsAuthQuery as QueryDevtoolsAuthQuery, ɵQueryDevtoolsAuthSeed as QueryDevtoolsAuthSeed, ɵQueryDevtoolsAuthSession as QueryDevtoolsAuthSession, ɵQueryDevtoolsEntry as QueryDevtoolsEntry, ɵQueryDevtoolsEntryKind as QueryDevtoolsEntryKind, ɵQueryDevtoolsEntryMeta as QueryDevtoolsEntryMeta, ɵQueryDevtoolsFault as QueryDevtoolsFault, ɵQueryDevtoolsFaultTarget as QueryDevtoolsFaultTarget, ɵQueryDevtoolsFeature as QueryDevtoolsFeature, ɵQueryDevtoolsFormField as QueryDevtoolsFormField, ɵQueryDevtoolsFormHandle as QueryDevtoolsFormHandle, ɵQueryDevtoolsFormLinksHandle as QueryDevtoolsFormLinksHandle, ɵQueryDevtoolsFormLinksRecorder as QueryDevtoolsFormLinksRecorder, ɵQueryDevtoolsMock as QueryDevtoolsMock, ɵQueryDevtoolsMockTarget as QueryDevtoolsMockTarget, ɵQueryDevtoolsOverrideEntry as QueryDevtoolsOverrideEntry, ɵQueryDevtoolsOverrideTransfer as QueryDevtoolsOverrideTransfer, ɵQueryDevtoolsOverrideTransferParse as QueryDevtoolsOverrideTransferParse, ɵQueryDevtoolsOverridesHandle as QueryDevtoolsOverridesHandle, ɵQueryDevtoolsOverridesRecorder as QueryDevtoolsOverridesRecorder, ɵQueryDevtoolsPayload as QueryDevtoolsPayload, ɵQueryDevtoolsRegistrar as QueryDevtoolsRegistrar, ɵQueryDevtoolsRegistration as QueryDevtoolsRegistration, ɵQueryDevtoolsResolvedFault as QueryDevtoolsResolvedFault, ɵQueryDevtoolsResolvedMock as QueryDevtoolsResolvedMock, ɵQueryDevtoolsRoutePart as QueryDevtoolsRoutePart, ɵQueryDevtoolsRun as QueryDevtoolsRun, ɵQueryDevtoolsRunError as QueryDevtoolsRunError, ɵQueryDevtoolsRunStatus as QueryDevtoolsRunStatus, ɵQueryDevtoolsSchemaComponents as QueryDevtoolsSchemaComponents, ɵQueryDevtoolsSchemaRoute as QueryDevtoolsSchemaRoute, ɵQueryDevtoolsSchemaSeed as QueryDevtoolsSchemaSeed, ɵQueryDevtoolsSchemaState as QueryDevtoolsSchemaState, ɵQueryDevtoolsSeedStyle as QueryDevtoolsSeedStyle, ɵQueryDevtoolsSettings as QueryDevtoolsSettings, ɵQueryDevtoolsStats as QueryDevtoolsStats, ɵQueryDevtoolsStatsHandle as QueryDevtoolsStatsHandle, ɵQueryDevtoolsStatsRecorder as QueryDevtoolsStatsRecorder, ɵQueryDevtoolsStorageScope as QueryDevtoolsStorageScope, ɵRestoredQueryDevtoolsOverrides as RestoredQueryDevtoolsOverrides, ɵ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';
|
|
@@ -117,8 +117,8 @@ type ToolkitCallOptions = {
|
|
|
117
117
|
declare const toolkitSelect: <TCreator extends AnyQueryCreator>(creator: TCreator, args: ActionCallArgs<TCreator>, options?: ToolkitCallOptions) => MappedEntityState<TCreator>;
|
|
118
118
|
/**
|
|
119
119
|
* Executes a query creator with toolkit-shaped args and returns its handle - the `FacadeBase.call(group, args)` of
|
|
120
|
-
* `@tomtomb/ngrx-toolkit`. Every call sends the request again
|
|
121
|
-
* long as the injector.
|
|
120
|
+
* `@tomtomb/ngrx-toolkit`. Every call sends the request again, unless one with equal args is still in flight, which it
|
|
121
|
+
* joins; equal args return the same handle, which lives as long as the injector.
|
|
122
122
|
*
|
|
123
123
|
* @example
|
|
124
124
|
* ```ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnyCreateQueryClientResult, QueryClientRef, createGetQuery, createPostQuery, createPutQuery, createPatchQuery, createDeleteQuery, BearerAuthProviderFeatureContext, AnyQueryBuilder,
|
|
1
|
+
import { AnyCreateQueryClientResult, QueryClientRef, createGetQuery, createPostQuery, createPutQuery, createPatchQuery, createDeleteQuery, BearerAuthProviderFeatureContext, AnyQueryBuilder, AuthQueryBuilder, TokenRefreshQueryBuilder, BearerAuthProvider, FeatureRegistry, TokenRefreshQueryConfig, QueryPersistenceAdapter, PersistedQueryEntry, WebSocketClientIo, SocketMessageView } from '@ethlete/query';
|
|
2
2
|
import { HttpClient } from '@angular/common/http';
|
|
3
3
|
import { HttpTestingController } from '@angular/common/http/testing';
|
|
4
4
|
import { Injector } from '@angular/core';
|
|
@@ -16,15 +16,20 @@ type QueryTestSetup = {
|
|
|
16
16
|
createPatch: ReturnType<typeof createPatchQuery>;
|
|
17
17
|
createDelete: ReturnType<typeof createDeleteQuery>;
|
|
18
18
|
/**
|
|
19
|
-
* Puts back the `console.
|
|
20
|
-
*
|
|
19
|
+
* Puts back the `console.error` that was installed before the first {@link setupQueryTest} call. Runs
|
|
20
|
+
* on its own when the `TestBed` module is reset; idempotent, and safe to call from any setup.
|
|
21
21
|
*/
|
|
22
22
|
restoreConsole: () => void;
|
|
23
23
|
};
|
|
24
24
|
type QueryTestSetupConfig = {
|
|
25
25
|
baseUrl?: string;
|
|
26
26
|
name?: string;
|
|
27
|
-
|
|
27
|
+
/**
|
|
28
|
+
* `true` swallows the `ErrorHandler` reports of failed requests and rethrows every other error, `'all'`
|
|
29
|
+
* swallows everything, `false` keeps Angular's own handler.
|
|
30
|
+
* @default true
|
|
31
|
+
*/
|
|
32
|
+
mockErrorHandler?: boolean | 'all';
|
|
28
33
|
};
|
|
29
34
|
declare const setupQueryTest: (config?: QueryTestSetupConfig) => QueryTestSetup;
|
|
30
35
|
|
|
@@ -32,38 +37,25 @@ type AnyFeatureBuilder = (context: BearerAuthProviderFeatureContext<any, readonl
|
|
|
32
37
|
type: string;
|
|
33
38
|
instance: unknown;
|
|
34
39
|
};
|
|
35
|
-
type
|
|
36
|
-
body: Record<string, unknown>;
|
|
37
|
-
response: {
|
|
38
|
-
accessToken: string;
|
|
39
|
-
refreshToken: string;
|
|
40
|
-
};
|
|
41
|
-
} = {
|
|
42
|
-
body: Record<string, unknown>;
|
|
43
|
-
response: {
|
|
44
|
-
accessToken: string;
|
|
45
|
-
refreshToken: string;
|
|
46
|
-
};
|
|
47
|
-
}, TRefreshArgs extends {
|
|
48
|
-
body: Record<string, unknown>;
|
|
49
|
-
response: {
|
|
50
|
-
accessToken: string;
|
|
51
|
-
refreshToken: string;
|
|
52
|
-
};
|
|
53
|
-
} = {
|
|
40
|
+
type AuthTestArgs = {
|
|
54
41
|
body: Record<string, unknown>;
|
|
55
42
|
response: {
|
|
56
43
|
accessToken: string;
|
|
57
44
|
refreshToken: string;
|
|
58
45
|
};
|
|
59
|
-
}
|
|
46
|
+
};
|
|
47
|
+
/** The query builders of the provider {@link setupAuthTest} builds: a `login` and a `refresh` query. */
|
|
48
|
+
type AuthTestQueryBuilders<TLoginArgs extends AuthTestArgs = AuthTestArgs, TRefreshArgs extends AuthTestArgs = AuthTestArgs> = [AuthQueryBuilder<'login', TLoginArgs>, TokenRefreshQueryBuilder<'refresh', TRefreshArgs>];
|
|
49
|
+
/** A feature for the provider {@link setupAuthTest} builds, typed against its `login`/`refresh` queries. */
|
|
50
|
+
type AuthTestFeatureBuilder = (context: BearerAuthProviderFeatureContext<any, AuthTestQueryBuilders>) => unknown;
|
|
51
|
+
type AuthTestSetupConfig<TLoginArgs extends AuthTestArgs = AuthTestArgs, TRefreshArgs extends AuthTestArgs = AuthTestArgs, TFeatures extends readonly AuthTestFeatureBuilder[] = [], TBearerData = unknown> = {
|
|
60
52
|
/** The query test setup instance */
|
|
61
53
|
querySetup: QueryTestSetup;
|
|
62
54
|
/** Login endpoint path. Default: '/auth/login' */
|
|
63
55
|
loginPath?: string;
|
|
64
56
|
/** Refresh endpoint path. Default: '/auth/refresh' */
|
|
65
57
|
refreshPath?: string;
|
|
66
|
-
/** Whether to
|
|
58
|
+
/** Whether to refresh and retry a secure request that answers 401. Default: true, as in production */
|
|
67
59
|
autoRetryOn401?: boolean;
|
|
68
60
|
/** Function to extract tokens from login response */
|
|
69
61
|
extractLoginTokens?: (response: TLoginArgs['response']) => {
|
|
@@ -78,7 +70,7 @@ type AuthTestSetupConfig<TLoginArgs extends {
|
|
|
78
70
|
/** Builds the refresh request from the refresh token. See TokenRefreshQueryConfig for details */
|
|
79
71
|
buildRefreshArgs?: TokenRefreshQueryConfig<TRefreshArgs>['buildArgs'];
|
|
80
72
|
/** Feature builders for additional auth functionality */
|
|
81
|
-
features?:
|
|
73
|
+
features?: TFeatures;
|
|
82
74
|
/** Custom bearer decrypt function for testing */
|
|
83
75
|
bearerDecryptFn?: (token: string) => TBearerData;
|
|
84
76
|
/** Refresh strategy configuration. See TokenRefreshQueryConfig for details */
|
|
@@ -92,36 +84,11 @@ type AuthTestSetupConfig<TLoginArgs extends {
|
|
|
92
84
|
/** What to do when the refresh query fails for good. Defaults to the provider's own policy */
|
|
93
85
|
onRefreshFailure?: TokenRefreshQueryConfig<TRefreshArgs>['onRefreshFailure'];
|
|
94
86
|
};
|
|
95
|
-
type AuthTestSetup<TLoginArgs extends {
|
|
96
|
-
body: Record<string, unknown>;
|
|
97
|
-
response: {
|
|
98
|
-
accessToken: string;
|
|
99
|
-
refreshToken: string;
|
|
100
|
-
};
|
|
101
|
-
} = {
|
|
102
|
-
body: Record<string, unknown>;
|
|
103
|
-
response: {
|
|
104
|
-
accessToken: string;
|
|
105
|
-
refreshToken: string;
|
|
106
|
-
};
|
|
107
|
-
}, TRefreshArgs extends {
|
|
108
|
-
body: Record<string, unknown>;
|
|
109
|
-
response: {
|
|
110
|
-
accessToken: string;
|
|
111
|
-
refreshToken: string;
|
|
112
|
-
};
|
|
113
|
-
} = {
|
|
114
|
-
body: Record<string, unknown>;
|
|
115
|
-
response: {
|
|
116
|
-
accessToken: string;
|
|
117
|
-
refreshToken: string;
|
|
118
|
-
};
|
|
119
|
-
}, TFeatures extends readonly AnyFeatureBuilder[] = [], TBearerData = unknown> = {
|
|
87
|
+
type AuthTestSetup<TLoginArgs extends AuthTestArgs = AuthTestArgs, TRefreshArgs extends AuthTestArgs = AuthTestArgs, TFeatures extends readonly AuthTestFeatureBuilder[] = [], TBearerData = unknown> = {
|
|
120
88
|
/** The bearer auth provider instance */
|
|
121
|
-
auth: BearerAuthProvider<[
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
], TFeatures, TBearerData>;
|
|
89
|
+
auth: Omit<BearerAuthProvider<AuthTestQueryBuilders<TLoginArgs, TRefreshArgs>, [], TBearerData>, 'features'> & {
|
|
90
|
+
features: FeatureRegistry<TFeatures, AuthTestQueryBuilders<TLoginArgs, TRefreshArgs>>;
|
|
91
|
+
};
|
|
125
92
|
/** Helper to login a user and flush the HTTP request */
|
|
126
93
|
login: (credentials: TLoginArgs['body'], response: TLoginArgs['response']) => void;
|
|
127
94
|
/** Helper to trigger a refresh and flush the HTTP request. Sends `buildRefreshArgs(token)` when configured, else `{ body: { token } }` */
|
|
@@ -129,31 +96,7 @@ type AuthTestSetup<TLoginArgs extends {
|
|
|
129
96
|
/** Helper to make a secure request that requires authentication */
|
|
130
97
|
makeSecureRequest: (route: string) => void;
|
|
131
98
|
};
|
|
132
|
-
declare const setupAuthTest: <TLoginArgs extends
|
|
133
|
-
body: Record<string, unknown>;
|
|
134
|
-
response: {
|
|
135
|
-
accessToken: string;
|
|
136
|
-
refreshToken: string;
|
|
137
|
-
};
|
|
138
|
-
} = {
|
|
139
|
-
body: Record<string, unknown>;
|
|
140
|
-
response: {
|
|
141
|
-
accessToken: string;
|
|
142
|
-
refreshToken: string;
|
|
143
|
-
};
|
|
144
|
-
}, TRefreshArgs extends {
|
|
145
|
-
body: Record<string, unknown>;
|
|
146
|
-
response: {
|
|
147
|
-
accessToken: string;
|
|
148
|
-
refreshToken: string;
|
|
149
|
-
};
|
|
150
|
-
} = {
|
|
151
|
-
body: Record<string, unknown>;
|
|
152
|
-
response: {
|
|
153
|
-
accessToken: string;
|
|
154
|
-
refreshToken: string;
|
|
155
|
-
};
|
|
156
|
-
}, TFeatures extends readonly AnyFeatureBuilder[] = readonly AnyFeatureBuilder[], TBearerData = unknown>(config: AuthTestSetupConfig<TLoginArgs, TRefreshArgs, TFeatures, TBearerData>) => AuthTestSetup<TLoginArgs, TRefreshArgs, TFeatures, TBearerData>;
|
|
99
|
+
declare const setupAuthTest: <TLoginArgs extends AuthTestArgs = AuthTestArgs, TRefreshArgs extends AuthTestArgs = AuthTestArgs, TFeatures extends readonly AuthTestFeatureBuilder[] = readonly AuthTestFeatureBuilder[], TBearerData = unknown>(config: AuthTestSetupConfig<TLoginArgs, TRefreshArgs, TFeatures, TBearerData>) => AuthTestSetup<TLoginArgs, TRefreshArgs, TFeatures, TBearerData>;
|
|
157
100
|
|
|
158
101
|
/**
|
|
159
102
|
* Test doubles for the two browser APIs the query client's multi-tab sync is built on:
|
|
@@ -347,5 +290,22 @@ type WebSocketTestDouble = {
|
|
|
347
290
|
*/
|
|
348
291
|
declare const createWebSocketTestDouble: () => WebSocketTestDouble;
|
|
349
292
|
|
|
350
|
-
|
|
351
|
-
|
|
293
|
+
type MintTestTokenOptions = {
|
|
294
|
+
/** @default 900000 (15 minutes) */
|
|
295
|
+
expiresInMs?: number;
|
|
296
|
+
/** Extra payload claims, e.g. the user id or roles `bearerData()` and the auth guards read. */
|
|
297
|
+
claims?: Record<string, unknown>;
|
|
298
|
+
};
|
|
299
|
+
/**
|
|
300
|
+
* Mints an unsigned JWT the bearer auth provider can decode, with `iat`, `exp` and a unique `jti`.
|
|
301
|
+
* Hand it to `setTokens()` to put the app's own provider into a session.
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```ts
|
|
305
|
+
* TestBed.runInInjectionContext(() => authProviderRef.inject().setTokens(mintTestToken({ claims: { sub: '1' } }), 'refresh'));
|
|
306
|
+
* ```
|
|
307
|
+
*/
|
|
308
|
+
declare const mintTestToken: (options?: MintTestTokenOptions) => string;
|
|
309
|
+
|
|
310
|
+
export { createFakeQueryPersistenceStore, createWebSocketTestDouble, expectAndFlush, expectFlushAndWait, flushMultiTabSync, installFakeBroadcastChannel, installFakeWebLocks, mintTestToken, setupAuthTest, setupQueryTest };
|
|
311
|
+
export type { AnyFeatureBuilder, AuthTestFeatureBuilder, AuthTestQueryBuilders, AuthTestSetup, AuthTestSetupConfig, FakeBroadcastChannelHandle, FakeBroadcastMessage, FakeQueryPersistenceStoreHandle, FakeWebLocksHandle, MintTestTokenOptions, QueryTestSetup, QueryTestSetupConfig, WebSocketTestDouble };
|