@ethlete/query 6.0.0-next.53 → 6.0.0-next.55

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.
@@ -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.53",
3
+ "version": "6.0.0-next.55",
4
4
  "license": "MIT",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
7
- "@analogjs/vite-plugin-angular": "2.6.3",
8
- "@angular/common": "22.1.6",
9
- "@angular/core": "22.1.6",
10
- "@angular/forms": "22.1.6",
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.1.0",
15
- "rxjs": "7.8.2",
16
- "typescript": "6.0.3",
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; equal args return the same handle, which lives as
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, BearerAuthProvider, AuthQueryBuilder, TokenRefreshQueryBuilder, TokenRefreshQueryConfig, QueryPersistenceAdapter, PersistedQueryEntry, WebSocketClientIo, SocketMessageView } from '@ethlete/query';
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.warn` / `console.error` that were installed before the first
20
- * {@link setupQueryTest} call. Idempotent, and safe to call from any of the setups a file created.
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
- mockErrorHandler?: boolean;
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 AuthTestSetupConfig<TLoginArgs extends {
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
- }, TFeatures extends readonly AnyFeatureBuilder[] = [], TBearerData = unknown> = {
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 enable auto-retry on 401. Default: false */
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?: [...TFeatures];
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
- AuthQueryBuilder<'login', TLoginArgs>,
123
- TokenRefreshQueryBuilder<'refresh', TRefreshArgs>
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
- export { createFakeQueryPersistenceStore, createWebSocketTestDouble, expectAndFlush, expectFlushAndWait, flushMultiTabSync, installFakeBroadcastChannel, installFakeWebLocks, setupAuthTest, setupQueryTest };
351
- export type { AnyFeatureBuilder, AuthTestSetup, AuthTestSetupConfig, FakeBroadcastChannelHandle, FakeBroadcastMessage, FakeQueryPersistenceStoreHandle, FakeWebLocksHandle, QueryTestSetup, QueryTestSetupConfig, WebSocketTestDouble };
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 };