react-doctor 0.9.12-dev.afa1780 → 0.9.12-dev.ca30808

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 (39) hide show
  1. package/README.md +6 -0
  2. package/dist/{build-section-divider-B9vlCDHV.js → build-section-divider-DGcPvzjX.js} +7 -7
  3. package/dist/{ci-rLzlDu2j.js → ci-DZ9QnUV4.js} +12 -12
  4. package/dist/cli.js +65 -37
  5. package/dist/{design-CzVqEwWg.js → design-BlxQroSp.js} +4 -4
  6. package/dist/{devtools-BiC-AP3B.js → devtools-CC2PAZ85.js} +3 -3
  7. package/dist/{exit-gracefully-Bq-JF68q.js → exit-gracefully-Dt1ix6Xh.js} +6 -6
  8. package/dist/{get-east-asian-width-Cglw13G7.js → get-east-asian-width-Bv2TD3Xj.js} +3 -3
  9. package/dist/{handle-error-DUSoFUPL.js → handle-error-Cslt8b7C.js} +5 -5
  10. package/dist/index.js +232 -121
  11. package/dist/{inspect-CNeq8v8s.js → inspect-Dd1qqPJf.js} +38 -29
  12. package/dist/{install-DP8oO5sw.js → install-DeWeUjqr.js} +9 -9
  13. package/dist/{install-doctor-script-DbnMjPjQ.js → install-doctor-script-DbKR-GHo.js} +5 -5
  14. package/dist/{install-github-workflow-CS_YO_OJ.js → install-github-workflow-Bkv_CMdF.js} +10 -6
  15. package/dist/{install-react-doctor-BTiagoIZ.js → install-react-doctor-DkfLDtWd.js} +8 -8
  16. package/dist/{jsx-runtime-DGcmMln7.js → jsx-runtime-DwPH8QhA.js} +7 -7
  17. package/dist/path-format-DnHpmJwG.js +9 -0
  18. package/dist/{print-branded-header-bKbewJRI.js → print-branded-header-CFNvp2ey.js} +4 -4
  19. package/dist/project-analysis-worker.js +53 -52
  20. package/dist/{prompt-runtime-scan-url-CvsHajZD.js → prompt-runtime-scan-url-BuXp7_n4.js} +6 -6
  21. package/dist/{read-object-file-DIGDC3MB.js → read-object-file-CEbx-anl.js} +4 -4
  22. package/dist/{record-metric-C4-VKG9G.js → record-metric-BzGcVSov.js} +228 -116
  23. package/dist/{report-error-1lrvJd3S.js → report-error-ZMTPN93d.js} +5 -5
  24. package/dist/{report-workflow-result-C42nztEL.js → report-workflow-result-CKUjTJpB.js} +5 -5
  25. package/dist/{resolve-scope-YUP_rtf3.js → resolve-scope-BgrQEVtj.js} +8 -10
  26. package/dist/{rules-BY4vq5-i.js → rules-DizN5gJ6.js} +6 -6
  27. package/dist/{run-scan-app-DHDnmfX6.js → run-scan-app-CjSGMmOE.js} +16 -14
  28. package/dist/{runtime-scan-ClVvgojx.js → runtime-scan-DINB89wl.js} +9 -9
  29. package/dist/{sanitize-runtime-url-DVwfWWZy.js → sanitize-runtime-url-CFvLC0Vp.js} +4 -4
  30. package/dist/{scan-C9YMcGrG.js → scan-CEvjogRY.js} +17 -11
  31. package/dist/{should-fail-scan-gate-CtPrWy9N.js → should-fail-scan-gate-gpuv_UOL.js} +19 -12
  32. package/dist/{should-skip-prompts-b1KKh2nz.js → should-skip-prompts-F0NaNR8z.js} +4 -4
  33. package/dist/{should-use-tui-Dh_kmKLh.js → should-use-tui-Dve0A4YR.js} +4 -4
  34. package/dist/{telemetry-runtime-CDAL4uhm.js → telemetry-runtime-Bs7DsGaF.js} +4 -4
  35. package/dist/{unref-stdin-BKT_s38a.js → unref-stdin-SK3WfwxS.js} +3 -3
  36. package/dist/{version-CDNMEvQU.js → version-DVa-lN1C.js} +4 -4
  37. package/dist/{why-fw7vWXR7.js → why-BqR3fLtE.js} +4 -4
  38. package/dist/{with-run-span-V4LjJBYW.js → with-run-span-NbAvibgv.js} +5 -5
  39. package/package.json +4 -4
