react-doctor 0.9.12-dev.8c2f03a → 0.9.12-dev.905607f
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.
- package/README.md +27 -0
- package/dist/active-run-trace-dlIZeEvb.js +18 -0
- package/dist/active-scan-abort-registry-DwG6tSPy.js +28 -0
- package/dist/{build-section-divider-DuozMmwU.js → build-section-divider-D5ATBfDJ.js} +8 -22
- package/dist/{ci-Bwd2LJZC.js → ci-DIlnBiUj.js} +12 -11
- package/dist/cli.js +77 -25
- package/dist/{design-Q4Umr_4T.js → design-C-uq3ow5.js} +4 -4
- package/dist/{devtools-D8NTVj81.js → devtools-BiC-AP3B.js} +3 -3
- package/dist/{exit-gracefully-vUI1H1zC.js → exit-gracefully-C64GRTOn.js} +15 -9
- package/dist/get-east-asian-width-Cglw13G7.js +444 -0
- package/dist/{report-error-CAp5cil9.js → handle-error-Cfcnsjyi.js} +6 -61
- package/dist/index.d.ts +34 -2
- package/dist/index.js +187 -44
- package/dist/{inspect-RxIsB8bi.js → inspect-BLX566wA.js} +21 -19
- package/dist/{install-CI0nvC_v.js → install-Dz8zcUxD.js} +9 -8
- package/dist/{install-doctor-script-BAmTZygh.js → install-doctor-script-CjxGMzIH.js} +6 -441
- package/dist/{install-github-workflow-Dg2sosDx.js → install-github-workflow-eYmQoXdI.js} +6 -6
- package/dist/{install-react-doctor-CIJcnTik.js → install-react-doctor-OIDTrbHz.js} +47 -45
- package/dist/{run-scan-app-CeNk17wq.js → jsx-runtime-BdBmuS_a.js} +280 -2769
- package/dist/{print-branded-header-kwnSGrfR.js → print-branded-header-BksixHcc.js} +4 -4
- package/dist/prompt-runtime-scan-url-CXJMNnAo.js +240 -0
- package/dist/{read-object-file-m5uVvcBp.js → read-object-file-BhV9TFsy.js} +4 -4
- package/dist/{record-metric-DospZkfP.js → record-metric-CdX-TQ5W.js} +241 -77
- package/dist/report-error-DsFo2sAk.js +64 -0
- package/dist/{report-workflow-result-D0GvvJtT.js → report-workflow-result-BSSkdwvd.js} +5 -5
- package/dist/{resolve-scope-eXawiGEH.js → resolve-scope-DRnGmF8O.js} +6 -6
- package/dist/{rules-C_xYDSz8.js → rules-C2g4a0X3.js} +6 -6
- package/dist/run-scan-app-Ch6yrLY9.js +2508 -0
- package/dist/runtime-scan/browser-probe.iife.js +855 -0
- package/dist/runtime-scan-Crfe35Ke.js +770 -0
- package/dist/sanitize-runtime-url-Dwa_-IKX.js +76 -0
- package/dist/{scan-DIwsgV6M.js → scan-DJnhifws.js} +10 -22
- package/dist/{should-fail-scan-gate-BWTNIU5h.js → should-fail-scan-gate-D4ZKKeXI.js} +23 -114
- package/dist/{should-skip-prompts-oK3MwWyB.js → should-skip-prompts-Cfocoh7G.js} +4 -4
- package/dist/should-use-tui-COX1uZWn.js +25 -0
- package/dist/skills/improve-threejs/SKILL.md +102 -0
- package/dist/skills/performance/SKILL.md +113 -0
- package/dist/skills/react-doctor/SKILL.md +6 -0
- package/dist/{unref-stdin-BGZVK4sJ.js → telemetry-runtime-C_D70xUE.js} +5 -23
- package/dist/unref-stdin-BKT_s38a.js +12 -0
- package/dist/{version-9-2T2YQf.js → version-BAhd6Zvv.js} +4 -4
- package/dist/{why-BOiuB_qy.js → why-MQHWHpeA.js} +4 -4
- package/dist/with-run-span-DmpUrF70.js +110 -0
- package/package.json +6 -4
|
@@ -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]="
|
|
3
|
-
import {
|
|
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]="c6ead544-f15e-5ee3-a753-ed94fb263a7a")}catch(e){}}();
|
|
3
|
+
import { An as gen, Kt as highlighter, Tn as log, _ as VERSION } from "./record-metric-CdX-TQ5W.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-
|
|
22
|
-
//# debugId=
|
|
21
|
+
//# sourceMappingURL=print-branded-header-BksixHcc.js.map
|
|
22
|
+
//# debugId=c6ead544-f15e-5ee3-a753-ed94fb263a7a
|
|
@@ -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]="06a0653d-eb3f-5f06-a156-7489728749ea")}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-Dwa_-IKX.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-BdBmuS_a.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-CXJMNnAo.js.map
|
|
240
|
+
//# debugId=06a0653d-eb3f-5f06-a156-7489728749ea
|
|
@@ -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]="
|
|
3
|
-
import {
|
|
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]="dda1aa50-ba1b-5a1f-98a7-0e2c15d279a3")}catch(e){}}();
|
|
3
|
+
import { Sr as isPlainObject } from "./record-metric-CdX-TQ5W.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-
|
|
24
|
-
//# debugId=
|
|
23
|
+
//# sourceMappingURL=read-object-file-BhV9TFsy.js.map
|
|
24
|
+
//# debugId=dda1aa50-ba1b-5a1f-98a7-0e2c15d279a3
|