react-doctor 0.9.12-dev.0b670aa → 0.9.12-dev.1d3e4a6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +27 -0
  2. package/dist/active-run-trace-dlIZeEvb.js +18 -0
  3. package/dist/active-scan-abort-registry-DwG6tSPy.js +28 -0
  4. package/dist/{build-section-divider-CJ7k-BvF.js → build-section-divider-8MOZLIsm.js} +8 -22
  5. package/dist/{ci-Dannv-cF.js → ci-BkncxruQ.js} +12 -11
  6. package/dist/cli.js +76 -24
  7. package/dist/{design-9x5DReyL.js → design-cWsjx19m.js} +4 -4
  8. package/dist/{devtools-D8NTVj81.js → devtools-BiC-AP3B.js} +3 -3
  9. package/dist/{exit-gracefully-ti2wONpM.js → exit-gracefully-B9tEGAKH.js} +15 -9
  10. package/dist/get-east-asian-width-Cglw13G7.js +444 -0
  11. package/dist/{report-error-BlOAg03W.js → handle-error-wbMFUdUK.js} +6 -61
  12. package/dist/index.d.ts +34 -2
  13. package/dist/index.js +334 -205
  14. package/dist/{inspect-C3itFiEW.js → inspect-Bz2rayph.js} +17 -16
  15. package/dist/{install-CjIJL6S5.js → install-DdckCi3Z.js} +9 -8
  16. package/dist/{install-doctor-script-0sdZ4SY8.js → install-doctor-script-jOg4qbkK.js} +7 -449
  17. package/dist/{install-github-workflow-DQ8_lhAW.js → install-github-workflow-C5OkC7nA.js} +6 -6
  18. package/dist/{install-react-doctor-DRG8hdL4.js → install-react-doctor-W8P-PVpX.js} +8 -8
  19. package/dist/{run-scan-app-Cgn4ELJF.js → jsx-runtime-0eiF0jis.js} +280 -2769
  20. package/dist/{print-branded-header-Dc1KdrcV.js → print-branded-header-_cUJmAUD.js} +4 -4
  21. package/dist/project-analysis-worker.js +3 -3
  22. package/dist/prompt-runtime-scan-url-CV2AUqdk.js +240 -0
  23. package/dist/{read-object-file-rblJxHxN.js → read-object-file-DOfcpaZX.js} +4 -4
  24. package/dist/{record-metric-Dgg2b2LG.js → record-metric-BA5ry-7d.js} +338 -188
  25. package/dist/report-error-CFe3r9gh.js +64 -0
  26. package/dist/{report-workflow-result-Dp4dCUxw.js → report-workflow-result-BoDN1Z77.js} +5 -5
  27. package/dist/{resolve-scope-CbeXgE9z.js → resolve-scope-BVNh_icv.js} +6 -6
  28. package/dist/{rules-ClDrNCc3.js → rules-CyIHtrnI.js} +6 -6
  29. package/dist/run-scan-app-BhUlnxaV.js +2509 -0
  30. package/dist/runtime-scan/browser-probe.iife.js +855 -0
  31. package/dist/runtime-scan-CUt6T5J3.js +770 -0
  32. package/dist/sanitize-runtime-url-CWANxE3L.js +76 -0
  33. package/dist/{scan-Caa_ogFB.js → scan-DU_zcchs.js} +10 -22
  34. package/dist/{should-fail-scan-gate-BGzNJApW.js → should-fail-scan-gate-CDwqCAPq.js} +23 -114
  35. package/dist/{should-skip-prompts-Bbl0ToUI.js → should-skip-prompts-B9za5uX9.js} +4 -4
  36. package/dist/should-use-tui-BR82qmYC.js +25 -0
  37. package/dist/skills/improve-threejs/SKILL.md +102 -0
  38. package/dist/skills/performance/SKILL.md +113 -0
  39. package/dist/skills/react-doctor/SKILL.md +6 -0
  40. package/dist/{unref-stdin-C7d7_3va.js → telemetry-runtime-C9dZxrK_.js} +5 -23
  41. package/dist/unref-stdin-BKT_s38a.js +12 -0
  42. package/dist/{version-Bjql-CLM.js → version-yw_bHX_4.js} +4 -4
  43. package/dist/{why-BqG2EML8.js → why-CdGev87Z.js} +4 -4
  44. package/dist/with-run-span-CCVNobt7.js +110 -0
  45. package/package.json +9 -6
