react-doctor 0.9.12-dev.ffc2d14 → 0.9.13-dev.fd23edc

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 (47) hide show
  1. package/README.md +33 -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-BuOtLrzK.js → build-section-divider-CUtO-gXD.js} +8 -22
  5. package/dist/{ci-DVVsf25h.js → ci-DjilJaw4.js} +12 -11
  6. package/dist/cli.js +116 -35
  7. package/dist/{design-Y1pcA2uj.js → design-CXLKbARh.js} +4 -4
  8. package/dist/{devtools-D8NTVj81.js → devtools-CC2PAZ85.js} +3 -3
  9. package/dist/{exit-gracefully-DnXGONjj.js → exit-gracefully-DTLgxZZ5.js} +15 -9
  10. package/dist/get-east-asian-width-Bv2TD3Xj.js +444 -0
  11. package/dist/{report-error-MGKyeIns.js → handle-error-BqaqFvmc.js} +18 -68
  12. package/dist/index.d.ts +32 -0
  13. package/dist/index.js +585 -286
  14. package/dist/{inspect-g3_lzs3l.js → inspect-BIfnzKGq.js} +38 -28
  15. package/dist/{install-doctor-script-DmEWQpVJ.js → install-doctor-script-B1U08lUD.js} +7 -449
  16. package/dist/{install-github-workflow-Dx6Pl9Wl.js → install-github-workflow-CkOl0wCn.js} +10 -6
  17. package/dist/{install-02Lq6wKC.js → install-nhJ65X-y.js} +9 -8
  18. package/dist/{install-react-doctor-CMCXgenA.js → install-react-doctor-Dm35Egex.js} +8 -8
  19. package/dist/{run-scan-app-CDDu7P32.js → jsx-runtime-C1t3eR6p.js} +280 -2774
  20. package/dist/path-format-DnHpmJwG.js +9 -0
  21. package/dist/{print-branded-header-kbvWYuGv.js → print-branded-header-qOJiGkuW.js} +4 -4
  22. package/dist/project-analysis-worker.js +54 -53
  23. package/dist/prompt-runtime-scan-url-m88LMtMP.js +240 -0
  24. package/dist/{read-object-file-Cwhr9OIi.js → read-object-file-Cv41FpZo.js} +4 -4
  25. package/dist/{record-metric-CFfsgcVs.js → record-metric-u8youmM2.js} +548 -235
  26. package/dist/report-error-CkFgxJTQ.js +64 -0
  27. package/dist/{report-workflow-result-DGg9xopH.js → report-workflow-result-Wh1SQuOu.js} +5 -5
  28. package/dist/{resolve-scope-CXS-5jLR.js → resolve-scope-CHCpJtks.js} +8 -10
  29. package/dist/{rules-CThlosPx.js → rules-C30QFptP.js} +6 -6
  30. package/dist/run-scan-app-yTBDucJ3.js +2511 -0
  31. package/dist/runtime-scan/browser-probe.iife.js +855 -0
  32. package/dist/runtime-scan-VH25Yf8H.js +770 -0
  33. package/dist/sanitize-runtime-url-crVHbQlW.js +76 -0
  34. package/dist/scan-CNSRWEtJ.js +47 -0
  35. package/dist/{should-fail-scan-gate-C0Bo5Gqy.js → should-fail-scan-gate-Cw6KeoRT.js} +20 -112
  36. package/dist/{should-skip-prompts-BqrtVX4G.js → should-skip-prompts-B5zkkkKR.js} +4 -4
  37. package/dist/should-use-tui-S9255AG_.js +25 -0
  38. package/dist/skills/improve-threejs/SKILL.md +102 -0
  39. package/dist/skills/performance/SKILL.md +113 -0
  40. package/dist/skills/react-doctor/SKILL.md +6 -0
  41. package/dist/{unref-stdin-BxyvqsOy.js → telemetry-runtime-B2rpGWMl.js} +55 -25
  42. package/dist/unref-stdin-SK3WfwxS.js +12 -0
  43. package/dist/{version-S-8vvWFi.js → version-KQbGQSGN.js} +4 -4
  44. package/dist/{why-DXfx0oL9.js → why-B-l2qTCV.js} +4 -4
  45. package/dist/with-run-span-Dk1M8cnH.js +110 -0
  46. package/package.json +9 -6
  47. package/dist/scan-4I1mvxBO.js +0 -53
@@ -1,15 +1,16 @@
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]="38aa03c4-3985-547d-9a64-cf1c622167bc")}catch(e){}}();
3
- import { i as __toESM$1, r as __require, t as __commonJSMin$1 } from "./chunk-ChKA3wi6.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]="27aff5c2-a36f-5c1d-95e4-41bc603b5e7f")}catch(e){}}();
3
+ import { i as __toESM, r as __require, t as __commonJSMin } from "./chunk-ChKA3wi6.js";
4
4
  import { n as require_picomatch, t as require_semver } from "./semver-DFtnEmN-.js";
5
5
  import { createRequire } from "node:module";
6
6
  import * as NodeChildProcess from "node:child_process";
7
7
  import { execFile, execFileSync, spawn, spawnSync } from "node:child_process";
8
8
  import * as path$1$1 from "node:path";
9
- import path from "node:path";
9
+ import path, { join, posix } from "node:path";
10
10
  import * as fs$1$3 from "node:fs";
11
- import fs from "node:fs";
11
+ import fs, { existsSync } from "node:fs";
12
12
  import ts from "typescript";
13
+ import { parseSync } from "oxc-parser";
13
14
  import { ALL_REACT_DOCTOR_RULE_KEYS, CROSS_FILE_DEPENDENCY_COLLECTORS, CROSS_FILE_RULE_IDS, FRAMEWORK_SPECIFIC_RULE_KEYS, FRAMEWORK_TOKENS, MOTION_LIBRARY_PACKAGES, REACT_COMPILER_RULES, REACT_DOCTOR_OPT_IN_PROJECT_RULE_IDS, REACT_DOCTOR_PROJECT_RULES, REACT_DOCTOR_RULES, REACT_DOCTOR_RULE_REGISTRY, REACT_DOCTOR_SCAN_RULES, classifySecurityScanFile, collectCrossFileDependencyProbes, resetManifestCaches, shouldReadSecurityScanContent } from "oxlint-plugin-react-doctor/core";
14
15
  import * as Crypto from "node:crypto";
15
16
  import crypto, { createHash, randomUUID } from "node:crypto";
@@ -19,15 +20,15 @@ import { fileURLToPath } from "node:url";
19
20
  import * as OS from "node:os";
20
21
  import os from "node:os";
21
22
  import { createJiti } from "jiti";
22
- import { parseJSON5 } from "confbox";
23
+ import { parseJSON5, parseJSONC } from "confbox";
23
24
  import * as fs$1 from "node:fs/promises";
24
25
  import { PassThrough } from "node:stream";
25
26
  import { convertToTSX } from "@astrojs/compiler/sync";
26
27
  import { STATUS_CODES } from "node:http";
27
28
  import { gzipSync } from "node:zlib";
28
29
  import { performance as performance$1 } from "node:perf_hooks";
29
- //#region ../core/dist/collect-unplugin-auto-import-global-scopes-Dno9RW5R.js
30
- var import_picomatch = /* @__PURE__ */ __toESM$1(require_picomatch(), 1);
30
+ //#region ../core/dist/collect-unplugin-auto-import-global-scopes-Dwzr_czq.js
31
+ var import_picomatch = /* @__PURE__ */ __toESM(require_picomatch(), 1);
31
32
  const HTML_FILE_PATTERN = /\.html$/i;
32
33
  const SOURCE_FILE_PATTERN = /\.(?:astro|tsx?|jsx?|mts|mjs|[hH][tT][mM][lL])$/;
33
34
  const GENERATED_BUNDLE_FILE_PATTERN = /\.(iife|umd|global|min)\.m?js$/i;
