@rozenite/tanstack-query-plugin 2.1.0 → 2.3.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.
Files changed (67) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/devtools/assets/{CXEL7IU7-BWccRGN3.js → CXEL7IU7-D2MCp9XC.js} +1 -1
  3. package/dist/devtools/assets/{tanstack-query-CbF_imft.js → tanstack-query-Bk8rHBM2.js} +12 -12
  4. package/dist/devtools/tanstack-query.html +1 -1
  5. package/dist/react-native/cjs/package.json +3 -0
  6. package/dist/react-native/cjs/react-native.js +12 -0
  7. package/dist/react-native/cjs/src/react-native/agent/tanstack-query-agent.js +376 -0
  8. package/dist/react-native/cjs/src/react-native/agent/useTanStackQueryAgentTools.js +98 -0
  9. package/dist/react-native/cjs/src/react-native/devtools-actions.js +161 -0
  10. package/dist/react-native/cjs/src/react-native/useHandleDevToolsMessages.js +26 -0
  11. package/dist/react-native/cjs/src/react-native/useHandleInitialData.js +26 -0
  12. package/dist/react-native/cjs/src/react-native/useSyncTanStackCache.js +203 -0
  13. package/dist/react-native/cjs/src/react-native/useTanStackQueryDevTools.js +20 -0
  14. package/dist/react-native/cjs/src/shared/agent-tools.js +197 -0
  15. package/dist/react-native/cjs/src/shared/dehydrate.js +35 -0
  16. package/dist/react-native/cjs/src/shared/messaging.js +2 -0
  17. package/dist/react-native/cjs/src/shared/types.js +2 -0
  18. package/dist/react-native/cjs/src/shared/useSyncOnlineStatus.js +23 -0
  19. package/dist/react-native/package.json +3 -0
  20. package/dist/react-native/react-native.d.ts +1 -0
  21. package/dist/react-native/react-native.js +10 -0
  22. package/dist/{sdk/index.d.ts → react-native/src/react-native/agent/tanstack-query-agent.d.ts} +2105 -1939
  23. package/dist/react-native/src/react-native/agent/tanstack-query-agent.js +370 -0
  24. package/dist/react-native/src/react-native/agent/useTanStackQueryAgentTools.d.ts +2 -0
  25. package/dist/react-native/src/react-native/agent/useTanStackQueryAgentTools.js +94 -0
  26. package/dist/react-native/src/react-native/devtools-actions.d.ts +115 -0
  27. package/dist/react-native/src/react-native/devtools-actions.js +157 -0
  28. package/dist/react-native/src/react-native/useHandleDevToolsMessages.d.ts +3 -0
  29. package/dist/react-native/src/react-native/useHandleDevToolsMessages.js +22 -0
  30. package/dist/react-native/src/react-native/useHandleInitialData.d.ts +3 -0
  31. package/dist/react-native/src/react-native/useHandleInitialData.js +22 -0
  32. package/dist/react-native/src/react-native/useSyncTanStackCache.d.ts +3 -0
  33. package/dist/react-native/src/react-native/useSyncTanStackCache.js +196 -0
  34. package/dist/react-native/src/react-native/useTanStackQueryDevTools.d.ts +2 -0
  35. package/dist/react-native/src/react-native/useTanStackQueryDevTools.js +16 -0
  36. package/dist/react-native/src/shared/agent-tools.d.ts +967 -0
  37. package/dist/react-native/src/shared/agent-tools.js +194 -0
  38. package/dist/react-native/src/shared/dehydrate.d.ts +6 -0
  39. package/dist/react-native/src/shared/dehydrate.js +28 -0
  40. package/dist/react-native/src/shared/messaging.d.ts +44 -0
  41. package/dist/react-native/src/shared/messaging.js +1 -0
  42. package/dist/react-native/src/shared/types.d.ts +25 -0
  43. package/dist/react-native/src/shared/types.js +1 -0
  44. package/dist/react-native/src/shared/useSyncOnlineStatus.d.ts +2 -0
  45. package/dist/react-native/src/shared/useSyncOnlineStatus.js +19 -0
  46. package/dist/rozenite.json +1 -1
  47. package/dist/sdk/package.json +3 -0
  48. package/dist/sdk/sdk.d.ts +812 -0
  49. package/dist/sdk/sdk.js +8 -0
  50. package/dist/sdk/src/react-native/devtools-actions.d.ts +115 -0
  51. package/dist/sdk/src/react-native/devtools-actions.js +161 -0
  52. package/dist/sdk/src/shared/agent-tools.d.ts +967 -0
  53. package/dist/sdk/src/shared/agent-tools.js +197 -0
  54. package/dist/sdk/src/shared/types.d.ts +25 -0
  55. package/dist/sdk/src/shared/types.js +2 -0
  56. package/package.json +18 -18
  57. package/react-native.ts +8 -1
  58. package/rozenite.config.ts +1 -0
  59. package/src/__tests__/release-bundle.test.ts +32 -0
  60. package/tsconfig.json +1 -3
  61. package/dist/react-native/chunks/useTanStackQueryDevTools.require.cjs +0 -1
  62. package/dist/react-native/chunks/useTanStackQueryDevTools.require.js +0 -895
  63. package/dist/react-native/index.cjs +0 -1
  64. package/dist/react-native/index.d.ts +0 -7
  65. package/dist/react-native/index.js +0 -6
  66. package/dist/sdk/index.cjs +0 -1
  67. package/dist/sdk/index.js +0 -199
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tanstackQueryToolDefinitions = exports.TANSTACK_QUERY_AGENT_PLUGIN_ID = void 0;
4
+ const agent_shared_1 = require("@rozenite/agent-shared");
5
+ exports.TANSTACK_QUERY_AGENT_PLUGIN_ID = '@rozenite/tanstack-query-plugin';
6
+ const queryActionProperties = {
7
+ queryHash: {
8
+ type: 'string',
9
+ description: 'TanStack Query queryHash identifying the query.',
10
+ },
11
+ };
12
+ const mutationActionProperties = {
13
+ mutationId: {
14
+ type: 'number',
15
+ description: 'TanStack Query mutationId identifying the mutation.',
16
+ },
17
+ };
18
+ const paginationProperties = {
19
+ limit: {
20
+ type: 'number',
21
+ description: 'Maximum number of items to return. Defaults to 20. Maximum 100.',
22
+ },
23
+ cursor: {
24
+ type: 'string',
25
+ description: 'Opaque pagination cursor from a previous list call.',
26
+ },
27
+ };
28
+ const emptyInputSchema = {
29
+ type: 'object',
30
+ properties: {},
31
+ };
32
+ exports.tanstackQueryToolDefinitions = {
33
+ getCacheSummary: (0, agent_shared_1.defineAgentToolContract)({
34
+ name: 'get-cache-summary',
35
+ description: 'Return aggregate TanStack Query cache health and count information.',
36
+ inputSchema: emptyInputSchema,
37
+ }),
38
+ getOnlineStatus: (0, agent_shared_1.defineAgentToolContract)({
39
+ name: 'get-online-status',
40
+ description: 'Return the current TanStack Query onlineManager status.',
41
+ inputSchema: emptyInputSchema,
42
+ }),
43
+ setOnlineStatus: (0, agent_shared_1.defineAgentToolContract)({
44
+ name: 'set-online-status',
45
+ description: 'Set the TanStack Query onlineManager status for testing offline/online behavior.',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ online: {
50
+ type: 'boolean',
51
+ description: 'Whether the TanStack Query onlineManager should be online.',
52
+ },
53
+ },
54
+ required: ['online'],
55
+ },
56
+ }),
57
+ listQueries: (0, agent_shared_1.definePaginatedAgentToolContract)({
58
+ name: 'list-queries',
59
+ description: 'List TanStack Query query summaries using cursor pagination.',
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: paginationProperties,
63
+ },
64
+ pagination: {
65
+ kind: 'cursor',
66
+ fields: [
67
+ 'queryHash',
68
+ 'queryKey',
69
+ 'status',
70
+ 'fetchStatus',
71
+ 'observersCount',
72
+ 'isInvalidated',
73
+ 'dataUpdatedAt',
74
+ 'errorUpdatedAt',
75
+ 'hasData',
76
+ 'hasError',
77
+ ],
78
+ defaultFields: ['queryHash', 'queryKey', 'status', 'fetchStatus', 'hasError'],
79
+ },
80
+ }),
81
+ getQueryDetails: (0, agent_shared_1.defineAgentToolContract)({
82
+ name: 'get-query-details',
83
+ description: 'Return a JSON-safe TanStack Query query snapshot and observer summary.',
84
+ inputSchema: {
85
+ type: 'object',
86
+ properties: queryActionProperties,
87
+ required: ['queryHash'],
88
+ },
89
+ }),
90
+ refetchQuery: (0, agent_shared_1.defineAgentToolContract)({
91
+ name: 'refetch-query',
92
+ description: 'Refetch a TanStack Query query by queryHash.',
93
+ inputSchema: {
94
+ type: 'object',
95
+ properties: queryActionProperties,
96
+ required: ['queryHash'],
97
+ },
98
+ }),
99
+ setQueryLoading: (0, agent_shared_1.defineAgentToolContract)({
100
+ name: 'set-query-loading',
101
+ description: 'Enable or disable TanStack Query loading-state simulation for a query by queryHash.',
102
+ inputSchema: {
103
+ type: 'object',
104
+ properties: {
105
+ ...queryActionProperties,
106
+ enabled: {
107
+ type: 'boolean',
108
+ description: 'Whether the loading-state simulation should be enabled.',
109
+ },
110
+ },
111
+ required: ['queryHash', 'enabled'],
112
+ },
113
+ }),
114
+ setQueryError: (0, agent_shared_1.defineAgentToolContract)({
115
+ name: 'set-query-error',
116
+ description: 'Enable or disable TanStack Query error-state simulation for a query by queryHash.',
117
+ inputSchema: {
118
+ type: 'object',
119
+ properties: {
120
+ ...queryActionProperties,
121
+ enabled: {
122
+ type: 'boolean',
123
+ description: 'Whether the error-state simulation should be enabled.',
124
+ },
125
+ },
126
+ required: ['queryHash', 'enabled'],
127
+ },
128
+ }),
129
+ invalidateQuery: (0, agent_shared_1.defineAgentToolContract)({
130
+ name: 'invalidate-query',
131
+ description: 'Invalidate a TanStack Query query by queryHash.',
132
+ inputSchema: {
133
+ type: 'object',
134
+ properties: queryActionProperties,
135
+ required: ['queryHash'],
136
+ },
137
+ }),
138
+ resetQuery: (0, agent_shared_1.defineAgentToolContract)({
139
+ name: 'reset-query',
140
+ description: 'Reset a TanStack Query query by queryHash.',
141
+ inputSchema: {
142
+ type: 'object',
143
+ properties: queryActionProperties,
144
+ required: ['queryHash'],
145
+ },
146
+ }),
147
+ removeQuery: (0, agent_shared_1.defineAgentToolContract)({
148
+ name: 'remove-query',
149
+ description: 'Remove a TanStack Query query from the cache by queryHash.',
150
+ inputSchema: {
151
+ type: 'object',
152
+ properties: queryActionProperties,
153
+ required: ['queryHash'],
154
+ },
155
+ }),
156
+ clearQueryCache: (0, agent_shared_1.defineAgentToolContract)({
157
+ name: 'clear-query-cache',
158
+ description: 'Clear the full TanStack Query query cache.',
159
+ inputSchema: emptyInputSchema,
160
+ }),
161
+ listMutations: (0, agent_shared_1.definePaginatedAgentToolContract)({
162
+ name: 'list-mutations',
163
+ description: 'List TanStack Query mutation summaries using cursor pagination.',
164
+ inputSchema: {
165
+ type: 'object',
166
+ properties: paginationProperties,
167
+ },
168
+ pagination: {
169
+ kind: 'cursor',
170
+ fields: [
171
+ 'mutationId',
172
+ 'mutationKey',
173
+ 'status',
174
+ 'isPaused',
175
+ 'submittedAt',
176
+ 'failureCount',
177
+ 'hasData',
178
+ 'hasError',
179
+ ],
180
+ defaultFields: ['mutationId', 'mutationKey', 'status', 'hasError'],
181
+ },
182
+ }),
183
+ getMutationDetails: (0, agent_shared_1.defineAgentToolContract)({
184
+ name: 'get-mutation-details',
185
+ description: 'Return a JSON-safe TanStack Query mutation snapshot for a mutationId.',
186
+ inputSchema: {
187
+ type: 'object',
188
+ properties: mutationActionProperties,
189
+ required: ['mutationId'],
190
+ },
191
+ }),
192
+ clearMutationCache: (0, agent_shared_1.defineAgentToolContract)({
193
+ name: 'clear-mutation-cache',
194
+ description: 'Clear the full TanStack Query mutation cache.',
195
+ inputSchema: emptyInputSchema,
196
+ }),
197
+ };
@@ -0,0 +1,25 @@
1
+ import type { QueryKey, MutationState, QueryState, QueryObserverOptions, InfiniteQueryObserverOptions, MutationOptions } from '@tanstack/react-query';
2
+ export type SerializableQuery = {
3
+ queryHash: string;
4
+ state: QueryState;
5
+ queryKey: QueryKey;
6
+ observers: SerializableObserver[];
7
+ };
8
+ export type PartialQueryState = {
9
+ queryHash: string;
10
+ state: Partial<QueryState>;
11
+ };
12
+ export type SerializableMutation = {
13
+ mutationId: number;
14
+ options: MutationOptions;
15
+ state: MutationState;
16
+ };
17
+ export type SerializableObserver = {
18
+ queryHash: string;
19
+ options: QueryObserverOptions | InfiniteQueryObserverOptions;
20
+ };
21
+ export type SerializableQueryClient = {
22
+ queries: SerializableQuery[];
23
+ mutations: SerializableMutation[];
24
+ };
25
+ export type DevToolsActionType = 'REFETCH' | 'SET_QUERY_DATA' | 'INVALIDATE' | 'RESET' | 'REMOVE' | 'TRIGGER_ERROR' | 'RESTORE_ERROR' | 'TRIGGER_LOADING' | 'RESTORE_LOADING' | 'CLEAR_MUTATION_CACHE' | 'CLEAR_QUERY_CACHE';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rozenite/tanstack-query-plugin",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "TanStack Query for Rozenite.",
5
5
  "homepage": "https://github.com/callstackincubator/rozenite#readme",