@@ -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]="8c1c93ba-3c9c-52ed-ab45-dd9ad17cb8d3")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="903f2afd-3ece-5d3d-b803-69dfd65d9350")}catch(e){}}();
3
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,14 +20,14 @@ 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-C1E7dTEQ.js
30
+ //#region ../core/dist/collect-unplugin-auto-import-global-scopes-hOS9iAJg.js
30
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])$/;
@@ -571,6 +572,74 @@ const compileGlobPatternsLenient = (patterns, onInvalid) => {
571
572
  }
572
573
  return compiled;
573
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
+ };
574
643
  /**
575
644
  * Resolves a path to its canonical, symlink-free form, falling back to
576
645
  * the input when it cannot be realpath'd (broken symlink, permission
@@ -65631,12 +65700,26 @@ const getEquivalentRuleKeys = (ruleKey) => {
65631
65700
  const nativeRuleKey = canonicalizeRuleKey(ruleKey);
65632
65701
  return [nativeRuleKey, ...getLegacyRuleKeysForNative(nativeRuleKey)];
65633
65702
  };
65634
- const toRelativePath = (filePath, rootDirectory) => {
65635
- const normalizedFilePath = filePath.replace(/\\/g, "/");
65636
- const normalizedRoot = rootDirectory.replace(/\\/g, "/").replace(/\/$/, "") + "/";
65637
- if (normalizedFilePath.startsWith(normalizedRoot)) return normalizedFilePath.slice(normalizedRoot.length);
65638
- 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(/^\.\//, "")}`;
65639
65721
  };
65722
+ const toNormalizedRelativePath = (filePath, rootDirectory) => path$1$1.relative(path$1$1.resolve(rootDirectory), path$1$1.resolve(resolveCandidateReadPath(rootDirectory, filePath))).replaceAll("\\", "/") || ".";
65640
65723
  const warnConfigIssue = (message) => {
65641
65724
  process.stderr.write(`[react-doctor] ${message}\n`);
65642
65725
  };
@@ -65685,7 +65768,7 @@ const compileIgnoreOverrides = (userConfig) => {
65685
65768
  };
65686
65769
  const isDiagnosticIgnoredByOverrides = (diagnostic, rootDirectory, overrides) => {
65687
65770
  if (overrides.length === 0) return false;
65688
- const relativeFilePath = toRelativePath(diagnostic.filePath, rootDirectory);
65771
+ const relativeFilePath = toNormalizedRelativePath(diagnostic.filePath, rootDirectory);
65689
65772
  const ruleIdentifier = `${diagnostic.plugin}/${diagnostic.rule}`;
65690
65773
  return overrides.some((override) => override.filePatterns.some((pattern) => pattern.test(relativeFilePath)) && hasMatchingRuleOverride(override.ruleIds, ruleIdentifier));
65691
65774
  };
@@ -66025,7 +66108,7 @@ const compileIgnoredFilePatterns = (userConfig) => {
66025
66108
  };
66026
66109
  const isFileIgnoredByPatterns = (filePath, rootDirectory, patterns) => {
66027
66110
  if (patterns.length === 0) return false;
66028
- const relativePath = toRelativePath(filePath, rootDirectory);
66111
+ const relativePath = toNormalizedRelativePath(filePath, rootDirectory);
66029
66112
  return patterns.some((pattern) => pattern.test(relativePath));
66030
66113
  };
66031
66114
  const SCRIPT_EXTENSION_FRAGMENT = "[cm]?[jt]sx?";
@@ -66149,25 +66232,6 @@ const classifyPackageRole = (filename) => {
66149
66232
  return result;
66150
66233
  };
66151
66234
  /**
66152
- * Resolves the absolute path to read for a diagnostic's `filePath`,
66153
- * accounting for the various shapes oxlint emits:
66154
- *
66155
- * - `file://` URL — decode to an absolute filesystem path.
66156
- * - Absolute POSIX (`/abs/path/file.tsx`) — pass through.
66157
- * - Absolute Windows (`C:/...` or `C:\...`) — pass through.
66158
- * - `./relative` or bare relative — join against `rootDirectory`.
66159
- *
66160
- * Shared between the streaming diagnostic pipeline and the legacy
66161
- * array-shaped `mergeAndFilterDiagnostics` wrapper so file-line lookups
66162
- * use one canonical resolution path.
66163
- */
66164
- const resolveCandidateReadPath = (rootDirectory, filePath) => {
66165
- if (filePath.startsWith("file://")) return fileURLToPath(filePath);
66166
- const normalizedFile = filePath.replace(/\\/g, "/");
66167
- if (normalizedFile.startsWith("/") || /^[a-zA-Z]:\//.test(normalizedFile) || /^[a-zA-Z]:\\/.test(filePath)) return filePath;
66168
- return `${rootDirectory.replace(/\\/g, "/").replace(/\/$/, "")}/${normalizedFile.replace(/^\.\//, "")}`;
66169
- };
66170
- /**
66171
66235
  * Shared raw-line scanners that detect whether a diagnostic site is
66172
66236
  * enclosed by a configured `textComponents` entry or a
66173
66237
  * `rawTextWrapperComponents` entry. Both checks are used by the
@@ -67851,6 +67915,28 @@ const checkExpoEnvLocalFiles = (context) => {
67851
67915
  help: `Add \`.env*.local\` to your .gitignore. If already committed, untrack with \`git rm --cached ${committedEnvFiles.join(" ")}\``
67852
67916
  })];
67853
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
+ };
67854
67940
  const isExpoSdkAtLeast = (expoSdkMajor, minMajor) => expoSdkMajor !== null && expoSdkMajor >= minMajor;
67855
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";
67856
67942
  const FIREBASE_HELP = "Use the Firebase JS SDK or React Native Firebase directly. See https://expo.fyi/firebase-migration-guide";
@@ -67904,7 +67990,8 @@ const FLAGGED_DEPENDENCIES = [
67904
67990
  packageName: "@expo/metro-config",
67905
67991
  rule: "expo-no-redundant-dependency",
67906
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",
67907
- 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
67908
67995
  },
67909
67996
  {
67910
67997
  packageName: "@types/react-native",
@@ -67965,8 +68052,9 @@ const FLAGGED_DEPENDENCIES = [
67965
68052
  ];
67966
68053
  const checkExpoFlaggedDependencies = (context) => FLAGGED_DEPENDENCIES.filter((flaggedDependency) => {
67967
68054
  if (!context.directDependencyNames.has(flaggedDependency.packageName)) return false;
67968
- if (flaggedDependency.minSdkMajor === void 0) return true;
67969
- 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;
67970
68058
  }).map((flaggedDependency) => buildExpoDiagnostic({
67971
68059
  rule: flaggedDependency.rule,
67972
68060
  message: flaggedDependency.message,
@@ -68035,18 +68123,58 @@ const METRO_CONFIG_FILE_NAMES = [
68035
68123
  const EXPO_METRO_CONFIG_EXTEND_SIGNALS = [
68036
68124
  "expo/metro-config",
68037
68125
  "@sentry/react-native/metro",
68038
- "getSentryExpoConfig"
68126
+ "getSentryExpoConfig",
68127
+ "posthog-react-native/metro",
68128
+ "getPostHogExpoConfig"
68039
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
+ };
68040
68174
  const checkExpoMetroConfig = (context) => {
68041
68175
  const metroConfigPath = METRO_CONFIG_FILE_NAMES.map((fileName) => path$1$1.join(context.rootDirectory, fileName)).find((candidatePath) => isFile(candidatePath));
68042
68176
  if (metroConfigPath === void 0) return [];
68043
- let contents;
68044
- try {
68045
- contents = fs$1$3.readFileSync(metroConfigPath, "utf-8");
68046
- } catch {
68047
- return [];
68048
- }
68049
- if (EXPO_METRO_CONFIG_EXTEND_SIGNALS.some((signal) => contents.includes(signal))) return [];
68177
+ if (hasExpoMetroConfigSignal(metroConfigPath, context.rootDirectory)) return [];
68050
68178
  return [buildExpoDiagnostic({
68051
68179
  rule: "expo-metro-config",
68052
68180
  filePath: path$1$1.basename(metroConfigPath),
@@ -69807,6 +69935,12 @@ const withProjectAnalysisWorkerSlot = async (task, abortSignal) => {
69807
69935
  });
69808
69936
  return projectAnalysisWorkerSlots.run(task, abortSignal);
69809
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
+ };
69810
69944
  const REACT_DOCTOR_TOOLCHAIN_PACKAGES = new Set([
69811
69945
  "react-doctor",
69812
69946
  "eslint-plugin-react-doctor",
@@ -70635,7 +70769,6 @@ const readTextFileUpToCharacterLimit = async (input) => {
70635
70769
  input.signal?.throwIfAborted();
70636
70770
  return buffer.subarray(0, readOffset).toString("utf-8");
70637
70771
  };
70638
- const toNormalizedRelativePath = (filePath, rootDirectory) => path$1$1.relative(path$1$1.resolve(rootDirectory), path$1$1.resolve(rootDirectory, filePath)).replaceAll("\\", "/") || ".";
70639
70772
  const buildJsxSourceReader = async (input) => {
70640
70773
  const ignoredFilePatterns = compileGlobPatternsLenient(input.ignorePatterns ?? [], (error) => warnConfigIssue(`ignore.files: ${error.message}`));
70641
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));
@@ -71399,59 +71532,11 @@ const isLocalPathExtend = (entry) => {
71399
71532
  for (const prefix of EXTENDS_LOCAL_PATH_PREFIXES) if (entry.startsWith(prefix)) return true;
71400
71533
  return false;
71401
71534
  };
71402
- const stripJsoncComments = (raw) => {
71403
- let result = "";
71404
- let cursor = 0;
71405
- let inString = false;
71406
- let stringQuote = "";
71407
- while (cursor < raw.length) {
71408
- const character = raw[cursor];
71409
- const nextCharacter = raw[cursor + 1];
71410
- if (inString) {
71411
- result += character;
71412
- if (character === "\\" && cursor + 1 < raw.length) {
71413
- result += nextCharacter;
71414
- cursor += 2;
71415
- continue;
71416
- }
71417
- if (character === stringQuote) inString = false;
71418
- cursor += 1;
71419
- continue;
71420
- }
71421
- if (character === "\"" || character === "'") {
71422
- inString = true;
71423
- stringQuote = character;
71424
- result += character;
71425
- cursor += 1;
71426
- continue;
71427
- }
71428
- if (character === "/" && nextCharacter === "/") {
71429
- const lineEndIndex = raw.indexOf("\n", cursor);
71430
- cursor = lineEndIndex === -1 ? raw.length : lineEndIndex;
71431
- continue;
71432
- }
71433
- if (character === "/" && nextCharacter === "*") {
71434
- const blockEndIndex = raw.indexOf("*/", cursor + 2);
71435
- cursor = blockEndIndex === -1 ? raw.length : blockEndIndex + 2;
71436
- continue;
71437
- }
71438
- result += character;
71439
- cursor += 1;
71440
- }
71441
- return result;
71442
- };
71443
- const parseJsonOrJsonc = (raw) => {
71444
- try {
71445
- return JSON.parse(raw);
71446
- } catch {
71447
- return JSON.parse(stripJsoncComments(raw));
71448
- }
71449
- };
71450
71535
  const canOxlintExtendConfig = (configPath) => {
71451
71536
  if (!configPath.endsWith(".eslintrc.json")) return true;
71452
71537
  let parsed;
71453
71538
  try {
71454
- parsed = parseJsonOrJsonc(fs$1$3.readFileSync(configPath, "utf-8"));
71539
+ parsed = parseJSONC(fs$1$3.readFileSync(configPath, "utf-8"), { allowTrailingComma: true });
71455
71540
  } catch {
71456
71541
  return true;
71457
71542
  }
@@ -71560,6 +71645,25 @@ const detectUserLintConfigPaths = (rootDirectory) => {
71560
71645
  }
71561
71646
  return [];
71562
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
+ };
71563
71667
  const DISABLE_DIRECTIVE_PATTERN = /(eslint|oxlint)-disable/;
