{"version":3,"file":"components/Charts/utils.mjs","sources":["../../../src/components/Charts/utils.ts"],"sourcesContent":["import { Loader } from '@rsdoctor/utils/common';\nimport { SDK } from '@rsdoctor/types';\nimport dayjs from 'dayjs';\nimport { maxBy, minBy } from 'es-toolkit/compat';\nimport { formatCosts } from 'src/utils/time';\n\nimport { DurationMetric, ETraceEventPhase, ITraceEventData } from './types';\nimport { escapeHtml } from './escapeHtml';\nimport { useEffect, useState } from 'react';\n\nexport function getTooltipHtmlForLoader(\n  loader: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderChartData>[0],\n) {\n  return `\n  <div class=\"loader-tooltip-container\">\n    <div class=\"loader-tooltip-title\">${escapeHtml(loader.loader)}</div>\n    <li class=\"loader-tooltip-item\">\n      <span>isPitch</span>\n      <span>${loader.isPitch}</span>\n    </li>\n    ${\n      loader.layer && loader.layer !== 'undefined'\n        ? `<li class=\"loader-tooltip-item\">\n        <span>layer</span>\n        <span>${escapeHtml(loader.layer)}</span>\n      </li>`\n        : ``\n    }\n    <li class=\"loader-tooltip-item\">\n      <span>duration</span>\n      <span class=\"loader-tooltip-text-bold\">${formatCosts(loader.costs)}</span>\n    </li>\n    <li class=\"loader-tooltip-item\">\n      <span>filepath</span>\n      <span>${escapeHtml(loader.resource)}</span>\n    </li>\n    <li class=\"loader-tooltip-item\">\n      <span>start</span>\n      <span class=\"loader-tooltip-text-bold\">${dayjs(loader.startAt).format(\n        'YYYY/MM/DD HH:mm:ss',\n      )}</span>\n    </li>\n    <li class=\"loader-tooltip-item\">\n      <span>end</span>\n      <span class=\"loader-tooltip-text-bold\">${dayjs(loader.endAt).format(\n        'YYYY/MM/DD HH:mm:ss',\n      )}</span>\n    </li>\n  </div>\n  `.trim();\n}\n\nexport function renderTotalLoadersTooltip(\n  loaderName: string,\n  loaders: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderChartData>,\n  cwd: string,\n) {\n  const filter = (loader: { loader: string }) => loader.loader === loaderName;\n  const filteredLoaders = loaders.filter(filter);\n  const resources = filteredLoaders.map((e) => e.resource);\n  const nodeModulesResources = resources.filter((e) =>\n    e.includes('/node_modules/'),\n  );\n  const outsideResources = resources.filter((e) => !e.startsWith(cwd));\n  const start = minBy(filteredLoaders, (e) => e.startAt)!.startAt;\n  const end = maxBy(filteredLoaders, (e) => e.endAt)!.endAt;\n\n  // const duration = sumBy(filteredLoaders, (e) => e.costs);\n  const duration = Loader.getLoadersCosts(filter, loaders);\n\n  return `\n<div class=\"loader-tooltip-container\">\n  <div class=\"loader-tooltip-title\">${escapeHtml(loaderName)}</div>\n  <li class=\"loader-tooltip-item\">\n    <span>files</span>\n    <span class=\"loader-tooltip-text-bold\">${resources.length}</span>\n  </li>\n  <li class=\"loader-tooltip-item\">\n    <span>files(node_modules)</span>\n    <span class=\"loader-tooltip-text-bold\">${nodeModulesResources.length}</span>\n  </li>\n  <li class=\"loader-tooltip-item\">\n    <span>files(outside the cwd)</span>\n    <span class=\"loader-tooltip-text-bold\">${outsideResources.length}</span>\n  </li>\n  <li class=\"loader-tooltip-item\">\n    <span>duration(estimated)</span>\n    <span class=\"loader-tooltip-text-bold\">${formatCosts(duration)}</span>\n  </li>\n  <li class=\"loader-tooltip-item\">\n    <span>start(min)</span>\n    <span>${dayjs(start).format('YYYY/MM/DD HH:mm:ss')}</span>\n  </li>\n  <li class=\"loader-tooltip-item\">\n    <span>end(max)</span>\n    <span>${dayjs(end).format('YYYY/MM/DD HH:mm:ss')}</span>\n  </li>\n  </div>\n    `.trim();\n}\n\nexport function transformDurationMetric(\n  rawData: DurationMetric[],\n): ITraceEventData[] {\n  return rawData.reduce((acc, cur) => {\n    if (cur.c) {\n      const res = transformDurationMetric(cur.c);\n      acc.push(\n        {\n          name: cur.n,\n          ph: ETraceEventPhase.BEGIN,\n          pid: cur.p,\n          ts: cur.s,\n          args: cur,\n        },\n        ...res,\n        {\n          name: cur.n,\n          ph: ETraceEventPhase.END,\n          pid: cur.p,\n          ts: cur.e,\n          args: cur,\n        },\n      );\n    } else {\n      acc.push({\n        name: cur.n,\n        ph: ETraceEventPhase.BEGIN,\n        pid: cur.p,\n        ts: cur.s,\n        args: cur,\n      });\n      acc.push({\n        name: cur.n,\n        ph: ETraceEventPhase.END,\n        pid: cur.p,\n        ts: cur.e,\n        args: cur,\n      });\n    }\n    return acc;\n  }, [] as ITraceEventData[]);\n}\n\n// DFS 遍历，取每层的最后一个元素与目标元素进行比较，如果目标元素可以存放至当前层，就push；如果不能就放到下一层\nexport function processTrans(rawData: DurationMetric[]) {\n  const processedData = rawData\n    .sort((a, b) => a.s - b.s)\n    .reduce(\n      (prev, cur) => {\n        const ca = prev[cur.p];\n        if (ca) {\n          loop(ca, cur);\n        } else {\n          prev[cur.p] = [cur];\n        }\n        return prev;\n      },\n      {} as Record<string, DurationMetric[]>,\n    );\n  const data = Object.entries(processedData).reduce((prev, [_key, val]) => {\n    // @ts-ignore\n    prev.push(...val);\n    return prev;\n  }, [] as DurationMetric[]);\n  return transformDurationMetric(data);\n}\n\nfunction loop(dur: DurationMetric[], target: DurationMetric) {\n  const queue = [dur];\n  while (queue.length > 0) {\n    const floor = queue.shift() || [];\n    if (floor.length === 0) return;\n    const curFloorLast = floor[floor.length - 1];\n    if (curFloorLast.e <= target.s) {\n      return floor.push(target);\n    }\n    let nextFloor: DurationMetric[];\n    for (let i = floor.length - 1; i >= 0; i--) {\n      const { c } = floor[i];\n      if (c) {\n        nextFloor = c;\n      }\n    }\n    // @ts-ignore\n    if (nextFloor) {\n      queue.push(nextFloor);\n    } else {\n      curFloorLast.c = [target];\n    }\n  }\n}\n\nexport function formatterForPlugins(raw: { data: { ext: ITraceEventData } }) {\n  const { ext } = raw.data;\n  return `\n  <div class=\"loader-tooltip-container\">\n    <div class=\"loader-tooltip-title\">[${escapeHtml(ext.args.p)}] ${escapeHtml(ext.args.n)}</div>\n    <li class=\"loader-tooltip-item\">\n      <span>hook</span>\n      <span>${escapeHtml(ext.args.p)}</span>\n    </li>\n    <li class=\"loader-tooltip-item\">\n      <span>tap name</span>\n      <span>${escapeHtml(ext.args.n)}</span>\n    </li>\n    <li class=\"loader-tooltip-item\">\n      <span>start</span>\n      <span>${dayjs(ext.args.s).format('YYYY/MM/DD HH:mm:ss')}</span>\n    </li>\n    <li class=\"loader-tooltip-item\">\n      <span>end</span>\n      <span>${dayjs(ext.args.e).format('YYYY/MM/DD HH:mm:ss')}</span>\n    </li>\n    <li class=\"loader-tooltip-item\">\n      <span>duration</span>\n      <span>${formatCosts(ext.args.e - ext.args.s)}</span>\n    </li>\n  </div>\n      `.trim();\n}\n\nexport function useDebounceHook(\n  value: DurationMetric[],\n  delay: number,\n): DurationMetric[] | undefined {\n  const [debounceValue, setDebounceValue] = useState(value);\n  useEffect(() => {\n    const timer = setTimeout(() => setDebounceValue(value), delay);\n    return () => clearTimeout(timer);\n  }, [value, delay]);\n  return debounceValue;\n}\n"],"names":["getTooltipHtmlForLoader","loader","escapeHtml","formatCosts","dayjs","renderTotalLoadersTooltip","loaderName","loaders","cwd","filter","filteredLoaders","resources","e","nodeModulesResources","outsideResources","start","minBy","end","maxBy","duration","Loader","transformDurationMetric","rawData","acc","cur","res","ETraceEventPhase","processTrans","processedData","a","b","prev","ca","loop","data","Object","_key","val","dur","target","queue","floor","curFloorLast","nextFloor","i","c","formatterForPlugins","raw","ext","useDebounceHook","value","delay","debounceValue","setDebounceValue","useState","useEffect","timer","setTimeout","clearTimeout"],"mappings":"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"}