react-doctor 0.9.13-dev.ff7dd67 → 0.9.14-dev.922616f

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 (59) hide show
  1. package/dist/_react-doctor_require-typescript-DXQDYeWK.js +16 -0
  2. package/dist/{active-run-trace-dlIZeEvb.js → active-run-trace-Dewycxda.js} +3 -3
  3. package/dist/{active-scan-abort-registry-DwG6tSPy.js → active-scan-abort-registry-CCTgal0O.js} +3 -3
  4. package/dist/build-section-divider-CNFcGNYm.js +81 -0
  5. package/dist/{ci-ByM_SFTq.js → ci-CbTOIIel.js} +14 -13
  6. package/dist/cli.js +31 -30
  7. package/dist/constants-CW_854PH.js +1035 -0
  8. package/dist/constants-DNh19qg9.js +23 -0
  9. package/dist/{design-2hjOmtV1.js → design-CPav17ye.js} +4 -4
  10. package/dist/{devtools-CC2PAZ85.js → devtools-D20sefkm.js} +3 -3
  11. package/dist/duplicate-jsx-worker.d.ts +1 -0
  12. package/dist/duplicate-jsx-worker.js +636 -0
  13. package/dist/{exit-gracefully-niPFXq9Y.js → exit-gracefully-De_DePvj.js} +7 -7
  14. package/dist/fs-utils-C88IbqFa.js +45 -0
  15. package/dist/{get-east-asian-width-Bv2TD3Xj.js → get-east-asian-width-DRPy7dqz.js} +4 -4
  16. package/dist/{handle-error-D-4lexec.js → handle-error-B3GWdtbq.js} +6 -5
  17. package/dist/index.d.ts +8511 -8509
  18. package/dist/index.js +61693 -60580
  19. package/dist/{inspect-BrctG7ql.js → inspect-vT3G27FR.js} +38 -27
  20. package/dist/{install-CcFc56OK.js → install-C-_xdS80.js} +10 -9
  21. package/dist/{install-doctor-script-Coa2ErCg.js → install-doctor-script-BFv3Iiwe.js} +17 -8
  22. package/dist/{install-github-workflow-DlfdrYkQ.js → install-github-workflow-C-rhKOiP.js} +10 -10
  23. package/dist/{install-react-doctor-BWxqZMX-.js → install-react-doctor-BvU99j_I.js} +15 -11
  24. package/dist/is-cache-globally-disabled-CoHiYz2i.js +10 -0
  25. package/dist/{jsx-runtime-Njm7vAoN.js → jsx-runtime-CiJj554e.js} +11 -10
  26. package/dist/oxlint-worker.d.ts +1 -0
  27. package/dist/oxlint-worker.js +225 -0
  28. package/dist/{path-format-DnHpmJwG.js → path-format-By20mo8A.js} +3 -3
  29. package/dist/{print-branded-header-DFkeG4BS.js → print-branded-header-DJMuy9Hr.js} +4 -4
  30. package/dist/project-analysis-worker.js +461 -480
  31. package/dist/{prompt-runtime-scan-url-BenBNq25.js → prompt-runtime-scan-url-1YpMskOr.js} +6 -6
  32. package/dist/react-compiler-detection-worker.d.ts +1 -0
  33. package/dist/react-compiler-detection-worker.js +1029 -0
  34. package/dist/{read-object-file-CqMtxcfF.js → read-object-file-CWvQd5ls.js} +4 -4
  35. package/dist/{record-metric-Bkorhx43.js → record-metric-DSQY-qOh.js} +12998 -12770
  36. package/dist/{report-error-DPjmfRi9.js → report-error-C1g5jtl7.js} +9 -8
  37. package/dist/{report-workflow-result-CBL6CrLY.js → report-workflow-result-it0G879R.js} +24 -11
  38. package/dist/{resolve-scope-BFloAClV.js → resolve-scope-DmsEUxUn.js} +7 -7
  39. package/dist/{rules-BKNy9YIl.js → rules-BXkqekjc.js} +8 -7
  40. package/dist/{run-scan-app-Bc70ozp-.js → run-scan-app-wCfH8LdA.js} +30 -23
  41. package/dist/{runtime-scan-ODrdp5mV.js → runtime-scan-CXmDoQ2W.js} +13 -12
  42. package/dist/{sanitize-runtime-url-BYOmPSdm.js → sanitize-runtime-url-kA6U9dQF.js} +4 -4
  43. package/dist/{scan-BfcGHHkI.js → scan-Dd-VVq_7.js} +10 -9
  44. package/dist/{semver-DFtnEmN-.js → semver-BZIuy1gP.js} +3 -3
  45. package/dist/{should-fail-scan-gate-CCPDoHaM.js → should-fail-scan-gate-YK9VAFNu.js} +1339 -1283
  46. package/dist/{should-skip-prompts-D-ClPHHR.js → should-skip-prompts-SdC04R_e.js} +4 -4
  47. package/dist/{should-use-tui-BaCVIPPN.js → should-use-tui-D2fEl9q2.js} +4 -4
  48. package/dist/start-scan-preamble-D0QepYZ_.js +68 -0
  49. package/dist/start-scan-preamble-DVhXIPc0.d.ts +1 -0
  50. package/dist/start-scan-preamble.d.ts +1 -0
  51. package/dist/start-scan-preamble.js +4 -0
  52. package/dist/{telemetry-runtime-BGWa_GB9.js → telemetry-runtime-DOCJCTsL.js} +154 -5
  53. package/dist/{unref-stdin-SK3WfwxS.js → unref-stdin-D-NZBFpg.js} +3 -3
  54. package/dist/unwrap-typescript-expression-CrEPQUWz.js +14 -0
  55. package/dist/{version-DN1N-oZy.js → version-WpL8zILr.js} +5 -4
  56. package/dist/{why-CyioXUF2.js → why-CnQMoK2D.js} +4 -4
  57. package/dist/{with-run-span-GsCWW2_X.js → with-run-span-B0SMAP_Z.js} +7 -6
  58. package/package.json +9 -7
  59. package/dist/build-section-divider-BRuN44fL.js +0 -216