71564
71668
  const getBackupRootDirectory = (rootDirectory) => path$1$1.join(rootDirectory, ...DISABLE_DIRECTIVE_BACKUP_DIRECTORY_SEGMENTS);
71565
71669
  const getBackupPath = (rootDirectory, absolutePath) => {
@@ -71956,7 +72060,7 @@ const buildUserPluginRules = (userPlugin, severityControls) => {
71956
72060
  }
71957
72061
  return enabled;
71958
72062
  };
71959
- 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 }) => {
71960
72064
  const hasIncludedTags = includedTags.size > 0;
71961
72065
  const reactHooksJsPlugin = disableReactHooksJsPlugin || ruleSelection === "sidecar" || hasIncludedTags ? null : resolveReactHooksJsPlugin(project.hasReactCompiler || project.hasReactCompilerLintPlugin === true, customRulesOnly);
71962
72066
  const reactCompilerRules = reactHooksJsPlugin ? applyRuleSeverityControls(filterRulesToAvailable(REACT_COMPILER_RULES, "react-hooks-js", reactHooksJsPlugin.availableRuleNames), severityControls) : {};
@@ -72011,23 +72115,26 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
72011
72115
  },
72012
72116
  plugins: [],
72013
72117
  jsPlugins: [...jsPlugins, pluginPath],
