react-doctor 0.9.12-dev.905607f → 0.9.12-dev.9f7d26f

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 (34) hide show
  1. package/dist/{build-section-divider-D5ATBfDJ.js → build-section-divider-ho4tkWUX.js} +7 -7
  2. package/dist/{ci-DIlnBiUj.js → ci-Gp_DmzbV.js} +12 -12
  3. package/dist/cli.js +28 -27
  4. package/dist/{design-C-uq3ow5.js → design-DFtEnUE4.js} +4 -4
  5. package/dist/{exit-gracefully-C64GRTOn.js → exit-gracefully-D-fqCehG.js} +6 -6
  6. package/dist/{handle-error-Cfcnsjyi.js → handle-error-WbesgRpD.js} +17 -12
  7. package/dist/index.js +402 -253
  8. package/dist/{inspect-BLX566wA.js → inspect-DS-8JQ7-.js} +16 -16
  9. package/dist/{install-Dz8zcUxD.js → install--VBoTn6t.js} +9 -9
  10. package/dist/{install-doctor-script-CjxGMzIH.js → install-doctor-script-ChGM4QXN.js} +6 -13
  11. package/dist/{install-github-workflow-eYmQoXdI.js → install-github-workflow-W9k2a3Ln.js} +9 -5
  12. package/dist/{install-react-doctor-OIDTrbHz.js → install-react-doctor-Bu9OMiav.js} +8 -8
  13. package/dist/{jsx-runtime-BdBmuS_a.js → jsx-runtime-BLZlYxX9.js} +5 -5
  14. package/dist/{print-branded-header-BksixHcc.js → print-branded-header-CGlRc6ub.js} +4 -4
  15. package/dist/project-analysis-worker.js +54 -53
  16. package/dist/{prompt-runtime-scan-url-CXJMNnAo.js → prompt-runtime-scan-url-y1gsTi9R.js} +5 -5
  17. package/dist/{read-object-file-BhV9TFsy.js → read-object-file-8GV0gq_t.js} +4 -4
  18. package/dist/{record-metric-CdX-TQ5W.js → record-metric-BYDiYM_b.js} +348 -198
  19. package/dist/{report-error-DsFo2sAk.js → report-error-C4MUPAvk.js} +5 -5
  20. package/dist/{report-workflow-result-BSSkdwvd.js → report-workflow-result-BmM8X3fj.js} +5 -5
  21. package/dist/{resolve-scope-DRnGmF8O.js → resolve-scope-DmNrMvxi.js} +6 -6
  22. package/dist/{rules-C2g4a0X3.js → rules-DNQKzUXv.js} +6 -6
  23. package/dist/{run-scan-app-Ch6yrLY9.js → run-scan-app-C0kxQ1fE.js} +16 -14
  24. package/dist/{runtime-scan-Crfe35Ke.js → runtime-scan-D_r84DrL.js} +9 -9
  25. package/dist/{sanitize-runtime-url-Dwa_-IKX.js → sanitize-runtime-url-DYlUQwKR.js} +4 -4
  26. package/dist/{scan-DJnhifws.js → scan-CRyEeC82.js} +9 -9
  27. package/dist/{should-fail-scan-gate-D4ZKKeXI.js → should-fail-scan-gate-gkN0JbKk.js} +11 -11
  28. package/dist/{should-skip-prompts-Cfocoh7G.js → should-skip-prompts-Da6drkx_.js} +4 -4
  29. package/dist/{should-use-tui-COX1uZWn.js → should-use-tui-DDV9EXki.js} +4 -4
  30. package/dist/{telemetry-runtime-C_D70xUE.js → telemetry-runtime-DcXXRI22.js} +55 -7
  31. package/dist/{version-BAhd6Zvv.js → version-D4fL3PrW.js} +4 -4
  32. package/dist/{why-MQHWHpeA.js → why-quSmktoh.js} +4 -4
  33. package/dist/{with-run-span-DmpUrF70.js → with-run-span-YnjkCzXg.js} +5 -5
  34. package/package.json +3 -2