@@ -1,10 +1,10 @@
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]="d6d6ff68-e103-56f5-93aa-7833ba71af07")}catch(e){}}();
3
- import { B as isNonInteractiveEnvironment } from "./record-metric-Bkorhx43.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]="70da4722-5b8d-5d76-8c43-d93a9dd7fc93")}catch(e){}}();
3
+ import { b as isNonInteractiveEnvironment } from "./record-metric-DSQY-qOh.js";
4
4
  //#region src/cli/utils/should-skip-prompts.ts
5
5
  const shouldSkipPrompts = (input = {}) => Boolean(input.yes) || Boolean(input.json) || isNonInteractiveEnvironment() || !process.stdin.isTTY;
6
6
  //#endregion
7
7
  export { shouldSkipPrompts as t };
8
8
 
9
- //# sourceMappingURL=should-skip-prompts-D-ClPHHR.js.map
10
- //# debugId=d6d6ff68-e103-56f5-93aa-7833ba71af07
9
+ //# sourceMappingURL=should-skip-prompts-SdC04R_e.js.map
10
+ //# debugId=70da4722-5b8d-5d76-8c43-d93a9dd7fc93
@@ -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]="adbefe1b-9ac3-590a-b955-3c818737e591")}catch(e){}}();
3
- import { B as isNonInteractiveEnvironment } from "./record-metric-Bkorhx43.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]="8a304329-ef0f-5c35-b7b9-1b356e8e1991")}catch(e){}}();
3
+ import { b as isNonInteractiveEnvironment } from "./record-metric-DSQY-qOh.js";
4
4
  //#region src/cli/utils/resolve-tui-environment.ts
5
5
  const resolveTuiEnvironment = (outputIsTty = process.stdout.isTTY === true) => ({
6
6
  isNonInteractiveEnvironment: isNonInteractiveEnvironment(),
@@ -21,5 +21,5 @@ const shouldUseTui = (input) => {
21
21
  //#endregion
22
22
  export { shouldUseTui as n, resolveTuiEnvironment as r, isTuiEnvironmentSupported as t };
23
23
 
24
- //# sourceMappingURL=should-use-tui-BaCVIPPN.js.map
25
- //# debugId=adbefe1b-9ac3-590a-b955-3c818737e591
24
+ //# sourceMappingURL=should-use-tui-D2fEl9q2.js.map
25
+ //# debugId=8a304329-ef0f-5c35-b7b9-1b356e8e1991
@@ -0,0 +1,68 @@
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]="e56df6c0-6b77-50e8-a340-9a955250c5de")}catch(e){}}();
3
+ import { $ as warmReactCompilerDetection, A as buildGitSourceListingRequest, I as prefetchGitCommand, K as resolveReactDoctorCacheDir, L as prespawnOxlintWorkers, M as buildOxlintWorkerSpawnSpec, W as resolveOxlintWorkerRuntime, _ as SCAN_PREAMBLE_SKIP_FLAGS, g as RUN_GIT_MAX_BUFFER_BYTES, j as buildOxlintChildEnv, q as resolveScanConcurrency, y as SCAN_RESULT_CACHE_GIT_ARGUMENTS, z as resolveConfiguredScanConcurrency } from "./constants-CW_854PH.js";
4
+ import { t as isCacheGloballyDisabled } from "./is-cache-globally-disabled-CoHiYz2i.js";
5
+ import * as fs$1 from "node:fs";
6
+ import * as path$1 from "node:path";
7
+ //#region src/cli/utils/resolve-prefetch-scan-directory.ts
8
+ const isExistingDirectory = (absolutePath) => {
9
+ try {
10
+ return fs$1.statSync(absolutePath).isDirectory();
11
+ } catch {
12
+ return false;
13
+ }
14
+ };
15
+ const resolvePrefetchScanDirectory = (argv, currentDirectory) => {
16
+ const directoryCandidates = [];
17
+ let previousToken = null;
18
+ for (const token of argv) {
19
+ if (SCAN_PREAMBLE_SKIP_FLAGS.has(token)) return null;
20
+ if (!token.startsWith("-")) {
21
+ if (isExistingDirectory(path$1.resolve(currentDirectory, token))) directoryCandidates.push(token);
22
+ else if (previousToken === null || !previousToken.startsWith("-")) return null;
23
+ }
24
+ previousToken = token;
25
+ }
26
+ if (directoryCandidates.length > 1) return null;
27
+ return path$1.resolve(currentDirectory, directoryCandidates[0] ?? ".");
28
+ };
29
+ //#endregion
30
+ //#region src/cli/start-scan-preamble.ts
31
+ const prespawnOxlintWorkersForScan = () => {
32
+ if (process.argv.includes("--no-lint")) return;
33
+ const workerRuntime = resolveOxlintWorkerRuntime();
34
+ if (workerRuntime === null) return;
35
+ const workerCount = process.argv.includes("--no-parallel") ? resolveScanConcurrency(1) : resolveConfiguredScanConcurrency();
36
+ prespawnOxlintWorkers(buildOxlintWorkerSpawnSpec({
37
+ nodeBinaryPath: process.execPath,
38
+ maxWorkers: workerCount,
39
+ workerScriptPath: workerRuntime.workerScriptPath,
40
+ oxlintPackageDirectory: workerRuntime.oxlintPackageDirectory,
41
+ pluginPath: workerRuntime.pluginPath,
42
+ environment: buildOxlintChildEnv(process.env)
43
+ }), workerCount);
44
+ };
45
+ const startScanPreamble = () => {
46
+ const prefetchDirectory = resolvePrefetchScanDirectory(process.argv.slice(2), process.cwd());
47
+ if (prefetchDirectory === null) return;
48
+ if (process.argv.includes("--no-cache")) process.env.REACT_DOCTOR_NO_CACHE = "1";
49
+ prefetchGitCommand(buildGitSourceListingRequest(prefetchDirectory));
50
+ const isCacheDisabled = isCacheGloballyDisabled();
51
+ if (!isCacheDisabled) for (const args of SCAN_RESULT_CACHE_GIT_ARGUMENTS) prefetchGitCommand({
52
+ directory: prefetchDirectory,
53
+ args,
54
+ maxBufferBytes: RUN_GIT_MAX_BUFFER_BYTES
55
+ });
56
+ if (!(!isCacheDisabled && fs$1.existsSync(path$1.join(resolveReactDoctorCacheDir(prefetchDirectory), "scan-cache.json")))) {
57
+ warmReactCompilerDetection(prefetchDirectory);
58
+ prespawnOxlintWorkersForScan();
59
+ }
60
+ };
61
+ try {
62
+ startScanPreamble();
63
+ } catch {}
64
+ //#endregion
65
+ export {};
66
+
67
+ //# sourceMappingURL=start-scan-preamble-D0QepYZ_.js.map
68
+ //# debugId=e56df6c0-6b77-50e8-a340-9a955250c5de
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,4 @@
1
+ import "./start-scan-preamble-D0QepYZ_.js";
2
+ export {};
3
+ !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]="1bc9f618-49b3-536d-a720-038a511a79f8")}catch(e){}}();
4
+ //# debugId=1bc9f618-49b3-536d-a720-038a511a79f8
@@ -1,6 +1,7 @@
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]="feb387d6-aca6-5687-9741-763feafd4d91")}catch(e){}}();
3
- import { $t as layerObservability, Cr as messageFromUnknown, Jn as makeUnsafe, Rn as runPromise, Un as buildWithScope, Xn as void_, Xt as isReactDoctorError, Yt as isProjectDiscoveryError, _ as VERSION, br as isErrnoException, i as isTelemetryEnabled, kn as make, qn as close, z as CliInputError, zn as runSync } from "./record-metric-Bkorhx43.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]="72fbf087-c9e1-5ef1-85b3-b5f45946caef")}catch(e){}}();
3
+ import { S as SENTRY_FLUSH_TIMEOUT_MS } from "./constants-CW_854PH.js";
4
+ import { An as void_, At as isProjectDiscoveryError, Cn as buildWithScope, Dn as close, J as anonymizeText, Jt as scrubSensitivePaths, Ln as isErrnoException, On as makeUnsafe, Pn as messageFromUnknown, Pt as layerObservability, _ as VERSION, a as isEnvFlagEnabled, i as isTelemetryEnabled, jt as isReactDoctorError, ln as make, o as buildSentryScope, q as anonymizeInPlace, vn as runPromise, y as CliInputError, yn as runSync } from "./record-metric-DSQY-qOh.js";
4
5
  //#region src/cli/utils/is-environment-error.ts