6
6
  "bugs": {
@@ -12,21 +12,20 @@
12
12
  "url": "https://github.com/callstackincubator/rozenite.git"
13
13
  },
14
14
  "type": "module",
15
- "main": "./dist/react-native/index.cjs",
16
- "module": "./dist/react-native/index.js",
17
- "types": "./dist/react-native/index.d.ts",
15
+ "main": "./dist/react-native/cjs/react-native.js",
16
+ "module": "./dist/react-native/react-native.js",
17
+ "types": "./dist/react-native/react-native.d.ts",
18
18
  "exports": {
19
19
  ".": {
20
- "types": "./dist/react-native/index.d.ts",
21
- "import": "./dist/react-native/index.js",
22
- "require": "./dist/react-native/index.cjs"
20
+ "types": "./dist/react-native/react-native.d.ts",
21
+ "import": "./dist/react-native/react-native.js",
22
+ "require": "./dist/react-native/cjs/react-native.js"
23
23
  },
24
24
  "./package.json": "./package.json",
25
25
  "./sdk": {
26
26
  "development": "./sdk.ts",
27
- "types": "./dist/sdk/index.d.ts",
28
- "import": "./dist/sdk/index.js",
29
- "require": "./dist/sdk/index.cjs"
27
+ "types": "./dist/sdk/sdk.d.ts",
28
+ "default": "./dist/sdk/sdk.js"
30
29
  }
31
30
  },