@@ -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]="6a0ba47c-464a-51ea-81ff-c472b6fa548a")}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]="25889804-ea20-5e95-ac29-3a09dfcbb7bd")}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-hOS9iAJg.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;
@@ -67989,18 +68104,58 @@ const METRO_CONFIG_FILE_NAMES = [
67989
68104
  const EXPO_METRO_CONFIG_EXTEND_SIGNALS = [
67990
68105
  "expo/metro-config",
67991
68106
  "@sentry/react-native/metro",
67992
- "getSentryExpoConfig"
68107
+ "getSentryExpoConfig",
68108
+ "posthog-react-native/metro",
68109
+ "getPostHogExpoConfig"
67993
68110
  ];
68111
+ const resolveLocalMetroConfigModule = (moduleSpecifier, importingFilePath, rootDirectory) => {
68112
+ if (!moduleSpecifier.startsWith(".")) return void 0;
68113
+ const importedPath = path$1$1.resolve(path$1$1.dirname(importingFilePath), moduleSpecifier);
68114
+ const candidateBasePaths = [
68115
+ importedPath,
68116
+ importedPath.replace(/\.[cm]?js$/, ""),
68117
+ path$1$1.join(importedPath, "index")
68118
+ ];
68119
+ for (const candidateBasePath of candidateBasePaths) {
68120
+ const resolvedPath = resolveEntryWithExtensions(candidateBasePath);
68121
+ if (resolvedPath !== void 0 && isFile(resolvedPath) && isPathInsideDirectoryOrEqual(resolvedPath, rootDirectory)) return resolvedPath;
68122
+ }
68123
+ };
68124
+ const hasExpoMetroConfigSignal = (metroConfigPath, rootDirectory) => {
68125
+ const pendingFilePaths = [metroConfigPath];
68126
+ const visitedFilePaths = /* @__PURE__ */ new Set();
68127
+ while (pendingFilePaths.length > 0) {
68128
+ const currentFilePath = pendingFilePaths.pop();
68129
+ if (currentFilePath === void 0 || visitedFilePaths.has(currentFilePath)) continue;
68130
+ if (visitedFilePaths.size >= 100) return true;
68131
+ visitedFilePaths.add(currentFilePath);
68132
+ let contents;
68133
+ try {
68134
+ contents = fs$1$3.readFileSync(currentFilePath, "utf-8");
68135
+ } catch {
68136
+ return true;
68137
+ }
68138
+ if (EXPO_METRO_CONFIG_EXTEND_SIGNALS.some((signal) => contents.includes(signal))) return true;
68139
+ let moduleSpecifiers;
68140
+ try {
68141
+ moduleSpecifiers = collectStaticModuleSpecifiers(contents, {
68142
+ filePath: currentFilePath,
68143
+ includeTypeOnly: false
68144
+ });
68145
+ } catch {
68146
+ continue;
68147
+ }
68148
+ for (const moduleSpecifier of moduleSpecifiers) {
68149
+ const localModulePath = resolveLocalMetroConfigModule(moduleSpecifier, currentFilePath, rootDirectory);
68150
+ if (localModulePath !== void 0 && !visitedFilePaths.has(localModulePath)) pendingFilePaths.push(localModulePath);
68151
+ }
68152
+ }
68153
+ return false;
68154
+ };
67994
68155
  const checkExpoMetroConfig = (context) => {
67995
68156
  const metroConfigPath = METRO_CONFIG_FILE_NAMES.map((fileName) => path$1$1.join(context.rootDirectory, fileName)).find((candidatePath) => isFile(candidatePath));
67996
68157
  if (metroConfigPath === void 0) return [];
67997
- let contents;
67998
- try {
67999
- contents = fs$1$3.readFileSync(metroConfigPath, "utf-8");
68000
- } catch {
68001
- return [];
68002
- }
68003
- if (EXPO_METRO_CONFIG_EXTEND_SIGNALS.some((signal) => contents.includes(signal))) return [];
68158
+ if (hasExpoMetroConfigSignal(metroConfigPath, context.rootDirectory)) return [];
68004
68159
  return [buildExpoDiagnostic({
68005
68160
  rule: "expo-metro-config",
68006
68161
  filePath: path$1$1.basename(metroConfigPath),
@@ -69586,72 +69741,6 @@ const checkSecurityScanCooperative = async (rootDirectory, options = {}) => {
69586
69741
  }
69587
69742
  return session.diagnostics;
69588
69743
  };
69589
- var import_picocolors = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
69590
- let p = process || {}, argv = p.argv || [], env = p.env || {};
69591
- 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);
69592
- let formatter = (open, close, replace = open) => (input) => {
69593
- let string = "" + input, index = string.indexOf(close, open.length);
69594
- return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
69595
- };
69596
- let replaceClose = (string, close, replace, index) => {
69597
- let result = "", cursor = 0;
69598
- do {
69599
- result += string.substring(cursor, index) + replace;
69600
- cursor = index + close.length;
69601
- index = string.indexOf(close, cursor);
69602
- } while (~index);
69603
- return result + string.substring(cursor);
69604
- };
69605
- let createColors = (enabled = isColorSupported) => {
69606
- let f = enabled ? formatter : () => String;
69607
- return {
69608
- isColorSupported: enabled,
69609
- reset: f("\x1B[0m", "\x1B[0m"),
69610
- bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
69611
- dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
69612
- italic: f("\x1B[3m", "\x1B[23m"),
69613
- underline: f("\x1B[4m", "\x1B[24m"),
69614
- inverse: f("\x1B[7m", "\x1B[27m"),
69615
- hidden: f("\x1B[8m", "\x1B[28m"),
69616
- strikethrough: f("\x1B[9m", "\x1B[29m"),
69617
- black: f("\x1B[30m", "\x1B[39m"),
69618
- red: f("\x1B[31m", "\x1B[39m"),
69619
- green: f("\x1B[32m", "\x1B[39m"),
69620
- yellow: f("\x1B[33m", "\x1B[39m"),
69621
- blue: f("\x1B[34m", "\x1B[39m"),
69622
- magenta: f("\x1B[35m", "\x1B[39m"),
69623
- cyan: f("\x1B[36m", "\x1B[39m"),
69624
- white: f("\x1B[37m", "\x1B[39m"),
69625
- gray: f("\x1B[90m", "\x1B[39m"),
69626
- bgBlack: f("\x1B[40m", "\x1B[49m"),
69627
- bgRed: f("\x1B[41m", "\x1B[49m"),
69628
- bgGreen: f("\x1B[42m", "\x1B[49m"),
69629
- bgYellow: f("\x1B[43m", "\x1B[49m"),
69630
- bgBlue: f("\x1B[44m", "\x1B[49m"),
69631
- bgMagenta: f("\x1B[45m", "\x1B[49m"),
69632
- bgCyan: f("\x1B[46m", "\x1B[49m"),
69633
- bgWhite: f("\x1B[47m", "\x1B[49m"),
69634
- blackBright: f("\x1B[90m", "\x1B[39m"),
69635
- redBright: f("\x1B[91m", "\x1B[39m"),
69636
- greenBright: f("\x1B[92m", "\x1B[39m"),
69637
- yellowBright: f("\x1B[93m", "\x1B[39m"),
69638
- blueBright: f("\x1B[94m", "\x1B[39m"),
69639
- magentaBright: f("\x1B[95m", "\x1B[39m"),
69640
- cyanBright: f("\x1B[96m", "\x1B[39m"),
69641
- whiteBright: f("\x1B[97m", "\x1B[39m"),
69642
- bgBlackBright: f("\x1B[100m", "\x1B[49m"),
69643
- bgRedBright: f("\x1B[101m", "\x1B[49m"),
69644
- bgGreenBright: f("\x1B[102m", "\x1B[49m"),
69645
- bgYellowBright: f("\x1B[103m", "\x1B[49m"),
69646
- bgBlueBright: f("\x1B[104m", "\x1B[49m"),
69647
- bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
69648
- bgCyanBright: f("\x1B[106m", "\x1B[49m"),
69649
- bgWhiteBright: f("\x1B[107m", "\x1B[49m")
69650
- };
69651
- };
69652
- module.exports = createColors();
69653
- module.exports.createColors = createColors;
69654
- })))(), 1);
69655
69744
  const highlighter = {
69656
69745
  error: import_picocolors.default.red,
69657
69746
  warn: import_picocolors.default.yellow,
@@ -71067,7 +71156,11 @@ var Git = class Git extends Service()("react-doctor/Git") {
71067
71156
  const symref = yield* runGit(directory, ["symbolic-ref", "refs/remotes/origin/HEAD"]);
71068
71157
  if (symref.status === 0) {
71069
71158
  const trimmed = trimOrNull(symref.stdout);
71070
- if (trimmed !== null) return trimmed.replace("refs/remotes/origin/", "");
71159
+ if (trimmed !== null) {
71160
+ const branchName = trimmed.replace("refs/remotes/origin/", "");
71161
+ const remoteBranch = `origin/${branchName}`;
71162
+ return (yield* branchExists(directory, remoteBranch)) ? remoteBranch : branchName;
71163
+ }
71071
71164
  }
71072
71165
  const candidates = yield* runGit(directory, [
71073
71166
  "for-each-ref",
@@ -71075,7 +71168,10 @@ var Git = class Git extends Service()("react-doctor/Git") {
71075
71168
  ...DEFAULT_BRANCH_CANDIDATES.map((candidate) => `refs/heads/${candidate}`)
71076
71169
  ]);
71077
71170
  if (candidates.status !== 0) return null;
71078
- return trimOrNull(candidates.stdout.split("\n")[0] ?? "");
71171
+ const localBranch = trimOrNull(candidates.stdout.split("\n")[0] ?? "");
71172
+ if (localBranch === null) return null;
71173
+ const remoteBranch = `origin/${localBranch}`;
71174
+ return (yield* branchExists(directory, remoteBranch)) ? remoteBranch : localBranch;
71079
71175
  }).pipe(withSpan("Git.defaultBranch"));
71080
71176
  const branchExists = (directory, branch) => runGit(directory, [
71081
71177
  "rev-parse",
@@ -71412,59 +71508,11 @@ const isLocalPathExtend = (entry) => {
71412
71508
  for (const prefix of EXTENDS_LOCAL_PATH_PREFIXES) if (entry.startsWith(prefix)) return true;
71413
71509
  return false;
71414
71510
  };
71415
- const stripJsoncComments = (raw) => {
71416
- let result = "";
71417
- let cursor = 0;
71418
- let inString = false;
71419
- let stringQuote = "";
71420
- while (cursor < raw.length) {
71421
- const character = raw[cursor];
71422
- const nextCharacter = raw[cursor + 1];
71423
- if (inString) {
71424
- result += character;
71425
- if (character === "\\" && cursor + 1 < raw.length) {
71426
- result += nextCharacter;
71427
- cursor += 2;
71428
- continue;
71429
- }
71430
- if (character === stringQuote) inString = false;
71431
- cursor += 1;
71432
- continue;
71433
- }
71434
- if (character === "\"" || character === "'") {
71435
- inString = true;
71436
- stringQuote = character;
71437
- result += character;
71438
- cursor += 1;
71439
- continue;
71440
- }
71441
- if (character === "/" && nextCharacter === "/") {
71442
- const lineEndIndex = raw.indexOf("\n", cursor);
71443
- cursor = lineEndIndex === -1 ? raw.length : lineEndIndex;
71444
- continue;
71445
- }
71446
- if (character === "/" && nextCharacter === "*") {
71447
- const blockEndIndex = raw.indexOf("*/", cursor + 2);
71448
- cursor = blockEndIndex === -1 ? raw.length : blockEndIndex + 2;
71449
- continue;
71450
- }
71451
- result += character;
71452
- cursor += 1;
71453
- }
71454
- return result;
71455
- };
71456
- const parseJsonOrJsonc = (raw) => {
71457
- try {
71458
- return JSON.parse(raw);
71459
- } catch {
71460
- return JSON.parse(stripJsoncComments(raw));
71461
- }
71462
- };
71463
71511
  const canOxlintExtendConfig = (configPath) => {
71464
71512
  if (!configPath.endsWith(".eslintrc.json")) return true;
71465
71513
  let parsed;
71466
71514
  try {
71467
- parsed = parseJsonOrJsonc(fs$1$3.readFileSync(configPath, "utf-8"));
71515
+ parsed = parseJSONC(fs$1$3.readFileSync(configPath, "utf-8"), { allowTrailingComma: true });
71468
71516
  } catch {
71469
71517
  return true;
71470
71518
  }
@@ -71573,7 +71621,39 @@ const detectUserLintConfigPaths = (rootDirectory) => {
71573
71621
  }
71574
71622
  return [];
71575
71623
  };
71624
+ const readAdoptedLintConfigSettings = (configPaths) => {
71625
+ const mergedSettings = /* @__PURE__ */ new Map();
71626
+ for (const configPath of configPaths) {
71627
+ let parsed;
71628
+ try {
71629
+ parsed = parseJSONC(fs$1$3.readFileSync(configPath, "utf-8"), { allowTrailingComma: true });
71630
+ } catch {
71631
+ continue;
71632
+ }
71633
+ if (!isPlainObject(parsed)) continue;
71634
+ const settings = parsed.settings;
71635
+ if (!isPlainObject(settings)) continue;
71636
+ for (const [pluginName, pluginSettings] of Object.entries(settings)) {
71637
+ if (pluginName === "react-doctor") continue;
71638
+ mergedSettings.set(pluginName, pluginSettings);
71639
+ }
71640
+ }
71641
+ return Object.fromEntries(mergedSettings);
71642
+ };
71576
71643
  const DISABLE_DIRECTIVE_PATTERN = /(eslint|oxlint)-disable/;
71644
+ const getBackupRootDirectory = (rootDirectory) => path$1$1.join(rootDirectory, ...DISABLE_DIRECTIVE_BACKUP_DIRECTORY_SEGMENTS);
71645
+ const getBackupPath = (rootDirectory, absolutePath) => {
71646
+ if (!isPathInsideDirectory(absolutePath, rootDirectory)) return null;
71647
+ return path$1$1.join(getBackupRootDirectory(rootDirectory), path$1$1.relative(rootDirectory, absolutePath));
71648
+ };
71649
+ const removeBackupRootIfEmpty = (rootDirectory) => {
71650
+ const backupRootDirectory = getBackupRootDirectory(rootDirectory);
71651
+ if (!walkSourceTreeFiles(backupRootDirectory).next().done) return;
71652
+ fs$1$3.rmSync(backupRootDirectory, {
71653
+ recursive: true,
71654
+ force: true
71655
+ });
71656
+ };
71577
71657
  const neutralizedFileLeases = /* @__PURE__ */ new Map();
71578
71658
  const activeNeutralizationInitializations = /* @__PURE__ */ new Set();
71579
71659
  const directoriesOverlap = (left, right) => {
@@ -71665,8 +71745,50 @@ const collectNeutralizationCandidatePaths = (rootDirectory, discoveredRelativePa
71665
71745
  }
71666
71746
  return candidatePaths;
71667
71747
  };
71748
+ const recoverOrphanedBackups = (rootDirectory) => {
71749
+ const blockedPaths = /* @__PURE__ */ new Set();
71750
+ const backupRootDirectory = getBackupRootDirectory(rootDirectory);
71751
+ for (const { absolutePath: backupPath } of walkSourceTreeFiles(backupRootDirectory)) {
71752
+ const originalPath = path$1$1.join(rootDirectory, path$1$1.relative(backupRootDirectory, backupPath));
71753
+ if (neutralizedFileLeases.has(originalPath)) continue;
71754
+ let backupContent;
71755
+ let currentContent;
71756
+ try {
71757
+ backupContent = fs$1$3.readFileSync(backupPath, "utf-8");
71758
+ currentContent = fs$1$3.readFileSync(originalPath, "utf-8");
71759
+ } catch (error) {
71760
+ process.stderr.write(`[react-doctor] Could not recover ${originalPath}: ${messageFromUnknown(error)}. The backup remains at ${backupPath}.\n`);
71761
+ blockedPaths.add(originalPath);
71762
+ continue;
71763
+ }
71764
+ if (currentContent === backupContent) {
71765
+ try {
71766
+ fs$1$3.rmSync(backupPath);
71767
+ } catch (error) {
71768
+ process.stderr.write(`[react-doctor] Failed to delete stale backup ${backupPath}: ${messageFromUnknown(error)}\n`);
71769
+ blockedPaths.add(originalPath);
71770
+ }
71771
+ continue;
71772
+ }
71773
+ if (currentContent !== neutralizeContent(backupContent)) {
71774
+ process.stderr.write(`[react-doctor] Did not overwrite changed file ${originalPath}. Recover it manually from ${backupPath}.\n`);
71775
+ blockedPaths.add(originalPath);
71776
+ continue;
71777
+ }
71778
+ try {
71779
+ fs$1$3.writeFileSync(originalPath, backupContent);
71780
+ fs$1$3.rmSync(backupPath);
71781
+ } catch (error) {
71782
+ process.stderr.write(`[react-doctor] Failed to restore ${originalPath} from backup: ${messageFromUnknown(error)}\n`);
71783
+ blockedPaths.add(originalPath);
71784
+ }
71785
+ }
71786
+ removeBackupRootIfEmpty(rootDirectory);
71787
+ return blockedPaths;
71788
+ };
71668
71789
  const neutralizeDisableDirectives = async (rootDirectory, includePaths, options = {}) => {
71669
71790
  const resolvedRootDirectory = fs$1$3.realpathSync(rootDirectory);
71791
+ const blockedPaths = /* @__PURE__ */ new Set();
71670
71792
  const leasedPaths = /* @__PURE__ */ new Set();
71671
71793
  let isRestored = false;
71672
71794
  const restore = () => {
@@ -71679,16 +71801,24 @@ const neutralizeDisableDirectives = async (rootDirectory, includePaths, options
71679
71801
  if (lease.referenceCount > 0) continue;
71680
71802
  neutralizedFileLeases.delete(absolutePath);
71681
71803
  try {
71682
- fs$1$3.writeFileSync(absolutePath, lease.originalContent);
71804
+ const currentContent = fs$1$3.readFileSync(absolutePath, "utf-8");
71805
+ if (currentContent !== lease.neutralizedContent && currentContent !== lease.originalContent) {
71806
+ process.stderr.write(`[react-doctor] Did not overwrite changed file ${absolutePath}. Recover it manually from ${lease.backupPath}.\n`);
71807
+ continue;
71808
+ }
71809
+ if (currentContent === lease.neutralizedContent) fs$1$3.writeFileSync(absolutePath, lease.originalContent);
71810
+ fs$1$3.rmSync(lease.backupPath, { force: true });
71683
71811
  } catch (error) {
71684
- process.stderr.write(`[react-doctor] Failed to restore inline disable directives in ${absolutePath}: ${messageFromUnknown(error)}\n[react-doctor] Run: git checkout -- ${absolutePath}\n`);
71812
+ process.stderr.write(`[react-doctor] Failed to restore inline disable directives in ${absolutePath}: ${messageFromUnknown(error)}. The backup remains at ${lease.backupPath}.\n`);
71685
71813
  }
71686
71814
  }
71815
+ removeBackupRootIfEmpty(resolvedRootDirectory);
71687
71816
  };
71688
71817
  const onExit = () => restore();
71689
71818
  process.once("exit", onExit);
71690
71819
  const leaseCandidatePath = (absolutePath) => {
71691
71820
  if (leasedPaths.has(absolutePath)) return;
71821
+ if (blockedPaths.has(absolutePath)) return;
71692
71822
  const existingLease = neutralizedFileLeases.get(absolutePath);
71693
71823
  if (existingLease) {
71694
71824
  existingLease.referenceCount += 1;
@@ -71703,9 +71833,20 @@ const neutralizeDisableDirectives = async (rootDirectory, includePaths, options
71703
71833
  }
71704
71834
  const neutralizedContent = neutralizeContent(originalContent);
71705
71835
  if (neutralizedContent !== originalContent) {
71836
+ const backupPath = getBackupPath(resolvedRootDirectory, absolutePath);
71837
+ if (backupPath === null) return;
71838
+ try {
71839
+ fs$1$3.mkdirSync(path$1$1.dirname(backupPath), { recursive: true });
71840
+ fs$1$3.writeFileSync(backupPath, originalContent, { flag: "wx" });
71841
+ } catch (error) {
71842
+ process.stderr.write(`[react-doctor] Did not modify ${absolutePath}: ${messageFromUnknown(error)}. Check ${backupPath}.\n`);
71843
+ return;
71844
+ }
71706
71845
  fs$1$3.writeFileSync(absolutePath, neutralizedContent);
71707
71846
  neutralizedFileLeases.set(absolutePath, {
71847
+ backupPath,
71708
71848
  originalContent,
71849
+ neutralizedContent,
71709
71850
  referenceCount: 1
71710
71851
  });
71711
71852
  leasedPaths.add(absolutePath);
@@ -71713,6 +71854,8 @@ const neutralizeDisableDirectives = async (rootDirectory, includePaths, options
71713
71854
  };
71714
71855
  try {
71715
71856
  await withOverlappingInitializationLock(resolvedRootDirectory, async () => {
71857
+ for (const blockedPath of recoverOrphanedBackups(resolvedRootDirectory)) blockedPaths.add(blockedPath);
71858
+ if (options.recoverOnly) return;
71716
71859
  for (const absolutePath of collectNeutralizationCandidatePaths(resolvedRootDirectory, [], includePaths)) if (neutralizedFileLeases.has(absolutePath)) leaseCandidatePath(absolutePath);
71717
71860
  const discoveredRelativePaths = await (options.findFiles ?? findFilesWithDisableDirectives)(resolvedRootDirectory, includePaths);
71718
71861
  for (const absolutePath of collectNeutralizationCandidatePaths(resolvedRootDirectory, discoveredRelativePaths, includePaths)) leaseCandidatePath(absolutePath);
@@ -71893,7 +72036,7 @@ const buildUserPluginRules = (userPlugin, severityControls) => {
71893
72036
  }
71894
72037
  return enabled;
71895
72038
  };
71896
- 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 }) => {
72039
+ 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 }) => {
71897
72040
  const hasIncludedTags = includedTags.size > 0;
71898
72041
  const reactHooksJsPlugin = disableReactHooksJsPlugin || ruleSelection === "sidecar" || hasIncludedTags ? null : resolveReactHooksJsPlugin(project.hasReactCompiler || project.hasReactCompilerLintPlugin === true, customRulesOnly);
71899
72042
  const reactCompilerRules = reactHooksJsPlugin ? applyRuleSeverityControls(filterRulesToAvailable(REACT_COMPILER_RULES, "react-hooks-js", reactHooksJsPlugin.availableRuleNames), severityControls) : {};
@@ -71948,23 +72091,26 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
71948
72091
  },
71949
72092
  plugins: [],
71950
72093
  jsPlugins: [...jsPlugins, pluginPath],
71951
- settings: { "react-doctor": {
71952
- portedRuleMode: "curated",
71953
- framework: project.framework,
71954
- rootDirectory: settingsRootDirectory,
71955
- capabilities: [...capabilities].sort(),
71956
- ...runtimeGlobals && runtimeGlobals.length > 0 ? { runtimeGlobals: [...runtimeGlobals] } : {},
71957
- ...unpluginAutoImportGlobalScopes && unpluginAutoImportGlobalScopes.length > 0 ? {
71958
- unpluginAutoImportRootDirectories: [...new Set([settingsRootDirectory, project.rootDirectory])],
71959
- unpluginAutoImportGlobalScopes: unpluginAutoImportGlobalScopes.map((scope) => ({
71960
- directory: scope.directory,
71961
- names: [...scope.names]
71962
- }))
71963
- } : {},
71964
- ...project.shopifyFlashListMajorVersion !== null ? { shopifyFlashListMajorVersion: project.shopifyFlashListMajorVersion } : {},
71965
- ...serverAuthFunctionNames && serverAuthFunctionNames.length > 0 ? { serverAuthFunctionNames: [...serverAuthFunctionNames] } : {},
71966
- ...projectIndexModuleSources !== void 0 ? { projectIndexModuleSources: [...projectIndexModuleSources] } : {}
71967
- } },
72094
+ settings: {
72095
+ ...adoptedSettings,
72096
+ "react-doctor": {
72097
+ portedRuleMode: "curated",
72098
+ framework: project.framework,
72099
+ rootDirectory: settingsRootDirectory,
72100
+ capabilities: [...capabilities].sort(),
72101
+ ...runtimeGlobals && runtimeGlobals.length > 0 ? { runtimeGlobals: [...runtimeGlobals] } : {},
72102
+ ...unpluginAutoImportGlobalScopes && unpluginAutoImportGlobalScopes.length > 0 ? {
72103
+ unpluginAutoImportRootDirectories: [...new Set([settingsRootDirectory, project.rootDirectory])],
72104
+ unpluginAutoImportGlobalScopes: unpluginAutoImportGlobalScopes.map((scope) => ({
72105
+ directory: scope.directory,
72106
+ names: [...scope.names]
72107
+ }))
72108
+ } : {},
72109
+ ...project.shopifyFlashListMajorVersion !== null ? { shopifyFlashListMajorVersion: project.shopifyFlashListMajorVersion } : {},
72110
+ ...serverAuthFunctionNames && serverAuthFunctionNames.length > 0 ? { serverAuthFunctionNames: [...serverAuthFunctionNames] } : {},
72111
+ ...projectIndexModuleSources !== void 0 ? { projectIndexModuleSources: [...projectIndexModuleSources] } : {}
72112
+ }
72113
+ },
71968
72114
  rules: {
71969
72115
  ...reactCompilerRules,
71970
72116
  ...enabledReactDoctorRules,
@@ -74073,9 +74219,11 @@ const runOxlint = async (options) => {
74073
74219
  return [];
74074
74220
  }
74075
74221
  const pluginPath = resolvePluginPath();
74076
- const extendsPaths = (adoptExistingLintConfig && !customRulesOnly ? detectUserLintConfigPaths(rootDirectory) : []).filter(canOxlintExtendConfig);
74222
+ const detectedConfigPaths = adoptExistingLintConfig && !customRulesOnly ? detectUserLintConfigPaths(rootDirectory) : [];
74223
+ const extendsPaths = detectedConfigPaths.filter(canOxlintExtendConfig);
74224
+ const adoptedSettings = detectedConfigPaths.length > 0 ? readAdoptedLintConfigSettings(detectedConfigPaths) : {};
74077
74225
  const userPlugins = includedTags.size > 0 ? [] : resolveUserPlugins(userConfig?.plugins, configSourceDirectory);
74078
- const restoreDisableDirectives = respectInlineDisables ? () => {} : await neutralizeDisableDirectives(rootDirectory, includePaths ?? options.precomputedSourceFiles?.map((sourceFile) => sourceFile.path));
74226
+ const restoreDisableDirectives = await neutralizeDisableDirectives(rootDirectory, includePaths ?? options.precomputedSourceFiles?.map((sourceFile) => sourceFile.path), { recoverOnly: respectInlineDisables });
74079
74227
  const configDirectory = fs$1$3.mkdtempSync(path$1$1.join(os.tmpdir(), "react-doctor-oxlintrc-"));
74080
74228
  const configPath = path$1$1.join(configDirectory, "oxlintrc.json");
74081
74229
  try {
@@ -74135,6 +74283,7 @@ const runOxlint = async (options) => {
74135
74283
  serverAuthFunctionNames,
74136
74284
  projectIndexModuleSources,
74137
74285
  severityControls,
74286
+ adoptedSettings,
74138
74287
  userPlugins,
74139
74288
  disableReactHooksJsPlugin: overrides.disableReactHooksJsPlugin,
74140
74289
  ruleSelection: overrides.ruleSelection,
@@ -76546,6 +76695,7 @@ const METRIC = {
76546
76695
  tuiIssueStreamShown: "tui.issue_stream_shown",
76547
76696
  tuiProjectPathContextShown: "tui.project_path_context_shown",
76548
76697
  tuiProjectSelectShown: "tui.project_select_shown",
76698
+ tuiCiRecommendationShown: "tui.ci_recommendation_shown",
76549
76699
  tuiReportActionSelected: "tui.report_action_selected",
76550
76700
  tuiCancelled: "tui.cancelled",
76551
76701
  tuiScanInlineShown: "tui.scan_inline_shown",
@@ -76594,7 +76744,7 @@ const makeNoopConsole = () => ({
76594
76744
  });
76595
76745
  //#endregion
76596
76746
  //#region src/cli/utils/version.ts
76597
- const VERSION = "0.9.12-dev.905607f";
76747
+ const VERSION = "0.9.12-dev.9f7d26f";
76598
76748
  //#endregion
76599
76749
  //#region src/cli/utils/json-mode.ts
76600
76750
  let context = null;
@@ -76938,5 +77088,5 @@ const recordDistribution = (name, value, options = {}) => {
76938
77088
  //#endregion
76939
77089
  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 };
76940
77090
 
76941
- //# sourceMappingURL=record-metric-CdX-TQ5W.js.map
76942
- //# debugId=6a0ba47c-464a-51ea-81ff-c472b6fa548a
77091
+ //# sourceMappingURL=record-metric-BYDiYM_b.js.map
77092
+ //# debugId=25889804-ea20-5e95-ac29-3a09dfcbb7bd