@@ -311,6 +312,7 @@ const ES_TARGET_YEAR_BY_NAME = {
311
312
  * compiler options — the root config first, then a monorepo base config.
312
313
  */
313
314
  const TSCONFIG_FILENAMES = ["tsconfig.json", "tsconfig.base.json"];
315
+ const DISABLE_DIRECTIVE_BACKUP_DIRECTORY_SEGMENTS = [".react-doctor", "audit-backups"];
314
316
  /**
315
317
  * Project-config files that `StagedFiles.materialize` copies into
316
318
  * the temp directory alongside staged sources so oxlint resolves
@@ -570,6 +572,74 @@ const compileGlobPatternsLenient = (patterns, onInvalid) => {
570
572
  }
571
573
  return compiled;
572
574
  };
575
+ const isOxcAstNode = (value) => Boolean(value) && typeof value === "object" && typeof value.type === "string";
576
+ const getStaticModuleSpecifier = (value) => {
577
+ if (!isOxcAstNode(value)) return void 0;
578
+ if (typeof value.value === "string") return value.value;
579
+ if (value.type === "TemplateLiteral" && Array.isArray(value.expressions) && value.expressions.length === 0 && Array.isArray(value.quasis) && isOxcAstNode(value.quasis[0]) && value.quasis[0].value && typeof value.quasis[0].value === "object" && "cooked" in value.quasis[0].value && typeof value.quasis[0].value.cooked === "string") return value.quasis[0].value.cooked;
580
+ };
581
+ const collectStaticModuleSpecifiers = (sourceText, options = {}) => {
582
+ const { filePath = "module.tsx", includeTypeOnly = true } = options;
583
+ const parsedModule = parseSync(filePath, sourceText, { sourceType: "unambiguous" });
584
+ const moduleSpecifiers = /* @__PURE__ */ new Set();
585
+ const addSpecifier = (value) => {
586
+ const moduleSpecifier = getStaticModuleSpecifier(value);
587
+ if (moduleSpecifier) moduleSpecifiers.add(moduleSpecifier);
588
+ };
589
+ const visitNode = (value) => {
590
+ if (Array.isArray(value)) {
591
+ for (const child of value) visitNode(child);
592
+ return;
593
+ }
594
+ if (!isOxcAstNode(value)) return;
595
+ if (value.type === "ImportDeclaration") {
596
+ const specifiers = Array.isArray(value.specifiers) ? value.specifiers : [];
597
+ const hasRuntimeSpecifier = specifiers.some((specifier) => !isOxcAstNode(specifier) || specifier.importKind !== "type");
598
+ if (includeTypeOnly || value.importKind !== "type" && (specifiers.length === 0 || hasRuntimeSpecifier)) addSpecifier(value.source);
599
+ } else if (value.type === "ExportNamedDeclaration") {
600
+ const specifiers = Array.isArray(value.specifiers) ? value.specifiers : [];
601
+ const hasRuntimeSpecifier = specifiers.some((specifier) => !isOxcAstNode(specifier) || specifier.exportKind !== "type");
602
+ if (includeTypeOnly || value.exportKind !== "type" && (specifiers.length === 0 || hasRuntimeSpecifier)) addSpecifier(value.source);
603
+ } else if (value.type === "ExportAllDeclaration" || value.type === "ImportExpression") {
604
+ if (includeTypeOnly || value.exportKind !== "type") addSpecifier(value.source);
605
+ } else if (value.type === "TSImportType") {
606
+ if (includeTypeOnly) addSpecifier(value.source);
607
+ } else if (value.type === "TSExternalModuleReference") addSpecifier(value.expression);
608
+ else if (value.type === "CallExpression" && isOxcAstNode(value.callee) && value.callee.type === "Identifier" && value.callee.name === "require" && Array.isArray(value.arguments) && value.arguments.length > 0) addSpecifier(value.arguments[0]);
609
+ for (const child of Object.values(value)) visitNode(child);
610
+ };
611
+ visitNode(parsedModule.program);
612
+ return moduleSpecifiers;
613
+ };
614
+ const toPosixPath = (filePath) => filePath.replace(/\\/g, "/");
615
+ const isPathInsideDirectoryOrEqual = (candidatePath, directoryPath) => {
616
+ const normalizedCandidatePath = posix.normalize(toPosixPath(candidatePath));
617
+ const normalizedDirectoryPath = posix.normalize(toPosixPath(directoryPath));
618
+ const relativePath = posix.relative(normalizedDirectoryPath, normalizedCandidatePath);
619
+ return relativePath === "" || relativePath !== ".." && !relativePath.startsWith("../") && !posix.isAbsolute(relativePath);
620
+ };
621
+ const RESOLVABLE_EXTENSIONS = [
622
+ ".ts",
623
+ ".tsx",
624
+ ".js",
625
+ ".jsx",
626
+ ".mjs",
627
+ ".mts",
628
+ ".cjs",
629
+ ".cts",
630
+ ".es6"
631
+ ];
632
+ const resolveEntryWithExtensions = (basePath) => {
633
+ if (existsSync(basePath)) return basePath;
634
+ for (const extension of RESOLVABLE_EXTENSIONS) {
635
+ const withExtension = basePath + extension;
636
+ if (existsSync(withExtension)) return withExtension;
637
+ }
638
+ for (const extension of RESOLVABLE_EXTENSIONS) {
639
+ const indexCandidate = join(basePath, `index${extension}`);
640
+ if (existsSync(indexCandidate)) return indexCandidate;
641
+ }
642
+ };
573
643
  /**
574
644
  * Resolves a path to its canonical, symlink-free form, falling back to
575
645
  * the input when it cannot be realpath'd (broken symlink, permission
@@ -22136,7 +22206,7 @@ Union([
22136
22206
  ]);
22137
22207
  //#endregion
22138
22208
  //#region ../../node_modules/.pnpm/baseline-browser-mapping@2.9.19/node_modules/baseline-browser-mapping/dist/index.cjs
22139
- var require_dist = /* @__PURE__ */ __commonJSMin$1(((exports) => {
22209
+ var require_dist = /* @__PURE__ */ __commonJSMin(((exports) => {
22140
22210
  const s = {
22141
22211
  chrome: { releases: [
22142
22212
  [
@@ -41386,7 +41456,7 @@ var require_dist = /* @__PURE__ */ __commonJSMin$1(((exports) => {
41386
41456
  }));
41387
41457
  //#endregion
41388
41458
  //#region ../../node_modules/.pnpm/node-releases@2.0.27/node_modules/node-releases/data/processed/envs.json
41389
- var require_envs = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
41459
+ var require_envs = /* @__PURE__ */ __commonJSMin(((exports, module) => {
41390
41460
  module.exports = [
41391
41461
  {
41392
41462
  "name": "nodejs",
@@ -44168,7 +44238,7 @@ var require_envs = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
44168
44238
  }));
44169
44239
  //#endregion
44170
44240
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/data/browsers.js
44171
- var require_browsers$1 = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
44241
+ var require_browsers$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
44172
44242
  module.exports = {
44173
44243
  A: "ie",
44174
44244
  B: "edge",
@@ -44193,12 +44263,12 @@ var require_browsers$1 = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
44193
44263
  }));
44194
44264
  //#endregion
44195
44265
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/dist/unpacker/browsers.js
44196
- var require_browsers = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
44266
+ var require_browsers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
44197
44267
  module.exports.browsers = require_browsers$1();
44198
44268
  }));
44199
44269
  //#endregion
44200
44270
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/data/browserVersions.js
44201
- var require_browserVersions$1 = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
44271
+ var require_browserVersions$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
44202
44272
  module.exports = {
44203
44273
  "0": "117",
44204
44274
  "1": "118",
@@ -44450,12 +44520,12 @@ var require_browserVersions$1 = /* @__PURE__ */ __commonJSMin$1(((exports, modul
44450
44520
  }));
44451
44521
  //#endregion
44452
44522
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/dist/unpacker/browserVersions.js
44453
- var require_browserVersions = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
44523
+ var require_browserVersions = /* @__PURE__ */ __commonJSMin(((exports, module) => {
44454
44524
  module.exports.browserVersions = require_browserVersions$1();
44455
44525
  }));
44456
44526
  //#endregion
44457
44527
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/data/agents.js
44458
- var require_agents$1 = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
44528
+ var require_agents$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
44459
44529
  module.exports = {
44460
44530
  A: {
44461
44531
  A: {
@@ -48824,7 +48894,7 @@ var require_agents$1 = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
48824
48894
  }));
48825
48895
  //#endregion
48826
48896
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/dist/unpacker/agents.js
48827
- var require_agents = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
48897
+ var require_agents = /* @__PURE__ */ __commonJSMin(((exports, module) => {
48828
48898
  const browsers = require_browsers().browsers;
48829
48899
  const versions = require_browserVersions().browserVersions;
48830
48900
  const agentsData = require_agents$1();
@@ -48857,7 +48927,7 @@ var require_agents = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
48857
48927
  }));
48858
48928
  //#endregion
48859
48929
  //#region ../../node_modules/.pnpm/electron-to-chromium@1.5.286/node_modules/electron-to-chromium/versions.js
48860
- var require_versions = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
48930
+ var require_versions = /* @__PURE__ */ __commonJSMin(((exports, module) => {
48861
48931
  module.exports = {
48862
48932
  "0.20": "39",
48863
48933
  "0.21": "41",
@@ -49091,7 +49161,7 @@ var require_versions = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49091
49161
  }));
49092
49162
  //#endregion
49093
49163
  //#region ../../node_modules/.pnpm/node-releases@2.0.27/node_modules/node-releases/data/release-schedule/release-schedule.json
49094
- var require_release_schedule = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49164
+ var require_release_schedule = /* @__PURE__ */ __commonJSMin(((exports, module) => {
49095
49165
  module.exports = {
49096
49166
  "v0.8": {
49097
49167
  "start": "2012-06-25",
@@ -49248,7 +49318,7 @@ var require_release_schedule = /* @__PURE__ */ __commonJSMin$1(((exports, module
49248
49318
  }));
49249
49319
  //#endregion
49250
49320
  //#region ../../node_modules/.pnpm/browserslist@4.28.1/node_modules/browserslist/error.js
49251
- var require_error = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49321
+ var require_error = /* @__PURE__ */ __commonJSMin(((exports, module) => {
49252
49322
  function BrowserslistError(message) {
49253
49323
  this.name = "BrowserslistError";
49254
49324
  this.message = message;
@@ -49260,7 +49330,7 @@ var require_error = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49260
49330
  }));
49261
49331
  //#endregion
49262
49332
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/dist/lib/statuses.js
49263
- var require_statuses = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49333
+ var require_statuses = /* @__PURE__ */ __commonJSMin(((exports, module) => {
49264
49334
  module.exports = {
49265
49335
  1: "ls",
49266
49336
  2: "rec",
@@ -49273,7 +49343,7 @@ var require_statuses = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49273
49343
  }));
49274
49344
  //#endregion
49275
49345
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/dist/lib/supported.js
49276
- var require_supported = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49346
+ var require_supported = /* @__PURE__ */ __commonJSMin(((exports, module) => {
49277
49347
  module.exports = {
49278
49348
  y: 1,
49279
49349
  n: 2,
@@ -49286,7 +49356,7 @@ var require_supported = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49286
49356
  }));
49287
49357
  //#endregion
49288
49358
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/dist/unpacker/feature.js
49289
- var require_feature = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49359
+ var require_feature = /* @__PURE__ */ __commonJSMin(((exports, module) => {
49290
49360
  const statuses = require_statuses();
49291
49361
  const supported = require_supported();
49292
49362
  const browsers = require_browsers().browsers;
@@ -49329,7 +49399,7 @@ var require_feature = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49329
49399
  }));
49330
49400
  //#endregion
49331
49401
  //#region ../../node_modules/.pnpm/caniuse-lite@1.0.30001769/node_modules/caniuse-lite/dist/unpacker/region.js
49332
- var require_region = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49402
+ var require_region = /* @__PURE__ */ __commonJSMin(((exports, module) => {
49333
49403
  const browsers = require_browsers().browsers;
49334
49404
  function unpackRegion(packed) {
49335
49405
  return Object.keys(packed).reduce((list, browser) => {
@@ -49348,7 +49418,7 @@ var require_region = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49348
49418
  }));
49349
49419
  //#endregion
49350
49420
  //#region ../../node_modules/.pnpm/browserslist@4.28.1/node_modules/browserslist/node.js
49351
- var require_node = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49421
+ var require_node = /* @__PURE__ */ __commonJSMin(((exports, module) => {
49352
49422
  var feature = require_feature().default;
49353
49423
  var region = require_region().default;
49354
49424
  var fs$2 = __require("fs");
@@ -49641,7 +49711,7 @@ var require_node = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49641
49711
  }));
49642
49712
  //#endregion
49643
49713
  //#region ../../node_modules/.pnpm/browserslist@4.28.1/node_modules/browserslist/parse.js
49644
- var require_parse = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49714
+ var require_parse = /* @__PURE__ */ __commonJSMin(((exports, module) => {
49645
49715
  var AND_REGEXP = /^\s+and\s+(.*)/i;
49646
49716
  var OR_REGEXP = /^(?:,\s*|\s+or\s+)(.*)/i;
49647
49717
  function flatten(array) {
@@ -49707,7 +49777,7 @@ var require_parse = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49707
49777
  }));
49708
49778
  //#endregion
49709
49779
  //#region ../../node_modules/.pnpm/browserslist@4.28.1/node_modules/browserslist/index.js
49710
- var require_browserslist = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
49780
+ var require_browserslist = /* @__PURE__ */ __commonJSMin(((exports, module) => {
49711
49781
  var bbm = require_dist();
49712
49782
  var jsReleases = require_envs();
49713
49783
  var agents = require_agents().agents;
@@ -50729,8 +50799,8 @@ var require_browserslist = /* @__PURE__ */ __commonJSMin$1(((exports, module) =>
50729
50799
  }));
50730
50800
  //#endregion
50731
50801
  //#region ../../node_modules/.pnpm/effect@4.0.0-beta.102/node_modules/effect/dist/Brand.js
50732
- var import_semver = /* @__PURE__ */ __toESM$1(require_semver(), 1);
50733
- var import_browserslist = /* @__PURE__ */ __toESM$1(require_browserslist(), 1);
50802
+ var import_semver = /* @__PURE__ */ __toESM(require_semver(), 1);
50803
+ var import_browserslist = /* @__PURE__ */ __toESM(require_browserslist(), 1);
50734
50804
  /**
50735
50805
  * Returns a `Constructor` that **does not apply any runtime checks** and just
50736
50806
  * returns the provided value.
@@ -60327,6 +60397,72 @@ const warn$1 = (...args) => consoleWith((console) => sync$2(() => {
60327
60397
  }));
60328
60398
  //#endregion
60329
60399
  //#region ../../node_modules/.pnpm/effect@4.0.0-beta.102/node_modules/effect/dist/Cache.js
60400
+ var import_picocolors = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
60401
+ let p = process || {}, argv = p.argv || [], env = p.env || {};
60402
+ let isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
60403
+ let formatter = (open, close, replace = open) => (input) => {
60404
+ let string = "" + input, index = string.indexOf(close, open.length);
60405
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
60406
+ };
60407
+ let replaceClose = (string, close, replace, index) => {
60408
+ let result = "", cursor = 0;
60409
+ do {
60410
+ result += string.substring(cursor, index) + replace;
60411
+ cursor = index + close.length;
60412
+ index = string.indexOf(close, cursor);
60413
+ } while (~index);
60414
+ return result + string.substring(cursor);
60415
+ };
60416
+ let createColors = (enabled = isColorSupported) => {
60417
+ let f = enabled ? formatter : () => String;
60418
+ return {
60419
+ isColorSupported: enabled,
60420
+ reset: f("\x1B[0m", "\x1B[0m"),
60421
+ bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
60422
+ dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
60423
+ italic: f("\x1B[3m", "\x1B[23m"),
60424
+ underline: f("\x1B[4m", "\x1B[24m"),
60425
+ inverse: f("\x1B[7m", "\x1B[27m"),
60426
+ hidden: f("\x1B[8m", "\x1B[28m"),
60427
+ strikethrough: f("\x1B[9m", "\x1B[29m"),
60428
+ black: f("\x1B[30m", "\x1B[39m"),
60429
+ red: f("\x1B[31m", "\x1B[39m"),
60430
+ green: f("\x1B[32m", "\x1B[39m"),
60431
+ yellow: f("\x1B[33m", "\x1B[39m"),
60432
+ blue: f("\x1B[34m", "\x1B[39m"),
60433
+ magenta: f("\x1B[35m", "\x1B[39m"),
60434
+ cyan: f("\x1B[36m", "\x1B[39m"),
60435
+ white: f("\x1B[37m", "\x1B[39m"),
60436
+ gray: f("\x1B[90m", "\x1B[39m"),
60437
+ bgBlack: f("\x1B[40m", "\x1B[49m"),
60438
+ bgRed: f("\x1B[41m", "\x1B[49m"),
60439
+ bgGreen: f("\x1B[42m", "\x1B[49m"),
60440
+ bgYellow: f("\x1B[43m", "\x1B[49m"),
60441
+ bgBlue: f("\x1B[44m", "\x1B[49m"),
60442
+ bgMagenta: f("\x1B[45m", "\x1B[49m"),
60443
+ bgCyan: f("\x1B[46m", "\x1B[49m"),
60444
+ bgWhite: f("\x1B[47m", "\x1B[49m"),
60445
+ blackBright: f("\x1B[90m", "\x1B[39m"),
60446
+ redBright: f("\x1B[91m", "\x1B[39m"),
60447
+ greenBright: f("\x1B[92m", "\x1B[39m"),
60448
+ yellowBright: f("\x1B[93m", "\x1B[39m"),
60449
+ blueBright: f("\x1B[94m", "\x1B[39m"),
60450
+ magentaBright: f("\x1B[95m", "\x1B[39m"),
60451
+ cyanBright: f("\x1B[96m", "\x1B[39m"),
60452
+ whiteBright: f("\x1B[97m", "\x1B[39m"),
60453
+ bgBlackBright: f("\x1B[100m", "\x1B[49m"),
60454
+ bgRedBright: f("\x1B[101m", "\x1B[49m"),
60455
+ bgGreenBright: f("\x1B[102m", "\x1B[49m"),
60456
+ bgYellowBright: f("\x1B[103m", "\x1B[49m"),
60457
+ bgBlueBright: f("\x1B[104m", "\x1B[49m"),
60458
+ bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
60459
+ bgCyanBright: f("\x1B[106m", "\x1B[49m"),
60460
+ bgWhiteBright: f("\x1B[107m", "\x1B[49m")
60461
+ };
60462
+ };
60463
+ module.exports = createColors();
60464
+ module.exports.createColors = createColors;
60465
+ })))(), 1);
60330
60466
  /**
60331
60467
  * Caches values loaded by an Effect lookup function.
60332
60468
  *
@@ -62296,27 +62432,6 @@ function traceSegmentInternal(segments, memo, line, column, bias) {
62296
62432
  }
62297
62433
  //#endregion
62298
62434
  //#region ../core/dist/index.js
62299
- var __create = Object.create;
62300
- var __defProp = Object.defineProperty;
62301
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
62302
- var __getOwnPropNames = Object.getOwnPropertyNames;
62303
- var __getProtoOf = Object.getPrototypeOf;
62304
- var __hasOwnProp = Object.prototype.hasOwnProperty;
62305
- var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
62306
- var __copyProps = (to, from, except, desc) => {
62307
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
62308
- key = keys[i];
62309
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
62310
- get: ((k) => from[k]).bind(null, key),
62311
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
62312
- });
62313
- }
62314
- return to;
62315
- };
62316
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
62317
- value: mod,
62318
- enumerable: true
62319
- }) : target, mod));
62320
62435
  var ProjectNotFoundError = class extends Error {
62321
62436
  name = "ProjectNotFoundError";
62322
62437
  directory;
@@ -63691,6 +63806,18 @@ const detectPreES2023Target = (directory) => {
63691
63806
  }
63692
63807
  return false;
63693
63808
  };
63809
+ const SHADCN_CONFIG_FILE_NAME = "components.json";
63810
+ const detectShadcnUi = (directory) => {
63811
+ if (isFile(path$1$1.join(directory, SHADCN_CONFIG_FILE_NAME))) return true;
63812
+ if (isProjectBoundary(directory)) return false;
63813
+ let ancestorDirectory = path$1$1.dirname(directory);
63814
+ while (ancestorDirectory !== path$1$1.dirname(ancestorDirectory)) {
63815
+ if (isFile(path$1$1.join(ancestorDirectory, SHADCN_CONFIG_FILE_NAME))) return true;
63816
+ if (isProjectBoundary(ancestorDirectory)) return false;
63817
+ ancestorDirectory = path$1$1.dirname(ancestorDirectory);
63818
+ }
63819
+ return false;
63820
+ };
63694
63821
  const FRAMEWORK_PACKAGES = {
63695
63822
  next: "nextjs",
63696
63823
  "@tanstack/react-start": "tanstack-start",
@@ -64456,6 +64583,29 @@ const getTanStackQueryVersion = (packageJson) => {
64456
64583
  packageNames: TANSTACK_REACT_QUERY_PACKAGES
64457
64584
  });
64458
64585
  };
64586
+ const hasAnyDependency = (packageJson, packageNames) => {
64587
+ const allDependencies = {
64588
+ ...packageJson.peerDependencies,
64589
+ ...packageJson.dependencies,
64590
+ ...packageJson.devDependencies,
64591
+ ...packageJson.optionalDependencies
64592
+ };
64593
+ return packageNames.some((packageName) => allDependencies[packageName] !== void 0);
64594
+ };
64595
+ const BASE_UI_PACKAGES = ["@base-ui-components/react", "@base-ui/react"];
64596
+ const hasBaseUiDependency = (packageJson) => hasAnyDependency(packageJson, BASE_UI_PACKAGES);
64597
+ const RADIX_UNIFIED_PACKAGE = "radix-ui";
64598
+ const RADIX_PRIMITIVE_PACKAGE_PREFIX = "@radix-ui/react-";
64599
+ const RADIX_NON_PRIMITIVE_PACKAGES = new Set(["@radix-ui/react-icons"]);
64600
+ const hasRadixUiDependency = (packageJson) => {
64601
+ const allDependencies = {
64602
+ ...packageJson.peerDependencies,
64603
+ ...packageJson.dependencies,
64604
+ ...packageJson.devDependencies,
64605
+ ...packageJson.optionalDependencies
64606
+ };
64607
+ return Object.keys(allDependencies).some((packageName) => packageName === RADIX_UNIFIED_PACKAGE || packageName.startsWith(RADIX_PRIMITIVE_PACKAGE_PREFIX) && !RADIX_NON_PRIMITIVE_PACKAGES.has(packageName));
64608
+ };
64459
64609
  const STYLED_COMPONENTS_PACKAGES = ["styled-components"];
64460
64610
  const getStyledComponentsVersion = (packageJson) => {
64461
64611
  return getPreferredDependencyVersion({
@@ -64486,6 +64636,10 @@ const hasI18nDependency = (packageJson) => {
64486
64636
  };
64487
64637
  return I18N_PACKAGES.some((packageName) => allDependencies[packageName] !== void 0);
64488
64638
  };
64639
+ const REACT_ARIA_COMPONENT_PACKAGES = ["react-aria-components"];
64640
+ const TANSTACK_TABLE_PACKAGES = ["@tanstack/react-table"];
64641
+ const TANSTACK_VIRTUAL_PACKAGES = ["@tanstack/react-virtual"];
64642
+ const TANSTACK_FORM_PACKAGES = ["@tanstack/react-form"];
64489
64643
  const REANIMATED_DEPENDENCY_NAME = "react-native-reanimated";
64490
64644
  const MOBX_REACT_PACKAGE_NAME = "mobx-react";
64491
64645
  const MOBX_REACT_LITE_PACKAGE_NAME = "mobx-react-lite";
@@ -64676,6 +64830,13 @@ const evaluateManifestFacts = (facts, packageJson, directory, rootDirectory, roo
64676
64830
  });
64677
64831
  if (styledComponentsVersion && shouldReplaceStyledComponentsVersion(facts.styledComponentsVersion, styledComponentsVersion)) facts.styledComponentsVersion = styledComponentsVersion;
64678
64832
  facts.hasI18nLibrary = facts.hasI18nLibrary || hasI18nDependency(packageJson);
64833
+ facts.hasShadcnUi = facts.hasShadcnUi || detectShadcnUi(directory);
64834
+ facts.hasRadixUi = facts.hasRadixUi || hasRadixUiDependency(packageJson);
64835
+ facts.hasBaseUi = facts.hasBaseUi || hasBaseUiDependency(packageJson);
64836
+ facts.hasReactAriaComponents = facts.hasReactAriaComponents || hasAnyDependency(packageJson, REACT_ARIA_COMPONENT_PACKAGES);
64837
+ facts.hasTanstackTable = facts.hasTanstackTable || hasAnyDependency(packageJson, TANSTACK_TABLE_PACKAGES);
64838
+ facts.hasTanstackVirtual = facts.hasTanstackVirtual || hasAnyDependency(packageJson, TANSTACK_VIRTUAL_PACKAGES);
64839
+ facts.hasTanstackForm = facts.hasTanstackForm || hasAnyDependency(packageJson, TANSTACK_FORM_PACKAGES);
64679
64840
  for (const packageName of REACT_THREE_FIBER_DEPENDENCY_NAMES) {
64680
64841
  const version = resolveCatalogBackedDependencyVersion({
64681
64842
  rootDirectory,
@@ -64778,6 +64939,13 @@ const collectWorkspaceFacts = (rootDirectory, rootPackageJson, { collectReactGro
64778
64939
  tanstackQueryVersion: null,
64779
64940
  styledComponentsVersion: null,
64780
64941
  hasI18nLibrary: false,
64942
+ hasShadcnUi: false,
64943
+ hasRadixUi: false,
64944
+ hasBaseUi: false,
64945
+ hasReactAriaComponents: false,
64946
+ hasTanstackTable: false,
64947
+ hasTanstackVirtual: false,
64948
+ hasTanstackForm: false,
64781
64949
  hasReactNativeAwarePackage: false,
64782
64950
  hasReanimatedAwarePackage: false,
64783
64951
  hasSsrDependency: false,
@@ -65122,6 +65290,12 @@ const discoverProjectWithoutPackageJson = (directory, options) => {
65122
65290
  remotionVersion: null,
65123
65291
  remotionMajorVersion: null,
65124
65292
  hasI18nLibrary: false,
65293
+ hasRadixUi: false,
65294
+ hasBaseUi: false,
65295
+ hasReactAriaComponents: false,
65296
+ hasTanstackTable: false,
65297
+ hasTanstackVirtual: false,
65298
+ hasTanstackForm: false,
65125
65299
  tanstackQueryVersion: null,
65126
65300
  styledComponentsVersion: null,
65127
65301
  hasThree: false,
@@ -65143,6 +65317,7 @@ const discoverProjectWithoutPackageJson = (directory, options) => {
65143
65317
  shopifyFlashListMajorVersion: null,
65144
65318
  hasReanimated: false,
65145
65319
  reanimatedVersion: null,
65320
+ hasShadcnUi: detectShadcnUi(directory),
65146
65321
  isPreES2023Target: hasOwnTsConfig && detectPreES2023Target(directory),
65147
65322
  isStaticExport: false,
65148
65323
  sourceFileCount
@@ -65305,6 +65480,12 @@ const discoverProject = (directory, options = {}) => {
65305
65480
  hasReactCompilerLintPlugin: detectReactCompilerLintPlugin(directory, packageJson),
65306
65481
  hasTanStackQuery: tanstackQueryVersion !== null,
65307
65482
  hasI18nLibrary: workspaceFacts.hasI18nLibrary,
65483
+ hasRadixUi: workspaceFacts.hasRadixUi,
65484
+ hasBaseUi: workspaceFacts.hasBaseUi,
65485
+ hasReactAriaComponents: workspaceFacts.hasReactAriaComponents,
65486
+ hasTanstackTable: workspaceFacts.hasTanstackTable,
65487
+ hasTanstackVirtual: workspaceFacts.hasTanstackVirtual,
65488
+ hasTanstackForm: workspaceFacts.hasTanstackForm,
65308
65489
  tanstackQueryVersion,
65309
65490
  styledComponentsVersion: workspaceFacts.styledComponentsVersion,
65310
65491
  valtioVersion,
@@ -65331,6 +65512,7 @@ const discoverProject = (directory, options = {}) => {
65331
65512
  shopifyFlashListMajorVersion: shopifyFlashListVersion === null ? null : getLowestDependencyMajor(shopifyFlashListVersion),
65332
65513
  hasReanimated,
65333
65514
  reanimatedVersion,
65515
+ hasShadcnUi: workspaceFacts.hasShadcnUi,
65334
65516
  isPreES2023Target,
65335
65517
  isStaticExport: framework === "nextjs" && detectNextjsStaticExport(workspaceFacts.next.sourceDirectory ?? directory),
65336
65518
  sourceFileCount
@@ -65518,12 +65700,26 @@ const getEquivalentRuleKeys = (ruleKey) => {
65518
65700
  const nativeRuleKey = canonicalizeRuleKey(ruleKey);
65519
65701
  return [nativeRuleKey, ...getLegacyRuleKeysForNative(nativeRuleKey)];
65520
65702
  };
65521
- const toRelativePath = (filePath, rootDirectory) => {
65522
- const normalizedFilePath = filePath.replace(/\\/g, "/");
65523
- const normalizedRoot = rootDirectory.replace(/\\/g, "/").replace(/\/$/, "") + "/";
65524
- if (normalizedFilePath.startsWith(normalizedRoot)) return normalizedFilePath.slice(normalizedRoot.length);
65525
- return normalizedFilePath.replace(/^\.\//, "");
65703
+ /**
65704
+ * Resolves the absolute path to read for a diagnostic's `filePath`,
65705
+ * accounting for the various shapes oxlint emits:
65706
+ *
65707
+ * - `file://` URL — decode to an absolute filesystem path.
65708
+ * - Absolute POSIX (`/abs/path/file.tsx`) — pass through.
65709
+ * - Absolute Windows (`C:/...` or `C:\...`) — pass through.
65710
+ * - `./relative` or bare relative — join against `rootDirectory`.
65711
+ *
65712
+ * Shared between the streaming diagnostic pipeline and the legacy
65713
+ * array-shaped `mergeAndFilterDiagnostics` wrapper so file-line lookups
65714
+ * use one canonical resolution path.
65715
+ */
65716
+ const resolveCandidateReadPath = (rootDirectory, filePath) => {
65717
+ if (filePath.startsWith("file://")) return fileURLToPath(filePath);
65718
+ const normalizedFile = filePath.replace(/\\/g, "/");
65719
+ if (normalizedFile.startsWith("/") || /^[a-zA-Z]:\//.test(normalizedFile) || /^[a-zA-Z]:\\/.test(filePath)) return filePath;
65720
+ return `${rootDirectory.replace(/\\/g, "/").replace(/\/$/, "")}/${normalizedFile.replace(/^\.\//, "")}`;
65526
65721
  };
65722
+ const toNormalizedRelativePath = (filePath, rootDirectory) => path$1$1.relative(path$1$1.resolve(rootDirectory), path$1$1.resolve(resolveCandidateReadPath(rootDirectory, filePath))).replaceAll("\\", "/") || ".";
65527
65723
  const warnConfigIssue = (message) => {
65528
65724
  process.stderr.write(`[react-doctor] ${message}\n`);
65529
65725
  };
@@ -65572,7 +65768,7 @@ const compileIgnoreOverrides = (userConfig) => {
65572
65768
  };
65573
65769
  const isDiagnosticIgnoredByOverrides = (diagnostic, rootDirectory, overrides) => {
65574
65770
  if (overrides.length === 0) return false;
65575
- const relativeFilePath = toRelativePath(diagnostic.filePath, rootDirectory);
65771
+ const relativeFilePath = toNormalizedRelativePath(diagnostic.filePath, rootDirectory);
65576
65772
  const ruleIdentifier = `${diagnostic.plugin}/${diagnostic.rule}`;
65577
65773
  return overrides.some((override) => override.filePatterns.some((pattern) => pattern.test(relativeFilePath)) && hasMatchingRuleOverride(override.ruleIds, ruleIdentifier));
65578
65774
  };
@@ -65912,7 +66108,7 @@ const compileIgnoredFilePatterns = (userConfig) => {
65912
66108
  };
65913
66109
  const isFileIgnoredByPatterns = (filePath, rootDirectory, patterns) => {
65914
66110
  if (patterns.length === 0) return false;
65915
- const relativePath = toRelativePath(filePath, rootDirectory);
66111
+ const relativePath = toNormalizedRelativePath(filePath, rootDirectory);
65916
66112
  return patterns.some((pattern) => pattern.test(relativePath));
65917
66113
  };
65918
66114
  const SCRIPT_EXTENSION_FRAGMENT = "[cm]?[jt]sx?";
@@ -66036,25 +66232,6 @@ const classifyPackageRole = (filename) => {
66036
66232
  return result;
66037
66233
  };
66038
66234
  /**
66039
- * Resolves the absolute path to read for a diagnostic's `filePath`,
66040
- * accounting for the various shapes oxlint emits:
66041
- *
66042
- * - `file://` URL — decode to an absolute filesystem path.
66043
- * - Absolute POSIX (`/abs/path/file.tsx`) — pass through.
66044
- * - Absolute Windows (`C:/...` or `C:\...`) — pass through.
66045
- * - `./relative` or bare relative — join against `rootDirectory`.
66046
- *
66047
- * Shared between the streaming diagnostic pipeline and the legacy
66048
- * array-shaped `mergeAndFilterDiagnostics` wrapper so file-line lookups
66049
- * use one canonical resolution path.
66050
- */
66051
- const resolveCandidateReadPath = (rootDirectory, filePath) => {
66052
- if (filePath.startsWith("file://")) return fileURLToPath(filePath);
66053
- const normalizedFile = filePath.replace(/\\/g, "/");
66054
- if (normalizedFile.startsWith("/") || /^[a-zA-Z]:\//.test(normalizedFile) || /^[a-zA-Z]:\\/.test(filePath)) return filePath;
66055
- return `${rootDirectory.replace(/\\/g, "/").replace(/\/$/, "")}/${normalizedFile.replace(/^\.\//, "")}`;
66056
- };
66057
- /**
66058
66235
  * Shared raw-line scanners that detect whether a diagnostic site is
66059
66236
  * enclosed by a configured `textComponents` entry or a
66060
66237
  * `rawTextWrapperComponents` entry. Both checks are used by the
@@ -67738,6 +67915,28 @@ const checkExpoEnvLocalFiles = (context) => {
67738
67915
  help: `Add \`.env*.local\` to your .gitignore. If already committed, untrack with \`git rm --cached ${committedEnvFiles.join(" ")}\``
67739
67916
  })];
67740
67917
  };
67918
+ const JAVASCRIPT_MODULE_FILE_PATTERN = /\.[cm]?[jt]sx?$/;
67919
+ const hasStaticModuleSubpath = (rootDirectory, packageName) => {
67920
+ const packageSubpathPrefix = `${packageName}/`;
67921
+ for (const { absolutePath, name } of walkSourceTreeFiles(rootDirectory)) {
67922
+ if (!JAVASCRIPT_MODULE_FILE_PATTERN.test(name)) continue;
67923
+ let sourceText;
67924
+ try {
67925
+ sourceText = fs$1$3.readFileSync(absolutePath, "utf-8");
67926
+ } catch {
67927
+ continue;
67928
+ }
67929
+ if (!sourceText.includes(packageSubpathPrefix)) continue;
67930
+ let moduleSpecifiers;
67931
+ try {
67932
+ moduleSpecifiers = collectStaticModuleSpecifiers(sourceText, { filePath: absolutePath });
67933
+ } catch {
67934
+ continue;
67935
+ }
67936
+ for (const moduleSpecifier of moduleSpecifiers) if (moduleSpecifier.startsWith(packageSubpathPrefix)) return true;
67937
+ }
67938
+ return false;
67939
+ };
67741
67940
  const isExpoSdkAtLeast = (expoSdkMajor, minMajor) => expoSdkMajor !== null && expoSdkMajor >= minMajor;
67742
67941
  const UNIMODULES_HELP = "Remove every `@unimodules/*` and `react-native-unimodules` package — their functionality now lives in `expo-modules-core`. See https://expo.fyi/r/sdk-44-remove-unimodules";
67743
67942
  const FIREBASE_HELP = "Use the Firebase JS SDK or React Native Firebase directly. See https://expo.fyi/firebase-migration-guide";
@@ -67791,7 +67990,8 @@ const FLAGGED_DEPENDENCIES = [
67791
67990
  packageName: "@expo/metro-config",
67792
67991
  rule: "expo-no-redundant-dependency",
67793
67992
  message: "\"@expo/metro-config\" should not be a direct dependency. Expo pins the compatible Metro config, and a direct entry can drift to a version that breaks bundling",
67794
- help: "Remove `@expo/metro-config` and import `expo/metro-config` in your metro.config.js"
67993
+ help: "Remove `@expo/metro-config` and import `expo/metro-config` in your metro.config.js",
67994
+ skipWhenSubpathImported: true
67795
67995
  },
67796
67996
  {
67797
67997
  packageName: "@types/react-native",
@@ -67852,8 +68052,9 @@ const FLAGGED_DEPENDENCIES = [
67852
68052
  ];
67853
68053
  const checkExpoFlaggedDependencies = (context) => FLAGGED_DEPENDENCIES.filter((flaggedDependency) => {
67854
68054
  if (!context.directDependencyNames.has(flaggedDependency.packageName)) return false;
67855
- if (flaggedDependency.minSdkMajor === void 0) return true;
67856
- return isExpoSdkAtLeast(context.expoSdkMajor, flaggedDependency.minSdkMajor);
68055
+ if (flaggedDependency.minSdkMajor !== void 0 && !isExpoSdkAtLeast(context.expoSdkMajor, flaggedDependency.minSdkMajor)) return false;
68056
+ if (flaggedDependency.skipWhenSubpathImported && hasStaticModuleSubpath(context.rootDirectory, flaggedDependency.packageName)) return false;
68057
+ return true;
67857
68058
  }).map((flaggedDependency) => buildExpoDiagnostic({
67858
68059
  rule: flaggedDependency.rule,
67859
68060
  message: flaggedDependency.message,
@@ -67922,18 +68123,58 @@ const METRO_CONFIG_FILE_NAMES = [
67922
68123
  const EXPO_METRO_CONFIG_EXTEND_SIGNALS = [
67923
68124
  "expo/metro-config",
67924
68125
  "@sentry/react-native/metro",
67925
- "getSentryExpoConfig"
68126
+ "getSentryExpoConfig",
68127
+ "posthog-react-native/metro",
68128
+ "getPostHogExpoConfig"
67926
68129
  ];
68130
+ const resolveLocalMetroConfigModule = (moduleSpecifier, importingFilePath, rootDirectory) => {
68131
+ if (!moduleSpecifier.startsWith(".")) return void 0;
68132
+ const importedPath = path$1$1.resolve(path$1$1.dirname(importingFilePath), moduleSpecifier);
68133
+ const candidateBasePaths = [
68134
+ importedPath,
68135
+ importedPath.replace(/\.[cm]?js$/, ""),
68136
+ path$1$1.join(importedPath, "index")
68137
+ ];
68138
+ for (const candidateBasePath of candidateBasePaths) {
68139
+ const resolvedPath = resolveEntryWithExtensions(candidateBasePath);
68140
+ if (resolvedPath !== void 0 && isFile(resolvedPath) && isPathInsideDirectoryOrEqual(resolvedPath, rootDirectory)) return resolvedPath;
68141
+ }
68142
+ };
68143
+ const hasExpoMetroConfigSignal = (metroConfigPath, rootDirectory) => {
68144
+ const pendingFilePaths = [metroConfigPath];
68145
+ const visitedFilePaths = /* @__PURE__ */ new Set();
68146
+ while (pendingFilePaths.length > 0) {
68147
+ const currentFilePath = pendingFilePaths.pop();
68148
+ if (currentFilePath === void 0 || visitedFilePaths.has(currentFilePath)) continue;
68149
+ if (visitedFilePaths.size >= 100) return true;
68150
+ visitedFilePaths.add(currentFilePath);
68151
+ let contents;
68152
+ try {
68153
+ contents = fs$1$3.readFileSync(currentFilePath, "utf-8");
68154
+ } catch {
68155
+ return true;
68156
+ }
68157
+ if (EXPO_METRO_CONFIG_EXTEND_SIGNALS.some((signal) => contents.includes(signal))) return true;
68158
+ let moduleSpecifiers;
68159
+ try {
68160
+ moduleSpecifiers = collectStaticModuleSpecifiers(contents, {
68161
+ filePath: currentFilePath,
68162
+ includeTypeOnly: false
68163
+ });
68164
+ } catch {
68165
+ continue;
68166
+ }
68167
+ for (const moduleSpecifier of moduleSpecifiers) {
68168
+ const localModulePath = resolveLocalMetroConfigModule(moduleSpecifier, currentFilePath, rootDirectory);
68169
+ if (localModulePath !== void 0 && !visitedFilePaths.has(localModulePath)) pendingFilePaths.push(localModulePath);
68170
+ }
68171
+ }
68172
+ return false;
68173
+ };
67927
68174
  const checkExpoMetroConfig = (context) => {
67928
68175
  const metroConfigPath = METRO_CONFIG_FILE_NAMES.map((fileName) => path$1$1.join(context.rootDirectory, fileName)).find((candidatePath) => isFile(candidatePath));
67929
68176
  if (metroConfigPath === void 0) return [];
67930
- let contents;
67931
- try {
67932
- contents = fs$1$3.readFileSync(metroConfigPath, "utf-8");
67933
- } catch {
67934
- return [];
67935
- }
67936
- if (EXPO_METRO_CONFIG_EXTEND_SIGNALS.some((signal) => contents.includes(signal))) return [];
68177
+ if (hasExpoMetroConfigSignal(metroConfigPath, context.rootDirectory)) return [];
67937
68178
  return [buildExpoDiagnostic({
67938
68179
  rule: "expo-metro-config",
67939
68180
  filePath: path$1$1.basename(metroConfigPath),
@@ -69335,6 +69576,13 @@ const buildCapabilities = (project) => {
69335
69576
  minor: 0
69336
69577
  })) capabilities.add("tailwind:4");
69337
69578
  }
69579
+ if (project.hasShadcnUi === true) capabilities.add("shadcn");
69580
+ if (project.hasRadixUi === true) capabilities.add("radix-ui");
69581
+ if (project.hasBaseUi === true) capabilities.add("base-ui");
69582
+ if (project.hasReactAriaComponents === true) capabilities.add("react-aria");
69583
+ if (project.hasTanstackTable === true) capabilities.add("tanstack-table");
69584
+ if (project.hasTanstackVirtual === true) capabilities.add("tanstack-virtual");
69585
+ if (project.hasTanstackForm === true) capabilities.add("tanstack-form");
69338
69586
  if (project.zodVersion !== null) capabilities.add("zod");
69339
69587
  if (project.zodMajorVersion !== null && project.zodMajorVersion >= 4) capabilities.add("zod:4");
69340
69588
  if (project.mobxVersion !== void 0 && project.mobxVersion !== null || project.hasMobxReact === true || project.hasMobxReactLite === true || project.hasMobxStateTree === true || project.hasMobxReactObserver === true) capabilities.add("mobx");
@@ -69512,72 +69760,6 @@ const checkSecurityScanCooperative = async (rootDirectory, options = {}) => {
69512
69760
  }
69513
69761
  return session.diagnostics;
69514
69762
  };
69515
- var import_picocolors = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
69516
- let p = process || {}, argv = p.argv || [], env = p.env || {};
69517
- let isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
69518
- let formatter = (open, close, replace = open) => (input) => {
69519
- let string = "" + input, index = string.indexOf(close, open.length);
69520
- return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
69521
- };
69522
- let replaceClose = (string, close, replace, index) => {
69523
- let result = "", cursor = 0;
69524
- do {
69525
- result += string.substring(cursor, index) + replace;
69526
- cursor = index + close.length;
69527
- index = string.indexOf(close, cursor);
69528
- } while (~index);
69529
- return result + string.substring(cursor);
69530
- };
69531
- let createColors = (enabled = isColorSupported) => {
69532
- let f = enabled ? formatter : () => String;
69533
- return {
69534
- isColorSupported: enabled,
69535
- reset: f("\x1B[0m", "\x1B[0m"),
69536
- bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
69537
- dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
69538
- italic: f("\x1B[3m", "\x1B[23m"),
69539
- underline: f("\x1B[4m", "\x1B[24m"),
69540
- inverse: f("\x1B[7m", "\x1B[27m"),
69541
- hidden: f("\x1B[8m", "\x1B[28m"),
69542
- strikethrough: f("\x1B[9m", "\x1B[29m"),
69543
- black: f("\x1B[30m", "\x1B[39m"),
69544
- red: f("\x1B[31m", "\x1B[39m"),
69545
- green: f("\x1B[32m", "\x1B[39m"),
69546
- yellow: f("\x1B[33m", "\x1B[39m"),
69547
- blue: f("\x1B[34m", "\x1B[39m"),
69548
- magenta: f("\x1B[35m", "\x1B[39m"),
69549
- cyan: f("\x1B[36m", "\x1B[39m"),
69550
- white: f("\x1B[37m", "\x1B[39m"),
69551
- gray: f("\x1B[90m", "\x1B[39m"),
69552
- bgBlack: f("\x1B[40m", "\x1B[49m"),
69553
- bgRed: f("\x1B[41m", "\x1B[49m"),
69554
- bgGreen: f("\x1B[42m", "\x1B[49m"),
69555
- bgYellow: f("\x1B[43m", "\x1B[49m"),
69556
- bgBlue: f("\x1B[44m", "\x1B[49m"),
69557
- bgMagenta: f("\x1B[45m", "\x1B[49m"),
69558
- bgCyan: f("\x1B[46m", "\x1B[49m"),
69559
- bgWhite: f("\x1B[47m", "\x1B[49m"),
69560
- blackBright: f("\x1B[90m", "\x1B[39m"),
69561
- redBright: f("\x1B[91m", "\x1B[39m"),
69562
- greenBright: f("\x1B[92m", "\x1B[39m"),
69563
- yellowBright: f("\x1B[93m", "\x1B[39m"),
69564
- blueBright: f("\x1B[94m", "\x1B[39m"),
69565
- magentaBright: f("\x1B[95m", "\x1B[39m"),
69566
- cyanBright: f("\x1B[96m", "\x1B[39m"),
69567
- whiteBright: f("\x1B[97m", "\x1B[39m"),
69568
- bgBlackBright: f("\x1B[100m", "\x1B[49m"),
69569
- bgRedBright: f("\x1B[101m", "\x1B[49m"),
69570
- bgGreenBright: f("\x1B[102m", "\x1B[49m"),
69571
- bgYellowBright: f("\x1B[103m", "\x1B[49m"),
69572
- bgBlueBright: f("\x1B[104m", "\x1B[49m"),
69573
- bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
69574
- bgCyanBright: f("\x1B[106m", "\x1B[49m"),
69575
- bgWhiteBright: f("\x1B[107m", "\x1B[49m")
69576
- };
69577
- };
69578
- module.exports = createColors();
69579
- module.exports.createColors = createColors;
69580
- })))(), 1);
69581
69763
  const highlighter = {
69582
69764
  error: import_picocolors.default.red,
69583
69765
  warn: import_picocolors.default.yellow,
@@ -69753,6 +69935,12 @@ const withProjectAnalysisWorkerSlot = async (task, abortSignal) => {
69753
69935
  });
69754
69936
  return projectAnalysisWorkerSlots.run(task, abortSignal);
69755
69937
  };
69938
+ const toRelativePath = (filePath, rootDirectory) => {
69939
+ const normalizedFilePath = filePath.replace(/\\/g, "/");
69940
+ const normalizedRoot = rootDirectory.replace(/\\/g, "/").replace(/\/$/, "") + "/";
69941
+ if (normalizedFilePath.startsWith(normalizedRoot)) return normalizedFilePath.slice(normalizedRoot.length);
69942
+ return normalizedFilePath.replace(/^\.\//, "");
69943
+ };
69756
69944
  const REACT_DOCTOR_TOOLCHAIN_PACKAGES = new Set([
69757
69945
  "react-doctor",
69758
69946
  "eslint-plugin-react-doctor",
@@ -70581,7 +70769,6 @@ const readTextFileUpToCharacterLimit = async (input) => {
70581
70769
  input.signal?.throwIfAborted();
70582
70770
  return buffer.subarray(0, readOffset).toString("utf-8");
70583
70771
  };
70584
- const toNormalizedRelativePath = (filePath, rootDirectory) => path$1$1.relative(path$1$1.resolve(rootDirectory), path$1$1.resolve(rootDirectory, filePath)).replaceAll("\\", "/") || ".";
70585
70772
  const buildJsxSourceReader = async (input) => {
70586
70773
  const ignoredFilePatterns = compileGlobPatternsLenient(input.ignorePatterns ?? [], (error) => warnConfigIssue(`ignore.files: ${error.message}`));
70587
70774
  const sourceFiles = (await listSourceFilesWithSizeCooperative(input.rootDirectory, input.signal)).filter((sourceFile) => JSX_DUPLICATION_SOURCE_FILE_PATTERN.test(sourceFile.path) && classifyFileContext(sourceFile.path) === "production" && !isFileIgnoredByPatterns(sourceFile.path, input.rootDirectory, ignoredFilePatterns));
@@ -70993,7 +71180,11 @@ var Git = class Git extends Service()("react-doctor/Git") {
70993
71180
  const symref = yield* runGit(directory, ["symbolic-ref", "refs/remotes/origin/HEAD"]);
70994
71181
  if (symref.status === 0) {
70995
71182
  const trimmed = trimOrNull(symref.stdout);
70996
- if (trimmed !== null) return trimmed.replace("refs/remotes/origin/", "");
71183
+ if (trimmed !== null) {
71184
+ const branchName = trimmed.replace("refs/remotes/origin/", "");
71185
+ const remoteBranch = `origin/${branchName}`;
71186
+ return (yield* branchExists(directory, remoteBranch)) ? remoteBranch : branchName;
71187
+ }
70997
71188
  }
70998
71189
  const candidates = yield* runGit(directory, [
70999
71190
  "for-each-ref",
@@ -71001,7 +71192,10 @@ var Git = class Git extends Service()("react-doctor/Git") {
71001
71192
  ...DEFAULT_BRANCH_CANDIDATES.map((candidate) => `refs/heads/${candidate}`)
71002
71193
  ]);
71003
71194
  if (candidates.status !== 0) return null;
71004
- return trimOrNull(candidates.stdout.split("\n")[0] ?? "");
71195
+ const localBranch = trimOrNull(candidates.stdout.split("\n")[0] ?? "");
71196
+ if (localBranch === null) return null;
71197
+ const remoteBranch = `origin/${localBranch}`;
71198
+ return (yield* branchExists(directory, remoteBranch)) ? remoteBranch : localBranch;
71005
71199
  }).pipe(withSpan("Git.defaultBranch"));
71006
71200
  const branchExists = (directory, branch) => runGit(directory, [
71007
71201
  "rev-parse",
@@ -71338,59 +71532,11 @@ const isLocalPathExtend = (entry) => {
71338
71532
  for (const prefix of EXTENDS_LOCAL_PATH_PREFIXES) if (entry.startsWith(prefix)) return true;
71339
71533
  return false;
71340
71534
  };
71341
- const stripJsoncComments = (raw) => {
71342
- let result = "";
71343
- let cursor = 0;
71344
- let inString = false;
71345
- let stringQuote = "";
71346
- while (cursor < raw.length) {
71347
- const character = raw[cursor];
71348
- const nextCharacter = raw[cursor + 1];
71349
- if (inString) {
71350
- result += character;
71351
- if (character === "\\" && cursor + 1 < raw.length) {
71352
- result += nextCharacter;
71353
- cursor += 2;
71354
- continue;
71355
- }
71356
- if (character === stringQuote) inString = false;
71357
- cursor += 1;
71358
- continue;
71359
- }
71360
- if (character === "\"" || character === "'") {
71361
- inString = true;
71362
- stringQuote = character;
71363
- result += character;
71364
- cursor += 1;
71365
- continue;
71366
- }
71367
- if (character === "/" && nextCharacter === "/") {
71368
- const lineEndIndex = raw.indexOf("\n", cursor);
71369
- cursor = lineEndIndex === -1 ? raw.length : lineEndIndex;
71370
- continue;
71371
- }
71372
- if (character === "/" && nextCharacter === "*") {
71373
- const blockEndIndex = raw.indexOf("*/", cursor + 2);
71374
- cursor = blockEndIndex === -1 ? raw.length : blockEndIndex + 2;
71375
- continue;
71376
- }
71377
- result += character;
71378
- cursor += 1;
71379
- }
71380
- return result;
71381
- };
71382
- const parseJsonOrJsonc = (raw) => {
71383
- try {
71384
- return JSON.parse(raw);
71385
- } catch {
71386
- return JSON.parse(stripJsoncComments(raw));
71387
- }
71388
- };
71389
71535
  const canOxlintExtendConfig = (configPath) => {
71390
71536
  if (!configPath.endsWith(".eslintrc.json")) return true;
71391
71537
  let parsed;
71392
71538
  try {
71393
- parsed = parseJsonOrJsonc(fs$1$3.readFileSync(configPath, "utf-8"));
71539
+ parsed = parseJSONC(fs$1$3.readFileSync(configPath, "utf-8"), { allowTrailingComma: true });
71394
71540
  } catch {
71395
71541
  return true;
71396
71542
  }
@@ -71499,7 +71645,39 @@ const detectUserLintConfigPaths = (rootDirectory) => {
71499
71645
  }
71500
71646
  return [];
71501
71647
  };
71648
+ const readAdoptedLintConfigSettings = (configPaths) => {
71649
+ const mergedSettings = /* @__PURE__ */ new Map();
71650
+ for (const configPath of configPaths) {
71651
+ let parsed;
71652
+ try {
71653
+ parsed = parseJSONC(fs$1$3.readFileSync(configPath, "utf-8"), { allowTrailingComma: true });
71654
+ } catch {
71655
+ continue;
71656
+ }
71657
+ if (!isPlainObject(parsed)) continue;
71658
+ const settings = parsed.settings;
71659
+ if (!isPlainObject(settings)) continue;
71660
+ for (const [pluginName, pluginSettings] of Object.entries(settings)) {
71661
+ if (pluginName === "react-doctor") continue;
71662
+ mergedSettings.set(pluginName, pluginSettings);
71663
+ }
71664
+ }
71665
+ return Object.fromEntries(mergedSettings);
71666
+ };
71502
71667
  const DISABLE_DIRECTIVE_PATTERN = /(eslint|oxlint)-disable/;
71668
+ const getBackupRootDirectory = (rootDirectory) => path$1$1.join(rootDirectory, ...DISABLE_DIRECTIVE_BACKUP_DIRECTORY_SEGMENTS);
71669
+ const getBackupPath = (rootDirectory, absolutePath) => {
71670
+ if (!isPathInsideDirectory(absolutePath, rootDirectory)) return null;
71671
+ return path$1$1.join(getBackupRootDirectory(rootDirectory), path$1$1.relative(rootDirectory, absolutePath));
71672
+ };
71673
+ const removeBackupRootIfEmpty = (rootDirectory) => {
71674
+ const backupRootDirectory = getBackupRootDirectory(rootDirectory);
71675
+ if (!walkSourceTreeFiles(backupRootDirectory).next().done) return;
71676
+ fs$1$3.rmSync(backupRootDirectory, {
71677
+ recursive: true,
71678
+ force: true
71679
+ });
71680
+ };
71503
71681
  const neutralizedFileLeases = /* @__PURE__ */ new Map();
71504
71682
  const activeNeutralizationInitializations = /* @__PURE__ */ new Set();
71505
71683
  const directoriesOverlap = (left, right) => {
@@ -71591,8 +71769,50 @@ const collectNeutralizationCandidatePaths = (rootDirectory, discoveredRelativePa
71591
71769
  }
71592
71770
  return candidatePaths;
71593
71771
  };
71772
+ const recoverOrphanedBackups = (rootDirectory) => {
71773
+ const blockedPaths = /* @__PURE__ */ new Set();
71774
+ const backupRootDirectory = getBackupRootDirectory(rootDirectory);
71775
+ for (const { absolutePath: backupPath } of walkSourceTreeFiles(backupRootDirectory)) {
71776
+ const originalPath = path$1$1.join(rootDirectory, path$1$1.relative(backupRootDirectory, backupPath));
71777
+ if (neutralizedFileLeases.has(originalPath)) continue;
71778
+ let backupContent;
71779
+ let currentContent;
71780
+ try {
71781
+ backupContent = fs$1$3.readFileSync(backupPath, "utf-8");
71782
+ currentContent = fs$1$3.readFileSync(originalPath, "utf-8");
71783
+ } catch (error) {
71784
+ process.stderr.write(`[react-doctor] Could not recover ${originalPath}: ${messageFromUnknown(error)}. The backup remains at ${backupPath}.\n`);
71785
+ blockedPaths.add(originalPath);
71786
+ continue;
71787
+ }
71788
+ if (currentContent === backupContent) {
71789
+ try {
71790
+ fs$1$3.rmSync(backupPath);
71791
+ } catch (error) {
71792
+ process.stderr.write(`[react-doctor] Failed to delete stale backup ${backupPath}: ${messageFromUnknown(error)}\n`);
71793
+ blockedPaths.add(originalPath);
71794
+ }
71795
+ continue;
71796
+ }
71797
+ if (currentContent !== neutralizeContent(backupContent)) {
71798
+ process.stderr.write(`[react-doctor] Did not overwrite changed file ${originalPath}. Recover it manually from ${backupPath}.\n`);
71799
+ blockedPaths.add(originalPath);
71800
+ continue;
71801
+ }
71802
+ try {
71803
+ fs$1$3.writeFileSync(originalPath, backupContent);
71804
+ fs$1$3.rmSync(backupPath);
71805
+ } catch (error) {
71806
+ process.stderr.write(`[react-doctor] Failed to restore ${originalPath} from backup: ${messageFromUnknown(error)}\n`);
71807
+ blockedPaths.add(originalPath);
71808
+ }
71809
+ }
71810
+ removeBackupRootIfEmpty(rootDirectory);
71811
+ return blockedPaths;
71812
+ };
71594
71813
  const neutralizeDisableDirectives = async (rootDirectory, includePaths, options = {}) => {
71595
71814
  const resolvedRootDirectory = fs$1$3.realpathSync(rootDirectory);
71815
+ const blockedPaths = /* @__PURE__ */ new Set();
71596
71816
  const leasedPaths = /* @__PURE__ */ new Set();
71597
71817
  let isRestored = false;
71598
71818
  const restore = () => {
@@ -71605,16 +71825,24 @@ const neutralizeDisableDirectives = async (rootDirectory, includePaths, options
71605
71825
  if (lease.referenceCount > 0) continue;
71606
71826
  neutralizedFileLeases.delete(absolutePath);
71607
71827
  try {
71608
- fs$1$3.writeFileSync(absolutePath, lease.originalContent);
71828
+ const currentContent = fs$1$3.readFileSync(absolutePath, "utf-8");
71829
+ if (currentContent !== lease.neutralizedContent && currentContent !== lease.originalContent) {
71830
+ process.stderr.write(`[react-doctor] Did not overwrite changed file ${absolutePath}. Recover it manually from ${lease.backupPath}.\n`);
71831
+ continue;
71832
+ }
71833
+ if (currentContent === lease.neutralizedContent) fs$1$3.writeFileSync(absolutePath, lease.originalContent);
71834
+ fs$1$3.rmSync(lease.backupPath, { force: true });
71609
71835
  } catch (error) {
71610
- process.stderr.write(`[react-doctor] Failed to restore inline disable directives in ${absolutePath}: ${messageFromUnknown(error)}\n[react-doctor] Run: git checkout -- ${absolutePath}\n`);
71836
+ process.stderr.write(`[react-doctor] Failed to restore inline disable directives in ${absolutePath}: ${messageFromUnknown(error)}. The backup remains at ${lease.backupPath}.\n`);
71611
71837
  }
71612
71838
  }
71839
+ removeBackupRootIfEmpty(resolvedRootDirectory);
71613
71840
  };
71614
71841
  const onExit = () => restore();
71615
71842
  process.once("exit", onExit);
71616
71843
  const leaseCandidatePath = (absolutePath) => {
71617
71844
  if (leasedPaths.has(absolutePath)) return;
71845
+ if (blockedPaths.has(absolutePath)) return;
71618
71846
  const existingLease = neutralizedFileLeases.get(absolutePath);
71619
71847
  if (existingLease) {
71620
71848
  existingLease.referenceCount += 1;
@@ -71629,9 +71857,20 @@ const neutralizeDisableDirectives = async (rootDirectory, includePaths, options
71629
71857
  }
71630
71858
  const neutralizedContent = neutralizeContent(originalContent);
71631
71859
  if (neutralizedContent !== originalContent) {
71860
+ const backupPath = getBackupPath(resolvedRootDirectory, absolutePath);
71861
+ if (backupPath === null) return;
71862
+ try {
71863
+ fs$1$3.mkdirSync(path$1$1.dirname(backupPath), { recursive: true });
71864
+ fs$1$3.writeFileSync(backupPath, originalContent, { flag: "wx" });
71865
+ } catch (error) {
71866
+ process.stderr.write(`[react-doctor] Did not modify ${absolutePath}: ${messageFromUnknown(error)}. Check ${backupPath}.\n`);
71867
+ return;
71868
+ }
71632
71869
  fs$1$3.writeFileSync(absolutePath, neutralizedContent);
71633
71870
  neutralizedFileLeases.set(absolutePath, {
71871
+ backupPath,
71634
71872
  originalContent,
71873
+ neutralizedContent,
71635
71874
  referenceCount: 1
71636
71875
  });
71637
71876
  leasedPaths.add(absolutePath);
@@ -71639,6 +71878,8 @@ const neutralizeDisableDirectives = async (rootDirectory, includePaths, options
71639
71878
  };
71640
71879
  try {
71641
71880
  await withOverlappingInitializationLock(resolvedRootDirectory, async () => {
71881
+ for (const blockedPath of recoverOrphanedBackups(resolvedRootDirectory)) blockedPaths.add(blockedPath);
71882
+ if (options.recoverOnly) return;
71642
71883
  for (const absolutePath of collectNeutralizationCandidatePaths(resolvedRootDirectory, [], includePaths)) if (neutralizedFileLeases.has(absolutePath)) leaseCandidatePath(absolutePath);
71643
71884
  const discoveredRelativePaths = await (options.findFiles ?? findFilesWithDisableDirectives)(resolvedRootDirectory, includePaths);
71644
71885
  for (const absolutePath of collectNeutralizationCandidatePaths(resolvedRootDirectory, discoveredRelativePaths, includePaths)) leaseCandidatePath(absolutePath);
@@ -71819,7 +72060,7 @@ const buildUserPluginRules = (userPlugin, severityControls) => {
71819
72060
  }
71820
72061
  return enabled;
71821
72062
  };
71822
- const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, extendsPaths = [], ignoredTags = /* @__PURE__ */ new Set(), includedTags = /* @__PURE__ */ new Set(), includeTagDefaults = false, runtimeGlobals, unpluginAutoImportGlobalScopes, serverAuthFunctionNames, projectIndexModuleSources, severityControls, userPlugins = [], disableReactHooksJsPlugin = false, ruleSelection, sidecarRuleIdFilter }) => {
72063
+ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, extendsPaths = [], ignoredTags = /* @__PURE__ */ new Set(), includedTags = /* @__PURE__ */ new Set(), includeTagDefaults = false, runtimeGlobals, unpluginAutoImportGlobalScopes, serverAuthFunctionNames, projectIndexModuleSources, severityControls, adoptedSettings = {}, userPlugins = [], disableReactHooksJsPlugin = false, ruleSelection, sidecarRuleIdFilter }) => {
71823
72064
  const hasIncludedTags = includedTags.size > 0;
71824
72065
  const reactHooksJsPlugin = disableReactHooksJsPlugin || ruleSelection === "sidecar" || hasIncludedTags ? null : resolveReactHooksJsPlugin(project.hasReactCompiler || project.hasReactCompilerLintPlugin === true, customRulesOnly);
71825
72066
  const reactCompilerRules = reactHooksJsPlugin ? applyRuleSeverityControls(filterRulesToAvailable(REACT_COMPILER_RULES, "react-hooks-js", reactHooksJsPlugin.availableRuleNames), severityControls) : {};
@@ -71874,23 +72115,26 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
71874
72115
  },
71875
72116
  plugins: [],
71876
72117
  jsPlugins: [...jsPlugins, pluginPath],
71877
- settings: { "react-doctor": {
71878
- portedRuleMode: "curated",
71879
- framework: project.framework,
71880
- rootDirectory: settingsRootDirectory,
71881
- capabilities: [...capabilities].sort(),
71882
- ...runtimeGlobals && runtimeGlobals.length > 0 ? { runtimeGlobals: [...runtimeGlobals] } : {},
71883
- ...unpluginAutoImportGlobalScopes && unpluginAutoImportGlobalScopes.length > 0 ? {
71884
- unpluginAutoImportRootDirectories: [...new Set([settingsRootDirectory, project.rootDirectory])],
71885
- unpluginAutoImportGlobalScopes: unpluginAutoImportGlobalScopes.map((scope) => ({
71886
- directory: scope.directory,
71887
- names: [...scope.names]
71888
- }))
71889
- } : {},
71890
- ...project.shopifyFlashListMajorVersion !== null ? { shopifyFlashListMajorVersion: project.shopifyFlashListMajorVersion } : {},
71891
- ...serverAuthFunctionNames && serverAuthFunctionNames.length > 0 ? { serverAuthFunctionNames: [...serverAuthFunctionNames] } : {},
71892
- ...projectIndexModuleSources !== void 0 ? { projectIndexModuleSources: [...projectIndexModuleSources] } : {}
71893
- } },
72118
+ settings: {
72119
+ ...adoptedSettings,
72120
+ "react-doctor": {
72121
+ portedRuleMode: "curated",
72122
+ framework: project.framework,
72123
+ rootDirectory: settingsRootDirectory,
72124
+ capabilities: [...capabilities].sort(),
72125
+ ...runtimeGlobals && runtimeGlobals.length > 0 ? { runtimeGlobals: [...runtimeGlobals] } : {},
72126
+ ...unpluginAutoImportGlobalScopes && unpluginAutoImportGlobalScopes.length > 0 ? {
72127
+ unpluginAutoImportRootDirectories: [...new Set([settingsRootDirectory, project.rootDirectory])],
72128
+ unpluginAutoImportGlobalScopes: unpluginAutoImportGlobalScopes.map((scope) => ({
72129
+ directory: scope.directory,
72130
+ names: [...scope.names]
72131
+ }))
72132
+ } : {},
72133
+ ...project.shopifyFlashListMajorVersion !== null ? { shopifyFlashListMajorVersion: project.shopifyFlashListMajorVersion } : {},
72134
+ ...serverAuthFunctionNames && serverAuthFunctionNames.length > 0 ? { serverAuthFunctionNames: [...serverAuthFunctionNames] } : {},
72135
+ ...projectIndexModuleSources !== void 0 ? { projectIndexModuleSources: [...projectIndexModuleSources] } : {}
72136
+ }
72137
+ },
71894
72138
  rules: {
71895
72139
  ...reactCompilerRules,
71896
72140
  ...enabledReactDoctorRules,
@@ -73024,6 +73268,46 @@ const buildProfiledNodeArguments = (input) => [
73024
73268
  ...input.heapProfileDirectory ? ["--heap-prof", `--heap-prof-dir=${input.heapProfileDirectory}`] : [],
73025
73269
  ...input.argumentsList
73026
73270
  ];
73271
+ const buildOxlintTimingArguments = (argumentsList) => {
73272
+ const timingArguments = [...argumentsList];
73273
+ const formatFlagIndex = timingArguments.indexOf("--format");
73274
+ if (formatFlagIndex === -1 || formatFlagIndex + 1 >= timingArguments.length) throw new Error("Oxlint timing arguments require a --format value");
73275
+ timingArguments[formatFlagIndex + 1] = "default";
73276
+ timingArguments.push("--debug", "timings", "--quiet");
73277
+ return timingArguments;
73278
+ };
73279
+ const captureOxlintRuleTimings = (input) => new Promise((resolve, reject) => {
73280
+ const timingEnvironment = { ...input.environment };
73281
+ timingEnvironment.REACT_DOCTOR_RULE_TIMINGS_DIR = void 0;
73282
+ const timingChild = spawn(input.nodeBinaryPath, buildOxlintTimingArguments(input.argumentsList), {
73283
+ cwd: input.rootDirectory,
73284
+ env: timingEnvironment,
73285
+ stdio: [
73286
+ "ignore",
73287
+ "pipe",
73288
+ "pipe"
73289
+ ]
73290
+ });
73291
+ const stdoutBuffers = [];
73292
+ const stderrBuffers = [];
73293
+ timingChild.stdout.on("data", (buffer) => stdoutBuffers.push(buffer));
73294
+ timingChild.stderr.on("data", (buffer) => stderrBuffers.push(buffer));
73295
+ timingChild.on("error", reject);
73296
+ timingChild.on("close", (_code, signal) => {
73297
+ if (signal) {
73298
+ reject(/* @__PURE__ */ new Error(`Oxlint timing pass was killed by ${signal}`));
73299
+ return;
73300
+ }
73301
+ const timingOutput = `${Buffer.concat(stdoutBuffers).toString("utf8")}\n${Buffer.concat(stderrBuffers).toString("utf8")}`;
73302
+ if (!timingOutput.includes("Rule timings:")) {
73303
+ resolve();
73304
+ return;
73305
+ }
73306
+ fs$1$3.mkdirSync(input.timingDirectory, { recursive: true });
73307
+ fs$1$3.writeFileSync(path$1$1.join(input.timingDirectory, `oxlint-${timingChild.pid ?? process.pid}.timings.txt`), timingOutput);
73308
+ resolve();
73309
+ });
73310
+ });
73027
73311
  const lowerChildProcessPriority = (processId) => {
73028
73312
  if (processId === void 0) return;
73029
73313
  try {
@@ -73145,7 +73429,18 @@ const spawnOxlint = (args, rootDirectory, nodeBinaryPath, spawnTimeoutMs = OXLIN
73145
73429
  return;
73146
73430
  }
73147
73431
  }
73148
- resolve(output);
73432
+ const timingDirectory = SANITIZED_ENV.REACT_DOCTOR_OXLINT_TIMINGS_DIR;
73433
+ if (timingDirectory === void 0) {
73434
+ resolve(output);
73435
+ return;
73436
+ }
73437
+ captureOxlintRuleTimings({
73438
+ argumentsList: args,
73439
+ environment: SANITIZED_ENV,
73440
+ nodeBinaryPath,
73441
+ rootDirectory,
73442
+ timingDirectory
73443
+ }).then(() => resolve(output), reject);
73149
73444
  });
73150
73445
  });
73151
73446
  const PARALLELISM_EXHAUSTION_ERROR_CODES = new Set([
@@ -73948,9 +74243,11 @@ const runOxlint = async (options) => {
73948
74243
  return [];
73949
74244
  }
73950
74245
  const pluginPath = resolvePluginPath();
73951
- const extendsPaths = (adoptExistingLintConfig && !customRulesOnly ? detectUserLintConfigPaths(rootDirectory) : []).filter(canOxlintExtendConfig);
74246
+ const detectedConfigPaths = adoptExistingLintConfig && !customRulesOnly ? detectUserLintConfigPaths(rootDirectory) : [];
74247
+ const extendsPaths = detectedConfigPaths.filter(canOxlintExtendConfig);
74248
+ const adoptedSettings = detectedConfigPaths.length > 0 ? readAdoptedLintConfigSettings(detectedConfigPaths) : {};
73952
74249
  const userPlugins = includedTags.size > 0 ? [] : resolveUserPlugins(userConfig?.plugins, configSourceDirectory);
73953
- const restoreDisableDirectives = respectInlineDisables ? () => {} : await neutralizeDisableDirectives(rootDirectory, includePaths ?? options.precomputedSourceFiles?.map((sourceFile) => sourceFile.path));
74250
+ const restoreDisableDirectives = await neutralizeDisableDirectives(rootDirectory, includePaths ?? options.precomputedSourceFiles?.map((sourceFile) => sourceFile.path), { recoverOnly: respectInlineDisables });
73954
74251
  const configDirectory = fs$1$3.mkdtempSync(path$1$1.join(os.tmpdir(), "react-doctor-oxlintrc-"));
73955
74252
  const configPath = path$1$1.join(configDirectory, "oxlintrc.json");
73956
74253
  try {
@@ -74010,6 +74307,7 @@ const runOxlint = async (options) => {
74010
74307
  serverAuthFunctionNames,
74011
74308
  projectIndexModuleSources,
74012
74309
  severityControls,
74310
+ adoptedSettings,
74013
74311
  userPlugins,
74014
74312
  disableReactHooksJsPlugin: overrides.disableReactHooksJsPlugin,
74015
74313
  ruleSelection: overrides.ruleSelection,
@@ -75793,8 +76091,9 @@ const findWorstScoredProject = (projects) => {
75793
76091
  return worst;
75794
76092
  };
75795
76093
  const toJsonReportDiagnostic = (diagnostic, projectRoot, reportRoot) => {
75796
- const normalizedFilePath = toNormalizedRelativePath(diagnostic.filePath, projectRoot);
75797
- const reportRelativeFilePath = toNormalizedRelativePath(path$1$1.resolve(projectRoot, diagnostic.filePath), reportRoot);
76094
+ const resolvedFilePath = resolveCandidateReadPath(projectRoot, diagnostic.filePath);
76095
+ const normalizedFilePath = toNormalizedRelativePath(resolvedFilePath, projectRoot);
76096
+ const reportRelativeFilePath = toNormalizedRelativePath(resolvedFilePath, reportRoot);
75798
76097
  const ruleIdentity = getDiagnosticRuleIdentity(diagnostic);
75799
76098
  return {
75800
76099
  ...diagnostic,
@@ -76415,11 +76714,13 @@ const METRIC = {
76415
76714
  ciConfigured: "ci.configured",
76416
76715
  rulesChanged: "rules.changed",
76417
76716
  rulesQueried: "rules.queried",
76717
+ runtimeScanUrlPromptShown: "runtime_scan.url_prompt_shown",
76418
76718
  tuiCompactReportShown: "tui.compact_report_shown",
76419
76719
  tuiFindingNavigated: "tui.finding_navigated",
76420
76720
  tuiIssueStreamShown: "tui.issue_stream_shown",
76421
76721
  tuiProjectPathContextShown: "tui.project_path_context_shown",
76422
76722
  tuiProjectSelectShown: "tui.project_select_shown",
76723
+ tuiCiRecommendationShown: "tui.ci_recommendation_shown",
76423
76724
  tuiReportActionSelected: "tui.report_action_selected",
76424
76725
  tuiCancelled: "tui.cancelled",
76425
76726
  tuiScanInlineShown: "tui.scan_inline_shown",
@@ -76468,7 +76769,7 @@ const makeNoopConsole = () => ({
76468
76769
  });
76469
76770
  //#endregion
76470
76771
  //#region src/cli/utils/version.ts
76471
- const VERSION = "0.9.12-dev.ffc2d14";
76772
+ const VERSION = "0.9.13-dev.fd23edc";
76472
76773
  //#endregion
76473
76774
  //#region src/cli/utils/json-mode.ts
76474
76775
  let context = null;
@@ -76506,13 +76807,14 @@ const installSilentConsole = () => {
76506
76807
  "trace"
76507
76808
  ]) target[key] = source[key];
76508
76809
  };
76509
- const enableJsonMode = ({ compact, directory, outputFile }) => {
76810
+ const enableJsonMode = ({ compact, directory, outputFile, writeCancellationError }) => {
76510
76811
  context = {
76511
76812
  compact,
76512
76813
  directory,
76513
76814
  startTime: performance$1.now(),
76514
76815
  mode: "full",
76515
- outputFile: null
76816
+ outputFile: null,
76817
+ writeCancellationError
76516
76818
  };
76517
76819
  installSilentConsole();
76518
76820
  if (outputFile) {
@@ -76551,6 +76853,13 @@ const writeJsonErrorReport = (error, sentryEventId) => {
76551
76853
  process.stdout.write(INTERNAL_ERROR_JSON_FALLBACK);
76552
76854
  }
76553
76855
  };
76856
+ const writeJsonCancellationReport = () => {
76857
+ if (context?.writeCancellationError !== void 0) {
76858
+ context.writeCancellationError();
76859
+ return;
76860
+ }
76861
+ writeJsonErrorReport(/* @__PURE__ */ new Error("Scan cancelled by user (SIGINT/SIGTERM)"));
76862
+ };
76554
76863
  //#endregion
76555
76864
  //#region src/cli/utils/run-id.ts
76556
76865
  let cachedRunId;
@@ -76559,10 +76868,14 @@ const getRunId = () => {
76559
76868
  return cachedRunId;
76560
76869
  };
76561
76870
  //#endregion
76871
+ //#region src/cli/utils/scrub-run-arguments.ts
76872
+ const scrubRunArguments = (argumentsList) => anonymizeText(argumentsList.map((argument) => argument.replace(/^((?:--[^=]+=)?)(?:https?|wss?):\/\/.+$/i, "$1<url>")).join(" "));
76873
+ //#endregion
76562
76874
  //#region src/cli/utils/build-run-context.ts
76563
76875
  const ROOT_SUBCOMMANDS = new Set([
76564
76876
  "design",
76565
76877
  "install",
76878
+ "scan",
76566
76879
  "setup"
76567
76880
  ]);
76568
76881
  const detectInvokedVia = () => {
@@ -76603,7 +76916,7 @@ const buildRunContext = () => {
76603
76916
  runId: getRunId(),
76604
76917
  origin: detectOrigin(),
76605
76918
  command: detectCommand(userArguments),
76606
- argv: scrubSensitivePaths(userArguments.join(" ")),
76919
+ argv: scrubRunArguments(userArguments),
76607
76920
  cwd: scrubSensitivePaths(process.cwd()),
76608
76921
  node: process.version,
76609
76922
  nodeMajor: detectNodeMajor(),
@@ -76798,7 +77111,7 @@ const recordDistribution = (name, value, options = {}) => {
76798
77111
  } catch {}
76799
77112
  };
76800
77113
  //#endregion
76801
- export { Maintainability as $, CANONICAL_GITHUB_URL as $n, listSourceFiles as $t, SCAN_RESULT_CACHE_MAX_HASHED_FILE_SIZE_BYTES as A, makeSpan$1 as An, filterDiagnosticsForSurface as At, isGitHookEnvironment as B, try_ as Bn, getEquivalentRuleKeys as Bt, GH_DEFAULT_BRANCH_PROBE_TIMEOUT_MS as C, info as Cn, toCanonicalPath as Cr, computeConfigFingerprint as Ct, REACT_DOCTOR_CONFIG_PROJECT_NAME as D, decodeUnknownSync as Dn, createOxlintSpawnSlots as Dt, NANOSECONDS_PER_MILLISECOND as E, Diagnostic as En, createNodeReadFileLinesSync as Et, STAGED_SNAPSHOT_ADDITIONAL_CONFIG_FILENAMES as F, provideContext as Fn, formatReactDoctorError as Ft, isCiOrCodingAgentEnvironment as G, succeed$3 as Gn, highlighter as Gt, ACTION_INPUT_ENVIRONMENT_VARIABLES as H, buildWithScope as Hn, hasPublishedFixRecipe as Ht, TUI_REPORT_COMPACT_MAX_ROWS as I, provideService as In, getBaselineDiffPlan as It, Files as J, fail$5 as Jn, isProjectDiscoveryError as Jt, isCodingAgentEnvironment as K, close as Kn, isMonorepoRoot as Kt, TUI_REPORT_DETAIL_WIDTH_FRACTION as L, runPromise as Ln, getChangedLineRanges as Lt, SENTRY_FLUSH_TIMEOUT_MS as M, orElseSucceed as Mn, filterSourceFiles as Mt, SENTRY_RELEASE_PREFIX as N, promise as Nn, findLegacyConfig as Nt, RUN_GIT_MAX_BUFFER_BYTES as O, make$30 as On, detectAiTrainingEnvironment as Ot, STAGED_FILES_TEMP_DIR_PREFIX as P, provide as Pn, formatErrorChain as Pt, Linter as Q, CANONICAL_DISCORD_URL as Qn, layerObservability as Qt, CliInputError as R, runSync as Rn, getDiagnosticRuleIdentity as Rt, CI_TRUST_COMPANIES as S, error as Sn, messageFromUnknown as Sr, collectSourceFileCountsByDirectory as St, MINIMUM_VTE_VERSION_FOR_HYPERLINKS as T, warn$1 as Tn, countOptInProjectRuleSelections as Tt, detectRunnerOs as U, mergeAll$1 as Un, hasSupportedFrameworkOrLibrary as Ut, isDebugFlagEnabled as V, void_ as Vn, groupBy as Vt, isCiEnvironment as W, provide$2 as Wn, hashFileContents as Wt, LEGACY_CONFIG_FILENAME as X, ParentSpan as Xn, isSameRuleKey as Xt, Git as Y, void_$1 as Yn, isReactDoctorError as Yt, LintPartialFailures as Z, AXIOM_DEFAULT_DOMAIN as Zn, isScanComplete as Zt, makeNoopConsole as _, summarizeDiagnostics as _n, getCategoryImpact as _r, buildSkippedChecks as _t, isEnvFlagEnabled as a, mergeReactDoctorConfigs as an, DOCS_URL as ar, Project as at, AXIOM_TRACES_DATASET as b, yieldToEventLoop as bn, isFile as br, classifyFileContext as bt, setSentryProjectInfo as c, resolveLintBatchOrdering as cn, GIT_SHOW_MAX_BUFFER_BYTES as cr, SidecarLintCacheEnabled as ct, isJsonModeActive as d, resolveScanTarget as dn, JSX_FILE_PATTERN as dr, anonymizeInPlace as dt, listSourceFilesCooperative as en, CI_URL as er, NodeResolver as et, setJsonReportDirectory as f, restoreLegacyThrow as fn, MILLISECONDS_PER_SECOND as fr, anonymizeText as ft, VERSION as g, shouldUseMaintainabilityLayer as gn, STAGED_FILES_PROJECT_CONFIG_FILENAMES as gr, buildRuleSeverityControls as gt, writeJsonReport as h, setColorEnabled as hn, SKILL_NAME as hr, buildRuleDocsUrl as ht, isTelemetryEnabled as i, materializeSourceTree as in, DIAGNOSTIC_CATEGORY_BUCKETS as ir, Progress as it, SENTRY_DSN as j, map$3 as jn, filterPathsOutsideDirectories as jt, SCAN_RESULT_CACHE_FILENAME as k, gen as kn, discoverSupportedSubprojects as kt, getRunId as l, resolveReactDoctorCacheDir as ln, HTML_FILE_PATTERN as lr, StagedFiles as lt, writeJsonErrorReport as m, scrubSensitivePaths as mn, SHARE_BASE_URL as mr, buildJsonReport as mt, recordDistribution as n, loadConfigWithSource as nn, COMPILER_CLEANUP_RULE_KEYS as nr, OxlintSpawnSlots as nt, buildSentryScope as o, remainingDeadlineBudgetMs as on, ENTERPRISE_CONTACT_URL as or, Reporter as ot, setJsonReportMode as p, runInspect as pn, OXLINT_NODE_REQUIREMENT as pr, atomicWriteJson as pt, Config as q, makeUnsafe$5 as qn, isPathInsideDirectory as qt, toSpanAttributes as r, mapWithConcurrency as rn, CONFIG_SCHEMA_URL as rr, PerFileLintCacheEnabled as rt, buildSentryProjectContext as s, resolveGithubActionsScoreMetadata as sn, GITHUB_ACTIONS_SETUP_URL as sr, Score as st, recordCount as t, listWorkspacePackages as tn, COMPILER_CLEANUP_BUCKET as tr, OxlintConcurrency as tt, enableJsonMode as u, resolveScanConcurrency as un, JSX_DUPLICATION_SOURCE_FILE_PATTERN as ur, SupplyChain as ut, AXIOM_INGEST_TOKEN as v, toRelativePath as vn, isDirectory as vr, calculateScore as vt, METRIC as w, log as wn, computeDiagnosticDelta as wt, BASELINE_FILES_TEMP_DIR_PREFIX as x, Console as xn, isPlainObject as xr, clearConfigCache as xt, AXIOM_METRICS_DATASET as y, validateConfigTypes as yn, isErrnoException as yr, canonicalizeUserRuleKey as yt, isNonInteractiveEnvironment as z, sync as zn, getDiffInfo as zt };
77114
+ export { Linter as $, CANONICAL_DISCORD_URL as $n, layerObservability as $t, SCAN_RESULT_CACHE_FILENAME as A, gen as An, discoverSupportedSubprojects as At, isNonInteractiveEnvironment as B, sync as Bn, getDiffInfo as Bt, CI_TRUST_COMPANIES as C, error as Cn, messageFromUnknown as Cr, collectSourceFileCountsByDirectory as Ct, NANOSECONDS_PER_MILLISECOND as D, Diagnostic as Dn, createNodeReadFileLinesSync as Dt, MINIMUM_VTE_VERSION_FOR_HYPERLINKS as E, warn$1 as En, countOptInProjectRuleSelections as Et, STAGED_FILES_TEMP_DIR_PREFIX as F, provide as Fn, formatErrorChain as Ft, isCiEnvironment as G, provide$2 as Gn, hashFileContents as Gt, isDebugFlagEnabled as H, void_ as Hn, groupBy as Ht, STAGED_SNAPSHOT_ADDITIONAL_CONFIG_FILENAMES as I, provideContext as In, formatReactDoctorError as It, Config as J, makeUnsafe$5 as Jn, isPathInsideDirectory as Jt, isCiOrCodingAgentEnvironment as K, succeed$3 as Kn, highlighter as Kt, TUI_REPORT_COMPACT_MAX_ROWS as L, provideService as Ln, getBaselineDiffPlan as Lt, SENTRY_DSN as M, map$3 as Mn, filterPathsOutsideDirectories as Mt, SENTRY_FLUSH_TIMEOUT_MS as N, orElseSucceed as Nn, filterSourceFiles as Nt, REACT_DOCTOR_CONFIG_PROJECT_NAME as O, decodeUnknownSync as On, createOxlintSpawnSlots as Ot, SENTRY_RELEASE_PREFIX as P, promise as Pn, findLegacyConfig as Pt, LintPartialFailures as Q, AXIOM_DEFAULT_DOMAIN as Qn, isScanComplete as Qt, TUI_REPORT_DETAIL_WIDTH_FRACTION as R, runPromise as Rn, getChangedLineRanges as Rt, BASELINE_FILES_TEMP_DIR_PREFIX as S, Console as Sn, isPlainObject as Sr, clearConfigCache as St, METRIC as T, log as Tn, computeDiagnosticDelta as Tt, ACTION_INPUT_ENVIRONMENT_VARIABLES as U, buildWithScope as Un, hasPublishedFixRecipe as Ut, isGitHookEnvironment as V, try_ as Vn, getEquivalentRuleKeys as Vt, detectRunnerOs as W, mergeAll$1 as Wn, hasSupportedFrameworkOrLibrary as Wt, Git as X, void_$1 as Xn, isReactDoctorError as Xt, Files as Y, fail$5 as Yn, isProjectDiscoveryError as Yt, LEGACY_CONFIG_FILENAME as Z, ParentSpan as Zn, isSameRuleKey as Zt, VERSION as _, shouldUseMaintainabilityLayer as _n, STAGED_FILES_PROJECT_CONFIG_FILENAMES as _r, buildRuleSeverityControls as _t, isEnvFlagEnabled as a, materializeSourceTree as an, DIAGNOSTIC_CATEGORY_BUCKETS as ar, Progress as at, AXIOM_METRICS_DATASET as b, validateConfigTypes as bn, isErrnoException as br, canonicalizeUserRuleKey as bt, setSentryProjectInfo as c, resolveGithubActionsScoreMetadata as cn, GITHUB_ACTIONS_SETUP_URL as cr, Score as ct, isJsonModeActive as d, resolveScanConcurrency as dn, JSX_DUPLICATION_SOURCE_FILE_PATTERN as dr, SupplyChain as dt, listSourceFiles as en, CANONICAL_GITHUB_URL as er, Maintainability as et, setJsonReportDirectory as f, resolveScanTarget as fn, JSX_FILE_PATTERN as fr, anonymizeInPlace as ft, writeJsonReport as g, setColorEnabled as gn, SKILL_NAME as gr, buildRuleDocsUrl as gt, writeJsonErrorReport as h, scrubSensitivePaths as hn, SHARE_BASE_URL as hr, buildJsonReport as ht, isTelemetryEnabled as i, mapWithConcurrency as in, CONFIG_SCHEMA_URL as ir, PerFileLintCacheEnabled as it, SCAN_RESULT_CACHE_MAX_HASHED_FILE_SIZE_BYTES as j, makeSpan$1 as jn, filterDiagnosticsForSurface as jt, RUN_GIT_MAX_BUFFER_BYTES as k, make$30 as kn, detectAiTrainingEnvironment as kt, getRunId as l, resolveLintBatchOrdering as ln, GIT_SHOW_MAX_BUFFER_BYTES as lr, SidecarLintCacheEnabled as lt, writeJsonCancellationReport as m, runInspect as mn, OXLINT_NODE_REQUIREMENT as mr, atomicWriteJson as mt, recordDistribution as n, listWorkspacePackages as nn, COMPILER_CLEANUP_BUCKET as nr, OxlintConcurrency as nt, buildSentryScope as o, mergeReactDoctorConfigs as on, DOCS_URL as or, Project as ot, setJsonReportMode as p, restoreLegacyThrow as pn, MILLISECONDS_PER_SECOND as pr, anonymizeText as pt, isCodingAgentEnvironment as q, close as qn, isMonorepoRoot as qt, toSpanAttributes as r, loadConfigWithSource as rn, COMPILER_CLEANUP_RULE_KEYS as rr, OxlintSpawnSlots as rt, buildSentryProjectContext as s, remainingDeadlineBudgetMs as sn, ENTERPRISE_CONTACT_URL as sr, Reporter as st, recordCount as t, listSourceFilesCooperative as tn, CI_URL as tr, NodeResolver as tt, enableJsonMode as u, resolveReactDoctorCacheDir as un, HTML_FILE_PATTERN as ur, StagedFiles as ut, makeNoopConsole as v, summarizeDiagnostics as vn, getCategoryImpact as vr, buildSkippedChecks as vt, GH_DEFAULT_BRANCH_PROBE_TIMEOUT_MS as w, info as wn, toCanonicalPath as wr, computeConfigFingerprint as wt, AXIOM_TRACES_DATASET as x, yieldToEventLoop as xn, isFile as xr, classifyFileContext as xt, AXIOM_INGEST_TOKEN as y, toRelativePath as yn, isDirectory as yr, calculateScore as yt, CliInputError as z, runSync as zn, getDiagnosticRuleIdentity as zt };
76802
77115
 
76803
- //# sourceMappingURL=record-metric-CFfsgcVs.js.map
76804
- //# debugId=38aa03c4-3985-547d-9a64-cf1c622167bc
77116
+ //# sourceMappingURL=record-metric-u8youmM2.js.map
77117
+ //# debugId=27aff5c2-a36f-5c1d-95e4-41bc603b5e7f