5
6
  const ENVIRONMENT_ERROR_CODES = new Set([
6
7
  "EACCES",
@@ -144,6 +145,154 @@ const formatNpmCacheCorruptionError = (error) => {
144
145
  */
145
146
  const isExpectedUserError = (error) => error instanceof CliInputError || isProjectDiscoveryError(error) || isEnvironmentError(error) || isNpmCacheCorruptionError(error) || isReactDoctorError(error) && (error.reason._tag === "GitBaseBranchInvalid" || error.reason._tag === "GitBaseBranchMissing");
146
147
  //#endregion
148
+ //#region src/cli/utils/scrub-sentry-event.ts
149
+ /**
150
+ * Anonymizes a Sentry event (error or transaction) before it leaves the
151
+ * machine. Strips identity the SDK attaches automatically — the IP-bearing
152
+ * `user`, the `server_name`, and the device `name` (all hostnames) — drops
153
+ * captured local variables (unbounded, un-anonymizable user data), and scrubs
154
+ * home-directory paths + known secrets/emails from every remaining string:
155
+ * messages, stack frames, breadcrumbs, contexts/extra/tags, and span
156
+ * attributes (e.g. the `inspect.directory` path on the bridged `runInspect`
157
+ * span).
158
+ *
159
+ * Wired into both `beforeSend` and `beforeSendTransaction`. If scrubbing ever
160
+ * throws, the event is dropped (`null`) rather than risk sending un-anonymized
161
+ * data — telemetry is best-effort, privacy is not.
162
+ */
163
+ const scrubSentryEvent = (event) => {
164
+ try {
165
+ delete event.server_name;
166
+ delete event.user;
167
+ const device = event.contexts?.device;
168
+ if (device) delete device.name;
169
+ if (event.contexts) anonymizeInPlace(event.contexts);
170
+ if (event.extra) anonymizeInPlace(event.extra);
171
+ if (event.tags) anonymizeInPlace(event.tags);
172
+ if (typeof event.message === "string") event.message = anonymizeText(event.message);
173
+ for (const breadcrumb of event.breadcrumbs ?? []) {
174
+ if (typeof breadcrumb.message === "string") breadcrumb.message = anonymizeText(breadcrumb.message);
175
+ if (breadcrumb.data) anonymizeInPlace(breadcrumb.data);
176
+ }
177
+ for (const exception of event.exception?.values ?? []) {
178
+ if (typeof exception.value === "string") exception.value = anonymizeText(exception.value);
179
+ for (const frame of exception.stacktrace?.frames ?? []) {
180
+ delete frame.vars;
181
+ if (typeof frame.filename === "string") frame.filename = scrubSensitivePaths(frame.filename);
182
+ if (typeof frame.abs_path === "string") frame.abs_path = scrubSensitivePaths(frame.abs_path);
183
+ if (typeof frame.module === "string") frame.module = scrubSensitivePaths(frame.module);
184
+ }
185
+ }
186
+ for (const span of event.spans ?? []) {
187
+ if (typeof span.description === "string") span.description = anonymizeText(span.description);
188
+ if (span.data) anonymizeInPlace(span.data);
189
+ }
190
+ return event;
191
+ } catch {
192
+ return null;
193
+ }
194
+ };
195
+ //#endregion
196
+ //#region src/cli/utils/sentry-config.ts
197
+ /**
198
+ * Shared Sentry configuration resolution — release, environment, and tracing
199
+ * sample rate — derived from `VERSION` and the standard `SENTRY_*` env
200
+ * overrides. Lives apart from `instrument.ts` so this resolution remains
201
+ * independently testable.
202
+ */
203
+ /**
204
+ * A version is a "dev" build when it's the unbuilt placeholder (`0.0.0`) or
205
+ * carries a prerelease suffix (e.g. the `-dev.<sha>` snapshots published from
206
+ * CI). Everything else is a real, tagged release.
207
+ */
208
+ const isDevVersion = (version) => version === "0.0.0" || version.includes("-");
209
+ /**
210
+ * Sentry release identifier. `react-doctor@<version>` keeps it unique within
211
+ * the org and — crucially — matches the value `scripts/sentry-sourcemaps.mjs`
212
+ * uploads source-map artifacts under, so stack frames symbolicate. Honors the
213
+ * standard `SENTRY_RELEASE` override.
214
+ */
215
+ const resolveSentryRelease = () => process.env.SENTRY_RELEASE || `react-doctor@0.9.14-dev.922616f`;
216
+ /**
217
+ * Deployment environment shown in Sentry's environment filter. Defaults to
218
+ * `production` for tagged releases and `development` for dev/unbuilt versions,
219
+ * overridable via the standard `SENTRY_ENVIRONMENT` env var.
220
+ */
221
+ const resolveSentryEnvironment = () => process.env.SENTRY_ENVIRONMENT || (isDevVersion("0.9.14-dev.922616f") ? "development" : "production");
222
+ //#endregion
223
+ //#region src/instrument.ts
224
+ let sentryPromise = null;
225
+ /**
226
+ * Resolves the initialized Sentry SDK, or `null` when Sentry was never
227
+ * initialized (`--no-score`, tests, a missing DSN) or failed to load. Every
228
+ * Sentry consumer goes through here so the SDK's module graph (hundreds of
229
+ * `@sentry/*` + `@opentelemetry/*` files) is loaded off the CLI's critical
230
+ * startup path.
231
+ */
232
+ const getSentry = () => sentryPromise ?? Promise.resolve(null);
233
+ /**
234
+ * Flushes queued Sentry events (errors + transactions) before the CLI exits, so
235
+ * the success-path transaction is delivered. A no-op when Sentry was never
236
+ * initialized, and it swallows transport failures so telemetry can never mask
237
+ * the user's result.
238
+ */
239
+ const flushSentry = async () => {
240
+ const Sentry = await getSentry();
241
+ if (!Sentry?.isInitialized()) return;
242
+ try {
243
+ await Sentry.flush(SENTRY_FLUSH_TIMEOUT_MS);
244
+ } catch {}
245
+ };
246
+ const initializeSentryModule = (Sentry) => {
247
+ const { tags, contexts } = buildSentryScope();
248
+ try {
249
+ Sentry.init({
250
+ dsn: process.env.SENTRY_DSN || "https://f253d570240a59b8dbd77b7a548ef133@o4510226365743104.ingest.us.sentry.io/4511487817809920",
251
+ release: resolveSentryRelease(),
252
+ environment: resolveSentryEnvironment(),
253
+ sendDefaultPii: false,
254
+ tracesSampleRate: 0,
255
+ registerEsmLoaderHooks: false,
256
+ debug: isEnvFlagEnabled(process.env.SENTRY_DEBUG),
257
+ initialScope: {
258
+ tags,
259
+ contexts
260
+ },
261
+ beforeSend: (event, hint) => isExpectedUserError(hint.originalException) ? null : scrubSentryEvent(event)
262
+ });
263
+ } catch {}
264
+ return Sentry;
265
+ };
266
+ /**
267
+ * Initializes the Sentry Node SDK for CLI crash reporting. Invoked as the first
268
+ * statement of the CLI entry (`cli/index.ts`); the SDK is imported dynamically
269
+ * so its module graph loads in the background while the command starts, and the
270
+ * SDK's global `uncaughtException` / `unhandledRejection` handlers arm as soon
271
+ * as it lands. Consumers await `getSentry()` and so observe the initialized SDK.
272
+ *
273
+ * Performance tracing is off: spans are exported to Axiom instead (see
274
+ * `telemetry-runtime.ts`), and Effect has a single `Tracer` reference, so the
275
+ * two backends are mutually exclusive. Sentry keeps what it is good at —
276
+ * symbolicated stack traces, issue grouping, and a quotable event id — while
277
+ * crashes carry the Axiom trace id as a tag so an issue pivots into its trace.
278
+ *
279
+ * Exported as a function rather than a bare side-effecting import because the
280
+ * package declares `"sideEffects": false`, which lets the bundler tree-shake
281
+ * side-effect-only modules. An explicit call keeps the initialization in the
282
+ * published `dist/cli.js`.
283
+ *
284
+ * Scoped to the CLI application only — the programmatic `@react-doctor/api`
285
+ * library never initializes Sentry, so importing `diagnose()` into a consumer
286
+ * app can't hijack their telemetry.
287
+ *
288
+ * Configuration is environment-overridable for self-hosting and tuning:
289
+ * `SENTRY_DSN`, `SENTRY_ENVIRONMENT`, `SENTRY_RELEASE`, and `SENTRY_DEBUG`.
290
+ */
291
+ const initializeSentry = () => {
292
+ if (sentryPromise !== null || !isTelemetryEnabled()) return;
293
+ sentryPromise = import("@sentry/node").then(initializeSentryModule, () => null);
294
+ };
295
+ //#endregion
147
296
  //#region src/cli/utils/resolve-axiom-telemetry-options.ts
148
297
  /**
149
298
  * Resolves the credentials for first-party Axiom export, or `null` when this
@@ -245,7 +394,7 @@ const shutdownTelemetry = async () => {
245
394
  return pendingShutdown;
246
395
  };
247
396
  //#endregion
248
- export { isNpmCacheCorruptionError as a, formatNpmCacheCorruptionError as i, shutdownTelemetry as n, formatEnvironmentError as o, isExpectedUserError as r, isEnvironmentError as s, getTelemetryContext as t };
397
+ export { initializeSentry as a, isNpmCacheCorruptionError as c, getSentry as i, formatEnvironmentError as l, shutdownTelemetry as n, isExpectedUserError as o, flushSentry as r, formatNpmCacheCorruptionError as s, getTelemetryContext as t, isEnvironmentError as u };
249
398
 
250
- //# sourceMappingURL=telemetry-runtime-BGWa_GB9.js.map
251
- //# debugId=feb387d6-aca6-5687-9741-763feafd4d91
399
+ //# sourceMappingURL=telemetry-runtime-DOCJCTsL.js.map
400
+ //# debugId=72fbf087-c9e1-5ef1-85b3-b5f45946caef
@@ -1,6 +1,6 @@
1
1
  //#region src/cli/utils/unref-stdin.ts
2
2
 
3
- !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]="8f48a2ed-e79f-5438-90a2-8ef096b5fd64")}catch(e){}}();
3
+ !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]="d3e46509-a9b9-569a-a558-625cd0ef7026")}catch(e){}}();
4
4
  const unrefStdin = () => {
5
5
  if (process.stdin.isTTY) return;
6
6
  process.stdin.unref?.();
@@ -8,5 +8,5 @@ const unrefStdin = () => {
8
8
  //#endregion
9
9
  export { unrefStdin as t };
10
10
 
11
- //# sourceMappingURL=unref-stdin-SK3WfwxS.js.map
12
- //# debugId=8f48a2ed-e79f-5438-90a2-8ef096b5fd64
11
+ //# sourceMappingURL=unref-stdin-D-NZBFpg.js.map
12
+ //# debugId=d3e46509-a9b9-569a-a558-625cd0ef7026
@@ -0,0 +1,14 @@
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]="5c0b38d2-ff8c-52b8-baeb-518d4534f99a")}catch(e){}}();
3
+ import { t as typescriptBinding } from "./_react-doctor_require-typescript-DXQDYeWK.js";
4
+ //#region ../core/src/utils/unwrap-typescript-expression.ts
5
+ const unwrapTypescriptExpression = (expression) => {
6
+ let currentExpression = expression;
7
+ while (typescriptBinding.isParenthesizedExpression(currentExpression) || typescriptBinding.isAsExpression(currentExpression) || typescriptBinding.isSatisfiesExpression(currentExpression) || typescriptBinding.isNonNullExpression(currentExpression) || typescriptBinding.isTypeAssertionExpression(currentExpression)) currentExpression = currentExpression.expression;
8
+ return currentExpression;
9
+ };
10
+ //#endregion
11
+ export { unwrapTypescriptExpression as t };
12
+
13
+ //# sourceMappingURL=unwrap-typescript-expression-CrEPQUWz.js.map
14
+ //# debugId=5c0b38d2-ff8c-52b8-baeb-518d4534f99a
@@ -1,6 +1,7 @@
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]="b8250b70-cd11-54b4-a26d-bc4cc66bdd9c")}catch(e){}}();
3
- import { T as METRIC, _ as VERSION, t as recordCount } from "./record-metric-Bkorhx43.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]="87f0b938-d05e-533c-9328-a582c8732d30")}catch(e){}}();
3
+ import { u as METRIC } from "./constants-CW_854PH.js";
4
+ import { _ as VERSION, t as recordCount } from "./record-metric-DSQY-qOh.js";
4
5
  //#region src/cli/commands/version.ts
5
6
  /**
6
7
  * oclif-style version line. 12-factor CLI Apps (#3, "What version am I
@@ -17,5 +18,5 @@ const versionAction = () => {
17
18
  //#endregion
18
19
  export { versionAction };
19
20
 
20
- //# sourceMappingURL=version-DN1N-oZy.js.map
21
- //# debugId=b8250b70-cd11-54b4-a26d-bc4cc66bdd9c
21
+ //# sourceMappingURL=version-WpL8zILr.js.map
22
+ //# debugId=87f0b938-d05e-533c-9328-a582c8732d30
@@ -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]="a33ddae5-047d-587f-bb12-fa439ff60d6c")}catch(e){}}();
3
- import { t as inspectAction } from "./inspect-BrctG7ql.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]="77a106d1-bb9f-5008-a8fd-a3fa48b65e99")}catch(e){}}();
3
+ import { t as inspectAction } from "./inspect-vT3G27FR.js";
4
4
  //#region src/cli/commands/why.ts
5
5
  /**
6
6
  * `why <file:line>` — explains why a rule fired (or why a suppression didn't
@@ -17,5 +17,5 @@ const whyAction = async (location, options) => {
17
17
  //#endregion
18
18
  export { whyAction };
19
19
 
20
- //# sourceMappingURL=why-CyioXUF2.js.map
21
- //# debugId=a33ddae5-047d-587f-bb12-fa439ff60d6c
20
+ //# sourceMappingURL=why-CnQMoK2D.js.map
21
+ //# debugId=77a106d1-bb9f-5008-a8fd-a3fa48b65e99
@@ -1,8 +1,9 @@
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]="d8f50130-066a-5ce7-a772-38b9d519ebeb")}catch(e){}}();
3
- import { D as NANOSECONDS_PER_MILLISECOND, In as provideContext, Xn as void_, Yn as fail, c as setSentryProjectInfo, jn as makeSpan, o as buildSentryScope, r as toSpanAttributes, s as buildSentryProjectContext, zn as runSync } from "./record-metric-Bkorhx43.js";
4
- import { t as getTelemetryContext } from "./telemetry-runtime-BGWa_GB9.js";
5
- import { i as setActiveRunTrace, r as recordRunTraceId } from "./active-run-trace-dlIZeEvb.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]="fb728d30-0bc2-5b5c-8371-cc550bded72e")}catch(e){}}();
3
+ import { p as NANOSECONDS_PER_MILLISECOND } from "./constants-CW_854PH.js";
4
+ import { An as void_, c as setSentryProjectInfo, dn as makeSpan, gn as provideContext, kn as fail, o as buildSentryScope, r as toSpanAttributes, s as buildSentryProjectContext, yn as runSync } from "./record-metric-DSQY-qOh.js";
5
+ import { t as getTelemetryContext } from "./telemetry-runtime-DOCJCTsL.js";
6
+ import { i as setActiveRunTrace, r as recordRunTraceId } from "./active-run-trace-Dewycxda.js";
6
7
  //#region src/cli/utils/with-run-span.ts
7
8
  /**
8
9
  * Ends the run span without letting a telemetry failure change the run's
@@ -106,5 +107,5 @@ const recordSentryProjectContext = (projectInfo, rootSpan, options = {}) => {
106
107
  //#endregion
107
108
  export { resetSentryRunState as n, withRunSpan as r, recordSentryProjectContext as t };
108
109
 
109
- //# sourceMappingURL=with-run-span-GsCWW2_X.js.map
110
- //# debugId=d8f50130-066a-5ce7-a772-38b9d519ebeb
110
+ //# sourceMappingURL=with-run-span-B0SMAP_Z.js.map
111
+ //# debugId=fb728d30-0bc2-5b5c-8371-cc550bded72e
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-doctor",
3
- "version": "0.9.13-dev.ff7dd67",
3
+ "version": "0.9.14-dev.922616f",
4
4
  "description": "Your agent writes bad React. This catches it",
5
5
  "keywords": [
6
6
  "accessibility",
@@ -38,7 +38,9 @@
38
38
  "LICENSE"
39
39
  ],
40
40
  "type": "module",
41
- "sideEffects": false,
41
+ "sideEffects": [
42
+ "**/start-scan-preamble*"
43
+ ],
42
44
  "exports": {
43
45
  ".": {
44
46
  "types": "./dist/cli.d.ts",
@@ -60,15 +62,15 @@
60
62
  "is-unicode-supported": "^2.1.0",
61
63
  "jiti": "^2.7.0",
62
64
  "magicast": "^0.5.3",
63
- "oxc-parser": "^0.146.0",
65
+ "oxc-parser": "^0.148.0",
64
66
  "oxc-resolver": "^11.24.2",
65
- "oxlint": ">=1.79.0 <1.80.0",
67
+ "oxlint": ">=1.81.0 <1.82.0",
66
68
  "playwright-core": "^1.62.1",
67
69
  "prompts": "^2.4.2",
68
70
  "typescript": ">=5.0.4 <6",
69
71
  "yaml": "^2.9.0",
70
72
  "yoga-layout": "~3.2.1",
71
- "oxlint-plugin-react-doctor": "0.9.13-dev.ff7dd67"
73
+ "oxlint-plugin-react-doctor": "0.9.14-dev.922616f"
72
74
  },
73
75
  "devDependencies": {
74
76
  "@types/babel__code-frame": "^7.27.0",
@@ -81,8 +83,8 @@
81
83
  "ora": "^9.4.0",
82
84
  "react": "19.2.5",
83
85
  "react-devtools-core": "^7.0.1",
84
- "@react-doctor/api": "0.9.13",
85
- "@react-doctor/core": "0.9.13"
86
+ "@react-doctor/api": "0.9.14",
87
+ "@react-doctor/core": "0.9.14"
86
88
  },
87
89
  "engines": {
88
90
  "node": "^20.19.0 || >=22.13.0"
@@ -1,216 +0,0 @@
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]="1fe38c74-620b-58bd-b005-f8dd797b21e0")}catch(e){}}();
3
- import { Kt as highlighter, N as SENTRY_FLUSH_TIMEOUT_MS, a as isEnvFlagEnabled, er as CANONICAL_GITHUB_URL, ft as anonymizeInPlace, hn as scrubSensitivePaths, i as isTelemetryEnabled, o as buildSentryScope, or as DOCS_URL, pt as anonymizeText } from "./record-metric-Bkorhx43.js";
4
- import { r as isExpectedUserError } from "./telemetry-runtime-BGWa_GB9.js";
5
- import * as Sentry from "@sentry/node";
6
- //#region src/cli/utils/scrub-sentry-event.ts
7
- /**
8
- * Anonymizes a Sentry event (error or transaction) before it leaves the
9
- * machine. Strips identity the SDK attaches automatically — the IP-bearing
10
- * `user`, the `server_name`, and the device `name` (all hostnames) — drops
11
- * captured local variables (unbounded, un-anonymizable user data), and scrubs
12
- * home-directory paths + known secrets/emails from every remaining string:
13
- * messages, stack frames, breadcrumbs, contexts/extra/tags, and span
14
- * attributes (e.g. the `inspect.directory` path on the bridged `runInspect`
15
- * span).
16
- *
17
- * Wired into both `beforeSend` and `beforeSendTransaction`. If scrubbing ever
18
- * throws, the event is dropped (`null`) rather than risk sending un-anonymized
19
- * data — telemetry is best-effort, privacy is not.
20
- */
21
- const scrubSentryEvent = (event) => {
22
- try {
23
- delete event.server_name;
24
- delete event.user;
25
- const device = event.contexts?.device;
26
- if (device) delete device.name;
27
- if (event.contexts) anonymizeInPlace(event.contexts);
28
- if (event.extra) anonymizeInPlace(event.extra);
29
- if (event.tags) anonymizeInPlace(event.tags);
30
- if (typeof event.message === "string") event.message = anonymizeText(event.message);
31
- for (const breadcrumb of event.breadcrumbs ?? []) {
32
- if (typeof breadcrumb.message === "string") breadcrumb.message = anonymizeText(breadcrumb.message);
33
- if (breadcrumb.data) anonymizeInPlace(breadcrumb.data);
34
- }
35
- for (const exception of event.exception?.values ?? []) {
36
- if (typeof exception.value === "string") exception.value = anonymizeText(exception.value);
37
- for (const frame of exception.stacktrace?.frames ?? []) {
38
- delete frame.vars;
39
- if (typeof frame.filename === "string") frame.filename = scrubSensitivePaths(frame.filename);
40
- if (typeof frame.abs_path === "string") frame.abs_path = scrubSensitivePaths(frame.abs_path);
41
- if (typeof frame.module === "string") frame.module = scrubSensitivePaths(frame.module);
42
- }
43
- }
44
- for (const span of event.spans ?? []) {
45
- if (typeof span.description === "string") span.description = anonymizeText(span.description);
46
- if (span.data) anonymizeInPlace(span.data);
47
- }
48
- return event;
49
- } catch {
50
- return null;
51
- }
52
- };
53
- //#endregion
54
- //#region src/cli/utils/sentry-config.ts
55
- /**
56
- * Shared Sentry configuration resolution — release, environment, and tracing
57
- * sample rate — derived from `VERSION` and the standard `SENTRY_*` env
58
- * overrides. Lives apart from `instrument.ts` so this resolution remains
59
- * independently testable.
60
- */
61
- /**
62
- * A version is a "dev" build when it's the unbuilt placeholder (`0.0.0`) or
63
- * carries a prerelease suffix (e.g. the `-dev.<sha>` snapshots published from
64
- * CI). Everything else is a real, tagged release.
65
- */
66
- const isDevVersion = (version) => version === "0.0.0" || version.includes("-");
67
- /**
68
- * Sentry release identifier. `react-doctor@<version>` keeps it unique within
69
- * the org and — crucially — matches the value `scripts/sentry-sourcemaps.mjs`
70
- * uploads source-map artifacts under, so stack frames symbolicate. Honors the
71
- * standard `SENTRY_RELEASE` override.
72
- */
73
- const resolveSentryRelease = () => process.env.SENTRY_RELEASE || `react-doctor@0.9.13-dev.ff7dd67`;
74
- /**
75
- * Deployment environment shown in Sentry's environment filter. Defaults to
76
- * `production` for tagged releases and `development` for dev/unbuilt versions,
77
- * overridable via the standard `SENTRY_ENVIRONMENT` env var.
78
- */
79
- const resolveSentryEnvironment = () => process.env.SENTRY_ENVIRONMENT || (isDevVersion("0.9.13-dev.ff7dd67") ? "development" : "production");
80
- //#endregion
81
- //#region src/instrument.ts
82
- let isInitialized = false;
83
- /**
84
- * Flushes queued Sentry events (errors + transactions) before the CLI exits, so
85
- * the success-path transaction is delivered. A no-op when Sentry was never
86
- * initialized, and it swallows transport failures so telemetry can never mask
87
- * the user's result.
88
- */
89
- const flushSentry = async () => {
90
- if (!Sentry.isInitialized()) return;
91
- try {
92
- await Sentry.flush(SENTRY_FLUSH_TIMEOUT_MS);
93
- } catch {}
94
- };
95
- /**
96
- * Initializes the Sentry Node SDK for CLI crash reporting and performance
97
- * crash reporting. Invoked as the first statement of the CLI entry
98
- * (`cli/index.ts`) so the SDK's global `uncaughtException` /
99
- * `unhandledRejection` handlers are armed before any command runs.
100
- *
101
- * Performance tracing is off: spans are exported to Axiom instead (see
102
- * `telemetry-runtime.ts`), and Effect has a single `Tracer` reference, so the
103
- * two backends are mutually exclusive. Sentry keeps what it is good at —
104
- * symbolicated stack traces, issue grouping, and a quotable event id — while
105
- * crashes carry the Axiom trace id as a tag so an issue pivots into its trace.
106
- *
107
- * Exported as a function rather than a bare side-effecting import because the
108
- * package declares `"sideEffects": false`, which lets the bundler tree-shake
109
- * side-effect-only modules. An explicit call keeps the initialization in the
110
- * published `dist/cli.js`.
111
- *
112
- * Scoped to the CLI application only — the programmatic `@react-doctor/api`
113
- * library never initializes Sentry, so importing `diagnose()` into a consumer
114
- * app can't hijack their telemetry.
115
- *
116
- * Configuration is environment-overridable for self-hosting and tuning:
117
- * `SENTRY_DSN`, `SENTRY_ENVIRONMENT`, `SENTRY_RELEASE`, and `SENTRY_DEBUG`.
118
- */
119
- const initializeSentry = () => {
120
- if (isInitialized || !isTelemetryEnabled()) return;
121
- isInitialized = true;
122
- const { tags, contexts } = buildSentryScope();
123
- try {
124
- Sentry.init({
125
- dsn: process.env.SENTRY_DSN || "https://f253d570240a59b8dbd77b7a548ef133@o4510226365743104.ingest.us.sentry.io/4511487817809920",
126
- release: resolveSentryRelease(),
127
- environment: resolveSentryEnvironment(),
128
- sendDefaultPii: false,
129
- tracesSampleRate: 0,
130
- debug: isEnvFlagEnabled(process.env.SENTRY_DEBUG),
131
- initialScope: {
132
- tags,
133
- contexts
134
- },
135
- beforeSend: (event, hint) => isExpectedUserError(hint.originalException) ? null : scrubSentryEvent(event)
136
- });
137
- } catch {}
138
- };
139
- //#endregion
140
- //#region src/cli/utils/resolve-measure-width.ts
141
- const resolveClampedWidth = (input) => {
142
- const terminalColumns = process.stdout.columns;
143
- if (!terminalColumns || terminalColumns <= 0) return input.fullWidth;
144
- const availableColumns = terminalColumns - input.reservedColumns;
145
- return Math.max(input.minWidth, Math.min(input.fullWidth, availableColumns));
146
- };
147
- const resolveMeasureWidth = (reservedColumns = 0) => resolveClampedWidth({
148
- reservedColumns,
149
- fullWidth: 60,
150
- minWidth: 24
151
- });
152
- //#endregion
153
- //#region src/cli/utils/wrap-indented-text.ts
154
- const wrapLine = (lineText, width, breakLongWords) => {
155
- if (lineText.length <= width) return [lineText];
156
- const wrappedLines = [];
157
- let remainingText = lineText.trim();
158
- while (remainingText.length > width) {
159
- const candidateText = remainingText.slice(0, width);
160
- const breakIndex = candidateText.lastIndexOf(" ");
161
- if (breakIndex <= 0) {
162
- if (breakLongWords) {
163
- wrappedLines.push(candidateText);
164
- remainingText = remainingText.slice(width).trimStart();
165
- continue;
166
- }
167
- const nextSpace = remainingText.indexOf(" ");
168
- if (nextSpace === -1) break;
169
- wrappedLines.push(remainingText.slice(0, nextSpace));
170
- remainingText = remainingText.slice(nextSpace + 1).trimStart();
171
- continue;
172
- }
173
- wrappedLines.push(remainingText.slice(0, breakIndex));
174
- remainingText = remainingText.slice(breakIndex + 1).trimStart();
175
- }
176
- if (remainingText.length > 0) wrappedLines.push(remainingText);
177
- return wrappedLines;
178
- };
179
- /**
180
- * Greedy word-wrap to a character width, returning one string per line
181
- * (no indentation applied). Preserves existing `\n` boundaries.
182
- */
183
- const wrapTextToWidth = (text, width, options = {}) => {
184
- if (width <= 0) return text.split("\n");
185
- const breakLongWords = options.breakLongWords ?? true;
186
- return text.split("\n").flatMap((lineText) => wrapLine(lineText, width, breakLongWords));
187
- };
188
- //#endregion
189
- //#region src/cli/utils/build-footer-description-lines.ts
190
- const FOOTER_DESCRIPTION_INDENT = " ";
191
- const buildFooterDescriptionLines = (description) => {
192
- return wrapTextToWidth(description, resolveMeasureWidth(2)).map((line) => highlighter.dim(`${FOOTER_DESCRIPTION_INDENT}${line}`));
193
- };
194
- //#endregion
195
- //#region src/cli/utils/build-footer-link-lines.ts
196
- const buildFooterLinkLines = ({ shareUrl }) => [
197
- ...shareUrl === null ? [] : [
198
- ` ${highlighter.bold("Share:")} ${highlighter.info(shareUrl)}`,
199
- ...buildFooterDescriptionLines("Tell others how you did on socials"),
200
- ""
201
- ],
202
- ` ${highlighter.bold("Docs:")} ${highlighter.info(DOCS_URL)}`,
203
- ...buildFooterDescriptionLines("Learn more about fixing issues, setting up CI/CD, and configuring rules with a config file"),
204
- "",
205
- ` ${highlighter.bold("GitHub:")} ${highlighter.info(CANONICAL_GITHUB_URL)}`,
206
- ...buildFooterDescriptionLines("Report issues and star the repository!")
207
- ];
208
- //#endregion
209
- //#region src/cli/utils/build-section-divider.ts
210
- const DIVIDER_INDENT = " ";
211
- const buildSectionDivider = () => highlighter.dim(`${DIVIDER_INDENT}${"─".repeat(resolveMeasureWidth(2))}`);
212
- //#endregion
213
- export { initializeSentry as i, buildFooterLinkLines as n, flushSentry as r, buildSectionDivider as t };
214
-
215
- //# sourceMappingURL=build-section-divider-BRuN44fL.js.map
216
- //# debugId=1fe38c74-620b-58bd-b005-f8dd797b21e0