@rsdoctor/components 1.6.3 → 1.6.5

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.
@@ -0,0 +1 @@
1
+ export declare const escapeHtml: (value: unknown) => string;
@@ -0,0 +1,5 @@
1
+ import * as __rspack_external_echarts_core_d2845954 from "echarts/core";
2
+ const escapeHtml = (value)=>__rspack_external_echarts_core_d2845954.format.encodeHTML(String(value));
3
+ export { escapeHtml };
4
+
5
+ //# sourceMappingURL=escapeHtml.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Charts/escapeHtml.mjs","sources":["../../../src/components/Charts/escapeHtml.ts"],"sourcesContent":["import * as echarts from 'echarts/core';\n\nexport const escapeHtml = (value: unknown) =>\n echarts.format.encodeHTML(String(value));\n"],"names":["escapeHtml","value","echarts","String"],"mappings":";AAEO,MAAMA,aAAa,CAACC,QACzBC,wCAAAA,MAAAA,CAAAA,UAAyB,CAACC,OAAOF"}
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
2
  import './loader.scss';
3
+ import './tooltips.scss';
3
4
  import { ChartProps } from './types.js';
4
5
  export declare const LoaderExecutionsChart: React.FC<ChartProps>;
@@ -3,6 +3,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
3
  import { groupBy } from "es-toolkit/compat";
4
4
  import { Empty } from "antd";
5
5
  import "./loader.css";
6
+ import "./tooltips.css";
6
7
  import { useTheme } from "../../utils/manifest.mjs";
7
8
  import { findLoaderTotalTiming } from "../../utils/loader.mjs";