32
31
  "publishConfig": {
@@ -34,9 +33,9 @@
34
33
  },
35
34
  "dependencies": {
36
35
  "fast-deep-equal": "^3.1.3",
37
- "@rozenite/agent-bridge": "2.1.0",
38
- "@rozenite/agent-shared": "2.1.0",
39
- "@rozenite/plugin-bridge": "2.1.0"
36
+ "@rozenite/agent-bridge": "2.3.0",
37
+ "@rozenite/agent-shared": "2.3.0",
38
+ "@rozenite/plugin-bridge": "2.3.0"
40
39
  },
41
40
  "devDependencies": {
42
41
  "@tanstack/react-query": "^5.0.0",
@@ -48,18 +47,19 @@
48
47
  "react-native-web": "^0.21.2",
49
48
  "typescript": "~5.9.3",
50
49
  "vite": "^7.3.1",
51
- "@rozenite/vite-plugin": "2.1.0",
52
- "rozenite": "2.1.0"
50
+ "@rozenite/test-utils": "2.3.0",
51
+ "@rozenite/vite-plugin": "2.3.0",
52
+ "rozenite": "2.3.0"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "@tanstack/react-query": "^5.0.0",
56
- "react": "*",
57
- "react-native": "*"
56
+ "react": "*"
58
57
  },
