{"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.js\";\nexport { getXRay } from \"./get-xray.js\";\nexport { useQuerySubscription } from \"./use-query-subscription.js\";\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 type { TraceType } from \"@refinedev/devtools-shared\";\n\nexport function getTrace(excludeFromTrace?: string[]) {\n  if (__DEV_CONDITION__ !== \"development\") {\n    return [];\n  }\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(frame.fileName),\n          }) as TraceType,\n      )\n      .filter((trace) => trace.function)\n      .filter((trace) => !excludeFromTrace?.includes(trace.function ?? \"\"));\n    return traces.slice(1);\n  } catch (error) {\n    return [];\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  type DevtoolsEvent,\n  type DevtoolsEventPayloads,\n  type 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    }\n    return \"key[1]\";\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        }\n        return \"key[2]\";\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 type { 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  resourceName?: string;\n};\n\nexport function getXRay(\n  hookName: string,\n  legacyKey: boolean,\n  resourceName?: string,\n  excludeFromTrace?: string[],\n): XRayResponse {\n  if (__DEV_CONDITION__ !== \"development\") {\n    return {\n      hookName: \"\",\n      trace: [],\n      resourcePath: null,\n      legacyKey: false,\n    };\n  }\n  const trace = getTrace(excludeFromTrace).slice(1);\n\n  const resourcePath = getResourcePath(hookName as RefineHook, legacyKey);\n\n  return {\n    hookName,\n    trace,\n    resourcePath,\n    legacyKey,\n    resourceName,\n  };\n}\n","import {\n  DevToolsContext,\n  DevtoolsEvent,\n  receive,\n} from \"@refinedev/devtools-shared\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport React, { useContext } from \"react\";\nimport { createQueryListener, createMutationListener } from \"./listeners\";\n\nconst empty = {};\nconst noop = () => empty;\n\nexport const useQuerySubscription =\n  __DEV_CONDITION__ !== \"development\"\n    ? noop\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\") && 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        React.useEffect(() => {\n          if (!ws) return () => 0;\n\n          const cb = receive(\n            ws,\n            DevtoolsEvent.DEVTOOLS_INVALIDATE_QUERY_ACTION,\n            ({ queryKey }) => {\n              if (queryKey) {\n                queryClient.invalidateQueries(queryKey);\n              }\n            },\n          );\n\n          return cb;\n        }, [ws, queryClient]);\n\n        return {};\n      };\n","import { DevtoolsEvent, send } from \"@refinedev/devtools-shared\";\nimport type { Mutation, Query } from \"@tanstack/react-query\";\n\nimport { createIdentifier } from \"./create-identifier\";\nimport type { 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\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(query.queryKey, query.meta?.trace as any),\n      key: query.queryKey as any,\n      status: query.state.status,\n      state: query.state,\n      ...meta,\n    });\n    resolve();\n  });\n};\n","import type { TraceType } from \"@refinedev/devtools-shared\";\nimport type { 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","excludeFromTrace","error","stack","ErrorStackParser","cleanStack","frame","isRefineStack","getPackageNameFromFilename","trace","import_devtools_shared","getResourcePath","hookName","legacyKey","getXRay","hookName","legacyKey","resourceName","excludeFromTrace","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","empty","noop","useQuerySubscription","queryClient","ws","queryCacheSubscription","React","mutationCacheSubscription","queryCache","queryListener","createQueryListener","query","type","_a","mutationCache","mutationListener","createMutationListener","mutation","queryKey"]}