@tanstack/angular-query-experimental 5.94.4 → 5.94.5

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.
Files changed (78) hide show
  1. package/create-base-query.d.ts +170 -0
  2. package/create-base-query.mjs +99 -0
  3. package/create-base-query.mjs.map +1 -0
  4. package/devtools/index.d.ts +2 -0
  5. package/devtools/index.mjs +5 -0
  6. package/devtools/index.mjs.map +1 -0
  7. package/devtools/production/index.d.ts +1 -0
  8. package/devtools/stub.d.ts +2 -0
  9. package/devtools/stub.mjs +8 -0
  10. package/devtools/stub.mjs.map +1 -0
  11. package/devtools/types.d.ts +95 -0
  12. package/devtools/with-devtools.d.ts +25 -0
  13. package/devtools/with-devtools.mjs +104 -0
  14. package/devtools/with-devtools.mjs.map +1 -0
  15. package/devtools-panel/index.d.ts +2 -0
  16. package/devtools-panel/index.mjs +5 -0
  17. package/devtools-panel/index.mjs.map +1 -0
  18. package/devtools-panel/inject-devtools-panel.d.ts +14 -0
  19. package/devtools-panel/inject-devtools-panel.mjs +72 -0
  20. package/devtools-panel/inject-devtools-panel.mjs.map +1 -0
  21. package/devtools-panel/production/index.d.ts +1 -0
  22. package/devtools-panel/stub.d.ts +2 -0
  23. package/devtools-panel/stub.mjs +8 -0
  24. package/devtools-panel/stub.mjs.map +1 -0
  25. package/devtools-panel/types.d.ts +48 -0
  26. package/index.d.ts +25 -0
  27. package/index.mjs +32 -0
  28. package/index.mjs.map +1 -0
  29. package/infinite-query-options.d.ts +41 -0
  30. package/infinite-query-options.mjs +7 -0
  31. package/infinite-query-options.mjs.map +1 -0
  32. package/inject-infinite-query.d.ts +36 -0
  33. package/inject-infinite-query.mjs +18 -0
  34. package/inject-infinite-query.mjs.map +1 -0
  35. package/inject-is-fetching.d.ts +20 -0
  36. package/inject-is-fetching.mjs +31 -0
  37. package/inject-is-fetching.mjs.map +1 -0
  38. package/inject-is-mutating.d.ts +19 -0
  39. package/inject-is-mutating.mjs +31 -0
  40. package/inject-is-mutating.mjs.map +1 -0
  41. package/inject-is-restoring.d.ts +22 -0
  42. package/inject-is-restoring.mjs +21 -0
  43. package/inject-is-restoring.mjs.map +1 -0
  44. package/inject-mutation-state.d.ts +22 -0
  45. package/inject-mutation-state.mjs +51 -0
  46. package/inject-mutation-state.mjs.map +1 -0
  47. package/inject-mutation.d.ts +20 -0
  48. package/inject-mutation.mjs +94 -0
  49. package/inject-mutation.mjs.map +1 -0
  50. package/inject-queries-experimental/index.d.ts +1 -0
  51. package/inject-queries-experimental/index.mjs +5 -0
  52. package/inject-queries-experimental/index.mjs.map +1 -0
  53. package/inject-queries.d.ts +81 -0
  54. package/inject-queries.mjs +82 -0
  55. package/inject-queries.mjs.map +1 -0
  56. package/inject-query-client.d.ts +18 -0
  57. package/inject-query-client.mjs +9 -0
  58. package/inject-query-client.mjs.map +1 -0
  59. package/inject-query.d.ts +123 -0
  60. package/inject-query.mjs +14 -0
  61. package/inject-query.mjs.map +1 -0
  62. package/mutation-options.d.ts +39 -0
  63. package/mutation-options.mjs +7 -0
  64. package/mutation-options.mjs.map +1 -0
  65. package/package.json +3 -3
  66. package/pending-tasks-compat.d.ts +7 -0
  67. package/pending-tasks-compat.mjs +19 -0
  68. package/pending-tasks-compat.mjs.map +1 -0
  69. package/providers.d.ts +132 -0
  70. package/providers.mjs +32 -0
  71. package/providers.mjs.map +1 -0
  72. package/query-options.d.ts +84 -0
  73. package/query-options.mjs +7 -0
  74. package/query-options.mjs.map +1 -0
  75. package/signal-proxy.d.ts +11 -0
  76. package/signal-proxy.mjs +29 -0
  77. package/signal-proxy.mjs.map +1 -0
  78. package/types.d.ts +43 -0