@@ -1,6 +1,6 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d780b39d-0a64-509d-b08b-00fa02ba5a59")}catch(e){}}();
3
- import { Gt as highlighter, g as VERSION, kn as gen, wn as log } from "./record-metric-Dgg2b2LG.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f62d0690-4f31-5dc5-9bb6-df2bfd727803")}catch(e){}}();
3
+ import { An as gen, Kt as highlighter, Tn as log, _ as VERSION } from "./record-metric-BA5ry-7d.js";
4
4
  //#region src/cli/utils/print-branded-header.ts
5
5
  /**
6
6
  * Single branded line every command prints first when not in JSON
@@ -18,5 +18,5 @@ const printBrandedHeader = gen(function* () {
18
18
  //#endregion
19
19
  export { printBrandedHeader as t };
20
20
 
21
- //# sourceMappingURL=print-branded-header-Dc1KdrcV.js.map
22
- //# debugId=d780b39d-0a64-509d-b08b-00fa02ba5a59
21
+ //# sourceMappingURL=print-branded-header-_cUJmAUD.js.map
22
+ //# debugId=f62d0690-4f31-5dc5-9bb6-df2bfd727803
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ea6b7ff6-0d96-50d7-b114-197a98204476")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b7599247-0b42-5c2d-b358-ea54f0e37c2a")}catch(e){}}();
3
3
  import { i as __toESM, n as __exportAll, r as __require, t as __commonJSMin } from "./chunk-ChKA3wi6.js";
4
4
  import { n as require_picomatch$2, t as require_semver } from "./semver-DFtnEmN-.js";
5
5
  import { builtinModules } from "node:module";
@@ -42091,7 +42091,7 @@ const resolveEntries = async (config) => {
42091
42091
  onlyFiles: true
42092
42092
  }));
42093
42093
  }
42094
- if (isEligible && (workspacePackage.isDeclaredWorkspace || !workspaceDiscovery.hasRootLevelWorkspacePatterns)) {
42094
+ if (isEligible) {
42095
42095
  const workspacePackageJsonEntries = await extractPackageJsonEntries(resolve(workspacePackage.directory, "package.json"));
42096
42096
  if (workspacePackageJsonEntries.some((entryPath) => existsSync(entryPath))) {
42097
42097
  workspaceEntries.push(...workspacePackageJsonEntries);
@@ -51897,4 +51897,4 @@ startProjectAnalysisWorker();
51897
51897
  export {};
51898
51898
 
51899
51899
  //# sourceMappingURL=project-analysis-worker.js.map
51900
- //# debugId=ea6b7ff6-0d96-50d7-b114-197a98204476
51900
+ //# debugId=b7599247-0b42-5c2d-b358-ea54f0e37c2a
@@ -0,0 +1,240 @@
1
+
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="df228d05-166f-5b2d-a98a-625966540c58")}catch(e){}}();
3
+ import { t as unrefStdin } from "./unref-stdin-BKT_s38a.js";
4
+ import { a as RUNTIME_SCAN_LOCAL_DEV_PORTS, t as sanitizeRuntimeUrl, u as RUNTIME_SCAN_MAX_STRING_LENGTH } from "./sanitize-runtime-url-CWANxE3L.js";
5
+ import { a as useExitOnCtrlC, c as Spinner, d as useInput, h as Box, i as import_react, m as Text, n as registerMountedTuiRenderer, o as terminalSymbols, p as render, r as useStdoutDimensions, s as isPrintableInput, t as require_jsx_runtime } from "./jsx-runtime-0eiF0jis.js";
6
+ import * as http from "node:http";
7
+ //#region src/cli/runtime-scan/detect-local-runtime-urls.ts
8
+ const LOCAL_HTTP_HOSTS = ["127.0.0.1", "::1"];
9
+ const probeLocalHttpHost = (port, host) => new Promise((resolve) => {
10
+ let didResolve = false;
11
+ const resolveOnce = (isReachable) => {
12
+ if (didResolve) return;
13
+ didResolve = true;
14
+ resolve(isReachable);
15
+ };
16
+ const request = http.request({
17
+ agent: false,
18
+ host,
19
+ method: "HEAD",
20
+ path: "/",
21
+ port
22
+ }, (response) => {
23
+ response.resume();
24
+ resolveOnce(true);
25
+ });
26
+ request.setTimeout(300, () => request.destroy());
27
+ request.on("error", () => resolveOnce(false));
28
+ request.on("close", () => resolveOnce(false));
29
+ request.end();
30
+ });
31
+ const probeLocalHttpPort = async (port) => {
32
+ if (!(await Promise.all(LOCAL_HTTP_HOSTS.map((host) => probeLocalHttpHost(port, host)))).some(Boolean)) return null;
33
+ return {
34
+ port,
35
+ url: `http://localhost:${port}`
36
+ };
37
+ };
38
+ const detectLocalRuntimeUrls = async (ports = RUNTIME_SCAN_LOCAL_DEV_PORTS) => {
39
+ const probeResults = await Promise.all(ports.map(probeLocalHttpPort));
40
+ const suggestions = [];
41
+ for (const probeResult of probeResults) if (probeResult !== null) suggestions.push(probeResult);
42
+ return suggestions;
43
+ };
44
+ //#endregion
45
+ //#region src/cli/ink/prompt-runtime-scan-url.tsx
46
+ var import_jsx_runtime = require_jsx_runtime();
47
+ const RuntimeScanUrlPrompt = ({ discoverLocalUrls = detectLocalRuntimeUrls, onSubmit }) => {
48
+ const [mode, setMode] = (0, import_react.useState)("select");
49
+ const [suggestions, setSuggestions] = (0, import_react.useState)([]);
50
+ const [isDetecting, setIsDetecting] = (0, import_react.useState)(true);
51
+ const [selectedIndex, setSelectedIndex] = (0, import_react.useState)(0);
52
+ const [url, setUrl] = (0, import_react.useState)("");
53
+ const [validationMessage, setValidationMessage] = (0, import_react.useState)(null);
54
+ const { columns: terminalColumns, rows: terminalRows } = useStdoutDimensions();
55
+ useExitOnCtrlC();
56
+ (0, import_react.useEffect)(() => {
57
+ let isMounted = true;
58
+ discoverLocalUrls().then((detectedSuggestions) => {
59
+ if (!isMounted) return;
60
+ setSuggestions(detectedSuggestions);
61
+ setIsDetecting(false);
62
+ }, () => {
63
+ if (isMounted) setIsDetecting(false);
64
+ });
65
+ return () => {
66
+ isMounted = false;
67
+ };
68
+ }, [discoverLocalUrls]);
69
+ const updateUrl = (nextUrl) => {
70
+ setUrl(nextUrl.slice(0, RUNTIME_SCAN_MAX_STRING_LENGTH));
71
+ setValidationMessage(null);
72
+ };
73
+ useInput((input, key) => {
74
+ if (mode === "select") {
75
+ const optionCount = suggestions.length + 1;
76
+ if (key.escape || input === "q") return onSubmit(null);
77
+ if (key.upArrow || input === "k") return setSelectedIndex(Math.max(0, selectedIndex - 1));
78
+ if (key.downArrow || input === "j") return setSelectedIndex(Math.min(optionCount - 1, selectedIndex + 1));
79
+ if (key.return) {
80
+ const selectedSuggestion = suggestions[selectedIndex];
81
+ if (selectedSuggestion !== void 0) return onSubmit(selectedSuggestion.url);
82
+ setMode("custom");
83
+ return;
84
+ }
85
+ if (isPrintableInput(input) && !key.ctrl && !key.meta) {
86
+ setMode("custom");
87
+ updateUrl(input);
88
+ }
89
+ return;
90
+ }
91
+ if (key.escape) return setMode("select");
92
+ if (key.backspace || key.delete) return updateUrl(url.slice(0, -1));
93
+ if (key.ctrl && input === "u") return updateUrl("");
94
+ if (key.return) {
95
+ const trimmedUrl = url.trim();
96
+ try {
97
+ sanitizeRuntimeUrl(trimmedUrl);
98
+ onSubmit(trimmedUrl);
99
+ } catch {
100
+ setValidationMessage("Enter an absolute URL starting with http:// or https://.");
101
+ }
102
+ return;
103
+ }
104
+ if (isPrintableInput(input) && !key.ctrl && !key.meta) updateUrl(url + input);
105
+ });
106
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Box, {
107
+ alignItems: "center",
108
+ height: terminalRows,
109
+ justifyContent: "center",
110
+ width: terminalColumns,
111
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Box, {
112
+ borderColor: "magenta",
113
+ borderStyle: "round",
114
+ flexDirection: "column",
115
+ paddingX: 1,
116
+ width: Math.min(terminalColumns, 72),
117
+ children: [
118
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
119
+ color: "magenta",
120
+ bold: true,
121
+ children: "React Doctor"
122
+ }),
123
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
124
+ bold: true,
125
+ children: "Choose an app to scan"
126
+ }),
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
128
+ dimColor: true,
129
+ children: "We’ll open Chrome and scan one interaction."
130
+ }),
131
+ mode === "select" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Box, {
132
+ flexDirection: "column",
133
+ marginTop: 1,
134
+ children: [
135
+ isDetecting ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Text, {
136
+ dimColor: true,
137
+ children: [
138
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
139
+ color: "cyan",
140
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Spinner, { type: "dots" })
141
+ }),
142
+ " ",
143
+ "Looking for local apps…"
144
+ ]
145
+ }) : null,
146
+ !isDetecting && suggestions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
147
+ dimColor: true,
148
+ children: "No local HTTP apps detected."
149
+ }) : null,
150
+ suggestions.map((suggestion, suggestionIndex) => {
151
+ const isSelected = suggestionIndex === selectedIndex;
152
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Text, {
153
+ bold: isSelected,
154
+ color: isSelected ? "cyan" : void 0,
155
+ children: [
156
+ isSelected ? terminalSymbols.pointer : terminalSymbols.pointerSmall,
157
+ " ",
158
+ suggestion.url,
159
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
160
+ dimColor: true,
161
+ children: " detected"
162
+ })
163
+ ]
164
+ }, suggestion.url);
165
+ }),
166
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Text, {
167
+ bold: selectedIndex === suggestions.length,
168
+ color: selectedIndex === suggestions.length ? "cyan" : void 0,
169
+ children: [
170
+ selectedIndex === suggestions.length ? terminalSymbols.pointer : terminalSymbols.pointerSmall,
171
+ " ",
172
+ "Enter another URL"
173
+ ]
174
+ }),
175
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Box, {
176
+ marginTop: 1,
177
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
178
+ dimColor: true,
179
+ children: "↑↓ choose · Enter continue · Esc cancel"
180
+ })
181
+ })
182
+ ]
183
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Box, {
184
+ flexDirection: "column",
185
+ marginTop: 1,
186
+ children: [
187
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
188
+ dimColor: true,
189
+ children: "App URL"
190
+ }),
191
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Text, {
192
+ wrap: "truncate-end",
193
+ children: [
194
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
195
+ color: "cyan",
196
+ children: "› "
197
+ }),
198
+ url,
199
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
200
+ inverse: true,
201
+ children: " "
202
+ })
203
+ ]
204
+ }),
205
+ validationMessage === null ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
206
+ color: "red",
207
+ children: validationMessage
208
+ }),
209
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Box, {
210
+ marginTop: 1,
211
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, {
212
+ dimColor: true,
213
+ children: "Enter continue · Esc back · Ctrl+U clear"
214
+ })
215
+ })
216
+ ]
217
+ })
218
+ ]
219
+ })
220
+ });
221
+ };
222
+ const promptRuntimeScanUrl = () => new Promise((resolve) => {
223
+ let disposeRenderer = () => {};
224
+ const submitUrl = (url) => {
225
+ disposeRenderer();
226
+ unrefStdin();
227
+ resolve(url);
228
+ };
229
+ disposeRenderer = registerMountedTuiRenderer(render(/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RuntimeScanUrlPrompt, { onSubmit: submitUrl }), {
230
+ alternateScreen: true,
231
+ exitOnCtrlC: false,
232
+ stdin: process.stdin,
233
+ stdout: process.stderr
234
+ }));
235
+ });
236
+ //#endregion
237
+ export { promptRuntimeScanUrl };
238
+
239
+ //# sourceMappingURL=prompt-runtime-scan-url-CV2AUqdk.js.map
240
+ //# debugId=df228d05-166f-5b2d-a98a-625966540c58
@@ -1,6 +1,6 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="fac7d655-2109-5b1a-91d9-1520d433a05a")}catch(e){}}();
3
- import { xr as isPlainObject } from "./record-metric-Dgg2b2LG.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="768883ec-9075-5243-a1f9-acb64d00ddca")}catch(e){}}();
3
+ import { Sr as isPlainObject } from "./record-metric-BA5ry-7d.js";
4
4
  import * as fs$1 from "node:fs";
5
5
  import { parseJSON5 } from "confbox";
6
6
  //#region src/cli/utils/read-object-file.ts
@@ -20,5 +20,5 @@ const readObjectFile = (filePath) => {
20
20
  //#endregion
21
21
  export { readObjectFile as t };
22
22
 
23
- //# sourceMappingURL=read-object-file-rblJxHxN.js.map
24
- //# debugId=fac7d655-2109-5b1a-91d9-1520d433a05a
23
+ //# sourceMappingURL=read-object-file-DOfcpaZX.js.map
24
+ //# debugId=768883ec-9075-5243-a1f9-acb64d00ddca