72014
- settings: { "react-doctor": {
72015
- portedRuleMode: "curated",
72016
- framework: project.framework,
72017
- rootDirectory: settingsRootDirectory,
72018
- capabilities: [...capabilities].sort(),
72019
- ...runtimeGlobals && runtimeGlobals.length > 0 ? { runtimeGlobals: [...runtimeGlobals] } : {},
72020
- ...unpluginAutoImportGlobalScopes && unpluginAutoImportGlobalScopes.length > 0 ? {
72021
- unpluginAutoImportRootDirectories: [...new Set([settingsRootDirectory, project.rootDirectory])],
72022
- unpluginAutoImportGlobalScopes: unpluginAutoImportGlobalScopes.map((scope) => ({
72023
- directory: scope.directory,
72024
- names: [...scope.names]
72025
- }))
72026
- } : {},
72027
- ...project.shopifyFlashListMajorVersion !== null ? { shopifyFlashListMajorVersion: project.shopifyFlashListMajorVersion } : {},
72028
- ...serverAuthFunctionNames && serverAuthFunctionNames.length > 0 ? { serverAuthFunctionNames: [...serverAuthFunctionNames] } : {},
72029
- ...projectIndexModuleSources !== void 0 ? { projectIndexModuleSources: [...projectIndexModuleSources] } : {}
72030
- } },
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
+ },
72031
72138
  rules: {
72032
72139
  ...reactCompilerRules,
72033
72140
  ...enabledReactDoctorRules,
@@ -74136,7 +74243,9 @@ const runOxlint = async (options) => {
74136
74243
  return [];
74137
74244
  }
74138
74245
  const pluginPath = resolvePluginPath();
74139
- 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) : {};
74140
74249
  const userPlugins = includedTags.size > 0 ? [] : resolveUserPlugins(userConfig?.plugins, configSourceDirectory);
