@tanstack/angular-query-experimental 5.59.20 → 5.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,7 +29,7 @@ Visit https://tanstack.com/query/latest/docs/framework/angular/overview
29
29
 
30
30
  # Quick Start
31
31
 
32
- > Angular Query requires Angular 16 or higher.
32
+ > The Angular adapter for TanStack Query requires Angular 16 or higher.
33
33
 
34
34
  1. Install `angular-query`
35
35
 
@@ -55,14 +55,14 @@ or
55
55
  $ bun add @tanstack/angular-query-experimental
56
56
  ```
57
57
 
58
- 2. Initialize **Angular Query** by adding **provideAngularQuery** to your application
58
+ 2. Initialize **TanStack Query** by adding **provideTanStackQuery** to your application
59
59
 
60
60
  ```ts
61
- import { provideAngularQuery } from '@tanstack/angular-query-experimental'
61
+ import { provideTanStackQuery } from '@tanstack/angular-query-experimental'
62
62
  import { QueryClient } from '@tanstack/angular-query-experimental'
63
63
 
64
64
  bootstrapApplication(AppComponent, {
65
- providers: [provideAngularQuery(new QueryClient())],
65
+ providers: [provideTanStackQuery(new QueryClient())],
66
66
  })
67
67
  ```
68
68
 
@@ -71,14 +71,14 @@ or in a NgModule-based app
71
71
  ```ts
72
72
  import { provideHttpClient } from '@angular/common/http'
73
73
  import {
74
- provideAngularQuery,
74
+ provideTanStackQuery,
75
75
  QueryClient,
76
76
  } from '@tanstack/angular-query-experimental'
77
77
 
78
78
  @NgModule({
79
79
  declarations: [AppComponent],
80
80
  imports: [BrowserModule],
81
- providers: [provideAngularQuery(new QueryClient())],
81
+ providers: [provideTanStackQuery(new QueryClient())],
82
82
  bootstrap: [AppComponent],
83
83
  })
84
84
  ```
package/build/README.md CHANGED
@@ -29,7 +29,7 @@ Visit https://tanstack.com/query/latest/docs/framework/angular/overview
29
29
 
30
30
  # Quick Start
31
31
 
32
- > Angular Query requires Angular 16 or higher.
32
+ > The Angular adapter for TanStack Query requires Angular 16 or higher.
33
33
 
34
34
  1. Install `angular-query`
35
35
 
@@ -55,14 +55,14 @@ or
55
55
  $ bun add @tanstack/angular-query-experimental
56
56
  ```
57
57
 
58
- 2. Initialize **Angular Query** by adding **provideAngularQuery** to your application
58
+ 2. Initialize **TanStack Query** by adding **provideTanStackQuery** to your application
59
59
 
60
60
  ```ts
61
- import { provideAngularQuery } from '@tanstack/angular-query-experimental'
61
+ import { provideTanStackQuery } from '@tanstack/angular-query-experimental'
62
62
  import { QueryClient } from '@tanstack/angular-query-experimental'
63
63
 
64
64
  bootstrapApplication(AppComponent, {
65
- providers: [provideAngularQuery(new QueryClient())],
65
+ providers: [provideTanStackQuery(new QueryClient())],
66
66
  })
67
67
  ```
68
68
 
@@ -71,14 +71,14 @@ or in a NgModule-based app
71
71
  ```ts
72
72
  import { provideHttpClient } from '@angular/common/http'
73
73
  import {
74
- provideAngularQuery,
74
+ provideTanStackQuery,
75
75
  QueryClient,
76
76
  } from '@tanstack/angular-query-experimental'
77
77
 
78
78
  @NgModule({
79
79
  declarations: [AppComponent],
80
80
  imports: [BrowserModule],
81
- providers: [provideAngularQuery(new QueryClient())],
81
+ providers: [provideTanStackQuery(new QueryClient())],
82
82
  bootstrap: [AppComponent],
83
83
  })
84
84
  ```
@@ -11,6 +11,6 @@ export * from './inject-mutation';
11
11
  export * from './inject-mutation-state';
12
12
  export * from './inject-queries';
13
13
  export * from './inject-query';
14
- export { injectQueryClient, provideQueryClient } from './inject-query-client';
15
- export { provideAngularQuery } from './providers';
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEJBQTBCO0FBRTFCLGlCQUFpQjtBQUNqQixjQUFjLHNCQUFzQixDQUFBO0FBRXBDLGNBQWMsU0FBUyxDQUFBO0FBTXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQU05QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUUvRCxjQUFjLHlCQUF5QixDQUFBO0FBQ3ZDLGNBQWMsc0JBQXNCLENBQUE7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQTtBQUNwQyxjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMseUJBQXlCLENBQUE7QUFDdkMsY0FBYyxrQkFBa0IsQ0FBQTtBQUNoQyxjQUFjLGdCQUFnQixDQUFBO0FBQzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5cbi8vIFJlLWV4cG9ydCBjb3JlXG5leHBvcnQgKiBmcm9tICdAdGFuc3RhY2svcXVlcnktY29yZSdcblxuZXhwb3J0ICogZnJvbSAnLi90eXBlcydcblxuZXhwb3J0IHR5cGUge1xuICBEZWZpbmVkSW5pdGlhbERhdGFPcHRpb25zLFxuICBVbmRlZmluZWRJbml0aWFsRGF0YU9wdGlvbnMsXG59IGZyb20gJy4vcXVlcnktb3B0aW9ucydcbmV4cG9ydCB7IHF1ZXJ5T3B0aW9ucyB9IGZyb20gJy4vcXVlcnktb3B0aW9ucydcblxuZXhwb3J0IHR5cGUge1xuICBEZWZpbmVkSW5pdGlhbERhdGFJbmZpbml0ZU9wdGlvbnMsXG4gIFVuZGVmaW5lZEluaXRpYWxEYXRhSW5maW5pdGVPcHRpb25zLFxufSBmcm9tICcuL2luZmluaXRlLXF1ZXJ5LW9wdGlvbnMnXG5leHBvcnQgeyBpbmZpbml0ZVF1ZXJ5T3B0aW9ucyB9IGZyb20gJy4vaW5maW5pdGUtcXVlcnktb3B0aW9ucydcblxuZXhwb3J0ICogZnJvbSAnLi9pbmplY3QtaW5maW5pdGUtcXVlcnknXG5leHBvcnQgKiBmcm9tICcuL2luamVjdC1pcy1mZXRjaGluZydcbmV4cG9ydCAqIGZyb20gJy4vaW5qZWN0LWlzLW11dGF0aW5nJ1xuZXhwb3J0ICogZnJvbSAnLi9pbmplY3QtbXV0YXRpb24nXG5leHBvcnQgKiBmcm9tICcuL2luamVjdC1tdXRhdGlvbi1zdGF0ZSdcbmV4cG9ydCAqIGZyb20gJy4vaW5qZWN0LXF1ZXJpZXMnXG5leHBvcnQgKiBmcm9tICcuL2luamVjdC1xdWVyeSdcbmV4cG9ydCB7IGluamVjdFF1ZXJ5Q2xpZW50LCBwcm92aWRlUXVlcnlDbGllbnQgfSBmcm9tICcuL2luamVjdC1xdWVyeS1jbGllbnQnXG5leHBvcnQgeyBwcm92aWRlQW5ndWxhclF1ZXJ5IH0gZnJvbSAnLi9wcm92aWRlcnMnXG4iXX0=
14
+ export * from './inject-query-client';
15
+ export * from './providers';
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEJBQTBCO0FBRTFCLGlCQUFpQjtBQUNqQixjQUFjLHNCQUFzQixDQUFBO0FBRXBDLGNBQWMsU0FBUyxDQUFBO0FBTXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQU05QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUUvRCxjQUFjLHlCQUF5QixDQUFBO0FBQ3ZDLGNBQWMsc0JBQXNCLENBQUE7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQTtBQUNwQyxjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMseUJBQXlCLENBQUE7QUFDdkMsY0FBYyxrQkFBa0IsQ0FBQTtBQUNoQyxjQUFjLGdCQUFnQixDQUFBO0FBQzlCLGNBQWMsdUJBQXVCLENBQUE7QUFDckMsY0FBYyxhQUFhLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuXG4vLyBSZS1leHBvcnQgY29yZVxuZXhwb3J0ICogZnJvbSAnQHRhbnN0YWNrL3F1ZXJ5LWNvcmUnXG5cbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgRGVmaW5lZEluaXRpYWxEYXRhT3B0aW9ucyxcbiAgVW5kZWZpbmVkSW5pdGlhbERhdGFPcHRpb25zLFxufSBmcm9tICcuL3F1ZXJ5LW9wdGlvbnMnXG5leHBvcnQgeyBxdWVyeU9wdGlvbnMgfSBmcm9tICcuL3F1ZXJ5LW9wdGlvbnMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgRGVmaW5lZEluaXRpYWxEYXRhSW5maW5pdGVPcHRpb25zLFxuICBVbmRlZmluZWRJbml0aWFsRGF0YUluZmluaXRlT3B0aW9ucyxcbn0gZnJvbSAnLi9pbmZpbml0ZS1xdWVyeS1vcHRpb25zJ1xuZXhwb3J0IHsgaW5maW5pdGVRdWVyeU9wdGlvbnMgfSBmcm9tICcuL2luZmluaXRlLXF1ZXJ5LW9wdGlvbnMnXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5qZWN0LWluZmluaXRlLXF1ZXJ5J1xuZXhwb3J0ICogZnJvbSAnLi9pbmplY3QtaXMtZmV0Y2hpbmcnXG5leHBvcnQgKiBmcm9tICcuL2luamVjdC1pcy1tdXRhdGluZydcbmV4cG9ydCAqIGZyb20gJy4vaW5qZWN0LW11dGF0aW9uJ1xuZXhwb3J0ICogZnJvbSAnLi9pbmplY3QtbXV0YXRpb24tc3RhdGUnXG5leHBvcnQgKiBmcm9tICcuL2luamVjdC1xdWVyaWVzJ1xuZXhwb3J0ICogZnJvbSAnLi9pbmplY3QtcXVlcnknXG5leHBvcnQgKiBmcm9tICcuL2luamVjdC1xdWVyeS1jbGllbnQnXG5leHBvcnQgKiBmcm9tICcuL3Byb3ZpZGVycydcbiJdfQ==
@@ -12,11 +12,12 @@ const tokens = createNoopInjectionToken('QueryClientToken');
12
12
  */
