@refinedev/devtools-internal 1.0.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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/clean-stack.d.ts +3 -0
  4. package/dist/clean-stack.d.ts.map +1 -0
  5. package/dist/constants.d.ts +2 -0
  6. package/dist/constants.d.ts.map +1 -0
  7. package/dist/create-identifier.d.ts +4 -0
  8. package/dist/create-identifier.d.ts.map +1 -0
  9. package/dist/esm/index.js +2 -0
  10. package/dist/esm/index.js.map +1 -0
  11. package/dist/get-package-name-from-filename.d.ts +2 -0
  12. package/dist/get-package-name-from-filename.d.ts.map +1 -0
  13. package/dist/get-resource-path.d.ts +4 -0
  14. package/dist/get-resource-path.d.ts.map +1 -0
  15. package/dist/get-trace.d.ts +3 -0
  16. package/dist/get-trace.d.ts.map +1 -0
  17. package/dist/get-xray.d.ts +9 -0
  18. package/dist/get-xray.d.ts.map +1 -0
  19. package/dist/iife/index.js +2 -0
  20. package/dist/iife/index.js.map +1 -0
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/is-refine-stack.d.ts +2 -0
  26. package/dist/is-refine-stack.d.ts.map +1 -0
  27. package/dist/listeners.d.ts +4 -0
  28. package/dist/listeners.d.ts.map +1 -0
  29. package/dist/use-query-subscription.d.ts +3 -0
  30. package/dist/use-query-subscription.d.ts.map +1 -0
  31. package/package.json +56 -0
  32. package/src/clean-stack.ts +15 -0
  33. package/src/constants.ts +4 -0
  34. package/src/create-identifier.ts +17 -0
  35. package/src/define.d.ts +1 -0
  36. package/src/get-package-name-from-filename.ts +13 -0
  37. package/src/get-resource-path.ts +55 -0
  38. package/src/get-trace.ts +35 -0
  39. package/src/get-xray.ts +32 -0
  40. package/src/index.ts +3 -0
  41. package/src/is-refine-stack.ts +9 -0
  42. package/src/listeners.ts +67 -0
  43. package/src/use-query-subscription.tsx +55 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Refine Dev Corporation
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ <div align="center" style="margin: 30px;">
2
+ <a href="https://refine.dev">
3
+ <img src="https://refine.ams3.cdn.digitaloceanspaces.com/refine_logo.png" align="center" />
4
+ </a>
5
+ </div>
6
+ <br/>
7
+ <div align="center">refine is an open-source, headless React framework for developers building enterprise web applications.
8
+
9
+ It eliminates repetitive tasks in CRUD operations and provides industry-standard solutions for critical project components like **authentication**, **access control**, **routing**, **networking**, **state management**, and **i18n**.
10
+
11
+ </div>
12
+ <br/>
13
+
14
+ <div align="center">
15
+ <sub>Created by <a href="https://refine.dev">refine</a></sub>
16
+ </div>
17
+
18
+ ## About
19
+
20
+ The [refine](https://refine.dev/) is **headless by design**, offering unlimited styling and customization options. Moreover, refine ships with ready-made integrations for [Ant Design](https://ant.design/), [Material UI](https://mui.com/material-ui/getting-started/overview/), [Mantine](https://mantine.dev/), and [Chakra UI](https://chakra-ui.com/) for convenience.
21
+
22
+ refine has connectors for 15+ backend services, including REST API, [GraphQL](https://graphql.org/), and popular services like [Airtable](https://www.airtable.com/), [Strapi](https://strapi.io/), [Supabase](https://supabase.com/), [Firebase](https://firebase.google.com/), and [Directus](https://directus.io/)
23
+
24
+ [Refer to documentation for more info about refine&#8594](https://refine.dev/docs/)
25
+ [Step up to refine tutorials &#8594](https://refine.dev/docs/tutorial/introduction/index/)
26
+
27
+ ## Documentation
28
+
29
+ This package is an internal package and a part of the `@refinedev/devtools` package.
30
+
31
+ For more detailed information an usage, refer to the [refine devtools documentation](https://refine.dev/docs/packages/devtools)
32
+
33
+ ## Install
34
+
35
+ ```
36
+ npm install @refinedev/devtools
37
+ ```
@@ -0,0 +1,3 @@
1
+ import type { StackFrame } from "error-stack-parser";
2
+ export declare const cleanStack: (stack: StackFrame[]) => StackFrame[];
3
+ //# sourceMappingURL=clean-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean-stack.d.ts","sourceRoot":"","sources":["../src/clean-stack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,eAAO,MAAM,UAAU,UAAW,UAAU,EAAE,iBAU7C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const REFINE_PACKAGE_FILEPATH_REGEXP: RegExp;
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,QAGG,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { TraceType } from "@refinedev/devtools-shared";
2
+ import { MutationKey, QueryKey } from "@tanstack/react-query";
3
+ export declare const createIdentifier: (key?: QueryKey | MutationKey, trace?: TraceType[]) => string;
4
+ //# sourceMappingURL=create-identifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-identifier.d.ts","sourceRoot":"","sources":["../src/create-identifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE9D,eAAO,MAAM,gBAAgB,SACnB,QAAQ,GAAG,WAAW,UACpB,SAAS,EAAE,WAWtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import I from"error-stack-parser";var v="renderWithHooks",m=r=>{let e=r.findIndex(s=>s.functionName===v);return e!==-1?r.slice(0,e):r};var i=process.env.NODE_ENV!=="development"?/node_modules\/refinedev\/(?<name>.*?)\//:/\/refine\/packages\/(?<name>.*?)\//;var y=r=>r?!!r.match(i):!1;var d=r=>{var n;if(!r)return;let e=r.match(i),s=(n=e==null?void 0:e.groups)==null?void 0:n.name;if(s)return`@refinedev/${s}`};function p(){if(process.env.NODE_ENV!=="development")return[];try{let r=new Error,e=I.parse(r);return m(e).map(t=>({file:t.fileName,line:t.lineNumber,column:t.columnNumber,function:t.functionName,isRefine:y(t.fileName),packageName:d(t.fileName)})).filter(t=>t.function).slice(1)}catch{return[]}}import{scopes as u}from"@refinedev/devtools-shared";var E=(r,e)=>{if(u[r]==="auth")return null;if(r==="useCan")return e?"key[1].resource":"key[1]";if(u[r]==="audit-log")return r==="useLog"?"variables.resource":"key[1]";if(u[r]==="data"){if(r==="useCustom"||r==="useCustomMutation")return null;switch(r){case"useList":case"useInfiniteList":case"useOne":case"useMany":return e?"key[1]":"key[2]";case"useCreate":case"useCreateMany":case"useDelete":case"useDeleteMany":case"useUpdate":case"useUpdateMany":return"variables.resource"}}return null};function P(r,e){if(process.env.NODE_ENV!=="development")return{hookName:"",trace:[],resourcePath:null,legacyKey:!1};{let s=p().slice(1),n=E(r,e);return{hookName:r,trace:s,resourcePath:n,legacyKey:e}}}import{DevToolsContext as k}from"@refinedev/devtools-shared";import f,{useContext as x}from"react";import{DevtoolsEvent as T,send as _}from"@refinedev/devtools-shared";var l=(r,e)=>{let s=e==null?void 0:e.map(t=>`${t.file}:${t.line}:${t.column}#${t.function}-${t.packageName}-${t.isRefine?1:0}`);return JSON.stringify([...r??[],...s??[]])};var R=r=>e=>{var n;if(!((n=e==null?void 0:e.meta)!=null&&n.trace))return;let s=e==null?void 0:e.meta;new Promise(t=>{var a,o;_(r,T.ACTIVITY,{type:"mutation",identifier:l(e==null?void 0:e.options.mutationKey,(a=e==null?void 0:e.meta)==null?void 0:a.trace),key:e==null?void 0:e.options.mutationKey,status:e==null?void 0:e.state.status,state:e==null?void 0:e.state,variables:(o=e==null?void 0:e.state)==null?void 0:o.variables,...s}),t()})},g=r=>e=>{var n;if(!((n=e==null?void 0:e.meta)!=null&&n.trace))return;let s=e==null?void 0:e.meta;new Promise(t=>{var a;_(r,T.ACTIVITY,{type:"query",identifier:l(e.queryKey,(a=e.meta)==null?void 0:a.trace),key:e.queryKey,status:e.state.status,state:e.state,...s}),t()})};var C=process.env.NODE_ENV!=="development"?()=>({}):r=>{let{ws:e}=x(k),s=f.useRef(),n=f.useRef();return f.useEffect(()=>{if(!e)return()=>0;let t=r.getQueryCache(),a=g(e);return t.getAll().forEach(a),s.current=t.subscribe(({query:o,type:c})=>(c==="added"||c==="updated")&&a(o)),()=>{var o;(o=s.current)==null||o.call(s)}},[e,r]),f.useEffect(()=>{if(!e)return()=>0;let t=r.getMutationCache(),a=R(e);return t.getAll().forEach(a),n.current=t.subscribe(({mutation:o,type:c})=>(c==="added"||c==="updated")&&a(o)),()=>{var o;(o=n.current)==null||o.call(n)}},[e,r]),{}};export{p as getTrace,P as getXRay,C as useQuerySubscription};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/get-trace.ts","../../src/clean-stack.ts","../../src/constants.ts","../../src/is-refine-stack.ts","../../src/get-package-name-from-filename.ts","../../src/get-resource-path.ts","../../src/get-xray.ts","../../src/use-query-subscription.tsx","../../src/listeners.ts","../../src/create-identifier.ts"],"sourcesContent":["import ErrorStackParser from \"error-stack-parser\";\nimport { cleanStack } from \"./clean-stack\";\nimport { isRefineStack } from \"./is-refine-stack\";\nimport { getPackageNameFromFilename } from \"./get-package-name-from-filename\";\nimport { TraceType } from \"@refinedev/devtools-shared\";\n\nexport function getTrace() {\n if (__DEV_CONDITION__ !== \"development\") {\n return [];\n } else {\n try {\n const error = new Error();\n const stack = ErrorStackParser.parse(error);\n const clean = cleanStack(stack);\n const traces = clean\n .map(\n (frame) =>\n ({\n file: frame.fileName,\n line: frame.lineNumber,\n column: frame.columnNumber,\n function: frame.functionName,\n isRefine: isRefineStack(frame.fileName),\n packageName: getPackageNameFromFilename(\n frame.fileName,\n ),\n } as TraceType),\n )\n .filter((trace) => trace.function);\n return traces.slice(1);\n } catch (error) {\n return [];\n }\n }\n}\n","import type { StackFrame } from \"error-stack-parser\";\n\nconst unrelatedFunctionName = \"renderWithHooks\";\n\nexport const cleanStack = (stack: StackFrame[]) => {\n const firstUnrelatedIndex = stack.findIndex(\n (frame) => frame.functionName === unrelatedFunctionName,\n );\n\n if (firstUnrelatedIndex !== -1) {\n return stack.slice(0, firstUnrelatedIndex);\n }\n\n return stack;\n};\n","export const REFINE_PACKAGE_FILEPATH_REGEXP =\n __DEV_CONDITION__ !== \"development\"\n ? /node_modules\\/refinedev\\/(?<name>.*?)\\//\n : /\\/refine\\/packages\\/(?<name>.*?)\\//;\n","import { REFINE_PACKAGE_FILEPATH_REGEXP } from \"./constants\";\n\nexport const isRefineStack = (filename?: string) => {\n if (!filename) return false;\n\n const match = filename.match(REFINE_PACKAGE_FILEPATH_REGEXP);\n\n return !!match;\n};\n","import { REFINE_PACKAGE_FILEPATH_REGEXP } from \"./constants\";\n\nexport const getPackageNameFromFilename = (filename?: string) => {\n if (!filename) return;\n\n const match = filename.match(REFINE_PACKAGE_FILEPATH_REGEXP);\n\n const name = match?.groups?.name;\n\n if (!name) return;\n\n return `@refinedev/${name}`;\n};\n","import {\n DevtoolsEvent,\n DevtoolsEventPayloads,\n RefineHook,\n scopes,\n} from \"@refinedev/devtools-shared\";\n\nexport type Activity =\n DevtoolsEventPayloads[DevtoolsEvent.DEVTOOLS_ACTIVITY_UPDATE][\"updatedActivities\"][number];\n\nexport const getResourcePath = (\n hookName: RefineHook,\n legacyKey: boolean,\n): string | null => {\n if (scopes[hookName] === \"auth\") {\n return null;\n }\n if (hookName === \"useCan\") {\n if (legacyKey) {\n return \"key[1].resource\";\n } else {\n return \"key[1]\";\n }\n }\n if (scopes[hookName] === \"audit-log\") {\n if (hookName === \"useLog\") {\n return \"variables.resource\";\n }\n return \"key[1]\";\n }\n if (scopes[hookName] === \"data\") {\n if (hookName === \"useCustom\" || hookName === \"useCustomMutation\") {\n return null;\n }\n switch (hookName) {\n case \"useList\":\n case \"useInfiniteList\":\n case \"useOne\":\n case \"useMany\":\n if (legacyKey) {\n return \"key[1]\";\n } else {\n return \"key[2]\";\n }\n case \"useCreate\":\n case \"useCreateMany\":\n case \"useDelete\":\n case \"useDeleteMany\":\n case \"useUpdate\":\n case \"useUpdateMany\":\n return \"variables.resource\";\n }\n }\n return null;\n};\n","import { RefineHook, TraceType } from \"@refinedev/devtools-shared\";\nimport { getTrace } from \"./get-trace\";\nimport { getResourcePath } from \"./get-resource-path\";\n\nexport type XRayResponse = {\n hookName: string;\n trace: TraceType[];\n resourcePath: string | null;\n legacyKey: boolean;\n};\n\nexport function getXRay(hookName: string, legacyKey: boolean): XRayResponse {\n if (__DEV_CONDITION__ !== \"development\") {\n return {\n hookName: \"\",\n trace: [],\n resourcePath: null,\n legacyKey: false,\n };\n } else {\n const trace = getTrace().slice(1);\n\n const resourcePath = getResourcePath(hookName as RefineHook, legacyKey);\n\n return {\n hookName,\n trace,\n resourcePath,\n legacyKey,\n };\n }\n}\n","import { DevToolsContext } from \"@refinedev/devtools-shared\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport React, { useContext } from \"react\";\nimport { createQueryListener, createMutationListener } from \"./listeners\";\n\nexport const useQuerySubscription =\n __DEV_CONDITION__ !== \"development\"\n ? () => ({})\n : (queryClient: QueryClient) => {\n const { ws } = useContext(DevToolsContext);\n const queryCacheSubscription = React.useRef<() => void>();\n const mutationCacheSubscription = React.useRef<() => void>();\n\n React.useEffect(() => {\n if (!ws) return () => 0;\n\n const queryCache = queryClient.getQueryCache();\n\n const queryListener = createQueryListener(ws);\n\n queryCache.getAll().forEach(queryListener);\n\n queryCacheSubscription.current = queryCache.subscribe(\n ({ query, type }) =>\n (type === \"added\" || type === \"updated\") &&\n queryListener(query),\n );\n\n return () => {\n queryCacheSubscription.current?.();\n };\n }, [ws, queryClient]);\n\n React.useEffect(() => {\n if (!ws) return () => 0;\n\n const mutationCache = queryClient.getMutationCache();\n\n const mutationListener = createMutationListener(ws);\n\n mutationCache.getAll().forEach(mutationListener);\n\n mutationCacheSubscription.current = mutationCache.subscribe(\n ({ mutation, type }) =>\n (type === \"added\" || type === \"updated\") &&\n mutationListener(mutation),\n );\n\n return () => {\n mutationCacheSubscription.current?.();\n };\n }, [ws, queryClient]);\n\n return {};\n };\n","import { DevtoolsEvent, send } from \"@refinedev/devtools-shared\";\nimport { Mutation, Query } from \"@tanstack/react-query\";\n\nimport { createIdentifier } from \"./create-identifier\";\nimport { XRayResponse } from \"./get-xray\";\n\nexport const createMutationListener =\n (ws: WebSocket) => (mutation?: Mutation) => {\n if (!mutation?.meta?.trace) return;\n\n const meta: XRayResponse = mutation?.meta as any;\n\n new Promise<void>((resolve) => {\n send(ws, DevtoolsEvent.ACTIVITY, {\n type: \"mutation\",\n identifier: createIdentifier(\n mutation?.options.mutationKey,\n mutation?.meta?.trace as any,\n ),\n key: mutation?.options.mutationKey as any,\n status: mutation?.state.status,\n state: mutation?.state,\n variables: mutation?.state?.variables,\n ...meta,\n });\n resolve();\n });\n\n // console.table({\n // type: \"mutation\",\n // key: mutation?.options.mutationKey,\n // id: mutation?.mutationId,\n // status: mutation?.state.status,\n // trace: mutation?.meta?.trace,\n // state: mutation?.state,\n // variables: mutation?.state?.variables,\n // });\n };\n\nexport const createQueryListener = (ws: WebSocket) => (query: Query) => {\n if (!query?.meta?.trace) return;\n\n const meta: XRayResponse = query?.meta as any;\n\n new Promise<void>((resolve) => {\n send(ws, DevtoolsEvent.ACTIVITY, {\n type: \"query\",\n identifier: createIdentifier(\n query.queryKey,\n query.meta?.trace as any,\n ),\n key: query.queryKey as any,\n status: query.state.status,\n state: query.state,\n ...meta,\n });\n resolve();\n });\n\n // console.table({\n // type: \"query\",\n // key: query.queryKey,\n // status: query.state.status,\n // trace: query.meta?.trace,\n // state: query.state,\n // });\n};\n","import { TraceType } from \"@refinedev/devtools-shared\";\nimport { MutationKey, QueryKey } from \"@tanstack/react-query\";\n\nexport const createIdentifier = (\n key?: QueryKey | MutationKey,\n trace?: TraceType[],\n) => {\n const simpleTrace = trace?.map(\n (t) =>\n `${t.file}:${t.line}:${t.column}#${t.function}-${t.packageName}-${\n t.isRefine ? 1 : 0\n }`,\n );\n const str = JSON.stringify([...(key ?? []), ...(simpleTrace ?? [])]);\n\n return str;\n};\n"],"mappings":"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","names":["ErrorStackParser","unrelatedFunctionName","cleanStack","stack","firstUnrelatedIndex","frame","REFINE_PACKAGE_FILEPATH_REGEXP","isRefineStack","filename","REFINE_PACKAGE_FILEPATH_REGEXP","getPackageNameFromFilename","filename","_a","match","REFINE_PACKAGE_FILEPATH_REGEXP","name","getTrace","error","stack","ErrorStackParser","cleanStack","frame","isRefineStack","getPackageNameFromFilename","trace","scopes","getResourcePath","hookName","legacyKey","getXRay","hookName","legacyKey","trace","getTrace","resourcePath","getResourcePath","DevToolsContext","React","useContext","DevtoolsEvent","send","createIdentifier","key","trace","simpleTrace","createMutationListener","ws","mutation","_a","meta","resolve","_b","send","DevtoolsEvent","createIdentifier","createQueryListener","query","useQuerySubscription","queryClient","ws","useContext","DevToolsContext","queryCacheSubscription","React","mutationCacheSubscription","queryCache","queryListener","createQueryListener","query","type","_a","mutationCache","mutationListener","createMutationListener","mutation"]}
@@ -0,0 +1,2 @@
1
+ export declare const getPackageNameFromFilename: (filename?: string) => string | undefined;
2
+ //# sourceMappingURL=get-package-name-from-filename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-package-name-from-filename.d.ts","sourceRoot":"","sources":["../src/get-package-name-from-filename.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,cAAe,MAAM,uBAU3D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { DevtoolsEvent, DevtoolsEventPayloads, RefineHook } from "@refinedev/devtools-shared";
2
+ export declare type Activity = DevtoolsEventPayloads[DevtoolsEvent.DEVTOOLS_ACTIVITY_UPDATE]["updatedActivities"][number];
3
+ export declare const getResourcePath: (hookName: RefineHook, legacyKey: boolean) => string | null;
4
+ //# sourceMappingURL=get-resource-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-resource-path.d.ts","sourceRoot":"","sources":["../src/get-resource-path.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EACb,qBAAqB,EACrB,UAAU,EAEb,MAAM,4BAA4B,CAAC;AAEpC,oBAAY,QAAQ,GAChB,qBAAqB,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/F,eAAO,MAAM,eAAe,aACd,UAAU,aACT,OAAO,KACnB,MAAM,GAAG,IAyCX,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TraceType } from "@refinedev/devtools-shared";
2
+ export declare function getTrace(): TraceType[];
3
+ //# sourceMappingURL=get-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-trace.d.ts","sourceRoot":"","sources":["../src/get-trace.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,wBAAgB,QAAQ,gBA4BvB"}
@@ -0,0 +1,9 @@
1
+ import { TraceType } from "@refinedev/devtools-shared";
2
+ export declare type XRayResponse = {
3
+ hookName: string;
4
+ trace: TraceType[];
5
+ resourcePath: string | null;
6
+ legacyKey: boolean;
7
+ };
8
+ export declare function getXRay(hookName: string, legacyKey: boolean): XRayResponse;
9
+ //# sourceMappingURL=get-xray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-xray.d.ts","sourceRoot":"","sources":["../src/get-xray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAInE,oBAAY,YAAY,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,YAAY,CAoB1E"}
@@ -0,0 +1,2 @@
1
+ (()=>{var G=Object.create;var g=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var _=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var $=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var j=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Q(e))!X.call(t,s)&&s!==r&&g(t,s,{get:()=>e[s],enumerable:!(o=K(e,s))||o.enumerable});return t};var p=(t,e,r)=>(r=t!=null?G(U(t)):{},j(e||!t||!t.__esModule?g(r,"default",{value:t,enumerable:!0}):r,t));var y=$((_e,k)=>{var J=Object.create,v=Object.defineProperty,W=Object.getOwnPropertyDescriptor,B=Object.getOwnPropertyNames,z=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty,q=(t,e)=>{for(var r in e)v(t,r,{get:e[r],enumerable:!0})},N=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of B(e))!Z.call(t,s)&&s!==r&&v(t,s,{get:()=>e[s],enumerable:!(o=W(e,s))||o.enumerable});return t},ee=(t,e,r)=>(r=t!=null?J(z(t)):{},N(e||!t||!t.__esModule?v(r,"default",{value:t,enumerable:!0}):r,t)),te=t=>N(v({},"__esModule",{value:!0}),t),h={};q(h,{DevToolsContext:()=>b,DevToolsContextProvider:()=>se,DevtoolsEvent:()=>C,hooksByScope:()=>re,receive:()=>A,scopes:()=>R,send:()=>S});k.exports=te(h);var C=(t=>(t.RELOAD="devtools:reload",t.DEVTOOLS_INIT="devtools:init",t.DEVTOOLS_HANDSHAKE="devtools:handshake",t.DEVTOOLS_ALREADY_CONNECTED="devtools:already-connected",t.ACTIVITY="devtools:send-activity",t.DEVTOOLS_ACTIVITY_UPDATE="devtools:activity-update",t.DEVTOOLS_CONNECTED_APP="devtools:connected-app",t.DEVTOOLS_DISCONNECTED_APP="devtools:disconnected-app",t.DEVTOOLS_HIGHLIGHT_IN_MONITOR="devtools:highlight-in-monitor",t.DEVTOOLS_HIGHLIGHT_IN_MONITOR_ACTION="devtools:highlight-in-monitor-action",t.DEVTOOLS_LOGIN_SUCCESS="devtools:login-success",t.DEVTOOLS_RELOAD_AFTER_LOGIN="devtools:reload-after-login",t))(C||{}),R={useCan:"access-control",useLog:"audit-log",useLogList:"audit-log",useCreate:"data",useCreateMany:"data",useCustom:"data",useCustomMutation:"data",useDelete:"data",useDeleteMany:"data",useInfiniteList:"data",useList:"data",useMany:"data",useOne:"data",useUpdate:"data",useUpdateMany:"data",useForgotPassword:"auth",useGetIdentity:"auth",useIsAuthenticated:"auth",useLogin:"auth",useLogout:"auth",useOnError:"auth",usePermissions:"auth",useRegister:"auth",useUpdatePassword:"auth"},re=Object.entries(R).reduce((t,[e,r])=>(t[r]||(t[r]=[]),t[r].push(e),t),{}),u=ee(_("react"));async function S(t,e,r){if(t.readyState!==t.OPEN){await new Promise(o=>{let s=()=>{t.send(JSON.stringify({event:e,payload:r})),o(),t.removeEventListener("open",s)};t.addEventListener("open",s)});return}else{t.send(JSON.stringify({event:e,payload:r}));return}}function A(t,e,r){let o=s=>{let{event:a,payload:n}=JSON.parse(s.data);e===a&&r(n)};return t.addEventListener("message",o),()=>{t.removeEventListener("message",o)}}var b=u.default.createContext({__devtools:!1,port:5002,url:"localhost",secure:!1,ws:null}),se=({__devtools:t,port:e,children:r})=>{let[o,s]=u.default.useState({__devtools:t??!1,port:e??5002,url:"localhost",secure:!1,ws:null}),[a,n]=u.default.useState(null);u.default.useEffect(()=>{let d=new WebSocket(`${o.secure?"wss":"ws"}://localhost:${o.port}`),T=A(d,"devtools:handshake",H=>{s(F=>({...F,devtoolsUrl:H.url})),T()});return d.addEventListener("open",()=>{o.__devtools||S(d,"devtools:init",{url:window.location.origin})}),n(d),()=>{T(),d.close(1e3,window.location.origin)}},[]);let c=u.default.useMemo(()=>({...o,ws:a}),[o,a]);return u.default.createElement(b.Provider,{value:c},r)}});var P=p(_("error-stack-parser"));var Y="renderWithHooks",I=t=>{let e=t.findIndex(r=>r.functionName===Y);return e!==-1?t.slice(0,e):t};var f=process.env.NODE_ENV!=="development"?/node_modules\/refinedev\/(?<name>.*?)\//:/\/refine\/packages\/(?<name>.*?)\//;var D=t=>t?!!t.match(f):!1;var L=t=>{var o;if(!t)return;let e=t.match(f),r=(o=e==null?void 0:e.groups)==null?void 0:o.name;if(r)return`@refinedev/${r}`};function m(){if(process.env.NODE_ENV!=="development")return[];try{let t=new Error,e=P.default.parse(t);return I(e).map(s=>({file:s.fileName,line:s.lineNumber,column:s.columnNumber,function:s.functionName,isRefine:D(s.fileName),packageName:L(s.fileName)})).filter(s=>s.function).slice(1)}catch{return[]}}var E=p(y()),x=(t,e)=>{if(E.scopes[t]==="auth")return null;if(t==="useCan")return e?"key[1].resource":"key[1]";if(E.scopes[t]==="audit-log")return t==="useLog"?"variables.resource":"key[1]";if(E.scopes[t]==="data"){if(t==="useCustom"||t==="useCustomMutation")return null;switch(t){case"useList":case"useInfiniteList":case"useOne":case"useMany":return e?"key[1]":"key[2]";case"useCreate":case"useCreateMany":case"useDelete":case"useDeleteMany":case"useUpdate":case"useUpdateMany":return"variables.resource"}}return null};function oe(t,e){if(process.env.NODE_ENV!=="development")return{hookName:"",trace:[],resourcePath:null,legacyKey:!1};{let r=m().slice(1),o=x(t,e);return{hookName:t,trace:r,resourcePath:o,legacyKey:e}}}var V=p(y()),i=p(_("react"));var l=p(y());var O=(t,e)=>{let r=e==null?void 0:e.map(s=>`${s.file}:${s.line}:${s.column}#${s.function}-${s.packageName}-${s.isRefine?1:0}`);return JSON.stringify([...t??[],...r??[]])};var w=t=>e=>{var o;if(!((o=e==null?void 0:e.meta)!=null&&o.trace))return;let r=e==null?void 0:e.meta;new Promise(s=>{var a,n;(0,l.send)(t,l.DevtoolsEvent.ACTIVITY,{type:"mutation",identifier:O(e==null?void 0:e.options.mutationKey,(a=e==null?void 0:e.meta)==null?void 0:a.trace),key:e==null?void 0:e.options.mutationKey,status:e==null?void 0:e.state.status,state:e==null?void 0:e.state,variables:(n=e==null?void 0:e.state)==null?void 0:n.variables,...r}),s()})},M=t=>e=>{var o;if(!((o=e==null?void 0:e.meta)!=null&&o.trace))return;let r=e==null?void 0:e.meta;new Promise(s=>{var a;(0,l.send)(t,l.DevtoolsEvent.ACTIVITY,{type:"query",identifier:O(e.queryKey,(a=e.meta)==null?void 0:a.trace),key:e.queryKey,status:e.state.status,state:e.state,...r}),s()})};var ae=process.env.NODE_ENV!=="development"?()=>({}):t=>{let{ws:e}=(0,i.useContext)(V.DevToolsContext),r=i.default.useRef(),o=i.default.useRef();return i.default.useEffect(()=>{if(!e)return()=>0;let s=t.getQueryCache(),a=M(e);return s.getAll().forEach(a),r.current=s.subscribe(({query:n,type:c})=>(c==="added"||c==="updated")&&a(n)),()=>{var n;(n=r.current)==null||n.call(r)}},[e,t]),i.default.useEffect(()=>{if(!e)return()=>0;let s=t.getMutationCache(),a=w(e);return s.getAll().forEach(a),o.current=s.subscribe(({mutation:n,type:c})=>(c==="added"||c==="updated")&&a(n)),()=>{var n;(n=o.current)==null||n.call(o)}},[e,t]),{}};})();
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../devtools-shared/src/index.ts","../../../devtools-shared/src/event-types.ts","../../../devtools-shared/src/scopes.ts","../../../devtools-shared/src/context.tsx","../../../devtools-shared/src/send.ts","../../../devtools-shared/src/receive.ts","../../src/get-trace.ts","../../src/clean-stack.ts","../../src/constants.ts","../../src/is-refine-stack.ts","../../src/get-package-name-from-filename.ts","../../src/get-resource-path.ts","../../src/get-xray.ts","../../src/use-query-subscription.tsx","../../src/listeners.ts","../../src/create-identifier.ts"],"sourcesContent":["export { DevtoolsEvent, DevtoolsEventPayloads } from \"./event-types\";\nexport { TraceType } from \"./trace\";\nexport { Feed, FeedSection } from \"./feed\";\nexport {\n PackageType,\n PackageLatestVersionType,\n AvailablePackageType,\n} from \"./package\";\nexport { RefineHook, Scopes, hooksByScope, scopes } from \"./scopes\";\n\nexport { DevToolsContextProvider, DevToolsContext } from \"./context\";\n\nexport { send } from \"./send\";\nexport { receive } from \"./receive\";\n","import {\n Mutation,\n MutationKey,\n MutationStatus,\n QueryKey,\n QueryState,\n QueryStatus,\n} from \"@tanstack/react-query\";\nimport { TraceType } from \"./trace\";\n\nexport enum DevtoolsEvent {\n RELOAD = \"devtools:reload\",\n DEVTOOLS_INIT = \"devtools:init\",\n DEVTOOLS_HANDSHAKE = \"devtools:handshake\",\n DEVTOOLS_ALREADY_CONNECTED = \"devtools:already-connected\",\n ACTIVITY = \"devtools:send-activity\",\n DEVTOOLS_ACTIVITY_UPDATE = \"devtools:activity-update\",\n DEVTOOLS_CONNECTED_APP = \"devtools:connected-app\",\n DEVTOOLS_DISCONNECTED_APP = \"devtools:disconnected-app\",\n DEVTOOLS_HIGHLIGHT_IN_MONITOR = \"devtools:highlight-in-monitor\",\n DEVTOOLS_HIGHLIGHT_IN_MONITOR_ACTION = \"devtools:highlight-in-monitor-action\",\n DEVTOOLS_LOGIN_SUCCESS = \"devtools:login-success\",\n DEVTOOLS_RELOAD_AFTER_LOGIN = \"devtools:reload-after-login\",\n}\n\ntype Timestamps = {\n createdAt: number;\n updatedAt: number;\n};\n\ntype ActivityPayload =\n | {\n type: \"mutation\";\n identifier: string;\n key?: MutationKey;\n status?: MutationStatus;\n trace?: TraceType[];\n state: Mutation<any, any, any, any>[\"state\"];\n variables?: Mutation<any, any, any, any>[\"state\"][\"variables\"];\n hookName: string;\n resourcePath: string | null;\n legacyKey: boolean;\n }\n | {\n type: \"query\";\n identifier: string;\n key?: QueryKey;\n status?: QueryStatus;\n trace?: TraceType[];\n state: QueryState<any, any>;\n hookName: string;\n resourcePath: string | null;\n legacyKey: boolean;\n };\n\nexport type DevtoolsEventPayloads = {\n [DevtoolsEvent.RELOAD]: {};\n [DevtoolsEvent.DEVTOOLS_INIT]: { url: string };\n [DevtoolsEvent.DEVTOOLS_HANDSHAKE]: { url: string };\n [DevtoolsEvent.DEVTOOLS_ALREADY_CONNECTED]: { url: string };\n [DevtoolsEvent.ACTIVITY]: ActivityPayload;\n [DevtoolsEvent.DEVTOOLS_ACTIVITY_UPDATE]: {\n updatedActivities: (ActivityPayload & Timestamps)[];\n };\n [DevtoolsEvent.DEVTOOLS_CONNECTED_APP]: { url: string | null };\n [DevtoolsEvent.DEVTOOLS_DISCONNECTED_APP]: {};\n [DevtoolsEvent.DEVTOOLS_HIGHLIGHT_IN_MONITOR]: { name: string };\n [DevtoolsEvent.DEVTOOLS_HIGHLIGHT_IN_MONITOR_ACTION]: { name: string };\n [DevtoolsEvent.DEVTOOLS_LOGIN_SUCCESS]: {};\n [DevtoolsEvent.DEVTOOLS_RELOAD_AFTER_LOGIN]: {};\n};\n","export type RefineHook =\n | \"useCan\"\n | \"useLog\"\n | \"useLogList\"\n | \"useCreate\"\n | \"useCreateMany\"\n | \"useCustom\"\n | \"useCustomMutation\"\n | \"useDelete\"\n | \"useDeleteMany\"\n | \"useInfiniteList\"\n | \"useList\"\n | \"useMany\"\n | \"useOne\"\n | \"useUpdate\"\n | \"useUpdateMany\"\n | \"useForgotPassword\"\n | \"useGetIdentity\"\n | \"useIsAuthenticated\"\n | \"useLogin\"\n | \"useLogout\"\n | \"useOnError\"\n | \"usePermissions\"\n | \"useRegister\"\n | \"useUpdatePassword\";\n\nexport type Scopes = \"data\" | \"audit-log\" | \"access-control\" | \"auth\";\n\nexport const scopes: Record<RefineHook, Scopes> = {\n useCan: \"access-control\",\n useLog: \"audit-log\",\n useLogList: \"audit-log\",\n useCreate: \"data\",\n useCreateMany: \"data\",\n useCustom: \"data\",\n useCustomMutation: \"data\",\n useDelete: \"data\",\n useDeleteMany: \"data\",\n useInfiniteList: \"data\",\n useList: \"data\",\n useMany: \"data\",\n useOne: \"data\",\n useUpdate: \"data\",\n useUpdateMany: \"data\",\n useForgotPassword: \"auth\",\n useGetIdentity: \"auth\",\n useIsAuthenticated: \"auth\",\n useLogin: \"auth\",\n useLogout: \"auth\",\n useOnError: \"auth\",\n usePermissions: \"auth\",\n useRegister: \"auth\",\n useUpdatePassword: \"auth\",\n};\n\nexport const hooksByScope = Object.entries(scopes).reduce(\n (acc, [hook, scope]) => {\n if (!acc[scope]) {\n acc[scope] = [];\n }\n\n acc[scope].push(hook as RefineHook);\n\n return acc;\n },\n {} as Record<Scopes, RefineHook[]>,\n);\n","import React from \"react\";\nimport { DevtoolsEvent } from \"./event-types\";\nimport { send } from \"./send\";\nimport { receive } from \"./receive\";\n\ntype DevToolsContextValue = {\n __devtools: boolean;\n port: number;\n url: string;\n secure: boolean;\n ws: WebSocket | null;\n devtoolsUrl?: string;\n};\n\nexport const DevToolsContext = React.createContext<DevToolsContextValue>({\n __devtools: false,\n port: 5002,\n url: \"localhost\",\n secure: false,\n ws: null,\n});\n\ntype Props = React.PropsWithChildren<\n Partial<Pick<DevToolsContextValue, \"port\" | \"__devtools\">>\n>;\n\nexport const DevToolsContextProvider: React.FC<Props> = ({\n __devtools,\n port,\n children,\n}) => {\n const [values, setValues] = React.useState<DevToolsContextValue>({\n __devtools: __devtools ?? false,\n port: port ?? 5002,\n url: \"localhost\",\n secure: false,\n ws: null,\n });\n\n const [ws, setWs] = React.useState<WebSocket | null>(null);\n\n React.useEffect(() => {\n const wsInstance = new WebSocket(\n `${values.secure ? \"wss\" : \"ws\"}://localhost:${values.port}`,\n );\n\n const unsubscribe = receive(\n wsInstance,\n DevtoolsEvent.DEVTOOLS_HANDSHAKE,\n (data) => {\n setValues((v) => ({\n ...v,\n devtoolsUrl: data.url,\n }));\n unsubscribe();\n },\n );\n\n wsInstance.addEventListener(\"open\", () => {\n if (!values.__devtools) {\n send(wsInstance, DevtoolsEvent.DEVTOOLS_INIT, {\n url: window.location.origin,\n });\n }\n });\n\n setWs(wsInstance);\n\n return () => {\n unsubscribe();\n\n wsInstance.close(1000, window.location.origin);\n };\n }, []);\n\n const contextValues = React.useMemo<DevToolsContextValue>(\n () => ({\n ...values,\n ws,\n }),\n [values, ws],\n );\n\n return (\n <DevToolsContext.Provider value={contextValues}>\n {children}\n </DevToolsContext.Provider>\n );\n};\n","import { DevtoolsEvent, DevtoolsEventPayloads } from \"./event-types\";\n\nexport async function send<T extends DevtoolsEvent>(\n ws: WebSocket,\n event: T,\n payload: DevtoolsEventPayloads[T],\n) {\n // check if the socket is open\n // if not, wait for it to open\n if (ws.readyState !== ws.OPEN) {\n await new Promise<void>((resolve) => {\n const listener = () => {\n ws.send(JSON.stringify({ event, payload }));\n resolve();\n ws.removeEventListener(\"open\", listener);\n };\n\n ws.addEventListener(\"open\", listener);\n });\n return;\n } else {\n ws.send(JSON.stringify({ event, payload }));\n return;\n }\n}\n","// receive ws message by adding a listener to the ws object\n\nimport { DevtoolsEvent, DevtoolsEventPayloads } from \"./event-types\";\n\nexport function receive<T extends DevtoolsEvent>(\n ws: WebSocket,\n event: T,\n callback: (payload: DevtoolsEventPayloads[T]) => void,\n) {\n const listener = (e: MessageEvent) => {\n const { event: receivedEvent, payload } = JSON.parse(e.data);\n if (event === receivedEvent) {\n callback(payload);\n }\n };\n\n ws.addEventListener(\"message\", listener);\n\n return () => {\n ws.removeEventListener(\"message\", listener);\n };\n}\n","import ErrorStackParser from \"error-stack-parser\";\nimport { cleanStack } from \"./clean-stack\";\nimport { isRefineStack } from \"./is-refine-stack\";\nimport { getPackageNameFromFilename } from \"./get-package-name-from-filename\";\nimport { TraceType } from \"@refinedev/devtools-shared\";\n\nexport function getTrace() {\n if (__DEV_CONDITION__ !== \"development\") {\n return [];\n } else {\n try {\n const error = new Error();\n const stack = ErrorStackParser.parse(error);\n const clean = cleanStack(stack);\n const traces = clean\n .map(\n (frame) =>\n ({\n file: frame.fileName,\n line: frame.lineNumber,\n column: frame.columnNumber,\n function: frame.functionName,\n isRefine: isRefineStack(frame.fileName),\n packageName: getPackageNameFromFilename(\n frame.fileName,\n ),\n } as TraceType),\n )\n .filter((trace) => trace.function);\n return traces.slice(1);\n } catch (error) {\n return [];\n }\n }\n}\n","import type { StackFrame } from \"error-stack-parser\";\n\nconst unrelatedFunctionName = \"renderWithHooks\";\n\nexport const cleanStack = (stack: StackFrame[]) => {\n const firstUnrelatedIndex = stack.findIndex(\n (frame) => frame.functionName === unrelatedFunctionName,\n );\n\n if (firstUnrelatedIndex !== -1) {\n return stack.slice(0, firstUnrelatedIndex);\n }\n\n return stack;\n};\n","export const REFINE_PACKAGE_FILEPATH_REGEXP =\n __DEV_CONDITION__ !== \"development\"\n ? /node_modules\\/refinedev\\/(?<name>.*?)\\//\n : /\\/refine\\/packages\\/(?<name>.*?)\\//;\n","import { REFINE_PACKAGE_FILEPATH_REGEXP } from \"./constants\";\n\nexport const isRefineStack = (filename?: string) => {\n if (!filename) return false;\n\n const match = filename.match(REFINE_PACKAGE_FILEPATH_REGEXP);\n\n return !!match;\n};\n","import { REFINE_PACKAGE_FILEPATH_REGEXP } from \"./constants\";\n\nexport const getPackageNameFromFilename = (filename?: string) => {\n if (!filename) return;\n\n const match = filename.match(REFINE_PACKAGE_FILEPATH_REGEXP);\n\n const name = match?.groups?.name;\n\n if (!name) return;\n\n return `@refinedev/${name}`;\n};\n","import {\n DevtoolsEvent,\n DevtoolsEventPayloads,\n RefineHook,\n scopes,\n} from \"@refinedev/devtools-shared\";\n\nexport type Activity =\n DevtoolsEventPayloads[DevtoolsEvent.DEVTOOLS_ACTIVITY_UPDATE][\"updatedActivities\"][number];\n\nexport const getResourcePath = (\n hookName: RefineHook,\n legacyKey: boolean,\n): string | null => {\n if (scopes[hookName] === \"auth\") {\n return null;\n }\n if (hookName === \"useCan\") {\n if (legacyKey) {\n return \"key[1].resource\";\n } else {\n return \"key[1]\";\n }\n }\n if (scopes[hookName] === \"audit-log\") {\n if (hookName === \"useLog\") {\n return \"variables.resource\";\n }\n return \"key[1]\";\n }\n if (scopes[hookName] === \"data\") {\n if (hookName === \"useCustom\" || hookName === \"useCustomMutation\") {\n return null;\n }\n switch (hookName) {\n case \"useList\":\n case \"useInfiniteList\":\n case \"useOne\":\n case \"useMany\":\n if (legacyKey) {\n return \"key[1]\";\n } else {\n return \"key[2]\";\n }\n case \"useCreate\":\n case \"useCreateMany\":\n case \"useDelete\":\n case \"useDeleteMany\":\n case \"useUpdate\":\n case \"useUpdateMany\":\n return \"variables.resource\";\n }\n }\n return null;\n};\n","import { RefineHook, TraceType } from \"@refinedev/devtools-shared\";\nimport { getTrace } from \"./get-trace\";\nimport { getResourcePath } from \"./get-resource-path\";\n\nexport type XRayResponse = {\n hookName: string;\n trace: TraceType[];\n resourcePath: string | null;\n legacyKey: boolean;\n};\n\nexport function getXRay(hookName: string, legacyKey: boolean): XRayResponse {\n if (__DEV_CONDITION__ !== \"development\") {\n return {\n hookName: \"\",\n trace: [],\n resourcePath: null,\n legacyKey: false,\n };\n } else {\n const trace = getTrace().slice(1);\n\n const resourcePath = getResourcePath(hookName as RefineHook, legacyKey);\n\n return {\n hookName,\n trace,\n resourcePath,\n legacyKey,\n };\n }\n}\n","import { DevToolsContext } from \"@refinedev/devtools-shared\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport React, { useContext } from \"react\";\nimport { createQueryListener, createMutationListener } from \"./listeners\";\n\nexport const useQuerySubscription =\n __DEV_CONDITION__ !== \"development\"\n ? () => ({})\n : (queryClient: QueryClient) => {\n const { ws } = useContext(DevToolsContext);\n const queryCacheSubscription = React.useRef<() => void>();\n const mutationCacheSubscription = React.useRef<() => void>();\n\n React.useEffect(() => {\n if (!ws) return () => 0;\n\n const queryCache = queryClient.getQueryCache();\n\n const queryListener = createQueryListener(ws);\n\n queryCache.getAll().forEach(queryListener);\n\n queryCacheSubscription.current = queryCache.subscribe(\n ({ query, type }) =>\n (type === \"added\" || type === \"updated\") &&\n queryListener(query),\n );\n\n return () => {\n queryCacheSubscription.current?.();\n };\n }, [ws, queryClient]);\n\n React.useEffect(() => {\n if (!ws) return () => 0;\n\n const mutationCache = queryClient.getMutationCache();\n\n const mutationListener = createMutationListener(ws);\n\n mutationCache.getAll().forEach(mutationListener);\n\n mutationCacheSubscription.current = mutationCache.subscribe(\n ({ mutation, type }) =>\n (type === \"added\" || type === \"updated\") &&\n mutationListener(mutation),\n );\n\n return () => {\n mutationCacheSubscription.current?.();\n };\n }, [ws, queryClient]);\n\n return {};\n };\n","import { DevtoolsEvent, send } from \"@refinedev/devtools-shared\";\nimport { Mutation, Query } from \"@tanstack/react-query\";\n\nimport { createIdentifier } from \"./create-identifier\";\nimport { XRayResponse } from \"./get-xray\";\n\nexport const createMutationListener =\n (ws: WebSocket) => (mutation?: Mutation) => {\n if (!mutation?.meta?.trace) return;\n\n const meta: XRayResponse = mutation?.meta as any;\n\n new Promise<void>((resolve) => {\n send(ws, DevtoolsEvent.ACTIVITY, {\n type: \"mutation\",\n identifier: createIdentifier(\n mutation?.options.mutationKey,\n mutation?.meta?.trace as any,\n ),\n key: mutation?.options.mutationKey as any,\n status: mutation?.state.status,\n state: mutation?.state,\n variables: mutation?.state?.variables,\n ...meta,\n });\n resolve();\n });\n\n // console.table({\n // type: \"mutation\",\n // key: mutation?.options.mutationKey,\n // id: mutation?.mutationId,\n // status: mutation?.state.status,\n // trace: mutation?.meta?.trace,\n // state: mutation?.state,\n // variables: mutation?.state?.variables,\n // });\n };\n\nexport const createQueryListener = (ws: WebSocket) => (query: Query) => {\n if (!query?.meta?.trace) return;\n\n const meta: XRayResponse = query?.meta as any;\n\n new Promise<void>((resolve) => {\n send(ws, DevtoolsEvent.ACTIVITY, {\n type: \"query\",\n identifier: createIdentifier(\n query.queryKey,\n query.meta?.trace as any,\n ),\n key: query.queryKey as any,\n status: query.state.status,\n state: query.state,\n ...meta,\n });\n resolve();\n });\n\n // console.table({\n // type: \"query\",\n // key: query.queryKey,\n // status: query.state.status,\n // trace: query.meta?.trace,\n // state: query.state,\n // });\n};\n","import { TraceType } from \"@refinedev/devtools-shared\";\nimport { MutationKey, QueryKey } from \"@tanstack/react-query\";\n\nexport const createIdentifier = (\n key?: QueryKey | MutationKey,\n trace?: TraceType[],\n) => {\n const simpleTrace = trace?.map(\n (t) =>\n `${t.file}:${t.line}:${t.column}#${t.function}-${t.packageName}-${\n t.isRefine ? 1 : 0\n }`,\n );\n const str = JSON.stringify([...(key ?? []), ...(simpleTrace ?? [])]);\n\n return str;\n};\n"],"mappings":"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","names":["src_exports","__export","DevToolsContext","DevToolsContextProvider","DevtoolsEvent","hooksByScope","receive","scopes","send","module","__toCommonJS","acc","hook","scope","import_react","A","ws","event","payload","resolve","listener","callback","e","receivedEvent","r","React","__devtools","port","children","values","setValues","setWs","wsInstance","unsubscribe","data","v","contextValues","import_error_stack_parser","unrelatedFunctionName","cleanStack","stack","firstUnrelatedIndex","frame","REFINE_PACKAGE_FILEPATH_REGEXP","isRefineStack","filename","REFINE_PACKAGE_FILEPATH_REGEXP","getPackageNameFromFilename","filename","_a","match","REFINE_PACKAGE_FILEPATH_REGEXP","name","getTrace","error","stack","ErrorStackParser","cleanStack","frame","isRefineStack","getPackageNameFromFilename","trace","import_devtools_shared","getResourcePath","hookName","legacyKey","getXRay","hookName","legacyKey","trace","getTrace","resourcePath","getResourcePath","import_devtools_shared","import_react","import_devtools_shared","createIdentifier","key","trace","simpleTrace","t","createMutationListener","ws","mutation","_a","meta","resolve","_b","createIdentifier","createQueryListener","query","useQuerySubscription","queryClient","ws","queryCacheSubscription","React","mutationCacheSubscription","queryCache","queryListener","createQueryListener","query","type","_a","mutationCache","mutationListener","createMutationListener","mutation"]}
@@ -0,0 +1,4 @@
1
+ export { getTrace } from "./get-trace";
2
+ export { getXRay } from "./get-xray";
3
+ export { useQuerySubscription } from "./use-query-subscription";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ var D=Object.create;var p=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var L=(r,e)=>{for(var s in e)p(r,s,{get:e[s],enumerable:!0})},d=(r,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of A(e))!F.call(r,t)&&t!==s&&p(r,t,{get:()=>e[t],enumerable:!(n=N(e,t))||n.enumerable});return r};var E=(r,e,s)=>(s=r!=null?D(b(r)):{},d(e||!r||!r.__esModule?p(s,"default",{value:r,enumerable:!0}):s,r)),M=r=>d(p({},"__esModule",{value:!0}),r);var K={};L(K,{getTrace:()=>l,getXRay:()=>I,useQuerySubscription:()=>C});module.exports=M(K);var g=E(require("error-stack-parser"));var O="renderWithHooks",T=r=>{let e=r.findIndex(s=>s.functionName===O);return e!==-1?r.slice(0,e):r};var u=process.env.NODE_ENV!=="development"?/node_modules\/refinedev\/(?<name>.*?)\//:/\/refine\/packages\/(?<name>.*?)\//;var _=r=>r?!!r.match(u):!1;var R=r=>{var n;if(!r)return;let e=r.match(u),s=(n=e==null?void 0:e.groups)==null?void 0:n.name;if(s)return`@refinedev/${s}`};function l(){if(process.env.NODE_ENV!=="development")return[];try{let r=new Error,e=g.default.parse(r);return T(e).map(t=>({file:t.fileName,line:t.lineNumber,column:t.columnNumber,function:t.functionName,isRefine:_(t.fileName),packageName:R(t.fileName)})).filter(t=>t.function).slice(1)}catch{return[]}}var m=require("@refinedev/devtools-shared"),v=(r,e)=>{if(m.scopes[r]==="auth")return null;if(r==="useCan")return e?"key[1].resource":"key[1]";if(m.scopes[r]==="audit-log")return r==="useLog"?"variables.resource":"key[1]";if(m.scopes[r]==="data"){if(r==="useCustom"||r==="useCustomMutation")return null;switch(r){case"useList":case"useInfiniteList":case"useOne":case"useMany":return e?"key[1]":"key[2]";case"useCreate":case"useCreateMany":case"useDelete":case"useDeleteMany":case"useUpdate":case"useUpdateMany":return"variables.resource"}}return null};function I(r,e){if(process.env.NODE_ENV!=="development")return{hookName:"",trace:[],resourcePath:null,legacyKey:!1};{let s=l().slice(1),n=v(r,e);return{hookName:r,trace:s,resourcePath:n,legacyKey:e}}}var x=require("@refinedev/devtools-shared"),c=E(require("react"));var i=require("@refinedev/devtools-shared");var y=(r,e)=>{let s=e==null?void 0:e.map(t=>`${t.file}:${t.line}:${t.column}#${t.function}-${t.packageName}-${t.isRefine?1:0}`);return JSON.stringify([...r??[],...s??[]])};var P=r=>e=>{var n;if(!((n=e==null?void 0:e.meta)!=null&&n.trace))return;let s=e==null?void 0:e.meta;new Promise(t=>{var a,o;(0,i.send)(r,i.DevtoolsEvent.ACTIVITY,{type:"mutation",identifier:y(e==null?void 0:e.options.mutationKey,(a=e==null?void 0:e.meta)==null?void 0:a.trace),key:e==null?void 0:e.options.mutationKey,status:e==null?void 0:e.state.status,state:e==null?void 0:e.state,variables:(o=e==null?void 0:e.state)==null?void 0:o.variables,...s}),t()})},k=r=>e=>{var n;if(!((n=e==null?void 0:e.meta)!=null&&n.trace))return;let s=e==null?void 0:e.meta;new Promise(t=>{var a;(0,i.send)(r,i.DevtoolsEvent.ACTIVITY,{type:"query",identifier:y(e.queryKey,(a=e.meta)==null?void 0:a.trace),key:e.queryKey,status:e.state.status,state:e.state,...s}),t()})};var C=process.env.NODE_ENV!=="development"?()=>({}):r=>{let{ws:e}=(0,c.useContext)(x.DevToolsContext),s=c.default.useRef(),n=c.default.useRef();return c.default.useEffect(()=>{if(!e)return()=>0;let t=r.getQueryCache(),a=k(e);return t.getAll().forEach(a),s.current=t.subscribe(({query:o,type:f})=>(f==="added"||f==="updated")&&a(o)),()=>{var o;(o=s.current)==null||o.call(s)}},[e,r]),c.default.useEffect(()=>{if(!e)return()=>0;let t=r.getMutationCache(),a=P(e);return t.getAll().forEach(a),n.current=t.subscribe(({mutation:o,type:f})=>(f==="added"||f==="updated")&&a(o)),()=>{var o;(o=n.current)==null||o.call(n)}},[e,r]),{}};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/get-trace.ts","../src/clean-stack.ts","../src/constants.ts","../src/is-refine-stack.ts","../src/get-package-name-from-filename.ts","../src/get-resource-path.ts","../src/get-xray.ts","../src/use-query-subscription.tsx","../src/listeners.ts","../src/create-identifier.ts"],"sourcesContent":["export { getTrace } from \"./get-trace\";\nexport { getXRay } from \"./get-xray\";\nexport { useQuerySubscription } from \"./use-query-subscription\";\n","import ErrorStackParser from \"error-stack-parser\";\nimport { cleanStack } from \"./clean-stack\";\nimport { isRefineStack } from \"./is-refine-stack\";\nimport { getPackageNameFromFilename } from \"./get-package-name-from-filename\";\nimport { TraceType } from \"@refinedev/devtools-shared\";\n\nexport function getTrace() {\n if (__DEV_CONDITION__ !== \"development\") {\n return [];\n } else {\n try {\n const error = new Error();\n const stack = ErrorStackParser.parse(error);\n const clean = cleanStack(stack);\n const traces = clean\n .map(\n (frame) =>\n ({\n file: frame.fileName,\n line: frame.lineNumber,\n column: frame.columnNumber,\n function: frame.functionName,\n isRefine: isRefineStack(frame.fileName),\n packageName: getPackageNameFromFilename(\n frame.fileName,\n ),\n } as TraceType),\n )\n .filter((trace) => trace.function);\n return traces.slice(1);\n } catch (error) {\n return [];\n }\n }\n}\n","import type { StackFrame } from \"error-stack-parser\";\n\nconst unrelatedFunctionName = \"renderWithHooks\";\n\nexport const cleanStack = (stack: StackFrame[]) => {\n const firstUnrelatedIndex = stack.findIndex(\n (frame) => frame.functionName === unrelatedFunctionName,\n );\n\n if (firstUnrelatedIndex !== -1) {\n return stack.slice(0, firstUnrelatedIndex);\n }\n\n return stack;\n};\n","export const REFINE_PACKAGE_FILEPATH_REGEXP =\n __DEV_CONDITION__ !== \"development\"\n ? /node_modules\\/refinedev\\/(?<name>.*?)\\//\n : /\\/refine\\/packages\\/(?<name>.*?)\\//;\n","import { REFINE_PACKAGE_FILEPATH_REGEXP } from \"./constants\";\n\nexport const isRefineStack = (filename?: string) => {\n if (!filename) return false;\n\n const match = filename.match(REFINE_PACKAGE_FILEPATH_REGEXP);\n\n return !!match;\n};\n","import { REFINE_PACKAGE_FILEPATH_REGEXP } from \"./constants\";\n\nexport const getPackageNameFromFilename = (filename?: string) => {\n if (!filename) return;\n\n const match = filename.match(REFINE_PACKAGE_FILEPATH_REGEXP);\n\n const name = match?.groups?.name;\n\n if (!name) return;\n\n return `@refinedev/${name}`;\n};\n","import {\n DevtoolsEvent,\n DevtoolsEventPayloads,\n RefineHook,\n scopes,\n} from \"@refinedev/devtools-shared\";\n\nexport type Activity =\n DevtoolsEventPayloads[DevtoolsEvent.DEVTOOLS_ACTIVITY_UPDATE][\"updatedActivities\"][number];\n\nexport const getResourcePath = (\n hookName: RefineHook,\n legacyKey: boolean,\n): string | null => {\n if (scopes[hookName] === \"auth\") {\n return null;\n }\n if (hookName === \"useCan\") {\n if (legacyKey) {\n return \"key[1].resource\";\n } else {\n return \"key[1]\";\n }\n }\n if (scopes[hookName] === \"audit-log\") {\n if (hookName === \"useLog\") {\n return \"variables.resource\";\n }\n return \"key[1]\";\n }\n if (scopes[hookName] === \"data\") {\n if (hookName === \"useCustom\" || hookName === \"useCustomMutation\") {\n return null;\n }\n switch (hookName) {\n case \"useList\":\n case \"useInfiniteList\":\n case \"useOne\":\n case \"useMany\":\n if (legacyKey) {\n return \"key[1]\";\n } else {\n return \"key[2]\";\n }\n case \"useCreate\":\n case \"useCreateMany\":\n case \"useDelete\":\n case \"useDeleteMany\":\n case \"useUpdate\":\n case \"useUpdateMany\":\n return \"variables.resource\";\n }\n }\n return null;\n};\n","import { RefineHook, TraceType } from \"@refinedev/devtools-shared\";\nimport { getTrace } from \"./get-trace\";\nimport { getResourcePath } from \"./get-resource-path\";\n\nexport type XRayResponse = {\n hookName: string;\n trace: TraceType[];\n resourcePath: string | null;\n legacyKey: boolean;\n};\n\nexport function getXRay(hookName: string, legacyKey: boolean): XRayResponse {\n if (__DEV_CONDITION__ !== \"development\") {\n return {\n hookName: \"\",\n trace: [],\n resourcePath: null,\n legacyKey: false,\n };\n } else {\n const trace = getTrace().slice(1);\n\n const resourcePath = getResourcePath(hookName as RefineHook, legacyKey);\n\n return {\n hookName,\n trace,\n resourcePath,\n legacyKey,\n };\n }\n}\n","import { DevToolsContext } from \"@refinedev/devtools-shared\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport React, { useContext } from \"react\";\nimport { createQueryListener, createMutationListener } from \"./listeners\";\n\nexport const useQuerySubscription =\n __DEV_CONDITION__ !== \"development\"\n ? () => ({})\n : (queryClient: QueryClient) => {\n const { ws } = useContext(DevToolsContext);\n const queryCacheSubscription = React.useRef<() => void>();\n const mutationCacheSubscription = React.useRef<() => void>();\n\n React.useEffect(() => {\n if (!ws) return () => 0;\n\n const queryCache = queryClient.getQueryCache();\n\n const queryListener = createQueryListener(ws);\n\n queryCache.getAll().forEach(queryListener);\n\n queryCacheSubscription.current = queryCache.subscribe(\n ({ query, type }) =>\n (type === \"added\" || type === \"updated\") &&\n queryListener(query),\n );\n\n return () => {\n queryCacheSubscription.current?.();\n };\n }, [ws, queryClient]);\n\n React.useEffect(() => {\n if (!ws) return () => 0;\n\n const mutationCache = queryClient.getMutationCache();\n\n const mutationListener = createMutationListener(ws);\n\n mutationCache.getAll().forEach(mutationListener);\n\n mutationCacheSubscription.current = mutationCache.subscribe(\n ({ mutation, type }) =>\n (type === \"added\" || type === \"updated\") &&\n mutationListener(mutation),\n );\n\n return () => {\n mutationCacheSubscription.current?.();\n };\n }, [ws, queryClient]);\n\n return {};\n };\n","import { DevtoolsEvent, send } from \"@refinedev/devtools-shared\";\nimport { Mutation, Query } from \"@tanstack/react-query\";\n\nimport { createIdentifier } from \"./create-identifier\";\nimport { XRayResponse } from \"./get-xray\";\n\nexport const createMutationListener =\n (ws: WebSocket) => (mutation?: Mutation) => {\n if (!mutation?.meta?.trace) return;\n\n const meta: XRayResponse = mutation?.meta as any;\n\n new Promise<void>((resolve) => {\n send(ws, DevtoolsEvent.ACTIVITY, {\n type: \"mutation\",\n identifier: createIdentifier(\n mutation?.options.mutationKey,\n mutation?.meta?.trace as any,\n ),\n key: mutation?.options.mutationKey as any,\n status: mutation?.state.status,\n state: mutation?.state,\n variables: mutation?.state?.variables,\n ...meta,\n });\n resolve();\n });\n\n // console.table({\n // type: \"mutation\",\n // key: mutation?.options.mutationKey,\n // id: mutation?.mutationId,\n // status: mutation?.state.status,\n // trace: mutation?.meta?.trace,\n // state: mutation?.state,\n // variables: mutation?.state?.variables,\n // });\n };\n\nexport const createQueryListener = (ws: WebSocket) => (query: Query) => {\n if (!query?.meta?.trace) return;\n\n const meta: XRayResponse = query?.meta as any;\n\n new Promise<void>((resolve) => {\n send(ws, DevtoolsEvent.ACTIVITY, {\n type: \"query\",\n identifier: createIdentifier(\n query.queryKey,\n query.meta?.trace as any,\n ),\n key: query.queryKey as any,\n status: query.state.status,\n state: query.state,\n ...meta,\n });\n resolve();\n });\n\n // console.table({\n // type: \"query\",\n // key: query.queryKey,\n // status: query.state.status,\n // trace: query.meta?.trace,\n // state: query.state,\n // });\n};\n","import { TraceType } from \"@refinedev/devtools-shared\";\nimport { MutationKey, QueryKey } from \"@tanstack/react-query\";\n\nexport const createIdentifier = (\n key?: QueryKey | MutationKey,\n trace?: TraceType[],\n) => {\n const simpleTrace = trace?.map(\n (t) =>\n `${t.file}:${t.line}:${t.column}#${t.function}-${t.packageName}-${\n t.isRefine ? 1 : 0\n }`,\n );\n const str = JSON.stringify([...(key ?? []), ...(simpleTrace ?? [])]);\n\n return str;\n};\n"],"mappings":"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","names":["src_exports","__export","getTrace","getXRay","useQuerySubscription","__toCommonJS","import_error_stack_parser","unrelatedFunctionName","cleanStack","stack","firstUnrelatedIndex","frame","REFINE_PACKAGE_FILEPATH_REGEXP","isRefineStack","filename","REFINE_PACKAGE_FILEPATH_REGEXP","getPackageNameFromFilename","filename","_a","match","REFINE_PACKAGE_FILEPATH_REGEXP","name","getTrace","error","stack","ErrorStackParser","cleanStack","frame","isRefineStack","getPackageNameFromFilename","trace","import_devtools_shared","getResourcePath","hookName","legacyKey","getXRay","hookName","legacyKey","trace","getTrace","resourcePath","getResourcePath","import_devtools_shared","import_react","import_devtools_shared","createIdentifier","key","trace","simpleTrace","createMutationListener","ws","mutation","_a","meta","resolve","_b","createIdentifier","createQueryListener","query","useQuerySubscription","queryClient","ws","queryCacheSubscription","React","mutationCacheSubscription","queryCache","queryListener","createQueryListener","query","type","_a","mutationCache","mutationListener","createMutationListener","mutation"]}
@@ -0,0 +1,2 @@
1
+ export declare const isRefineStack: (filename?: string) => boolean;
2
+ //# sourceMappingURL=is-refine-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-refine-stack.d.ts","sourceRoot":"","sources":["../src/is-refine-stack.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,cAAe,MAAM,YAM9C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Mutation, Query } from "@tanstack/react-query";
2
+ export declare const createMutationListener: (ws: WebSocket) => (mutation?: Mutation) => void;
3
+ export declare const createQueryListener: (ws: WebSocket) => (query: Query) => void;
4
+ //# sourceMappingURL=listeners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listeners.d.ts","sourceRoot":"","sources":["../src/listeners.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAKxD,eAAO,MAAM,sBAAsB,OAC1B,SAAS,iBAAiB,QAAQ,SA8BtC,CAAC;AAEN,eAAO,MAAM,mBAAmB,OAAQ,SAAS,aAAa,KAAK,SA2BlE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { QueryClient } from "@tanstack/react-query";
2
+ export declare const useQuerySubscription: (queryClient: QueryClient) => {};
3
+ //# sourceMappingURL=use-query-subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-query-subscription.d.ts","sourceRoot":"","sources":["../src/use-query-subscription.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,eAAO,MAAM,oBAAoB,gBAGT,WAAW,OA8CxB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "license": "MIT",
4
+ "main": "dist/index.js",
5
+ "typings": "dist/index.d.ts",
6
+ "private": false,
7
+ "sideEffects": false,
8
+ "files": [
9
+ "dist",
10
+ "src"
11
+ ],
12
+ "engines": {
13
+ "node": ">=10"
14
+ },
15
+ "scripts": {
16
+ "start": "tsup --watch --format esm,cjs,iife --legacy-output",
17
+ "build": "tsup --format esm,cjs,iife --minify --legacy-output",
18
+ "test": "jest --passWithNoTests --runInBand",
19
+ "prepare": "npm run build"
20
+ },
21
+ "name": "@refinedev/devtools-internal",
22
+ "description": "refine devtools offers a set of features from monitoring to quickly prototyping a UI.",
23
+ "author": "refine",
24
+ "module": "dist/esm/index.js",
25
+ "dependencies": {
26
+ "@refinedev/devtools-shared": "^1.0.0",
27
+ "@tanstack/react-query": "^4.10.1",
28
+ "error-stack-parser": "^2.1.4"
29
+ },
30
+ "peerDependencies": {
31
+ "react": "^17.0.0 || ^18.0.0",
32
+ "react-dom": "^17.0.0 || ^18.0.0",
33
+ "@types/react": "^17.0.0 || ^18.0.0",
34
+ "@types/react-dom": "^17.0.0 || ^18.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@testing-library/jest-dom": "^5.16.4",
38
+ "@esbuild-plugins/node-resolve": "^0.1.4",
39
+ "@types/jest": "^29.2.4",
40
+ "jest": "^29.3.1",
41
+ "jest-environment-jsdom": "^29.3.1",
42
+ "react-router-dom": "^6.8.1",
43
+ "ts-jest": "^29.0.3",
44
+ "tslib": "^2.3.1",
45
+ "tsup": "^6.7.0"
46
+ },
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "https://github.com/refinedev/refine.git",
50
+ "directory": "packages/devtools"
51
+ },
52
+ "gitHead": "829f5a516f98c06f666d6be3e6e6099c75c07719",
53
+ "publishConfig": {
54
+ "access": "public"
55
+ }
56
+ }
@@ -0,0 +1,15 @@
1
+ import type { StackFrame } from "error-stack-parser";
2
+
3
+ const unrelatedFunctionName = "renderWithHooks";
4
+
5
+ export const cleanStack = (stack: StackFrame[]) => {
6
+ const firstUnrelatedIndex = stack.findIndex(
7
+ (frame) => frame.functionName === unrelatedFunctionName,
8
+ );
9
+
10
+ if (firstUnrelatedIndex !== -1) {
11
+ return stack.slice(0, firstUnrelatedIndex);
12
+ }
13
+
14
+ return stack;
15
+ };
@@ -0,0 +1,4 @@
1
+ export const REFINE_PACKAGE_FILEPATH_REGEXP =
2
+ __DEV_CONDITION__ !== "development"
3
+ ? /node_modules\/refinedev\/(?<name>.*?)\//
4
+ : /\/refine\/packages\/(?<name>.*?)\//;
@@ -0,0 +1,17 @@
1
+ import { TraceType } from "@refinedev/devtools-shared";
2
+ import { MutationKey, QueryKey } from "@tanstack/react-query";
3
+
4
+ export const createIdentifier = (
5
+ key?: QueryKey | MutationKey,
6
+ trace?: TraceType[],
7
+ ) => {
8
+ const simpleTrace = trace?.map(
9
+ (t) =>
10
+ `${t.file}:${t.line}:${t.column}#${t.function}-${t.packageName}-${
11
+ t.isRefine ? 1 : 0
12
+ }`,
13
+ );
14
+ const str = JSON.stringify([...(key ?? []), ...(simpleTrace ?? [])]);
15
+
16
+ return str;
17
+ };
@@ -0,0 +1 @@
1
+ declare const __DEV_CONDITION__: string;
@@ -0,0 +1,13 @@
1
+ import { REFINE_PACKAGE_FILEPATH_REGEXP } from "./constants";
2
+
3
+ export const getPackageNameFromFilename = (filename?: string) => {
4
+ if (!filename) return;
5
+
6
+ const match = filename.match(REFINE_PACKAGE_FILEPATH_REGEXP);
7
+
8
+ const name = match?.groups?.name;
9
+
10
+ if (!name) return;
11
+
12
+ return `@refinedev/${name}`;
13
+ };
@@ -0,0 +1,55 @@
1
+ import {
2
+ DevtoolsEvent,
3
+ DevtoolsEventPayloads,
4
+ RefineHook,
5
+ scopes,
6
+ } from "@refinedev/devtools-shared";
7
+
8
+ export type Activity =
9
+ DevtoolsEventPayloads[DevtoolsEvent.DEVTOOLS_ACTIVITY_UPDATE]["updatedActivities"][number];
10
+
11
+ export const getResourcePath = (
12
+ hookName: RefineHook,
13
+ legacyKey: boolean,
14
+ ): string | null => {
15
+ if (scopes[hookName] === "auth") {
16
+ return null;
17
+ }
18
+ if (hookName === "useCan") {
19
+ if (legacyKey) {
20
+ return "key[1].resource";
21
+ } else {
22
+ return "key[1]";
23
+ }
24
+ }
25
+ if (scopes[hookName] === "audit-log") {
26
+ if (hookName === "useLog") {
27
+ return "variables.resource";
28
+ }
29
+ return "key[1]";
30
+ }
31
+ if (scopes[hookName] === "data") {
32
+ if (hookName === "useCustom" || hookName === "useCustomMutation") {
33
+ return null;
34
+ }
35
+ switch (hookName) {
36
+ case "useList":
37
+ case "useInfiniteList":
38
+ case "useOne":
39
+ case "useMany":
40
+ if (legacyKey) {
41
+ return "key[1]";
42
+ } else {
43
+ return "key[2]";
44
+ }
45
+ case "useCreate":
46
+ case "useCreateMany":
47
+ case "useDelete":
48
+ case "useDeleteMany":
49
+ case "useUpdate":
50
+ case "useUpdateMany":
51
+ return "variables.resource";
52
+ }
53
+ }
54
+ return null;
55
+ };
@@ -0,0 +1,35 @@
1
+ import ErrorStackParser from "error-stack-parser";
2
+ import { cleanStack } from "./clean-stack";
3
+ import { isRefineStack } from "./is-refine-stack";
4
+ import { getPackageNameFromFilename } from "./get-package-name-from-filename";
5
+ import { TraceType } from "@refinedev/devtools-shared";
6
+
7
+ export function getTrace() {
8
+ if (__DEV_CONDITION__ !== "development") {
9
+ return [];
10
+ } else {
11
+ try {
12
+ const error = new Error();
13
+ const stack = ErrorStackParser.parse(error);
14
+ const clean = cleanStack(stack);
15
+ const traces = clean
16
+ .map(
17
+ (frame) =>
18
+ ({
19
+ file: frame.fileName,
20
+ line: frame.lineNumber,
21
+ column: frame.columnNumber,
22
+ function: frame.functionName,
23
+ isRefine: isRefineStack(frame.fileName),
24
+ packageName: getPackageNameFromFilename(
25
+ frame.fileName,
26
+ ),
27
+ } as TraceType),
28
+ )
29
+ .filter((trace) => trace.function);
30
+ return traces.slice(1);
31
+ } catch (error) {
32
+ return [];
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,32 @@
1
+ import { RefineHook, TraceType } from "@refinedev/devtools-shared";
2
+ import { getTrace } from "./get-trace";
3
+ import { getResourcePath } from "./get-resource-path";
4
+
5
+ export type XRayResponse = {
6
+ hookName: string;
7
+ trace: TraceType[];
8
+ resourcePath: string | null;
9
+ legacyKey: boolean;
10
+ };
11
+
12
+ export function getXRay(hookName: string, legacyKey: boolean): XRayResponse {
13
+ if (__DEV_CONDITION__ !== "development") {
14
+ return {
15
+ hookName: "",
16
+ trace: [],
17
+ resourcePath: null,
18
+ legacyKey: false,
19
+ };
20
+ } else {
21
+ const trace = getTrace().slice(1);
22
+
23
+ const resourcePath = getResourcePath(hookName as RefineHook, legacyKey);
24
+
25
+ return {
26
+ hookName,
27
+ trace,
28
+ resourcePath,
29
+ legacyKey,
30
+ };
31
+ }
32
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { getTrace } from "./get-trace";
2
+ export { getXRay } from "./get-xray";
3
+ export { useQuerySubscription } from "./use-query-subscription";
@@ -0,0 +1,9 @@
1
+ import { REFINE_PACKAGE_FILEPATH_REGEXP } from "./constants";
2
+
3
+ export const isRefineStack = (filename?: string) => {
4
+ if (!filename) return false;
5
+
6
+ const match = filename.match(REFINE_PACKAGE_FILEPATH_REGEXP);
7
+
8
+ return !!match;
9
+ };
@@ -0,0 +1,67 @@
1
+ import { DevtoolsEvent, send } from "@refinedev/devtools-shared";
2
+ import { Mutation, Query } from "@tanstack/react-query";
3
+
4
+ import { createIdentifier } from "./create-identifier";
5
+ import { XRayResponse } from "./get-xray";
6
+
7
+ export const createMutationListener =
8
+ (ws: WebSocket) => (mutation?: Mutation) => {
9
+ if (!mutation?.meta?.trace) return;
10
+
11
+ const meta: XRayResponse = mutation?.meta as any;
12
+
13
+ new Promise<void>((resolve) => {
14
+ send(ws, DevtoolsEvent.ACTIVITY, {
15
+ type: "mutation",
16
+ identifier: createIdentifier(
17
+ mutation?.options.mutationKey,
18
+ mutation?.meta?.trace as any,
19
+ ),
20
+ key: mutation?.options.mutationKey as any,
21
+ status: mutation?.state.status,
22
+ state: mutation?.state,
23
+ variables: mutation?.state?.variables,
24
+ ...meta,
25
+ });
26
+ resolve();
27
+ });
28
+
29
+ // console.table({
30
+ // type: "mutation",
31
+ // key: mutation?.options.mutationKey,
32
+ // id: mutation?.mutationId,
33
+ // status: mutation?.state.status,
34
+ // trace: mutation?.meta?.trace,
35
+ // state: mutation?.state,
36
+ // variables: mutation?.state?.variables,
37
+ // });
38
+ };
39
+
40
+ export const createQueryListener = (ws: WebSocket) => (query: Query) => {
41
+ if (!query?.meta?.trace) return;
42
+
43
+ const meta: XRayResponse = query?.meta as any;
44
+
45
+ new Promise<void>((resolve) => {
46
+ send(ws, DevtoolsEvent.ACTIVITY, {
47
+ type: "query",
48
+ identifier: createIdentifier(
49
+ query.queryKey,
50
+ query.meta?.trace as any,
51
+ ),
52
+ key: query.queryKey as any,
53
+ status: query.state.status,
54
+ state: query.state,
55
+ ...meta,
56
+ });
57
+ resolve();
58
+ });
59
+
60
+ // console.table({
61
+ // type: "query",
62
+ // key: query.queryKey,
63
+ // status: query.state.status,
64
+ // trace: query.meta?.trace,
65
+ // state: query.state,
66
+ // });
67
+ };
@@ -0,0 +1,55 @@
1
+ import { DevToolsContext } from "@refinedev/devtools-shared";
2
+ import { QueryClient } from "@tanstack/react-query";
3
+ import React, { useContext } from "react";
4
+ import { createQueryListener, createMutationListener } from "./listeners";
5
+
6
+ export const useQuerySubscription =
7
+ __DEV_CONDITION__ !== "development"
8
+ ? () => ({})
9
+ : (queryClient: QueryClient) => {
10
+ const { ws } = useContext(DevToolsContext);
11
+ const queryCacheSubscription = React.useRef<() => void>();
12
+ const mutationCacheSubscription = React.useRef<() => void>();
13
+
14
+ React.useEffect(() => {
15
+ if (!ws) return () => 0;
16
+
17
+ const queryCache = queryClient.getQueryCache();
18
+
19
+ const queryListener = createQueryListener(ws);
20
+
21
+ queryCache.getAll().forEach(queryListener);
22
+
23
+ queryCacheSubscription.current = queryCache.subscribe(
24
+ ({ query, type }) =>
25
+ (type === "added" || type === "updated") &&
26
+ queryListener(query),
27
+ );
28
+
29
+ return () => {
30
+ queryCacheSubscription.current?.();
31
+ };
32
+ }, [ws, queryClient]);
33
+
34
+ React.useEffect(() => {
35
+ if (!ws) return () => 0;
36
+
37
+ const mutationCache = queryClient.getMutationCache();
38
+
39
+ const mutationListener = createMutationListener(ws);
40
+
41
+ mutationCache.getAll().forEach(mutationListener);
42
+
43
+ mutationCacheSubscription.current = mutationCache.subscribe(
44
+ ({ mutation, type }) =>
45
+ (type === "added" || type === "updated") &&
46
+ mutationListener(mutation),
47
+ );
48
+
49
+ return () => {
50
+ mutationCacheSubscription.current?.();
51
+ };
52
+ }, [ws, queryClient]);
53
+
54
+ return {};
55
+ };