74141
74250
  const restoreDisableDirectives = await neutralizeDisableDirectives(rootDirectory, includePaths ?? options.precomputedSourceFiles?.map((sourceFile) => sourceFile.path), { recoverOnly: respectInlineDisables });
74142
74251
  const configDirectory = fs$1$3.mkdtempSync(path$1$1.join(os.tmpdir(), "react-doctor-oxlintrc-"));
@@ -74198,6 +74307,7 @@ const runOxlint = async (options) => {
74198
74307
  serverAuthFunctionNames,
74199
74308
  projectIndexModuleSources,
74200
74309
  severityControls,
74310
+ adoptedSettings,
74201
74311
  userPlugins,
74202
74312
  disableReactHooksJsPlugin: overrides.disableReactHooksJsPlugin,
74203
74313
  ruleSelection: overrides.ruleSelection,
@@ -75981,8 +76091,9 @@ const findWorstScoredProject = (projects) => {
75981
76091
  return worst;
75982
76092
  };
75983
76093
  const toJsonReportDiagnostic = (diagnostic, projectRoot, reportRoot) => {
75984
- const normalizedFilePath = toNormalizedRelativePath(diagnostic.filePath, projectRoot);
75985
- 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);
75986
76097
  const ruleIdentity = getDiagnosticRuleIdentity(diagnostic);
75987
76098
  return {
75988
76099
  ...diagnostic,
@@ -76609,6 +76720,7 @@ const METRIC = {
76609
76720
  tuiIssueStreamShown: "tui.issue_stream_shown",
76610
76721
  tuiProjectPathContextShown: "tui.project_path_context_shown",
76611
76722
  tuiProjectSelectShown: "tui.project_select_shown",
76723
+ tuiCiRecommendationShown: "tui.ci_recommendation_shown",
76612
76724
  tuiReportActionSelected: "tui.report_action_selected",
76613
76725
  tuiCancelled: "tui.cancelled",
76614
76726
  tuiScanInlineShown: "tui.scan_inline_shown",
@@ -76657,7 +76769,7 @@ const makeNoopConsole = () => ({
76657
76769
  });
76658
76770
  //#endregion
76659
76771
  //#region src/cli/utils/version.ts
76660
- const VERSION = "0.9.12-dev.afa1780";
76772
+ const VERSION = "0.9.12-dev.ca30808";
76661
76773
  //#endregion
76662
76774
  //#region src/cli/utils/json-mode.ts
76663
76775
  let context = null;
@@ -77001,5 +77113,5 @@ const recordDistribution = (name, value, options = {}) => {
77001
77113
  //#endregion
77002
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 };
77003
77115
 
77004
- //# sourceMappingURL=record-metric-C4-VKG9G.js.map
77005
- //# debugId=8c1c93ba-3c9c-52ed-ab45-dd9ad17cb8d3
77116
+ //# sourceMappingURL=record-metric-BzGcVSov.js.map
77117
+ //# debugId=903f2afd-3ece-5d3d-b803-69dfd65d9350
@@ -1,7 +1,7 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4dd1317a-ef74-58ee-bdca-5e8421b9e276")}catch(e){}}();
3
- import { N as SENTRY_FLUSH_TIMEOUT_MS, T as METRIC, Xt as isReactDoctorError, l as getRunId, o as buildSentryScope, t as recordCount } from "./record-metric-C4-VKG9G.js";
4
- import { n as shutdownTelemetry, r as isExpectedUserError } from "./telemetry-runtime-CDAL4uhm.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]="97dd867b-f764-5179-b8b8-5121bb6cf9a5")}catch(e){}}();
3
+ import { N as SENTRY_FLUSH_TIMEOUT_MS, T as METRIC, Xt as isReactDoctorError, l as getRunId, o as buildSentryScope, t as recordCount } from "./record-metric-BzGcVSov.js";
4
+ import { n as shutdownTelemetry, r as isExpectedUserError } from "./telemetry-runtime-Bs7DsGaF.js";
5
5
  import { r as recordRunTraceId, t as getActiveRunTrace } from "./active-run-trace-dlIZeEvb.js";
6
6
  import * as Sentry from "@sentry/node";
7
7
  //#region src/cli/utils/report-error.ts
@@ -60,5 +60,5 @@ const reportErrorToSentry = async (error) => {
60
60
  //#endregion
61
61
  export { reportErrorToSentry as t };
62
62
 
63
- //# sourceMappingURL=report-error-1lrvJd3S.js.map
64
- //# debugId=4dd1317a-ef74-58ee-bdca-5e8421b9e276
63
+ //# sourceMappingURL=report-error-ZMTPN93d.js.map
64
+ //# debugId=97dd867b-f764-5179-b8b8-5121bb6cf9a5
@@ -1,7 +1,7 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="94ab2980-6055-5499-a6af-91c2b90b5ac7")}catch(e){}}();
3
- import { O as REACT_DOCTOR_CONFIG_PROJECT_NAME, T as METRIC, t as recordCount } from "./record-metric-C4-VKG9G.js";
4
- import { u as isCommandAvailable } from "./install-github-workflow-CS_YO_OJ.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]="9717c30b-8de3-5523-babc-39205f875170")}catch(e){}}();
3
+ import { O as REACT_DOCTOR_CONFIG_PROJECT_NAME, T as METRIC, t as recordCount } from "./record-metric-BzGcVSov.js";
4
+ import { u as isCommandAvailable } from "./install-github-workflow-Bkv_CMdF.js";
5
5
  import { spawn } from "node:child_process";
6
6
  import * as path$1 from "node:path";
7
7
  import process$1 from "node:process";
@@ -275,5 +275,5 @@ const reportWorkflowResult = (workflowSpinner, result, projectRoot) => {
275
275
  //#endregion
276
276
  export { recordGate as a, ACTION_UPGRADE_EVENT as c, INSTALL_AGENTS_PREFERENCE_ID as d, ONBOARDING_EVENT as f, detectAvailableAgents as h, readPreference as i, CI_PITCH_EVENT as l, computeDefaultSelectedAgents as m, openUrl as n, runMigrations as o, SETUP_HINT_EVENT as p, isGatePending as r, writePreference as s, reportWorkflowResult as t, HANDOFF_TARGET_PREFERENCE_ID as u };
277
277
 
278
- //# sourceMappingURL=report-workflow-result-C42nztEL.js.map
279
- //# debugId=94ab2980-6055-5499-a6af-91c2b90b5ac7
278
+ //# sourceMappingURL=report-workflow-result-CKUjTJpB.js.map
279
+ //# debugId=9717c30b-8de3-5523-babc-39205f875170
@@ -1,12 +1,10 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="65c3ea2a-7905-5036-b6d5-51b24fd44621")}catch(e){}}();
3
- import { Jt as isPathInsideDirectory, Nt as filterSourceFiles, wr as toCanonicalPath } from "./record-metric-C4-VKG9G.js";
4
- import { M as cliLogger } from "./install-doctor-script-DbnMjPjQ.js";
5
- import { d as detectDefaultBranch, f as runCommand, l as prompts, u as isCommandAvailable } from "./install-github-workflow-CS_YO_OJ.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]="19df94ee-697c-5752-a981-9ce9204b2446")}catch(e){}}();
3
+ import { Jt as isPathInsideDirectory, Nt as filterSourceFiles, wr as toCanonicalPath } from "./record-metric-BzGcVSov.js";
4
+ import { t as toForwardSlashes } from "./path-format-DnHpmJwG.js";
5
+ import { M as cliLogger } from "./install-doctor-script-DbKR-GHo.js";
6
+ import { d as detectDefaultBranch, f as runCommand, l as prompts, u as isCommandAvailable } from "./install-github-workflow-Bkv_CMdF.js";
6
7
  import * as path$1 from "node:path";
