{"version":3,"sources":["../src/index.ts","../src/event-types.ts","../src/scopes.ts","../src/context.tsx","../src/send.ts","../src/receive.ts"],"sourcesContent":["export { DevtoolsEvent, DevtoolsEventPayloads } from \"./event-types.js\";\nexport { TraceType } from \"./trace.js\";\nexport { Feed, FeedSection } from \"./feed.js\";\nexport {\n  PackageType,\n  PackageLatestVersionType,\n  AvailablePackageType,\n} from \"./package.js\";\nexport { RefineHook, Scopes, hooksByScope, scopes } from \"./scopes.js\";\n\nexport { DevToolsContextProvider, DevToolsContext } from \"./context.js\";\n\nexport { send } from \"./send.js\";\nexport { receive } from \"./receive.js\";\n","import type {\n  Mutation,\n  MutationKey,\n  MutationStatus,\n  QueryKey,\n  QueryState,\n  QueryStatus,\n} from \"@tanstack/react-query\";\nimport type { TraceType } from \"./trace\";\n\nexport enum DevtoolsEvent {\n  RELOAD = \"devtools:reload\",\n  DEVTOOLS_INIT = \"devtools:init\",\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_INVALIDATE_QUERY = \"devtools:invalidate-query\",\n  DEVTOOLS_INVALIDATE_QUERY_ACTION = \"devtools:invalidate-query-action\",\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      resourceName?: string;\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      resourceName?: string;\n    };\n\nexport type DevtoolsEventPayloads = {\n  [DevtoolsEvent.RELOAD]: {};\n  [DevtoolsEvent.DEVTOOLS_INIT]: { 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_INVALIDATE_QUERY]: { queryKey: QueryKey };\n  [DevtoolsEvent.DEVTOOLS_INVALIDATE_QUERY_ACTION]: { queryKey: QueryKey };\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  httpUrl: string;\n  wsUrl: string;\n  ws: WebSocket | null;\n};\n\nexport const DevToolsContext = React.createContext<DevtoolsContextValue>({\n  __devtools: false,\n  httpUrl: \"http://localhost:5001\",\n  wsUrl: \"ws://localhost:5001\",\n  ws: null,\n});\n\ntype Props = React.PropsWithChildren<{\n  __devtools?: boolean;\n  url?: string | [httpUrl: string, wsUrl: string];\n}>;\n\nexport const DevToolsContextProvider: React.FC<Props> = ({\n  __devtools,\n  url = [\"http://localhost:5001\", \"ws://localhost:5001\"],\n  children,\n}) => {\n  const httpUrl = Array.isArray(url) ? url[0] : url;\n  const wsUrl = Array.isArray(url)\n    ? url[1]\n    : url.replace(/http(s)?:\\/\\//, \"ws$1://\");\n\n  const [values, setValues] = React.useState<DevtoolsContextValue>({\n    __devtools: __devtools ?? false,\n    httpUrl,\n    wsUrl,\n    ws: null,\n  });\n\n  const [ws, setWs] = React.useState<WebSocket | null>(null);\n\n  React.useEffect(() => {\n    let timeout: NodeJS.Timeout | null = null;\n    const wsInstance = new WebSocket(values.wsUrl);\n\n    wsInstance.addEventListener(\"open\", () => {\n      if (!values.__devtools) {\n        timeout = setTimeout(() => {\n          send(wsInstance, DevtoolsEvent.DEVTOOLS_INIT, {\n            url: window.location.origin,\n          });\n        }, 300);\n      }\n    });\n\n    setWs(wsInstance);\n\n    return () => {\n      if (timeout) clearTimeout(timeout);\n\n      // In strict mode, the WebSocket instance might not be connected yet\n      // so we need to wait for it to connect before closing it\n      // otherwise it will log an unnecessary error in the console\n      if (wsInstance.readyState === WebSocket.CONNECTING) {\n        wsInstance.addEventListener(\"open\", () => {\n          wsInstance.close(1000, window.location.origin);\n        });\n      } else {\n        wsInstance.close(1000, window.location.origin);\n      }\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 type { 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  }\n  ws.send(JSON.stringify({ event, payload }));\n  return;\n}\n","// receive ws message by adding a listener to the ws object\n\nimport type { 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"],"mappings":"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","names":["DevtoolsEvent","React"]}