13
13
  export const injectQueryClient = tokens[0];
14
14
  /**
15
- * Usually {@link provideAngularQuery} is used once to set up TanStack Query and the
15
+ * Usually {@link provideTanStackQuery} is used once to set up TanStack Query and the
16
16
  * {@link https://tanstack.com/query/latest/docs/reference/QueryClient|QueryClient}
17
17
  * for the entire application. You can use `provideQueryClient` to provide a
18
18
  * different `QueryClient` instance for a part of the application.
19
19
  * @public
20
20
  */
21
21
  export const provideQueryClient = tokens[1];
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0LXF1ZXJ5LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmplY3QtcXVlcnktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFBO0FBRy9GLE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFjLGtCQUFrQixDQUFDLENBQUE7QUFFeEU7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRTFDOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU5vb3BJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4vdXRpbC9jcmVhdGUtaW5qZWN0aW9uLXRva2VuL2NyZWF0ZS1pbmplY3Rpb24tdG9rZW4nXG5pbXBvcnQgdHlwZSB7IFF1ZXJ5Q2xpZW50IH0gZnJvbSAnQHRhbnN0YWNrL3F1ZXJ5LWNvcmUnXG5cbmNvbnN0IHRva2VucyA9IGNyZWF0ZU5vb3BJbmplY3Rpb25Ub2tlbjxRdWVyeUNsaWVudD4oJ1F1ZXJ5Q2xpZW50VG9rZW4nKVxuXG4vKipcbiAqIEluamVjdHMgdGhlIGBRdWVyeUNsaWVudGAgaW5zdGFuY2UgaW50byB0aGUgY29tcG9uZW50IG9yIHNlcnZpY2UuXG4gKlxuICogKipFeGFtcGxlKipcbiAqIGBgYHRzXG4gKiBjb25zdCBxdWVyeUNsaWVudCA9IGluamVjdFF1ZXJ5Q2xpZW50KCk7XG4gKiBgYGBcbiAqIEByZXR1cm5zIFRoZSBgUXVlcnlDbGllbnRgIGluc3RhbmNlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaW5qZWN0UXVlcnlDbGllbnQgPSB0b2tlbnNbMF1cblxuLyoqXG4gKiBVc3VhbGx5IHtAbGluayBwcm92aWRlQW5ndWxhclF1ZXJ5fSBpcyB1c2VkIG9uY2UgdG8gc2V0IHVwIFRhblN0YWNrIFF1ZXJ5IGFuZCB0aGVcbiAqIHtAbGluayBodHRwczovL3RhbnN0YWNrLmNvbS9xdWVyeS9sYXRlc3QvZG9jcy9yZWZlcmVuY2UvUXVlcnlDbGllbnR8UXVlcnlDbGllbnR9XG4gKiBmb3IgdGhlIGVudGlyZSBhcHBsaWNhdGlvbi4gWW91IGNhbiB1c2UgYHByb3ZpZGVRdWVyeUNsaWVudGAgdG8gcHJvdmlkZSBhXG4gKiBkaWZmZXJlbnQgYFF1ZXJ5Q2xpZW50YCBpbnN0YW5jZSBmb3IgYSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHByb3ZpZGVRdWVyeUNsaWVudCA9IHRva2Vuc1sxXVxuIl19
22
+ export const QUERY_CLIENT = tokens[2];
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0LXF1ZXJ5LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmplY3QtcXVlcnktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFBO0FBRy9GLE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFjLGtCQUFrQixDQUFDLENBQUE7QUFFeEU7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRTFDOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUUzQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlTm9vcEluamVjdGlvblRva2VuIH0gZnJvbSAnLi91dGlsL2NyZWF0ZS1pbmplY3Rpb24tdG9rZW4vY3JlYXRlLWluamVjdGlvbi10b2tlbidcbmltcG9ydCB0eXBlIHsgUXVlcnlDbGllbnQgfSBmcm9tICdAdGFuc3RhY2svcXVlcnktY29yZSdcblxuY29uc3QgdG9rZW5zID0gY3JlYXRlTm9vcEluamVjdGlvblRva2VuPFF1ZXJ5Q2xpZW50PignUXVlcnlDbGllbnRUb2tlbicpXG5cbi8qKlxuICogSW5qZWN0cyB0aGUgYFF1ZXJ5Q2xpZW50YCBpbnN0YW5jZSBpbnRvIHRoZSBjb21wb25lbnQgb3Igc2VydmljZS5cbiAqXG4gKiAqKkV4YW1wbGUqKlxuICogYGBgdHNcbiAqIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gaW5qZWN0UXVlcnlDbGllbnQoKTtcbiAqIGBgYFxuICogQHJldHVybnMgVGhlIGBRdWVyeUNsaWVudGAgaW5zdGFuY2UuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpbmplY3RRdWVyeUNsaWVudCA9IHRva2Vuc1swXVxuXG4vKipcbiAqIFVzdWFsbHkge0BsaW5rIHByb3ZpZGVUYW5TdGFja1F1ZXJ5fSBpcyB1c2VkIG9uY2UgdG8gc2V0IHVwIFRhblN0YWNrIFF1ZXJ5IGFuZCB0aGVcbiAqIHtAbGluayBodHRwczovL3RhbnN0YWNrLmNvbS9xdWVyeS9sYXRlc3QvZG9jcy9yZWZlcmVuY2UvUXVlcnlDbGllbnR8UXVlcnlDbGllbnR9XG4gKiBmb3IgdGhlIGVudGlyZSBhcHBsaWNhdGlvbi4gWW91IGNhbiB1c2UgYHByb3ZpZGVRdWVyeUNsaWVudGAgdG8gcHJvdmlkZSBhXG4gKiBkaWZmZXJlbnQgYFF1ZXJ5Q2xpZW50YCBpbnN0YW5jZSBmb3IgYSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHByb3ZpZGVRdWVyeUNsaWVudCA9IHRva2Vuc1sxXVxuXG5leHBvcnQgY29uc3QgUVVFUllfQ0xJRU5UID0gdG9rZW5zWzJdXG4iXX0=
@@ -1,20 +1,23 @@
1
- import { DestroyRef, ENVIRONMENT_INITIALIZER, inject, makeEnvironmentProviders, } from '@angular/core';
2
- import { provideQueryClient } from './inject-query-client';
1
+ import { DestroyRef, ENVIRONMENT_INITIALIZER, Injector, PLATFORM_ID, computed, effect, inject, makeEnvironmentProviders, runInInjectionContext, } from '@angular/core';
2
+ import { onlineManager } from '@tanstack/query-core';
3
+ import { DOCUMENT, isPlatformBrowser } from '@angular/common';
4
+ import { injectQueryClient, provideQueryClient } from './inject-query-client';
5
+ import { isDevMode } from './util/is-dev-mode/is-dev-mode';
3
6
  /**
4
7
  * Sets up providers necessary to enable TanStack Query functionality for Angular applications.
5
8
  *
6
- * Allows to configure a `QueryClient`.
9
+ * Allows to configure a `QueryClient` and optional features such as developer tools.
7
10
  *
8
11
  * **Example - standalone**
9
12
  *
10
13
  * ```ts
11
14
  * import {
12
- * provideAngularQuery,
15
+ * provideTanStackQuery,
13
16
  * QueryClient,
14
17
  * } from '@tanstack/angular-query-experimental'
15
18
  *
16
19
  * bootstrapApplication(AppComponent, {
17
- * providers: [provideAngularQuery(new QueryClient())],
20
+ * providers: [provideTanStackQuery(new QueryClient())],
18
21
  * })
19
22
  * ```
20
23
  *
@@ -22,24 +25,44 @@ import { provideQueryClient } from './inject-query-client';
22
25
  *
23
26
  * ```ts
24
27
  * import {
25
- * provideAngularQuery,
28
+ * provideTanStackQuery,
26
29
  * QueryClient,
27
30
  * } from '@tanstack/angular-query-experimental'
28
31
  *
29
32
  * @NgModule({
30
33
  * declarations: [AppComponent],
31
34
  * imports: [BrowserModule],
32
- * providers: [provideAngularQuery(new QueryClient())],
35
+ * providers: [provideTanStackQuery(new QueryClient())],
33
36
  * bootstrap: [AppComponent],
34
37
  * })
35
38
  * export class AppModule {}
36
39
  * ```
40
+ *
41
+ * You can also enable optional developer tools by adding `withDevtools`. By
42
+ * default the tools will then be loaded when your app is in development mode.
43
+ * ```ts
44
+ * import {
45
+ * provideTanStackQuery,
46
+ * withDevtools
47
+ * QueryClient,
48
+ * } from '@tanstack/angular-query-experimental'
49
+ *
50
+ * bootstrapApplication(AppComponent,
51
+ * {
52
+ * providers: [
53
+ * provideTanStackQuery(new QueryClient(), withDevtools())
54
+ * ]
55
+ * }
56
+ * )
57
+ * ```
37
58
  * @param queryClient - A `QueryClient` instance.
59
+ * @param features - Optional features to configure additional Query functionality.
38
60
  * @returns A set of providers to set up TanStack Query.
39
61
  * @public
40
62
  * @see https://tanstack.com/query/v5/docs/framework/angular/quick-start
63
+ * @see withDevtools
41
64
  */