@@ -0,0 +1,170 @@
1
+ import { QueryKey, QueryObserver, QueryObserverResult } from '@tanstack/query-core';
2
+ import { CreateBaseQueryOptions } from './types.js';
3
+ /**
4
+ * Base implementation for `injectQuery` and `injectInfiniteQuery`.
5
+ * @param optionsFn
6
+ * @param Observer
7
+ */
8
+ export declare function createBaseQuery<TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey>(optionsFn: () => CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, Observer: typeof QueryObserver): import('./signal-proxy.js').MapToSignals<{
9
+ refetch: (options?: import('@tanstack/query-core').RefetchOptions) => Promise<QueryObserverResult<TData, TError>>;
10
+ data: TData;
11
+ error: TError;
12
+ isError: true;
13
+ isPending: false;
14
+ isLoading: false;
15
+ isLoadingError: false;
16
+ isRefetchError: true;
17
+ isSuccess: false;
18
+ isPlaceholderData: false;
19
+ status: "error";
20
+ dataUpdatedAt: number;
21
+ errorUpdatedAt: number;
22
+ failureCount: number;
23
+ failureReason: TError | null;
24
+ errorUpdateCount: number;
25
+ isFetched: boolean;
26
+ isFetchedAfterMount: boolean;
27
+ isFetching: boolean;
28
+ isInitialLoading: boolean;
29
+ isPaused: boolean;
30
+ isRefetching: boolean;
31
+ isStale: boolean;
32
+ isEnabled: boolean;
33
+ fetchStatus: import('@tanstack/query-core').FetchStatus;
34
+ promise: Promise<TData>;
35
+ } | {
36
+ refetch: (options?: import('@tanstack/query-core').RefetchOptions) => Promise<QueryObserverResult<TData, TError>>;
37
+ data: TData;
38
+ error: null;
39
+ isError: false;
40
+ isPending: false;
41
+ isLoading: false;
42
+ isLoadingError: false;
43
+ isRefetchError: false;
44
+ isSuccess: true;
45
+ isPlaceholderData: false;
46
+ status: "success";
47
+ dataUpdatedAt: number;
48
+ errorUpdatedAt: number;
49
+ failureCount: number;
50
+ failureReason: TError | null;
51
+ errorUpdateCount: number;
52
+ isFetched: boolean;
53
+ isFetchedAfterMount: boolean;
54
+ isFetching: boolean;
55
+ isInitialLoading: boolean;
56
+ isPaused: boolean;
57
+ isRefetching: boolean;
58
+ isStale: boolean;
59
+ isEnabled: boolean;
60
+ fetchStatus: import('@tanstack/query-core').FetchStatus;
61
+ promise: Promise<TData>;
62
+ } | {
63
+ refetch: (options?: import('@tanstack/query-core').RefetchOptions) => Promise<QueryObserverResult<TData, TError>>;
64
+ data: undefined;
65
+ error: TError;
66
+ isError: true;
67
+ isPending: false;
68
+ isLoading: false;
69
+ isLoadingError: true;
70
+ isRefetchError: false;
71
+ isSuccess: false;
72
+ isPlaceholderData: false;
73
+ status: "error";
74
+ dataUpdatedAt: number;
75
+ errorUpdatedAt: number;
76
+ failureCount: number;
77
+ failureReason: TError | null;
78
+ errorUpdateCount: number;
79
+ isFetched: boolean;
80
+ isFetchedAfterMount: boolean;
81
+ isFetching: boolean;
82
+ isInitialLoading: boolean;
83
+ isPaused: boolean;
84
+ isRefetching: boolean;
85
+ isStale: boolean;
86
+ isEnabled: boolean;
87
+ fetchStatus: import('@tanstack/query-core').FetchStatus;
88
+ promise: Promise<TData>;
89
+ } | {
90
+ refetch: (options?: import('@tanstack/query-core').RefetchOptions) => Promise<QueryObserverResult<TData, TError>>;
91
+ data: undefined;
92
+ error: null;
93
+ isError: false;
94
+ isPending: true;
95
+ isLoading: true;
96
+ isLoadingError: false;
97
+ isRefetchError: false;
98
+ isSuccess: false;
99
+ isPlaceholderData: false;
100
+ status: "pending";
101
+ dataUpdatedAt: number;
102
+ errorUpdatedAt: number;
103
+ failureCount: number;
104
+ failureReason: TError | null;
105
+ errorUpdateCount: number;
106
+ isFetched: boolean;
107
+ isFetchedAfterMount: boolean;
108
+ isFetching: boolean;
109
+ isInitialLoading: boolean;
110
+ isPaused: boolean;
111
+ isRefetching: boolean;
112
+ isStale: boolean;
113
+ isEnabled: boolean;
114
+ fetchStatus: import('@tanstack/query-core').FetchStatus;
115
+ promise: Promise<TData>;
116
+ } | {
117
+ refetch: (options?: import('@tanstack/query-core').RefetchOptions) => Promise<QueryObserverResult<TData, TError>>;
118
+ data: undefined;
119
+ error: null;
120
+ isError: false;
121
+ isPending: true;
122
+ isLoadingError: false;
123
+ isRefetchError: false;
124
+ isSuccess: false;
125
+ isPlaceholderData: false;
126
+ status: "pending";
127
+ dataUpdatedAt: number;
128
+ errorUpdatedAt: number;
129
+ failureCount: number;
130
+ failureReason: TError | null;
131
+ errorUpdateCount: number;
132
+ isFetched: boolean;
133
+ isFetchedAfterMount: boolean;
134
+ isFetching: boolean;
135
+ isLoading: boolean;
136
+ isInitialLoading: boolean;
137
+ isPaused: boolean;
138
+ isRefetching: boolean;
139
+ isStale: boolean;
140
+ isEnabled: boolean;
141
+ fetchStatus: import('@tanstack/query-core').FetchStatus;
142
+ promise: Promise<TData>;
143
+ } | {
144
+ refetch: (options?: import('@tanstack/query-core').RefetchOptions) => Promise<QueryObserverResult<TData, TError>>;
145
+ data: TData;
146
+ isError: false;
147
+ error: null;
148
+ isPending: false;
149
+ isLoading: false;
150
+ isLoadingError: false;
151
+ isRefetchError: false;
152
+ isSuccess: true;
153
+ isPlaceholderData: true;
154
+ status: "success";
155
+ dataUpdatedAt: number;
156
+ errorUpdatedAt: number;
157
+ failureCount: number;
158
+ failureReason: TError | null;
159
+ errorUpdateCount: number;
160
+ isFetched: boolean;
161
+ isFetchedAfterMount: boolean;
162
+ isFetching: boolean;
163
+ isInitialLoading: boolean;
164
+ isPaused: boolean;
165
+ isRefetching: boolean;
166
+ isStale: boolean;
167
+ isEnabled: boolean;
168
+ fetchStatus: import('@tanstack/query-core').FetchStatus;
169
+ promise: Promise<TData>;
170
+ }>;
@@ -0,0 +1,99 @@
1
+ import { inject, NgZone, computed, signal, effect, untracked, VERSION } from "@angular/core";
2
+ import { QueryClient, notifyManager, shouldThrowError } from "@tanstack/query-core";
3
+ import { signalProxy } from "./signal-proxy.mjs";
4
+ import { injectIsRestoring } from "./inject-is-restoring.mjs";
5
+ import { PENDING_TASKS } from "./pending-tasks-compat.mjs";
6
+ function createBaseQuery(optionsFn, Observer) {
7
+ const ngZone = inject(NgZone);
8
+ const pendingTasks = inject(PENDING_TASKS);
9
+ const queryClient = inject(QueryClient);
10
+ const isRestoring = injectIsRestoring();
11
+ const defaultedOptionsSignal = computed(() => {
12
+ const defaultedOptions = queryClient.defaultQueryOptions(optionsFn());
13
+ defaultedOptions._optimisticResults = isRestoring() ? "isRestoring" : "optimistic";
14
+ return defaultedOptions;
15
+ });
16
+ const observerSignal = (() => {
17
+ let instance = null;
18
+ return computed(() => {
19
+ return instance || (instance = new Observer(queryClient, defaultedOptionsSignal()));
20
+ });
21
+ })();
22
+ const optimisticResultSignal = computed(
23
+ () => observerSignal().getOptimisticResult(defaultedOptionsSignal())
24
+ );
25
+ const resultFromSubscriberSignal = signal(null);
26
+ effect(
27
+ (onCleanup) => {
28
+ const observer = observerSignal();
29
+ const defaultedOptions = defaultedOptionsSignal();
30
+ untracked(() => {
31
+ observer.setOptions(defaultedOptions);
32
+ });
33
+ onCleanup(() => {
34
+ ngZone.run(() => resultFromSubscriberSignal.set(null));
35
+ });
36
+ },
37
+ {
38
+ // Set allowSignalWrites to support Angular < v19
39
+ // Set to undefined to avoid warning on newer versions
40
+ allowSignalWrites: VERSION.major < "19" || void 0
41
+ }
42
+ );
43
+ effect((onCleanup) => {
44
+ const observer = observerSignal();
45
+ let pendingTaskRef = null;
46
+ const unsubscribe = isRestoring() ? () => void 0 : untracked(
47
+ () => ngZone.runOutsideAngular(() => {
48
+ return observer.subscribe(
49
+ notifyManager.batchCalls((state) => {
50
+ ngZone.run(() => {
51
+ if (state.fetchStatus === "fetching" && !pendingTaskRef) {
52
+ pendingTaskRef = pendingTasks.add();
53
+ }
54
+ if (state.fetchStatus === "idle" && pendingTaskRef) {
55
+ pendingTaskRef();
56
+ pendingTaskRef = null;
57
+ }
58
+ if (state.isError && !state.isFetching && shouldThrowError(observer.options.throwOnError, [
59
+ state.error,
60
+ observer.getCurrentQuery()
61
+ ])) {
62
+ ngZone.onError.emit(state.error);
63
+ throw state.error;
64
+ }
65
+ resultFromSubscriberSignal.set(state);
66
+ });
67
+ })
68
+ );
69
+ })
70
+ );
71
+ onCleanup(() => {
72
+ if (pendingTaskRef) {
73
+ pendingTaskRef();
74
+ pendingTaskRef = null;
75
+ }
76
+ unsubscribe();
77
+ });
78
+ });
79
+ return signalProxy(
80
+ computed(() => {
81
+ const subscriberResult = resultFromSubscriberSignal();
82
+ const optimisticResult = optimisticResultSignal();
83
+ const result = subscriberResult ?? optimisticResult;
84
+ const observer = observerSignal();
85
+ const originalRefetch = result.refetch;
86
+ return {
87
+ ...result,
88
+ refetch: ((...args) => {
89
+ observer.setOptions(defaultedOptionsSignal());
90
+ return originalRefetch(...args);
91
+ })
92
+ };
93
+ })
94
+ );
95
+ }
96
+ export {
97
+ createBaseQuery
98
+ };
99
+ //# sourceMappingURL=create-base-query.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-base-query.mjs","sources":["../src/create-base-query.ts"],"sourcesContent":["import {\n NgZone,\n VERSION,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core'\nimport {\n QueryClient,\n notifyManager,\n shouldThrowError,\n} from '@tanstack/query-core'\nimport { signalProxy } from './signal-proxy'\nimport { injectIsRestoring } from './inject-is-restoring'\nimport { PENDING_TASKS } from './pending-tasks-compat'\nimport type { PendingTaskRef } from './pending-tasks-compat'\nimport type {\n QueryKey,\n QueryObserver,\n QueryObserverResult,\n} from '@tanstack/query-core'\nimport type { CreateBaseQueryOptions } from './types'\n\n/**\n * Base implementation for `injectQuery` and `injectInfiniteQuery`.\n * @param optionsFn\n * @param Observer\n */\nexport function createBaseQuery<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey extends QueryKey,\n>(\n optionsFn: () => CreateBaseQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n Observer: typeof QueryObserver,\n) {\n const ngZone = inject(NgZone)\n const pendingTasks = inject(PENDING_TASKS)\n const queryClient = inject(QueryClient)\n const isRestoring = injectIsRestoring()\n\n /**\n * Signal that has the default options from query client applied\n * computed() is used so signals can be inserted into the options\n * making it reactive. Wrapping options in a function ensures embedded expressions\n * are preserved and can keep being applied after signal changes\n */\n const defaultedOptionsSignal = computed(() => {\n const defaultedOptions = queryClient.defaultQueryOptions(optionsFn())\n defaultedOptions._optimisticResults = isRestoring()\n ? 'isRestoring'\n : 'optimistic'\n return defaultedOptions\n })\n\n const observerSignal = (() => {\n let instance: QueryObserver<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n > | null = null\n\n return computed(() => {\n return (instance ||= new Observer(queryClient, defaultedOptionsSignal()))\n })\n })()\n\n const optimisticResultSignal = computed(() =>\n observerSignal().getOptimisticResult(defaultedOptionsSignal()),\n )\n\n const resultFromSubscriberSignal = signal<QueryObserverResult<\n TData,\n TError\n > | null>(null)\n\n effect(\n (onCleanup) => {\n const observer = observerSignal()\n const defaultedOptions = defaultedOptionsSignal()\n\n untracked(() => {\n observer.setOptions(defaultedOptions)\n })\n onCleanup(() => {\n ngZone.run(() => resultFromSubscriberSignal.set(null))\n })\n },\n {\n // Set allowSignalWrites to support Angular < v19\n // Set to undefined to avoid warning on newer versions\n allowSignalWrites: VERSION.major < '19' || undefined,\n },\n )\n\n effect((onCleanup) => {\n // observer.trackResult is not used as this optimization is not needed for Angular\n const observer = observerSignal()\n let pendingTaskRef: PendingTaskRef | null = null\n\n const unsubscribe = isRestoring()\n ? () => undefined\n : untracked(() =>\n ngZone.runOutsideAngular(() => {\n return observer.subscribe(\n notifyManager.batchCalls((state) => {\n ngZone.run(() => {\n if (state.fetchStatus === 'fetching' && !pendingTaskRef) {\n pendingTaskRef = pendingTasks.add()\n }\n\n if (state.fetchStatus === 'idle' && pendingTaskRef) {\n pendingTaskRef()\n pendingTaskRef = null\n }\n\n if (\n state.isError &&\n !state.isFetching &&\n shouldThrowError(observer.options.throwOnError, [\n state.error,\n observer.getCurrentQuery(),\n ])\n ) {\n ngZone.onError.emit(state.error)\n throw state.error\n }\n resultFromSubscriberSignal.set(state)\n })\n }),\n )\n }),\n )\n\n onCleanup(() => {\n if (pendingTaskRef) {\n pendingTaskRef()\n pendingTaskRef = null\n }\n unsubscribe()\n })\n })\n\n return signalProxy(\n computed(() => {\n const subscriberResult = resultFromSubscriberSignal()\n const optimisticResult = optimisticResultSignal()\n const result = subscriberResult ?? optimisticResult\n\n // Wrap methods to ensure observer has latest options before execution\n const observer = observerSignal()\n\n const originalRefetch = result.refetch\n return {\n ...result,\n refetch: ((...args: Parameters<typeof originalRefetch>) => {\n observer.setOptions(defaultedOptionsSignal())\n return originalRefetch(...args)\n }) as typeof originalRefetch,\n }\n }),\n )\n}\n"],"names":[],"mappings":";;;;;AA8BO,SAAS,gBAOd,WAOA,UACA;AACA,QAAM,SAAS,OAAO,MAAM;AAC5B,QAAM,eAAe,OAAO,aAAa;AACzC,QAAM,cAAc,OAAO,WAAW;AACtC,QAAM,cAAc,kBAAA;AAQpB,QAAM,yBAAyB,SAAS,MAAM;AAC5C,UAAM,mBAAmB,YAAY,oBAAoB,UAAA,CAAW;AACpE,qBAAiB,qBAAqB,YAAA,IAClC,gBACA;AACJ,WAAO;AAAA,EACT,CAAC;AAED,QAAM,kBAAkB,MAAM;AAC5B,QAAI,WAMO;AAEX,WAAO,SAAS,MAAM;AACpB,aAAQ,wBAAa,IAAI,SAAS,aAAa,wBAAwB;AAAA,IACzE,CAAC;AAAA,EACH,GAAA;AAEA,QAAM,yBAAyB;AAAA,IAAS,MACtC,eAAA,EAAiB,oBAAoB,wBAAwB;AAAA,EAAA;AAG/D,QAAM,6BAA6B,OAGzB,IAAI;AAEd;AAAA,IACE,CAAC,cAAc;AACb,YAAM,WAAW,eAAA;AACjB,YAAM,mBAAmB,uBAAA;AAEzB,gBAAU,MAAM;AACd,iBAAS,WAAW,gBAAgB;AAAA,MACtC,CAAC;AACD,gBAAU,MAAM;AACd,eAAO,IAAI,MAAM,2BAA2B,IAAI,IAAI,CAAC;AAAA,MACvD,CAAC;AAAA,IACH;AAAA,IACA;AAAA;AAAA;AAAA,MAGE,mBAAmB,QAAQ,QAAQ,QAAQ;AAAA,IAAA;AAAA,EAC7C;AAGF,SAAO,CAAC,cAAc;AAEpB,UAAM,WAAW,eAAA;AACjB,QAAI,iBAAwC;AAE5C,UAAM,cAAc,gBAChB,MAAM,SACN;AAAA,MAAU,MACR,OAAO,kBAAkB,MAAM;AAC7B,eAAO,SAAS;AAAA,UACd,cAAc,WAAW,CAAC,UAAU;AAClC,mBAAO,IAAI,MAAM;AACf,kBAAI,MAAM,gBAAgB,cAAc,CAAC,gBAAgB;AACvD,iCAAiB,aAAa,IAAA;AAAA,cAChC;AAEA,kBAAI,MAAM,gBAAgB,UAAU,gBAAgB;AAClD,+BAAA;AACA,iCAAiB;AAAA,cACnB;AAEA,kBACE,MAAM,WACN,CAAC,MAAM,cACP,iBAAiB,SAAS,QAAQ,cAAc;AAAA,gBAC9C,MAAM;AAAA,gBACN,SAAS,gBAAA;AAAA,cAAgB,CAC1B,GACD;AACA,uBAAO,QAAQ,KAAK,MAAM,KAAK;AAC/B,sBAAM,MAAM;AAAA,cACd;AACA,yCAA2B,IAAI,KAAK;AAAA,YACtC,CAAC;AAAA,UACH,CAAC;AAAA,QAAA;AAAA,MAEL,CAAC;AAAA,IAAA;AAGP,cAAU,MAAM;AACd,UAAI,gBAAgB;AAClB,uBAAA;AACA,yBAAiB;AAAA,MACnB;AACA,kBAAA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL,SAAS,MAAM;AACb,YAAM,mBAAmB,2BAAA;AACzB,YAAM,mBAAmB,uBAAA;AACzB,YAAM,SAAS,oBAAoB;AAGnC,YAAM,WAAW,eAAA;AAEjB,YAAM,kBAAkB,OAAO;AAC/B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,IAAI,SAA6C;AACzD,mBAAS,WAAW,wBAAwB;AAC5C,iBAAO,gBAAgB,GAAG,IAAI;AAAA,QAChC;AAAA,MAAA;AAAA,IAEJ,CAAC;AAAA,EAAA;AAEL;"}
@@ -0,0 +1,2 @@
1
+ export type { DevtoolsOptions, WithDevtools, WithDevtoolsFn, WithDevtoolsOptions, } from './types.js';
2
+ export { withDevtools } from './with-devtools.js';
@@ -0,0 +1,5 @@
1
+ import { withDevtools } from "./with-devtools.mjs";
2
+ export {
3
+ withDevtools
4
+ };
5
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1 @@
1
+ export * from '..';
@@ -0,0 +1,2 @@
1
+ import { WithDevtools } from './types.js';
2
+ export declare const withDevtools: WithDevtools;
@@ -0,0 +1,8 @@
1
+ const withDevtools = () => ({
2
+ ɵkind: "Devtools",
3
+ ɵproviders: []
4
+ });
5
+ export {
6
+ withDevtools
7
+ };
8
+ //# sourceMappingURL=stub.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stub.mjs","sources":["../../src/devtools/stub.ts"],"sourcesContent":["import type { WithDevtools } from './types'\n\n// Stub which replaces `withDevtools` in production builds\nexport const withDevtools: WithDevtools = () => ({\n ɵkind: 'Devtools',\n ɵproviders: [],\n})\n"],"names":[],"mappings":"AAGO,MAAM,eAA6B,OAAO;AAAA,EAC/C,OAAO;AAAA,EACP,YAAY,CAAA;AACd;"}
@@ -0,0 +1,95 @@
1
+ import { QueryClient } from '@tanstack/query-core';
2
+ import { DevtoolsButtonPosition, DevtoolsErrorType, DevtoolsPosition } from '@tanstack/query-devtools';
3
+ import { DevtoolsFeature } from '../providers.js';
4
+ /**
5
+ * Options for configuring withDevtools.
6
+ */
7
+ export interface WithDevtoolsOptions {
8
+ /**
9
+ * An array of dependencies to be injected and passed to the `withDevtoolsFn` function.
10
+ *
11
+ * **Example**
12
+ * ```ts
13
+ * export const appConfig: ApplicationConfig = {
14
+ * providers: [
15
+ * provideTanStackQuery(
16
+ * new QueryClient(),
17
+ * withDevtools(
18
+ * (devToolsOptionsManager: DevtoolsOptionsManager) => ({
19
+ * loadDevtools: devToolsOptionsManager.loadDevtools(),
20
+ * }),
21
+ * {
22
+ * deps: [DevtoolsOptionsManager],
23
+ * },
24
+ * ),
25
+ * ),
26
+ * ],
27
+ * }
28
+ * ```
29
+ */
30
+ deps?: Array<any>;
31
+ }
32
+ /**
33
+ * Options for configuring the TanStack Query devtools.
34
+ */
35
+ export interface DevtoolsOptions {
36
+ /**
37
+ * Set this true if you want the devtools to default to being open
38
+ */
39
+ initialIsOpen?: boolean;
40
+ /**
41
+ * The position of the TanStack logo to open and close the devtools panel.
42
+ * `top-left` | `top-right` | `bottom-left` | `bottom-right` | `relative`
43
+ * Defaults to `bottom-right`.
44
+ */
45
+ buttonPosition?: DevtoolsButtonPosition;
46
+ /**
47
+ * The position of the TanStack Query devtools panel.
48
+ * `top` | `bottom` | `left` | `right`
49
+ * Defaults to `bottom`.
50
+ */
51
+ position?: DevtoolsPosition;
52
+ /**
53
+ * Custom instance of QueryClient
54
+ */
55
+ client?: QueryClient;
56
+ /**
57
+ * Use this so you can define custom errors that can be shown in the devtools.
58
+ */
59
+ errorTypes?: Array<DevtoolsErrorType>;
60
+ /**
61
+ * Use this to pass a nonce to the style tag that is added to the document head. This is useful if you are using a Content Security Policy (CSP) nonce to allow inline styles.
62
+ */
63
+ styleNonce?: string;
64
+ /**
65
+ * Use this so you can attach the devtool's styles to a specific element in the DOM.
66
+ */
67
+ shadowDOMTarget?: ShadowRoot;
68
+ /**
69
+ * Set this to true to hide disabled queries from the devtools panel.
70
+ */
71
+ hideDisabledQueries?: boolean;
72
+ /**
73
+ * Whether the developer tools should load.
74
+ * - `auto`- (Default) Lazily loads devtools when in development mode. Skips loading in production mode.
75
+ * - `true`- Always load the devtools, regardless of the environment.
76
+ * - `false`- Never load the devtools, regardless of the environment.
77
+ *
78
+ * You can use `true` and `false` to override loading developer tools from an environment file.
79
+ * For example, a test environment might run in production mode but you may want to load developer tools.
80
+ *
81
+ * Additionally, you can use a signal in the callback to dynamically load the devtools based on a condition. For example,
82
+ * a signal created from a RxJS observable that listens for a keyboard shortcut.
83
+ *
84
+ * **Example**
85
+ * ```ts
86
+ * withDevtools(() => ({
87
+ * initialIsOpen: true,
88
+ * loadDevtools: inject(ExampleService).loadDevtools()
89
+ * }))
90
+ * ```
91
+ */
92
+ loadDevtools?: 'auto' | boolean;
93
+ }
94
+ export type WithDevtoolsFn = (...deps: Array<any>) => DevtoolsOptions;
95
+ export type WithDevtools = (withDevtoolsFn?: WithDevtoolsFn, options?: WithDevtoolsOptions) => DevtoolsFeature;
@@ -0,0 +1,25 @@
1
+ import { WithDevtools } from './types.js';
2
+ /**
3
+ * Enables developer tools in Angular development builds.
4
+ *
5
+ * **Example**
6
+ *
7
+ * ```ts
8
+ * export const appConfig: ApplicationConfig = {
9
+ * providers: [
10
+ * provideTanStackQuery(new QueryClient(), withDevtools())
11
+ * ]
12
+ * }
13
+ * ```
14
+ * The devtools will be rendered in `<body>`.
15
+ *
16
+ * If you need more control over when devtools are loaded, you can use the `loadDevtools` option.
17
+ *
18
+ * If you need more control over where devtools are rendered, consider `injectDevtoolsPanel`. This allows rendering devtools inside your own devtools for example.
19
+ * @param withDevtoolsFn - A function that returns `DevtoolsOptions`.
20
+ * @param options - Additional options for configuring `withDevtools`.
21
+ * @returns A set of providers for use with `provideTanStackQuery`.
22
+ * @see {@link provideTanStackQuery}
23
+ * @see {@link DevtoolsOptions}
24
+ */
25
+ export declare const withDevtools: WithDevtools;
@@ -0,0 +1,104 @@
1
+ import { isPlatformBrowser } from "@angular/common";
2
+ import { InjectionToken, ENVIRONMENT_INITIALIZER, computed, inject, PLATFORM_ID, DestroyRef, Injector, isDevMode, effect } from "@angular/core";
3
+ import { noop, QueryClient, onlineManager } from "@tanstack/query-core";
4
+ import { queryFeature } from "../providers.mjs";
5
+ const DEVTOOLS_PROVIDED = new InjectionToken("", {
6
+ factory: () => ({
7
+ isProvided: false
8
+ })
9
+ });
10
+ const DEVTOOLS_OPTIONS_SIGNAL = new InjectionToken("");
11
+ const withDevtools = (withDevtoolsFn, options = {}) => queryFeature("Devtools", [
12
+ {
13
+ provide: DEVTOOLS_OPTIONS_SIGNAL,
14
+ useFactory: (...deps) => computed(() => (withDevtoolsFn == null ? void 0 : withDevtoolsFn(...deps)) ?? {}),
15
+ deps: options.deps || []
16
+ },
17
+ {
18
+ // Do not use provideEnvironmentInitializer while Angular < v19 is supported
19
+ provide: ENVIRONMENT_INITIALIZER,
20
+ multi: true,
21
+ useFactory: () => {
22
+ const devtoolsProvided = inject(DEVTOOLS_PROVIDED);
23
+ if (!isPlatformBrowser(inject(PLATFORM_ID)) || devtoolsProvided.isProvided)
24
+ return noop;
25
+ devtoolsProvided.isProvided = true;
26
+ let injectorIsDestroyed = false;
27
+ inject(DestroyRef).onDestroy(() => injectorIsDestroyed = true);
28
+ return () => {
29
+ const injectedClient = inject(QueryClient, {
30
+ optional: true
31
+ });
32
+ const destroyRef = inject(DestroyRef);
33
+ const devtoolsOptions = inject(DEVTOOLS_OPTIONS_SIGNAL);
34
+ const injector = inject(Injector);
35
+ let devtools = null;
36
+ let el = null;
37
+ const shouldLoadToolsSignal = computed(() => {
38
+ const { loadDevtools } = devtoolsOptions();
39
+ return typeof loadDevtools === "boolean" ? loadDevtools : isDevMode();
40
+ });
41
+ const getResolvedQueryClient = () => {
42
+ const client = devtoolsOptions().client ?? injectedClient;
43
+ if (!client) {
44
+ throw new Error("No QueryClient found");
45
+ }
46
+ return client;
47
+ };
48
+ const destroyDevtools = () => {
49
+ devtools == null ? void 0 : devtools.unmount();
50
+ el == null ? void 0 : el.remove();
51
+ devtools = null;
52
+ };
53
+ effect(
54
+ () => {
55
+ const shouldLoadTools = shouldLoadToolsSignal();
56
+ const {
57
+ client,
58
+ position,
59
+ errorTypes,
60
+ buttonPosition,
61
+ initialIsOpen
62
+ } = devtoolsOptions();
63
+ if (!shouldLoadTools) {
64
+ devtools && destroyDevtools();
65
+ return;
66
+ }
67
+ if (devtools) {
68
+ client && devtools.setClient(client);
69
+ position && devtools.setPosition(position);
70
+ errorTypes && devtools.setErrorTypes(errorTypes);
71
+ buttonPosition && devtools.setButtonPosition(buttonPosition);
72
+ typeof initialIsOpen === "boolean" && devtools.setInitialIsOpen(initialIsOpen);
73
+ return;
74
+ }
75
+ import("@tanstack/query-devtools").then((queryDevtools) => {
76
+ if (injectorIsDestroyed) return;
77
+ devtools = new queryDevtools.TanstackQueryDevtools({
78
+ ...devtoolsOptions(),
79
+ client: getResolvedQueryClient(),
80
+ queryFlavor: "Angular Query",
81
+ version: "5",
82
+ onlineManager
83
+ });
84
+ el = document.body.appendChild(document.createElement("div"));
85
+ el.classList.add("tsqd-parent-container");
86
+ devtools.mount(el);
87
+ destroyRef.onDestroy(destroyDevtools);
88
+ }).catch((error) => {
89
+ console.error(
90
+ "Install @tanstack/query-devtools or reinstall without --omit=optional.",
91
+ error
92
+ );
93
+ });
94
+ },
95
+ { injector }
96
+ );
97
+ };
98
+ }
99
+ }
100
+ ]);
101
+ export {
102
+ withDevtools
103
+ };
104
+ //# sourceMappingURL=with-devtools.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-devtools.mjs","sources":["../../src/devtools/with-devtools.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common'\nimport {\n DestroyRef,\n ENVIRONMENT_INITIALIZER,\n InjectionToken,\n Injector,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n isDevMode,\n} from '@angular/core'\nimport { QueryClient, noop, onlineManager } from '@tanstack/query-core'\nimport { queryFeature } from '../providers'\nimport type { Signal } from '@angular/core'\nimport type {\n DevtoolsOptions,\n WithDevtools,\n WithDevtoolsFn,\n WithDevtoolsOptions,\n} from './types'\nimport type { TanstackQueryDevtools } from '@tanstack/query-devtools'\n\n/**\n * Internal token used to prevent double providing of devtools in child injectors\n */\nconst DEVTOOLS_PROVIDED = new InjectionToken('', {\n factory: () => ({\n isProvided: false,\n }),\n})\n\n/**\n * Internal token for providing devtools options\n */\nconst DEVTOOLS_OPTIONS_SIGNAL = new InjectionToken<Signal<DevtoolsOptions>>('')\n\n/**\n * Enables developer tools in Angular development builds.\n *\n * **Example**\n *\n * ```ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideTanStackQuery(new QueryClient(), withDevtools())\n * ]\n * }\n * ```\n * The devtools will be rendered in `<body>`.\n *\n * If you need more control over when devtools are loaded, you can use the `loadDevtools` option.\n *\n * If you need more control over where devtools are rendered, consider `injectDevtoolsPanel`. This allows rendering devtools inside your own devtools for example.\n * @param withDevtoolsFn - A function that returns `DevtoolsOptions`.\n * @param options - Additional options for configuring `withDevtools`.\n * @returns A set of providers for use with `provideTanStackQuery`.\n * @see {@link provideTanStackQuery}\n * @see {@link DevtoolsOptions}\n */\nexport const withDevtools: WithDevtools = (\n withDevtoolsFn?: WithDevtoolsFn,\n options: WithDevtoolsOptions = {},\n) =>\n queryFeature('Devtools', [\n {\n provide: DEVTOOLS_OPTIONS_SIGNAL,\n useFactory: (...deps: Array<any>) =>\n computed(() => withDevtoolsFn?.(...deps) ?? {}),\n deps: options.deps || [],\n },\n {\n // Do not use provideEnvironmentInitializer while Angular < v19 is supported\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: () => {\n const devtoolsProvided = inject(DEVTOOLS_PROVIDED)\n if (\n !isPlatformBrowser(inject(PLATFORM_ID)) ||\n devtoolsProvided.isProvided\n )\n return noop\n\n devtoolsProvided.isProvided = true\n let injectorIsDestroyed = false\n inject(DestroyRef).onDestroy(() => (injectorIsDestroyed = true))\n\n return () => {\n const injectedClient = inject(QueryClient, {\n optional: true,\n })\n const destroyRef = inject(DestroyRef)\n const devtoolsOptions = inject(DEVTOOLS_OPTIONS_SIGNAL)\n const injector = inject(Injector)\n\n let devtools: TanstackQueryDevtools | null = null\n let el: HTMLElement | null = null\n\n const shouldLoadToolsSignal = computed(() => {\n const { loadDevtools } = devtoolsOptions()\n return typeof loadDevtools === 'boolean'\n ? loadDevtools\n : isDevMode()\n })\n\n const getResolvedQueryClient = () => {\n const client = devtoolsOptions().client ?? injectedClient\n if (!client) {\n throw new Error('No QueryClient found')\n }\n return client\n }\n\n const destroyDevtools = () => {\n devtools?.unmount()\n el?.remove()\n devtools = null\n }\n\n effect(\n () => {\n const shouldLoadTools = shouldLoadToolsSignal()\n const {\n client,\n position,\n errorTypes,\n buttonPosition,\n initialIsOpen,\n } = devtoolsOptions()\n\n if (!shouldLoadTools) {\n // Destroy or do nothing\n devtools && destroyDevtools()\n return\n }\n\n if (devtools) {\n // Update existing devtools config\n client && devtools.setClient(client)\n position && devtools.setPosition(position)\n errorTypes && devtools.setErrorTypes(errorTypes)\n buttonPosition && devtools.setButtonPosition(buttonPosition)\n typeof initialIsOpen === 'boolean' &&\n devtools.setInitialIsOpen(initialIsOpen)\n return\n }\n\n // Create devtools\n import('@tanstack/query-devtools')\n .then((queryDevtools) => {\n // As this code runs async, the injector could have been destroyed\n if (injectorIsDestroyed) return\n\n devtools = new queryDevtools.TanstackQueryDevtools({\n ...devtoolsOptions(),\n client: getResolvedQueryClient(),\n queryFlavor: 'Angular Query',\n version: '5',\n onlineManager,\n })\n\n el = document.body.appendChild(document.createElement('div'))\n el.classList.add('tsqd-parent-container')\n devtools.mount(el)\n\n destroyRef.onDestroy(destroyDevtools)\n })\n .catch((error) => {\n console.error(\n 'Install @tanstack/query-devtools or reinstall without --omit=optional.',\n error,\n )\n })\n },\n { injector },\n )\n }\n },\n },\n ])\n"],"names":[],"mappings":";;;;AA0BA,MAAM,oBAAoB,IAAI,eAAe,IAAI;AAAA,EAC/C,SAAS,OAAO;AAAA,IACd,YAAY;AAAA,EAAA;AAEhB,CAAC;AAKD,MAAM,0BAA0B,IAAI,eAAwC,EAAE;AAyBvE,MAAM,eAA6B,CACxC,gBACA,UAA+B,CAAA,MAE/B,aAAa,YAAY;AAAA,EACvB;AAAA,IACE,SAAS;AAAA,IACT,YAAY,IAAI,SACd,SAAS,OAAM,iDAAiB,GAAG,UAAS,EAAE;AAAA,IAChD,MAAM,QAAQ,QAAQ,CAAA;AAAA,EAAC;AAAA,EAEzB;AAAA;AAAA,IAEE,SAAS;AAAA,IACT,OAAO;AAAA,IACP,YAAY,MAAM;AAChB,YAAM,mBAAmB,OAAO,iBAAiB;AACjD,UACE,CAAC,kBAAkB,OAAO,WAAW,CAAC,KACtC,iBAAiB;AAEjB,eAAO;AAET,uBAAiB,aAAa;AAC9B,UAAI,sBAAsB;AAC1B,aAAO,UAAU,EAAE,UAAU,MAAO,sBAAsB,IAAK;AAE/D,aAAO,MAAM;AACX,cAAM,iBAAiB,OAAO,aAAa;AAAA,UACzC,UAAU;AAAA,QAAA,CACX;AACD,cAAM,aAAa,OAAO,UAAU;AACpC,cAAM,kBAAkB,OAAO,uBAAuB;AACtD,cAAM,WAAW,OAAO,QAAQ;AAEhC,YAAI,WAAyC;AAC7C,YAAI,KAAyB;AAE7B,cAAM,wBAAwB,SAAS,MAAM;AAC3C,gBAAM,EAAE,aAAA,IAAiB,gBAAA;AACzB,iBAAO,OAAO,iBAAiB,YAC3B,eACA,UAAA;AAAA,QACN,CAAC;AAED,cAAM,yBAAyB,MAAM;AACnC,gBAAM,SAAS,kBAAkB,UAAU;AAC3C,cAAI,CAAC,QAAQ;AACX,kBAAM,IAAI,MAAM,sBAAsB;AAAA,UACxC;AACA,iBAAO;AAAA,QACT;AAEA,cAAM,kBAAkB,MAAM;AAC5B,+CAAU;AACV,mCAAI;AACJ,qBAAW;AAAA,QACb;AAEA;AAAA,UACE,MAAM;AACJ,kBAAM,kBAAkB,sBAAA;AACxB,kBAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA,IACE,gBAAA;AAEJ,gBAAI,CAAC,iBAAiB;AAEpB,0BAAY,gBAAA;AACZ;AAAA,YACF;AAEA,gBAAI,UAAU;AAEZ,wBAAU,SAAS,UAAU,MAAM;AACnC,0BAAY,SAAS,YAAY,QAAQ;AACzC,4BAAc,SAAS,cAAc,UAAU;AAC/C,gCAAkB,SAAS,kBAAkB,cAAc;AAC3D,qBAAO,kBAAkB,aACvB,SAAS,iBAAiB,aAAa;AACzC;AAAA,YACF;AAGA,mBAAO,0BAA0B,EAC9B,KAAK,CAAC,kBAAkB;AAEvB,kBAAI,oBAAqB;AAEzB,yBAAW,IAAI,cAAc,sBAAsB;AAAA,gBACjD,GAAG,gBAAA;AAAA,gBACH,QAAQ,uBAAA;AAAA,gBACR,aAAa;AAAA,gBACb,SAAS;AAAA,gBACT;AAAA,cAAA,CACD;AAED,mBAAK,SAAS,KAAK,YAAY,SAAS,cAAc,KAAK,CAAC;AAC5D,iBAAG,UAAU,IAAI,uBAAuB;AACxC,uBAAS,MAAM,EAAE;AAEjB,yBAAW,UAAU,eAAe;AAAA,YACtC,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,sBAAQ;AAAA,gBACN;AAAA,gBACA;AAAA,cAAA;AAAA,YAEJ,CAAC;AAAA,UACL;AAAA,UACA,EAAE,SAAA;AAAA,QAAS;AAAA,MAEf;AAAA,IACF;AAAA,EAAA;AAEJ,CAAC;"}
@@ -0,0 +1,2 @@
1
+ export type { InjectDevtoolsPanel, DevtoolsPanelOptions, InjectDevtoolsPanelOptions, DevtoolsPanelRef, } from './types.js';
2
+ export { injectDevtoolsPanel } from './inject-devtools-panel.js';
@@ -0,0 +1,5 @@
1
+ import { injectDevtoolsPanel } from "./inject-devtools-panel.mjs";
2
+ export {
3
+ injectDevtoolsPanel
4
+ };
5
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,14 @@
1
+ import { InjectDevtoolsPanel } from './types.js';
2
+ /**
3
+ * Inject a TanStack Query devtools panel and render it in the DOM.
4
+ *
5
+ * Devtools panel allows programmatic control over the devtools, for example if you want to render
6
+ * the devtools as part of your own devtools.
7
+ *
8
+ * Consider `withDevtools` instead if you don't need this.
9
+ * @param injectDevtoolsPanelFn - A function that returns devtools panel options.
10
+ * @param options - Additional configuration
11
+ * @returns DevtoolsPanelRef
12
+ * @see https://tanstack.com/query/v5/docs/framework/angular/devtools
13
+ */
14
+ export declare const injectDevtoolsPanel: InjectDevtoolsPanel;
@@ -0,0 +1,72 @@
1
+ import { assertInInjectionContext, inject, Injector, runInInjectionContext, DestroyRef, PLATFORM_ID, computed, effect, untracked } from "@angular/core";
2
+ import { QueryClient, onlineManager } from "@tanstack/query-core";
3
+ import { isPlatformBrowser } from "@angular/common";
4
+ const injectDevtoolsPanel = (injectDevtoolsPanelFn, options) => {
5
+ !(options == null ? void 0 : options.injector) && assertInInjectionContext(injectDevtoolsPanel);
6
+ const currentInjector = (options == null ? void 0 : options.injector) ?? inject(Injector);
7
+ return runInInjectionContext(currentInjector, () => {
8
+ const destroyRef = inject(DestroyRef);
9
+ const isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
10
+ const injectedClient = inject(QueryClient, { optional: true });
11
+ const queryOptions = computed(injectDevtoolsPanelFn);
12
+ let devtools = null;
13
+ const destroy = () => {
14
+ devtools == null ? void 0 : devtools.unmount();
15
+ devtools = null;
16
+ };
17
+ if (!isBrowser)
18
+ return {
19
+ destroy
20
+ };
21
+ effect(() => {
22
+ const {
23
+ client = injectedClient,
24
+ errorTypes = [],
25
+ styleNonce,
26
+ shadowDOMTarget,
27
+ onClose,
28
+ hostElement
29
+ } = queryOptions();
30
+ untracked(() => {
31
+ if (!client) throw new Error("No QueryClient found");
32
+ if (!devtools && hostElement) {
33
+ import("@tanstack/query-devtools").then((queryDevtools) => {
34
+ devtools = new queryDevtools.TanstackQueryDevtoolsPanel({
35
+ client,
36
+ queryFlavor: "Angular Query",
37
+ version: "5",
38
+ buttonPosition: "bottom-left",
39
+ position: "bottom",
40
+ initialIsOpen: true,
41
+ errorTypes,
42
+ styleNonce,
43
+ shadowDOMTarget,
44
+ onClose,
45
+ onlineManager
46
+ });
47
+ devtools.mount(hostElement.nativeElement);
48
+ }).catch((error) => {
49
+ console.error(
50
+ "Install @tanstack/query-devtools or reinstall without --omit=optional.",
51
+ error
52
+ );
53
+ });
54
+ } else if (devtools && hostElement) {
55
+ devtools.setClient(client);
56
+ devtools.setErrorTypes(errorTypes);
57
+ onClose && devtools.setOnClose(onClose);
58
+ } else if (devtools && !hostElement) {
59
+ destroy();
60
+ }
61
+ });
62
+ });
63
+ destroyRef.onDestroy(destroy);
64
+ return {
65
+ destroy
66
+ };
67
+ });
68
+ };
69
+ export {
70
+ injectDevtoolsPanel
71
+ };
72
+ //# sourceMappingURL=inject-devtools-panel.mjs.map