59
58
  "scripts": {
60
59
  "build": "rozenite build",
61
60
  "dev": "rozenite dev",
62
61
  "typecheck": "tsc -p tsconfig.json --noEmit",
63
- "lint": "eslint ."
62
+ "lint": "eslint .",
63
+ "test": "vitest --run --passWithNoTests"
64
64
  }
65
65
  }
package/react-native.ts CHANGED
@@ -1,7 +1,14 @@
1
1
  export let useTanStackQueryDevTools: typeof import('./src/react-native/useTanStackQueryDevTools').useTanStackQueryDevTools;
2
2
 
3
+ // Neither Lynx runtime has a `window`, so `typeof window` alone reported
4
+ // every Lynx app as a server and installed the no-op stub below. `lynx` is
5
+ // a free binding in module scope, not a property of `globalThis`. Kept
6
+ // inline rather than imported so this stays a foldable expression and the
7
+ // `require`s below can still be dropped from production bundles.
8
+ declare const lynx: unknown;
9
+
3
10
  const isDev = process.env.NODE_ENV !== 'production';
4
- const isServer = typeof window === 'undefined';
11
+ const isServer = typeof window === 'undefined' && typeof lynx === 'undefined';
5
12
 
6
13
  if (isDev && !isServer) {
7
14
  useTanStackQueryDevTools =
@@ -1,4 +1,5 @@
1
1
  export default {
2
+ integrations: ['react-native', 'react-native-web', 'lynx', 'lynx-web'],
2
3
  panels: [
3
4
  {
4
5
  name: 'Tanstack Query',
@@ -0,0 +1,32 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { bundleForRelease, RELEASE_BUNDLE_TIMEOUT } from '@rozenite/test-utils';
4
+ import { describe, expect, it } from 'vitest';
5
+
6
+ // An app importing this plugin ships its React Native code -- that much is
7
+ // the app's own choice. What must never follow it into the bundle is the
8
+ // panel: the DevTools UI, its React DOM tree and `@rozenite/ui`.
9
+ // See docs/agents/release-bundle-testing.md.
10
+ const packageRoot = path.resolve(fileURLToPath(import.meta.url), '../../..');
11
+ const reactNativeEntry = path.join(packageRoot, 'dist/react-native/cjs/react-native.js');
12
+
13
+ describe('@rozenite/tanstack-query-plugin in a release bundle', () => {
14
+ it(
15
+ 'ships no panel code when an app imports it',
16
+ async () => {
17
+ const result = await bundleForRelease({
18
+ resolveFrom: packageRoot,
19
+ files: {
20
+ 'index.js': `require(${JSON.stringify(reactNativeEntry)});\n`,
21
+ },
22
+ });
23
+
24
+ // Keeps the check below honest: the entry really did get bundled.
25
+ expect(result.rozeniteModules).toContain(
26
+ 'packages/tanstack-query-plugin/dist/react-native/cjs/react-native.js',
27
+ );
28
+ expect(result.panelModules).toEqual([]);
29
+ },
30
+ RELEASE_BUNDLE_TIMEOUT,
31
+ );
32
+ });
package/tsconfig.json CHANGED
@@ -11,9 +11,7 @@
11
11
  "noFallthroughCasesInSwitch": true,
12
12
  "module": "ESNext",
13
13
  "moduleResolution": "bundler",
14
- "paths": {
15
- "@rozenite/agent-shared": ["../agent-shared/src/index.ts"]
16
- },
14
+ "customConditions": ["development"],
17
15
  "resolveJsonModule": true,
18
16
  "isolatedModules": true,
19
17
  "noEmit": true,
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("@rozenite/plugin-bridge"),b=require("react"),A=require("@tanstack/react-query"),C=require("fast-deep-equal"),i=require("@rozenite/agent-bridge"),c=require("@rozenite/agent-shared"),D=e=>e&&e.__esModule?e:{default:e},_=D(C),w=e=>{b.useEffect(()=>{if(!e)return;const a=A.onlineManager.subscribe(r=>{e.send("online-status-changed",{online:r})}),t=e.onMessage("online-status-changed",({online:r})=>{A.onlineManager.setOnline(r)});return()=>{a(),t.remove()}},[e])},g=(e,a)=>{if(!a)throw new Error("queryHash is required for this TanStack Query action.");const t=e.getQueryCache().get(a);if(!t)throw new Error(`No active query found for hash: ${a}`);return t},f=async(e,a)=>{switch(a.type){case"CLEAR_QUERY_CACHE":{const t=e.getQueryCache().getAll().length;return e.getQueryCache().clear(),{applied:!0,action:a.type,cleared:!0,queryCountBefore:t,queryCountAfter:e.getQueryCache().getAll().length}}case"CLEAR_MUTATION_CACHE":{const t=e.getMutationCache().getAll().length;return e.getMutationCache().clear(),{applied:!0,action:a.type,cleared:!0,mutationCountBefore:t,mutationCountAfter:e.getMutationCache().getAll().length}}case"SET_QUERY_DATA":{const t=g(e,a.queryHash);return e.setQueryData(t.queryKey,a.metadata?.data),{applied:!0,action:a.type,queryHash:t.queryHash}}case"TRIGGER_ERROR":{const t=g(e,a.queryHash),r=t.options,s=new Error("Unknown error from devtools");return t.setState({status:"error",error:s,fetchMeta:{...t.state.fetchMeta,__previousQueryOptions:r}}),{applied:!0,action:a.type,queryHash:t.queryHash}}case"RESTORE_ERROR":{const t=g(e,a.queryHash);return await e.resetQueries(t),{applied:!0,action:a.type,queryHash:t.queryHash}}case"TRIGGER_LOADING":{const t=g(e,a.queryHash),r=t.options;return t.fetch({...r,queryFn:()=>new Promise(()=>{}),gcTime:-1}),t.setState({data:void 0,status:"pending",fetchMeta:{...t.state.fetchMeta,__previousQueryOptions:r}}),{applied:!0,action:a.type,queryHash:t.queryHash}}case"RESTORE_LOADING":{const t=g(e,a.queryHash),r=t.state,s=t.state.fetchMeta?t.state.fetchMeta.__previousQueryOptions:null;return t.cancel({silent:!0}),t.setState({...r,fetchStatus:"idle",fetchMeta:null}),s&&t.fetch(s),{applied:!0,action:a.type,queryHash:t.queryHash}}case"RESET":{const t=g(e,a.queryHash);return await e.resetQueries(t),{applied:!0,action:a.type,queryHash:t.queryHash}}case"REMOVE":{const t=g(e,a.queryHash);return e.removeQueries(t),{applied:!0,action:a.type,queryHash:t.queryHash}}case"REFETCH":{const t=g(e,a.queryHash);return await t.fetch().catch(()=>{}),{applied:!0,action:a.type,queryHash:t.queryHash}}case"INVALIDATE":{const t=g(e,a.queryHash);return await e.invalidateQueries(t),{applied:!0,action:a.type,queryHash:t.queryHash}}}},U=(e,a)=>{b.useEffect(()=>{if(!a)return;const t=a.onMessage("devtools-action",({type:r,queryHash:s,metadata:h})=>{f(e,{type:r,queryHash:s,metadata:h}).catch(l=>{const n=l instanceof Error?l.message:String(l);console.warn(`[Rozenite, tanstack-query-plugin] Failed to apply devtools action "${r}": ${n}`)})});return()=>{t.remove()}},[a])},O=e=>e.observers.map(a=>({queryHash:e.queryHash,options:a.options})),q=e=>{const a=O(e);return{state:e.state,queryKey:e.queryKey,queryHash:e.queryHash,observers:a}},I=e=>({mutationId:e.mutationId,state:e.state,options:e.options}),P=e=>({queries:e.getQueryCache().getAll().map(q),mutations:e.getMutationCache().getAll().map(I)}),G=(e,a)=>{const t=b.useRef(new Map),r=b.useMemo(()=>s=>{if(!a||s.type==="observerResultsUpdated")return;if("query"in s){const{query:n,type:p}=s;if(p==="added"||p==="removed"){p==="removed"&&t.current.delete(n.queryHash);const m=q(n);a.send("sync-query-event",{type:p,data:m});return}if(p==="updated"&&"action"in s){const m=s.action;switch(m.type){case"fetch":{const u={queryHash:n.queryHash,state:{status:n.state.status,fetchStatus:n.state.fetchStatus,fetchMeta:n.state.fetchMeta,dataUpdatedAt:n.state.dataUpdatedAt,errorUpdatedAt:n.state.errorUpdatedAt}};a.send("sync-query-event",{type:"updated",action:"fetch",data:u});break}case"success":{const u={queryHash:n.queryHash,state:{status:n.state.status,data:n.state.data,dataUpdatedAt:n.state.dataUpdatedAt,error:n.state.error,errorUpdatedAt:n.state.errorUpdatedAt,fetchStatus:n.state.fetchStatus}};a.send("sync-query-event",{type:"updated",action:"success",data:u});break}case"error":{const u={queryHash:n.queryHash,state:{status:n.state.status,error:n.state.error,errorUpdatedAt:n.state.errorUpdatedAt,fetchStatus:n.state.fetchStatus}};a.send("sync-query-event",{type:"updated",action:"error",data:u});break}case"setState":{const u={queryHash:n.queryHash,state:m.state};a.send("sync-query-event",{type:"updated",action:"setState",data:u});break}case"invalidate":{const u={queryHash:n.queryHash,state:{isInvalidated:n.state.isInvalidated}};a.send("sync-query-event",{type:"updated",action:"invalidate",data:u});break}case"pause":{const u={queryHash:n.queryHash,state:{fetchStatus:n.state.fetchStatus}};a.send("sync-query-event",{type:"updated",action:"pause",data:u});break}case"continue":{const u={queryHash:n.queryHash,state:{fetchStatus:n.state.fetchStatus}};a.send("sync-query-event",{type:"updated",action:"continue",data:u});break}default:{const u=q(n);a.send("sync-query-event",{type:p,data:u})}}return}if(p==="observerAdded"||p==="observerRemoved"||p==="observerOptionsUpdated"){const m=O(n),u=t.current.get(n.queryHash);if(p==="observerOptionsUpdated"&&u&&_.default(u,m))return;t.current.set(n.queryHash,m),a.send("sync-query-event",{type:p,data:{queryHash:n.queryHash,observers:m}});return}}const{mutation:h,type:l}=s;if(h){const n=I(h);a.send("sync-mutation-event",{type:l,data:n})}},[a]);b.useEffect(()=>{if(!a)return;const s=e.getMutationCache().subscribe(r),h=e.getQueryCache().subscribe(r);return()=>{s(),h()}},[a,e,r])},j=(e,a)=>{b.useEffect(()=>{if(!a)return;const t=a.onMessage("request-initial-data",()=>{const r=P(e);a.send("sync-data",{data:r})});return a.send("device-ready",{}),()=>{t.remove()}},[a,e])},d="@rozenite/tanstack-query-plugin",S={queryHash:{type:"string",description:"TanStack Query queryHash identifying the query."}},z={mutationId:{type:"number",description:"TanStack Query mutationId identifying the mutation."}},M={limit:{type:"number",description:"Maximum number of items to return. Defaults to 20. Maximum 100."},cursor:{type:"string",description:"Opaque pagination cursor from a previous list call."}},T={type:"object",properties:{}},y={getCacheSummary:c.defineAgentToolContract({name:"get-cache-summary",description:"Return aggregate TanStack Query cache health and count information.",inputSchema:T}),getOnlineStatus:c.defineAgentToolContract({name:"get-online-status",description:"Return the current TanStack Query onlineManager status.",inputSchema:T}),setOnlineStatus:c.defineAgentToolContract({name:"set-online-status",description:"Set the TanStack Query onlineManager status for testing offline/online behavior.",inputSchema:{type:"object",properties:{online:{type:"boolean",description:"Whether the TanStack Query onlineManager should be online."}},required:["online"]}}),listQueries:c.definePaginatedAgentToolContract({name:"list-queries",description:"List TanStack Query query summaries using cursor pagination.",inputSchema:{type:"object",properties:M},pagination:{kind:"cursor",fields:["queryHash","queryKey","status","fetchStatus","observersCount","isInvalidated","dataUpdatedAt","errorUpdatedAt","hasData","hasError"],defaultFields:["queryHash","queryKey","status","fetchStatus","hasError"]}}),getQueryDetails:c.defineAgentToolContract({name:"get-query-details",description:"Return a JSON-safe TanStack Query query snapshot and observer summary.",inputSchema:{type:"object",properties:S,required:["queryHash"]}}),refetchQuery:c.defineAgentToolContract({name:"refetch-query",description:"Refetch a TanStack Query query by queryHash.",inputSchema:{type:"object",properties:S,required:["queryHash"]}}),setQueryLoading:c.defineAgentToolContract({name:"set-query-loading",description:"Enable or disable TanStack Query loading-state simulation for a query by queryHash.",inputSchema:{type:"object",properties:{...S,enabled:{type:"boolean",description:"Whether the loading-state simulation should be enabled."}},required:["queryHash","enabled"]}}),setQueryError:c.defineAgentToolContract({name:"set-query-error",description:"Enable or disable TanStack Query error-state simulation for a query by queryHash.",inputSchema:{type:"object",properties:{...S,enabled:{type:"boolean",description:"Whether the error-state simulation should be enabled."}},required:["queryHash","enabled"]}}),invalidateQuery:c.defineAgentToolContract({name:"invalidate-query",description:"Invalidate a TanStack Query query by queryHash.",inputSchema:{type:"object",properties:S,required:["queryHash"]}}),resetQuery:c.defineAgentToolContract({name:"reset-query",description:"Reset a TanStack Query query by queryHash.",inputSchema:{type:"object",properties:S,required:["queryHash"]}}),removeQuery:c.defineAgentToolContract({name:"remove-query",description:"Remove a TanStack Query query from the cache by queryHash.",inputSchema:{type:"object",properties:S,required:["queryHash"]}}),clearQueryCache:c.defineAgentToolContract({name:"clear-query-cache",description:"Clear the full TanStack Query query cache.",inputSchema:T}),listMutations:c.definePaginatedAgentToolContract({name:"list-mutations",description:"List TanStack Query mutation summaries using cursor pagination.",inputSchema:{type:"object",properties:M},pagination:{kind:"cursor",fields:["mutationId","mutationKey","status","isPaused","submittedAt","failureCount","hasData","hasError"],defaultFields:["mutationId","mutationKey","status","hasError"]}}),getMutationDetails:c.defineAgentToolContract({name:"get-mutation-details",description:"Return a JSON-safe TanStack Query mutation snapshot for a mutationId.",inputSchema:{type:"object",properties:z,required:["mutationId"]}}),clearMutationCache:c.defineAgentToolContract({name:"clear-mutation-cache",description:"Clear the full TanStack Query mutation cache.",inputSchema:T})},N=20,L=100,F=e=>!!e&&typeof e=="object"&&Object.getPrototypeOf(e)===Object.prototype,o=(e,a=new WeakSet)=>{if(e==null)return null;if(typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number")return Number.isFinite(e)?e:String(e);if(typeof e=="bigint")return e.toString();if(typeof e=="function"||typeof e=="symbol")return`[non-serializable:${typeof e}]`;if(e instanceof Date)return e.toISOString();if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack??null,cause:o(e.cause,a)};if(Array.isArray(e))return e.map(t=>o(t,a));if(ArrayBuffer.isView(e))return Array.from(e).map(t=>typeof t=="number"?t:Number(t));if(e instanceof ArrayBuffer)return Array.from(new Uint8Array(e));if(typeof e=="object"){if(a.has(e))return"[circular]";if(a.add(e),!F(e))return`[non-serializable:${e.constructor?.name??"Object"}]`;const t=Object.entries(e).map(([r,s])=>[r,o(s,a)]);return Object.fromEntries(t)}return String(e)},K=e=>typeof e!="number"||!Number.isFinite(e)||!Number.isInteger(e)||e<1?N:Math.min(e,L),$=(e,a,t)=>`${e}:${a}:${t}`,x=(e,a,t)=>{const[r,s,h]=e.split(":",3);if(r!==a||!s||!h)throw new Error("Cursor does not match the requested listing. Run the command again.");const l=Number(s),n=Number(h);if(!Number.isInteger(l)||l!==t)throw new Error("Cursor does not match the requested listing. Run the command again.");if(!Number.isInteger(n)||n<0)throw new Error("Cursor is invalid. Run the command again.");return n},E=(e,a,t,r)=>{const s=K(r.limit),h=r.cursor?x(r.cursor,a,t):0,l=Math.min(h+s,e.length),n=l<e.length;return{items:e.slice(h,l),page:{limit:s,hasMore:n,...n?{nextCursor:$(a,t,l)}:{}}}},B=e=>e?{enabled:o(e.enabled),networkMode:o(e.networkMode),staleTime:o(e.staleTime),gcTime:o(e.gcTime),retry:o(e.retry),retryDelay:o(e.retryDelay),refetchInterval:o(e.refetchInterval),refetchOnMount:o(e.refetchOnMount),refetchOnReconnect:o(e.refetchOnReconnect),refetchOnWindowFocus:o(e.refetchOnWindowFocus),subscribed:o(e.subscribed),meta:o(e.meta),hasQueryFn:typeof e.queryFn=="function",hasSelect:typeof e.select=="function",hasPlaceholderData:"placeholderData"in e,hasInitialData:"initialData"in e}:null,W=e=>({mutationKey:o(e.mutationKey),networkMode:o(e.networkMode),gcTime:o(e.gcTime),retry:o(e.retry),retryDelay:o(e.retryDelay),meta:o(e.meta),scope:o(e.scope),hasMutationFn:typeof e.mutationFn=="function",hasOnMutate:typeof e.onMutate=="function",hasOnSuccess:typeof e.onSuccess=="function",hasOnError:typeof e.onError=="function",hasOnSettled:typeof e.onSettled=="function"}),H=e=>Math.max(e.state.dataUpdatedAt,e.state.errorUpdatedAt),V=(e,a)=>H(a)-H(e)||a.getObserversCount()-e.getObserversCount()||String(a.queryHash).localeCompare(String(e.queryHash)),Y=(e,a)=>a.state.submittedAt-e.state.submittedAt||a.mutationId-e.mutationId,v=e=>({queryHash:e.queryHash,queryKey:o(e.queryKey),status:e.state.status,fetchStatus:e.state.fetchStatus,observersCount:e.getObserversCount(),isInvalidated:e.state.isInvalidated,dataUpdatedAt:e.state.dataUpdatedAt,errorUpdatedAt:e.state.errorUpdatedAt,hasData:e.state.data!==void 0,hasError:e.state.error!=null}),J=e=>e.status,R=e=>({mutationId:e.mutationId,mutationKey:o(e.options.mutationKey),status:J(e.state),isPaused:e.state.isPaused,submittedAt:e.state.submittedAt,failureCount:e.state.failureCount,hasData:e.state.data!==void 0,hasError:e.state.error!=null}),X=(e,a)=>{const t=e.getQueryCache().get(a);if(!t){const r=e.getQueryCache().getAll().map(s=>s.queryHash).join(", ");throw new Error(`Unknown queryHash "${a}". Available: ${r||"(none)"}`)}return t},Z=(e,a)=>{const t=e.getMutationCache().getAll().find(r=>r.mutationId===a);if(!t){const r=e.getMutationCache().getAll().map(s=>s.mutationId).join(", ");throw new Error(`Unknown mutationId "${a}". Available: ${r||"(none)"}`)}return t},Q=e=>{const a=e.getQueryCache().getAll(),t=e.getMutationCache().getAll();return{online:A.onlineManager.isOnline(),queries:{total:a.length,active:a.filter(r=>r.getObserversCount()>0).length,fetching:a.filter(r=>r.state.fetchStatus==="fetching").length,pending:a.filter(r=>r.state.status==="pending").length,success:a.filter(r=>r.state.status==="success").length,error:a.filter(r=>r.state.status==="error").length,invalidated:a.filter(r=>r.state.isInvalidated).length},mutations:{total:t.length,pending:t.filter(r=>r.state.status==="pending").length,success:t.filter(r=>r.state.status==="success").length,error:t.filter(r=>r.state.status==="error").length,paused:t.filter(r=>r.state.isPaused).length}}},ee=e=>{const a={queriesGeneration:0,mutationsGeneration:0};return{handleQueryCacheEvent(t){(t.type==="added"||t.type==="removed")&&(a.queriesGeneration+=1)},handleMutationCacheEvent(t){(t.type==="added"||t.type==="removed")&&(a.mutationsGeneration+=1)},getCacheSummary(){return Q(e)},getOnlineStatus(){return{online:A.onlineManager.isOnline()}},setOnlineStatus({online:t}){return A.onlineManager.setOnline(t),{online:A.onlineManager.isOnline()}},listQueries(t={}){const r=[...e.getQueryCache().getAll()].sort(V);return{...Q(e),total:r.length,...E(r.map(v),"queries",a.queriesGeneration,t)}},getQueryDetails({queryHash:t}){const r=X(e,t);return{summary:Q(e),query:{...v(r),data:o(r.state.data),error:o(r.state.error),observers:r.observers.map(s=>({queryHash:r.queryHash,options:B(s.options)}))}}},async refetchQuery({queryHash:t}){return f(e,{type:"REFETCH",queryHash:t})},async setQueryLoading({queryHash:t,enabled:r}){return f(e,{type:r?"TRIGGER_LOADING":"RESTORE_LOADING",queryHash:t})},async setQueryError({queryHash:t,enabled:r}){return f(e,{type:r?"TRIGGER_ERROR":"RESTORE_ERROR",queryHash:t})},async invalidateQuery({queryHash:t}){return f(e,{type:"INVALIDATE",queryHash:t})},async resetQuery({queryHash:t}){return f(e,{type:"RESET",queryHash:t})},async removeQuery({queryHash:t}){return f(e,{type:"REMOVE",queryHash:t})},async clearQueryCache(){return f(e,{type:"CLEAR_QUERY_CACHE"})},listMutations(t={}){const r=[...e.getMutationCache().getAll()].sort(Y);return{...Q(e),total:r.length,...E(r.map(R),"mutations",a.mutationsGeneration,t)}},getMutationDetails({mutationId:t}){const r=Z(e,t);return{summary:Q(e),mutation:{...R(r),variables:o(r.state.variables),data:o(r.state.data),error:o(r.state.error),context:o(r.state.context),failureReason:o(r.state.failureReason),options:W(r.options)}}},async clearMutationCache(){return f(e,{type:"CLEAR_MUTATION_CACHE"})}}},te=e=>{const a=b.useMemo(()=>ee(e),[e]);b.useEffect(()=>{const t=e.getQueryCache().subscribe(s=>a.handleQueryCacheEvent(s)),r=e.getMutationCache().subscribe(s=>a.handleMutationCacheEvent(s));return()=>{t(),r()}},[a,e]),i.useRozenitePluginAgentTool({pluginId:d,tool:y.getCacheSummary,handler:()=>a.getCacheSummary()}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.getOnlineStatus,handler:()=>a.getOnlineStatus()}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.setOnlineStatus,handler:t=>a.setOnlineStatus(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.listQueries,handler:(t={})=>a.listQueries(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.getQueryDetails,handler:t=>a.getQueryDetails(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.refetchQuery,handler:t=>a.refetchQuery(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.setQueryLoading,handler:t=>a.setQueryLoading(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.setQueryError,handler:t=>a.setQueryError(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.invalidateQuery,handler:t=>a.invalidateQuery(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.resetQuery,handler:t=>a.resetQuery(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.removeQuery,handler:t=>a.removeQuery(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.clearQueryCache,handler:()=>a.clearQueryCache()}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.listMutations,handler:(t={})=>a.listMutations(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.getMutationDetails,handler:t=>a.getMutationDetails(t)}),i.useRozenitePluginAgentTool({pluginId:d,tool:y.clearMutationCache,handler:()=>a.clearMutationCache()})},ae=e=>{const a=k.useRozeniteDevToolsClient({pluginId:"@rozenite/tanstack-query-plugin"});w(a),U(e,a),G(e,a),j(e,a),te(e)};exports.useTanStackQueryDevTools=ae;