42
- export function provideAngularQuery(queryClient) {
65
+ export function provideTanStackQuery(queryClient, ...features) {
43
66
  return makeEnvironmentProviders([
44
67
  provideQueryClient(queryClient),
45
68
  {
@@ -51,6 +74,133 @@ export function provideAngularQuery(queryClient) {
51
74
  inject(DestroyRef).onDestroy(() => queryClient.unmount());
52
75
  },
53
76
  },
77
+ features.map((feature) => feature.ɵproviders),
54
78
  ]);
55
79
  }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLHVCQUF1QixFQUN2QixNQUFNLEVBQ04sd0JBQXdCLEdBQ3pCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBSTFEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsV0FBd0I7SUFFeEIsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QixrQkFBa0IsQ0FBQyxXQUFXLENBQUM7UUFDL0I7WUFDRSxPQUFPLEVBQUUsdUJBQXVCO1lBQ2hDLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDYixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUE7Z0JBQ25CLGtEQUFrRDtnQkFDbEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUMzRCxDQUFDO1NBQ0Y7S0FDRixDQUFDLENBQUE7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGVzdHJveVJlZixcbiAgRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsXG4gIGluamVjdCxcbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgcHJvdmlkZVF1ZXJ5Q2xpZW50IH0gZnJvbSAnLi9pbmplY3QtcXVlcnktY2xpZW50J1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgdHlwZSB7IFF1ZXJ5Q2xpZW50IH0gZnJvbSAnQHRhbnN0YWNrL3F1ZXJ5LWNvcmUnXG5cbi8qKlxuICogU2V0cyB1cCBwcm92aWRlcnMgbmVjZXNzYXJ5IHRvIGVuYWJsZSBUYW5TdGFjayBRdWVyeSBmdW5jdGlvbmFsaXR5IGZvciBBbmd1bGFyIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBBbGxvd3MgdG8gY29uZmlndXJlIGEgYFF1ZXJ5Q2xpZW50YC5cbiAqXG4gKiAqKkV4YW1wbGUgLSBzdGFuZGFsb25lKipcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHtcbiAqICAgcHJvdmlkZUFuZ3VsYXJRdWVyeSxcbiAqICAgUXVlcnlDbGllbnQsXG4gKiB9IGZyb20gJ0B0YW5zdGFjay9hbmd1bGFyLXF1ZXJ5LWV4cGVyaW1lbnRhbCdcbiAqXG4gKiBib290c3RyYXBBcHBsaWNhdGlvbihBcHBDb21wb25lbnQsIHtcbiAqICAgcHJvdmlkZXJzOiBbcHJvdmlkZUFuZ3VsYXJRdWVyeShuZXcgUXVlcnlDbGllbnQoKSldLFxuICogfSlcbiAqIGBgYFxuICpcbiAqICoqRXhhbXBsZSAtIE5nTW9kdWxlLWJhc2VkKipcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHtcbiAqICAgcHJvdmlkZUFuZ3VsYXJRdWVyeSxcbiAqICAgUXVlcnlDbGllbnQsXG4gKiB9IGZyb20gJ0B0YW5zdGFjay9hbmd1bGFyLXF1ZXJ5LWV4cGVyaW1lbnRhbCdcbiAqXG4gKiBATmdNb2R1bGUoe1xuICogICBkZWNsYXJhdGlvbnM6IFtBcHBDb21wb25lbnRdLFxuICogICBpbXBvcnRzOiBbQnJvd3Nlck1vZHVsZV0sXG4gKiAgIHByb3ZpZGVyczogW3Byb3ZpZGVBbmd1bGFyUXVlcnkobmV3IFF1ZXJ5Q2xpZW50KCkpXSxcbiAqICAgYm9vdHN0cmFwOiBbQXBwQ29tcG9uZW50XSxcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4gKiBgYGBcbiAqIEBwYXJhbSBxdWVyeUNsaWVudCAtIEEgYFF1ZXJ5Q2xpZW50YCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIEEgc2V0IG9mIHByb3ZpZGVycyB0byBzZXQgdXAgVGFuU3RhY2sgUXVlcnkuXG4gKiBAcHVibGljXG4gKiBAc2VlIGh0dHBzOi8vdGFuc3RhY2suY29tL3F1ZXJ5L3Y1L2RvY3MvZnJhbWV3b3JrL2FuZ3VsYXIvcXVpY2stc3RhcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVBbmd1bGFyUXVlcnkoXG4gIHF1ZXJ5Q2xpZW50OiBRdWVyeUNsaWVudCxcbik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgcHJvdmlkZVF1ZXJ5Q2xpZW50KHF1ZXJ5Q2xpZW50KSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlVmFsdWU6ICgpID0+IHtcbiAgICAgICAgcXVlcnlDbGllbnQubW91bnQoKVxuICAgICAgICAvLyBVbm1vdW50IHRoZSBxdWVyeSBjbGllbnQgb24gYXBwbGljYXRpb24gZGVzdHJveVxuICAgICAgICBpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHF1ZXJ5Q2xpZW50LnVubW91bnQoKSlcbiAgICAgIH0sXG4gICAgfSxcbiAgXSlcbn1cbiJdfQ==
80
+ /**
81
+ * Sets up providers necessary to enable TanStack Query functionality for Angular applications.
82
+ *
83
+ * Allows to configure a `QueryClient`.
84
+ * @param queryClient - A `QueryClient` instance.
85
+ * @returns A set of providers to set up TanStack Query.
86
+ * @public
87
+ * @see https://tanstack.com/query/v5/docs/framework/angular/quick-start
88
+ * @deprecated Use `provideTanStackQuery` instead.
89
+ */
90
+ export function provideAngularQuery(queryClient) {
91
+ return provideTanStackQuery(queryClient);
92
+ }
93
+ /**
94
+ * Helper function to create an object that represents a Query feature.
95
+ * @param kind -
96
+ * @param providers -
97
+ * @returns A Query feature.
98
+ */
99
+ function queryFeature(kind, providers) {
100
+ return { ɵkind: kind, ɵproviders: providers };
101
+ }
102
+ /**
103
+ * Enables developer tools.
104
+ *
105
+ * **Example**
106
+ *
107
+ * ```ts
108
+ * export const appConfig: ApplicationConfig = {
109
+ * providers: [
110
+ * provideTanStackQuery(new QueryClient(), withDevtools())
111
+ * ]
112
+ * }
113
+ * ```
114
+ * By default the devtools will be loaded when Angular runs in development mode and rendered in `<body>`.
115
+ *
116
+ * If you need more control over when devtools are loaded, you can use the `loadDevtools` option. This is particularly useful if you want to load devtools based on environment configurations. For instance, you might have a test environment running in production mode but still require devtools to be available.
117
+ *
118
+ * If you need more control over where devtools are rendered, consider `injectDevtoolsPanel`. This allows rendering devtools inside your own devtools for example.
119
+ * @param optionsFn - A function that returns `DevtoolsOptions`.
120
+ * @returns A set of providers for use with `provideTanStackQuery`.
121
+ * @public
122
+ * @see {@link provideTanStackQuery}
123
+ * @see {@link DevtoolsOptions}
124
+ */
125
+ export function withDevtools(optionsFn) {
126
+ let providers = [];
127
+ if (!isDevMode() && !optionsFn) {
128
+ providers = [];
129
+ }
130
+ else {
131
+ providers = [
132
+ {
133
+ provide: ENVIRONMENT_INITIALIZER,
134
+ multi: true,
135
+ useFactory: () => {
136
+ if (!isPlatformBrowser(inject(PLATFORM_ID)))
137
+ return () => { };
138
+ const injector = inject(Injector);
139
+ const options = computed(() => runInInjectionContext(injector, () => optionsFn?.() ?? {}));
140
+ let devtools = null;
141
+ let el = null;
142
+ const shouldLoadToolsSignal = computed(() => {
143
+ const { loadDevtools } = options();
144
+ return typeof loadDevtools === 'boolean'
145
+ ? loadDevtools
146
+ : isDevMode();
147
+ });
148
+ const doc = inject(DOCUMENT);
149
+ const destroyRef = inject(DestroyRef);
150
+ const getResolvedQueryClient = () => {
151
+ const injectedClient = injectQueryClient({
152
+ optional: true,
153
+ injector,
154
+ });
155
+ const client = options().client ?? injectedClient;
156
+ if (!client) {
157
+ throw new Error('No QueryClient found');
158
+ }
159
+ return client;
160
+ };
161
+ const destroyDevtools = () => {
162
+ devtools?.unmount();
163
+ el?.remove();
164
+ devtools = null;
165
+ };
166
+ return () => effect(() => {
167
+ const shouldLoadTools = shouldLoadToolsSignal();
168
+ const { client, position, errorTypes, buttonPosition, initialIsOpen, } = options();
169
+ if (devtools && !shouldLoadTools) {
170
+ destroyDevtools();
171
+ return;
172
+ }
173
+ else if (devtools && shouldLoadTools) {
174
+ client && devtools.setClient(client);
175
+ position && devtools.setPosition(position);
176
+ errorTypes && devtools.setErrorTypes(errorTypes);
177
+ buttonPosition && devtools.setButtonPosition(buttonPosition);
178
+ initialIsOpen && devtools.setInitialIsOpen(initialIsOpen);
179
+ return;
180
+ }
181
+ else if (!shouldLoadTools) {
182
+ return;
183
+ }
184
+ el = doc.body.appendChild(document.createElement('div'));
185
+ el.classList.add('tsqd-parent-container');
186
+ import('@tanstack/query-devtools').then((queryDevtools) => runInInjectionContext(injector, () => {
187
+ devtools = new queryDevtools.TanstackQueryDevtools({
188
+ ...options(),
189
+ client: getResolvedQueryClient(),
190
+ queryFlavor: 'Angular Query',
191
+ version: '5',
192
+ onlineManager,
193
+ });
194
+ el && devtools.mount(el);
195
+ // Unmount the devtools on application destroy
196
+ destroyRef.onDestroy(destroyDevtools);
197
+ }));
198
+ });
199
+ },
200
+ },
201
+ ];
202
+ }
203
+ return queryFeature('DeveloperTools', providers);
204
+ }
205
+ export const queryFeatures = ['DeveloperTools'];
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLHVCQUF1QixFQUN2QixRQUFRLEVBQ1IsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLHdCQUF3QixFQUN4QixxQkFBcUIsR0FDdEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFVMUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwREc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFdBQXdCLEVBQ3hCLEdBQUcsUUFBOEI7SUFFakMsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QixrQkFBa0IsQ0FBQyxXQUFXLENBQUM7UUFDL0I7WUFDRSxPQUFPLEVBQUUsdUJBQXVCO1lBQ2hDLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDYixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUE7Z0JBQ25CLGtEQUFrRDtnQkFDbEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUMzRCxDQUFDO1NBQ0Y7UUFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFD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QUM5QyxVQUFVLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFBO3dCQUN2QyxDQUFDLENBQUMsQ0FDSCxDQUFBO29CQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNOLENBQUM7YUFDRjtTQUNGLENBQUE7SUFDSCxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDbEQsQ0FBQztBQVlELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLGdCQUFnQixDQUFVLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEZXN0cm95UmVmLFxuICBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUixcbiAgSW5qZWN0b3IsXG4gIFBMQVRGT1JNX0lELFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcnVuSW5JbmplY3Rpb25Db250ZXh0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgb25saW5lTWFuYWdlciB9IGZyb20gJ0B0YW5zdGFjay9xdWVyeS1jb3JlJ1xuaW1wb3J0IHsgRE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHsgaW5qZWN0UXVlcnlDbGllbnQsIHByb3ZpZGVRdWVyeUNsaWVudCB9IGZyb20gJy4vaW5qZWN0LXF1ZXJ5LWNsaWVudCdcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4vdXRpbC9pcy1kZXYtbW9kZS9pcy1kZXYtbW9kZSdcbmltcG9ydCB0eXBlIHsgUXVlcnlDbGllbnQgfSBmcm9tICdAdGFuc3RhY2svcXVlcnktY29yZSdcbmltcG9ydCB0eXBlIHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB0eXBlIHtcbiAgRGV2dG9vbHNCdXR0b25Qb3NpdGlvbixcbiAgRGV2dG9vbHNFcnJvclR5cGUsXG4gIERldnRvb2xzUG9zaXRpb24sXG4gIFRhbnN0YWNrUXVlcnlEZXZ0b29scyxcbn0gZnJvbSAnQHRhbnN0YWNrL3F1ZXJ5LWRldnRvb2xzJ1xuXG4vKipcbiAqIFNldHMgdXAgcHJvdmlkZXJzIG5lY2Vzc2FyeSB0byBlbmFibGUgVGFuU3RhY2sgUXVlcnkgZnVuY3Rpb25hbGl0eSBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnMuXG4gKlxuICogQWxsb3dzIHRvIGNvbmZpZ3VyZSBhIGBRdWVyeUNsaWVudGAgYW5kIG9wdGlvbmFsIGZlYXR1cmVzIHN1Y2ggYXMgZGV2ZWxvcGVyIHRvb2xzLlxuICpcbiAqICoqRXhhbXBsZSAtIHN0YW5kYWxvbmUqKlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1xuICogICBwcm92aWRlVGFuU3RhY2tRdWVyeSxcbiAqICAgUXVlcnlDbGllbnQsXG4gKiB9IGZyb20gJ0B0YW5zdGFjay9hbmd1bGFyLXF1ZXJ5LWV4cGVyaW1lbnRhbCdcbiAqXG4gKiBib290c3RyYXBBcHBsaWNhdGlvbihBcHBDb21wb25lbnQsIHtcbiAqICAgcHJvdmlkZXJzOiBbcHJvdmlkZVRhblN0YWNrUXVlcnkobmV3IFF1ZXJ5Q2xpZW50KCkpXSxcbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiAqKkV4YW1wbGUgLSBOZ01vZHVsZS1iYXNlZCoqXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7XG4gKiAgIHByb3ZpZGVUYW5TdGFja1F1ZXJ5LFxuICogICBRdWVyeUNsaWVudCxcbiAqIH0gZnJvbSAnQHRhbnN0YWNrL2FuZ3VsYXItcXVlcnktZXhwZXJpbWVudGFsJ1xuICpcbiAqIEBOZ01vZHVsZSh7XG4gKiAgIGRlY2xhcmF0aW9uczogW0FwcENvbXBvbmVudF0sXG4gKiAgIGltcG9ydHM6IFtCcm93c2VyTW9kdWxlXSxcbiAqICAgcHJvdmlkZXJzOiBbcHJvdmlkZVRhblN0YWNrUXVlcnkobmV3IFF1ZXJ5Q2xpZW50KCkpXSxcbiAqICAgYm9vdHN0cmFwOiBbQXBwQ29tcG9uZW50XSxcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4gKiBgYGBcbiAqXG4gKiBZb3UgY2FuIGFsc28gZW5hYmxlIG9wdGlvbmFsIGRldmVsb3BlciB0b29scyBieSBhZGRpbmcgYHdpdGhEZXZ0b29sc2AuIEJ5XG4gKiBkZWZhdWx0IHRoZSB0b29scyB3aWxsIHRoZW4gYmUgbG9hZGVkIHdoZW4geW91ciBhcHAgaXMgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cbiAqIGBgYHRzXG4gKiBpbXBvcnQge1xuICogICBwcm92aWRlVGFuU3RhY2tRdWVyeSxcbiAqICAgd2l0aERldnRvb2xzXG4gKiAgIFF1ZXJ5Q2xpZW50LFxuICogfSBmcm9tICdAdGFuc3RhY2svYW5ndWxhci1xdWVyeS1leHBlcmltZW50YWwnXG4gKlxuICogYm9vdHN0cmFwQXBwbGljYXRpb24oQXBwQ29tcG9uZW50LFxuICogICB7XG4gKiAgICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgICBwcm92aWRlVGFuU3RhY2tRdWVyeShuZXcgUXVlcnlDbGllbnQoKSwgd2l0aERldnRvb2xzKCkpXG4gKiAgICAgXVxuICogICB9XG4gKiApXG4gKiBgYGBcbiAqIEBwYXJhbSBxdWVyeUNsaWVudCAtIEEgYFF1ZXJ5Q2xpZW50YCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmZWF0dXJlcyAtIE9wdGlvbmFsIGZlYXR1cmVzIHRvIGNvbmZpZ3VyZSBhZGRpdGlvbmFsIFF1ZXJ5IGZ1bmN0aW9uYWxpdHkuXG4gKiBAcmV0dXJucyBBIHNldCBvZiBwcm92aWRlcnMgdG8gc2V0IHVwIFRhblN0YWNrIFF1ZXJ5LlxuICogQHB1YmxpY1xuICogQHNlZSBodHRwczovL3RhbnN0YWNrLmNvbS9xdWVyeS92NS9kb2NzL2ZyYW1ld29yay9hbmd1bGFyL3F1aWNrLXN0YXJ0XG4gKiBAc2VlIHdpdGhEZXZ0b29sc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVRhblN0YWNrUXVlcnkoXG4gIHF1ZXJ5Q2xpZW50OiBRdWVyeUNsaWVudCxcbiAgLi4uZmVhdHVyZXM6IEFycmF5PFF1ZXJ5RmVhdHVyZXM+XG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHByb3ZpZGVRdWVyeUNsaWVudChxdWVyeUNsaWVudCksXG4gICAge1xuICAgICAgcHJvdmlkZTogRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZVZhbHVlOiAoKSA9PiB7XG4gICAgICAgIHF1ZXJ5Q2xpZW50Lm1vdW50KClcbiAgICAgICAgLy8gVW5tb3VudCB0aGUgcXVlcnkgY2xpZW50IG9uIGFwcGxpY2F0aW9uIGRlc3Ryb3lcbiAgICAgICAgaW5qZWN0KERlc3Ryb3lSZWYpLm9uRGVzdHJveSgoKSA9PiBxdWVyeUNsaWVudC51bm1vdW50KCkpXG4gICAgICB9LFxuICAgIH0sXG4gICAgZmVhdHVyZXMubWFwKChmZWF0dXJlKSA9PiBmZWF0dXJlLsm1cHJvdmlkZXJzKSxcbiAgXSlcbn1cblxuLyoqXG4gKiBTZXRzIHVwIHByb3ZpZGVycyBuZWNlc3NhcnkgdG8gZW5hYmxlIFRhblN0YWNrIFF1ZXJ5IGZ1bmN0aW9uYWxpdHkgZm9yIEFuZ3VsYXIgYXBwbGljYXRpb25zLlxuICpcbiAqIEFsbG93cyB0byBjb25maWd1cmUgYSBgUXVlcnlDbGllbnRgLlxuICogQHBhcmFtIHF1ZXJ5Q2xpZW50IC0gQSBgUXVlcnlDbGllbnRgIGluc3RhbmNlLlxuICogQHJldHVybnMgQSBzZXQgb2YgcHJvdmlkZXJzIHRvIHNldCB1cCBUYW5TdGFjayBRdWVyeS5cbiAqIEBwdWJsaWNcbiAqIEBzZWUgaHR0cHM6Ly90YW5zdGFjay5jb20vcXVlcnkvdjUvZG9jcy9mcmFtZXdvcmsvYW5ndWxhci9xdWljay1zdGFydFxuICogQGRlcHJlY2F0ZWQgVXNlIGBwcm92aWRlVGFuU3RhY2tRdWVyeWAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVBbmd1bGFyUXVlcnkoXG4gIHF1ZXJ5Q2xpZW50OiBRdWVyeUNsaWVudCxcbik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgcmV0dXJuIHByb3ZpZGVUYW5TdGFja1F1ZXJ5KHF1ZXJ5Q2xpZW50KVxufVxuXG4vKipcbiAqIEhlbHBlciB0eXBlIHRvIHJlcHJlc2VudCBhIFF1ZXJ5IGZlYXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlGZWF0dXJlPFRGZWF0dXJlS2luZCBleHRlbmRzIFF1ZXJ5RmVhdHVyZUtpbmQ+IHtcbiAgybVraW5kOiBURmVhdHVyZUtpbmRcbiAgybVwcm92aWRlcnM6IEFycmF5PFByb3ZpZGVyPlxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIFF1ZXJ5IGZlYXR1cmUuXG4gKiBAcGFyYW0ga2luZCAtXG4gKiBAcGFyYW0gcHJvdmlkZXJzIC1cbiAqIEByZXR1cm5zIEEgUXVlcnkgZmVhdHVyZS5cbiAqL1xuZnVuY3Rpb24gcXVlcnlGZWF0dXJlPFRGZWF0dXJlS2luZCBleHRlbmRzIFF1ZXJ5RmVhdHVyZUtpbmQ+KFxuICBraW5kOiBURmVhdHVyZUtpbmQsXG4gIHByb3ZpZGVyczogQXJyYXk8UHJvdmlkZXI+LFxuKTogUXVlcnlGZWF0dXJlPFRGZWF0dXJlS2luZD4ge1xuICByZXR1cm4geyDJtWtpbmQ6IGtpbmQsIMm1cHJvdmlkZXJzOiBwcm92aWRlcnMgfVxufVxuXG4vKipcbiAqIEEgdHlwZSBhbGlhcyB0aGF0IHJlcHJlc2VudHMgYSBmZWF0dXJlIHdoaWNoIGVuYWJsZXMgZGV2ZWxvcGVyIHRvb2xzLlxuICogVGhlIHR5cGUgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBgd2l0aERldnRvb2xzYCBmdW5jdGlvbi5cbiAqIEBwdWJsaWNcbiAqIEBzZWUge0BsaW5rIHdpdGhEZXZ0b29sc31cbiAqL1xuZXhwb3J0IHR5cGUgRGV2ZWxvcGVyVG9vbHNGZWF0dXJlID0gUXVlcnlGZWF0dXJlPCdEZXZlbG9wZXJUb29scyc+XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIFRhblN0YWNrIFF1ZXJ5IGRldnRvb2xzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERldnRvb2xzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTZXQgdGhpcyB0cnVlIGlmIHlvdSB3YW50IHRoZSBkZXZ0b29scyB0byBkZWZhdWx0IHRvIGJlaW5nIG9wZW5cbiAgICovXG4gIGluaXRpYWxJc09wZW4/OiBib29sZWFuXG4gIC8qKlxuICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIFRhblN0YWNrIGxvZ28gdG8gb3BlbiBhbmQgY2xvc2UgdGhlIGRldnRvb2xzIHBhbmVsLlxuICAgKiBgdG9wLWxlZnRgIHwgYHRvcC1yaWdodGAgfCBgYm90dG9tLWxlZnRgIHwgYGJvdHRvbS1yaWdodGAgfCBgcmVsYXRpdmVgXG4gICAqIERlZmF1bHRzIHRvIGBib3R0b20tcmlnaHRgLlxuICAgKi9cbiAgYnV0dG9uUG9zaXRpb24/OiBEZXZ0b29sc0J1dHRvblBvc2l0aW9uXG4gIC8qKlxuICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIFRhblN0YWNrIFF1ZXJ5IGRldnRvb2xzIHBhbmVsLlxuICAgKiBgdG9wYCB8IGBib3R0b21gIHwgYGxlZnRgIHwgYHJpZ2h0YFxuICAgKiBEZWZhdWx0cyB0byBgYm90dG9tYC5cbiAgICovXG4gIHBvc2l0aW9uPzogRGV2dG9vbHNQb3NpdGlvblxuICAvKipcbiAgICogQ3VzdG9tIGluc3RhbmNlIG9mIFF1ZXJ5Q2xpZW50XG4gICAqL1xuICBjbGllbnQ/OiBRdWVyeUNsaWVudFxuICAvKipcbiAgICogVXNlIHRoaXMgc28geW91IGNhbiBkZWZpbmUgY3VzdG9tIGVycm9ycyB0aGF0IGNhbiBiZSBzaG93biBpbiB0aGUgZGV2dG9vbHMuXG4gICAqL1xuICBlcnJvclR5cGVzPzogQXJyYXk8RGV2dG9vbHNFcnJvclR5cGU+XG4gIC8qKlxuICAgKiBVc2UgdGhpcyB0byBwYXNzIGEgbm9uY2UgdG8gdGhlIHN0eWxlIHRhZyB0aGF0IGlzIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBoZWFkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgKENTUCkgbm9uY2UgdG8gYWxsb3cgaW5saW5lIHN0eWxlcy5cbiAgICovXG4gIHN0eWxlTm9uY2U/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFVzZSB0aGlzIHNvIHlvdSBjYW4gYXR0YWNoIHRoZSBkZXZ0b29sJ3Mgc3R5bGVzIHRvIGEgc3BlY2lmaWMgZWxlbWVudCBpbiB0aGUgRE9NLlxuICAgKi9cbiAgc2hhZG93RE9NVGFyZ2V0PzogU2hhZG93Um9vdFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkZXZlbG9wZXIgdG9vbHMgc2hvdWxkIGxvYWQuXG4gICAqIC0gYGF1dG9gLSAoRGVmYXVsdCkgTGF6aWx5IGxvYWRzIGRldnRvb2xzIHdoZW4gaW4gZGV2ZWxvcG1lbnQgbW9kZS4gU2tpcHMgbG9hZGluZyBpbiBwcm9kdWN0aW9uIG1vZGUuXG4gICAqIC0gYHRydWVgLSBBbHdheXMgbG9hZCB0aGUgZGV2dG9vbHMsIHJlZ2FyZGxlc3Mgb2YgdGhlIGVudmlyb25tZW50LlxuICAgKiAtIGBmYWxzZWAtIE5ldmVyIGxvYWQgdGhlIGRldnRvb2xzLCByZWdhcmRsZXNzIG9mIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogWW91IGNhbiB1c2UgYHRydWVgIGFuZCBgZmFsc2VgIHRvIG92ZXJyaWRlIGxvYWRpbmcgZGV2ZWxvcGVyIHRvb2xzIGZyb20gYW4gZW52aXJvbm1lbnQgZmlsZS5cbiAgICogRm9yIGV4YW1wbGUsIGEgdGVzdCBlbnZpcm9ubWVudCBtaWdodCBydW4gaW4gcHJvZHVjdGlvbiBtb2RlIGJ1dCB5b3UgbWF5IHdhbnQgdG8gbG9hZCBkZXZlbG9wZXIgdG9vbHMuXG4gICAqXG4gICAqIEFkZGl0aW9uYWxseSwgeW91IGNhbiB1c2UgYSBzaWduYWwgaW4gdGhlIGNhbGxiYWNrIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlIGRldnRvb2xzIGJhc2VkIG9uIGEgY29uZGl0aW9uLiBGb3IgZXhhbXBsZSxcbiAgICogYSBzaWduYWwgY3JlYXRlZCBmcm9tIGEgUnhKUyBvYnNlcnZhYmxlIHRoYXQgbGlzdGVucyBmb3IgYSBrZXlib2FyZCBzaG9ydGN1dC5cbiAgICpcbiAgICogKipFeGFtcGxlKipcbiAgICogYGBgdHNcbiAgICogICAgd2l0aERldnRvb2xzKCgpID0+ICh7XG4gICAqICAgICAgaW5pdGlhbElzT3BlbjogdHJ1ZSxcbiAgICogICAgICBsb2FkRGV2dG9vbHM6IGluamVjdChFeGFtcGxlU2VydmljZSkubG9hZERldnRvb2xzKClcbiAgICogICAgfSkpXG4gICAqICBgYGBcbiAgICovXG4gIGxvYWREZXZ0b29scz86ICdhdXRvJyB8IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBFbmFibGVzIGRldmVsb3BlciB0b29scy5cbiAqXG4gKiAqKkV4YW1wbGUqKlxuICpcbiAqIGBgYHRzXG4gKiBleHBvcnQgY29uc3QgYXBwQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgcHJvdmlkZVRhblN0YWNrUXVlcnkobmV3IFF1ZXJ5Q2xpZW50KCksIHdpdGhEZXZ0b29scygpKVxuICogICBdXG4gKiB9XG4gKiBgYGBcbiAqIEJ5IGRlZmF1bHQgdGhlIGRldnRvb2xzIHdpbGwgYmUgbG9hZGVkIHdoZW4gQW5ndWxhciBydW5zIGluIGRldmVsb3BtZW50IG1vZGUgYW5kIHJlbmRlcmVkIGluIGA8Ym9keT5gLlxuICpcbiAqIElmIHlvdSBuZWVkIG1vcmUgY29udHJvbCBvdmVyIHdoZW4gZGV2dG9vbHMgYXJlIGxvYWRlZCwgeW91IGNhbiB1c2UgdGhlIGBsb2FkRGV2dG9vbHNgIG9wdGlvbi4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGxvYWQgZGV2dG9vbHMgYmFzZWQgb24gZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbnMuIEZvciBpbnN0YW5jZSwgeW91IG1pZ2h0IGhhdmUgYSB0ZXN0IGVudmlyb25tZW50IHJ1bm5pbmcgaW4gcHJvZHVjdGlvbiBtb2RlIGJ1dCBzdGlsbCByZXF1aXJlIGRldnRvb2xzIHRvIGJlIGF2YWlsYWJsZS5cbiAqXG4gKiBJZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciB3aGVyZSBkZXZ0b29scyBhcmUgcmVuZGVyZWQsIGNvbnNpZGVyIGBpbmplY3REZXZ0b29sc1BhbmVsYC4gVGhpcyBhbGxvd3MgcmVuZGVyaW5nIGRldnRvb2xzIGluc2lkZSB5b3VyIG93biBkZXZ0b29scyBmb3IgZXhhbXBsZS5cbiAqIEBwYXJhbSBvcHRpb25zRm4gLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgRGV2dG9vbHNPcHRpb25zYC5cbiAqIEByZXR1cm5zIEEgc2V0IG9mIHByb3ZpZGVycyBmb3IgdXNlIHdpdGggYHByb3ZpZGVUYW5TdGFja1F1ZXJ5YC5cbiAqIEBwdWJsaWNcbiAqIEBzZWUge0BsaW5rIHByb3ZpZGVUYW5TdGFja1F1ZXJ5fVxuICogQHNlZSB7QGxpbmsgRGV2dG9vbHNPcHRpb25zfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aERldnRvb2xzKFxuICBvcHRpb25zRm4/OiAoKSA9PiBEZXZ0b29sc09wdGlvbnMsXG4pOiBEZXZlbG9wZXJUb29sc0ZlYXR1cmUge1xuICBsZXQgcHJvdmlkZXJzOiBBcnJheTxQcm92aWRlcj4gPSBbXVxuICBpZiAoIWlzRGV2TW9kZSgpICYmICFvcHRpb25zRm4pIHtcbiAgICBwcm92aWRlcnMgPSBbXVxuICB9IGVsc2Uge1xuICAgIHByb3ZpZGVycyA9IFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZTogRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsXG4gICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFpc1BsYXRmb3JtQnJvd3NlcihpbmplY3QoUExBVEZPUk1fSUQpKSkgcmV0dXJuICgpID0+IHt9XG4gICAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpXG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgICAgICBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IG9wdGlvbnNGbj8uKCkgPz8ge30pLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGxldCBkZXZ0b29sczogVGFuc3RhY2tRdWVyeURldnRvb2xzIHwgbnVsbCA9IG51bGxcbiAgICAgICAgICBsZXQgZWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGxcblxuICAgICAgICAgIGNvbnN0IHNob3VsZExvYWRUb29sc1NpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbG9hZERldnRvb2xzIH0gPSBvcHRpb25zKClcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgbG9hZERldnRvb2xzID09PSAnYm9vbGVhbidcbiAgICAgICAgICAgICAgPyBsb2FkRGV2dG9vbHNcbiAgICAgICAgICAgICAgOiBpc0Rldk1vZGUoKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb25zdCBkb2MgPSBpbmplY3QoRE9DVU1FTlQpXG4gICAgICAgICAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKVxuXG4gICAgICAgICAgY29uc3QgZ2V0UmVzb2x2ZWRRdWVyeUNsaWVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluamVjdGVkQ2xpZW50ID0gaW5qZWN0UXVlcnlDbGllbnQoe1xuICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5qZWN0b3IsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gb3B0aW9ucygpLmNsaWVudCA/PyBpbmplY3RlZENsaWVudFxuICAgICAgICAgICAgaWYgKCFjbGllbnQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBRdWVyeUNsaWVudCBmb3VuZCcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xpZW50XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGVzdHJveURldnRvb2xzID0gKCkgPT4ge1xuICAgICAgICAgICAgZGV2dG9vbHM/LnVubW91bnQoKVxuICAgICAgICAgICAgZWw/LnJlbW92ZSgpXG4gICAgICAgICAgICBkZXZ0b29scyA9IG51bGxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gKCkgPT5cbiAgICAgICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNob3VsZExvYWRUb29scyA9IHNob3VsZExvYWRUb29sc1NpZ25hbCgpXG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgZXJyb3JUeXBlcyxcbiAgICAgICAgICAgICAgICBidXR0b25Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBpbml0aWFsSXNPcGVuLFxuICAgICAgICAgICAgICB9ID0gb3B0aW9ucygpXG5cbiAgICAgICAgICAgICAgaWYgKGRldnRvb2xzICYmICFzaG91bGRMb2FkVG9vbHMpIHtcbiAgICAgICAgICAgICAgICBkZXN0cm95RGV2dG9vbHMoKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRldnRvb2xzICYmIHNob3VsZExvYWRUb29scykge1xuICAgICAgICAgICAgICAgIGNsaWVudCAmJiBkZXZ0b29scy5zZXRDbGllbnQoY2xpZW50KVxuICAgICAgICAgICAgICAgIHBvc2l0aW9uICYmIGRldnRvb2xzLnNldFBvc2l0aW9uKHBvc2l0aW9uKVxuICAgICAgICAgICAgICAgIGVycm9yVHlwZXMgJiYgZGV2dG9vbHMuc2V0RXJyb3JUeXBlcyhlcnJvclR5cGVzKVxuICAgICAgICAgICAgICAgIGJ1dHRvblBvc2l0aW9uICYmIGRldnRvb2xzLnNldEJ1dHRvblBvc2l0aW9uKGJ1dHRvblBvc2l0aW9uKVxuICAgICAgICAgICAgICAgIGluaXRpYWxJc09wZW4gJiYgZGV2dG9vbHMuc2V0SW5pdGlhbElzT3Blbihpbml0aWFsSXNPcGVuKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzaG91bGRMb2FkVG9vbHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGVsID0gZG9jLmJvZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXG4gICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3RzcWQtcGFyZW50LWNvbnRhaW5lcicpXG5cbiAgICAgICAgICAgICAgaW1wb3J0KCdAdGFuc3RhY2svcXVlcnktZGV2dG9vbHMnKS50aGVuKChxdWVyeURldnRvb2xzKSA9PlxuICAgICAgICAgICAgICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dChpbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgZGV2dG9vbHMgPSBuZXcgcXVlcnlEZXZ0b29scy5UYW5zdGFja1F1ZXJ5RGV2dG9vbHMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5vcHRpb25zKCksXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudDogZ2V0UmVzb2x2ZWRRdWVyeUNsaWVudCgpLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeUZsYXZvcjogJ0FuZ3VsYXIgUXVlcnknLFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnNScsXG4gICAgICAgICAgICAgICAgICAgIG9ubGluZU1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICBlbCAmJiBkZXZ0b29scy5tb3VudChlbClcblxuICAgICAgICAgICAgICAgICAgLy8gVW5tb3VudCB0aGUgZGV2dG9vbHMgb24gYXBwbGljYXRpb24gZGVzdHJveVxuICAgICAgICAgICAgICAgICAgZGVzdHJveVJlZi5vbkRlc3Ryb3koZGVzdHJveURldnRvb2xzKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdXG4gIH1cbiAgcmV0dXJuIHF1ZXJ5RmVhdHVyZSgnRGV2ZWxvcGVyVG9vbHMnLCBwcm92aWRlcnMpXG59XG5cbi8qKlxuICogQSB0eXBlIGFsaWFzIHRoYXQgcmVwcmVzZW50cyBhbGwgUXVlcnkgZmVhdHVyZXMgYXZhaWxhYmxlIGZvciB1c2Ugd2l0aCBgcHJvdmlkZVRhblN0YWNrUXVlcnlgLlxuICogRmVhdHVyZXMgY2FuIGJlIGVuYWJsZWQgYnkgYWRkaW5nIHNwZWNpYWwgZnVuY3Rpb25zIHRvIHRoZSBgcHJvdmlkZVRhblN0YWNrUXVlcnlgIGNhbGwuXG4gKiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZWFjaCBzeW1ib2wgdG8gZmluZCBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIG5hbWUuIFNlZSBhbHNvIGBwcm92aWRlVGFuU3RhY2tRdWVyeWBcbiAqIGRvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aG9zZSBmdW5jdGlvbnMuXG4gKiBAcHVibGljXG4gKiBAc2VlIHtAbGluayBwcm92aWRlVGFuU3RhY2tRdWVyeX1cbiAqL1xuZXhwb3J0IHR5cGUgUXVlcnlGZWF0dXJlcyA9IERldmVsb3BlclRvb2xzRmVhdHVyZSAvLyBVbmlvbiB0eXBlIG9mIGZlYXR1cmVzIGJ1dCBqdXN0IG9uZSBub3dcblxuZXhwb3J0IGNvbnN0IHF1ZXJ5RmVhdHVyZXMgPSBbJ0RldmVsb3BlclRvb2xzJ10gYXMgY29uc3RcblxuZXhwb3J0IHR5cGUgUXVlcnlGZWF0dXJlS2luZCA9ICh0eXBlb2YgcXVlcnlGZWF0dXJlcylbbnVtYmVyXVxuIl19
@@ -0,0 +1,3 @@
1
+ // Re-export for mocking in tests
2
+ export { isDevMode } from '@angular/core';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtZGV2LW1vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbC9pcy1kZXYtbW9kZS9pcy1kZXYtbW9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQ0FBaUM7QUFFakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIFJlLWV4cG9ydCBmb3IgbW9ja2luZyBpbiB0ZXN0c1xuXG5leHBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuIl19
@@ -1,6 +1,7 @@
1
- import { notifyManager, InfiniteQueryObserver, MutationObserver, replaceEqualDeep, QueriesObserver, QueryObserver } from '@tanstack/query-core';
1
+ import { notifyManager, InfiniteQueryObserver, MutationObserver, replaceEqualDeep, QueriesObserver, QueryObserver, onlineManager } from '@tanstack/query-core';
2
2
  export * from '@tanstack/query-core';
3
- import { untracked, computed, assertInInjectionContext, inject, Injector, runInInjectionContext, InjectionToken, NgZone, DestroyRef, signal, effect, makeEnvironmentProviders, ENVIRONMENT_INITIALIZER } from '@angular/core';
3
+ import { untracked, computed, assertInInjectionContext, inject, Injector, runInInjectionContext, InjectionToken, NgZone, DestroyRef, signal, effect, makeEnvironmentProviders, ENVIRONMENT_INITIALIZER, isDevMode, PLATFORM_ID } from '@angular/core';
4
+ import { isPlatformBrowser, DOCUMENT } from '@angular/common';
4
5
 
5
6
  /* istanbul ignore file */
6
7
 
@@ -210,13 +211,14 @@ const tokens = createNoopInjectionToken('QueryClientToken');
210
211
  */
211
212
  const injectQueryClient = tokens[0];
212
213
  /**
213
- * Usually {@link provideAngularQuery} is used once to set up TanStack Query and the
214
+ * Usually {@link provideTanStackQuery} is used once to set up TanStack Query and the
214
215
  * {@link https://tanstack.com/query/latest/docs/reference/QueryClient|QueryClient}
215
216
  * for the entire application. You can use `provideQueryClient` to provide a
216
217
  * different `QueryClient` instance for a part of the application.
217
218
  * @public
218
219
  */
219
220
  const provideQueryClient = tokens[1];
221
+ const QUERY_CLIENT = tokens[2];
220
222
 
221
223
  /**
222
224
  * Base implementation for `injectQuery` and `injectInfiniteQuery`.
@@ -522,21 +524,23 @@ function injectQuery(optionsFn, injector) {
522
524
  return assertInjector(injectQuery, injector, () => createBaseQuery(optionsFn, QueryObserver));
523
525
  }
524
526
 
527
+ // Re-export for mocking in tests
528
+
525
529
  /**
526
530
  * Sets up providers necessary to enable TanStack Query functionality for Angular applications.
527
531
  *
528
- * Allows to configure a `QueryClient`.
532
+ * Allows to configure a `QueryClient` and optional features such as developer tools.
529
533
  *
530
534
  * **Example - standalone**
531
535
  *
532
536
  * ```ts
533
537
  * import {
534
- * provideAngularQuery,
538
+ * provideTanStackQuery,
535
539
  * QueryClient,
536
540
  * } from '@tanstack/angular-query-experimental'
537
541
  *
538
542
  * bootstrapApplication(AppComponent, {
539
- * providers: [provideAngularQuery(new QueryClient())],
543
+ * providers: [provideTanStackQuery(new QueryClient())],
540
544
  * })
541
545
  * ```
542
546
  *
@@ -544,24 +548,44 @@ function injectQuery(optionsFn, injector) {
544
548
  *
545
549
  * ```ts
546
550
  * import {
547
- * provideAngularQuery,
551
+ * provideTanStackQuery,
548
552
  * QueryClient,
549
553
  * } from '@tanstack/angular-query-experimental'
550
554
  *
551
555
  * @NgModule({
552
556
  * declarations: [AppComponent],
553
557
  * imports: [BrowserModule],
554
- * providers: [provideAngularQuery(new QueryClient())],
558
+ * providers: [provideTanStackQuery(new QueryClient())],
555
559
  * bootstrap: [AppComponent],
556
560
  * })
557
561
  * export class AppModule {}
558
562
  * ```
563
+ *
564
+ * You can also enable optional developer tools by adding `withDevtools`. By
565
+ * default the tools will then be loaded when your app is in development mode.
566
+ * ```ts
567
+ * import {
568
+ * provideTanStackQuery,
569
+ * withDevtools
570
+ * QueryClient,
571
+ * } from '@tanstack/angular-query-experimental'
572
+ *
573
+ * bootstrapApplication(AppComponent,
574
+ * {
575
+ * providers: [
576
+ * provideTanStackQuery(new QueryClient(), withDevtools())
577
+ * ]
578
+ * }
579
+ * )
580
+ * ```
559
581
  * @param queryClient - A `QueryClient` instance.
582
+ * @param features - Optional features to configure additional Query functionality.
560
583
  * @returns A set of providers to set up TanStack Query.
561
584
  * @public
562
585
  * @see https://tanstack.com/query/v5/docs/framework/angular/quick-start
586
+ * @see withDevtools
563
587
  */
564
- function provideAngularQuery(queryClient) {
588
+ function provideTanStackQuery(queryClient, ...features) {
565
589
  return makeEnvironmentProviders([
566
590
  provideQueryClient(queryClient),
567
591
  {
@@ -573,8 +597,135 @@ function provideAngularQuery(queryClient) {
573
597
  inject(DestroyRef).onDestroy(() => queryClient.unmount());
574
598
  },
575
599
  },
600
+ features.map((feature) => feature.ɵproviders),
576
601
  ]);
577
602
  }
603
+ /**
604
+ * Sets up providers necessary to enable TanStack Query functionality for Angular applications.
605
+ *
606
+ * Allows to configure a `QueryClient`.
607
+ * @param queryClient - A `QueryClient` instance.
608
+ * @returns A set of providers to set up TanStack Query.
609
+ * @public
610
+ * @see https://tanstack.com/query/v5/docs/framework/angular/quick-start
611
+ * @deprecated Use `provideTanStackQuery` instead.
612
+ */
613
+ function provideAngularQuery(queryClient) {
614
+ return provideTanStackQuery(queryClient);
615
+ }
616
+ /**
617
+ * Helper function to create an object that represents a Query feature.
618
+ * @param kind -
619
+ * @param providers -
620
+ * @returns A Query feature.
621
+ */
622
+ function queryFeature(kind, providers) {
623
+ return { ɵkind: kind, ɵproviders: providers };
624
+ }
625
+ /**
626
+ * Enables developer tools.
627
+ *
628
+ * **Example**
629
+ *
630
+ * ```ts
631
+ * export const appConfig: ApplicationConfig = {
632
+ * providers: [
633
+ * provideTanStackQuery(new QueryClient(), withDevtools())
634
+ * ]
635
+ * }
636
+ * ```
637
+ * By default the devtools will be loaded when Angular runs in development mode and rendered in `<body>`.
638
+ *
639
+ * If you need more control over when devtools are loaded, you can use the `loadDevtools` option. This is particularly useful if you want to load devtools based on environment configurations. For instance, you might have a test environment running in production mode but still require devtools to be available.
640
+ *
641
+ * If you need more control over where devtools are rendered, consider `injectDevtoolsPanel`. This allows rendering devtools inside your own devtools for example.
642
+ * @param optionsFn - A function that returns `DevtoolsOptions`.
643
+ * @returns A set of providers for use with `provideTanStackQuery`.
644
+ * @public
645
+ * @see {@link provideTanStackQuery}
646
+ * @see {@link DevtoolsOptions}
647
+ */
648
+ function withDevtools(optionsFn) {
649
+ let providers = [];
650
+ if (!isDevMode() && !optionsFn) {
651
+ providers = [];
652
+ }
653
+ else {
654
+ providers = [
655
+ {
656
+ provide: ENVIRONMENT_INITIALIZER,
657
+ multi: true,
658
+ useFactory: () => {
659
+ if (!isPlatformBrowser(inject(PLATFORM_ID)))
660
+ return () => { };
661
+ const injector = inject(Injector);
662
+ const options = computed(() => runInInjectionContext(injector, () => optionsFn?.() ?? {}));
663
+ let devtools = null;
664
+ let el = null;
665
+ const shouldLoadToolsSignal = computed(() => {
666
+ const { loadDevtools } = options();
667
+ return typeof loadDevtools === 'boolean'
668
+ ? loadDevtools
669
+ : isDevMode();
670
+ });
671
+ const doc = inject(DOCUMENT);
672
+ const destroyRef = inject(DestroyRef);
673
+ const getResolvedQueryClient = () => {
674
+ const injectedClient = injectQueryClient({
675
+ optional: true,
676
+ injector,
677
+ });
678
+ const client = options().client ?? injectedClient;
679
+ if (!client) {
680
+ throw new Error('No QueryClient found');
681
+ }
682
+ return client;
683
+ };
684
+ const destroyDevtools = () => {
685
+ devtools?.unmount();
686
+ el?.remove();
687
+ devtools = null;
688
+ };
689
+ return () => effect(() => {
690
+ const shouldLoadTools = shouldLoadToolsSignal();
691
+ const { client, position, errorTypes, buttonPosition, initialIsOpen, } = options();
692
+ if (devtools && !shouldLoadTools) {
693
+ destroyDevtools();
694
+ return;
695
+ }
696
+ else if (devtools && shouldLoadTools) {
697
+ client && devtools.setClient(client);
698
+ position && devtools.setPosition(position);
699
+ errorTypes && devtools.setErrorTypes(errorTypes);
700
+ buttonPosition && devtools.setButtonPosition(buttonPosition);
701
+ initialIsOpen && devtools.setInitialIsOpen(initialIsOpen);
702
+ return;
703
+ }
704
+ else if (!shouldLoadTools) {
705
+ return;
706
+ }
707
+ el = doc.body.appendChild(document.createElement('div'));
708
+ el.classList.add('tsqd-parent-container');
709
+ import('@tanstack/query-devtools').then((queryDevtools) => runInInjectionContext(injector, () => {
710
+ devtools = new queryDevtools.TanstackQueryDevtools({
711
+ ...options(),
712
+ client: getResolvedQueryClient(),
713
+ queryFlavor: 'Angular Query',
714
+ version: '5',
715
+ onlineManager,
716
+ });
717
+ el && devtools.mount(el);
718
+ // Unmount the devtools on application destroy
719
+ destroyRef.onDestroy(destroyDevtools);
720
+ }));
721
+ });
722
+ },
723
+ },
724
+ ];
725
+ }
726
+ return queryFeature('DeveloperTools', providers);
727
+ }
728
+ const queryFeatures = ['DeveloperTools'];
578
729
 
579
730
  /* istanbul ignore file */
580
731
  // Re-export core
@@ -583,5 +734,5 @@ function provideAngularQuery(queryClient) {
583
734
  * Generated bundle index. Do not edit.
584
735
  */
585
736
 
586
- export { infiniteQueryOptions, injectInfiniteQuery, injectIsFetching, injectIsMutating, injectMutation, injectMutationState, injectQueries, injectQuery, injectQueryClient, provideAngularQuery, provideQueryClient, queryOptions };
737
+ export { QUERY_CLIENT, infiniteQueryOptions, injectInfiniteQuery, injectIsFetching, injectIsMutating, injectMutation, injectMutationState, injectQueries, injectQuery, injectQueryClient, provideAngularQuery, provideQueryClient, provideTanStackQuery, queryFeatures, queryOptions, withDevtools };
587
738
  //# sourceMappingURL=tanstack-angular-query-experimental.mjs.map