7
- //#region src/cli/utils/path-format.ts
8
- const toForwardSlashes = (filePath) => filePath.replaceAll("\\", "/");
9
- //#endregion
10
8
  //#region src/cli/utils/open-workflow-pull-request.ts
11
9
  const NEW_BRANCH_PREFIX = "react-doctor/add-github-actions";
12
10
  const DEFAULT_COMMIT_MESSAGE = "ci: add React Doctor GitHub Actions workflow";
@@ -333,7 +331,7 @@ const finalizeScope = async ({ requested, diffInfo, skipPrompts, isQuiet }) => {
333
331
  return scanScope === "changed" ? "changed" : "full";
334
332
  };
335
333
  //#endregion
336
- export { isValidBlockingLevel as a, openWorkflowPullRequest as c, warnDeprecatedDiff as i, stageWorkflowFile as l, isScopeValue as n, pickBlockingLevel as o, resolveScope as r, resolveBlockingLevel as s, finalizeScope as t, toForwardSlashes as u };
334
+ export { isValidBlockingLevel as a, openWorkflowPullRequest as c, warnDeprecatedDiff as i, stageWorkflowFile as l, isScopeValue as n, pickBlockingLevel as o, resolveScope as r, resolveBlockingLevel as s, finalizeScope as t };
337
335
 