8
9
  import { beautifyPath } from "../../utils/file.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"components/Charts/loader.mjs","sources":["../../../src/components/Charts/loader.tsx"],"sourcesContent":["import React, {\n useCallback,\n useMemo,\n useRef,\n useEffect,\n useState,\n} from 'react';\nimport { groupBy } from 'es-toolkit/compat';\nimport { Empty } from 'antd';\nimport './loader.scss';\nimport { useTheme } from 'src/utils/manifest';\nimport { findLoaderTotalTiming } from 'src/utils/loader';\nimport { beautifyPath } from 'src/utils/file';\nimport { TimelineCom } from './TimelineCharts';\nimport { ChartProps, DurationMetric } from './types';\nimport {\n renderTotalLoadersTooltip,\n getTooltipHtmlForLoader,\n useDebounceHook,\n} from './utils';\nimport { ChartTypes } from './constants';\nlet startTimestamp = 0;\nlet endTimestamp = 0;\n\nexport const LoaderExecutionsChart: React.FC<ChartProps> = ({\n loaders,\n cwd,\n}) => {\n const { isDark } = useTheme();\n const ref = useRef(null);\n const [data, setData] = useState([] as DurationMetric[]);\n const durationMetricData = useDebounceHook(data, 200);\n // const [endTimestamp, setEndTimestamp] = useState(0);\n\n const groupByLoader = useMemo(\n () => groupBy(loaders, (e) => e.loader),\n [loaders],\n );\n\n const formatterForLoader = useCallback((raw: any) => {\n const { name, data } = raw;\n const loaderName = name.replace(' total', '');\n if (data?.ext) {\n return getTooltipHtmlForLoader(data.ext as (typeof loaders)[0]);\n }\n\n return renderTotalLoadersTooltip(loaderName, loaders, cwd);\n }, []);\n\n useEffect(() => {\n const _data = Object.keys(groupByLoader).map<DurationMetric>(\n (loaderName) => {\n const list = groupByLoader[loaderName] || [];\n const { start, end } = findLoaderTotalTiming(list);\n\n if (start < startTimestamp || startTimestamp === 0) {\n startTimestamp = start;\n }\n\n if (end > endTimestamp || endTimestamp === 0) {\n endTimestamp = end;\n }\n\n return {\n p: loaderName,\n n: loaderName,\n s: start,\n e: end,\n c: list.map((e) => {\n return {\n p: loaderName,\n // n: loaderName,\n n: beautifyPath(e.resource, cwd),\n s: e.startAt,\n e: e.endAt,\n ext: e,\n };\n }),\n };\n },\n );\n setData(_data);\n }, [groupByLoader]);\n\n return (\n <>\n {data?.length ? (\n <div\n className={[\n 'loader-chart-container',\n isDark ? 'loader-chart-container_dark' : '',\n ]\n .join(' ')\n .trim()}\n ref={ref}\n style={{ width: '100%' }}\n >\n <TimelineCom\n loaderData={durationMetricData}\n formatterFn={formatterForLoader}\n chartType={ChartTypes.Loader}\n exts={{ startTimestamp, endTimestamp }}\n />\n </div>\n ) : (\n <Empty />\n )}\n </>\n );\n};\n"],"names":["startTimestamp","endTimestamp","LoaderExecutionsChart","loaders","cwd","isDark","useTheme","ref","useRef","data","setData","useState","durationMetricData","useDebounceHook","groupByLoader","useMemo","groupBy","e","formatterForLoader","useCallback","raw","name","loaderName","getTooltipHtmlForLoader","renderTotalLoadersTooltip","useEffect","_data","Object","list","start","end","findLoaderTotalTiming","beautifyPath","TimelineCom","ChartTypes","Empty"],"mappings":";;;;;;;;;;;AAqBA,IAAIA,iBAAiB;AACrB,IAAIC,eAAe;AAEZ,MAAMC,wBAA8C,CAAC,EAC1DC,OAAO,EACPC,GAAG,EACJ;IACC,MAAM,EAAEC,MAAM,EAAE,GAAGC;IACnB,MAAMC,MAAMC,OAAO;IACnB,MAAM,CAACC,MAAMC,QAAQ,GAAGC,SAAS,EAAE;IACnC,MAAMC,qBAAqBC,gBAAgBJ,MAAM;IAGjD,MAAMK,gBAAgBC,QACpB,IAAMC,QAAQb,SAAS,CAACc,IAAMA,EAAE,MAAM,GACtC;QAACd;KAAQ;IAGX,MAAMe,qBAAqBC,YAAY,CAACC;QACtC,MAAM,EAAEC,IAAI,EAAEZ,IAAI,EAAE,GAAGW;QACvB,MAAME,aAAaD,KAAK,OAAO,CAAC,UAAU;QAC1C,IAAIZ,MAAM,KACR,OAAOc,wBAAwBd,KAAK,GAAG;QAGzC,OAAOe,0BAA0BF,YAAYnB,SAASC;IACxD,GAAG,EAAE;IAELqB,UAAU;QACR,MAAMC,QAAQC,OAAO,IAAI,CAACb,eAAe,GAAG,CAC1C,CAACQ;YACC,MAAMM,OAAOd,aAAa,CAACQ,WAAW,IAAI,EAAE;YAC5C,MAAM,EAAEO,KAAK,EAAEC,GAAG,EAAE,GAAGC,sBAAsBH;YAE7C,IAAIC,QAAQ7B,kBAAkBA,AAAmB,MAAnBA,gBAC5BA,iBAAiB6B;YAGnB,IAAIC,MAAM7B,gBAAgBA,AAAiB,MAAjBA,cACxBA,eAAe6B;YAGjB,OAAO;gBACL,GAAGR;gBACH,GAAGA;gBACH,GAAGO;gBACH,GAAGC;gBACH,GAAGF,KAAK,GAAG,CAAC,CAACX,IACJ;wBACL,GAAGK;wBAEH,GAAGU,aAAaf,EAAE,QAAQ,EAAEb;wBAC5B,GAAGa,EAAE,OAAO;wBACZ,GAAGA,EAAE,KAAK;wBACV,KAAKA;oBACP;YAEJ;QACF;QAEFP,QAAQgB;IACV,GAAG;QAACZ;KAAc;IAElB,OAAO,WAAP,GACE;kBACGL,MAAM,SAAS,WAAT,GACL,IAAC;YACC,WAAW;gBACT;gBACAJ,SAAS,gCAAgC;aAC1C,CACE,IAAI,CAAC,KACL,IAAI;YACP,KAAKE;YACL,OAAO;gBAAE,OAAO;YAAO;sBAEvB,kBAAC0B,aAAWA;gBACV,YAAYrB;gBACZ,aAAaM;gBACb,WAAWgB,WAAW,MAAM;gBAC5B,MAAM;oBAAElC,gBAAAA;oBAAgBC,cAAAA;gBAAa;;2BAIzC,IAACkC,OAAKA,CAAAA;;AAId"}
1
+ {"version":3,"file":"components/Charts/loader.mjs","sources":["../../../src/components/Charts/loader.tsx"],"sourcesContent":["import React, {\n useCallback,\n useMemo,\n useRef,\n useEffect,\n useState,\n} from 'react';\nimport { groupBy } from 'es-toolkit/compat';\nimport { Empty } from 'antd';\nimport './loader.scss';\nimport './tooltips.scss';\nimport { useTheme } from 'src/utils/manifest';\nimport { findLoaderTotalTiming } from 'src/utils/loader';\nimport { beautifyPath } from 'src/utils/file';\nimport { TimelineCom } from './TimelineCharts';\nimport { ChartProps, DurationMetric } from './types';\nimport {\n renderTotalLoadersTooltip,\n getTooltipHtmlForLoader,\n useDebounceHook,\n} from './utils';\nimport { ChartTypes } from './constants';\nlet startTimestamp = 0;\nlet endTimestamp = 0;\n\nexport const LoaderExecutionsChart: React.FC<ChartProps> = ({\n loaders,\n cwd,\n}) => {\n const { isDark } = useTheme();\n const ref = useRef(null);\n const [data, setData] = useState([] as DurationMetric[]);\n const durationMetricData = useDebounceHook(data, 200);\n // const [endTimestamp, setEndTimestamp] = useState(0);\n\n const groupByLoader = useMemo(\n () => groupBy(loaders, (e) => e.loader),\n [loaders],\n );\n\n const formatterForLoader = useCallback((raw: any) => {\n const { name, data } = raw;\n const loaderName = name.replace(' total', '');\n if (data?.ext) {\n return getTooltipHtmlForLoader(data.ext as (typeof loaders)[0]);\n }\n\n return renderTotalLoadersTooltip(loaderName, loaders, cwd);\n }, []);\n\n useEffect(() => {\n const _data = Object.keys(groupByLoader).map<DurationMetric>(\n (loaderName) => {\n const list = groupByLoader[loaderName] || [];\n const { start, end } = findLoaderTotalTiming(list);\n\n if (start < startTimestamp || startTimestamp === 0) {\n startTimestamp = start;\n }\n\n if (end > endTimestamp || endTimestamp === 0) {\n endTimestamp = end;\n }\n\n return {\n p: loaderName,\n n: loaderName,\n s: start,\n e: end,\n c: list.map((e) => {\n return {\n p: loaderName,\n // n: loaderName,\n n: beautifyPath(e.resource, cwd),\n s: e.startAt,\n e: e.endAt,\n ext: e,\n };\n }),\n };\n },\n );\n setData(_data);\n }, [groupByLoader]);\n\n return (\n <>\n {data?.length ? (\n <div\n className={[\n 'loader-chart-container',\n isDark ? 'loader-chart-container_dark' : '',\n ]\n .join(' ')\n .trim()}\n ref={ref}\n style={{ width: '100%' }}\n >\n <TimelineCom\n loaderData={durationMetricData}\n formatterFn={formatterForLoader}\n chartType={ChartTypes.Loader}\n exts={{ startTimestamp, endTimestamp }}\n />\n </div>\n ) : (\n <Empty />\n )}\n </>\n );\n};\n"],"names":["startTimestamp","endTimestamp","LoaderExecutionsChart","loaders","cwd","isDark","useTheme","ref","useRef","data","setData","useState","durationMetricData","useDebounceHook","groupByLoader","useMemo","groupBy","e","formatterForLoader","useCallback","raw","name","loaderName","getTooltipHtmlForLoader","renderTotalLoadersTooltip","useEffect","_data","Object","list","start","end","findLoaderTotalTiming","beautifyPath","TimelineCom","ChartTypes","Empty"],"mappings":";;;;;;;;;;;;AAsBA,IAAIA,iBAAiB;AACrB,IAAIC,eAAe;AAEZ,MAAMC,wBAA8C,CAAC,EAC1DC,OAAO,EACPC,GAAG,EACJ;IACC,MAAM,EAAEC,MAAM,EAAE,GAAGC;IACnB,MAAMC,MAAMC,OAAO;IACnB,MAAM,CAACC,MAAMC,QAAQ,GAAGC,SAAS,EAAE;IACnC,MAAMC,qBAAqBC,gBAAgBJ,MAAM;IAGjD,MAAMK,gBAAgBC,QACpB,IAAMC,QAAQb,SAAS,CAACc,IAAMA,EAAE,MAAM,GACtC;QAACd;KAAQ;IAGX,MAAMe,qBAAqBC,YAAY,CAACC;QACtC,MAAM,EAAEC,IAAI,EAAEZ,IAAI,EAAE,GAAGW;QACvB,MAAME,aAAaD,KAAK,OAAO,CAAC,UAAU;QAC1C,IAAIZ,MAAM,KACR,OAAOc,wBAAwBd,KAAK,GAAG;QAGzC,OAAOe,0BAA0BF,YAAYnB,SAASC;IACxD,GAAG,EAAE;IAELqB,UAAU;QACR,MAAMC,QAAQC,OAAO,IAAI,CAACb,eAAe,GAAG,CAC1C,CAACQ;YACC,MAAMM,OAAOd,aAAa,CAACQ,WAAW,IAAI,EAAE;YAC5C,MAAM,EAAEO,KAAK,EAAEC,GAAG,EAAE,GAAGC,sBAAsBH;YAE7C,IAAIC,QAAQ7B,kBAAkBA,AAAmB,MAAnBA,gBAC5BA,iBAAiB6B;YAGnB,IAAIC,MAAM7B,gBAAgBA,AAAiB,MAAjBA,cACxBA,eAAe6B;YAGjB,OAAO;gBACL,GAAGR;gBACH,GAAGA;gBACH,GAAGO;gBACH,GAAGC;gBACH,GAAGF,KAAK,GAAG,CAAC,CAACX,IACJ;wBACL,GAAGK;wBAEH,GAAGU,aAAaf,EAAE,QAAQ,EAAEb;wBAC5B,GAAGa,EAAE,OAAO;wBACZ,GAAGA,EAAE,KAAK;wBACV,KAAKA;oBACP;YAEJ;QACF;QAEFP,QAAQgB;IACV,GAAG;QAACZ;KAAc;IAElB,OAAO,WAAP,GACE;kBACGL,MAAM,SAAS,WAAT,GACL,IAAC;YACC,WAAW;gBACT;gBACAJ,SAAS,gCAAgC;aAC1C,CACE,IAAI,CAAC,KACL,IAAI;YACP,KAAKE;YACL,OAAO;gBAAE,OAAO;YAAO;sBAEvB,kBAAC0B,aAAWA;gBACV,YAAYrB;gBACZ,aAAaM;gBACb,WAAWgB,WAAW,MAAM;gBAC5B,MAAM;oBAAElC,gBAAAA;oBAAgBC,cAAAA;gBAAa;;2BAIzC,IAACkC,OAAKA,CAAAA;;AAId"}
@@ -1,5 +1,4 @@
1
1
  import { SDK } from '@rsdoctor/types';
2
- import './tooltips.scss';
3
2
  import { DurationMetric, ITraceEventData } from './types.js';
4
3
  export declare function getTooltipHtmlForLoader(loader: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderChartData>[0]): string;
5
4
  export declare function renderTotalLoadersTooltip(loaderName: string, loaders: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderChartData>, cwd: string): string;
@@ -1,21 +1,21 @@
1
1
  import { Loader } from "@rsdoctor/utils/common";
2
2
  import dayjs from "dayjs";
3
3
  import { maxBy, minBy } from "es-toolkit/compat";
4
- import { formatCosts } from "../../utils/index.mjs";
5
- import "./tooltips.css";
4
+ import { formatCosts } from "../../utils/time.mjs";
6
5
  import { ETraceEventPhase } from "./types.mjs";
6
+ import { escapeHtml } from "./escapeHtml.mjs";
7
7
  import { useEffect, useState } from "react";
8
8
  function getTooltipHtmlForLoader(loader) {
9
9
  return `
10
10
  <div class="loader-tooltip-container">
11
- <div class="loader-tooltip-title">${loader.loader}</div>
11
+ <div class="loader-tooltip-title">${escapeHtml(loader.loader)}</div>
12
12
  <li class="loader-tooltip-item">
13
13
  <span>isPitch</span>
14
14
  <span>${loader.isPitch}</span>
15
15
  </li>
16
16
  ${loader.layer && 'undefined' !== loader.layer ? `<li class="loader-tooltip-item">
17
17
  <span>layer</span>
18
- <span>${loader.layer}</span>
18
+ <span>${escapeHtml(loader.layer)}</span>
19
19
  </li>` : ""}
20
20
  <li class="loader-tooltip-item">
21
21
  <span>duration</span>
@@ -23,7 +23,7 @@ function getTooltipHtmlForLoader(loader) {
23
23
  </li>
24
24
  <li class="loader-tooltip-item">
25
25
  <span>filepath</span>
26
- <span>${loader.resource}</span>
26
+ <span>${escapeHtml(loader.resource)}</span>
27
27
  </li>
28
28
  <li class="loader-tooltip-item">
29
29
  <span>start</span>
@@ -47,7 +47,7 @@ function renderTotalLoadersTooltip(loaderName, loaders, cwd) {
47
47
  const duration = Loader.getLoadersCosts(filter, loaders);
48
48
  return `
49
49
  <div class="loader-tooltip-container">
50
- <div class="loader-tooltip-title">${loaderName}</div>
50
+ <div class="loader-tooltip-title">${escapeHtml(loaderName)}</div>
51
51
  <li class="loader-tooltip-item">
52
52
  <span>files</span>
53
53
  <span class="loader-tooltip-text-bold">${resources.length}</span>
@@ -150,14 +150,14 @@ function formatterForPlugins(raw) {
150
150
  const { ext } = raw.data;
151
151
  return `
152
152
  <div class="loader-tooltip-container">
153
- <div class="loader-tooltip-title">[${ext.args.p}] ${ext.args.n}</div>
153
+ <div class="loader-tooltip-title">[${escapeHtml(ext.args.p)}] ${escapeHtml(ext.args.n)}</div>
154
154
  <li class="loader-tooltip-item">
155
155
  <span>hook</span>
156
- <span>${ext.args.p}</span>
156
+ <span>${escapeHtml(ext.args.p)}</span>
157
157
  </li>
158
158
  <li class="loader-tooltip-item">
159
159
  <span>tap name</span>
160
- <span>${ext.args.n}</span>
160
+ <span>${escapeHtml(ext.args.n)}</span>
161
161
  </li>
162
162
  <li class="loader-tooltip-item">
163
163
  <span>start</span>
@@ -1 +1 @@
1
- {"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';\n\nimport './tooltips.scss';\nimport { DurationMetric, ETraceEventPhase, ITraceEventData } from './types';\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\">${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>${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>${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\">${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\">[${ext.args.p}] ${ext.args.n}</div>\n <li class=\"loader-tooltip-item\">\n <span>hook</span>\n <span>${ext.args.p}</span>\n </li>\n <li class=\"loader-tooltip-item\">\n <span>tap name</span>\n <span>${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","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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"}
1
+ {"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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"}
@@ -2,7 +2,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import { Divider, Select, Space, Typography } from "antd";
3
3
  import { useEffect, useState } from "react";
4
4
  import total_size from "../../common/svg/total-size.mjs";
5
- import { changeOrigin, fetchManifest } from "../../utils/index.mjs";
5
+ import { changeOrigin, fetchManifest, getSafeReportUrl, getSharingUrl } from "../../utils/index.mjs";
6
6
  import icons from "@ant-design/icons";
7
7
  const BuilderSelect = ()=>{
8
8
  const [buildName, setBuildName] = useState('');
@@ -42,8 +42,15 @@ const BuilderSelect = ()=>{
42
42
  },
43
43
  onChange: (val)=>{
44
44
  const item = series.find((item)=>item.name === val);
45
- if (item) if (item.origin) location.href = changeOrigin(item.origin);
46
- else console.error('No RsdoctorManifestSeriesData.origin');
45
+ if (item) if (item.origin) {
46
+ const href = changeOrigin(item.origin);
47
+ if (href) location.href = href;
48
+ else console.error('Invalid Rsdoctor compiler report origin');
49
+ } else if (item.path) {
50
+ const href = getSafeReportUrl(item.path.endsWith('.html') ? item.path : getSharingUrl(item.path), location.href);
51
+ if (href) location.href = href;
52
+ else console.error('Invalid Rsdoctor compiler report location');
53
+ } else console.error('No Rsdoctor compiler report location');
47
54
  },
48
55
  children: series.map((item, i)=>/*#__PURE__*/ jsx(Select.Option, {
49
56
  value: item.name,
@@ -1 +1 @@
1
- {"version":3,"file":"components/Layout/builder-select.mjs","sources":["../../../src/components/Layout/builder-select.tsx"],"sourcesContent":["import { Select, Divider, Typography, Space } from 'antd';\nimport React, { useState, useEffect } from 'react';\nimport { Manifest } from '@rsdoctor/types';\nimport TotalSizeSvg from '../../common/svg/total-size.svg';\nimport { fetchManifest, changeOrigin } from '../../utils';\nimport Icon from '@ant-design/icons';\n\nexport const BuilderSelect: React.FC = () => {\n const [buildName, setBuildName] = useState('');\n const [series, setSeries] = useState<Manifest.RsdoctorManifestSeriesData[]>(\n [],\n );\n\n useEffect(() => {\n fetchManifest().then(({ name, series }) => {\n if (name) {\n setBuildName(name);\n }\n\n if (series && series.length > 0) {\n setSeries(series);\n }\n });\n }, []);\n\n if (buildName.length <= 0 || series.length <= 0) {\n return <></>;\n }\n\n return (\n <>\n <Divider type=\"vertical\" style={{ margin: '0 24px' }} />\n <Space>\n <Icon style={{ fontSize: '18px' }} component={TotalSizeSvg} />\n <Typography>Compiler</Typography>\n <Select\n className=\"builder-selector\"\n defaultValue={buildName}\n bordered={false}\n style={{ minWidth: 100 }}\n onChange={(val) => {\n const item = series.find((item) => item.name === val);\n\n if (item) {\n if (item.origin) {\n location.href = changeOrigin(item.origin);\n } else {\n console.error('No RsdoctorManifestSeriesData.origin');\n }\n }\n }}\n >\n {series.map((item, i) => (\n <Select.Option\n key={i}\n value={item.name}\n className=\"builder-selector-option-item\"\n >\n {item.name}\n </Select.Option>\n ))}\n </Select>\n </Space>\n </>\n );\n};\n"],"names":["BuilderSelect","buildName","setBuildName","useState","series","setSeries","useEffect","fetchManifest","name","Divider","Space","Icon","TotalSizeSvg","Typography","Select","val","item","location","changeOrigin","console","i"],"mappings":";;;;;;AAOO,MAAMA,gBAA0B;IACrC,MAAM,CAACC,WAAWC,aAAa,GAAGC,SAAS;IAC3C,MAAM,CAACC,QAAQC,UAAU,GAAGF,SAC1B,EAAE;IAGJG,UAAU;QACRC,gBAAgB,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAEJ,MAAM,EAAE;YACpC,IAAII,MACFN,aAAaM;YAGf,IAAIJ,UAAUA,OAAO,MAAM,GAAG,GAC5BC,UAAUD;QAEd;IACF,GAAG,EAAE;IAEL,IAAIH,UAAU,MAAM,IAAI,KAAKG,OAAO,MAAM,IAAI,GAC5C,OAAO,WAAP,GAAO;IAGT,OAAO,WAAP,GACE;;0BACE,IAACK,SAAOA;gBAAC,MAAK;gBAAW,OAAO;oBAAE,QAAQ;gBAAS;;0BACnD,KAACC,OAAKA;;kCACJ,IAACC,OAAIA;wBAAC,OAAO;4BAAE,UAAU;wBAAO;wBAAG,WAAWC;;kCAC9C,IAACC,YAAUA;kCAAC;;kCACZ,IAACC,QAAMA;wBACL,WAAU;wBACV,cAAcb;wBACd,UAAU;wBACV,OAAO;4BAAE,UAAU;wBAAI;wBACvB,UAAU,CAACc;4BACT,MAAMC,OAAOZ,OAAO,IAAI,CAAC,CAACY,OAASA,KAAK,IAAI,KAAKD;4BAEjD,IAAIC,MACF,IAAIA,KAAK,MAAM,EACbC,SAAS,IAAI,GAAGC,aAAaF,KAAK,MAAM;iCAExCG,QAAQ,KAAK,CAAC;wBAGpB;kCAECf,OAAO,GAAG,CAAC,CAACY,MAAMI,IAAAA,WAAAA,GACjB,IAACN,OAAO,MAAM;gCAEZ,OAAOE,KAAK,IAAI;gCAChB,WAAU;0CAETA,KAAK,IAAI;+BAJLI;;;;;;AAWnB"}
1
+ {"version":3,"file":"components/Layout/builder-select.mjs","sources":["../../../src/components/Layout/builder-select.tsx"],"sourcesContent":["import { Select, Divider, Typography, Space } from 'antd';\nimport React, { useState, useEffect } from 'react';\nimport { Manifest } from '@rsdoctor/types';\nimport TotalSizeSvg from '../../common/svg/total-size.svg';\nimport {\n fetchManifest,\n changeOrigin,\n getSafeReportUrl,\n getSharingUrl,\n} from '../../utils';\nimport Icon from '@ant-design/icons';\n\nexport const BuilderSelect: React.FC = () => {\n const [buildName, setBuildName] = useState('');\n const [series, setSeries] = useState<Manifest.RsdoctorManifestSeriesData[]>(\n [],\n );\n\n useEffect(() => {\n fetchManifest().then(({ name, series }) => {\n if (name) {\n setBuildName(name);\n }\n\n if (series && series.length > 0) {\n setSeries(series);\n }\n });\n }, []);\n\n if (buildName.length <= 0 || series.length <= 0) {\n return <></>;\n }\n\n return (\n <>\n <Divider type=\"vertical\" style={{ margin: '0 24px' }} />\n <Space>\n <Icon style={{ fontSize: '18px' }} component={TotalSizeSvg} />\n <Typography>Compiler</Typography>\n <Select\n className=\"builder-selector\"\n defaultValue={buildName}\n bordered={false}\n style={{ minWidth: 100 }}\n onChange={(val) => {\n const item = series.find((item) => item.name === val);\n\n if (item) {\n if (item.origin) {\n const href = changeOrigin(item.origin);\n if (href) {\n location.href = href;\n } else {\n console.error('Invalid Rsdoctor compiler report origin');\n }\n } else if (item.path) {\n const href = getSafeReportUrl(\n item.path.endsWith('.html')\n ? item.path\n : getSharingUrl(item.path),\n location.href,\n );\n\n if (href) {\n location.href = href;\n } else {\n console.error('Invalid Rsdoctor compiler report location');\n }\n } else {\n console.error('No Rsdoctor compiler report location');\n }\n }\n }}\n >\n {series.map((item, i) => (\n <Select.Option\n key={i}\n value={item.name}\n className=\"builder-selector-option-item\"\n >\n {item.name}\n </Select.Option>\n ))}\n </Select>\n </Space>\n </>\n );\n};\n"],"names":["BuilderSelect","buildName","setBuildName","useState","series","setSeries","useEffect","fetchManifest","name","Divider","Space","Icon","TotalSizeSvg","Typography","Select","val","item","href","changeOrigin","location","console","getSafeReportUrl","getSharingUrl","i"],"mappings":";;;;;;AAYO,MAAMA,gBAA0B;IACrC,MAAM,CAACC,WAAWC,aAAa,GAAGC,SAAS;IAC3C,MAAM,CAACC,QAAQC,UAAU,GAAGF,SAC1B,EAAE;IAGJG,UAAU;QACRC,gBAAgB,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAEJ,MAAM,EAAE;YACpC,IAAII,MACFN,aAAaM;YAGf,IAAIJ,UAAUA,OAAO,MAAM,GAAG,GAC5BC,UAAUD;QAEd;IACF,GAAG,EAAE;IAEL,IAAIH,UAAU,MAAM,IAAI,KAAKG,OAAO,MAAM,IAAI,GAC5C,OAAO,WAAP,GAAO;IAGT,OAAO,WAAP,GACE;;0BACE,IAACK,SAAOA;gBAAC,MAAK;gBAAW,OAAO;oBAAE,QAAQ;gBAAS;;0BACnD,KAACC,OAAKA;;kCACJ,IAACC,OAAIA;wBAAC,OAAO;4BAAE,UAAU;wBAAO;wBAAG,WAAWC;;kCAC9C,IAACC,YAAUA;kCAAC;;kCACZ,IAACC,QAAMA;wBACL,WAAU;wBACV,cAAcb;wBACd,UAAU;wBACV,OAAO;4BAAE,UAAU;wBAAI;wBACvB,UAAU,CAACc;4BACT,MAAMC,OAAOZ,OAAO,IAAI,CAAC,CAACY,OAASA,KAAK,IAAI,KAAKD;4BAEjD,IAAIC,MACF,IAAIA,KAAK,MAAM,EAAE;gCACf,MAAMC,OAAOC,aAAaF,KAAK,MAAM;gCACrC,IAAIC,MACFE,SAAS,IAAI,GAAGF;qCAEhBG,QAAQ,KAAK,CAAC;4BAElB,OAAO,IAAIJ,KAAK,IAAI,EAAE;gCACpB,MAAMC,OAAOI,iBACXL,KAAK,IAAI,CAAC,QAAQ,CAAC,WACfA,KAAK,IAAI,GACTM,cAAcN,KAAK,IAAI,GAC3BG,SAAS,IAAI;gCAGf,IAAIF,MACFE,SAAS,IAAI,GAAGF;qCAEhBG,QAAQ,KAAK,CAAC;4BAElB,OACEA,QAAQ,KAAK,CAAC;wBAGpB;kCAEChB,OAAO,GAAG,CAAC,CAACY,MAAMO,IAAAA,WAAAA,GACjB,IAACT,OAAO,MAAM;gCAEZ,OAAOE,KAAK,IAAI;gCAChB,WAAU;0CAETA,KAAK,IAAI;+BAJLO;;;;;;AAWnB"}
@@ -0,0 +1,4 @@
1
+ export declare function getModuleDiffKey(module: {
2
+ webpackId?: string;
3
+ path?: string;
4
+ }): string;
@@ -0,0 +1,9 @@
1
+ const moduleHashPattern = /[a-fA-F0-9]{20,}/;
2
+ const moduleHashSuffixPattern = /\|[a-fA-F0-9]{16,}$/;
3
+ function getModuleDiffKey(module) {
4
+ const normalize = (value)=>value?.replace(moduleHashSuffixPattern, '').replace(moduleHashPattern, '') || '';
5
+ return normalize(module.webpackId) || normalize(module.path);
6
+ }
7
+ export { getModuleDiffKey };
8
+
9
+ //# sourceMappingURL=moduleDiff.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages/Resources/BundleDiff/DiffContainer/moduleDiff.mjs","sources":["../../../../../src/pages/Resources/BundleDiff/DiffContainer/moduleDiff.ts"],"sourcesContent":["const moduleHashPattern = /[a-fA-F0-9]{20,}/;\nconst moduleHashSuffixPattern = /\\|[a-fA-F0-9]{16,}$/;\n\nexport function getModuleDiffKey(module: {\n webpackId?: string;\n path?: string;\n}): string {\n const normalize = (value: string | undefined) =>\n value\n ?.replace(moduleHashSuffixPattern, '')\n .replace(moduleHashPattern, '') || '';\n\n return normalize(module.webpackId) || normalize(module.path);\n}\n"],"names":["moduleHashPattern","moduleHashSuffixPattern","getModuleDiffKey","module","normalize","value"],"mappings":"AAAA,MAAMA,oBAAoB;AAC1B,MAAMC,0BAA0B;AAEzB,SAASC,iBAAiBC,MAGhC;IACC,MAAMC,YAAY,CAACC,QACjBA,OACI,QAAQJ,yBAAyB,IAClC,QAAQD,mBAAmB,OAAO;IAEvC,OAAOI,UAAUD,OAAO,SAAS,KAAKC,UAAUD,OAAO,IAAI;AAC7D"}
@@ -9,8 +9,9 @@ import { KeywordInput } from "../../../../components/Form/keyword.mjs";
9
9
  import { ViewChanges } from "./changes.mjs";
10
10
  import { UpdateType } from "./constants.mjs";
11
11
  import { Badge } from "../../../../components/Badge/index.mjs";
12
- import { ModuleHashPattern, getTargetColumnPropsForModuleRow } from "./row.mjs";
12
+ import { getTargetColumnPropsForModuleRow } from "./row.mjs";
13
13
  import { Graph } from "@rsdoctor/utils/common";
14
+ import { getModuleDiffKey } from "./moduleDiff.mjs";
14
15
  function getUpdateType(e) {
15
16
  if (e.baseline && !e.current) return UpdateType.Deleted;
16
17
  if (!e.baseline && e.current) return UpdateType.New;
@@ -67,7 +68,7 @@ const Modules = ({ baseline, current })=>{
67
68
  const dataSource = useMemo(()=>{
68
69
  const res = {};
69
70
  bModules.forEach((mod)=>{
70
- const modPath = mod.webpackId?.replace(ModuleHashPattern, '') || mod.path?.replace(ModuleHashPattern, '');
71
+ const modPath = getModuleDiffKey(mod);
71
72
  if (res[modPath]) console.warn('[Baseline Module Exists]: ', mod, res);
72
73
  else res[modPath] = {
73
74
  path: modPath,
@@ -75,7 +76,7 @@ const Modules = ({ baseline, current })=>{
75
76
  };
76
77
  });
77
78
  cModules.forEach((mod)=>{
78
- const modPath = mod.webpackId?.replace(ModuleHashPattern, '') || mod.path?.replace(ModuleHashPattern, '');
79
+ const modPath = getModuleDiffKey(mod);
79
80
  if (!res[modPath]) res[modPath] = {
80
81
  path: modPath
81
82
  };
@@ -1 +1 @@
1
- {"version":3,"file":"pages/Resources/BundleDiff/DiffContainer/modules.mjs","sources":["../../../../../src/pages/Resources/BundleDiff/DiffContainer/modules.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport {\n Col,\n Divider,\n Row,\n Select,\n Space,\n Table,\n Tag,\n Tooltip,\n Typography,\n} from 'antd';\nimport { uniq } from 'es-toolkit/compat';\nimport { InfoCircleOutlined, FileSearchOutlined } from '@ant-design/icons';\nimport {\n BundleDiffComponentCardProps,\n BundleDiffTableModulesData,\n} from './types';\nimport { beautifyModulePath, useUniqModules } from '../../../../utils';\nimport { Size } from '../../../../constants';\nimport { KeywordInput } from '../../../../components/Form/keyword';\nimport { ViewChanges } from './changes';\nimport { UpdateType } from './constants';\nimport { Badge as Bdg } from '../../../../components/Badge';\nimport { ModuleHashPattern, getTargetColumnPropsForModuleRow } from './row';\nimport { Graph } from '@rsdoctor/utils/common';\n\nexport function getUpdateType(e: BundleDiffTableModulesData): UpdateType {\n if (e.baseline && !e.current) {\n // deleted\n return UpdateType.Deleted;\n }\n\n if (!e.baseline && e.current) {\n // new\n return UpdateType.New;\n }\n\n if (e.baseline && e.current) {\n if (\n e.baseline.size.sourceSize === e.current.size.sourceSize &&\n e.baseline.size.parsedSize === e.current.size.parsedSize\n ) {\n // not changed\n return UpdateType.NotChanged;\n }\n // update\n return UpdateType.Changed;\n }\n\n throw new Error('Update Type not match');\n}\n\nexport const FileUpdateTypeTag: React.FC<{ type: UpdateType }> = ({ type }) => {\n if (type === UpdateType.NotChanged) {\n return (\n <Tooltip title=\"It hasn't changed between Baseline and Current\">\n <Tag color=\"success\">Not Changed</Tag>\n </Tooltip>\n );\n }\n if (type === UpdateType.Changed) {\n return (\n <Tooltip title=\"It has been changed between Baseline and Current\">\n <Tag color=\"warning\">Changed</Tag>\n </Tooltip>\n );\n }\n if (type === UpdateType.New) {\n return (\n <Tooltip title=\"It is created in Current\">\n <Tag color=\"error\">New</Tag>\n </Tooltip>\n );\n }\n if (type === UpdateType.Deleted) {\n return (\n <Tooltip title=\"It has been deleted in Current\">\n <Tag color=\"error\">Deleted</Tag>\n </Tooltip>\n );\n }\n return null;\n};\n\nexport const Modules: React.FC<BundleDiffComponentCardProps> = ({\n baseline,\n current,\n}) => {\n const bModules = useMemo(\n () => useUniqModules(baseline.moduleGraph.modules),\n [baseline],\n );\n const cModules = useMemo(\n () => useUniqModules(current.moduleGraph.modules),\n [current],\n );\n\n const bChunks = baseline.chunkGraph.chunks;\n const cChunks = current.chunkGraph.chunks;\n\n const bRoot = baseline.root;\n const cRoot = current.root;\n\n const [keyword, setKeyword] = useState<string>();\n const [selectedUpdateTypes, setSelectedUpdateTypes] = useState<UpdateType[]>(\n [],\n );\n\n const dataSource = useMemo(() => {\n const res: Record<string, BundleDiffTableModulesData> = {};\n\n bModules.forEach((mod) => {\n const modPath =\n mod.webpackId?.replace(ModuleHashPattern, '') ||\n mod.path?.replace(ModuleHashPattern, '');\n\n if (!res[modPath]) {\n res[modPath] = {\n path: modPath,\n baseline: mod,\n };\n } else {\n console.warn('[Baseline Module Exists]: ', mod, res);\n }\n });\n\n cModules.forEach((mod) => {\n const modPath =\n mod.webpackId?.replace(ModuleHashPattern, '') ||\n mod.path?.replace(ModuleHashPattern, '');\n\n if (!res[modPath]) {\n res[modPath] = {\n path: modPath,\n };\n }\n res[modPath].current = mod;\n });\n\n return Object.values(res);\n }, [bModules, cModules]);\n\n const filteredDataSource = useMemo(() => {\n let list = dataSource.slice();\n\n if (keyword) {\n list = list.filter((e) => e.path.indexOf(keyword) > -1);\n }\n\n if (selectedUpdateTypes.length) {\n list = list.filter((e) => {\n return selectedUpdateTypes.includes(getUpdateType(e));\n });\n }\n\n return list;\n }, [dataSource, keyword, selectedUpdateTypes]);\n\n const { bFilteredModulesLength, cFilteredModulesLength } = useMemo(() => {\n return {\n bFilteredModulesLength: filteredDataSource.filter((e) => e.baseline)\n .length,\n cFilteredModulesLength: filteredDataSource.filter((e) => e.current)\n .length,\n };\n }, [filteredDataSource]);\n\n return (\n <Row gutter={[Size.BasePadding, Size.BasePadding]}>\n <Col span={24}>\n <Space wrap>\n <KeywordInput\n icon={<FileSearchOutlined />}\n label=\"\"\n labelStyle={{ width: 45 }}\n placeholder=\"Search by name\"\n onChange={(e) => {\n setKeyword(e);\n }}\n />\n <Select\n mode=\"multiple\"\n placeholder=\"Filter by changed type\"\n style={{ width: 200 }}\n options={Object.values(UpdateType).map((e) => ({\n label: e,\n value: e,\n }))}\n allowClear\n onChange={(e) => {\n setSelectedUpdateTypes(e);\n }}\n />\n </Space>\n </Col>\n <Col span={24}>\n <Table\n bordered\n sticky={{ offsetHeader: 54 }}\n pagination={{\n pageSize: 20,\n size: 'small',\n }}\n scroll={{ x: 1700 }}\n dataSource={filteredDataSource}\n rowKey={(e) => e.path}\n columns={[\n {\n fixed: 'left',\n title: (\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n filtered modules is {filteredDataSource.length} (Current\n & Baseline)\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n total modules is {dataSource.length} (Current &\n Baseline)\n </Typography.Text>\n </Space>\n }\n >\n <Typography.Text strong>Modules</Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 10, fontWeight: 400, marginRight: 4 }}\n >\n {filteredDataSource.length}/{dataSource.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Tooltip>\n ),\n render: (_v, r) => {\n const { alias, inNodeModules } = beautifyModulePath(\n r.path,\n r.baseline ? bRoot : cRoot,\n );\n return (\n <Space>\n <Tooltip title={r.path}>\n <Typography.Text copyable={{ text: r.path }}>\n {alias}\n </Typography.Text>\n </Tooltip>\n <FileUpdateTypeTag type={getUpdateType(r)} />\n {inNodeModules ? (\n <Tag color=\"warning\">node_modules</Tag>\n ) : null}\n </Space>\n );\n },\n },\n getTargetColumnPropsForModuleRow(\n 'current',\n bFilteredModulesLength,\n cFilteredModulesLength,\n ),\n getTargetColumnPropsForModuleRow(\n 'baseline',\n bFilteredModulesLength,\n cFilteredModulesLength,\n ),\n {\n title: 'in Assets',\n render: (_v, r) => {\n const b: string[] = [];\n const c: string[] = [];\n if (r.current) {\n Graph.getChunksByModule(r.current, cChunks).forEach((e) =>\n e.assets.forEach((asset) => c.push(asset)),\n );\n }\n\n if (r.baseline) {\n Graph.getChunksByModule(r.baseline, bChunks).forEach((e) =>\n e.assets.forEach((asset) => b.push(asset)),\n );\n }\n\n if (!b.length && !c.length) return null;\n\n return (\n <Space direction=\"vertical\">\n {uniq(c)\n .filter(Boolean)\n .map((e) => (\n <Bdg label=\"Current\" value={e} key={`c_${e}`} />\n ))}\n {uniq(b)\n .filter(Boolean)\n .map((e) => (\n <Bdg label=\"Baseline\" value={e} key={`b_${e}`} />\n ))}\n </Space>\n );\n },\n },\n {\n title: 'Actions',\n width: 200,\n render: (_v, r) => {\n const isChanged = getUpdateType(r) === UpdateType.Changed;\n return (\n <Space direction=\"vertical\" style={{ maxWidth: 170 }}>\n {isChanged ? (\n <ViewChanges\n text=\"View Changes\"\n file={r.path}\n data={[\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.source,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.source,\n group: 'Source',\n },\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.transformed,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.transformed,\n group: 'Transformed Source',\n },\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.parsedSource,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.parsedSource,\n group: 'Parsed Source',\n },\n ]}\n />\n ) : null}\n {r?.current ? (\n <ViewChanges\n text=\"Current Result Viewer\"\n file={r.path}\n data={[\n {\n baseline:\n current.moduleCodeMap[r.current!.id]?.source,\n current:\n current.moduleCodeMap[r.current!.id]?.transformed,\n baselineTitle: 'Current Source',\n currentTitle: 'Current Transformed Source',\n group: 'Transformed Source',\n },\n {\n baseline:\n current.moduleCodeMap[r.current!.id]?.source,\n current:\n current.moduleCodeMap[r.current!.id]\n ?.parsedSource,\n baselineTitle: 'Current Source',\n currentTitle: 'Current Parsed Source',\n group: 'Parsed Source',\n },\n ]}\n />\n ) : null}\n </Space>\n );\n },\n },\n ]}\n />\n </Col>\n </Row>\n );\n};\n"],"names":["getUpdateType","e","UpdateType","Error","FileUpdateTypeTag","type","Tooltip","Tag","Modules","baseline","current","bModules","useMemo","useUniqModules","cModules","bChunks","cChunks","bRoot","cRoot","keyword","setKeyword","useState","selectedUpdateTypes","setSelectedUpdateTypes","dataSource","res","mod","modPath","ModuleHashPattern","console","Object","filteredDataSource","list","bFilteredModulesLength","cFilteredModulesLength","Row","Size","Col","Space","KeywordInput","FileSearchOutlined","Select","Table","Typography","Divider","InfoCircleOutlined","_v","r","alias","inNodeModules","beautifyModulePath","getTargetColumnPropsForModuleRow","b","c","Graph","asset","uniq","Boolean","Bdg","isChanged","ViewChanges"],"mappings":"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"}
1
+ {"version":3,"file":"pages/Resources/BundleDiff/DiffContainer/modules.mjs","sources":["../../../../../src/pages/Resources/BundleDiff/DiffContainer/modules.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport {\n Col,\n Divider,\n Row,\n Select,\n Space,\n Table,\n Tag,\n Tooltip,\n Typography,\n} from 'antd';\nimport { uniq } from 'es-toolkit/compat';\nimport { InfoCircleOutlined, FileSearchOutlined } from '@ant-design/icons';\nimport {\n BundleDiffComponentCardProps,\n BundleDiffTableModulesData,\n} from './types';\nimport { beautifyModulePath, useUniqModules } from '../../../../utils';\nimport { Size } from '../../../../constants';\nimport { KeywordInput } from '../../../../components/Form/keyword';\nimport { ViewChanges } from './changes';\nimport { UpdateType } from './constants';\nimport { Badge as Bdg } from '../../../../components/Badge';\nimport { getTargetColumnPropsForModuleRow } from './row';\nimport { Graph } from '@rsdoctor/utils/common';\nimport { getModuleDiffKey } from './moduleDiff';\n\nexport function getUpdateType(e: BundleDiffTableModulesData): UpdateType {\n if (e.baseline && !e.current) {\n // deleted\n return UpdateType.Deleted;\n }\n\n if (!e.baseline && e.current) {\n // new\n return UpdateType.New;\n }\n\n if (e.baseline && e.current) {\n if (\n e.baseline.size.sourceSize === e.current.size.sourceSize &&\n e.baseline.size.parsedSize === e.current.size.parsedSize\n ) {\n // not changed\n return UpdateType.NotChanged;\n }\n // update\n return UpdateType.Changed;\n }\n\n throw new Error('Update Type not match');\n}\n\nexport const FileUpdateTypeTag: React.FC<{ type: UpdateType }> = ({ type }) => {\n if (type === UpdateType.NotChanged) {\n return (\n <Tooltip title=\"It hasn't changed between Baseline and Current\">\n <Tag color=\"success\">Not Changed</Tag>\n </Tooltip>\n );\n }\n if (type === UpdateType.Changed) {\n return (\n <Tooltip title=\"It has been changed between Baseline and Current\">\n <Tag color=\"warning\">Changed</Tag>\n </Tooltip>\n );\n }\n if (type === UpdateType.New) {\n return (\n <Tooltip title=\"It is created in Current\">\n <Tag color=\"error\">New</Tag>\n </Tooltip>\n );\n }\n if (type === UpdateType.Deleted) {\n return (\n <Tooltip title=\"It has been deleted in Current\">\n <Tag color=\"error\">Deleted</Tag>\n </Tooltip>\n );\n }\n return null;\n};\n\nexport const Modules: React.FC<BundleDiffComponentCardProps> = ({\n baseline,\n current,\n}) => {\n const bModules = useMemo(\n () => useUniqModules(baseline.moduleGraph.modules),\n [baseline],\n );\n const cModules = useMemo(\n () => useUniqModules(current.moduleGraph.modules),\n [current],\n );\n\n const bChunks = baseline.chunkGraph.chunks;\n const cChunks = current.chunkGraph.chunks;\n\n const bRoot = baseline.root;\n const cRoot = current.root;\n\n const [keyword, setKeyword] = useState<string>();\n const [selectedUpdateTypes, setSelectedUpdateTypes] = useState<UpdateType[]>(\n [],\n );\n\n const dataSource = useMemo(() => {\n const res: Record<string, BundleDiffTableModulesData> = {};\n\n bModules.forEach((mod) => {\n const modPath = getModuleDiffKey(mod);\n\n if (!res[modPath]) {\n res[modPath] = {\n path: modPath,\n baseline: mod,\n };\n } else {\n console.warn('[Baseline Module Exists]: ', mod, res);\n }\n });\n\n cModules.forEach((mod) => {\n const modPath = getModuleDiffKey(mod);\n\n if (!res[modPath]) {\n res[modPath] = {\n path: modPath,\n };\n }\n res[modPath].current = mod;\n });\n\n return Object.values(res);\n }, [bModules, cModules]);\n\n const filteredDataSource = useMemo(() => {\n let list = dataSource.slice();\n\n if (keyword) {\n list = list.filter((e) => e.path.indexOf(keyword) > -1);\n }\n\n if (selectedUpdateTypes.length) {\n list = list.filter((e) => {\n return selectedUpdateTypes.includes(getUpdateType(e));\n });\n }\n\n return list;\n }, [dataSource, keyword, selectedUpdateTypes]);\n\n const { bFilteredModulesLength, cFilteredModulesLength } = useMemo(() => {\n return {\n bFilteredModulesLength: filteredDataSource.filter((e) => e.baseline)\n .length,\n cFilteredModulesLength: filteredDataSource.filter((e) => e.current)\n .length,\n };\n }, [filteredDataSource]);\n\n return (\n <Row gutter={[Size.BasePadding, Size.BasePadding]}>\n <Col span={24}>\n <Space wrap>\n <KeywordInput\n icon={<FileSearchOutlined />}\n label=\"\"\n labelStyle={{ width: 45 }}\n placeholder=\"Search by name\"\n onChange={(e) => {\n setKeyword(e);\n }}\n />\n <Select\n mode=\"multiple\"\n placeholder=\"Filter by changed type\"\n style={{ width: 200 }}\n options={Object.values(UpdateType).map((e) => ({\n label: e,\n value: e,\n }))}\n allowClear\n onChange={(e) => {\n setSelectedUpdateTypes(e);\n }}\n />\n </Space>\n </Col>\n <Col span={24}>\n <Table\n bordered\n sticky={{ offsetHeader: 54 }}\n pagination={{\n pageSize: 20,\n size: 'small',\n }}\n scroll={{ x: 1700 }}\n dataSource={filteredDataSource}\n rowKey={(e) => e.path}\n columns={[\n {\n fixed: 'left',\n title: (\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n filtered modules is {filteredDataSource.length} (Current\n & Baseline)\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n total modules is {dataSource.length} (Current &\n Baseline)\n </Typography.Text>\n </Space>\n }\n >\n <Typography.Text strong>Modules</Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 10, fontWeight: 400, marginRight: 4 }}\n >\n {filteredDataSource.length}/{dataSource.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Tooltip>\n ),\n render: (_v, r) => {\n const { alias, inNodeModules } = beautifyModulePath(\n r.path,\n r.baseline ? bRoot : cRoot,\n );\n return (\n <Space>\n <Tooltip title={r.path}>\n <Typography.Text copyable={{ text: r.path }}>\n {alias}\n </Typography.Text>\n </Tooltip>\n <FileUpdateTypeTag type={getUpdateType(r)} />\n {inNodeModules ? (\n <Tag color=\"warning\">node_modules</Tag>\n ) : null}\n </Space>\n );\n },\n },\n getTargetColumnPropsForModuleRow(\n 'current',\n bFilteredModulesLength,\n cFilteredModulesLength,\n ),\n getTargetColumnPropsForModuleRow(\n 'baseline',\n bFilteredModulesLength,\n cFilteredModulesLength,\n ),\n {\n title: 'in Assets',\n render: (_v, r) => {\n const b: string[] = [];\n const c: string[] = [];\n if (r.current) {\n Graph.getChunksByModule(r.current, cChunks).forEach((e) =>\n e.assets.forEach((asset) => c.push(asset)),\n );\n }\n\n if (r.baseline) {\n Graph.getChunksByModule(r.baseline, bChunks).forEach((e) =>\n e.assets.forEach((asset) => b.push(asset)),\n );\n }\n\n if (!b.length && !c.length) return null;\n\n return (\n <Space direction=\"vertical\">\n {uniq(c)\n .filter(Boolean)\n .map((e) => (\n <Bdg label=\"Current\" value={e} key={`c_${e}`} />\n ))}\n {uniq(b)\n .filter(Boolean)\n .map((e) => (\n <Bdg label=\"Baseline\" value={e} key={`b_${e}`} />\n ))}\n </Space>\n );\n },\n },\n {\n title: 'Actions',\n width: 200,\n render: (_v, r) => {\n const isChanged = getUpdateType(r) === UpdateType.Changed;\n return (\n <Space direction=\"vertical\" style={{ maxWidth: 170 }}>\n {isChanged ? (\n <ViewChanges\n text=\"View Changes\"\n file={r.path}\n data={[\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.source,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.source,\n group: 'Source',\n },\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.transformed,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.transformed,\n group: 'Transformed Source',\n },\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.parsedSource,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.parsedSource,\n group: 'Parsed Source',\n },\n ]}\n />\n ) : null}\n {r?.current ? (\n <ViewChanges\n text=\"Current Result Viewer\"\n file={r.path}\n data={[\n {\n baseline:\n current.moduleCodeMap[r.current!.id]?.source,\n current:\n current.moduleCodeMap[r.current!.id]?.transformed,\n baselineTitle: 'Current Source',\n currentTitle: 'Current Transformed Source',\n group: 'Transformed Source',\n },\n {\n baseline:\n current.moduleCodeMap[r.current!.id]?.source,\n current:\n current.moduleCodeMap[r.current!.id]\n ?.parsedSource,\n baselineTitle: 'Current Source',\n currentTitle: 'Current Parsed Source',\n group: 'Parsed Source',\n },\n ]}\n />\n ) : null}\n </Space>\n );\n },\n },\n ]}\n />\n </Col>\n </Row>\n );\n};\n"],"names":["getUpdateType","e","UpdateType","Error","FileUpdateTypeTag","type","Tooltip","Tag","Modules","baseline","current","bModules","useMemo","useUniqModules","cModules","bChunks","cChunks","bRoot","cRoot","keyword","setKeyword","useState","selectedUpdateTypes","setSelectedUpdateTypes","dataSource","res","mod","modPath","getModuleDiffKey","console","Object","filteredDataSource","list","bFilteredModulesLength","cFilteredModulesLength","Row","Size","Col","Space","KeywordInput","FileSearchOutlined","Select","Table","Typography","Divider","InfoCircleOutlined","_v","r","alias","inNodeModules","beautifyModulePath","getTargetColumnPropsForModuleRow","b","c","Graph","asset","uniq","Boolean","Bdg","isChanged","ViewChanges"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { ColumnGroupType, ColumnType } from 'antd/es/table/interface';
2
2
  import React from 'react';
3
3
  import { BundleDiffComponentCardProps, BundleDiffTableAssetsData, BundleDiffTableModulesData } from './types.js';
4
- export declare const ModuleHashPattern: RegExp;
5
4
  export declare const getSizeColumnPropsForModuleRow: (key: "baseline" | "current", sizeKey: "parsedSize" | "sourceSize", sortByChanged?: boolean) => ColumnType<BundleDiffTableModulesData>;
6
5
  export declare const getTargetColumnPropsForModuleRow: (key: "baseline" | "current", bModulesCount: number, cModulesCount: number) => ColumnGroupType<BundleDiffTableModulesData>;
7
6
  export declare const ModuleRowForAsset: React.FC<{
@@ -11,7 +11,7 @@ import { FileUpdateTypeTag, getUpdateType } from "./modules.mjs";
11
11
  import { UpdateType } from "./constants.mjs";
12
12
  import { formatDiffSize } from "./utils.mjs";
13
13
  import { Graph } from "@rsdoctor/utils/common";
14
- const ModuleHashPattern = /[a-fA-F0-9]{20,}/;
14
+ import { getModuleDiffKey } from "./moduleDiff.mjs";
15
15
  const getSizeColumnPropsForModuleRow = (key, sizeKey, sortByChanged)=>{
16
16
  const sortByChangedFn = (a, b)=>(a.current?.size[sizeKey] || 0) - (a.baseline?.size[sizeKey] || 0) - (b.current?.size[sizeKey] || 0) + (b.baseline?.size[sizeKey] || 0);
17
17
  const sorterFn = sortByChanged ? (a, b)=>sortByChangedFn(a, b) : (a, b)=>(a[key]?.size[sizeKey] || 0) - (b[key]?.size[sizeKey] || 0);
@@ -158,7 +158,7 @@ const ModuleRowForAsset = ({ data, baseline, current })=>{
158
158
  ];
159
159
  const map = new Map();
160
160
  mods.forEach((mod)=>{
161
- const modPath = mod.webpackId?.replace(ModuleHashPattern, '') || mod.path?.replace(ModuleHashPattern, '');
161
+ const modPath = getModuleDiffKey(mod);
162
162
  let t = map.get(modPath);
163
163
  if (!t) t = {
164
164
  path: modPath
@@ -394,6 +394,6 @@ const ModuleRowForAsset = ({ data, baseline, current })=>{
394
394
  ]
395
395
  });
396
396
  };
397
- export { ModuleHashPattern, ModuleRowForAsset, getSizeColumnPropsForModuleRow, getTargetColumnPropsForModuleRow };
397
+ export { ModuleRowForAsset, getSizeColumnPropsForModuleRow, getTargetColumnPropsForModuleRow };
398
398
 
399
399
  //# sourceMappingURL=row.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pages/Resources/BundleDiff/DiffContainer/row.mjs","sources":["../../../../../src/pages/Resources/BundleDiff/DiffContainer/row.tsx"],"sourcesContent":["import { InfoCircleOutlined, SearchOutlined } from '@ant-design/icons';\nimport {\n Button,\n Divider,\n Input,\n InputRef,\n Space,\n Table,\n Tag,\n Tooltip,\n Typography,\n} from 'antd';\nimport {\n ColumnGroupType,\n ColumnType,\n FilterConfirmProps,\n} from 'antd/es/table/interface';\nimport { upperFirst } from 'es-toolkit/compat';\nimport React, { useMemo, useRef, useState } from 'react';\nimport { Client } from '@rsdoctor/types';\nimport { CompareFn } from 'antd/lib/table/interface';\nimport { Color } from '../../../../constants';\nimport {\n beautifyModulePath,\n formatPercent,\n formatSize,\n} from '../../../../utils';\nimport { ViewChanges } from './changes';\nimport { FileUpdateTypeTag, getUpdateType } from './modules';\nimport {\n BundleDiffComponentCardProps,\n BundleDiffTableAssetsData,\n BundleDiffTableModulesData,\n} from './types';\nimport { UpdateType } from './constants';\nimport { formatDiffSize } from './utils';\nimport { Graph } from '@rsdoctor/utils/common';\n\nexport const ModuleHashPattern = /[a-fA-F0-9]{20,}/;\n\nexport const getSizeColumnPropsForModuleRow = (\n key: 'baseline' | 'current',\n sizeKey: 'parsedSize' | 'sourceSize',\n sortByChanged?: boolean,\n): ColumnType<BundleDiffTableModulesData> => {\n const sortByChangedFn: CompareFn<any> = (a, b) =>\n (a.current?.size[sizeKey] || 0) -\n (a.baseline?.size[sizeKey] || 0) -\n (b.current?.size[sizeKey] || 0) +\n (b.baseline?.size[sizeKey] || 0);\n\n const sorterFn: CompareFn<any> = sortByChanged\n ? (a, b) => sortByChangedFn(a, b)\n : (a, b) => (a[key]?.size[sizeKey] || 0) - (b[key]?.size[sizeKey] || 0);\n\n return {\n width: 200,\n sorter: (a, b) => sorterFn(a, b),\n render: (_v, r) => {\n if (!r[key]) return '-';\n const size = r[key]!.size[sizeKey];\n return (\n <Space>\n <Typography.Text>{formatSize(size)}</Typography.Text>\n {key === 'current'\n ? formatDiffSize(\n r.baseline?.size[sizeKey] || 0,\n size,\n (r.baseline?.size[sizeKey] || 0) > size\n ? Client.RsdoctorClientDiffState.Down\n : Client.RsdoctorClientDiffState.Up,\n )\n : null}\n </Space>\n );\n },\n };\n};\n\nexport const getTargetColumnPropsForModuleRow = (\n key: 'baseline' | 'current',\n bModulesCount: number,\n cModulesCount: number,\n): ColumnGroupType<BundleDiffTableModulesData> => {\n const [sortByChanged, setSortByChanged] = useState(false);\n\n const isB = key === 'baseline';\n return {\n title: () => {\n const count = isB ? bModulesCount : cModulesCount;\n const title = upperFirst(key);\n const diff = Graph.diffSize(bModulesCount, cModulesCount);\n return (\n <div>\n <Typography.Text>{title}</Typography.Text>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n {title} modules is {count}\n </Typography.Text>\n {isB ? null : (\n <Typography.Text style={{ color: 'inherit' }}>\n Percent is {formatPercent(diff.percent)}\n </Typography.Text>\n )}\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 10, fontWeight: 400 }}\n >\n {count}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n </div>\n );\n },\n children: [\n {\n title: 'Source Size',\n ...getSizeColumnPropsForModuleRow(key, 'sourceSize', sortByChanged),\n },\n {\n title: 'Parsed Size',\n defaultSortOrder: isB ? undefined : 'descend',\n ...getSizeColumnPropsForModuleRow(key, 'parsedSize', sortByChanged),\n },\n ],\n filterSearch: true,\n filters: [\n {\n text: 'Show Changed',\n value: UpdateType.NotChanged,\n },\n {\n text: 'Show All',\n value: 'All',\n },\n ],\n onFilter(v, r) {\n if (v === UpdateType.NotChanged) {\n setSortByChanged(true);\n } else {\n setSortByChanged(false);\n }\n return v === UpdateType.NotChanged ? getUpdateType(r) !== v : true;\n },\n };\n};\n\nexport const ModuleRowForAsset: React.FC<\n { data: BundleDiffTableAssetsData } & Pick<\n BundleDiffComponentCardProps,\n 'baseline' | 'current'\n >\n> = ({ data, baseline, current }) => {\n const { modules: bTotalModules } = baseline.moduleGraph;\n const { modules: cTotalModules } = current.moduleGraph;\n const { chunks: bToTalChunks } = baseline.chunkGraph;\n const { chunks: cToTalChunks } = current.chunkGraph;\n const bRoot = baseline.root;\n const cRoot = current.root;\n\n const [searchText, setSearchText] = useState('');\n const searchInput = useRef<InputRef>(null);\n\n const handleSearch = (\n selectedKeys: string[],\n confirm: (param?: FilterConfirmProps) => void,\n ) => {\n confirm();\n setSearchText(selectedKeys[0]);\n };\n\n const handleReset = (clearFilters: () => void) => {\n clearFilters();\n setSearchText('');\n };\n\n const isBaseline = '__is_baseline__' as const;\n\n const bModules = useMemo(\n () =>\n data.baseline\n ? Graph.getModulesByAsset(data.baseline, bToTalChunks, bTotalModules)\n .map((e) => ({\n ...e,\n [isBaseline]: true,\n }))\n .filter((cModule) => !cModule.concatenationModules?.length)\n : [],\n [data, baseline],\n );\n const cModules = useMemo(\n () =>\n data.current\n ? Graph.getModulesByAsset(data.current, cToTalChunks, cTotalModules)\n .map((e) => ({\n ...e,\n [isBaseline]: false,\n }))\n .filter((cModule) => !cModule.concatenationModules?.length)\n : [],\n [data, current],\n );\n\n const getPathInfo = (r: BundleDiffTableModulesData) =>\n beautifyModulePath(r.path, r.__is_baseline__ ? bRoot : cRoot);\n\n const dataSource: BundleDiffTableModulesData[] = useMemo(() => {\n const mods = [...bModules, ...cModules];\n const map = new Map<string, BundleDiffTableModulesData>();\n\n // group by module.path\n mods.forEach((mod) => {\n const modPath =\n mod.webpackId?.replace(ModuleHashPattern, '') ||\n mod.path?.replace(ModuleHashPattern, '');\n let t: BundleDiffTableModulesData = map.get(modPath)!;\n\n if (!t) {\n t = { path: modPath };\n }\n\n if (mod[isBaseline]) {\n t.baseline = mod;\n } else {\n t.current = mod;\n }\n map.set(modPath, t);\n });\n\n return [...map.values()];\n }, [bModules, cModules, searchText]);\n\n const { bModulesCount, cModulesCount, totalCount } = useMemo(() => {\n const fileNameFilter = (e: BundleDiffTableModulesData) =>\n getPathInfo(e).alias.indexOf(searchText) > -1;\n\n let b = dataSource.filter((e) => e.baseline);\n let c = dataSource.filter((e) => e.current);\n let totalCount = dataSource.length;\n\n if (searchText) {\n b = b.filter(fileNameFilter);\n c = c.filter(fileNameFilter);\n totalCount = dataSource.filter(fileNameFilter).length;\n }\n\n return {\n bModulesCount: b.length,\n cModulesCount: c.length,\n totalCount,\n };\n }, [dataSource, searchText]);\n\n return (\n <Table\n dataSource={dataSource}\n rowKey={(e) => e.path}\n size=\"small\"\n pagination={{\n size: 'small',\n }}\n bordered\n scroll={{ x: 1500 }}\n columns={[\n {\n fixed: 'left',\n title: () => {\n return (\n <div>\n <Typography.Text>\n Modules of {`\"${data.alias}\"`}\n </Typography.Text>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n filtered modules: {totalCount}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n total modules: {dataSource.length}\n </Typography.Text>\n </Space>\n }\n >\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 10, fontWeight: 400, marginRight: 4 }}\n >\n {totalCount}/{dataSource.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Tooltip>\n </div>\n );\n },\n filterDropdown({\n setSelectedKeys,\n selectedKeys,\n confirm,\n clearFilters,\n }) {\n return (\n <div\n style={{ padding: 8 }}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <Input\n ref={searchInput}\n placeholder={`Search by file name`}\n value={selectedKeys[0]}\n onChange={(e) =>\n setSelectedKeys(e.target.value ? [e.target.value] : [])\n }\n onPressEnter={() =>\n handleSearch(selectedKeys as string[], confirm)\n }\n style={{ marginBottom: 8, display: 'block' }}\n />\n <Space>\n <Button\n type=\"primary\"\n onClick={() =>\n handleSearch(selectedKeys as string[], confirm)\n }\n icon={<SearchOutlined />}\n size=\"small\"\n style={{ width: 90 }}\n >\n Search\n </Button>\n <Button\n onClick={() => {\n if (clearFilters) {\n handleReset(clearFilters);\n }\n setSelectedKeys([]);\n handleSearch([], confirm);\n }}\n size=\"small\"\n style={{ width: 90 }}\n >\n Reset\n </Button>\n </Space>\n </div>\n );\n },\n filterSearch: true,\n filterIcon: (filtered) => (\n <Space>\n <Typography.Text\n type={searchText ? undefined : 'secondary'}\n style={{ fontWeight: 400 }}\n >\n {searchText || 'Search by file name'}\n </Typography.Text>\n <SearchOutlined\n style={{ color: filtered ? Color.Blue : undefined }}\n />\n </Space>\n ),\n onFilterDropdownOpenChange: (visible) => {\n if (visible) {\n setTimeout(() => searchInput.current?.focus(), 100);\n }\n },\n onFilter(v, r) {\n return getPathInfo(r).alias.indexOf(v as string) > -1;\n },\n render: (_v, r) => {\n const { alias, inNodeModules } = getPathInfo(r);\n return (\n <Space>\n <Tooltip title={r.path}>\n <Typography.Text copyable={{ text: r.path }}>\n {alias}\n </Typography.Text>\n </Tooltip>\n {inNodeModules ? <Tag color=\"warning\">node_modules</Tag> : null}\n <FileUpdateTypeTag type={getUpdateType(r)} />\n </Space>\n );\n },\n },\n getTargetColumnPropsForModuleRow(\n 'current',\n bModulesCount,\n cModulesCount,\n ),\n getTargetColumnPropsForModuleRow(\n 'baseline',\n bModulesCount,\n cModulesCount,\n ),\n {\n title: 'Actions',\n width: 200,\n render: (_v, r) => {\n return (\n <Space direction=\"vertical\" style={{ maxWidth: 170 }}>\n <ViewChanges\n text=\"View Changes\"\n file={r.path}\n data={[\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.source,\n current:\n current.moduleCodeMap[r.current?.id as number]?.source,\n group: 'Source',\n },\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.transformed,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.transformed,\n group: 'Transformed Source',\n },\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.parsedSource,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.parsedSource,\n group: 'Parsed Source',\n },\n ]}\n />\n </Space>\n );\n },\n },\n ]}\n />\n );\n};\n"],"names":["ModuleHashPattern","getSizeColumnPropsForModuleRow","key","sizeKey","sortByChanged","sortByChangedFn","a","b","sorterFn","_v","r","size","Space","Typography","formatSize","formatDiffSize","Client","getTargetColumnPropsForModuleRow","bModulesCount","cModulesCount","setSortByChanged","useState","isB","count","title","upperFirst","diff","Graph","Divider","Tooltip","formatPercent","InfoCircleOutlined","undefined","UpdateType","v","getUpdateType","ModuleRowForAsset","data","baseline","current","bTotalModules","cTotalModules","bToTalChunks","cToTalChunks","bRoot","cRoot","searchText","setSearchText","searchInput","useRef","handleSearch","selectedKeys","confirm","handleReset","clearFilters","isBaseline","bModules","useMemo","e","cModule","cModules","getPathInfo","beautifyModulePath","dataSource","mods","map","Map","mod","modPath","t","totalCount","fileNameFilter","c","Table","setSelectedKeys","Input","Button","SearchOutlined","filtered","Color","visible","setTimeout","alias","inNodeModules","Tag","FileUpdateTypeTag","ViewChanges"],"mappings":"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"}
1
+ {"version":3,"file":"pages/Resources/BundleDiff/DiffContainer/row.mjs","sources":["../../../../../src/pages/Resources/BundleDiff/DiffContainer/row.tsx"],"sourcesContent":["import { InfoCircleOutlined, SearchOutlined } from '@ant-design/icons';\nimport {\n Button,\n Divider,\n Input,\n InputRef,\n Space,\n Table,\n Tag,\n Tooltip,\n Typography,\n} from 'antd';\nimport {\n ColumnGroupType,\n ColumnType,\n FilterConfirmProps,\n} from 'antd/es/table/interface';\nimport { upperFirst } from 'es-toolkit/compat';\nimport React, { useMemo, useRef, useState } from 'react';\nimport { Client } from '@rsdoctor/types';\nimport { CompareFn } from 'antd/lib/table/interface';\nimport { Color } from '../../../../constants';\nimport {\n beautifyModulePath,\n formatPercent,\n formatSize,\n} from '../../../../utils';\nimport { ViewChanges } from './changes';\nimport { FileUpdateTypeTag, getUpdateType } from './modules';\nimport {\n BundleDiffComponentCardProps,\n BundleDiffTableAssetsData,\n BundleDiffTableModulesData,\n} from './types';\nimport { UpdateType } from './constants';\nimport { formatDiffSize } from './utils';\nimport { Graph } from '@rsdoctor/utils/common';\nimport { getModuleDiffKey } from './moduleDiff';\n\nexport const getSizeColumnPropsForModuleRow = (\n key: 'baseline' | 'current',\n sizeKey: 'parsedSize' | 'sourceSize',\n sortByChanged?: boolean,\n): ColumnType<BundleDiffTableModulesData> => {\n const sortByChangedFn: CompareFn<any> = (a, b) =>\n (a.current?.size[sizeKey] || 0) -\n (a.baseline?.size[sizeKey] || 0) -\n (b.current?.size[sizeKey] || 0) +\n (b.baseline?.size[sizeKey] || 0);\n\n const sorterFn: CompareFn<any> = sortByChanged\n ? (a, b) => sortByChangedFn(a, b)\n : (a, b) => (a[key]?.size[sizeKey] || 0) - (b[key]?.size[sizeKey] || 0);\n\n return {\n width: 200,\n sorter: (a, b) => sorterFn(a, b),\n render: (_v, r) => {\n if (!r[key]) return '-';\n const size = r[key]!.size[sizeKey];\n return (\n <Space>\n <Typography.Text>{formatSize(size)}</Typography.Text>\n {key === 'current'\n ? formatDiffSize(\n r.baseline?.size[sizeKey] || 0,\n size,\n (r.baseline?.size[sizeKey] || 0) > size\n ? Client.RsdoctorClientDiffState.Down\n : Client.RsdoctorClientDiffState.Up,\n )\n : null}\n </Space>\n );\n },\n };\n};\n\nexport const getTargetColumnPropsForModuleRow = (\n key: 'baseline' | 'current',\n bModulesCount: number,\n cModulesCount: number,\n): ColumnGroupType<BundleDiffTableModulesData> => {\n const [sortByChanged, setSortByChanged] = useState(false);\n\n const isB = key === 'baseline';\n return {\n title: () => {\n const count = isB ? bModulesCount : cModulesCount;\n const title = upperFirst(key);\n const diff = Graph.diffSize(bModulesCount, cModulesCount);\n return (\n <div>\n <Typography.Text>{title}</Typography.Text>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n {title} modules is {count}\n </Typography.Text>\n {isB ? null : (\n <Typography.Text style={{ color: 'inherit' }}>\n Percent is {formatPercent(diff.percent)}\n </Typography.Text>\n )}\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 10, fontWeight: 400 }}\n >\n {count}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n </div>\n );\n },\n children: [\n {\n title: 'Source Size',\n ...getSizeColumnPropsForModuleRow(key, 'sourceSize', sortByChanged),\n },\n {\n title: 'Parsed Size',\n defaultSortOrder: isB ? undefined : 'descend',\n ...getSizeColumnPropsForModuleRow(key, 'parsedSize', sortByChanged),\n },\n ],\n filterSearch: true,\n filters: [\n {\n text: 'Show Changed',\n value: UpdateType.NotChanged,\n },\n {\n text: 'Show All',\n value: 'All',\n },\n ],\n onFilter(v, r) {\n if (v === UpdateType.NotChanged) {\n setSortByChanged(true);\n } else {\n setSortByChanged(false);\n }\n return v === UpdateType.NotChanged ? getUpdateType(r) !== v : true;\n },\n };\n};\n\nexport const ModuleRowForAsset: React.FC<\n { data: BundleDiffTableAssetsData } & Pick<\n BundleDiffComponentCardProps,\n 'baseline' | 'current'\n >\n> = ({ data, baseline, current }) => {\n const { modules: bTotalModules } = baseline.moduleGraph;\n const { modules: cTotalModules } = current.moduleGraph;\n const { chunks: bToTalChunks } = baseline.chunkGraph;\n const { chunks: cToTalChunks } = current.chunkGraph;\n const bRoot = baseline.root;\n const cRoot = current.root;\n\n const [searchText, setSearchText] = useState('');\n const searchInput = useRef<InputRef>(null);\n\n const handleSearch = (\n selectedKeys: string[],\n confirm: (param?: FilterConfirmProps) => void,\n ) => {\n confirm();\n setSearchText(selectedKeys[0]);\n };\n\n const handleReset = (clearFilters: () => void) => {\n clearFilters();\n setSearchText('');\n };\n\n const isBaseline = '__is_baseline__' as const;\n\n const bModules = useMemo(\n () =>\n data.baseline\n ? Graph.getModulesByAsset(data.baseline, bToTalChunks, bTotalModules)\n .map((e) => ({\n ...e,\n [isBaseline]: true,\n }))\n .filter((cModule) => !cModule.concatenationModules?.length)\n : [],\n [data, baseline],\n );\n const cModules = useMemo(\n () =>\n data.current\n ? Graph.getModulesByAsset(data.current, cToTalChunks, cTotalModules)\n .map((e) => ({\n ...e,\n [isBaseline]: false,\n }))\n .filter((cModule) => !cModule.concatenationModules?.length)\n : [],\n [data, current],\n );\n\n const getPathInfo = (r: BundleDiffTableModulesData) =>\n beautifyModulePath(r.path, r.__is_baseline__ ? bRoot : cRoot);\n\n const dataSource: BundleDiffTableModulesData[] = useMemo(() => {\n const mods = [...bModules, ...cModules];\n const map = new Map<string, BundleDiffTableModulesData>();\n\n // group by module.path\n mods.forEach((mod) => {\n const modPath = getModuleDiffKey(mod);\n let t: BundleDiffTableModulesData = map.get(modPath)!;\n\n if (!t) {\n t = { path: modPath };\n }\n\n if (mod[isBaseline]) {\n t.baseline = mod;\n } else {\n t.current = mod;\n }\n map.set(modPath, t);\n });\n\n return [...map.values()];\n }, [bModules, cModules, searchText]);\n\n const { bModulesCount, cModulesCount, totalCount } = useMemo(() => {\n const fileNameFilter = (e: BundleDiffTableModulesData) =>\n getPathInfo(e).alias.indexOf(searchText) > -1;\n\n let b = dataSource.filter((e) => e.baseline);\n let c = dataSource.filter((e) => e.current);\n let totalCount = dataSource.length;\n\n if (searchText) {\n b = b.filter(fileNameFilter);\n c = c.filter(fileNameFilter);\n totalCount = dataSource.filter(fileNameFilter).length;\n }\n\n return {\n bModulesCount: b.length,\n cModulesCount: c.length,\n totalCount,\n };\n }, [dataSource, searchText]);\n\n return (\n <Table\n dataSource={dataSource}\n rowKey={(e) => e.path}\n size=\"small\"\n pagination={{\n size: 'small',\n }}\n bordered\n scroll={{ x: 1500 }}\n columns={[\n {\n fixed: 'left',\n title: () => {\n return (\n <div>\n <Typography.Text>\n Modules of {`\"${data.alias}\"`}\n </Typography.Text>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n filtered modules: {totalCount}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n total modules: {dataSource.length}\n </Typography.Text>\n </Space>\n }\n >\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 10, fontWeight: 400, marginRight: 4 }}\n >\n {totalCount}/{dataSource.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Tooltip>\n </div>\n );\n },\n filterDropdown({\n setSelectedKeys,\n selectedKeys,\n confirm,\n clearFilters,\n }) {\n return (\n <div\n style={{ padding: 8 }}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <Input\n ref={searchInput}\n placeholder={`Search by file name`}\n value={selectedKeys[0]}\n onChange={(e) =>\n setSelectedKeys(e.target.value ? [e.target.value] : [])\n }\n onPressEnter={() =>\n handleSearch(selectedKeys as string[], confirm)\n }\n style={{ marginBottom: 8, display: 'block' }}\n />\n <Space>\n <Button\n type=\"primary\"\n onClick={() =>\n handleSearch(selectedKeys as string[], confirm)\n }\n icon={<SearchOutlined />}\n size=\"small\"\n style={{ width: 90 }}\n >\n Search\n </Button>\n <Button\n onClick={() => {\n if (clearFilters) {\n handleReset(clearFilters);\n }\n setSelectedKeys([]);\n handleSearch([], confirm);\n }}\n size=\"small\"\n style={{ width: 90 }}\n >\n Reset\n </Button>\n </Space>\n </div>\n );\n },\n filterSearch: true,\n filterIcon: (filtered) => (\n <Space>\n <Typography.Text\n type={searchText ? undefined : 'secondary'}\n style={{ fontWeight: 400 }}\n >\n {searchText || 'Search by file name'}\n </Typography.Text>\n <SearchOutlined\n style={{ color: filtered ? Color.Blue : undefined }}\n />\n </Space>\n ),\n onFilterDropdownOpenChange: (visible) => {\n if (visible) {\n setTimeout(() => searchInput.current?.focus(), 100);\n }\n },\n onFilter(v, r) {\n return getPathInfo(r).alias.indexOf(v as string) > -1;\n },\n render: (_v, r) => {\n const { alias, inNodeModules } = getPathInfo(r);\n return (\n <Space>\n <Tooltip title={r.path}>\n <Typography.Text copyable={{ text: r.path }}>\n {alias}\n </Typography.Text>\n </Tooltip>\n {inNodeModules ? <Tag color=\"warning\">node_modules</Tag> : null}\n <FileUpdateTypeTag type={getUpdateType(r)} />\n </Space>\n );\n },\n },\n getTargetColumnPropsForModuleRow(\n 'current',\n bModulesCount,\n cModulesCount,\n ),\n getTargetColumnPropsForModuleRow(\n 'baseline',\n bModulesCount,\n cModulesCount,\n ),\n {\n title: 'Actions',\n width: 200,\n render: (_v, r) => {\n return (\n <Space direction=\"vertical\" style={{ maxWidth: 170 }}>\n <ViewChanges\n text=\"View Changes\"\n file={r.path}\n data={[\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.source,\n current:\n current.moduleCodeMap[r.current?.id as number]?.source,\n group: 'Source',\n },\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.transformed,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.transformed,\n group: 'Transformed Source',\n },\n {\n baseline:\n baseline.moduleCodeMap[r.baseline?.id as number]\n ?.parsedSource,\n current:\n current.moduleCodeMap[r.current?.id as number]\n ?.parsedSource,\n group: 'Parsed Source',\n },\n ]}\n />\n </Space>\n );\n },\n },\n ]}\n />\n );\n};\n"],"names":["getSizeColumnPropsForModuleRow","key","sizeKey","sortByChanged","sortByChangedFn","a","b","sorterFn","_v","r","size","Space","Typography","formatSize","formatDiffSize","Client","getTargetColumnPropsForModuleRow","bModulesCount","cModulesCount","setSortByChanged","useState","isB","count","title","upperFirst","diff","Graph","Divider","Tooltip","formatPercent","InfoCircleOutlined","undefined","UpdateType","v","getUpdateType","ModuleRowForAsset","data","baseline","current","bTotalModules","cTotalModules","bToTalChunks","cToTalChunks","bRoot","cRoot","searchText","setSearchText","searchInput","useRef","handleSearch","selectedKeys","confirm","handleReset","clearFilters","isBaseline","bModules","useMemo","e","cModule","cModules","getPathInfo","beautifyModulePath","dataSource","mods","map","Map","mod","modPath","getModuleDiffKey","t","totalCount","fileNameFilter","c","Table","setSelectedKeys","Input","Button","SearchOutlined","filtered","Color","visible","setTimeout","alias","inNodeModules","Tag","FileUpdateTypeTag","ViewChanges"],"mappings":";;;;;;;;;;;;;;AAuCO,MAAMA,iCAAiC,CAC5CC,KACAC,SACAC;IAEA,MAAMC,kBAAkC,CAACC,GAAGC,IACzCD,AAAAA,CAAAA,EAAE,OAAO,EAAE,IAAI,CAACH,QAAQ,IAAI,KAC5BG,CAAAA,EAAE,QAAQ,EAAE,IAAI,CAACH,QAAQ,IAAI,KAC7BI,CAAAA,EAAE,OAAO,EAAE,IAAI,CAACJ,QAAQ,IAAI,KAC5BI,CAAAA,EAAE,QAAQ,EAAE,IAAI,CAACJ,QAAQ,IAAI;IAEhC,MAAMK,WAA2BJ,gBAC7B,CAACE,GAAGC,IAAMF,gBAAgBC,GAAGC,KAC7B,CAACD,GAAGC,IAAOD,AAAAA,CAAAA,CAAC,CAACJ,IAAI,EAAE,IAAI,CAACC,QAAQ,IAAI,KAAMI,CAAAA,CAAC,CAACL,IAAI,EAAE,IAAI,CAACC,QAAQ,IAAI;IAEvE,OAAO;QACL,OAAO;QACP,QAAQ,CAACG,GAAGC,IAAMC,SAASF,GAAGC;QAC9B,QAAQ,CAACE,IAAIC;YACX,IAAI,CAACA,CAAC,CAACR,IAAI,EAAE,OAAO;YACpB,MAAMS,OAAOD,CAAC,CAACR,IAAI,CAAE,IAAI,CAACC,QAAQ;YAClC,OAAO,WAAP,GACE,KAACS,OAAKA;;kCACJ,IAACC,WAAW,IAAI;kCAAEC,WAAWH;;oBACpB,cAART,MACGa,eACEL,EAAE,QAAQ,EAAE,IAAI,CAACP,QAAQ,IAAI,GAC7BQ,MACCD,AAAAA,CAAAA,EAAE,QAAQ,EAAE,IAAI,CAACP,QAAQ,IAAI,KAAKQ,OAC/BK,OAAO,uBAAuB,CAAC,IAAI,GACnCA,OAAO,uBAAuB,CAAC,EAAE,IAEvC;;;QAGV;IACF;AACF;AAEO,MAAMC,mCAAmC,CAC9Cf,KACAgB,eACAC;IAEA,MAAM,CAACf,eAAegB,iBAAiB,GAAGC,SAAS;IAEnD,MAAMC,MAAMpB,AAAQ,eAARA;IACZ,OAAO;QACL,OAAO;YACL,MAAMqB,QAAQD,MAAMJ,gBAAgBC;YACpC,MAAMK,QAAQC,WAAWvB;YACzB,MAAMwB,OAAOC,MAAM,QAAQ,CAACT,eAAeC;YAC3C,OAAO,WAAP,GACE,KAAC;;kCACC,IAACN,WAAW,IAAI;kCAAEW;;kCAClB,IAACI,SAAOA;wBAAC,MAAK;;kCACd,IAACC,SAAOA;wBACN,qBACE,KAACjB,OAAKA;4BAAC,WAAU;;8CACf,KAACC,WAAW,IAAI;oCAAC,OAAO;wCAAE,OAAO;oCAAU;;wCACxCW;wCAAM;wCAAaD;;;gCAErBD,MAAM,OAAO,WAAP,GACL,KAACT,WAAW,IAAI;oCAAC,OAAO;wCAAE,OAAO;oCAAU;;wCAAG;wCAChCiB,cAAcJ,KAAK,OAAO;;;;;kCAM9C,mBAACd,OAAKA;;8CACJ,IAACC,WAAW,IAAI;oCACd,MAAK;oCACL,OAAO;wCAAE,UAAU;wCAAI,YAAY;oCAAI;8CAEtCU;;8CAEH,IAACQ,oBAAkBA,CAAAA;;;;;;QAK7B;QACA,UAAU;YACR;gBACE,OAAO;gBACP,GAAG9B,+BAA+BC,KAAK,cAAcE,cAAc;YACrE;YACA;gBACE,OAAO;gBACP,kBAAkBkB,MAAMU,SAAY;gBACpC,GAAG/B,+BAA+BC,KAAK,cAAcE,cAAc;YACrE;SACD;QACD,cAAc;QACd,SAAS;YACP;gBACE,MAAM;gBACN,OAAO6B,WAAW,UAAU;YAC9B;YACA;gBACE,MAAM;gBACN,OAAO;YACT;SACD;QACD,UAASC,CAAC,EAAExB,CAAC;YACPwB,MAAMD,WAAW,UAAU,GAC7Bb,iBAAiB,QAEjBA,iBAAiB;YAEnB,OAAOc,MAAMD,WAAW,UAAU,GAAGE,cAAczB,OAAOwB,IAAI;QAChE;IACF;AACF;AAEO,MAAME,oBAKT,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAE;IAC9B,MAAM,EAAE,SAASC,aAAa,EAAE,GAAGF,SAAS,WAAW;IACvD,MAAM,EAAE,SAASG,aAAa,EAAE,GAAGF,QAAQ,WAAW;IACtD,MAAM,EAAE,QAAQG,YAAY,EAAE,GAAGJ,SAAS,UAAU;IACpD,MAAM,EAAE,QAAQK,YAAY,EAAE,GAAGJ,QAAQ,UAAU;IACnD,MAAMK,QAAQN,SAAS,IAAI;IAC3B,MAAMO,QAAQN,QAAQ,IAAI;IAE1B,MAAM,CAACO,YAAYC,cAAc,GAAG1B,SAAS;IAC7C,MAAM2B,cAAcC,OAAiB;IAErC,MAAMC,eAAe,CACnBC,cACAC;QAEAA;QACAL,cAAcI,YAAY,CAAC,EAAE;IAC/B;IAEA,MAAME,cAAc,CAACC;QACnBA;QACAP,cAAc;IAChB;IAEA,MAAMQ,aAAa;IAEnB,MAAMC,WAAWC,QACf,IACEpB,KAAK,QAAQ,GACTV,MAAM,iBAAiB,CAACU,KAAK,QAAQ,EAAEK,cAAcF,eAClD,GAAG,CAAC,CAACkB,IAAO;gBACX,GAAGA,CAAC;gBACJ,CAACH,WAAW,EAAE;YAChB,IACC,MAAM,CAAC,CAACI,UAAY,CAACA,QAAQ,oBAAoB,EAAE,UACtD,EAAE,EACR;QAACtB;QAAMC;KAAS;IAElB,MAAMsB,WAAWH,QACf,IACEpB,KAAK,OAAO,GACRV,MAAM,iBAAiB,CAACU,KAAK,OAAO,EAAEM,cAAcF,eACjD,GAAG,CAAC,CAACiB,IAAO;gBACX,GAAGA,CAAC;gBACJ,CAACH,WAAW,EAAE;YAChB,IACC,MAAM,CAAC,CAACI,UAAY,CAACA,QAAQ,oBAAoB,EAAE,UACtD,EAAE,EACR;QAACtB;QAAME;KAAQ;IAGjB,MAAMsB,cAAc,CAACnD,IACnBoD,mBAAmBpD,EAAE,IAAI,EAAEA,EAAE,eAAe,GAAGkC,QAAQC;IAEzD,MAAMkB,aAA2CN,QAAQ;QACvD,MAAMO,OAAO;eAAIR;eAAaI;SAAS;QACvC,MAAMK,MAAM,IAAIC;QAGhBF,KAAK,OAAO,CAAC,CAACG;YACZ,MAAMC,UAAUC,iBAAiBF;YACjC,IAAIG,IAAgCL,IAAI,GAAG,CAACG;YAE5C,IAAI,CAACE,GACHA,IAAI;gBAAE,MAAMF;YAAQ;YAGtB,IAAID,GAAG,CAACZ,WAAW,EACjBe,EAAE,QAAQ,GAAGH;iBAEbG,EAAE,OAAO,GAAGH;YAEdF,IAAI,GAAG,CAACG,SAASE;QACnB;QAEA,OAAO;eAAIL,IAAI,MAAM;SAAG;IAC1B,GAAG;QAACT;QAAUI;QAAUd;KAAW;IAEnC,MAAM,EAAE5B,aAAa,EAAEC,aAAa,EAAEoD,UAAU,EAAE,GAAGd,QAAQ;QAC3D,MAAMe,iBAAiB,CAACd,IACtBG,YAAYH,GAAG,KAAK,CAAC,OAAO,CAACZ,cAAc;QAE7C,IAAIvC,IAAIwD,WAAW,MAAM,CAAC,CAACL,IAAMA,EAAE,QAAQ;QAC3C,IAAIe,IAAIV,WAAW,MAAM,CAAC,CAACL,IAAMA,EAAE,OAAO;QAC1C,IAAIa,aAAaR,WAAW,MAAM;QAElC,IAAIjB,YAAY;YACdvC,IAAIA,EAAE,MAAM,CAACiE;YACbC,IAAIA,EAAE,MAAM,CAACD;YACbD,aAAaR,WAAW,MAAM,CAACS,gBAAgB,MAAM;QACvD;QAEA,OAAO;YACL,eAAejE,EAAE,MAAM;YACvB,eAAekE,EAAE,MAAM;YACvBF;QACF;IACF,GAAG;QAACR;QAAYjB;KAAW;IAE3B,OAAO,WAAP,GACE,IAAC4B,OAAKA;QACJ,YAAYX;QACZ,QAAQ,CAACL,IAAMA,EAAE,IAAI;QACrB,MAAK;QACL,YAAY;YACV,MAAM;QACR;QACA,UAAQ;QACR,QAAQ;YAAE,GAAG;QAAK;QAClB,SAAS;YACP;gBACE,OAAO;gBACP,OAAO,IACE,WAAP,GACE,KAAC;;0CACC,KAAC7C,WAAW,IAAI;;oCAAC;oCACH,CAAC,CAAC,EAAEwB,KAAK,KAAK,CAAC,CAAC,CAAC;;;0CAE/B,IAACT,SAAOA;gCAAC,MAAK;;0CACd,KAACC,SAAOA;gCACN,qBACE,KAACjB,OAAKA;oCAAC,WAAU;;sDACf,KAACC,WAAW,IAAI;4CAAC,OAAO;gDAAE,OAAO;4CAAU;;gDAAG;gDACzB0D;;;sDAErB,KAAC1D,WAAW,IAAI;4CAAC,OAAO;gDAAE,OAAO;4CAAU;;gDAAG;gDAC5BkD,WAAW,MAAM;;;;;;kDAKvC,KAAClD,WAAW,IAAI;wCACd,MAAK;wCACL,OAAO;4CAAE,UAAU;4CAAI,YAAY;4CAAK,aAAa;wCAAE;;4CAEtD0D;4CAAW;4CAAER,WAAW,MAAM;;;kDAEjC,IAAChC,oBAAkBA,CAAAA;;;;;gBAK3B,gBAAe,EACb4C,eAAe,EACfxB,YAAY,EACZC,OAAO,EACPE,YAAY,EACb;oBACC,OAAO,WAAP,GACE,KAAC;wBACC,OAAO;4BAAE,SAAS;wBAAE;wBACpB,WAAW,CAACI,IAAMA,EAAE,eAAe;;0CAEnC,IAACkB,OAAKA;gCACJ,KAAK5B;gCACL,aAAa;gCACb,OAAOG,YAAY,CAAC,EAAE;gCACtB,UAAU,CAACO,IACTiB,gBAAgBjB,EAAE,MAAM,CAAC,KAAK,GAAG;wCAACA,EAAE,MAAM,CAAC,KAAK;qCAAC,GAAG,EAAE;gCAExD,cAAc,IACZR,aAAaC,cAA0BC;gCAEzC,OAAO;oCAAE,cAAc;oCAAG,SAAS;gCAAQ;;0CAE7C,KAACxC,OAAKA;;kDACJ,IAACiE,QAAMA;wCACL,MAAK;wCACL,SAAS,IACP3B,aAAaC,cAA0BC;wCAEzC,oBAAM,IAAC0B,gBAAcA,CAAAA;wCACrB,MAAK;wCACL,OAAO;4CAAE,OAAO;wCAAG;kDACpB;;kDAGD,IAACD,QAAMA;wCACL,SAAS;4CACP,IAAIvB,cACFD,YAAYC;4CAEdqB,gBAAgB,EAAE;4CAClBzB,aAAa,EAAE,EAAEE;wCACnB;wCACA,MAAK;wCACL,OAAO;4CAAE,OAAO;wCAAG;kDACpB;;;;;;gBAMT;gBACA,cAAc;gBACd,YAAY,CAAC2B,WAAAA,WAAAA,GACX,KAACnE,OAAKA;;0CACJ,IAACC,WAAW,IAAI;gCACd,MAAMiC,aAAad,SAAY;gCAC/B,OAAO;oCAAE,YAAY;gCAAI;0CAExBc,cAAc;;0CAEjB,IAACgC,gBAAcA;gCACb,OAAO;oCAAE,OAAOC,WAAWC,MAAM,IAAI,GAAGhD;gCAAU;;;;gBAIxD,4BAA4B,CAACiD;oBAC3B,IAAIA,SACFC,WAAW,IAAMlC,YAAY,OAAO,EAAE,SAAS;gBAEnD;gBACA,UAASd,CAAC,EAAExB,CAAC;oBACX,OAAOmD,YAAYnD,GAAG,KAAK,CAAC,OAAO,CAACwB,KAAe;gBACrD;gBACA,QAAQ,CAACzB,IAAIC;oBACX,MAAM,EAAEyE,KAAK,EAAEC,aAAa,EAAE,GAAGvB,YAAYnD;oBAC7C,OAAO,WAAP,GACE,KAACE,OAAKA;;0CACJ,IAACiB,SAAOA;gCAAC,OAAOnB,EAAE,IAAI;0CACpB,kBAACG,WAAW,IAAI;oCAAC,UAAU;wCAAE,MAAMH,EAAE,IAAI;oCAAC;8CACvCyE;;;4BAGJC,gBAAgB,WAAhBA,GAAgB,IAACC,KAAGA;gCAAC,OAAM;0CAAU;iCAAqB;0CAC3D,IAACC,mBAAiBA;gCAAC,MAAMnD,cAAczB;;;;gBAG7C;YACF;YACAO,iCACE,WACAC,eACAC;YAEFF,iCACE,YACAC,eACAC;YAEF;gBACE,OAAO;gBACP,OAAO;gBACP,QAAQ,CAACV,IAAIC,IACJ,WAAP,GACE,IAACE,OAAKA;wBAAC,WAAU;wBAAW,OAAO;4BAAE,UAAU;wBAAI;kCACjD,kBAAC2E,aAAWA;4BACV,MAAK;4BACL,MAAM7E,EAAE,IAAI;4BACZ,MAAM;gCACJ;oCACE,UACE4B,SAAS,aAAa,CAAC5B,EAAE,QAAQ,EAAE,GAAa,EAC5C;oCACN,SACE6B,QAAQ,aAAa,CAAC7B,EAAE,OAAO,EAAE,GAAa,EAAE;oCAClD,OAAO;gCACT;gCACA;oCACE,UACE4B,SAAS,aAAa,CAAC5B,EAAE,QAAQ,EAAE,GAAa,EAC5C;oCACN,SACE6B,QAAQ,aAAa,CAAC7B,EAAE,OAAO,EAAE,GAAa,EAC1C;oCACN,OAAO;gCACT;gCACA;oCACE,UACE4B,SAAS,aAAa,CAAC5B,EAAE,QAAQ,EAAE,GAAa,EAC5C;oCACN,SACE6B,QAAQ,aAAa,CAAC7B,EAAE,OAAO,EAAE,GAAa,EAC1C;oCACN,OAAO;gCACT;6BACD;;;YAKX;SACD;;AAGP"}
@@ -3,7 +3,8 @@ import { type SetStateAction, type Dispatch } from 'react';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import './i18n/index.js';
5
5
  export declare const useI18n: typeof useTranslation;
6
- export declare function useRuleIndexNavigate(code: string, link?: string | undefined): () => void;
6
+ export declare function getSafeExternalUrl(link?: string): string | undefined;
7
+ export declare function useRuleIndexNavigate(code: string, link?: string): () => void;
7
8
  export declare function useUrlQuery(): Record<string, string | undefined>;
8
9
  export declare function useLoading(defaultLoading?: boolean): {
9
10
  loading: boolean;
@@ -9,6 +9,10 @@ import { theme } from "antd";
9
9
  import "./i18n/index.mjs";
10
10
  import { setLocaleToStorage } from "./storage.mjs";
11
11
  const route = Client.RsdoctorClientRoutes.RuleIndex;
12
+ const safeExternalProtocols = new Set([
13
+ 'http:',
14
+ 'https:'
15
+ ]);
12
16
  const useI18n = ()=>{
13
17
  const { i18n, ...rest } = useTranslation();
14
18
  return {
@@ -24,10 +28,20 @@ const useI18n = ()=>{
24
28
  }
25
29
  };
26
30
  };
31
+ function getSafeExternalUrl(link) {
32
+ if (!link) return;
33
+ try {
34
+ const url = new URL(link);
35
+ return safeExternalProtocols.has(url.protocol) ? url.href : void 0;
36
+ } catch {
37
+ return;
38
+ }
39
+ }
27
40
  function useRuleIndexNavigate(code, link) {
28
41
  const navigate = useNavigate();
29
- if (link) return ()=>window.open(link, '__blank');
42
+ const safeLink = getSafeExternalUrl(link);
30
43
  return ()=>{
44
+ if (safeLink) return void window.open(safeLink, '_blank', 'noopener,noreferrer');
31
45
  navigate(`${route}?${Rule.RsdoctorRuleClientConstant.UrlQueryForErrorCode}=${code}`);
32
46
  };
33
47
  }
@@ -236,6 +250,6 @@ const useThemeToken = ()=>{
236
250
  const { token } = theme.useToken();
237
251
  return token;
238
252
  };
239
- export { useBundleAlertsByErrors, useBundleAlertsByManifest, useChunkGraphByManifest, useCloudManifestUrlByManifest, useCompileAlertsByErrors, useConfigOutputFileNameByManifest, useDetectIfCloudIdeEnv, useDuplicatePackagesByErrors, useDuplicatePackagesByManifest, useElementSize, useErrorsByManifest, useHashByManifest, useI18n, useLoading, useModuleGraph, useModuleGraphByManifest, usePackageGraphByManifest, usePersistedState, useProjectRootByManifest, useRuleIndexNavigate, useThemeToken, useUniqModules, useUniqModulesByManifest, useUrlQuery, useWebpackConfigurationByConfigs, useWindowWidth };
253
+ export { getSafeExternalUrl, useBundleAlertsByErrors, useBundleAlertsByManifest, useChunkGraphByManifest, useCloudManifestUrlByManifest, useCompileAlertsByErrors, useConfigOutputFileNameByManifest, useDetectIfCloudIdeEnv, useDuplicatePackagesByErrors, useDuplicatePackagesByManifest, useElementSize, useErrorsByManifest, useHashByManifest, useI18n, useLoading, useModuleGraph, useModuleGraphByManifest, usePackageGraphByManifest, usePersistedState, useProjectRootByManifest, useRuleIndexNavigate, useThemeToken, useUniqModules, useUniqModulesByManifest, useUrlQuery, useWebpackConfigurationByConfigs, useWindowWidth };
240
254
 
241
255
  //# sourceMappingURL=hooks.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils/hooks.mjs","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import { Algorithm } from '@rsdoctor/utils/common';\nimport { Client, Manifest, Rule, SDK } from '@rsdoctor/types';\nimport { uniqBy, defaults, throttle } from 'es-toolkit/compat';\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useCallback,\n type SetStateAction,\n type Dispatch,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate, useLocation } from 'react-router-dom';\nimport parse from 'url-parse';\nimport { theme } from 'antd';\n\nimport './i18n';\nimport { Language } from '../constants';\nimport { setLocaleToStorage } from './storage';\n\nconst route = Client.RsdoctorClientRoutes.RuleIndex;\n\nexport const useI18n: typeof useTranslation = () => {\n const { i18n, ...rest } = useTranslation();\n\n return {\n ...rest,\n i18n: {\n ...i18n,\n changeLanguage(lng, callback) {\n return i18n.changeLanguage(lng, (error, t) => {\n if (!error) {\n setLocaleToStorage(lng as Language);\n }\n if (callback) {\n callback(error, t);\n }\n });\n },\n },\n };\n};\n\nexport function useRuleIndexNavigate(code: string, link?: string | undefined) {\n const navigate = useNavigate();\n\n if (link) {\n return () => window.open(link, '__blank');\n }\n\n return () => {\n navigate(\n `${route}?${Rule.RsdoctorRuleClientConstant.UrlQueryForErrorCode}=${code}`,\n );\n };\n}\n\nexport function useUrlQuery() {\n const search = useLocation().search || location.search;\n\n return useMemo(() => parse(search, true).query, [search]);\n}\n\nexport function useLoading(defaultLoading = false) {\n const [loading, setLoading] = useState<boolean>(defaultLoading);\n\n return {\n loading,\n setLoading,\n async withLoading(\n func: (...args: unknown[]) => Promise<unknown> | unknown,\n ) {\n try {\n setLoading(true);\n await func();\n } finally {\n setLoading(false);\n }\n },\n };\n}\n\nexport function useProjectRootByManifest(manifest: Manifest.RsdoctorManifest) {\n return manifest.data.root;\n}\n\nexport function useHashByManifest(manifest: Manifest.RsdoctorManifest) {\n return manifest.data.hash;\n}\n\nexport function useCloudManifestUrlByManifest(\n manifest:\n | Manifest.RsdoctorManifest\n | Manifest.RsdoctorManifestWithShardingFiles\n | void,\n) {\n if (!manifest) return;\n}\n\nfunction ensurePlainObject<T extends object>(value: T, dfts: T): T {\n if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n return dfts;\n }\n return defaults(value, dfts);\n }\n\n return dfts;\n}\n\nexport function useChunkGraphByManifest(manifest: Manifest.RsdoctorManifest) {\n const prev = manifest.data.chunkGraph;\n if (typeof prev === 'string') {\n manifest.data.chunkGraph = JSON.parse(\n Algorithm.decompressText(prev as string),\n );\n }\n\n return ensurePlainObject(manifest.data.chunkGraph, {\n assets: [],\n chunks: [],\n entrypoints: [],\n });\n}\n\nexport function useConfigOutputFileNameByManifest(\n manifest: Manifest.RsdoctorManifest,\n) {\n if (\n typeof manifest.data.configs?.[0]?.config?.output?.filename === 'string'\n ) {\n return manifest.data.configs?.[0]?.config?.output?.filename;\n }\n return '';\n}\n\nexport function useModuleGraphByManifest(manifest: Manifest.RsdoctorManifest) {\n const prev = manifest.data.moduleGraph;\n if (typeof prev === 'string') {\n manifest.data.moduleGraph = JSON.parse(\n Algorithm.decompressText(prev as string),\n );\n }\n\n return ensurePlainObject(manifest.data.moduleGraph, {\n dependencies: [],\n modules: [],\n moduleGraphModules: [],\n exports: [],\n sideEffects: [],\n variables: [],\n });\n}\n\nexport function useModuleGraph(moduleGraph: SDK.ModuleGraphData) {\n const prev = moduleGraph;\n if (typeof prev === 'string') {\n moduleGraph = JSON.parse(Algorithm.decompressText(prev as string));\n }\n\n return ensurePlainObject(moduleGraph, {\n dependencies: [],\n modules: [],\n moduleGraphModules: [],\n exports: [],\n sideEffects: [],\n variables: [],\n });\n}\n\nexport function usePackageGraphByManifest(manifest: Manifest.RsdoctorManifest) {\n const prev = manifest.data.packageGraph;\n if (typeof prev === 'string') {\n manifest.data.packageGraph = JSON.parse(\n Algorithm.decompressText(prev as string),\n );\n }\n return ensurePlainObject(manifest.data.packageGraph, {\n packages: [],\n dependencies: [],\n });\n}\n\nexport function useUniqModulesByManifest(manifest: Manifest.RsdoctorManifest) {\n return uniqBy(useModuleGraphByManifest(manifest).modules, (e) => e.path);\n}\n\nexport function useUniqModules(modules: SDK.ModuleData[]) {\n return uniqBy(modules, (e) => e.path);\n}\n\nexport function useErrorsByManifest(manifest: Manifest.RsdoctorManifest) {\n const prev = manifest.data.errors;\n if (typeof prev === 'string') {\n manifest.data.errors = JSON.parse(Algorithm.decompressText(prev as string));\n }\n return manifest.data.errors || [];\n}\n\nexport function useBundleAlertsByManifest(manifest: Manifest.RsdoctorManifest) {\n const errors = useErrorsByManifest(manifest);\n return useBundleAlertsByErrors(errors);\n}\n\nexport function useDuplicatePackagesByManifest(\n manifest: Manifest.RsdoctorManifest,\n): Rule.PackageRelationDiffRuleStoreData[] {\n const alerts = useBundleAlertsByManifest(manifest);\n return useDuplicatePackagesByErrors(alerts);\n}\n\nexport function useCompileAlertsByErrors(\n errors: Manifest.RsdoctorManifestData['errors'],\n) {\n if (Array.isArray(errors)) {\n return errors.filter(\n (e) =>\n e.category === Rule.RuleMessageCategory.Compile &&\n e.code !== Rule.RuleMessageCodeEnumerated.Overlay,\n );\n }\n return [];\n}\n\nexport function useBundleAlertsByErrors(\n errors: Manifest.RsdoctorManifestData['errors'],\n) {\n if (Array.isArray(errors)) {\n return errors.filter(\n (e) =>\n e.category === Rule.RuleMessageCategory.Bundle &&\n e.code !== Rule.RuleMessageCodeEnumerated.Overlay,\n );\n }\n return [];\n}\n\nexport function useDuplicatePackagesByErrors(\n errors: Manifest.RsdoctorManifestData['errors'],\n) {\n return useBundleAlertsByErrors(errors).filter(\n (e) => e.code === Rule.RuleErrorMap.E1001.code,\n ) as Rule.PackageRelationDiffRuleStoreData[];\n}\n\nexport function useWebpackConfigurationByConfigs(configs: SDK.ConfigData = []) {\n if (Array.isArray(configs)) {\n return configs.find((e) => e.name === 'webpack' || e.name === 'rspack');\n }\n return null;\n}\n\nexport function useDetectIfCloudIdeEnv() {\n if (\n window.location.protocol === 'https:' &&\n window.location.href.indexOf('ide-proxy') > 0\n ) {\n return true;\n }\n return false;\n}\n\nexport function useWindowWidth() {\n const [windowWidth, setWindowWidth] = useState(window.innerWidth);\n\n useEffect(() => {\n const handleResize = () => setWindowWidth(window.innerWidth);\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return windowWidth;\n}\n\nexport function useElementSize<T extends HTMLElement = HTMLDivElement>() {\n const ref = useRef<T>(null);\n const [width, setWidth_] = useState(0);\n const [height, setHeight_] = useState(0);\n\n useLayoutEffect(() => {\n const $el = ref.current;\n if (!$el) return;\n const setWidth = (n: number) => setWidth_(Math.ceil(n));\n const setHeight = (n: number) => setHeight_(Math.ceil(n));\n\n const initialRect = $el.getBoundingClientRect();\n setWidth(initialRect.width);\n setHeight(initialRect.height);\n\n const onResize = throttle((entries: ResizeObserverEntry[]) => {\n const entry = entries[0];\n if (!entry) return;\n\n const borderBox = entry.borderBoxSize?.[0];\n\n if (borderBox) {\n setWidth(borderBox.inlineSize);\n setHeight(borderBox.blockSize);\n } else {\n // fallback for dead browsers\n setWidth(entry.contentRect.width);\n setHeight(entry.contentRect.height);\n }\n }, 100);\n const observer = new ResizeObserver(onResize);\n\n observer.observe($el);\n\n return () => {\n observer.disconnect();\n onResize.cancel();\n };\n }, []);\n\n return [ref, { width, height }] as const;\n}\n\nexport function usePersistedState<T>(\n baseKey: string,\n initialValue: T | (() => T),\n): [T, Dispatch<SetStateAction<T>>] {\n const NS = 'RSDOC:';\n\n const key = NS + baseKey;\n const [state, setState] = useState<T>(() => {\n try {\n const item = window.localStorage.getItem(key);\n if (item !== null) {\n return JSON.parse(item);\n }\n\n return typeof initialValue === 'function'\n ? (initialValue as () => T)()\n : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return typeof initialValue === 'function'\n ? (initialValue as () => T)()\n : initialValue;\n }\n });\n\n const setPersistedState = useCallback(\n (value: SetStateAction<T>) => {\n try {\n setState((prevState) => {\n const nextState =\n value instanceof Function\n ? (value as (prevState: T) => T)(prevState)\n : value;\n\n window.localStorage.setItem(key, JSON.stringify(nextState));\n return nextState;\n });\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key],\n );\n\n return [state, setPersistedState];\n}\n\nexport const useThemeToken = () => {\n const { token } = theme.useToken();\n return token;\n};\n"],"names":["route","Client","useI18n","i18n","rest","useTranslation","lng","callback","error","t","setLocaleToStorage","useRuleIndexNavigate","code","link","navigate","useNavigate","window","Rule","useUrlQuery","search","useLocation","location","useMemo","parse","useLoading","defaultLoading","loading","setLoading","useState","func","useProjectRootByManifest","manifest","useHashByManifest","useCloudManifestUrlByManifest","ensurePlainObject","value","dfts","Array","defaults","useChunkGraphByManifest","prev","JSON","Algorithm","useConfigOutputFileNameByManifest","useModuleGraphByManifest","useModuleGraph","moduleGraph","usePackageGraphByManifest","useUniqModulesByManifest","uniqBy","e","useUniqModules","modules","useErrorsByManifest","useBundleAlertsByManifest","errors","useBundleAlertsByErrors","useDuplicatePackagesByManifest","alerts","useDuplicatePackagesByErrors","useCompileAlertsByErrors","useWebpackConfigurationByConfigs","configs","useDetectIfCloudIdeEnv","useWindowWidth","windowWidth","setWindowWidth","useEffect","handleResize","useElementSize","ref","useRef","width","setWidth_","height","setHeight_","useLayoutEffect","$el","setWidth","n","Math","setHeight","initialRect","onResize","throttle","entries","entry","borderBox","observer","ResizeObserver","usePersistedState","baseKey","initialValue","NS","key","state","setState","item","console","setPersistedState","useCallback","prevState","nextState","Function","useThemeToken","token","theme"],"mappings":"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"}
1
+ {"version":3,"file":"utils/hooks.mjs","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import { Algorithm } from '@rsdoctor/utils/common';\nimport { Client, Manifest, Rule, SDK } from '@rsdoctor/types';\nimport { uniqBy, defaults, throttle } from 'es-toolkit/compat';\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useCallback,\n type SetStateAction,\n type Dispatch,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate, useLocation } from 'react-router-dom';\nimport parse from 'url-parse';\nimport { theme } from 'antd';\n\nimport './i18n';\nimport { Language } from '../constants';\nimport { setLocaleToStorage } from './storage';\n\nconst route = Client.RsdoctorClientRoutes.RuleIndex;\nconst safeExternalProtocols = new Set(['http:', 'https:']);\n\nexport const useI18n: typeof useTranslation = () => {\n const { i18n, ...rest } = useTranslation();\n\n return {\n ...rest,\n i18n: {\n ...i18n,\n changeLanguage(lng, callback) {\n return i18n.changeLanguage(lng, (error, t) => {\n if (!error) {\n setLocaleToStorage(lng as Language);\n }\n if (callback) {\n callback(error, t);\n }\n });\n },\n },\n };\n};\n\nexport function getSafeExternalUrl(link?: string) {\n if (!link) return;\n\n try {\n const url = new URL(link);\n return safeExternalProtocols.has(url.protocol) ? url.href : undefined;\n } catch {\n return;\n }\n}\n\nexport function useRuleIndexNavigate(code: string, link?: string) {\n const navigate = useNavigate();\n const safeLink = getSafeExternalUrl(link);\n\n return () => {\n if (safeLink) {\n window.open(safeLink, '_blank', 'noopener,noreferrer');\n return;\n }\n\n navigate(\n `${route}?${Rule.RsdoctorRuleClientConstant.UrlQueryForErrorCode}=${code}`,\n );\n };\n}\n\nexport function useUrlQuery() {\n const search = useLocation().search || location.search;\n\n return useMemo(() => parse(search, true).query, [search]);\n}\n\nexport function useLoading(defaultLoading = false) {\n const [loading, setLoading] = useState<boolean>(defaultLoading);\n\n return {\n loading,\n setLoading,\n async withLoading(\n func: (...args: unknown[]) => Promise<unknown> | unknown,\n ) {\n try {\n setLoading(true);\n await func();\n } finally {\n setLoading(false);\n }\n },\n };\n}\n\nexport function useProjectRootByManifest(manifest: Manifest.RsdoctorManifest) {\n return manifest.data.root;\n}\n\nexport function useHashByManifest(manifest: Manifest.RsdoctorManifest) {\n return manifest.data.hash;\n}\n\nexport function useCloudManifestUrlByManifest(\n manifest:\n | Manifest.RsdoctorManifest\n | Manifest.RsdoctorManifestWithShardingFiles\n | void,\n) {\n if (!manifest) return;\n}\n\nfunction ensurePlainObject<T extends object>(value: T, dfts: T): T {\n if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n return dfts;\n }\n return defaults(value, dfts);\n }\n\n return dfts;\n}\n\nexport function useChunkGraphByManifest(manifest: Manifest.RsdoctorManifest) {\n const prev = manifest.data.chunkGraph;\n if (typeof prev === 'string') {\n manifest.data.chunkGraph = JSON.parse(\n Algorithm.decompressText(prev as string),\n );\n }\n\n return ensurePlainObject(manifest.data.chunkGraph, {\n assets: [],\n chunks: [],\n entrypoints: [],\n });\n}\n\nexport function useConfigOutputFileNameByManifest(\n manifest: Manifest.RsdoctorManifest,\n) {\n if (\n typeof manifest.data.configs?.[0]?.config?.output?.filename === 'string'\n ) {\n return manifest.data.configs?.[0]?.config?.output?.filename;\n }\n return '';\n}\n\nexport function useModuleGraphByManifest(manifest: Manifest.RsdoctorManifest) {\n const prev = manifest.data.moduleGraph;\n if (typeof prev === 'string') {\n manifest.data.moduleGraph = JSON.parse(\n Algorithm.decompressText(prev as string),\n );\n }\n\n return ensurePlainObject(manifest.data.moduleGraph, {\n dependencies: [],\n modules: [],\n moduleGraphModules: [],\n exports: [],\n sideEffects: [],\n variables: [],\n });\n}\n\nexport function useModuleGraph(moduleGraph: SDK.ModuleGraphData) {\n const prev = moduleGraph;\n if (typeof prev === 'string') {\n moduleGraph = JSON.parse(Algorithm.decompressText(prev as string));\n }\n\n return ensurePlainObject(moduleGraph, {\n dependencies: [],\n modules: [],\n moduleGraphModules: [],\n exports: [],\n sideEffects: [],\n variables: [],\n });\n}\n\nexport function usePackageGraphByManifest(manifest: Manifest.RsdoctorManifest) {\n const prev = manifest.data.packageGraph;\n if (typeof prev === 'string') {\n manifest.data.packageGraph = JSON.parse(\n Algorithm.decompressText(prev as string),\n );\n }\n return ensurePlainObject(manifest.data.packageGraph, {\n packages: [],\n dependencies: [],\n });\n}\n\nexport function useUniqModulesByManifest(manifest: Manifest.RsdoctorManifest) {\n return uniqBy(useModuleGraphByManifest(manifest).modules, (e) => e.path);\n}\n\nexport function useUniqModules(modules: SDK.ModuleData[]) {\n return uniqBy(modules, (e) => e.path);\n}\n\nexport function useErrorsByManifest(manifest: Manifest.RsdoctorManifest) {\n const prev = manifest.data.errors;\n if (typeof prev === 'string') {\n manifest.data.errors = JSON.parse(Algorithm.decompressText(prev as string));\n }\n return manifest.data.errors || [];\n}\n\nexport function useBundleAlertsByManifest(manifest: Manifest.RsdoctorManifest) {\n const errors = useErrorsByManifest(manifest);\n return useBundleAlertsByErrors(errors);\n}\n\nexport function useDuplicatePackagesByManifest(\n manifest: Manifest.RsdoctorManifest,\n): Rule.PackageRelationDiffRuleStoreData[] {\n const alerts = useBundleAlertsByManifest(manifest);\n return useDuplicatePackagesByErrors(alerts);\n}\n\nexport function useCompileAlertsByErrors(\n errors: Manifest.RsdoctorManifestData['errors'],\n) {\n if (Array.isArray(errors)) {\n return errors.filter(\n (e) =>\n e.category === Rule.RuleMessageCategory.Compile &&\n e.code !== Rule.RuleMessageCodeEnumerated.Overlay,\n );\n }\n return [];\n}\n\nexport function useBundleAlertsByErrors(\n errors: Manifest.RsdoctorManifestData['errors'],\n) {\n if (Array.isArray(errors)) {\n return errors.filter(\n (e) =>\n e.category === Rule.RuleMessageCategory.Bundle &&\n e.code !== Rule.RuleMessageCodeEnumerated.Overlay,\n );\n }\n return [];\n}\n\nexport function useDuplicatePackagesByErrors(\n errors: Manifest.RsdoctorManifestData['errors'],\n) {\n return useBundleAlertsByErrors(errors).filter(\n (e) => e.code === Rule.RuleErrorMap.E1001.code,\n ) as Rule.PackageRelationDiffRuleStoreData[];\n}\n\nexport function useWebpackConfigurationByConfigs(configs: SDK.ConfigData = []) {\n if (Array.isArray(configs)) {\n return configs.find((e) => e.name === 'webpack' || e.name === 'rspack');\n }\n return null;\n}\n\nexport function useDetectIfCloudIdeEnv() {\n if (\n window.location.protocol === 'https:' &&\n window.location.href.indexOf('ide-proxy') > 0\n ) {\n return true;\n }\n return false;\n}\n\nexport function useWindowWidth() {\n const [windowWidth, setWindowWidth] = useState(window.innerWidth);\n\n useEffect(() => {\n const handleResize = () => setWindowWidth(window.innerWidth);\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return windowWidth;\n}\n\nexport function useElementSize<T extends HTMLElement = HTMLDivElement>() {\n const ref = useRef<T>(null);\n const [width, setWidth_] = useState(0);\n const [height, setHeight_] = useState(0);\n\n useLayoutEffect(() => {\n const $el = ref.current;\n if (!$el) return;\n const setWidth = (n: number) => setWidth_(Math.ceil(n));\n const setHeight = (n: number) => setHeight_(Math.ceil(n));\n\n const initialRect = $el.getBoundingClientRect();\n setWidth(initialRect.width);\n setHeight(initialRect.height);\n\n const onResize = throttle((entries: ResizeObserverEntry[]) => {\n const entry = entries[0];\n if (!entry) return;\n\n const borderBox = entry.borderBoxSize?.[0];\n\n if (borderBox) {\n setWidth(borderBox.inlineSize);\n setHeight(borderBox.blockSize);\n } else {\n // fallback for dead browsers\n setWidth(entry.contentRect.width);\n setHeight(entry.contentRect.height);\n }\n }, 100);\n const observer = new ResizeObserver(onResize);\n\n observer.observe($el);\n\n return () => {\n observer.disconnect();\n onResize.cancel();\n };\n }, []);\n\n return [ref, { width, height }] as const;\n}\n\nexport function usePersistedState<T>(\n baseKey: string,\n initialValue: T | (() => T),\n): [T, Dispatch<SetStateAction<T>>] {\n const NS = 'RSDOC:';\n\n const key = NS + baseKey;\n const [state, setState] = useState<T>(() => {\n try {\n const item = window.localStorage.getItem(key);\n if (item !== null) {\n return JSON.parse(item);\n }\n\n return typeof initialValue === 'function'\n ? (initialValue as () => T)()\n : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return typeof initialValue === 'function'\n ? (initialValue as () => T)()\n : initialValue;\n }\n });\n\n const setPersistedState = useCallback(\n (value: SetStateAction<T>) => {\n try {\n setState((prevState) => {\n const nextState =\n value instanceof Function\n ? (value as (prevState: T) => T)(prevState)\n : value;\n\n window.localStorage.setItem(key, JSON.stringify(nextState));\n return nextState;\n });\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key],\n );\n\n return [state, setPersistedState];\n}\n\nexport const useThemeToken = () => {\n const { token } = theme.useToken();\n return token;\n};\n"],"names":["route","Client","safeExternalProtocols","Set","useI18n","i18n","rest","useTranslation","lng","callback","error","t","setLocaleToStorage","getSafeExternalUrl","link","url","URL","undefined","useRuleIndexNavigate","code","navigate","useNavigate","safeLink","window","Rule","useUrlQuery","search","useLocation","location","useMemo","parse","useLoading","defaultLoading","loading","setLoading","useState","func","useProjectRootByManifest","manifest","useHashByManifest","useCloudManifestUrlByManifest","ensurePlainObject","value","dfts","Array","defaults","useChunkGraphByManifest","prev","JSON","Algorithm","useConfigOutputFileNameByManifest","useModuleGraphByManifest","useModuleGraph","moduleGraph","usePackageGraphByManifest","useUniqModulesByManifest","uniqBy","e","useUniqModules","modules","useErrorsByManifest","useBundleAlertsByManifest","errors","useBundleAlertsByErrors","useDuplicatePackagesByManifest","alerts","useDuplicatePackagesByErrors","useCompileAlertsByErrors","useWebpackConfigurationByConfigs","configs","useDetectIfCloudIdeEnv","useWindowWidth","windowWidth","setWindowWidth","useEffect","handleResize","useElementSize","ref","useRef","width","setWidth_","height","setHeight_","useLayoutEffect","$el","setWidth","n","Math","setHeight","initialRect","onResize","throttle","entries","entry","borderBox","observer","ResizeObserver","usePersistedState","baseKey","initialValue","NS","key","state","setState","item","console","setPersistedState","useCallback","prevState","nextState","Function","useThemeToken","token","theme"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  export declare function isJsDataUrl(path: string): boolean;
2
2
  export declare function getManifestUrlFromUrlQuery(): string | void;
3
3
  export declare function getEnableRoutesFromUrlQuery(): string[] | void;
4
- export declare function changeOrigin(origin: string): string;
4
+ export declare function getSafeReportOrigin(origin: string): string | undefined;
5
+ export declare function changeOrigin(origin: string): string | undefined;
6
+ export declare function getSafeReportUrl(path: string, baseUrl: string): string | undefined;
5
7
  export declare function getSharingUrl(manifestCloudUrl: string, enableRoutes?: string[]): string;
6
8
  export declare function getDemoUrl(): string | null;
7
9
  export declare const getShortPath: (path: string) => string;
@@ -43,16 +43,52 @@ function getEnableRoutesFromUrlQuery() {
43
43
  console.warn('Failed to parse enableRoutes from URL query:', err);
44
44
  }
45
45
  }
46
+ function getSafeReportOrigin(origin) {
47
+ try {
48
+ const url = new URL(origin);
49
+ return [
50
+ 'http:',
51
+ 'https:'
52
+ ].includes(url.protocol) ? url.origin : void 0;
53
+ } catch {
54
+ return;
55
+ }
56
+ }
46
57
  function changeOrigin(origin) {
58
+ const safeOrigin = getSafeReportOrigin(origin);
59
+ if (!safeOrigin) return;
47
60
  const url = url_parse(location.href, true);
48
- const newUrl = url_parse(origin, true);
61
+ const newUrl = url_parse(safeOrigin, true);
49
62
  setUploaderHash(url);
50
- url.set('origin', origin);
63
+ url.set('origin', safeOrigin);
51
64
  url.set('protocol', newUrl.protocol);
52
65
  url.set('host', newUrl.host);
53
66
  url.set('port', newUrl.port);
54
67
  return url.toString();
55
68
  }
69
+ function getSafeReportUrl(path, baseUrl) {
70
+ try {
71
+ const url = new URL(path, baseUrl);
72
+ const base = new URL(baseUrl);
73
+ if ('file:' === base.protocol) {
74
+ const hasControlCharacter = [
75
+ ...path
76
+ ].some((char)=>{
77
+ const code = char.charCodeAt(0);
78
+ return code < 0x20 || 0x7f === code;
79
+ });
80
+ const isRelativePath = path.trimStart() === path && !path.startsWith('/') && !path.includes('\\') && !/^[a-z][a-z\d+.-]*:/i.test(path) && !hasControlCharacter;
81
+ return 'file:' === url.protocol && url.host === base.host && isRelativePath ? url.href : void 0;
82
+ }
83
+ if (![
84
+ 'http:',
85
+ 'https:'
86
+ ].includes(url.protocol) || url.origin !== base.origin) return;
87
+ return url.href;
88
+ } catch {
89
+ return;
90
+ }
91
+ }
56
92
  function getSharingUrl(manifestCloudUrl, enableRoutes) {
57
93
  const url = url_parse(location.href, true);
58
94
  setDefaultUrl(url);
@@ -80,6 +116,6 @@ const getShortPath = (path)=>{
80
116
  function isDef(data) {
81
117
  return null != data;
82
118
  }
83
- export { changeOrigin, getDemoUrl, getEnableRoutesFromUrlQuery, getManifestUrlFromUrlQuery, getSharingUrl, getShortPath, isDef, isJsDataUrl };
119
+ export { changeOrigin, getDemoUrl, getEnableRoutesFromUrlQuery, getManifestUrlFromUrlQuery, getSafeReportOrigin, getSafeReportUrl, getSharingUrl, getShortPath, isDef, isJsDataUrl };
84
120
 
85
121
  //# sourceMappingURL=url.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils/url.mjs","sources":["../../src/utils/url.ts"],"sourcesContent":["import parse from 'url-parse';\nimport { Constants, Client } from '@rsdoctor/types';\n\nfunction setDefaultUrl(url: parse<Record<string, string | undefined>>) {\n if (process.env.NODE_ENV !== 'development') {\n const uri = parse(Constants.RsdoctorClientUrl, true);\n url.set('origin', uri.origin);\n url.set('protocol', uri.protocol);\n url.set('host', uri.host);\n url.set('pathname', uri.pathname);\n }\n}\n\nfunction setUploaderHash(url: parse<Record<string, string | undefined>>) {\n if (url.hash.endsWith(Client.RsdoctorClientRoutes.Uploader)) {\n url.set('hash', Client.RsdoctorClientRoutes.Overall);\n }\n}\n\nexport function isJsDataUrl(path: string) {\n return path.startsWith('data:text/javascript;');\n}\n\nexport function getManifestUrlFromUrlQuery(): string | void {\n const { query } = parse(location.href, true);\n const url = query[Client.RsdoctorClientUrlQuery.ManifestFile];\n if (url) {\n return decodeURIComponent(url);\n }\n}\n\nexport function getEnableRoutesFromUrlQuery(): string[] | void {\n const { query } = parse(location.href, true);\n let enableRoutesStr = query[Client.RsdoctorClientUrlQuery.EnableRoutes];\n\n if (!enableRoutesStr && location.hash) {\n const hashUrl = parse(location.hash, true);\n enableRoutesStr = hashUrl.query[Client.RsdoctorClientUrlQuery.EnableRoutes];\n }\n\n // If still not found, try manual parsing of hash fragment\n if (!enableRoutesStr && location.hash) {\n const hashFragment = location.hash;\n const queryIndex = hashFragment.indexOf('?');\n if (queryIndex !== -1) {\n const queryString = hashFragment.substring(queryIndex + 1);\n const urlParams = new URLSearchParams(queryString);\n enableRoutesStr =\n urlParams.get(Client.RsdoctorClientUrlQuery.EnableRoutes) || undefined;\n }\n }\n\n if (enableRoutesStr) {\n try {\n const result = JSON.parse(decodeURIComponent(enableRoutesStr));\n return result;\n } catch (err) {\n console.warn('Failed to parse enableRoutes from URL query:', err);\n return undefined;\n }\n }\n return undefined;\n}\n\nexport function changeOrigin(origin: string) {\n const url = parse(location.href, true);\n const newUrl = parse(origin, true);\n\n setUploaderHash(url);\n\n url.set('origin', origin);\n url.set('protocol', newUrl.protocol);\n url.set('host', newUrl.host);\n url.set('port', newUrl.port);\n\n return url.toString();\n}\n\nexport function getSharingUrl(\n manifestCloudUrl: string,\n enableRoutes?: string[],\n) {\n const url = parse(location.href, true);\n\n setDefaultUrl(url);\n setUploaderHash(url);\n\n const query: Record<string, string> = {\n ...url.query,\n [Client.RsdoctorClientUrlQuery.ManifestFile]: manifestCloudUrl,\n };\n\n // Add enableRoutes to query if provided\n if (enableRoutes && enableRoutes.length > 0) {\n query[Client.RsdoctorClientUrlQuery.EnableRoutes] =\n JSON.stringify(enableRoutes);\n }\n\n url.set('query', query);\n\n return url.toString();\n}\n\nexport function getDemoUrl() {\n if (process.env.OFFICIAL_DEMO_MANIFEST_PATH) {\n return getSharingUrl(process.env.OFFICIAL_DEMO_MANIFEST_PATH);\n }\n return null;\n}\n\nexport const getShortPath = (path: string) => {\n if (path?.indexOf('node_modules') >= 0) {\n const pathArr = path.split('node_modules');\n return `node_modules${pathArr[pathArr.length - 1]}`;\n }\n if (path?.length) {\n return `${path?.split('/').slice(-4).join('/')}`;\n }\n return path;\n};\n\nexport function isDef<E = unknown>(data: E): data is NonNullable<E> {\n return data !== undefined && data !== null;\n}\n"],"names":["setDefaultUrl","url","process","uri","parse","Constants","setUploaderHash","Client","isJsDataUrl","path","getManifestUrlFromUrlQuery","query","location","decodeURIComponent","getEnableRoutesFromUrlQuery","enableRoutesStr","hashUrl","hashFragment","queryIndex","queryString","urlParams","URLSearchParams","undefined","result","JSON","err","console","changeOrigin","origin","newUrl","getSharingUrl","manifestCloudUrl","enableRoutes","getDemoUrl","getShortPath","pathArr","isDef","data"],"mappings":"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"}
1
+ {"version":3,"file":"utils/url.mjs","sources":["../../src/utils/url.ts"],"sourcesContent":["import parse from 'url-parse';\nimport { Constants, Client } from '@rsdoctor/types';\n\nfunction setDefaultUrl(url: parse<Record<string, string | undefined>>) {\n if (process.env.NODE_ENV !== 'development') {\n const uri = parse(Constants.RsdoctorClientUrl, true);\n url.set('origin', uri.origin);\n url.set('protocol', uri.protocol);\n url.set('host', uri.host);\n url.set('pathname', uri.pathname);\n }\n}\n\nfunction setUploaderHash(url: parse<Record<string, string | undefined>>) {\n if (url.hash.endsWith(Client.RsdoctorClientRoutes.Uploader)) {\n url.set('hash', Client.RsdoctorClientRoutes.Overall);\n }\n}\n\nexport function isJsDataUrl(path: string) {\n return path.startsWith('data:text/javascript;');\n}\n\nexport function getManifestUrlFromUrlQuery(): string | void {\n const { query } = parse(location.href, true);\n const url = query[Client.RsdoctorClientUrlQuery.ManifestFile];\n if (url) {\n return decodeURIComponent(url);\n }\n}\n\nexport function getEnableRoutesFromUrlQuery(): string[] | void {\n const { query } = parse(location.href, true);\n let enableRoutesStr = query[Client.RsdoctorClientUrlQuery.EnableRoutes];\n\n if (!enableRoutesStr && location.hash) {\n const hashUrl = parse(location.hash, true);\n enableRoutesStr = hashUrl.query[Client.RsdoctorClientUrlQuery.EnableRoutes];\n }\n\n // If still not found, try manual parsing of hash fragment\n if (!enableRoutesStr && location.hash) {\n const hashFragment = location.hash;\n const queryIndex = hashFragment.indexOf('?');\n if (queryIndex !== -1) {\n const queryString = hashFragment.substring(queryIndex + 1);\n const urlParams = new URLSearchParams(queryString);\n enableRoutesStr =\n urlParams.get(Client.RsdoctorClientUrlQuery.EnableRoutes) || undefined;\n }\n }\n\n if (enableRoutesStr) {\n try {\n const result = JSON.parse(decodeURIComponent(enableRoutesStr));\n return result;\n } catch (err) {\n console.warn('Failed to parse enableRoutes from URL query:', err);\n return undefined;\n }\n }\n return undefined;\n}\n\nexport function getSafeReportOrigin(origin: string) {\n try {\n const url = new URL(origin);\n\n return ['http:', 'https:'].includes(url.protocol) ? url.origin : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function changeOrigin(origin: string) {\n const safeOrigin = getSafeReportOrigin(origin);\n if (!safeOrigin) return undefined;\n\n const url = parse(location.href, true);\n const newUrl = parse(safeOrigin, true);\n\n setUploaderHash(url);\n\n url.set('origin', safeOrigin);\n url.set('protocol', newUrl.protocol);\n url.set('host', newUrl.host);\n url.set('port', newUrl.port);\n\n return url.toString();\n}\n\nexport function getSafeReportUrl(path: string, baseUrl: string) {\n try {\n const url = new URL(path, baseUrl);\n const base = new URL(baseUrl);\n\n if (base.protocol === 'file:') {\n const hasControlCharacter = [...path].some((char) => {\n const code = char.charCodeAt(0);\n return code < 0x20 || code === 0x7f;\n });\n const isRelativePath =\n path.trimStart() === path &&\n !path.startsWith('/') &&\n !path.includes('\\\\') &&\n !/^[a-z][a-z\\d+.-]*:/i.test(path) &&\n !hasControlCharacter;\n\n return url.protocol === 'file:' &&\n url.host === base.host &&\n isRelativePath\n ? url.href\n : undefined;\n }\n\n if (\n !['http:', 'https:'].includes(url.protocol) ||\n url.origin !== base.origin\n ) {\n return undefined;\n }\n\n return url.href;\n } catch {\n return undefined;\n }\n}\n\nexport function getSharingUrl(\n manifestCloudUrl: string,\n enableRoutes?: string[],\n) {\n const url = parse(location.href, true);\n\n setDefaultUrl(url);\n setUploaderHash(url);\n\n const query: Record<string, string> = {\n ...url.query,\n [Client.RsdoctorClientUrlQuery.ManifestFile]: manifestCloudUrl,\n };\n\n // Add enableRoutes to query if provided\n if (enableRoutes && enableRoutes.length > 0) {\n query[Client.RsdoctorClientUrlQuery.EnableRoutes] =\n JSON.stringify(enableRoutes);\n }\n\n url.set('query', query);\n\n return url.toString();\n}\n\nexport function getDemoUrl() {\n if (process.env.OFFICIAL_DEMO_MANIFEST_PATH) {\n return getSharingUrl(process.env.OFFICIAL_DEMO_MANIFEST_PATH);\n }\n return null;\n}\n\nexport const getShortPath = (path: string) => {\n if (path?.indexOf('node_modules') >= 0) {\n const pathArr = path.split('node_modules');\n return `node_modules${pathArr[pathArr.length - 1]}`;\n }\n if (path?.length) {\n return `${path?.split('/').slice(-4).join('/')}`;\n }\n return path;\n};\n\nexport function isDef<E = unknown>(data: E): data is NonNullable<E> {\n return data !== undefined && data !== null;\n}\n"],"names":["setDefaultUrl","url","process","uri","parse","Constants","setUploaderHash","Client","isJsDataUrl","path","getManifestUrlFromUrlQuery","query","location","decodeURIComponent","getEnableRoutesFromUrlQuery","enableRoutesStr","hashUrl","hashFragment","queryIndex","queryString","urlParams","URLSearchParams","undefined","result","JSON","err","console","getSafeReportOrigin","origin","URL","changeOrigin","safeOrigin","newUrl","getSafeReportUrl","baseUrl","base","hasControlCharacter","char","code","isRelativePath","getSharingUrl","manifestCloudUrl","enableRoutes","getDemoUrl","getShortPath","pathArr","isDef","data"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdoctor/components",
3
- "version": "1.6.3",
3
+ "version": "1.6.5",
4
4
  "license": "MIT",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": {
@@ -74,9 +74,9 @@
74
74
  "react-markdown": "^10.1.0",
75
75
  "socket.io-client": "4.8.1",
76
76
  "url-parse": "1.5.10",
77
- "@rsdoctor/graph": "1.6.3",
78
- "@rsdoctor/types": "1.6.3",
79
- "@rsdoctor/utils": "1.6.3"
77
+ "@rsdoctor/graph": "1.6.5",
78
+ "@rsdoctor/utils": "1.6.5",
79
+ "@rsdoctor/types": "1.6.5"
80
80
  },
81
81
  "peerDependencies": {
82
82
  "react": ">=19",