338
- //# sourceMappingURL=resolve-scope-YUP_rtf3.js.map
339
- //# debugId=65c3ea2a-7905-5036-b6d5-51b24fd44621
336
+ //# sourceMappingURL=resolve-scope-BgrQEVtj.js.map
337
+ //# debugId=19df94ee-697c-5752-a981-9ce9204b2446
@@ -1,8 +1,8 @@
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]="676aa9c6-f648-5caa-bb1c-e828688caffd")}catch(e){}}();
3
- import { Kt as highlighter, Sr as isPlainObject, St as clearConfigCache, T as METRIC, Vt as getEquivalentRuleKeys, Zt as isSameRuleKey, bn as validateConfigTypes, gt as buildRuleDocsUrl, nr as COMPILER_CLEANUP_BUCKET, rn as loadConfigWithSource, rr as COMPILER_CLEANUP_RULE_KEYS, t as recordCount } from "./record-metric-C4-VKG9G.js";
4
- import { M as cliLogger, n as findNearestPackageDirectory } from "./install-doctor-script-DbnMjPjQ.js";
5
- import { t as readObjectFile } from "./read-object-file-DIGDC3MB.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]="db7f0339-715a-5848-9f32-e160413aba9a")}catch(e){}}();
3
+ import { Kt as highlighter, Sr as isPlainObject, St as clearConfigCache, T as METRIC, Vt as getEquivalentRuleKeys, Zt as isSameRuleKey, bn as validateConfigTypes, gt as buildRuleDocsUrl, nr as COMPILER_CLEANUP_BUCKET, rn as loadConfigWithSource, rr as COMPILER_CLEANUP_RULE_KEYS, t as recordCount } from "./record-metric-BzGcVSov.js";
4
+ import { M as cliLogger, n as findNearestPackageDirectory } from "./install-doctor-script-DbKR-GHo.js";
5
+ import { t as readObjectFile } from "./read-object-file-CEbx-anl.js";
6
6
  import * as path$1 from "node:path";
7
7
  import * as fs$1 from "node:fs";
8
8
  import { REACT_DOCTOR_RULES } from "oxlint-plugin-react-doctor/core";
@@ -577,5 +577,5 @@ const rulesUnignoreTagAction = async (tag, options) => {
577
577
  //#endregion
578
578
  export { rulesCategoryAction, rulesDisableAction, rulesEnableAction, rulesExplainAction, rulesIgnoreTagAction, rulesListAction, rulesSetAction, rulesUnignoreTagAction };
579
579
 
580
- //# sourceMappingURL=rules-BY4vq5-i.js.map
581
- //# debugId=676aa9c6-f648-5caa-bb1c-e828688caffd
580
+ //# sourceMappingURL=rules-DizN5gJ6.js.map
581
+ //# debugId=db7f0339-715a-5848-9f32-e160413aba9a